# 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