Fix for session.clear for newer versions of SQLAlchemy.
[monitor.git] / web / MonitorWeb / monitorweb / monitor_xmlrpc.py
index 78692ff..7d04c48 100644 (file)
@@ -4,9 +4,13 @@ import cherrypy
 import turbogears
 from datetime import datetime, timedelta
 import time
+from monitor.wrapper import plc
 
-from monitor.database.info.model import *
-from monitor.database.info.interface import *
+try:
+       from monitor.database.info.model import *
+       from monitor.database.info.interface import *
+except:
+       pass
 
 try:
     from PLC.Parameter import Parameter, Mixed
@@ -94,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)
@@ -118,14 +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):
+                                          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:
@@ -135,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()
@@ -144,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()
@@ -154,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:
@@ -164,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:
@@ -180,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: