supports basic listing of pcus, nodes, and some coloring from the old scripts.
[monitor.git] / web / MonitorWeb / monitorweb / controllers.py
1 import turbogears as tg
2 from turbogears import controllers, expose, flash
3 # from monitorweb import model
4 # import logging
5 # log = logging.getLogger("monitorweb.controllers")
6 from monitor.database.info.model import *
7 from pcucontrol import reboot
8
9 def format_ports(pcu):
10         retval = []
11         if pcu.port_status and len(pcu.port_status.keys()) > 0 :
12                 obj = reboot.model_to_object(pcu.plc_pcu_stats['model'])
13                 for port in obj.supported_ports:
14                         state = pcu.port_status[str(port)]
15                         retval.append( (port, state) )
16
17         if retval == []: 
18                 retval = [( "Closed/Filtered", "state" )]
19
20         return retval
21
22 def format_pcu_shortstatus(pcu):
23         status = "error"
24         if pcu.reboot_trial_status == str(0):
25                 status = "ok"
26         elif pcu.reboot_trial_status == "NetDown" or pcu.reboot_trial_status == "Not_Run":
27                 status = pcu.reboot_trial_status
28         else:
29                 status = "error"
30
31         return status
32
33 class Root(controllers.RootController):
34         @expose(template="monitorweb.templates.welcome")
35         def index(self):
36                 import time
37                 # log.debug("Happy TurboGears Controller Responding For Duty")
38                 flash("Your application is now running")
39                 return dict(now=time.ctime())
40
41         @expose(template="monitorweb.templates.nodelist")
42         def node(self, filter='BOOT'):
43                 import time
44                 fbquery = FindbadNodeRecord.get_all_latest()
45                 query = []
46                 filtercount = {'DOWN' : 0, 'BOOT': 0, 'DEBUG' : 0, 'neverboot' : 0, 'pending' : 0, 'all' : 0}
47                 for node in fbquery:
48                         if node.plc_pcuid:
49                                 pcu = FindbadPCURecord.get_latest_by(plc_pcuid=node.plc_pcuid).first()
50                                 if pcu:
51                                         node.pcu_status = pcu.reboot_trial_status
52                                 else:
53                                         node.pcu_status = "nodata"
54                         else:
55                                 node.pcu_status = "nopcu"
56
57                         if node.kernel_version:
58                                 node.kernel = node.kernel_version.split()[2]
59                         else:
60                                 node.kernel = ""
61
62                         # NOTE: count filters
63                         if node.observed_status != 'DOWN':
64                                 filtercount[node.observed_status] += 1
65                         else:
66                                 if node.plc_node_stats['last_contact'] != None:
67                                         filtercount[node.observed_status] += 1
68                                 else:
69                                         filtercount['neverboot'] += 1
70
71                         # NOTE: apply filter
72                         if filter == node.observed_status:
73                                 if filter == "DOWN":
74                                         if node.plc_node_stats['last_contact'] != None:
75                                                 query.append(node)
76                                 else:
77                                         query.append(node)
78                         elif filter == "neverboot":
79                                 if node.plc_node_stats['last_contact'] == None:
80                                         query.append(node)
81                         elif filter == "pending":
82                                 # TODO: look in message logs...
83                                 pass
84                         elif filter == "all":
85                                 query.append(node)
86                                 
87                 return dict(now=time.ctime(), query=query, fc=filtercount)
88
89         @expose(template="monitorweb.templates.pculist")
90         def pcu(self, filter='all'):
91                 import time
92                 fbquery = FindbadPCURecord.get_all_latest()
93                 query = []
94                 filtercount = {'ok' : 0, 'NetDown': 0, 'Not_Run' : 0, 'pending' : 0, 'all' : 0}
95                 for node in fbquery:
96
97                         # NOTE: count filter
98                         if node.reboot_trial_status == str(0):
99                                 filtercount['ok'] += 1
100                         elif node.reboot_trial_status == 'NetDown' or node.reboot_trial_status == 'Not_Run':
101                                 filtercount[node.reboot_trial_status] += 1
102                         else:
103                                 filtercount['pending'] += 1
104                                 
105                         print reboot.pcu_name(node.plc_pcu_stats)
106                         node.ports = format_ports(node)
107                         node.status = format_pcu_shortstatus(node)
108
109                         # NOTE: apply filter
110                         if filter == "all":
111                                 query.append(node)
112                         elif filter == "ok" and node.reboot_trial_status == str(0):
113                                 query.append(node)
114                         elif filter == node.reboot_trial_status:
115                                 query.append(node)
116                         elif filter == "pending":
117                                 # TODO: look in message logs...
118                                 if node.reboot_trial_status != str(0) and \
119                                         node.reboot_trial_status != 'NetDown' and \
120                                         node.reboot_trial_status != 'Not_Run':
121
122                                         query.append(node)
123                                 
124                 return dict(query=query, fc=filtercount)
125
126         @expose(template="monitorweb.templates.pculist")
127         def site(self, filter='all'):
128                 filtercount = {'ok' : 0, 'NetDown': 0, 'Not_Run' : 0, 'pending' : 0, 'all' : 0}
129                 return dict(query=[], fc=filtercount)
130
131         @expose(template="monitorweb.templates.pculist")
132         def action(self, filter='all'):
133                 filtercount = {'ok' : 0, 'NetDown': 0, 'Not_Run' : 0, 'pending' : 0, 'all' : 0}
134                 return dict(query=[], fc=filtercount)