[Serusers] VoiceMail Help

Veselin Iordanov veselin_iordanov at hotmail.com
Wed Aug 25 09:59:42 CEST 2004


ok i found example configuration fails for making ser+sems+voice mail 
somewhare in the mailing list but have one strange problem..
all of the servers are on one PC
This is a configuration files
1. conf file for main ser server
#
# $Id: ser.cfg,v 1.21 2003/06/04 13:47:36 jiri 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=80.72.85.178
port=5060
children=4
fifo="/tmp/ser_fifo"
alias=testinfo.intersoftpro.com 127.0.0.1 80.72.85.178

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

# Uncomment this if you want to use SQL database
loadmodule "/usr/local/lib/ser/modules/mysql.so"

loadmodule "/usr/local/lib/ser/modules/sl.so"
loadmodule "/usr/local/lib/ser/modules/tm.so"
loadmodule "/usr/local/lib/ser/modules/rr.so"
loadmodule "/usr/local/lib/ser/modules/maxfwd.so"
loadmodule "/usr/local/lib/ser/modules/usrloc.so"
loadmodule "/usr/local/lib/ser/modules/registrar.so"
loadmodule "/usr/local/lib/ser/modules/textops.so"

# Uncomment this if you want digest authentication
# mysql.so must be loaded !
loadmodule "/usr/local/lib/ser/modules/auth.so"
loadmodule "/usr/local/lib/ser/modules/auth_db.so"

# load the voicemail module
#loadmodule "/usr/local/lib/ser/modules/vm.so"

# load the enum module
loadmodule "/usr/local/lib/ser/modules/enum.so"

# load the group module, to verify if a user forwards to voicemail
loadmodule "/usr/local/lib/ser/modules/group.so"

# load the nathelper module
loadmodule "/usr/local/lib/ser/modules/nathelper.so"

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

# -- registrar parameter
# special NAT flag indicates that a registered client is behind NAT
modparam("registrar", "nat_flag", 6)

# -- 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_mode", 2)
modparam("usrloc", "db_url", "mysql://ser:heslo@localhost/ser")

# -- 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")
modparam("auth_db", "db_url", "mysql://ser:heslo@localhost/ser")

# -- rr params --
# add value to ;lr param to make some broken UAs happy
modparam("rr", "enable_full_lr", 1)

# -- voicemail params --
#modparam("voicemail", "db_url","mysql://ser:heslo@localhost/ser")

# -- voicemail params --
modparam("group", "db_url","mysql://serro:heslo@localhost/ser")

# -- nathelper params --
modparam("nathelper", "natping_interval", 60)
modparam("nathelper", "ping_nated_only", 1)

modparam("tm", "fr_inv_timer", 30 )
#modparam("tm", "fr_inv_timer", 8 )

# -------------------------  request routing logic -------------------

# main routing logic

route{
	log(1, "-------------------------------------------\n");
	log(1, "entering main loop\n");

	if (nat_uac_test("2")) {
		log(1, "src address different than via header->NAT detected\n");
		log(1, "force_rport and fix_nated_contact and setflag(5)\n");
		#try NAT traversal, works only if the client is symmetrical
		force_rport();
		fix_nated_contact();
		append_hf("P-hint: fixed NAT contact for request\r\n");
		# flag 5 indicates that incoming request is from NATed client
		setflag(5);
	};

	if (method=="REGISTER")
		log(1, "REGISTER message received\n");

	if (method=="INVITE")
		log(1, "INVITE message received\n");

	if (method=="ACK")
		log(1, "ACK message received\n");

	if (method=="BYE")
		log(1, "BYE message received\n");

        if (method=="CANCEL")
                log(1, "CANCEL message received\n");

	if (method=="SUBSCRIBE")
		log(1, "SUBSCRIBE message received\n");

	if (method=="NOTIFY")
		log(1, "NOTIFY message received\n");

	if (method=="OPTIONS")
		log(1, "OPTIONS message received\n");

	if (method=="INFO")
		log(1, "INFO message received\n");

	if (method=="MESSAGE")
		log(1, "MESSAGE message received\n");

	if (method=="REFER")
		log(1, "REFER message received\n");

	# 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) {
	#if (len_gt( max_len )) {
		sl_send_reply("513", "Message too big");
		break;
	};

	# loose-route processing
	if (loose_route()) {
		log(1, "loose_route processing\n");
		t_relay();
		break;
	};

	# create transaction state; abort if error occured
