From f899e6e13b8d2e5d6ff992b6c8e32e0738dc27e2 Mon Sep 17 00:00:00 2001 From: Sophie Schiller Date: Sat, 10 Apr 2021 15:34:41 +0200 Subject: [PATCH] move stuff to class, add prettifier, use pretty names --- service.py | 196 ++++++++++++++++++++++++++--------------------------- 1 file changed, 95 insertions(+), 101 deletions(-) diff --git a/service.py b/service.py index b4513f0..587d2f5 100755 --- a/service.py +++ b/service.py @@ -6,124 +6,118 @@ import configparser import urllib3 urllib3.disable_warnings() +class StatusPage: + def do_api_calls(self): + #services + request_url = "{}/v1/objects/services".format(self.config['icinga2_api']['baseurl']) + headers = { + 'Accept': 'application/json', + 'X-HTTP-Method-Override': 'GET' + } + requestbody = { + "attrs": [ "name", "state", "last_check_result", "host_name", "display_name" ], + "joins": [ "host.name", "host.state", "host.last_check_result", "host.vars" ], + "filter": self.config['filters']['services'], + } + r = requests.get(request_url, + headers=headers, + data=json.dumps(requestbody), + auth=(self.config['icinga2_api']['username'], self.config['icinga2_api']['password']), + verify=False) -def do_api_calls(config): - data = {} - - #services - request_url = "{}/v1/objects/services".format(config['icinga2_api']['baseurl']) - headers = { - 'Accept': 'application/json', - 'X-HTTP-Method-Override': 'GET' - } - requestbody = { - "attrs": [ "name", "state", "last_check_result", "host_name", "display_name" ], - "joins": [ "host.name", "host.state", "host.last_check_result" ], - "filter": config['filters']['services'], - } - r = requests.get(request_url, - headers=headers, - data=json.dumps(requestbody), - auth=(config['icinga2_api']['username'], config['icinga2_api']['password']), - verify=False) - - if (r.status_code == 200): - data['services'] = r.json() - else: - r.raise_for_status() - - return data + if (r.status_code == 200): + self.services = r.json() + else: + r.raise_for_status() -def render_text_output(data): - print("{:50s} {:10s}".format("host", "status")) - for host in data['hosts']['results']: - print("{:50s} {}".format(host['name'], host['attrs']['state'])) - for service in data['services']['results']: - print("{:50s} {}".format(service['name'], service['attrs']['state'])) + def prettify(self, text): + for search, replace in self.config['prettify'].items(): + text = text.replace(search.upper(), replace) + + return text -def render_services_per_host(host, data): - services_operational = '' - services_warning = '' - services_critical = '' - card_header = '' + def render_services_per_host(self, host): + services_operational = '' + services_warning = '' + services_critical = '' + card_header = '' - services_template = """ -
  • - {} - {} -
  • - """ - services_hostname_template = """ -
    -

    {0}

    - {2} -
    """ + services_template = """ +
  • + {} + {} +
  • + """ + services_hostname_template = """ +
    +

    {1}

    + {3} +
    """ - for service in sorted(data['services']['results'], key=lambda x: x['attrs']['display_name']): - if service['attrs']['host_name'] == host: - if service['attrs']['state'] == 0: - services_operational = services_operational + services_template.format(service['attrs']['display_name'], 'success', 'OK') - elif service['attrs']['state'] == 1: - services_warning = services_warning + services_template.format(service['attrs']['display_name'], 'warning', 'WARNING') - else: - services_critical = services_critical + services_template.format(service['attrs']['display_name'], 'danger', 'CRITICAL') + for service in sorted(self.services['results'], key=lambda x: x['attrs']['display_name']): + if service['attrs']['host_name'] == host: + if service['attrs']['state'] == 0: + services_operational = services_operational + services_template.format(self.prettify(service['attrs']['display_name']), 'success', 'OK') + elif service['attrs']['state'] == 1: + services_warning = services_warning + services_template.format(self.prettify(service['attrs']['display_name']), 'warning', 'WARNING') + else: + services_critical = services_critical + services_template.format(self.prettify(service['attrs']['display_name']), 'danger', 'CRITICAL') - if service['joins']['host']['state'] == 0: - card_header = services_hostname_template.format(host, 'success', 'UP') - else: - card_header = services_hostname_template.format(host, 'danger', 'DOWN') + if service['joins']['host']['state'] == 0: + card_header = services_hostname_template.format(host, service['joins']['host']['vars']['pretty_name'], 'success', 'UP') + else: + card_header = services_hostname_template.format(host, service['joins']['host']['vars']['pretty_name'], 'danger', 'DOWN') - with open("services_template.html", "r") as f: - htmlTemplate = f.read() + with open("services_template.html", "r") as f: + htmlTemplate = f.read() - htmlOutput = htmlTemplate.format( - card_header = card_header, - services_operational = services_operational, - services_warning = services_warning, - services_critical = services_critical - ) - return htmlOutput + htmlOutput = htmlTemplate.format( + card_header = card_header, + services_operational = services_operational, + services_warning = services_warning, + services_critical = services_critical + ) + return htmlOutput -def render_service_details(data): - # generate list of hosts by scanning services for unique host_name - host_names = [] - for service in data['services']['results']: - if service['attrs']['host_name'] not in host_names: - host_names.append(service['attrs']['host_name']) - # render html for each host_name - html_output = "" - for host in sorted(host_names): - html_output = html_output + render_services_per_host(host, data) - return html_output + def render_service_details(self): + # generate list of hosts by scanning services for unique host_name + host_names = set() + for service in self.services['results']: + host_names.add(service['attrs']['host_name']) + # render html for each host_name + html_output = "" + for host in sorted(host_names): + html_output = html_output + self.render_services_per_host(host) + return html_output -def render_index_html(filename, service_details): - with open("template.html", "r") as f: - htmlTemplate = f.read() + def render_index_html(self, service_details): + with open("template.html", "r") as f: + htmlTemplate = f.read() - htmlOutput = htmlTemplate.format( - services = service_details - ) + htmlOutput = htmlTemplate.format( + services = service_details + ) - with open(filename, "w") as f: - f.write(htmlOutput) + with open(self.config['output']['filename'], "w") as f: + f.write(htmlOutput) -def main(): - config = configparser.ConfigParser() - config['icinga2_api'] = { - 'baseurl': 'https://localhost:5665', - 'username': 'root', - 'password': 'foobar' - } - with open('config.conf', 'r') as configfile: - config.read('config.conf') - data = do_api_calls(config) - service_details = render_service_details(data) - render_index_html(config['output']['filename'], service_details) + def __init__(self): + self.config = configparser.ConfigParser() + self.config['icinga2_api'] = { + 'baseurl': 'https://localhost:5665', + 'username': 'root', + 'password': 'foobar' + } + with open('config.conf', 'r') as configfile: + self.config.read('config.conf') if __name__ == "__main__": - main() + page = StatusPage() + page.do_api_calls() + service_details = page.render_service_details() + page.render_index_html(service_details)