[Serusers] VoiceMail problem

Veselin Iordanov viordanov at hotmail.com
Tue Aug 24 21:09:23 CEST 2004


I found some example configuration someware here i the mailing lisy but throw some strange error .. 
here is the configuration files 
1. Conf file for the 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. Configuration for the second instance of the ser server (for voice mail (
#
# $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=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. Configuration for sems server 
# $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

Error is in 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
 1(19587) DEBUG: timer routine:0,tl=0x402ecf9c next=(nil)
 1(19587) DEBUG: FR_handler:stop retr. and send CANCEL (0x402ece60)
 1(19587) ->>>>>>>>> T_code=100, new_code=408

actualy i think that i miss some modiule to load but i am not sure and dont have any fogest idea what to do .. 

10x in advance 
Ps:
sry about my bad english 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sip-router.org/pipermail/sr-users/attachments/20040824/f91e61dc/attachment.htm>


More information about the sr-users mailing list