From af93dd72c42bce9dc5528d7de9fd09ec285d8cb7 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 7 Jan 2004 01:44:04 +0000 Subject: It works! git-svn-id: file:///home/lennart/svn/public/ivam2/trunk@17 dbf6933d-3bce-0310-9bcc-ed052ba35b35 --- client/ivam-autobox | 2 +- client/ivamApi.py | 5 ++- client/ivamCore.py | 2 +- client/ivamPipeConnector.py | 54 ++++++++++++----------- client/ivamVoiceBox.py | 103 ++++++++++++++++++++++++++------------------ conf/msntab | 13 +++--- src/modem.c | 3 +- 7 files changed, 104 insertions(+), 78 deletions(-) diff --git a/client/ivam-autobox b/client/ivam-autobox index 2713347..bb7fcfc 100755 --- a/client/ivam-autobox +++ b/client/ivam-autobox @@ -36,7 +36,7 @@ def parseArgs(vb, argv): elif o in ("-P", "--pin-file"): pin = getContents(a) - dname = "msn-" + sys.getenv("RINGMSN") + dname = "msn-" + os.getenv("RINGMSN") if len(args): dname = args[0] + "/" + dname diff --git a/client/ivamApi.py b/client/ivamApi.py index 3fc86b3..1413116 100644 --- a/client/ivamApi.py +++ b/client/ivamApi.py @@ -30,13 +30,16 @@ class Connector: def stopPlayback(self): pass + def stopPlayback2(self): # Same as previous but call onClipFinish + pass + def recordClip(self, fname, gzip = False): pass def stopRecording(self): pass - def timeout(self, t): + def setTimeout(self, t): pass def hangup(self, t): diff --git a/client/ivamCore.py b/client/ivamCore.py index a091bc0..972c156 100644 --- a/client/ivamCore.py +++ b/client/ivamCore.py @@ -3,7 +3,7 @@ import sys, os import ivamPipeConnector -DEBUG = True +DEBUG = False def newConnector(p): diff --git a/client/ivamPipeConnector.py b/client/ivamPipeConnector.py index ff0be5f..70fd93d 100644 --- a/client/ivamPipeConnector.py +++ b/client/ivamPipeConnector.py @@ -1,5 +1,5 @@ -import os, sys, time, select, signal +import os, sys, time, select, signal, gzip import ivamCore, ivamApi, ivamUtil @@ -12,7 +12,7 @@ class PipeConnector(ivamApi.Connector): BUFSIZE = 128 - sdtin = sys.stdin + stdin = sys.stdin stdout = sys.stdout playing = False @@ -42,15 +42,15 @@ class PipeConnector(ivamApi.Connector): self.dtmfFifo = None return - self.dtmfFifo = file.open(fn, "rb") + self.dtmfFifo = file(fn, "rb") def playClip(self, fname): + self.stopPlayback() + if ivamCore.DEBUG: ivamCore.log("playClip('%s')" % fname) - self.stopPlayback() - self.playFile = ivamUtil.magicFile(fname, "rb") self.playName = fname self.playing = True @@ -65,16 +65,19 @@ class PipeConnector(ivamApi.Connector): self.playFile.close() self.playing = False - processor.onClipFinish(self, self.playName) + def stopPlayback2(self): - def recordClip(self, fname, gzip = False): + self.stopPlayback() + self.processor.onClipFinish(self, self.playName) - if ivamCore.DEBUG: - ivamCore.log("recordClip('%s')" % fname) + def recordClip(self, fname, z = False): self.stopRecording() - if gzip: + if ivamCore.DEBUG: + ivamCore.log("recordClip('%s')" % fname) + + if z: self.recordFile = gzip.open(fname, "w+b") else: self.recordFile = open(fname, "w+b") @@ -91,9 +94,9 @@ class PipeConnector(ivamApi.Connector): self.recordFile.close() self.recording = False - processor.onRecordFinish(self, self.recordName) + self.processor.onRecordFinish(self, self.recordName) - def timeout(self, t): + def setTimeout(self, t): if ivamCore.DEBUG: ivamCore.log("timeout(%u)" % t) @@ -115,7 +118,9 @@ class PipeConnector(ivamApi.Connector): self.stopPlayback() self.stopRecording() self.processor.onHangup(self) - self.dtmfFifo.close() + + if not self.dtmfFifo is None: + self.dtmfFifo.close() if ivamCore.DEBUG: ivamCore.log("run() finished") @@ -131,9 +136,6 @@ class PipeConnector(ivamApi.Connector): while not self.quit: - if ivamCore.DEBUG: - ivamCore.log("iteration") - t = None now = time.time() @@ -153,14 +155,15 @@ class PipeConnector(ivamApi.Connector): o += [self.stdout] if t is None: - i, o = select.select(i, o, []) + i, o, x = select.select(i, o, []) else: - i, o = select.select(i, o, [], t) + i, o, x = select.select(i, o, [], t) now = time.time() - if self.timeout < now: - processor.onTimeout() + if self.timeout and self.timeout < now: + self.processor.onTimeout(self) + self.timeout = 0 if self.quit: break # Check DTMF fifo @@ -174,12 +177,13 @@ class PipeConnector(ivamApi.Connector): if self.quit: break # Check STDIN - if self.stdin in o: + if self.stdin in i: self.readStdin() if self.quit: break def readStdin(self): + buf = os.read(self.stdin.fileno(), self.BUFSIZE) if buf == "": @@ -199,7 +203,7 @@ class PipeConnector(ivamApi.Connector): # EOF? if len(self.playBuffer) == 0: - self.stopPlayback() + self.stopPlayback2() return c = os.write(self.stdout.fileno(), self.playBuffer) @@ -208,14 +212,14 @@ class PipeConnector(ivamApi.Connector): if len(self.playBuffer) == 0: self.playBuffer = None - def dtmfCheck(self): + def handleDtmf(self): if not self.dtmfFifo is None: - d = self.dtmfFifoFd.read(1) + d = self.dtmfFifo.read(1) if d == "": self.dtmfFifo.close() self.dtmfFifo = None else: - self.onDtmfEvent(self, d) + self.processor.onDtmfEvent(self, d) diff --git a/client/ivamVoiceBox.py b/client/ivamVoiceBox.py index 9217005..131e5c5 100644 --- a/client/ivamVoiceBox.py +++ b/client/ivamVoiceBox.py @@ -1,5 +1,5 @@ -import getopt, sys, os +import getopt, sys, os, time, re import ivamApi, ivamCore, ivamDefs from ivamUtil import getContents, setContents @@ -14,6 +14,9 @@ class VoiceBox(ivamApi.Processor): currentState = STATE_INVALID fileSuffix = ".ulaw.gz" + def getClip(self, s): + return "%s/%s%s" % (self.directory, s, self.fileSuffix) + def onConnect(self, c, callerNumber, ringNumber): if ivamCore.DEBUG: @@ -23,18 +26,20 @@ class VoiceBox(ivamApi.Processor): self.ringNumber = ringNumber self.currentState = self.STATE_WELCOME - c.playClip("welcome") + c.playClip(self.getClip("welcome")) - def loginComplete(self): + def loginComplete(self, c): self.messages = self.getMessageNames() self.currentMessage = 0 + + ivamCore.log("Successful login from %s for MSN %s." % (self.callerNumber, self.ringNumber)) if len(self.messages) == 0: self.currentState = self.STATE_EMPTY - c.playClip("empty") + c.playClip(self.getClip("empty")) else: self.currentState = self.STATE_MESSAGE_BEEP - c.playClip("beep") + c.playClip(self.getClip("beep")) def onClipFinish(self, c, fname): @@ -43,7 +48,7 @@ class VoiceBox(ivamApi.Processor): if self.currentState == self.STATE_WELCOME: self.currentState = self.STATE_WELCOME_BEEP; - c.playClip("beep") + c.playClip(self.getClip("beep")) elif self.currentState == self.STATE_WELCOME_BEEP: self.currentState = self.STATE_RECORD @@ -61,45 +66,45 @@ class VoiceBox(ivamApi.Processor): elif self.currentState == self.STATE_AUTH_OK: - self.loginComplete() + self.loginComplete(c) elif self.currentState == self.STATE_MESSAGE_BEEP: while True: if self.currentMessage >= len(self.messages): - self.currentMessage = self.STATE_NO_MORE_MESSAGES - c.playClip("nomoremessages") + self.currentState = self.STATE_NO_MORE_MESSAGES + c.playClip(self.getClip("nomoremessages")) else: - self.currentState = self.STATE_MESSAGE_BEEP + self.currentState = self.STATE_MESSAGE try: c.playClip(self.messages[self.currentMessage]) - break - except IOError, e: del(self.messages[self.currentMessage]) - if len(self.messages) == 0: - self.currentState = self.STATE_EMPTY - c.playClip("empty") - - continue + if len(self.messages) > 0: + continue + + self.currentState = self.STATE_EMPTY + c.playClip(self.getClip("empty")) + + break elif self.currentState == self.STATE_MESSAGE: self.currentMessage +=1 self.currentState = self.STATE_MESSAGE_BEEP - c.playClip("beep") + c.playClip(self.getClip("beep")) - elif self.currentState == self.STATE_REMOVE: + elif self.currentState == self.STATE_REMOVED: if len(self.messages) == 0: self.currentState = self.STATE_EMPTY - c.playClip("empty") + c.playClip(self.getClip("empty")) else: self.currentState = self.STATE_MESSAGE_BEEP - c.playClip("beep") + c.playClip(self.getClip("beep")) elif self.currentState == self.STATE_NO_MORE_MESSAGES: @@ -107,8 +112,9 @@ class VoiceBox(ivamApi.Processor): pass elif self.currentState == self.STATE_EMPTY: - self.currentState = self.STATE_FINISH - c.hangup() + + # Silence ... + pass def onDtmfEvent(self, c, event): @@ -118,7 +124,7 @@ class VoiceBox(ivamApi.Processor): if ((self.currentState == self.STATE_WELCOME) or (self.currentState == self.STATE_WELCOME_BEEP)) and (event == '0'): if self.pin == "": - self.loginComplete() + self.loginComplete(c) elif self.pin == "-": self.currentState = self.STATE_FINISH @@ -128,8 +134,8 @@ class VoiceBox(ivamApi.Processor): self.currentState = self.STATE_AUTH self.inputPin = "" c.stopPlayback() - c.playClip("auth") - c.setTimeout(AUTH_TIMEOUT) + c.playClip(self.getClip("auth")) + c.setTimeout(self.AUTH_TIMEOUT) elif self.currentState == self.STATE_AUTH: c.stopPlayback() @@ -140,45 +146,47 @@ class VoiceBox(ivamApi.Processor): if self.inputPin == self.pin: self.currentState = self.STATE_AUTH_OK - c.playClip("authok") + c.playClip(self.getClip("authok")) else: self.currentState = self.STATE_FINISH c.hangup() elif self.currentState in [self.STATE_MESSAGE, self.STATE_MESSAGE_BEEP, self.STATE_NO_MORE_MESSAGES] : - changed = 0 - if event == '0': if self.currentMessage >= len(self.messages): self.currentMessage = len(self.messages)-1 os.remove(self.messages[self.currentMessage]) + ivamCore.log("Sucessfully removed message '%s' on behalf of %s for MSN %s." % (self.messages[self.currentMessage], self.callerNumber, self.ringNumber)) del(self.messages[self.currentMessage]) + self.currentState = self.STATE_REMOVED - c.playClip("removed") + c.playClip(self.getClip("removed")) else: + changed = False + if event in ['4', '2']: self.currentMessage -= 1 - changed = 1 + changed = True if event in ['6', '8']: self.currentMessage += 1 - changed = 1 + changed = True if event == '5': - changed = 1 + changed = True if event == '1': self.currentMessage = 0 - changed = 1 + changed = True if event == '7': self.currentMessage = len(self.messages)-1 - changed = 1 + changed = True if self.currentMessage < 0: self.currentMessage = 0 @@ -188,10 +196,10 @@ class VoiceBox(ivamApi.Processor): if changed: self.currentState = self.STATE_MESSAGE_BEEP - c.playClip("beep") + c.playClip(self.getClip("beep")) else: - c.stopPlayback() + c.stopPlayback2() def onTimeout(self, c): @@ -201,17 +209,20 @@ class VoiceBox(ivamApi.Processor): if self.currentState == self.STATE_RECORD: self.currentState = self.STATE_PRE_FINISH c.stopRecording() - c.playClip("beep") + c.playClip(self.getClip("beep")) - elif self.currentState in [self.STATE_AUTH, self.STATE_PIN2, self.STATE_PIN3, self.STATE_PIN4]: + elif self.currentState == self.STATE_AUTH: self.currentState = self.STATE_FINISH c.hangup() def onRecordFinish(self, c, fname): if ivamCore.DEBUG: - ivamCore.log("onRecordFinish(%s)", fname) + ivamCore.log("onRecordFinish(%s)" % fname) + ivamCore.log("Sucessfully recorded new message '%s' from %s for MSN %s." % (fname, self.callerNumber, self.ringNumber)) + + os.environ["SPOOLDIR"] = self.directory ivamCore.log("Starting new message notification program.") r=os.spawnvp(os.P_WAIT, self.messageProgram, (self.messageProgram, fname)) ivamCore.log("Program finished (return value is %i)." % r) @@ -219,15 +230,19 @@ class VoiceBox(ivamApi.Processor): def getMessageNames(self): f = os.listdir(self.messageDirectory) + f = map(lambda e: "%s/%s" % (self.messageDirectory, e), f) f.sort() f.reverse() return f def nextMessageName(self): - return "%s/%010i-%s-%s%s" % (self.messageDirectory, time.time(), self.callerNumber, self.callerNumber, self.fileSuffix) + return "%s/%010u:%s:%s%s" % (self.messageDirectory, time.time(), self.ringNumber, self.callerNumber, self.fileSuffix) def setPin(self, pin): + + if ivamCore.DEBUG: + ivamCore.log("setPin('%s')" % pin) if re.match('^([0-9#*]*|-)$', pin).end() is None: ivamCore.log("Invalid PIN. PIN has to consist of 0-9#*. Use '-' for always denying access.") @@ -242,6 +257,7 @@ class VoiceBox(ivamApi.Processor): self.directory = dname self.messageDirectory = dname + "/messages" + try: self.setPin(getContents("%s/PIN" % dname)) except Exception: @@ -252,11 +268,11 @@ class VoiceBox(ivamApi.Processor): except Exception: self.recordTime = 60 - messageProgram = "%s/newmessage" % dname + self.messageProgram = "%s/newmessage" % dname -def setupVoiceBox(dname, pin = "-", recordTime = 60): +def setupVoiceBox(dname, pin = "-", recordTime = 60, email = "root"): if dname.find("/") == -1: dname = "%s/%s" % (ivamDefs.spoolDirectory, dname) @@ -265,6 +281,7 @@ def setupVoiceBox(dname, pin = "-", recordTime = 60): setContents("%s/PIN" % dname, pin) setContents("%s/RECORD_TIME" % dname, `recordTime`) + setContents("%s/EMAIL" % dname, email) ulaw = map(lambda e: e+".ulaw.gz", ('welcome', 'beep', 'empty', 'nomoremessages', 'auth', 'authok', 'removed')) diff --git a/conf/msntab b/conf/msntab index 239eae4..b4823e9 100644 --- a/conf/msntab +++ b/conf/msntab @@ -1,12 +1,13 @@ # local MSN remote MSN options action -41264179 41264179 rings=0 ivam-play /var/spool/ivam/welcome.ulaw -41264179 41264177 rings=0 ivam-dialup --pin=4711 ppp0 -* 41264179 rings=0 @hangup -41264179 * rings=2,shbuf ivam-voicebox --pin=4711 +41264179 * rings=0 ivam-autobox + +#41264179 41264177 rings=0 ivam-dialup --pin=4711 ppp0 +#* 41264179 rings=0 @hangup +#41264179 * rings=2,shbuf ivam-voicebox --pin=4711 #46 36 defaults @hangup -46 36 rings=0 ivam-play /var/spool/ivam/welcome.ulaw -46 * defaults ivam-echo +#46 36 rings=0 ivam-play /var/spool/ivam/welcome.ulaw +#46 * defaults ivam-echo # $Id$ diff --git a/src/modem.c b/src/modem.c index ef79b20..e3d3cec 100644 --- a/src/modem.c +++ b/src/modem.c @@ -132,7 +132,7 @@ struct modem *modem_open(const char *dev) { m->child_pid = -1; m->child_buffio = NULL; - m->listen_msn = "46"; + m->listen_msn = "41264179"; // "46"; m->tabentry = NULL; if (modem_reopen(m) < 0) @@ -552,6 +552,7 @@ static int modem_input_ready_cb(struct buffio *b, void *user) { m->command_index++; if (m->command_index >= INIT_AT_COMMANDS) { + daemon_log(LOG_INFO, "Listening on '%s'.", m->listen_msn); daemon_log(LOG_INFO, "Modem successfully initialised, waiting for calls."); m->state = MODEM_STATE_CALLER_NUMBER_EXPECT; modem_timeout(m, 0); -- cgit