Then we should move all config files from examples into the relevant
module directory?
On Mon, Dec 3, 2012 at 5:31 PM, Daniel-Constantin Mierla
<miconda(a)gmail.com> wrote:
Hello,
I think it is better to have the config example specific for a module in the
module directory, eventually in the doc sub-folder and imported in the
readme file in a dedicate section -- see the modules_k/dispatcher.
Definitely is not a good idea to add everything in the default configuration
file of kamailio -- etc/kamailio.cfg -- this file should address common
usage scenarios and be simple enough to understand and get people started.
Cheers,
Daniel
On 12/3/12 11:25 PM, Ovidiu Sas wrote:
>
> Hello Andrew,
>
> Maybe it would be good to move the example config into the examples
> directory and keep the config as simple as possible (no extra
> functionality, just SCA without any WITH_* directives).
> And if you can integrate the WITH_SCA directive into the master
> etc/kamailio.cfg, that would be great.
>
> Just my 2c.
> -ovidiu
>
> On Mon, Dec 3, 2012 at 5:14 PM, Andrew Mortensen <admorten(a)isc.upenn.edu>
> wrote:
>>
>> Module: sip-router
>> Branch: master
>> Commit: c40883a7aa96a1a7fab1060bf9dfab2987971c89
>> URL:
>>
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=c40883a…
>>
>> Author: Andrew Mortensen <admorten(a)isc.upenn.edu>
>> Committer: Andrew Mortensen <admorten(a)isc.upenn.edu>
>> Date: Mon Dec 3 17:14:14 2012 -0500
>>
>> sca: add working example kamailio.cfg
>>
>> ---
>>
>> modules/sca/examples/kamailio.cfg | 414
>> +++++++++++++++++++++++++++++++++++++
>> 1 files changed, 414 insertions(+), 0 deletions(-)
>>
>> diff --git a/modules/sca/examples/kamailio.cfg
>> b/modules/sca/examples/kamailio.cfg
>> new file mode 100644
>> index 0000000..8cbae87
>> --- /dev/null
>> +++ b/modules/sca/examples/kamailio.cfg
>> @@ -0,0 +1,414 @@
>> +#!KAMAILIO
>> +#
>> +# example kamailio.cfg with Shared Call Appearances (SCA)
>> +
>> +#!define WITH_AUTH
>> +#!define WITH_MYSQL
>> +#!define WITH_SCA
>> +
>> +####### Defined Values #########
>> +
>> +#!ifdef WITH_MYSQL
>> +# - database URL - used to connect to database server by modules such
>> +# as: auth_db, acc, usrloc, a.s.o.
>> +#!ifndef DBURL
>> +#!define DBURL "mysql://kamailio:kamailiorw@localhost/kamailio"
>> +#!endif
>> +#!endif
>> +
>> +####### Global Parameters #########
>> +
>> +#!ifdef WITH_DEBUG
>> +debug=4
>> +log_stderror=yes
>> +#!else
>> +debug=2
>> +log_stderror=no
>> +#!endif
>> +
>> +memdbg=5
>> +memlog=5
>> +
>> +log_facility=LOG_LOCAL0
>> +
>> +fork=yes
>> +children=4
>> +
>> +alias="vs7-dev.net.isc.upenn.edu"
>> +
>> +listen=udp:130.91.185.155:5060
>> +port=5060
>> +
>> +####### Modules Section ########
>> +
>> +# set paths to location of modules (to sources or installation folders)
>> +#!ifdef WITH_SRCPATH
>> +mpath="modules_k:modules"
>> +#!else
>>
>>
+mpath="/usr/local/kamailio/lib64/kamailio/modules_k/:/usr/local/kamailio/lib64/kamailio/modules/"
>> +#!endif
>> +
>> +#!ifdef WITH_MYSQL
>> +loadmodule "db_mysql.so"
>> +#!endif
>> +
>> +loadmodule "tm.so"
>> +loadmodule "sl.so"
>> +loadmodule "rr.so"
>> +loadmodule "pv.so"
>> +loadmodule "maxfwd.so"
>> +loadmodule "usrloc.so"
>> +loadmodule "registrar.so"
>> +loadmodule "textops.so"
>> +loadmodule "siputils.so"
>> +loadmodule "xlog.so"
>> +loadmodule "sanity.so"
>> +loadmodule "ctl.so"
>> +loadmodule "cfg_rpc.so"
>> +
>> +#!ifdef WITH_AUTH
>> +loadmodule "auth.so"
>> +loadmodule "auth_db.so"
>> +#!ifdef WITH_IPAUTH
>> +loadmodule "permissions.so"
>> +#!endif
>> +#!endif
>> +
>> +#!ifdef WITH_SCA
>> +loadmodule "sca.so"
>> +#!endif
>> +
>> +
>> +# ----------------- setting module-specific parameters ---------------
>> +
>> +
>> +# ----- tm params -----
>> +# auto-discard branches from previous serial forking leg
>> +modparam("tm", "failure_reply_mode", 3)
>> +# default retransmission timeout: 30sec
>> +modparam("tm", "fr_timer", 30000)
>> +# default invite retransmission timeout after 1xx: 120sec
>> +modparam("tm", "fr_inv_timer", 120000)
>> +
>> +
>> +# ----- rr params -----
>> +# add value to ;lr param to cope with most of the UAs
>> +modparam("rr", "enable_full_lr", 1)
>> +# do not append from tag to the RR (no need for this script)
>> +modparam("rr", "append_fromtag", 0)
>> +
>> +
>> +# ----- registrar params -----
>> +modparam("registrar", "method_filtering", 1)
>> +/* uncomment the next line to disable parallel forking via location */
>> +# modparam("registrar", "append_branches", 0)
>> +/* uncomment the next line not to allow more than 10 contacts per AOR */
>> +#modparam("registrar", "max_contacts", 10)
>> +# max value for expires of registrations
>> +modparam("registrar", "max_expires", 3600)
>> +# set it to 1 to enable GRUU
>> +modparam("registrar", "gruu_enabled", 0)
>> +
>> +
>> +# ----- usrloc params -----
>> +/* enable DB persistency for location entries */
>> +#!ifdef WITH_USRLOCDB
>> +modparam("usrloc", "db_url", DBURL)
>> +modparam("usrloc", "db_mode", 2)
>> +modparam("usrloc", "use_domain", 0)
>> +#!endif
>> +
>> +
>> +# ----- auth_db params -----
>> +#!ifdef WITH_AUTH
>> +modparam("auth_db", "db_url", DBURL)
>> +modparam("auth_db", "calculate_ha1", yes)
>> +modparam("auth_db", "password_column",
"password")
>> +modparam("auth_db", "load_credentials", "")
>> +
>> +# ----- permissions params -----
>> +#!ifdef WITH_IPAUTH
>> +modparam("permissions", "db_url", DBURL)
>> +modparam("permissions", "db_mode", 1)
>> +#!endif
>> +
>> +#!endif
>> +
>> +# ----- sca params -----
>> +#!ifdef WITH_SCA
>> +modparam("sca", "call_info_max_expires", 120)
>> +modparam("sca", "db_url", DBURL)
>> +#!endif
>> +
>> +
>> +####### Routing Logic ########
>> +
>> +# Main SIP request routing logic
>> +# - processing of any incoming SIP request starts with this route
>> +# - note: this is the same as route { ... }
>> +request_route {
>> +
>> + # per request initial checks
>> + route(REQINIT);
>> +
>> + # CANCEL processing
>> + if (is_method("CANCEL"))
>> + {
>> + if (t_check_trans())
>> + route(SCA);
>> + t_relay();
>> + exit;
>> + }
>> +
>> + # handle requests within SIP dialogs
>> + route(WITHINDLG);
>> +
>> + ### only initial requests (no To tag)
>> +
>> + t_check_trans();
>> +
>> + # authentication
>> + route(AUTH);
>> +
>> + # record routing for dialog forming requests (in case they are
>> routed)
>> + # - remove preloaded route headers
>> + remove_hf("Route");
>> + if (is_method("INVITE|SUBSCRIBE"))
>> + record_route();
>> +
>> + # handle registrations
>> + route(REGISTRAR);
>> +
>> + if ($rU==$null)
>> + {
>> + # request with no Username in RURI
>> + sl_send_reply("484","Address Incomplete");
>> + exit;
>> + }
>> +
>> + # user location service
>> + route(LOCATION);
>> +
>> + route(RELAY);
>> +}
>> +
>> +
>> +route[RELAY] {
>> +
>> + # enable additional event routes for forwarded requests
>> + if (is_method("INVITE|BYE|SUBSCRIBE|PRACK|REFER|UPDATE")) {
>> + if(!t_is_set("onreply_route"))
>> t_on_reply("MANAGE_REPLY");
>> + }
>> + if (is_method("INVITE")) {
>> + if(!t_is_set("failure_route"))
>> t_on_failure("MANAGE_FAILURE");
>> + }
>> +
>> +#!ifdef WITH_SCA
>> + route(SCA);
>> +#!endif
>> +
>> + if (!t_relay()) {
>> + sl_reply_error();
>> + }
>> + exit;
>> +}
>> +
>> +# Per SIP request initial checks
>> +route[REQINIT] {
>> + if (!mf_process_maxfwd_header("10")) {
>> + sl_send_reply("483","Too Many Hops");
>> + exit;
>> + }
>> +
>> + if(!sanity_check("1511", "7"))
>> + {
>> + xlog("Malformed SIP message from $si:$sp\n");
>> + exit;
>> + }
>> +}
>> +
>> +# Handle requests within SIP dialogs
>> +route[WITHINDLG] {
>> + if (has_totag()) {
>> + # sequential request withing a dialog should
>> + # take the path determined by record-routing
>> + if (loose_route()) {
>> + if ( is_method("NOTIFY") ) {
>> + # Add Record-Route for in-dialog NOTIFY
>> as per RFC 6665.
>> + record_route();
>> + }
>> + route(RELAY);
>> + } else {
>> + if (is_method("SUBSCRIBE") && uri ==
myself) {
>> + # in-dialog subscribe requests
>> + route(SCA);
>> + exit;
>> + }
>> + if ( is_method("ACK") ) {
>> + if ( t_check_trans() ) {
>> + # no 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;
>> + }
>> +}
>> +
>> +# Handle SIP registrations
>> +route[REGISTRAR] {
>> + if (is_method("REGISTER"))
>> + {
>> + if (!save("location"))
>> + sl_reply_error();
>> +
>> + exit;
>> + }
>> +}
>> +
>> +# USER location service
>> +route[LOCATION] {
>> + $avp(oexten) = $rU;
>> + if (!lookup("location")) {
>> + $var(rc) = $rc;
>> + t_newtran();
>> + switch ($var(rc)) {
>> + case -1:
>> + case -3:
>> + send_reply("404", "Not
Found");
>> + exit;
>> + case -2:
>> + send_reply("405", "Method Not
Allowed");
>> + exit;
>> + }
>> + }
>> +}
>> +
>> +# Authentication route
>> +route[AUTH] {
>> +#!ifdef WITH_AUTH
>> +
>> +#!ifdef WITH_IPAUTH
>> + if((!is_method("REGISTER")) && allow_source_address())
>> + {
>> + # source IP allowed
>> + return;
>> + }
>> +#!endif
>> +
>> + if (is_method("REGISTER") || from_uri==myself)
>> + {
>> + # authenticate requests
>> + if (!auth_check("$fd", "subscriber",
"1")) {
>> + auth_challenge("$fd", "0");
>> + exit;
>> + }
>> + # user authenticated - remove auth header
>> + if(!is_method("REGISTER|PUBLISH"))
>> + consume_credentials();
>> + }
>> + # if caller is not local subscriber, then check if it calls
>> + # a local destination, otherwise deny, not an open relay here
>> + if (from_uri!=myself && uri!=myself)
>> + {
>> + sl_send_reply("403","Not relaying");
>> + exit;
>> + }
>> +
>> +#!endif
>> + return;
>> +}
>> +
>> +# Shared Call Appearances handling
>> +route[SCA] {
>> +#!ifdef WITH_SCA
>> + if(is_method("SUBSCRIBE")) {
>> + if ($hdr(Event) == "call-info" || $hdr(Event) ==
>> "line-seize") {
>> + xdbg("SCA: $hdr(Event) SUBSCRIBE $ru from
>> $si:$sp");
>> + sca_handle_subscribe();
>> + exit;
>> + }
>> +
>> + return;
>> + }
>> +
>> + if (!is_method("BYE|CANCEL|INVITE|PRACK|REFER")) {
>> + return;
>> + }
>> +
>> + sca_call_info_update();
>> +#!endif
>> +
>> + return;
>> +}
>> +
>> +# Routing to foreign domains
>> +route[SIPOUT] {
>> + if (!uri==myself)
>> + {
>> + append_hf("P-hint: outbound\r\n");
>> + route(RELAY);
>> + }
>> +}
>> +
>> +# XMLRPC routing
>> +#!ifdef WITH_XMLRPC
>> +route[XMLRPC] {
>> + # allow XMLRPC from localhost
>> + if ((method=="POST" || method=="GET")
>> + && (src_ip==127.0.0.1)) {
>> + # close connection only for xmlrpclib user agents (there
>> is a bug in
>> + # xmlrpclib: it waits for EOF before interpreting the
>> response).
>> + if ($hdr(User-Agent) =~ "xmlrpclib")
>> + set_reply_close();
>> + set_reply_no_connect();
>> + dispatch_rpc();
>> + exit;
>> + }
>> + send_reply("403", "Forbidden");
>> + exit;
>> +}
>> +#!endif
>> +
>> +# manage incoming replies
>> +onreply_route[MANAGE_REPLY] {
>> + xdbg("incoming reply\n");
>> +
>> +#!ifdef WITH_SCA
>> + sca_call_info_update();
>> +#!endif
>> +}
>> +
>> +# manage failure routing cases
>> +failure_route[MANAGE_FAILURE] {
>> + if (t_is_canceled()) {
>> + exit;
>> + }
>> +
>> +#!ifdef WITH_SCA
>> + route(SCA);
>> +#!endif
>> +}
>> +
>> +#!ifdef WITH_XHTTP
>> +event_route[xhttp:request] {
>> +#!ifdef WITH_XHTTP_RPC
>> + $var(xhttp_rpc_root) = $(hu{s.substr,0,9});
>> + if ($var(xhttp_rpc_root) == "/http_rpc") {
>> + dispatch_xhttp_rpc();
>> + }
>> +#!endif
>> +
>> +#!ifdef WITH_SCA
>> +event_route[tm:local-request] {
>> + if (is_method("NOTIFY") {
>> + record_route();
>> + }
>> +}