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