From 834ff614cdec10db78f4e4c1e3d8fa4a9d499f95 Mon Sep 17 00:00:00 2001 From: lazedo Date: Fri, 23 Aug 2019 02:27:20 +0000 Subject: [PATCH] support kamailio 5.1/5.2 --- kamailio/default.cfg | 3 +- kamailio/defs.cfg | 2 + ...tcher-role.cfg => dispatcher-role-5.1.cfg} | 0 kamailio/dispatcher-role-5.2.cfg | 289 ++++++++++++++++++ kamailio/kamailio.cfg | 2 + 5 files changed, 294 insertions(+), 2 deletions(-) rename kamailio/{dispatcher-role.cfg => dispatcher-role-5.1.cfg} (100%) create mode 100644 kamailio/dispatcher-role-5.2.cfg diff --git a/kamailio/default.cfg b/kamailio/default.cfg index 3cf8c34..0fc1542 100644 --- a/kamailio/default.cfg +++ b/kamailio/default.cfg @@ -159,7 +159,6 @@ modparam("maxfwd", "max_limit", 50) loadmodule "siputils.so" ######## Text operations module ######## -loadmodule "textops.so" loadmodule "textopsx.so" ######## sdp operations module ######## @@ -219,7 +218,7 @@ include_file "kazoo-bindings.cfg" include_file "authorization-role.cfg" #!endif #!ifdef DISPATCHER_ROLE -include_file "dispatcher-role.cfg" +include_file "dispatcher-role-MAJOR.cfg" #!endif #!ifdef REGISTRAR_ROLE include_file "registrar-role.cfg" diff --git a/kamailio/defs.cfg b/kamailio/defs.cfg index 8619f6d..9e5df5d 100644 --- a/kamailio/defs.cfg +++ b/kamailio/defs.cfg @@ -5,6 +5,8 @@ #!ifndef DEFAULTS_INCLUDED #!define DEFAULTS_INCLUDED +#!substdef "!MAJOR!$(version(num){re.subst,/^(([^\.])*\.([^\.])*)\..*/\1/})!g" + #!ifndef MY_HOSTNAME #!substdef "!MY_HOSTNAME!$HN(f)!g" #!endif diff --git a/kamailio/dispatcher-role.cfg b/kamailio/dispatcher-role-5.1.cfg similarity index 100% rename from kamailio/dispatcher-role.cfg rename to kamailio/dispatcher-role-5.1.cfg diff --git a/kamailio/dispatcher-role-5.2.cfg b/kamailio/dispatcher-role-5.2.cfg new file mode 100644 index 0000000..6871ffb --- /dev/null +++ b/kamailio/dispatcher-role-5.2.cfg @@ -0,0 +1,289 @@ +######## Generic Hash Table container in shared memory ######## +modparam("htable", "htable", "failover=>size=16;autoexpire=120") + +#!trydef KZ_DISPATCHER_PROBE_MODE 1 +#!trydef DISPATCHER_ADD_SERVERS 1 +#!trydef DISPATCHER_ALG 0 +#!trydef KZ_DISPATCHER_ADD_FLAGS 10 +#!trydef KZ_DISPATCHER_PRIMARY_GROUP 1 +#!trydef KZ_DISPATCHER_SECONDARY_GROUP 2 +#!trydef KZ_DISPATCHER_CLASSIFY_GROUP 3 +#!trydef KZ_DISPATCHER_ALTNET1_PRIMARY_GROUP 51 +#!trydef KZ_DISPATCHER_ALTNET1_SECONDARY_GROUP 52 +#!trydef KZ_DISPATCHER_ALTNET2_PRIMARY_GROUP 53 +#!trydef KZ_DISPATCHER_ALTNET2_SECONDARY_GROUP 54 +#!trydef KZ_DISPATCHER_PRESENCE_PRIMARY_GROUP 10 +#!trydef KZ_DISPATCHER_PRESENCE_SECONDARY_GROUP 11 +#!trydef KZ_DISPATCHER_REGISTRAR_PRIMARY_GROUP 20 +#!trydef KZ_DISPATCHER_REGISTRAR_SECONDARY_GROUP 21 +#!trydef KZ_DISPATCHER_PRINT_ROUTES 0 +#!trydef KZ_DISPATCHER_MAX_RETRIES 0 + +kazoo.dispatcher_auto_add = DISPATCHER_ADD_SERVERS descr "adds media servers reported by ecallmgr" +kazoo.dispatcher_algorithm = DISPATCHER_ALG descr "dispatcher algorithm to use" +kazoo.dispatcher_primary_group = KZ_DISPATCHER_PRIMARY_GROUP descr "dispatcher primary group" +kazoo.dispatcher_secondary_group = KZ_DISPATCHER_SECONDARY_GROUP descr "dispatcher secondary group" +kazoo.dispatcher_print_routes = KZ_DISPATCHER_PRINT_ROUTES descr "should we log the selected routes" +kazoo.dispatcher_max_retries = KZ_DISPATCHER_MAX_RETRIES descr "max number of retries for media servers" + + +####### Dispatcher module ######## +loadmodule "dispatcher.so" +modparam("dispatcher", "db_url", "KAZOO_DB_URL") +modparam("dispatcher", "flags", 2) +modparam("dispatcher", "use_default", 0) +modparam("dispatcher", "force_dst", 1) +modparam("dispatcher", "hash_pvar", "$avp(ds_grp)") +modparam("dispatcher", "setid_pvname", "$var(setid)") +modparam("dispatcher", "ds_ping_method", "OPTIONS") +modparam("dispatcher", "ds_ping_interval", 10) +modparam("dispatcher", "ds_probing_threshold", 3) +modparam("dispatcher", "ds_probing_mode", KZ_DISPATCHER_PROBE_MODE) +modparam("dispatcher", "ds_ping_reply_codes", "501,403,404,400,200") +modparam("dispatcher", "ds_ping_from", "sip:sipcheck@MY_HOSTNAME") + +###modparam("dispatcher", "dst_avp", "$avp(ds_dst)") +###modparam("dispatcher", "attrs_avp", "$avp(ds_attrs)") +###modparam("dispatcher", "grp_avp", "$avp(ds_grp)") +###modparam("dispatcher", "cnt_avp", "$avp(ds_cnt)") + +modparam("dispatcher", "xavp_dst", "ds_dst") +modparam("dispatcher", "xavp_ctx", "ds_ctx") + +#!import_file "dispatcher-network-params.cfg" + +## Dispatcher Groups: +## 1 - Primary media servers +## 2 - Backup media servers +## 3 - Alternate media server IPs (used only for classification) +## 10 - Presence servers (if not locally handled) +## 20 - Registrar servers (if not locally handled) + + +modparam("rtimer", "timer", "name=dispatcher_reload;interval=20;mode=1;") +modparam("rtimer", "exec", "timer=dispatcher_reload;route=DISPATCHER_RELOAD") + +####### Dispatcher Logic ######## +route[DISPATCHER_CLASSIFY_SOURCE] +{ + #!import_file "dispatcher-network-classify.cfg" + + if (is_myself("$ou")) { + xlog("$var(log_request_level)", "$ci|log|original R-URI ($ou) is this proxy, treating as external sources\n"); + } else if ( + ds_is_from_list(KZ_DISPATCHER_PRIMARY_GROUP, 3) || + ds_is_from_list(KZ_DISPATCHER_SECONDARY_GROUP, 3) || + ds_is_from_list(KZ_DISPATCHER_CLASSIFY_GROUP, 3) || + ds_is_from_list(KZ_DISPATCHER_ALTNET1_PRIMARY_GROUP, 3) || + ds_is_from_list(KZ_DISPATCHER_ALTNET1_SECONDARY_GROUP, 3) || + ds_is_from_list(KZ_DISPATCHER_ALTNET2_PRIMARY_GROUP, 3) || + ds_is_from_list(KZ_DISPATCHER_ALTNET2_SECONDARY_GROUP, 3) || + ds_is_from_list(KZ_DISPATCHER_PRESENCE_PRIMARY_GROUP, 3) || + ds_is_from_list(KZ_DISPATCHER_PRESENCE_SECONDARY_GROUP, 3) || + ds_is_from_list(KZ_DISPATCHER_REGISTRAR_PRIMARY_GROUP, 3) || + ds_is_from_list(KZ_DISPATCHER_REGISTRAR_SECONDARY_GROUP, 3) + ) { + xlog("$var(log_request_level)", "$ci|log|originated from internal sources\n"); + setflag(FLAG_INTERNALLY_SOURCED); + } else { + xlog("$var(log_request_level)", "$ci|log|originated from external sources\n"); + } +} + +# Take the routes from dispatcher - hash over callid +# If prefered route defined, reorder the destionations +route[DISPATCHER_FIND_ROUTES] +{ + if ($sht(failover=>$ci::current) != $null) { + $du = $sht(failover=>$ci::current); + return; + } + + $var(ds_primary_group) = $sel(cfg_get.kazoo.dispatcher_primary_group); + $var(ds_backup_group) = $sel(cfg_get.kazoo.dispatcher_secondary_group); + + #!ifndef PRESENCE_ROLE + if (is_method("SUBSCRIBE")) { + $var(ds_primary_group) = KZ_DISPATCHER_PRESENCE_PRIMARY_GROUP; + $var(ds_backup_group) = KZ_DISPATCHER_PRESENCE_SECONDARY_GROUP; + } + #!endif + + #!ifndef REGISTRAR_ROLE + if (is_method("REGISTER")) { + $var(ds_primary_group) = KZ_DISPATCHER_REGISTRAR_PRIMARY_GROUP; + $var(ds_backup_group) = KZ_DISPATCHER_REGISTRAR_SECONDARY_GROUP; + } + #!endif + + #!ifdef PRESENCE_ROLE + route(PRESENCE_FAST_PICKUP_ATTEMPT); + #!endif + + #!import_file "dispatcher-network-find.cfg" + + $var(ds_group) = $var(ds_primary_group); + + $var(ds_alg) = $sel(cfg_get.kazoo.dispatcher_algorithm); + $var(ds_rule) = $_s($var(ds_primary_group)=$var(ds_alg);$var(ds_backup_group)=$var(ds_alg)); + + ds_select_routes("$var(ds_rule)", "2"); + if ($xavp(ds_ctx=>cnt) == 0) { + xlog("L_WARN", "$ci|end|no servers available in primary or backup group\n"); + sl_send_reply("480", "All servers busy"); + exit; + } + + route(PRINT_ROUTES); + + $var(user_source) = $(ct{tobody.user}) + "@" + $si + ":" + $sp; + $var(redirect) = @from.uri.user + "@" + @from.uri.host + "->" + + @ruri.user + "@" + @ruri.host; + if ($sht(redirects=>$var(redirect)) != $null) { + $var(prefered_route) = $sht(redirects=>$var(redirect)); + xlog("L_INFO", "$ci|log|found redirect for $var(redirect)\n"); + if (route(DISPATCHER_REORDER_ROUTES)) { + $avp(AVP_REDIRECT_KEY) = $var(redirect); + xlog("L_INFO", "$ci|log|REORDER OK $var(redirect)\n"); + } else { + xlog("L_INFO", "$ci|log|REORDER KO $var(redirect)\n"); + } + } else if ($sht(associations=>$var(user_source)) != $null) { + $var(prefered_route) = $sht(associations=>$var(user_source)); + xlog("L_INFO", "$ci|log|found association for contact uri $var(user_source)\n"); + if (route(DISPATCHER_REORDER_ROUTES)) { + $sht(associations=>$var(user_source)) = $null; + xlog("L_DEBUG", "$ci|log|REORDER OK $var(user_source)\n"); + } else { + xlog("L_WARNING", "$ci|log|REORDER KO $var(user_source)\n"); + } + } + + $avp(ds_group) = $xavp(ds_dst=>grp); + $avp(ds_retries) = 0; + ds_set_dst(); + +} + +route[DISPATCHER_REORDER_ROUTES] +{ + $var(i) = 0; + $var(count) = $xavp(ds_ctx=>cnt); + while($var(i) < $xavp(ds_ctx=>cnt)) { + if($xavp(ds_dst[$var(i)]=>uri) == $var(prefered_route)) { + xlog("L_INFO", "$ci|route|found preferred route $xavp(ds_dst[$var(i)]=>uri)\n"); + $var(uri) = $xavp(ds_dst[$var(i)]=>uri); + $var(grp) = $xavp(ds_dst[$var(i)]=>grp); + $var(attrs) = $xavp(ds_dst[$var(i)]=>attrs); + $xavp(ds_dst[$var(i)]=>*) = $null; + $xavp(ds_dst=>uri) = $var(uri); + $xavp(ds_dst[0]=>grp) = $var(grp); + $xavp(ds_dst[0]=>attrs) = $var(attrs); + return 1; + } + $var(i) = $var(i) + 1; + } + return -1; +} + +route[PRINT_ROUTES] +{ + if($sel(cfg_get.kazoo.dispatcher_print_routes) == 0) return; + + $var(i) = 0; + while($xavp(ds_dst[$var(i)]=>uri) != $null) { + xlog("L_INFO", "$ci|route|group $xavp(ds_dst[$var(i)]=>grp) => $xavp(ds_dst[$var(i)]=>uri) => zone $(xavp(ds_dst[$var(i)]=>attrs){param.value,zone})\n"); + $var(i) = $var(i) + 1; + } + +} + +#!import_file "dispatcher-next-route.cfg" + +#!ifndef CUSTOM_DISPATCHER_NEXT_ROUTE +# Try next destinations in failure route +route[DISPATCHER_NEXT_ROUTE] +{ + + if($avp(ds_retries) >= $sel(cfg_get.kazoo.dispatcher_max_retries)) return; + + $avp(ds_retries) = $avp(ds_retries) + 1; + if(ds_next_dst()) { + xlog("L_INFO", "$ci|log|routing call to next media server $du\n"); + + setflag(FLAG_SKIP_NAT_CORRECTION); + + # relay the request to the new media server + route(RELAY); + + exit; + } +} +#!endif + +event_route[dispatcher:dst-down] +{ + xlog("L_WARNING", "Destination down: $ru\n"); +} + +event_route[dispatcher:dst-up] +{ + xlog("L_WARNING", "Destination up: $ru\n"); +} + + +route[DISPATCHER_CHECK_MEDIA_SERVER] +{ + if($sel(cfg_get.kazoo.dispatcher_auto_add) == 1) { + $var(SetId) = 1; + if($var(Zone) != "MY_AMQP_ZONE") { + $var(SetId) = 2; + } + $var(flags) = KZ_DISPATCHER_ADD_FLAGS; + $var(attrs) = $_s(zone=$var(Zone);profile=$var(MediaProfile);idx=$(var(MediaUrl){s.corehash, MEDIA_SERVERS_HASH_SIZE});node=$var(MediaName)); + #!import_file "dispatcher-custom-media-check.cfg" + sql_query("exec", "KZQ_CHECK_MEDIA_SERVER_INSERT"); + if($sqlrows(exec) > 0) { + $shv(dispatcher_reload) = 1; + return 1; + } + } + return 0; +} + +route[DISPATCHER_RELOAD] +{ + if($shv(dispatcher_reload) == 1) { + xlog("L_WARNING", "reloading dispatcher table\n"); + ds_reload(); + }; + $shv(dispatcher_reload) = 0; +} + +route[DISPATCHER_STATUS] +{ + jsonrpc_exec('{"jsonrpc": "2.0", "method": "dispatcher.list", "id": 1}'); + $var(Sets) = $(jsonrpl(body){kz.json, result.NRSETS}); + $var(i) = 0; + $var(ds_groups_json)=""; + $var(Sep1) = ""; + while($var(i) < $var(Sets)) { + $var(Set) = $(jsonrpl(body){kz.json, result.RECORDS[$var(i)].SET}); + $var(SetCount) = $(var(Set){kz.json.count,TARGETS}); + $var(Sep2)=""; + $var(ds_group_json)=""; + $var(c) = 0; + while($var(c) < $var(SetCount)) { + $var(Dest) = $(var(Set){kz.json,TARGETS[$var(c)].DEST}); + $var(record) = $_s("$(var(Dest){kz.json,URI})" : {"destination" : "$(var(Dest){kz.json,URI})", "flags" : "$(var(Dest){kz.json,FLAGS})", "priority" : $(var(Dest){kz.json,PRIORITY}), "attrs" : "$(var(Dest){kz.json,ATTRS.BODY})"}); + $var(ds_group_json) = $var(ds_group_json) + $var(Sep2) + $var(record); + $var(Sep2) = ","; + $var(c) = $var(c) + 1; + } + $var(ds_groups_json) = $var(ds_groups_json) + $var(Sep1) + $_s("$(var(Set){kz.json,ID})" : { $var(ds_group_json) }); + $var(Sep1)=", "; + $var(i) = $var(i) + 1; + } +} + +# vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab diff --git a/kamailio/kamailio.cfg b/kamailio/kamailio.cfg index e515b9b..4cc4abc 100644 --- a/kamailio/kamailio.cfg +++ b/kamailio/kamailio.cfg @@ -31,11 +31,13 @@ # # ipops - ip , domain, hostname # pv - $def(existing definition) +# textops - apply regexp # # ################ loadmodule "ipops.so" loadmodule "pv.so" +loadmodule "textops.so" ####### Local Configuration ########