#!/usr/bin/env python3

def config(name, port_max, ports_label):
    print("graph_category network")
    print("graph_info Mikrotik network flow")
    print(f"graph_title Network flow for {name}")
    print("graph_order down up")
    print("graph_args --base 1000")
    print("graph_vlabel in (-) / out (+)")
    for port in range(1, port_max + 1):
        print(f"down{port}.label {ports_label[port - 1]}")
        print(f"down{port}.type DERIVE")
        print(f"down{port}.min 0")
        print(f"down{port}.graph no")
        print(f"down{port}.cdef down{port},8,*")
    for port in range(1, port_max + 1):
        print(f"up{port}.label {ports_label[port - 1]}")
        print(f"up{port}.type DERIVE")
        print(f"up{port}.min 0")
        print(f"up{port}.negative down{port}")
        print(f"up{port}.cdef up{port},8,*")


if __name__ == '__main__':
    from sys import argv
    import subprocess
    import re
    ports_label = []
    InOctets = []
    OutOctets = []
    port_max = 0
    host = argv[0].split("_")[1]
    command = f"snmpwalk -v 2c -c public {host}"
    result = subprocess.getoutput(command)
    for line in result.splitlines():
        if "sysName" in line:
            name = line.split()[-1]
            name = re.sub(r"(^[^A-Za-z_]|[^A-Za-z0-9_])", "_", name)
        if "ifDescr" in line:
            label = (line.split()[-1])
            label = re.sub(r"(^[^A-Za-z_]|[^A-Za-z0-9_])", "_", label)
            ports_label.append(label)
        if "ifIndex" in line:
            port_max += 1
        if "ifInOctets" in line:
            InOctets.append(int(line.split()[-1]))
        if "ifOutOctets" in line:
            OutOctets.append(int(line.split()[-1]))
    if 1 < len(argv) <= 2 and argv[1] == "config":
        config(name, port_max, ports_label)
    else:
        for port in range(1, port_max + 1):
            print(f"down{port}.value {OutOctets[port - 1]}")
            print(f"up{port}.value {InOctets[port - 1]}")