From e9358c62994b55fbd9972f35d31e9354b637b92c Mon Sep 17 00:00:00 2001 From: lazedo Date: Thu, 9 Apr 2020 10:55:01 +0000 Subject: [PATCH] support custom dispatcher roles --- kamailio/default.cfg | 1 + kamailio/dispatcher-role-5.2.cfg | 66 +++++++++++++++++++------------- 2 files changed, 40 insertions(+), 27 deletions(-) diff --git a/kamailio/default.cfg b/kamailio/default.cfg index 1b13250..cb9db8e 100644 --- a/kamailio/default.cfg +++ b/kamailio/default.cfg @@ -14,6 +14,7 @@ #!trydef FLT_NATS 11 #!trydef FLAG_LOCAL_REQUEST 12 #!trydef FLAG_LOCAL_ROUTE 17 +#!trydef FLAG_NETWORK_CLASSIFIED 18 ####### Global Parameters ######### fork = yes diff --git a/kamailio/dispatcher-role-5.2.cfg b/kamailio/dispatcher-role-5.2.cfg index 58a1064..997779d 100644 --- a/kamailio/dispatcher-role-5.2.cfg +++ b/kamailio/dispatcher-role-5.2.cfg @@ -54,8 +54,6 @@ 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" - ## Dispatcher Groups: ## 1 - Primary media servers ## 2 - Backup media servers @@ -70,28 +68,30 @@ 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 { - $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"); - } + route_if_exists("DISPATCHER_CUSTOM_NETWORK_CLASSIFY"); + + if (!isflagset(FLAG_NETWORK_CLASSIFIED)) { + if (is_myself("$ou")) { + xlog("$var(log_request_level)", "$ci|log|original R-URI ($ou) is this proxy, treating as external sources\n"); + } else { + $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"); + } + } } } @@ -121,7 +121,7 @@ route[DISPATCHER_FIND_ROUTES] route(PRESENCE_FAST_PICKUP_ATTEMPT); #!endif - #!import_file "dispatcher-network-find.cfg" + route_if_exists("DISPATCHER_CUSTOM_SET_GROUPS"); $var(ds_group) = $var(ds_primary_group); @@ -142,7 +142,18 @@ route[DISPATCHER_FIND_ROUTES] route(PRINT_ROUTES); $var(user_source) = $(ct{tobody.user}) + "@" + $si + ":" + $sp; - if ($sht(associations=>$var(user_source)) != $null) { + $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|route|found redirect for $var(redirect)\n"); + if (route(DISPATCHER_PREFERRED_ROUTE)) { + $avp(AVP_REDIRECT_KEY) = $var(redirect); + xlog("L_INFO", "$ci|route|REORDER OK $var(redirect)\n"); + } else { + xlog("L_INFO", "$ci|route|REORDER KO $var(redirect)\n"); + } + } else if ($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"); @@ -238,7 +249,7 @@ route[DISPATCHER_CHECK_MEDIA_SERVER] } $var(flags) = KZ_DISPATCHER_ADD_FLAGS; $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" + route_if_exists("DISPATCHER_CUSTOM_MEDIA_CHECK"); sql_query("exec", "KZQ_CHECK_MEDIA_SERVER_INSERT"); if($sqlrows(exec) > 0) { $shv(dispatcher_reload) = 1; @@ -251,6 +262,7 @@ route[DISPATCHER_CHECK_MEDIA_SERVER] $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); + route_if_exists("DISPATCHER_CUSTOM_MEDIA_CHECK"); sql_query("exec", "KZQ_CHECK_MEDIA_SERVER_INSERT"); if($sqlrows(exec) > 0) { $shv(dispatcher_reload) = 1;