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
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@lists.iptel.org http://lists.iptel.org/mailman/listinfo/serusers
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@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@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); }
At 08:41 PM 10/1/2003, 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.
I'm not sure either -- vm has been written for use in a UA which lives separately from proxy server. Since the transaction is already established, calling just vm from failure_route may work. However, I guess it rather won't -- nobody has given it a try or even thought before.
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.
If you learn it, let me know too.
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.
Yes, there is such, if I remember right, it is part of uri module.
-jiri