--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/iro/newinterface.py Sun Dec 18 16:43:22 2011 +0100
@@ -0,0 +1,205 @@
+# -*- coding: utf-8 -*-
+#Copyright (C) 2009 Sandro Knauß <bugs@sandroknauss.de>
+
+#This program is free software; you can redistribute it and/or modify it under the terms
+#of the GNU General Public License as published by the Free Software Foundation;
+#either version 3 of the License, or any later version.
+#This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+#without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+#See the GNU General Public License for more details.
+
+#You should have received a copy of the GNU General Public License
+#along with this program; if not, see <http://www.gnu.org/licenses/>.
+from twisted.web import soap, xmlrpc, resource, server
+import logging
+logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(name)s(%(processName)s)-%(levelname)s: %(message)s')
+
+class Interface(object):
+ '''class for a xmlrpc user
+ '''
+
+ def status(self, apikey, id=None, detailed=False):
+ '''Gibt den aktuellen Status eines Auftrages zurück.
+
+ Keywords:
+ apikey[string]: Der API Key
+ id[hash]: Eine Auftragsnummer
+ detailed[boolean]: Details ausgeben
+
+ Return:
+ jobs[list]: Eine Liste der Aufträge.
+ job.name[string]: Angebener Name
+ job.status[string]: Status des Auftrages
+
+
+ '''
+ return ""
+
+ def stop(self, apikey,id):
+ '''Stoppt den angegeben Auftrag.
+
+ Keywords:
+ apikey[string]: Der API Key
+ id[hash]: Eine Auftragsnummer
+
+ Return:
+
+ '''
+ return ""
+
+ def sms(self, apikey, message, recipients, route="default"):
+ '''Versendet eine SMS.
+
+ Keywords:
+ apikey[string]: Der API Key
+ message[string]: Nachricht
+ recipients[list]: eine Liste von Emfänger-Nummern (gemäß ITU-T E.123)
+ route[string|list]: Route über den geschickt werden soll,
+ oder eine Liste von Routen, um Fallbacks anzugeben
+
+ Return:
+ id[hash]: Die ID des Auftrages
+
+ '''
+ return ""
+
+
+ def fax(self, apikey, subject, fax, recipients, route="default"):
+ '''Versendet ein FAX.
+
+ Keywords:
+ apikey[string]: Der API Key
+ subject[string]: Der Betreff
+ fax[string]: Das PDF base64 kodiert
+ recipients[list]: Eine Liste von Emfänger-Nummern (gemäß ITU-T E.123)
+ route[string|list]: Route über den geschickt werden soll,
+ oder eine Liste von Routen, um Fallbacks anzugeben
+
+ Return:
+ id[hash]: Die ID des Auftrages
+
+ '''
+ return ""
+
+ def mail(self, apikey, subject, body, recipients, frm, route="default"):
+ '''Versendet eine Email.
+
+ Keywords:
+ apikey[string]: Der API Key
+ subject[string]: Der Betreff
+ body[string]: Der Email Body
+ recipients[list]: Eine Liste von Emailadressen
+ frm[string]: Die Absender Emailadresse
+ route[string|list]: Route über den geschickt werden soll,
+ oder eine Liste von Routen, um Fallbacks anzugeben
+
+ Return:
+ id[hash]: Die ID des Auftrages
+
+ '''
+ return ""
+
+ def routes(self, apikey, typ):
+ '''Gibt eine Liste aller verfügbaren Provider zurück.
+
+ Keywords:
+ apikey[string]: Der API Key
+ typ[string]: Der Typ zu dem die Providerloste ausgeben werden soll
+ Einer der Liste ["sms","fax","mail"]
+
+ Return:
+ providerlist[list]: Eine Liste aller möglichen Provider
+
+ '''
+ return ""
+
+ def defaultRoute(self, apikey, typ):
+ '''Gibt den Standardprovider zurück.
+
+ Keywords:
+ apikey[string]: Der API Key
+ typ[string]: Der Typ zu dem die Providerloste ausgeben werden soll
+ Einer der Liste ["sms","fax","mail"]
+
+ Return:
+ provider[string]: Der Standardprovider für den angeben Typ
+
+
+ '''
+ return ""
+
+ def statistic(self,apikey):
+ '''Gibt eine Statik zurück über die versendendeten Nachrichten und des Preises.
+
+ Keywords:
+ apikey[string]: Der API Key
+
+ Return:
+ statistic[list]: Eine Liste nach Nachrichtentypen
+ '''
+ return ""
+
+ def listMethods(self):
+ """Since we override lookupProcedure, its suggested to override
+ listProcedures too.
+ """
+ return self.listProcedures()
+
+
+ def listProcedures(self):
+ """Since we override lookupProcedure, its suggested to override
+ listProcedures too.
+ """
+ return ['listMethods','status','stop','sms','fax','mail','routes','defaultRoute','statistic']
+
+
+class XMLRPCInterface(Interface,xmlrpc.XMLRPC):
+ def __init__(self):
+ xmlrpc.XMLRPC.__init__(self)
+ Interface.__init__(self)
+ self.allowNone = True
+
+ def lookupProcedure(self, procedurePath):
+ logging.debug("lookupProcedure('%s')"%procedurePath)
+ if procedurePath not in self.listProcedures():
+ raise xmlrpc.NoSuchFunction(self.NOT_FOUND,
+ "procedure %s not found" % procedurePath)
+ try:
+ return getattr(self,procedurePath)
+ except KeyError:
+ raise xmlrpc.NoSuchFunction(self.NOT_FOUND,
+ "procedure %s not found" % procedurePath)
+
+class SOAPInterface(Interface,soap.SOAPPublisher):
+ def __init__(self):
+ soap.SOAPPublisher.__init__(self)
+ Interface.__init__(self)
+
+ def lookupFunction(self, functionName):
+ """Lookup published SOAP function.
+
+ Override in subclasses. Default behaviour - publish methods
+ starting with soap_, if they have true attribute useKeywords
+ they are expected to accept keywords.
+
+ @return: tuple (callable, useKeywords), or (None, None) if not found.
+ """
+ if functionName in self.listProcedures():
+ function = getattr(self, functionName, None)
+ if function:
+ return function, getattr(function, "useKeywords", False)
+ return None
+ else:
+ return None
+
+
+def main():
+ from twisted.internet import reactor
+ root = resource.Resource()
+ root.putChild('RPC2', XMLRPCInterface())
+ root.putChild('SOAP', SOAPInterface())
+ reactor.listenTCP(7080, server.Site(root))
+ reactor.run()
+
+if __name__ == '__main__':
+ main()