X-Git-Url: http://git.onelab.eu/?p=monitor.git;a=blobdiff_plain;f=web%2FMonitorWeb%2Fmonitorweb%2Fmonitor_xmlrpc.py;h=7d04c48538f8b213f59c3a10b882b4b5666e4f86;hp=ce1f26cf98666457610c650bd47a66713c84ca29;hb=bd5fd5bfc5e998b3ac022c8cd6c5f14fef83207d;hpb=7f16b4c8e96688b16152b62ec1012ab5bf29d95d diff --git a/web/MonitorWeb/monitorweb/monitor_xmlrpc.py b/web/MonitorWeb/monitorweb/monitor_xmlrpc.py index ce1f26c..7d04c48 100644 --- a/web/MonitorWeb/monitorweb/monitor_xmlrpc.py +++ b/web/MonitorWeb/monitorweb/monitor_xmlrpc.py @@ -4,6 +4,7 @@ import cherrypy import turbogears from datetime import datetime, timedelta import time +from monitor.wrapper import plc try: from monitor.database.info.model import * @@ -97,7 +98,10 @@ class MonitorXmlrpcServer(object): if method is None or not getattr(method, "exposed", False): raise AssertionError("method does not exist") - session.clear() + try: + session.expunge_all() + except AttributeError: # SQLAlchemy < 0.5.1 + session.clear() # Call the method, convert it into a 1-element tuple # as expected by dumps response = method(*params) @@ -121,15 +125,70 @@ class MonitorXmlrpcServer(object): @cherrypy.expose @export_to_docbook(roles=['tech', 'user', 'pi', 'admin'], accepts=[], - returns=Parameter(bool, 'True is successful')) - def upAndRunning(self): - """ This is a test """ + returns=Parameter(bool, 'True if successful')) + def upAndRunning(self,noop=None): + """ This call can indicate to a script whether the server is up + and running before trying any more sophisticated operations. """ return True + # BOOTMAN SEQUENCE ------------------------------------------------------------ + + @cherrypy.expose + @export_to_docbook(roles=['admin'], + accepts=[Parameter(dict, "Auth struct"), + Parameter(str, "The bootman sequence returned by MyOps"), + Parameter(str, "The action string that identifies what to do when this sequence occurs")], + returns=Parameter(bool, 'True on success.')) + def setBootmanSequence(self, auth, sequence, action): + """ Using this call, you can set a new sequence to identify an Unknown + Error sqeuence returned by MyOps and associate it with a pre-defined + action, (i.e. reboot, reinstall, or others). Please see the + documentation for automated actions to see a list of supported + actions. """ + api = plc.getAuthAPI() + api.auth = auth + if api.AuthCheck(): + bms = BootmanSequenceRecord.get_by(sequence=sequence) + if not bms: + bms = BootmanSequenceRecord(sequence=sequence, action=action) + else: + bms.action = action + + bms.flush() + return True + else: + return False + + @cherrypy.expose + @export_to_docbook(roles=['admin'], + accepts=[Parameter(dict, "Auth struct")], + returns=Parameter(list, 'Array of bootman sequences')) + def getBootmanSequences(self, auth): + """ Using this call, you can learn all currently defined bootman + sequences and their associated actions. """ + api = plc.getAuthAPI() + api.auth = auth + if api.AuthCheck(): + ret_list = [] + bms = BootmanSequenceRecord.query.all() + for q in bms: + d = q.to_dict() + d = convert_datetime(d, ['date_created']) + ret_list.append(d) + return ret_list + else: + return [] + # SITES ------------------------------------------------------------ @cherrypy.expose + @export_to_docbook(roles=['tech', 'user', 'pi', 'admin'], + accepts=[Parameter(dict, "Auth struct")], + returns=Parameter(list, 'array of SiteStatus records')) def getSiteStatus(self, auth): + """ This call returns a list that includes the status and observations + of all sites, including those blacklisted. At this time, there is no + indication which sites are blacklisted from this list. """ ret_list = [] sites = HistorySiteRecord.query.all() for q in sites: @@ -139,7 +198,12 @@ class MonitorXmlrpcServer(object): return ret_list @cherrypy.expose + @export_to_docbook(roles=['admin'], + accepts=[Parameter(dict, "Auth struct")], + returns=Parameter(bool, 'True on success.')) def clearSitePenalty(self, auth, loginbase): + """ Rather than waiting for monitor to run automatically, this call + will manually clear a site's penalties. """ sitehist = SiteInterface.get_or_make(loginbase=loginbase) sitehist.clearPenalty() #sitehist.applyPenalty() @@ -148,7 +212,12 @@ class MonitorXmlrpcServer(object): return True @cherrypy.expose + @export_to_docbook(roles=['admin'], + accepts=[Parameter(dict, "Auth struct")], + returns=Parameter(bool, 'True on success.')) def increaseSitePenalty(self, auth, loginbase): + """ Rather than waiting for monitor to run automatically, this call + will manually increase a site's penalties.""" sitehist = SiteInterface.get_or_make(loginbase=loginbase) sitehist.increasePenalty() #sitehist.applyPenalty() @@ -158,7 +227,13 @@ class MonitorXmlrpcServer(object): # NODES ------------------------------------------------------------ @cherrypy.expose + @export_to_docbook(roles=['tech', 'user', 'pi', 'admin'], + accepts=[Parameter(dict, "Auth struct")], + returns=Parameter(list, 'array of NodeStatus records.')) def getNodeStatus(self, auth): + """ This call returns a list of all nodes, including those + blacklisted. The current observation and recorded status of each node + is returned.""" ret_list = [] sites = HistoryNodeRecord.query.all() for q in sites: @@ -168,14 +243,28 @@ class MonitorXmlrpcServer(object): return ret_list @cherrypy.expose + @export_to_docbook(roles=['tech', 'user', 'pi', 'admin'], + accepts=[Parameter(dict, "Auth struct")], + returns=Parameter(bool, 'True on success.')) def getRecentActions(self, auth, loginbase=None, hostname=None): + """ Monitor takes various actions on sites (such as applying + penalties) and nodes (such as repairing a node installation via + BootManager). As well, it makes a log of every email message sent + out, or believed to be sent. This call returns a list of all actions, + filtered on site or for a specific node. """ ret_list = [] return ret_list # BLACKLIST ------------------------------------------------------------ @cherrypy.expose + @export_to_docbook(roles=['tech', 'user', 'pi', 'admin'], + accepts=[Parameter(dict, "Auth struct")], + returns=Parameter(bool, 'True on success.')) def getBlacklist(self, auth): + """ Return a list of all nodes and sites that are excluded from + penalties. Currently there is no way to exclude a node or site + from being monitored. """ bl = BlacklistRecord.query.all() ret_list = [] for q in bl: @@ -184,20 +273,37 @@ class MonitorXmlrpcServer(object): ret_list.append(d) return ret_list - # datetime.datetime.fromtimestamp(time.mktime(time.strptime(mytime, time_format))) @cherrypy.expose + @export_to_docbook(roles=['admin'], + accepts=[Parameter(dict, "Auth struct"), + Parameter(str, "hostname"), + Parameter(int, "expires number of seconds from time.now()")], + returns=Parameter(bool, 'True on success.')) def addHostToBlacklist(self, auth, hostname, expires=0): + """ Add a host to the blacklist, with an optional expiration time""" bl = BlacklistRecord.findby_or_create(hostname=hostname, expires=expires) return True @cherrypy.expose + @export_to_docbook(roles=['admin'], + accepts=[Parameter(dict, "Auth struct"), + Parameter(str, "loginbase"), + Parameter(int, "expires number of seconds from time.now()")], + returns=Parameter(bool, 'True on success.')) def addSiteToBlacklist(self, auth, loginbase, expires=0): + """ Add a site to the blacklist, with an optional expiration time""" bl = BlacklistRecord.findby_or_create(hostname=hostname, expires=expires) return True @cherrypy.expose + @export_to_docbook(roles=['admin'], + accepts=[Parameter(dict, "Auth struct"), + Parameter(str, "loginbase"), + Parameter(str, "hostname"),], + returns=Parameter(bool, 'True on success.')) def deleteFromBlacklist(self, auth, loginbase=None, hostname=None): + """ Remove a host or site from the blacklist """ if (loginbase==None and hostname == None) or (loginbase != None and hostname != None): raise Exception("Please specify a single record to delete: either hostname or loginbase") elif loginbase != None: