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): .*(a)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