# HG changeset patch # User Sandro Knauß # Date 1256693701 -3600 # Node ID 07dd2663ac909119cac8b7dc8814ee83d66d1b60 # Parent c5672760138b395078003e7045551fbf67425cb2 provider auswahl hinzugefügt diff -r c5672760138b -r 07dd2663ac90 iro/.eric4project/iro.e4q --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/iro/.eric4project/iro.e4q Wed Oct 28 02:35:01 2009 +0100 @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff -r c5672760138b -r 07dd2663ac90 iro/.eric4project/iro.e4t --- a/iro/.eric4project/iro.e4t Fri Oct 23 01:37:44 2009 +0200 +++ b/iro/.eric4project/iro.e4t Wed Oct 28 02:35:01 2009 +0100 @@ -1,6 +1,6 @@ - + \ No newline at end of file diff -r c5672760138b -r 07dd2663ac90 iro/iro.api --- a/iro/iro.api Fri Oct 23 01:37:44 2009 +0200 +++ b/iro/iro.api Wed Oct 28 02:35:01 2009 +0100 @@ -14,7 +14,6 @@ iro.anbieter.geonet.geonet.max_recipients?7 iro.anbieter.geonet.geonet.section?7 iro.anbieter.geonet.geonet.sendFAX?4(fax, recipients) -iro.anbieter.geonet.geonet.sendMail?4(mail, recipients) iro.anbieter.geonet.geonet.sendSMS?4(sms, recipients) iro.anbieter.geonet.geonet?1() iro.anbieter.sipgate.sipgate.BalanceGet?4() @@ -31,11 +30,21 @@ iro.anbieter.sipgate.sipgate.updateStatus?4(arranged=None, failed=None) iro.anbieter.sipgate.sipgate.url?7 iro.anbieter.sipgate.sipgate?1(user="", password="") +iro.anbieter.smstrade.InternetConnectionError.__str__?6() +iro.anbieter.smstrade.InternetConnectionError?1(url) +iro.anbieter.smstrade.__send?6(self, key, route, to, message, from_=None, timestamp=None) +iro.anbieter.smstrade.sendSMS?4(self, sms, recipients) +iro.anbieter.smstrade.smstrade.read_basic_config?4(filename) +iro.anbieter.smstrade.smstrade.section?7 +iro.anbieter.smstrade.smstrade.url?7 +iro.anbieter.smstrade.smstrade?1() +iro.anbieter.smstrade.updateStatus?4(self, arranged=None, failed=None) iro.anbieter.smtp.SMTP.prepareSMTP?4() -iro.anbieter.smtp.SMTP.read_basic_config?4() +iro.anbieter.smtp.SMTP.read_basic_config?4(config_filename=None) iro.anbieter.smtp.SMTP.sendMail?4(mail, recipients) iro.anbieter.smtp.SMTP.shutdownSMTP?4() -iro.anbieter.smtp.SMTP?1(config_filename, section) +iro.anbieter.smtp.SMTP.updateStatus?4(arranged=None, failed=None) +iro.anbieter.smtp.SMTP?1(config_filename=None, section="smtp") iro.anbieter.smtp.anbieter.default_conf?7 iro.anbieter.telnumber.NotATelNumber.__str__?6() iro.anbieter.telnumber.NotATelNumber?1(number) @@ -55,61 +64,73 @@ iro.anbieter.test.anbieter.default_conf?7 iro.content.FAX.sendto?4(anbieter, recipients) iro.content.FAX?1(header, cont, attachments) +iro.content.Mail.as_string?4() +iro.content.Mail.sendto?4(anbieter, recipients) +iro.content.Mail?1(subject, body) iro.content.SMS.sendto?4(anbieter, recipients) iro.content.SMS?1(cont) iro.content.content.sendto?4(anbieter, recipients) iro.content.content?1(content) -iro.iro.Job.addFailed?4(failed) -iro.iro.Job.addGood?4(good) -iro.iro.Job.getName?4() -iro.iro.Job.getProvider?4() -iro.iro.Job.getStatus?4(detailed) -iro.iro.Job.start?4() -iro.iro.Job.stop?4() -iro.iro.Job?1(provider, name) -iro.iro.Jobs.__getitem__?6(key) -iro.iro.Jobs.__registerJob__?6(job) -iro.iro.Jobs._createID?5() -iro.iro.Jobs.newFAX?4(subject, fax, recipients) -iro.iro.Jobs.newMail?4(subject, body, recipients) -iro.iro.Jobs.newSMS?4(message, recipients) -iro.iro.Jobs?1(manager, queue, provider) -iro.iro.MessageJob.getMessage?4() -iro.iro.MessageJob.getRecipients?4() -iro.iro.MessageJob.start?4() -iro.iro.MessageJob.stop?4() -iro.iro.MessageJob?1(provider, message, recipients) iro.iro.MyManager.certificate?7 iro.iro.MyManager.userdb?7 +iro.iro.MySMTP.setJob?4(job) +iro.iro.MySMTP.updateStatus?4(arranged=None, failed=None) +iro.iro.MySMTP?1(config_filename=None, section="smtp") iro.iro.MySipgate.setJob?4(job) iro.iro.MySipgate.updateStatus?4(arranged=None, failed=None) iro.iro.MySipgate?1(user="", password="") +iro.iro.MySmstrade.setJob?4(job) +iro.iro.MySmstrade.updateStatus?4(arranged=None, failed=None) +iro.iro.MySmstrade?1() iro.iro.MyUserDB.createUser?4(user) iro.iro.MyUserDB?1(userlist, jobqueue) iro.iro.start?4(userlist) +iro.job.Job.addFailed?4(failed) +iro.job.Job.addGood?4(good) +iro.job.Job.getName?4() +iro.job.Job.getProvider?4() +iro.job.Job.getStatus?4(detailed) +iro.job.Job.start?4() +iro.job.Job.stop?4() +iro.job.Job?1(provider, name) +iro.job.MessageJob.getMessage?4() +iro.job.MessageJob.getRecipients?4() +iro.job.MessageJob.start?4() +iro.job.MessageJob.stop?4() +iro.job.MessageJob?1(provider, name, message, recipients) +iro.joblist.Joblist.__getitem__?6(key) +iro.joblist.Joblist.__registerJob__?6(job) +iro.joblist.Joblist._createID?5() +iro.joblist.Joblist.newFAX?4(subject, fax, recipients) +iro.joblist.Joblist.newMail?4(subject, body, recipients) +iro.joblist.Joblist.newSMS?4(message, recipients) +iro.joblist.Joblist?1(manager, queue, providerlist) +iro.providerlist.Providerlist.add?4(name, provider, typeslist) +iro.providerlist.Providerlist.getDefault?4(stype) +iro.providerlist.Providerlist.getProvider?4(stype, name="default") +iro.providerlist.Providerlist.getProviderlist?4(stype) +iro.providerlist.Providerlist.setDefault?4(stype, name) +iro.providerlist.Providerlist?1() iro.test.MyManager.certificate?7 iro.test.MyManager.userdb?7 iro.test.StoppableXMLRPCServer.run?4() iro.test.StoppableXMLRPCServer.running?7 iro.test.StoppableXMLRPCServer.stop?4() iro.test.StoppableXMLRPCServer?1(*args, **kwargs) -iro.test.TestServer.admin?7 -iro.test.TestServer.client1?7 -iro.test.TestServer.client2?7 -iro.test.TestServer.client?7 -iro.test.TestServer.id1?7 -iro.test.TestServer.id2?7 -iro.test.TestServer.id?7 -iro.test.TestServer.servstr?7 iro.test.TestServer.setUp?4() iro.test.TestServer.tearDown?4() +iro.test.TestServer.testGetDefault?4() +iro.test.TestServer.testGetProvider?4() iro.test.TestServer.testLogin?4() iro.test.TestServer.testTwoUser?4() iro.test.TestServer.testsendSMS?4() -iro.test.TestServer.u1?7 -iro.test.TestServer.u2?7 iro.test.init_server?4() iro.user.Admin?1(jobqueue) +iro.user.NotSupportedFeature.__str__?6() +iro.user.NotSupportedFeature?1(name) +iro.user.User.getDefaultProvider?4(name) +iro.user.User.getProvider?4(name) +iro.user.User.startFAX?4() iro.user.User.startMail?4(subject, body, recipients) iro.user.User.startSMS?4(message, recipients) iro.user.User.status?4(id=None, detailed=False) @@ -139,24 +160,4 @@ iro.xmlrpc.SecureXMLRPCServer.SecureTCPServer?1(server_address, RequestHandlerClass, certificate, privatekey) iro.xmlrpc.SecureXMLRPCServer.SecureXMLRPCRequestHandler.setup?4() iro.xmlrpc.SecureXMLRPCServer.SecureXMLRPCServer?1(addr, requestHandler=SecureXMLRPCRequestHandler, certificate="server.cert", privatekey="server.pem", logRequests=1) -iro.xmlrpc.SecureXMLRPCServer.test?4() -iro.xmlserver_test.Job.start?4() -iro.xmlserver_test.Job.stop?4() -iro.xmlserver_test.Job?1(provider, name) -iro.xmlserver_test.Jobs.__getitem__?6(key) -iro.xmlserver_test.Jobs._createID?5() -iro.xmlserver_test.Jobs.newSMS?4(message, recipients) -iro.xmlserver_test.Jobs?1(queue, provider) -iro.xmlserver_test.SMSJob?1(provider, message, recipients) -iro.xmlserver_test.SecureAuthentificateXMLRPCRequestHandler2.testUser?4(username, password) -iro.xmlserver_test.SecureUserDBXMLRPCServer.activateUser?4(username, password) -iro.xmlserver_test.SecureUserDBXMLRPCServer?1(addr, userdb, requestHandler=SecureAuthentificateXMLRPCRequestHandler2, certificate="server.cert", privatekey="server.pem", logRequests=1) -iro.xmlserver_test.User.startSMS?4(message, recipients) -iro.xmlserver_test.User.status?4(id=None) -iro.xmlserver_test.User.stop?4(id) -iro.xmlserver_test.User?1(jobqueue) -iro.xmlserver_test.UserDB.__getitem__?6(key) -iro.xmlserver_test.UserDB.createHash?4(username, password) -iro.xmlserver_test.UserDB.createUser?4(user) -iro.xmlserver_test.UserDB?1(userlist, jobqueue) -iro.xmlserver_test.test?4() \ No newline at end of file +iro.xmlrpc.SecureXMLRPCServer.test?4() \ No newline at end of file diff -r c5672760138b -r 07dd2663ac90 iro/iro.e4p --- a/iro/iro.e4p Fri Oct 23 01:37:44 2009 +0200 +++ b/iro/iro.e4p Wed Oct 28 02:35:01 2009 +0100 @@ -1,7 +1,7 @@ - + @@ -19,7 +19,6 @@ xmlrpc/__init__.py xmlrpc/SecureAuthentificateXMLRPCServer.py xmlrpc/AuthentificateXMLRPCServer.py - xmlserver_test.py anbieter/smtp.py anbieter/geonet.py anbieter/__init__.py @@ -46,7 +45,7 @@ iro.py - Subversion + None diff -r c5672760138b -r 07dd2663ac90 iro/iro.py --- a/iro/iro.py Fri Oct 23 01:37:44 2009 +0200 +++ b/iro/iro.py Wed Oct 28 02:35:01 2009 +0100 @@ -14,9 +14,8 @@ # Server code from xmlrpc import SecureUserDBXMLRPCServer,UserDB -import time, os, md5 + from user import User, Admin, NotSupportedFeature -import content import anbieter import ConfigParser @@ -27,68 +26,7 @@ def createUser(self, user): self.userlist[self.createHash(user)]=user["class"](self.jobqueue) -class Job(object): - ''' - Basic class for all jobs - ''' - def __init__(self,provider,name): - self.provider=provider - self.name=name - self.status = "init" - self.dStatus={"good":[], "failed":[]} - def start(self): - self.status = "started" - - def stop(self): - self.status = "stopped" - - def getStatus(self,detailed): - if detailed and self.status == "started" or self.status == "sended": - return self.status, self.dStatus - return self.status, {} - - def getName(self): - return self.name - - def getProvider(self): - return self.provider - - def addGood(self, good): - if type(good) == list: - self.dStatus['good']=self.dStatus['good']+good - else: - self.dStatus['good'].append(good) - - def addFailed(self, failed): - if type(failed) == list: - self.dStatus['failed']=self.dStatus['failed']+failed - else: - self.dStatus['failed'].append(failed) - -class MessageJob(Job): - ''' - A specialized class for smsjobs - ''' - def __init__(self,provider,name, message,recipients): - self.message=message - self.recipients=recipients - Job.__init__(self,provider, name) - - def stop(self): - pass - - def start(self): - Job.start(self) - self.provider.setJob(self) - self.message.sendto(self.provider, self.recipients) - self.status="sended" - - def getMessage(self): - return self.message - - def getRecipients(self): - return self.recipients class MySipgate(anbieter.sipgate): @@ -135,60 +73,8 @@ if failed: self.job.addFailed(failed) - -class Jobs: - ''' - Providing an list of jobs; each new job gets a hash id - ''' - def __init__(self,manager, queue,provider): - self.jobs={} - self.manager=manager - self.queue=queue - self.provider=provider - - - def __getitem__(self,key): - return self.jobs[key] - - def __registerJob__(self, job): - id = self._createID() - self.jobs[id]=job - self.queue.put(job) - return id - def newSMS(self,message,recipients): - ''' - creates a new SMS - ''' - job=self.manager.MessageJob(self.provider["sms"],message, content.SMS(message),recipients) - return self.__registerJob__(job) - def newFAX(self,subject, fax,recipients): - ''' - creates a new Fax - ''' - job=self.manager.MessageJob(self.provider["fax"],subject, content.FAX(subject, fax),recipients) - return self.__registerJob__(job) - - def newMail(self,subject, body,recipients): - ''' - creates a new Mail - ''' - job=self.manager.MessageJob(self.provider["mail"],subject, content.Mail(subject, body),recipients) - return self.__registerJob__(job) - - def _createID(self): - ''' - creats a random hash id - ''' - while True: - m = md5.new() - m.update(str(time.time())) - m.update(os.urandom(10)) - if not self.jobs.has_key(m.hexdigest): - self.jobs[m.hexdigest()]=None - break - return m.hexdigest() def start(userlist): from multiprocessing import Queue @@ -215,7 +101,10 @@ #Benutzerdatenbank erstellen queue = Queue() - provider={"sms":sip, "fax":sip, "mail":localhost} + provider={"sms":{"sipgate":sip, "smstrade":smstrade, "default":sip, }, + "fax":{"sipgate":sip, "default":sip, }, + "mail":{"localhost":localhost, "default":localhost, }, } + jobqueue=Jobs(manager, queue, provider) userdb=MyUserDB(userlist,jobqueue) diff -r c5672760138b -r 07dd2663ac90 iro/job.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/iro/job.py Wed Oct 28 02:35:01 2009 +0100 @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- +#Copyright (C) 2009 Sandro Knauß + +#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 . + + +class Job(object): + ''' + Basic class for all jobs + ''' + def __init__(self,provider,name): + self.provider=provider + self.name=name + self.status = "init" + self.dStatus={"good":[], "failed":[]} + + def start(self): + self.status = "started" + + def stop(self): + self.status = "stopped" + + def getStatus(self,detailed): + if detailed and self.status == "started" or self.status == "sended": + return self.status, self.dStatus + return self.status, {} + + def getName(self): + return self.name + + def getProvider(self): + return self.provider + + def addGood(self, good): + if type(good) == list: + self.dStatus['good']=self.dStatus['good']+good + else: + self.dStatus['good'].append(good) + + def addFailed(self, failed): + if type(failed) == list: + self.dStatus['failed']=self.dStatus['failed']+failed + else: + self.dStatus['failed'].append(failed) + +class MessageJob(Job): + ''' + A specialized class for smsjobs + ''' + def __init__(self,provider,name, message,recipients): + self.message=message + self.recipients=recipients + Job.__init__(self,provider, name) + + def stop(self): + pass + + def start(self): + Job.start(self) + self.provider.setJob(self) + self.message.sendto(self.provider, self.recipients) + self.status="sended" + + def getMessage(self): + return self.message + + def getRecipients(self): + return self.recipients + + + diff -r c5672760138b -r 07dd2663ac90 iro/joblist.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/iro/joblist.py Wed Oct 28 02:35:01 2009 +0100 @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- +#Copyright (C) 2009 Sandro Knauß + +#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 . + +import content +import md5, os, time + + +class Joblist: + ''' + Providing an list of jobs; each new job gets a hash id + ''' + def __init__(self,manager, queue,providerlist): + self.jobs={} + self.manager=manager + self.queue=queue + self.providerlist=providerlist + + + def __getitem__(self,key): + return self.jobs[key] + + def __registerJob__(self, job): + id = self._createID() + self.jobs[id]=job + self.queue.put(job) + return id + + def newSMS(self,message,recipients): + ''' + creates a new SMS + ''' + job=self.manager.MessageJob(self.providerlist.getProvider("sms"),message, content.SMS(message),recipients) + return self.__registerJob__(job) + + def newFAX(self,subject, fax,recipients): + ''' + creates a new Fax + ''' + job=self.manager.MessageJob(self.providerlist.getProvider("fax"),subject, content.FAX(subject, fax),recipients) + return self.__registerJob__(job) + + def newMail(self,subject, body,recipients): + ''' + creates a new Mail + ''' + job=self.manager.MessageJob(self.providerlist.getProvider("mail"),subject, content.Mail(subject, body),recipients) + return self.__registerJob__(job) + + def _createID(self): + ''' + creats a random hash id + ''' + while True: + m = md5.new() + m.update(str(time.time())) + m.update(os.urandom(10)) + if not self.jobs.has_key(m.hexdigest): + self.jobs[m.hexdigest()]=None + break + return m.hexdigest() diff -r c5672760138b -r 07dd2663ac90 iro/providerlist.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/iro/providerlist.py Wed Oct 28 02:35:01 2009 +0100 @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +#Copyright (C) 2009 Sandro Knauß + +#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 . + +class Providerlist: + def __init__(self): + self.provider={} + self.types={} + self.defaults={} + + def add(self, name, provider, typeslist): + self.provider[name]={"name":name, "class":provider, "types":typeslist} + for stype in typeslist: + try: + self.types[stype].append(self.provider[name]) + except KeyError: + self.types[stype]=[self.provider[name]] + + + def setDefault(self, stype, name): + self.defaults[stype]=self.provider[name] + + def getDefault(self, stype): + return self.defaults[stype] + + def getProviderlist(self, stype): + llist=[ provider["name"] for provider in self.types[stype] ] + llist.sort() + return llist + + def getProvider(self, stype, name="default"): + if name=="default": + return self.getDefault(stype)["class"] + + if not stype in self.provider[name] ["types"]: + raise "argh" + + return self.provider[name]["class"] diff -r c5672760138b -r 07dd2663ac90 iro/test.py --- a/iro/test.py Fri Oct 23 01:37:44 2009 +0200 +++ b/iro/test.py Wed Oct 28 02:35:01 2009 +0100 @@ -2,6 +2,9 @@ import unittest, ConfigParser import iro +from job import MessageJob +from joblist import Joblist +from providerlist import Providerlist import threading, xmlrpclib from multiprocessing import Queue from multiprocessing.managers import BaseManager @@ -35,7 +38,7 @@ class MyManager(BaseManager): pass - MyManager.register('MessageJob', iro.MessageJob) + MyManager.register('MessageJob', MessageJob) manager = MyManager() manager.start() @@ -53,8 +56,16 @@ #Benutzerdatenbank erstellen queue = Queue() - provider={"sms":sip, "fax":sip, "mail":localhost} - jobqueue=iro.Jobs(manager, queue, provider) + provider=Providerlist() + provider.add("sipgate", sip, ["sms", "fax", ]) + provider.add("smstrade", smstrade, ["sms", ]) + provider.add("geonet", None, ["sms", "fax", ]) + provider.add("fax.de", None, ["sms", "fax", ]) + provider.add("localhost", localhost, ["mail", ]) + provider.setDefault("sms","smstrade") + provider.setDefault("fax","sipgate") + provider.setDefault("mail","localhost") + jobqueue=Joblist(manager, queue, provider) userdb=iro.MyUserDB(userlist,jobqueue) @@ -89,7 +100,7 @@ def testsendSMS(self): servstr="https://test:test@localhost:8000" client=xmlrpclib.Server(servstr) - id=client.startSMS("test",["01234"] ) + id=client.startSMS("test",["01234", ] ) self.assertEqual(client.status(id),{id: {'status': ['init',{}], 'name': 'test'}} ) def testTwoUser(self): @@ -116,9 +127,19 @@ servstr="https://test:test@localhost:8000" client=xmlrpclib.Server(servstr) self.assertEqual(client.getProvider("sms"), ["fax.de","geonet", "sipgate", "smstrade"]) - self.assertEqual(client.getProvider("fax").sort(), ["fax.de","geonet", "sipgate"]) - self.assertEqual(client.getProvider("mail").sort(), ["localhost"]) - self.assertRaises(iro.NotSupportedFeature, client.getProvider("temp")) + self.assertEqual(client.getProvider("fax"), ["fax.de","geonet", "sipgate"]) + self.assertEqual(client.getProvider("mail"), ["localhost"]) + + self.assertRaises(xmlrpclib.Fault,client.getProvider, "temp") + + def testGetDefault(self): + servstr="https://test:test@localhost:8000" + client=xmlrpclib.Server(servstr) + self.assertEqual(client.getDefaultProvider("sms"), "smstrade") + self.assertEqual(client.getDefaultProvider("fax"),"sipgate") + self.assertEqual(client.getDefaultProvider("mail"), "localhost") + + self.assertRaises(xmlrpclib.Fault,client.getDefaultProvider, "temp") if __name__ == "__main__": diff -r c5672760138b -r 07dd2663ac90 iro/user.py --- a/iro/user.py Fri Oct 23 01:37:44 2009 +0200 +++ b/iro/user.py Wed Oct 28 02:35:01 2009 +0100 @@ -87,6 +87,14 @@ def getProvider(self, name): if not name in self.features: raise NotSupportedFeature(name) + + return self.jobqueue.providerlist.getProviderlist(name) + + def getDefaultProvider(self, name): + if not name in self.features: + raise NotSupportedFeature(name) + + return self.jobqueue.providerlist.getDefault(name)["name"] class Admin(User): def __init__(self,jobqueue):