In the ser admin guide it says
"You can refer to voicemail example config file to know what your configuration file should include. Note that voicemail uses subsriber database table to determine recepient's email address. Read the README file in the vm module directory for complete description of the functions and variables that are used by voicemail and how they work."
I can't find any complete descriptions of the functions and variables and how they work. The README file is very short and basic.
In the example config file there are many calls to vm(/tmp/am_fifo", "*"); where * is "announcement" or "voicemail" or "echo" or "bye" or "conference." Are these all required in a basic voicemail setup? Can anyone point me to more information on how this works and what each of these modules are doing?
If I call a user who isn't logged in I can hear the voicemail default greeting, but then the line goes silent. I don't think there is any voice recording happening. See ser.cfg attached.
Also, if a timer is set to send calls to vm (using failure_route) after a certain timeout, is there a way to prevent that timeout from killing calls routed to the PSTN?
Thanks, G.
--------------------------------- Do you Yahoo!? The New Yahoo! Shopping - with improved product search
# # $Id: ser.cfg,v 1.20 2003/05/31 21:12:19 jiri Exp $ # # simple quick-start config script #
# ----------- global configuration parameters ------------------------
debug=3 # debug level (cmd line: -dddddddddd) fork=yes log_stderror=no # (cmd line: -E)
/* Uncomment these lines to enter debugging mode debug=8 fork=no log_stderror=yes */
check_via=no # (cmd. line: -v) dns=no # (cmd. line: -r) rev_dns=no # (cmd. line: -R) port=5060 children=4 fifo="/tmp/ser_fifo" sip_warning=no # # ------------------ module loading ---------------------------------- # # Uncomment this if you want to use SQL database loadmodule "/usr/local/lib/ser/modules/mysql.so" # loadmodule "/usr/local/lib/ser/modules/sl.so" loadmodule "/usr/local/lib/ser/modules/tm.so" loadmodule "/usr/local/lib/ser/modules/rr.so" loadmodule "/usr/local/lib/ser/modules/maxfwd.so" loadmodule "/usr/local/lib/ser/modules/usrloc.so" loadmodule "/usr/local/lib/ser/modules/registrar.so" loadmodule "/usr/local/lib/ser/modules/vm.so" loadmodule "/usr/local/lib/ser/modules/pa.so" loadmodule "/usr/local/lib/ser/modules/msilo.so" loadmodule "/usr/local/lib/ser/modules/acc.so" loadmodule "/usr/local/lib/ser/modules/textops.so" # #loadmodule "/usr/local/lib/ser/modules/nathelper.so" #loadmodule "/usr/local/lib/ser/modules/uri.so" #loadmodule "/usr/local/lib/ser/modules/group.so" # # Uncomment this if you want digest authentication # mysql.so must be loaded ! loadmodule "/usr/local/lib/ser/modules/auth.so" loadmodule "/usr/local/lib/ser/modules/auth_db.so" # # ----------------- setting module-specific parameters --------------- # # -- usrloc params -- # #modparam("usrloc", "db_mode", 0) # # Uncomment this if you want to use SQL database # for persistent storage and comment the previous line modparam("usrloc", "db_mode", 2) # # -- auth params -- # Uncomment if you are using auth module # modparam("auth_db", "calculate_ha1", yes) # # If you set "calculate_ha1" parameter to yes (which true in this config), # uncomment also the following parameter) # modparam("auth_db", "password_column", "password") # # modparam("acc", "log_level", 1) modparam("acc", "log_flag", 2) modparam("acc", "log_missed_flag", 2) modparam("acc", "log_fmt", "fimos") # #modparam("tm", "fr_inv_timer", 35) #INVITE timeout #modparam("tm", "fr_timer", 30) #negative INVITE replay or no #final reply for a request for ACK # modparam("voicemail", "db_url", "sql://ser:heslo@localhost/ser") # #modparam("acc", "db_url", "sql://ser:heslo@localhost/ser") #modparam("acc", "db_flag", 2) #modparam("acc", "db_missed_flag", 2) # # ------------------------- request routing logic ------------------- # # main routing logic # alias=10.10.10.49 #sip server IP address alias=jiffypop #sip server name alias=mydomain.com #sip domain/realm alias=jiffypop.mydomain.com #sip server FQDN # route{ log(1,"entering main route"); #prevent strangers from claiming to belong to our domain; #if sender claims to be in our domain in From header field, #better authenticate him # code not inserted yet :)
# initial sanity checks -- messages with # max_forwards==0, or excessively long requests if (!mf_process_maxfwd_header("10")) { sl_send_reply("483","Too Many Hops"); break; }; if (len_gt( max_len )) { sl_send_reply("513", "Message too big"); break; };
# we record-route all messages -- to make sure that # subsequent messages will go through our proxy; that's # particularly good if upstream and downstream entities # use different transport protocol record_route(); # loose-route processing if (loose_route()) { t_relay(); break; }; setflag(2); #set flag for accounting # if the request is for other domain use UsrLoc # (in case it does not work, use the following command # with proper names and addresses in it)
if (uri==myself) { if (method=="REGISTER") { # digest authentication log(1,"request for registration"); if (!www_authorize("mydomain.com", "subscriber")) { www_challenge("mydomain.com", "0"); break; }; save("location"); break; };
/* ********** Dial out to PSTN logic ************* */
#forward numerical 7 digit requests to gateway if(uri=~"^sip:[0-9]{7}@(mydomain.com|10.10.10.49)"){ # append_hf("Remote-Party-ID:sip:6508466600@mydomain.com;party=calling;id-type=subscriber;privacy=off;screen=no;\r\n"); rewritehostport("10.10.10.5:5060"); log(1,"7 digit expression match"); route(2); break;
}; # strip 650 and forward to GW is user dials 650 before phone no. if(uri=~"^sip:650[0-9]{7}@(mydomain.com|10.10.10.49)"){ strip(3); rewritehostport("10.10.10.5:5060"); log(1,"650 area code dialed, 650 stripped"); route(2); break; }; #forward numerical 10 digit requests to gateway, append a 1 first if(uri=~"^sip:[0-9]{10}@(mydomain.com|10.10.10.49)"){ prefix("1"); rewritehostport("10.10.10.5:5060"); log(1,"10 digit expression match, prefix 1"); route(2); break; }; #forward numerical 11 digit requests that start with a 1 to GW if(uri=~"^sip:1[0-9]{10}@(mydomain.com|10.10.10.49)"){ rewritehostport("10.10.10.5:5060"); log(1,"10 digit exp match w/leading 1"); route(2); break; }; #forward international N digit requests to gateway if(uri=~"^sip:011[0-9]+@(mydomain.com|10.10.10.49)"){ rewritehostport("10.10.10.5:5060"); log(1,"international expression match"); route(2); break; };
/* ********** VOICEMAIL logic ************* */
if (uri=~"^sip:voicemail+@"){ t_newtran(); t_reply("100", "Trying -- just a second"); if(!vm("/tmp/am_fifo","announcement")){ t_reply("500", "SEMS error"); }; log(1,"sip:voicemail uri match"); break; }; /* ****** Find Aliases and Locations of users ********* */
# It is very important to lookup "aliases" before looking up "locations"
if(!lookup("aliases")){ log(1,"Couldn't find any matching alias"); sl_send_reply("404", "User does not exist"); break; };
if(!lookup("location")) { log(1,"unable to locate user"); route(3); break; };
};
# forward to current uri now; use stateful forwarding; that # works reliably even if we forward from TCP to UDP t_on_failure("1"); if (!t_relay()) { sl_reply_error(); }; log(1,"eof"); }
route[2]{ log(1,"route[2]:SIP-to-PSTN call routed"); if(!t_relay()){ sl_reply_error(); }; }
route[3]{ log(1,"route[3]: voicemail processing"); if(method=="INVITE" || method=="ACK"){ log(1,"1st if entered in route[3] *vm*"); t_newtran(); t_reply("100","Trying -- just a second"); if(!vm("/tmp/am_fifo","voicemail")){ # "announcement" was replaced with "voicemail" log(1,"vm module called and failed"); t_reply("500", "SEMS error"); }; break; }; log(1,"end of route[3], 1st if check not entered"); }
failure_route[1]{ log(1,"failure_route[1]:jump to vm processing"); route(3); # break; }
At 07:16 PM 9/25/2003, Gavin Bensom wrote:
In the ser admin guide it says
"You can refer to voicemail example config file to know what your configuration file should include. Note that voicemail uses subsriber database table to determine recepient's email address. Read the README file in the vm module directory for complete description of the functions and variables that are used by voicemail and how they work."
I can't find any complete descriptions of the functions and variables and how they work. The README file is very short and basic.
In the example config file there are many calls to vm(/tmp/am_fifo", "*"); where * is "announcement" or "voicemail" or "echo" or "bye" or "conference." Are these all required in a basic voicemail setup? C
If you want to setup voicemail, use just vm("/tmp/am_fifo", "voicemail"); the second parameter describes behaviour of the media component. You don't want to deploy the other examples.
an anyone point me to more information on how this works and what each of these modules are doing?
If I call a user who isn't logged in I can hear the voicemail default greeting, but then the line goes silent. I don't think there is any voice recording happening. See ser.cfg attached.
Recorder is silent when it records, that's normal behaviour. What matters is whether you then receive a WAV file by email or not. SEMS is running (you hear announcement), so you should.
Also, if a timer is set to send calls to vm (using failure_route) after a certain timeout, is there a way to prevent that timeout from killing calls routed to the PSTN?
If you want failure_route to be evoked only for some calls, then set t_on_failure_route for such. You already do so in your script, don't you?
There is other problem though -- the failure_route logic for VM should be different from that in route block -- you can't create transaction state two times (first time with t_relay, second time with t_newtran). SER will certainly complain with some error message in your logs.
I will introduce some new command which hides details of transaction processing from script writers and can be used from both route[] and failure_route[]. (I didn't think of it before since I used voicemail on some other machine than proxy server.)
-jiri
Thanks, G.
Do you Yahoo!? http://shopping.yahoo.com/?__yltc=s%3A150000443%2Cd%3A22708228%2Cslk%3Atext%2Csec%3AmailThe New Yahoo! Shopping - with improved product search # # $Id: ser.cfg,v 1.20 2003/05/31 21:12:19 jiri Exp $ # # simple quick-start config script #
# ----------- global configuration parameters ------------------------
debug=3 # debug level (cmd line: -dddddddddd) fork=yes log_stderror=no # (cmd line: -E)
/* Uncomment these lines to enter debugging mode debug=8 fork=no log_stderror=yes */
check_via=no # (cmd. line: -v) dns=no # (cmd. line: -r) rev_dns=no # (cmd. line: -R) port=5060 children=4 fifo="/tmp/ser_fifo" sip_warning=no # # ------------------ module loading ---------------------------------- # # Uncomment this if you want to use SQL database loadmodule "/usr/local/lib/ser/modules/mysql.so" # loadmodule "/usr/local/lib/ser/modules/sl.so" loadmodule "/usr/local/lib/ser/modules/tm.so" loadmodule "/usr/local/lib/ser/modules/rr.so" loadmodule "/usr/local/lib/ser/modules/maxfwd.so" loadmodule "/usr/local/lib/ser/modules/usrloc.so" loadmodule "/usr/local/lib/ser/modules/registrar.so" loadmodule "/usr/local/lib/ser/modules/vm.so" loadmodule "/usr/local/lib/ser/modules/pa.so" loadmodule "/usr/local/lib/ser/modules/msilo.so" loadmodule "/usr/local/lib/ser/modules/acc.so" loadmodule "/usr/local/lib/ser/modules/textops.so" # #loadmodule "/usr/local/lib/ser/modules/nathelper.so" #loadmodule "/usr/local/lib/ser/modules/uri.so" #loadmodule "/usr/local/lib/ser/modules/group.so" # # Uncomment this if you want digest authentication # mysql.so must be loaded ! loadmodule "/usr/local/lib/ser/modules/auth.so" loadmodule "/usr/local/lib/ser/modules/auth_db.so" # # ----------------- setting module-specific parameters --------------- # # -- usrloc params -- # #modparam("usrloc", "db_mode", 0) # # Uncomment this if you want to use SQL database # for persistent storage and comment the previous line modparam("usrloc", "db_mode", 2) # # -- auth params -- # Uncomment if you are using auth module # modparam("auth_db", "calculate_ha1", yes) # # If you set "calculate_ha1" parameter to yes (which true in this config), # uncomment also the following parameter) # modparam("auth_db", "password_column", "password") # # modparam("acc", "log_level", 1) modparam("acc", "log_flag", 2) modparam("acc", "log_missed_flag", 2) modparam("acc", "log_fmt", "fimos") # #modparam("tm", "fr_inv_timer", 35) #INVITE timeout #modparam("tm", "fr_timer", 30) #negative INVITE replay or no #final reply for a request for ACK # modparam("voicemail", "db_url", "sql://ser:heslo@localhost/ser") # #modparam("acc", "db_url", "sql://ser:heslo@localhost/ser") #modparam("acc", "db_flag", 2) #modparam("acc", "db_missed_flag", 2) # # ------------------------- request routing logic ------------------- # # main routing logic # alias=10.10.10.49 #sip server IP address alias=jiffypop #sip server name alias=mydomain.com #sip domain/realm alias=jiffypop.mydomain.com #sip server FQDN # route{ log(1,"entering main route"); #prevent strangers from claiming to belong to our domain; #if sender claims to be in our domain in From header field, #better authenticate him # code not inserted yet :)
# initial sanity checks -- messages with # max_forwards==0, or excessively long requests if (!mf_process_maxfwd_header("10")) { sl_send_reply("483","Too Many Hops"); break; }; if (len_gt( max_len )) { sl_send_reply("513", "Message too big"); break; }; # we record-route all messages -- to make sure that # subsequent messages will go through our proxy; that's # particularly good if upstream and downstream entities # use different transport protocol record_route(); # loose-route processing if (loose_route()) { t_relay(); break; }; setflag(2); #set flag for accounting # if the request is for other domain use UsrLoc # (in case it does not work, use the following command # with proper names and addresses in it) if (uri==myself) { if (method=="REGISTER") { # digest authentication log(1,"request for registration"); if (!www_authorize("mydomain.com", "subscriber")) { www_challenge("mydomain.com", "0"); break; }; save("location"); break; };
/* ********** Dial out to PSTN logic ************* */
#forward numerical 7 digit requests to gateway if(uri=~"^sip:[0-9]{7}@(mydomain\.com|10\.10\.10\.49)"){
# append_hf("Remote-Party-ID:sip:6508466600@mydomain.com;party=calling;id-type=subscriber;privacy=off;screen=no;\r\n"); rewritehostport("10.10.10.5:5060"); log(1,"7 digit expression match"); route(2); break;
}; # strip 650 and forward to GW is user dials 650 before phone no. if(uri=~"^sip:650[0-9]{7}@(mydomain\.com|10\.10\.10\.49)"){ strip(3); rewritehostport("10.10.10.5:5060"); log(1,"650 area code dialed, 650 stripped"); route(2); break; }; #forward numerical 10 digit requests to gateway, append a 1 first if(uri=~"^sip:[0-9]{10}@(mydomain\.com|10\.10\.10\.49)"){ prefix("1"); rewritehostport("10.10.10.5:5060"); log(1,"10 digit expression match, prefix 1"); route(2); break; }; #forward numerical 11 digit requests that start with a 1 to GW if(uri=~"^sip:1[0-9]{10}@(mydomain\.com|10\.10\.10\.49)"){ rewritehostport("10.10.10.5:5060"); log(1,"10 digit exp match w/leading 1"); route(2); break; }; #forward international N digit requests to gateway if(uri=~"^sip:011[0-9]+@(mydomain\.com|10\.10\.10\.49)"){ rewritehostport("10.10.10.5:5060"); log(1,"international expression match"); route(2); break; };
/* ********** VOICEMAIL logic ************* */
if (uri=~"^sip:voicemail\+@"){ t_newtran(); t_reply("100", "Trying -- just a second"); if(!vm("/tmp/am_fifo","announcement")){ t_reply("500", "SEMS error"); }; log(1,"sip:voicemail uri match"); break; };
/* ****** Find Aliases and Locations of users ********* */
# It is very important to lookup "aliases" before looking up "locations"
if(!lookup("aliases")){ log(1,"Couldn't find any matching alias"); sl_send_reply("404", "User does not exist"); break; }; if(!lookup("location")) { log(1,"unable to locate user"); route(3); break; }; }; # forward to current uri now; use stateful forwarding; that # works reliably even if we forward from TCP to UDP t_on_failure("1"); if (!t_relay()) { sl_reply_error(); }; log(1,"eof");
}
route[2]{ log(1,"route[2]:SIP-to-PSTN call routed"); if(!t_relay()){ sl_reply_error(); }; }
route[3]{ log(1,"route[3]: voicemail processing"); if(method=="INVITE" || method=="ACK"){ log(1,"1st if entered in route[3] *vm*"); t_newtran(); t_reply("100","Trying -- just a second"); if(!vm("/tmp/am_fifo","voicemail")){ # "announcement" was replaced with "voicemail" log(1,"vm module called and failed"); t_reply("500", "SEMS error"); }; break; }; log(1,"end of route[3], 1st if check not entered"); }
failure_route[1]{ log(1,"failure_route[1]:jump to vm processing"); route(3); # break; }
Serusers mailing list serusers@lists.iptel.org http://lists.iptel.org/mailman/listinfo/serusers
-- Jiri Kuthan http://iptel.org/~jiri/
Jiri,
If you want failure_route to be evoked only for some calls, then set t_on_failure_route for such. You already do so in your script, don't you? **************** Yes, t_on_failure is only set for calls to internal network addresses. VM works great for users that aren't logged in.
There is other problem though -- the failure_route logic for VM should be different from that in route block -- you can't create transaction state two times (first time with t_relay, second time with t_newtran). SER will certainly complain with some error message in your logs. ********* THIS is the big questioin. SER certainly does complain with error messages. What should the failure route logic for VM be? I can't find any examples of this in the documentation. I've tried calling the vm command without the t_newtran() function in front of it but that results in another error in the logs. (see below)
Sep 25 19:46:49 jiffypop /usr/local/sbin/ser[23840]: submit_query(): You have an error in your SQL syntax. C
heck the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1
Sep 25 19:46:49 jiffypop /usr/local/sbin/ser[23840]: submit_query(): Error while submitting query
Sep 25 19:46:49 jiffypop /usr/local/sbin/ser[23840]: ERROR: vm: db_query() failed.
Sep 25 19:46:49 jiffypop /usr/local/sbin/ser[23840]: ERROR: vm: vm_get_user_info failed
Sep 25 19:46:49 jiffypop /usr/local/sbin/ser[23840]: route[3]:vm:voicemail failed
So what's the work around? Is there a way to get around this? What should the failure_route logic be?
Thanks,
G.
--------------------------------- Do you Yahoo!? The New Yahoo! Shopping - with improved product search
Jiri,
I believe this is what you and I talked about at VON. I am very interested in an easy way to do serial forking. For instance, if I have 3 sip endpoints like :
1000@myproxy.com 1010@myproxy.com 1020@myproxy.com
And finally, a voice mail reference:
1000@myvoicemailmediaserver.com
I currently am doing a serial forking like this:
First, create a table called 'forward' that works exactly like 'aliases'. Then, put all 'forward' instructions in the table. This includes forwarding to voicemail server.
{ ... if(lookup("forward")) { xlog("L_WARN", "HUNTGROUP: %Ts call-id:%ci cseq:%ci\n"); t_on_failure("1"); }
if(!t_relay()) { sl_reply_error(); break; } ... }
# here is the 'failure_route' for number forwarding failure_route[1] { if(lookup("forward")) { xlog("L_WARN", "CONTINUE HUNT: %Ts call-id:%ci cseq:%ci messageid:%mi\n"); t_on_failure("1"); append_branch(); t_relay(); break; };
xlog("L_WARN", "NO CONTINUE HUNT: %Ts call-id:%ci cseq:%ci messageid:%mi\n");
#sl_reply_error(); t_reply("486","Busy puppy."); break; }
This setup sort of works, but, it seems that I get many t_relay() events that just hang and eventually time out, which I don't understand how is happening.
Also, it would be nice if I could set a timer, say for 15 seconds, that causes a failure to occur in the event a phone rings but isn't answered.
---greg
There is other problem though -- the failure_route logic for VM should be different from that in route block -- you can't create transaction state two times (first time with t_relay, second time with t_newtran). SER will certainly complain with some error message in your logs.
I will introduce some new command which hides details of transaction processing from script writers and can be used from both route[] and failure_route[]. (I didn't think of it before since I used voicemail on some other machine than proxy server.)
-jiri
Thanks, G.
Do you Yahoo!? <http://shopping.yahoo.com/?__yltc=s%3A150000443%2Cd%3A227082
28%2Cslk%3Atext%2Csec%3Amail>The New Yahoo! Shopping - with improved product search
# # $Id: ser.cfg,v 1.20 2003/05/31 21:12:19 jiri Exp $ # # simple quick-start config script #
# ----------- global configuration parameters
debug=3 # debug level (cmd line: -dddddddddd) fork=yes log_stderror=no # (cmd line: -E)
/* Uncomment these lines to enter debugging mode debug=8 fork=no log_stderror=yes */
check_via=no # (cmd. line: -v) dns=no # (cmd. line: -r) rev_dns=no # (cmd. line: -R) port=5060 children=4 fifo="/tmp/ser_fifo" sip_warning=no # # ------------------ module loading
# # Uncomment this if you want to use SQL database loadmodule "/usr/local/lib/ser/modules/mysql.so" # loadmodule "/usr/local/lib/ser/modules/sl.so" loadmodule "/usr/local/lib/ser/modules/tm.so" loadmodule "/usr/local/lib/ser/modules/rr.so" loadmodule "/usr/local/lib/ser/modules/maxfwd.so" loadmodule "/usr/local/lib/ser/modules/usrloc.so" loadmodule "/usr/local/lib/ser/modules/registrar.so" loadmodule "/usr/local/lib/ser/modules/vm.so" loadmodule "/usr/local/lib/ser/modules/pa.so" loadmodule "/usr/local/lib/ser/modules/msilo.so" loadmodule "/usr/local/lib/ser/modules/acc.so" loadmodule "/usr/local/lib/ser/modules/textops.so" # #loadmodule "/usr/local/lib/ser/modules/nathelper.so" #loadmodule "/usr/local/lib/ser/modules/uri.so" #loadmodule "/usr/local/lib/ser/modules/group.so" # # Uncomment this if you want digest authentication # mysql.so must be loaded ! loadmodule "/usr/local/lib/ser/modules/auth.so" loadmodule "/usr/local/lib/ser/modules/auth_db.so" # # ----------------- setting module-specific parameters
# # -- usrloc params -- # #modparam("usrloc", "db_mode", 0) # # Uncomment this if you want to use SQL database # for persistent storage and comment the previous line modparam("usrloc", "db_mode", 2) # # -- auth params -- # Uncomment if you are using auth module # modparam("auth_db", "calculate_ha1", yes) # # If you set "calculate_ha1" parameter to yes (which true in
this config),
# uncomment also the following parameter) # modparam("auth_db", "password_column", "password") # # modparam("acc", "log_level", 1) modparam("acc", "log_flag", 2) modparam("acc", "log_missed_flag", 2) modparam("acc", "log_fmt", "fimos") # #modparam("tm", "fr_inv_timer", 35) #INVITE timeout #modparam("tm", "fr_timer", 30) #negative INVITE replay or no #final reply for a request for ACK # modparam("voicemail", "db_url", "sql://ser:heslo@localhost/ser") # #modparam("acc", "db_url", "sql://ser:heslo@localhost/ser") #modparam("acc", "db_flag", 2) #modparam("acc", "db_missed_flag", 2) # # ------------------------- request routing logic
# # main routing logic # alias=10.10.10.49 #sip server IP address alias=jiffypop #sip server name alias=mydomain.com #sip domain/realm alias=jiffypop.mydomain.com #sip server FQDN # route{ log(1,"entering main route"); #prevent strangers from claiming to belong to our domain; #if sender claims to be in our domain in From header field, #better authenticate him # code not inserted yet :)
# initial sanity checks -- messages with # max_forwards==0, or excessively long requests if (!mf_process_maxfwd_header("10")) { sl_send_reply("483","Too Many Hops"); break; }; if (len_gt( max_len )) { sl_send_reply("513", "Message too big"); break; }; # we record-route all messages -- to make sure that # subsequent messages will go through our proxy; that's # particularly good if upstream and downstream entities # use different transport protocol record_route(); # loose-route processing if (loose_route()) { t_relay(); break; }; setflag(2); #set flag for accounting # if the request is for other domain use UsrLoc # (in case it does not work, use the following command # with proper names and addresses in it) if (uri==myself) { if (method=="REGISTER") { # digest authentication log(1,"request for registration"); if (!www_authorize("mydomain.com",
"subscriber")) {
www_challenge("mydomain.com", "0"); break; }; save("location"); break; };
/* ********** Dial out to PSTN logic ************* */
#forward numerical 7 digit requests to gateway
if(uri=~"^sip:[0-9]{7}@(mydomain.com|10.10.10.49)"){
#
append_hf("Remote-Party-ID:sip:6508466600@mydomain.com;party =calling;id-type=subscriber;privacy=off;screen=no;\r\n");
rewritehostport("10.10.10.5:5060"); log(1,"7 digit expression match"); route(2); break; }; # strip 650 and forward to GW is user dials
650 before phone no.
if(uri=~"^sip:650[0-9]{7}@(mydomain.com|10.10.10.49)"){
strip(3); rewritehostport("10.10.10.5:5060"); log(1,"650 area code dialed, 650 stripped"); route(2); break; }; #forward numerical 10 digit requests to
gateway, append a 1 first
if(uri=~"^sip:[0-9]{10}@(mydomain.com|10.10.10.49)"){
prefix("1"); rewritehostport("10.10.10.5:5060"); log(1,"10 digit expression match, prefix 1"); route(2); break; }; #forward numerical 11 digit requests that
start with a 1 to GW
if(uri=~"^sip:1[0-9]{10}@(mydomain.com|10.10.10.49)"){
rewritehostport("10.10.10.5:5060"); log(1,"10 digit exp match w/leading 1"); route(2); break; }; #forward international N digit requests to gateway
if(uri=~"^sip:011[0-9]+@(mydomain.com|10.10.10.49)"){
rewritehostport("10.10.10.5:5060"); log(1,"international expression match"); route(2); break; };
/* ********** VOICEMAIL logic ************* */
if (uri=~"^sip:voicemail\+@"){ t_newtran(); t_reply("100", "Trying -- just a second"); if(!vm("/tmp/am_fifo","announcement")){ t_reply("500", "SEMS error"); }; log(1,"sip:voicemail uri match"); break; };
/* ****** Find Aliases and Locations of users ********* */
# It is very important to lookup "aliases" before looking up
"locations"
if(!lookup("aliases")){ log(1,"Couldn't find any matching alias"); sl_send_reply("404", "User does not exist"); break; }; if(!lookup("location")) { log(1,"unable to locate user"); route(3); break; }; }; # forward to current uri now; use stateful forwarding; that # works reliably even if we forward from TCP to UDP t_on_failure("1"); if (!t_relay()) { sl_reply_error(); }; log(1,"eof");
}
route[2]{ log(1,"route[2]:SIP-to-PSTN call routed"); if(!t_relay()){ sl_reply_error(); }; }
route[3]{ log(1,"route[3]: voicemail processing"); if(method=="INVITE" || method=="ACK"){ log(1,"1st if entered in route[3] *vm*"); t_newtran(); t_reply("100","Trying -- just a second"); if(!vm("/tmp/am_fifo","voicemail")){ #
"announcement" was replaced with "voicemail"
log(1,"vm module called and failed"); t_reply("500", "SEMS error"); }; break; }; log(1,"end of route[3], 1st if check not entered");
}
failure_route[1]{ log(1,"failure_route[1]:jump to vm processing"); route(3); # break; }
Serusers mailing list serusers@lists.iptel.org http://lists.iptel.org/mailman/listinfo/serusers
-- Jiri Kuthan http://iptel.org/~jiri/
Serusers mailing list serusers@lists.iptel.org http://lists.iptel.org/mailman/listinfo/serusers
In the example config file there are many calls to vm(/tmp/am_fifo", "*");
where * is "announcement" >or "voicemail" or "echo" or "bye" or "conference." Are these all required in a basic voicemail setup? >Can anyone point me to more information on how this works and what each of these modules are >doing?
The vm function's second argument is the target SEMS plug-in. Each call to vm(...) is an example for a different plug-in.
-Raphael.