1
0
mirror of https://github.com/librenms/librenms-agent.git synced 2024-05-09 09:54:52 +00:00
Files
librenms-librenms-agent/snmp/dhcp.py
2022-06-01 00:26:08 +02:00

141 lines
3.4 KiB
Python
Executable File

#!/usr/bin/env python3
import json
import subprocess
from os.path import isfile
CONFIGFILE = "/etc/snmp/dhcp.json"
# Configfile is needed /etc/snmp/dhcp.json
#
# {"leasefile": "/var/lib/dhcp/dhcpd.leases"
# }
#
error = 0
error_string = ""
version = 2
with open(CONFIGFILE, "r") as json_file:
try:
configfile = json.load(json_file)
except json.decoder.JSONDecodeError as e:
error = 1
error_string = "Configfile Error: '%s'" % e
if not error:
leases = {
"total": 0,
"active": 0,
"expired": 0,
"released": 0,
"abandoned": 0,
"reset": 0,
"bootp": 0,
"backup": 0,
"free": 0,
}
if not isfile(configfile["leasefile"]):
error = 1
error_string = "Lease File not found"
else:
with open(configfile["leasefile"]) as fp:
line = fp.readline()
while line:
line = fp.readline()
if "rewind" not in line:
if line.startswith("lease"):
leases["total"] += 1
elif "binding state active" in line:
leases["active"] += 1
elif "binding state expired" in line:
leases["expired"] += 1
elif "binding state released" in line:
leases["released"] += 1
elif "binding state abandoned" in line:
leases["abandoned"] += 1
elif "binding state reset" in line:
leases["reset"] += 1
elif "binding state bootp" in line:
leases["bootp"] += 1
elif "binding state backup" in line:
leases["backup"] += 1
elif "binding state free" in line:
leases["free"] += 1
shell_cmd = "dhcpd-pools -s i -A -l" + configfile["leasefile"]
pool_data = (
subprocess.Popen(shell_cmd, shell=True, stdout=subprocess.PIPE)
.stdout.read()
.split(b"\n")
)
data = {"leases": leases, "pools": [], "networks": [], "all_networks": []}
category = None
jump_line = 0
for p in pool_data:
line = p.decode("utf-8")
if jump_line:
jump_line -= 1
continue
if line.startswith("Ranges:"):
category = "pools"
jump_line = 1
continue
if line.startswith("Shared networks:"):
category = "networks"
jump_line = 1
continue
if line.startswith("Sum of all ranges:"):
category = "all_networks"
jump_line = 1
continue
if not len(line):
continue
p = line.split()
if category == "pools":
data[category].append(
{
"first_ip": p[1],
"last_ip": p[3],
"max": p[4],
"cur": p[5],
"percent": p[6],
}
)
continue
if category == "networks":
data[category].append(
{
"network": p[0],
"max": p[1],
"cur": p[2],
"percent": p[3],
}
)
continue
if category == "all_networks":
data[category] = {
"max": p[2],
"cur": p[3],
"percent": p[4],
}
continue
output = {"version": version, "error": error, "errorString": error_string, "data": data}
print(json.dumps(output))