This page has been visited 7881 times.
Table of Content (hide)
The purpose of this new module is to help you start in an easy way with the OpenSIPS script. The learning curve gets milder as the beginners can start with a simplified format of the script - the idea is to shift the main focus on routing the SIP initial requests (which define the service logic), while transparently handling a lot of "standard" SIP scripting logic, in order to both save script coding time and mitigate potential SIP scripting errors. This tutorial offers both a brief overview on the features of the new module and an example script.
As stated in the documentation, the module currently features:
Future directions for the module include adding authentication and NAT support.
SIP logic provided:
Table: Scripting examples
| With Script Helper | Classic Script |
####### Global Parameters #########
debug = 3
# log to syslog by default
log_stderror = no
log_facility = LOG_LOCAL0
fork = yes
children = 5
tcp_children = 1
# comment the next line to enable the auto discovery of local aliases
# based on reverse DNS on IPs
auto_aliases = no
listen = udp:192.168.2.133:5060 use_children 8
disable_tcp = no
disable_tls = no
exec_msg_threshold = 200000
####### Modules Section ########
mpath = "/usr/local/lib/opensips/modules/"
loadmodule "signaling.so"
#### Stateless module
loadmodule "sl.so"
#### Transaction Module
loadmodule "tm.so"
modparam("tm", "fr_timeout", 10)
modparam("tm", "fr_inv_timeout", 40)
loadmodule "rr.so"
modparam("rr", "append_fromtag", 0)
loadmodule "maxfwd.so"
loadmodule "sipmsgops.so"
#### FIFO Management Interface
loadmodule "mi_fifo.so"
modparam("mi_fifo", "fifo_name", "/tmp/opensips_fifo")
loadmodule "db_mysql.so"
modparam("db_mysql", "exec_query_threshold", 200000)
loadmodule "uri.so"
modparam("uri", "use_uri_table", 0)
loadmodule "dialog.so"
modparam("dialog", "db_url", "mysql://opensips:XXXXXXXXX@192.168.2.133/opensips")
modparam("dialog", "db_mode", 1)
modparam("dialog", "default_timeout", 3600)
modparam("dialog", "ping_interval", 5)
loadmodule "usrloc.so"
modparam("usrloc", "db_mode", 1)
modparam("usrloc", "db_url", "mysql://opensips:XXXXXXXXX@192.168.2.133/opensips")
loadmodule "registrar.so"
loadmodule "script_helper.so"
# this route will be run right before sequential requests are routed out
modparam("script_helper", "sequential_route", "my_seq_route")
modparam("script_helper", "use_dialog", 1)
modparam("script_helper", "create_dialog_flags", "PpB")
route [my_seq_route]
{
xlog("---- Sequential request handler ---- \n");
xlog("$rm | Call-ID: $ci | FT: $ft | TT: $tt\n");
}
# main request routing logic
route
{
$T_fr_timeout = 8;
$T_fr_inv_timeout = 30;
if (!mf_process_maxfwd_header("10"))
{
sl_send_reply("483","Too Many Hops");
exit;
}
if (!uri == myself)
{
append_hf("P-hint: outbound\r\n");
route(relay);
}
if (is_method("PUBLISH|SUBSCRIBE"))
{
sl_send_reply("503", "Service Unavailable");
exit;
}
if (is_method("REGISTER"))
{
if (!save("location"))
sl_reply_error();
exit;
}
if ($rU == NULL)
{
# request with no Username in RURI
sl_send_reply("484","Address Incomplete");
exit;
}
# do lookup with method filtering
if (!lookup("location",""))
{
t_newtran();
t_reply("404", "Not Found");
exit;
}
route(relay);
}
route [relay]
{
# for INVITEs enable some additional helper routes
if (is_method("INVITE"))
t_on_failure("failed_call");
if (!t_relay())
send_reply("500", "Internal Error");
exit;
}
failure_route [failed_call]
{
if (t_was_cancelled())
exit;
if (next_branches())
{
t_on_failure("failed_call");
t_relay();
}
}
|
####### Global Parameters #########
debug = 3
# log to syslog by default
log_stderror = no
log_facility = LOG_LOCAL0
fork = yes
children = 5
tcp_children = 1
# comment the next line to enable the auto discovery of local aliases
# based on reverse DNS on IPs
auto_aliases = no
listen = udp:192.168.2.133:5060 use_children 8
disable_tcp = no
disable_tls = no
exec_msg_threshold = 200000
####### Modules Section ########
mpath = "/usr/local/lib/opensips/modules/"
loadmodule "signaling.so"
#### Stateless module
loadmodule "sl.so"
#### Transaction Module
loadmodule "tm.so"
modparam("tm", "fr_timeout", 10)
modparam("tm", "fr_inv_timeout", 40)
loadmodule "rr.so"
modparam("rr", "append_fromtag", 0)
loadmodule "maxfwd.so"
loadmodule "sipmsgops.so"
#### FIFO Management Interface
loadmodule "mi_fifo.so"
modparam("mi_fifo", "fifo_name", "/tmp/opensips_fifo")
loadmodule "db_mysql.so"
modparam("db_mysql", "exec_query_threshold", 200000)
loadmodule "uri.so"
modparam("uri", "use_uri_table", 0)
loadmodule "dialog.so"
modparam("dialog", "db_url", "mysql://opensips:XXXXXXXXX@192.168.2.133/opensips")
modparam("dialog", "db_mode", 1)
modparam("dialog", "default_timeout", 3600)
modparam("dialog", "ping_interval", 5)
loadmodule "usrloc.so"
modparam("usrloc", "db_mode", 1)
modparam("usrloc", "db_url", "mysql://opensips:XXXXXXXXX@192.168.2.133/opensips")
loadmodule "registrar.so"
# main request routing logic
route
{
$T_fr_timeout = 8;
$T_fr_inv_timeout = 30;
if (!mf_process_maxfwd_header("10"))
{
sl_send_reply("483","Too Many Hops");
exit;
}
if (has_totag())
{
if (loose_route() || match_dialog())
{
if (is_method("INVITE"))
{
# even if in most of the cases is useless, do RR for
# re-INVITEs alos, as some buggy clients do change route set
# during the dialog.
record_route();
}
xlog("---- Sequential request handler ---- \n");
xlog("$rm | Call-ID: $ci | FT: $ft | TT: $tt\n");
# route it out to whatever destination was set by loose_route()
# in $du (destination URI).
route(relay);
}
else
{
if (is_method("ACK"))
{
if (t_check_trans())
{
# non loose-route, but stateful ACK; must be an ACK after
# a 487 or e.g. 404 from upstream server
t_relay();
exit;
}
else
{
# ACK without matching transaction ->
# ignore and discard
exit;
}
}
sl_send_reply("404","Not here");
}
exit;
}
# CANCEL processing
if (is_method("CANCEL"))
{
if (t_check_trans())
t_relay();
exit;
}
t_check_trans();
# record routing
if (!is_method("REGISTER|MESSAGE"))
record_route();
if (!uri == myself)
{
append_hf("P-hint: outbound\r\n");
route(relay);
}
if (is_method("INVITE") && !has_totag())
create_dialog("PpB");
if (is_method("PUBLISH|SUBSCRIBE"))
{
sl_send_reply("503", "Service Unavailable");
exit;
}
if (is_method("REGISTER"))
{
if (!save("location"))
sl_reply_error();
exit;
}
if ($rU == NULL)
{
# request with no Username in RURI
sl_send_reply("484","Address Incomplete");
exit;
}
# do lookup with method filtering
if (!lookup("location",""))
{
t_newtran();
t_reply("404", "Not Found");
exit;
}
route(relay);
}
route [relay]
{
# for INVITEs enable some additional helper routes
if (is_method("INVITE"))
t_on_failure("failed_call");
if (!t_relay())
send_reply("500", "Internal Error");
exit;
}
failure_route [failed_call]
{
if (t_was_cancelled())
exit;
if (next_branches())
{
t_on_failure("failed_call");
t_relay();
}
}
|