mirror of
https://github.com/KevinMidboe/mktxp-no-cli.git
synced 2025-12-08 20:38:48 +00:00
cli options
This commit is contained in:
52
README.md
52
README.md
@@ -1,4 +1,5 @@
|
|||||||
|
|
||||||
|
|
||||||

|

|
||||||

|

|
||||||

|

|
||||||
@@ -7,8 +8,53 @@
|
|||||||

|

|
||||||
|
|
||||||
|
|
||||||
|
#### Requirements:
|
||||||
# mktxp
|
- [Python 3.6.x](https://www.python.org/downloads/release/python-360/) or later
|
||||||
Prometheus Exporter for Mikrotik RouterOS devices
|
|
||||||
|
|
||||||
|
- OSs:
|
||||||
|
* Linux
|
||||||
|
* Mac OSX
|
||||||
|
* Windows: TBD / maybe
|
||||||
|
|
||||||
|
#### Install:
|
||||||
|
- from [PyPI](https://pypi.python.org/pypi/batchmp): `$ pip install mktxp`
|
||||||
|
- latest from source repository: `$ pip install git+https://github.com/akpw/mktxp`
|
||||||
|
|
||||||
|
|
||||||
|
## Description
|
||||||
|
Prometheus Exporter for Mikrotik RouterOS.
|
||||||
|
MKTXP enables gathering metrics across multiple RouterOS devices, all easily configurable via built-in CLI interface.
|
||||||
|
Comes along with a dedicated [Grafana dashboard](https://grafana.com/grafana/dashboards/13679)
|
||||||
|
|
||||||
|
|
||||||
|
## Getting started
|
||||||
|
Usage: $ mktxp [-h]
|
||||||
|
{info, version, show, add, edit, delete, start}
|
||||||
|
Commands:
|
||||||
|
{info, version, show, add, edit, delete, start}
|
||||||
|
|
||||||
|
$ mktxp {command} -h #run this for detailed help on individual commands
|
||||||
|
|
||||||
|
|
||||||
|
## Full description of CLI Commands
|
||||||
|
### mktxp
|
||||||
|
. action commands:
|
||||||
|
.. start Starts collecting metrics for all enabled RouterOS configuration entries
|
||||||
|
.. add Adds MKTXP RouterOS configuration entry
|
||||||
|
.. show Shows MKTXP configuration entries
|
||||||
|
.. delete Deletes a MKTXP RouterOS configuration entry
|
||||||
|
.. edit Open MKTXP configuration file in your editor of choice
|
||||||
|
.. info Shows base MKTXP info
|
||||||
|
.. version Shows MKTXP version
|
||||||
|
|
||||||
|
|
||||||
|
## Installing Development version
|
||||||
|
- Clone the repo, then run: `$ python setup.py develop`
|
||||||
|
|
||||||
|
**Running Tests**
|
||||||
|
- TDB
|
||||||
|
- Run via: `$ python setup.py test`
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
|
|
||||||
from http.server import HTTPServer
|
from http.server import HTTPServer
|
||||||
|
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, start_http_server
|
||||||
from mktxp.cli.config.config import config_handler
|
from mktxp.cli.config.config import config_handler
|
||||||
@@ -34,5 +35,6 @@ class MKTXPProcessor:
|
|||||||
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)
|
||||||
print(f'Running HTTP collector server on port {port}')
|
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||||
|
print(f'{current_time} Running metrics HTTP server on port {port}')
|
||||||
httpd.serve_forever()
|
httpd.serve_forever()
|
||||||
|
|||||||
@@ -42,7 +42,9 @@ class MKTXPConfigKeys:
|
|||||||
FE_MONITOR_KEY = 'monitor'
|
FE_MONITOR_KEY = 'monitor'
|
||||||
FE_ROUTE_KEY = 'route'
|
FE_ROUTE_KEY = 'route'
|
||||||
FE_WIRELESS_KEY = 'wireless'
|
FE_WIRELESS_KEY = 'wireless'
|
||||||
|
FE_WIRELESS_CLIENTS_KEY = 'wireless_clients'
|
||||||
FE_CAPSMAN_KEY = 'capsman'
|
FE_CAPSMAN_KEY = 'capsman'
|
||||||
|
FE_CAPSMAN_CLIENTS_KEY = 'capsman_clients'
|
||||||
|
|
||||||
# UnRegistered entries placeholder
|
# UnRegistered entries placeholder
|
||||||
NO_ENTRIES_REGISTERED = 'NoEntriesRegistered'
|
NO_ENTRIES_REGISTERED = 'NoEntriesRegistered'
|
||||||
@@ -58,7 +60,7 @@ class MKTXPConfigKeys:
|
|||||||
|
|
||||||
BOOLEAN_KEYS = [ENABLED_KEY, SSL_KEY, SSL_CERTIFICATE,
|
BOOLEAN_KEYS = [ENABLED_KEY, SSL_KEY, SSL_CERTIFICATE,
|
||||||
FE_DHCP_KEY, FE_DHCP_LEASE_KEY, FE_DHCP_POOL_KEY, FE_INTERFACE_KEY,
|
FE_DHCP_KEY, FE_DHCP_LEASE_KEY, FE_DHCP_POOL_KEY, FE_INTERFACE_KEY,
|
||||||
FE_MONITOR_KEY, FE_ROUTE_KEY, FE_WIRELESS_KEY, FE_CAPSMAN_KEY]
|
FE_MONITOR_KEY, FE_ROUTE_KEY, FE_WIRELESS_KEY, FE_WIRELESS_CLIENTS_KEY, FE_CAPSMAN_KEY, FE_CAPSMAN_CLIENTS_KEY]
|
||||||
STR_KEYS = [HOST_KEY, USER_KEY, PASSWD_KEY]
|
STR_KEYS = [HOST_KEY, USER_KEY, PASSWD_KEY]
|
||||||
|
|
||||||
# MKTXP config entry nane
|
# MKTXP config entry nane
|
||||||
@@ -71,7 +73,8 @@ class ConfigEntry:
|
|||||||
MKTXPConfigKeys.SSL_KEY, MKTXPConfigKeys.SSL_CERTIFICATE,
|
MKTXPConfigKeys.SSL_KEY, MKTXPConfigKeys.SSL_CERTIFICATE,
|
||||||
|
|
||||||
MKTXPConfigKeys.FE_DHCP_KEY, MKTXPConfigKeys.FE_DHCP_LEASE_KEY, MKTXPConfigKeys.FE_DHCP_POOL_KEY, MKTXPConfigKeys.FE_INTERFACE_KEY,
|
MKTXPConfigKeys.FE_DHCP_KEY, MKTXPConfigKeys.FE_DHCP_LEASE_KEY, MKTXPConfigKeys.FE_DHCP_POOL_KEY, MKTXPConfigKeys.FE_INTERFACE_KEY,
|
||||||
MKTXPConfigKeys.FE_MONITOR_KEY, MKTXPConfigKeys.FE_ROUTE_KEY, MKTXPConfigKeys.FE_WIRELESS_KEY, MKTXPConfigKeys.FE_CAPSMAN_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
|
||||||
])
|
])
|
||||||
|
|
||||||
class OSConfig(metaclass = ABCMeta):
|
class OSConfig(metaclass = ABCMeta):
|
||||||
@@ -221,16 +224,3 @@ class MKTXPConfigHandler:
|
|||||||
|
|
||||||
# Simplest possible Singleton impl
|
# Simplest possible Singleton impl
|
||||||
config_handler = MKTXPConfigHandler()
|
config_handler = MKTXPConfigHandler()
|
||||||
|
|
||||||
|
|
||||||
''' if not os.path.exists(self.usr_conf_data_path):
|
|
||||||
# stage from the mktxp conf template
|
|
||||||
lookup_path = resource_filename(Requirement.parse("mktxp"), "mktxp/cli/config/mktxp.conf")
|
|
||||||
shutil.copy(lookup_path, self.usr_conf_data_path)
|
|
||||||
|
|
||||||
if not os.path.exists(self.mktxp_conf_path):
|
|
||||||
# stage from the mktxp conf template
|
|
||||||
lookup_path = resource_filename(Requirement.parse("mktxp"), "mktxp/cli/config/.mktxp.conf")
|
|
||||||
shutil.copy(lookup_path, self.mktxp_conf_path)
|
|
||||||
|
|
||||||
'''
|
|
||||||
|
|||||||
@@ -23,9 +23,6 @@
|
|||||||
use_ssl = False
|
use_ssl = False
|
||||||
ssl_certificate = False
|
ssl_certificate = False
|
||||||
|
|
||||||
identity = True
|
|
||||||
resource = True
|
|
||||||
health = True
|
|
||||||
dhcp = True
|
dhcp = True
|
||||||
dhcp_lease = True
|
dhcp_lease = True
|
||||||
pool = True
|
pool = True
|
||||||
@@ -33,4 +30,6 @@
|
|||||||
monitor = True
|
monitor = True
|
||||||
route = True
|
route = True
|
||||||
wireless = True
|
wireless = True
|
||||||
|
wireless_clients = True
|
||||||
capsman = True
|
capsman = True
|
||||||
|
capsman_clients = True
|
||||||
@@ -45,7 +45,9 @@ class MKTXPOptionsParser:
|
|||||||
self._script_name = 'MKTXP'
|
self._script_name = 'MKTXP'
|
||||||
self._description = \
|
self._description = \
|
||||||
'''
|
'''
|
||||||
Prometheus Exporter for Mikrotik RouterOS Devices.
|
Prometheus Exporter for Mikrotik RouterOS.
|
||||||
|
Supports gathering metrics across multiple RouterOS devices, all easily configurable via built-in CLI interface.
|
||||||
|
Comes along with a dedicated Grafana dashboard(https://grafana.com/grafana/dashboards/13679)
|
||||||
|
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
|||||||
@@ -47,6 +47,8 @@ class CapsmanCollector(BaseCollector):
|
|||||||
registration_per_interface_metrics = BaseCollector.gauge_collector('capsman_registrations_count', 'Number of active registration per CAPsMAN interface', registration_per_interface_records, 'count', ['interface'])
|
registration_per_interface_metrics = BaseCollector.gauge_collector('capsman_registrations_count', 'Number of active registration per CAPsMAN interface', registration_per_interface_records, 'count', ['interface'])
|
||||||
yield registration_per_interface_metrics
|
yield registration_per_interface_metrics
|
||||||
|
|
||||||
|
# the client info metrics
|
||||||
|
if router_metric.router_entry.capsman_clients:
|
||||||
# translate / trim / augment registration records
|
# translate / trim / augment registration records
|
||||||
dhcp_lease_labels = ['mac_address', 'host_name', 'comment']
|
dhcp_lease_labels = ['mac_address', 'host_name', 'comment']
|
||||||
dhcp_lease_records = router_metric.dhcp_lease_records(dhcp_lease_labels)
|
dhcp_lease_records = router_metric.dhcp_lease_records(dhcp_lease_labels)
|
||||||
@@ -68,8 +70,23 @@ class CapsmanCollector(BaseCollector):
|
|||||||
rx_byte_metrics = BaseCollector.counter_collector('capsman_traffic_rx_bytes', 'Number of received packet bytes', registration_records, 'rx_bytes', ['name'])
|
rx_byte_metrics = BaseCollector.counter_collector('capsman_traffic_rx_bytes', 'Number of received packet bytes', registration_records, 'rx_bytes', ['name'])
|
||||||
yield rx_byte_metrics
|
yield rx_byte_metrics
|
||||||
|
|
||||||
|
signal_strength_metrics = BaseCollector.gauge_collector('capsman_registered_signal_strength', 'Registered devices signal strength', registration_records, 'rx_signal', ['name'])
|
||||||
|
yield signal_strength_metrics
|
||||||
|
|
||||||
registration_metrics = BaseCollector.info_collector('capsman_registered_devices', 'Registered devices info',
|
registration_metrics = BaseCollector.info_collector('capsman_registered_devices', 'Registered devices info',
|
||||||
registration_records, ['name', 'rx_signal', 'ssid', 'tx_rate', 'rx_rate', 'interface', 'mac_address', 'uptime'])
|
registration_records, ['name', 'rx_signal', 'ssid', 'tx_rate', 'rx_rate', 'interface', 'mac_address', 'uptime'])
|
||||||
yield registration_metrics
|
yield registration_metrics
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -36,3 +36,9 @@ class WLANCollector(BaseCollector):
|
|||||||
if tx_ccq_records:
|
if tx_ccq_records:
|
||||||
overall_tx_ccq_metrics = BaseCollector.gauge_collector('wlan_overall_tx_ccq', ' Client Connection Quality for transmitting', tx_ccq_records, 'overall_tx_ccq', ['channel'])
|
overall_tx_ccq_metrics = BaseCollector.gauge_collector('wlan_overall_tx_ccq', ' Client Connection Quality for transmitting', tx_ccq_records, 'overall_tx_ccq', ['channel'])
|
||||||
yield overall_tx_ccq_metrics
|
yield overall_tx_ccq_metrics
|
||||||
|
|
||||||
|
|
||||||
|
# the client info metrics
|
||||||
|
if router_metric.router_entry.wireless_clients:
|
||||||
|
# TBD
|
||||||
|
pass
|
||||||
Reference in New Issue
Block a user