+ if 'hostname' in data:
+ hostname = data['hostname']
+ else:
+ flash("No hostname given in submitted data")
+ return
+
+ if 'submit' in data or 'type' in data:
+ try:
+ action = data['submit']
+ except:
+ action = data['type']
+ else:
+ flash("No submit action given in submitted data")
+ return
+
+ if action == "Reboot":
+ print "REBOOT: %s" % hostname
+ ret = reboot.reboot_str(str(hostname))
+ print ret
+ if ret: raise RuntimeError("Error using PCU: " + str(ret))
+ flash("Reboot appeared to work. Allow at most 5 minutes. Then run ExternalScan to check current status.")
+
+ elif action == "ExternalScan":
+ scanapi.externalprobe(str(hostname))
+ flash("External Scan Successful!")
+ elif action == "InternalScan":
+ scanapi.internalprobe(str(hostname))
+ flash("Internal Scan Successful!")
+ else:
+ # unknown action
+ raise RuntimeError("Unknown action given")
+ return
+
+ @expose(template="monitorweb.templates.simpleview")
+ def simpleview(self, **data):
+ return self.pre_view(**data)
+
+ @expose(template="monitorweb.templates.simpleview")
+ def pcuview(self, **data):
+ return self.pre_view(**data)
+
+ @expose(template="monitorweb.templates.detailview")
+ def detailview(self, **data):
+ return self.pre_view(**data)
+
+
+ def pre_view(self, **data):
+ session_clear_all()
+
+ loginbase=None
+ loginbase_list=[]
+ hostname=None
+ pcuid=None
+ since=20
+ # if objtype is not None, then treat 'hostname' or 'loginbase' as a search pattern
+ objtype=None
+
+ exceptions = None
+ sitequery=[]
+ nodequery=[]
+ pcuquery=[]
+ actions=[]
+ actions_list=[]
+
+ for key in data:
+ print key, data[key]
+
+ if 'query' in data:
+ obj = data['query']
+ fields = obj.split(":")
+ if len(fields) > 1:
+ objtype = fields[0]
+ obj = fields[1].replace("*", "%")
+ print "obj: %s"% obj
+
+ if len(obj.split(".")) > 1 or objtype == "node":
+ hostname = obj
+ else:
+ loginbase = obj
+
+ if 'loginbase' in data:
+ loginbase = data['loginbase']
+
+ if 'hostname' in data:
+ hostname = data['hostname']
+
+ if 'pcuid' in data:
+ try: pcuid = int(data['pcuid'])
+ except: pcuid = None
+
+ if 'since' in data:
+ try: since = int(since)
+ except: since = 20
+
+ if pcuid:
+ print "pcuid: %s" % pcuid
+ pcu = FindbadPCURecord.get_latest_by(plc_pcuid=pcuid)
+ loginbase_list += [ PlcSite.query.get(pcu.plc_pcu_stats['site_id']).plc_site_stats['login_base'] ]
+
+ if hostname:
+ if not objtype:
+ nodes = [ FindbadNodeRecord.get_latest_by(hostname=hostname) ]
+ else:
+ nodes = FindbadNodeRecord.query.filter(FindbadNodeRecord.hostname.like(hostname))
+
+ for node in nodes:
+ lb = PlcSite.query.get(node.plc_node_stats['site_id']).plc_site_stats['login_base']
+ if lb not in loginbase_list:
+ loginbase_list += [ lb ]
+
+ if loginbase:
+ if not objtype:
+ loginbase_list = [ loginbase ]
+ else:
+ loginbase_list = HistorySiteRecord.query.filter(HistorySiteRecord.loginbase.like(loginbase))
+ loginbase_list = [ l.loginbase for l in loginbase_list ]
+
+
+ if loginbase_list:
+ for loginbase in loginbase_list:
+ actions = ActionRecord.query.filter_by(loginbase=loginbase
+ ).filter(ActionRecord.date_created >= datetime.now() - timedelta(since)
+ ).order_by(ActionRecord.date_created.desc())
+ actions_list += [ a for a in actions ]
+ site = HistorySiteRecord.by_loginbase(loginbase)
+ if site:
+ sitequery.append(site)
+ # NOTE: because a single pcu may be assigned to multiple hosts,
+ # track unique pcus by their plc_pcuid, then turn dict into list
+ pcus = {}
+ for node in FindbadNodeRecord.query.filter_by(loginbase=loginbase):
+ # NOTE: reformat some fields.
+ agg = prep_node_for_display(node)
+ nodequery += [agg]
+ if agg.pcu:
+ pcus[agg.pcu.pcu.plc_pcuid] = agg.pcu
+
+ for pcuid_key in pcus:
+ pcuquery += [pcus[pcuid_key]]
+
+ actionlist_widget = ActionListWidget(template='monitorweb.templates.actionlist_template')
+ return dict(sitequery=sitequery, pcuquery=pcuquery, nodequery=nodequery, actions=actions_list, actionlist_widget=actionlist_widget, since=since, exceptions=exceptions)
+
+
+ # TODO: add form validation
+ @expose(template="monitorweb.templates.pcuview")
+ @exception_handler(nodeaction_handler,"isinstance(tg_exceptions,RuntimeError)")
+ def pcuviewold(self, loginbase=None, pcuid=None, hostname=None, since=20, **data):
+ session_clear_all()
+ sitequery=[]
+ pcuquery=[]
+ nodequery=[]
+ actions=[]
+ exceptions = None
+
+ try: since = int(since)
+ except: since = 7
+
+ for key in data:
+ print key, data[key]
+
+ if 'submit' in data.keys() or 'type' in data.keys():
+ if hostname: data['hostname'] = hostname
+ self.nodeaction(**data)
+ if 'exceptions' in data:
+ exceptions = data['exceptions']
+
+ if 'query' in data:
+ obj = data['query']
+ if len(obj.split(".")) > 1: hostname = obj
+ else: loginbase=obj
+
+ if pcuid:
+ print "pcuid: %s" % pcuid
+ pcu = FindbadPCURecord.get_latest_by(plc_pcuid=pcuid)
+ loginbase = PlcSite.query.get(pcu.plc_pcu_stats['site_id']).plc_site_stats['login_base']
+
+ if hostname:
+ node = FindbadNodeRecord.get_latest_by(hostname=hostname)
+ loginbase = PlcSite.query.get(node.plc_node_stats['site_id']).plc_site_stats['login_base']
+
+ if loginbase:
+ actions = ActionRecord.query.filter_by(loginbase=loginbase
+ ).filter(ActionRecord.date_created >= datetime.now() - timedelta(since)
+ ).order_by(ActionRecord.date_created.desc())
+ actions = [ a for a in actions ]
+ sitequery = [HistorySiteRecord.by_loginbase(loginbase)]
+ pcus = {}
+ for node in FindbadNodeRecord.query.filter_by(loginbase=loginbase):
+ # NOTE: reformat some fields.
+ agg = prep_node_for_display(node)
+ nodequery += [agg]
+ if agg.pcu: #.pcu.plc_pcuid: # not None
+ #pcu = FindbadPCURecord.get_latest_by(plc_pcuid=agg.plc_pcuid)
+ #prep_pcu_for_display(pcu)
+ pcus[agg.pcu.pcu.plc_pcuid] = agg.pcu
+
+ for pcuid_key in pcus:
+ pcuquery += [pcus[pcuid_key]]
+
+ return dict(sitequery=sitequery, pcuquery=pcuquery, nodequery=nodequery, actions=actions, since=since, exceptions=exceptions)
+
+ @expose(template="monitorweb.templates.pcuhistory")
+ def pcuhistory(self, pcu_id=None):
+ query = []
+ if pcu_id:
+ fbnode = HistoryPCURecord.get_by(plc_pcuid=pcu_id)
+ l = fbnode.versions[-1000:]
+ l.reverse()
+ for pcu in l:
+ #prep_node_for_display(node)
+ query.append(pcu)
+
+ return dict(query=query, pcu_id=pcu_id)
+
+ @expose(template="monitorweb.templates.nodescanhistory")
+ def nodescanhistory(self, hostname=None, length=10):
+ try: length = int(length)
+ except: length = 21
+
+ fbnode = FindbadNodeRecord.get_by(hostname=hostname)
+ # TODO: add links for earlier history if desired.
+ l = fbnode.versions[-length:]
+ l.reverse()
+ query=[]
+ for node in l:
+ agg = prep_node_for_display(node, pcuhash=None, preppcu=False, asofdate=node.timestamp)
+ query.append(agg)
+
+ if 'length' in request.params:
+ del request.params['length']
+ return dict(query=query, hostname=hostname, params=request.params)
+
+ @expose(template="monitorweb.templates.nodehistory")
+ def nodehistory(self, hostname=None):
+ query = []
+ if hostname:
+ fbnode = HistoryNodeRecord.get_by(hostname=hostname)
+ l = fbnode.versions[-100:]
+ l.reverse()
+ for node in l:
+ #prep_node_for_display(node)
+ query.append(node)
+
+ return dict(query=query, hostname=hostname)
+
+ @expose(template="monitorweb.templates.sitehistory")
+ def sitehistory(self, loginbase=None):
+ query = []
+ if loginbase:
+ fbsite = HistorySiteRecord.get_by(loginbase=loginbase)
+ # TODO: add links for earlier history if desired.
+ l = fbsite.versions[-1000:]
+ l.reverse()
+ for site in l:
+ query.append(site)
+ return dict(query=query, loginbase=loginbase)
+
+
+ @expose("cheetah:monitorweb.templates.pculist_plain", as_format="plain",
+ accept_format="text/plain", content_type="text/plain")