From 5b1034c4597cf5226ceb4dce45c12e7bfc5f17a7 Mon Sep 17 00:00:00 2001 From: J-N-K Date: Mon, 11 Feb 2019 20:29:35 +0100 Subject: [PATCH] [network] fixes excessive testing of arping method during discovery (#4854) fixes escessive testing of arping method during discovery Signed-off-by: Jan N. Klug --- .../internal/PresenceDetectionTest.java | 2 +- .../internal/NetworkBindingConfiguration.java | 6 ++++++ .../network/internal/PresenceDetection.java | 18 +++++++++--------- .../discovery/NetworkDiscoveryService.java | 2 +- .../internal/handler/NetworkHandler.java | 2 +- 5 files changed, 18 insertions(+), 12 deletions(-) diff --git a/addons/binding/org.openhab.binding.network.test/src/test/java/org/openhab/binding/network/internal/PresenceDetectionTest.java b/addons/binding/org.openhab.binding.network.test/src/test/java/org/openhab/binding/network/internal/PresenceDetectionTest.java index 9710212d5ae9c..3bbfd26d51838 100644 --- a/addons/binding/org.openhab.binding.network.test/src/test/java/org/openhab/binding/network/internal/PresenceDetectionTest.java +++ b/addons/binding/org.openhab.binding.network.test/src/test/java/org/openhab/binding/network/internal/PresenceDetectionTest.java @@ -78,7 +78,7 @@ public void setUp() throws UnknownHostException { subject.setUseDhcpSniffing(false); subject.setIOSDevice(true); subject.setServicePorts(Collections.singleton(1010)); - subject.setUseArpPing(true, "arping"); + subject.setUseArpPing(true, "arping", ArpPingUtilEnum.IPUTILS_ARPING); subject.setUseIcmpPing(true); assertThat(subject.pingMethod, is(IpPingMethodEnum.WINDOWS_PING)); diff --git a/addons/binding/org.openhab.binding.network/src/main/java/org/openhab/binding/network/internal/NetworkBindingConfiguration.java b/addons/binding/org.openhab.binding.network/src/main/java/org/openhab/binding/network/internal/NetworkBindingConfiguration.java index bfb0ce788cc92..4f1b377c14f27 100644 --- a/addons/binding/org.openhab.binding.network/src/main/java/org/openhab/binding/network/internal/NetworkBindingConfiguration.java +++ b/addons/binding/org.openhab.binding.network/src/main/java/org/openhab/binding/network/internal/NetworkBindingConfiguration.java @@ -15,6 +15,8 @@ import java.math.BigDecimal; import org.eclipse.jdt.annotation.NonNullByDefault; +import org.openhab.binding.network.internal.utils.NetworkUtils; +import org.openhab.binding.network.internal.utils.NetworkUtils.ArpPingUtilEnum; /** * Contains the binding configuration and default values. The field names represent the configuration names, @@ -28,11 +30,15 @@ public class NetworkBindingConfiguration { public Boolean allowDHCPlisten = true; public BigDecimal cacheDeviceStateTimeInMS = BigDecimal.valueOf(2000); public String arpPingToolPath = "arping"; + public @NonNullByDefault({}) ArpPingUtilEnum arpPingUtilMethod; public void update(NetworkBindingConfiguration newConfiguration) { this.allowSystemPings = newConfiguration.allowSystemPings; this.allowDHCPlisten = newConfiguration.allowDHCPlisten; this.cacheDeviceStateTimeInMS = newConfiguration.cacheDeviceStateTimeInMS; this.arpPingToolPath = newConfiguration.arpPingToolPath; + + NetworkUtils networkUtils = new NetworkUtils(); + this.arpPingUtilMethod = networkUtils.determineNativeARPpingMethod(arpPingToolPath); } } diff --git a/addons/binding/org.openhab.binding.network/src/main/java/org/openhab/binding/network/internal/PresenceDetection.java b/addons/binding/org.openhab.binding.network/src/main/java/org/openhab/binding/network/internal/PresenceDetection.java index d6489943d7002..29ac725d0bd77 100644 --- a/addons/binding/org.openhab.binding.network/src/main/java/org/openhab/binding/network/internal/PresenceDetection.java +++ b/addons/binding/org.openhab.binding.network/src/main/java/org/openhab/binding/network/internal/PresenceDetection.java @@ -26,7 +26,6 @@ import java.util.concurrent.TimeUnit; import java.util.function.Consumer; -import org.apache.commons.lang.StringUtils; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.smarthome.core.cache.ExpiringCache; @@ -58,8 +57,8 @@ public class PresenceDetection implements IPRequestReceivedCallback { private boolean useDHCPsniffing = false; private String arpPingState = "Disabled"; private String ipPingState = "Disabled"; + protected String arpPingUtilPath = ""; protected ArpPingUtilEnum arpPingMethod = ArpPingUtilEnum.UNKNOWN_TOOL; - private String arpPingUtilPath = "arping"; protected @Nullable IpPingMethodEnum pingMethod = null; private boolean iosDevice; private Set tcpPorts = new HashSet<>(); @@ -112,7 +111,7 @@ public void setHostname(String hostname) { InetAddress destinationAddress = InetAddress.getByName(hostname); if (!destinationAddress.equals(cachedDestination)) { logger.trace("host name resolved to other address, (re-)setup presence detection"); - setUseArpPing(true, arpPingUtilPath, destinationAddress); + setUseArpPing(true, destinationAddress); if (useDHCPsniffing) { if (cachedDestination != null) { disableDHCPListen(cachedDestination); @@ -179,9 +178,8 @@ public void setUseIcmpPing(@Nullable Boolean useSystemPing) { * @param enable Enable or disable ARP ping * @param arpPingUtilPath c */ - public void setUseArpPing(boolean enable, String arpPingUtilPath, @Nullable InetAddress destinationAddress) { - this.arpPingUtilPath = arpPingUtilPath; - if (!enable || StringUtils.isBlank(arpPingUtilPath)) { + private void setUseArpPing(boolean enable, @Nullable InetAddress destinationAddress) { + if (!enable || arpPingUtilPath.isEmpty()) { arpPingState = "Disabled"; arpPingMethod = ArpPingUtilEnum.UNKNOWN_TOOL; return; @@ -190,7 +188,7 @@ public void setUseArpPing(boolean enable, String arpPingUtilPath, @Nullable Inet arpPingMethod = ArpPingUtilEnum.UNKNOWN_TOOL; return; } - arpPingMethod = networkUtils.determineNativeARPpingMethod(arpPingUtilPath); + switch (arpPingMethod) { case UNKNOWN_TOOL: { arpPingState = "Unknown arping tool"; @@ -217,8 +215,10 @@ public void setUseArpPing(boolean enable, String arpPingUtilPath, @Nullable Inet * @param enable Enable or disable ARP ping * @param arpPingUtilPath enableDHCPListen(useDHCPsniffing); */ - public void setUseArpPing(boolean enable, String arpPingUtilPath) { - setUseArpPing(enable, arpPingUtilPath, destination.getValue()); + public void setUseArpPing(boolean enable, String arpPingUtilPath, ArpPingUtilEnum arpPingUtilMethod) { + setUseArpPing(enable, destination.getValue()); + this.arpPingUtilPath = arpPingUtilPath; + this.arpPingMethod = arpPingUtilMethod; } public String getArpPingState() { diff --git a/addons/binding/org.openhab.binding.network/src/main/java/org/openhab/binding/network/internal/discovery/NetworkDiscoveryService.java b/addons/binding/org.openhab.binding.network/src/main/java/org/openhab/binding/network/internal/discovery/NetworkDiscoveryService.java index 6978cc56cf2e6..601e65493d9c6 100644 --- a/addons/binding/org.openhab.binding.network/src/main/java/org/openhab/binding/network/internal/discovery/NetworkDiscoveryService.java +++ b/addons/binding/org.openhab.binding.network/src/main/java/org/openhab/binding/network/internal/discovery/NetworkDiscoveryService.java @@ -145,7 +145,7 @@ protected void startScan() { s.setTimeout(PING_TIMEOUT_IN_MS); // Ping devices s.setUseIcmpPing(true); - s.setUseArpPing(true, configuration.arpPingToolPath); + s.setUseArpPing(true, configuration.arpPingToolPath, configuration.arpPingUtilMethod); // TCP devices s.setServicePorts(tcpServicePorts); diff --git a/addons/binding/org.openhab.binding.network/src/main/java/org/openhab/binding/network/internal/handler/NetworkHandler.java b/addons/binding/org.openhab.binding.network/src/main/java/org/openhab/binding/network/internal/handler/NetworkHandler.java index da475666d8a20..476ba8e04338a 100644 --- a/addons/binding/org.openhab.binding.network/src/main/java/org/openhab/binding/network/internal/handler/NetworkHandler.java +++ b/addons/binding/org.openhab.binding.network/src/main/java/org/openhab/binding/network/internal/handler/NetworkHandler.java @@ -177,7 +177,7 @@ void initialize(PresenceDetection presenceDetection) { // Hand over binding configurations to the network service presenceDetection.setUseDhcpSniffing(configuration.allowDHCPlisten); presenceDetection.setUseIcmpPing(configuration.allowSystemPings); - presenceDetection.setUseArpPing(true, configuration.arpPingToolPath); + presenceDetection.setUseArpPing(true, configuration.arpPingToolPath, configuration.arpPingUtilMethod); } this.retries = handlerConfiguration.retry.intValue();