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@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@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@iptel.org [mailto:serusers-bounces@lists.iptel.org]
On
Behalf Of Java Rockx Sent: 18 September 2004 03:49 To: Java Rockx; serusers@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@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@callcarrera.com wrote:
Do you have mailbox= in * under the sip peer ?
----- Original Message ----- From: "Java Rockx" javarockx@yahoo.com To: serusers@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
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@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
Do you Yahoo!? Declare Yourself - Register online to vote today! http://vote.yahoo.com
Serusers mailing list serusers@lists.iptel.org http://lists.iptel.org/mailman/listinfo/serusers
__________________________________ Do you Yahoo!? Yahoo! Mail - 50x more storage than other providers! http://promotions.yahoo.com/new_mail
Serusers mailing list serusers@lists.iptel.org http://lists.iptel.org/mailman/listinfo/serusers
__________________________________ Do you Yahoo!? New and Improved Yahoo! Mail - Send 10MB messages! http://promotions.yahoo.com/new_mail
Serusers mailing list serusers@lists.iptel.org http://lists.iptel.org/mailman/listinfo/serusers
__________________________________ Do you Yahoo!? New and Improved Yahoo! Mail - Send 10MB messages! http://promotions.yahoo.com/new_mail
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@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}@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@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@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@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@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@iptel.org [mailto:serusers-bounces@lists.iptel.org]
On
Behalf Of Java Rockx Sent: 18 September 2004 03:49 To: Java Rockx; serusers@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@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@callcarrera.com wrote:
Do you have mailbox= in * under the sip peer ?
----- Original Message ----- From: "Java Rockx" javarockx@yahoo.com To: serusers@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
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@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