clean kernel parsing.
[monitor.git] / nodequery.py
1 #!/usr/bin/python
2
3 import plc
4 import auth
5 api = plc.PLC(auth.auth, auth.plc)
6
7 import soltesz
8 fb = soltesz.dbLoad("findbad")
9 from nodecommon import *
10
11 import time
12
13 from config import config
14 from optparse import OptionParser
15 parser = OptionParser()
16 parser.set_defaults(node=None, category=None, nodelist=None)
17 parser.add_option("", "--category", dest="category", metavar="category", 
18                                         help="List all nodes in the given category")
19 parser.add_option("", "--nodelist", dest="nodelist", metavar="nodelist.txt", 
20                                         help="A list of nodes to bring out of debug mode.")
21 config = config(parser)
22 config.parse_args()
23
24 def diff_time(timestamp):
25         now = time.time()
26         if timestamp == None:
27                 return "unknown"
28         diff = now - timestamp
29         # return the number of seconds as a difference from current time.
30         t_str = ""
31         if diff < 60: # sec in min.
32                 t = diff
33                 t_str = "%s sec ago" % t
34         elif diff < 60*60: # sec in hour
35                 t = diff // (60)
36                 t_str = "%s min ago" % int(t)
37         elif diff < 60*60*24: # sec in day
38                 t = diff // (60*60)
39                 t_str = "%s hours ago" % int(t)
40         elif diff < 60*60*24*7: # sec in week
41                 t = diff // (60*60*24)
42                 t_str = "%s days ago" % int(t)
43         elif diff < 60*60*24*30: # approx sec in month
44                 t = diff // (60*60*24*7)
45                 t_str = "%s weeks ago" % int(t)
46         elif diff > 60*60*24*30: # approx sec in month
47                 t = diff // (60*60*24*7*30)
48                 t_str = "%s months ago" % int(t)
49         return t_str
50
51
52 def fb_print_nodeinfo(fbnode, hostname):
53         fbnode['hostname'] = hostname
54         fbnode['checked'] = diff_time(fbnode['checked'])
55         if fbnode['bootcd']:
56                 fbnode['bootcd'] = fbnode['bootcd'].split()[-1]
57         else:
58                 fbnode['bootcd'] = "unknown"
59         if 'ERROR' in fbnode['category']:
60                 fbnode['kernel'] = ""
61         else:
62                 fbnode['kernel'] = fbnode['kernel'].split()[2]
63         #fbnode['pcu'] = color_pcu_state(fbnode)
64         print "%(hostname)-39s | %(checked)11.11s | %(state)10.10s | %(ssh)5.5s | %(pcu)6.6s | %(bootcd)6.6s | %(category)8.8s | %(kernel)s" % fbnode
65
66 if config.nodelist:
67         nodelist = config.getListFromFile(config.nodelist)
68 else:
69         nodelist = fb['nodes'].keys()
70
71
72 for node in nodelist:
73         config.node = node
74
75         if node not in fb['nodes']:
76                 continue
77
78         fb_nodeinfo  = fb['nodes'][node]['values']
79
80         if config.category and \
81                 'state' in fb_nodeinfo and \
82                 config.category == fb_nodeinfo['state']:
83
84                         fb_print_nodeinfo(fb_nodeinfo, node)
85         elif 'state' in fb_nodeinfo:
86                 fb_print_nodeinfo(fb_nodeinfo, node)
87         else:
88                 pass
89                 
90
91