diff --git a/custom_components/mikrotik_router/helper.py b/custom_components/mikrotik_router/helper.py index b64a174..4036fe0 100644 --- a/custom_components/mikrotik_router/helper.py +++ b/custom_components/mikrotik_router/helper.py @@ -42,7 +42,6 @@ async def from_list(data=None, source=None, key=None, key_search=None, vals=None return data keymap = generate_keymap(data, key_search) - for entry in source: if only and not await matches_only(entry, only): continue @@ -50,6 +49,7 @@ async def from_list(data=None, source=None, key=None, key_search=None, vals=None if skip and await can_skip(entry, skip): continue + uid = None if key or key_search: uid = await get_uid(entry, key, key_search, keymap) if not uid: @@ -58,12 +58,9 @@ async def from_list(data=None, source=None, key=None, key_search=None, vals=None if uid not in data: data[uid] = {} - else: - uid=None - - _LOGGER.debug("Processing entry {}, entry {}".format(source, entry)) + _LOGGER.debug("Processing entry %s, entry %s", source, entry) if vals: - data = await fill_vals(data, uid, vals) + data = await fill_vals(data, entry, uid, vals) if ensure_vals: data = await fill_ensure_vals(data, uid, ensure_vals) @@ -89,7 +86,7 @@ async def get_uid(entry, key, key_search, keymap): if not keymap or key_search not in entry or entry[key_search] not in keymap: return False - uid = keymap[entry[key_search]] + key = keymap[entry[key_search]] return entry[key] @@ -101,6 +98,7 @@ async def generate_keymap(data, key_search): if not key_search: return None + keymap = [] for uid in data: if key_search not in uid: continue @@ -114,34 +112,34 @@ async def generate_keymap(data, key_search): # matches_only # --------------------------- async def matches_only(entry, only): - can_continue = False + ret = False for val in only: if val['name'] in entry and entry[val['name']] == val['value']: - can_continue = True + ret = True else: - can_continue = False + ret = False break - return can_continue + return ret # --------------------------- # can_skip # --------------------------- async def can_skip(entry, skip): - can_skip = False + ret = False for val in skip: if val['name'] in entry and entry[val['name']] == val['value']: - can_skip = True + ret = True break - return can_skip + return ret # --------------------------- # fill_vals # --------------------------- -async def fill_vals(data, uid, vals): +async def fill_vals(data, entry, uid, vals): for val in vals: _name = val['name'] _type = val['type'] if 'type' in val else 'str' @@ -185,12 +183,13 @@ async def fill_ensure_vals(data, uid, ensure_vals): return data + # --------------------------- # fill_vals_proc # --------------------------- async def fill_vals_proc(data, uid, vals_proc): _data = data[uid] if uid else data - for val_sub in val_proc: + for val_sub in vals_proc: _name = None _action = None _value = None @@ -220,4 +219,3 @@ async def fill_vals_proc(data, uid, vals_proc): data[_name] = _value return data - diff --git a/custom_components/mikrotik_router/mikrotik_controller.py b/custom_components/mikrotik_router/mikrotik_controller.py index 43ca739..cd6b547 100644 --- a/custom_components/mikrotik_router/mikrotik_controller.py +++ b/custom_components/mikrotik_router/mikrotik_controller.py @@ -14,7 +14,7 @@ from .const import ( ) from .mikrotikapi import MikrotikAPI -from .helper import from_entry, from_entry_bool, from_list +from .helper import from_entry, from_list _LOGGER = logging.getLogger(__name__) @@ -101,8 +101,8 @@ class MikrotikControllerData(): # --------------------------- async def hwinfo_update(self): """Update Mikrotik hardware info""" - self.get_system_routerboard() - self.get_system_resource() + await self.get_system_routerboard() + await self.get_system_resource() return # --------------------------- @@ -111,7 +111,7 @@ class MikrotikControllerData(): async def async_fwupdate_check(self): """Update Mikrotik data""" - self.get_firmware_update() + await self.get_firmware_update() async_dispatcher_send(self.hass, self.signal_update) return @@ -128,9 +128,9 @@ class MikrotikControllerData(): await self.get_interface() await self.get_interface_traffic() await self.get_interface_client() - self.get_nat() - self.get_system_resource() - self.get_script() + await self.get_nat() + await self.get_system_resource() + await self.get_script() async_dispatcher_send(self.hass, self.signal_update) return @@ -274,7 +274,7 @@ class MikrotikControllerData(): if not uid: continue - _LOGGER.debug("Processing entry {}, entry {}".format("/interface/bridge/host", entry)) + _LOGGER.debug("Processing entry %s, entry %s", "/interface/bridge/host", entry) # Create uid arp dict if uid not in self.data['arp']: self.data['arp'][uid] = {} @@ -305,7 +305,7 @@ class MikrotikControllerData(): if not uid: continue - _LOGGER.debug("Processing entry {}, entry {}".format("/interface/bridge/host", entry)) + _LOGGER.debug("Processing entry %s, entry %s", "/interface/bridge/host", entry) # Create uid arp dict if uid not in self.data['arp']: self.data['arp'][uid] = {} @@ -337,7 +337,7 @@ class MikrotikControllerData(): # --------------------------- # get_nat # --------------------------- - def get_nat(self): + async def get_nat(self): """Get NAT data from Mikrotik""" self.data['nat'] = await from_list( data=self.data['nat'], @@ -361,7 +361,7 @@ class MikrotikControllerData(): {'text': ':'}, {'key': 'dst-port'} ] - ] + ], only=[ {'key': 'action', 'value': 'dst-nat'} ] @@ -371,7 +371,7 @@ class MikrotikControllerData(): # --------------------------- # get_system_routerboard # --------------------------- - def get_system_routerboard(self): + async def get_system_routerboard(self): """Get routerboard data from Mikrotik""" self.data['routerboard'] = await from_list( data=self.data['routerboard'], @@ -380,7 +380,7 @@ class MikrotikControllerData(): {'name': 'routerboard', 'type': 'bool'}, {'name': 'model', 'default': 'unknown'}, {'name': 'serial-number', 'default': 'unknown'}, - {'name': 'firmware', 'default': 'unknown'}, + {'name': 'firmware', 'default': 'unknown'} ] ) return @@ -388,7 +388,7 @@ class MikrotikControllerData(): # --------------------------- # get_system_resource # --------------------------- - def get_system_resource(self): + async def get_system_resource(self): """Get system resources data from Mikrotik""" self.data['resource'] = await from_list( data=self.data['resource'], @@ -406,13 +406,13 @@ class MikrotikControllerData(): ] ) - if entry['total-memory'] > 0: - self.data['resource']['memory-usage'] = round(((entry['total-memory'] - entry['free-memory']) / entry['total-memory']) * 100) + if self.data['resource']['total-memory'] > 0: + self.data['resource']['memory-usage'] = round(((self.data['resource']['total-memory'] - self.data['resource']['free-memory']) / self.data['resource']['total-memory']) * 100) else: self.data['resource']['memory-usage'] = "unknown" - if entry['total-hdd-space'] > 0: - self.data['resource']['hdd-usage'] = round(((entry['total-hdd-space'] - entry['free-hdd-space']) / entry['total-hdd-space']) * 100) + if self.data['resource']['total-hdd-space'] > 0: + self.data['resource']['hdd-usage'] = round(((self.data['resource']['total-hdd-space'] - self.data['resource']['free-hdd-space']) / self.data['resource']['total-hdd-space']) * 100) else: self.data['resource']['hdd-usage'] = "unknown" @@ -421,30 +421,30 @@ class MikrotikControllerData(): # --------------------------- # get_system_routerboard # --------------------------- - def get_firmware_update(self): + async def get_firmware_update(self): """Check for firmware update on Mikrotik""" - self.data['fw-update'] = await from_list( - data=self.data['fw-update'], - source=await self.hass.async_add_executor_job(self.api.path, "/system/package/update"), - vals=[ - {'name': 'status'}, - {'name': 'channel', 'default': 'unknown'}, - {'name': 'installed-version', 'default': 'unknown'}, - {'name': 'latest-version', 'default': 'unknown'} - ] - ) + self.data['fw-update'] = await from_list( + data=self.data['fw-update'], + source=await self.hass.async_add_executor_job(self.api.path, "/system/package/update"), + vals=[ + {'name': 'status'}, + {'name': 'channel', 'default': 'unknown'}, + {'name': 'installed-version', 'default': 'unknown'}, + {'name': 'latest-version', 'default': 'unknown'} + ] + ) - if status in self.data['fw-update']: - self.data['fw-update']['available'] = True if self.data['fw-update']['status'] == "New version is available" else False - else: - self.data['fw-update']['available'] = False - - return + if 'status' in self.data['fw-update']: + self.data['fw-update']['available'] = True if self.data['fw-update']['status'] == "New version is available" else False + else: + self.data['fw-update']['available'] = False + + return # --------------------------- # get_script # --------------------------- - def get_script(self): + async def get_script(self): """Get list of all scripts from Mikrotik""" self.data['script'] = await from_list( data=self.data['script'], diff --git a/custom_components/mikrotik_router/mikrotikapi.py b/custom_components/mikrotik_router/mikrotikapi.py index fbfb089..746f490 100644 --- a/custom_components/mikrotik_router/mikrotikapi.py +++ b/custom_components/mikrotik_router/mikrotikapi.py @@ -98,7 +98,7 @@ class MikrotikAPI: self.error = "cannot_connect" if error == "invalid user name or password (6)": self.error = "wrong_login" - + if "ALERT_HANDSHAKE_FAILURE" in error: self.error = "ssl_handshake_failure" @@ -122,7 +122,7 @@ class MikrotikAPI: try: response = self._connection.path(path) - _LOGGER.debug("API response ({}): {}".format(path, tuple(response))) + _LOGGER.debug("API response (%s): %s", path, tuple(response)) except librouteros_custom.exceptions.ConnectionClosed: _LOGGER.error("Mikrotik %s connection closed", self._host) self._connected = False @@ -247,11 +247,11 @@ class MikrotikAPI: response = self.path('/interface') if response is None: return None - + args = {'interface': interfaces, 'once': True} try: traffic = response('monitor-traffic', **args) - _LOGGER.debug("API response ({}): {}".format("/interface/monitor-traffic", tuple(response))) + _LOGGER.debug("API response (%s): %s", "/interface/monitor-traffic", tuple(response)) except librouteros_custom.exceptions.ConnectionClosed: _LOGGER.error("Mikrotik %s connection closed", self._host) self._connected = False diff --git a/custom_components/mikrotik_router/sensor.py b/custom_components/mikrotik_router/sensor.py index 29833fe..99e8976 100644 --- a/custom_components/mikrotik_router/sensor.py +++ b/custom_components/mikrotik_router/sensor.py @@ -255,4 +255,4 @@ class MikrotikControllerTrafficSensor(MikrotikControllerSensor): async def async_added_to_hass(self): """Port entity created.""" _LOGGER.debug("New sensor %s (%s %s)", self._inst, self._data['default-name'], self._sensor) - return \ No newline at end of file + return diff --git a/custom_components/mikrotik_router/switch.py b/custom_components/mikrotik_router/switch.py index 95b6271..e594539 100644 --- a/custom_components/mikrotik_router/switch.py +++ b/custom_components/mikrotik_router/switch.py @@ -94,8 +94,8 @@ def update_items(inst, mikrotik_controller, async_add_entities, switches): # Add switches for sid, sid_func in zip( - ["interface", "nat", "script"], - [MikrotikControllerPortSwitch, MikrotikControllerNATSwitch, MikrotikControllerScriptSwitch] + ["interface", "nat", "script"], + [MikrotikControllerPortSwitch, MikrotikControllerNATSwitch, MikrotikControllerScriptSwitch] ): for uid in mikrotik_controller.data[sid]: item_id = "{}-{}-{}".format(inst, sid, mikrotik_controller.data[sid][uid]['name'])