Below is the latest config of mine solving all the t_* errors.. and thanks to the ser list for the help so far.. But one problem still remains. When a person hangs up there is no end of call logged and the phone takes a little while to disconnect and the other phone never hangs up.. nothing is in the error logs about the disconnect either.
# ----------- global configuration parameters ------------------------
debug=7 # 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=4 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"
# ----------------- 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("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", 11) modparam("acc", "db_missed_flag", 12) 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@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(11); setflag(12);
record_route(); if (loose_route()) { t_relay(); break; };
if (!search("(f|From): .*@voip.livewirenet.com")) { sl_send_reply("404","Not Found"); break; };
# decide if callee has voicemail if (is_user_in("Request-URI", "voicemail")) { setflag(4); };
# decide if caller is allowed long distance if (is_user_in("From", "ld")) { setflag(5); };
# 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; };
if (!lookup("location")) { # if we can't lookup the location and the callee has voicemail # we need not worry about any call routing and should dump # the call directly to voicemail if (isflagset(4)) { route(4); break; };
# We have made sure that voicemail for a local user isn't an # issue.. now process like a normal call route(5); break;
} else { # found in userloc t_relay(); break; };
}; # end uri==myself
} # end main route
route[4] {
# 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[5] {
# protect the pstn from having to bother with calls to out local blocks if (uri=~"^sip:303993") { sl_send_reply("404", "no such user"); break; };
# dial plan routing - long distance or local lata/tandem transit if (uri=~"^sip:1") { if (isflagset(5)) { rewritehostport("172.16.0.7:5060"); t_relay(); break; } else { sl_send_reply("500","Not allowed to call long distance"); break; }; };
if (uri=~"^sip:720") { rewritehostport("172.16.0.5:5060"); t_relay(); break; };
if (uri=~"^sip:303") { rewritehostport("172.16.0.5:5060"); t_relay(); break; };
# should not have gotten here sl_reply_error(); break;
}
Jiri Kuthan wrote:
At 12:08 AM 1/30/2004, Matt Hess wrote:
I sent the complete cfg file earlier and didn't want to duplicate it if it was unnecessary..
ignore my previous request to resent the config file -- I didn't realize it is the same one. Anyhow, my previous email should have answered your questions.
and as I've been reading.. statefull ransactions are required for acc .. yes?
It depends on what you want to do. Typically, you wish to account on result of proxied transactions -- that's why you need state: you keep original requests in memory, correlate them with replies and generate a report eventually which uses information from both stored request and received replies.
In your script however, you generate local replies if some undesirable conditions occur (Incorrect domain, etc.) It does not seem reasonable to flood accoutning with reports on all localy denied request. I better suggest generating all local negative replies statelessly -- that scales a way better.
-jiri