8 from datetime import datetime,timedelta
10 from monitor import database
11 from monitor import reboot
12 from monitor import parser as parsermodule
13 from monitor import config
14 from monitor.database.info.model import HistoryPCURecord, FindbadPCURecord
15 from monitor.database.dborm import mon_session as session
16 from monitor.wrapper import plc,plccache
17 from monitor.const import MINUP
19 from monitor.common import *
20 from monitor.query import verify,query_to_dict,node_select
21 from monitor.model import *
23 api = plc.getAuthAPI()
30 l_plcpcus = plccache.l_pcus
33 if config.site is not None:
34 site = plccache.GetSitesByName([config.site])
35 l_nodes = plccache.GetNodesByIds(site[0]['node_ids'])
38 pcus += node['pcu_ids']
40 l_pcus = [pcu for pcu in sets.Set(pcus)]
43 node = plccache.GetNodeByName(config.node)
44 pcus = node['pcu_ids']
46 l_pcus = [pcu for pcu in sets.Set(pcus)]
50 if ( pcu['hostname'] is not None and config.pcu in pcu['hostname'] ) or \
51 ( pcu['ip'] is not None and config.pcu in pcu['ip'] ):
52 l_pcus = [pcu['pcu_id']]
54 print "ERROR: could not find pcu %s" % config.pcu
57 l_pcus = [pcu['pcu_id'] for pcu in l_plcpcus]
59 checkAndRecordState(l_pcus, l_plcpcus)
61 hn2lb = plccache.plcdb_hn2lb
63 def check_pcu_state(rec, pcu):
65 pcu_state = rec.reboot_trial_status
67 good_list = [0, "0", "Test: No error"]
70 if pcu_state not in good_list and pcu.status not in ['offline', 'down']:
71 print "changed status from %s to offline" % pcu.status
72 pcu.status = 'offline'
73 pcu.last_changed = datetime.now()
76 if pcu_state in good_list and pcu.status not in [ 'online', 'good' ]:
77 print "changed status from %s to online" % pcu.status
79 pcu.last_changed = datetime.now()
83 if pcu.status == 'online' and changed_greaterthan(pcu.last_changed, 0.5):
84 #send thank you notice, or on-line notice.
85 print "changed status from %s to good" % pcu.status
87 # NOTE: do not reset last_changed, or you lose how long it's been up.
89 if pcu.status == 'offline' and changed_greaterthan(pcu.last_changed, 2):
90 # send down pcu notice
91 print "changed status from %s to down" % pcu.status
94 # if pcu.status in [ 'offline', 'down' ] and changed_greaterthan(pcu.last_changed, 2*30):
95 # print "changed status from %s to down" % pcu.status
97 # pcu.last_changed = datetime.now()
99 def checkAndRecordState(l_pcus, l_plcpcus):
101 for pcuname in l_pcus:
104 for pcu in l_plcpcus:
105 if pcu['pcu_id'] == pcuname:
111 pcuhist = HistoryPCURecord.findby_or_create(plc_pcuid=d_pcu['pcu_id'],
112 if_new_set={'status' : 'offline',
113 'last_changed' : datetime.now()})
114 pcuhist.last_checked = datetime.now()
117 # Find the most recent record
118 pcurec = FindbadPCURecord.query.filter(FindbadPCURecord.plc_pcuid==pcuname).first()
120 print "COULD NOT FIND FB record for %s" % reboot.pcu_name(d_pcu)
123 print traceback.print_exc()
124 # don't have the info to create a new entry right now, so continue.
128 print "none object for pcu %s"% reboot.pcu_name(d_pcu)
131 check_pcu_state(pcurec, pcuhist)
134 print "%d %35s %s since(%s)" % (count, reboot.pcu_name(d_pcu), pcuhist.status, diff_time(time.mktime(pcuhist.last_changed.timetuple())))
136 # NOTE: this commits all pending operations to the DB. Do not remove, or
137 # replace with another operations that also commits all pending ops, such
138 # as session.commit() or flush() or something
140 print HistoryPCURecord.query.count()
144 if __name__ == '__main__':
145 parser = parsermodule.getParser()
146 parser.set_defaults(filename=None, pcu=None, node=None, site=None, pcuselect=False, pcugroup=None, cachepcus=False)
147 parser.add_option("", "--pcu", dest="pcu", metavar="hostname",
148 help="Provide a single pcu to operate on")
149 parser.add_option("", "--site", dest="site", metavar="sitename",
150 help="Provide a single sitename to operate on")
151 parser.add_option("", "--node", dest="node", metavar="nodename",
152 help="Provide a single node to operate on")
153 parser.add_option("", "--pculist", dest="pculist", metavar="file.list",
154 help="Provide a list of files to operate on")
156 config = parsermodule.parse_args(parser)
160 except Exception, err:
162 traceback.print_exc()
163 print "Exception: %s" % err