aboutsummaryrefslogtreecommitdiffstats
path: root/switch-snmp/switches.py
blob: 20523ac3e4ec8d6072a5e3549bfeb7130253dae1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import paho.mqtt.client as paho
from numpyencoder import NumpyEncoder
import prometheus_client
import snmpOmada
import mikrotik
import json
import time
import os

from influxdb_client import InfluxDBClient, Point, WritePrecision
from influxdb_client.client.write_api import SYNCHRONOUS

def append(points):
    influxc = InfluxDBClient(
        url = "http://%s:8086" % INFLUXDB_HOST,
        token = os.environ["DOCKER_INFLUXDB_INIT_ADMIN_TOKEN"],
        org = os.environ["DOCKER_INFLUXDB_INIT_ORG"] 
    )
    influxc.ping()

    for measurement in points:
        # print(json.dumps({**measurement["tags"],  **measurement["fields"]}, indent = 4, cls = NumpyEncoder))
        mqttc.publish(
            "tele/SwitchSNMP/%s/%s/SENSOR" % (measurement["tags"]["switch_host"], str(measurement["tags"]["port"])), 
            json.dumps({**measurement["tags"],  **measurement["fields"]}, cls = NumpyEncoder)
        )
        for field in measurement["fields"].keys():
            try:
                float(measurement["fields"][field])
            except ValueError:
                continue
            else:
                switch_power.labels(
                    field = field,
                    type = measurement["tags"]["type"],
                    port = str(measurement["tags"]["port"]),
                    port_name = measurement["tags"]["port_name"],
                    host = measurement["tags"]["switch_host"]
                ).set(float(measurement["fields"][field]))
                prometheus_client.push_to_gateway("%s:9091" % PUSHGATEWAY_HOST, job = "switchSNMP", registry = registry)

    write_api = influxc.write_api(write_options = SYNCHRONOUS)
    write_api.write(
        os.environ["DOCKER_INFLUXDB_INIT_BUCKET"],
        os.environ["DOCKER_INFLUXDB_INIT_ORG"],
        points,
        write_precision = WritePrecision.S
    )

if __name__ == "__main__":
    env_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "config.env")
    if os.path.exists(env_path):
        import dotenv
        dotenv.load_dotenv(dotenv_path = env_path)
        INFLUXDB_HOST = "dns.athome"
        MQTT_HOST = "dns.athome"
        PUSHGATEWAY_HOST = "dns.athome"
    else:
        MQTT_HOST = "mqtt"
        INFLUXDB_HOST = "influxdb"
        PUSHGATEWAY_HOST = "pushgateway"

    mqttc = paho.Client("reg.reaweb.uk/switch-snmp", clean_session = True)
    mqttc.username_pw_set(os.environ["MQTT_USER"], password = os.environ["MQTT_PASSWD"])
    mqttc.connect(MQTT_HOST, 1883, 60)

    registry = prometheus_client.CollectorRegistry()
    switch_power = prometheus_client.Gauge(
        "switch_power",
        "POE switch power usage metrics from Omada and Mikrotik switches, using Omada SNMP names",
        labelnames = ["field", "type", "port", "port_name", "host"],
        registry = registry
    )

    points = snmpOmada.get_points() + mikrotik.get_points()
    mikrotik.print_points(points)
    append(points)
    
    mqttc.disconnect()