1. Please don't copy specific people on posts
2. serusers is very useful for answering specific questions, but then you need to provide enough info for people to be able to respond. Most people don't have time to do generic quality assurance of somebody's complete configs.
g-)

Meidiana Ten wrote:
Hi,
Like u told me before, I've tried to install and configure SEMS into my SER server to setup the voicemail feature.
I add some configuration file into ser.cfg and configure the sems.conf.
But when I try to run SER, I got some error. Please review my ser.cfg and sems.conf file below:

ser.cfg:

debug=9
fork=yes
log_stderror=yes

listen=202.95.149.2       # put your server IP address here
port=5060
children=4

dns=no
rev_dns=no

fifo="/tmp/ser_fifo"
fifo_db_url="mysql://ser:heslo@localhost/ser"
fifo_mode=0666

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/auth.so"
loadmodule "/usr/local/lib/ser/modules/auth_db.so"
loadmodule "/usr/local/lib/ser/modules/nathelper.so"
loadmodule "/usr/local/lib/ser/modules/textops.so"
loadmodule "/usr/local/lib/ser/modules/uri_db.so"
loadmodule "/usr/local/lib/ser/modules/uri.so"
loadmodule "/usr/local/lib/ser/modules/avpops.so"
loadmodule "/usr/local/lib/ser/modules/domain.so"
loadmodule "/usr/local/lib/ser/modules/permissions.so"
loadmodule "/usr/local/lib/ser/modules/msilo.so"

modparam("auth_db|permissions|uri_db|usrloc","db_url", "mysql://ser:heslo@localhost/ser")
modparam("auth_db|uri_db|usrloc", "db_url", "mysql://ser:heslo@localhost/ser")
modparam("auth_db", "calculate_ha1", 1)
modparam("auth_db", "password_column", "password")

modparam("nathelper", "natping_interval", 30)
modparam("nathelper", "ping_nated_only", 1)
modparam("nathelper", "rtpproxy_sock", "/var/run/rtpproxy.sock")

modparam("usrloc", "db_mode", 2)

modparam("registrar", "nat_flag", 6)

modparam("rr", "enable_full_lr", 1)

modparam("tm", "fr_inv_timer", 27)
modparam("tm", "fr_inv_timer_avp", "inv_timeout")

modparam("permissions", "db_mode", 1)
modparam("permissions", "trusted_table", "trusted")

modparam("tm", "fr_timer", 10 )
modparam("tm", "fr_inv_timer", 15 )
modparam("tm", "wt_timer", 10 )
# configure tm to append this when tw_appent voicemail_headers is used
#modparam("tm", "tw_append", "voicemail_headers:hdr[User-Agent];P-Email-Address=avp[$email]")
#modparam("tm", "pass_provisional_replies", 1)

modparam("msilo", "db_url", "mysql://ser:heslo@localhost/ser")
modparam("msilo", "db_table", "silo")
modparam("msilo","registrar","sip:registrar@pcr.ac.id")
modparam("msilo","expire_time",259200)
modparam("msilo","check_time",30)
modparam("msilo","clean_period",5)

modparam( "avpops", "avp_aliases", "email=i:67" )

