From 9a8d560beac6ac7b0c4c8f3fde00ce1ec2e39245 Mon Sep 17 00:00:00 2001 From: lazedo Date: Thu, 29 Aug 2019 10:47:05 +0000 Subject: [PATCH] simplify next and prefered route * changes default flag for adding entry to dispatcher * changes attrs when adding entry to dispatcher * adds runtime support to change classify flag * adds runtime support for max retries * adds runtime support to associate media * changes view to support duid attr when adding entry to dispatcher (cherry picked from commit 39b6d0578ecc7e5e699c2c97ae02ea5066ee8091) --- kamailio/db_scripts/vw_wdispatcher.sql | 2 +- kamailio/dispatcher-role-5.1.cfg | 168 ++++++++++++------------- kamailio/dispatcher-role-5.2.cfg | 152 ++++++++++++---------- 3 files changed, 168 insertions(+), 154 deletions(-) diff --git a/kamailio/db_scripts/vw_wdispatcher.sql b/kamailio/db_scripts/vw_wdispatcher.sql index 1643b92..884fdbf 100644 --- a/kamailio/db_scripts/vw_wdispatcher.sql +++ b/kamailio/db_scripts/vw_wdispatcher.sql @@ -1,6 +1,6 @@ CREATE VIEW wdispatcher as select *, cast(substr(attrs, instr(attrs, "zone=")+5, instr(attrs, ";profile")-instr(attrs, "zone=")-5) as varchar(20)) zone, - cast(substr(attrs, instr(attrs, "idx=")+4, instr(attrs, ";node")-instr(attrs, "idx=")-4) as integer) idx, + cast(substr(attrs, instr(attrs, "duid=")+5, instr(attrs, ";node")-instr(attrs, "duid=")-5) as integer) idx, cast(substr(attrs, instr(attrs, "node=")+5) as varchar(50)) node from dispatcher diff --git a/kamailio/dispatcher-role-5.1.cfg b/kamailio/dispatcher-role-5.1.cfg index 46bd6b4..00dafbe 100644 --- a/kamailio/dispatcher-role-5.1.cfg +++ b/kamailio/dispatcher-role-5.1.cfg @@ -1,12 +1,12 @@ -######## Generic Hash Table container in shared memory ######## -modparam("htable", "htable", "failover=>size=16;autoexpire=120") +### DISPATCHER ROLE #### #!trydef KZ_DISPATCHER_PROBE_MODE 1 #!trydef DISPATCHER_ADD_SERVERS 1 #!trydef DISPATCHER_ADD_SECONDARY_IP 1 #!trydef DISPATCHER_SECONDARY_IP_GROUP 3 #!trydef DISPATCHER_ALG 0 -#!trydef KZ_DISPATCHER_ADD_FLAGS 10 +#!trydef KZ_DISPATCHER_HASH_SIZE 8 +#!trydef KZ_DISPATCHER_ADD_FLAGS 9 #!trydef KZ_DISPATCHER_PRIMARY_GROUP 1 #!trydef KZ_DISPATCHER_SECONDARY_GROUP 2 #!trydef KZ_DISPATCHER_CLASSIFY_GROUP 3 @@ -18,14 +18,20 @@ modparam("htable", "htable", "failover=>size=16;autoexpire=120") #!trydef KZ_DISPATCHER_PRESENCE_SECONDARY_GROUP 11 #!trydef KZ_DISPATCHER_REGISTRAR_PRIMARY_GROUP 20 #!trydef KZ_DISPATCHER_REGISTRAR_SECONDARY_GROUP 21 +#!trydef KZ_DISPATCHER_MAX_RETRIES 2 +#!trydef KZ_DISPATCHER_ROUTE_ASSOCIATED_MEDIA 1 +#!trydef KZ_DISPATCHER_CLASSIFY_FLAGS 2 + kazoo.dispatcher_auto_add = DISPATCHER_ADD_SERVERS descr "adds media servers reported by ecallmgr" kazoo.dispatcher_add_secondary_ip = DISPATCHER_ADD_SECONDARY_IP descr "adds internal ip from media servers reported by ecallmgr" kazoo.dispatcher_add_secondary_ip_group = DISPATCHER_SECONDARY_IP_GROUP descr "sets the group where to add internal ip from 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_max_retries = KZ_DISPATCHER_MAX_RETRIES descr "max number of retries for media servers" +kazoo.dispatcher_route_to_associated_media = KZ_DISPATCHER_ROUTE_ASSOCIATED_MEDIA descr "routes to associated media for atxfer" +kazoo.dispatcher_classify_flags = KZ_DISPATCHER_CLASSIFY_FLAGS descr "dispatch classifier flags" ####### Dispatcher module ######## loadmodule "dispatcher.so" @@ -38,7 +44,9 @@ modparam("dispatcher", "attrs_avp", "$avp(ds_attrs)") modparam("dispatcher", "grp_avp", "$avp(ds_grp)") modparam("dispatcher", "cnt_avp", "$avp(ds_cnt)") modparam("dispatcher", "hash_pvar", "$avp(ds_grp)") +modparam("dispatcher", "ds_hash_size", KZ_DISPATCHER_HASH_SIZE) modparam("dispatcher", "setid_pvname", "$var(setid)") +modparam("dispatcher", "attrs_pvname", "$var(attrs)") modparam("dispatcher", "ds_ping_method", "OPTIONS") modparam("dispatcher", "ds_ping_interval", 10) modparam("dispatcher", "ds_probing_threshold", 3) @@ -66,23 +74,24 @@ route[DISPATCHER_CLASSIFY_SOURCE] 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"); + $var(classify_dispatcher_flag) = $(sel(cfg_get.kazoo.dispatcher_classify_flags){s.int}); + if (ds_is_from_list(KZ_DISPATCHER_PRIMARY_GROUP, "$var(classify_dispatcher_flag)") || + ds_is_from_list(KZ_DISPATCHER_SECONDARY_GROUP, "$var(classify_dispatcher_flag)") || + ds_is_from_list(KZ_DISPATCHER_CLASSIFY_GROUP, "$var(classify_dispatcher_flag)") || + ds_is_from_list(KZ_DISPATCHER_ALTNET1_PRIMARY_GROUP, "$var(classify_dispatcher_flag)") || + ds_is_from_list(KZ_DISPATCHER_ALTNET1_SECONDARY_GROUP, "$var(classify_dispatcher_flag)") || + ds_is_from_list(KZ_DISPATCHER_ALTNET2_PRIMARY_GROUP, "$var(classify_dispatcher_flag)") || + ds_is_from_list(KZ_DISPATCHER_ALTNET2_SECONDARY_GROUP, "$var(classify_dispatcher_flag)") || + ds_is_from_list(KZ_DISPATCHER_PRESENCE_PRIMARY_GROUP, "$var(classify_dispatcher_flag)") || + ds_is_from_list(KZ_DISPATCHER_PRESENCE_SECONDARY_GROUP, "$var(classify_dispatcher_flag)") || + ds_is_from_list(KZ_DISPATCHER_REGISTRAR_PRIMARY_GROUP, "$var(classify_dispatcher_flag)") || + ds_is_from_list(KZ_DISPATCHER_REGISTRAR_SECONDARY_GROUP, "$var(classify_dispatcher_flag)")) { + 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"); + } } } @@ -90,10 +99,6 @@ route[DISPATCHER_CLASSIFY_SOURCE] # 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); @@ -139,93 +144,77 @@ route[DISPATCHER_FIND_ROUTES] 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)) { + if (route(DISPATCHER_PREFERRED_ROUTE)) { $avp(AVP_REDIRECT_KEY) = $var(redirect); } } 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; + if($sel(cfg_get.kazoo.dispatcher_route_to_associated_media) == 1) { + $var(prefered_route) = $sht(associations=>$var(user_source)); + xlog("L_INFO", "$ci|route|found association for contact uri $var(user_source)\n"); + route(DISPATCHER_PREFERRED_ROUTE); } + $sht(associations=>$var(user_source)) = $null; } + + $avp(ds_retries) = 0; + } -route[DISPATCHER_REORDER_ROUTES] +route[DISPATCHER_PREFERRED_ROUTE] { - $var(i) = 0; - $var(found) = 0; - while($(avp(ds_dst)[$var(i)]) != $null) { - if($(avp(ds_dst)[$var(i)]) != $var(prefered_route)) { - $avp(tmp_ds_dst) = $(avp(ds_dst)[$var(i)]); - } else { - $var(found) = 1; - } - - $var(i) = $var(i) + 1; + ###### + # check if the preferred route is active + ###### + if(!ds_is_from_list(-1, 6, "$var(prefered_route"))) { + xlog("L_INFO", "$ci|log|associated media server $var(prefered_route) is inactive, moving to $avp(ds_dst)\n"); + return -1; } - if (!$var(found) && $var(ds_group) == $var(ds_primary_group) && ds_select_dst("$var(ds_backup_group)", "0")) { - $var(i) = 0; - while($(avp(ds_dst)[$var(i)]) != $null) { - if($(avp(ds_dst)[$var(i)]) == $var(prefered_route)) { - xlog("L_INFO", "$ci|log|found associated media server in backup list\n"); - $var(found) = 1; - break; - } - $var(i) = $var(i) + 1; - } - } + xlog("L_INFO", "$ci|log|re-ordering the dispatcher list to maintain association with $var(prefered_route)\n"); - if ($var(found)) { - xlog("L_INFO", "$ci|log|re-ordering the dispatcher list to maintain association with $var(prefered_route)\n"); + ###### + # filters current list from prefered route + # * saves the current list to temp avp removing the preferred route if it exists + # * resets current list + # * copies the temp back to list + # sets the prefered at top + # sets $du (destination) to prefered + ###### - $(avp(ds_dst)[*]) = $null; - - $var(i) = 0; - while($(avp(tmp_ds_dst)[$var(i)]) != $null) { - $avp(ds_dst) = $(avp(tmp_ds_dst)[$var(i)]); + $var(i) = 0; + while($(avp(ds_dst)[$var(i)]) != $null) { + if($(avp(ds_dst)[$var(i)]) != $var(prefered_route)) { + $avp(tmp_ds_dst) = $(avp(ds_dst)[$var(i)]); + } + $var(i) = $var(i) + 1; + } - $var(i) = $var(i) + 1; - } - $avp(ds_dst) = $var(prefered_route); - $du = $var(prefered_route); + $(avp(ds_dst)[*]) = $null; - $(avp(tmp_ds_dst)[*]) = $null; - } else { - xlog("L_INFO", "$ci|log|associated media server $var(prefered_route) is inactive, moving to $rd\n"); - return -1; + $var(i) = 0; + while($(avp(tmp_ds_dst)[$var(i)]) != $null) { + $avp(ds_dst) = $(avp(tmp_ds_dst)[$var(i)]); + $var(i) = $var(i) + 1; } - return 1; + $avp(ds_dst) = $var(prefered_route); + $du = $var(prefered_route); + + $(avp(tmp_ds_dst)[*]) = $null; + + return 1; } route[DISPATCHER_NEXT_ROUTE] { - $var(failover_count) = $sht(failover=>$ci::counts); - - if ($sht(failover=>$ci::counts) == $null) { - $var(i) = 0; - while($(avp(ds_dst)[$var(i)]) != $null) { - $sht(failover=>$ci[$var(i)]) = $(avp(ds_dst)[$var(i)]); - $var(i) = $var(i) + 1; - if ($var(i) >= 3) { - break; - } - } - $sht(failover=>$ci::counts) = $var(i); - $var(failover_count) = $var(i); - } + if($avp(ds_retries) >= $sel(cfg_get.kazoo.dispatcher_max_retries)) return; - # try to find a new media server to send the call to - if ($var(failover_count) > 1) { - $var(failover_count) = $var(failover_count) - 1; + $avp(ds_retries) = $avp(ds_retries) + 1; + $var(remaining) = $(sel(cfg_get.kazoo.dispatcher_max_retries){s.int}) - $avp(ds_retries); - $du = $sht(failover=>$ci[$var(failover_count)]); - $sht(failover=>$ci::counts) = $var(failover_count); - $sht(failover=>$ci::current) = $du; + if(ds_next_dst()) { - xlog("L_INFO", "$ci|log|remaining failed retry attempts: $var(failover_count)\n"); + xlog("L_INFO", "$ci|log|remaining failed retry attempts: $var(remaining)\n"); xlog("L_INFO", "$ci|log|routing call to next media server $du\n"); setflag(FLAG_SKIP_NAT_CORRECTION); @@ -260,7 +249,7 @@ route[DISPATCHER_CHECK_MEDIA_SERVER] $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)); + $var(attrs) = $_s(zone=$var(Zone);profile=$var(MediaProfile);duid=$(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) { @@ -272,6 +261,7 @@ route[DISPATCHER_CHECK_MEDIA_SERVER] if($var(MediaIP) != "" && $var(MediaIP) != $(var(MediaUrl){uri.host})) { $var(MediaUrlBack) = $var(MediaUrl); $var(MediaUrl) = $_s($(var(MediaUrlBack){uri.scheme}):$var(MediaIP):$(var(MediaUrlBack){uri.port})); + $var(attrs) = $_s(zone=$var(Zone);profile=$var(MediaProfile);duid=$(var(MediaUrl){s.corehash, MEDIA_SERVERS_HASH_SIZE});node=$var(MediaName)); $var(SetId) = $sel(cfg_get.kazoo.dispatcher_add_secondary_ip_group); sql_query("exec", "KZQ_CHECK_MEDIA_SERVER_INSERT"); if($sqlrows(exec) > 0) { diff --git a/kamailio/dispatcher-role-5.2.cfg b/kamailio/dispatcher-role-5.2.cfg index 6871ffb..80286c6 100644 --- a/kamailio/dispatcher-role-5.2.cfg +++ b/kamailio/dispatcher-role-5.2.cfg @@ -1,10 +1,12 @@ -######## Generic Hash Table container in shared memory ######## -modparam("htable", "htable", "failover=>size=16;autoexpire=120") +### DISPATCHER ROLE #### #!trydef KZ_DISPATCHER_PROBE_MODE 1 #!trydef DISPATCHER_ADD_SERVERS 1 +#!trydef DISPATCHER_ADD_SECONDARY_IP 1 +#!trydef DISPATCHER_SECONDARY_IP_GROUP 3 #!trydef DISPATCHER_ALG 0 -#!trydef KZ_DISPATCHER_ADD_FLAGS 10 +#!trydef KZ_DISPATCHER_HASH_SIZE 8 +#!trydef KZ_DISPATCHER_ADD_FLAGS 9 #!trydef KZ_DISPATCHER_PRIMARY_GROUP 1 #!trydef KZ_DISPATCHER_SECONDARY_GROUP 2 #!trydef KZ_DISPATCHER_CLASSIFY_GROUP 3 @@ -16,15 +18,21 @@ modparam("htable", "htable", "failover=>size=16;autoexpire=120") #!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 +#!trydef KZ_DISPATCHER_MAX_RETRIES 2 +#!trydef KZ_DISPATCHER_ROUTE_ASSOCIATED_MEDIA 1 +#!trydef KZ_DISPATCHER_CLASSIFY_FLAGS 2 +#!trydef KZ_DISPATCHER_PRINT_ROUTES 1 kazoo.dispatcher_auto_add = DISPATCHER_ADD_SERVERS descr "adds media servers reported by ecallmgr" +kazoo.dispatcher_add_secondary_ip = DISPATCHER_ADD_SECONDARY_IP descr "adds internal ip from media servers reported by ecallmgr" +kazoo.dispatcher_add_secondary_ip_group = DISPATCHER_SECONDARY_IP_GROUP descr "sets the group where to add internal ip from 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" +kazoo.dispatcher_route_to_associated_media = KZ_DISPATCHER_ROUTE_ASSOCIATED_MEDIA descr "routes to associated media for atxfer" +kazoo.dispatcher_classify_flags = KZ_DISPATCHER_CLASSIFY_FLAGS descr "dispatch classifier flags" +kazoo.dispatcher_print_routes = KZ_DISPATCHER_PRINT_ROUTES descr "should we log the selected routes" ####### Dispatcher module ######## @@ -35,20 +43,16 @@ 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", "attrs_pvname", "$var(attrs)") 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") +modparam("dispatcher", "ds_hash_size", KZ_DISPATCHER_HASH_SIZE) #!import_file "dispatcher-network-params.cfg" @@ -70,23 +74,24 @@ route[DISPATCHER_CLASSIFY_SOURCE] 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"); + $var(classify_dispatcher_flag) = $(sel(cfg_get.kazoo.dispatcher_classify_flags){s.int}); + if (ds_is_from_list(KZ_DISPATCHER_PRIMARY_GROUP, "$var(classify_dispatcher_flag)") || + ds_is_from_list(KZ_DISPATCHER_SECONDARY_GROUP, "$var(classify_dispatcher_flag)") || + ds_is_from_list(KZ_DISPATCHER_CLASSIFY_GROUP, "$var(classify_dispatcher_flag)") || + ds_is_from_list(KZ_DISPATCHER_ALTNET1_PRIMARY_GROUP, "$var(classify_dispatcher_flag)") || + ds_is_from_list(KZ_DISPATCHER_ALTNET1_SECONDARY_GROUP, "$var(classify_dispatcher_flag)") || + ds_is_from_list(KZ_DISPATCHER_ALTNET2_PRIMARY_GROUP, "$var(classify_dispatcher_flag)") || + ds_is_from_list(KZ_DISPATCHER_ALTNET2_SECONDARY_GROUP, "$var(classify_dispatcher_flag)") || + ds_is_from_list(KZ_DISPATCHER_PRESENCE_PRIMARY_GROUP, "$var(classify_dispatcher_flag)") || + ds_is_from_list(KZ_DISPATCHER_PRESENCE_SECONDARY_GROUP, "$var(classify_dispatcher_flag)") || + ds_is_from_list(KZ_DISPATCHER_REGISTRAR_PRIMARY_GROUP, "$var(classify_dispatcher_flag)") || + ds_is_from_list(KZ_DISPATCHER_REGISTRAR_SECONDARY_GROUP, "$var(classify_dispatcher_flag)")) { + 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"); + } } } @@ -94,13 +99,9 @@ route[DISPATCHER_CLASSIFY_SOURCE] # 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); + $var(ds_primary_group) = $(sel(cfg_get.kazoo.dispatcher_primary_group){s.int}); + $var(ds_backup_group) = $(sel(cfg_get.kazoo.dispatcher_secondary_group){s.int}); #!ifndef PRESENCE_ROLE if (is_method("SUBSCRIBE")) { @@ -125,7 +126,11 @@ route[DISPATCHER_FIND_ROUTES] $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)); + if(ds_list_exists("$var(ds_backup_group)")) { + $var(ds_rule) = $_s($var(ds_primary_group)=$var(ds_alg);$var(ds_backup_group)=$var(ds_alg)); + } else { + $var(ds_rule) = $_s($var(ds_primary_group)=$var(ds_alg)); + } ds_select_routes("$var(ds_rule)", "2"); if ($xavp(ds_ctx=>cnt) == 0) { @@ -141,22 +146,20 @@ route[DISPATCHER_FIND_ROUTES] + @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)) { + xlog("L_INFO", "$ci|route|found redirect for $var(redirect)\n"); + if (route(DISPATCHER_PREFERRED_ROUTE)) { $avp(AVP_REDIRECT_KEY) = $var(redirect); - xlog("L_INFO", "$ci|log|REORDER OK $var(redirect)\n"); + xlog("L_INFO", "$ci|route|REORDER OK $var(redirect)\n"); } else { - xlog("L_INFO", "$ci|log|REORDER KO $var(redirect)\n"); + xlog("L_INFO", "$ci|route|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"); + if($sel(cfg_get.kazoo.dispatcher_route_to_associated_media) == 1) { + $var(prefered_route) = $sht(associations=>$var(user_source)); + xlog("L_INFO", "$ci|route|found association for contact uri $var(user_source)\n"); + route(DISPATCHER_PREFERRED_ROUTE); } + $sht(associations=>$var(user_source)) = $null; } $avp(ds_group) = $xavp(ds_dst=>grp); @@ -165,26 +168,30 @@ route[DISPATCHER_FIND_ROUTES] } -route[DISPATCHER_REORDER_ROUTES] +route[DISPATCHER_PREFERRED_ROUTE] { + if(!ds_is_from_list(-1, 6, "$var(prefered_route)")) { + xlog("L_INFO", "$ci|log|associated media server $var(prefered_route) is inactive, moving to $xavp(ds_dst=>uri)\n"); + return -1; + } + + xlog("L_INFO", "$ci|log|re-ordering the dispatcher list to maintain association with $var(prefered_route)\n"); + $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; + xlog("L_INFO", "$ci|route|removing preferred route $xavp(ds_dst[$var(i)]=>uri) from list\n"); + $xavp(ds_dst[$var(i)]=>*) = $null; } $var(i) = $var(i) + 1; } - return -1; -} + + $xavp(ds_dst=>uri) = $var(prefered_route); + $xavp(ds_dst[0]=>grp) = $var(setid); + $xavp(ds_dst[0]=>attrs) = $var(attrs); + + return 1; +} route[PRINT_ROUTES] { @@ -223,32 +230,49 @@ route[DISPATCHER_NEXT_ROUTE] event_route[dispatcher:dst-down] { - xlog("L_WARNING", "Destination down: $ru\n"); + xlog("L_WARNING", "Destination down: $ru , $xavp(ds_dst=>uri), $xavp(ds_dst=>grp), $xavp(ds_dst=>attrs)\n"); } event_route[dispatcher:dst-up] { - xlog("L_WARNING", "Destination up: $ru\n"); + xlog("L_WARNING", "Destination up: $ru , $xavp(ds_dst=>uri), $xavp(ds_dst=>grp), $xavp(ds_dst=>attrs)\n"); } route[DISPATCHER_CHECK_MEDIA_SERVER] { + $var(check_media_server_ret) = 0; 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)); + $var(attrs) = $_s(zone=$var(Zone);profile=$var(MediaProfile);duid=$(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; + $var(check_media_server_ret) = 1; + } + + if($sel(cfg_get.kazoo.dispatcher_add_secondary_ip) == 1) { + if($var(MediaIP) != "" && $var(MediaIP) != $(var(MediaUrl){uri.host})) { + $var(MediaUrlBack) = $var(MediaUrl); + $var(MediaUrl) = $_s($(var(MediaUrlBack){uri.scheme}):$var(MediaIP):$(var(MediaUrlBack){uri.port})); + $var(attrs) = $_s(zone=$var(Zone);profile=$var(MediaProfile);duid=$(var(MediaUrl){s.corehash, MEDIA_SERVERS_HASH_SIZE});node=$var(MediaName)); + $var(SetId) = $sel(cfg_get.kazoo.dispatcher_add_secondary_ip_group); + sql_query("exec", "KZQ_CHECK_MEDIA_SERVER_INSERT"); + if($sqlrows(exec) > 0) { + $shv(dispatcher_reload) = 1; + $var(check_media_server_ret) = 1; + } + $var(MediaUrl) = $var(MediaUrlBack); + } } + } - return 0; + return $var(check_media_server_ret); } route[DISPATCHER_RELOAD]