mirror of
https://github.com/KevinMidboe/mktxp-no-cli.git
synced 2025-10-29 17:50:23 +00:00
DS refactor, fixes/optimizations
This commit is contained in:
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
## Description
|
## Description
|
||||||
MKTXP is a Prometheus Exporter for Mikrotik RouterOS devices.\
|
MKTXP is a Prometheus Exporter for Mikrotik RouterOS devices.\
|
||||||
It gathers a rich set of supported metrics across multiple routers, all easily configurable via built-in CLI interface.
|
It gathers and exports a rich set of metrics across multiple routers, all easily configurable via built-in CLI interface.
|
||||||
|
|
||||||
Apart from exporting to Prometheus, MKTXP can also print some of the metrics directly on the command line (see an example below).
|
Apart from exporting to Prometheus, MKTXP can also print some of the metrics directly on the command line (see an example below).
|
||||||
|
|
||||||
|
|||||||
@@ -36,4 +36,4 @@
|
|||||||
capsman = True # CAPsMAN general metrics
|
capsman = True # CAPsMAN general metrics
|
||||||
capsman_clients = True # CAPsMAN clients metrics
|
capsman_clients = True # CAPsMAN clients metrics
|
||||||
|
|
||||||
use_comments_over_names = False # when available, forces using comments over the interfaces names
|
use_comments_over_names = True # when available, forces using comments over the interfaces names
|
||||||
@@ -13,13 +13,10 @@
|
|||||||
## GNU General Public License for more details.
|
## GNU General Public License for more details.
|
||||||
|
|
||||||
|
|
||||||
import sys
|
|
||||||
import subprocess
|
import subprocess
|
||||||
import mktxp.cli.checks.chk_pv
|
from mktxp.cli.config.config import config_handler
|
||||||
from mktxp.utils.utils import run_cmd
|
|
||||||
from mktxp.cli.options import MKTXPOptionsParser, MKTXPCommands
|
from mktxp.cli.options import MKTXPOptionsParser, MKTXPCommands
|
||||||
from mktxp.cli.config.config import config_handler, ConfigEntry
|
from mktxp.processor.mktxp import MKTXPProcessor, MKTXPCLIProcessor
|
||||||
from mktxp.basep import MKTXPProcessor, MKTXPCLIProcessor
|
|
||||||
|
|
||||||
|
|
||||||
class MKTXPDispatcher:
|
class MKTXPDispatcher:
|
||||||
@@ -106,7 +103,6 @@ class MKTXPDispatcher:
|
|||||||
MKTXPCLIProcessor.dhcp_clients(args['entry_name'])
|
MKTXPCLIProcessor.dhcp_clients(args['entry_name'])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
MKTXPDispatcher().dispatch()
|
MKTXPDispatcher().dispatch()
|
||||||
|
|
||||||
|
|||||||
@@ -12,8 +12,7 @@
|
|||||||
## GNU General Public License for more details.
|
## GNU General Public License for more details.
|
||||||
|
|
||||||
|
|
||||||
from tabulate import tabulate
|
from mktxp.processor.output import BaseOutputProcessor
|
||||||
from mktxp.cli.output.base_out 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
|
||||||
|
|
||||||
@@ -43,14 +42,23 @@ class CapsmanOutput:
|
|||||||
else:
|
else:
|
||||||
dhcp_rt_by_interface[interface] = [registration_record]
|
dhcp_rt_by_interface[interface] = [registration_record]
|
||||||
|
|
||||||
num_records = 0
|
|
||||||
output_table = []
|
output_entry = BaseOutputProcessor.OutputCapsmanEntry
|
||||||
|
output_table = BaseOutputProcessor.output_table(output_entry)
|
||||||
|
|
||||||
|
output_records = 0
|
||||||
|
registration_records = len(registration_records)
|
||||||
for key in dhcp_rt_by_interface.keys():
|
for key in dhcp_rt_by_interface.keys():
|
||||||
for record in dhcp_rt_by_interface[key]:
|
for record in dhcp_rt_by_interface[key]:
|
||||||
output_table.append(BaseOutputProcessor.OutputCapsmanEntry(**record))
|
output_table.add_row(output_entry(**record))
|
||||||
num_records += 1
|
output_records += 1
|
||||||
output_table.append({})
|
if output_records < registration_records:
|
||||||
print()
|
output_table.add_row(output_entry())
|
||||||
print(tabulate(output_table, headers = "keys", tablefmt="github"))
|
|
||||||
print(tabulate([{0:'Connected Wifi Devices:', 1:num_records}], tablefmt="text"))
|
print (output_table.draw())
|
||||||
|
|
||||||
|
for server in dhcp_rt_by_interface.keys():
|
||||||
|
print(f'{server} clients: {len(dhcp_rt_by_interface[server])}')
|
||||||
|
print(f'Total connected CAPsMAN clients: {output_records}', '\n')
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -12,8 +12,7 @@
|
|||||||
## GNU General Public License for more details.
|
## GNU General Public License for more details.
|
||||||
|
|
||||||
|
|
||||||
from tabulate import tabulate
|
from mktxp.processor.output import BaseOutputProcessor
|
||||||
from mktxp.cli.output.base_out import BaseOutputProcessor
|
|
||||||
from mktxp.datasource.dhcp_ds import DHCPMetricsDataSource
|
from mktxp.datasource.dhcp_ds import DHCPMetricsDataSource
|
||||||
|
|
||||||
|
|
||||||
@@ -36,16 +35,21 @@ class DHCPOutput:
|
|||||||
else:
|
else:
|
||||||
dhcp_by_server[server] = [dhcp_lease_record]
|
dhcp_by_server[server] = [dhcp_lease_record]
|
||||||
|
|
||||||
num_records = 0
|
output_entry = BaseOutputProcessor.OutputDHCPEntry
|
||||||
output_table = []
|
output_table = BaseOutputProcessor.output_table(output_entry)
|
||||||
|
|
||||||
|
output_records = 0
|
||||||
|
lease_records = len(dhcp_lease_records)
|
||||||
for key in dhcp_by_server.keys():
|
for key in dhcp_by_server.keys():
|
||||||
for record in dhcp_by_server[key]:
|
for record in dhcp_by_server[key]:
|
||||||
record['host_name'] = BaseOutputProcessor.dhcp_name(router_entry, record, drop_comment = True)
|
record['host_name'] = BaseOutputProcessor.dhcp_name(router_entry, record, drop_comment = True)
|
||||||
output_table.append(BaseOutputProcessor.OutputDHCPEntry(**record))
|
output_table.add_row(output_entry(**record))
|
||||||
num_records += 1
|
output_records += 1
|
||||||
output_table.append({})
|
if output_records < lease_records:
|
||||||
print()
|
output_table.add_row(output_entry())
|
||||||
print(tabulate(output_table, headers = "keys", tablefmt="github"))
|
|
||||||
print(tabulate([{0:'DHCP Clients:', 1:num_records}], tablefmt="text"))
|
|
||||||
|
|
||||||
|
print (output_table.draw())
|
||||||
|
|
||||||
|
for server in dhcp_by_server.keys():
|
||||||
|
print(f'{server} clients: {len(dhcp_by_server[server])}')
|
||||||
|
print(f'Total DHCP clients: {output_records}', '\n')
|
||||||
|
|||||||
@@ -12,8 +12,7 @@
|
|||||||
## GNU General Public License for more details.
|
## GNU General Public License for more details.
|
||||||
|
|
||||||
|
|
||||||
from tabulate import tabulate
|
from mktxp.processor.output import BaseOutputProcessor
|
||||||
from mktxp.cli.output.base_out 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
|
||||||
|
|
||||||
@@ -43,13 +42,21 @@ class WirelessOutput:
|
|||||||
else:
|
else:
|
||||||
dhcp_rt_by_interface[interface] = [registration_record]
|
dhcp_rt_by_interface[interface] = [registration_record]
|
||||||
|
|
||||||
num_records = 0
|
output_entry = BaseOutputProcessor.OutputWiFiEntry
|
||||||
output_table = []
|
output_table = BaseOutputProcessor.output_table(output_entry)
|
||||||
|
|
||||||
|
output_records = 0
|
||||||
|
registration_records = len(registration_records)
|
||||||
for key in dhcp_rt_by_interface.keys():
|
for key in dhcp_rt_by_interface.keys():
|
||||||
for record in dhcp_rt_by_interface[key]:
|
for record in dhcp_rt_by_interface[key]:
|
||||||
output_table.append(BaseOutputProcessor.OutputWiFiEntry(**record))
|
output_table.add_row(output_entry(**record))
|
||||||
num_records += 1
|
output_records += 1
|
||||||
output_table.append({})
|
if output_records < registration_records:
|
||||||
print()
|
output_table.add_row(output_entry())
|
||||||
print(tabulate(output_table, headers = "keys", tablefmt="github"))
|
|
||||||
print(tabulate([{0:'Connected Wifi Devices:', 1:num_records}], tablefmt="text"))
|
print (output_table.draw())
|
||||||
|
|
||||||
|
for server in dhcp_rt_by_interface.keys():
|
||||||
|
print(f'{server} clients: {len(dhcp_rt_by_interface[server])}')
|
||||||
|
print(f'Total connected WiFi devices: {output_records}', '\n')
|
||||||
|
|
||||||
|
|||||||
@@ -12,8 +12,8 @@
|
|||||||
## GNU General Public License for more details.
|
## GNU General Public License for more details.
|
||||||
|
|
||||||
|
|
||||||
from mktxp.cli.output.base_out import BaseOutputProcessor
|
|
||||||
from mktxp.cli.config.config import MKTXPConfigKeys
|
from mktxp.cli.config.config import MKTXPConfigKeys
|
||||||
|
from mktxp.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
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
|
|
||||||
from mktxp.collector.base_collector import BaseCollector
|
from mktxp.collector.base_collector import BaseCollector
|
||||||
from mktxp.cli.output.base_out import BaseOutputProcessor
|
from mktxp.processor.output import BaseOutputProcessor
|
||||||
from mktxp.datasource.interface_ds import InterfaceMonitorMetricsDataSource
|
from mktxp.datasource.interface_ds import InterfaceMonitorMetricsDataSource
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
|
|
||||||
from mktxp.collector.base_collector import BaseCollector
|
from mktxp.collector.base_collector import BaseCollector
|
||||||
from mktxp.cli.output.base_out import BaseOutputProcessor
|
from mktxp.processor.output import BaseOutputProcessor
|
||||||
from mktxp.datasource.system_resource_ds import SystemResourceMetricsDataSource
|
from mktxp.datasource.system_resource_ds import SystemResourceMetricsDataSource
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
## GNU General Public License for more details.
|
## GNU General Public License for more details.
|
||||||
|
|
||||||
|
|
||||||
from mktxp.cli.output.base_out import BaseOutputProcessor
|
from mktxp.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
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
|
|
||||||
from mktxp.cli.config.config import config_handler
|
from mktxp.cli.config.config import config_handler
|
||||||
from mktxp.router_entry import RouterEntry
|
from mktxp.flow.router_entry import RouterEntry
|
||||||
|
|
||||||
|
|
||||||
class RouterEntriesHandler:
|
class RouterEntriesHandler:
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
|
|
||||||
from mktxp.cli.config.config import config_handler, MKTXPConfigKeys
|
from mktxp.cli.config.config import config_handler, MKTXPConfigKeys
|
||||||
from mktxp.router_connection import RouterAPIConnection
|
from mktxp.flow.router_connection import RouterAPIConnection
|
||||||
|
|
||||||
|
|
||||||
class RouterEntry:
|
class RouterEntry:
|
||||||
0
mktxp/processor/__init__.py
Normal file
0
mktxp/processor/__init__.py
Normal file
@@ -15,10 +15,10 @@
|
|||||||
from http.server import HTTPServer
|
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, start_http_server
|
from prometheus_client import MetricsHandler
|
||||||
from mktxp.cli.config.config import config_handler
|
from mktxp.cli.config.config import config_handler
|
||||||
from mktxp.collectors_handler import CollectorsHandler
|
from mktxp.flow.collectors_handler import CollectorsHandler
|
||||||
from mktxp.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
|
||||||
from mktxp.cli.output.wifi_out import WirelessOutput
|
from mktxp.cli.output.wifi_out import WirelessOutput
|
||||||
@@ -11,17 +11,23 @@
|
|||||||
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
## GNU General Public License for more details.
|
## GNU General Public License for more details.
|
||||||
|
|
||||||
import re
|
import re, os
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
from texttable import Texttable
|
||||||
from humanize import naturaldelta
|
from humanize import naturaldelta
|
||||||
from mktxp.cli.config.config import config_handler
|
from mktxp.cli.config.config import config_handler
|
||||||
|
|
||||||
|
|
||||||
class BaseOutputProcessor:
|
class BaseOutputProcessor:
|
||||||
OutputCapsmanEntry = namedtuple('OutputCapsmanEntry', ['dhcp_name', 'dhcp_address', 'mac_address', 'rx_signal', 'interface', 'ssid', 'tx_rate', 'rx_rate', 'uptime'])
|
OutputCapsmanEntry = namedtuple('OutputCapsmanEntry', ['dhcp_name', 'dhcp_address', 'mac_address', 'rx_signal', 'interface', 'ssid', 'tx_rate', 'rx_rate', 'uptime'])
|
||||||
|
OutputCapsmanEntry.__new__.__defaults__ = ('',) * len(OutputCapsmanEntry._fields)
|
||||||
|
|
||||||
OutputWiFiEntry = namedtuple('OutputWiFiEntry', ['dhcp_name', 'dhcp_address', 'mac_address', 'signal_strength', 'signal_to_noise', 'interface', 'tx_rate', 'rx_rate', 'uptime'])
|
OutputWiFiEntry = namedtuple('OutputWiFiEntry', ['dhcp_name', 'dhcp_address', 'mac_address', 'signal_strength', 'signal_to_noise', 'interface', 'tx_rate', 'rx_rate', 'uptime'])
|
||||||
|
OutputWiFiEntry.__new__.__defaults__ = ('',) * len(OutputWiFiEntry._fields)
|
||||||
|
|
||||||
OutputDHCPEntry = namedtuple('OutputDHCPEntry', ['host_name', 'server', 'mac_address', 'address', 'active_address', 'expires_after'])
|
OutputDHCPEntry = namedtuple('OutputDHCPEntry', ['host_name', 'server', 'mac_address', 'address', 'active_address', 'expires_after'])
|
||||||
|
OutputDHCPEntry.__new__.__defaults__ = ('',) * len(OutputDHCPEntry._fields)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def augment_record(router_entry, registration_record, dhcp_lease_records):
|
def augment_record(router_entry, registration_record, dhcp_lease_records):
|
||||||
@@ -110,3 +116,15 @@ class BaseOutputProcessor:
|
|||||||
config_handler.re_compiled['interface_rate_rgx'] = interface_rate_rgx
|
config_handler.re_compiled['interface_rate_rgx'] = interface_rate_rgx
|
||||||
rate = lambda interface_rate: 1000 if interface_rate.find('Mbps') < 0 else 1
|
rate = lambda interface_rate: 1000 if interface_rate.find('Mbps') < 0 else 1
|
||||||
return(int(float(interface_rate_rgx.sub('', interface_rate)) * rate(interface_rate)))
|
return(int(float(interface_rate_rgx.sub('', interface_rate)) * rate(interface_rate)))
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def output_table(outputEntry = None):
|
||||||
|
table = Texttable(max_width = os.get_terminal_size().columns)
|
||||||
|
table.set_deco(Texttable.HEADER | Texttable.BORDER | Texttable.VLINES )
|
||||||
|
if outputEntry:
|
||||||
|
table.header(outputEntry._fields)
|
||||||
|
table.set_cols_align(['l']+ ['c']*(len(outputEntry._fields)-1))
|
||||||
|
return table
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
4
setup.py
4
setup.py
@@ -20,7 +20,7 @@ with open(path.join(pkg_dir, 'README.md'), encoding='utf-8') as f:
|
|||||||
|
|
||||||
setup(
|
setup(
|
||||||
name='mktxp',
|
name='mktxp',
|
||||||
version='0.24',
|
version='0.25',
|
||||||
|
|
||||||
url='https://github.com/akpw/mktxp',
|
url='https://github.com/akpw/mktxp',
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ setup(
|
|||||||
'RouterOS-api>=0.17.0',
|
'RouterOS-api>=0.17.0',
|
||||||
'configobj>=5.0.6',
|
'configobj>=5.0.6',
|
||||||
'humanize>=3.2.0',
|
'humanize>=3.2.0',
|
||||||
'tabulate>=0.8.7',
|
'texttable>=1.6.3',
|
||||||
'speedtest-cli>=2.1.2'
|
'speedtest-cli>=2.1.2'
|
||||||
],
|
],
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user