# HG changeset patch # User Sandro Knauß # Date 1256254664 -7200 # Node ID c5672760138b395078003e7045551fbf67425cb2 # Parent af2f45da3192cb88c2ec7420a75548cc8242e357 user interface erweitert diff -r af2f45da3192 -r c5672760138b iro/iro.py --- a/iro/iro.py Fri Oct 23 01:15:23 2009 +0200 +++ b/iro/iro.py Fri Oct 23 01:37:44 2009 +0200 @@ -1,247 +1,247 @@ -# -*- 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 . - -# Server code - -from xmlrpc import SecureUserDBXMLRPCServer,UserDB -import time, os, md5 -from user import User, Admin -import content -import anbieter -import ConfigParser - -class MyUserDB(UserDB): - def __init__(self, userlist,jobqueue): - UserDB.__init__(self, None,userlist,jobqueue) - - 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): - - def __init__(self,user="",password="" ): - anbieter.sipgate.__init__(self, user, password) - - def setJob(self, job): - self.job=job - - def updateStatus(self, arranged=None, failed=None): - if arranged: - self.job.addGood(arranged) - - if failed: - self.job.addFailed(failed) - -class MySMTP(anbieter.SMTP): - - def __init__(self,config_filename=None,section="smtp"): - anbieter.SMTP.__init__(self,config_filename,section) - - def setJob(self, job): - self.job=job - - def updateStatus(self, arranged=None, failed=None): - if arranged: - self.job.addGood(arranged) - - if failed: - self.job.addFailed(failed) - -class MySmstrade(anbieter.smstrade): - - def __init__(self ): - anbieter.smstrade.__init__(self ) - - def setJob(self, job): - self.job=job - - def updateStatus(self, arranged=None, failed=None): - if arranged: - self.job.addGood(arranged) - - 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 - from multiprocessing.managers import BaseManager - - class MyManager(BaseManager): - pass - - MyManager.register('MessageJob', MessageJob) - manager = MyManager() - manager.start() - - - #anbieter erzeugen und konfigurieren - - sip=MySipgate() - sip.read_basic_config("iro.conf") - - localhost=MySMTP() - localhost.read_basic_config("iro.conf") - - smstrade=MySmstrade() - smstrade.read_basic_config("iro.conf") - - #Benutzerdatenbank erstellen - queue = Queue() - provider={"sms":sip, "fax":sip, "mail":localhost} - jobqueue=Jobs(manager, queue, provider) - userdb=MyUserDB(userlist,jobqueue) - - #working thread erstellen - from worker import Worker - worker=Worker(queue) - worker.start() - - #Server starten - cp = ConfigParser.ConfigParser() - cp.read(["iro.conf"]) - cert=cp.get('server', 'cert') - key=cp.get('server', 'key') - server = SecureUserDBXMLRPCServer(addr=("localhost", 8000), - userdb=userdb, - certificate=cert,privatekey=key) - server.relam="xmlrpc" - - print "Server started..." - server.serve_forever() - - worker.terminate() - -if __name__ == '__main__': - userlist=[{"name":"test","password":"test", "class":User}, - {"name":"test2","password":"test2", "class": Admin}] - start(userlist) - - +# -*- 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 . + +# Server code + +from xmlrpc import SecureUserDBXMLRPCServer,UserDB +import time, os, md5 +from user import User, Admin, NotSupportedFeature +import content +import anbieter +import ConfigParser + +class MyUserDB(UserDB): + def __init__(self, userlist,jobqueue): + UserDB.__init__(self, None,userlist,jobqueue) + + 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): + + def __init__(self,user="",password="" ): + anbieter.sipgate.__init__(self, user, password) + + def setJob(self, job): + self.job=job + + def updateStatus(self, arranged=None, failed=None): + if arranged: + self.job.addGood(arranged) + + if failed: + self.job.addFailed(failed) + +class MySMTP(anbieter.SMTP): + + def __init__(self,config_filename=None,section="smtp"): + anbieter.SMTP.__init__(self,config_filename,section) + + def setJob(self, job): + self.job=job + + def updateStatus(self, arranged=None, failed=None): + if arranged: + self.job.addGood(arranged) + + if failed: + self.job.addFailed(failed) + +class MySmstrade(anbieter.smstrade): + + def __init__(self ): + anbieter.smstrade.__init__(self ) + + def setJob(self, job): + self.job=job + + def updateStatus(self, arranged=None, failed=None): + if arranged: + self.job.addGood(arranged) + + 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 + from multiprocessing.managers import BaseManager + + class MyManager(BaseManager): + pass + + MyManager.register('MessageJob', MessageJob) + manager = MyManager() + manager.start() + + + #anbieter erzeugen und konfigurieren + + sip=MySipgate() + sip.read_basic_config("iro.conf") + + localhost=MySMTP() + localhost.read_basic_config("iro.conf") + + smstrade=MySmstrade() + smstrade.read_basic_config("iro.conf") + + #Benutzerdatenbank erstellen + queue = Queue() + provider={"sms":sip, "fax":sip, "mail":localhost} + jobqueue=Jobs(manager, queue, provider) + userdb=MyUserDB(userlist,jobqueue) + + #working thread erstellen + from worker import Worker + worker=Worker(queue) + worker.start() + + #Server starten + cp = ConfigParser.ConfigParser() + cp.read(["iro.conf"]) + cert=cp.get('server', 'cert') + key=cp.get('server', 'key') + server = SecureUserDBXMLRPCServer(addr=("localhost", 8000), + userdb=userdb, + certificate=cert,privatekey=key) + server.relam="xmlrpc" + + print "Server started..." + server.serve_forever() + + worker.terminate() + +if __name__ == '__main__': + userlist=[{"name":"test","password":"test", "class":User}, + {"name":"test2","password":"test2", "class": Admin}] + start(userlist) + + diff -r af2f45da3192 -r c5672760138b iro/test.py --- a/iro/test.py Fri Oct 23 01:15:23 2009 +0200 +++ b/iro/test.py Fri Oct 23 01:37:44 2009 +0200 @@ -115,9 +115,11 @@ def testGetProvider(self): servstr="https://test:test@localhost:8000" client=xmlrpclib.Server(servstr) - self.assertEqual(client.getProvider("sms").sort(), ["fax.de","geonet", "sipgate", "smstrade"]) + 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")) + if __name__ == "__main__": unittest.main() diff -r af2f45da3192 -r c5672760138b iro/user.py --- a/iro/user.py Fri Oct 23 01:15:23 2009 +0200 +++ b/iro/user.py Fri Oct 23 01:37:44 2009 +0200 @@ -10,6 +10,14 @@ #You should have received a copy of the GNU General Public License #along with this program; if not, see . + +class NotSupportedFeature (Exception): + def __init__(self,name): + self.name=name + + def __str__(self): + return ("This is not a supported feature:", self.name) + class User: ''' class for a xmlrpc user @@ -17,6 +25,7 @@ def __init__(self,jobqueue): self.jobqueue=jobqueue self.jobs={} + self.features=["mail", "sms", "fax", ] def status(self,id=None,detailed=False): ''' @@ -53,15 +62,31 @@ ''' starts the SMS with message to recipients ''' + if not "sms" in self.features: + raise NotSupportedFeature("sms") id = self.jobqueue.newSMS(message,recipients) self.jobs[id]=self.jobqueue[id] return id - + + + def startFAX(self): + ''' + starts the FAX - not implemented + ''' + raise NotSupportedFeature("fax") + + def startMail(self,subject, body , recipients): + if not "mail" in self.features: + raise NotSupportedFeature("mail") id = self.jobqueue.newMail(subject, body ,recipients) self.jobs[id]=self.jobqueue[id] - return id + return id + + def getProvider(self, name): + if not name in self.features: + raise NotSupportedFeature(name) class Admin(User): def __init__(self,jobqueue):