Dave,
I finally have my MWI working end-to-end. Here's all I did for anyone wishing
to get theirs working. Feel free to point out any weaknesses in my
implementation.
I have SER and Asterisk on different servers. For this example I will call my
server IPs as follows:
ser = 67.72.100.20 (
sip01.mycompany.com)
Asterisk = 67.72.100.21 (
vm01.mycompany.com)
As a note to everyone, please review this and let me know if you can improve
upon the MWI usage.
Regards,
Paul
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
One the SER side:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
* I have a user called "vmserver" so that Asterisk can use sipsak
to send SIP NOTIFY messages to ser
* in my ser.cfg file I have the following to handle NOTIFY messages
# allow NOTIFY messages only from the Asterisk server
if (method=="NOTIFY" & src_ip==67.72.100.20) {
if (!t_relay()) {
sl_reply_error();
break;
};
};
if (method=="SUBSCRIBE") {
# challenge/response
if (!www_authorize("mycompany.com", "subscriber")) {
www_challenge("mycompany.com", "0");
break;
};
# notify the Asterisk server to update the UAs MWI. I
# believe most UAs that support SUBSCRIBE will
# periodically send a SUBSCRIBE message. These cause
# the Asterisk server to update their MWI.
exec_msg("/usr/bin/mwi/subscribe $SIP_RURI");
break;
};
if (uri=~"^sip:7[0-9]*@") {
log(1, "LOG: divert to voice mail\n");
route(6);
break;
}
}
# route for sending UAs to the Asterisk server. We use
# 7 + [Extension] to access the voice mail server. This
# means we strip off the 7 because we need to have the
# ser extension the same as the asterisk extension.
route[6] {
strip(1);
rewritehost("vm01.mycompany.com");
forward(uri:host, uri:port);
}
* The /usr/bin/mwi/subscribe script that is referenced above
is shown here. This is responsible for notifying the
Asterisk server that someone needs their MWI updated
#!/bin/sh
# this script simply accepts as input the subscriber URI such
# as sip:1001@sip01.mycompany.com and "touches" a file with the
# same name. It stores the file in /var/spool/mwi/immediate
# which is later processed in a CRON job
USER=$1
# some input arguments may contain ";user=phone" so we need to
# strip it off. We also need to strip of the "sip:" piece so that
# all we are left with is "1001(a)sip.mycompany.com"
IDX1=`expr index "$1" ":"`
IDX1=$(($IDX1 + 1))
IDX2=`expr index "$1" ";"`
if [ $IDX2 != 0 ]; then
IDX2=$(($IDX2 - $IDX1))
fi
USER=`expr substr $1 $IDX1 $IDX2`
touch /var/spool/mwi/$USER
* I have in CRON a jobs that runs once per minute. This is the script
that CRON executes
#!/bin/sh
# this script uses scp to copy the files from /var/spool/mwi/immediate
# to the Asterisk server. It is important to note that the scp works
# without being prompted for a password.
MSG_HOME=/var/spool/mwi
VM_HOME=/var/spool/mwi/immediate
for file in $MSG_HOME/*
do
if [ -f $file ]; then
scp $file vm01.mycompany.com:$VM_HOME
rm -f $file
fi
done
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
One the Asterisk side:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
* In /etc/asterisk/voicemail.conf I have the following:
[general]
; this script is executed
externnotify=/usr/bin/mwi/mwi-immediate
* In /etc/asterisk/extensions.conf I have the following:
[
sip01.mycompany.com]
exten => vmserver,1,Wait(1)
exten => vmserver,2,Background(please-enter-your)
exten => vmserver,3,VoicemailMain
exten => 1000,1,Macro(vmanswer,1000)
exten => 1001,1,Macro(vmanswer,1001)
[macro-vmanswer]
exten => s,1,Wait(1)
exten => s,2,GotoIf($[${ARG1} = ${CALLERIDNUM}]?3:5)
exten => s,3,VoicemailMain(${ARG1})
exten => s,4,Goto(6)
exten => s,5,Voicemail(u${ARG1})
exten => s,6,System(/usr/bin/mwi/mwi-immediate ${CONTEXT}
${ARG1}(a)sip01.mycompany.com 0)
exten => s,7,Hangup
;NOTE: See the call to mwi-immediate on the hangup. This
; will cause asterisk to update the MWI when a user
; hangs up.
* In /etc/asterisk/sip.conf I have the usual entries for
SIP user accounts
* In /usr/bin/mwi/mwi-immediate I have:
#!/bin/sh
# this script "touches" files in the spool directory which a
# cron jobs later processes. The cron job is where we actually
# send the SIP NOTIFY back to the UAs
CONTEXT=$1
EXTENSION=$2
VM_COUNT=$3
touch /var/spool/mwi/immediate/$EXTENSION
* This is the cron job mentioned in the previous note:
#!/bin/sh
# This script sends the SIP NOTIFY message to UAs. The NOTIFY message
# can either enable or disable the UA message indicator. The script
# looks for any file in $VM_HOME and creates the NOTIFY message via
# the template in $TEMPLATE.
#
# The actual NOTIFY message is sent to the SIP proxy by the sipsak
# utilty. After the message is send we delete the processed file
# from VM_HOME so we don't keep resending the same message. Most
# UAs will periodically send a SUBSCRIBE message to the SIP proxy.
# When this occurs the SIP proxy will place a file in the location
# /var/spool/mwi/delay and a less frequent CRON job will process it.
#
# ALSO NOTE: I am not using the Asterisk "telnet API". I can't
# remember what it's called, but I think looking for voice mail
# files on disk is quicker. I do not know if this is 100% safe since
# I am totally bypassing Asterisk in order to determine if a user has
# new voice mail messages. Can anyone verify this as a good way to
# handle this?
VM_ROOT=/var/spool/asterisk/voicemail
VM_HOME=/var/spool/mwi/immediate
TEMPLATE=/etc/mwi/notify.msg
cd $VM_HOME
for file in *
do
LEN=`expr length $file`
IDX1=`expr index "$file" \@`
IDX2=$(($IDX1 + 1))
IDX1=$(($IDX1 - 1))
MAILBOX=`expr substr $file 1 $IDX1`
DOMAIN=`expr substr $file $IDX2 $LEN`
TOTAL_MESSAGES=`find $VM_ROOT/$DOMAIN/$MAILBOX -name "*.txt" |
wc -l | sed 's/^ *\(.*\) *$/\1/'`
NEW_MESSAGES=`find $VM_ROOT/$DOMAIN/$MAILBOX/INBOX -name "*.txt" |
wc -l | sed 's/^ *\(.*\) *$/\1/'`
OLD_MESSAGES=$(($TOTAL_MESSAGES - $NEW_MESSAGES))
if [ "$NEW_MESSAGES" == "0" ]; then
HAS_NEW="no"
else
HAS_NEW="yes"
fi
CONTENT_LENGTH=$((34 + `expr length $HAS_NEW` +
`expr length $NEW_MESSAGES` +
`expr length $OLD_MESSAGES`))
CMD="s/!SUBSCRIBER!/$file/g;s/!MAILBOX!/$MAILBOX/g;
s/!CONTENT_LENGTH!/$CONTENT_LENGTH/g;
s/!HAS_MESSAGE!/$HAS_NEW/g;
s/!NEW_COUNT!/$NEW_MESSAGES/g;
s/!OLD_COUNT!/$OLD_MESSAGES/g"
cat /etc/mwi/notify.msg | sed -e $CMD > /tmp/mwi-immediate
echo "Notifying $file"
`sipsak shoot -a number4 -f /tmp/mwi-immediate -s sip:$file`
rm $file
done
* The final piece is the $TEMPLATE used in the previous step. This
file is /etc/mwi/notify.msg NOTE: a VERY important detail with this
file is that the line terminator must be <CR><LF> rather than the
Un*x <LF> because if you omit the <CR><LF> you will crash your SIP
phone. There must also be two (2) <CR><LF>'s before the message
body. Also as noted in the previous step, I use sed here to replace
all the !VARIABLE! items prior to using sipsak.
NOTIFY sip:!SUBSCRIBER! SIP/2.0
Via: SIP/2.0/UDP 67.72.100.21:5060
From: <sip:vmserver@sip01.mycompany.com>
To: <sip:!SUBSCRIBER!>
Contact: <sip:!MAILBOX!@67.72.100.21>
Call-ID: 4d61cf9e505d40e905032a18329d61ec(a)67.72.100.21
CSeq: 1 NOTIFY
User-Agent: VoiceMail
Event: message-summary
Content-Type: application/simple-message-summary
Content-Length: !CONTENT_LENGTH!
Messages-Waiting: !HAS_MESSAGE!
Voicemail: !NEW_COUNT!/!OLD_COUNT!
--- Dave Bath <dave(a)fuuz.com> wrote:
Hi Java,
Presumably your users are registered with SER? And you have some
specific routing for when they check their mailbox? Either forwarding a
short code to VoiceMailMain or forwarding a variation of their extension
or something? How about simply checking for the "BYE" method in this
routing block and using the exec module in SER to force a recheck of the
script on the asterisk box?
D
-----Original Message-----
From: Java Rockx [mailto:javarockx@yahoo.com]
Sent: 19 September 2004 05:56
To: serusers(a)lists.iptel.org; Dave Bath
Subject: RE: [Serusers] Injecting SIP NOTIFY into ser FIFO
Dave,
I cheated big time. I use sipsak to send the message from my Asterisk
server to
my ser proxy. I realized to late that I mentioned FIFO in my original
post.
I use the Asterisk "externnotify" in the voicemail.conf file to specify
an
external bash script. This script then simply "touches" a file in
/var/spool/mwi/ for later processing by cron.
My cron job comes along after the fact and picks up all the files in
/var/spool/mwi/ and generates the appropriate SIP NOTIFY message and
then it
uses sipsak to "shoot" it to the ser proxy.
This works really well for me when I need to turn on the MWI for a UA.
What I
still can't do is turn the MWI off when there are no new messages. I'm
really
having a hard time trying to determine how to hook the "Hang-Up" event
in
Asterisk. I need to essentially have an "externnotify" for hang ups so I
can
check the message status for a the mailbox and cancel the MWI if there
are no
new messages.
I also need to handle SUBSCRIBE messages that the SIP proxy gets. I'm
planning
on have the ser.cfg file execute an external script that will get a
message to
the cron job on my Asterisk box. Once the Asterisk box gets notified of
the
SUBSCRIBE message, it will process the same as if the user just had a
voice
mail left and the externnotify event got fired.
Paul
--- Dave Bath <dave(a)fuuz.com> wrote:
Hey Java,
I know it's cheeky, but I was wondering if you might let me see the
script you wrote to create the mwi message? Great piece of work!
Dave
-----Original Message-----
From: serusers-bounces(a)iptel.org [mailto:serusers-bounces@lists.iptel.org]
On
Behalf Of Java Rockx
Sent: 18 September 2004 03:49
To: Java Rockx; serusers(a)lists.iptel.org; Fred Tips
Subject: Re: [Serusers] Injecting SIP NOTIFY into ser FIFO
I found my problem. I had to convert the NOTIFY message from Unix
format
to
Windoz format. I used the unix2dos command to do this.
Everything is good now.
P
--- Java Rockx <javarockx(a)yahoo.com> wrote:
Fred,
I actually messed up my original post. I stated that I am placing my
NOTIFY
messages directly in the ser FIFO. In reality I
should have said I'm
using
> sipsak to send the message to ser just like any normal UA would.
>
> In my asterisk file sip.conf I have the following:
>
> [general]
> register => vmserver:number4@sip01.mycompany.com/vmserver
>
> So asterisk is a registered UA with ser. Doing this I assumed I
could
simply
> use sipsak from the asterisk server to send NOTIFY messages to the
ser
box.
I can infact do this, becuase when I do so the "TO:" SIP UA crashes.
That
> tells
> me that everything is working, but my message is not 100% correct.
>
> I also have the user extension configured in ser and asterisk and
all
is
working because I can leave voice mail and listen
to voice mail
normally.
> It's
> just the MWI that is giving me grief.
>
> Paul
>
> --- Fred Tips <fred(a)callcarrera.com> wrote:
>
> > Do you have mailbox= in * under the sip peer ?
> >
> > ----- Original Message -----
> > From: "Java Rockx" <javarockx(a)yahoo.com>
> > To: <serusers(a)lists.iptel.org>
> > Sent: Friday, September 17, 2004 3:14 PM
> > Subject: [Serusers] Injecting SIP NOTIFY into ser FIFO
> >
> >
> > > Hello everyone.
> > >
> > > Can anyone tell me what I'm doing wrong? I am using Asterisk as
a
voice
> mail
> > server for my ser SIP proxy. Everything works fine expect the
Message
> Waiting
> > Indicator (MWI). I've read a few articles and got some good feed
back
> from
> > this
> > > mailing list but here is my problem.
> > >
> > > My NOTIFY message is crashing my SIP phone. Here is my setup.
I'm
using
> > "externnotify" in Asterisk to
call a /usr/bin/mwi script that I
wrote.
All
> this
> > script does is create file in /var/spool/mwi that contains the
> externnotify
> > information.
> >
> > Then cron periodically processes the messages in /var/spool/mwi.
By
> process I
> > mean it will create the SIP NOTIFY messages and place them
directly in
to
> > the
> > > ser FIFO. The problem is when this happens the SIP phone
crashes.
> > >
> > > Here is a sample of my NOTIFY message that my Asterisk server
cron
job is
> > sending to the ser FIFO. I wish there
was a way to just have
Asterisk
> > register
> > > with the ser proxy and handle this automatically.
> > >
> > > Can anyone see a problem?
> > > Regards,
> > > Paul
> > >
> > > --------------------------------------------------
> > >
> > > NOTIFY sip:1002@sip01.mycompany.com SIP/2.0
> > > Via: SIP/2.0/UDP 4.4.242.201:5060
> > > From: "vmserver" <sip:vmserver@sip01.mycompany.com>
> > > To: <sip:1002@sip01.mycomany.com>
> > > Contact: <sip:vmserver@sip01.mycompany.com>
> > > Call-ID: 5b8be1521efe68b5365a36466ad3b87(a)4.4.242.201
> > > CSeq: 1101 NOTIFY
> > > User-Agent: VoiceMail
> > > Event: message-summary
> > > Content-Type: application/simple-message-summary
> > > Content-Length: 38
> > >
> > >
> > > Messages-Waiting: yes
> > > Voicemail: 13/0
> > >
> >
> > >
> > >
=== message truncated ===
_______________________________
Do you Yahoo!?
Declare Yourself - Register online to vote today!
http://vote.yahoo.com