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 = """
- """
-
- 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 @@
-
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()):
+
+
+
+
+
+
+% for service_name, service_details in sorted(details['services'].items()):
+ -
+ ${service_name}
+ ${service_details['state']}
+
+% endfor
+
+
+
+
+
+% endfor