changes for 3.0
[monitor.git] / printbadcsv.py
1 #!/usr/bin/python
2 from monitor import database
3 from monitor import config
4 import parser as parsermodule
5
6 from www.printbadnodes import *
7
8 def main():
9         global fb
10         db = database.dbLoad(config.dbname)
11         fb = database.dbLoad("findbadpcus")
12         act= database.dbLoad("act_all")
13
14         ## Field widths used for printing
15         maxFieldLengths = { 'nodename' : -45,
16                                                 'ping' : 6, 
17                                                 'ssh' : 6, 
18                                                 'rt' : 10, 
19                                                 'pcu' : 7, 
20                                                 'category' : 9, 
21                                                 'state' : 5, 
22                                                 'kernel' : 10.65, 
23                                                 'comonstats' : 5, 
24                                                 'plcsite' : 12,
25                                                 'bootcd' : 10.65}
26         ## create format string based on config.fields
27         fields = {}
28         format = ""
29         for f in config.fields.split(','):
30                 fields[f] = "%%(%s)%ds" % (f, maxFieldLengths[f])
31         for f in config.fields.split(','):
32                 format += fields[f] + " "
33
34
35         d_n = db['nodes']
36         if config.display:
37                 l_nodes = sys.argv[2:]
38         else:
39                 l_nodes = d_n.keys()
40
41         # d2 was an array of [{node}, {}, ...]
42         # the bysite is a loginbase dict of [{node}, {node}]
43         d2 = []
44         for nodename in l_nodes: 
45                 vals=d_n[nodename]['values'] 
46                 v = {}
47                 v.update(vals)
48                 v['nodename'] = nodename 
49                 if 'plcsite' in vals and 'status' in vals['plcsite'] and vals['plcsite']['status'] == "SUCCESS":
50                         site_string = "<b>%-20s</b> %2s nodes :: %2s of %4s slices" % ( \
51                                                                                                                 vals['plcsite']['login_base'],
52                                                                                                                 vals['plcsite']['num_nodes'], 
53                                                                                                                 vals['plcsite']['num_slices'], 
54                                                                                                                 vals['plcsite']['max_slices'])
55                         v['site_string'] = site_string
56                         d2.append(v)
57                 else:
58                         #print "ERROR: ", nodename, vals, "<br>"
59                         pass
60                         #site_string = "<b>UNKNOWN</b>"
61                         
62
63         if config.cmpping:
64                 d2.sort(cmp=cmpPing)
65         elif config.cmpssh:
66                 d2.sort(cmp=cmpSSH)
67         elif config.cmpcategory:
68                 d2.sort(cmp=cmpCategory)
69         elif config.cmpstate:
70                 d2.sort(cmp=cmpState)
71         elif config.cmpdays:
72                 d2.sort(cmp=cmpDays)
73         elif config.cmpkernel:
74                 d2.sort(cmp=cmpUname)
75         else:
76                 d2.sort(cmp=cmpCategory)
77         
78
79         for row in d2:
80                 site_string = row['site_string']
81                 vals = row
82                 # convert uname values into a single kernel version string
83                 if 'kernel' in vals:
84                         kernel = vals['kernel'].split()
85                         if len(kernel) > 0:
86                                 if kernel[0] == "Linux":
87                                         vals['kernel'] = kernel[2]
88                                 else:
89                                         vals['ssherror'] = vals['kernel']
90                                         vals['kernel'] = ""
91                 else:
92                         vals['ssherror'] = ""
93                         vals['kernel'] = ""
94                         continue
95
96                 if 'pcu' in vals and vals['pcu'] == "PCU":
97                         # check the health of the pcu.
98                         s = pcu_state(vals['plcnode']['pcu_ids'][0])
99                         if s == 0:
100                                 vals['pcu'] = "UP-PCU"
101                         else:
102                                 vals['pcu'] = "DN-PCU"
103
104                 vals['rt'] = " -"
105                 if vals['nodename'] in act:
106                         if len(act[vals['nodename']]) > 0 and 'rt' in act[vals['nodename']][0]:
107                                 if 'Status' in act[vals['nodename']][0]['rt']:
108                                         vals['rt'] = "%s %s" % (act[vals['nodename']][0]['rt']['Status'], 
109                                                                                         act[vals['nodename']][0]['rt']['id'])
110
111                 str = format % vals 
112                 fields = str.split()
113                 #print "<tr>"
114                 s = fields_to_html(fields, vals)
115                 s = ""
116                 if config.display:
117                         print str
118
119         keys = categories.keys()
120         for cat in ['BOOT-PROD', 'BOOT-OLDPROD', 'BOOT-OLDBOOTCD', 'DEBUG-PROD',
121         'DEBUG-OLDPROD', 'DEBUG-OLDBOOTCD', 'DOWN-ERROR']:
122                 if cat not in keys:
123                         categories[cat] = 0
124         keys = categories.keys()
125         for cat in ['BOOT-PROD', 'BOOT-OLDPROD', 'BOOT-OLDBOOTCD', 'DEBUG-PROD',
126         'DEBUG-OLDPROD', 'DEBUG-OLDBOOTCD', 'DOWN-ERROR']:
127                 if cat in keys:
128                         print "%d," % categories[cat],
129         print ""
130 import cgi
131 if __name__ == '__main__':
132         parser = parsermodule.getParser()
133         parser.set_defaults(cmpdays=False, 
134                                                 comon="sshstatus", 
135                                                 fields="nodename,ping,ssh,pcu,category,state,kernel,bootcd,rt", 
136                                                 dbname="findbad", # -070724-1", 
137                                                 display=False,
138                                                 cmpping=False, 
139                                                 cmpssh=False, 
140                                                 cmpcategory=False,
141                                                 cmpstate=False)
142         parser.add_option("", "--fields",       dest="dbname", help="")
143         parser.add_option("", "--dbname",       dest="dbname", help="")
144         parser.add_option("", "--display",      dest="display", action="store_true")
145         parser.add_option("", "--days",         dest="cmpdays", action="store_true", help="")
146         parser.add_option("", "--ping",         dest="cmpping", action="store_true", help="")
147         parser.add_option("", "--ssh",          dest="cmpssh",  action="store_true", help="")
148         parser.add_option("", "--category",     dest="cmpcategory", action="store_true", help="")
149         parser.add_option("", "--kernel",       dest="cmpkernel", action="store_true", help="")
150         parser.add_option("", "--state",        dest="cmpstate", action="store_true", help="")
151         parser.add_option("", "--comon",        dest="comon",   help="")
152         config = parsermodule.parse_args(parser)
153         main()