[Serusers] config / accounting help

Matt Hess mhess at livewirenet.com
Mon Feb 2 21:52:03 CET 2004


In doing the dumps the bye messages were being sent to ser from the 
client but they were not passing through ser.. this was using 2 x-lite 
free clients.. in using a cisco ata and x-lite if the cisco hung up 
first the x-lite would hang up no problem but if the x-lite hung up 
first the cisco wouldnt see the termination.. I knew it was my config 
because with the default ser sample config the clients behaved normally.

So I re-did my config yet again with a bit more logic and a good night's 
rest and everything works now.. this has been one heck of a thing to 
configure as the docs are so spread out and out of date as to 
functionality and module usages.. but I should shutup since I haven't 
volunteered my time to fix them yet.

Below is my complete (seemingly working) config so others in the future 
may benefit from my strugle and hopefully not ask for other examples on 
here thus saving mailing list traffic and repeat questions


Jan Janak wrote:

 > Make sure that BYE really passes through ser. If not then the phones are
 > broken because you have record-routing enabled. Anyway, SIP message
 > dumps would help to diagnose the problem.
 >
 >  Jan.



# ----------- global configuration parameters ------------------------

debug=3                # debug level (cmd line: -dddddddddd)
fork=yes

log_stderror=no        # (cmd line: -E)
check_via=no        # (cmd. line: -v)
dns=no            # (cmd. line: -r)
rev_dns=no        # (cmd. line: -R)
port=5060
children=10
fifo="/tmp/ser_fifo"
fifo_mode=0666

alias="voip.livewirenet.com"

# ------------------ module loading ----------------------------------

loadmodule "/usr/local/ser/lib/ser/modules/mysql.so"
loadmodule "/usr/local/ser/lib/ser/modules/sl.so"
loadmodule "/usr/local/ser/lib/ser/modules/tm.so"
loadmodule "/usr/local/ser/lib/ser/modules/acc.so"
loadmodule "/usr/local/ser/lib/ser/modules/maxfwd.so"
loadmodule "/usr/local/ser/lib/ser/modules/rr.so"
loadmodule "/usr/local/ser/lib/ser/modules/textops.so"
loadmodule "/usr/local/ser/lib/ser/modules/vm.so"
loadmodule "/usr/local/ser/lib/ser/modules/usrloc.so"
loadmodule "/usr/local/ser/lib/ser/modules/registrar.so"
loadmodule "/usr/local/ser/lib/ser/modules/auth.so"
loadmodule "/usr/local/ser/lib/ser/modules/auth_db.so"
loadmodule "/usr/local/ser/lib/ser/modules/group.so"
loadmodule "/usr/local/ser/lib/ser/modules/uri.so"

# ----------------- setting module-specific parameters ---------------

modparam("voicemail", "db_url","mysql://ser:heslo@localhost/ser")
modparam("voicemail", "email_column", "email_address")
modparam("voicemail", "subscriber_table", "subscriber")
modparam("voicemail", "user_column", "username")
modparam("usrloc", "db_mode", 1)
modparam("auth_db", "calculate_ha1", yes)
modparam("auth_db", "password_column", "password")
modparam("rr", "enable_full_lr", 1)
modparam("rr", "append_fromtag", 1)
modparam("acc", "log_level", 1)
modparam("acc", "log_flag", 1)
modparam("acc", "log_missed_flag", 2)
modparam("acc", "db_url", "mysql://ser:heslo@localhost/ser")
modparam("acc", "db_flag", 3)
modparam("acc", "db_missed_flag", 4)
modparam("acc", "failed_transactions", 1)
modparam("group", "db_url", "mysql://ser:heslo@localhost/ser")
modparam("group", "table", "grp")
modparam("group", "user_column", "username")
modparam("group", "domain_column", "domain")
modparam("group", "group_column", "grp")
# If set to 1 then username at domain will be used for lookup, if
# set to 0 then only username will be used.
modparam("group", "use_domain", 0)


