Here is my ser.cg file. I try to configure send IM, Missed calls, Voicemail. I just can configure Send IM. Now I can call isdngw, ivr,..
I need help to configure lookup location logic for missed calls and voicemail (offline users)
Anybody could help me to configure the others functions (problem with logic !!).
harry Regards
# # $Id: ser.cfg,v 1.21.4.1 2003/11/10 15:35:15 andrei 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=7 fork=no log_stderror=yes */
check_via=no # (cmd. line: -v) dns=no # (cmd. line: -r) rev_dns=no # (cmd. line: -R) listen=192.168.0.1 port=5060 children=4 fifo="/tmp/ser_fifo" fifo_mode=0666 # ------------------ module loading ----------------------------------
# Uncomment this if you want to use SQL database loadmodule "/usr/lib/ser/modules/mysql.so"
loadmodule "/usr/lib/ser/modules/sl.so" loadmodule "/usr/lib/ser/modules/tm.so" loadmodule "/usr/lib/ser/modules/rr.so" loadmodule "/usr/lib/ser/modules/maxfwd.so" loadmodule "/usr/lib/ser/modules/usrloc.so" loadmodule "/usr/lib/ser/modules/registrar.so" loadmodule "/usr/lib/ser/modules/domain.so" loadmodule "/usr/lib/ser/modules/msilo.so" loadmodule "/usr/lib/ser/modules/acc.so" loadmodule "/usr/lib/ser/modules/vm.so" loadmodule "/usr/lib/ser/modules/uri.so" loadmodule "/usr/lib/ser/modules/group.so" loadmodule "/usr/lib/ser/modules/textops.so"
# Uncomment this if you want digest authentication # mysql.so must be loaded ! loadmodule "/usr/lib/ser/modules/auth.so" loadmodule "/usr/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_url", "mysql://ser:heslo@localhost/ser") modparam("usrloc", "db_mode", 2) modparam("usrloc", "use_domain", 1)
# -- 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")
# -- rr params -- # add value to ;lr param to make some broken UAs happy modparam("rr", "enable_full_lr", 1)
# --registrar params-- modparam("registrar", "use_domain", 1)
# --domain params-- modparam("domain", "db_url", "mysql://ser:heslo@localhost/ser") modparam("domain", "db_mode", 1) # Use chaching
# --acc params-- modparam("acc", "db_url", "mysql://ser:heslo@localhost/ser") modparam("acc", "db_missed_flag", 3)
# --msilo params-- modparam("msilo", "db_url", "mysql://ser:heslo@localhost/ser") modparam("msilo", "db_table", "silo") modparam("msilo","registrar","sip:registrar@192.168.0.1")
# --uri params-- #modparam("uri", "db_url", "mysql://ser:heslo@localhost/ser") #modparam("uri", "subscriber_table", "subscriber")
# --vm params-- modparam("voicemail", "db_url", "mysql://ser:heslo@localhost/ser")
# ------------------------- request routing logic -------------------
# 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; };
# 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; };
# --isdn gateway-- if(method=="INVITE" || method=="BYE" || method=="CANCEL"){ if (uri=~"sip:[0-9]{10}@.*") { route(2); break; }; };
# --ivr conf-- if(method=="INVITE" || method=="BYE" || method=="CANCEL"){ if (uri=~"sip:5000@.*") { route(4); break; }; };
# --conference-- if(method=="INVITE" || method=="BYE" || method=="CANCEL"){ if (uri=~"sip:6000@.*") { route(5); break; }; }; # --play an annoucement-- if(method=="INVITE" || method=="BYE" || method=="CANCEL"){ if (uri=~"sip:7000@.*") { route(6); break; }; };
# 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 (is_from_local()) {
if (method=="REGISTER") {
# Uncomment this if you want to use digest authentication if (!www_authorize("", "subscriber")) { www_challenge("", "0"); break; };
save("location"); # 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; };
# does the user wish redirection on no availability? (i.e., is he # in the voicemail (ser->grp) group?) if (is_user_in("Request-URI", "voicemail")) { t_on_failure("4"); setflag(4); };
# native SIP destinations are handled using our USRLOC DB lookup("aliases"); 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(); };
}
failure_route[1] { # forwarding failed -- check if the request was a MESSAGE if (!method=="MESSAGE") { break; }; log(1,"MSILO: the downstream UA does not support MESSAGE requests ...\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 for delivery"); }else{ log("MSILO: offline message NOT stored\n"); t_reply("503", "Service Unavailable"); }; }
failure_route[4] { route(3); #append_branch("sip:80000@10.1.2.5"); append_urihf("CC-Diversion: ", "\r\n"); append_hf("P-hint: OFFLINE-VOICEMAIL\r\n"); t_relay(); }
route[2] { # ############################## # # isdngw specific configuration # # ############################## # if(t_newtran()){
if(method=="INVITE" || method=="BYE" || method=="CANCEL"){
# send a response right at the start to avoid retransmissions t_reply("100","Trying -- just wait a minute !");
# isdngw only gets activated on invite requests if(method=="INVITE"){ # filename is defined in sems.conf. if(uri=~"sip:[0-9]{10}@.*"){ if(!vm("/tmp/am_fifo","isdngw")){ log("could not contact isdngw\n"); t_reply("500","could not contact isdngw"); }; # Allow the announcement module of sems to be used as well. # This can be useful for testing the isdngw. } else if(uri=~"sip:7000@.*"){ if(!vm("/tmp/am_fifo","announcement")){ log("could not contact announcement\n"); t_reply("500","could not contact announcement"); }; # we dont feel responsible for sip addresses of any other kind, # so send the right error code. } else { t_reply("404","Not Found"); }; # stop routing here, the message is now processed by the media server break; };
# The following handles the call termination, we must pass these requests # to the media server as follows. Again make shure the fifo name and permissions # are set correctly (like im sems.conf). if((method=="BYE")||(method=="CANCEL")){ if(!vm("/tmp/am_fifo","bye")){ log("could not contact the media server\n"); t_reply("500","could not contact the media server"); }; break; }; # other methods than INVITE, BYE and CANCEL are not handled by this SIP Server # so we sent an error message } else { log("ERROR: method not supported\n"); t_reply("500", "sorry, method not supported"); }; } else { # for any reason the transaction could not be created, send error code log("could not create new transaction\n"); sl_send_reply("500","could not create new transaction"); }; # in isdngw.conf. Don't change this setting. t_relay(); # end of routing. }
route[3] { ############################################ # Voicemail specific configuration - begin # ############################################ if(method=="ACK" || method=="INVITE" || method=="BYE"){
if (!t_newtran()) { log("could not create new transaction\n"); sl_send_reply("500","could not create new transaction"); break; };
t_reply("100","Trying -- just wait a minute !"); if(method=="INVITE"){ if(!vm("/tmp/am_fifo","voicemail")) { log("couldn't contact announcement server\n"); t_reply("500", "couldn not contact announcement server"); }; break; };
if(method=="BYE" || method=="CANCEL") { if(!vm("/tmp/am_fifo","bye")) { log("could not contact the answer machine\n"); t_reply("500","could not contact the answer machine"); }; break; };
}; if (method=="CANCEL") { sl_send_reply("200", "cancels are junked here"); break; }; sl_send_reply("501", "method not understood here"); }
route[4] { ###################################### # ivr specific configuration - begin # ###################################### if(method=="ACK" || method=="INVITE" || method=="BYE"){
if (!t_newtran()) { log("could not create new transaction\n"); sl_send_reply("500","could not create new transaction"); break; };
t_reply("100","Trying -- just wait a minute !"); if(method=="INVITE"){ log("**************** vm start - begin ******************\n"); if (uri=~"sip:5000@.*") { if (!vm("/tmp/am_fifo", "ivr")) { log("couldn't contact ivr server\n"); t_reply("500", "couldn not contact ivr server"); }; }; log("**************** vm start - end ******************\n"); } else if(method=="BYE"){ log("**************** vm end - begin ******************\n"); if(!vm("/tmp/am_fifo","bye")){ log("could not contact ivr\n"); t_reply("500","could not contact ivr"); }; log("**************** vm end - end ******************\n"); }; break; }; if (method=="CANCEL") { sl_send_reply("200", "cancels are junked here"); break; }; sl_send_reply("501", "method not understood here"); }
route[5] {
# #################################### # conference specific configuration # # #################################### if(t_newtran()){
if(method=="INVITE" || method=="BYE" || method=="CANCEL"){
# send a response right at the start to avoid retransmissions t_reply("100","Trying -- just wait a minute !");
# isdngw only gets activated on invite requests if(method=="INVITE"){ # filename is defined in sems.conf. if(uri=~"sip:6000@.*"){ if(!vm("/tmp/am_fifo","conference")){ log("could not contact conference\n"); t_reply("500","could not contact conference"); }; # Allow the announcement module of sems to be used as well. # This can be useful for testing the conference. } else if(uri=~"sip:5000@.*"){ if(!vm("/tmp/am_fifo","announcement")){ log("could not contact announcement\n"); t_reply("500","could not contact announcement"); }; # we dont feel responsible for sip addresses of any other kind, # so send the right error code. } else { t_reply("404","Not Found"); }; # stop routing here, the message is now processed by the media server break; };
# The following handles the call termination, we must pass these requests # to the media server as follows. Again make shure the fifo name and permissions # are set correctly (like im sems.conf). if((method=="BYE")||(method=="CANCEL")){ if(!vm("/tmp/am_fifo","bye")){ log("could not contact the media server\n"); t_reply("500","could not contact the media server"); }; break; }; # other methods than INVITE, BYE and CANCEL are not handled by this SIP Server # so we sent an error message } else { log("ERROR: method not supported\n"); t_reply("500", "sorry, method not supported"); }; } else { # for any reason the transaction could not be created, send error code log("could not create new transaction\n"); sl_send_reply("500","could not create new transaction"); }; # in isdngw.conf. Don't change this setting. t_relay(); # end of routing. }
route[6] { ###################################### # announcement configuration - begin # ###################################### if(method=="ACK" || method=="INVITE" || method=="BYE"){
if (!t_newtran()) { log("could not create new transaction\n"); sl_send_reply("500","could not create new transaction"); break; };
t_reply("100","Trying -- just wait a minute !"); if(method=="INVITE"){ log("**************** vm start - begin ******************\n"); if (uri=~"sip:7000@.*") { if (!vm("/tmp/am_fifo", "announcement")) { log("couldn't contact ivr server\n"); t_reply("500", "couldn not contact announcement"); }; }; log("**************** vm start - end ******************\n"); } else if(method=="BYE"){ log("**************** vm end - begin ******************\n"); if(!vm("/tmp/am_fifo","bye")){ log("could not contact annoucement\n"); t_reply("500","could not contact annoucement"); }; log("**************** vm end - end ******************\n"); }; break; }; if (method=="CANCEL") { sl_send_reply("200", "cancels are junked here"); break; }; sl_send_reply("501", "method not understood here"); }
route[7] { # non-Voip -- just send "off-line" if (!(method=="INVITE" || method=="ACK" || method=="CANCEL")) { sl_send_reply("404", "Not Found"); break; }; if (t_newtran()) { t_reply("404", "Not Found"); acc_db_request("404 missed call", "missed_calls");
}; }
The reason why you don't get any reply from the mailing list is that you did not formulate your problem properly and did not provide us with enough information.
We know that you have problems at the time when your email appears on the mailing list, but if you want an answer then you must put some extra effort into debugging. Don't expect that we will take your config file and try to find out what's wrong -- nobody has time for this. Re-sending it does not really help, no matter how many exclamations marks you use.
If you want help from us then you need to specify your problems precisely. Write down scenarios which you want to implement, think what ser should do in each scenario, how SIP messages should look like and where they should be sent. After that start debugging each scenario separately, use ngrep to get SIP message dumps and see what's in the messages, make sure that ser, mysql server and sems (if used) is running. Start from simple scenarios and move to more complicated ones only if the previous works, do not try to solve everything at once.
In my opinion this list is pretty good in helping others, we try to do our best, so think how to reformulate your message to make it easier to understand and read if you get no response.
You get no reply to email like "here is my cfg, how do I make voicemail work", you probably get a quick reply if you write something like "ser does not forward my INVITE to voicemail, instead it replies with 4xx, sip dumps and config file are attached".
Do you see the difference ? Well formed and written questions, one after another, that is the key. And yes, it requires more effort on our side, but nobody said that SIP was easy, all of us have to learn.
In your particular case, I recommend you to get the default configuration file and make it work. Then mysql-related stuff like authentication and accounting, after that enable logging of missed calls, and so on.
Jan.
On 26-04 14:40, gaillac harry wrote:
Here is my ser.cg file. I try to configure send IM, Missed calls, Voicemail. I just can configure Send IM. Now I can call isdngw, ivr,..
I need help to configure lookup location logic for missed calls and voicemail (offline users)
Anybody could help me to configure the others functions (problem with logic !!).
harry Regards
# # $Id: ser.cfg,v 1.21.4.1 2003/11/10 15:35:15 andrei 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=7 fork=no log_stderror=yes */
check_via=no # (cmd. line: -v) dns=no # (cmd. line: -r) rev_dns=no # (cmd. line: -R) listen=192.168.0.1 port=5060 children=4 fifo="/tmp/ser_fifo" fifo_mode=0666 # ------------------ module loading ----------------------------------
# Uncomment this if you want to use SQL database loadmodule "/usr/lib/ser/modules/mysql.so"
loadmodule "/usr/lib/ser/modules/sl.so" loadmodule "/usr/lib/ser/modules/tm.so" loadmodule "/usr/lib/ser/modules/rr.so" loadmodule "/usr/lib/ser/modules/maxfwd.so" loadmodule "/usr/lib/ser/modules/usrloc.so" loadmodule "/usr/lib/ser/modules/registrar.so" loadmodule "/usr/lib/ser/modules/domain.so" loadmodule "/usr/lib/ser/modules/msilo.so" loadmodule "/usr/lib/ser/modules/acc.so" loadmodule "/usr/lib/ser/modules/vm.so" loadmodule "/usr/lib/ser/modules/uri.so" loadmodule "/usr/lib/ser/modules/group.so" loadmodule "/usr/lib/ser/modules/textops.so"
# Uncomment this if you want digest authentication # mysql.so must be loaded ! loadmodule "/usr/lib/ser/modules/auth.so" loadmodule "/usr/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_url", "mysql://ser:heslo@localhost/ser") modparam("usrloc", "db_mode", 2) modparam("usrloc", "use_domain", 1)
# -- 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")
# -- rr params -- # add value to ;lr param to make some broken UAs happy modparam("rr", "enable_full_lr", 1)
# --registrar params-- modparam("registrar", "use_domain", 1)
# --domain params-- modparam("domain", "db_url", "mysql://ser:heslo@localhost/ser") modparam("domain", "db_mode", 1) # Use chaching
# --acc params-- modparam("acc", "db_url", "mysql://ser:heslo@localhost/ser") modparam("acc", "db_missed_flag", 3)
# --msilo params-- modparam("msilo", "db_url", "mysql://ser:heslo@localhost/ser") modparam("msilo", "db_table", "silo") modparam("msilo","registrar","sip:registrar@192.168.0.1")
# --uri params-- #modparam("uri", "db_url", "mysql://ser:heslo@localhost/ser") #modparam("uri", "subscriber_table", "subscriber")
# --vm params-- modparam("voicemail", "db_url", "mysql://ser:heslo@localhost/ser")
# ------------------------- request routing logic -------------------
# 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; };
# 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; };
# --isdn gateway-- if(method=="INVITE" || method=="BYE" || method=="CANCEL"){ if (uri=~"sip:[0-9]{10}@.*") { route(2); break; }; };
# --ivr conf-- if(method=="INVITE" || method=="BYE" || method=="CANCEL"){ if (uri=~"sip:5000@.*") { route(4); break; }; };
# --conference-- if(method=="INVITE" || method=="BYE" || method=="CANCEL"){ if (uri=~"sip:6000@.*") { route(5); break; }; };
# --play an annoucement-- if(method=="INVITE" || method=="BYE" || method=="CANCEL"){ if (uri=~"sip:7000@.*") { route(6); break; }; };
# 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 (is_from_local()) {
if (method=="REGISTER") {
# Uncomment this if you want to use digest authentication if (!www_authorize("", "subscriber")) { www_challenge("", "0"); break; };
save("location"); # 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; }; # does the user wish redirection on no availability? (i.e., is he # in the voicemail (ser->grp) group?) if (is_user_in("Request-URI", "voicemail")) { t_on_failure("4"); setflag(4); }; # native SIP destinations are handled using our USRLOC DB lookup("aliases"); 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(); };
}
failure_route[1] { # forwarding failed -- check if the request was a MESSAGE if (!method=="MESSAGE") { break; };
log(1,"MSILO: the downstream UA does not support MESSAGE requests ...\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 for delivery"); }else{ log("MSILO: offline message NOT stored\n"); t_reply("503", "Service Unavailable"); }; }
failure_route[4] { route(3); #append_branch("sip:80000@10.1.2.5"); append_urihf("CC-Diversion: ", "\r\n"); append_hf("P-hint: OFFLINE-VOICEMAIL\r\n"); t_relay(); }
route[2] { # ############################## # # isdngw specific configuration # # ############################## # if(t_newtran()){
if(method=="INVITE" || method=="BYE" || method=="CANCEL"){ # send a response right at the start to avoid retransmissions t_reply("100","Trying -- just wait a minute !"); # isdngw only gets activated on invite requests if(method=="INVITE"){ # filename is defined in sems.conf. if(uri=~"sip:[0-9]{10}@.*"){ if(!vm("/tmp/am_fifo","isdngw")){ log("could not contact isdngw\n"); t_reply("500","could not contact isdngw"); }; # Allow the announcement module of sems to be used as well. # This can be useful for testing the isdngw. } else if(uri=~"sip:7000@.*"){ if(!vm("/tmp/am_fifo","announcement")){ log("could not contact announcement\n"); t_reply("500","could not contact announcement"); }; # we dont feel responsible for sip addresses of any other kind, # so send the right error code. } else { t_reply("404","Not Found"); }; # stop routing here, the message is now processed by the media server break; }; # The following handles the call termination, we must pass these requests # to the media server as follows. Again make shure the fifo name and permissions # are set correctly (like im sems.conf). if((method=="BYE")||(method=="CANCEL")){ if(!vm("/tmp/am_fifo","bye")){ log("could not contact the media server\n"); t_reply("500","could not contact the media server"); }; break; }; # other methods than INVITE, BYE and CANCEL are not handled by this SIP Server # so we sent an error message } else { log("ERROR: method not supported\n"); t_reply("500", "sorry, method not supported"); }; } else { # for any reason the transaction could not be created, send error code log("could not create new transaction\n"); sl_send_reply("500","could not create new transaction"); };
# in isdngw.conf. Don't change this setting. t_relay(); # end of routing. }
route[3] { ############################################ # Voicemail specific configuration - begin # ############################################ if(method=="ACK" || method=="INVITE" || method=="BYE"){
if (!t_newtran()) { log("could not create new transaction\n"); sl_send_reply("500","could not create new transaction"); break; }; t_reply("100","Trying -- just wait a minute !"); if(method=="INVITE"){ if(!vm("/tmp/am_fifo","voicemail")) { log("couldn't contact announcement server\n"); t_reply("500", "couldn not contact announcement server"); }; break; }; if(method=="BYE" || method=="CANCEL") { if(!vm("/tmp/am_fifo","bye")) { log("could not contact the answer machine\n"); t_reply("500","could not contact the answer machine"); }; break; };
}; if (method=="CANCEL") { sl_send_reply("200", "cancels are junked here"); break; }; sl_send_reply("501", "method not understood here"); }
route[4] { ###################################### # ivr specific configuration - begin # ###################################### if(method=="ACK" || method=="INVITE" || method=="BYE"){
if (!t_newtran()) { log("could not create new transaction\n"); sl_send_reply("500","could not create new transaction"); break; }; t_reply("100","Trying -- just wait a minute !"); if(method=="INVITE"){ log("**************** vm start - begin ******************\n"); if (uri=~"sip:5000@.*") { if (!vm("/tmp/am_fifo", "ivr")) { log("couldn't contact ivr server\n"); t_reply("500", "couldn not contact ivr server"); }; }; log("**************** vm start - end ******************\n"); } else if(method=="BYE"){ log("**************** vm end - begin ******************\n"); if(!vm("/tmp/am_fifo","bye")){ log("could not contact ivr\n"); t_reply("500","could not contact ivr"); }; log("**************** vm end - end ******************\n"); }; break;
}; if (method=="CANCEL") { sl_send_reply("200", "cancels are junked here"); break; }; sl_send_reply("501", "method not understood here"); }
route[5] {
# #################################### # conference specific configuration # # #################################### if(t_newtran()){ if(method=="INVITE" || method=="BYE" || method=="CANCEL"){ # send a response right at the start to avoid retransmissions t_reply("100","Trying -- just wait a minute !"); # isdngw only gets activated on invite requests if(method=="INVITE"){ # filename is defined in sems.conf. if(uri=~"sip:6000@.*"){ if(!vm("/tmp/am_fifo","conference")){ log("could not contact conference\n"); t_reply("500","could not contact conference"); }; # Allow the announcement module of sems to be used as well. # This can be useful for testing the conference. } else if(uri=~"sip:5000@.*"){ if(!vm("/tmp/am_fifo","announcement")){ log("could not contact announcement\n"); t_reply("500","could not contact announcement"); }; # we dont feel responsible for sip addresses of any other kind, # so send the right error code. } else { t_reply("404","Not Found"); }; # stop routing here, the message is now processed by the media server break; }; # The following handles the call termination, we must pass these requests # to the media server as follows. Again make shure the fifo name and permissions # are set correctly (like im sems.conf). if((method=="BYE")||(method=="CANCEL")){ if(!vm("/tmp/am_fifo","bye")){ log("could not contact the media server\n"); t_reply("500","could not contact the media server"); }; break; }; # other methods than INVITE, BYE and CANCEL are not handled by this SIP Server # so we sent an error message } else { log("ERROR: method not supported\n"); t_reply("500", "sorry, method not supported"); }; } else { # for any reason the transaction could not be created, send error code log("could not create new transaction\n"); sl_send_reply("500","could not create new transaction"); };
# in isdngw.conf. Don't change this setting. t_relay(); # end of routing. }
route[6] { ###################################### # announcement configuration - begin # ###################################### if(method=="ACK" || method=="INVITE" || method=="BYE"){
if (!t_newtran()) { log("could not create new transaction\n"); sl_send_reply("500","could not create new transaction"); break; }; t_reply("100","Trying -- just wait a minute !"); if(method=="INVITE"){ log("**************** vm start - begin ******************\n"); if (uri=~"sip:7000@.*") { if (!vm("/tmp/am_fifo", "announcement")) { log("couldn't contact ivr server\n"); t_reply("500", "couldn not contact announcement"); }; }; log("**************** vm start - end ******************\n"); } else if(method=="BYE"){ log("**************** vm end - begin ******************\n"); if(!vm("/tmp/am_fifo","bye")){ log("could not contact annoucement\n"); t_reply("500","could not contact annoucement"); }; log("**************** vm end - end ******************\n"); }; break;
}; if (method=="CANCEL") { sl_send_reply("200", "cancels are junked here"); break; }; sl_send_reply("501", "method not understood here"); }
route[7] { # non-Voip -- just send "off-line" if (!(method=="INVITE" || method=="ACK" || method=="CANCEL")) { sl_send_reply("404", "Not Found"); break; }; if (t_newtran()) { t_reply("404", "Not Found"); acc_db_request("404 missed call", "missed_calls");
};
}
Serusers mailing list serusers@lists.iptel.org http://lists.iptel.org/mailman/listinfo/serusers
I don't wait ser users from list do my job, I always try to help users if possible.
I started from simple scenarios and move to more complicated ones only if the previous works, I never try to solve everything at once. ser is able to start. I looked up mailing list and admin's guide
My problem is quite simple.
I want to use serweb with ser -:) i can send and receive IM from serweb because of i had 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; }; .... Now I would like to configure ser to send missed calls to offline or inline users with acc module but I can't because of I don't know where to put logic routing, may be (lookup location) block !
Harry
Le mar 27/04/2004 à 14:03, Jan Janak a écrit :
The reason why you don't get any reply from the mailing list is that you did not formulate your problem properly and did not provide us with enough information.
We know that you have problems at the time when your email appears on the mailing list, but if you want an answer then you must put some extra effort into debugging. Don't expect that we will take your config file and try to find out what's wrong -- nobody has time for this. Re-sending it does not really help, no matter how many exclamations marks you use.
If you want help from us then you need to specify your problems precisely. Write down scenarios which you want to implement, think what ser should do in each scenario, how SIP messages should look like and where they should be sent. After that start debugging each scenario separately, use ngrep to get SIP message dumps and see what's in the messages, make sure that ser, mysql server and sems (if used) is running. Start from simple scenarios and move to more complicated ones only if the previous works, do not try to solve everything at once.
In my opinion this list is pretty good in helping others, we try to do our best, so think how to reformulate your message to make it easier to understand and read if you get no response.
You get no reply to email like "here is my cfg, how do I make voicemail work", you probably get a quick reply if you write something like "ser does not forward my INVITE to voicemail, instead it replies with 4xx, sip dumps and config file are attached".
Do you see the difference ? Well formed and written questions, one after another, that is the key. And yes, it requires more effort on our side, but nobody said that SIP was easy, all of us have to learn.
In your particular case, I recommend you to get the default configuration file and make it work. Then mysql-related stuff like authentication and accounting, after that enable logging of missed calls, and so on.
Jan.
On 26-04 14:40, gaillac harry wrote:
Here is my ser.cg file. I try to configure send IM, Missed calls, Voicemail. I just can configure Send IM. Now I can call isdngw, ivr,..
I need help to configure lookup location logic for missed calls and voicemail (offline users)
Anybody could help me to configure the others functions (problem with logic !!).
harry Regards
# # $Id: ser.cfg,v 1.21.4.1 2003/11/10 15:35:15 andrei 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=7 fork=no log_stderror=yes */
check_via=no # (cmd. line: -v) dns=no # (cmd. line: -r) rev_dns=no # (cmd. line: -R) listen=192.168.0.1 port=5060 children=4 fifo="/tmp/ser_fifo" fifo_mode=0666 # ------------------ module loading ----------------------------------
# Uncomment this if you want to use SQL database loadmodule "/usr/lib/ser/modules/mysql.so"
loadmodule "/usr/lib/ser/modules/sl.so" loadmodule "/usr/lib/ser/modules/tm.so" loadmodule "/usr/lib/ser/modules/rr.so" loadmodule "/usr/lib/ser/modules/maxfwd.so" loadmodule "/usr/lib/ser/modules/usrloc.so" loadmodule "/usr/lib/ser/modules/registrar.so" loadmodule "/usr/lib/ser/modules/domain.so" loadmodule "/usr/lib/ser/modules/msilo.so" loadmodule "/usr/lib/ser/modules/acc.so" loadmodule "/usr/lib/ser/modules/vm.so" loadmodule "/usr/lib/ser/modules/uri.so" loadmodule "/usr/lib/ser/modules/group.so" loadmodule "/usr/lib/ser/modules/textops.so"
# Uncomment this if you want digest authentication # mysql.so must be loaded ! loadmodule "/usr/lib/ser/modules/auth.so" loadmodule "/usr/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_url", "mysql://ser:heslo@localhost/ser") modparam("usrloc", "db_mode", 2) modparam("usrloc", "use_domain", 1)
# -- 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")
# -- rr params -- # add value to ;lr param to make some broken UAs happy modparam("rr", "enable_full_lr", 1)
# --registrar params-- modparam("registrar", "use_domain", 1)
# --domain params-- modparam("domain", "db_url", "mysql://ser:heslo@localhost/ser") modparam("domain", "db_mode", 1) # Use chaching
# --acc params-- modparam("acc", "db_url", "mysql://ser:heslo@localhost/ser") modparam("acc", "db_missed_flag", 3)
# --msilo params-- modparam("msilo", "db_url", "mysql://ser:heslo@localhost/ser") modparam("msilo", "db_table", "silo") modparam("msilo","registrar","sip:registrar@192.168.0.1")
# --uri params-- #modparam("uri", "db_url", "mysql://ser:heslo@localhost/ser") #modparam("uri", "subscriber_table", "subscriber")
# --vm params-- modparam("voicemail", "db_url", "mysql://ser:heslo@localhost/ser")
# ------------------------- request routing logic -------------------
# 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; };
# 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; };
# --isdn gateway-- if(method=="INVITE" || method=="BYE" || method=="CANCEL"){ if (uri=~"sip:[0-9]{10}@.*") { route(2); break; }; };
# --ivr conf-- if(method=="INVITE" || method=="BYE" || method=="CANCEL"){ if (uri=~"sip:5000@.*") { route(4); break; }; };
# --conference-- if(method=="INVITE" || method=="BYE" || method=="CANCEL"){ if (uri=~"sip:6000@.*") { route(5); break; }; };
# --play an annoucement-- if(method=="INVITE" || method=="BYE" || method=="CANCEL"){ if (uri=~"sip:7000@.*") { route(6); break; }; };
# 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 (is_from_local()) {
if (method=="REGISTER") {
# Uncomment this if you want to use digest authentication if (!www_authorize("", "subscriber")) { www_challenge("", "0"); break; };
save("location"); # 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; }; # does the user wish redirection on no availability? (i.e., is he # in the voicemail (ser->grp) group?) if (is_user_in("Request-URI", "voicemail")) { t_on_failure("4"); setflag(4); }; # native SIP destinations are handled using our USRLOC DB lookup("aliases"); 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(); };
}
failure_route[1] { # forwarding failed -- check if the request was a MESSAGE if (!method=="MESSAGE") { break; };
log(1,"MSILO: the downstream UA does not support MESSAGE requests ...\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 for delivery"); }else{ log("MSILO: offline message NOT stored\n"); t_reply("503", "Service Unavailable"); }; }
failure_route[4] { route(3); #append_branch("sip:80000@10.1.2.5"); append_urihf("CC-Diversion: ", "\r\n"); append_hf("P-hint: OFFLINE-VOICEMAIL\r\n"); t_relay(); }
route[2] { # ############################## # # isdngw specific configuration # # ############################## # if(t_newtran()){
if(method=="INVITE" || method=="BYE" || method=="CANCEL"){ # send a response right at the start to avoid retransmissions t_reply("100","Trying -- just wait a minute !"); # isdngw only gets activated on invite requests if(method=="INVITE"){ # filename is defined in sems.conf. if(uri=~"sip:[0-9]{10}@.*"){ if(!vm("/tmp/am_fifo","isdngw")){ log("could not contact isdngw\n"); t_reply("500","could not contact isdngw"); }; # Allow the announcement module of sems to be used as well. # This can be useful for testing the isdngw. } else if(uri=~"sip:7000@.*"){ if(!vm("/tmp/am_fifo","announcement")){ log("could not contact announcement\n"); t_reply("500","could not contact announcement"); }; # we dont feel responsible for sip addresses of any other kind, # so send the right error code. } else { t_reply("404","Not Found"); }; # stop routing here, the message is now processed by the media server break; }; # The following handles the call termination, we must pass these requests # to the media server as follows. Again make shure the fifo name and permissions # are set correctly (like im sems.conf). if((method=="BYE")||(method=="CANCEL")){ if(!vm("/tmp/am_fifo","bye")){ log("could not contact the media server\n"); t_reply("500","could not contact the media server"); }; break; }; # other methods than INVITE, BYE and CANCEL are not handled by this SIP Server # so we sent an error message } else { log("ERROR: method not supported\n"); t_reply("500", "sorry, method not supported"); }; } else { # for any reason the transaction could not be created, send error code log("could not create new transaction\n"); sl_send_reply("500","could not create new transaction"); };
# in isdngw.conf. Don't change this setting. t_relay(); # end of routing. }
route[3] { ############################################ # Voicemail specific configuration - begin # ############################################ if(method=="ACK" || method=="INVITE" || method=="BYE"){
if (!t_newtran()) { log("could not create new transaction\n"); sl_send_reply("500","could not create new transaction"); break; }; t_reply("100","Trying -- just wait a minute !"); if(method=="INVITE"){ if(!vm("/tmp/am_fifo","voicemail")) { log("couldn't contact announcement server\n"); t_reply("500", "couldn not contact announcement server"); }; break; }; if(method=="BYE" || method=="CANCEL") { if(!vm("/tmp/am_fifo","bye")) { log("could not contact the answer machine\n"); t_reply("500","could not contact the answer machine"); }; break; };
}; if (method=="CANCEL") { sl_send_reply("200", "cancels are junked here"); break; }; sl_send_reply("501", "method not understood here"); }
route[4] { ###################################### # ivr specific configuration - begin # ###################################### if(method=="ACK" || method=="INVITE" || method=="BYE"){
if (!t_newtran()) { log("could not create new transaction\n"); sl_send_reply("500","could not create new transaction"); break; }; t_reply("100","Trying -- just wait a minute !"); if(method=="INVITE"){ log("**************** vm start - begin ******************\n"); if (uri=~"sip:5000@.*") { if (!vm("/tmp/am_fifo", "ivr")) { log("couldn't contact ivr server\n"); t_reply("500", "couldn not contact ivr server"); }; }; log("**************** vm start - end ******************\n"); } else if(method=="BYE"){ log("**************** vm end - begin ******************\n"); if(!vm("/tmp/am_fifo","bye")){ log("could not contact ivr\n"); t_reply("500","could not contact ivr"); }; log("**************** vm end - end ******************\n"); }; break;
}; if (method=="CANCEL") { sl_send_reply("200", "cancels are junked here"); break; }; sl_send_reply("501", "method not understood here"); }
route[5] {
# #################################### # conference specific configuration # # #################################### if(t_newtran()){ if(method=="INVITE" || method=="BYE" || method=="CANCEL"){ # send a response right at the start to avoid retransmissions t_reply("100","Trying -- just wait a minute !"); # isdngw only gets activated on invite requests if(method=="INVITE"){ # filename is defined in sems.conf. if(uri=~"sip:6000@.*"){ if(!vm("/tmp/am_fifo","conference")){ log("could not contact conference\n"); t_reply("500","could not contact conference"); }; # Allow the announcement module of sems to be used as well. # This can be useful for testing the conference. } else if(uri=~"sip:5000@.*"){ if(!vm("/tmp/am_fifo","announcement")){ log("could not contact announcement\n"); t_reply("500","could not contact announcement"); }; # we dont feel responsible for sip addresses of any other kind, # so send the right error code. } else { t_reply("404","Not Found"); }; # stop routing here, the message is now processed by the media server break; }; # The following handles the call termination, we must pass these requests # to the media server as follows. Again make shure the fifo name and permissions # are set correctly (like im sems.conf). if((method=="BYE")||(method=="CANCEL")){ if(!vm("/tmp/am_fifo","bye")){ log("could not contact the media server\n"); t_reply("500","could not contact the media server"); }; break; }; # other methods than INVITE, BYE and CANCEL are not handled by this SIP Server # so we sent an error message } else { log("ERROR: method not supported\n"); t_reply("500", "sorry, method not supported"); }; } else { # for any reason the transaction could not be created, send error code log("could not create new transaction\n"); sl_send_reply("500","could not create new transaction"); };
# in isdngw.conf. Don't change this setting. t_relay(); # end of routing. }
route[6] { ###################################### # announcement configuration - begin # ###################################### if(method=="ACK" || method=="INVITE" || method=="BYE"){
if (!t_newtran()) { log("could not create new transaction\n"); sl_send_reply("500","could not create new transaction"); break; }; t_reply("100","Trying -- just wait a minute !"); if(method=="INVITE"){ log("**************** vm start - begin ******************\n"); if (uri=~"sip:7000@.*") { if (!vm("/tmp/am_fifo", "announcement")) { log("couldn't contact ivr server\n"); t_reply("500", "couldn not contact announcement"); }; }; log("**************** vm start - end ******************\n"); } else if(method=="BYE"){ log("**************** vm end - begin ******************\n"); if(!vm("/tmp/am_fifo","bye")){ log("could not contact annoucement\n"); t_reply("500","could not contact annoucement"); }; log("**************** vm end - end ******************\n"); }; break;
}; if (method=="CANCEL") { sl_send_reply("200", "cancels are junked here"); break; }; sl_send_reply("501", "method not understood here"); }
route[7] { # non-Voip -- just send "off-line" if (!(method=="INVITE" || method=="ACK" || method=="CANCEL")) { sl_send_reply("404", "Not Found"); break; }; if (t_newtran()) { t_reply("404", "Not Found"); acc_db_request("404 missed call", "missed_calls");
};
}
Serusers mailing list serusers@lists.iptel.org http://lists.iptel.org/mailman/listinfo/serusers
On 27-04 14:40, gaillac harry wrote:
Now I would like to configure ser to send missed calls to offline or inline users with acc module but I can't because of I don't know where to put logic routing, may be (lookup location) block !
If you need ser to report missed calls then see the documentation:
http://iptel.org/ser/doc/seruser/seruser.html#MISSEDCALLS
If you want ser to route calls to voicemail, then do the following when lookup fails:
if (!lookup("location")) { # handle user which was not found route(1); break; };
And the route sections can look like this:
route[1] { # non-Voip -- just send "off-line" if (!(method == "INVITE" || method == "ACK" || method == "CANCEL")) { sl_send_reply("404", "Not Found"); break; };
if (t_newtran()) { if (method == "ACK") { log(1, "CAUTION: strange thing: ACK passed t_newtran\n"); break; };
t_reply("100","Trying -- just wait a minute !"); log(1, "am: voicemail"); if (!vm("/tmp/am_fifo", "voicemail")) { log(1, "couldn't contact voicemail server\n"); t_reply("500", "couldn't not contact voicemail server"); }; };
# we account missed incoming calls; previous statteful processing # guarantees that retransmissions are not accounted if (method == "INVITE") { acc_log_request("404 missed call\n"); acc_db_request("404 missed call", "missed_calls"); }; }
Jan.
ok missed calls are insert into table missed_calls may be i could see them after updating mysql to release 4 because of missed_calls.php.
but now users can't send or receive IM reply "request timeout"!!!! What's still wrong ??????
look at :
# native SIP destinations are handled using our USRLOC DB lookup("aliases"); if (!lookup("location")) { # handle user which was not found setflag(3); route(1); break; }; }; }; }
route[1] {
#################################### # voicemail specific configuration # ####################################
# non-Voip -- just send "off-line" if (!(method == "INVITE" || method == "ACK" || method == "CANCEL")) { sl_send_reply("404", "Not Found"); break; };
if (t_newtran()) { if (method == "ACK") { log(1, "CAUTION: strange thing: ACK passed t_newtran\n"); break; };
t_reply("100","Trying -- just wait a minute !"); log(1, "am: voicemail"); if (!vm("/tmp/am_fifo", "voicemail")) { log(1, "couldn't contact voicemail server\n"); t_reply("500", "couldn't not contact voicemail server"); }; };
# we account missed incoming calls; previous statteful processing # guarantees that retransmissions are not accounted if (method == "INVITE") { acc_log_request("404 missed call\n"); acc_db_request("404 missed call", "missed_calls"); };
if (method == "MESSAGE") { sl_reply_error(); break; };
if (m_store("0")) { t_reply("202", "Accepted for Later Delivery"); break; };
t_reply("503", "Service Unavailable"); break;
}