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 = """
- """
+ services_template = """
+
+ {}
+ {}
+
+ """
+ services_hostname_template = """
+ """
- 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)