# -------------------------  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")) {
     t_reply("483","Too Many Hops");
     break;
};
if ( msg:len > max_len ) {
     t_reply("513", "Message too big");
     break;
};

# label all transactions for accounting
setflag(3);
setflag(4);

record_route();
if (loose_route()) {
     t_relay();
     break;
};

if (!search("(f|From): .*@voip.livewirenet.com")) {
     sl_send_reply("603","Transaction Declined");
     break;
};

# callee should be on this system
if (does_uri_exist()) {
     setflag(5);
};

# decide if caller is allowed local calls
if (is_user_in("From", "local")) {
     setflag(6);
};

# decide if callee has voicemail
if (is_user_in("Request-URI", "voicemail")) {
     setflag(7);
};

# decide if caller is allowed long distance
if (is_user_in("From", "ld")) {
     setflag(8);
};

# only process for our sip domain
if (uri==myself) {

# authorize and save location
if (method=="REGISTER") {
     if (!www_authorize("voip.livewirenet.com", "subscriber")) {
         www_challenge("voip.livewirenet.com", "1");
         break;
     };
     save("location");
     break;
};

# handle for users on our system first as all users should be in database
if (isflagset(5)) {
     if (!lookup("location")) {
         # if we can't lookup the location and the callee has voicemail
         if (isflagset(7)) {
             route(7);
             break;
         } else {
             sl_send_reply("404", "subscriber not online");
             break;
         };
     };
# end localuser handling
} else {
     # protect the pstn from having to bother with calls to local blocks
     if (uri=~"^sip:303993") {
         sl_send_reply("404", "no such user");
         break;
     } else {
         # must have local perms to dial local or ld
         if (isflagset(6)) {
             route(6);
         } else {
             sl_send_reply("403","Not allowed to call out");
             break;
         };
     };

}; # end local or pstn logic

}; # end uri==myself

if (!t_relay()) {
     sl_reply_error();
};

} # end main route


route[7] {

# Voicemail specific configuration - begin
if(method=="ACK" || method=="INVITE" || method=="BYE" || method=="REFER"){
     if(t_newtran()){
         t_reply("100","Trying -- just wait a minute !");
         if(method=="INVITE" || method=="REFER"){
         log("**************** vm start - begin ******************\n");
         if( uri =~ "conference" ){
             if(!vm("/tmp/am_fifo","conference")){
                log("could not contact conference server\n");
                t_reply("500","could not contact conference server");
             };
         } else if( uri =~ "echo" ){
             if(!vm("/tmp/am_fifo","echo")){
                log("could not contact echo\n");
                t_reply("500","could not contact echo");
             };
         } else {
             if(!vm("/tmp/am_fifo","voicemail")){
                log("could not contact voicemail\n");
                t_reply("500","could not contact voicemail");
             };
         };
         log("**************** vm start - end ******************\n");
         break;
         };

         if(method=="BYE"){
           log("**************** vm end/refer - begin 
******************\n");          if(!vm("/tmp/am_fifo","bye")){
         log("could not contact the media server\n");
         t_reply("500","could not contact the media server");
           };
           log("**************** vm end/refer - end 
********************\n");
           break;
         };
     } else {
         log("could not create new transaction\n");
         t_reply("500","could not create new transaction");
     };
};
# Voicemail specific configuration - end

}


route[6] {

# dial plan routing - long distance or local lata/tandem transit
if (uri=~"^sip:1") {
     if (isflagset(8)) {
         rewritehostport("172.16.0.7:5060");
     } else {
         sl_send_reply("403","Not allowed to call long distance");
         break;
     };
};

if (uri=~"^sip:720") {
     rewritehostport("172.16.0.5:5060");
};

if (uri=~"^sip:303") {
     rewritehostport("172.16.0.5:5060");
};

} # end pstn routing






More information about the sr-users mailing list