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