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@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@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@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@lists.iptel.org http://lists.iptel.org/mailman/listinfo/serusers