38cf8974bf6cbe48ed9c12b20fb39b900d0b59b5
[monitor.git] / pcubad.py
1 #!/usr/bin/python
2
3 import os
4 import sys
5 import string
6 import time
7
8 from reboot import pcu_name
9
10 import database
11 import comon
12 import threadpool
13 import syncplcdb
14 from nodequery import verify,query_to_dict,node_select
15 import parser as parsermodule
16 from nodecommon import *
17 from datetime import datetime,timedelta
18 import config
19
20 from sqlobject import connectionForURI,sqlhub
21 connection = connectionForURI(config.sqlobjecturi)
22 sqlhub.processConnection = connection
23 from infovacuum.model_findbadrecord import *
24 from infovacuum.model_historyrecord import *
25
26 import plc
27 api = plc.getAuthAPI()
28 from unified_model import *
29 from const import MINUP
30
31
32 def main(config):
33
34         l_plcpcus = database.if_cached_else_refresh(1, 1, "pculist", lambda : plc.GetPCUs())
35
36         l_pcus = None
37         if config.pcu:
38                 for pcu in l_plcpcus:
39                         if ( pcu['hostname'] is not None and config.pcu in pcu['hostname'] ) or \
40                            ( pcu['ip'] is not None and config.pcu in pcu['ip'] ):
41                                 l_pcus = [pcu['pcu_id']]
42                 if not l_pcus:
43                         print "ERROR: could not find pcu %s" % config.pcu
44                         sys.exit(1)
45         else:
46                 l_pcus = [pcu['pcu_id'] for pcu in l_plcpcus]
47         
48         checkAndRecordState(l_pcus, l_plcpcus)
49
50 hn2lb = database.dbLoad("plcdb_hn2lb")
51
52 def checkAndRecordState(l_pcus, l_plcpcus):
53         count = 0
54         for pcuname in l_pcus:
55
56                 d_pcu = None
57                 for pcu in l_plcpcus:
58                         if pcu['pcu_id'] == pcuname:
59                                 d_pcu = pcu
60                                 break
61                 if not d_pcu:
62                         continue
63
64                 try:
65                         pf = HistoryPCURecord.by_pcuid(d_pcu['pcu_id'])
66                 except:
67                         pf = HistoryPCURecord(plc_pcuid=pcuname)
68
69                 pf.last_checked = datetime.now()
70
71                 try:
72                         # Find the most recent record
73                         pcurec = FindbadPCURecord.select(FindbadPCURecord.q.plc_pcuid==pcuname, 
74                                                                                            orderBy='date_checked').reversed()[0]
75                 except:
76                         # don't have the info to create a new entry right now, so continue.
77                         continue 
78
79                 pcu_state      = pcurec.reboot_trial_status
80                 current_state = pcu_state
81
82                 if current_state == 0 or current_state == "0":
83                         if pf.status != "good": 
84                                 pf.last_changed = datetime.now() 
85                                 pf.status = "good"
86                 elif current_state == 'NetDown':
87                         if pf.status != "netdown": 
88                                 pf.last_changed = datetime.now()
89                                 pf.status = "netdown"
90                 elif current_state == 'Not_Run':
91                         if pf.status != "badconfig": 
92                                 pf.last_changed = datetime.now()
93                                 pf.status = "badconfig"
94                 else:
95                         if pf.status != "error": 
96                                 pf.last_changed = datetime.now()
97                                 pf.status = "error"
98
99                 count += 1
100                 print "%d %35s %s since(%s)" % (count, pcu_name(d_pcu), pf.status, diff_time(time.mktime(pf.last_changed.timetuple())))
101
102         return True
103
104 if __name__ == '__main__':
105         parser = parsermodule.getParser()
106         parser.set_defaults(filename=None, pcu=None, pcuselect=False, pcugroup=None, cachepcus=False)
107         parser.add_option("", "--pcu", dest="pcu", metavar="hostname", 
108                                                 help="Provide a single pcu to operate on")
109         parser.add_option("", "--pculist", dest="pculist", metavar="file.list", 
110                                                 help="Provide a list of files to operate on")
111
112         config = parsermodule.parse_args(parser)
113
114         try:
115                 main(config)
116         except Exception, err:
117                 import traceback
118                 print traceback.print_exc()
119                 print "Exception: %s" % err
120                 sys.exit(0)