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
68 if pcu_state not in [0, "0"] and pcu.status not in ['offline', 'down']:
69 print "changed status from %s to offline" % pcu.status
70 pcu.status = 'offline'
71 pcu.last_changed = datetime.now()
74 if pcu_state in [0, "0"] and pcu.status not in [ 'online', 'good' ]:
75 print "changed status from %s to online" % pcu.status
77 pcu.last_changed = datetime.now()
81 if pcu.status == 'online' and changed_greaterthan(pcu.last_changed, 0.5):
82 #send thank you notice, or on-line notice.
83 print "changed status from %s to good" % pcu.status
85 # NOTE: do not reset last_changed, or you lose how long it's been up.
87 if pcu.status == 'offline' and changed_greaterthan(pcu.last_changed, 2):
88 # send down pcu notice
89 print "changed status from %s to down" % pcu.status
92 # if pcu.status in [ 'offline', 'down' ] and changed_greaterthan(pcu.last_changed, 2*30):
93 # print "changed status from %s to down" % pcu.status
95 # pcu.last_changed = datetime.now()
97 def checkAndRecordState(l_pcus, l_plcpcus):
99 for pcuname in l_pcus:
102 for pcu in l_plcpcus:
103 if pcu['pcu_id'] == pcuname:
109 pcuhist = HistoryPCURecord.findby_or_create(plc_pcuid=d_pcu['pcu_id'],
110 if_new_set={'status' : 'offline',
111 'last_changed' : datetime.now()})
112 pcuhist.last_checked = datetime.now()
115 # Find the most recent record
116 pcurec = FindbadPCURecord.query.filter(FindbadPCURecord.plc_pcuid==pcuname).first()
118 print "COULD NOT FIND FB record for %s" % reboot.pcu_name(d_pcu)
121 print traceback.print_exc()
122 # don't have the info to create a new entry right now, so continue.
126 print "none object for pcu %s"% reboot.pcu_name(d_pcu)
129 check_pcu_state(pcurec, pcuhist)
132 print "%d %35s %s since(%s)" % (count, reboot.pcu_name(d_pcu), pcuhist.status, diff_time(time.mktime(pcuhist.last_changed.timetuple())))
134 # NOTE: this commits all pending operations to the DB. Do not remove, or
135 # replace with another operations that also commits all pending ops, such
136 # as session.commit() or flush() or something
138 print HistoryPCURecord.query.count()
142 if __name__ == '__main__':
143 parser = parsermodule.getParser()
144 parser.set_defaults(filename=None, pcu=None, node=None, site=None, pcuselect=False, pcugroup=None, cachepcus=False)
145 parser.add_option("", "--pcu", dest="pcu", metavar="hostname",
146 help="Provide a single pcu to operate on")
147 parser.add_option("", "--site", dest="site", metavar="sitename",
148 help="Provide a single sitename to operate on")
149 parser.add_option("", "--node", dest="node", metavar="nodename",
150 help="Provide a single node to operate on")
151 parser.add_option("", "--pculist", dest="pculist", metavar="file.list",
152 help="Provide a list of files to operate on")
154 config = parsermodule.parse_args(parser)
158 except Exception, err:
160 traceback.print_exc()
161 print "Exception: %s" % err