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.