From 676d7cabbc06d1d576c523afde0bea2e1aefc06e Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sun, 11 Apr 2021 10:57:02 +0200 Subject: [PATCH] rework templating using mako templates --- requirements.txt | 1 + service.py | 116 +++++++++++++++-------------------------- services_template.html | 10 ---- template.html | 29 +++++++++-- 4 files changed, 68 insertions(+), 88 deletions(-) delete mode 100644 services_template.html diff --git a/requirements.txt b/requirements.txt index 8141b83..618cd8d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,2 @@ +Mako tomlkit diff --git a/service.py b/service.py index 965d66f..b0fc09e 100755 --- a/service.py +++ b/service.py @@ -5,6 +5,7 @@ import urllib3 from os import environ import tomlkit +from mako.template import Template urllib3.disable_warnings() @@ -49,98 +50,61 @@ class StatusPage: return text - def render_services_per_host(self, host): - services = [] + def get_services_per_host(self): state_to_design_mapping = [ ('success', 'OK'), ('warning', 'WARNING'), ('danger', 'CRITICAL'), ('info', 'UNKNOWN'), ] - card_header = '' + result = {} - services_template = """ -
  • - {} - {} -
  • - """ - services_hostname_template = """ -
    -

    {1}

    - {3} -
    """ - - for service in sorted(self.get_api_result(), key=lambda x: x['attrs']['display_name']): - if service['attrs']['host_name'] == host: - state = int(service['attrs']['state']) - if state in (1, 2): - self.ragecounter += state - - services.append(services_template.format( - self.prettify(service['attrs']['display_name']), - state_to_design_mapping[state][0], - state_to_design_mapping[state][1], - )) - - if not card_header: - 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', - ) - self.ragecounter += 100 - - with open("services_template.html", "r") as f: - htmlTemplate = f.read() - - htmlOutput = htmlTemplate.format( - card_header = card_header, - services = ''.join(services), - ) - return htmlOutput - - - def render_service_details(self): - # generate list of hosts by scanning services for unique host_name - host_names = {} for service in self.get_api_result(): - host_names[service['joins']['host']['vars']['pretty_name']] = service['attrs']['host_name'] + host = service['joins']['host']['vars']['pretty_name'] - # render html for each host_name - html_output = [] - # Can't use .values() here, since we want to sort by prettyname - for prettyname, hostname in sorted(host_names.items()): - html_output.append(self.render_services_per_host(hostname)) + if host not in result: + result[host] = { + 'hostname': service['attrs']['host_name'], + 'services': {}, + } + if service['joins']['host']['state'] == 0: + result[host]['host_badge'] = 'success' + result[host]['host_state'] = 'UP' + else: + result[host]['host_badge'] = 'danger' + result[host]['host_state'] = 'DOWN' + self.ragecounter += 10 - return ''.join(html_output) + state = int(service['attrs']['state']) + + if state in (1, 2): + self.ragecounter += state + + result[host]['services'][self.prettify(service['attrs']['display_name'])] = { + 'badge': state_to_design_mapping[state][0], + 'state': state_to_design_mapping[state][1], + } + + return result - def render_index_html(self, service_details): - with open("template.html", "r") as f: - htmlTemplate = f.read() + def render_html(self, service_details): if self.ragecounter == 0: mood = '🆗' elif self.ragecounter < 10: mood = '🚨' else: mood = '🔥' - htmlOutput = htmlTemplate.format( - services = service_details, - mood = mood, + + template = Template(filename=self.config['output'].get('template', 'template.html')) + output = template.render( + title=self.config['output'].get('page_title', 'Status Page'), + mood=mood, + hosts=service_details, ) - with open(self.config['output']['filename'], "w") as f: - f.write(htmlOutput) + with open(self.config['output']['filename'], 'w') as f: + f.write(output) def __init__(self): @@ -150,5 +114,9 @@ class StatusPage: if __name__ == "__main__": page = StatusPage() - service_details = page.render_service_details() - page.render_index_html(service_details) + service_details = page.get_services_per_host() + + from pprint import pprint + pprint(service_details) + + page.render_html(service_details) diff --git a/services_template.html b/services_template.html deleted file mode 100644 index 0551fae..0000000 --- a/services_template.html +++ /dev/null @@ -1,10 +0,0 @@ -
    -
    -
    - {card_header} -
    -
      {services}
    -
    -
    -
    -
    diff --git a/template.html b/template.html index 26fb84d..9916ce3 100644 --- a/template.html +++ b/template.html @@ -2,21 +2,42 @@ - Status Page + ${title} - +
    - {services} +% for prettyname, details in sorted(hosts.items()): +
    +
    +
    +
    +

    ${prettyname}

    + ${details['host_state']} +
    +
    +
      +% for service_name, service_details in sorted(details['services'].items()): +
    • + ${service_name} + ${service_details['state']} +
    • +% endfor +
    +
    +
    +
    +
    +% endfor