added a variety of updates to templates, to reference each other.
[monitor.git] / pcubad.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 monitor import database
10 from pcucontrol  import reboot
11 from monitor import parser as parsermodule
12 from monitor import config
13 from monitor.database.info.model import HistoryPCURecord, FindbadPCURecord
14 from monitor.wrapper import plc,plccache
15 from monitor.const import MINUP
16
17 from nodecommon import *
18 from nodequery import verify,query_to_dict,node_select
19 from monitor.model import *
20
21 api = plc.getAuthAPI()
22
23 def main(config):
24
25         l_plcpcus = plccache.l_pcus 
26
27         l_pcus = None
28         if config.pcu:
29                 for pcu in l_plcpcus:
30                         if ( pcu['hostname'] is not None and config.pcu in pcu['hostname'] ) or \
31                            ( pcu['ip'] is not None and config.pcu in pcu['ip'] ):
32                                 l_pcus = [pcu['pcu_id']]
33                 if not l_pcus:
34                         print "ERROR: could not find pcu %s" % config.pcu
35                         sys.exit(1)
36         else:
37                 l_pcus = [pcu['pcu_id'] for pcu in l_plcpcus]
38         
39         checkAndRecordState(l_pcus, l_plcpcus)
40
41 hn2lb = plccache.plcdb_hn2lb
42
43 def checkAndRecordState(l_pcus, l_plcpcus):
44         count = 0
45         for pcuname in l_pcus:
46
47                 d_pcu = None
48                 for pcu in l_plcpcus:
49                         if pcu['pcu_id'] == pcuname:
50                                 d_pcu = pcu
51                                 break
52                 if not d_pcu:
53                         continue
54
55                 pf = HistoryPCURecord.findby_or_create(plc_pcuid=d_pcu['pcu_id'])
56                 pf.last_checked = datetime.now()
57
58                 try:
59                         # Find the most recent record
60                         pcurec = FindbadPCURecord.query.filter(FindbadPCURecord.plc_pcuid==pcuname).order_by(FindbadPCURecord.date_checked.desc()).first()
61                         print "NODEREC: ", pcurec.date_checked
62                 except:
63                         print "COULD NOT FIND FB record for %s" % reboot.pcu_name(pcu)
64                         import traceback
65                         print traceback.print_exc()
66                         # don't have the info to create a new entry right now, so continue.
67                         continue 
68
69                 pcu_state      = pcurec.reboot_trial_status
70                 current_state = pcu_state
71
72                 if current_state == 0 or current_state == "0":
73                         if pf.status != "good": 
74                                 pf.last_changed = datetime.now() 
75                                 pf.status = "good"
76                 elif current_state == 'NetDown':
77                         if pf.status != "netdown": 
78                                 pf.last_changed = datetime.now()
79                                 pf.status = "netdown"
80                 elif current_state == 'Not_Run':
81                         if pf.status != "badconfig": 
82                                 pf.last_changed = datetime.now()
83                                 pf.status = "badconfig"
84                 else:
85                         if pf.status != "error": 
86                                 pf.last_changed = datetime.now()
87                                 pf.status = "error"
88
89                 count += 1
90                 print "%d %35s %s since(%s)" % (count, reboot.pcu_name(d_pcu), pf.status, diff_time(time.mktime(pf.last_changed.timetuple())))
91
92         # NOTE: this commits all pending operations to the DB.  Do not remove, or
93         # replace with another operations that also commits all pending ops, such
94         # as session.commit() or flush() or something
95         print HistoryPCURecord.query.count()
96
97         return True
98
99 if __name__ == '__main__':
100         parser = parsermodule.getParser()
101         parser.set_defaults(filename=None, pcu=None, pcuselect=False, pcugroup=None, cachepcus=False)
102         parser.add_option("", "--pcu", dest="pcu", metavar="hostname", 
103                                                 help="Provide a single pcu to operate on")
104         parser.add_option("", "--pculist", dest="pculist", metavar="file.list", 
105                                                 help="Provide a list of files to operate on")
106
107         config = parsermodule.parse_args(parser)
108
109         try:
110                 main(config)
111         except Exception, err:
112                 import traceback
113                 print traceback.print_exc()
114                 print "Exception: %s" % err
115                 sys.exit(0)