Merge pull request #1 from ivanpavlina/dev

Add ability to return list results of API call instead of generator. …
This commit is contained in:
Ivan Pavlina 2020-04-04 17:55:14 +02:00 committed by GitHub
commit c06c8e6da2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 41 additions and 41 deletions

View file

@ -57,6 +57,8 @@ def parse_api(
data = fill_defaults(data, vals)
return data
_LOGGER.debug("Processing source %s", source)
keymap = generate_keymap(data, key_search)
for entry in source:
if only and not matches_only(entry, only):
@ -74,7 +76,7 @@ def parse_api(
if uid not in data:
data[uid] = {}
_LOGGER.debug("Processing entry %s, entry %s", source, entry)
_LOGGER.debug("Processing entry %s", entry)
if vals:
data = fill_vals(data, entry, uid, vals)

View file

@ -229,7 +229,7 @@ class MikrotikControllerData:
"""Get all interfaces data from Mikrotik"""
self.data["interface"] = parse_api(
data=self.data["interface"],
source=self.api.path("/interface"),
source=self.api.path("/interface", return_list=True),
key="default-name",
vals=[
{"name": "default-name"},
@ -331,7 +331,7 @@ class MikrotikControllerData:
# ---------------------------
def update_arp(self, mac2ip, bridge_used):
"""Get list of hosts in ARP for interface client data from Mikrotik"""
data = self.api.path("/ip/arp")
data = self.api.path("/ip/arp", return_list=True)
if not data:
return mac2ip, bridge_used
@ -382,7 +382,7 @@ class MikrotikControllerData:
# ---------------------------
def update_bridge_hosts(self, mac2ip):
"""Get list of hosts in bridge for interface client data from Mikrotik"""
data = self.api.path("/interface/bridge/host")
data = self.api.path("/interface/bridge/host", return_list=True)
if not data:
return
@ -437,7 +437,7 @@ class MikrotikControllerData:
"""Get NAT data from Mikrotik"""
self.data["nat"] = parse_api(
data=self.data["nat"],
source=self.api.path("/ip/firewall/nat"),
source=self.api.path("/ip/firewall/nat", return_list=True, return_list=True),
key=".id",
vals=[
{"name": ".id"},
@ -473,7 +473,7 @@ class MikrotikControllerData:
"""Get routerboard data from Mikrotik"""
self.data["routerboard"] = parse_api(
data=self.data["routerboard"],
source=self.api.path("/system/routerboard"),
source=self.api.path("/system/routerboard", return_list=True),
vals=[
{"name": "routerboard", "type": "bool"},
{"name": "model", "default": "unknown"},
@ -489,7 +489,7 @@ class MikrotikControllerData:
"""Get system resources data from Mikrotik"""
self.data["resource"] = parse_api(
data=self.data["resource"],
source=self.api.path("/system/resource"),
source=self.api.path("/system/resource", return_list=True),
vals=[
{"name": "platform", "default": "unknown"},
{"name": "board-name", "default": "unknown"},
@ -538,7 +538,7 @@ class MikrotikControllerData:
"""Check for firmware update on Mikrotik"""
self.data["fw-update"] = parse_api(
data=self.data["fw-update"],
source=self.api.path("/system/package/update"),
source=self.api.path("/system/package/update", return_list=True),
vals=[
{"name": "status"},
{"name": "channel", "default": "unknown"},
@ -563,7 +563,7 @@ class MikrotikControllerData:
"""Get list of all scripts from Mikrotik"""
self.data["script"] = parse_api(
data=self.data["script"],
source=self.api.path("/system/script"),
source=self.api.path("/system/script", return_list=True),
key="name",
vals=[
{"name": "name"},
@ -580,7 +580,7 @@ class MikrotikControllerData:
"""Get Queue data from Mikrotik"""
self.data["queue"] = parse_api(
data=self.data["queue"],
source=self.api.path("/queue/simple"),
source=self.api.path("/queue/simple", return_list=True),
key="name",
vals=[
{"name": ".id"},

View file

@ -167,8 +167,9 @@ class MikrotikAPI:
# ---------------------------
# path
# ---------------------------
def path(self, path) -> Optional(list):
def path(self, path, return_list=False) -> Optional(list):
"""Retrieve data from Mikrotik API."""
"""Returns generator object, unless return_list passed as True"""
if not self._connected or not self._connection:
if self._connection_epoch > time.time() - self._connection_retry_sec:
return None
@ -189,18 +190,17 @@ class MikrotikAPI:
self.lock.release()
return None
except (
librouteros_custom.exceptions.TrapError,
librouteros_custom.exceptions.MultiTrapError,
librouteros_custom.exceptions.ProtocolError,
librouteros_custom.exceptions.FatalError,
ssl.SSLError,
BrokenPipeError,
OSError,
ValueError,
librouteros_custom.exceptions.TrapError,
librouteros_custom.exceptions.MultiTrapError,
librouteros_custom.exceptions.ProtocolError,
librouteros_custom.exceptions.FatalError,
ssl.SSLError,
BrokenPipeError,
OSError,
ValueError,
) as api_error:
if not self.connection_error_reported:
_LOGGER.error("Mikrotik %s error while path %s", self._host,
api_error)
_LOGGER.error("Mikrotik %s error while path %s", self._host, api_error)
self.connection_error_reported = True
self.disconnect()
@ -208,34 +208,32 @@ class MikrotikAPI:
return None
except:
if not self.connection_error_reported:
_LOGGER.error("Mikrotik %s error while path %s", self._host,
"unknown")
_LOGGER.error("Mikrotik %s error while path %s", self._host, "unknown")
self.connection_error_reported = True
self.disconnect()
self.lock.release()
return None
try:
tuple(response)
except librouteros_custom.exceptions.ConnectionClosed as api_error:
if not self.connection_error_reported:
_LOGGER.error("Mikrotik %s error while path %s", self._host,
api_error)
self.connection_error_reported = True
if return_list:
try:
response = list(response)
except librouteros_custom.exceptions.ConnectionClosed as api_error:
if not self.connection_error_reported:
_LOGGER.error("Mikrotik %s error while building list for path %s", self._host, api_error)
self.connection_error_reported = True
self.disconnect()
self.lock.release()
return None
except:
if not self.connection_error_reported:
_LOGGER.error("Mikrotik %s error while path %s", self._host,
"unknown")
self.connection_error_reported = True
self.disconnect()
self.lock.release()
return None
except:
if not self.connection_error_reported:
_LOGGER.error("Mikrotik %s error while building list for path %s", self._host, "unknown")
self.connection_error_reported = True
self.disconnect()
self.lock.release()
return None
self.disconnect()
self.lock.release()
return None
self.lock.release()
return response if response else None