[Serusers] config / accounting help

Matt Hess mhess at livewirenet.com
Fri Jan 30 22:30:25 CET 2004


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 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(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 




More information about the sr-users mailing list