alias="pcr.ac.id"
route {
        # -----------------------------------------------------------------
        # Sanity Check Section
        # -----------------------------------------------------------------

        if (!mf_process_maxfwd_header("10")) {
                sl_send_reply("483", "Too Many Hops");
                break;
        };

        if (msg:len > max_len) {
                sl_send_reply("513", "Message Overflow");
                break;
        };

        # -----------------------------------------------------------------
        # Record Route Section
        # -----------------------------------------------------------------

        if (method!="REGISTER") {
                record_route();
        };

        if (method=="BYE" || method=="CANCEL") {
                unforce_rtp_proxy();
        }

        # -----------------------------------------------------------------
        # Loose Route Section
        # -----------------------------------------------------------------

        if (loose_route()) {
                if (has_totag() && (method=="INVITE" || method=="ACK")) {
                        if (nat_uac_test("19")) {
                                setflag(6);
                                force_rport();
                                fix_nated_contact();
                        };
                    force_rtp_proxy("l");
                };
                route(1);
                break;
        };
      #------------------------------------------------------------------
      # make transaction
      #-----------------------------------------------------------------
      if (!t_newtran()){
            log("could not create transaction\n");
            sl_send_reply("500","could not create transaction");
            break;
      }

      # actively absorb ACKs
      if (method == "ACK") {
            t_relay();
            break;
      }
     
      # pass INFO to SEMS
      if (method=="INFO") {
            if(!t_write_unix("/tmp/sems_sock","sems/info_append")){
                        log("could not contact sems\n");
                        t_reply("500","could not contact media server");
            }
      }

      if (uri =~ "sip:101.*@") {
            if (!t_write_unix("/tmp/sems_sock","myapp")){
                  log("could not contact media server\n");
                  t_reply("500","could not contact media server");     
                  break;
            }
            break;
      }

      if (uri =~ "sip:102.*@") {
            if (!t_write_unix("/tmp/sems_sock","myconfigurableapp")){
                  log("could not contact media server\n");
                  t_reply("500","could not contact media server");     
                  break;
            }
            break;
      }

      if (uri =~ "sip:103.*@") {
            if (!t_write_unix("/tmp/sems_sock","myannounceapp")){
                  log("could not contact media server\n");
                  t_reply("500","could not contact media server");     
                  break;
            }
            break;
      }

      if (uri =~ "sip:104.*@") {
            if (!t_write_unix("/tmp/sems_sock","myjukebox")){
                  log("could not contact media server\n");
                  t_reply("500","could not contact media server");     
                  break;
            }
            break;
      }

      if (uri =~ "sip:105.*@") {
            if (!t_write_unix("/tmp/sems_sock","mycc")){
                  log("could not contact media server\n");
                  t_reply("500","could not contact media server");     
                  break;
            }
            break;
      }

      if (uri =~ "sip:106.*@") {
            if (!t_write_unix("/tmp/sems_sock","ivr_announce")){
                  log("could not contact media server\n");
                  t_reply("500","could not contact media server");     
                  break;
            }
            break;
      }

      # default sems apps
      if (uri =~ "sip:110.*@") {
            if (!t_write_unix("/tmp/sems_sock","echo")){
                  log("could not contact echo\n");
                  t_reply("500","could not contact media server");     
                  break;
            }
            break;
      }

      if (uri =~ "sip:111.*@") {
            if (!t_write_unix("/tmp/sems_sock","announcement")){
                  log("could not contact announcement\n");
                  t_reply("500","could not contact media server");     
                  break;
            }
            break;
      }

      if (uri =~ "sip:112.*@") {
            if (!t_write_unix("/tmp/sems_sock","conference")){
                  log("could not contact conference\n");
                  t_reply("500","could not contact media server");     
                  break;
            }
            break;
      }

      if (uri =~ "sip:113.*@") {
            if (!t_write_unix("/tmp/sems_sock","mailbox")){
                  log("could not contact mailbox\n");
                  t_reply("500","could not contact media server");     
                  break;
            }
            break;
      }

      if (uri =~ "sip:114.*@") {
            if (!t_write_unix("/tmp/sems_sock","early_announce")){
                  log("could not contact early_announce\n");
                  t_reply("500","could not contact media server");     
                  break;
            }
            break;
      }

      if (uri =~ "sip:115.*@") {
            # load email avp with some email address
            avp_write("root@localhost","$email");
            # use voicemail_headers append to pass it to sems
            if (!t_write_unix("/tmp/sems_sock","voicemail/voicemail_headers")){
                  log("could not contact voicemail\n");
                  t_reply("500","could not contact media server");     
                  break;
            }
            break;
      }

      t_reply("404","Not found");

        # -----------------------------------------------------------------
        # Offline Message Store Section
        # -----------------------------------------------------------------
      if (is_from_local()) {  
            if (method=="REGISTER") {
            save("location");
            log("REGISTER received -> dumping messages with MSILO\n");

            # MSILO - dumping user's offline messages
            if (m_dump())
            {
                log("MSILO: offline messages dumped - if they were\n");
            }else{
                log("MSILO: no offline messages dumped\n");
            };
            break;
        };

        # domestic SIP destinations are handled using our USRLOC DB

        if(!lookup("location"))
        {
            if (! t_newtran())
               {
                sl_reply_error();
                break;
               };
            # we do not care about anything else but MESSAGEs
            if (!method=="MESSAGE")
            {
                if (!t_reply("404", "Not found"))
                {
                    sl_reply_error();
                };
                break;
            };
            log("MESSAGE received -> storing using MSILO\n");
            # MSILO - storing as offline message
            if (m_store("0"))
            {
                log("MSILO: offline message stored\n");
                if (!t_reply("202", "Accepted"))
                {
                    sl_reply_error();
                };
            }else{
                log("MSILO: offline message NOT stored\n");
                if (!t_reply("503", "Service Unavailable"))
                {
                    sl_reply_error();
                };
            };
            break;
        };
        # if the downstream UA does not support MESSAGE requests
        # go to failure_route[1]
        t_on_failure("1");
        t_relay();
        break;
    };
      # forward to current uri now; use stateful forwarding that
        # works reliably even if we forward from TCP to UDP
        if (!t_relay()) {
                sl_reply_error();
        };

       # -----------------------------------------------------------------
        # Call Type Processing Section
        # -----------------------------------------------------------------

        if (uri!=myself) {
                        route(5);
                        route(1);
                        break;
        };

        if (uri==myself) {
                if (method=="ACK") {
                        route(6);
                        break;
                } else if (method=="CANCEL") {
                        route(3);
                        break;
                } else if (method=="INVITE") {
                        route(3);
                        break;
                } else  if (method=="REGISTER") {
                        route(2);
                        break;
                };
                lookup("aliases");
                if (uri!=myself) {
                        route(5);
                        route(1);
                        break;
                };

                if (!lookup("location")) {
                        sl_send_reply("404", "User Not Found");
                        break;
                };
        };
        route(1);
}

