mirror of
https://github.com/KevinMidboe/mktxp-no-cli.git
synced 2025-10-29 17:50:23 +00:00
Collector registry, fixes/optimizations
This commit is contained in:
@@ -12,10 +12,11 @@
|
|||||||
|
|
||||||
|
|
||||||
[MKTXP]
|
[MKTXP]
|
||||||
port = 49090 # default metrics HTTP server port
|
port = 49090
|
||||||
bandwidth_test_interval = 420 # Interval between periodic bandwidth tests
|
socket_timeout = 2
|
||||||
|
initial_delay_on_failure = 120
|
||||||
socket_timeout = 2 # Socket connection timeout
|
max_delay_on_failure = 900
|
||||||
initial_delay_on_failure = 120 # Delay untill next connection attempt to a RouterOS Device
|
delay_inc_div = 5
|
||||||
max_delay_on_failure = 900 # Max delay untill next connection attempt to a RouterOS Device
|
bandwidth_test_interval = 420
|
||||||
delay_inc_div = 5 # Delay increment factor
|
|
||||||
|
collectors = IdentityCollector, SystemResourceCollector, HealthCollector, DHCPCollector, PoolCollector, InterfaceCollector, FirewallCollector, MonitorCollector, RouteCollector, WLANCollector, CapsmanCollector, MKTXPCollector
|
||||||
@@ -54,6 +54,7 @@ class MKTXPConfigKeys:
|
|||||||
MKTXP_MAX_DELAY = 'max_delay_on_failure'
|
MKTXP_MAX_DELAY = 'max_delay_on_failure'
|
||||||
MKTXP_INC_DIV = 'delay_inc_div'
|
MKTXP_INC_DIV = 'delay_inc_div'
|
||||||
MKTXP_BANDWIDTH_TEST_INTERVAL = 'bandwidth_test_interval'
|
MKTXP_BANDWIDTH_TEST_INTERVAL = 'bandwidth_test_interval'
|
||||||
|
MKTXP_COLLECTORS = 'collectors'
|
||||||
|
|
||||||
# UnRegistered entries placeholder
|
# UnRegistered entries placeholder
|
||||||
NO_ENTRIES_REGISTERED = 'NoEntriesRegistered'
|
NO_ENTRIES_REGISTERED = 'NoEntriesRegistered'
|
||||||
@@ -74,6 +75,8 @@ class MKTXPConfigKeys:
|
|||||||
DEFAULT_MKTXP_MAX_DELAY = 900
|
DEFAULT_MKTXP_MAX_DELAY = 900
|
||||||
DEFAULT_MKTXP_INC_DIV = 5
|
DEFAULT_MKTXP_INC_DIV = 5
|
||||||
DEFAULT_MKTXP_BANDWIDTH_TEST_INTERVAL = 420
|
DEFAULT_MKTXP_BANDWIDTH_TEST_INTERVAL = 420
|
||||||
|
DEFAULT_MKTXP_COLLECTORS = ['IdentityCollector', 'SystemResourceCollector', 'HealthCollector', 'DHCPCollector', 'PoolCollector',
|
||||||
|
'InterfaceCollector', 'FirewallCollector', 'MonitorCollector', 'RouteCollector', 'WLANCollector', 'CapsmanCollector', 'MKTXPCollector']
|
||||||
|
|
||||||
BOOLEAN_KEYS = (ENABLED_KEY, SSL_KEY, NO_SSL_CERTIFICATE, SSL_CERTIFICATE_VERIFY,
|
BOOLEAN_KEYS = (ENABLED_KEY, SSL_KEY, NO_SSL_CERTIFICATE, SSL_CERTIFICATE_VERIFY,
|
||||||
FE_DHCP_KEY, FE_DHCP_LEASE_KEY, FE_DHCP_POOL_KEY, FE_INTERFACE_KEY, FE_FIREWALL_KEY,
|
FE_DHCP_KEY, FE_DHCP_LEASE_KEY, FE_DHCP_POOL_KEY, FE_INTERFACE_KEY, FE_FIREWALL_KEY,
|
||||||
@@ -88,17 +91,17 @@ class MKTXPConfigKeys:
|
|||||||
|
|
||||||
|
|
||||||
class ConfigEntry:
|
class ConfigEntry:
|
||||||
MKTXPEntry = namedtuple('MKTXPEntry', [MKTXPConfigKeys.ENABLED_KEY, MKTXPConfigKeys.HOST_KEY, MKTXPConfigKeys.PORT_KEY,
|
MKTXPConfigEntry = namedtuple('MKTXPConfigEntry', [MKTXPConfigKeys.ENABLED_KEY, MKTXPConfigKeys.HOST_KEY, MKTXPConfigKeys.PORT_KEY,
|
||||||
MKTXPConfigKeys.USER_KEY, MKTXPConfigKeys.PASSWD_KEY,
|
MKTXPConfigKeys.USER_KEY, MKTXPConfigKeys.PASSWD_KEY,
|
||||||
MKTXPConfigKeys.SSL_KEY, MKTXPConfigKeys.NO_SSL_CERTIFICATE, MKTXPConfigKeys.SSL_CERTIFICATE_VERIFY,
|
MKTXPConfigKeys.SSL_KEY, MKTXPConfigKeys.NO_SSL_CERTIFICATE, MKTXPConfigKeys.SSL_CERTIFICATE_VERIFY,
|
||||||
|
|
||||||
MKTXPConfigKeys.FE_DHCP_KEY, MKTXPConfigKeys.FE_DHCP_LEASE_KEY, MKTXPConfigKeys.FE_DHCP_POOL_KEY, MKTXPConfigKeys.FE_INTERFACE_KEY, MKTXPConfigKeys.FE_FIREWALL_KEY,
|
MKTXPConfigKeys.FE_DHCP_KEY, MKTXPConfigKeys.FE_DHCP_LEASE_KEY, MKTXPConfigKeys.FE_DHCP_POOL_KEY, MKTXPConfigKeys.FE_INTERFACE_KEY, MKTXPConfigKeys.FE_FIREWALL_KEY,
|
||||||
MKTXPConfigKeys.FE_MONITOR_KEY, MKTXPConfigKeys.FE_ROUTE_KEY, MKTXPConfigKeys.FE_WIRELESS_KEY, MKTXPConfigKeys.FE_WIRELESS_CLIENTS_KEY,
|
MKTXPConfigKeys.FE_MONITOR_KEY, MKTXPConfigKeys.FE_ROUTE_KEY, MKTXPConfigKeys.FE_WIRELESS_KEY, MKTXPConfigKeys.FE_WIRELESS_CLIENTS_KEY,
|
||||||
MKTXPConfigKeys.FE_CAPSMAN_KEY, MKTXPConfigKeys.FE_CAPSMAN_CLIENTS_KEY, MKTXPConfigKeys.MKTXP_USE_COMMENTS_OVER_NAMES
|
MKTXPConfigKeys.FE_CAPSMAN_KEY, MKTXPConfigKeys.FE_CAPSMAN_CLIENTS_KEY, MKTXPConfigKeys.MKTXP_USE_COMMENTS_OVER_NAMES
|
||||||
])
|
])
|
||||||
_MKTXPEntry = namedtuple('_MKTXPEntry', [MKTXPConfigKeys.PORT_KEY, MKTXPConfigKeys.MKTXP_SOCKET_TIMEOUT,
|
MKTXPSystemEntry = namedtuple('MKTXPSystemEntry', [MKTXPConfigKeys.PORT_KEY, MKTXPConfigKeys.MKTXP_SOCKET_TIMEOUT,
|
||||||
MKTXPConfigKeys.MKTXP_INITIAL_DELAY, MKTXPConfigKeys.MKTXP_MAX_DELAY,
|
MKTXPConfigKeys.MKTXP_INITIAL_DELAY, MKTXPConfigKeys.MKTXP_MAX_DELAY,
|
||||||
MKTXPConfigKeys.MKTXP_INC_DIV, MKTXPConfigKeys.MKTXP_BANDWIDTH_TEST_INTERVAL])
|
MKTXPConfigKeys.MKTXP_INC_DIV, MKTXPConfigKeys.MKTXP_BANDWIDTH_TEST_INTERVAL, MKTXPConfigKeys.MKTXP_COLLECTORS])
|
||||||
|
|
||||||
|
|
||||||
class OSConfig(metaclass = ABCMeta):
|
class OSConfig(metaclass = ABCMeta):
|
||||||
@@ -158,9 +161,32 @@ class MKTXPConfigHandler:
|
|||||||
self._create_os_path(self.mktxp_conf_path, 'mktxp/cli/config/_mktxp.conf')
|
self._create_os_path(self.mktxp_conf_path, 'mktxp/cli/config/_mktxp.conf')
|
||||||
|
|
||||||
self.re_compiled = {}
|
self.re_compiled = {}
|
||||||
|
|
||||||
self._read_from_disk()
|
self._read_from_disk()
|
||||||
|
|
||||||
|
# MKTXP entries
|
||||||
|
def registered_entries(self):
|
||||||
|
''' All MKTXP registered entries
|
||||||
|
'''
|
||||||
|
registered_entries = [entry_name for entry_name in self.config.keys()]
|
||||||
|
if not registered_entries:
|
||||||
|
registered_entries = [MKTXPConfigKeys.NO_ENTRIES_REGISTERED]
|
||||||
|
|
||||||
|
return registered_entries
|
||||||
|
|
||||||
|
def config_entry(self, entry_name):
|
||||||
|
''' Given an entry name, reads and returns the entry info
|
||||||
|
'''
|
||||||
|
entry_reader = self._config_entry_reader(entry_name)
|
||||||
|
return ConfigEntry.MKTXPConfigEntry(**entry_reader)
|
||||||
|
|
||||||
|
def system_entry(self):
|
||||||
|
''' MKTXP internal config entry
|
||||||
|
'''
|
||||||
|
_entry_reader = self._system_entry_reader()
|
||||||
|
return ConfigEntry.MKTXPSystemEntry(**_entry_reader)
|
||||||
|
|
||||||
|
# Helpers
|
||||||
def _read_from_disk(self):
|
def _read_from_disk(self):
|
||||||
''' (Force-)Read conf data from disk
|
''' (Force-)Read conf data from disk
|
||||||
'''
|
'''
|
||||||
@@ -173,112 +199,67 @@ class MKTXPConfigHandler:
|
|||||||
lookup_path = resource_filename(Requirement.parse("mktxp"), resource_path)
|
lookup_path = resource_filename(Requirement.parse("mktxp"), resource_path)
|
||||||
shutil.copy(lookup_path, os_path)
|
shutil.copy(lookup_path, os_path)
|
||||||
|
|
||||||
|
def _config_entry_reader(self, entry_name):
|
||||||
# MKTXP entries
|
config_entry_reader = {}
|
||||||
##############
|
|
||||||
def register_entry(self, entry_name, entry_args, quiet = False):
|
|
||||||
''' Registers MKTXP conf entry
|
|
||||||
'''
|
|
||||||
if entry_name in self.registered_entries():
|
|
||||||
if not quiet:
|
|
||||||
print('"{0}": entry name already registered'.format(entry_name))
|
|
||||||
return False
|
|
||||||
else:
|
|
||||||
self.config[entry_name] = entry_args
|
|
||||||
self.config.write()
|
|
||||||
if not quiet:
|
|
||||||
print('Entry registered: {0}'.format(entry_name))
|
|
||||||
return True
|
|
||||||
|
|
||||||
def unregister_entry(self, entry_name, quiet = False):
|
|
||||||
''' Un-registers MKTXP conf entry
|
|
||||||
'''
|
|
||||||
if self.config[entry_name]:
|
|
||||||
del(self.config[entry_name])
|
|
||||||
self.config.write()
|
|
||||||
if not quiet:
|
|
||||||
print('Unregistered entry: {}'.format(entry_name))
|
|
||||||
return True
|
|
||||||
else:
|
|
||||||
if not quiet:
|
|
||||||
print('Entry is not registered: {}'.format(entry_name))
|
|
||||||
return False
|
|
||||||
|
|
||||||
def registered_entries(self):
|
|
||||||
''' All MKTXP registered entries
|
|
||||||
'''
|
|
||||||
registered_entries = [entry_name for entry_name in self.config.keys()]
|
|
||||||
if not registered_entries:
|
|
||||||
registered_entries = [MKTXPConfigKeys.NO_ENTRIES_REGISTERED]
|
|
||||||
|
|
||||||
return registered_entries
|
|
||||||
|
|
||||||
def entry(self, entry_name):
|
|
||||||
''' Given an entry name, reads and returns the entry info
|
|
||||||
'''
|
|
||||||
entry_reader = self.entry_reader(entry_name)
|
|
||||||
return ConfigEntry.MKTXPEntry(**entry_reader)
|
|
||||||
|
|
||||||
def _entry(self):
|
|
||||||
''' MKTXP internal config entry
|
|
||||||
'''
|
|
||||||
_entry_reader = self._entry_reader()
|
|
||||||
return ConfigEntry._MKTXPEntry(**_entry_reader)
|
|
||||||
|
|
||||||
|
|
||||||
# Helpers
|
|
||||||
def entry_reader(self, entry_name):
|
|
||||||
entry_reader = {}
|
|
||||||
write_needed = False
|
write_needed = False
|
||||||
for key in MKTXPConfigKeys.BOOLEAN_KEYS:
|
for key in MKTXPConfigKeys.BOOLEAN_KEYS:
|
||||||
if self.config[entry_name].get(key):
|
if self.config[entry_name].get(key):
|
||||||
entry_reader[key] = self.config[entry_name].as_bool(key)
|
config_entry_reader[key] = self.config[entry_name].as_bool(key)
|
||||||
else:
|
else:
|
||||||
entry_reader[key] = False
|
config_entry_reader[key] = False
|
||||||
write_needed = True # read from disk next time
|
write_needed = True # read from disk next time
|
||||||
|
|
||||||
for key in MKTXPConfigKeys.STR_KEYS:
|
for key in MKTXPConfigKeys.STR_KEYS:
|
||||||
entry_reader[key] = self.config[entry_name][key]
|
config_entry_reader[key] = self.config[entry_name][key]
|
||||||
|
|
||||||
# port
|
# port
|
||||||
if self.config[entry_name].get(MKTXPConfigKeys.PORT_KEY):
|
if self.config[entry_name].get(MKTXPConfigKeys.PORT_KEY):
|
||||||
entry_reader[MKTXPConfigKeys.PORT_KEY] = self.config[entry_name].as_int(MKTXPConfigKeys.PORT_KEY)
|
config_entry_reader[MKTXPConfigKeys.PORT_KEY] = self.config[entry_name].as_int(MKTXPConfigKeys.PORT_KEY)
|
||||||
else:
|
else:
|
||||||
entry_reader[MKTXPConfigKeys.PORT_KEY] = self._default_value_for_key(MKTXPConfigKeys.SSL_KEY, entry_reader[MKTXPConfigKeys.SSL_KEY])
|
config_entry_reader[MKTXPConfigKeys.PORT_KEY] = self._default_value_for_key(MKTXPConfigKeys.SSL_KEY, config_entry_reader[MKTXPConfigKeys.SSL_KEY])
|
||||||
write_needed = True # read from disk next time
|
write_needed = True # read from disk next time
|
||||||
|
|
||||||
if write_needed:
|
if write_needed:
|
||||||
self.config[entry_name] = entry_reader
|
self.config[entry_name] = config_entry_reader
|
||||||
self.config.write()
|
self.config.write()
|
||||||
|
|
||||||
return entry_reader
|
return config_entry_reader
|
||||||
|
|
||||||
def _entry_reader(self):
|
def _system_entry_reader(self):
|
||||||
_entry_reader = {}
|
system_entry_reader = {}
|
||||||
entry_name = MKTXPConfigKeys.MKTXP_CONFIG_ENTRY_NAME
|
entry_name = MKTXPConfigKeys.MKTXP_CONFIG_ENTRY_NAME
|
||||||
write_needed = False
|
write_needed = False
|
||||||
|
|
||||||
for key in MKTXPConfigKeys.MKTXP_INT_KEYS:
|
for key in MKTXPConfigKeys.MKTXP_INT_KEYS:
|
||||||
if self._config[entry_name].get(key):
|
if self._config[entry_name].get(key):
|
||||||
_entry_reader[key] = self._config[entry_name].as_int(key)
|
system_entry_reader[key] = self._config[entry_name].as_int(key)
|
||||||
else:
|
else:
|
||||||
_entry_reader[key] = self._default_value_for_key(key)
|
system_entry_reader[key] = self._default_value_for_key(key)
|
||||||
write_needed = True # read from disk next time
|
write_needed = True # read from disk next time
|
||||||
|
|
||||||
|
# Collectors
|
||||||
|
if self._config[entry_name].get(MKTXPConfigKeys.MKTXP_COLLECTORS):
|
||||||
|
system_entry_reader[MKTXPConfigKeys.MKTXP_COLLECTORS] = self._config[entry_name][MKTXPConfigKeys.MKTXP_COLLECTORS]
|
||||||
|
else:
|
||||||
|
system_entry_reader[MKTXPConfigKeys.MKTXP_COLLECTORS] = self._default_value_for_key(MKTXPConfigKeys.MKTXP_COLLECTORS)
|
||||||
|
write_needed = True # read from disk next time
|
||||||
|
|
||||||
if write_needed:
|
if write_needed:
|
||||||
self._config[entry_name] = _entry_reader
|
self._config[entry_name] = system_entry_reader
|
||||||
self._config.write()
|
self._config.write()
|
||||||
|
|
||||||
return _entry_reader
|
return system_entry_reader
|
||||||
|
|
||||||
def _default_value_for_key(self, key, value = None):
|
def _default_value_for_key(self, key, value = None):
|
||||||
return {
|
return {
|
||||||
MKTXPConfigKeys.SSL_KEY: lambda value: MKTXPConfigKeys.DEFAULT_API_SSL_PORT if value else MKTXPConfigKeys.DEFAULT_API_PORT,
|
MKTXPConfigKeys.SSL_KEY: lambda value: MKTXPConfigKeys.DEFAULT_API_SSL_PORT if value else MKTXPConfigKeys.DEFAULT_API_PORT,
|
||||||
MKTXPConfigKeys.PORT_KEY: lambda value: MKTXPConfigKeys.DEFAULT_MKTXP_PORT,
|
MKTXPConfigKeys.PORT_KEY: MKTXPConfigKeys.DEFAULT_MKTXP_PORT,
|
||||||
MKTXPConfigKeys.MKTXP_SOCKET_TIMEOUT: lambda value: MKTXPConfigKeys.DEFAULT_MKTXP_SOCKET_TIMEOUT,
|
MKTXPConfigKeys.MKTXP_SOCKET_TIMEOUT: MKTXPConfigKeys.DEFAULT_MKTXP_SOCKET_TIMEOUT,
|
||||||
MKTXPConfigKeys.MKTXP_INITIAL_DELAY: lambda value: MKTXPConfigKeys.DEFAULT_MKTXP_INITIAL_DELAY,
|
MKTXPConfigKeys.MKTXP_INITIAL_DELAY: MKTXPConfigKeys.DEFAULT_MKTXP_INITIAL_DELAY,
|
||||||
MKTXPConfigKeys.MKTXP_MAX_DELAY: lambda value: MKTXPConfigKeys.DEFAULT_MKTXP_MAX_DELAY,
|
MKTXPConfigKeys.MKTXP_MAX_DELAY: MKTXPConfigKeys.DEFAULT_MKTXP_MAX_DELAY,
|
||||||
MKTXPConfigKeys.MKTXP_INC_DIV: lambda value: MKTXPConfigKeys.DEFAULT_MKTXP_INC_DIV,
|
MKTXPConfigKeys.MKTXP_INC_DIV: MKTXPConfigKeys.DEFAULT_MKTXP_INC_DIV,
|
||||||
MKTXPConfigKeys.MKTXP_BANDWIDTH_TEST_INTERVAL: lambda value: MKTXPConfigKeys.DEFAULT_MKTXP_BANDWIDTH_TEST_INTERVAL
|
MKTXPConfigKeys.MKTXP_BANDWIDTH_TEST_INTERVAL: MKTXPConfigKeys.DEFAULT_MKTXP_BANDWIDTH_TEST_INTERVAL,
|
||||||
|
MKTXPConfigKeys.MKTXP_COLLECTORS: MKTXPConfigKeys.DEFAULT_MKTXP_COLLECTORS
|
||||||
}[key](value)
|
}[key](value)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
#!.usr/bin/env python
|
||||||
# coding=utf8
|
# coding=utf8
|
||||||
## Copyright (c) 2020 Arseniy Kuznetsov
|
## Copyright (c) 2020 Arseniy Kuznetsov
|
||||||
##
|
##
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
import subprocess
|
import subprocess
|
||||||
from mktxp.cli.config.config import config_handler
|
from mktxp.cli.config.config import config_handler
|
||||||
from mktxp.cli.options import MKTXPOptionsParser, MKTXPCommands
|
from mktxp.cli.options import MKTXPOptionsParser, MKTXPCommands
|
||||||
from mktxp.processor.mktxp import MKTXPProcessor, MKTXPCLIProcessor
|
from mktxp.flow.processor.base_proc import ExportProcessor, OutputProcessor
|
||||||
|
|
||||||
|
|
||||||
class MKTXPDispatcher:
|
class MKTXPDispatcher:
|
||||||
@@ -60,12 +60,11 @@ class MKTXPDispatcher:
|
|||||||
if args['config']:
|
if args['config']:
|
||||||
print(f'MKTXP data config: {config_handler.usr_conf_data_path}')
|
print(f'MKTXP data config: {config_handler.usr_conf_data_path}')
|
||||||
print(f'MKTXP internal config: {config_handler.mktxp_conf_path}')
|
print(f'MKTXP internal config: {config_handler.mktxp_conf_path}')
|
||||||
|
|
||||||
else:
|
else:
|
||||||
for entryname in config_handler.registered_entries():
|
for entryname in config_handler.registered_entries():
|
||||||
if args['entry_name'] and entryname != args['entry_name']:
|
if args['entry_name'] and entryname != args['entry_name']:
|
||||||
continue
|
continue
|
||||||
entry = config_handler.entry(entryname)
|
entry = config_handler.config_entry(entryname)
|
||||||
print(f'[{entryname}]')
|
print(f'[{entryname}]')
|
||||||
divider_fields = set(['username', 'use_ssl', 'dhcp'])
|
divider_fields = set(['username', 'use_ssl', 'dhcp'])
|
||||||
for field in entry._fields:
|
for field in entry._fields:
|
||||||
@@ -87,20 +86,20 @@ class MKTXPDispatcher:
|
|||||||
subprocess.check_call([editor, config_handler.usr_conf_data_path])
|
subprocess.check_call([editor, config_handler.usr_conf_data_path])
|
||||||
|
|
||||||
def start_export(self, args):
|
def start_export(self, args):
|
||||||
MKTXPProcessor.start()
|
ExportProcessor.start()
|
||||||
|
|
||||||
def print(self, args):
|
def print(self, args):
|
||||||
if not (args['wifi_clients'] or args['capsman_clients']):
|
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")
|
print("Select metric option(s) to print out, or run 'mktxp print -h' to find out more")
|
||||||
|
|
||||||
if args['wifi_clients']:
|
if args['wifi_clients']:
|
||||||
MKTXPCLIProcessor.wifi_clients(args['entry_name'])
|
OutputProcessor.wifi_clients(args['entry_name'])
|
||||||
|
|
||||||
if args['capsman_clients']:
|
if args['capsman_clients']:
|
||||||
MKTXPCLIProcessor.capsman_clients(args['entry_name'])
|
OutputProcessor.capsman_clients(args['entry_name'])
|
||||||
|
|
||||||
if args['dhcp_clients']:
|
if args['dhcp_clients']:
|
||||||
MKTXPCLIProcessor.dhcp_clients(args['entry_name'])
|
OutputProcessor.dhcp_clients(args['entry_name'])
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
|||||||
@@ -150,7 +150,7 @@ Selected metrics info can be printed on the command line. For more information,
|
|||||||
args['entry_name'] = UniquePartialMatchList(config_handler.registered_entries()).find(args['entry_name'])
|
args['entry_name'] = UniquePartialMatchList(config_handler.registered_entries()).find(args['entry_name'])
|
||||||
|
|
||||||
if args['sub_cmd'] == MKTXPCommands.PRINT:
|
if args['sub_cmd'] == MKTXPCommands.PRINT:
|
||||||
if not config_handler.entry(args['entry_name']).enabled:
|
if not config_handler.config_entry(args['entry_name']).enabled:
|
||||||
print(f"Can not print metrics for disabled RouterOS entry: {args['entry_name']}\nRun 'mktxp edit' to review and enable it in the configuration file first")
|
print(f"Can not print metrics for disabled RouterOS entry: {args['entry_name']}\nRun 'mktxp edit' to review and enable it in the configuration file first")
|
||||||
parser.exit()
|
parser.exit()
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
## GNU General Public License for more details.
|
## GNU General Public License for more details.
|
||||||
|
|
||||||
|
|
||||||
from mktxp.processor.output import BaseOutputProcessor
|
from mktxp.flow.processor.output import BaseOutputProcessor
|
||||||
from mktxp.datasource.dhcp_ds import DHCPMetricsDataSource
|
from mktxp.datasource.dhcp_ds import DHCPMetricsDataSource
|
||||||
from mktxp.datasource.capsman_ds import CapsmanRegistrationsMetricsDataSource
|
from mktxp.datasource.capsman_ds import CapsmanRegistrationsMetricsDataSource
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
## GNU General Public License for more details.
|
## GNU General Public License for more details.
|
||||||
|
|
||||||
|
|
||||||
from mktxp.processor.output import BaseOutputProcessor
|
from mktxp.flow.processor.output import BaseOutputProcessor
|
||||||
from mktxp.datasource.dhcp_ds import DHCPMetricsDataSource
|
from mktxp.datasource.dhcp_ds import DHCPMetricsDataSource
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
## GNU General Public License for more details.
|
## GNU General Public License for more details.
|
||||||
|
|
||||||
|
|
||||||
from mktxp.processor.output import BaseOutputProcessor
|
from mktxp.flow.processor.output import BaseOutputProcessor
|
||||||
from mktxp.datasource.dhcp_ds import DHCPMetricsDataSource
|
from mktxp.datasource.dhcp_ds import DHCPMetricsDataSource
|
||||||
from mktxp.datasource.wireless_ds import WirelessMetricsDataSource
|
from mktxp.datasource.wireless_ds import WirelessMetricsDataSource
|
||||||
|
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ class BandwidthCollector(BaseCollector):
|
|||||||
yield latency_metrics
|
yield latency_metrics
|
||||||
|
|
||||||
ts = datetime.now().timestamp()
|
ts = datetime.now().timestamp()
|
||||||
if (ts - self.last_call_timestamp) > config_handler._entry().bandwidth_test_interval:
|
if (ts - self.last_call_timestamp) > config_handler.system_entry().bandwidth_test_interval:
|
||||||
self.pool.apply_async(BandwidthCollector.bandwidth_worker, callback=get_result)
|
self.pool.apply_async(BandwidthCollector.bandwidth_worker, callback=get_result)
|
||||||
self.last_call_timestamp = ts
|
self.last_call_timestamp = ts
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
|
|
||||||
from mktxp.cli.config.config import MKTXPConfigKeys
|
from mktxp.cli.config.config import MKTXPConfigKeys
|
||||||
from mktxp.processor.output import BaseOutputProcessor
|
from mktxp.flow.processor.output import BaseOutputProcessor
|
||||||
from mktxp.collector.base_collector import BaseCollector
|
from mktxp.collector.base_collector import BaseCollector
|
||||||
from mktxp.datasource.dhcp_ds import DHCPMetricsDataSource
|
from mktxp.datasource.dhcp_ds import DHCPMetricsDataSource
|
||||||
from mktxp.datasource.capsman_ds import CapsmanCapsMetricsDataSource, CapsmanRegistrationsMetricsDataSource
|
from mktxp.datasource.capsman_ds import CapsmanCapsMetricsDataSource, CapsmanRegistrationsMetricsDataSource
|
||||||
@@ -24,6 +24,9 @@ class CapsmanCollector(BaseCollector):
|
|||||||
'''
|
'''
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def collect(router_entry):
|
def collect(router_entry):
|
||||||
|
if not router_entry.config_entry.capsman:
|
||||||
|
return
|
||||||
|
|
||||||
remote_caps_labels = ['identity', 'version', 'base_mac', 'board', 'base_mac']
|
remote_caps_labels = ['identity', 'version', 'base_mac', 'board', 'base_mac']
|
||||||
remote_caps_records = CapsmanCapsMetricsDataSource.metric_records(router_entry, metric_labels = remote_caps_labels)
|
remote_caps_records = CapsmanCapsMetricsDataSource.metric_records(router_entry, metric_labels = remote_caps_labels)
|
||||||
if remote_caps_records:
|
if remote_caps_records:
|
||||||
|
|||||||
@@ -22,6 +22,9 @@ class DHCPCollector(BaseCollector):
|
|||||||
'''
|
'''
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def collect(router_entry):
|
def collect(router_entry):
|
||||||
|
if not router_entry.config_entry.dhcp:
|
||||||
|
return
|
||||||
|
|
||||||
dhcp_lease_labels = ['active_address', 'address', 'mac_address', 'host_name', 'comment', 'server', 'expires_after']
|
dhcp_lease_labels = ['active_address', 'address', 'mac_address', 'host_name', 'comment', 'server', 'expires_after']
|
||||||
dhcp_lease_records = DHCPMetricsDataSource.metric_records(router_entry, metric_labels = dhcp_lease_labels)
|
dhcp_lease_records = DHCPMetricsDataSource.metric_records(router_entry, metric_labels = dhcp_lease_labels)
|
||||||
if dhcp_lease_records:
|
if dhcp_lease_records:
|
||||||
|
|||||||
@@ -22,19 +22,22 @@ class FirewallCollector(BaseCollector):
|
|||||||
'''
|
'''
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def collect(router_entry):
|
def collect(router_entry):
|
||||||
|
if not router_entry.config_entry.firewall:
|
||||||
|
return
|
||||||
|
|
||||||
# initialize all pool counts, including those currently not used
|
# initialize all pool counts, including those currently not used
|
||||||
firewall_labels = ['chain', 'action', 'bytes', 'comment']
|
firewall_labels = ['chain', 'action', 'bytes', 'comment', 'log']
|
||||||
|
|
||||||
firewall_filter_records = FirewallMetricsDataSource.metric_records(router_entry, metric_labels = firewall_labels)
|
firewall_filter_records = FirewallMetricsDataSource.metric_records(router_entry, metric_labels = firewall_labels)
|
||||||
if firewall_filter_records:
|
if firewall_filter_records:
|
||||||
metris_records = [FirewallCollector.metric_record(router_entry, record) for record in firewall_filter_records]
|
metris_records = [FirewallCollector.metric_record(router_entry, record) for record in firewall_filter_records]
|
||||||
firewall_filter_metrics = BaseCollector.counter_collector('firewall_filter', 'Total amount of bytes matched by firewall rules', metris_records, 'bytes', ['name'])
|
firewall_filter_metrics = BaseCollector.counter_collector('firewall_filter', 'Total amount of bytes matched by firewall rules', metris_records, 'bytes', ['name', 'log'])
|
||||||
yield firewall_filter_metrics
|
yield firewall_filter_metrics
|
||||||
|
|
||||||
firewall_raw_records = FirewallMetricsDataSource.metric_records(router_entry, metric_labels = firewall_labels, raw = True)
|
firewall_raw_records = FirewallMetricsDataSource.metric_records(router_entry, metric_labels = firewall_labels, raw = True)
|
||||||
if firewall_raw_records:
|
if firewall_raw_records:
|
||||||
metris_records = [FirewallCollector.metric_record(router_entry, record) for record in firewall_raw_records]
|
metris_records = [FirewallCollector.metric_record(router_entry, record) for record in firewall_raw_records]
|
||||||
firewall_raw_metrics = BaseCollector.counter_collector('firewall_raw', 'Total amount of bytes matched by raw firewall rules', metris_records, 'bytes', ['name'])
|
firewall_raw_metrics = BaseCollector.counter_collector('firewall_raw', 'Total amount of bytes matched by raw firewall rules', metris_records, 'bytes', ['name', 'log'])
|
||||||
yield firewall_raw_metrics
|
yield firewall_raw_metrics
|
||||||
|
|
||||||
# Helpers
|
# Helpers
|
||||||
@@ -44,4 +47,4 @@ class FirewallCollector(BaseCollector):
|
|||||||
bytes = firewall_record['bytes']
|
bytes = firewall_record['bytes']
|
||||||
return {MKTXPConfigKeys.ROUTERBOARD_NAME: router_entry.router_id[MKTXPConfigKeys.ROUTERBOARD_NAME],
|
return {MKTXPConfigKeys.ROUTERBOARD_NAME: router_entry.router_id[MKTXPConfigKeys.ROUTERBOARD_NAME],
|
||||||
MKTXPConfigKeys.ROUTERBOARD_ADDRESS: router_entry.router_id[MKTXPConfigKeys.ROUTERBOARD_ADDRESS],
|
MKTXPConfigKeys.ROUTERBOARD_ADDRESS: router_entry.router_id[MKTXPConfigKeys.ROUTERBOARD_ADDRESS],
|
||||||
'name': name, 'bytes': bytes}
|
'name': name, 'log': firewall_record['log'], 'bytes': bytes}
|
||||||
|
|||||||
@@ -21,6 +21,9 @@ class InterfaceCollector(BaseCollector):
|
|||||||
'''
|
'''
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def collect(router_entry):
|
def collect(router_entry):
|
||||||
|
if not router_entry.config_entry.interface:
|
||||||
|
return
|
||||||
|
|
||||||
interface_traffic_labels = ['name', 'comment', 'rx_byte', 'tx_byte', 'rx_packet', 'tx_packet', 'rx_error', 'tx_error', 'rx_drop', 'tx_drop']
|
interface_traffic_labels = ['name', 'comment', 'rx_byte', 'tx_byte', 'rx_packet', 'tx_packet', 'rx_error', 'tx_error', 'rx_drop', 'tx_drop']
|
||||||
interface_traffic_records = InterfaceTrafficMetricsDataSource.metric_records(router_entry, metric_labels = interface_traffic_labels)
|
interface_traffic_records = InterfaceTrafficMetricsDataSource.metric_records(router_entry, metric_labels = interface_traffic_labels)
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
|
|
||||||
from mktxp.collector.base_collector import BaseCollector
|
from mktxp.collector.base_collector import BaseCollector
|
||||||
from mktxp.processor.output import BaseOutputProcessor
|
from mktxp.flow.processor.output import BaseOutputProcessor
|
||||||
from mktxp.datasource.interface_ds import InterfaceMonitorMetricsDataSource
|
from mktxp.datasource.interface_ds import InterfaceMonitorMetricsDataSource
|
||||||
|
|
||||||
|
|
||||||
@@ -22,6 +22,9 @@ class MonitorCollector(BaseCollector):
|
|||||||
'''
|
'''
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def collect(router_entry):
|
def collect(router_entry):
|
||||||
|
if not router_entry.config_entry.monitor:
|
||||||
|
return
|
||||||
|
|
||||||
monitor_labels = ('status', 'rate', 'full_duplex', 'name')
|
monitor_labels = ('status', 'rate', 'full_duplex', 'name')
|
||||||
monitor_records = InterfaceMonitorMetricsDataSource.metric_records(router_entry, metric_labels = monitor_labels, include_comments = True)
|
monitor_records = InterfaceMonitorMetricsDataSource.metric_records(router_entry, metric_labels = monitor_labels, include_comments = True)
|
||||||
if monitor_records:
|
if monitor_records:
|
||||||
|
|||||||
@@ -22,6 +22,9 @@ class PoolCollector(BaseCollector):
|
|||||||
'''
|
'''
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def collect(router_entry):
|
def collect(router_entry):
|
||||||
|
if not router_entry.config_entry.pool:
|
||||||
|
return
|
||||||
|
|
||||||
# initialize all pool counts, including those currently not used
|
# initialize all pool counts, including those currently not used
|
||||||
pool_records = PoolMetricsDataSource.metric_records(router_entry, metric_labels = ['name'])
|
pool_records = PoolMetricsDataSource.metric_records(router_entry, metric_labels = ['name'])
|
||||||
if pool_records:
|
if pool_records:
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
|
|
||||||
from mktxp.collector.base_collector import BaseCollector
|
from mktxp.collector.base_collector import BaseCollector
|
||||||
from mktxp.processor.output import BaseOutputProcessor
|
from mktxp.flow.processor.output import BaseOutputProcessor
|
||||||
from mktxp.datasource.system_resource_ds import SystemResourceMetricsDataSource
|
from mktxp.datasource.system_resource_ds import SystemResourceMetricsDataSource
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,9 @@ class RouteCollector(BaseCollector):
|
|||||||
'''
|
'''
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def collect(router_entry):
|
def collect(router_entry):
|
||||||
|
if not router_entry.config_entry.route:
|
||||||
|
return
|
||||||
|
|
||||||
route_labels = ['connect', 'dynamic', 'static', 'bgp', 'ospf']
|
route_labels = ['connect', 'dynamic', 'static', 'bgp', 'ospf']
|
||||||
route_records = RouteMetricsDataSource.metric_records(router_entry, metric_labels = route_labels)
|
route_records = RouteMetricsDataSource.metric_records(router_entry, metric_labels = route_labels)
|
||||||
if route_records:
|
if route_records:
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
## GNU General Public License for more details.
|
## GNU General Public License for more details.
|
||||||
|
|
||||||
|
|
||||||
from mktxp.processor.output import BaseOutputProcessor
|
from mktxp.flow.processor.output import BaseOutputProcessor
|
||||||
from mktxp.collector.base_collector import BaseCollector
|
from mktxp.collector.base_collector import BaseCollector
|
||||||
from mktxp.datasource.dhcp_ds import DHCPMetricsDataSource
|
from mktxp.datasource.dhcp_ds import DHCPMetricsDataSource
|
||||||
from mktxp.datasource.wireless_ds import WirelessMetricsDataSource
|
from mktxp.datasource.wireless_ds import WirelessMetricsDataSource
|
||||||
@@ -24,6 +24,9 @@ class WLANCollector(BaseCollector):
|
|||||||
'''
|
'''
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def collect(router_entry):
|
def collect(router_entry):
|
||||||
|
if not router_entry.config_entry.wireless:
|
||||||
|
return
|
||||||
|
|
||||||
monitor_labels = ['channel', 'noise_floor', 'overall_tx_ccq', 'registered_clients']
|
monitor_labels = ['channel', 'noise_floor', 'overall_tx_ccq', 'registered_clients']
|
||||||
monitor_records = InterfaceMonitorMetricsDataSource.metric_records(router_entry, metric_labels = monitor_labels, kind = 'wireless')
|
monitor_records = InterfaceMonitorMetricsDataSource.metric_records(router_entry, metric_labels = monitor_labels, kind = 'wireless')
|
||||||
if monitor_records:
|
if monitor_records:
|
||||||
|
|||||||
@@ -29,7 +29,9 @@ class FirewallMetricsDataSource:
|
|||||||
# translation rules
|
# translation rules
|
||||||
translation_table = {}
|
translation_table = {}
|
||||||
if 'comment' in metric_labels:
|
if 'comment' in metric_labels:
|
||||||
translation_table['comment'] = lambda c: c if c else ''
|
translation_table['comment'] = lambda value: value if value else ''
|
||||||
|
if 'log' in metric_labels:
|
||||||
|
translation_table['log'] = lambda value: '1' if value == 'true' else '0'
|
||||||
|
|
||||||
return BaseDSProcessor.trimmed_records(router_entry, router_records = firewall_records, metric_labels = metric_labels, translation_table = translation_table)
|
return BaseDSProcessor.trimmed_records(router_entry, router_records = firewall_records, metric_labels = metric_labels, translation_table = translation_table)
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
|
|||||||
38
mktxp/flow/collector_handler.py
Normal file
38
mktxp/flow/collector_handler.py
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
# coding=utf8
|
||||||
|
## Copyright (c) 2020 Arseniy Kuznetsov
|
||||||
|
##
|
||||||
|
## This program is free software; you can redistribute it and/or
|
||||||
|
## modify it under the terms of the GNU General Public License
|
||||||
|
## as published by the Free Software Foundation; either version 2
|
||||||
|
## of the License, or (at your option) any later version.
|
||||||
|
##
|
||||||
|
## This program is distributed in the hope that it will be useful,
|
||||||
|
## but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
## GNU General Public License for more details.
|
||||||
|
|
||||||
|
|
||||||
|
from timeit import default_timer
|
||||||
|
|
||||||
|
|
||||||
|
class CollectorHandler:
|
||||||
|
''' MKTXP Collectors Handler
|
||||||
|
'''
|
||||||
|
def __init__(self, entries_handler, collector_registry):
|
||||||
|
self.entries_handler = entries_handler
|
||||||
|
self.collector_registry = collector_registry
|
||||||
|
|
||||||
|
def collect(self):
|
||||||
|
yield from self.collector_registry.bandwidthCollector.collect()
|
||||||
|
|
||||||
|
for router_entry in self.entries_handler.router_entries:
|
||||||
|
if not router_entry.api_connection.is_connected():
|
||||||
|
# let's pick up on things in the next run
|
||||||
|
router_entry.api_connection.connect()
|
||||||
|
continue
|
||||||
|
|
||||||
|
for collector_ID, collect_func in self.collector_registry.registered_collectors.items():
|
||||||
|
start = default_timer()
|
||||||
|
yield from collect_func(router_entry)
|
||||||
|
router_entry.time_spent[collector_ID] += default_timer() - start
|
||||||
|
|
||||||
60
mktxp/flow/collector_registry.py
Normal file
60
mktxp/flow/collector_registry.py
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
# coding=utf8
|
||||||
|
## Copyright (c) 2020 Arseniy Kuznetsov
|
||||||
|
##
|
||||||
|
## This program is free software; you can redistribute it and/or
|
||||||
|
## modify it under the terms of the GNU General Public License
|
||||||
|
## as published by the Free Software Foundation; either version 2
|
||||||
|
## of the License, or (at your option) any later version.
|
||||||
|
##
|
||||||
|
## This program is distributed in the hope that it will be useful,
|
||||||
|
## but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
## GNU General Public License for more details.
|
||||||
|
|
||||||
|
|
||||||
|
from collections import OrderedDict
|
||||||
|
from mktxp.cli.config.config import MKTXPConfigKeys
|
||||||
|
from mktxp.collector.dhcp_collector import DHCPCollector
|
||||||
|
from mktxp.collector.interface_collector import InterfaceCollector
|
||||||
|
from mktxp.collector.health_collector import HealthCollector
|
||||||
|
from mktxp.collector.identity_collector import IdentityCollector
|
||||||
|
from mktxp.collector.monitor_collector import MonitorCollector
|
||||||
|
from mktxp.collector.pool_collector import PoolCollector
|
||||||
|
from mktxp.collector.resource_collector import SystemResourceCollector
|
||||||
|
from mktxp.collector.route_collector import RouteCollector
|
||||||
|
from mktxp.collector.wlan_collector import WLANCollector
|
||||||
|
from mktxp.collector.capsman_collector import CapsmanCollector
|
||||||
|
from mktxp.collector.bandwidth_collector import BandwidthCollector
|
||||||
|
from mktxp.collector.firewall_collector import FirewallCollector
|
||||||
|
from mktxp.collector.mktxp_collector import MKTXPCollector
|
||||||
|
|
||||||
|
|
||||||
|
class CollectorRegistry:
|
||||||
|
''' MKTXP Collectors Registry
|
||||||
|
'''
|
||||||
|
def __init__(self):
|
||||||
|
self.registered_collectors = OrderedDict()
|
||||||
|
|
||||||
|
# bandwidth collector is not router-entry related, so registering directly
|
||||||
|
self.bandwidthCollector = BandwidthCollector()
|
||||||
|
|
||||||
|
self.register('IdentityCollector', IdentityCollector.collect)
|
||||||
|
self.register('SystemResourceCollector', SystemResourceCollector.collect)
|
||||||
|
self.register('HealthCollector', HealthCollector.collect)
|
||||||
|
|
||||||
|
self.register('DHCPCollector', DHCPCollector.collect)
|
||||||
|
self.register('PoolCollector', PoolCollector.collect)
|
||||||
|
self.register('InterfaceCollector', InterfaceCollector.collect)
|
||||||
|
|
||||||
|
self.register('FirewallCollector', FirewallCollector.collect)
|
||||||
|
self.register('MonitorCollector', MonitorCollector.collect)
|
||||||
|
self.register('RouteCollector', RouteCollector.collect)
|
||||||
|
|
||||||
|
self.register('WLANCollector', WLANCollector.collect)
|
||||||
|
self.register('CapsmanCollector', CapsmanCollector.collect)
|
||||||
|
|
||||||
|
self.register('MKTXPCollector', MKTXPCollector.collect)
|
||||||
|
|
||||||
|
def register(self, collector_ID, collect_func):
|
||||||
|
self.registered_collectors[collector_ID] = collect_func
|
||||||
|
|
||||||
@@ -1,104 +0,0 @@
|
|||||||
# coding=utf8
|
|
||||||
## Copyright (c) 2020 Arseniy Kuznetsov
|
|
||||||
##
|
|
||||||
## This program is free software; you can redistribute it and/or
|
|
||||||
## modify it under the terms of the GNU General Public License
|
|
||||||
## as published by the Free Software Foundation; either version 2
|
|
||||||
## of the License, or (at your option) any later version.
|
|
||||||
##
|
|
||||||
## This program is distributed in the hope that it will be useful,
|
|
||||||
## but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
## GNU General Public License for more details.
|
|
||||||
|
|
||||||
|
|
||||||
from timeit import default_timer
|
|
||||||
from mktxp.collector.dhcp_collector import DHCPCollector
|
|
||||||
from mktxp.collector.interface_collector import InterfaceCollector
|
|
||||||
from mktxp.collector.health_collector import HealthCollector
|
|
||||||
from mktxp.collector.identity_collector import IdentityCollector
|
|
||||||
from mktxp.collector.monitor_collector import MonitorCollector
|
|
||||||
from mktxp.collector.pool_collector import PoolCollector
|
|
||||||
from mktxp.collector.resource_collector import SystemResourceCollector
|
|
||||||
from mktxp.collector.route_collector import RouteCollector
|
|
||||||
from mktxp.collector.wlan_collector import WLANCollector
|
|
||||||
from mktxp.collector.capsman_collector import CapsmanCollector
|
|
||||||
from mktxp.collector.bandwidth_collector import BandwidthCollector
|
|
||||||
from mktxp.collector.firewall_collector import FirewallCollector
|
|
||||||
from mktxp.collector.mktxp_collector import MKTXPCollector
|
|
||||||
|
|
||||||
|
|
||||||
class CollectorsHandler:
|
|
||||||
''' MKTXP Collectors Handler
|
|
||||||
'''
|
|
||||||
def __init__(self, entries_handler):
|
|
||||||
self.entries_handler = entries_handler
|
|
||||||
self.bandwidthCollector = BandwidthCollector()
|
|
||||||
|
|
||||||
def collect(self):
|
|
||||||
# process mktxp internal metrics
|
|
||||||
yield from self.bandwidthCollector.collect()
|
|
||||||
|
|
||||||
for router_entry in self.entries_handler.router_entries:
|
|
||||||
if not router_entry.api_connection.is_connected():
|
|
||||||
# let's pick up on things in the next run
|
|
||||||
router_entry.api_connection.connect()
|
|
||||||
continue
|
|
||||||
|
|
||||||
start = default_timer()
|
|
||||||
yield from IdentityCollector.collect(router_entry)
|
|
||||||
router_entry.time_spent['IdentityCollector'] += default_timer() - start
|
|
||||||
|
|
||||||
start = default_timer()
|
|
||||||
yield from SystemResourceCollector.collect(router_entry)
|
|
||||||
router_entry.time_spent['SystemResourceCollector'] += default_timer() - start
|
|
||||||
|
|
||||||
start = default_timer()
|
|
||||||
yield from HealthCollector.collect(router_entry)
|
|
||||||
router_entry.time_spent['HealthCollector'] += default_timer() - start
|
|
||||||
|
|
||||||
if router_entry.config_entry.dhcp:
|
|
||||||
start = default_timer()
|
|
||||||
yield from DHCPCollector.collect(router_entry)
|
|
||||||
router_entry.time_spent['DHCPCollector'] += default_timer() - start
|
|
||||||
|
|
||||||
if router_entry.config_entry.pool:
|
|
||||||
start = default_timer()
|
|
||||||
yield from PoolCollector.collect(router_entry)
|
|
||||||
router_entry.time_spent['PoolCollector'] += default_timer() - start
|
|
||||||
|
|
||||||
if router_entry.config_entry.interface:
|
|
||||||
start = default_timer()
|
|
||||||
yield from InterfaceCollector.collect(router_entry)
|
|
||||||
router_entry.time_spent['InterfaceCollector'] += default_timer() - start
|
|
||||||
|
|
||||||
if router_entry.config_entry.firewall:
|
|
||||||
start = default_timer()
|
|
||||||
yield from FirewallCollector.collect(router_entry)
|
|
||||||
router_entry.time_spent['FirewallCollector'] += default_timer() - start
|
|
||||||
|
|
||||||
if router_entry.config_entry.monitor:
|
|
||||||
start = default_timer()
|
|
||||||
yield from MonitorCollector.collect(router_entry)
|
|
||||||
router_entry.time_spent['MonitorCollector'] += default_timer() - start
|
|
||||||
|
|
||||||
if router_entry.config_entry.route:
|
|
||||||
start = default_timer()
|
|
||||||
yield from RouteCollector.collect(router_entry)
|
|
||||||
router_entry.time_spent['RouteCollector'] += default_timer() - start
|
|
||||||
|
|
||||||
if router_entry.config_entry.wireless:
|
|
||||||
start = default_timer()
|
|
||||||
yield from WLANCollector.collect(router_entry)
|
|
||||||
router_entry.time_spent['WLANCollector'] += default_timer() - start
|
|
||||||
|
|
||||||
if router_entry.config_entry.capsman:
|
|
||||||
start = default_timer()
|
|
||||||
yield from CapsmanCollector.collect(router_entry)
|
|
||||||
router_entry.time_spent['CapsmanCollector'] += default_timer() - start
|
|
||||||
|
|
||||||
yield from MKTXPCollector.collect(router_entry)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -16,8 +16,10 @@ from http.server import HTTPServer
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from prometheus_client.core import REGISTRY
|
from prometheus_client.core import REGISTRY
|
||||||
from prometheus_client import MetricsHandler
|
from prometheus_client import MetricsHandler
|
||||||
|
|
||||||
from mktxp.cli.config.config import config_handler
|
from mktxp.cli.config.config import config_handler
|
||||||
from mktxp.flow.collectors_handler import CollectorsHandler
|
from mktxp.flow.collector_handler import CollectorHandler
|
||||||
|
from mktxp.flow.collector_registry import CollectorRegistry
|
||||||
from mktxp.flow.router_entries_handler import RouterEntriesHandler
|
from mktxp.flow.router_entries_handler import RouterEntriesHandler
|
||||||
|
|
||||||
from mktxp.cli.output.capsman_out import CapsmanOutput
|
from mktxp.cli.output.capsman_out import CapsmanOutput
|
||||||
@@ -25,17 +27,16 @@ from mktxp.cli.output.wifi_out import WirelessOutput
|
|||||||
from mktxp.cli.output.dhcp_out import DHCPOutput
|
from mktxp.cli.output.dhcp_out import DHCPOutput
|
||||||
|
|
||||||
|
|
||||||
class MKTXPProcessor:
|
class ExportProcessor:
|
||||||
''' Base Export Processing
|
''' Base Export Processing
|
||||||
'''
|
'''
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def start():
|
def start():
|
||||||
router_entries_handler = RouterEntriesHandler()
|
REGISTRY.register(CollectorHandler(RouterEntriesHandler(), CollectorRegistry()))
|
||||||
REGISTRY.register(CollectorsHandler(router_entries_handler))
|
ExportProcessor.run(port=config_handler.system_entry().port)
|
||||||
MKTXPProcessor.run(port=config_handler._entry().port)
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def run(server_class=HTTPServer, handler_class=MetricsHandler, port = None):
|
def run(server_class=HTTPServer, handler_class=MetricsHandler, port=None):
|
||||||
server_address = ('', port)
|
server_address = ('', port)
|
||||||
httpd = server_class(server_address, handler_class)
|
httpd = server_class(server_address, handler_class)
|
||||||
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||||
@@ -43,7 +44,7 @@ class MKTXPProcessor:
|
|||||||
httpd.serve_forever()
|
httpd.serve_forever()
|
||||||
|
|
||||||
|
|
||||||
class MKTXPCLIProcessor:
|
class OutputProcessor:
|
||||||
''' Base CLI Processing
|
''' Base CLI Processing
|
||||||
'''
|
'''
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@@ -46,7 +46,7 @@ class RouterAPIConnection:
|
|||||||
ssl_verify = self.config_entry.ssl_certificate_verify,
|
ssl_verify = self.config_entry.ssl_certificate_verify,
|
||||||
ssl_context = ctx)
|
ssl_context = ctx)
|
||||||
|
|
||||||
self.connection.socket_timeout = config_handler._entry().socket_timeout
|
self.connection.socket_timeout = config_handler.system_entry().socket_timeout
|
||||||
self.api = None
|
self.api = None
|
||||||
|
|
||||||
def is_connected(self):
|
def is_connected(self):
|
||||||
@@ -91,7 +91,7 @@ class RouterAPIConnection:
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
def _connect_delay(self):
|
def _connect_delay(self):
|
||||||
mktxp_entry = config_handler._entry()
|
mktxp_entry = config_handler.system_entry()
|
||||||
connect_delay = (1 + self.successive_failure_count / mktxp_entry.delay_inc_div) * mktxp_entry.initial_delay_on_failure
|
connect_delay = (1 + self.successive_failure_count / mktxp_entry.delay_inc_div) * mktxp_entry.initial_delay_on_failure
|
||||||
return connect_delay if connect_delay < mktxp_entry.max_delay_on_failure else mktxp_entry.max_delay_on_failure
|
return connect_delay if connect_delay < mktxp_entry.max_delay_on_failure else mktxp_entry.max_delay_on_failure
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ class RouterEntriesHandler:
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.router_entries = []
|
self.router_entries = []
|
||||||
for router_name in config_handler.registered_entries():
|
for router_name in config_handler.registered_entries():
|
||||||
entry = config_handler.entry(router_name)
|
entry = config_handler.config_entry(router_name)
|
||||||
if entry.enabled:
|
if entry.enabled:
|
||||||
self.router_entries.append(RouterEntry(router_name))
|
self.router_entries.append(RouterEntry(router_name))
|
||||||
|
|
||||||
@@ -32,7 +32,7 @@ class RouterEntriesHandler:
|
|||||||
for router_name in config_handler.registered_entries():
|
for router_name in config_handler.registered_entries():
|
||||||
if router_name == entry_name:
|
if router_name == entry_name:
|
||||||
if enabled_only:
|
if enabled_only:
|
||||||
entry = config_handler.entry(router_name)
|
entry = config_handler.config_entry(router_name)
|
||||||
if not entry.enabled:
|
if not entry.enabled:
|
||||||
break
|
break
|
||||||
router_entry = RouterEntry(router_name)
|
router_entry = RouterEntry(router_name)
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ class RouterEntry:
|
|||||||
'''
|
'''
|
||||||
def __init__(self, router_name):
|
def __init__(self, router_name):
|
||||||
self.router_name = router_name
|
self.router_name = router_name
|
||||||
self.config_entry = config_handler.entry(router_name)
|
self.config_entry = config_handler.config_entry(router_name)
|
||||||
self.api_connection = RouterAPIConnection(router_name, self.config_entry)
|
self.api_connection = RouterAPIConnection(router_name, self.config_entry)
|
||||||
self.router_id = {
|
self.router_id = {
|
||||||
MKTXPConfigKeys.ROUTERBOARD_NAME: self.router_name,
|
MKTXPConfigKeys.ROUTERBOARD_NAME: self.router_name,
|
||||||
@@ -37,5 +37,6 @@ class RouterEntry:
|
|||||||
'MonitorCollector': 0,
|
'MonitorCollector': 0,
|
||||||
'RouteCollector': 0,
|
'RouteCollector': 0,
|
||||||
'WLANCollector': 0,
|
'WLANCollector': 0,
|
||||||
'CapsmanCollector': 0
|
'CapsmanCollector': 0,
|
||||||
|
'MKTXPCollector': 0
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user