Greetings everyone,
I'm trying to use the cpl-c module in ser 0.8.12. I uploaded through CPLEd a small script that would redirect to user1 the calls destined to user3. Calls between users that don´t have a CPL script associated are established. But if a call is destined to user3, when the cpl_run_script function is called, I get the following errors from the logs:
ERROR: t_reply: cannot send a t_reply to a message for which no T-state has been established ERROR:cpl_invoke_script: unable to send 100 reply!
My configuration file is:
# # $Id: ser.cfg,v 1.21.4.1 2003/11/10 15:35:15 andrei 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) port=5060 children=4 fifo="/tmp/ser_fifo" fifo_mode=0666 #permite acesso ao fifo
# ------------------ 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/cpl-c.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"
# 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")
# -- rr params -- # add value to ;lr param to make some broken UAs happy modparam("rr", "enable_full_lr", 1)
# -- cpl-c module -- modparam("cpl-c","cpl_db","mysql://ser:heslo@localhost/ser") modparam("cpl-c","cpl_table","cpl") modparam("cpl-c","cpl_dtd_file","/usr/local/etc/ser/cpl-06.dtd") modparam("cpl-c","log_dir","/var/log/ser/cpl") modparam("cpl-c","proxy_recurse",0)
# ------------------------- request routing logic -------------------
# main routing logic
route{ # 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; };
# 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; }; lookup("aliases"); setflag(1);
# 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=~"klingon.av.it.pt") {
if (method=="REGISTER") {
# Uncomment this if you want to use digest authentication if(!cpl_process_register()) { break; }; if (!www_authorize("klingon.av.it.pt", "subscriber")) { www_challenge("klingon.av.it.pt", "0"); break; };
save("location"); break;
};
if(method=="INVITE") { log(1,"Invite \n"); cpl_run_script("incoming"); cpl_run_script("outgoing"); };
# native SIP destinations are handled using our USRLOC DB if (!lookup("location")) { sl_send_reply("404", "Not Found"); break; }; }; # 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(); };
}
If I use t_newtran prior to cpl_run_script, I get errors for every calls: ERROR: t_newtran: transaction already in process 0x422baf48 ERROR: sl_reply_error used: I'm terribly sorry, server error occured (1/SL) WARNING: script writer didn't release transaction
Can anyone help me on this?
José Nunes
Hi José,
Sorry for the delay. Here are some useful hints setting up correctly CPL processing: - from security reason, the cpl_process register() should be also placed after the authentication block. I don't know what tool are you using for sending the register with CPL (if you use CPLEd, it's able to authenticate); - for CPL processing - As written in README file, the INVITE transaction must be created before calling the cpl_run_script(), so you can do something like:
if (method=="INVITE") { # cpl interpreter requires a pre-created transaction for # the processed INVITE if ( !t_newtran() ) { # it'a a retransmission break; }; if ( !cpl_run_script("incoming") ) { # script execution failed t_reply("500","CPL script execution failed"); break; }; # we get here only if the CPL interpreter decided that server # should follow it default behavior
# mark that there is already a created # transaction for current INVITE setflag(3); };
keep in mind that you cannot use t_relay() when the transaction is already created (after calling t_newtran() ), so use a flag for marking if the transaction is created or not, and instead of t_relay(), do: if ( !isflagset(3) ) { # build a new fresh transaction and forward if (!t_relay()) { sl_reply_error(); }; } else { # transaction exists -> do just forward if (!t_forward_nonack_uri()) { sl_reply_error(); }; };
Anyhow, if you what to have incoming and outgoing CPL processing, logical will be to place the outgoing first.
Regards, Bogdan
José Nunes wrote:
Greetings everyone,
I'm trying to use the cpl-c module in ser 0.8.12. I uploaded through CPLEd a small script that would redirect to user1 the calls destined to user3. Calls between users that don´t have a CPL script associated are established. But if a call is destined to user3, when the cpl_run_script function is called, I get the following errors from the logs:
ERROR: t_reply: cannot send a t_reply to a message for which no T-state has been established ERROR:cpl_invoke_script: unable to send 100 reply! My configuration file is:
# # $Id: ser.cfg,v 1.21.4.1 2003/11/10 15:35:15 andrei 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) port=5060 children=4 fifo="/tmp/ser_fifo" fifo_mode=0666 #permite acesso ao fifo
# ------------------ 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/cpl-c.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"
# 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")
# -- rr params -- # add value to ;lr param to make some broken UAs happy modparam("rr", "enable_full_lr", 1)
# -- cpl-c module -- modparam("cpl-c","cpl_db","mysql://ser:heslo@localhost/ser") modparam("cpl-c","cpl_table","cpl") modparam("cpl-c","cpl_dtd_file","/usr/local/etc/ser/cpl-06.dtd") modparam("cpl-c","log_dir","/var/log/ser/cpl") modparam("cpl-c","proxy_recurse",0)
# ------------------------- request routing logic -------------------
# main routing logic
route{ # 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; };
# 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; }; lookup("aliases"); setflag(1);
# 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=~"klingon.av.it.pt") {
if (method=="REGISTER") {
# Uncomment this if you want to use digest authentication if(!cpl_process_register()) { break; }; if (!www_authorize("klingon.av.it.pt", "subscriber")) { www_challenge("klingon.av.it.pt", "0"); break; };
save("location"); break;
};
if(method=="INVITE") { log(1,"Invite \n"); cpl_run_script("incoming"); cpl_run_script("outgoing"); };
# native SIP destinations are handled using our USRLOC DB if (!lookup("location")) { sl_send_reply("404", "Not Found"); break; }; }; # 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(); };
} If I use t_newtran prior to cpl_run_script, I get errors for every calls: ERROR: t_newtran: transaction already in process 0x422baf48 ERROR: sl_reply_error used: I'm terribly sorry, server error occured (1/SL) WARNING: script writer didn't release transaction Can anyone help me on this?
José Nunes
Serusers mailing list serusers@lists.iptel.org http://lists.iptel.org/mailman/listinfo/serusers
Hello Bogdan,
Thank you very much for your help. The conditional forwarding is working great! Now, I'm uploading the scripts through SIP Registrar packets, but CPLEd allow also uploading though HTTP. Could you tell me how to configure SER to use this form of uploading?
Greetings, José Nunes
Hi José,
If you want to use HTTP to transport CPL you need a third party (on HTTP server) which detach CPL scripts from HTTP POST requests and push them into DB via fifo command or fetch CPL scripts via fifo and send them to HTTP client. Unfortunately I don't have an up to date version of this CGI (in PHP).
Regards, Bogdan
José Nunes wrote:
Hello Bogdan,
Thank you very much for your help. The conditional forwarding is working great! Now, I'm uploading the scripts through SIP Registrar packets, but CPLEd allow also uploading though HTTP. Could you tell me how to configure SER to use this form of uploading?
Greetings, José Nunes