failure_route[1] {
    # forwarding failed -- check if the request was a MESSAGE
    if (!method=="MESSAGE")
    {
        break;
    };

    log(1,"MSILO:the downstream UA doesn't support MESSAGEs\n");
    # we have changed the R-URI with the contact address, ignore it now
    if (m_store("1"))
    {
        log("MSILO: offline message stored\n");
        t_reply("202", "Accepted");
    }else{
        log("MSILO: offline message NOT stored\n");
        t_reply("503", "Service Unavailable");
    };
}

route[1] {

        # -----------------------------------------------------------------
        # Default Message Handler
        # -----------------------------------------------------------------

        t_on_reply("1");
        if (!t_relay()) {
                if (method=="INVITE" && isflagset(6)) {
                  unforce_rtp_proxy();
                };
                sl_reply_error();
        };
}

route[2] {

        # -----------------------------------------------------------------
        # REGISTER Message Handler
        # ----------------------------------------------------------------

        if (!search("^Contact:\ +\*") && nat_uac_test("19")) {
                setflag(6);
                fix_nated_register();
                force_rport();
        };
        sl_send_reply("100", "Trying");

        if (!www_authorize("pcr.ac.id","subscriber")) {
                www_challenge("pcr.ac.id","0");
                break;
        };

        if (!check_to()) {
                sl_send_reply("401", "Unauthorized");
                break;
        };
        consume_credentials();
        if (!save("location")) {
                sl_reply_error();
        };
}

