summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2004-01-07 01:44:04 +0000
committerLennart Poettering <lennart@poettering.net>2004-01-07 01:44:04 +0000
commitaf93dd72c42bce9dc5528d7de9fd09ec285d8cb7 (patch)
tree3d3775d415a01b56fe4f534234b6dc7a9d0425b5
parent2076ab0ce49b934ce287ff9a863d4b8885946dec (diff)
It works!
git-svn-id: file:///home/lennart/svn/public/ivam2/trunk@17 dbf6933d-3bce-0310-9bcc-ed052ba35b35
-rwxr-xr-xclient/ivam-autobox2
-rw-r--r--client/ivamApi.py5
-rw-r--r--client/ivamCore.py2
-rw-r--r--client/ivamPipeConnector.py54
-rw-r--r--client/ivamVoiceBox.py103
-rw-r--r--conf/msntab13
-rw-r--r--src/modem.c3
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);