From 23b55b266cd78f7fb13bd83347c633336df24ae7 Mon Sep 17 00:00:00 2001 From: mjkantti Date: Sat, 20 Jan 2024 10:46:28 +0900 Subject: [PATCH 1/4] Add Parsing of the routeros version for capsman metrics --- mktxp/datasource/system_resource_ds.py | 18 ++++++++++++++++++ mktxp/flow/router_entry.py | 5 ++++- mktxp/utils/utils.py | 13 +++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/mktxp/datasource/system_resource_ds.py b/mktxp/datasource/system_resource_ds.py index 3ebbba6..250ccd2 100644 --- a/mktxp/datasource/system_resource_ds.py +++ b/mktxp/datasource/system_resource_ds.py @@ -13,6 +13,7 @@ from mktxp.datasource.base_ds import BaseDSProcessor +from mktxp.utils.utils import is_wifi_version class SystemResourceMetricsDataSource: @@ -28,3 +29,20 @@ class SystemResourceMetricsDataSource: except Exception as exc: print(f'Error getting system resource info from router{router_entry.router_name}@{router_entry.config_entry.hostname}: {exc}') return None + + @staticmethod + def is_os_with_wifi_builtin(router_entry): + try: + system_resource_records = router_entry.api_connection.router_api().get_resource('/system/resource').get() + version = '' + for record in system_resource_records: + if record['version']: + version = record['version'] + break + if not version: + return False + + return is_wifi_version(version) + except Exception as exc: + print(f'Error getting system resource info from router{router_entry.router_name}@{router_entry.config_entry.hostname}: {exc}') + return False \ No newline at end of file diff --git a/mktxp/flow/router_entry.py b/mktxp/flow/router_entry.py index fe4dfb9..a285a07 100644 --- a/mktxp/flow/router_entry.py +++ b/mktxp/flow/router_entry.py @@ -17,6 +17,7 @@ from collections import namedtuple from mktxp.cli.config.config import config_handler, MKTXPConfigKeys, CollectorKeys from mktxp.flow.router_connection import RouterAPIConnection from mktxp.datasource.package_ds import PackageMetricsDataSource +from mktxp.datasource.system_resource_ds import SystemResourceMetricsDataSource class RouterEntryWirelessType(IntEnum): @@ -75,7 +76,9 @@ class RouterEntry: def wireless_type(self): router_entry = self if self._wireless_type == RouterEntryWirelessType.NONE: - if PackageMetricsDataSource.is_package_installed(router_entry, package_name = RouterEntryWirelessPackage.WIFI_PACKAGE): + if SystemResourceMetricsDataSource.is_os_with_wifi_builtin(router_entry): + self._wireless_type = RouterEntryWirelessType.WIFI + elif PackageMetricsDataSource.is_package_installed(router_entry, package_name = RouterEntryWirelessPackage.WIFI_PACKAGE): self._wireless_type = RouterEntryWirelessType.WIFI elif PackageMetricsDataSource.is_package_installed(router_entry, package_name = RouterEntryWirelessPackage.WIFI_AC_PACKAGE): self._wireless_type = RouterEntryWirelessType.WIFI diff --git a/mktxp/utils/utils.py b/mktxp/utils/utils.py index ce9d9d3..f12d597 100755 --- a/mktxp/utils/utils.py +++ b/mktxp/utils/utils.py @@ -324,6 +324,19 @@ def parse_ros_version(string): version, channel = re.findall(r'([\d\.]+).*?([\w]+)', string)[0] return packaging.version.parse(version), channel +def is_wifi_version(string): + """Try to check if the version is Wifi version of RouterOS (> 7.13). + If anything goes wrong, return None. + Returns a boolean""" + try: + cur_version, _ = parse_ros_version(string) + if cur_version >= packaging.version.parse('7.13'): + return True + except Exception as err: + print(f'could not get current RouterOS version, because: {str(err)}') + + return False + def check_for_updates(cur_version): """Try to check if there is a newer version available. If anything goes wrong, it returns the same version. From 6d912fd45046986980924706563a2dbd8478bde9 Mon Sep 17 00:00:00 2001 From: mjkantti Date: Sat, 20 Jan 2024 11:25:02 +0900 Subject: [PATCH 2/4] Update system_resource_ds.py --- mktxp/datasource/system_resource_ds.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mktxp/datasource/system_resource_ds.py b/mktxp/datasource/system_resource_ds.py index 250ccd2..d2c783d 100644 --- a/mktxp/datasource/system_resource_ds.py +++ b/mktxp/datasource/system_resource_ds.py @@ -34,7 +34,7 @@ class SystemResourceMetricsDataSource: def is_os_with_wifi_builtin(router_entry): try: system_resource_records = router_entry.api_connection.router_api().get_resource('/system/resource').get() - version = '' + version = None for record in system_resource_records: if record['version']: version = record['version'] @@ -45,4 +45,4 @@ class SystemResourceMetricsDataSource: return is_wifi_version(version) except Exception as exc: print(f'Error getting system resource info from router{router_entry.router_name}@{router_entry.config_entry.hostname}: {exc}') - return False \ No newline at end of file + return False From 9017d65152fd18fc7fc6c55fe6254bb8bee6b69d Mon Sep 17 00:00:00 2001 From: Martti Date: Sat, 20 Jan 2024 02:47:34 +0000 Subject: [PATCH 3/4] Fix Check order --- mktxp/flow/router_entry.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mktxp/flow/router_entry.py b/mktxp/flow/router_entry.py index a285a07..81e8369 100644 --- a/mktxp/flow/router_entry.py +++ b/mktxp/flow/router_entry.py @@ -76,9 +76,7 @@ class RouterEntry: def wireless_type(self): router_entry = self if self._wireless_type == RouterEntryWirelessType.NONE: - if SystemResourceMetricsDataSource.is_os_with_wifi_builtin(router_entry): - self._wireless_type = RouterEntryWirelessType.WIFI - elif PackageMetricsDataSource.is_package_installed(router_entry, package_name = RouterEntryWirelessPackage.WIFI_PACKAGE): + if PackageMetricsDataSource.is_package_installed(router_entry, package_name = RouterEntryWirelessPackage.WIFI_PACKAGE): self._wireless_type = RouterEntryWirelessType.WIFI elif PackageMetricsDataSource.is_package_installed(router_entry, package_name = RouterEntryWirelessPackage.WIFI_AC_PACKAGE): self._wireless_type = RouterEntryWirelessType.WIFI @@ -86,6 +84,8 @@ class RouterEntry: self._wireless_type = RouterEntryWirelessType.WIFIWAVE2 elif PackageMetricsDataSource.is_package_installed(router_entry, package_name = RouterEntryWirelessPackage.WIRELESS_PACKAGE): self._wireless_type = RouterEntryWirelessType.DUAL + elif SystemResourceMetricsDataSource.is_os_with_wifi_builtin(router_entry): + self._wireless_type = RouterEntryWirelessType.WIFI else: self._wireless_type = RouterEntryWirelessType.WIRELESS return self._wireless_type From 3f7dd92407c0aba23a5ce9fd20be3bf3b3031b6a Mon Sep 17 00:00:00 2001 From: mjkantti Date: Sun, 21 Jan 2024 13:06:18 +0900 Subject: [PATCH 4/4] created os_version function, renamed functions with ambiguous names --- mktxp/datasource/system_resource_ds.py | 26 ++++++++++++++------------ mktxp/flow/router_entry.py | 2 +- mktxp/utils/utils.py | 5 +++-- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/mktxp/datasource/system_resource_ds.py b/mktxp/datasource/system_resource_ds.py index d2c783d..8c7ffb0 100644 --- a/mktxp/datasource/system_resource_ds.py +++ b/mktxp/datasource/system_resource_ds.py @@ -13,7 +13,7 @@ from mktxp.datasource.base_ds import BaseDSProcessor -from mktxp.utils.utils import is_wifi_version +from mktxp.utils.utils import builtin_wifi_capsman_version class SystemResourceMetricsDataSource: @@ -31,18 +31,20 @@ class SystemResourceMetricsDataSource: return None @staticmethod - def is_os_with_wifi_builtin(router_entry): + def os_version(router_entry): try: - system_resource_records = router_entry.api_connection.router_api().get_resource('/system/resource').get() - version = None - for record in system_resource_records: - if record['version']: - version = record['version'] - break - if not version: - return False - - return is_wifi_version(version) + system_version_records = router_entry.api_connection.router_api().get_resource('/system/resource').call('print', {'proplist':'version'}) + for record in system_version_records: + ver = record.get('version', None) + if ver: + return ver + + return None except Exception as exc: print(f'Error getting system resource info from router{router_entry.router_name}@{router_entry.config_entry.hostname}: {exc}') return False + + @staticmethod + def has_builtin_wifi_capsman(router_entry): + ver = SystemResourceMetricsDataSource.os_version(router_entry) + return builtin_wifi_capsman_version(ver) diff --git a/mktxp/flow/router_entry.py b/mktxp/flow/router_entry.py index 81e8369..36a4837 100644 --- a/mktxp/flow/router_entry.py +++ b/mktxp/flow/router_entry.py @@ -84,7 +84,7 @@ class RouterEntry: self._wireless_type = RouterEntryWirelessType.WIFIWAVE2 elif PackageMetricsDataSource.is_package_installed(router_entry, package_name = RouterEntryWirelessPackage.WIRELESS_PACKAGE): self._wireless_type = RouterEntryWirelessType.DUAL - elif SystemResourceMetricsDataSource.is_os_with_wifi_builtin(router_entry): + elif SystemResourceMetricsDataSource.has_builtin_wifi_capsman(router_entry): self._wireless_type = RouterEntryWirelessType.WIFI else: self._wireless_type = RouterEntryWirelessType.WIRELESS diff --git a/mktxp/utils/utils.py b/mktxp/utils/utils.py index f12d597..5368424 100755 --- a/mktxp/utils/utils.py +++ b/mktxp/utils/utils.py @@ -324,8 +324,8 @@ def parse_ros_version(string): version, channel = re.findall(r'([\d\.]+).*?([\w]+)', string)[0] return packaging.version.parse(version), channel -def is_wifi_version(string): - """Try to check if the version is Wifi version of RouterOS (> 7.13). +def builtin_wifi_capsman_version(string): + """Try to check if the version is Wifi version of RouterOS (>= 7.13). If anything goes wrong, return None. Returns a boolean""" try: @@ -334,6 +334,7 @@ def is_wifi_version(string): return True except Exception as err: print(f'could not get current RouterOS version, because: {str(err)}') + return None return False