added httpd/conf.d/monitorweb.conf to /etc/plc.d/monitor.init
[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 from monitor.wrapper.plccache import plcdb_id2lb as site_id2lb
9
10 def format_ports(pcu):
11         retval = []
12         if pcu.port_status and len(pcu.port_status.keys()) > 0 :
13                 obj = reboot.model_to_object(pcu.plc_pcu_stats['model'])
14                 for port in obj.supported_ports:
15                         try:
16                                 state = pcu.port_status[str(port)]
17                         except:
18                                 state = "unknown"
19                                 
20                         retval.append( (port, state) )
21
22         if retval == []: 
23                 retval = [( "Closed/Filtered", "state" )]
24
25         return retval
26
27 def format_pcu_shortstatus(pcu):
28         status = "error"
29         if pcu.reboot_trial_status == str(0):
30                 status = "ok"
31         elif pcu.reboot_trial_status == "NetDown" or pcu.reboot_trial_status == "Not_Run":
32                 status = pcu.reboot_trial_status
33         else:
34                 status = "error"
35
36         return status
37
38 class Root(controllers.RootController):
39         @expose(template="monitorweb.templates.welcome")
40         def index(self):
41                 import time
42                 # log.debug("Happy TurboGears Controller Responding For Duty")
43                 flash("Your application is now running")
44                 return dict(now=time.ctime())
45
46         @expose(template="monitorweb.templates.nodelist")
47         def node(self, filter='BOOT'):
48                 import time
49                 fbquery = FindbadNodeRecord.get_all_latest()
50                 query = []
51                 filtercount = {'DOWN' : 0, 'BOOT': 0, 'DEBUG' : 0, 'neverboot' : 0, 'pending' : 0, 'all' : 0}
52                 for node in fbquery:
53                         # NOTE: reformat some fields.
54                         if node.plc_pcuid:
55                                 pcu = FindbadPCURecord.get_latest_by(plc_pcuid=node.plc_pcuid).first()
56                                 if pcu:
57                                         node.pcu_status = pcu.reboot_trial_status
58                                 else:
59                                         node.pcu_status = "nodata"
60                                 node.pcu_short_status = format_pcu_shortstatus(pcu)
61
62                         else:
63                                 node.pcu_status = "nopcu"
64                                 node.pcu_short_status = "none"
65
66                         if node.kernel_version:
67                                 node.kernel = node.kernel_version.split()[2]
68                         else:
69                                 node.kernel = ""
70
71                         try:
72                                 node.loginbase = site_id2lb[node.plc_node_stats['site_id']]
73                         except:
74                                 node.loginbase = "unknown"
75
76
77                         # NOTE: count filters
78                         if node.observed_status != 'DOWN':
79                                 filtercount[node.observed_status] += 1
80                         else:
81                                 if node.plc_node_stats['last_contact'] != None:
82                                         filtercount[node.observed_status] += 1
83                                 else:
84                                         filtercount['neverboot'] += 1
85
86                         # NOTE: apply filter
87                         if filter == node.observed_status:
88                                 if filter == "DOWN":
89                                         if node.plc_node_stats['last_contact'] != None:
90                                                 query.append(node)
91                                 else:
92                                         query.append(node)
93                         elif filter == "neverboot":
94                                 if node.plc_node_stats['last_contact'] == None:
95                                         query.append(node)
96                         elif filter == "pending":
97                                 # TODO: look in message logs...
98                                 pass
99                         elif filter == "all":
100                                 query.append(node)
101                                 
102                 return dict(now=time.ctime(), query=query, fc=filtercount)
103
104         @expose(template="monitorweb.templates.pculist")
105         def pcu(self, filter='all'):
106                 import time
107                 fbquery = FindbadPCURecord.get_all_latest()
108                 query = []
109                 filtercount = {'ok' : 0, 'NetDown': 0, 'Not_Run' : 0, 'pending' : 0, 'all' : 0}
110                 for node in fbquery:
111
112                         # NOTE: count filter
113                         if node.reboot_trial_status == str(0):
114                                 filtercount['ok'] += 1
115                         elif node.reboot_trial_status == 'NetDown' or node.reboot_trial_status == 'Not_Run':
116                                 filtercount[node.reboot_trial_status] += 1
117                         else:
118                                 filtercount['pending'] += 1
119                                 
120                         try:
121                                 node.loginbase = site_id2lb[node.plc_pcu_stats['site_id']]
122                         except:
123                                 node.loginbase = "unknown"
124
125                         node.ports = format_ports(node)
126                         node.status = format_pcu_shortstatus(node)
127
128                         # NOTE: apply filter
129                         if filter == "all":
130                                 query.append(node)
131                         elif filter == "ok" and node.reboot_trial_status == str(0):
132                                 query.append(node)
133                         elif filter == node.reboot_trial_status:
134                                 query.append(node)
135                         elif filter == "pending":
136                                 # TODO: look in message logs...
137                                 if node.reboot_trial_status != str(0) and \
138                                         node.reboot_trial_status != 'NetDown' and \
139                                         node.reboot_trial_status != 'Not_Run':
140
141                                         query.append(node)
142                                 
143                 return dict(query=query, fc=filtercount)
144
145         @expose(template="monitorweb.templates.sitelist")
146         def site(self, filter='all'):
147                 filtercount = {'good' : 0, 'down': 0, 'new' : 0, 'pending' : 0, 'all' : 0}
148                 fbquery = HistorySiteRecord.query.all()
149                 query = []
150                 for site in fbquery:
151                         # count filter
152                         filtercount['all'] += 1
153                         if site.new and site.slices_used == 0 and not site.enabled:
154                                 filtercount['new'] += 1
155                         elif not site.enabled:
156                                 filtercount['pending'] += 1
157                         else:
158                                 filtercount[site.status] += 1
159
160                         # apply filter
161                         if filter == "all":
162                                 query.append(site)
163                         elif filter == 'new' and site.new and site.slices_used == 0 and not site.enabled:
164                                 query.append(site)
165                         elif filter == "pending" and not site.enabled:
166                                 query.append(site)
167                         elif filter == site.status:
168                                 query.append(site)
169                                 
170                 return dict(query=query, fc=filtercount)
171
172         @expose(template="monitorweb.templates.pculist")
173         def action(self, filter='all'):
174                 filtercount = {'ok' : 0, 'NetDown': 0, 'Not_Run' : 0, 'pending' : 0, 'all' : 0}
175                 return dict(query=[], fc=filtercount)