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 nodequery 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 l_nodes = plccache.GetNodeByName(config.node)
46 pcus += node['pcu_ids']
48 l_pcus = [pcu for pcu in sets.Set(pcus)]
52 if ( pcu['hostname'] is not None and config.pcu in pcu['hostname'] ) or \
53 ( pcu['ip'] is not None and config.pcu in pcu['ip'] ):
54 l_pcus = [pcu['pcu_id']]
56 print "ERROR: could not find pcu %s" % config.pcu
59 l_pcus = [pcu['pcu_id'] for pcu in l_plcpcus]
61 checkAndRecordState(l_pcus, l_plcpcus)
63 hn2lb = plccache.plcdb_hn2lb
65 def check_pcu_state(rec, pcu):
67 pcu_state = rec.reboot_trial_status
69 if ( pcu_state == 'NetDown' or pcu_state == 'Not_Run' or not ( pcu_state == 0 or pcu_state == "0" ) ) and \
70 ( pcu.status == 'online' or pcu.status == 'good' ):
71 print "changed status from %s to offline" % pcu.status
72 pcu.status = 'offline'
73 pcu.last_changed = datetime.now()
75 if ( pcu_state == 0 or pcu_state == "0" ) and pcu.status not in [ 'online', 'good' ]:
76 print "changed status from %s to online" % pcu.status
78 pcu.last_changed = datetime.now()
80 if pcu.status == 'online' and changed_greaterthan(pcu.last_changed, 0.5):
81 #send thank you notice, or on-line notice.
82 print "changed status from %s to good" % pcu.status
84 # NOTE: do not reset last_changed, or you lose how long it's been up.
86 if pcu.status == 'offline' and changed_greaterthan(pcu.last_changed, 2):
87 # send down pcu notice
88 print "changed status from %s to down" % pcu.status
90 pcu.last_changed = datetime.now()
92 if ( pcu.status == 'offline' or pcu.status == '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)
120 print traceback.print_exc()
121 # don't have the info to create a new entry right now, so continue.
125 print "none object for pcu %s"% reboot.pcu_name(d_pcu)
128 check_pcu_state(pcurec, pcuhist)
131 print "%d %35s %s since(%s)" % (count, reboot.pcu_name(d_pcu), pcuhist.status, diff_time(time.mktime(pcuhist.last_changed.timetuple())))
133 # NOTE: this commits all pending operations to the DB. Do not remove, or
134 # replace with another operations that also commits all pending ops, such
135 # as session.commit() or flush() or something
137 print HistoryPCURecord.query.count()
141 if __name__ == '__main__':
142 parser = parsermodule.getParser()
143 parser.set_defaults(filename=None, pcu=None, node=None, site=None, pcuselect=False, pcugroup=None, cachepcus=False)
144 parser.add_option("", "--pcu", dest="pcu", metavar="hostname",
145 help="Provide a single pcu to operate on")
146 parser.add_option("", "--site", dest="site", metavar="sitename",
147 help="Provide a single sitename to operate on")
148 parser.add_option("", "--node", dest="node", metavar="nodename",
149 help="Provide a single node to operate on")
150 parser.add_option("", "--pculist", dest="pculist", metavar="file.list",
151 help="Provide a list of files to operate on")
153 config = parsermodule.parse_args(parser)
157 except Exception, err:
159 traceback.print_exc()
160 print "Exception: %s" % err