diff -r 000000000000 -r a3b6e531f0d2 iro/iro.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/iro/iro.py Thu Oct 22 10:00:01 2009 +0200 @@ -0,0 +1,230 @@ +# -*- 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 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") + + #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) + +