Added hub mac setting, removed global hal token setting, removed upnp

strict setting (only from command line)

Working on http pool
This commit is contained in:
Admin
2017-11-14 16:37:45 -06:00
parent 690bdaa748
commit d8d5e8f39a
10 changed files with 109 additions and 86 deletions

View File

@@ -76,6 +76,7 @@ public class BridgeSettings extends BackupHandler {
}
String serverPortOverride = System.getProperty("server.port");
String serverIpOverride = System.getProperty("server.ip");
String upnpStrictOverride = System.getProperty("upnp.strict", "true");
if(configFileProperty != null)
{
log.info("reading from config file: " + configFileProperty);
@@ -213,6 +214,8 @@ public class BridgeSettings extends BackupHandler {
theBridgeSettings.setServerPort(serverPortOverride);
if(serverIpOverride != null)
theBridgeSettings.setWebaddress(serverIpOverride);
if(upnpStrictOverride != null)
theBridgeSettings.setUpnpStrict(Boolean.parseBoolean(upnpStrictOverride));
setupParams(Paths.get(theBridgeSettings.getConfigfile()), ".cfgbk", "habridge.config-");
bridgeSecurity.setSecurityData(theBridgeSettings.getSecurityData());

View File

@@ -39,9 +39,6 @@ public class BridgeSettingsDescriptor {
@SerializedName("buttonsleep")
@Expose
private Integer buttonsleep;
@SerializedName("upnpstrict")
@Expose
private boolean upnpstrict;
@SerializedName("traceupnp")
@Expose
private boolean traceupnp;
@@ -66,9 +63,6 @@ public class BridgeSettingsDescriptor {
@SerializedName("haladdress")
@Expose
private IpList haladdress;
@SerializedName("haltoken")
@Expose
private String haltoken;
@SerializedName("whitelist")
@Expose
private Map<String, WhitelistEntry> whitelist;
@@ -93,6 +87,9 @@ public class BridgeSettingsDescriptor {
@SerializedName("hubversion")
@Expose
private String hubversion;
@SerializedName("hubmac")
@Expose
private String hubmac;
@SerializedName("securityData")
@Expose
private String securityData;
@@ -110,6 +107,10 @@ public class BridgeSettingsDescriptor {
private boolean domoticzconfigured;
private boolean somfyconfigured;
private boolean lifxconfigured;
// Deprecated settings
private String haltoken;
private boolean upnpstrict;
public BridgeSettingsDescriptor() {
super();
@@ -134,6 +135,7 @@ public class BridgeSettingsDescriptor {
this.myechourl = "alexa.amazon.com/spa/index.html#cards";
this.webaddress = "0.0.0.0";
this.hubversion = HueConstants.HUB_VERSION;
this.hubmac = null;
}
public String getUpnpConfigAddress() {
return upnpconfigaddress;
@@ -363,6 +365,12 @@ public class BridgeSettingsDescriptor {
public void setHubversion(String hubversion) {
this.hubversion = hubversion;
}
public String getHubmac() {
return hubmac;
}
public void setHubmac(String hubmac) {
this.hubmac = hubmac;
}
public IpList getDomoticzaddress() {
return domoticzaddress;
}

View File

@@ -18,9 +18,9 @@ public class HueApiResponse {
private Map<String, JsonObject> rules;
private HueConfig config;
public HueApiResponse(String name, String ipaddress, Map<String, WhitelistEntry> awhitelist, String emulateHubVersion, boolean isLinkButtonPressed) {
public HueApiResponse(String name, String ipaddress, Map<String, WhitelistEntry> awhitelist, String emulateHubVersion, boolean isLinkButtonPressed, String emulateMAC) {
super();
this.setConfig(HueConfig.createConfig(name, ipaddress, awhitelist, emulateHubVersion, isLinkButtonPressed));
this.setConfig(HueConfig.createConfig(name, ipaddress, awhitelist, emulateHubVersion, isLinkButtonPressed, emulateMAC));
this.setRules(new HashMap<>());
this.setSensors(new HashMap<>());
this.setSchedules(new HashMap<>());

View File

@@ -34,7 +34,7 @@ public class HueConfig
private String replacesbridgeid;
private Map<String, WhitelistEntry> whitelist;
public static HueConfig createConfig(String name, String ipaddress, Map<String, WhitelistEntry> awhitelist, String emulateHubVersion, boolean isLinkButtonPressed) {
public static HueConfig createConfig(String name, String ipaddress, Map<String, WhitelistEntry> awhitelist, String emulateHubVersion, boolean isLinkButtonPressed, String emulateMAC) {
HueConfig aConfig = new HueConfig();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
SimpleDateFormat dateFormatGmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
@@ -56,7 +56,7 @@ public class HueConfig
aConfig.setLocaltime(dateFormat.format(new Date()));
aConfig.setTimezone(TimeZone.getDefault().getID());
aConfig.setZigbeechannel("6");
aConfig.setBridgeid(HuePublicConfig.createConfig(name, ipaddress, emulateHubVersion).getHueBridgeIdFromMac());
aConfig.setBridgeid(HuePublicConfig.createConfig(name, ipaddress, emulateHubVersion, emulateMAC).getHueBridgeIdFromMac());
aConfig.setModelid(HueConstants.MODEL_ID);
aConfig.setFactorynew(false);
aConfig.setReplacesbridgeid(null);

View File

@@ -18,9 +18,9 @@ public class HuePublicConfig
private Boolean factorynew;
private String modelid;
public static HuePublicConfig createConfig(String name, String ipaddress, String emulateHubVersion) {
public static HuePublicConfig createConfig(String name, String ipaddress, String emulateHubVersion, String emulateMAC) {
HuePublicConfig aConfig = new HuePublicConfig();
aConfig.setMac(HuePublicConfig.getMacAddress(ipaddress));
aConfig.setMac(HuePublicConfig.getMacAddress(ipaddress, emulateMAC));
aConfig.setApiversion(HueConstants.API_VERSION);
aConfig.setSwversion(emulateHubVersion);
aConfig.setName(name);
@@ -32,34 +32,39 @@ public class HuePublicConfig
return aConfig;
}
private static String getMacAddress(String addr)
private static String getMacAddress(String addr, String aMAC)
{
InetAddress ip;
StringBuilder sb = new StringBuilder();
try {
if(aMAC == null || aMAC.trim().length() <= 0) {
try {
ip = InetAddress.getByName(addr);
ip = InetAddress.getByName(addr);
NetworkInterface network = NetworkInterface.getByInetAddress(ip);
NetworkInterface network = NetworkInterface.getByInetAddress(ip);
byte[] mac = network.getHardwareAddress();
for (int i = 0; i < mac.length; i++) {
sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? ":" : ""));
}
} catch (UnknownHostException e) {
byte[] mac = network.getHardwareAddress();
sb.append("00:00:88:00:bb:ee");
} catch (SocketException e){
sb.append("00:00:88:00:bb:ee");
} catch (Exception e){
sb.append("00:00:88:00:bb:ee");
for (int i = 0; i < mac.length; i++) {
sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? ":" : ""));
}
} catch (UnknownHostException e) {
sb.append("00:00:88:00:bb:ee");
} catch (SocketException e){
sb.append("00:00:88:00:bb:ee");
} catch (Exception e){
sb.append("00:00:88:00:bb:ee");
}
else {
sb.append(aMAC.trim());
}
return sb.toString();

View File

@@ -965,12 +965,12 @@ public class HueMulator {
if (bridgeSettingMaster.getBridgeSecurity().validateWhitelistUser(userId, null, bridgeSettingMaster.getBridgeSecurity().isUseLinkButton()) != null) {
log.debug("hue api config requested, User invalid, returning public config");
HuePublicConfig apiResponse = HuePublicConfig.createConfig("HA-Bridge",
bridgeSettings.getUpnpConfigAddress(), bridgeSettings.getHubversion());
bridgeSettings.getUpnpConfigAddress(), bridgeSettings.getHubversion(), bridgeSettings.getHubmac());
return apiResponse;
}
HueApiResponse apiResponse = new HueApiResponse("HA-Bridge", bridgeSettings.getUpnpConfigAddress(),
bridgeSettingMaster.getBridgeSecurity().getWhitelist(), bridgeSettings.getHubversion(), bridgeSettingMaster.getBridgeControl().isLinkButton());
bridgeSettingMaster.getBridgeSecurity().getWhitelist(), bridgeSettings.getHubversion(), bridgeSettingMaster.getBridgeControl().isLinkButton(), bridgeSettings.getHubmac());
log.debug("api response config <<<" + aGsonHandler.toJson(apiResponse.getConfig()) + ">>>");
return apiResponse.getConfig();
}
@@ -985,7 +985,7 @@ public class HueMulator {
}
HueApiResponse apiResponse = new HueApiResponse("HA-Bridge", bridgeSettings.getUpnpConfigAddress(),
bridgeSettingMaster.getBridgeSecurity().getWhitelist(), bridgeSettings.getHubversion(), bridgeSettingMaster.getBridgeControl().isLinkButton());
bridgeSettingMaster.getBridgeSecurity().getWhitelist(), bridgeSettings.getHubversion(), bridgeSettingMaster.getBridgeControl().isLinkButton(), bridgeSettings.getHubmac());
apiResponse.setLights((Map<String, DeviceResponse>) this.lightsListHandler(userId, ipAddress));
apiResponse.setGroups((Map<String, GroupResponse>) this.groupsListHandler(userId, ipAddress));

View File

@@ -24,6 +24,7 @@ import org.apache.http.conn.routing.HttpRoute;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.conn.BasicHttpClientConnectionManager;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.protocol.HttpRequestExecutor;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
@@ -36,14 +37,21 @@ public class HTTPHandler {
// private CloseableHttpClient httpClient;
// private RequestConfig globalConfig;
private HttpClientContext context;
private HttpClientConnectionManager connMgr;
private PoolingHttpClientConnectionManager connMgr;
private HttpRoute route;
private HttpClientConnection conn;
private HttpHost theHost;
public HTTPHandler() {
context = HttpClientContext.create();
connMgr = new BasicHttpClientConnectionManager();
connMgr = new PoolingHttpClientConnectionManager();
// Increase max total connection to 200
connMgr.setMaxTotal(200);
// Increase default max connection per route to 20
connMgr.setDefaultMaxPerRoute(20);
// Increase max connections for localhost:80 to 50
HttpHost localhost = new HttpHost("locahost", 80);
connMgr.setMaxPerRoute(new HttpRoute(localhost), 50);
route = null;
conn = null;
theHost = null;
@@ -62,6 +70,7 @@ public class HTTPHandler {
ContentType parsedContentType = null;
ConnectionRequest connRequest = null;
StringEntity requestBody = null;
boolean badResponse = false;
if (contentType != null && !contentType.trim().isEmpty()) {
parsedContentType = ContentType.parse(contentType);
if (body != null && body.length() > 0)
@@ -143,43 +152,48 @@ public class HTTPHandler {
for (int retryCount = 0; retryCount < 2; retryCount++) {
try {
response = exeRequest.execute(request, conn, context);
log.debug((httpVerb == null ? "GET" : httpVerb) + " execute (" + retryCount + ") on URL responded: "
+ response.getStatusLine().getStatusCode());
if (response != null && response.getStatusLine().getStatusCode() >= 200 && response.getStatusLine().getStatusCode() < 300) {
log.debug("Successfull response - The http response is <<<" + theContent + ">>>");
retryCount = 2;
} else if (response != null) {
log.warn("HTTP response code was not an expected successful response of between 200 - 299, the code was: "
+ response.getStatusLine());
if (response.getStatusLine().getStatusCode() == 504) {
log.warn("HTTP response code was 504, retrying...");
} else
retryCount = 2;
badResponse = true;
}
if (response != null && response.getEntity() != null) {
try {
theContent = EntityUtils.toString(response.getEntity(), Charset.forName("UTF-8")); // read
// content
// for
// data
EntityUtils.consume(response.getEntity()); // close out
// inputstream
// ignore
// content
if(!badResponse)
theContent = null;
} catch (Exception e) {
log.debug("Error ocurred in handling response entity after successful call, still responding success. "
+ e.getMessage(), e);
}
}
} catch (ClientProtocolException e) {
log.warn("Client Protocol Exception received, retyring....");
} catch (IOException e) {
log.warn("Error calling out to HA gateway: IOException in log", e);
retryCount = 2;
} catch (HttpException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
log.debug((httpVerb == null ? "GET" : httpVerb) + " execute (" + retryCount + ") on URL responded: "
+ response.getStatusLine().getStatusCode());
if (response != null && response.getStatusLine().getStatusCode() >= 200 && response.getStatusLine().getStatusCode() < 300) {
log.debug("Successfull response - The http response is <<<" + theContent + ">>>");
log.warn("Error calling out to HA gateway: HttpException in log", e);
} catch (IOException e) {
log.warn("Error calling out to HA gateway: IOException in log: " + e.getMessage());
retryCount = 2;
} else if (response != null) {
log.warn("HTTP response code was not an expected successful response of between 200 - 299, the code was: "
+ response.getStatusLine());
if (response.getStatusLine().getStatusCode() == 504) {
log.warn("HTTP response code was 504, retrying...");
} else
retryCount = 2;
}
if (response != null && response.getEntity() != null) {
try {
theContent = EntityUtils.toString(response.getEntity(), Charset.forName("UTF-8")); // read
// content
// for
// data
EntityUtils.consume(response.getEntity()); // close out
// inputstream
// ignore
// content
} catch (Exception e) {
log.debug("Error ocurred in handling response entity after successful call, still responding success. "
+ e.getMessage(), e);
}
}
if(retryCount < 2) {

View File

@@ -77,7 +77,7 @@ public class UpnpListener {
traceupnp = theSettings.isTraceupnp();
useUpnpIface = theSettings.isUseupnpiface();
bridgeControl = theControl;
aHueConfig = HuePublicConfig.createConfig("temp", responseAddress, HueConstants.HUB_VERSION);
aHueConfig = HuePublicConfig.createConfig("temp", responseAddress, HueConstants.HUB_VERSION, theSettings.getHubmac());
bridgeId = aHueConfig.getBridgeid();
bridgeSNUUID = aHueConfig.getSNUUIDFromMac();
try {

View File

@@ -79,7 +79,7 @@ public class UpnpSettingsResource {
log.debug("upnp device settings requested: " + " from " + request.ip() + ":" + request.port());
String portNumber = Integer.toString(request.port());
String filledTemplate = null;
String bridgeIdMac = HuePublicConfig.createConfig("temp", theSettings.getUpnpConfigAddress(), HueConstants.HUB_VERSION).getSNUUIDFromMac();
String bridgeIdMac = HuePublicConfig.createConfig("temp", theSettings.getUpnpConfigAddress(), HueConstants.HUB_VERSION, theSettings.getHubmac()).getSNUUIDFromMac();
filledTemplate = String.format(hueTemplate, theSettings.getUpnpConfigAddress(), portNumber, theSettings.getUpnpConfigAddress(), bridgeIdMac, bridgeIdMac);
if(theSettings.isTraceupnp())
log.info("Traceupnp: upnp device settings template filled with address: " + theSettings.getUpnpConfigAddress() + " and port: " + portNumber);

View File

@@ -316,12 +316,6 @@
</tr>
</table></td>
</tr>
<tr>
<td>HAL Token (please use token on individual HAL entry)</td>
<td><input id="bridge-settings-haltoken" class="form-control"
type="password" ng-model="bridge.settings.haltoken"
placeholder="thetoken"></td>
</tr>
<tr>
<td>MQTT Client IDs and IP Addresses</td>
<td><table
@@ -555,7 +549,12 @@
placeholder="01036562"></td>
</tr>
<tr>
<td>Button Press/Call Item Loop Sleep Interval (ms)</td>
<td>Emulate MAC<br />(used in bridge-id, uuid, etc.<br /> - leave blank unless needed)</td>
<td><input id="bridge-settings-hubmac" class="form-control"
type="text" ng-model="bridge.settings.hubmac"></td>
</tr>
<tr>
<td>Button Press/Call Item<br />Loop Sleep Interval (ms)</td>
<td><input id="bridge-settings-buttonsleep"
class="form-control" type="number" name="input"
ng-model="bridge.settings.buttonsleep" min="100" max="9999"></td>
@@ -567,12 +566,6 @@
ng-model="bridge.settings.numberoflogmessages" min="100"
max="65535"></td>
</tr>
<tr>
<td>UPNP Strict Handling</td>
<td><input type="checkbox"
ng-model="bridge.settings.upnpstrict" ng-true-value=true
ng-false-value=false> {{bridge.settings.upnpstrict}}</td>
</tr>
<tr>
<td>Trace UPNP Calls</td>
<td><input type="checkbox"