route[3] {

        # -----------------------------------------------------------------
        # CANCEL and INVITE Message Handler
        # -----------------------------------------------------------------

        if (!allow_trusted() && nat_uac_test("19")) {
                 setflag(6);
        }
        lookup("aliases");
        if (method=="INVITE" && !allow_trusted())
        {
                if (!proxy_authorize("pcr.ac.id","subscriber")) {
                        proxy_challenge("pcr.ac.id","0");
                        break;
                } else if (!check_from()) {
                        sl_send_reply("403", "Use From=ID");
                        break;
                };
                consume_credentials();
        };

        if (uri=~"^sip:9[0-9]*@") {
                route(4);
                break;
        };

        if (uri!=myself) {
                route(5);
                route(1);
                break;
        };

        if (!lookup("location")) {
                if (uri=~"^sip:[0-9]{10}@") {
                route(4);
                break;
                };
                sl_send_reply("404", "User Not Found");
                break;
        };

        if (isflagset(6)) {
                force_rport();
                fix_nated_contact();
                force_rtp_proxy();
        };
        t_on_reply("1");

        if (!t_relay()) {
                if(isflagset(6)) {
                        unforce_rtp_proxy();
                }
                sl_reply_error();
        };
}

route[4] {

 # -----------------------------------------------------------------
 # PSTN Handler
 # -----------------------------------------------------------------

 rewritehostport("202.95.149.2:5060"); # INSERT YOUR PSTN GATEWAY IP ADDRESS
 avp_write("i:45", "inv_timeout");

 if (isflagset(6)) {
                force_rport();
                fix_nated_contact();
                force_rtp_proxy();
                };
 route(1);
 }

onreply_route[1] {
        if (isflagset(6) && status=~"(180)|(183)|2[0-9][0-9]") {
                if (!search("^Content-Length:\ +0")) {
                        force_rtp_proxy();
                };
        };

        if (nat_uac_test("1")) {
                fix_nated_contact();
        };
}
-------------------------------------------------------------------------------------------------------------------
sems.conf:
# 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: ser_fifo_name=<filename>
#
# - path and file name of Ser's fifo file (same as -o)
ser_fifo_name=/tmp/ser_fifo

# optional parameter: socket_name=<filename>
#
# - path and file name of our unix socket
socket_name=/tmp/am_sock

# optional parameter: ser_socket_name=<filename>
#
# - path and file name of Ser's unix socket
ser_socket_name=/tmp/ser_sock

# optional parameter: send_method=<filename>
#
# - sets which method will be used to contact Ser:
#   FIFO or unix socket server.
# - values: fifo (default), unix_socket
#
# - PLEASE NOTE THAT: if you use 'fifo', make sure that
#   fifo_name and ser_fifo_name have been set. if you use 'unix_socket',
#   make sure that socket_name and ser_socket_name have been set.
#
send_method=fifo

# optional parameter: user_prefix_separator
#  if set, sems will reply with a Contact header in the form
#   Contact: <plugin-name><user_prefix_separator><user>
#  needed if a single ser instance is used with sems.
#
# user_prefix_separator=+

# 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/
plugin_path=lib

# 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

# optional parameter: rtp_low_port=<port>
#
# - sets port of rtp lowest server
#rtp_low_port=1024

# optional parameter: rtp_high_port=<port>
#
# - sets port of rtp highest server
#rtp_high_port=65535

##################################
# 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/
announce_path=wav

# 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: email_template=<filename>
#
# - email template file
#
# See the README file in <sems-src>/plug-in/voicemail
# for more information on the syntax used.
#
#email_template=/usr/local/lib/sems/plug-in/mail.template
email_template=plug-in/voicemail/default.template.sample

# 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/
announce_path=wav

# 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
default_announce=wav/first_participant.wav

# parameter: join_sound=<filename>
#
# - sets the full pathed name of a WAV file
#   which will be played to conference users
#   when a new user joins the conference.
#join_sound=/usr/local/lib/sems/audio/beep.wav
join_sound=wav/beep.wav

# parameter: drop_sound=<filename>
#
# - sets the full pathed name of a WAV file
#   which will be played to conference users
#   when a user drops the conference.
#drop_sound=/usr/local/lib/sems/audio/beep.wav
drop_sound=wav/beep.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/
number_path=wav

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
-------------------------------------------------------------------------------------------------------------------
In addition, I'm using SER 0.9.7.
Please tell me what's wrong.
Thanx

Regards,
Meidiana


Access over 1 million songs - Yahoo! Music Unlimited.

_______________________________________________ Serusers mailing list Serusers@lists.iptel.org http://lists.iptel.org/mailman/listinfo/serusers