Browse Source

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 39b6d0578e)
4.3
lazedo 6 years ago
parent
commit
9a8d560bea
3 changed files with 168 additions and 154 deletions
  1. +1
    -1
      kamailio/db_scripts/vw_wdispatcher.sql
  2. +79
    -89
      kamailio/dispatcher-role-5.1.cfg
  3. +88
    -64
      kamailio/dispatcher-role-5.2.cfg

+ 1
- 1
kamailio/db_scripts/vw_wdispatcher.sql View File

@ -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

+ 79
- 89
kamailio/dispatcher-role-5.1.cfg View File

@ -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) {


+ 88
- 64
kamailio/dispatcher-role-5.2.cfg View File

@ -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]


Loading…
Cancel
Save