modified *list templates with abreviated information
[monitor.git] / nodebad.py
1 #!/usr/bin/python
2
3 import os
4 import sys
5 import string
6 import time
7 from datetime import datetime,timedelta
8
9 from nodequery import verify,query_to_dict,node_select
10
11 from nodecommon import *
12
13 from monitor import config
14 from monitor.wrapper import plc,plccache
15 from monitor.const import MINUP
16 from monitor.database.info.model import  FindbadNodeRecord, HistoryNodeRecord
17 from monitor.database.dborm import  mon_session as session
18
19 from monitor.model import *
20
21 api = plc.getAuthAPI()
22
23 round = 1
24 count = 0
25
26 def main(config):
27
28         l_plcnodes = plccache.l_nodes
29         l_nodes = get_nodeset(config)
30         
31         checkAndRecordState(l_nodes, l_plcnodes)
32
33 def checkAndRecordState(l_nodes, l_plcnodes):
34         global count
35
36         for nodename in l_nodes:
37                 d_node = None
38                 for node in l_plcnodes:
39                         if node['hostname'] == nodename:
40                                 d_node = node
41                                 break
42                 if not d_node:
43                         continue
44
45                 pf = HistoryNodeRecord.findby_or_create(hostname=nodename)
46                 pf.last_checked = datetime.now()
47
48                 try:
49                         # Find the most recent record
50                         noderec = FindbadNodeRecord.query.filter(FindbadNodeRecord.hostname==nodename).order_by(FindbadNodeRecord.date_checked.desc()).first()
51                         #print "NODEREC: ", noderec.date_checked
52                 except:
53                         print "COULD NOT FIND %s" % nodename
54                         import traceback
55                         print traceback.print_exc()
56                         continue
57
58                 if not noderec:
59                         print "none object for %s"% nodename
60                         continue
61
62                 node_state = noderec.observed_status
63                 if noderec.plc_node_stats:
64                         boot_state = noderec.plc_node_stats['boot_state']
65                 else:
66                         boot_state = "unknown"
67
68                 if node_state == "BOOT":
69                         if pf.status != "good": 
70                                 pf.last_changed = datetime.now()
71                                 pf.status = "good"
72                 elif node_state == "DEBUG":
73                         if pf.status != boot_state: 
74                                 pf.last_changed = datetime.now()
75                                 pf.status = boot_state
76                 else:
77                         if pf.status != "down": 
78                                 pf.last_changed = datetime.now()
79                                 pf.status = "down"
80
81                 count += 1
82                 print "%d %35s %s since(%s)" % (count, nodename, pf.status, diff_time(time.mktime(pf.last_changed.timetuple())))
83
84         # NOTE: this commits all pending operations to the DB.  Do not remove, or
85         # replace with another operations that also commits all pending ops, such
86         # as session.commit() or flush() or something
87         print HistoryNodeRecord.query.count()
88         session.flush()
89
90         return True
91
92 if __name__ == '__main__':
93         from monitor import parser as parsermodule
94         parser = parsermodule.getParser(['nodesets'])
95         parser.set_defaults(filename=None, node=None, nodeselect=False, nodegroup=None, cachenodes=False)
96         parser = parsermodule.getParser(['defaults'], parser)
97         config = parsermodule.parse_args(parser)
98
99         try:
100                 main(config)
101         except Exception, err:
102                 import traceback
103                 print traceback.print_exc()
104                 print "Exception: %s" % err
105                 sys.exit(0)