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/puppet_agent.py

110 lines
2.6 KiB
Python
Executable File

#!/usr/bin/env python3
import json
from os.path import isfile
from time import time
import yaml
output = {}
output["error"] = 0
output["errorString"] = ""
output["version"] = 1
CONFIGFILE = "/etc/snmp/puppet.json"
# optional config file
# {
# "agent": {
# "summary_file": "/my/custom/path/to/summary_file"
# }
# }
summary_files = [
"/var/cache/puppet/state/last_run_summary.yaml",
"/opt/puppetlabs/puppet/cache/state/last_run_summary.yaml",
"/opt/puppetlabs/puppet/public/last_run_summary.yaml",
]
def parse_yaml_file(filename):
try:
yaml_data = yaml.load(open(filename, "r"), Loader=yaml.FullLoader)
msg = None
except yaml.scanner.ScannerError as e:
yaml_data = []
msg = str(e)
except yaml.parser.ParserError as e:
yaml_data = []
msg = str(e)
return msg, yaml_data
def time_processing(data):
new_data = {}
for k in data.keys():
if k == "last_run":
# generate difference to last run (seconds)
new_data[k] = round(time() - data[k])
continue
new_data[k] = round(data[k], 2)
return new_data
def processing(data):
new_data = {}
for k in ["changes", "events", "resources", "version"]:
new_data[k] = data[k]
new_data["time"] = time_processing(data["time"])
return new_data
# extend last_run_summary_file list with optional custom file
if isfile(CONFIGFILE):
with open(CONFIGFILE, "r") as json_file:
try:
configfile = json.load(json_file)
except json.decoder.JSONDecodeError as e:
output["error"] = 1
output["errorString"] = "Configfile Error: '%s'" % e
else:
configfile = None
if not output["error"] and configfile:
try:
if "agent" in configfile.keys():
custom_summary_file = configfile["agent"]["summary_file"]
summary_files.insert(0, custom_summary_file)
except KeyError as e:
output["error"] = 1
output["errorString"] = "Configfile Error: '%s'" % e
# search existing summary file from list
if not output["error"]:
summary_file = None
for sum_file in summary_files:
if isfile(sum_file):
summary_file = sum_file
break
if not summary_file:
output["error"] = 1
output["errorString"] = "no puppet agent run summary file found"
# open summary file
if not output["error"]:
msg, data = parse_yaml_file(summary_file)
if msg:
output["error"] = 1
output["errorString"] = msg
output["data"] = processing(data)
print(json.dumps(output))