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