11 from datetime import datetime,timedelta
16 from monitor import config
17 from monitor.database.info.model import FindbadPCURecord, session
18 from monitor import database
19 from monitor import util
20 from monitor.wrapper import plc, plccache
21 from nodequery import pcu_select
22 from monitor.common import nmap_port_status
23 from monitor.scanapi import *
25 plc_lock = threading.Lock()
30 # this will be called when an exception occurs within a thread
31 def handle_exception(request, result):
32 print "Exception occured in request %s" % request.requestID
34 print "Result: %s" % i
36 def checkPCUs(l_pcus, cohash):
40 tp = threadpool.ThreadPool(10)
41 scanpcu = ScanPCU(global_round)
43 # CREATE all the work requests
44 for pcuname in l_pcus:
46 #fbnodesync = FindbadPCURecordSync.findby_or_create(plc_pcuid=pcu_id, if_new_set={'round' : 0})
49 #node_round = fbnodesync.round
50 node_round = global_round - 1
51 if node_round < global_round or config.force:
52 # recreate node stats when refreshed
53 #print "%s" % nodename
54 req = threadpool.WorkRequest(scanpcu.collectInternal, [int(pcuname), cohash], {},
55 None, scanpcu.record, handle_exception)
58 # We just skip it, since it's "up to date"
60 print "%d %s %s" % (count, pcu_id, node_round)
62 # WAIT while all the work requests are processed.
68 # if more than two hours
69 if time.time() - begin > (60*60*1):
70 print "findbadpcus.py has run out of time!!!!!!"
72 except KeyboardInterrupt:
75 except threadpool.NoResultsPending:
76 print "All results collected."
79 #print FindbadPCURecordSync.query.count()
80 print FindbadPCURecord.query.count()
87 l_pcus = plccache.l_pcus
90 #fbsync = FindbadPCURecordSync.findby_or_create(plc_pcuid=0,
91 #if_new_set={'round' : global_round})
93 #global_round = fbsync.round
94 api = plc.getAuthAPI()
96 if config.site is not None:
97 site = plccache.GetSitesByName([config.site])
98 l_nodes = plccache.GetNodesByIds(site[0]['node_ids'])
101 pcus += node['pcu_ids']
103 l_pcus = [pcu for pcu in sets.Set(pcus)]
105 elif config.node is not None:
106 node = plccache.GetNodeByName(config.node)
108 pcus = node['pcu_ids']
110 l_pcus = [pcu for pcu in sets.Set(pcus)]
112 elif config.sitelist:
113 site_list = config.sitelist.split(',')
115 sites = plccache.GetSitesByName(site_list)
118 node_ids += s['node_ids']
120 l_nodes = plccache.GetNodeByIds(node_ids)
123 pcus += node['pcu_ids']
125 l_pcus = [pcu for pcu in sets.Set(pcus)]
127 elif config.pcuselect is not None:
128 n, pcus = pcu_select(config.pcuselect)
131 l_pcus = [pcu for pcu in sets.Set(pcus)]
133 elif config.nodelist == None and config.pcuid == None:
134 print "Calling API GetPCUs() : cachecalls(%s)" % config.cachecalls
135 l_pcus = [pcu['pcu_id'] for pcu in l_pcus]
136 elif config.nodelist is not None:
137 l_pcus = util.file.getListFromFile(config.nodelist)
138 l_pcus = [int(pcu) for pcu in l_pcus]
139 elif config.pcuid is not None:
140 l_pcus = [ config.pcuid ]
141 l_pcus = [int(pcu) for pcu in l_pcus]
144 # update global round number to force refreshes across all nodes
147 checkPCUs(l_pcus, cohash)
150 # update global round number to force refreshes across all nodes
151 #fbsync.round = global_round
159 if __name__ == '__main__':
161 logger = logging.getLogger("monitor")
162 logger.setLevel(logging.DEBUG)
163 fh = logging.FileHandler("monitor.log", mode = 'a')
164 fh.setLevel(logging.DEBUG)
165 formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
166 fh.setFormatter(formatter)
167 logger.addHandler(fh)
168 from monitor import parser as parsermodule
169 parser = parsermodule.getParser()
170 parser.set_defaults(nodelist=None,
177 dbname="findbadpcus",
182 parser.add_option("-f", "--nodelist", dest="nodelist", metavar="FILE",
183 help="Provide the input file for the node list")
184 parser.add_option("", "--node", dest="node", metavar="FILE",
185 help="Get all pcus associated with the given node")
186 parser.add_option("", "--site", dest="site", metavar="FILE",
187 help="Get all pcus associated with the given site's nodes")
188 parser.add_option("", "--sitelist", dest="sitelist", metavar="FILE",
189 help="Get all pcus associated with the given site's nodes")
190 parser.add_option("", "--pcuselect", dest="pcuselect", metavar="FILE",
191 help="Query string to apply to the findbad pcus")
192 parser.add_option("", "--pcuid", dest="pcuid", metavar="id",
193 help="Provide the id for a single pcu")
195 parser.add_option("", "--cachenodes", action="store_true",
196 help="Cache node lookup from PLC")
197 parser.add_option("", "--dbname", dest="dbname", metavar="FILE",
198 help="Specify the name of the database to which the information is saved")
199 parser.add_option("", "--nocachecalls", action="store_false", dest="cachecalls",
200 help="Refresh the cached values")
201 parser.add_option("-i", "--increment", action="store_true", dest="increment",
202 help="Increment round number to force refresh or retry")
203 parser.add_option("", "--force", action="store_true", dest="force",
204 help="Force probe without incrementing global 'round'.")
205 parser = parsermodule.getParser(['defaults'], parser)
206 config = parsermodule.parse_args(parser)
207 if hasattr(config, 'cachecalls') and not config.cachecalls:
208 # NOTE: if explicilty asked, refresh cached values.
209 print "Reloading PLCCache"
212 # NOTE: evidently, there is a bizarre interaction between iLO and ssh
213 # when LANG is set... Do not know why. Unsetting LANG, fixes the problem.
214 if 'LANG' in os.environ:
215 del os.environ['LANG']
218 except Exception, err:
219 traceback.print_exc()
220 from monitor.common import email_exception
222 print "Exception: %s" % err
223 print "Saving data... exitting."