just commit everything...
[monitor.git] / nodebad.py
1 #!/usr/bin/python
2
3 import os
4 import sys
5 import string
6 import time
7
8
9 import database
10 import comon
11 import threadpool
12 import syncplcdb
13 from nodequery import verify,query_to_dict,node_select
14 from nodecommon import *
15 from datetime import datetime,timedelta
16 import config
17
18 from sqlobject import connectionForURI,sqlhub
19 connection = connectionForURI(config.sqlobjecturi)
20 sqlhub.processConnection = connection
21 from infovacuum.model_findbadrecord import *
22 from infovacuum.model_historyrecord import *
23
24 import plc
25 api = plc.getAuthAPI()
26 from unified_model import *
27 from const import MINUP
28
29 round = 1
30 count = 0
31
32 def main(config):
33
34         l_nodes = syncplcdb.create_plcdb()
35         l_plcnodes = database.dbLoad("l_plcnodes")
36         l_nodes = get_nodeset(config)
37         
38         checkAndRecordState(l_nodes, l_plcnodes)
39
40 def checkAndRecordState(l_nodes, l_plcnodes):
41         global count
42
43         for nodename in l_nodes:
44                 d_node = None
45                 for node in l_plcnodes:
46                         if node['hostname'] == nodename:
47                                 d_node = node
48                                 break
49                 if not d_node:
50                         continue
51
52                 try:
53                         pf = HistoryNodeRecord.by_hostname(nodename)
54                 except:
55                         pf = HistoryNodeRecord(hostname=nodename)
56
57                 pf.last_checked = datetime.now()
58
59                 try:
60                         # Find the most recent record
61                         noderec = FindbadNodeRecord.select(FindbadNodeRecord.q.hostname==nodename, 
62                                                                                            orderBy='date_checked').reversed()[0]
63                 except:
64                         # or create an empty one.
65                         noderec = FindbadNodeRecord(hostname=nodename)
66
67                 node_state = noderec.observed_status
68                 if noderec.plc_node_stats:
69                         boot_state = noderec.plc_node_stats['boot_state']
70                 else:
71                         boot_state = "unknown"
72
73                 if node_state == "BOOT":
74                         if pf.status != "good": 
75                                 pf.last_changed = datetime.now()
76                                 pf.status = "good"
77                 elif node_state == "DEBUG":
78                         if pf.status != boot_state: 
79                                 pf.last_changed = datetime.now()
80                                 pf.status = boot_state
81                 else:
82                         if pf.status != "down": 
83                                 pf.last_changed = datetime.now()
84                                 pf.status = "down"
85
86                 count += 1
87                 print "%d %35s %s since(%s)" % (count, nodename, pf.status, diff_time(time.mktime(pf.last_changed.timetuple())))
88
89         return True
90
91 if __name__ == '__main__':
92         import parser as parsermodule
93         parser = parsermodule.getParser(['nodesets'])
94         parser.set_defaults(filename=None, node=None, nodeselect=False, nodegroup=None, cachenodes=False)
95         parser = parsermodule.getParser(['defaults'], parser)
96         config = parsermodule.parse_args(parser)
97
98         try:
99                 main(config)
100         except Exception, err:
101                 import traceback
102                 print traceback.print_exc()
103                 print "Exception: %s" % err
104                 sys.exit(0)