Fix for asuswrt, telnet not working and presence-detection for router mode (#11422)

* Fix for telnet mode
Fix for presence detection

closes #11349 #10231

* Optimisation when device is disconnected
This commit is contained in:
kennedyshead 2018-01-11 23:12:27 +01:00 committed by Paulus Schoutsen
parent a23f60315f
commit 6b103cc9b9

View File

@ -177,10 +177,10 @@ class AsusWrtDeviceScanner(DeviceScanner):
"""
devices = {}
devices.update(self._get_wl())
devices.update(self._get_arp())
devices.update(self._get_neigh())
devices = self._get_arp(devices)
devices = self._get_neigh(devices)
if not self.mode == 'ap':
devices.update(self._get_leases())
devices.update(self._get_leases(devices))
return devices
def _get_wl(self):
@ -194,7 +194,7 @@ class AsusWrtDeviceScanner(DeviceScanner):
devices[mac] = Device(mac, None, None)
return devices
def _get_leases(self):
def _get_leases(self, cur_devices):
lines = self.connection.run_command(_LEASES_CMD)
if not lines:
return {}
@ -208,30 +208,45 @@ class AsusWrtDeviceScanner(DeviceScanner):
if host == '*':
host = ''
mac = device['mac'].upper()
devices[mac] = Device(mac, device['ip'], host)
if mac in cur_devices:
devices[mac] = Device(mac, device['ip'], host)
return devices
def _get_neigh(self):
def _get_neigh(self, cur_devices):
lines = self.connection.run_command(_IP_NEIGH_CMD)
if not lines:
return {}
result = _parse_lines(lines, _IP_NEIGH_REGEX)
devices = {}
for device in result:
mac = device['mac'].upper()
devices[mac] = Device(mac, None, None)
return devices
if device['mac']:
mac = device['mac'].upper()
devices[mac] = Device(mac, None, None)
else:
cur_devices = {
k: v for k, v in
cur_devices.items() if v.ip != device['ip']
}
cur_devices.update(devices)
return cur_devices
def _get_arp(self):
def _get_arp(self, cur_devices):
lines = self.connection.run_command(_ARP_CMD)
if not lines:
return {}
result = _parse_lines(lines, _ARP_REGEX)
devices = {}
for device in result:
mac = device['mac'].upper()
devices[mac] = Device(mac, device['ip'], None)
return devices
if device['mac']:
mac = device['mac'].upper()
devices[mac] = Device(mac, device['ip'], None)
else:
cur_devices = {
k: v for k, v in
cur_devices.items() if v.ip != device['ip']
}
cur_devices.update(devices)
return cur_devices
class _Connection:
@ -348,8 +363,9 @@ class TelnetConnection(_Connection):
self.connect()
self._telnet.write('{}\n'.format(command).encode('ascii'))
return (self._telnet.read_until(self._prompt_string).
data = (self._telnet.read_until(self._prompt_string).
split(b'\n')[1:-1])
return [line.decode('utf-8') for line in data]
except EOFError:
_LOGGER.error("Unexpected response from router")
self.disconnect()