#	if ( !t_newtran()) {
#		sl_reply_error();
#		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 (uri==myself) {

		if (method=="REGISTER") {
			log(1, "analyzing REGISTER request\n");
# Uncomment this if you want to use digest authentication
			if (!www_authorize("80.72.85.178", "subscriber")) {
				www_challenge("80.72.85.178", "0");
				break;
			};

			if (isflagset(5)) {
				#register from nated client, save nat_flag=6
				#in location table
				setflag(6);
			};
			if (!save("location")) {
				log(1, "save location error\n");
				sl_reply_error();
			};
			break;
		};

		lookup("aliases");

		# check if number beginns with 00, then convert it into a +
		if (uri=~"^sip:359[0-9]*@") {
			log(1, "00 International number detected\n");
			# strip booth leading "0"
			strip(2);
			prefix("+");
		};
		# check if request uri begins with an internation phone number, if yes, 
try enum to resolve
		if (uri=~"^sip:\+[0-9]*@") {
			log(1, "+ International number detected\n");
			if (!enum_query("voice")) {
				log(1, "ENUM query failed, try enum without voice prefix\n");
				if (enum_query("")) {
					log(1, "ENUM without voice prefix also failed\n");
				};
			};

			if (uri != myself) {
				log(1, "ENUM lookup revealed an external address, relaying...");
				route(1);
				break;
			};
		};

		#mark transaction for voicemail
		if (is_user_in("Request-URI", "voicemail\n")) {
			log(1, "requested user is in voicemail group");
			setflag(4);
		};

		# native SIP destinations are handled using our USRLOC DB
		if (!lookup("location")) {
			# handle user which was not found
			log(1, "requested user not found\n");
			route(4);
			break;
		};
	};

	#add failure route which should be performed if response code >=300
	if  (method=="INVITE" && isflagset(4)) {
		log(1, "invite for voicemail user->initiate failureroute[1]\n");
		t_on_failure("1");
	};

	# forward to current uri now; use stateful forwarding; that
	# works reliably even if we forward from TCP to UDP

	route(1);
}

