Hi, Is it true that MSILO module only can handle text message? So what is the usage of voice_silo table that written on message_store.php on serweb then? Thanx
Regards,
Meidiana
--------------------------------- Access over 1 million songs - Yahoo! Music Unlimited.
Meidiana Ten wrote:
Hi, Is it true that MSILO module only can handle text message?
No, it can store any SIP message.
So what is the usage of voice_silo table that written on message_store.php on serweb then?
This is for voicemail, serweb can display the list of voicemail messages created by voicemail SEMS application.
Jan.
Hi, Like u told me before, I've tried to install and configure SEMS into my SER server to setup the voicemail feature. I add some configuration file into ser.cfg and configure the sems.conf. But when I try to run SER, I got some error. Please review my ser.cfg and sems.conf file below:
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 ) # configure tm to append this when tw_appent voicemail_headers is used #modparam("tm", "tw_append", "voicemail_headers:hdr[User-Agent];P-Email-Address=avp[$email]") #modparam("tm", "pass_provisional_replies", 1)
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)
modparam( "avpops", "avp_aliases", "email=i:67" )
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; }; #------------------------------------------------------------------ # 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");
# ----------------------------------------------------------------- # 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: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(); }; }
------------------------------------------------------------------------------------------------------------------- sems.conf: # Sip Express Media Server (sems) # # sample configuration file # # # whitespaces (spaces and tabs) are ignored # comments start with a "#" and may be used inline # # example: option=value1, value2 # i like this option #
################################## # global parameters # ##################################
# optional parameter: fork={yes|no} # # - specifies if sems should run in daemon mode (background) # (fork=no is the same as -E) fork=yes
# optional parameter: stderr={yes|no} # # - debug mode: do not fork and log to stderr # (stderr=yes is the same as -E) stderr=no
# optional parameter: loglevel={0|1|2|3} # # - sets log level (error=0, warning=1, info=2, debug=3) # (same as -D) loglevel=1
# optional parameter: ser_fifo_name=<filename> # # - path and file name of Ser's fifo file (same as -o) ser_fifo_name=/tmp/ser_fifo
# optional parameter: socket_name=<filename> # # - path and file name of our unix socket socket_name=/tmp/am_sock
# optional parameter: ser_socket_name=<filename> # # - path and file name of Ser's unix socket ser_socket_name=/tmp/ser_sock
# optional parameter: send_method=<filename> # # - sets which method will be used to contact Ser: # FIFO or unix socket server. # - values: fifo (default), unix_socket # # - PLEASE NOTE THAT: if you use 'fifo', make sure that # fifo_name and ser_fifo_name have been set. if you use 'unix_socket', # make sure that socket_name and ser_socket_name have been set. # send_method=fifo
# optional parameter: user_prefix_separator # if set, sems will reply with a Contact header in the form # Contact: <plugin-name><user_prefix_separator><user> # needed if a single ser instance is used with sems. # # user_prefix_separator=+
# optional parameter: plugin_path=<path> # # - sets the path to the plug-ins # - may be absolute or relative to CWD #plugin_path=/usr/local/lib/sems/plug-in/ plugin_path=lib
# optional parameter: smtp_server=<hostname> # # - sets address of smtp server smtp_server=localhost
# optional parameter: smtp_port=<port> # # - sets port of smtp server smtp_port=25
# optional parameter: rtp_low_port=<port> # # - sets port of rtp lowest server #rtp_low_port=1024
# optional parameter: rtp_high_port=<port> # # - sets port of rtp highest server #rtp_high_port=65535
################################## # module specific parameters # ##################################
# sample voicemail configuration (inline) config.voicemail=inline
# optional parameter: announce_path=<path> # # - sets the path where announce files are searched for # - the file to be played is determined the following way: # <announce_path>/<domainname>/<username>.wav # if this file is not available <announce_path>/<default_anounce> is used #announce_path=/usr/local/lib/sems/audio/ announce_path=wav
# parameter: default_announce=<filename> # # - sets the name of the default announce WAV file default_announce=default_en.wav
# parameter: max_record_time=<seconds> # # - maximum record time max_record_time=30
# parameter: email_template=<filename> # # - email template file # # See the README file in <sems-src>/plug-in/voicemail # for more information on the syntax used. # #email_template=/usr/local/lib/sems/plug-in/mail.template email_template=plug-in/voicemail/default.template.sample
# end of configuration section for voicemail module config.voicemail=end
# sample announcement configuration (inline) config.announcement=inline
# optional parameter: announce_path=<path> # # - sets the path where announce files are searched for #announce_path=/usr/local/lib/sems/audio/ announce_path=wav
# parameter: default_announce=<filename> # # - sets the name of the default announce WAV file default_announce=default_en.wav
# end of configuration section for announcement module config.announcement=end
# sample isdngw module configuration (external file) # config.isdngw=/etc/isdngw.conf
# sample ivr module configuration (inline) config.ivr=inline
#parameter: python_script_path=<full path> #python_script_path=/etc/ivr
#parameter: python_script_file=<filename> #python_script_file=example.py
# end of configuration section for ivr module config.ivr=end
# sample conference configuration (inline) config.conference=inline
# parameter: default_announce=<filename> # # - sets the full pathed name of the default announce WAV file. # Will be played to lonely users. #default_announce=/usr/local/lib/sems/audio/first_participant.wav default_announce=wav/first_participant.wav
# parameter: join_sound=<filename> # # - sets the full pathed name of a WAV file # which will be played to conference users # when a new user joins the conference. #join_sound=/usr/local/lib/sems/audio/beep.wav join_sound=wav/beep.wav
# parameter: drop_sound=<filename> # # - sets the full pathed name of a WAV file # which will be played to conference users # when a user drops the conference. #drop_sound=/usr/local/lib/sems/audio/beep.wav drop_sound=wav/beep.wav
# end of configuration section for conference module config.conference=end
# example configuration for number reader config.number_reader=inline
#number_path=/usr/local/lib/sems/audio/ number_path=wav
prolog_file=welcome_to_number_reader.wav
epilog_file=thanks_calling_number_reader.wav
# end of number_reader configuration config.number_reader=end
# add more module configurations here (inline or external): # # config.mymodule=<filename> # or # config.mymodule=inline # ... # config.mymodule=end
------------------------------------------------------------------------------------------------------------------- In addition, I'm using SER 0.9.7. Please tell me what's wrong. Thanx
Regards, Meidiana
--------------------------------- Access over 1 million songs - Yahoo! Music Unlimited.
1. Please don't copy specific people on posts 2. serusers is very useful for answering specific questions, but then you need to provide enough info for people to be able to respond. Most people don't have time to do generic quality assurance of somebody's complete configs. g-)
Meidiana Ten wrote:
Hi, Like u told me before, I've tried to install and configure SEMS into my SER server to setup the voicemail feature. I add some configuration file into ser.cfg and configure the sems.conf. But when I try to run SER, I got some error. Please review my ser.cfg and sems.conf file below:
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 ) # configure tm to append this when tw_appent voicemail_headers is used #modparam("tm", "tw_append", "voicemail_headers:hdr[User-Agent];P-Email-Address=avp[$email]") #modparam("tm", "pass_provisional_replies", 1)
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)
modparam( "avpops", "avp_aliases", "email=i:67" )
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; }; #------------------------------------------------------------------ # 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"); #
# 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: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(); };
}
sems.conf: # Sip Express Media Server (sems) # # sample configuration file # # # whitespaces (spaces and tabs) are ignored # comments start with a "#" and may be used inline # # example: option=value1, value2 # i like this option #
################################## # global parameters # ##################################
# optional parameter: fork={yes|no} # # - specifies if sems should run in daemon mode (background) # (fork=no is the same as -E) fork=yes
# optional parameter: stderr={yes|no} # # - debug mode: do not fork and log to stderr # (stderr=yes is the same as -E) stderr=no
# optional parameter: loglevel={0|1|2|3} # # - sets log level (error=0, warning=1, info=2, debug=3) # (same as -D) loglevel=1
# optional parameter: ser_fifo_name=<filename> # # - path and file name of Ser's fifo file (same as -o) ser_fifo_name=/tmp/ser_fifo
# optional parameter: socket_name=<filename> # # - path and file name of our unix socket socket_name=/tmp/am_sock
# optional parameter: ser_socket_name=<filename> # # - path and file name of Ser's unix socket ser_socket_name=/tmp/ser_sock
# optional parameter: send_method=<filename> # # - sets which method will be used to contact Ser: # FIFO or unix socket server. # - values: fifo (default), unix_socket # # - PLEASE NOTE THAT: if you use 'fifo', make sure that # fifo_name and ser_fifo_name have been set. if you use 'unix_socket', # make sure that socket_name and ser_socket_name have been set. # send_method=fifo
# optional parameter: user_prefix_separator # if set, sems will reply with a Contact header in the form # Contact: <plugin-name><user_prefix_separator><user> # needed if a single ser instance is used with sems. # # user_prefix_separator=+
# optional parameter: plugin_path=<path> # # - sets the path to the plug-ins # - may be absolute or relative to CWD #plugin_path=/usr/local/lib/sems/plug-in/ plugin_path=lib
# optional parameter: smtp_server=<hostname> # # - sets address of smtp server smtp_server=localhost
# optional parameter: smtp_port=<port> # # - sets port of smtp server smtp_port=25
# optional parameter: rtp_low_port=<port> # # - sets port of rtp lowest server #rtp_low_port=1024
# optional parameter: rtp_high_port=<port> # # - sets port of rtp highest server #rtp_high_port=65535
################################## # module specific parameters # ##################################
# sample voicemail configuration (inline) config.voicemail=inline
# optional parameter: announce_path=<path> # # - sets the path where announce files are searched for # - the file to be played is determined the following way: # <announce_path>/<domainname>/<username>.wav # if this file is not available <announce_path>/<default_anounce> is used #announce_path=/usr/local/lib/sems/audio/ announce_path=wav
# parameter: default_announce=<filename> # # - sets the name of the default announce WAV file default_announce=default_en.wav
# parameter: max_record_time=<seconds> # # - maximum record time max_record_time=30
# parameter: email_template=<filename> # # - email template file # # See the README file in <sems-src>/plug-in/voicemail # for more information on the syntax used. # #email_template=/usr/local/lib/sems/plug-in/mail.template email_template=plug-in/voicemail/default.template.sample
# end of configuration section for voicemail module config.voicemail=end
# sample announcement configuration (inline) config.announcement=inline
# optional parameter: announce_path=<path> # # - sets the path where announce files are searched for #announce_path=/usr/local/lib/sems/audio/ announce_path=wav
# parameter: default_announce=<filename> # # - sets the name of the default announce WAV file default_announce=default_en.wav
# end of configuration section for announcement module config.announcement=end
# sample isdngw module configuration (external file) # config.isdngw=/etc/isdngw.conf
# sample ivr module configuration (inline) config.ivr=inline
#parameter: python_script_path=<full path> #python_script_path=/etc/ivr
#parameter: python_script_file=<filename> #python_script_file=example.py
# end of configuration section for ivr module config.ivr=end
# sample conference configuration (inline) config.conference=inline
# parameter: default_announce=<filename> # # - sets the full pathed name of the default announce WAV file. # Will be played to lonely users. #default_announce=/usr/local/lib/sems/audio/first_participant.wav default_announce=wav/first_participant.wav
# parameter: join_sound=<filename> # # - sets the full pathed name of a WAV file # which will be played to conference users # when a new user joins the conference. #join_sound=/usr/local/lib/sems/audio/beep.wav join_sound=wav/beep.wav
# parameter: drop_sound=<filename> # # - sets the full pathed name of a WAV file # which will be played to conference users # when a user drops the conference. #drop_sound=/usr/local/lib/sems/audio/beep.wav drop_sound=wav/beep.wav
# end of configuration section for conference module config.conference=end
# example configuration for number reader config.number_reader=inline
#number_path=/usr/local/lib/sems/audio/ number_path=wav
prolog_file=welcome_to_number_reader.wav
epilog_file=thanks_calling_number_reader.wav
# end of number_reader configuration config.number_reader=end
# add more module configurations here (inline or external): # # config.mymodule=<filename> # or # config.mymodule=inline # ...
# config.mymodule=end
In addition, I'm using SER 0.9.7. Please tell me what's wrong. Thanx
Regards, Meidiana
Access over 1 million songs - Yahoo! Music Unlimited. http://pa.yahoo.com/*http://us.rd.yahoo.com/evt=36035/*http://music.yahoo.com/unlimited/
Serusers mailing list Serusers@lists.iptel.org http://lists.iptel.org/mailman/listinfo/serusers