diff --git a/mktxp/cli/config/_mktxp.conf b/mktxp/cli/config/_mktxp.conf index 5354678..7275688 100644 --- a/mktxp/cli/config/_mktxp.conf +++ b/mktxp/cli/config/_mktxp.conf @@ -21,3 +21,5 @@ bandwidth = True # Turns metrics bandwidth metrics collection on / off bandwidth_test_interval = 420 # Interval for colllecting bandwidth metrics + + verbose_mode = False # Set it on for troubleshooting diff --git a/mktxp/cli/config/config.py b/mktxp/cli/config/config.py index 87d2e7d..6db990b 100755 --- a/mktxp/cli/config/config.py +++ b/mktxp/cli/config/config.py @@ -58,6 +58,7 @@ class MKTXPConfigKeys: MKTXP_INC_DIV = 'delay_inc_div' MKTXP_BANDWIDTH_KEY = 'bandwidth' MKTXP_BANDWIDTH_TEST_INTERVAL = 'bandwidth_test_interval' + MKTXP_VERBOSE_MODE = 'verbose_mode' # UnRegistered entries placeholder NO_ENTRIES_REGISTERED = 'NoEntriesRegistered' @@ -86,7 +87,8 @@ class MKTXPConfigKeys: FE_MONITOR_KEY, FE_ROUTE_KEY, MKTXP_USE_COMMENTS_OVER_NAMES, FE_WIRELESS_KEY, FE_WIRELESS_CLIENTS_KEY, FE_CAPSMAN_KEY, FE_CAPSMAN_CLIENTS_KEY, FE_POE_KEY, FE_NETWATCH_KEY} - SYSTEM_BOOLEAN_KEYS_YES = (MKTXP_BANDWIDTH_KEY,) + SYSTEM_BOOLEAN_KEYS_YES = {MKTXP_BANDWIDTH_KEY} + SYSTEM_BOOLEAN_KEYS_NO = {MKTXP_VERBOSE_MODE} STR_KEYS = (HOST_KEY, USER_KEY, PASSWD_KEY) MKTXP_INT_KEYS = (PORT_KEY, MKTXP_SOCKET_TIMEOUT, MKTXP_INITIAL_DELAY, MKTXP_MAX_DELAY, MKTXP_INC_DIV, MKTXP_BANDWIDTH_TEST_INTERVAL) @@ -106,14 +108,15 @@ class ConfigEntry: ]) MKTXPSystemEntry = namedtuple('MKTXPSystemEntry', [MKTXPConfigKeys.PORT_KEY, MKTXPConfigKeys.MKTXP_SOCKET_TIMEOUT, MKTXPConfigKeys.MKTXP_INITIAL_DELAY, MKTXPConfigKeys.MKTXP_MAX_DELAY, - MKTXPConfigKeys.MKTXP_INC_DIV, MKTXPConfigKeys.MKTXP_BANDWIDTH_KEY, MKTXPConfigKeys.MKTXP_BANDWIDTH_TEST_INTERVAL]) + MKTXPConfigKeys.MKTXP_INC_DIV, MKTXPConfigKeys.MKTXP_BANDWIDTH_KEY, + MKTXPConfigKeys.MKTXP_VERBOSE_MODE, MKTXPConfigKeys.MKTXP_BANDWIDTH_TEST_INTERVAL]) class OSConfig(metaclass = ABCMeta): ''' OS-related config ''' @staticmethod - def os_config(quiet = False): + def os_config(): ''' Factory method ''' if sys.platform == 'linux': @@ -121,8 +124,7 @@ class OSConfig(metaclass = ABCMeta): elif sys.platform == 'darwin': return OSXConfig() else: - if not quiet: - print(f'Non-supported platform: {sys.platform}') + print(f'Non-supported platform: {sys.platform}') return None @property @@ -244,11 +246,11 @@ class MKTXPConfigHandler: system_entry_reader[key] = self._default_value_for_key(key) write_needed = True # read from disk next time - for key in MKTXPConfigKeys.SYSTEM_BOOLEAN_KEYS_YES: + for key in MKTXPConfigKeys.SYSTEM_BOOLEAN_KEYS_NO.union(MKTXPConfigKeys.SYSTEM_BOOLEAN_KEYS_YES): if self._config[entry_name].get(key): system_entry_reader[key] = self._config[entry_name].as_bool(key) else: - system_entry_reader[key] = True + system_entry_reader[key] = True if key in MKTXPConfigKeys.SYSTEM_BOOLEAN_KEYS_YES else False write_needed = True # read from disk next time if write_needed: diff --git a/mktxp/cli/dispatch.py b/mktxp/cli/dispatch.py index 43208d0..4588c18 100755 --- a/mktxp/cli/dispatch.py +++ b/mktxp/cli/dispatch.py @@ -89,18 +89,17 @@ class MKTXPDispatcher: ExportProcessor.start() def print(self, args): - if not (args['wifi_clients'] or args['capsman_clients']): - print("Select metric option(s) to print out, or run 'mktxp print -h' to find out more") - if args['wifi_clients']: OutputProcessor.wifi_clients(args['entry_name']) - if args['capsman_clients']: + elif args['capsman_clients']: OutputProcessor.capsman_clients(args['entry_name']) - if args['dhcp_clients']: + elif args['dhcp_clients']: OutputProcessor.dhcp_clients(args['entry_name']) - + + else: + print("Select metric option(s) to print out, or run 'mktxp print -h' to find out more") def main(): MKTXPDispatcher().dispatch() diff --git a/mktxp/cli/options.py b/mktxp/cli/options.py index 899aff3..1961c13 100755 --- a/mktxp/cli/options.py +++ b/mktxp/cli/options.py @@ -218,8 +218,9 @@ Selected metrics info can be printed on the command line. For more information, return editor commands = ['which nano', 'which vi', 'which vim'] + quiet = not config_handler.system_entry().verbose_mode for command in commands: - editor = run_cmd(command, quiet = True).rstrip() + editor = run_cmd(command, quiet = quiet).rstrip() if editor: break return editor diff --git a/mktxp/collector/dhcp_collector.py b/mktxp/collector/dhcp_collector.py index ee20100..23c1df6 100644 --- a/mktxp/collector/dhcp_collector.py +++ b/mktxp/collector/dhcp_collector.py @@ -40,11 +40,20 @@ class DHCPCollector(BaseCollector): 'server': key, 'count': value} for key, value in dhcp_lease_servers.items()] # yield lease-per-server metrics - dhcp_lease_server_metrics = BaseCollector.gauge_collector('dhcp_lease_active_count', 'Number of active leases per DHCP server', dhcp_lease_servers_records, 'count', ['server']) + dhcp_lease_server_metrics = BaseCollector.gauge_collector('dhcp_lease_active_count', + 'Number of active leases per DHCP server', + dhcp_lease_servers_records, 'count', ['server']) yield dhcp_lease_server_metrics # active lease metrics + dhcp_lease_labels.remove('expires_after') if router_entry.config_entry.dhcp_lease: - dhcp_lease_metrics = BaseCollector.info_collector('dhcp_lease', 'DHCP Active Leases', dhcp_lease_records, dhcp_lease_labels) - yield dhcp_lease_metrics - \ No newline at end of file + dhcp_lease_metrics_gauge = BaseCollector.gauge_collector('dhcp_lease', 'DHCP Active Leases', + dhcp_lease_records, 'expires_after', dhcp_lease_labels) + yield dhcp_lease_metrics_gauge + + # active lease metrics + #if router_entry.config_entry.dhcp_lease: + # dhcp_lease_metrics = BaseCollector.info_collector('dhcp_lease', 'DHCP Active Leases', dhcp_lease_records, dhcp_lease_labels) + # yield dhcp_lease_metrics + diff --git a/mktxp/datasource/dhcp_ds.py b/mktxp/datasource/dhcp_ds.py index d1e4dae..6744ddc 100644 --- a/mktxp/datasource/dhcp_ds.py +++ b/mktxp/datasource/dhcp_ds.py @@ -13,6 +13,7 @@ from mktxp.datasource.base_ds import BaseDSProcessor +from mktxp.utils.utils import parse_mkt_uptime class DHCPMetricsDataSource: @@ -31,7 +32,7 @@ class DHCPMetricsDataSource: if 'host_name' in metric_labels: translation_table['host_name'] = lambda c: c if c else '' if 'expires_after' in metric_labels: - translation_table['expires_after'] = lambda c: c if c else '' + translation_table['expires_after'] = lambda c: parse_mkt_uptime(c) if 'active_address' in metric_labels: translation_table['active_address'] = lambda c: c if c else '' diff --git a/mktxp/flow/processor/output.py b/mktxp/flow/processor/output.py index 4cadd26..1b7406a 100644 --- a/mktxp/flow/processor/output.py +++ b/mktxp/flow/processor/output.py @@ -85,7 +85,7 @@ class BaseOutputProcessor: wifi_rates_rgx = re.compile(r'(\d*(?:\.\d*)?)([GgMmKk]bps?)') config_handler.re_compiled['wifi_rates_rgx'] = wifi_rates_rgx rc = wifi_rates_rgx.search(rate) - return f'{int(float(rc[1]))} {rc[2]}' if rc else '' + return f'{int(float(rc[1]))} {rc[2]}' if rc and len(rc.groups()) == 2 else rate @staticmethod def parse_timedelta(time): diff --git a/mktxp/flow/router_connection.py b/mktxp/flow/router_connection.py index d355bcb..cc279f9 100644 --- a/mktxp/flow/router_connection.py +++ b/mktxp/flow/router_connection.py @@ -76,14 +76,14 @@ class RouterAPIConnection: self.connect() return self.api - def _in_connect_timeout(self, connect_timestamp, quiet = True): + def _in_connect_timeout(self, connect_timestamp): connect_delay = self._connect_delay() if (connect_timestamp - self.last_failure_timestamp) < connect_delay: - if not quiet: - print(f'{self.router_name}@{self.config_entry.hostname}: in connect timeout, {int(connect_delay - (connect_timestamp - self.last_failure_timestamp))}secs remaining') + if config_handler.system_entry().verbose_mode: + print(f'{self.router_name}@{self.E.hostname}: in connect timeout, {int(connect_delay - (connect_timestamp - self.last_failure_timestamp))}secs remaining') print(f'Successive failure count: {self.successive_failure_count}') return True - if not quiet: + if config_handler.system_entry().verbose_mode: print(f'{self.router_name}@{self.config_entry.hostname}: OK to connect') if self.last_failure_timestamp > 0: print(f'Seconds since last failure: {connect_timestamp - self.last_failure_timestamp}') diff --git a/mktxp/utils/utils.py b/mktxp/utils/utils.py index 71aa366..3144610 100755 --- a/mktxp/utils/utils.py +++ b/mktxp/utils/utils.py @@ -18,6 +18,7 @@ from timeit import default_timer from collections.abc import Iterable from contextlib import contextmanager from multiprocessing import Process, Event +from datetime import timedelta ''' Utilities / Helpers @@ -69,6 +70,11 @@ def get_last_digit(str_to_search): else: return -1 +def parse_mkt_uptime(time): + time_dict = re.match(r'((?P\d+)w)?((?P\d+)d)?((?P\d+)h)?((?P\d+)m)?((?P\d+)s)?', time).groupdict() + delta = timedelta(**{key: int(value) for key, value in time_dict.items() if value}).total_seconds() + return int(delta) if delta else 0 + class FSHelper: ''' File System ops helper ''' diff --git a/setup.py b/setup.py index bc5cb5b..7a59337 100755 --- a/setup.py +++ b/setup.py @@ -20,7 +20,7 @@ with open(path.join(pkg_dir, 'README.md'), encoding='utf-8') as f: setup( name='mktxp', - version='0.34', + version='0.35', url='https://github.com/akpw/mktxp',