From c7af7beec47fba7545ec649035a3ebf20f2ad3ee Mon Sep 17 00:00:00 2001 From: Stephen Soltesz Date: Mon, 1 Dec 2008 21:58:16 +0000 Subject: [PATCH] supports basic listing of pcus, nodes, and some coloring from the old scripts. --- web/MonitorWeb/monitorweb/controllers.py | 133 +++++++++++++++++- .../monitorweb/static/css/style.css | 19 ++- .../monitorweb/templates/nodelist.kid | 53 +++++++ .../monitorweb/templates/pculist.kid | 67 +++++++++ .../monitorweb/templates/sitemenu.kid | 37 +++++ 5 files changed, 301 insertions(+), 8 deletions(-) create mode 100644 web/MonitorWeb/monitorweb/templates/nodelist.kid create mode 100644 web/MonitorWeb/monitorweb/templates/pculist.kid create mode 100644 web/MonitorWeb/monitorweb/templates/sitemenu.kid diff --git a/web/MonitorWeb/monitorweb/controllers.py b/web/MonitorWeb/monitorweb/controllers.py index 8d9ced5..d2978da 100644 --- a/web/MonitorWeb/monitorweb/controllers.py +++ b/web/MonitorWeb/monitorweb/controllers.py @@ -3,11 +3,132 @@ from turbogears import controllers, expose, flash # from monitorweb import model # import logging # log = logging.getLogger("monitorweb.controllers") +from monitor.database.info.model import * +from pcucontrol import reboot + +def format_ports(pcu): + retval = [] + if pcu.port_status and len(pcu.port_status.keys()) > 0 : + obj = reboot.model_to_object(pcu.plc_pcu_stats['model']) + for port in obj.supported_ports: + state = pcu.port_status[str(port)] + retval.append( (port, state) ) + + if retval == []: + retval = [( "Closed/Filtered", "state" )] + + return retval + +def format_pcu_shortstatus(pcu): + status = "error" + if pcu.reboot_trial_status == str(0): + status = "ok" + elif pcu.reboot_trial_status == "NetDown" or pcu.reboot_trial_status == "Not_Run": + status = pcu.reboot_trial_status + else: + status = "error" + + return status class Root(controllers.RootController): - @expose(template="monitorweb.templates.welcome") - def index(self): - import time - # log.debug("Happy TurboGears Controller Responding For Duty") - flash("Your application is now running") - return dict(now=time.ctime()) + @expose(template="monitorweb.templates.welcome") + def index(self): + import time + # log.debug("Happy TurboGears Controller Responding For Duty") + flash("Your application is now running") + return dict(now=time.ctime()) + + @expose(template="monitorweb.templates.nodelist") + def node(self, filter='BOOT'): + import time + fbquery = FindbadNodeRecord.get_all_latest() + query = [] + filtercount = {'DOWN' : 0, 'BOOT': 0, 'DEBUG' : 0, 'neverboot' : 0, 'pending' : 0, 'all' : 0} + for node in fbquery: + if node.plc_pcuid: + pcu = FindbadPCURecord.get_latest_by(plc_pcuid=node.plc_pcuid).first() + if pcu: + node.pcu_status = pcu.reboot_trial_status + else: + node.pcu_status = "nodata" + else: + node.pcu_status = "nopcu" + + if node.kernel_version: + node.kernel = node.kernel_version.split()[2] + else: + node.kernel = "" + + # NOTE: count filters + if node.observed_status != 'DOWN': + filtercount[node.observed_status] += 1 + else: + if node.plc_node_stats['last_contact'] != None: + filtercount[node.observed_status] += 1 + else: + filtercount['neverboot'] += 1 + + # NOTE: apply filter + if filter == node.observed_status: + if filter == "DOWN": + if node.plc_node_stats['last_contact'] != None: + query.append(node) + else: + query.append(node) + elif filter == "neverboot": + if node.plc_node_stats['last_contact'] == None: + query.append(node) + elif filter == "pending": + # TODO: look in message logs... + pass + elif filter == "all": + query.append(node) + + return dict(now=time.ctime(), query=query, fc=filtercount) + + @expose(template="monitorweb.templates.pculist") + def pcu(self, filter='all'): + import time + fbquery = FindbadPCURecord.get_all_latest() + query = [] + filtercount = {'ok' : 0, 'NetDown': 0, 'Not_Run' : 0, 'pending' : 0, 'all' : 0} + for node in fbquery: + + # NOTE: count filter + if node.reboot_trial_status == str(0): + filtercount['ok'] += 1 + elif node.reboot_trial_status == 'NetDown' or node.reboot_trial_status == 'Not_Run': + filtercount[node.reboot_trial_status] += 1 + else: + filtercount['pending'] += 1 + + print reboot.pcu_name(node.plc_pcu_stats) + node.ports = format_ports(node) + node.status = format_pcu_shortstatus(node) + + # NOTE: apply filter + if filter == "all": + query.append(node) + elif filter == "ok" and node.reboot_trial_status == str(0): + query.append(node) + elif filter == node.reboot_trial_status: + query.append(node) + elif filter == "pending": + # TODO: look in message logs... + if node.reboot_trial_status != str(0) and \ + node.reboot_trial_status != 'NetDown' and \ + node.reboot_trial_status != 'Not_Run': + + query.append(node) + + return dict(query=query, fc=filtercount) + + @expose(template="monitorweb.templates.pculist") + def site(self, filter='all'): + filtercount = {'ok' : 0, 'NetDown': 0, 'Not_Run' : 0, 'pending' : 0, 'all' : 0} + return dict(query=[], fc=filtercount) + + @expose(template="monitorweb.templates.pculist") + def action(self, filter='all'): + filtercount = {'ok' : 0, 'NetDown': 0, 'Not_Run' : 0, 'pending' : 0, 'all' : 0} + return dict(query=[], fc=filtercount) diff --git a/web/MonitorWeb/monitorweb/static/css/style.css b/web/MonitorWeb/monitorweb/static/css/style.css index c98d40e..59053a2 100644 --- a/web/MonitorWeb/monitorweb/static/css/style.css +++ b/web/MonitorWeb/monitorweb/static/css/style.css @@ -10,7 +10,7 @@ html, body { padding: 0; } -td, th {padding:3px;border:none;} +td, th {padding:2px;border:none;} tr th {text-align:left;background-color:#f0f0f0;color:#333;} tr.odd td {background-color:#edf3fe;} tr.even td {background-color:#fff;} @@ -28,6 +28,21 @@ a.link, a, a.active { color: #369; } +#portopen { background-color: lightgreen; } +#portclosed { background-color: indianred; } +#portfiltered { background-color: gold; } + +#dns-DNS-OK { background-color: lightgreen; } +#dns-NOHOSTNAME { background-color: white; } +#dns-DNS-MISMATCH { background-color: gold; } +#dns-DNS-NOENTRY { background-color: indianred; } +#dns-NO-DNS-OR-IP { background-color: indianred; } + +#status-NetDown { background-color: lightgrey; } +#status-Not_Run { background-color: lightgrey; } +#status-ok { background-color: darkseagreen; } +#status-0 { background-color: darkseagreen; } +#status-error { background-color: indianred; width="200px"; } #main_content { color: black; @@ -131,4 +146,4 @@ span.code { .fielderror { color: red; font-weight: bold; -} \ No newline at end of file +} diff --git a/web/MonitorWeb/monitorweb/templates/nodelist.kid b/web/MonitorWeb/monitorweb/templates/nodelist.kid new file mode 100644 index 0000000..dc3bf92 --- /dev/null +++ b/web/MonitorWeb/monitorweb/templates/nodelist.kid @@ -0,0 +1,53 @@ + + + + +
+ + + + + + + + + + + + + + + + +
Production(${fc['BOOT']})Debug(${fc['DEBUG']})Down(${fc['DOWN']})Never Booted(${fc['neverboot']})Pending Reply(${fc['pending']})All
+ + + + + + + + + + + + + + + + + + + + + + + +
Hostnamepingsshpcustatuskernellast_contact
+
+
+ + diff --git a/web/MonitorWeb/monitorweb/templates/pculist.kid b/web/MonitorWeb/monitorweb/templates/pculist.kid new file mode 100644 index 0000000..fc1b835 --- /dev/null +++ b/web/MonitorWeb/monitorweb/templates/pculist.kid @@ -0,0 +1,67 @@ + + + + +
+ + + + + + + + + + + + + + + +
Ok(${fc['ok']})Misconfigured(${fc['Not_Run']})Offline(${fc['NetDown']})Runtime Error(${fc['pending']})All
+ + + + + + + + + + + + + + + + + + + + + + + + + +
SitePCU NameMissing FieldsDNS StatusPort StatusTest ResultsModelNodes
sitename + ${pcu_name(node.plc_pcu_stats)} + 80 +
+
+
+ + diff --git a/web/MonitorWeb/monitorweb/templates/sitemenu.kid b/web/MonitorWeb/monitorweb/templates/sitemenu.kid new file mode 100644 index 0000000..23e9d41 --- /dev/null +++ b/web/MonitorWeb/monitorweb/templates/sitemenu.kid @@ -0,0 +1,37 @@ + + + + App Name - ${page_title} + + + + +

Monitor : ${page_title}

+ + + + +
+ + + + + + + + + + + + + + +
NodesPCUsSitesActions
+ Default content - this will be replaced by an element marked with + py:match="item.tag == 'content'" +
+
+ + + + -- 2.43.0