controller refactoring

This commit is contained in:
Tomaae 2019-12-11 15:34:35 +01:00
parent 795f4f6ab2
commit 6d394a06ef

View file

@ -126,6 +126,7 @@ class MikrotikControllerData():
await self.async_fwupdate_check() await self.async_fwupdate_check()
await self.get_interface() await self.get_interface()
await self.get_interface_traffic()
await self.get_interface_client() await self.get_interface_client()
self.get_nat() self.get_nat()
self.get_system_resource() self.get_system_resource()
@ -190,20 +191,18 @@ class MikrotikControllerData():
] ]
) )
await self.get_interface_traffic(interface_list)
return return
# --------------------------- # ---------------------------
# get_interface_traffic # get_interface_traffic
# --------------------------- # ---------------------------
async def get_interface_traffic(self, interface_list): async def get_interface_traffic(self):
"""Get traffic for all interfaces from Mikrotik""" """Get traffic for all interfaces from Mikrotik"""
interface_list = "" interface_list = ""
for uid in self.data['interface']: for uid in self.data['interface']:
if interface_list: interface_list += self.data['interface'][uid]['name'] + ","
interface_list += ","
interface_list += self.data['interface'][uid]['name'] interface_list = interface_list[:-1]
self.data['interface'] = await from_list( self.data['interface'] = await from_list(
data=self.data['interface'], data=self.data['interface'],
@ -330,7 +329,7 @@ class MikrotikControllerData():
uid = None uid = None
for ifacename in self.data['interface']: for ifacename in self.data['interface']:
if self.data['interface'][ifacename]['name'] == entry['interface']: if self.data['interface'][ifacename]['name'] == entry['interface']:
uid = self.data['interface'][ifacename]['default-name'] uid = ifacename
break break
return uid return uid
@ -340,6 +339,26 @@ class MikrotikControllerData():
# --------------------------- # ---------------------------
def get_nat(self): def get_nat(self):
"""Get NAT data from Mikrotik""" """Get NAT data from Mikrotik"""
# self.data['nat'] = await from_list(
# data=self.data['nat'],
# source=await self.hass.async_add_executor_job(self.api.path, "/ip/firewall/nat"),
# key='.id',
# vals=[
# {'name': 'name', 'source': 'dst-port'},
# {'name': '.id'},
# {'name': 'protocol'},
# {'name': 'dst-port'},
# {'name': 'in-interface', 'default': 'any'},
# {'name': 'to-addresses'},
# {'name': 'to-ports'},
# {'name': 'comment'},
# {'name': 'enabled', 'source': 'disabled', 'type': 'bool', 'reverse': True}
# ],
# only=[
# {'key': 'action', 'value': 'dst-nat'}
# ]
# )
data = self.api.path("/ip/firewall/nat") data = self.api.path("/ip/firewall/nat")
if not data: if not data:
return return
@ -369,16 +388,16 @@ class MikrotikControllerData():
# --------------------------- # ---------------------------
def get_system_routerboard(self): def get_system_routerboard(self):
"""Get routerboard data from Mikrotik""" """Get routerboard data from Mikrotik"""
data = self.api.path("/system/routerboard") self.data['routerboard'] = await from_list(
if not data: data=self.data['routerboard'],
return source=await self.hass.async_add_executor_job(self.api.path, "/system/routerboard"),
vals=[
for entry in data: {'name': 'routerboard', 'type': 'bool'},
self.data['routerboard']['routerboard'] = from_entry_bool(entry, 'routerboard') {'name': 'model', 'default': 'unknown'},
self.data['routerboard']['model'] = from_entry(entry, 'model', 'unknown') {'name': 'serial-number', 'default': 'unknown'},
self.data['routerboard']['serial-number'] = from_entry(entry, 'serial-number', 'unknown') {'name': 'firmware', 'default': 'unknown'},
self.data['routerboard']['firmware'] = from_entry(entry, 'current-firmware', 'unknown') ]
)
return return
# --------------------------- # ---------------------------
@ -386,22 +405,29 @@ class MikrotikControllerData():
# --------------------------- # ---------------------------
def get_system_resource(self): def get_system_resource(self):
"""Get system resources data from Mikrotik""" """Get system resources data from Mikrotik"""
data = self.api.path("/system/resource") self.data['resource'] = await from_list(
if not data: data=self.data['resource'],
return source=await self.hass.async_add_executor_job(self.api.path, "/system/resource"),
vals=[
{'name': 'platform', 'default': 'unknown'},
{'name': 'board-name', 'default': 'unknown'},
{'name': 'version', 'default': 'unknown'},
{'name': 'uptime', 'default': 'unknown'},
{'name': 'cpu-load', 'default': 'unknown'},
{'name': 'free-memory', 'default': 0},
{'name': 'total-memory', 'default': 0},
{'name': 'free-hdd-space', 'default': 0},
{'name': 'total-hdd-space', 'default': 0}
]
)
for entry in data: for entry in data['resource']:
self.data['resource']['platform'] = from_entry(entry, 'platform', 'unknown') if entry['total-memory'] > 0:
self.data['resource']['board-name'] = from_entry(entry, 'board-name', 'unknown')
self.data['resource']['version'] = from_entry(entry, 'version', 'unknown')
self.data['resource']['uptime'] = from_entry(entry, 'uptime', 'unknown')
self.data['resource']['cpu-load'] = from_entry(entry, 'cpu-load', 'unknown')
if 'free-memory' in entry and 'total-memory' in entry:
self.data['resource']['memory-usage'] = round(((entry['total-memory'] - entry['free-memory']) / entry['total-memory']) * 100) self.data['resource']['memory-usage'] = round(((entry['total-memory'] - entry['free-memory']) / entry['total-memory']) * 100)
else: else:
self.data['resource']['memory-usage'] = "unknown" self.data['resource']['memory-usage'] = "unknown"
if 'free-hdd-space' in entry and 'total-hdd-space' in entry: 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) self.data['resource']['hdd-usage'] = round(((entry['total-hdd-space'] - entry['free-hdd-space']) / entry['total-hdd-space']) * 100)
else: else:
self.data['resource']['hdd-usage'] = "unknown" self.data['resource']['hdd-usage'] = "unknown"
@ -413,44 +439,37 @@ class MikrotikControllerData():
# --------------------------- # ---------------------------
def get_firmware_update(self): def get_firmware_update(self):
"""Check for firmware update on Mikrotik""" """Check for firmware update on Mikrotik"""
data = self.api.path("/system/package/update") self.data['fw-update'] = await from_list(
if not data: data=self.data['fw-update'],
return 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'}
]
)
for entry in data: if status in self.data['fw-update']:
if 'status' in entry: self.data['fw-update']['available'] = True if self.data['fw-update']['status'] == "New version is available" else False
self.data['fw-update']['available'] = True if entry['status'] == "New version is available" else False else:
elif 'available' not in self.data['fw-update']: self.data['fw-update']['available'] = False
self.data['fw-update']['available'] = False
self.data['fw-update']['channel'] = from_entry(entry, 'channel', 'unknown') return
self.data['fw-update']['installed-version'] = from_entry(entry, 'installed-version', 'unknown')
self.data['fw-update']['latest-version'] = from_entry(entry, 'latest-version', 'unknown')
return
# --------------------------- # ---------------------------
# get_script # get_script
# --------------------------- # ---------------------------
def get_script(self): def get_script(self):
"""Get list of all scripts from Mikrotik""" """Get list of all scripts from Mikrotik"""
data = self.api.path("/system/script") self.data['script'] = await from_list(
if not data: data=self.data['script'],
return source=await self.hass.async_add_executor_job(self.api.path, "/system/script"),
key='name',
for entry in data: vals=[
if 'name' not in entry: {'name': 'name'},
continue {'name': 'last-started', 'default': 'unknown'},
{'name': 'run-count', 'default': 'unknown'}
if not entry['name']: ]
_LOGGER.error("Mikrotik %s found a script without a name. It will not be available in UI.") )
continue
uid = entry['name']
if uid not in self.data['script']:
self.data['script'][uid] = {}
self.data['script'][uid]['name'] = from_entry(entry, 'name')
self.data['script'][uid]['last-started'] = from_entry(entry, 'last-started', 'unknown')
self.data['script'][uid]['run-count'] = from_entry(entry, 'run-count', 'unknown')
return return