[sr-dev] git:master: sca: add working example kamailio.cfg

Ovidiu Sas osas at voipembedded.com
Mon Dec 3 23:36:10 CET 2012


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 at 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 at 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=c40883a7aa96a1a7fab1060bf9dfab2987971c89
>>>
>>> Author: Andrew Mortensen <admorten at isc.upenn.edu>
>>> Committer: Andrew Mortensen <admorten at 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();
>>> +    }
>>> +}



More information about the sr-dev mailing list