In the ser admin guide it says
"You can refer to voicemail example config file to know what your configuration file
should include. Note that voicemail uses subsriber database table to determine
recepient's email address. Read the README file in the vm module directory for
complete description of the functions and variables that are used by voicemail and how
they work."
I can't find any complete descriptions of the functions and variables and how they
work. The README file is very short and basic.
In the example config file there are many calls to vm(/tmp/am_fifo", "*");
where * is "announcement" or "voicemail" or "echo" or
"bye" or "conference." Are these all required in a basic voicemail
setup? Can anyone point me to more information on how this works and what each of these
modules are doing?
If I call a user who isn't logged in I can hear the voicemail default greeting, but
then the line goes silent. I don't think there is any voice recording happening. See
ser.cfg attached.
Also, if a timer is set to send calls to vm (using failure_route) after a certain timeout,
is there a way to prevent that timeout from killing calls routed to the PSTN?
Thanks,
G.
---------------------------------
Do you Yahoo!?
The New Yahoo! Shopping - with improved product search
#
# $Id: ser.cfg,v 1.20 2003/05/31 21:12:19 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=8
fork=no
log_stderror=yes
*/
check_via=no # (cmd. line: -v)
dns=no # (cmd. line: -r)
rev_dns=no # (cmd. line: -R)
port=5060
children=4
fifo="/tmp/ser_fifo"
sip_warning=no
#
# ------------------ 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/vm.so"
loadmodule "/usr/local/lib/ser/modules/pa.so"
loadmodule "/usr/local/lib/ser/modules/msilo.so"
loadmodule "/usr/local/lib/ser/modules/acc.so"
loadmodule "/usr/local/lib/ser/modules/textops.so"
#
#loadmodule "/usr/local/lib/ser/modules/nathelper.so"
#loadmodule "/usr/local/lib/ser/modules/uri.so"
#loadmodule "/usr/local/lib/ser/modules/group.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"
#
# ----------------- setting module-specific parameters ---------------
#
# -- 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)
#
# -- 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("acc", "log_level", 1)
modparam("acc", "log_flag", 2)
modparam("acc", "log_missed_flag", 2)
modparam("acc", "log_fmt", "fimos")
#
#modparam("tm", "fr_inv_timer", 35) #INVITE timeout
#modparam("tm", "fr_timer", 30) #negative INVITE replay or no
#final reply for a request for ACK
#
modparam("voicemail", "db_url",
"sql://ser:heslo@localhost/ser")
#
#modparam("acc", "db_url", "sql://ser:heslo@localhost/ser")
#modparam("acc", "db_flag", 2)
#modparam("acc", "db_missed_flag", 2)
#
# ------------------------- request routing logic -------------------
#
# main routing logic
#
alias=10.10.10.49 #sip server IP address
alias=jiffypop #sip server name
alias=mydomain.com #sip domain/realm
alias=jiffypop.mydomain.com #sip server FQDN
#
route{
log(1,"entering main route");
#prevent strangers from claiming to belong to our domain;
#if sender claims to be in our domain in From header field,
#better authenticate him
# code not inserted yet :)
# 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 (len_gt( max_len )) {
sl_send_reply("513", "Message too big");
break;
};
# we record-route all messages -- to make sure that
# subsequent messages will go through our proxy; that's
# particularly good if upstream and downstream entities
# use different transport protocol
record_route();
# loose-route processing
if (loose_route()) {
t_relay();
break;
};
setflag(2); #set flag for accounting
# 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") {
# digest authentication
log(1,"request for registration");
if (!www_authorize("mydomain.com", "subscriber")) {
www_challenge("mydomain.com", "0");
break;
};
save("location");
break;
};
/* ********** Dial out to PSTN logic ************* */
#forward numerical 7 digit requests to gateway
if(uri=~"^sip:[0-9]{7}@(mydomain\.com|10\.10\.10\.49)"){
# append_hf("Remote-Party-ID:<sip:6508466600@mydomain.com>;party=calling;id-type=subscriber;privacy=off;screen=no;\r\n");
rewritehostport("10.10.10.5:5060");
log(1,"7 digit expression match");
route(2);
break;
};
# strip 650 and forward to GW is user dials 650 before phone no.
if(uri=~"^sip:650[0-9]{7}@(mydomain\.com|10\.10\.10\.49)"){
strip(3);
rewritehostport("10.10.10.5:5060");
log(1,"650 area code dialed, 650 stripped");
route(2);
break;
};
#forward numerical 10 digit requests to gateway, append a 1 first
if(uri=~"^sip:[0-9]{10}@(mydomain\.com|10\.10\.10\.49)"){
prefix("1");
rewritehostport("10.10.10.5:5060");
log(1,"10 digit expression match, prefix 1");
route(2);
break;
};
#forward numerical 11 digit requests that start with a 1 to GW
if(uri=~"^sip:1[0-9]{10}@(mydomain\.com|10\.10\.10\.49)"){
rewritehostport("10.10.10.5:5060");
log(1,"10 digit exp match w/leading 1");
route(2);
break;
};
#forward international N digit requests to gateway
if(uri=~"^sip:011[0-9]+@(mydomain\.com|10\.10\.10\.49)"){
rewritehostport("10.10.10.5:5060");
log(1,"international expression match");
route(2);
break;
};
/* ********** VOICEMAIL logic ************* */
if (uri=~"^sip:voicemail\+@"){
t_newtran();
t_reply("100", "Trying -- just a second");
if(!vm("/tmp/am_fifo","announcement")){
t_reply("500", "SEMS error");
};
log(1,"sip:voicemail uri match");
break;
};
/* ****** Find Aliases and Locations of users ********* */
# It is very important to lookup "aliases" before looking up
"locations"
if(!lookup("aliases")){
log(1,"Couldn't find any matching alias");
sl_send_reply("404", "User does not exist");
break;
};
if(!lookup("location")) {
log(1,"unable to locate user");
route(3);
break;
};
};
# forward to current uri now; use stateful forwarding; that
# works reliably even if we forward from TCP to UDP
t_on_failure("1");
if (!t_relay()) {
sl_reply_error();
};
log(1,"eof");
}
route[2]{
log(1,"route[2]:SIP-to-PSTN call routed");
if(!t_relay()){
sl_reply_error();
};
}
route[3]{
log(1,"route[3]: voicemail processing");
if(method=="INVITE" || method=="ACK"){
log(1,"1st if entered in route[3] *vm*");
t_newtran();
t_reply("100","Trying -- just a second");
if(!vm("/tmp/am_fifo","voicemail")){ # "announcement" was
replaced with "voicemail"
log(1,"vm module called and failed");
t_reply("500", "SEMS error");
};
break;
};
log(1,"end of route[3], 1st if check not entered");
}
failure_route[1]{
log(1,"failure_route[1]:jump to vm processing");
route(3);
# break;
}