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:
You need to add a header with the email address (P-Email-Address:
gotcha_em(a)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(a)lists.iptel.org
http://lists.iptel.org/mailman/listinfo/serusers
iptego GmbH
Am Borsigturm 40
13507 Berlin
Germany
Amtsgericht Charlottenburg, HRB 101010
Geschaeftsfuehrer: Alexander Hoffmann