12 #along with this program; if not, see <http://www.gnu.org/licenses/>. |
12 #along with this program; if not, see <http://www.gnu.org/licenses/>. |
13 |
13 |
14 # Server code |
14 # Server code |
15 |
15 |
16 from xmlrpc import SecureUserDBXMLRPCServer,UserDB |
16 from xmlrpc import SecureUserDBXMLRPCServer,UserDB |
17 import time, os, md5 |
17 |
18 from user import User, Admin, NotSupportedFeature |
18 from user import User, Admin, NotSupportedFeature |
19 import content |
|
20 import anbieter |
19 import anbieter |
21 import ConfigParser |
20 import ConfigParser |
22 |
21 |
23 class MyUserDB(UserDB): |
22 class MyUserDB(UserDB): |
24 def __init__(self, userlist,jobqueue): |
23 def __init__(self, userlist,jobqueue): |
25 UserDB.__init__(self, None,userlist,jobqueue) |
24 UserDB.__init__(self, None,userlist,jobqueue) |
26 |
25 |
27 def createUser(self, user): |
26 def createUser(self, user): |
28 self.userlist[self.createHash(user)]=user["class"](self.jobqueue) |
27 self.userlist[self.createHash(user)]=user["class"](self.jobqueue) |
29 |
28 |
30 class Job(object): |
|
31 ''' |
|
32 Basic class for all jobs |
|
33 ''' |
|
34 def __init__(self,provider,name): |
|
35 self.provider=provider |
|
36 self.name=name |
|
37 self.status = "init" |
|
38 self.dStatus={"good":[], "failed":[]} |
|
39 |
29 |
40 def start(self): |
|
41 self.status = "started" |
|
42 |
|
43 def stop(self): |
|
44 self.status = "stopped" |
|
45 |
|
46 def getStatus(self,detailed): |
|
47 if detailed and self.status == "started" or self.status == "sended": |
|
48 return self.status, self.dStatus |
|
49 return self.status, {} |
|
50 |
|
51 def getName(self): |
|
52 return self.name |
|
53 |
|
54 def getProvider(self): |
|
55 return self.provider |
|
56 |
|
57 def addGood(self, good): |
|
58 if type(good) == list: |
|
59 self.dStatus['good']=self.dStatus['good']+good |
|
60 else: |
|
61 self.dStatus['good'].append(good) |
|
62 |
|
63 def addFailed(self, failed): |
|
64 if type(failed) == list: |
|
65 self.dStatus['failed']=self.dStatus['failed']+failed |
|
66 else: |
|
67 self.dStatus['failed'].append(failed) |
|
68 |
|
69 class MessageJob(Job): |
|
70 ''' |
|
71 A specialized class for smsjobs |
|
72 ''' |
|
73 def __init__(self,provider,name, message,recipients): |
|
74 self.message=message |
|
75 self.recipients=recipients |
|
76 Job.__init__(self,provider, name) |
|
77 |
|
78 def stop(self): |
|
79 pass |
|
80 |
|
81 def start(self): |
|
82 Job.start(self) |
|
83 self.provider.setJob(self) |
|
84 self.message.sendto(self.provider, self.recipients) |
|
85 self.status="sended" |
|
86 |
|
87 def getMessage(self): |
|
88 return self.message |
|
89 |
|
90 def getRecipients(self): |
|
91 return self.recipients |
|
92 |
30 |
93 |
31 |
94 class MySipgate(anbieter.sipgate): |
32 class MySipgate(anbieter.sipgate): |
95 |
33 |
96 def __init__(self,user="",password="" ): |
34 def __init__(self,user="",password="" ): |
133 if arranged: |
71 if arranged: |
134 self.job.addGood(arranged) |
72 self.job.addGood(arranged) |
135 |
73 |
136 if failed: |
74 if failed: |
137 self.job.addFailed(failed) |
75 self.job.addFailed(failed) |
138 |
|
139 class Jobs: |
|
140 ''' |
|
141 Providing an list of jobs; each new job gets a hash id |
|
142 ''' |
|
143 def __init__(self,manager, queue,provider): |
|
144 self.jobs={} |
|
145 self.manager=manager |
|
146 self.queue=queue |
|
147 self.provider=provider |
|
148 |
|
149 |
76 |
150 def __getitem__(self,key): |
|
151 return self.jobs[key] |
|
152 |
77 |
153 def __registerJob__(self, job): |
|
154 id = self._createID() |
|
155 self.jobs[id]=job |
|
156 self.queue.put(job) |
|
157 return id |
|
158 |
|
159 def newSMS(self,message,recipients): |
|
160 ''' |
|
161 creates a new SMS |
|
162 ''' |
|
163 job=self.manager.MessageJob(self.provider["sms"],message, content.SMS(message),recipients) |
|
164 return self.__registerJob__(job) |
|
165 |
|
166 def newFAX(self,subject, fax,recipients): |
|
167 ''' |
|
168 creates a new Fax |
|
169 ''' |
|
170 job=self.manager.MessageJob(self.provider["fax"],subject, content.FAX(subject, fax),recipients) |
|
171 return self.__registerJob__(job) |
|
172 |
|
173 def newMail(self,subject, body,recipients): |
|
174 ''' |
|
175 creates a new Mail |
|
176 ''' |
|
177 job=self.manager.MessageJob(self.provider["mail"],subject, content.Mail(subject, body),recipients) |
|
178 return self.__registerJob__(job) |
|
179 |
|
180 def _createID(self): |
|
181 ''' |
|
182 creats a random hash id |
|
183 ''' |
|
184 while True: |
|
185 m = md5.new() |
|
186 m.update(str(time.time())) |
|
187 m.update(os.urandom(10)) |
|
188 if not self.jobs.has_key(m.hexdigest): |
|
189 self.jobs[m.hexdigest()]=None |
|
190 break |
|
191 return m.hexdigest() |
|
192 |
78 |
193 def start(userlist): |
79 def start(userlist): |
194 from multiprocessing import Queue |
80 from multiprocessing import Queue |
195 from multiprocessing.managers import BaseManager |
81 from multiprocessing.managers import BaseManager |
196 |
82 |
213 smstrade=MySmstrade() |
99 smstrade=MySmstrade() |
214 smstrade.read_basic_config("iro.conf") |
100 smstrade.read_basic_config("iro.conf") |
215 |
101 |
216 #Benutzerdatenbank erstellen |
102 #Benutzerdatenbank erstellen |
217 queue = Queue() |
103 queue = Queue() |
218 provider={"sms":sip, "fax":sip, "mail":localhost} |
104 provider={"sms":{"sipgate":sip, "smstrade":smstrade, "default":sip, }, |
|
105 "fax":{"sipgate":sip, "default":sip, }, |
|
106 "mail":{"localhost":localhost, "default":localhost, }, } |
|
107 |
219 jobqueue=Jobs(manager, queue, provider) |
108 jobqueue=Jobs(manager, queue, provider) |
220 userdb=MyUserDB(userlist,jobqueue) |
109 userdb=MyUserDB(userlist,jobqueue) |
221 |
110 |
222 #working thread erstellen |
111 #working thread erstellen |
223 from worker import Worker |
112 from worker import Worker |