I've found that the whole system works better when you don't use
failure_route() to do "time out" style voicemail.
I have a test setup where I just add a call to Asterisk immediately if
the user is registered (has location entry) with a special prefix that
gets matched in the * extensions.conf file, and causes * to simply wait
for X seconds before answering. If the calee phone(s) is answered, SER
cancels the call to * and any other phones registered to the user. If
no phones are answered, * answers and sends the call to voicemail.
For whatever reason, this approach seems more stable so far, and seems
more compatible with more phones, etc, than the failure_route approach.
For instance, if you have a locations entry that points a user to
another user, or more than one user (e.g. mainline(a)domain.com ->
receptionist(a)domain.com -> receptionist@<phone-IP:port>), SER seems to
get confused and sends a CANCEL to the voicemail system you've just
triggered the INVITE to in your failure_route. When doing it the other
way, it doesn't seem to have this problem.
As for mapping user names to numeric extensions in Asterisk, I wrote an
AGI script which does this by reverse-mapping the username to aliases in
the SER script. It requires that your users have numerical extensions
assigned in the SER aliases database (e.g. 1234 -> joe(a)domain.com). If
there are multiple #s mapped to the user, it just returns the lowest
one. Not sure if I can give this out though, since I wrote it for a client.
- Jim
Alan Crosswell wrote:
I'm trying to do failure route to voicemail (which
is working) but
this error is logged:
ERROR: t_should_relay: status rewrite by UAS: stored: 408, received: 487
I googled this and see that this came up last in October
(
http://lists.iptel.org/pipermail/serusers/2003-October/002921.html)
but I don't see any evidence of a solution in the thread.
I suspect mine is the same problem as I have two UAs registered so the
initial dset is two places and then the append_branch on timeout is
just the voicemail uri.
BTW, I am doing this with asterisk for the usual DTMF access reasons
(altough I haven't yet figured out how to map sip:alan@columbia.edu to
DTMF. Maybe I'll have to give up and do numeric mailboxes:-(
I am rewriting with a prefix of "vm*u" before punting over to asterisk
which has
exten => _vm*u.,1,Wait,1
exten => _vm*u.,2,Voicemail(${EXTEN:3})
exten => _vm*u.,3,Goto(#,1)
Any pointers would be appreciated. My not-yet-complete ser.cfg is
attached (not yet punting voicemail for unregistered subscribers; just
registered subscribers who time out the invite).
/a
------------------------------------------------------------------------
#
# $Id: ser.cfg,v 1.21.2.1 2003/07/30 16:46:18 andrei Exp $
#
# simple quick-start config script
#
# ----------- global configuration parameters ------------------------
debug=2 # debug level (cmd line: -dddddddddd)
fork=yes
log_stderror=no # (cmd line: -E)
#listen=128.59.39.127
check_via=yes # (cmd. line: -v)
dns=no # (cmd. line: -r)
rev_dns=no # (cmd. line: -R)
port=5060
children=4
fifo="/tmp/ser_fifo"
alias="columbia.edu"
# ------------------ module loading ----------------------------------
# Uncomment this if you want to use SQL database
loadmodule "/usr/lib/ser/modules/mysql.so"
loadmodule "/usr/lib/ser/modules/acc.so"
loadmodule "/usr/lib/ser/modules/sl.so"
loadmodule "/usr/lib/ser/modules/tm.so"
loadmodule "/usr/lib/ser/modules/rr.so"
loadmodule "/usr/lib/ser/modules/maxfwd.so"
loadmodule "/usr/lib/ser/modules/usrloc.so"
loadmodule "/usr/lib/ser/modules/registrar.so"
# Uncomment this if you want digest authentication
# mysql.so must be loaded !
loadmodule "/usr/lib/ser/modules/auth.so"
loadmodule "/usr/lib/ser/modules/auth_db.so"
loadmodule "/usr/lib/ser/modules/exec.so"
# ----------------- setting module-specific parameters ---------------
# -- transaction timers --
modparam("tm", "fr_inv_timer", 15 )
modparam("tm", "fr_timer", 10 )
# -- usrloc params --
#
modparam("usrloc", "db_mode", 2)
modparam("usrloc", "timer_interval", 10)
# -- auth params --
modparam("auth_db", "calculate_ha1", yes)
modparam("auth_db", "password_column", "password")
# -- rr params --
# add value to ;lr param to make some broken UAs happy
modparam("rr", "enable_full_lr", 1)
# -- acc params --
modparam("acc", "log_level", 1)
modparam("acc", "log_flag", 1 )
modparam("acc", "log_missed_flag", 2)
# ------------------------- request routing logic -------------------
# main routing logic
route{
/* ********* ROUTINE CHECKS ********************************** */
# 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 ) {
sl_send_reply("513", "Message too big");
break;
};
lookup("aliases");
# 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);
# 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=~"^sip:(.+@)?columbia.edu") {
if (method=="REGISTER") {
log(1, "REGISTER received\n");
if (!www_authorize("columbia.edu", "subscriber")) {
www_challenge("columbia.edu", "0");
break;
};
save("location");
break;
};
/* ********** Dial out to PSTN logic ************* */
# 5 Digit dialing, interior calls
if (uri=~"^sip:[1347][0-9]{4}@columbia\.edu") {
rewritehostport("128.59.59.242:5060");
log(1,"5 digit expression match");
route(2);
break;
};
# 10 Digit dialing with outlide line
if (uri=~"^sip:931[0-9]{10}@columbia\.edu") {
if(!(src_ip=="128.59.59.242")
& !(proxy_authorize("columbia.edu","subscriber"))) {
proxy_challenge("columbia.edu", "1");
break;
} else {
rewritehostport("128.59.59.242:5060");
log(1," 93 Outside line with 10 digit expression
match");
route(2);
break;
};
};
/* voicemail access */
if (uri=~"^sip:\*86@columbia\.edu"
|uri=~"^sip:vm@columbia\.edu"
|uri=~"^sip:voicemail@columbia\.edu") {
route(3);
break;
};
# native SIP destinations are handled using our USRLOC DB
if (!lookup("location")) {
if (!exec_dset("/etc/ser/sipldap")) {
sl_send_reply("404", "Not Found");
break;
} else {
log(1," sipldap call");
};
}; #!lookup
};
if (method == "INVITE") {
t_on_failure("1");
};
# 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();
};
}
route[2] {
log(1,"route[2]:SIP-to-PSTN call routed");
if (!t_relay()) {
sl_reply_error();
};
}
# ---- voicemail user access ----
route[3] {
rewritehostport("127.0.0.1:5069");
log(1,"voicemail access");
if (!t_relay()) {
sl_reply_error();
};
}
# ------------- handling of unregistered user ------------------
route[4] {
log(1,"route[4]: user not registered");
# non-Voip -- just send "off-line"
if (!(method == "INVITE" || method == "ACK" || method ==
"CANCEL")) {
sl_send_reply("404", "Not Found");
break;
};
# not voicemail subscriber
# if (!isflagset(4)) {
# sl_send_reply("404", "Not Found and no voicemail turned
on");
# break;
# };
# forward to voicemail now
prefix("vm*u");
rewritehostport("127.0.0.1:5069");
t_relay_to_udp("127.0.0.1", "5069");
}
failure_route[1] {
# transfer to asterisk voicemail with uMAILBOX for unavailable.
# sip:USER@columbia.edu -> sip:vm*uUSER@127.0.0.1:5069
t_on_failure("2");
prefix("vm*u");
rewritehostport("127.0.0.1:5069");
append_branch();
log(1,"redirection to voicemail\n");
t_relay();
}
failure_route[2] {
# forwarding failed (voicemail down?)
log(1,"voicemail failed\n");
t_reply("500","Weasels have eaten voicemail again");
}
------------------------------------------------------------------------
_______________________________________________
Serusers mailing list
serusers(a)lists.iptel.org
http://lists.iptel.org/mailman/listinfo/serusers
--
+---------------------------------------------------------------------------+
| Jim Burwell - Sr. Systems/Network/Security Engineer, JSBC |
+---------------------------------------------------------------------------+
| "I never let my schooling get in the way of my education." - Mark Twain |
| "UNIX was never designed to keep people from doing stupid things, because |
| that policy would also keep them from doing clever things." - Doug Gwyn |
| "Cool is only three letters away from Fool" - Mike Muir, Suicyco |
| "..Government in its best state is but a necessary evil; in its worst |
| state an intolerable one.." - Thomas Paine, "Common Sense" (1776)
|
+---------------------------------------------------------------------------+
| Email: jimb(a)jsbc.cc ICQ UIN: 1695089 |
+---------------------------------------------------------------------------+
| Reply problems ? Turn off the "sign" function in email prog. Blame MS. |
+---------------------------------------------------------------------------+