route[1]{
	log(1, "-------------------------------------------\n");
	log(1, "entering route[1] - relaying SIP message\n");
	if ((isflagset(5)) || (isflagset(6))) {
		log(1, "at least one of the participants is NATed->record_route\n");
		record_route();
		log(1, "     -->setting up reply processing ->onreply_route[1]");
		t_on_reply("1");
		if (method=="INVITE") {
			log(1, "     INVITE request-->force_rtp_proxy, set NATED-INVITE 
flag(7)");
			force_rtp_proxy();
			append_hf("P-hint: request forced to rtp proxy\r\n");
			setflag(7);
		};
	};

	log(1, "relaying message ...\n");
	if (!t_relay()) {
		log(1, "t_relay error occured\n");
		sl_reply_error();
	};

}

# all incoming replies for t_onrepli-ed transactions enter here
onreply_route[1] {
	log(1, "-------------------------------------------\n");
	log(1, "onreply_route[1] entered\n");

	if (isflagset(6)) {
		log(1, "transaction was sent to a NATED client -> fix nated contact\n");
		fix_nated_contact();
		append_hf("P-hint: fixed NAT contact for response\r\n");
	}

	if ( (status=~"100") ) {
		log(1, "status 100 received\n");
	};

	if ( (status=~"180") ) {
		log(1, "status 180 received\n");
	};

	if ( (status=~"202") ) {
		log(1, "status 202 received\n");
	};

	if ( (status=~"200" || status=~"183") ) {
		log(1, "status 2xx or 183");
		if ( isflagset(7) ) {
			log(1, "marked(7) as NATED-INVITE -> force_rtp_proxy \n");
			force_rtp_proxy();
			append_hf("P-hint: response forced to rtp proxy\r\n");
		};
	};
}

route[4]{
	log(1, "-------------------------------------------\n");
	log(1, "entering route[4] = requested user not online\n");
	# non-Voip -- just send "off-line"
	if (!(method == "INVITE" || method == "ACK" || method == "CANCEL" || method 
== "REFER" || method == "BYE")) {
		log(1, "no invite,ack,cancel,refer->return 404\n");
		sl_send_reply("404", "Not Found");
		break;
	};

	# not voicemail subscriber and no echo/conference call
        if ( isflagset(4)) {
                log(1, "flag(4) active\n");
        };
        if (uri =~ "conference") {
                log(1, "conference call\n");
        };
        if (uri =~ "echo") {
                log(1, "echo call\n");
        };
	if ( !( isflagset(4) || (uri =~ "conference") || (uri =~ "echo") ) ) {
		log(1, "no voicemail subscriber->return 404");
		sl_send_reply("404", "Not Found and no voicemail turned on");
		break;
	};

        if ( isflagset(5) ) {
                log(1, "caller is NATed->record_route\n");
                record_route();
                log(1, "     -->setting up reply processing 
->onreply_route[1]");
                t_on_reply("1");
                if (method=="INVITE") {
                        log(1, "     INVITE request-->force_rtp_proxy");
                        force_rtp_proxy();
                };
        };

	# forward to voicemail now
	#rewritehostport("machtnix.ict.tuwien.ac.at:5060");
	log(1, "forward to voicemail\n");
	t_relay_to_udp("80.72.85.178", "5090");

	#klaus
	#forward(machtnix.ict.tuwien.ac.at, 5060)
}



failure_route[1] {
  /* XX: note: unsafe if preloaded routes without username used */
	log(1, "-------------------------------------------\n");
	log(1, "failureroute[1] entered\");
	revert_uri();
	#rewritehostport("machtnix.ict.tuwien.ac.at:5060");
#	append_branch();
	t_relay_to_udp("machtnix.ict.tuwien.ac.at", "5060");
}

2. Conf File for second instance of the ser server (voice mail )
#
# $Id: voicemail.cfg,v 1.21 2003/06/04 13:47:36 jiri 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=80.72.85.178
port=5090
children=4
fifo="/tmp/ser_fifo"
alias=testinfo.intersoftpro.com 127.0.0.1 80.72.85.178

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

# Uncomment this if you want to use SQL database
loadmodule "/usr/local/lib/ser/modules/mysql.so"

loadmodule "/usr/local/lib/ser/modules/sl.so"
loadmodule "/usr/local/lib/ser/modules/tm.so"
loadmodule "/usr/local/lib/ser/modules/rr.so"
loadmodule "/usr/local/lib/ser/modules/maxfwd.so"

# load the voicemail module
loadmodule "/usr/local/lib/ser/modules/vm.so"

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

modparam("voicemail", "db_url","mysql://ser:heslo@localhost/ser")

# -------------------------  request routing logic -------------------

# main routing logic

route{
        log(1, "entering main loop\n");
        if (method=="REGISTER")
                log(1, "REGISTER message received\n");

        if (method=="INVITE")
                log(1, "INVITE message received\n");

        if (method=="ACK")
                log(1, "ACK message received\n");

        if (method=="BYE")
                log(1, "BYE message received\n");

        if (method=="CANCEL")
                log(1, "CANCEL message received\n");

        if (method=="SUBSCRIBE")
                log(1, "SUBSCRIBE message received\n");

        if (method=="NOTIFY")
                log(1, "NOTIFY message received\n");

        if (method=="OPTIONS")
                log(1, "OPTIONS message received\n");

        if (method=="INFO")
                log(1, "INFO message received\n");

        if (method=="MESSAGE")
                log(1, "MESSAGE message received\n");

        if (method=="REFER")
                log(1, "REFER message received\n");

#	lookup("aliases");

	# 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;
	};

#	check changed from 0.8.11 to 0.8.12
#	if (len_gt( max_len )) {
	if (msg:len > max_len) {
		sl_send_reply("513", "Message too big");
		break;
	};

#	if (!uri==myself) {
#		sl_send_reply("404", "not reponsible for host in request-uri");
#		break;
#	};



	# Voicemail specific configuration - begin

	if(method=="ACK" || method=="INVITE" || method=="BYE" || method=="REFER" || 
method=="CANCEL"){
                log(1, "Entering voicemail processing\n");

                log(1, "check if new transaction ... \n");
		if(t_newtran()){
	                log(1, "... yes, new transaction\n");
			t_reply("100","voicemail ser - Trying -- just wait a minute !");
			t_reply("100","voicemail ser - Trying 2 -- just wait a minute !");
			if(method=="INVITE" || method=="REFER"){
					log("**************** vm start - begin ******************\n");
					if( uri =~ "conference" ){
				                log(1, "incoming conference call\n");
						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" ){
				                log(1, "incoming echo call\n");
						if(!vm("/tmp/am_fifo","echo")){
							log("could not contact echo\n");
							t_reply("500","could not contact echo");
						};
					}
					else {
				                log(1, "incoming voicemail call\n");
						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" || method=="CANCEL"){
					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");
		     sl_send_reply("500","could not create new transaction");
		};
	};

		# Voicemail specific configuration - end

	sl_send_reply("501", "method not understood here");
	log(1, "method not understood here\n");

}
3 Sems configuration fail
# $Id: sems.conf.sample,v 1.11.2.1 2004/01/27 15:08:28 rco Exp $
#
# sems.conf.sample
#
# Sip Express Media Server (sems)
#
# sample configuration file
#
#
# whitespaces (spaces and tabs) are ignored
# comments start with a "#" and may be used inline
#
# example: option=value1, value2  # i like this option
#

##################################
# global parameters              #
##################################

# optional parameter: fork={yes|no}
#
# - specifies if sems should run in daemon mode (background)
#   (fork=no is the same as -E)
fork=yes

# optional parameter: stderr={yes|no}
#
# - debug mode: do not fork and log to stderr
#   (stderr=yes is the same as -E)
stderr=no

# optional parameter: loglevel={0|1|2|3}
#
# - sets log level (error=0, warning=1, info=2, debug=3)
#   (same as -D)
loglevel=1

# optional parameter: fifo_name=<filename>
#
# - path and file name of our fifo file (same as -i)
fifo_name=/tmp/am_fifo

# optional parameter: ser_fifo_name=<filename>
#
# - path and file name of Ser's fifo file (same as -o)
ser_fifo_name=/tmp/ser_fifo

# optional parameter: plugin_path=<path>
#
# - sets the path to the plug-ins
# - may be absolute or relative to CWD
plugin_path=/usr/local/lib/sems/plug-in/

# optional parameter: smtp_server=<hostname>
#
# - sets address of smtp server
smtp_server=localhost

# optional parameter: smtp_port=<port>
#
# - sets port of smtp server
smtp_port=25


##################################
# module specific parameters     #
##################################

# sample voicemail configuration (inline)
config.voicemail=inline

# optional parameter: announce_path=<path>
#
# - sets the path where announce files are searched for
# - the file to be played is determined the following way:
#   <announce_path>/<domainname>/<username>.wav
#   if this file is not available <announce_path>/<default_anounce> is used
announce_path=/usr/local/lib/sems/audio/

# parameter: default_announce=<filename>
#
# - sets the name of the default announce WAV file
default_announce=default_en.wav

# parameter: max_record_time=<seconds>
#
# - maximum record time
max_record_time=30

# parameter: accept_delay=<x>
#
# - delays accepting of the call for x seconds
# - default value is 0
accept_delay=20

# end of configuration section
# for voicemail module
config.voicemail=end


# sample announcement configuration (inline)
config.announcement=inline

# optional parameter: announce_path=<path>
#
# - sets the path where announce files are searched for
announce_path=/usr/local/lib/sems/audio/

# parameter: default_announce=<filename>
#
# - sets the name of the default announce WAV file
default_announce=default_en.wav

# end of configuration section for announcement module
config.announcement=end


# sample isdngw module configuration (external file)
# config.isdngw=/etc/isdngw.conf

# sample ivr module configuration (inline)
config.ivr=inline

#parameter: python_script_path=<full path>
python_script_path=/etc/ivr

#parameter: python_script_file=<filename>
python_script_file=example.py

# end of configuration section for ivr module
config.ivr=end


# sample conference configuration (inline)
config.conference=inline

# parameter: default_announce=<filename>
#
# - sets the full pathed name of the default announce WAV file.
#   Will be played to lonely users.
default_announce=/usr/local/lib/sems/audio/first_participant.wav

# end of configuration section for conference module
config.conference=end

# example configuration for number reader
config.number_reader=inline

number_path=/usr/local/lib/sems/audio/

prolog_file=welcome_to_number_reader.wav

epilog_file=thanks_calling_number_reader.wav

# end of number_reader configuration
config.number_reader=end

# add more module configurations here (inline or external):
#
# config.mymodule=<filename>
#  or
# config.mymodule=inline
# ...
# config.mymodule=end

and i got this error into second instance of the ser server
0(19586) **************** vm start - end ******************
0(19586) DEBUG:destroy_avp_list: destroing list (nil)
0(19586) receive_msg: cleaning up
2(19588) ERROR: fifo_server: command t_reply is not available
2(19588) ERROR: fifo_server: command must begin with :: ringing
2(19588) ERROR: fifo_server: command must begin with :: 00004C89728793F0
2(19588) ERROR: fifo_server: command must have at least 3 chars
2(19588) INFO: fifo_server: command empty
2(19588) ERROR: fifo_server: command t_reply is not available
2(19588) ERROR: fifo_server: command must have at least 3 chars
2(19588) ERROR: fifo_server: command must begin with :: 00004C89728793F0
2(19588) ERROR: fifo_server: command must begin with :: Content-Type: 
application/sdp
2(19588) ERROR: fifo_server: command must begin with :: v=0
2(19588) ERROR: fifo_server: command must begin with :: s=session
2(19588) ERROR: fifo_server: command must begin with :: t=0 0
2(19588) ERROR: fifo_server: command must begin with :: a=rtpmap:0 /
2(19588) INFO: fifo_server: command empty
2(19588) ERROR: fifo_server: command t_reply is not available
2(19588) ERROR: fifo_server: command must begin with :: could not send 
response.
2(19588) ERROR: fifo_server: command must begin with :: 00004C89728793F0
2(19588) ERROR: fifo_server: command must have at least 3 chars
2(19588) INFO: fifo_server: command empty

Tnx in advance

_________________________________________________________________
Help STOP SPAM with the new MSN 8 and get 2 months FREE*  
http://join.msn.com/?page=features/junkmail




More information about the sr-users mailing list