[Serusers] problem in calling voicemail!!

Stefan Sayer stefan.sayer at iptego.de
Wed Feb 28 22:33:07 CET 2007


Hello,

the ser-sems.cfg needed is much simpler than the one you are using.

there is a new howto about setting up a sems voicemail server, it might 
be helpful to you:

http://www.iptel.org/howto_sems_voicemail

You need to add a header with the email address (P-Email-Address: 
gotcha_em at yahoo.com) to the INVITE, and the t_relay it to the voicemail 
server.

hth
Stefan

Meidiana Ten wrote:
> Hi..
> Thanx for the solution
> It really works well
> But now I face another problem
> Really need your help..
> I configure SER for voicemail usage
> I'm using eyebeam as the UA. To check voicemail, I set
> it to call 113, and to send voicemail, it will call
> 114 based on the SER script.
> But it failed to forward to voicemail even the icon
> "send to voicemail" has appeared on the eyebeam.
> Below is my ser.cfg and ser_sems.cfg
> Please check it for me and tell me what's wrong.
> 
> ser.cfg:
> 
> debug=9
> fork=yes
> log_stderror=yes
> 
> listen=202.95.149.2       # put your server IP address
> here
> port=5060
> children=4
> 
> dns=no
> rev_dns=no
> 
> fifo="/tmp/ser_fifo"
> fifo_db_url="mysql://ser:heslo@localhost/ser"
> fifo_mode=0666
> 
> 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/auth.so"
> loadmodule "/usr/local/lib/ser/modules/auth_db.so"
> loadmodule "/usr/local/lib/ser/modules/nathelper.so"
> loadmodule "/usr/local/lib/ser/modules/textops.so"
> loadmodule "/usr/local/lib/ser/modules/uri_db.so"
> loadmodule "/usr/local/lib/ser/modules/uri.so"
> loadmodule "/usr/local/lib/ser/modules/avpops.so"
> loadmodule "/usr/local/lib/ser/modules/domain.so"
> loadmodule "/usr/local/lib/ser/modules/permissions.so"
> loadmodule "/usr/local/lib/ser/modules/msilo.so"
> 
> modparam("auth_db|permissions|uri_db|usrloc","db_url",
> "mysql://ser:heslo@localhost/ser")
> modparam("auth_db|uri_db|usrloc", "db_url",
> "mysql://ser:heslo@localhost/ser")
> modparam("auth_db", "calculate_ha1", 1)
> modparam("auth_db", "password_column", "password")
> 
> modparam("nathelper", "natping_interval", 30)
> modparam("nathelper", "ping_nated_only", 1)
> modparam("nathelper", "rtpproxy_sock",
> "/var/run/rtpproxy.sock")
> 
> modparam("usrloc", "db_mode", 2)
> 
> modparam("registrar", "nat_flag", 6)
> 
> modparam("rr", "enable_full_lr", 1)
> 
> modparam("tm", "fr_inv_timer", 27)
> modparam("tm", "fr_inv_timer_avp", "inv_timeout")
> 
> modparam("permissions", "db_mode", 1)
> modparam("permissions", "trusted_table", "trusted")
> 
> modparam("tm", "fr_timer", 10 )
> modparam("tm", "fr_inv_timer", 15 )
> modparam("tm", "wt_timer", 10 )
> 
> modparam("msilo", "db_url",
> "mysql://ser:heslo@localhost/ser")
> modparam("msilo", "db_table", "silo")
> modparam("msilo","registrar","sip:registrar at pcr.ac.id")
> modparam("msilo","expire_time",259200)
> modparam("msilo","check_time",30)
> modparam("msilo","clean_period",5)
> 
> alias="pcr.ac.id"
> route {
>         #
> -----------------------------------------------------------------
>         # Sanity Check Section
>         #
> -----------------------------------------------------------------
> 
>         if (!mf_process_maxfwd_header("10")) {
>                 sl_send_reply("483", "Too Many Hops");
>                 break;
>         };
> 
>         if (msg:len > max_len) {
>                 sl_send_reply("513", "Message
> Overflow");
>                 break;
>         };
> 
>         #
> -----------------------------------------------------------------
>         # Record Route Section
>         #
> -----------------------------------------------------------------
> 
>         if (method!="REGISTER") {
>                 record_route();
>         };
> 
>         if (method=="BYE" || method=="CANCEL") {
>                 unforce_rtp_proxy();
>         }
> 
>         #
> -----------------------------------------------------------------
>         # Loose Route Section
>         #
> -----------------------------------------------------------------
> 
>         if (loose_route()) {
>                 if (has_totag() && (method=="INVITE"
> || method=="ACK")) {
>                         if (nat_uac_test("19")) {
>                                 setflag(6);
>                                 force_rport();
>                                 fix_nated_contact();
>                         };
>                     force_rtp_proxy("l");
>                 };
>                 route(1);
>                 break;
>         };
> 
>         #
> -----------------------------------------------------------------
>         # Offline Message Store Section
>         #
> -----------------------------------------------------------------
> 	if (is_from_local()) {   
>         	if (method=="REGISTER") {
>             save("location");
>             log("REGISTER received -> dumping messages
> with MSILO\n");
> 
>             # MSILO - dumping user's offline messages
>             if (m_dump())
>             {
>                 log("MSILO: offline messages dumped -
> if they were\n");
>             }else{
>                 log("MSILO: no offline messages
> dumped\n");
>             };
>             break;
>         };
> 
>         # domestic SIP destinations are handled using
> our USRLOC DB
> 
>         if(!lookup("location"))
>         {
>             if (! t_newtran())
>                {
>                 sl_reply_error();
>                 break;
>                };
>             # we do not care about anything else but
> MESSAGEs
>             if (!method=="MESSAGE")
>             {
>                 if (!t_reply("404", "Not found"))
>                 {
>                     sl_reply_error();
>                 };
>                 break;
>             };
>             log("MESSAGE received -> storing using
> MSILO\n");
>             # MSILO - storing as offline message
>             if (m_store("0"))
>             {
>                 log("MSILO: offline message
> stored\n");
>                 if (!t_reply("202", "Accepted"))
>                 {
>                     sl_reply_error();
>                 };
>             }else{
>                 log("MSILO: offline message NOT
> stored\n");
>                 if (!t_reply("503", "Service
> Unavailable"))
>                 {
>                     sl_reply_error();
>                 };
>             };
>             break;
>         };
>         # if the downstream UA does not support
> MESSAGE requests
>         # go to failure_route[1]
>         t_on_failure("1");
>         t_relay();
>         break;
>     };
>  	# forward to current uri now; use stateful
> forwarding that
>         # works reliably even if we forward from TCP
> to UDP
>         if (!t_relay()) {
>                 sl_reply_error();
>         };
> 
>        #
> -----------------------------------------------------------------
>         # Call Type Processing Section
>         #
> -----------------------------------------------------------------
> 
>         if (uri!=myself) {
>                         route(5);
>                         route(1);
>                         break;
>         };
> 
>         if (uri==myself) {
>                 if (method=="ACK") {
>                         route(6);
>                         break;
>                 } else if (method=="CANCEL") {
>                         route(3);
>                         break;
>                 } else if (method=="INVITE") {
>                         route(3);
>                         break;
>                 } else  if (method=="REGISTER") {
>                         route(2);
>                         break;
>                 };
>                 lookup("aliases");
>                 if (uri!=myself) {
>                         route(5);
>                         route(1);
>                         break;
>                 };
> 
>                 if (!lookup("location")) {
>                         sl_send_reply("404", "User Not
> Found");
>                         break;
>                 };
>         };
>         route(1);
> }
> 
> failure_route[1] {
>     # forwarding failed -- check if the request was a
> MESSAGE
>     if (!method=="MESSAGE")
>     {
>         break;
>     };
> 
>     log(1,"MSILO:the downstream UA doesn't support
> MESSAGEs\n");
>     # we have changed the R-URI with the contact
> address, ignore it now
>     if (m_store("1"))
>     {
>         log("MSILO: offline message stored\n");
>         t_reply("202", "Accepted");
>     }else{
>         log("MSILO: offline message NOT stored\n");
>         t_reply("503", "Service Unavailable");
>     };
> }
> 
> route[1] {
> 
>         #
> -----------------------------------------------------------------
>         # Default Message Handler
>         #
> -----------------------------------------------------------------
> 
>         t_on_reply("1");
>         if (!t_relay()) {
>                 if (method=="INVITE" && isflagset(6))
> {
>                   unforce_rtp_proxy();
>                 };
>                 sl_reply_error();
>         };
> }
> 
> route[2] {
> 
>         #
> -----------------------------------------------------------------
>         # REGISTER Message Handler
>         #
> ----------------------------------------------------------------
> 
>         if (!search("^Contact:\ +\*") &&
> nat_uac_test("19")) {
>                 setflag(6);
>                 fix_nated_register();
>                 force_rport();
>         };
>         sl_send_reply("100", "Trying");
> 
>         if (!www_authorize("pcr.ac.id","subscriber"))
> {
>                 www_challenge("pcr.ac.id","0");
>                 break;
>         };
> 
>         if (!check_to()) {
>                 sl_send_reply("401", "Unauthorized");
>                 break;
>         };
>         consume_credentials();
>         if (!save("location")) {
>                 sl_reply_error();
>         };
> }
> 
> route[3] {
> 
>         #
> -----------------------------------------------------------------
>         # CANCEL and INVITE Message Handler
>         #
> -----------------------------------------------------------------
> 
>         if (!allow_trusted() && nat_uac_test("19")) {
>                  setflag(6);
>         }
>         lookup("aliases");
>         if (method=="INVITE" && !allow_trusted())
>         {
>                 if
> (!proxy_authorize("pcr.ac.id","subscriber")) {
>                        
> proxy_challenge("pcr.ac.id","0");
>                         break;
>                 } else if (!check_from()) {
>                         sl_send_reply("403", "Use
> From=ID");
>                         break;
>                 };
>                 consume_credentials();
>         };
> 
> 		if (uri =~ "sip:1.*@")  {
> 			log("Forwarding to 5070");
> 	                rewritehostport("localhost:5070");
>                 	t_relay_to_udp("localhost","5070");
>                 	break;
> 		}
> 
>         if (uri=~"^sip:9[0-9]*@") {
>                 route(4);
>                 break;
>         };
> 
>         if (uri!=myself) {
>                 route(5);
>                 route(1);
>                 break;
>         };
> 
>         if (!lookup("location")) {
>                 if (uri=~"^sip:[0-9]{10}@") {
>                 route(4);
>                 break;
>                 };
>                 sl_send_reply("404", "User Not
> Found");
>                 break;
>         };
> 
>         if (isflagset(6)) {
>                 force_rport();
>                 fix_nated_contact();
>                 force_rtp_proxy();
>         };
>         t_on_reply("1");
> 
>         if (!t_relay()) {
>                 if(isflagset(6)) {
>                         unforce_rtp_proxy();
>                 }
>                 sl_reply_error();
>         };
> }
> 
> route[4] {
> 
>  #
> -----------------------------------------------------------------
>  # PSTN Handler
>  #
> -----------------------------------------------------------------
> 
>  rewritehostport("202.95.149.2:5060"); # INSERT YOUR
> PSTN GATEWAY IP ADDRESS
>  avp_write("i:45", "inv_timeout");
> 
>  if (isflagset(6)) {
>                 force_rport();
>                 fix_nated_contact();
>                 force_rtp_proxy();
>                 };
>  route(1);
>  }
> 
> onreply_route[1] {
>         if (isflagset(6) &&
> status=~"(180)|(183)|2[0-9][0-9]") {
>                 if (!search("^Content-Length:\ +0")) {
>                         force_rtp_proxy();
>                 };
>         };
> 
>         if (nat_uac_test("1")) {
>                 fix_nated_contact();
>         };
> }
> 
> ser_sems.cfg:
> 
> # ser.cfg,v 1.25.2.1 2005/02/18 14:30:44 andrei Exp $
> #
> # ser for sems configuration
> 
> # ----------- global configuration parameters
> ------------------------
> 
> debug=9         # debug level (cmd line: -dddddddddd)
> fork=yes
> log_stderror=yes	# (cmd line: -E)
> 
> listen=202.95.149.2 
> port=5070
> children=4
> 
> #check_via=no	# (cmd. line: -v)
> dns=no           # (cmd. line: -r)
> rev_dns=no      # (cmd. line: -R)
> 
> fifo="/tmp/ser_fifo"
> fifo_db_url="mysql://ser:heslo@localhost/ser"
> fifo_mode=0666
> 
> unix_sock="/tmp/ser_sock"
> # ------------------ module loading
> ----------------------------------
> 
> 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/textops.so"
> loadmodule "/usr/local/lib/ser/modules/avp.so"
> loadmodule "/usr/local/lib/ser/modules/avpops.so"
> 
> # ----------------- setting module-specific parameters
> ---------------
> 
> alias="pcr.ac.id"
> # add value to ;lr param to make some broken UAs happy
> modparam("rr", "enable_full_lr", 1)
> 
> # configure avpops db connection
> #modparam( "avpops", "avp_url",
> "mysql://ser:heslo@localhost/ser" )
> #modparam( "avpops", "avp_table", "subscriber" )
> #modparam( "avpops", "uuid_column", "id" )
>                                                       
>                                                       
>                
> # configure aliases, the number doesn't matter as long
> as there are no collisions)
> modparam( "avpops", "avp_aliases", "email=i:67" )
>                                                       
>                                                       
>                
> # scheme to access the database
> #modparam( "avpops", "db_scheme",
> #         
> "email_scheme:table=subscriber;value_col=email_address;value_type=string")
> 
> #modparam("tm", "pass_provisional_replies", 1)
> # appends for INVITE to voicemail
> modparam("tm",
> "tw_append","voicemail_headers:hdr[User-Agent];P-Email-Address=avp[$email]")
> 
> # appends for dtmf per INFO 
> modparam( "tm",
> "tw_append","info_append:hdr[Content-Length];hdr[subject];msg[body]")
> 
> # main routing logic
> 
> route{
> 
> 	# 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 (msg:len > max_len ) {
> 		sl_send_reply("513", "Message too big");
> 		break;
> 	};
> 	
> 	if (method != "ACK" && method != "INVITE" && method
> != "BYE" 
> 		&& method != "CANCEL" && method != "INFO" ){
> 			log("unsupported method\n");
> 			sl_send_reply("500","unsupported method");
> 			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();	
> 	
> 	# subsequent messages withing a dialog should take
> the
>         # path determined by record-routing
>         if (loose_route()) {
>                 # mark routing logic in request
>                 append_hf("P-hint: rr-enforced\r\n");
>                 if (!t_relay()) {
> 			sl_reply_error();
> 		}
>                 break;
>         };
> 
> 
> 	# make transaction
> 	if (!t_newtran()){
> 		log("could not create transaction\n");
> 		sl_send_reply("500","could not create transaction");
> 		break;
> 	}
> 
> 	# actively absorb ACKs
> 	if (method == "ACK") {
> 		t_relay();
> 		break;
> 	}
> 	
> 	# pass INFO to SEMS 
> 	if (method=="INFO") {
>         
> if(!t_write_unix("/tmp/sems_sock","sems/info_append")){
>             		log("could not contact sems\n");
>             		t_reply("500","could not contact media
> server");
>         	}
> 	}
> 
> 	if (uri =~ "sip:101.*@") {
> 		if (!t_write_unix("/tmp/sems_sock","myapp")){
> 			log("could not contact media server\n");
> 			t_reply("500","could not contact media server");	
> 			break;
> 		}
> 		break;
> 	}
> 
> 	if (uri =~ "sip:102.*@") {
> 		if
> (!t_write_unix("/tmp/sems_sock","myconfigurableapp")){
> 			log("could not contact media server\n");
> 			t_reply("500","could not contact media server");	
>  			break;
> 		}
> 		break;
> 	}
> 
> 	if (uri =~ "sip:103.*@") {
> 		if
> (!t_write_unix("/tmp/sems_sock","myannounceapp")){
> 			log("could not contact media server\n");
> 			t_reply("500","could not contact media server");	
> 			break;
> 		}
> 		break;
> 	}
> 
> 
> 	if (uri =~ "sip:104.*@") {
> 		if (!t_write_unix("/tmp/sems_sock","myjukebox")){
> 			log("could not contact media server\n");
> 			t_reply("500","could not contact media server");	
> 			break;
> 		}
> 		break;
> 	}
> 
> 
> 	if (uri =~ "sip:105.*@") {
> 		if (!t_write_unix("/tmp/sems_sock","mycc")){
> 			log("could not contact media server\n");
> 			t_reply("500","could not contact media server");	
> 			break;
> 		}
> 		break;
> 	}
> 
> 
> 	if (uri =~ "sip:106.*@") {
> 		if (!t_write_unix("/tmp/sems_sock","ivr_announce")){
> 			log("could not contact media server\n");
> 			t_reply("500","could not contact media server");	
> 			break;
> 		}
> 		break;
> 	}
> 
> 
> 
> 
> 
> 
> ############ default sems apps
> 	if (uri =~ "sip:110.*@") {
> 		if (!t_write_unix("/tmp/sems_sock","echo")){
> 			log("could not contact echo\n");
> 			t_reply("500","could not contact media server");	
> 			break;
> 		}
> 		break;
> 	}
> 
> 
> 	if (uri =~ "sip:111.*@") {
> 		if (!t_write_unix("/tmp/sems_sock","announcement")){
> 			log("could not contact announcement\n");
> 			t_reply("500","could not contact media server");	
> 			break;
> 		}
> 		break;
> 	}
> 
> 	if (uri =~ "sip:112.*@") {
> 		if (!t_write_unix("/tmp/sems_sock","conference")){
> 			log("could not contact conference\n");
> 			t_reply("500","could not contact media server");	
> 			break;
> 		}
> 		break;
> 	}
> 
> 
> 	if (uri =~ "sip:113.*@") {
> 		if (!t_write_unix("/tmp/sems_sock","mailbox")){
> 			log("could not contact mailbox\n");
> 			t_reply("500","could not contact media server");	
> 			break;
> 		}
> 		break;
> 	}
> 
> 	if (uri =~ "sip:114.*@") {
> 		if
> (!t_write_unix("/tmp/sems_sock","early_announce")){
> 			log("could not contact early_announce\n");
> 			t_reply("500","could not contact media server");	
> 			break;
> 		}
> 		break;
> 	}
> 
> 	if (uri =~ "sip:115.*@") {
> 		# load email avp with some email address
> 		avp_write("root at localhost","$email");
> 		# use voicemail_headers append to pass it to sems
> 		if
> (!t_write_unix("/tmp/sems_sock","voicemail/voicemail_headers")){
> 			log("could not contact voicemail\n");
> 			t_reply("500","could not contact media server");	
> 			break;
> 		}
> 		break;
> 	}
> 
> 
> 	t_reply("404","Not found");
> }
> 
> Please tell me if you need my voicemail.conf..I'll
> send it to you.
> Thanx for the help
> 
> Regards,
> 
> Meidiana
> 
> 
>  
> ____________________________________________________________________________________
> We won't tell. Get more on shows you hate to love 
> (and love to hate): Yahoo! TV's Guilty Pleasures list.
> http://tv.yahoo.com/collections/265 
> _______________________________________________
> Serusers mailing list
> Serusers at lists.iptel.org
> http://lists.iptel.org/mailman/listinfo/serusers

-- 
Stefan Sayer
Media Services Development

stefan.sayer at iptego.de
www.iptego.de

iptego GmbH
Am Borsigturm 40
13507 Berlin
Germany

Amtsgericht Charlottenburg, HRB 101010
Geschaeftsfuehrer: Alexander Hoffmann



More information about the sr-users mailing list