+#!/usr/bin/python
+
+import plc
+import auth
+api = plc.PLC(auth.auth, auth.plc)
+
+import soltesz
+fb = soltesz.dbLoad("findbad")
+from nodecommon import *
+
+import time
+
+from config import config
+from optparse import OptionParser
+parser = OptionParser()
+parser.set_defaults(node=None, category=None, nodelist=None)
+parser.add_option("", "--category", dest="category", metavar="category",
+ help="List all nodes in the given category")
+parser.add_option("", "--nodelist", dest="nodelist", metavar="nodelist.txt",
+ help="A list of nodes to bring out of debug mode.")
+config = config(parser)
+config.parse_args()
+
+def diff_time(timestamp):
+ now = time.time()
+ if timestamp == None:
+ return "unknown"
+ diff = now - timestamp
+ # return the number of seconds as a difference from current time.
+ t_str = ""
+ if diff < 60: # sec in min.
+ t = diff
+ t_str = "%s sec ago" % t
+ elif diff < 60*60: # sec in hour
+ t = diff // (60)
+ t_str = "%s min ago" % int(t)
+ elif diff < 60*60*24: # sec in day
+ t = diff // (60*60)
+ t_str = "%s hours ago" % int(t)
+ elif diff < 60*60*24*7: # sec in week
+ t = diff // (60*60*24)
+ t_str = "%s days ago" % int(t)
+ elif diff < 60*60*24*30: # approx sec in month
+ t = diff // (60*60*24*7)
+ t_str = "%s weeks ago" % int(t)
+ elif diff > 60*60*24*30: # approx sec in month
+ t = diff // (60*60*24*7*30)
+ t_str = "%s months ago" % int(t)
+ return t_str
+
+
+def fb_print_nodeinfo(fbnode, hostname):
+ fbnode['hostname'] = hostname
+ fbnode['checked'] = diff_time(fbnode['checked'])
+ if fbnode['bootcd']:
+ fbnode['bootcd'] = fbnode['bootcd'].split()[-1]
+ else:
+ fbnode['bootcd'] = "unknown"
+ fbnode['kernel'] = fbnode['kernel'].split()[2]
+ fbnode['pcu'] = color_pcu_state(fbnode)
+ print "%(hostname)-39s | %(checked)11.11s | %(state)10.10s | %(ssh)5.5s | %(pcu)6.6s | %(bootcd)6.6s | %(category)8.8s | %(kernel)s" % fbnode
+
+if config.nodelist:
+ nodelist = config.getListFromFile(config.nodelist)
+else:
+ nodelist = fb['nodes'].keys()
+
+
+for node in nodelist:
+ config.node = node
+
+ if node not in fb['nodes']:
+ continue
+
+ fb_nodeinfo = fb['nodes'][node]['values']
+
+ if config.category and \
+ 'state' in fb_nodeinfo and \
+ config.category == fb_nodeinfo['state']:
+
+ fb_print_nodeinfo(fb_nodeinfo, node)
+ elif config.nodelist and 'state' in fb_nodeinfo:
+ fb_print_nodeinfo(fb_nodeinfo, node)
+ else:
+ pass
+
+
+