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