Jan,
Here is my config file. And two varieties of errors from my logs. The first is when I try
to send a call to voicemail that already has a transaction.
The second is when I try to create a new transaction when one already exists.
Log sample 1: for this error, I just tried to route a busy call to voicemail The included
config file created this error. (route[4] is called from failure_route[1])
Oct 1 16:50:59 jiffypop /usr/local/sbin/ser[27448]: failure_route[1]:jump to route[3]:vm
Oct 1 16:50:59 jiffypop /usr/local/sbin/ser[27448]: submit_query(): You have an error in
your SQL syntax
. Check the manual that corresponds to your MySQL server version for the right syntax to
use near ''' at
line 1
Oct 1 16:50:59 jiffypop /usr/local/sbin/ser[27448]: submit_query(): Error while
submitting query
Oct 1 16:50:59 jiffypop /usr/local/sbin/ser[27448]: ERROR: vm: db_query() failed.
Oct 1 16:50:59 jiffypop /usr/local/sbin/ser[27448]: ERROR: vm: vm_get_user_info failed
Oct 1 16:50:59 jiffypop /usr/local/sbin/ser[27448]: route[3]:vm:voicemail failed
Log sample 2: for this error, I tried to create a new transaction when a call failed with
a busy status. The included config file didn't generate this error. However if I had
called route(3) from failure_route[1] this is what would happen.
Sep 25 14:07:56 jiffypop /usr/local/sbin/ser[23164]: ERROR: t_newtran: transaction already
in process 0x422c0b38
See also my comments in the config file for further explanation on the question of needing
to be able to lookup subscribers.
Thanks,
G.
Jan Janak <jan(a)iptel.org> wrote:
Could you recap for me what the problem is (or send me your config file)
? I tried to find it in the archive but I am quite confused.
Jan.
On 01-10 11:41, Gavin Bensom wrote:
Jiri wrote:
There is other problem though -- the failure_route logic for VM should
be different from that in route block -- you can't create transaction state two
times (first time with t_relay, second time with t_newtran). SER will
certainly complain with some error message in your logs.
-----------------------
Can anyone tell me how to set up vm to work on a failure route. I've tried several
times and although Jiri says the logic has to be different because you can't create a
transaction two times, I can't figure out how to make it work, and I haven't found
any documentation detailing this issue. I have seen the errors in the logs that verify
what Jiri is saying.
Jiri said that he'd introduce new commands to hide tansaction functionality from
script writers, but I'd like to know how to make this work without those new
commands.
Also, is there a command that queries whether or not a sip message is for a user in the
subscriber table? I need to know if the user exists regardless of whether or not
lookup("location") = true.
Thanks,
G
---------------------------------
Do you Yahoo!?
The New Yahoo! Shopping - with improved product search
_______________________________________________
Serusers mailing list
serusers(a)lists.iptel.org
http://lists.iptel.org/mailman/listinfo/serusers
---------------------------------
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 $
#
# config script with voicemail, PSTN dial-out functionality
#
# ----------- global configuration parameters ------------------------
debug=1 # 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("acc", "db_url", "sql://ser:heslo@localhost/ser")
modparam("acc", "db_flag", 2)
modparam("acc", "db_missed_flag", 2)
#
#modparam("tm", "fr_inv_timer", 50) #INVITE timeout
#modparam("tm", "fr_timer", 35) #negative INVITE reply or no
#final reply for a request for ACK
#
modparam("voicemail", "db_url",
"sql://ser:heslo@localhost/ser")
#
# ------------------------- request routing logic -------------------
#
# main routing logic
#
alias=10.10.10.49 #sip server IP address
alias=serserver #sip server name
alias=mydomain.com #sip domain/realm
alias=serserver.mydomain.com #sip server FQDN
#
route{
# log(1,"entering main route");
setflag(2); #set flag for accounting
# 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;
};
# 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 411[information] and 911[emergency] requests to gateway
if(uri=~"^sip:(4|9)11@(mydomain\.com|10\.10\.10\.49)"){
log(1,"411/911 expression match");
route(2);
break;
};
#forward numerical 7 digit requests to gateway
if(uri=~"^sip:[0-9]{7}@(mydomain\.com|10\.10\.10\.49)"){
log(1,"7 digit expression match");
route(2);
break;
};
# strip 650 and forward to GW if user dials 650 before phone no.
if(uri=~"^sip:650[0-9]{7}@(mydomain\.com|10\.10\.10\.49)"){
strip(3);
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");
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)"){
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)"){
log(1,"international expression match");
route(2);
break;
};
/* ********** VOICEMAIL logic ************* */
if (uri=~"^sip:voicemail\+@"){
log(1,"sip:voicemail uri match");
route(3);
break;
};
/* ****** Find Aliases and Locations of users ********* */
#lookup "aliases" before looking up "location"
lookup("aliases");
# native SIP destinations are handled using our USRLOC DB
if (!lookup("location")) {
route(3);
break;
# this section needs help. I need to differentiate between users that
# exits buy aren't online (send these requests to voicemail)
# requests for users that aren't in my subscriber database
# (send these requests a 404 reply)
sl_send_reply("404", "User Not Found");
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,"route[]:eof");
}
route[2]{
log(1,"route[2]:SIP-to-PSTN call routed");
rewritehostport("10.10.10.5:5060");
if(!t_relay()){
sl_reply_error();
};
}
route[3]{
log(1,"route[3]:vm:1");
if (method=="INVITE" || method=="BYE" || method=="REFER"){
log(1,"route[3]:vm:2");
if(t_newtran()){
t_reply("100","Trying -- just a second");
if(method=="INVITE" || method=="REFER"){
log(1,"route[3]:method==INVITE || REFER");
if(uri =~ "conference" ){
if(!vm("/tmp/am_fifo","conference")){
log(1,"route[3]:vm:conference failed");
t_reply("500","could not contact conference server");
};
}
else if (uri =~"echo"){
if(!vm("/tmp/am_fifo","echo")){
log(1,"route[3]:vm:echo failed");
t_reply("500","could not contact echo");
};
}
else{
if(!vm("/tmp/am_fifo","voicemail")){
log(1,"route[3]:vm:voicemail failed");
t_reply("500", "voicemail error");
};
};
break;
};
if(method=="BYE"){
log(1,"route[3]:vm:method==BYE");
if(!vm("/tmp/am_fifo","bye")){
log(1,"route[3]:vm:bye failed");
t_reply("500" , "could not contact the media server");
};
break;
};
}
else{
log(1,"route[3]:vm:new transaction failed");
sl_send_reply("500", "new transaction failed");
break;
};
};
}
route[4]{
# this should be voicemail logic that is specific to a failure_route
# i.e. line busy, or timeout after a certain period with no answer
if(method=="INVITE" || method=="REFER"){
if(!vm("/tmp/am_fifo","voicemail")){
log(1,"route[3]:vm:voicemail failed");
t_reply("500", "voicemail error");
};
}else if(method=="BYE"){
log(1,"route[3]:vm:method==BYE");
if(!vm("/tmp/am_fifo","bye")){
log(1,"route[3]:vm:bye failed");
t_reply("500" , "could not contact the media server");
};
};
}
failure_route[1]{
log(1,"failure_route[1]:jump to route[3]:vm");
# append_branch("sip:info@mydomain.com");
route(4);
}