Compare commits

...

45 Commits
master ... 5.0

Author SHA1 Message Date
  Luis Azedo b01055b90f KAM-10 ignore OPTIONS method 5 years ago
  Luis Azedo ecc3fe1a66 internal auth & authorization 5 years ago
  lazedo 758e4860e8
add bind-utils & remove sudo 5 years ago
  Luis Azedo 465847bd9e give internal proto own lb definition 5 years ago
  Luis Azedo 2d72687a33 handle proxy proto with defaults & pusher wildcards 5 years ago
  Luis Azedo fe91266c83 add alternatives to WITHOUT_DEFAULT_LISTENER 5 years ago
  Luis Azedo 990245d753 relocating some parts 5 years ago
  Luis Azedo 9c7c14bf86 update db scripts files mode 5 years ago
  Luis Azedo cc0759e975 update db scripts 5 years ago
  lazedo 1563c0642c update routes & configuration (#146) 5 years ago
  Luis Azedo 042c78cb36 add options to trusted 5 years ago
  Luis Azedo 4683771c31 add missing KZQ_REGISTRAR_FLUSH db query definition 5 years ago
  Luis Azedo e7127f421d add AOR to registrar detail 5 years ago
  Luis Azedo e08373b4d8 fix bindings 5 years ago
  Luis Azedo ba4924fe6f handle flush for realm 5 years ago
  bitbashing 48939f92c9 when using fs_path FS sets it as a route header and if not removed breaks upstream elements (#144) 5 years ago
  bitbashing 0499dc21c5 if the check response fails due to the nonce re-challenge (#143) 5 years ago
  bitbashing a5f5f1cbd8 make the log prefix consistent (#140) 5 years ago
  lazedo b1a49c7a11 Update authorization.cfg 5 years ago
  bitbashing 7d4380b2f6 Adding a new AMQP registrar search API 5 years ago
  lazedo 8792663db2 check for media servers reconnection 5 years ago
  lazedo 63cad64552 check ice in sdp for requests 5 years ago
  lazedo b93ae77fe9 check ice in sdp 5 years ago
  lazedo 69c2f03ddd remove unused code 5 years ago
  lazedo b53a55eafe use authorization variables for amqp payload 5 years ago
  lazedo eb74f7ef34 fix bindings 5 years ago
  lazedo 27db9c359e increase default slots 5 years ago
  lazedo 919fdd07c6 handle route invite format 5 years ago
  lazedo 33bd812fb8 handle_ruri_alias for internal in-dialog 5 years ago
  lazedo 17c814d7fe remove route headers from external initial requests 5 years ago
  lazedo 742dd379a6 add extension points for websockets role 5 years ago
  lazedo b4e825cc18 always set contact alias on a reply 5 years ago
  lazedo 4de76993b2 use send_reply instead of sl_send_reply 6 years ago
  lazedo 4d27eb18d4 configurable 480 reply from media with session in progress 6 years ago
  Daniel Finke 5318e81807 [5.0] Don't overwrite tcp_children for local listener 6 years ago
  lazedo 25d176d3ef override 480 if call is progress 6 years ago
  lazedo 93e7781da8 add extension point for internal to external relay 6 years ago
  lazedo 3b31aae2f9 add internal listener socket to dispatcher 6 years ago
  lazedo d32a40ce85 use $vn for password 6 years ago
  lazedo 5d19e5d966 add flag for registered user 6 years ago
  lazedo ae37b17890 add debug messages to nat traversal 6 years ago
  lazedo 80a2120058 no need to check authz on initial request route 6 years ago
  lazedo 4b1280178b use send_reply instead of sl_send_reply 6 years ago
  lazedo 8778ea679c fix authorized xavp after amqp reply 6 years ago
  lazedo ddaf36d91c 5.0 branch 6 years ago
40 changed files with 1501 additions and 924 deletions
Split View
  1. +3
    -3
      .shipyard.yml
  2. +36
    -36
      kamailio/acl-role.cfg
  3. +6
    -4
      kamailio/antiflood-role.cfg
  4. +93
    -68
      kamailio/authorization.cfg
  5. +5
    -0
      kamailio/db_queries_kazoo.cfg
  6. +2
    -0
      kamailio/db_queries_mysql.cfg
  7. +2
    -0
      kamailio/db_queries_postgres.cfg
  8. +17
    -3
      kamailio/db_scripts/check-kazoodb-sql.sh
  9. +1
    -1
      kamailio/db_scripts/create-kazoodb-sql.sh
  10. +3
    -2
      kamailio/db_scripts/db_kazoo-specific
  11. +1
    -1
      kamailio/db_scripts/kazoodb-sql.sh
  12. +43
    -21
      kamailio/default-listeners.cfg
  13. +168
    -82
      kamailio/default.cfg
  14. +19
    -11
      kamailio/defs.cfg
  15. +22
    -15
      kamailio/dispatcher-role-5.3.cfg
  16. +36
    -25
      kamailio/dispatcher-role-5.4.cfg
  17. +5
    -0
      kamailio/globals.cfg
  18. +33
    -0
      kamailio/http.cfg
  19. +6
    -2
      kamailio/kamailio.cfg
  20. +17
    -39
      kamailio/kazoo-bindings.cfg
  21. +88
    -47
      kamailio/listener-defs.cfg
  22. +7
    -7
      kamailio/message-role.cfg
  23. +43
    -24
      kamailio/nat-traversal-role.cfg
  24. +45
    -33
      kamailio/nodes-role.cfg
  25. +25
    -30
      kamailio/presence-fast-pickup.cfg
  26. +29
    -28
      kamailio/presence-notify.cfg
  27. +7
    -7
      kamailio/presence-query.cfg
  28. +39
    -19
      kamailio/presence-reset.cfg
  29. +55
    -66
      kamailio/presence-role.cfg
  30. +19
    -0
      kamailio/prometheus.cfg
  31. +177
    -181
      kamailio/pusher-role.cfg
  32. +30
    -30
      kamailio/rate-limiter-role.cfg
  33. +82
    -0
      kamailio/registrar-query.cfg
  34. +166
    -76
      kamailio/registrar-role.cfg
  35. +4
    -4
      kamailio/registrar-sync-role.cfg
  36. +1
    -1
      kamailio/sanity.cfg
  37. +22
    -1
      kamailio/sip_trace_all-role.cfg
  38. +35
    -3
      kamailio/tls-role.cfg
  39. +38
    -26
      kamailio/trusted.cfg
  40. +71
    -28
      kamailio/websockets-role.cfg

+ 3
- 3
.shipyard.yml View File

@ -1,5 +1,5 @@
name: kazoo-configs-kamailio
base_branch: origin/master
base_branch: origin/5.0
base_core: null
template: spec.tmpl
package:
@ -20,7 +20,7 @@ package:
on FreeNode.
dist: .el7.centos
requires:
sudo: {}
bind-utils: {}
source: '%{_build_tar}'
prep: '%setup -q'
install: |
@ -80,4 +80,4 @@ metapackage:
name: meta-kazoo-kamailio
package: kazoo-configs-kamailio
type: required
branch: 'master'
branch: '5.0'

+ 36
- 36
kamailio/acl-role.cfg View File

@ -16,7 +16,7 @@ route[ACL_CHECK] {
# If packet came from platform or from 4 class MERA, do not check it
if (isflagset(FLAG_INTERNALLY_SOURCED) || isflagset(FLAG_TRUSTED_SOURCE) ) {
xlog("L_DEBUG", "$ci|ACL|Trusted source IP($si) ignoring\n");
xlog("L_DEBUG", "$ci|acl|Trusted source IP($si) ignoring\n");
return;
}
@ -29,7 +29,7 @@ route[ACL_CHECK] {
# FIX for BYE method with IP instead of REALM in From, take REALM from To header
if ($fd =~ IP_REGEX) {
xlog("L_WARNING","$ci|ACL-realm|Fix for $var(sip-packet) with IP in from URI: use to-domain\n");
xlog("L_WARNING","$ci|acl|Fix for $var(sip-packet) with IP in from URI: use to-domain\n");
$var(realm) = $td;
} else {
$var(realm) = $fd;
@ -43,18 +43,18 @@ route[ACL_CHECK] {
if ($var(realm-decision) == -1) { # we do not have cached decision
$var(acl-realm-request) = "true";
} else if ($var(realm-decision) == 1 ){ # We have cached decision, let's use it
xlog("L_INFO", "$ci|ACL|$var(sip-packet) from $si is permitted by ACL for $var(realm)\n");
xlog("L_INFO", "$ci|acl|$var(sip-packet) from $si is permitted by ACL for $var(realm)\n");
} else {
if (!isflagset(FLAG_IS_REPLY)) {
sl_send_reply(ACL_CODE_DENY, ACL_MESSAGE_DENY);
}
xlog("L_INFO", "$ci|ACL|$var(sip-packet) from $si is rejected by ACL for $var(realm)\n");
xlog("L_INFO", "$ci|acl|$var(sip-packet) from $si is rejected by ACL for $var(realm)\n");
exit;
}
if (not_empty("$fU")) {
if ($fd =~ IP_REGEX) {
xlog("L_WARNING","$ci|ACL-device|Fix for $var(sip-packet) with IP in from URI: use to-domain\n");
xlog("L_WARNING","$ci|acl|Fix for $var(sip-packet) with IP in from URI: use to-domain\n");
$var(device) = $fU + "@" + $td;
} else {
$var(device) = $fU + "@" + $fd;
@ -64,12 +64,12 @@ route[ACL_CHECK] {
if ($var(device-decision) == -1) { # we do not have cached decision
$var(acl-device-request) = "true";
} else if ($var(device-decision) == 1 ){ # We have cached decision, let's use it
xlog("L_INFO", "$ci|ACL|$var(sip-packet) from $si is permitted by ACL for $var(device)\n");
xlog("L_INFO", "$ci|acl|$var(sip-packet) from $si is permitted by ACL for $var(device)\n");
} else {
if (!isflagset(FLAG_IS_REPLY)) {
sl_send_reply(ACL_CODE_DENY, ACL_MESSAGE_DENY);
}
xlog("L_INFO", "$ci|ACL|$var(sip-packet) from $si is rejected by ACL for $var(device)\n");
xlog("L_INFO", "$ci|acl|$var(sip-packet) from $si is rejected by ACL for $var(device)\n");
exit;
}
}
@ -80,10 +80,10 @@ route[ACL_CHECK] {
$var(query) = "{'Event-Category': 'acl', 'Event-Name': 'query', 'Entity': '" + $var(device) + "', 'With-Realm': " + $var(acl-realm-request) + "}";
else
$var(query) = "{'Event-Category': 'acl', 'Event-Name': 'query', 'Entity': '" + $var(realm) + "'}";
xlog("L_DBG", "$ci|ACL log|Query: $var(query)\n");
xlog("L_DBG", "$ci|acl|Query: $var(query)\n");
sl_send_reply("100", "Attempting K query");
if (kazoo_query("frontier", "sbc_config", $var(query), "$var(acl-response)")) {
xlog("L_DBG", "$ci|ACL log|Response: $var(acl-response)\n");
xlog("L_DBG", "$ci|acl|Response: $var(acl-response)\n");
kazoo_json($var(acl-response), "Realm.Order", "$var(acl-realm-order)");
kazoo_json($var(acl-response), "Realm.CIDR", "$var(acl-realm-cidr)");
@ -92,9 +92,9 @@ route[ACL_CHECK] {
kazoo_json($var(acl-response), "Device.User-Agent", "$var(acl-device-ua)");
} else {
xlog("L_ERROR","$ci|ACL log|DB is unreachable\n");
xlog("L_ERROR","$ci|acl|DB is unreachable\n");
$sht(acl=>$var(device)/$si) = 1;
xlog("L_INFO", "$ci|ACL|$var(sip-packet) from $si is permitted by ACL for $var(device)\n");
xlog("L_INFO", "$ci|acl|$var(sip-packet) from $si is permitted by ACL for $var(device)\n");
return;
}
@ -115,9 +115,9 @@ route[ACL_CHECK_REALM] {
route(ACL_CHECK_REALM_DENY);
}
} else {
xlog("L_INFO","$ci|ACL-realm|undefined Order in response for $var(realm)\n");
xlog("L_INFO","$ci|acl|undefined Order in response for $var(realm)\n");
$sht(acl=>$var(realm)/$si) = 1;
xlog("L_INFO", "$ci|ACL|$var(sip-packet) from $si is permitted by ACL for $var(realm)\n");
xlog("L_INFO", "$ci|acl|$var(sip-packet) from $si is permitted by ACL for $var(realm)\n");
}
}
@ -126,24 +126,24 @@ route[ACL_CHECK_REALM_ALLOW] {
$var(i) = 0;
kazoo_json($var(acl-response), "Realm.CIDR[$var(i)]", "$var(record)");;
while(not_empty("$var(record)")) {
xlog("L_INFO", "$ci|ACL-realm|checking if $si is in $var(record)\n");
xlog("L_INFO", "$ci|acl|checking if $si is in $var(record)\n");
if (($var(record) == ACL_IP_ADDR_ANY) || is_in_subnet("$si", $var(record))) {
$sht(acl=>$var(realm)/$si) = 1;
xlog("L_INFO", "$ci|ACL|$var(sip-packet) from $si is permitted by ACL for $var(realm)\n");
xlog("L_INFO", "$ci|acl|$var(sip-packet) from $si is permitted by ACL for $var(realm)\n");
return;
}
$var(i) = $var(i) + 1;
kazoo_json($var(acl-response), "Realm.CIDR[$var(i)]", "$var(record)");;
}
} else {
xlog("L_INFO", "$ci|ACL-realm|undefined CIDR in response for $var(realm)\n");
xlog("L_INFO", "$ci|acl|undefined CIDR in response for $var(realm)\n");
}
# Remember in CACHE and DENY
$sht(acl=>$var(realm)/$si) = 0;
if (!isflagset(FLAG_IS_REPLY)) {
sl_send_reply(ACL_CODE_DENY, ACL_MESSAGE_DENY);
}
xlog("L_INFO", "$ci|ACL|$var(sip-packet) from $si is rejected by ACL for $var(realm)\n");
xlog("L_INFO", "$ci|acl|$var(sip-packet) from $si is rejected by ACL for $var(realm)\n");
exit;
}
@ -153,24 +153,24 @@ route[ACL_CHECK_REALM_DENY] {
$var(i) = 0;
kazoo_json($var(acl-response), "Realm.CIDR[$var(i)]", "$var(record)");;
while(not_empty("$var(record)")) {
xlog("L_INFO", "$ci|ACL-realm|checking if $si is in $var(record)\n");
xlog("L_INFO", "$ci|acl|checking if $si is in $var(record)\n");
if (($var(record) == ACL_IP_ADDR_ANY) || is_in_subnet("$si", $var(record))) {
$sht(acl=>$var(realm)/$si) = 0;
if (!isflagset(FLAG_IS_REPLY)) {
sl_send_reply(ACL_CODE_DENY, ACL_MESSAGE_DENY);
}
xlog("L_INFO", "$ci|ACL|$var(sip-packet) from $si is rejected by ACL for $var(realm)\n");
xlog("L_INFO", "$ci|acl|$var(sip-packet) from $si is rejected by ACL for $var(realm)\n");
exit;
}
$var(i) = $var(i) + 1;
kazoo_json($var(acl-response), "Realm.CIDR[$var(i)]", "$var(record)");;
}
} else {
xlog("L_INFO", "$ci|ACL-realm|undefined CIDR in response for $var(realm)\n");
xlog("L_INFO", "$ci|acl|undefined CIDR in response for $var(realm)\n");
}
# Remember in CACHE and ALLOW
$sht(acl=>$var(realm)/$si) = 1;
xlog("L_INFO", "$ci|ACL|$var(sip-packet) from $si is permitted by ACL for $var(realm)\n");
xlog("L_INFO", "$ci|acl|$var(sip-packet) from $si is permitted by ACL for $var(realm)\n");
return;
}
@ -183,9 +183,9 @@ route[ACL_CHECK_DEVICE] {
route(ACL_CHECK_DEVICE_DENY);
}
} else {
xlog("L_INFO","$ci|ACL-device|undefined Order in response for $var(device)\n");
xlog("L_INFO","$ci|acl|undefined Order in response for $var(device)\n");
$sht(acl=>$var(device)/$si) = 1;
xlog("L_INFO", "$ci|ACL|$var(sip-packet) from $si is permitted by ACL for $var(device)\n");
xlog("L_INFO", "$ci|acl|$var(sip-packet) from $si is permitted by ACL for $var(device)\n");
}
}
@ -195,17 +195,17 @@ route[ACL_CHECK_DEVICE_ALLOW] {
$var(i) = 0;
kazoo_json($var(acl-response), "Device.CIDR[$var(i)]", "$var(record)");;
while(not_empty("$var(record)")) {
xlog("L_INFO", "$ci|ACL-realm|checking if $si is in $var(record)\n");
xlog("L_INFO", "$ci|acl|checking if $si is in $var(record)\n");
if (($var(record) == ACL_IP_ADDR_ANY) || is_in_subnet("$si", $var(record))) {
$sht(acl=>$var(device)/$si) = 1;
xlog("L_INFO", "$ci|ACL|$var(sip-packet) from $si is permitted by ACL for $var(device)\n");
xlog("L_INFO", "$ci|acl|$var(sip-packet) from $si is permitted by ACL for $var(device)\n");
return;
}
$var(i) = $var(i) + 1;
kazoo_json($var(acl-response), "Device.CIDR[$var(i)]", "$var(record)");;
}
} else {
xlog("L_INFO", "$ci|ACL-realm|undefined CIDR in response for $var(device)\n");
xlog("L_INFO", "$ci|acl|undefined CIDR in response for $var(device)\n");
}
}
# Remember in CACHE and DENY
@ -213,7 +213,7 @@ route[ACL_CHECK_DEVICE_ALLOW] {
if (!isflagset(FLAG_IS_REPLY)) {
sl_send_reply(ACL_CODE_DENY, ACL_MESSAGE_DENY);
}
xlog("L_INFO", "$ci|ACL|$var(sip-packet) from $si is rejected by ACL for $var(device)\n");
xlog("L_INFO", "$ci|acl|$var(sip-packet) from $si is rejected by ACL for $var(device)\n");
exit;
}
@ -223,7 +223,7 @@ route[ACL_CHECK_DEVICE_DENY] {
if (!isflagset(FLAG_IS_REPLY)) {
sl_send_reply(ACL_CODE_DENY, ACL_MESSAGE_DENY);
}
xlog("L_INFO", "$ci|ACL|$var(sip-packet) from $si is rejected by ACL for $var(device)\n");
xlog("L_INFO", "$ci|acl|$var(sip-packet) from $si is rejected by ACL for $var(device)\n");
exit;
}
@ -231,24 +231,24 @@ route[ACL_CHECK_DEVICE_DENY] {
$var(i) = 0;
kazoo_json($var(acl-response), "Device.CIDR[$var(i)]", "$var(record)");;
while(not_empty("$var(record)")) {
xlog("L_INFO", "$ci|ACL-device|checking if $si is in $var(record)\n");
xlog("L_INFO", "$ci|acl|checking if $si is in $var(record)\n");
if (($var(record) == ACL_IP_ADDR_ANY) || is_in_subnet("$si", $var(record))) {
$sht(acl=>$var(device)/$si) = 0;
if (!isflagset(FLAG_IS_REPLY)) {
sl_send_reply(ACL_CODE_DENY, ACL_MESSAGE_DENY);
}
xlog("L_INFO", "$ci|ACL|$var(sip-packet) from $si is rejected by ACL for $var(device)\n");
xlog("L_INFO", "$ci|acl|$var(sip-packet) from $si is rejected by ACL for $var(device)\n");
exit;
}
$var(i) = $var(i) + 1;
kazoo_json($var(acl-response), "Device.CIDR[$var(i)]", "$var(record)");;
}
} else {
xlog("L_INFO", "$ci|ACL-device|undefined CIDR in response for $var(device)\n");
xlog("L_INFO", "$ci|acl|undefined CIDR in response for $var(device)\n");
}
# Remember in CACHE and ALLOW
$sht(acl=>$var(device)/$si) = 1;
xlog("L_INFO", "$ci|ACL|$var(sip-packet) from $si is permitted by ACL for $var(device)\n");
xlog("L_INFO", "$ci|acl|$var(sip-packet) from $si is permitted by ACL for $var(device)\n");
return;
}
@ -256,18 +256,18 @@ event_route[kazoo:consumer-event-acl-acl-flush]
{
if( $(kzE{kz.json,Device}) != "" ) {
$var(device_regexp) = $(kzE{kz.json,Device}) + "@" + $(kzE{kz.json,Realm}) + "/.*" ;
xlog("L_INFO","|ACL-Flush| Flush ACL for Device. Regexp: $var(device_regexp)\n");
xlog("L_INFO","event|acl|Flush ACL for Device. Regexp: $var(device_regexp)\n");
sht_rm_name_re("acl=>$var(device_regexp)");
} else {
$var(realm_regexp) = "^" + $(kzE{kz.json,Realm}) + "/.*" ;
xlog("L_INFO","|ACL-Flush| Flush ACL for Realm. Regexp: $var(realm_regexp)\n");
xlog("L_INFO","event|acl|Flush ACL for Realm. Regexp: $var(realm_regexp)\n");
sht_rm_name_re("acl=>$var(realm_regexp)");
}
}
route[ACL_BINDINGS]
route[KZ_AMQP_BINDING_FRONTIERACL]
{
$var(payload) = $_s({"name": "acl-role", "exchange" : "frontier_acl" , "type" : "topic", "queue" : "FRONTIERACL-FLUSH-MY_HOSTNAME", "routing" : "flush" });
kazoo_subscribe("$var(payload)");
}
}

+ 6
- 4
kamailio/antiflood-role.cfg View File

@ -52,7 +52,7 @@ route[ANTIFLOOD_RATE_LIMIT]
xlog("L_WARN", "$ci|end|dropping request from $fu due to rate of requests with source $si:$sp\n");
drop();
} else {
xlog("L_WARN", "$ci|allowed|request from $fu exceeded rate of requests with source $si:$sp\n");
xlog("L_WARN", "$ci|antiflood|request from $fu exceeded rate of requests with source $si:$sp\n");
}
}
}
@ -65,6 +65,8 @@ route[ANTIFLOOD_AUTH_LIMIT]
return(1);
}
if (is_method("OPTIONS")) return(1);
$var(auth_key) = "";
if($sel(cfg_get.kazoo.antiflood_failed_auth_use_port) == 1) {
$var(auth_key) = $_s("$Au::$si::$sp");
@ -85,7 +87,7 @@ route[ANTIFLOOD_AUTH_LIMIT]
send_reply("403", "Forbidden");
exit;
} else {
xlog("L_NOTICE", "$ci|log|authorization failure limit $def(ANTIFLOOD_FAILED_AUTH_DENSITY) for $Au $si:$sp\n");
xlog("L_NOTICE", "$ci|antiflood|authorization failure limit $def(ANTIFLOOD_FAILED_AUTH_DENSITY) for $Au $si:$sp\n");
}
}
}
@ -121,7 +123,7 @@ route[ANITFLOOD_FAILED_AUTH]
$var(count) = $shtinc(antiflood=>$var(auth_key)::count);
$sht(antiflood=>$var(auth_key)::last) = $Ts;
xlog("L_INFO", "$ci|log|$var(count) errounous authorization response for $Au $si:$sp\n");
xlog("L_INFO", "$ci|antiflood|$var(count) errounous authorization response for $Au $si:$sp\n");
if ($var(count) >= ANTIFLOOD_FAILED_AUTH_DENSITY) {
$var(exp) = $Ts - ANTIFLOOD_FAILED_AUTH_WINDOW;
@ -136,5 +138,5 @@ route[ANITFLOOD_FAILED_AUTH]
event_route[htable:expired:antiflood]
{
xlog("L_NOTICE", "antiflood expired record $shtrecord(key) => $shtrecord(value)\n");
xlog("L_NOTICE", "event|antiflood|antiflood expired record $shtrecord(key) => $shtrecord(value)\n");
}

+ 93
- 68
kamailio/authorization.cfg View File

@ -13,65 +13,65 @@ modparam("statistics","variable", "auth:authn_unknown")
route[AUTHORIZATION]
{
if (isflagset(FLAG_INTERNALLY_SOURCED)) {
if (isflagset(FLAG_AUTHORIZED)) {
return;
}
}
if (isflagset(FLAG_AUTHORIZED)) {
if (isflagset(FLAG_INTERNALLY_SOURCED)) {
setflag(FLAG_AUTHORIZED);
return;
}
}
if (!is_method("INVITE|REFER|MESSAGE|NOTIFY|SUBSCRIBE|PUBLISH")) {
setflag(FLAG_AUTHORIZED);
setflag(FLAG_AUTHORIZED);
return;
}
}
routes("AUTHORIZATION_CHECK_");
route(AUTHORIZATION_CHECK);
if (has_totag()) {
setflag(FLAG_AUTHORIZED);
return;
}
if (!isflagset(FLAG_AUTHORIZED)) {
xlog("L_INFO", "$ci|auth|challenging $rm from $Au $si:$sp\n");
if (!isflagset(FLAG_AUTHORIZED)) {
xlog("L_INFO", "$ci|auth|challenging $rm from $Au $si:$sp\n");
$var(auth) = auth_challenge("$fd", "4");
update_stat("auth:challenge", "+1");
if($var(auth) != 1) {
xlog("L_ERROR", "$ci|register|error creating or sending challenge to $rm attempt for $fu from $si:$sp\n");
xlog("L_ERROR", "$ci|end|error creating or sending challenge to $rm attempt for $fu from $si:$sp\n");
send_reply("403", "Forbidden");
}
exit;
}
}
route[AUTHORIZATION_CHECK]
{
route(AUTHORIZATION_CHECK_TRUSTED);
route(AUTHORIZATION_CHECK_REGISTERED);
}
}
route[AUTHORIZATION_CHECK_TRUSTED]
{
if (isflagset(FLAG_AUTHORIZED)) return;
if (isflagset(FLAG_AUTHORIZED)) return;
if (isflagset(FLAG_TRUSTED_SOURCE)) {
route(SETUP_AUTH_ORIGIN);
route(SETUP_AUTH_TRUSTED);
setflag(FLAG_AUTHORIZED);
}
if (isflagset(FLAG_TRUSTED_SOURCE)) {
route(SETUP_AUTH_ORIGIN);
route(SETUP_AUTH_TRUSTED);
setflag(FLAG_AUTHORIZED);
}
}
route[AUTHORIZATION_CHECK_REGISTERED]
{
if (isflagset(FLAG_AUTHORIZED)) return;
if (isflagset(FLAG_AUTHORIZED)) return;
#!ifdef REGISTRAR_ROLE
#!ifdef REGISTRAR_ROLE
$xavp(regcfg=>match_received) = $su;
if (registered("location","sip:$Au", 2, 1) == 1) {
route(SETUP_AUTH_ORIGIN);
$xavp(hf[0]=>X-AUTH-Token) = $xavp(ulattrs=>token);
setflag(FLAG_AUTHORIZED);
xlog("L_INFO", "$ci|authz|authorized for registered device\n");
route(SETUP_AUTH_ORIGIN);
$xavp(hf[0]=>X-AUTH-Token) = $xavp(ulattrs=>token);
setflag(FLAG_AUTHORIZED);
setflag(FLAG_REGISTERED_ENDPOINT);
}
#!endif
#!endif
}
@ -79,19 +79,36 @@ route[AUTHORIZATION_CHECK_REGISTERED]
route[HANDLE_AUTHORIZATION]
{
if(!is_present_hf("Proxy-Authorization")) {
route(MAIN);
exit;
}
if (isflagset(FLAG_INTERNALLY_SOURCED)) {
route(MAIN);
exit;
}
if(!is_present_hf("Proxy-Authorization")) {
route(MAIN);
exit;
}
if (!is_method("INVITE|REFER|MESSAGE|NOTIFY|SUBSCRIBE|PUBLISH")) {
consume_credentials();
route(MAIN);
exit;
}
if (has_totag()) {
consume_credentials();
route(MAIN);
exit;
}
$var(amqp_payload_request) = $_s({"Event-Category" : "directory" , "Event-Name" : "authn_req", "Method" : "REGISTER", "Auth-Nonce" : "$adn", "Auth-Realm" : "$fd", "Auth-User" : "$fU", "From" : "$fu", "To" : "$tu", "Orig-IP" : "$si", "Orig-Port" : "$sp", "User-Agent" : "$(ua{s.escape.common}{s.replace,\','}{s.replace,$$,})", "Contact" : "$(ct{s.escape.common}{s.replace,\','}{s.replace,$$,})", "Call-ID" : "$ci" });
$var(amqp_payload_request) = $_s({"Event-Category" : "directory" , "Event-Name" : "authn_req", "Method" : "REGISTER", "Auth-Nonce" : "$adn", "Auth-Realm" : "$(ar{re.subst,/:[0-9]+$//g})", "Auth-User" : "$au", "From" : "$fu", "To" : "$tu", "Orig-IP" : "$si", "Orig-Port" : "$sp", "User-Agent" : "$(ua{s.escape.common}{s.replace,\','}{s.replace,$$,})", "Contact" : "$(ct{s.escape.common}{s.replace,\','}{s.replace,$$,})", "Call-ID" : "$ci" });
$var(amqp_routing_key) = $_s($def(REGISTRAR_AMQP_RK_PREFIX)$(fd{kz.encode}));
$avp(kz_timeout) = $sel(cfg_get.kazoo.registrar_query_timeout_ms);
$xavp(deltas=>query) = $(TV(Sn){s.replace,.,});
xlog("L_DEBUG", "$ci|amqp|publishing to $def(REGISTRAR_AMQP_EXCHANGE) => $var(amqp_routing_key) : $def(REGISTRAR_AMQP_FLAGS) : $var(amqp_payload_request)\n");
xlog("L_DEBUG", "$ci|auth|publishing to $def(REGISTRAR_AMQP_EXCHANGE) => $var(amqp_routing_key) : $def(REGISTRAR_AMQP_FLAGS) : $var(amqp_payload_request)\n");
if(kazoo_async_query("$def(REGISTRAR_AMQP_EXCHANGE)", $var(amqp_routing_key), $var(amqp_payload_request), "KZ_AUTHORIZATION_CHECK_REPLY", "KZ_AUTHORIZATION_CHECK_TIMEOUT", "$def(REGISTRAR_AMQP_FLAGS)") != 1) {
xlog("L_INFO", "$ci|log|failed to send registrar query for authentication credentials for $Au $si:$sp\n");
xlog("L_INFO", "$ci|auth|failed to send registrar query for authentication credentials for $Au $si:$sp\n");
update_stat("auth:amqp_async_error", "+1");
send_reply("403", "Forbidden");
exit;
@ -101,7 +118,7 @@ route[HANDLE_AUTHORIZATION]
failure_route[KZ_AUTHORIZATION_CHECK_TIMEOUT]
{
if($(kzR{kz.json,Event-Name}) == "message_returned" ) {
xlog("L_WARNING", "$ci|amqp|message was returned by broker $(kzR{kz.json,Error-Code}) $(kzR{kz.json,Error-Reason})\n");
xlog("L_WARNING", "$ci|auth|message was returned by broker $(kzR{kz.json,Error-Code}) $(kzR{kz.json,Error-Reason})\n");
update_stat("auth:amqp_returned", "+1");
} else {
xlog("L_WARNING", "$ci|end|failed $T_reply_code $T_reply_reason [$T(id_index):$T(id_label)] querying directory for authentication credentials for $Au $si:$sp\n");
@ -116,40 +133,50 @@ onreply_route[KZ_AUTHORIZATION_CHECK_REPLY]
$var(StartRoute) = $(TV(Sn){s.replace,.,});
$var(delta_to_start) = $var(StartRoute) - $(kzR{kz.json,AMQP-Received});
$var(delta_from_query) = $(kzR{kz.json,AMQP-Received}) - $xavp(deltas=>query);
xlog("L_INFO", "$ci|log|received $(kzR{kz.json,Event-Category}) $(kzR{kz.json,Event-Name}) reply from $(kzR{kz.json,App-Name})-$(kzR{kz.json,App-Version}) (Δ1 $(kzR{kz.json,AMQP-Elapsed-Micro}) μs , Δ2 $var(delta_to_start) μs, Δ3 $var(delta_from_query) μs)\n");
xlog("L_INFO", "$ci|auth|received $(kzR{kz.json,Event-Category}) $(kzR{kz.json,Event-Name}) reply from $(kzR{kz.json,App-Name})-$(kzR{kz.json,App-Version}) (Δ1 $(kzR{kz.json,AMQP-Elapsed-Micro}) μs , Δ2 $var(delta_to_start) μs, Δ3 $var(delta_from_query) μs)\n");
$var(password) = $(kzR{kz.json,Auth-Password});
if( $(kzR{kz.json,Event-Name}) == "authn_err" ) {
update_stat("auth:authn_err", "+1");
update_stat("auth:authn_err", "+1");
t_reply("403", "Forbidden");
exit;
} else if( $(kzR{kz.json,Event-Name}) == "authn_resp" ) {
update_stat("auth:authn_resp", "+1");
route(KZ_AUTHORIZATION_CHECK_RESPONSE);
} else {
update_stat("auth:authn_unknown", "+1");
xlog("L_INFO", "$ci|log|unhandle response from directory $Au via $(kzR{kz.json,App-Name})-$(kzR{kz.json,App-Version})\n");
t_reply("403", "Forbidden");
exit;
update_stat("auth:authn_unknown", "+1");
xlog("L_INFO", "$ci|auth|unhandle response from directory $Au via $(kzR{kz.json,App-Name})-$(kzR{kz.json,App-Version})\n");
t_reply("403", "Forbidden");
exit;
}
}
route[KZ_AUTHORIZATION_CHECK_RESPONSE]
{
if (!pv_auth_check("$fd", "$var(password)", "0", "0")) {
#!ifdef ANTIFLOOD_ROLE
route(ANITFLOOD_FAILED_AUTH);
#!endif
xlog("L_WARNING", "$ci|end|auth|$mbu\n");
send_reply("403", "Forbidden");
exit;
}
$var(retcode) = pv_auth_check("$fd", "$var(password)", "0", "0");
if (!$var(retcode)) {
xlog("L_WARNING", "$ci|end|auth failed $var(retcode)\n$mbu\n");
switch($var(retcode)) {
case -4:
case -5:
case -6:
xlog("L_INFO", "$ci|end|auth check failed due to nonce or missing creds, challenging\n");
auth_challenge("$fd", "1");
exit;
break;
default:
#!ifdef ANTIFLOOD_ROLE
route(ANITFLOOD_FAILED_AUTH);
#!endif
send_reply("403", "Forbidden");
exit;
}
}
consume_credentials();
route(SETUP_AUTH_ORIGIN);
$xavp(ulattrs=>custom_channel_vars) = $(kzR{kz.json,Custom-Channel-Vars});
$xavp(ulattrs[0]=>token) = $_s($(kzR{kz.json,Custom-Channel-Vars.Authorizing-ID})@$(kzR{kz.json,Custom-Channel-Vars.Account-ID}));
setflag(FLAG_AUTHORIZED);
$xavp(hf[0]=>X-AUTH-Token) = $_s($(kzR{kz.json,Custom-Channel-Vars.Authorizing-ID})@$(kzR{kz.json,Custom-Channel-Vars.Account-ID}));
setflag(FLAG_AUTHORIZED);
route(MAIN);
exit;
}
@ -157,31 +184,30 @@ route[KZ_AUTHORIZATION_CHECK_RESPONSE]
route[SETUP_AUTH_ORIGIN]
{
$xavp(hf=>X-AUTH-IP) = $si;
$xavp(hf=>X-AUTH-IP) = $si;
$xavp(hf[0]=>X-AUTH-PORT) = $sp;
}
route[SETUP_AUTH_AOR]
{
if ($avp(is_registered) == "true") return;
if ($avp(is_registered) == "true") return;
#!ifdef REGISTRAR_ROLE
#!ifdef REGISTRAR_ROLE
$xavp(regcfg=>match_received) = $su;
if (registered("location","sip:$Au", 2, 1) == 1) {
$avp(is_registered) = "true";
$avp(is_registered) = "true";
}
#!endif
}
route[SETUP_AUTH_TRUSTED]
{
if (isflagset(FLAG_TRUSTED_SOURCE)) {
$xavp(hf[0]=>X-AUTH-Token) = $avp(trusted_x_header);
$xavp(hf[0]=>X-AUTH-URI-User) = $rU;
if (isflagset(FLAG_TRUSTED_SOURCE)) {
$xavp(hf[0]=>X-AUTH-Token) = $avp(trusted_x_header);
$xavp(hf[0]=>X-AUTH-URI-User) = $rU;
$xavp(hf[0]=>X-AUTH-URI-Realm) = $rd;
if(is_present_hf("P-Asserted-Identity") && $(ai{uri.user}) != "") {
$xavp(hf[0]=>X-AUTH-From-User) = $(ai{uri.user});
$xavp(hf[0]=>X-AUTH-From-User) = $(ai{uri.user});
} else if(is_present_hf("P-Preferred-Identity") && $pU != "") {
$xavp(hf[0]=>X-AUTH-From-User) = $pU;
} else if(is_present_hf("Remote-Party-ID") && $(re{uri.user}) != "") {
@ -198,7 +224,6 @@ route[SETUP_AUTH_TRUSTED]
}
setflag(FLAG_AUTHORIZED);
}
}
route[AUTH_HEADERS_JSON]
@ -222,7 +247,7 @@ route[AUTH_HEADERS_JSON]
route[AUTH_HEADERS]
{
remove_hf_re("^X-");
route(REMOVE_RESERVED_HEADERS);
if (!is_method("INVITE|MESSAGE|REFER")) {
return;


+ 5
- 0
kamailio/db_queries_kazoo.cfg View File

@ -12,6 +12,9 @@
#!substdef "!KZQ_PRESENCE_SEARCH_SUMMARY!select * from active_watchers where to_domain = \"\$var(Domain)\"!g"
#!substdef "!KZQ_PRESENCE_SEARCH_DETAIL!select a.*, b.time, b.result, b.sent_msg, b.received_msg from active_watchers a left outer join active_watchers_log b on a.presentity_uri = b.presentity_uri and a.event = b.event and a.callid = b.callid where a.presentity_uri = \"\$var(presentity_uri)\" !g"
#!substdef "!KZQ_REGISTRAR_SEARCH_SUMMARY!select username,domain from location where domain = \"\$var(Domain)\"!g"
#!substdef "!KZQ_REGISTRAR_SEARCH_DETAIL!select * from location where domain = \"\$var(Domain)\"!g"
#!substdef "!KZQ_HAS_PRESENTITY!select count(*) as count from presentity where username = \"\$subs(to_user)\" and domain = \"\$subs(to_domain)\" and event = \"\$subs(event)\"!g"
#!substdef "!KZQ_REPLACE_WATCHERS_LOG!REPLACE INTO active_watchers_log (presentity_uri, watcher_username, watcher_domain, event, callid, to_user, to_domain, user_agent, time, result, sent_msg, received_msg) VALUES (\"\$subs(uri)\", \"\$subs(watcher_username)\", \"\$subs(watcher_domain)\", \"\$subs(event)\",\"\$subs(callid)\",\"\$subs(to_user)\",\"\$subs(to_domain)\", '\$(subs(user_agent){s.escape.common}{s.replace,\\\',''}{s.replace,\$\$,})', \$TS, \$notify_reply(\$rs), '\$(mb{s.escape.common}{s.replace,\\\',''}{s.replace,\$\$,})', '\$(notify_reply(\$mb){s.escape.common}{s.replace,\\\',''}{s.replace,\$\$,})')!g"
@ -25,3 +28,5 @@
#!substdef "!KZQ_RESET_PUBLISHER_ZONE_UPDATE!INSERT INTO tmp_probe select distinct a.event, a.presentity_uri, 0 from presentities a inner join wdispatcher c on a.sender = c.destination inner join active_watchers b on a.presentity_uri = b.presentity_uri and a.event = b.event where zone = \"\$var(Zone)\" and state in('early', 'confirmed', 'onthephone', 'busy', 'ringing')!g"
#!substdef "!KZQ_PRESENCE_ZONE_RESET!delete from presentity where id in(select a.id from presentities a join wdispatcher c on a.sender = c.destination where zone = \"\$var(Zone)\")!g"
#!substdef "!KZQ_REGISTRAR_FLUSH!select username || \"@\" || domain as aor, ruid from location where domain = \"\$var(Domain)\"!g"

+ 2
- 0
kamailio/db_queries_mysql.cfg View File

@ -11,5 +11,7 @@
#!substdef "!KZQ_RESET_PUBLISHER_UPDATE!update active_watchers set expires = \$TS where id in (select b.id from presentity a inner join active_watchers b on a.username = b.to_user and a.domain = b.to_domain and a.event = b.event where a.sender = \"\$var(MediaUrl)\")!g"
#!substdef "!KZQ_PRESENCE_SEARCH_DETAIL!select * from active_watchers_log where presentity_uri = \"\$var(presentity_uri)\"!g"
#!substdef "!KZQ_PRESENCE_SEARCH_SUMMARY!select * from active_watchers where watcher_domain = \"\$var(Domain)\"!g"
#!substdef "!KZQ_REGISTRAR_SEARCH_SUMMARY!select username,domain from location where domain = \"\$var(Domain)\"!g"
#!substdef "!KZQ_REGISTRAR_SEARCH_DETAIL!select * from location where domain = \"\$var(Domain)\"!g"
#!substdef "!KZQ_HAS_PRESENTITY!select count(*) as count from presentity where username = \"\$subs(to_user)\" and domain = \"\$subs(to_domain)\" and event = \"\$subs(event)\"!g"
#!substdef "!KZQ_PRESENCE_RESET!delete from presentity where sender = \"\$var(MediaUrl)\"!g"

+ 2
- 0
kamailio/db_queries_postgres.cfg View File

@ -11,4 +11,6 @@
#!substdef "!KZQ_RESET_PUBLISHER_UPDATE!update active_watchers set expires = \$TS where id in (select b.id from presentity a inner join active_watchers b on a.username = b.to_user and a.domain = b.to_domain and a.event = b.event where a.sender = '\$var(MediaUrl)')!g"
#!substdef "!KZQ_PRESENCE_SEARCH_DETAIL!select * from active_watchers_log where presentity_uri = '\$var(presentity_uri)'!g"
#!substdef "!KZQ_PRESENCE_SEARCH_SUMMARY!select * from active_watchers where watcher_domain = '\$var(Domain)'!g"
#!substdef "!KZQ_REGISTRAR_SEARCH_SUMMARY!select username,domain from location where domain = \"\$var(Domain)\"!g"
#!substdef "!KZQ_REGISTRAR_SEARCH_DETAIL!select * from location where domain = \"\$var(Domain)\"!g"
#!substdef "!KZQ_PRESENCE_RESET!delete from presentity where sender = '\$var(MediaUrl)'!g"

+ 17
- 3
kamailio/db_scripts/check-kazoodb-sql.sh View File

@ -1,8 +1,10 @@
#!/bin/sh
#!/bin/bash
TEMP_DB_LOCATION=/tmp/db
TEMP_DB=${TEMP_DB_LOCATION}/kazoo.db
DB_CURRENT_DB=${DB_LOCATION:-/etc/kazoo/kamailio}/kazoo.db
rm -rf ${TEMP_DB_LOCATION}
. $(dirname $0)/kazoodb-sql.sh --source-only
@ -11,11 +13,10 @@ sql_setup $file ${TEMP_DB_LOCATION}
DB_VERSION=`KazooDB -db ${TEMP_DB} "select sum(table_version) from version;"`
DB_CURRENT_DB=${DB_LOCATION:-/etc/kazoo/kamailio}/kazoo.db
DB_CURRENT_VERSION=`KazooDB -db ${DB_CURRENT_DB} "select sum(table_version) from version;"`
if [[ $DB_CURRENT_VERSION -ne $DB_VERSION ]]; then
if [[ "$DB_CURRENT_VERSION" -ne "$DB_VERSION" ]]; then
echo "db required version is ${DB_VERSION}, existing version is ${DB_CURRENT_VERSION}, applying diff"
KazooDB-diff --schema ${DB_CURRENT_DB} ${TEMP_DB} | KazooDB -db ${DB_CURRENT_DB}
KazooDB-diff --primarykey --table version ${DB_CURRENT_DB} ${TEMP_DB} | KazooDB -db ${DB_CURRENT_DB}
@ -44,3 +45,16 @@ fi
for INIT in `ls ${DB_SCRIPT_DIR}/db_init_*.sql`; do
KazooDB -db ${DB_CURRENT_DB} < $INIT
done
if [ -d ${DB_SCRIPT_DIR}/init.d ]; then
for INIT in `ls ${DB_SCRIPT_DIR}/init.d/*.sql`; do
KazooDB -db ${DB_CURRENT_DB} < $INIT
done
fi
if [ -d ${DB_SCRIPT_DIR}/sql.d ]; then
for INIT in `ls ${DB_SCRIPT_DIR}/sql.d/*.sql`; do
KazooDB -db ${DB_CURRENT_DB} < $INIT
done
fi

+ 1
- 1
kamailio/db_scripts/create-kazoodb-sql.sh View File

@ -1,4 +1,4 @@
#!/bin/sh -e
#!/bin/bash -e
. $(dirname $0)/kazoodb-sql.sh --source-only


+ 3
- 2
kamailio/db_scripts/db_kazoo-specific View File

@ -1,4 +1,4 @@
#!/bin/sh
#!/bin/bash
sql_db_pre_setup() {
cat << EOF
@ -13,7 +13,8 @@ EOF
}
sql_setup() {
DB_KAZOO_LOCATION=${2:-${DB_KAZOO_LOCATION:-/etc/kazoo/kamailio/db}}
DB_KAZOO_LOCATION=${2:-${DB_LOCATION:-/etc/kazoo/kamailio/db}}
echo "ensuring dir ${DB_KAZOO_LOCATION} exists"
mkdir -p ${DB_KAZOO_LOCATION}
KazooDB -db ${DB_KAZOO_LOCATION}/kazoo.db < $1 > /dev/null
}


+ 1
- 1
kamailio/db_scripts/kazoodb-sql.sh View File

@ -2,7 +2,7 @@
KAMAILIO_SHARE_DIR=${KAMAILIO_SHARE_DIR:-/usr/share/kamailio}
DB_ENGINE=${DB_ENGINE:-db_kazoo}
RESULTED_SQL=${RESULTED_SQL:-/tmp/kamailio_initdb.sql}
RESULTED_SQL=${RESULTED_SQL:-/tmp/$(cat /proc/sys/kernel/random/uuid).sql}
. $(dirname $0)/$DB_ENGINE-specific --source-only


+ 43
- 21
kamailio/default-listeners.cfg View File

@ -8,36 +8,58 @@
## what they are doing :)
#!ifndef WITHOUT_DEFAULT_LISTENER
listen=SIP_UDP_LISTENER
listen=SIP_TCP_LISTENER
listen=ALG_UDP_LISTENER
listen=ALG_TCP_LISTENER
listen=UDP_LISTENER_SIP
listen=TCP_LISTENER_SIP
listen=UDP_LISTENER_ALG
listen=TCP_LISTENER_ALG
#!else
#!ifdef WITH_TCP_LISTENERS
listen=TCP_LISTENER_SIP
listen=TCP_LISTENER_ALG
#!endif
#!ifdef WITH_UDP_LISTENERS
listen=UDP_LISTENER_SIP
listen=UDP_LISTENER_ALG
#!endif
#!endif
#!ifdef WITH_INTERNAL_LISTENER
listen=PORT_PROTO_INTERNAL_LISTENER
#!ifdef WITH_INTERNAL_LOAD_BALANCED_LISTENER
listen=PROTO_LB_LISTENER_INTERNAL
#!else
listen=PROTO_LISTENER_INTERNAL
#!endif
#!ifdef WITH_ADVERTISE_LISTENER
listen=SIP_UDP_ADVERTISED_LISTENER
listen=SIP_TCP_ADVERTISED_LISTENER
listen=ALG_UDP_ADVERTISED_LISTENER
listen=ALG_TCP_ADVERTISED_LISTENER
#!endif
#!ifdef WITH_EXTERNAL_LISTENER
listen=SIP_UDP_EXTERNAL_LISTENER
listen=SIP_TCP_EXTERNAL_LISTENER
listen=ALG_UDP_EXTERNAL_LISTENER
listen=ALG_TCP_EXTERNAL_LISTENER
listen=UDP_EXTERNAL_LISTENER_SIP
listen=TCP_EXTERNAL_LISTENER_SIP
listen=UDP_EXTERNAL_LISTENER_ALG
listen=TCP_EXTERNAL_LISTENER_ALG
#!else
#!ifdef WITH_EXTERNAL_SIP_LISTENER
listen=UDP_EXTERNAL_LISTENER_SIP
listen=TCP_EXTERNAL_LISTENER_SIP
#!endif
#!ifdef WITH_EXTERNAL_ALG_LISTENER
listen=UDP_EXTERNAL_LISTENER_ALG
listen=TCP_EXTERNAL_LISTENER_ALG
#!endif
#!endif
#!ifdef WITH_LOAD_BALANCED_LISTENER
listen=UDP_LOAD_BALANCED_LISTENER_SIP
listen=TCP_LOAD_BALANCED_LISTENER_SIP
listen=UDP_LOAD_BALANCED_LISTENER_ALG
listen=TCP_LOAD_BALANCED_LISTENER_ALG
#!else
#!ifdef WITH_EXTERNAL_LISTENER_SIP
listen=SIP_UDP_EXTERNAL_LISTENER
listen=SIP_TCP_EXTERNAL_LISTENER
#!ifdef WITH_LOAD_BALANCED_SIP_LISTENER
listen=UDP_LOAD_BALANCED_LISTENER_SIP
listen=TCP_LOAD_BALANCED_LISTENER_SIP
#!endif
#!ifdef WITH_EXTERNAL_LISTENER_ALG
listen=ALG_UDP_EXTERNAL_LISTENER
listen=ALG_TCP_EXTERNAL_LISTENER
#!ifdef WITH_LOAD_BALANCED_ALG_LISTENER
listen=UDP_LOAD_BALANCED_LISTENER_ALG
listen=TCP_LOAD_BALANCED_LISTENER_ALG
#!endif
#!endif

+ 168
- 82
kamailio/default.cfg View File

@ -64,6 +64,9 @@ loadmodule "siputils.so"
######## Text operations module ########
loadmodule "textopsx.so"
######## TCP operations module ########
loadmodule "tcpops.so"
######## sdp operations module ########
loadmodule "sdpops.so"
@ -132,9 +135,6 @@ include_file "message-role.cfg"
#!ifdef NAT_TRAVERSAL_ROLE
include_file "nat-traversal-role.cfg"
#!endif
#!ifdef WEBSOCKETS_ROLE
include_file "websockets-role.cfg"
#!endif
#!ifdef TLS_ROLE
include_file "tls-role.cfg"
#!endif
@ -175,12 +175,15 @@ include_file "blocker-role.cfg"
## sanity ##
include_file "sanity.cfg"
## http ##
include_file "http.cfg"
## auth ##
include_file "trusted.cfg"
include_file "authorization.cfg"
###### local route ######
tcp_children = 5
socket_workers=5
listen=tcp:127.0.0.1:5090
####### Routing Logic ########
@ -222,22 +225,22 @@ route
route(SIP_TRACE);
#!endif
routes("KZ_$(rm)_START_ROUTE_");
route(HANDLE_NOTIFY);
#!ifdef REGISTRAR_ROLE
route(HANDLE_REGISTER);
#!endif
route_if_exists("CUSTOM_START_ROUTES");
#!ifdef RESPONDER_ROLE
if (isflagset(FLAG_INTERNALLY_SOURCED)) {
route(HANDLE_RESPOND);
}
#!endif
if (!t_newtran()) {
xlog("L_ERROR", "$ci|log|failed to create transaction\n");
if (!has_totag() && !t_newtran()) {
xlog("L_ERROR", "$ci|default|failed to create transaction\n");
drop;
exit;
}
@ -248,7 +251,10 @@ route
route[MAIN]
{
route(AUTHORIZATION);
if (!isflagset(FLAG_INTERNALLY_SOURCED)) {
route(AUTHORIZATION);
remove_hf("Authorization");
}
#!ifdef MESSAGE_ROLE
route(HANDLE_MESSAGE);
@ -290,9 +296,9 @@ route[LOG_REQUEST]
# log the basic info regarding this call
xlog("$var(log_request_level)", "$ci|start|received $pr request $rm $ou\n");
xlog("$var(log_request_level)", "$ci|log|source $si:$sp -> $RAi:$RAp\n");
xlog("$var(log_request_level)", "$ci|log|from $fu\n");
xlog("$var(log_request_level)", "$ci|log|to $tu\n");
xlog("$var(log_request_level)", "$ci|default|source $si:$sp -> $RAi:$RAp\n");
xlog("$var(log_request_level)", "$ci|default|from $fu\n");
xlog("$var(log_request_level)", "$ci|default|to $tu\n");
}
route[CHECK_RETRANS]
@ -310,7 +316,7 @@ route[CHECK_RETRANS]
route[CLASSIFY_SOURCE]
{
if (allow_source_address()) {
xlog("$var(log_request_level)", "$ci|log|request from trusted IP\n");
xlog("$var(log_request_level)", "$ci|default|request from trusted IP\n");
setflag(FLAG_TRUSTED_SOURCE);
return;
}
@ -353,19 +359,19 @@ route[HANDLE_NOTIFY]
if (isflagset(FLAG_INTERNALLY_SOURCED)) {
if (loose_route()) {
xlog("L_INFO", "$ci|log|Able to loose-route. Cool beans!\n");
xlog("L_INFO", "$ci|default|Able to loose-route. Cool beans!\n");
}
#!ifdef REGISTRAR_ROLE
if (registered("location")) {
lookup("location");
xlog("L_INFO", "$ci|log|routing to $ruid\n");
xlog("L_INFO", "$ci|default|routing to $ruid\n");
}
#!endif
## verify we're not routing to ourselves
if(is_myself($du)) {
xlog("L_INFO", "$ci|log|notify from internal to invalid destination $ruid\n");
xlog("L_INFO", "$ci|default|notify from internal to invalid destination $ruid\n");
sl_send_reply("200", "Rawr!!");
exit;
}
@ -403,7 +409,7 @@ route[HANDLE_REFER]
}
if(!isflagset(FLAG_INTERNALLY_SOURCED)) {
if(isflagset(FLAG_AUTHORIZED)) {
if(isflagset(FLAG_REGISTERED_ENDPOINT)) {
$var(referred_by) = $_s($var(referred_by);endpoint_id=$(xavp(ulattrs=>token){re.subst,/(.*)@(.*)/\1/});account_id=$(xavp(ulattrs=>token){re.subst,/(.*)@(.*)/\2/}));
}
} else {
@ -427,11 +433,9 @@ route[HANDLE_IN_DIALOG_REQUESTS]
if (loose_route()) {
#!ifdef NAT_TRAVERSAL_ROLE
if(!isdsturiset()) {
handle_ruri_alias();
}
if ( is_method("ACK") ) {
if (handle_ruri_alias() != 1 && is_method("ACK") ) {
# ACK is forwarded statelessly
xlog("L_INFO", "$ci|default|forward ack statelessly\n");
route(NAT_MANAGE);
}
#!endif
@ -443,7 +447,7 @@ route[HANDLE_IN_DIALOG_REQUESTS]
}
#!endif
xlog("L_INFO", "$ci|log|loose_route in-dialog message\n");
xlog("L_INFO", "$ci|default|loose_route in-dialog message\n");
# Called on in-dialog requests
# If the request in an Invite for on hold from external to internal,
# associate the contact with the media server
@ -455,7 +459,7 @@ route[HANDLE_IN_DIALOG_REQUESTS]
# If the request in an Invite for t38 from internal,
# mark the request with FLT_T38
if (is_method("INVITE") && isflagset(FLAG_INTERNALLY_SOURCED) && sdp_with_media("image")) {
xlog("L_DEBUG", "$ci|log|T38 RE-INVITE\n");
xlog("L_DEBUG", "$ci|default|T38 RE-INVITE\n");
setflag(FLT_T38);
}
@ -465,17 +469,31 @@ route[HANDLE_IN_DIALOG_REQUESTS]
}
route(RELAY);
} else if (isflagset(FLAG_INTERNALLY_SOURCED)) {
xlog("L_INFO", "$ci|log|relay internally sourced in-dialog message without loose_route\n");
xlog("L_INFO", "$ci|default|relay internally sourced in-dialog message without loose_route\n");
#!ifdef NAT_TRAVERSAL_ROLE
if(!isdsturiset()) {
handle_ruri_alias();
}
#!endif
route(RELAY);
} else if (t_check_trans()) {
xlog("L_INFO", "$ci|log|allow message for a known transaction\n");
xlog("L_INFO", "$ci|default|allow message for a known transaction\n");
if ( is_method("NOTIFY") ) {
# Add Record-Route for in-dialog NOTIFY as per RFC 6665.
record_route();
}
route(RELAY);
} else {
xlog("L_INFO", "$ci|log|message had a to-tag but can't be loose routed\n");
#!ifdef NAT_TRAVERSAL_ROLE
if(!isdsturiset()) {
if (handle_ruri_alias() == 1) {
xlog("L_INFO", "$ci|default|message had a to-tag but can't be loose routed, routing with alias\n");
t_relay();
exit;
};
}
#!endif
xlog("L_INFO", "$ci|default|message had a to-tag but can't be loose routed\n");
sl_send_reply("481", "Call Leg/Transaction Does Not Exist");
}
exit();
@ -483,11 +501,17 @@ route[HANDLE_IN_DIALOG_REQUESTS]
route[PREPARE_INITIAL_REQUESTS]
{
#!ifdef NAT_TRAVERSAL_ROLE
if(!isdsturiset()) {
handle_ruri_alias();
}
#!endif
if (is_method("CANCEL")) {
if (t_check_trans()) {
route(RELAY);
} else {
sl_send_reply("481", "Call leg/transaction does not exist");
send_reply("481", "Call leg/transaction does not exist");
}
exit();
} else if (is_method("ACK")) {
@ -509,23 +533,13 @@ route[PREPARE_INITIAL_REQUESTS]
break;
}
if (loose_route()) {
#!ifdef REGISTRAR_ROLE
$xavp(regcfg=>match_received) = $su;
if(registered("location", "$rz:$Au", 2) == 1) {
xlog("L_INFO", "$ci|log|allowing initial route-set for $Au\n");
} else {
#!endif
xlog("L_WARN", "$ci|end|dropping initial request with route-set\n");
sl_send_reply("403", "No pre-loaded routes");
exit();
#!ifdef REGISTRAR_ROLE
}
#!endif
}
if(!isflagset(FLAG_INTERNALLY_SOURCED)) {
if (!isflagset(FLAG_INTERNALLY_SOURCED)) {
xlog("L_INFO", "$ci|log|call is not from internal source, recording route\n");
remove_hf("Route");
record_route();
} else if (loose_route()) {
xlog("L_WARN", "$ci|end|loose routing of internal initial request\n");
exit();
}
}
@ -537,7 +551,7 @@ route[SETUP]
if (!isflagset(FLAG_INTERNALLY_SOURCED)) {
route(DISPATCHER_FIND_ROUTES);
} else {
route(ROUTE_TO_AOR);
route(ROUTE_TO_EXTERNAL);
}
#!endif
@ -549,7 +563,12 @@ route[BRANCH_HEADERS]
if (!isflagset(FLAG_INTERNALLY_SOURCED)) {
route(AUTH_HEADERS);
} else {
remove_hf_re("^X-");
if (isflagset(FLAG_OUTBOUND_DISPATCHER)) {
if ($xavp(cr=>dispatcher_route) != $null) {
route_if_exists($_s($xavp(cr=>dispatcher_route)_CUSTOM_BRANCH));
}
}
route(REMOVE_RESERVED_HEADERS);
}
}
@ -557,11 +576,13 @@ route[BRANCH_HEADERS]
branch_route[MANAGE_BRANCH] {
xlog("L_INFO", "$ci|branch|new branch [$T_branch_idx] to $ru\n");
#!ifdef NAT_TRAVERSAL_ROLE
route(NAT_MANAGE);
if (!isflagset(FLAG_SKIP_NAT_MANAGE)) {
route(NAT_MANAGE);
}
#!endif
route(BRANCH_HEADERS);
route_if_exists("CUSTOM_BRANCH_HEADERS");
routes("BRANCH_HEADERS_");
}
route[RELAY]
@ -594,6 +615,8 @@ route[INTERNAL_TO_EXTERNAL_RELAY]
}
#!endif
routes("INTERNAL_TO_EXTERNAL_RELAY_");
t_on_reply("EXTERNAL_REPLY");
t_on_failure("EXTERNAL_FAULT");
@ -615,6 +638,8 @@ route[EXTERNAL_TO_INTERNAL_RELAY]
}
#!endif
routes("EXTERNAL_TO_INTERNAL_RELAY_");
t_on_reply("INTERNAL_REPLY");
t_on_failure("INTERNAL_FAULT");
@ -625,8 +650,10 @@ route[EXTERNAL_TO_INTERNAL_RELAY]
}
#!ifdef WITH_INTERNAL_LISTENER
xlog("L_DEBUG", "$ci|route|routing to internal thru PORT_PROTO_INTERNAL_LISTENER\n");
force_send_socket(PORT_PROTO_INTERNAL_LISTENER);
#!ifndef NO_FORCE_INTERNAL_LISTENER
xlog("L_DEBUG", "$ci|route|routing to internal thru PROTO_LISTENER_INTERNAL\n");
force_send_socket(PROTO_LISTENER_INTERNAL);
#!endif
#!endif
t_relay();
@ -635,9 +662,11 @@ route[EXTERNAL_TO_INTERNAL_RELAY]
onreply_route[EXTERNAL_REPLY]
{
if ($rs < 300) {
xlog("L_INFO", "$ci|log|external reply $T_reply_code $T_reply_reason\n");
xlog("L_INFO", "$ci|default|external reply $T_reply_code $T_reply_reason\n");
}
routes("EXTERNAL_REPLY_");
if($rs == 100) {
if($sel(cfg_get.kazoo.use_progressive_timers) == 1) {
t_set_fr(0, $sel(cfg_get.kazoo.to_external_no_response_100_timer));
@ -668,16 +697,19 @@ failure_route[EXTERNAL_FAULT]
{
# this branch handles failures (>=300) to external
route_if_exists("CUSTOM_EXTERNAL_FAULT");
routes("EXTERNAL_FAULT_");
# if the failure cause was due to the transaction being
# cancelled then we are complete
if (t_is_canceled()) {
xlog("L_INFO", "$ci|log|transaction was cancelled\n");
xlog("L_INFO", "$ci|default|transaction was cancelled\n");
exit;
}
xlog("L_INFO", "$ci|failure|external reply $T_reply_code $T_reply_reason\n");
if(isflagset(FLAG_OUTBOUND_DISPATCHER)) {
route(DISPATCHER_NEXT_ROUTE);
}
}
@ -685,9 +717,15 @@ onreply_route[INTERNAL_REPLY]
{
# this route handles replies that are comming from our media server
if ($rs < 300) {
xlog("L_INFO", "$ci|log|internal reply $T_reply_code $T_reply_reason\n");
xlog("L_INFO", "$ci|default|internal reply $T_reply_code $T_reply_reason\n");
}
#!ifdef NAT_TRAVERSAL_ROLE
route(NAT_MANAGE);
#!endif
routes("INTERNAL_REPLY_");
if($rs == 100) {
if($sel(cfg_get.kazoo.use_progressive_timers) == 1) {
t_set_fr(0, $sel(cfg_get.kazoo.to_internal_no_response_100_timer));
@ -698,10 +736,6 @@ onreply_route[INTERNAL_REPLY]
}
}
#!ifdef NAT_TRAVERSAL_ROLE
route(NAT_MANAGE);
#!endif
#!ifdef ACL_ROLE
setflag(FLAG_IS_REPLY);
route(ACL_CHECK);
@ -713,10 +747,12 @@ onreply_route[INTERNAL_REPLY]
#!endif
if (is_method("INVITE") && t_check_status("(180)|(183)|(200)")) {
xlog("L_INFO", "$ci|log|call setup, now ignoring abnormal termination\n");
xlog("L_INFO", "$ci|default|call setup, now ignoring abnormal termination\n");
setflag(FLAG_SESSION_PROGRESS);
}
route(REMOVE_RESERVED_HEADERS);
}
failure_route[INTERNAL_FAULT]
@ -724,10 +760,16 @@ failure_route[INTERNAL_FAULT]
# this branch handles failures (>=300) to our media servers,
# which we can sometimes overcome by routing to another server
#!ifdef NAT_TRAVERSAL_ROLE
route(NAT_MANAGE);
#!endif
routes("INTERNAL_FAULT_");
# if the failure cause was due to the transaction being
# cancelled then we are complete
if (t_is_canceled()) {
xlog("L_INFO", "$ci|log|transaction was cancelled\n");
xlog("L_INFO", "$ci|default|transaction was cancelled\n");
exit;
}
@ -741,13 +783,13 @@ failure_route[INTERNAL_FAULT]
route(INTERNAL_REDIRECT);
}
remove_hf_re("^X-.*");
route(REMOVE_RESERVED_HEADERS);
# change 6xx to 4xx
if (t_check_status("6[0-9][0-9]") && !t_check_status("600|603|604|606")) {
if (t_check_status("6[0-9][0-9]") && !t_check_status("600|603|604|606|607")) {
$var(new_code) = "4" + $(T_reply_code{s.substr,1,0});
xlog("L_INFO", "$ci|failure|sending $T_reply_code reply as $var(new_code) $T_reply_reason\n");
t_reply("$(var(new_code){s.int})", "$T_reply_reason");
t_reply("$(var(new_code){s.int})", "$T_reply_reason");
# if the failure case was something that we should recover
# from then try to find a new media server
@ -755,6 +797,10 @@ failure_route[INTERNAL_FAULT]
xlog("L_INFO", "$ci|failure|ignoring call barred\n");
} else if (isflagset(FLAG_SESSION_PROGRESS)) {
xlog("L_INFO", "$ci|failure|ignoring failure after session progress\n");
if (t_check_status("480")) {
xlog("L_INFO", "$ci|failure|overriding reply code 480 with $sel(cfg_get.kazoo.override_media_reply_480)\n");
send_reply("$(sel(cfg_get.kazoo.override_media_reply_480){s.int})", "Endpoint Not Available");
}
} else if (t_check_status("403") && $T_reply_reason=="Forbidden") {
xlog("L_WARNING", "$ci|failure|Failed auth from IP $si\n");
} else if (t_check_status("(401)|(486)")) {
@ -779,7 +825,7 @@ failure_route[INTERNAL_FAULT]
route[INTERNAL_REDIRECT]
{
xlog("L_INFO", "$ci|log|redirect to $T_rpl($hdr(X-Redirect-Server))\n");
xlog("L_INFO", "$ci|default|redirect to $T_rpl($hdr(X-Redirect-Server))\n");
$du = $T_rpl($hdr(X-Redirect-Server));
t_on_branch("MANAGE_BRANCH");
t_on_reply("INTERNAL_REPLY");
@ -793,8 +839,8 @@ route[INTERNAL_REDIRECT]
onsend_route {
if (isflagset(FLAG_ASSOCIATE_USER) && is_request()) {
$var(user_source) = $(ct{tobody.user}) + "@" + $si + ":" + $sp;
xlog("L_INFO", "$ci|log|associate traffic from $var(user_source) with media server sip:$sndto(ip):$sndto(port)\n");
$sht(associations=>$var(user_source))= "sip:" + $sndto(ip) + ":" + $sndto(port);
xlog("L_INFO", "$ci|default|associate traffic from $var(user_source) with media server sip:$(ruri{uri.host}):$(ruri{uri.port});transport=$sndto(sproto)\n");
$sht(associations=>$var(user_source)) = "sip:" + $(ruri{uri.host}) + ":" + $(ruri{uri.port}) + ";transport=" + $sndto(sproto);
}
#!ifdef SIP_TRACE_ROLE
@ -818,32 +864,77 @@ route[ROUTE_TO_AOR]
return;
}
xlog("L_INFO", "$ci|log|using AOR $hdr(X-KAZOO-AOR)\n");
if ($hdr(X-KAZOO-INVITE-FORMAT) == "contact") {
if(lookup("location", "$hdr(X-KAZOO-AOR)") > 0){
xlog("L_INFO", "$ci|default|using AOR $hdr(X-KAZOO-AOR)\n");
if ($hdr(X-KAZOO-INVITE-FORMAT) == "route") {
xlog("L_INFO", "$ci|default|routing $hdr(X-KAZOO-AOR) to $ruri\n");
} else if ($hdr(X-KAZOO-INVITE-FORMAT) == "contact") {
if(lookup("location", "$hdr(X-KAZOO-AOR)") > 0) {
xlog("L_INFO", "$ci|end|routing to contact $ru\n");
$avp(aor) = $hdr(X-KAZOO-AOR);
handle_ruri_alias();
} else {
xlog("L_INFO", "$ci|end|lookup for AOR $hdr(X-KAZOO-AOR) failed\n");
append_to_reply("$def(AOR_NOT_SUBSCRIBED_REASON)\r\n");
sl_send_reply("480", "Not registered");
send_reply("480", "Not registered");
exit;
}
} else if (reg_fetch_contacts("location", "$hdr(X-KAZOO-AOR)", "callee")) {
$du = $(ulc(callee=>received));
$fs = $(ulc(callee=>socket));
$bf = $bf | $(ulc(callee=>cflags));
xlog("L_INFO", "$ci|log|routing $hdr(X-KAZOO-AOR) to $du via $fs\n");
xlog("L_INFO", "$ci|default|routing $hdr(X-KAZOO-AOR) to $du via $fs\n");
$avp(aor) = $hdr(X-KAZOO-AOR);
} else {
xlog("L_INFO", "$ci|end|user is not registered\n");
append_to_reply("$def(AOR_NOT_SUBSCRIBED_REASON)\r\n");
sl_send_reply("410", "Not registered");
send_reply("410", "Not registered");
exit;
}
}
route[ROUTE_TO_GROUP]
{
if ($hdr(X-KAZOO-Dispatcher-Group) == $null) {
return;
}
$var(ds_primary_group) = $(hdr(X-KAZOO-Dispatcher-Group){s.int});
$vn(dispatcher_route) = $hdr(X-KAZOO-Dispatcher-Route);
xlog("L_INFO", "$ci|log|routing to group $hdr(X-KAZOO-Dispatcher-Group) : $hdr(X-KAZOO-Dispatcher-Route)\n");
if ($vn(dispatcher_route) != $null) {
xlog("L_DEBUG", "$ci|log|running $_s($vn(dispatcher_route)_BEFORE_DISPATCHER)\n");
route_if_exists($_s($vn(dispatcher_route)_BEFORE_DISPATCHER));
}
route(DISPATCHER_SELECT_ROUTES);
if ($vn(dispatcher_route) != $null) {
xlog("L_DEBUG", "$ci|log|running $_s($vn(dispatcher_route)_AFTER_DISPATCHER)\n");
route_if_exists($_s($vn(dispatcher_route)_AFTER_DISPATCHER));
$xavp(cr=>dispatcher_route) = $vn(dispatcher_route);
}
setflag(FLAG_OUTBOUND_DISPATCHER);
}
route[ROUTE_TO_CUSTOM]
{
if ($hdr(X-KAZOO-Route) == $null) {
return;
}
$var(custom_route) = $hdr(X-KAZOO-Route);
}
route[ROUTE_TO_EXTERNAL]
{
route(ROUTE_TO_AOR);
route(ROUTE_TO_GROUP);
route(ROUTE_TO_CUSTOM);
}
event_route[tm:local-request]
{
setflag(FLAG_LOCAL_REQUEST);
@ -856,22 +947,14 @@ event_route[tm:local-request]
route(SIP_TRACE);
#!endif
#!ifdef PRESENCE_ROLE
route(PRESENCE_LOCAL_REQUEST);
#!endif
routes("KZ_LOCAL_$(rm)_");
}
event_route[evrexec:DEFERRED_INIT]
{
xlog("L_INFO", "processing deferred init\n");
#!ifdef PRESENCE_ROLE
route(PRESENCE_DEFERRED_INIT);
#!endif
#!import_file "custom-init.cfg"
routes("KZ_DEFERRED_INIT_");
}
route[LOCAL_REQUEST]
@ -894,6 +977,9 @@ route[LOCAL_REQUEST]
exit;
}
#!import_file "custom-routes.cfg"
route[REMOVE_RESERVED_HEADERS]
{
remove_hf_re_pv("$sel(cfg_get.kazoo.reserved_headers)");
}
# vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab

+ 19
- 11
kamailio/defs.cfg View File

@ -21,6 +21,11 @@
#!trydef EXTERNAL_TO_INTERNAL_NO_RESPONSE_18X_TIMER 45000
#!trydef INTERNAL_TO_EXTERNAL_NO_RESPONSE_18X_TIMER 45000
#!trydef OVERRIDE_MEDIA_REPLY_480 603
#!trydef KZ_RESERVED_HEADERS "^(X-AUTH|X-KAZOO|X-FS-)"
kazoo.to_internal_no_response_timer = EXTERNAL_TO_INTERNAL_NO_RESPONSE_TIMER descr "external to internal no response timer"
kazoo.to_external_no_response_timer = INTERNAL_TO_EXTERNAL_NO_RESPONSE_TIMER descr "internal to external no response timer"
@ -33,6 +38,10 @@ kazoo.to_external_no_response_100_timer = INTERNAL_TO_EXTERNAL_NO_RESPONSE_100_T
kazoo.to_internal_no_response_18X_timer = EXTERNAL_TO_INTERNAL_NO_RESPONSE_18X_TIMER descr "external to internal no response timer after 18X"
kazoo.to_external_no_response_18X_timer = INTERNAL_TO_EXTERNAL_NO_RESPONSE_18X_TIMER descr "internal to external no response timer after 18X"
kazoo.override_media_reply_480 = OVERRIDE_MEDIA_REPLY_480 descr "sip code to send upstream when media returns 480 with session in progress"
kazoo.reserved_headers = KZ_RESERVED_HEADERS descr "headers that are removed"
#!ifndef MY_HOSTNAME
#!substdef "!MY_HOSTNAME!$HN(f)!g"
#!endif
@ -53,21 +62,27 @@ kazoo.to_external_no_response_18X_timer = INTERNAL_TO_EXTERNAL_NO_RESPONSE_18X_T
#!ifndef WEBSOCKET_NO_ORIGIN_RESTRICTION
#!ifndef MY_WEBSOCKET_DOMAIN
#!ifdef WEBSOCKET_DOMAIN
#!substdef "!MY_WEBSOCKET_DOMAIN!$def(WEBSOCKET_DOMAIN)!g"
#!else
#!substdef "!MY_WEBSOCKET_DOMAIN!$HN(d)!g"
#!endif
#!endif
#!endif
#!trydef KAZOO_LOG_LEVEL L_INFO
#!trydef PV_BUFFER_SIZE 16384
#!trydef PV_BUFFER_SLOTS 30
#!trydef PV_BUFFER_SLOTS 45
#!trydef KZ_MEM_SUMMARY 0
#!trydef KZ_DB_MODULE kazoo
#!substdef "!KAMAILIO_DBMS!$def(KZ_DB_MODULE)!g"
#!trydef KAZOO_DB_LOCATION /etc/kazoo/kamailio/db
#!ifndef KAZOO_DATA_DIR
#!substdef "!KAZOO_DATA_DIR!/etc/kazoo/kamailio/db!g"
#!substdef "!KAZOO_DATA_DIR!$def(KAZOO_DB_LOCATION)!g"
#!endif
#!ifndef KAZOO_DB_URL
@ -104,17 +119,10 @@ kazoo.to_external_no_response_18X_timer = INTERNAL_TO_EXTERNAL_NO_RESPONSE_18X_T
#!trydef RR_DOUBLE_RR 1
#!trydef RR_FORCE_SOCKET 1
#!ifndef KZ_DISABLE_WEBSOCKETS_REGISTRAR_PORT
#!trydef KZ_WEBSOCKETS_REGISTRAR_PORT 7000
#!endif
#!ifndef KZ_DISABLE_TLS_REGISTRAR_PORT
#!trydef KZ_TLS_REGISTRAR_PORT 7000
#!endif
#!trydef KZ_MULTI_HOMED 0
#!trydef KZ_PERMISSIONS_CACHE 0
#!trydef KZ_LOG_PREFIX_MODE 1
#!trydef KZ_LOG_PREFIX "$kzTS "
#!endif


+ 22
- 15
kamailio/dispatcher-role-5.3.cfg View File

@ -72,7 +72,7 @@ route[DISPATCHER_CLASSIFY_SOURCE]
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");
xlog("$var(log_request_level)", "$ci|dispatcher|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)") ||
@ -86,10 +86,10 @@ route[DISPATCHER_CLASSIFY_SOURCE]
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");
xlog("$var(log_request_level)", "$ci|dispatcher|originated from internal sources\n");
setflag(FLAG_INTERNALLY_SOURCED);
} else {
xlog("$var(log_request_level)", "$ci|log|originated from external sources\n");
xlog("$var(log_request_level)", "$ci|dispatcher|originated from external sources\n");
}
}
}
@ -139,8 +139,8 @@ route[DISPATCHER_SELECT_ROUTES]
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");
xlog("L_WARN", "$ci|end|no servers available in primary ($var(ds_primary_group)) or backup group ($var(ds_backup_group))\n");
send_reply("480", "All servers busy");
exit;
}
@ -150,7 +150,7 @@ route[DISPATCHER_SELECT_ROUTES]
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");
xlog("L_INFO", "$ci|dispatcher|found association for contact uri $var(user_source)\n");
route(DISPATCHER_PREFERRED_ROUTE);
}
$sht(associations=>$var(user_source)) = $null;
@ -165,11 +165,11 @@ route[DISPATCHER_SELECT_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");
xlog("L_INFO", "$ci|dispatcher|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");
xlog("L_INFO", "$ci|dispatcher|re-ordering the dispatcher list to maintain association with $var(prefered_route)\n");
$var(i) = 0;
while($var(i) < $xavp(ds_ctx=>cnt)) {
@ -192,7 +192,7 @@ route[PRINT_ROUTES]
$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");
xlog("L_INFO", "$ci|dispatcher|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;
}
@ -209,7 +209,7 @@ route[DISPATCHER_NEXT_ROUTE]
$avp(ds_retries) = $avp(ds_retries) + 1;
if(ds_next_dst()) {
xlog("L_INFO", "$ci|log|routing call to next media server $du\n");
xlog("L_INFO", "$ci|dispatcher|routing call to next media server $du\n");
setflag(FLAG_SKIP_NAT_CORRECTION);
@ -223,12 +223,12 @@ route[DISPATCHER_NEXT_ROUTE]
event_route[dispatcher:dst-down]
{
xlog("L_WARNING", "Destination down: $ru , $xavp(ds_dst=>uri), $xavp(ds_dst=>grp), $xavp(ds_dst=>attrs)\n");
xlog("L_WARNING", "event|dispatcher|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 , $xavp(ds_dst=>uri), $xavp(ds_dst=>grp), $xavp(ds_dst=>attrs)\n");
xlog("L_WARNING", "event|dispatcher|Destination up: $ru , $xavp(ds_dst=>uri), $xavp(ds_dst=>grp), $xavp(ds_dst=>attrs)\n");
}
@ -240,8 +240,15 @@ route[DISPATCHER_CHECK_MEDIA_SERVER]
if($var(Zone) != "MY_AMQP_ZONE") {
$var(SetId) = 2;
}
#!ifdef WITH_INTERNAL_LISTENER
$var(dispatcher_socket) = $_s(socket=PORT_PROTO_INTERNAL_LISTENER;);
#!else
$var(dispatcher_socket) = "";
#!endif
$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));
$var(attrs) = $_s($var(dispatcher_socket)zone=$var(Zone);profile=$var(MediaProfile);duid=$(var(MediaUrl){s.corehash, MEDIA_SERVERS_HASH_SIZE});node=$var(MediaName));
route_if_exists("DISPATCHER_CUSTOM_MEDIA_CHECK");
sql_query("exec", "KZQ_CHECK_MEDIA_SERVER_INSERT");
if($sqlrows(exec) > 0) {
@ -253,7 +260,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(attrs) = $_s($var(dispatcher_socket)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");
@ -272,7 +279,7 @@ route[DISPATCHER_CHECK_MEDIA_SERVER]
route[DISPATCHER_RELOAD]
{
if($shv(dispatcher_reload) == 1) {
xlog("L_WARNING", "reloading dispatcher table\n");
xlog("L_WARNING", "evnet|dispatcher|reloading dispatcher table\n");
ds_reload();
};
$shv(dispatcher_reload) = 0;


+ 36
- 25
kamailio/dispatcher-role-5.4.cfg View File

@ -85,7 +85,8 @@ route[DISPATCHER_CLASSIFY_SOURCE]
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)")) {
ds_is_from_list(KZ_DISPATCHER_REGISTRAR_SECONDARY_GROUP, "$var(classify_dispatcher_flag)") ||
($hdr(X-FS-Core-UUID) != $null && $sht(media=>$hdr(X-FS-Core-UUID)) != $null)) {
xlog("$var(log_request_level)", "$ci|log|originated from internal sources\n");
setflag(FLAG_INTERNALLY_SOURCED);
} else {
@ -123,6 +124,8 @@ route[DISPATCHER_FIND_ROUTES]
route(PRESENCE_FAST_PICKUP_ATTEMPT);
#!endif
$var(ds_alg) = $sel(cfg_get.kazoo.dispatcher_algorithm);
route(DISPATCHER_SELECT_ROUTES);
}
@ -130,7 +133,6 @@ route[DISPATCHER_SELECT_ROUTES]
{
$var(ds_group) = $var(ds_primary_group);
$var(ds_alg) = $sel(cfg_get.kazoo.dispatcher_algorithm);
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 {
@ -139,8 +141,8 @@ route[DISPATCHER_SELECT_ROUTES]
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");
xlog("L_WARN", "$ci|end|no servers available in primary ($var(ds_primary_group)) or backup group ($var(ds_backup_group))\n");
send_reply("480", "All servers busy");
exit;
}
@ -198,41 +200,37 @@ route[PRINT_ROUTES]
}
#!import_file "dispatcher-next-route.cfg"
#!ifndef CUSTOM_DISPATCHER_NEXT_ROUTE
# Try next destinations in failure route
route[DISPATCHER_NEXT_ROUTE]
{
if(!route_if_exists("DISPATCHER_CUSTOM_NEXT_ROUTE")) {
if($avp(ds_retries) >= $sel(cfg_get.kazoo.dispatcher_max_retries)) return;
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");
$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);
setflag(FLAG_SKIP_NAT_CORRECTION);
# relay the request to the new media server
route(RELAY);
# relay the request to the new media server
route(RELAY);
exit;
exit;
}
}
}
#!endif
event_route[dispatcher:dst-down]
{
xlog("L_WARNING", "Destination down: $ru , $xavp(ds_dst=>uri), $xavp(ds_dst=>grp), $xavp(ds_dst=>attrs)\n");
xlog("L_WARNING", "event|dispatcher|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 , $xavp(ds_dst=>uri), $xavp(ds_dst=>grp), $xavp(ds_dst=>attrs)\n");
xlog("L_NOTICE", "event|dispatcher|destination up: $ru , $xavp(ds_dst=>uri), $xavp(ds_dst=>grp), $xavp(ds_dst=>attrs)\n");
}
route[DISPATCHER_CHECK_MEDIA_SERVER]
route[MEDIA_SERVER_UP_DISPATCHER]
{
$var(check_media_server_ret) = 0;
if($sel(cfg_get.kazoo.dispatcher_auto_add) == 1) {
@ -240,8 +238,18 @@ route[DISPATCHER_CHECK_MEDIA_SERVER]
if($var(Zone) != "MY_AMQP_ZONE") {
$var(SetId) = 2;
}
$var(MediaUrlBack) = $var(MediaUrl);
#!ifdef WITH_INTERNAL_LISTENER
$var(dispatcher_socket) = $_s(socket=PROTO_LISTENER_INTERNAL;);
$var(MediaUrl) = $_s($var(MediaUrl);transport=$def(INTERNAL_PROTO));
#!else
$var(dispatcher_socket) = "";
#!endif
$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));
$var(attrs) = $_s($var(dispatcher_socket)zone=$var(Zone);profile=$var(MediaProfile);duid=$(var(MediaUrl){s.corehash, MEDIA_SERVERS_HASH_SIZE});node=$var(MediaName));
route_if_exists("DISPATCHER_CUSTOM_MEDIA_CHECK");
sql_query("exec", "KZQ_CHECK_MEDIA_SERVER_INSERT");
if($sqlrows(exec) > 0) {
@ -251,9 +259,12 @@ route[DISPATCHER_CHECK_MEDIA_SERVER]
if($sel(cfg_get.kazoo.dispatcher_add_secondary_ip) == 1) {
if($var(MediaIP) != "" && $var(MediaIP) != $(var(MediaUrl){uri.host})) {
$var(MediaUrlBack) = $var(MediaUrl);
#!ifdef WITH_INTERNAL_LISTENER
$var(MediaUrl) = $_s($(var(MediaUrlBack){uri.scheme}):$var(MediaIP):$(var(MediaUrlBack){uri.port});transport=$def(INTERNAL_PROTO));
#!else
$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));
#!endif
$var(attrs) = $_s($var(dispatcher_socket)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");
@ -261,10 +272,10 @@ route[DISPATCHER_CHECK_MEDIA_SERVER]
$shv(dispatcher_reload) = 1;
$var(check_media_server_ret) = 1;
}
$var(MediaUrl) = $var(MediaUrlBack);
}
}
$var(MediaUrl) = $var(MediaUrlBack);
}
return $var(check_media_server_ret);
}


+ 5
- 0
kamailio/globals.cfg View File

@ -17,6 +17,9 @@
#!trydef FLAG_MANUAL_ALIAS 18
#!trydef FLAG_RECORD_ROUTE_ADDED 19
#!trydef FLAG_AUTHORIZED 20
#!trydef FLAG_REGISTERED_ENDPOINT 21
#!trydef FLAG_SKIP_NAT_MANAGE 22
#!trydef FLAG_OUTBOUND_DISPATCHER 23
####### Global Parameters #########
fork = yes
@ -43,6 +46,8 @@ mem_summary = KZ_MEM_SUMMARY
log_stderror = no
log_facility = LOG_LOCAL0
log_name="kamailio"
log_prefix_mode = KZ_LOG_PREFIX_MODE
log_prefix = KZ_LOG_PREFIX
####### Alias Parameters #########
auto_aliases = yes


+ 33
- 0
kamailio/http.cfg View File

@ -0,0 +1,33 @@
tcp_accept_no_cl=yes
######## Basic HTTP request handling ########
loadmodule "xhttp.so"
#!ifdef WEBSOCKETS_ROLE
include_file "websockets-role.cfg"
#!endif
#!ifndef DISABLE_PROMETHEUS_STATS
include_file "prometheus.cfg"
#!endif
event_route[xhttp:request]
{
set_reply_close();
set_reply_no_connect();
#!ifdef WEBSOCKETS_ROLE
if($Rp == WS_PORT || $Rp == WSS_PORT) {
route("WEBSOCKET_REQUEST");
}
#!endif
#!ifndef DISABLE_PROMETHEUS_STATS
if( $Rp == PROMETHEUS_PORT) {
route("PROMETHEUS_REQUEST");
}
#!endif
xhttp_reply("200", "OK", "text/html", "<html><body>Wrong URL $hu</body></html>");
}

+ 6
- 2
kamailio/kamailio.cfg View File

@ -41,9 +41,10 @@ loadmodule "textops.so"
####### Local Configuration ########
include_file "local.cfg"
import_files "local.d/*.cfg"
####### Custom defs ########
import_file "custom-defs.cfg"
import_files "defs.d/*.cfg"
####### defaults not configured in local ########
include_file "defs.cfg"
@ -55,7 +56,7 @@ include_file "globals.cfg"
include_file "listener-defs.cfg"
####### custom listeners ########
import_file "custom-listeners.cfg"
import_files "listeners.d/*.cfg"
####### default listeners ########
#!ifndef SKIP_DEFAULT_LISTENERS
@ -65,4 +66,7 @@ include_file "default-listeners.cfg"
####### Default Configuration ######
include_file "default.cfg"
####### Extras Configuration ######
import_files "extras.d/*.cfg"
# vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab

+ 17
- 39
kamailio/kazoo-bindings.cfg View File

@ -50,95 +50,73 @@ modparam("kazoo", "amqp_connection", "MY_AMQP_DENARY_URL")
event_route[kazoo:mod-init]
{
#!ifdef PRESENCE_ROLE
route(PRESENCE_BINDINGS);
#!endif
#!ifdef MESSAGE_ROLE
route(MESSAGE_BINDINGS);
#!endif
#!ifdef REGISTRAR_ROLE
route(REGISTRAR_BINDINGS);
#!endif
#!ifdef NODES_ROLE
route(NODES_BINDINGS);
#!endif
#!ifdef ACL_ROLE
route(ACL_BINDINGS);
#!endif
route(TRUSTED_BINDINGS);
#!import_file "kazoo-custom-bindings.cfg"
routes("KZ_AMQP_BINDING_");
}
event_route[kazoo:consumer-event]
{
xlog("L_DEBUG","unhandled AMQP event, payload: $kzE\n");
xlog("L_DEBUG","event|bindings|unhandled AMQP event, payload: $kzE\n");
}
event_route[kazoo:consumer-event-connection-open]
{
xlog("L_DEBUG","connection to $(kzE{kz.json,host}) opened\n");
xlog("L_DEBUG","event|bindings|connection to $(kzE{kz.json,host}) opened\n");
}
event_route[kazoo:consumer-event-connection-error]
{
xlog("L_ERR","amqp|error|$(kzE{kz.json,zone})|$(kzE{kz.json,name})|$(kzE{kz.json,message})\n");
xlog("L_ERR","event|bindings|$(kzE{kz.json,zone})|$(kzE{kz.json,name})|$(kzE{kz.json,message})\n");
}
event_route[kazoo:consumer-event-connection-message]
{
xlog("L_DEBUG","amqp|msg|$(kzE{kz.json,zone})|$(kzE{kz.json,name})|$(kzE{kz.json,message})\n");
xlog("L_DEBUG","event|bindings|$(kzE{kz.json,zone})|$(kzE{kz.json,name})|$(kzE{kz.json,message})\n");
}
event_route[kazoo:consumer-event-connection-closed]
{
xlog("L_DEBUG","amqp|closed|$(kzE{kz.json,zone})|$(kzE{kz.json,name})|connection to $(kzE{kz.json,host}) closed\n");
xlog("L_DEBUG","event|bindings|$(kzE{kz.json,zone})|$(kzE{kz.json,name})|connection to $(kzE{kz.json,host}) closed\n");
}
event_route[kazoo:consumer-event-connection-zone-available]
{
xlog("L_DEBUG","amqp zone $(kzE{kz.json,zone}) is available\n");
xlog("L_DEBUG","event|bindings|amqp zone $(kzE{kz.json,zone}) is available\n");
}
event_route[kazoo:consumer-event-connection-zone-unavailable]
{
xlog("L_DEBUG","amqp zone $(kzE{kz.json,zone}) is unavailable\n");
xlog("L_DEBUG","event|bindings|amqp zone $(kzE{kz.json,zone}) is unavailable\n");
}
event_route[kazoo:consumer-event-connection-available]
{
xlog("L_DEBUG","amqp zone $(kzE{kz.json,zone}) is available\n");
xlog("L_DEBUG","event|bindings|amqp zone $(kzE{kz.json,zone}) is available\n");
}
event_route[kazoo:consumer-event-connection-unavailable]
{
xlog("L_DEBUG","amqp zone $(kzE{kz.json,zone}) is unavailable\n");
xlog("L_DEBUG","event|bindings|amqp zone $(kzE{kz.json,zone}) is unavailable\n");
}
event_route[kazoo:consumer-event-connection-zone-listener-available]
{
xlog("L_DEBUG","amqp zone $(kzE{kz.json,zone}) is available\n");
xlog("L_DEBUG","event|bindings|amqp zone $(kzE{kz.json,zone}) is available\n");
}
event_route[kazoo:consumer-event-connection-zone-listener-unavailable]
{
xlog("L_DEBUG","amqp zone $(kzE{kz.json,zone}) is unavailable\n");
xlog("L_DEBUG","event|bindings|amqp zone $(kzE{kz.json,zone}) is unavailable\n");
}
event_route[kazoo:consumer-event-connection-listener-zone-available]
{
xlog("L_NOTICE","amqp|connection|$(kzE{kz.json,zone})|$(kzE{kz.json,name})|listener available\n");
xlog("L_NOTICE","event|bindings|$(kzE{kz.json,zone})|$(kzE{kz.json,name})|listener available\n");
}
event_route[kazoo:consumer-event-connection-listener-zone-unavailable]
{
xlog("L_WARN","amqp|connection|$(kzE{kz.json,zone})|$(kzE{kz.json,name})|listener unavailable\n");
xlog("L_WARN","event|bindings|$(kzE{kz.json,zone})|$(kzE{kz.json,name})|listener unavailable\n");
#!ifdef PRESENCE_ROLE
route(PRESENCE_ZONE_UNAVAILABLE);
@ -147,17 +125,17 @@ event_route[kazoo:consumer-event-connection-listener-zone-unavailable]
event_route[kazoo:consumer-event-connection-listener-available]
{
xlog("L_DEBUG","amqp|connection|$(kzE{kz.json,zone})|$(kzE{kz.json,name})|listener available\n");
xlog("L_DEBUG","event|bindings|$(kzE{kz.json,zone})|$(kzE{kz.json,name})|listener available\n");
}
event_route[kazoo:consumer-event-connection-listener-unavailable]
{
xlog("L_DEBUG","amqp zone $(kzE{kz.json,zone}) is unavailable\n");
xlog("L_DEBUG","event|bindings|amqp zone $(kzE{kz.json,zone}) is unavailable\n");
}
event_route[kazoo:consumer-event-amqp-error-message-returned]
{
xlog("L_WARNING","$(kzE{kz.json,Msg-ID})|amqp|message $(kzE{kz.json,Original-Event-Category}):$(kzE{kz.json,Original-Event-Name}) was returned by broker $(kzE{kz.json,Error-Code}) $(kzE{kz.json,Error-Reason})\n");
xlog("L_WARNING","event|bindings|$(kzE{kz.json,Msg-ID}) $(kzE{kz.json,Original-Event-Category}):$(kzE{kz.json,Original-Event-Name}) was returned by broker $(kzE{kz.json,Error-Code}) $(kzE{kz.json,Error-Reason})\n");
}
# vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab

+ 88
- 47
kamailio/listener-defs.cfg View File

@ -10,63 +10,104 @@
#!trydef ALG_S_PORT 7001
#!trydef WS_PORT 5064
#!trydef WSS_PORT 5065
#!trydef INTERNAL_PORT 5070
#!trydef INTERNAL_PROTO udp
#!trydef SIP_PUBLIC_PORT 5060
#!trydef SIP_S_PUBLIC_PORT 5061
#!trydef ALG_PUBLIC_PORT 7000
#!trydef ALG_S_PUBLIC_PORT 7001
#!trydef SIP_EXTERNAL_LISTEN_PORT 5060
#!trydef SIP_EXTERNAL_ADVERTISE_PORT 5060
#!trydef SIP_S_EXTERNAL_LISTEN_PORT 5061
#!trydef SIP_S_EXTERNAL_ADVERTISE_PORT 5061
#!trydef ALG_EXTERNAL_LISTEN_PORT 7000
#!trydef ALG_EXTERNAL_ADVERTISE_PORT 7000
#!trydef ALG_S_EXTERNAL_LISTEN_PORT 7001
#!trydef ALG_S_EXTERNAL_ADVERTISE_PORT 7001
#!trydef WS_EXTERNAL_LISTEN_PORT 5064
#!trydef WS_EXTERNAL_ADVERTISE_PORT 5064
#!trydef WSS_EXTERNAL_LISTEN_PORT 5065
#!trydef WSS_EXTERNAL_ADVERTISE_PORT 5065
#!trydef SIP_LB_LISTEN_PORT 5060
#!trydef SIP_LB_ADVERTISE_PORT 5060
#!trydef SIP_S_LB_LISTEN_PORT 5061
#!trydef SIP_S_LB_ADVERTISE_PORT 5061
#!trydef ALG_LB_LISTEN_PORT 7000
#!trydef ALG_LB_ADVERTISE_PORT 7000
#!trydef ALG_S_LB_LISTEN_PORT 7001
#!trydef ALG_S_LB_ADVERTISE_PORT 7001
#!trydef WS_LB_LISTEN_PORT 5064
#!trydef WS_LB_ADVERTISE_PORT 5064
#!trydef WSS_LB_LISTEN_PORT 5065
#!trydef WSS_LB_ADVERTISE_PORT 5065
#!substdef "!TCP_INTERNAL!tcp:MY_IP_ADDRESS:$def(INTERNAL_PORT)!g"
#!substdef "!PROTO_INTERNAL!$def(INTERNAL_PROTO):MY_IP_ADDRESS:$def(INTERNAL_PORT)!g"
#!substdef "!PROTO_LB_INTERNAL!$def(INTERNAL_PROTO):MY_IP_ADDRESS:$def(INTERNAL_PORT) advertise $def(INTERNAL_LOAD_BALANCE_IP):$def(INTERNAL_PORT)!g"
#!substdef "!UDP_SIP!udp:MY_IP_ADDRESS:$def(SIP_PORT)!g"
#!substdef "!TCP_SIP!tcp:MY_IP_ADDRESS:$def(SIP_PORT)!g"
#!substdef "!TLS_SIP!tls:MY_IP_ADDRESS:$def(SIP_S_PORT)!g"
#!substdef "!UDP_ALG!udp:MY_IP_ADDRESS:$def(ALG_PORT)!g"
#!substdef "!TCP_ALG!tcp:MY_IP_ADDRESS:$def(ALG_PORT)!g"
#!substdef "!TLS_ALG!tls:MY_IP_ADDRESS:$def(ALG_S_PORT)!g"
#!substdef "!TCP_WS!tcp:MY_IP_ADDRESS:$def(WS_PORT)!g"
#!substdef "!TLS_WSS!tls:MY_IP_ADDRESS:$def(WSS_PORT)!g"
#!substdef "!PROTO_PORT_INTERNAL!$def(INTERNAL_PROTO):MY_IP_ADDRESS:$def(INTERNAL_PORT)!g"
#!substdef "!UDP_ADVERTISED_SIP!udp:MY_IP_ADDRESS:$def(SIP_PORT) advertise $def(MY_PUBLIC_IP):$def(SIP_PUBLIC_PORT)!g"
#!substdef "!TCP_ADVERTISED_SIP!tcp:MY_IP_ADDRESS:$def(SIP_PORT) advertise $def(MY_PUBLIC_IP):$def(SIP_PUBLIC_PORT)!g"
#!substdef "!TLS_ADVERTISED_SIP!tcp:MY_IP_ADDRESS:$def(SIP_S_PORT) advertise $def(MY_PUBLIC_IP):$def(SIP_S_PUBLIC_PORT)!g"
#!substdef "!UDP_ADVERTISED_ALG!udp:MY_IP_ADDRESS:$def(ALG_PORT) advertise $def(MY_PUBLIC_IP):$def(ALG_PUBLIC_PORT)!g"
#!substdef "!TCP_ADVERTISED_ALG!tcp:MY_IP_ADDRESS:$def(ALG_PORT) advertise $def(MY_PUBLIC_IP):$def(ALG_PUBLIC_PORT)!g"
#!substdef "!TLS_ADVERTISED_ALG!tcp:MY_IP_ADDRESS:$def(ALG_S_PORT) advertise $def(MY_PUBLIC_IP):$def(ALG_S_PUBLIC_PORT)!g"
#!substdef "!UDP_EXTERNAL_SIP!udp:MY_IP_ADDRESS:$def(SIP_PUBLIC_PORT) advertise $def(MY_PUBLIC_IP):$def(SIP_PUBLIC_PORT)!g"
#!substdef "!TCP_EXTERNAL_SIP!tcp:MY_IP_ADDRESS:$def(SIP_PUBLIC_PORT) advertise $def(MY_PUBLIC_IP):$def(SIP_PUBLIC_PORT)!g"
#!substdef "!TLS_EXTERNAL_SIP!tcp:MY_IP_ADDRESS:$def(SIP_S_PUBLIC_PORT) advertise $def(MY_PUBLIC_IP):$def(SIP_S_PUBLIC_PORT)!g"
#!substdef "!UDP_EXTERNAL_ALG!udp:MY_IP_ADDRESS:$def(ALG_PUBLIC_PORT) advertise $def(MY_PUBLIC_IP):$def(ALG_PUBLIC_PORT)!g"
#!substdef "!TCP_EXTERNAL_ALG!tcp:MY_IP_ADDRESS:$def(ALG_PUBLIC_PORT) advertise $def(MY_PUBLIC_IP):$def(ALG_PUBLIC_PORT)!g"
#!substdef "!TLS_EXTERNAL_ALG!tcp:MY_IP_ADDRESS:$def(ALG_S_PUBLIC_PORT) advertise $def(MY_PUBLIC_IP):$def(ALG_S_PUBLIC_PORT)!g"
#!substdef "!SIP_UDP_LISTENER!UDP_SIP!g"
#!substdef "!SIP_TCP_LISTENER!TCP_SIP!g"
#!substdef "!SIP_TLS_LISTENER!TLS_SIP!g"
#!substdef "!ALG_UDP_LISTENER!UDP_ALG!g"
#!substdef "!ALG_TCP_LISTENER!TCP_ALG!g"
#!substdef "!ALG_TLS_LISTENER!TLS_ALG!g"
#!substdef "!WS_TCP_LISTENER!TCP_WS!g"
#!substdef "!WSS_TLS_LISTENER!TLS_WSS!g"
#!substdef "!SIP_UDP_EXTERNAL_LISTENER!UDP_EXTERNAL_SIP!g"
#!substdef "!SIP_TCP_EXTERNAL_LISTENER!TCP_EXTERNAL_SIP!g"
#!substdef "!SIP_TLS_EXTERNAL_LISTENER!TLS_EXTERNAL_SIP!g"
#!substdef "!ALG_UDP_EXTERNAL_LISTENER!UDP_EXTERNAL_ALG!g"
#!substdef "!ALG_TCP_EXTERNAL_LISTENER!TCP_EXTERNAL_ALG!g"
#!substdef "!ALG_TLS_EXTERNAL_LISTENER!TLS_EXTERNAL_ALG!g"
#!substdef "!SIP_UDP_ADVERTISED_LISTENER!UDP_ADVERTISED_SIP!g"
#!substdef "!SIP_TCP_ADVERTISED_LISTENER!TCP_ADVERTISED_SIP!g"
#!substdef "!SIP_TLS_ADVERTISED_LISTENER!TLS_ADVERTISED_SIP!g"
#!substdef "!ALG_UDP_ADVERTISED_LISTENER!UDP_ADVERTISED_ALG!g"
#!substdef "!ALG_TCP_ADVERTISED_LISTENER!TCP_ADVERTISED_ALG!g"
#!substdef "!ALG_TLS_ADVERTISED_LISTENER!TLS_ADVERTISED_ALG!g"
#!substdef "!PORT_PROTO_INTERNAL_LISTENER!PROTO_PORT_INTERNAL!g"
#!substdef "!UDP_EXTERNAL_SIP!udp:MY_IP_ADDRESS:$def(SIP_EXTERNAL_LISTEN_PORT) advertise $def(MY_PUBLIC_IP):$def(SIP_EXTERNAL_ADVERTISE_PORT)!g"
#!substdef "!TCP_EXTERNAL_SIP!tcp:MY_IP_ADDRESS:$def(SIP_EXTERNAL_LISTEN_PORT) advertise $def(MY_PUBLIC_IP):$def(SIP_EXTERNAL_ADVERTISE_PORT)!g"
#!substdef "!TLS_EXTERNAL_SIP!tcp:MY_IP_ADDRESS:$def(SIP_S_EXTERNAL_LISTEN_PORT) advertise $def(MY_PUBLIC_IP):$def(SIP_S_EXTERNAL_ADVERTISE_PORT)!g"
#!substdef "!UDP_EXTERNAL_ALG!udp:MY_IP_ADDRESS:$def(ALG_EXTERNAL_LISTEN_PORT) advertise $def(MY_PUBLIC_IP):$def(ALG_EXTERNAL_ADVERTISE_PORT)!g"
#!substdef "!TCP_EXTERNAL_ALG!tcp:MY_IP_ADDRESS:$def(ALG_EXTERNAL_LISTEN_PORT) advertise $def(MY_PUBLIC_IP):$def(ALG_EXTERNAL_ADVERTISE_PORT)!g"
#!substdef "!TLS_EXTERNAL_ALG!tcp:MY_IP_ADDRESS:$def(ALG_S_EXTERNAL_LISTEN_PORT) advertise $def(MY_PUBLIC_IP):$def(ALG_S_EXTERNAL_ADVERTISE_PORT)!g"
#!substdef "!TCP_EXTERNAL_WS!tcp:MY_IP_ADDRESS:$def(WS_EXTERNAL_LISTEN_PORT) advertise $def(MY_PUBLIC_IP):$def(WS_EXTERNAL_ADVERTISE_PORT)!g"
#!substdef "!TLS_EXTERNAL_WSS!tls:MY_IP_ADDRESS:$def(WSS_EXTERNAL_LISTEN_PORT) advertise $def(MY_PUBLIC_IP):$def(WSS_EXTERNAL_ADVERTISE_PORT)!g"
#!substdef "!UDP_EXT_ALG!udp:MY_IP_ADDRESS:$def(ALG_EXTERNAL_LISTEN_PORT)!g"
#!substdef "!UDP_LB_ALG!udp:MY_IP_ADDRESS:$def(ALG_LB_LISTEN_PORT)!g"
#!substdef "!UDP_LOAD_BALANCED_SIP!udp:MY_IP_ADDRESS:$def(SIP_LB_LISTEN_PORT) advertise $def(LOAD_BALANCE_IP):$def(SIP_LB_ADVERTISE_PORT)!g"
#!substdef "!TCP_LOAD_BALANCED_SIP!tcp:MY_IP_ADDRESS:$def(SIP_LB_LISTEN_PORT) advertise $def(LOAD_BALANCE_IP):$def(SIP_LB_ADVERTISE_PORT)!g"
#!substdef "!TLS_LOAD_BALANCED_SIP!tcp:MY_IP_ADDRESS:$def(SIP_S_LB_LISTEN_PORT) advertise $def(LOAD_BALANCE_IP):$def(SIP_S_LB_ADVERTISE_PORT)!g"
#!substdef "!UDP_LOAD_BALANCED_ALG!udp:MY_IP_ADDRESS:$def(ALG_LB_LISTEN_PORT) advertise $def(LOAD_BALANCE_IP):$def(ALG_LB_ADVERTISE_PORT)!g"
#!substdef "!TCP_LOAD_BALANCED_ALG!tcp:MY_IP_ADDRESS:$def(ALG_LB_LISTEN_PORT) advertise $def(LOAD_BALANCE_IP):$def(ALG_LB_ADVERTISE_PORT)!g"
#!substdef "!TLS_LOAD_BALANCED_ALG!tcp:MY_IP_ADDRESS:$def(ALG_S_LB_LISTEN_PORT) advertise $def(LOAD_BALANCE_IP):$def(ALG_S_LB_ADVERTISE_PORT)!g"
#!substdef "!TCP_LOAD_BALANCED_WS!tcp:MY_IP_ADDRESS:$def(WS_LB_LISTEN_PORT) advertise $def(LOAD_BALANCE_IP):$def(WS_LB_ADVERTISE_PORT)!g"
#!substdef "!TLS_LOAD_BALANCED_WSS!tls:MY_IP_ADDRESS:$def(WSS_LB_LISTEN_PORT) advertise $def(LOAD_BALANCE_IP):$def(WSS_LB_ADVERTISE_PORT)!g"
#!substdef "!UDP_LISTENER_EXT_ALG!UDP_EXT_ALG!g"
#!substdef "!UDP_LISTENER_LB_ALG!UDP_LB_ALG!g"
#!substdef "!TCP_LISTENER_INTERNAL!TCP_INTERNAL!g"
#!substdef "!PROTO_LISTENER_INTERNAL!PROTO_INTERNAL!g"
#!substdef "!PROTO_LB_LISTENER_INTERNAL!PROTO_LB_INTERNAL!g"
#!substdef "!UDP_LISTENER_SIP!UDP_SIP!g"
#!substdef "!TCP_LISTENER_SIP!TCP_SIP!g"
#!substdef "!TLS_LISTENER_SIP!TLS_SIP!g"
#!substdef "!UDP_LISTENER_ALG!UDP_ALG!g"
#!substdef "!TCP_LISTENER_ALG!TCP_ALG!g"
#!substdef "!TLS_LISTENER_ALG!TLS_ALG!g"
#!substdef "!TCP_LISTENER_WS!TCP_WS!g"
#!substdef "!TLS_LISTENER_WSS!TLS_WSS!g"
#!substdef "!UDP_EXTERNAL_LISTENER_SIP!UDP_EXTERNAL_SIP!g"
#!substdef "!TCP_EXTERNAL_LISTENER_SIP!TCP_EXTERNAL_SIP!g"
#!substdef "!TLS_EXTERNAL_LISTENER_SIP!TLS_EXTERNAL_SIP!g"
#!substdef "!UDP_EXTERNAL_LISTENER_ALG!UDP_EXTERNAL_ALG!g"
#!substdef "!TCP_EXTERNAL_LISTENER_ALG!TCP_EXTERNAL_ALG!g"
#!substdef "!TLS_EXTERNAL_LISTENER_ALG!TLS_EXTERNAL_ALG!g"
#!substdef "!TCP_EXTERNAL_LISTENER_WS!TCP_EXTERNAL_WS!g"
#!substdef "!TLS_EXTERNAL_LISTENER_WSS!TLS_EXTERNAL_WSS!g"
#!substdef "!UDP_LOAD_BALANCED_LISTENER_SIP!UDP_LOAD_BALANCED_SIP!g"
#!substdef "!TCP_LOAD_BALANCED_LISTENER_SIP!TCP_LOAD_BALANCED_SIP!g"
#!substdef "!TLS_LOAD_BALANCED_LISTENER_SIP!TLS_LOAD_BALANCED_SIP!g"
#!substdef "!UDP_LOAD_BALANCED_LISTENER_ALG!UDP_LOAD_BALANCED_ALG!g"
#!substdef "!TCP_LOAD_BALANCED_LISTENER_ALG!TCP_LOAD_BALANCED_ALG!g"
#!substdef "!TLS_LOAD_BALANCED_LISTENER_ALG!TLS_LOAD_BALANCED_ALG!g"
#!substdef "!TCP_LOAD_BALANCED_LISTENER_WS!TCP_LOAD_BALANCED_WS!g"
#!substdef "!TLS_LOAD_BALANCED_LISTENER_WSS!TLS_LOAD_BALANCED_WSS!g"

+ 7
- 7
kamailio/message-role.cfg View File

@ -5,7 +5,7 @@ route[HANDLE_MESSAGE]
if (isflagset(FLAG_INTERNALLY_SOURCED) || src_ip == myself) return;
xlog("L_INFO", "$ci|log|MESSAGE from $fu to $tu\n");
xlog("L_INFO", "$ci|message|MESSAGE from $fu to $tu\n");
if (!isflagset(FLAG_AUTHORIZED)) {
send_reply("403", "Forbidden");
exit;
@ -29,7 +29,7 @@ route[MESSAGE_INBOUND]
$var(exchange) = "im";
$var(RoutingKey) = $_s(sms.inbound.onnet.$(ci{kz.encode}));
xlog("L_INFO", "$ci|msg|sending inbound message $var(RoutingKey) => $var(Payload)\n");
xlog("L_INFO", "$ci|message|sending inbound message $var(RoutingKey) => $var(Payload)\n");
kazoo_publish($var(exchange), $var(RoutingKey), $var(Payload));
t_reply("200", "OK");
exit;
@ -49,13 +49,13 @@ event_route[kazoo:consumer-event-sms-outbound]
$uac_req(furi) = $var(from_uri);
$uac_req(ouri) = "sip:127.0.0.1:5090;transport=tcp";
$uac_req(callid) = $(kzE{kz.json,Message-ID});
xlog("L_INFO", "$(kzE{kz.json,Message-ID})|log|sending message from $var(from_uri) to $var(to_uri) \n");
xlog("L_INFO", "event|message|$(kzE{kz.json,Message-ID}) sending message from $var(from_uri) to $var(to_uri) \n");
uac_req_send();
}
route[MESSAGE_ROUTE]
{
remove_hf_re("^X-");
route(REMOVE_RESERVED_HEADERS);
route(ROUTE_TO_AOR);
$var(JObj) = $rb;
@ -73,7 +73,7 @@ route[MESSAGE_ROUTE]
onreply_route[MESSAGE_REPLY]
{
if($T_reply_code < 300) {
xlog("L_INFO", "$ci|log|sending success delivery message to $avp(server_id)\n");
xlog("L_INFO", "$ci|message|sending success delivery message to $avp(server_id)\n");
$var(Payload) = $_s({"Event-Category" : "message", "Event-Name" : "delivery", "Call-ID" : "$ci", "Message-ID" : "$avp(message_id)" , "Delivery-Result-Code" : "sip:$T_reply_code", "Msg-ID" : "$avp(msg_id)" , "Status" : "delivered"});
$var(exchange) = "targeted";
$var(RK) = $avp(server_id);
@ -83,14 +83,14 @@ onreply_route[MESSAGE_REPLY]
failure_route[MESSAGE_FAULT]
{
xlog("L_INFO", "$ci|log|sending failure delivery message to $avp(server_id)\n");
xlog("L_INFO", "$ci|message|sending failure delivery message to $avp(server_id)\n");
$var(Payload) = $_s({"Event-Category" : "message", "Event-Name" : "delivery", "Call-ID" : "$ci", "Message-ID" : "$avp(message_id)" , "Delivery-Result-Code" : "sip:$T_reply_code", "Msg-ID" : "$avp(msg_id)" , "Status" : "failure"});
$var(exchange) = "targeted";
$var(RK) = $avp(server_id);
kazoo_publish($var(exchange), $var(RK), $var(Payload));
}
route[MESSAGE_BINDINGS]
route[KZ_AMQP_BINDING_MESSAGE]
{
$var(key) = "kamailio@MY_HOSTNAME";
$var(payload) = $_s({"name": "sms", "exchange": "im", "type": "topic", "queue": "MSG-QUEUE-MY_HOSTNAME", "routing": "sms.outbound.$(var(key){kz.encode}).*", "no_ack": false, "federate": true });


+ 43
- 24
kamailio/nat-traversal-role.cfg View File

@ -14,25 +14,29 @@ modparam("nathelper", "sipping_from", "sip:registrar@MY_HOSTNAME")
#!trydef KZ_NAT_FIX_SDP_REQUEST 1
#!trydef KZ_NAT_FIX_SDP_REPLY 1
#!trydef KZ_NAT_FIX_INTERNAL_SDP_REPLY 0
#!trydef KZ_NAT_FIX_INTERNAL_SDP_REQUEST 0
#!trydef KZ_NAT_SDP_TEST 8
#!trydef KZ_NAT_SDP_FIX 10
kazoo.nat_fix_sdp_request = KZ_NAT_FIX_SDP_REQUEST descr "performs request sdp replacement of private addresses"
kazoo.nat_fix_sdp_reply = KZ_NAT_FIX_SDP_REPLY descr "performs reply sdp replacement of private addresses"
kazoo.nat_fix_internal_sdp_request = KZ_NAT_FIX_INTERNAL_SDP_REQUEST descr "performs internal request sdp replacement of private addresses"
kazoo.nat_fix_internal_sdp_reply = KZ_NAT_FIX_INTERNAL_SDP_REPLY descr "performs internal reply sdp replacement of private addresses"
####### NAT Traversal Logic ########
route[NAT_SDP]
{
if( has_body("application/sdp")) {
if( nat_uac_test(KZ_NAT_SDP_TEST)) {
xlog("L_DEBUG", "$ci|log|applying sdp nat fix\n");
xlog("L_DEBUG", "$ci|nat|applying sdp nat fix\n");
$var(ret) = fix_nated_sdp(KZ_NAT_SDP_FIX);
xlog("L_DEBUG", "$ci|log|result of applying sdp nat fix is $var(ret)\n");
xlog("L_DEBUG", "$ci|nat|result of applying sdp nat fix is $var(ret)\n");
} else if( is_method("INVITE") && !isflagset(FLAG_INTERNALLY_SOURCED) && is_audio_on_hold()) {
xlog("L_DEBUG", "$ci|log|applying sdp nat fix for held channel\n");
xlog("L_DEBUG", "$ci|nat|applying sdp nat fix for held channel\n");
$var(ret) = fix_nated_sdp(KZ_NAT_SDP_FIX);
xlog("L_DEBUG", "$ci|log|result of applying sdp nat fix for held channel is $var(ret)\n");
xlog("L_DEBUG", "$ci|nat|result of applying sdp nat fix for held channel is $var(ret)\n");
}
}
}
@ -40,13 +44,23 @@ route[NAT_SDP]
route[NAT_DETECT]
{
if($sel(cfg_get.kazoo.nat_fix_sdp_request) == 1) {
route(NAT_SDP);
if(isflagset(FLAG_INTERNALLY_SOURCED)) {
if(is_request() && $sel(cfg_get.kazoo.nat_fix_internal_sdp_request) == 1) {
if(!sdp_with_ice()) {
route(NAT_SDP);
}
}
} else {
if(is_request() && $sel(cfg_get.kazoo.nat_fix_sdp_request) == 1) {
if(!sdp_with_ice()) {
route(NAT_SDP);
}
}
}
if ($Rp == "5080") {
setflag(FLAG_SKIP_NAT_CORRECTION);
xlog("L_DEBUG", "$ci|log|skipping nat correction on PORT 5080\n");
xlog("L_DEBUG", "$ci|nat|skipping nat correction on PORT 5080\n");
} else {
if (is_present_hf("Record-Route")) {
$var(i) = 0;
@ -59,7 +73,7 @@ route[NAT_DETECT]
$var(i) = $var(i) + 1;
if (!is_myself("$(var(rr){nameaddr.uri})")) {
setflag(FLAG_SKIP_NAT_CORRECTION);
xlog("L_DEBUG", "$ci|log|skipping nat correction on record-route $(var(rr){nameaddr.uri})\n");
xlog("L_DEBUG", "$ci|nat|skipping nat correction on record-route $(var(rr){nameaddr.uri})\n");
}
$var(rr_idx) = $var(rr_idx) + 1;
$var(rr) = $(var(rr_base){s.select,$var(rr_idx),,});
@ -69,46 +83,51 @@ route[NAT_DETECT]
}
if (isflagset(FLAG_SKIP_NAT_CORRECTION)) {
xlog("L_DEBUG", "$ci|log|skipping nat detection\n");
xlog("L_DEBUG", "$ci|nat|skipping nat detection\n");
return;
}
force_rport();
if(nat_uac_test(KZ_NAT_DETECT)) {
xlog("L_DEBUG", "$ci|log|detected nat request\n");
xlog("L_DEBUG", "$ci|nat|detected nat request\n");
setflag(FLT_NATS);
if (!is_method("REGISTER")) {
if(is_first_hop()) set_contact_alias();
}
}
if (!is_method("REGISTER")) {
if(is_first_hop()) set_contact_alias();
}
}
route[NAT_MANAGE]
{
if( is_reply() && $sel(cfg_get.kazoo.nat_fix_sdp_reply) == 1) {
route(NAT_SDP);
if(!isflagset(FLAG_INTERNALLY_SOURCED)) {
if(is_reply() && $sel(cfg_get.kazoo.nat_fix_internal_sdp_reply) == 1) {
if(!sdp_with_ice()) {
route(NAT_SDP);
}
}
} else {
if( is_reply() && $sel(cfg_get.kazoo.nat_fix_sdp_reply) == 1) {
if(!sdp_with_ice()) {
route(NAT_SDP);
}
}
}
if ( is_request() && isflagset(FLAG_INTERNALLY_SOURCED)) {
xlog("L_DEBUG", "$ci|nat|INTERNAL AND REQUEST => SET FLB_NATB\n");
setbflag(FLB_NATB);
}
if ( is_request() && has_totag() ) {
xlog("L_DEBUG", "$ci|nat|TOTAG AND REQUEST => SET FLB_NATB\n");
setbflag(FLB_NATB);
}
if (!(isflagset(FLT_NATS) || isbflagset(FLB_NATB))) {
return;
}
if (is_reply()) {
if(isflagset(FLT_NATS) || isbflagset(FLB_NATB)) {
if(is_first_hop()) {
set_contact_alias();
}
}
set_contact_alias();
}
}


+ 45
- 33
kamailio/nodes-role.cfg View File

@ -60,13 +60,13 @@ event_route[kazoo:consumer-event-nodes-advertise]
{
$var(count) = $shtinc(nodes=>$(kzE{kz.json,Node})::count);
if($var(count) == 0) {
xlog("L_NOTICE", "$(kzE{kz.json,Msg-ID})|nodes|heartbeat for reconnected node $(kzE{kz.json,Node})\n");
xlog("L_NOTICE", "event|nodes|$(kzE{kz.json,Msg-ID}) heartbeat for reconnected node $(kzE{kz.json,Node})\n");
$var(count) = $shtinc(nodes=>$(kzE{kz.json,Node})::count);
} else {
if($var(count) == 1) {
xlog("L_NOTICE", "$(kzE{kz.json,Msg-ID})|nodes|heartbeat from new node $(kzE{kz.json,Node})\n");
xlog("L_NOTICE", "event|nodes|$(kzE{kz.json,Msg-ID}) heartbeat from new node $(kzE{kz.json,Node})\n");
} else {
xlog("L_DEBUG", "$(kzE{kz.json,Msg-ID})|nodes|heartbeat from existing node $(kzE{kz.json,Node})\n");
xlog("L_DEBUG", "event|nodes|$(kzE{kz.json,Msg-ID}) heartbeat from existing node $(kzE{kz.json,Node})\n");
}
}
mq_add("node_heartbeat", "$(kzE{kz.json,Node})", "$kzE");
@ -76,13 +76,13 @@ event_route[htable:expired:nodes]
{
if($shtrecord(key) =~ "::count$$") {
if($shtrecord(value) == -1) {
xlog("L_WARNING", "htable|nodes|node $(shtrecord(key){s.rm,::count}) is still unreachable\n");
xlog("L_WARNING", "event|nodes|node $(shtrecord(key){s.rm,::count}) is still unreachable\n");
}
mq_add("node_track", "$shtrecord(key)", "");
return;
}
xlog("L_WARNING", "htable|nodes|heartbeat expired for node $shtrecord(key)\n");
xlog("L_WARNING", "event|nodes|heartbeat expired for node $shtrecord(key)\n");
}
route[NODE_TRACK_ROUTE]
@ -102,7 +102,7 @@ route[NODE_HEARTBEAT_ROUTE]
while(mq_fetch("node_heartbeat") == 1 && $var(runloop) < MAX_WHILE_LOOPS) {
$var(Node) = $mqk(node_heartbeat);
$var(Payload) = $mqv(node_heartbeat);
xlog("L_DEBUG", "$(var(Payload){kz.json,Msg-ID})|nodes|processing heartbeat for node $var(Node)\n");
xlog("L_DEBUG", "event|nodes|$(var(Payload){kz.json,Msg-ID}) processing heartbeat for node $var(Node)\n");
route(CHECK_MEDIA_SERVERS);
@ -118,6 +118,7 @@ route[CHECK_MEDIA_SERVERS]
return;
}
$var(Msg-ID) = $(var(Payload){kz.json,Msg-ID});
$var(Media) = $(var(Payload){kz.json,Media-Servers});
$var(Zone) = $(var(Payload){kz.json,AMQP-Broker-Zone});
@ -131,6 +132,17 @@ route[CHECK_MEDIA_SERVERS]
$var(MediaName) = $(avp(MediaKeys)[$var(Idx)]);
$var(MediaKey) = $(var(MediaName){s.replace,$var(Dot),$var(Perc)});
avp_delete("$avp(ProfileKeys)/g");
$var(MediaReconnected) = 0;
$var(MediaConnected) = $(var(Payload){kz.json,Media-Servers.$var(MediaKey).Startup});
$var(ExistingMediaConnected) = $sht(media=>$var(MediaKey)::connected::$var(Node));
xlog("L_DEBUG", "event|nodes|$var(Msg-ID) $var(MediaKey) from $var(Node) => $var(MediaConnected) vs $var(ExistingMediaConnected)\n");
if($var(ExistingMediaConnected) != $null && $var(MediaConnected) > $var(ExistingMediaConnected)) {
$var(MediaReconnected) = 1;
}
$sht(media=>$var(MediaKey)::connected::$var(Node)) = $var(MediaConnected);
$shtex(media=>$var(MediaKey)::connected::$var(Node)) = 0;
if(kazoo_json_keys($var(Payload), "Media-Servers.$var(MediaKey).Interfaces", "$avp(ProfileKeys)") == 1) {
$var(ProfileCount) = $cnt($avp(ProfileKeys));
$var(ProfileIdx) = 0;
@ -151,15 +163,21 @@ route[CHECK_MEDIA_SERVERS]
$shtex(media=>$var(MediaUrl)::zone) = 0;
$sht(media=>$var(MediaUrl)::uuid) = $var(MediaInstanceUUID);
$shtex(media=>$var(MediaUrl)::uuid) = 0;
$sht(media=>$var(MediaInstanceUUID)) = $var(MediaUrl);
$shtex(media=>$var(MediaInstanceUUID)) = 0;
route(MEDIA_SERVER_UP);
} else if($sht(media=>$var(MediaUrl)::uuid) != $var(MediaInstanceUUID)) {
$sht(media=>$var(MediaUrl)::uuid) = $var(MediaInstanceUUID);
$shtex(media=>$var(MediaUrl)::uuid) = 0;
$sht(media=>$var(MediaInstanceUUID)) = $var(MediaUrl);
$shtex(media=>$var(MediaInstanceUUID)) = 0;
$var(Zone) = $sht(media=>$var(MediaUrl)::zone);
route(MEDIA_SERVER_RESTART);
} else if($var(MediaReconnected) == 1) {
route(MEDIA_SERVER_RECONNECTED);
};
$var(MediaExpire) = ($(var(Payload){kz.json,Expires}{s.int}) / 1000) + NODES_FUDGE_EXPIRE;
xlog("L_DEBUG", "nodes|media|$var(Node) media expiration $var(MediaExpire) for $var(MediaUrl)\n");
xlog("L_DEBUG", "event|nodes|$var(Msg-ID) $var(Node) media expiration $var(MediaExpire) for $var(MediaUrl)\n");
$shtex(media=>$var(MediaUrl)::count) = $var(MediaExpire);
$var(ProfileIdx) = $var(ProfileIdx) + 1;
}
@ -173,50 +191,44 @@ event_route[htable:expired:media]
{
$var(MediaUrl) = $(shtrecord(key){re.subst,/(.*)::(.*)/\1/});
$var(Zone) = $sht(media=>$var(MediaUrl)::zone);
$var(CoreUUID) = $sht(media=>$var(MediaUrl)::uuid);
route(MEDIA_SERVER_DOWN);
$sht(media=>$var(CoreUUID)) = $null;
$sht(media=>$var(MediaUrl)::uuid) = $null;
$sht(media=>$var(MediaUrl)::zone) = $null;
}
route[MEDIA_SERVER_UP]
{
xlog("L_NOTICE", "nodes|media|$var(Node) reported new media server $var(MediaUrl) in zone $var(Zone)\n");
#!ifdef DISPATCHER_ROLE
route(DISPATCHER_CHECK_MEDIA_SERVER);
#!endif
#!ifdef PRESENCE_ROLE
route(PRESENCE_FAST_PICKUP_START);
#!endif
xlog("L_NOTICE", "event|nodes|$var(Msg-ID) $var(Node) reported new media server $var(MediaUrl) in zone $var(Zone)\n");
routes("MEDIA_SERVER_UP_");
}
route[MEDIA_SERVER_DOWN]
{
xlog("L_WARNING", "htable|media|heartbeat expired for media server $var(MediaUrl) in zone $var(Zone)\n");
#!ifdef PRESENCE_ROLE
route(RESET_PUBLISHER);
#!endif
xlog("L_WARNING", "event|nodes|heartbeat expired for media server $var(MediaUrl) in zone $var(Zone)\n");
routes("MEDIA_SERVER_DOWN_");
}
route[MEDIA_SERVER_RESTART]
{
xlog("L_NOTICE", "htable|media|media server $var(MediaUrl) restarted in zone $var(Zone)\n");
#!ifdef PRESENCE_ROLE
route(RESET_PUBLISHER);
#!endif
xlog("L_NOTICE", "event|nodes|$var(Msg-ID) media server $var(MediaUrl) restarted in zone $var(Zone)\n");
routes("MEDIA_SERVER_RESTART_");
}
route[MEDIA_SERVER_RECONNECTED]
{
xlog("L_NOTICE", "event|nodes|$var(Msg-ID) media server $var(MediaUrl) reconnected to $var(Node) in zone $var(Zone)\n");
routes("MEDIA_SERVER_RECONNECTED_");
}
#!ifndef NODES_CUSTOM_BINDINGS
route[NODES_BINDINGS]
route[KZ_AMQP_BINDING_NODES]
{
$var(payload) = $_s({"name": "nodes", "exchange" : "nodes" , "type" : "fanout", "queue" : "nodes-MY_HOSTNAME", "exclusive": false, "federate": true });
kazoo_subscribe("$var(payload)");
if(!check_route_exists("KZ_AMQP_BINDING_CUSTOM_NODES")) {
$var(payload) = $_s({"name": "nodes", "exchange" : "nodes" , "type" : "fanout", "queue" : "nodes-MY_HOSTNAME", "exclusive": false, "federate": true });
kazoo_subscribe("$var(payload)");
}
}
#!endif
route[LISTENER_STATUS]
{


+ 25
- 30
kamailio/presence-fast-pickup.cfg View File

@ -10,6 +10,16 @@ kazoo.presence_fast_pickup_cookies = KZ_PRESENCE_FAST_PICKUP_COOKIES descr "main
kazoo.presence_fast_pickup_realtime = KZ_PRESENCE_FAST_PICKUP_REALTIME descr "queries channels api for realtime status of call-id"
kazoo.presence_fast_pickup_star_5 = KZ_PRESENCE_FAST_PICKUP_STAR_5 descr "treats *5 as park pickup, queries state of *3"
route[MEDIA_SERVER_UP_FAST_PICKUP]
{
route(PRESENCE_FAST_PICKUP_START);
}
route[KZ_DEFERRED_INIT_FAST_PICKUP]
{
route(PRESENCE_FAST_PICKUP_START);
}
route[PRESENCE_FAST_PICKUP_START]
{
$sht(fp=>count) = 0;
@ -18,7 +28,7 @@ route[PRESENCE_FAST_PICKUP_START]
route[PRESENCE_FAST_PICKUP_LOAD]
{
sht_reset("fp");
xlog("L_INFO", "$ci|log|fast|initializing fastpick hash table from dispatcher\n");
xlog("L_INFO", "$ci|pickup|initializing fastpick hash table from dispatcher\n");
if (sql_xquery("exec", "select destination from dispatcher", "ra") == 1) {
while($xavp(ra) != $null) {
$var(host) = $(xavp(ra=>destination){uri.host});
@ -26,9 +36,9 @@ route[PRESENCE_FAST_PICKUP_LOAD]
$var(destination) = $xavp(ra=>destination);
$var(i) = 0;
if(!is_ip("$var(host)")) {
xlog("L_INFO", "$ci|log|fast|ignoring $var(host) since its not a ip address\n");
xlog("L_INFO", "$ci|pickup|ignoring $var(host) since its not a ip address\n");
} else {
xlog("L_INFO", "$ci|log|fast|adding key $(var(destination){s.md5}) for $var(destination)\n");
xlog("L_INFO", "$ci|pickup|adding key $(var(destination){s.md5}) for $var(destination)\n");
$sht(fp=>$(var(destination){s.md5})) = $var(destination);
}
pv_unset("$xavp(ra)");
@ -60,24 +70,21 @@ route[PRESENCE_FAST_PICKUP_ATTEMPT]
route(PRESENCE_FAST_PICKUP_OPTION);
$du = $sht(fp=>$var(md5));
append_hf("Replaces: $var(replaced_call_id)$var(Pickup)\r\n");
if(!is_present_hf("k-cid")) {
append_hf("k-cid: $var(replaced_call_id)\r\n");
}
xlog("L_INFO", "$ci|log|fast|found shortcut for call-id $var(replaced_call_id) , redirecting ($(ru{uri.user})) to $du\n");
xlog("L_INFO", "$ci|pickup|found shortcut for call-id $var(replaced_call_id) , redirecting ($(ru{uri.user})) to $du\n");
route(RELAY);
exit();
} else {
xlog("L_INFO", "$ci|log|fast|shortcut $var(md5) invalid in this server, using standard routing\n");
xlog("L_INFO", "$ci|pickup|shortcut $var(md5) invalid in this server, using standard routing\n");
}
}
if($sel(cfg_get.kazoo.presence_fast_pickup_realtime) == 1) {
if($var(replaced_call_id) != "none") {
xlog("L_INFO", "$ci|log|request has replaces call-id $var(replaced_call_id)\n");
xlog("L_INFO", "$ci|pickup|request has replaces call-id $var(replaced_call_id)\n");
$var(amqp_payload_request) = '{"Event-Category" : "call_event" , "Event-Name" : "channel_status_req", "Call-ID" : "' + $var(replaced_call_id) + '", "Active-Only" : true }';
$var(amqp_routing_key) = "call.status_req." + $(var(replaced_call_id){kz.encode});
sl_send_reply("100", "locating your call");
xlog("L_INFO", "$ci|log|querying cluster for the location of call-id $var(replaced_call_id)\n");
xlog("L_INFO", "$ci|pickup|querying cluster for the location of call-id $var(replaced_call_id)\n");
if(kazoo_query("callevt", $var(amqp_routing_key), $var(amqp_payload_request))) {
$du = $(kzR{kz.json,Switch-URL});
if($du != $null) {
@ -90,17 +97,14 @@ route[PRESENCE_FAST_PICKUP_ATTEMPT]
}
remove_hf_re("^Replaces");
append_hf("Replaces: $var(rep)\r\n");
if(!is_present_hf("k-cid")) {
append_hf("k-cid: $var(replaced_call_id)\r\n");
}
xlog("L_INFO", "$ci|log|call-id $var(replaced_call_id) found, redirecting call ($(ru{uri.user})) to $du => $var(rep)\n");
xlog("L_INFO", "$ci|pickup|call-id $var(replaced_call_id) found, redirecting call ($(ru{uri.user})) to $du => $var(rep)\n");
route(RELAY);
exit();
} else {
xlog("L_WARN", "$ci|log|call-id $var(replaced_call_id) not found in cluster, proceeding with normal dispatch\n");
xlog("L_WARN", "$ci|pickup|call-id $var(replaced_call_id) not found in cluster, proceeding with normal dispatch\n");
}
} else {
xlog("L_WARN", "$ci|log|error querying cluster for call-id $var(replaced_call_id), proceeding with normal dispatch\n");
xlog("L_WARN", "$ci|pickup|error querying cluster for call-id $var(replaced_call_id), proceeding with normal dispatch\n");
}
}
}
@ -113,10 +117,7 @@ route[PRESENCE_FAST_PICKUP_ATTEMPT]
$var(park) = $_s(*3$(ru{uri.user}{s.substr,2,0})@$(ru{uri.domain}));
if($sht(park=>$var(park)) != $null) {
$du = $sht(park=>$var(park));
if(!is_present_hf("k-cid")) {
append_hf("k-cid: $sht(park=>$var(park)::callid)\r\n");
}
xlog("L_INFO", "$ci|log|redirecting park request to $du , callid : $sht(park=>$var(park)::callid)\n");
xlog("L_INFO", "$ci|pickup|redirecting park request to $du , callid : $sht(park=>$var(park)::callid)\n");
route(RELAY);
exit();
}
@ -125,10 +126,7 @@ route[PRESENCE_FAST_PICKUP_ATTEMPT]
if($sht(park=>$(ru{uri.user})@$(ru{uri.domain})) != $null) {
$du = $sht(park=>$(ru{uri.user})@$(ruri{uri.domain}));
if(!is_present_hf("k-cid")) {
append_hf("k-cid: $sht(park=>$(ru{uri.user})@$(ruri{uri.domain})::callid)\r\n");
}
xlog("L_INFO", "$ci|log|redirecting park request to $du, callid: $sht(park=>$(ru{uri.user})@$(ruri{uri.domain})::callid)\n");
xlog("L_INFO", "$ci|pickup|redirecting park request to $du, callid: $sht(park=>$(ru{uri.user})@$(ruri{uri.domain})::callid)\n");
route(RELAY);
exit();
}
@ -139,16 +137,13 @@ route[PRESENCE_FAST_PICKUP_ATTEMPT]
$var(park_extension) = "^\*[3,5]";
}
if($(ru{uri.user}) =~ $var(park_extension) && !is_ip($rd)) {
xlog("L_INFO", "$ci|log|checking park request to $(ru{uri.user})@$(ru{uri.domain})\n");
xlog("L_INFO", "$ci|pickup|checking park request to $(ru{uri.user})@$(ru{uri.domain})\n");
$var(amqp_payload_request) = '{"Event-Category" : "call_event" , "Event-Name" : "query_user_channels_req", "Username" : "*3$(ru{uri.user}{s.substr,2,0})", "Realm" : "$(ru{uri.domain})", "Active-Only" : true }';
$var(amqp_routing_key) = "call.status_req." + $(ci{kz.encode});
if(kazoo_query("callevt", $var(amqp_routing_key), $var(amqp_payload_request))) {
$du = $(kzR{kz.json,Channels[0].switch_url});
if($du != $null) {
xlog("L_INFO", "$ci|log|redirecting park request to $du from realtime query reply\n");
if(!is_present_hf("k-cid")) {
append_hf("k-cid: $(kzR{kz.json,Channels[0].call_id})\r\n");
}
xlog("L_INFO", "$ci|pickup|redirecting park request to $du from realtime query reply\n");
route(RELAY);
exit();
}
@ -199,7 +194,7 @@ route[PRESENCE_FAST_PICKUP_INIT]
$var(Cookie) = $(kzE{kz.json,Switch-URI}{s.md5});
$var(call_id) = $(kzE{kz.json,Call-ID});
$var(JObj) = $(kzE{re.subst,/"Call-ID"\s*\:\s*"([^"]*)"/"Call-ID" : "kfp+$var(Option)$var(Cookie)@\1"/});
xlog("L_DEBUG", "$var(call_id)|fast|shortcut ($var(Pickup)) kfp+$var(Option)$var(Cookie)@$var(call_id)\n");
xlog("L_DEBUG", "$var(call_id)|pickup|shortcut ($var(Pickup)) kfp+$var(Option)$var(Cookie)@$var(call_id)\n");
}
}


+ 29
- 28
kamailio/presence-notify.cfg View File

@ -20,18 +20,18 @@ kazoo.presence_notify_log_level = KZ_PRESENCE_NOTIFY_LOG_LEVEL descr "loglevel f
######## Generic Hash Table container in shared memory ########
modparam("htable", "htable", "notify=>size=16;autoexpire=3600;updateexpire=1;initval=0")
route[PRESENCE_LOCAL_REQ_NOTIFY]
route[KZ_LOCAL_NOTIFY_PRESENCE]
{
if($rm != "NOTIFY") {
return;
}
t_set_fr($sel(cfg_get.kazoo.presence_notify_timeout), $sel(cfg_get.kazoo.presence_notify_timeout));
xlog("L_DEBUG", "$ci|log|init preparing $subs(event) notify to $subs(watcher_username)@$subs(watcher_domain) on behalf of $subs(pres_uri) : $du\n");
xlog("L_DEBUG", "$ci|notify|init preparing $subs(event) notify to $subs(watcher_username)@$subs(watcher_domain) on behalf of $subs(pres_uri) : $du\n");
if($sel(cfg_get.kazoo.presence_notify_log_init_body) == 1) {
xlog("L_INFO", "$ci|log|init|body $(mb{s.escape.common}{s.replace,\','}{s.replace,$$,})\n");
xlog("L_INFO", "$ci|notify|init|body $(mb{s.escape.common}{s.replace,\','}{s.replace,$$,})\n");
}
if($sel(cfg_get.kazoo.presence_notify_force_send_socket) == 1) {
xlog("L_DEBUG", "$ci|log|init|forcing socket to $(pr{s.tolower}):$(hdr(Contact){nameaddr.uri}{uri.host}):$(hdr(Contact){nameaddr.uri}{uri.port}) when sending notify to $ruri\n");
xlog("L_DEBUG", "$ci|notify|init|forcing socket to $(pr{s.tolower}):$(hdr(Contact){nameaddr.uri}{uri.host}):$(hdr(Contact){nameaddr.uri}{uri.port}) when sending notify to $ruri\n");
$fs = $_s($(pr{s.tolower}):$(hdr(Contact){nameaddr.uri}{uri.host}):$(hdr(Contact){nameaddr.uri}{uri.port}));
}
if($sel(cfg_get.kazoo.presence_notify_record_route) == 1) {
@ -68,35 +68,35 @@ event_route[presence:notify-reply]
if($notify_reply($rs) == 200) {
$sht(notify=>$ci) = $null;
$sht(notify=>$ci::count) = 0;
xlog("$(sel(cfg_get.kazoo.presence_notify_log_level){s.int})", "$ci|end|notified $subs(watcher_username)@$subs(watcher_domain) on behalf of $subs(pres_uri)\n");
xlog("$(sel(cfg_get.kazoo.presence_notify_log_level){s.int})", "event|notify|notified $subs(watcher_username)@$subs(watcher_domain) on behalf of $subs(pres_uri)\n");
} else if($subs(reason) == "timeout") {
$xavp(pres=>delete_subscription) = 1;
xlog("L_DEBUG", "$ci|end|deleting subscription $subs(pres_uri) for $subs(watcher_username)@$subs(watcher_domain) due to timeout\n");
xlog("L_DEBUG", "event|notify|deleting subscription $subs(pres_uri) for $subs(watcher_username)@$subs(watcher_domain) due to timeout\n");
} else if($notify_reply($rs) == 481 && $subs(reason) == "timeout") {
xlog("L_DEBUG","$ci|end|sent subscription $hdr(Subscription-State)\n");
xlog("L_DEBUG","event|notify|sent subscription $hdr(Subscription-State)\n");
} else if($notify_reply($rs) == 408) {
if($rP != "UDP") {
$xavp(pres=>delete_subscription) = 1;
xlog("L_ERROR", "$ci|warning|removing $rP watcher $subs(watcher_username)@$subs(watcher_domain) for $subs(pres_uri) with reply $notify_reply($rs)\n");
xlog("L_ERROR", "event|notify|removing $rP watcher $subs(watcher_username)@$subs(watcher_domain) for $subs(pres_uri) with reply $notify_reply($rs)\n");
} else {
$var(shtinc) = $shtinc(notify=>$ci::count);
if($var(shtinc) > $sel(cfg_get.kazoo.presence_max_notify_error)) {
$xavp(pres=>delete_subscription) = 1;
xlog("L_WARNING", "$ci|error|removing $rP watcher $subs(watcher_username)@$subs(watcher_domain) for $subs(pres_uri) with reply $notify_reply($rs)\n");
xlog("L_WARNING", "event|notify|removing $rP watcher $subs(watcher_username)@$subs(watcher_domain) for $subs(pres_uri) with reply $notify_reply($rs)\n");
} else {
$var(level) = 6 - $var(shtinc);
xlog("$var(level)", "$ci|error|received $notify_reply($rs) ($var(shtinc)/$sel(cfg_get.kazoo.presence_max_notify_error)) when notifying $subs(watcher_username)@$subs(watcher_domain) on behalf of $subs(pres_uri) with reply $notify_reply($rs)\n");
xlog("$var(level)", "event|notify|received $notify_reply($rs) ($var(shtinc)/$sel(cfg_get.kazoo.presence_max_notify_error)) when notifying $subs(watcher_username)@$subs(watcher_domain) on behalf of $subs(pres_uri) with reply $notify_reply($rs)\n");
}
}
} else {
$xavp(pres=>delete_subscription) = 1;
xlog("L_WARNING", "$ci|end|deleting subscription $subs(pres_uri) as $subs(watcher_username)@$subs(watcher_domain) replied with $notify_reply($rs)\n");
xlog("L_WARNING", "event|notify|deleting subscription $subs(pres_uri) as $subs(watcher_username)@$subs(watcher_domain) replied with $notify_reply($rs)\n");
}
if($sel(cfg_get.kazoo.presence_notify_log_body) == 1)
xlog("L_INFO", "$ci|log|sent|body $(mb{s.escape.common}{s.replace,\','}{s.replace,$$,})\n");
xlog("L_INFO", "event|notify|sent|body $(mb{s.escape.common}{s.replace,\','}{s.replace,$$,})\n");
if($sel(cfg_get.kazoo.presence_notify_log_resp_body) == 1)
xlog("L_INFO", "$ci|log|resp|body $(notify_reply($mb){s.escape.common}{s.replace,\','}{s.replace,$$,})\n");
xlog("L_INFO", "event|notify|resp|body $(notify_reply($mb){s.escape.common}{s.replace,\','}{s.replace,$$,})\n");
if($sel(cfg_get.kazoo.presence_notify_log_to_amqp) == 1) {
route(PRESENCE_NOTIFY_AMQP);
@ -116,16 +116,17 @@ route[PRESENCE_LOG_TIMER_ROUTE]
$var(runloop) = 1;
while(mq_fetch("presence_last_notity") == 1 && $var(runloop) < MAX_WHILE_LOOPS) {
$var(ci) = $mqk(presence_last_notity);
xlog("L_DEBUG", "Query : $mqv(presence_last_notity)\n");
xlog("L_DEBUG", "event|notify|Query : $mqv(presence_last_notity)\n");
$var(sqlres) = sql_query("cb", "$mqv(presence_last_notity)");
xlog("L_DEBUG", "Query result : $var(sqlres)\n");
xlog("L_DEBUG", "event|notify|Query result : $var(sqlres)\n");
if($var(sqlres) < 0) {
xlog("L_ERROR", "$var(ci)|log|error running query : $mqv(presence_last_notity)\n");
xlog("L_ERROR", "$var(ci)|notify|error running query : $mqv(presence_last_notity)\n");
} else {
$var(nrows) = $sqlrows(cb);
xlog("L_DEBUG", "$var(ci)|log|end UPDATED $var(nrows)\n");
xlog("L_DEBUG", "event|notify|end UPDATED $var(nrows)\n");
if($var(nrows) == 0) {
xlog("L_DEBUG", "$var(ci)|log|error no rows affected when running query\n");
xlog("L_DEBUG", "event|notify|error no rows affected when running query\n");
}
}
$var(runloop) = $var(runloop) + 1;
@ -137,7 +138,7 @@ route[PRESENCE_NOTIFY_AMQP]
$var(amqp_payload_request) = $_s({"Event-Category" : "presence", "Event-Name" : "notify", "Event-Package" : "$subs(event)", "Timestamp" : $TS, "Call-ID" : "$subs(callid)", "From" : "$fu", "To" : "$subs(to_user)@$subs(to_domain)", "Sent" : "$(TS{s.ftime,%Y-%m-%d %H:%M:%S})", "Body" : "Hostname : MY_HOSTNAME\r\nTimestamp : $(TS{s.ftime,%Y-%m-%d %H:%M:%S})\r\n$(mb{s.escape.common}{s.replace,\','}{s.replace,$$,})\r\nResponse\r\n$(notify_reply($mb){s.escape.common}{s.replace,\','}{s.replace,$$,})","Remote-CSeq" : $subs(remote_cseq), "Local-CSeq" : $subs(local_cseq), "Sequence" : $cs, "Version" : $subs(version), "Reply" : $notify_reply($rs) });
$var(rk) = "notify." + $(subs(to_domain){kz.encode}) + "." + $(subs(to_user){kz.encode});
kazoo_publish("omnipresence", "$var(rk)", $var(amqp_payload_request));
xlog("L_INFO", "$ci|log|sent notify callback for event $subs(event) : $tu\n");
xlog("L_INFO", "$ci|notify|sent notify callback for event $subs(event) : $tu\n");
}
@ -155,11 +156,11 @@ route[PRESENCE_CLEANUP]
route[PRESENCE_PUBLISHER_CLEANUP]
{
xlog("L_DEBUG", "processing presence publisher cleanup\n");
xlog("L_DEBUG", "event|notify|processing presence publisher cleanup\n");
$var(sqlres) = sql_query("cb", "update tmp_probe set action = 1 where action = 0");
if($var(sqlres) < 0) {
xlog("L_ERROR", "$var(ci)|log|error cleaning tmp_probe\n");
xlog("L_ERROR", "event|notify|error cleaning tmp_probe\n");
return;
} else {
$var(nrows) = $sqlrows(cb);
@ -167,7 +168,7 @@ route[PRESENCE_PUBLISHER_CLEANUP]
if (sql_xquery("cb", "select * from tmp_probe where action = 1", "cleanup_pres") == 1)
{
while($xavp(cleanup_pres) != $null) {
xlog("L_DEBUG", "processing $xavp(cleanup_pres=>event) notifies for $xavp(cleanup_pres=>presentity_uri)\n");
xlog("L_DEBUG", "event|notify|processing $xavp(cleanup_pres=>event) notifies for $xavp(cleanup_pres=>presentity_uri)\n");
pres_refresh_watchers("$xavp(cleanup_pres=>presentity_uri)", "$xavp(cleanup_pres=>event)", 1);
pv_unset("$xavp(cleanup_pres)");
}
@ -175,11 +176,11 @@ route[PRESENCE_PUBLISHER_CLEANUP]
$var(sqlres) = sql_query("cb", "delete from tmp_probe where action = 1");
if($var(sqlres) < 0) {
xlog("L_ERROR", "$var(ci)|log|error cleaning tmp_probe\n");
xlog("L_ERROR", "event|notify|error cleaning tmp_probe\n");
} else {
$var(nrows) = $sqlrows(cb);
if($var(nrows) > 0) {
xlog("L_DEBUG", "presence publisher cleanup processed $var(nrows) rows\n");
xlog("L_DEBUG", "event|notify|presence publisher cleanup processed $var(nrows) rows\n");
}
}
}
@ -187,17 +188,17 @@ route[PRESENCE_PUBLISHER_CLEANUP]
}
route[PRESENCE_DEFERRED_INIT]
route[KZ_DEFERRED_INIT_PRESENCE]
{
xlog("L_INFO", "processing presence deferred init\n");
xlog("L_INFO", "event|notify|processing presence deferred init\n");
$var(sqlres) = sql_query("cb", "update tmp_probe set action = 0 where action = 2");
if($var(sqlres) < 0) {
xlog("L_ERROR", "$var(ci)|log|error cleaning tmp_probe\n");
xlog("L_ERROR", "event|notify|error cleaning tmp_probe\n");
return;
} else {
$var(nrows) = $sqlrows(cb);
if($var(nrows) > 0) {
xlog("L_NOTICE", "scheduled update for $var(nrows) watched presentities/event\n");
xlog("L_NOTICE", "event|notify|scheduled update for $var(nrows) watched presentities/event\n");
}
}
}


+ 7
- 7
kamailio/presence-query.cfg View File

@ -5,7 +5,7 @@ kazoo.presence_query_reply_zones = KZ_PRESENCE_QUERY_REPLY_ZONES descr "0 - all,
route[PRESENCE_SEARCH_SUMMARY]
{
xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|query|processing presence summary query for $(kzE{kz.json,Realm})\n");
xlog("L_INFO", "event|presence_query|$(kzE{kz.json,Msg-ID}) processing presence summary query for $(kzE{kz.json,Realm})\n");
$var(Queue) = $(kzE{kz.json,Server-ID});
$var(Event) = $(kzE{kz.json,Event-Package});
$var(Domain) = $(kzE{kz.json,Realm});
@ -20,7 +20,7 @@ route[PRESENCE_SEARCH_SUMMARY]
$var(Query) = $var(Query) + $_s( and watcher_username = "$var(Username)");
}
$var(Query) = $var(Query) + " order by presentity_uri, event, watcher_username, callid";
xlog("L_DEBUG", "$ci| QUERY $var(Query)\n");
xlog("L_DEBUG", "event|presence_query|query $var(Query)\n");
if (sql_xquery("cb", "$var(Query)", "ra") == 1)
{
@ -48,7 +48,7 @@ route[PRESENCE_SEARCH_SUMMARY]
$var(Sep1)=", ";
}
}
xlog("L_DEBUG", "$ci| RESULT \"Subscriptions\" : { $var(Subs) }\n");
xlog("L_DEBUG", "event|presence_query|result \"Subscriptions\" : { $var(Subs) }\n");
$var(amqp_payload_request) = $_s({"Event-Category" : "presence", "Event-Name" : "search_resp", "Msg-ID" : "$(kzE{kz.json,Msg-ID})", "Subscriptions" : { $var(Subs) } });
kazoo_publish("targeted", "$var(Queue)", $var(amqp_payload_request));
@ -57,7 +57,7 @@ route[PRESENCE_SEARCH_SUMMARY]
route[PRESENCE_SEARCH_DETAIL]
{
xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|query|processing presence query detail for $(kzE{kz.json,Username}) in realm $(kzE{kz.json,Realm})\n");
xlog("L_INFO", "event|presence_query|$(kzE{kz.json,Msg-ID}) processing presence query detail for $(kzE{kz.json,Username}) in realm $(kzE{kz.json,Realm})\n");
$var(Queue) = $(kzE{kz.json,Server-ID});
$var(Msg-ID) = $(kzE{kz.json,Msg-ID});
$var(Event) = $(kzE{kz.json,Event-Package});
@ -71,14 +71,14 @@ route[PRESENCE_SEARCH_DETAIL]
$var(Query) = $var(Query) + $_s( and a.event = "$var(Event)");
}
$var(Query) = $var(Query) + " order by event, watcher_username, callid";
xlog("L_DEBUG", "$ci| STATUS QUERY $var(Query)\n");
xlog("L_DEBUG", "event|presence_query|status query $var(Query)\n");
if (sql_xquery("cb", "$var(Query)", "ra") == 1) {
while($xavp(ra) != $null) {
$var(Event) = $xavp(ra=>event);
while($xavp(ra) != $null && $var(Event) == $xavp(ra=>event)) {
$var(Sub) = $_s("$var(Username)" : {"$xavp(ra=>event)" : { "$xavp(ra=>watcher_username)" : {"kamailio@MY_HOSTNAME" : {"$xavp(ra=>callid)" : {"time" : $xavp(ra=>time), "result" : $xavp(ra=>result), "sent" : "$(xavp(ra=>sent_msg){s.escape.common}{s.replace,\','}{s.replace,$$,}{re.subst,/\\\\\\"/\\"/g})", "received" : "$(xavp(ra=>received_msg){s.escape.common}{s.replace,\','}{s.replace,$$,})", "user_agent" : "$(xavp(ra=>user_agent){s.escape.common}{s.replace,\','}{s.replace,$$,})"}}}}});
xlog("L_DEBUG", "$ci| RESULT \"Subscriptions\" : { $var(Sub) }\n");
xlog("L_DEBUG", "event|presence_query|result \"Subscriptions\" : { $var(Sub) }\n");
$var(amqp_payload_request) = '{"Event-Category" : "presence", "Event-Name" : "search_partial_resp", "Msg-ID" : "$var(Msg-ID)", "Subscriptions" : { $var(Sub) } }';
kazoo_publish("targeted", "$var(Queue)", $var(amqp_payload_request));
pv_unset("$xavp(ra)");
@ -105,7 +105,7 @@ event_route[kazoo:consumer-event-presence-search-req]
route(PRESENCE_SEARCH_DETAIL);
break;
default:
xlog("L_INFO", "$ci|search type '$(kzE{kz.json,Search-Type})' not handled\n");
xlog("L_INFO", "event|presence_query|search type '$(kzE{kz.json,Search-Type})' not handled\n");
}
}
}


+ 39
- 19
kamailio/presence-reset.cfg View File

@ -17,7 +17,7 @@ route[PRESENCE_RESET_ROUTE]
route[RESET_PUBLISHER]
{
xlog("L_INFO", "$var(Msg-ID)|reset|received presence reset for publisher $var(MediaUrl)\n");
xlog("L_INFO", "event|presence_reset|$var(Msg-ID) received presence reset for publisher $var(MediaUrl)\n");
if($sel(cfg_get.kazoo.presence_reset_blf_defer_update) == 0) {
$var(Query) = $_s(KZQ_RESET_PUBLISHER_UPDATE);
sql_query("exec", "$var(Query)");
@ -25,7 +25,7 @@ route[RESET_PUBLISHER]
$var(Query) = $_s(KZQ_PRESENCE_RESET);
sql_query("exec", "$var(Query)");
$var(presentities) = $sqlrows(exec);
xlog("L_INFO", "$var(Msg-ID)|reset|removed $var(presentities) presentities from publisher $var(MediaUrl)\n");
xlog("L_INFO", "event|presence_reset|$var(Msg-ID) removed $var(presentities) presentities from publisher $var(MediaUrl)\n");
if($var(presentities) > 0) {
route(PRESENCE_PUBLISHER_CLEANUP);
}
@ -35,7 +35,7 @@ route[PRESENCE_ZONE_UNAVAILABLE]
{
if($(kzE{kz.json,name}) == "presence") {
$var(Zone) = $(kzE{kz.json,zone});
xlog("L_WARN", "amqp|reset|resetting publisher zone $var(Zone)\n");
xlog("L_WARN", "event|presence_reset|resetting publisher zone $var(Zone)\n");
route(RESET_PUBLISHER_ZONE);
}
}
@ -49,7 +49,7 @@ route[RESET_PUBLISHER_ZONE]
$var(Query) = $_s(KZQ_PRESENCE_ZONE_RESET);
sql_query("exec", "$var(Query)");
$var(presentities) = $sqlrows(exec);
xlog("L_INFO", "amqp|reset|removed $var(presentities) presentities from zone $var(Zone)\n");
xlog("L_INFO", "event|presence_reset|removed $var(presentities) presentities from zone $var(Zone)\n");
if($var(presentities) > 0) {
route(PRESENCE_PUBLISHER_CLEANUP);
}
@ -57,33 +57,33 @@ route[RESET_PUBLISHER_ZONE]
route[RESET_ALL]
{
xlog("L_INFO", "$var(Msg-ID)|reset|received presence reset ALL\n");
xlog("L_INFO", "event|presence_reset|$var(Msg-ID) received presence reset ALL\n");
sql_query("exec", "delete from presentity");
$var(presentities) = $sqlrows(exec);
xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|removed $var(presentities) presentities\n");
xlog("L_INFO", "event|presence_reset|$(kzE{kz.json,Msg-ID}) removed $var(presentities) presentities\n");
}
route[RESET_ZONE]
{
xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|received presence reset for this zone (MY_AMQP_ZONE)\n");
xlog("L_INFO", "event|presence_reset|$(kzE{kz.json,Msg-ID}) received presence reset for this zone (MY_AMQP_ZONE)\n");
route(RESET_ALL);
}
route[RESET_SERVER]
{
xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|received presence reset for this server (MY_HOSTNAME)\n");
xlog("L_INFO", "event|presence_reset|$(kzE{kz.json,Msg-ID}) received presence reset for this server (MY_HOSTNAME)\n");
route(RESET_ALL);
}
route[RESET_ACCOUNT]
{
xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|received presence reset for realm $(kzE{kz.json,Realm})\n");
xlog("L_INFO", "event|presence_reset|$(kzE{kz.json,Msg-ID}) received presence reset for realm $(kzE{kz.json,Realm})\n");
sql_query("exec", 'KZQ_RESET_ACCOUNT_UPDATE');
$var(watchers) = $sqlrows(exec);
sql_query("exec", 'KZQ_RESET_ACCOUNT_RESET');
$var(presentities) = $sqlrows(exec);
xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|removed $var(presentities) presentities and expired $var(watchers) subscribers for realm $(kzE{kz.json,Realm})\n");
xlog("L_INFO", "event|presence_reset|$(kzE{kz.json,Msg-ID}) removed $var(presentities) presentities and expired $var(watchers) subscribers for realm $(kzE{kz.json,Realm})\n");
if($var(watchers) > 0) {
route(PRESENCE_PUBLISHER_CLEANUP);
}
@ -92,7 +92,7 @@ route[RESET_ACCOUNT]
route[RESET_WILDCARD]
{
if($(kzE{kz.json,Realm}) == "*" && $(kzE{kz.json,Username}) == "*") {
xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|received presence reset for cluster\n");
xlog("L_INFO", "event|presence_reset|$(kzE{kz.json,Msg-ID}) received presence reset for cluster\n");
route(RESET_ALL);
} else {
if($(kzE{kz.json,Realm}) == "*") {
@ -107,7 +107,7 @@ route[RESET_WILDCARD]
$var(MediaUrl) = $(kzE{kz.json,Username});
route(RESET_PUBLISHER);
} else {
xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|received presence wildcard reset for $(kzE{kz.json,Username}). 'MY_AMQP_ZONE/MY_HOSTNAME' doesn't care\n");
xlog("L_INFO", "event|presence_reset|$(kzE{kz.json,Msg-ID}) received presence wildcard reset for $(kzE{kz.json,Username}). 'MY_AMQP_ZONE/MY_HOSTNAME' doesn't care\n");
}
}
}
@ -125,30 +125,50 @@ event_route[kazoo:consumer-event-presence-reset]
exit();
}
xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|received presence reset for $(kzE{kz.json,Username})@$(kzE{kz.json,Realm})\n");
xlog("L_INFO", "event|presence_reset|$(kzE{kz.json,Msg-ID}) received presence reset for $(kzE{kz.json,Username})@$(kzE{kz.json,Realm})\n");
$var(presentity) = $_s(sip:$(kzE{kz.json,Username})@$(kzE{kz.json,Realm}));
route(COUNT_SUBSCRIBERS);
sql_query("exec", 'KZQ_EVENT_PRESENCE_RESET_DELETE');
if($xavp(watchers=>message-summary) > 0) {
xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|notifying $xavp(watchers=>message-summary) message-summary subscribers of $var(presentity)\n");
xlog("L_INFO", "event|presence_reset|$(kzE{kz.json,Msg-ID}) notifying $xavp(watchers=>message-summary) message-summary subscribers of $var(presentity)\n");
pres_refresh_watchers("$var(presentity)", "message-summary", 1);
} else {
xlog("L_DEBUG", "$(kzE{kz.json,Msg-ID})|reset|skip message-summary subscriber notification for $var(presentity)\n");
xlog("L_DEBUG", "event|presence_reset|$(kzE{kz.json,Msg-ID}) skip message-summary subscriber notification for $var(presentity)\n");
}
if($xavp(watchers=>presence) > 0) {
xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|notifying $xavp(watchers=>presence) presence subscribers of $var(presentity)\n");
xlog("L_INFO", "event|presence_reset|$(kzE{kz.json,Msg-ID}) notifying $xavp(watchers=>presence) presence subscribers of $var(presentity)\n");
pres_refresh_watchers("$var(presentity)", "presence", 1);
} else {
xlog("L_DEBUG", "$(kzE{kz.json,Msg-ID})|reset|skip presence subscriber notification for $var(presentity)\n");
xlog("L_DEBUG", "event|presence_reset|$(kzE{kz.json,Msg-ID}) skip presence subscriber notification for $var(presentity)\n");
}
if($xavp(watchers=>dialog) > 0) {
xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|notifying $xavp(watchers=>dialog) dialog subscribers of $var(presentity)\n");
xlog("L_INFO", "event|presence_reset|$(kzE{kz.json,Msg-ID}) notifying $xavp(watchers=>dialog) dialog subscribers of $var(presentity)\n");
pres_refresh_watchers("$var(presentity)", "dialog", 1);
} else {
xlog("L_DEBUG", "$(kzE{kz.json,Msg-ID})|reset|skip dialog subscriber notification for $var(presentity)\n");
xlog("L_DEBUG", "event|presence_reset|$(kzE{kz.json,Msg-ID}) skip dialog subscriber notification for $var(presentity)\n");
}
}
route[MEDIA_SERVER_UP_RESET_PUBLISHER]
{
route(RESET_PUBLISHER);
}
route[MEDIA_SERVER_DOWN_RESET_PUBLISHER]
{
route(RESET_PUBLISHER);
}
route[MEDIA_SERVER_RESTART_RESET_PUBLISHER]
{
route(RESET_PUBLISHER);
}
route[MEDIA_SERVER_RECONNECTED_RESET_PUBLISHER]
{
route(RESET_PUBLISHER);
}

+ 55
- 66
kamailio/presence-role.cfg View File

@ -163,20 +163,20 @@ route[HANDLE_NEW_SUBSCRIBE]
if ($tU == $null) {
xlog("L_INFO", "$ci|stop|ignoring subscribe with empty TO username from a $ua\n");
xlog("L_INFO", "$ci|end|ignoring subscribe with empty TO username from a $ua\n");
send_reply(400, "Missing TO username");
return;
}
if ($fU == $null) {
xlog("L_INFO", "$ci|stop|ignoring subscribe with empty FROM username from a $ua\n");
xlog("L_INFO", "$ci|end|ignoring subscribe with empty FROM username from a $ua\n");
send_reply(400, "Missing FROM username");
return;
}
if($shtinc(first=>$ci) > 1) {
sql_query("exec", 'KZQ_HANDLE_NEW_SUBSCRIBE_DELETE1');
xlog("L_INFO", "$ci|subscribe|resetting $hdr(Event) subscription from $fU to $tU in realm $fd : $sqlrows(exec)\n");
xlog("L_INFO", "$ci|presence|resetting $hdr(Event) subscription from $fU to $tU in realm $fd : $sqlrows(exec)\n");
} else {
$var(presentity_uri) = $ru;
if($(var(presentity_uri){uri.user}) == "") {
@ -184,7 +184,7 @@ route[HANDLE_NEW_SUBSCRIBE]
}
if($shtinc(first=>$fU::$var(presentity_uri)::$fd::$hdr(Event)) > 1) {
sql_query("exec", 'KZQ_HANDLE_NEW_SUBSCRIBE_DELETE2');
xlog("L_INFO", "$ci|subscribe|resetting $hdr(Event) subscription from $fU to $var(presentity_uri) in realm $fd : $sqlrows(exec)\n");
xlog("L_INFO", "$ci|presence|resetting $hdr(Event) subscription from $fU to $var(presentity_uri) in realm $fd : $sqlrows(exec)\n");
}
}
@ -197,10 +197,10 @@ route[HANDLE_NEW_SUBSCRIBE]
route(PRESENCE_NAT);
#!endif
} else {
xlog("L_INFO", "$ci|stop|error $T_reply_code for new $hdr(Event) subscription from $fU to $tU in realm $fd\n");
xlog("L_INFO", "$ci|end|error $T_reply_code for new $hdr(Event) subscription from $fU to $tU in realm $fd\n");
}
} else {
xlog("L_INFO", "$ci|stop|unsupported subscription package $hdr(Event) from $fU to $tU in realm $fd\n");
xlog("L_INFO", "$ci|end|unsupported subscription package $hdr(Event) from $fU to $tU in realm $fd\n");
send_reply(489, "Bad Event");
}
}
@ -227,7 +227,7 @@ route[REQUEST_PROBE]
$var(mwi) = $(tU{s.substr,3,0});
route(REQUEST_MWI);
} else {
xlog("L_INFO", "$ci|sub|requesting $hdr(Event) probe for $subs(to_user) in realm $subs(to_domain)\n");
xlog("L_INFO", "$ci|presence|requesting $hdr(Event) probe for $subs(to_user) in realm $subs(to_domain)\n");
$var(rk) = "probes." + $hdr(Event);
$var(amqp_payload_request) = $_s({"Event-Category" : "presence", "Event-Name" : "probe", "Event-Package" : "$hdr(event)", "Username" : "$subs(to_user)", "Realm" : "$subs(to_domain)", "Call-ID" : "$ci"});
kazoo_publish("presence", "$var(rk)", $var(amqp_payload_request));
@ -239,7 +239,7 @@ route[REQUEST_PROBE]
route[REQUEST_MWI]
{
xlog("L_INFO", "$ci|sub|requesting mwi probe for $var(mwi) in realm $subs(to_domain)\n");
xlog("L_INFO", "$ci|presence|requesting mwi probe for $var(mwi) in realm $subs(to_domain)\n");
$var(rk) = "mwi_queries." + $(subs(to_domain){kz.encode});
$var(amqp_payload_request) = $_s({"Event-Category" : "presence", "Event-Name" : "mwi_query", "Username" : "$var(mwi)", "Realm" : "$fd", "Call-ID" : "$ci"});
kazoo_publish("presence", "$var(rk)", $var(amqp_payload_request));
@ -348,7 +348,7 @@ event_route[kazoo:consumer-event-presence-dialog-update]
$var(kz_presence_log_level) = $(sel(cfg_get.kazoo.presence_no_targets_log_level){s.int});
$var(StartRoute) = $(TV(Sn){s.replace,.,});
$var(delta_to_start) = $var(StartRoute) - $(kzE{kz.json,AMQP-Received});
xlog("L_DEBUG", "$(kzE{kz.json,Call-ID})|log|received $(kzE{kz.json,Event-Package}) update for $(kzE{kz.json,From}) state $(kzE{kz.json,State}) from $(kzE{kz.json,AMQP-Broker-Zone}) => $(kzE{kz.json,Switch-URI}) (Δ1 $(kzE{kz.json,AMQP-Elapsed-Micro}) μs , Δ2 $var(delta_to_start) μs)\n");
xlog("L_DEBUG", "event|presence|$(kzE{kz.json,Call-ID}) received $(kzE{kz.json,Event-Package}) update for $(kzE{kz.json,From}) state $(kzE{kz.json,State}) from $(kzE{kz.json,AMQP-Broker-Zone}) => $(kzE{kz.json,Switch-URI}) (Δ1 $(kzE{kz.json,AMQP-Elapsed-Micro}) μs , Δ2 $var(delta_to_start) μs)\n");
$var(JObj) = $kzE;
route(PRESENCE_FAST_PICKUP_INIT);
@ -361,7 +361,7 @@ event_route[kazoo:consumer-event-presence-dialog-update]
$var(EndRoute) = $(TV(Sn){s.replace,.,});
$var(delta_to_finish) = $var(EndRoute) - $var(StartRoute);
xlog("$var(kz_presence_log_level)", "$(kzE{kz.json,Call-ID})|log|$(kzE{kz.json,Event-Package}) update for $(kzE{kz.json,From}) state $(kzE{kz.json,State}) from $(kzE{kz.json,AMQP-Broker-Zone}) => $(kzE{kz.json,Switch-URI}) (Δ1 $(kzE{kz.json,AMQP-Elapsed-Micro}) μs , Δ2 $var(delta_to_start) μs, Δ3 $var(delta_to_finish) μs)\n");
xlog("$var(kz_presence_log_level)", "event|presence|$(kzE{kz.json,Call-ID}) $(kzE{kz.json,Event-Package}) update for $(kzE{kz.json,From}) state $(kzE{kz.json,State}) from $(kzE{kz.json,AMQP-Broker-Zone}) => $(kzE{kz.json,Switch-URI}) (Δ1 $(kzE{kz.json,AMQP-Elapsed-Micro}) μs , Δ2 $var(delta_to_start) μs, Δ3 $var(delta_to_finish) μs)\n");
}
event_route[kazoo:consumer-event-presence-mwi-update]
@ -369,24 +369,24 @@ event_route[kazoo:consumer-event-presence-mwi-update]
$var(kz_presence_log_level) = $(sel(cfg_get.kazoo.presence_no_targets_log_level){s.int});
$var(StartRoute) = $(TV(Sn){s.replace,.,});
$var(delta_to_start) = $var(StartRoute) - $(kzE{kz.json,AMQP-Received});
xlog("L_DBG", "$(kzE{kz.json,Call-ID})|log|received message-summary update for $(kzE{kz.json,From}) ($(kzE{kz.json,AMQP-Broker-Zone}))\n");
xlog("L_DBG", "event|presence|$(kzE{kz.json,Call-ID}) received message-summary update for $(kzE{kz.json,From}) ($(kzE{kz.json,AMQP-Broker-Zone}))\n");
$var(presentity) = $(kzE{kz.json,From});
$var(payload) = $kzE;
route(COUNT_SUBSCRIBERS);
if($xavp(watchers=>message-summary) > 0) {
$var(kz_presence_log_level) = $(sel(cfg_get.kazoo.presence_with_targets_log_level){s.int});
xlog("L_INFO", "$(kzE{kz.json,Call-ID})|log|publishing $(kzE{kz.json,From}) message-summary update for $xavp(watchers=>message-summary) watchers\n");
xlog("L_INFO", "event|presence|$(kzE{kz.json,Call-ID}) publishing $(kzE{kz.json,From}) message-summary update for $xavp(watchers=>message-summary) watchers\n");
kazoo_pua_publish_mwi($kzE);
pres_refresh_watchers("$(kzE{kz.json,From})", "message-summary", 1);
} else {
#!ifdef PRESENCE_TRACK_ALL_PKG_MWI
$var(kz_presence_log_level) = $(sel(cfg_get.kazoo.presence_with_targets_log_level){s.int});
xlog("L_DEBUG", "$(var(payload){kz.json,Call-ID})|log|saving $var(presentity) from mwi update => $var(payload)\n");
xlog("L_DEBUG", "event|presence|$(var(payload){kz.json,Call-ID}) saving $var(presentity) from mwi update => $var(payload)\n");
if(kazoo_pua_publish_mwi($kzE) != 1) {
xlog("L_ERR", "$(var(payload){kz.json,Call-ID})|log|error publishing $var(presentity) mwi update => $var(payload)\n");
xlog("L_ERR", "event|presence|$(var(payload){kz.json,Call-ID}) error publishing $var(presentity) mwi update => $var(payload)\n");
}
#!else
xlog("L_DEBUG", "$(var(payload){kz.json,Call-ID})|log|skip mwi update for $var(presentity)\n");
xlog("L_DEBUG", "event|presence|$(var(payload){kz.json,Call-ID}) skip mwi update for $var(presentity)\n");
#!endif
}
@ -399,7 +399,7 @@ event_route[kazoo:consumer-event-presence-mwi-update]
$var(EndRoute) = $(TV(Sn){s.replace,.,});
$var(delta_to_finish) = $var(EndRoute) - $var(StartRoute);
xlog("$var(kz_presence_log_level)", "$(kzE{kz.json,Call-ID})|log|message-summary update for $(kzE{kz.json,From}) light should be $var(mwi_state) (Δ1 $(kzE{kz.json,AMQP-Elapsed-Micro}) μs , Δ2 $var(delta_to_start) μs, Δ3 $var(delta_to_finish) μs)\n");
xlog("$var(kz_presence_log_level)", "event|presence|$(kzE{kz.json,Call-ID}) message-summary update for $(kzE{kz.json,From}) light should be $var(mwi_state) (Δ1 $(kzE{kz.json,AMQP-Elapsed-Micro}) μs , Δ2 $var(delta_to_start) μs, Δ3 $var(delta_to_finish) μs)\n");
}
@ -410,12 +410,12 @@ event_route[kazoo:consumer-event-presence-update]
$var(delta_to_start) = $var(StartRoute) - $(kzE{kz.json,AMQP-Received});
if($sel(cfg_get.kazoo.presence_ignore_status_probe_resp) == 1) {
if($(kzE{kz.json,State}) == "offline" || $(kzE{kz.json,State}) == "online") {
xlog("L_DEBUG", "$(kzE{kz.json,Call-ID})|log|ignoring $(kzE{kz.json,State}) state $(kzE{kz.json,Presence-ID})\n");
xlog("L_DEBUG", "event|presence|$(kzE{kz.json,Call-ID}) ignoring $(kzE{kz.json,State}) state $(kzE{kz.json,Presence-ID})\n");
return;
}
}
xlog("L_DEBUG", "$(kzE{kz.json,Call-ID})|log|received presence update for $(kzE{kz.json,Presence-ID})\n");
xlog("L_DEBUG", "event|presence|$(kzE{kz.json,Call-ID}) received presence update for $(kzE{kz.json,Presence-ID})\n");
$var(JObj) = $kzE;
$var(presentity) = $_s(sip:$(kzE{kz.json,Presence-ID}));
$var(payload) = $kzE;
@ -424,7 +424,7 @@ event_route[kazoo:consumer-event-presence-update]
$var(EndRoute) = $(TV(Sn){s.replace,.,});
$var(delta_to_finish) = $var(EndRoute) - $var(StartRoute);
xlog("$var(kz_presence_log_level)", "$(kzE{kz.json,Call-ID})|log|$(kzE{kz.json,Event-Package}) update for $(kzE{kz.json,From}) state $(kzE{kz.json,State}) from $(kzE{kz.json,AMQP-Broker-Zone}) => $(kzE{kz.json,Switch-URI}) (Δ1 $(kzE{kz.json,AMQP-Elapsed-Micro}) μs , Δ2 $var(delta_to_start) μs, Δ3 $var(delta_to_finish) μs)\n");
xlog("$var(kz_presence_log_level)", "event|presence|$(kzE{kz.json,Call-ID}) $(kzE{kz.json,Event-Package}) update for $(kzE{kz.json,From}) state $(kzE{kz.json,State}) from $(kzE{kz.json,AMQP-Broker-Zone}) => $(kzE{kz.json,Switch-URI}) (Δ1 $(kzE{kz.json,AMQP-Elapsed-Micro}) μs , Δ2 $var(delta_to_start) μs, Δ3 $var(delta_to_finish) μs)\n");
}
route[PRESENCE_UPDATE]
@ -440,71 +440,74 @@ route[PRESENCE_UPDATE]
( $(var(payload){kz.json,State}) == "early" ||
($(var(payload){kz.json,State}) == "confirmed" && $(var(payload){kz.json,State}) == "initiator")
)) {
xlog("L_WARN", "$(var(payload){kz.json,Call-ID})|log|not publishing state $(var(payload){kz.json,State}) for presentity $var(presentity) with $xavp(watchers=>self) calls, policy limit of $sel(cfg_get.kazoo.presence_max_call_per_presentity) calls per presentity \n");
xlog("L_WARN", "event|presence|$(var(payload){kz.json,Call-ID}) not publishing state $(var(payload){kz.json,State}) for presentity $var(presentity) with $xavp(watchers=>self) calls, policy limit of $sel(cfg_get.kazoo.presence_max_call_per_presentity) calls per presentity \n");
} else {
if($xavp(watchers=>dialog) > 0) {
$var(kz_presence_log_level) = $(sel(cfg_get.kazoo.presence_with_targets_log_level){s.int});
if($(var(payload){kz.json,State}) == "terminated") {
xlog("L_DEBUG", "$(var(payload){kz.json,Call-ID})|log|publishing $var(presentity) dialog update for terminated dialog\n");
xlog("L_DEBUG", "event|presence|$(var(payload){kz.json,Call-ID}) publishing $var(presentity) dialog update for terminated dialog\n");
} else {
xlog("L_DEBUG", "$(var(payload){kz.json,Call-ID})|log|publishing $var(presentity) dialog update for $xavp(watchers=>dialog) watchers\n");
xlog("L_DEBUG", "event|presence|$(var(payload){kz.json,Call-ID}) publishing $var(presentity) dialog update for $xavp(watchers=>dialog) watchers\n");
}
if(kazoo_pua_publish_dialoginfo($var(JObj)) == 1) {
pres_refresh_watchers("$var(presentity)", "dialog", 1);
} else {
xlog("L_ERR", "$(var(payload){kz.json,Call-ID})|log|error publishing $var(presentity) dialog update\n");
xlog("L_ERR", "event|presence|$(var(payload){kz.json,Call-ID}) error publishing $var(presentity) dialog update\n");
};
} else {
#!ifdef PRESENCE_TRACK_ALL_PKG_DIALOG
if($(kzE{kz.json,Event-Package}) == "dialog") {
$var(kz_presence_log_level) = $(sel(cfg_get.kazoo.presence_with_targets_log_level){s.int});
xlog("L_DEBUG", "$(var(payload){kz.json,Call-ID})|log|saving $var(presentity) from dialog update => $var(payload)\n");
xlog("L_DEBUG", "event|presence|$(var(payload){kz.json,Call-ID}) saving $var(presentity) from dialog update => $var(payload)\n");
if(kazoo_pua_publish_dialoginfo($var(JObj)) != 1) {
xlog("L_ERR", "$(var(payload){kz.json,Call-ID})|log|error publishing $var(presentity) dialog update => $var(payload)\n");
xlog("L_ERR", "event|presence|$(var(payload){kz.json,Call-ID}) error publishing $var(presentity) dialog update => $var(payload)\n");
}
}
#!else
xlog("L_DEBUG", "$(var(payload){kz.json,Call-ID})|log|skip dialog update for $var(presentity)\n");
xlog("L_DEBUG", "event|presence|$(var(payload){kz.json,Call-ID}) skip dialog update for $var(presentity)\n");
#!endif
}
if($xavp(watchers=>presence) > 0) {
$var(kz_presence_log_level) = $(sel(cfg_get.kazoo.presence_with_targets_log_level){s.int});
if($(var(payload){kz.json,State}) == "terminated") {
xlog("L_DEBUG", "$(var(payload){kz.json,Call-ID})|log|publishing $var(presentity) presence update for terminated dialog\n");
xlog("L_DEBUG", "event|presence|$(var(payload){kz.json,Call-ID}) publishing $var(presentity) presence update for terminated dialog\n");
} else {
xlog("L_DEBUG", "$(var(payload){kz.json,Call-ID})|log|publishing $var(presentity) presence update for $xavp(watchers=>presence) watchers\n");
xlog("L_DEBUG", "event|presence|$(var(payload){kz.json,Call-ID}) publishing $var(presentity) presence update for $xavp(watchers=>presence) watchers\n");
}
if(kazoo_pua_publish_presence($var(JObj)) == 1) {
pres_refresh_watchers("$var(presentity)", "presence", 1);
} else {
xlog("L_ERR", "$(var(payload){kz.json,Call-ID})|log|error publishing $var(presentity) presence update\n");
xlog("L_ERR", "event|presence|$(var(payload){kz.json,Call-ID}) error publishing $var(presentity) presence update\n");
};
} else {
#!ifdef PRESENCE_TRACK_ALL_PKG_PRESENCE
if($(kzE{kz.json,Event-Package}) == "presence") {
$var(kz_presence_log_level) = $(sel(cfg_get.kazoo.presence_with_targets_log_level){s.int});
xlog("L_DEBUG", "$(var(payload){kz.json,Call-ID})|log|saving $var(presentity) from presence update => $var(payload)\n");
xlog("L_DEBUG", "event|presence|$(var(payload){kz.json,Call-ID}) saving $var(presentity) from presence update => $var(payload)\n");
if(kazoo_pua_publish_presence($var(JObj)) != 1) {
xlog("L_ERR", "$(var(payload){kz.json,Call-ID})|log|error publishing $var(presentity) presence update => $var(payload)\n");
xlog("L_ERR", "event|presence|$(var(payload){kz.json,Call-ID}) error publishing $var(presentity) presence update => $var(payload)\n");
}
}
#!else
xlog("L_DEBUG", "$(var(payload){kz.json,Call-ID})|log|skip presence update for $var(presentity)\n");
xlog("L_DEBUG", "event|presence|$(var(payload){kz.json,Call-ID}) skip presence update for $var(presentity)\n");
#!endif
}
}
}
#!define MWI_PRESENCE_BODY $(kzE{re.subst,/"Messages-Waiting"\s*\:\s*"[^"]*"/"State" : "$var(State)"/} \
{re.subst,/"From"\s*\:\s*"[^"]*"/"From" : "$var(presentity)"/} \
{re.subst,/"From-User"\s*\:\s*"[^"]*"/"From-User" : "$var(user)"/} \
{re.subst,/"To"\s*\:\s*"[^"]*"/"To" : "$var(presentity)"/} \
{re.subst,/"To-User"\s*\:\s*"[^"]*"/"To-User" : "$var(user)"/} \
{re.subst,/"Messages-New"\s*\:\s*[^,]*/"Direction" : "initiator"/} \
{re.subst,/"Event-Name"\s*\:\s*"[^"]*"/"Event-Name" : "presence"/});
route[MWI_PRESENCE_BODY]
{
$var(mwi_body) = $(kzE{re.subst,/"Messages-Waiting"\s*\:\s*"[^"]*"/"State" : "$var(State)"/});
$var(mwi_body) = $(var(mwi_body){re.subst,/"From"\s*\:\s*"[^"]*"/"From" : "$var(presentity)"/});
$var(mwi_body) = $(var(mwi_body){re.subst,/"From-User"\s*\:\s*"[^"]*"/"From-User" : "$var(user)"/});
$var(mwi_body) = $(var(mwi_body){re.subst,/"To"\s*\:\s*"[^"]*"/"To" : "$var(presentity)"/});
$var(mwi_body) = $(var(mwi_body){re.subst,/"To-User"\s*\:\s*"[^"]*"/"To-User" : "$var(user)"/});
$var(mwi_body) = $(var(mwi_body){re.subst,/"Messages-New"\s*\:\s*[^,]*/"Direction" : "initiator"/});
$var(mwi_body) = $(var(mwi_body){re.subst,/"Event-Name"\s*\:\s*"[^"]*"/"Event-Name" : "presence"/});
}
route[MWI_AS_PRESENCE]
{
@ -521,41 +524,27 @@ route[MWI_AS_PRESENCE]
$var(State) = "terminated";
}
$var(payload) = MWI_PRESENCE_BODY
route(MWI_PRESENCE_BODY);
$var(payload) = $var(mwi_body);
$var(JObj) = $var(payload);
route(PRESENCE_UPDATE);
}
route[PRESENCE_BINDINGS]
route[KZ_AMQP_BINDING_PRESENCE]
{
#!import_file "presence-custom-bindings.cfg"
#!ifndef PRESENCE_CUSTOM_BINDINGS
$var(payload) = $_s({ "name" : "presence", "exchange" : "presence", "type" : "topic", "queue" : "presence-dialog-MY_HOSTNAME", "routing" : ["dialog.*.*", "update.*.*", "mwi_updates.*.*"], "exclusive" : false, "federate" : true });
kazoo_subscribe("$var(payload)");
#!endif
route(PRESENCE_API_BINDINGS);
route(PRESENCE_FAST_PICKUP_START);
}
route[PRESENCE_API_BINDINGS]
{
#!import_file "presence-api-custom-bindings.cfg"
#!ifndef PRESENCE_API_CUSTOM_BINDINGS
$var(payload) = $_s({"name": "presence-api", "exchange": "presence", "type": "topic", "queue": "presence-api-MY_HOSTNAME", "routing": ["presence.search_req.*", "presence.reset.*.*"], "exclusive": false, "federate": true });
kazoo_subscribe("$var(payload)");
#!endif
if(!check_route_exists("KZ_AMQP_BINDING_CUSTOM_PRESENCE")) {
$var(payload) = $_s({ "name" : "presence", "exchange" : "presence", "type" : "topic", "queue" : "presence-dialog-MY_HOSTNAME", "routing" : ["dialog.*.*", "update.*.*", "mwi_updates.*.*"], "exclusive" : false, "federate" : true });
kazoo_subscribe("$var(payload)");
}
}
route[PRESENCE_LOCAL_REQUEST]
route[KZ_AMQP_BINDING_PRESENCE_API]
{
route(PRESENCE_LOCAL_REQ_NOTIFY);
if(!check_route_exists("KZ_AMQP_BINDING_CUSTOM_PRESENCE_API")) {
$var(payload) = $_s({"name": "presence-api", "exchange": "presence", "type": "topic", "queue": "presence-api-MY_HOSTNAME", "routing": ["presence.search_req.*", "presence.reset.*.*"], "exclusive": false, "federate": true });
kazoo_subscribe("$var(payload)");
}
}
route[PRESENCE_AUTHN]


+ 19
- 0
kamailio/prometheus.cfg View File

@ -0,0 +1,19 @@
######## Prometheus Exporter ########
#!trydef PROMETHEUS_PORT 9494
#!substdef "!TCP_PROMETHEUS!tcp:MY_IP_ADDRESS:$def(PROMETHEUS_PORT)!g"
#!substdef "!PROMETHEUS_TCP_LISTENER!TCP_PROMETHEUS!g"
listen=PROMETHEUS_TCP_LISTENER
loadmodule "xhttp_prom.so"
# show all kamailio statistics.
modparam("xhttp_prom", "xhttp_prom_stats", "all")
modparam("xhttp_prom", "xhttp_prom_buf_size", 65536)
route[PROMETHEUS_REQUEST]
{
if (prom_check_uri()) {
prom_dispatch();
exit;
}
}

+ 177
- 181
kamailio/pusher-role.cfg View File

@ -8,216 +8,212 @@ modparam("htable", "htable", "push_cache=>autoexpire=60;")
route[PUSHER_ROUTE]
{
if ( (!is_method("INVITE")) || (!isflagset(FLAG_INTERNALLY_SOURCED)) || $hdr(X-KAZOO-PUSHER-Token-ID) == $null)
return;
xlog("L_INFO", "$ci|pusher|start deliver call to $hdr(X-KAZOO-PUSHER-Token-ID)\n");
if(route(PUSHER_PREPARE_PUSH)) {
if(reg_fetch_contacts("location", "$hdr(X-KAZOO-AOR)", "callee")) {
$du = $(ulc(callee=>received));
$fs = $(ulc(callee=>socket));
xlog("L_INFO", "$ci|pusher|routing $hdr(X-KAZOO-AOR) to contact $du\n");
send_reply(100, "calling a push device");
t_set_fr(0, 2000);
route(PUSHER_TO_EXTERNAL_RELAY);
} else {
send_reply(100, "waking the push device");
route(PUSHER_SEND_PUSH_NOTIFICATION);
}
}
exit();
if ( (!is_method("INVITE")) || (!isflagset(FLAG_INTERNALLY_SOURCED)) || $hdr(X-KAZOO-PUSHER-Token-ID) == $null) return;
xlog("L_INFO", "$ci|pusher|start deliver call to $hdr(X-KAZOO-PUSHER-Token-ID)\n");
if(route(PUSHER_PREPARE_PUSH)) {
if(reg_fetch_contacts("location", "$hdr(X-KAZOO-AOR)", "callee")) {
$du = $(ulc(callee=>received));
$fs = $(ulc(callee=>socket));
xlog("L_INFO", "$ci|pusher|routing $hdr(X-KAZOO-AOR) to contact $du\n");
send_reply(100, "calling a push device");
t_set_fr(0, 2000);
route(PUSHER_TO_EXTERNAL_RELAY);
} else {
send_reply(100, "waking the push device");
route(PUSHER_SEND_PUSH_NOTIFICATION);
}
}
exit();
}
route[PUSHER_TO_EXTERNAL_RELAY]
{
remove_hf_re("^X-.*");
set_forward_no_connect();
t_on_branch("MANAGE_BRANCH");
t_on_reply("EXTERNAL_REPLY");
t_on_failure("PUSHER_EXTERNAL_FAULT");
t_relay();
record_route();
route(REMOVE_RESERVED_HEADERS);
set_forward_no_connect();
t_on_branch("MANAGE_BRANCH");
t_on_reply("EXTERNAL_REPLY");
t_on_failure("PUSHER_EXTERNAL_FAULT");
t_relay();
}
failure_route[PUSHER_EXTERNAL_FAULT]
{
if (!t_check_status("486|487|603") && $avp(push_sent) != 1) {
send_reply(182, "sending push notification");
route(PUSHER_SEND_PUSH_NOTIFICATION);
} else if (t_check_status("487")) {
xlog("L_INFO", "$ci|pusher|push transaction canceled\n");
t_reply("$T_reply_code", "pusher canceled");
} else {
xlog("L_INFO", "$ci|pusher|push transaction result - $T_reply_code\n");
t_reply("$T_reply_code", "pusher failed");
}
if (!t_check_status("486|487|603") && $avp(push_sent) != 1) {
send_reply(182, "sending push notification");
route(PUSHER_SEND_PUSH_NOTIFICATION);
} else if (t_check_status("487")) {
xlog("L_INFO", "$ci|pusher|push transaction canceled\n");
t_reply("$T_reply_code", "pusher canceled");
} else {
xlog("L_INFO", "$ci|pusher|push transaction result - $T_reply_code\n");
t_reply("$T_reply_code", "pusher failed");
}
}
route[PUSHER_PREPARE_PUSH]
{
if (t_newtran()) {
route(PUSHER_PREPARE_PUSH_PAYLOAD);
remove_hf_re("^X-.*");
t_save_lumps();
t_set_auto_inv_100(0);
return 1;
} else {
sl_send_reply(500, "error creating transaction for waking the dead guy");
return 0;
}
$var(nt) = t_newtran();
if ($var(nt) != 0) {
route(PUSHER_PREPARE_PUSH_PAYLOAD);
route(REMOVE_RESERVED_HEADERS);
t_save_lumps();
t_set_auto_inv_100(0);
return 1;
} else {
sl_send_reply(500, "error creating transaction for waking the dead guy");
return 0;
}
}
route[PUSHER_PREPARE_PUSH_PAYLOAD]
{
$var(TokenID) = $hdr(X-KAZOO-PUSHER-Token-ID);
$var(TokenType) = $hdr(X-KAZOO-PUSHER-Token-Type);
$var(TokenApp) = $hdr(X-KAZOO-PUSHER-Token-App);
$var(TokenProxy) = $hdr(X-KAZOO-PUSHER-Token-Proxy);
#!ifdef PUSHER_TOKEN_PROXY
$var(TokenProxy) = $_s(PUSHER_TOKEN_PROXY);
#!endif
### token for fast reg ###
$var(TokenReg) = $uuid(g);
$sht(push_cache=>$var(TokenReg)) = 1;
### caller-id ###
if($hdr(Remote-Party-ID) != $null) {
$var(from_user) = $(hdr(Remote-Party-ID){tobody.user});
$var(from_name) = $(hdr(Remote-Party-ID){tobody.display}{re.subst,/"//g});
} else if($hdr(P-Asserted-Identity) != $null) {
$var(from_user) = $(hdr(P-Asserted-Identity){tobody.user});
$var(from_name) = $(hdr(P-Asserted-Identity){tobody.display}{re.subst,/"//g});
} else if($hdr(P-Preferred-Identity) != $null) {
$var(from_user) = $(hdr(P-Preferred-Identity){tobody.user});
$var(from_name) = $(hdr(P-Preferred-Identity){tobody.display}{re.subst,/"//g});
} else {
$var(from_user) = $(hdr(From){tobody.user});
$var(from_name) = $(hdr(From){tobody.display}{re.subst,/"//g});
}
$var(from) = $_s($var(from_user) - $var(from_name));
$var(PushPayload) = $_s({"call-id" : "$ci", "proxy" : "$var(TokenProxy)", "caller-id-number" : "$var(from_user)", "caller-id-name" : "$var(from_name)", "registration-token" : "$var(TokenReg)"});
$var(Payload) = $_s({ "Event-Category" : "notification", "Event-Name" : "push_req", "Call-ID" : "$ci", "Token-ID" : "$var(TokenID)", "Token-Type" : "$var(TokenType)", "Token-App" : "$var(TokenApp)", "Alert-Key" : "IC_SIL", "Alert-Params" : ["$var(from)"], "Sound" : "ring.caf", "Payload" : $var(PushPayload) });
$avp(push_routing_key) = "notification.push." + $var(TokenType) + "." + $var(TokenID);
$avp(push_payload) = $var(Payload);
$var(TokenID) = $hdr(X-KAZOO-PUSHER-Token-ID);
$var(TokenType) = $hdr(X-KAZOO-PUSHER-Token-Type);
$var(TokenApp) = $hdr(X-KAZOO-PUSHER-Token-App);
$var(TokenProxy) = $hdr(X-KAZOO-PUSHER-Token-Proxy);
#!ifdef PUSHER_TOKEN_PROXY
$var(TokenProxy) = $_s(PUSHER_TOKEN_PROXY);
#!endif
### token for fast reg ###
$var(TokenReg) = $uuid(g);
$sht(push_cache=>$var(TokenReg)) = 1;
### caller-id ###
if($hdr(Remote-Party-ID) != $null) {
$var(from_user) = $(hdr(Remote-Party-ID){tobody.user});
$var(from_name) = $(hdr(Remote-Party-ID){tobody.display}{re.subst,/"//g});
} else if($hdr(P-Asserted-Identity) != $null) {
$var(from_user) = $(hdr(P-Asserted-Identity){tobody.user});
$var(from_name) = $(hdr(P-Asserted-Identity){tobody.display}{re.subst,/"//g});
} else if($hdr(P-Preferred-Identity) != $null) {
$var(from_user) = $(hdr(P-Preferred-Identity){tobody.user});
$var(from_name) = $(hdr(P-Preferred-Identity){tobody.display}{re.subst,/"//g});
} else {
$var(from_user) = $(hdr(From){tobody.user});
$var(from_name) = $(hdr(From){tobody.display}{re.subst,/"//g});
}
$var(from) = $_s($var(from_user) - $var(from_name));
$var(PushPayload) = $_s({"call-id" : "$ci", "proxy" : "$var(TokenProxy)", "caller-id-number" : "$var(from_user)", "caller-id-name" : "$var(from_name)", "registration-token" : "$var(TokenReg)"});
$var(Payload) = $_s({ "Event-Category" : "notification", "Event-Name" : "push_req", "Call-ID" : "$ci", "Token-ID" : "$var(TokenID)", "Token-Type" : "$var(TokenType)", "Token-App" : "$var(TokenApp)", "Alert-Key" : "IC_SIL", "Alert-Params" : ["$var(from)"], "Sound" : "ring.caf", "Payload" : $var(PushPayload) });
$avp(push_routing_key) = "notification.push." + $var(TokenType) + "." + $var(TokenID);
$avp(push_payload) = $var(Payload);
}
route[PUSHER_SEND_PUSH_NOTIFICATION]
{
xlog("L_INFO", "$ci|pusher|sending push notification request\n");
xlog("L_DEBUG", "$ci|pusher|pushing to $avp(push_routing_key) : $avp(push_payload)\n");
t_set_fr(20000, 20000);
$avp(push_sent) = 1;
t_suspend();
$sht(push_cache=>$(tu{s.tolower})) = $_s(a=0;index=$T(id_index);label=$T(id_label));
kazoo_publish("pushes", $avp(push_routing_key), $avp(push_payload));
xlog("L_INFO", "$ci|pusher|sending push notification request\n");
xlog("L_DEBUG", "$ci|pusher|pushing to $avp(push_routing_key) : $avp(push_payload)\n");
t_set_fr(20000, 20000);
$avp(push_sent) = 1;
t_suspend();
$sht(push_cache=>$(tu{s.tolower})) = $_s(a=0;index=$T(id_index);label=$T(id_label));
kazoo_publish("pushes", $avp(push_routing_key), $avp(push_payload));
}
route[PUSHER_ATTEMPT_REGISTRATION]
route[HANDLE_REGISTER_PUSHER]
{
if (!is_method("REGISTER")) {
return;
}
if($hdr(X-Token-Reg) != $null) {
if($sht(push_cache=>$hdr(X-Token-Reg)) != $null) {
$var(password) = $null;
$sht(push_cache=>$hdr(X-Token-Reg)) = $null;
xlog("L_INFO", "$ci|pusher|registration with x-token-reg $hdr(X-Token-Reg)\n");
$xavp(ulattrs=>custom_channel_vars) = "{}";
$xavp(ulattrs[0]=>x_token_reg) = $hdr(X-Token-Reg);
route(SAVE_LOCATION);
exit;
} else {
xlog("L_INFO", "$ci|pusher|registration x-token-reg '$hdr(X-Token-Reg)' from header was not found\n");
}
}
if($(sel(contact.uri){uri.param,x-token-reg}) != "") {
if($sht(push_cache=>$(sel(contact.uri){uri.param,x-token-reg})) != $null) {
$var(password) = $null;
$sht(push_cache=>$(sel(contact.uri){uri.param,x-token-reg})) = $null;
xlog("L_INFO", "$ci|pusher|registration with x-token-reg $(sel(contact.uri){uri.param,x-token-reg})\n");
$xavp(ulattrs=>custom_channel_vars) = "{}";
$xavp(ulattrs[0]=>x_token_reg) = $(sel(contact.uri){uri.param,x-token-reg});
route(SAVE_LOCATION);
exit;
} else {
xlog("L_INFO", "$ci|pusher|registration x-token-reg from contact uri param '$(sel(contact.uri){uri.param,x-token-reg})' was not found\n");
}
}
if($(sel(contact){tobody.params}{param.value,x-token-reg}) != "") {
if($sht(push_cache=>$(sel(contact){tobody.params}{param.value,x-token-reg})) != $null) {
$var(password) = $null;
$sht(push_cache=>$(sel(contact){tobody.params}{param.value,x-token-reg})) = $null;
xlog("L_INFO", "$ci|pusher|registration with x-token-reg $(sel(contact){tobody.params}{param.value,x-token-reg})\n");
$xavp(ulattrs=>custom_channel_vars) = "{}";
$xavp(ulattrs[0]=>x_token_reg) = $(sel(contact){tobody.params}{param.value,x-token-reg});
route(SAVE_LOCATION);
exit;
} else {
xlog("L_INFO", "$ci|pusher|registration x-token-reg from contact param '$(sel(contact){tobody.params}{param.value,x-token-reg})' was not found\n");
}
}
if (!is_method("REGISTER")) return;
if($hdr(X-Token-Reg) != $null) {
if($sht(push_cache=>$hdr(X-Token-Reg)) != $null) {
$sht(push_cache=>$hdr(X-Token-Reg)) = $null;
xlog("L_INFO", "$ci|pusher|registration with x-token-reg $hdr(X-Token-Reg)\n");
$xavp(ulattrs=>custom_channel_vars) = "{}";
$xavp(ulattrs[0]=>x_token_reg) = $hdr(X-Token-Reg);
route(SAVE_LOCATION);
exit;
} else {
xlog("L_INFO", "$ci|pusher|registration x-token-reg '$hdr(X-Token-Reg)' from header was not found\n");
}
}
if($(sel(contact.uri){uri.param,x-token-reg}) != "") {
if($sht(push_cache=>$(sel(contact.uri){uri.param,x-token-reg})) != $null) {
$sht(push_cache=>$(sel(contact.uri){uri.param,x-token-reg})) = $null;
xlog("L_INFO", "$ci|pusher|registration with x-token-reg $(sel(contact.uri){uri.param,x-token-reg})\n");
$xavp(ulattrs=>custom_channel_vars) = "{}";
$xavp(ulattrs[0]=>x_token_reg) = $(sel(contact.uri){uri.param,x-token-reg});
route(SAVE_LOCATION);
exit;
} else {
xlog("L_INFO", "$ci|pusher|registration x-token-reg from contact uri param '$(sel(contact.uri){uri.param,x-token-reg})' was not found\n");
}
}
if($(sel(contact){tobody.params}{param.value,x-token-reg}) != "") {
if($sht(push_cache=>$(sel(contact){tobody.params}{param.value,x-token-reg})) != $null) {
$sht(push_cache=>$(sel(contact){tobody.params}{param.value,x-token-reg})) = $null;
xlog("L_INFO", "$ci|pusher|registration with x-token-reg $(sel(contact){tobody.params}{param.value,x-token-reg})\n");
$xavp(ulattrs=>custom_channel_vars) = "{}";
$xavp(ulattrs[0]=>x_token_reg) = $(sel(contact){tobody.params}{param.value,x-token-reg});
route(SAVE_LOCATION);
exit;
} else {
xlog("L_INFO", "$ci|pusher|registration x-token-reg from contact param '$(sel(contact){tobody.params}{param.value,x-token-reg})' was not found\n");
}
}
}
route[PUSHER_ON_REGISTRATION]
route[ON_REGISTRATION_PUSHER]
{
if( ( $(xavp(ulattrs=>x_token_reg){s.len}) > 0 ||
$(xavp(ulattrs=>custom_channel_vars){kz.json,Pusher-Application}{s.len}) > 0) &&
$var(Status) == "Registered") {
if($sht(push_cache=>$(tu{s.tolower})) != $null) {
xlog("L_INFO", "$ci|pusher|device registered, delivering the call\n");
$var(ref) = $sht(push_cache=>$(tu{s.tolower}));
$sht(push_cache=>$(tu{s.tolower})) = $null;
$var(t_index) = $(var(ref){param.value,index}{s.int});
$var(t_label) = $(var(ref){param.value,label}{s.int});
t_continue("$var(t_index)", "$var(t_label)", "PUSHER_DELIVER_CALL");
}
}
if( ( $(xavp(ulattrs=>x_token_reg){s.len}) > 0 ||
$(xavp(ulattrs=>custom_channel_vars){kz.json,Pusher-Application}{s.len}) > 0) &&
$var(Status) == "Registered") {
if($sht(push_cache=>$(tu{s.tolower})) != $null) {
xlog("L_INFO", "$ci|pusher|device registered, delivering the call\n");
$var(ref) = $sht(push_cache=>$(tu{s.tolower}));
$sht(push_cache=>$(tu{s.tolower})) = $null;
$var(t_index) = $(var(ref){param.value,index}{s.int});
$var(t_label) = $(var(ref){param.value,label}{s.int});
t_continue("$var(t_index)", "$var(t_label)", "PUSHER_DELIVER_CALL");
}
}
}
route[PUSHER_DELIVER_CALL]
{
if(reg_fetch_contacts("location", "$hdr(X-KAZOO-AOR)", "callee")) {
if($sel(cfg_get.kazoo.pusher_log_contacts) == 1) {
xlog("L_NOTICE", "callee=>aor: $(ulc(callee=>aor))\n");
xlog("L_NOTICE", "callee=>count: $(ulc(callee=>count))\n");
xlog("L_NOTICE", "callee=>domain: $(ulc(callee=>domain))\n");
xlog("L_NOTICE", "callee=>aorhash $(ulc(callee=>aorhash))\n");
$var(i) = 0;
while($var(i) < $(ulc(callee=>count))) {
xlog("L_NOTICE", "--- contact [$var(i)]\n");
xlog("L_NOTICE", "callee=>addr: $(ulc(callee=>addr)[$var(i)])\n");
xlog("L_NOTICE", "callee=>path: $(ulc(callee=>path)[$var(i)])\n");
xlog("L_NOTICE", "callee=>received: $(ulc(callee=>received)[$var(i)])\n");
xlog("L_NOTICE", "callee=>expires: $(ulc(callee=>expires)[$var(i)])\n");
xlog("L_NOTICE", "callee=>callid: $(ulc(callee=>callid)[$var(i)])\n");
xlog("L_NOTICE", "callee=>regid: $(ulc(callee=>regid)[$var(i)])\n");
xlog("L_NOTICE", "callee=>q: $(ulc(callee=>q)[$var(i)])\n");
xlog("L_NOTICE", "callee=>cseq: $(ulc(callee=>cseq)[$var(i)])\n");
xlog("L_NOTICE", "callee=>flags: $(ulc(callee=>flags)[$var(i)])\n");
xlog("L_NOTICE", "callee=>cflags: $(ulc(callee=>cflags)[$var(i)])\n");
xlog("L_NOTICE", "callee=>user_agent: $(ulc(callee=>user_agent)[$var(i)])\n");
xlog("L_NOTICE", "callee=>socket: $(ulc(callee=>socket)[$var(i)])\n");
xlog("L_NOTICE", "callee=>modified: $(ulc(callee=>modified)[$var(i)])\n");
xlog("L_NOTICE", "callee=>methods: $(ulc(callee=>methods)[$var(i)])\n");
$var(i) = $var(i) + 1;
}
}
$var(idx) = $ulc(callee=>count) - 1;
$du = $(ulc(callee=>received)[$var(idx)]);
$fs = $(ulc(callee=>socket)[$var(idx)]);
t_set_fr(30000, 30000);
route(PUSHER_TO_EXTERNAL_RELAY);
} else {
t_reply(486, "Failed to lookup after resume");
}
if(reg_fetch_contacts("location", "$hdr(X-KAZOO-AOR)", "callee")) {
if($sel(cfg_get.kazoo.pusher_log_contacts) == 1) {
xlog("L_NOTICE", "$ci|pusher|callee=>aor: $(ulc(callee=>aor))\n");
xlog("L_NOTICE", "$ci|pusher|callee=>count: $(ulc(callee=>count))\n");
xlog("L_NOTICE", "$ci|pusher|callee=>domain: $(ulc(callee=>domain))\n");
xlog("L_NOTICE", "$ci|pusher|callee=>aorhash $(ulc(callee=>aorhash))\n");
$var(i) = 0;
while($var(i) < $(ulc(callee=>count))) {
xlog("L_NOTICE", "$ci|pusher|--- contact [$var(i)]\n");
xlog("L_NOTICE", "$ci|pusher|callee=>addr: $(ulc(callee=>addr)[$var(i)])\n");
xlog("L_NOTICE", "$ci|pusher|callee=>path: $(ulc(callee=>path)[$var(i)])\n");
xlog("L_NOTICE", "$ci|pusher|callee=>received: $(ulc(callee=>received)[$var(i)])\n");
xlog("L_NOTICE", "$ci|pusher|callee=>expires: $(ulc(callee=>expires)[$var(i)])\n");
xlog("L_NOTICE", "$ci|pusher|callee=>callid: $(ulc(callee=>callid)[$var(i)])\n");
xlog("L_NOTICE", "$ci|pusher|callee=>regid: $(ulc(callee=>regid)[$var(i)])\n");
xlog("L_NOTICE", "$ci|pusher|callee=>q: $(ulc(callee=>q)[$var(i)])\n");
xlog("L_NOTICE", "$ci|pusher|callee=>cseq: $(ulc(callee=>cseq)[$var(i)])\n");
xlog("L_NOTICE", "$ci|pusher|callee=>flags: $(ulc(callee=>flags)[$var(i)])\n");
xlog("L_NOTICE", "$ci|pusher|callee=>cflags: $(ulc(callee=>cflags)[$var(i)])\n");
xlog("L_NOTICE", "$ci|pusher|callee=>user_agent: $(ulc(callee=>user_agent)[$var(i)])\n");
xlog("L_NOTICE", "$ci|pusher|callee=>socket: $(ulc(callee=>socket)[$var(i)])\n");
xlog("L_NOTICE", "$ci|pusher|callee=>modified: $(ulc(callee=>modified)[$var(i)])\n");
xlog("L_NOTICE", "$ci|pusher|callee=>methods: $(ulc(callee=>methods)[$var(i)])\n");
$var(i) = $var(i) + 1;
}
}
$var(idx) = $ulc(callee=>count) - 1;
$du = $(ulc(callee=>received)[$var(idx)]);
$fs = $(ulc(callee=>socket)[$var(idx)]);
t_set_fr(30000, 30000);
route(PUSHER_TO_EXTERNAL_RELAY);
} else {
t_reply(486, "Failed to lookup after resume");
}
}

+ 30
- 30
kamailio/rate-limiter-role.cfg View File

@ -15,7 +15,7 @@ route[DOS_PREVENTION] {
# If packet came from platform or from 4 class MERA, do not check it
if (isflagset(FLAG_INTERNALLY_SOURCED) || isflagset(FLAG_TRUSTED_SOURCE) ) {
xlog("L_DEBUG", "$ci |RL| Trusted source IP($si) ignoring\n");
xlog("L_DEBUG", "$ci|limiter|trusted source IP($si) ignoring\n");
return;
}
@ -39,7 +39,7 @@ route[DOS_PREVENTION] {
# For BYE method we use REALM from To SIP header
if ($fd =~ IP_REGEX) {
xlog("L_WARNING","$ci|RL-realm log| Fixup for $rm method with IP in from URI: use to-domain\n");
xlog("L_WARNING","$ci|limiter| Fixup for $rm method with IP in from URI: use to-domain\n");
$var(ltpm_realm) = $td+"/TOTAL/min";
$var(ltps_realm) = $td+"/TOTAL/sec";
$var(ltpm_device) = $fU+"@"+$td+"/TOTAL/min";
@ -57,20 +57,20 @@ route[DOS_PREVENTION] {
if ((is_method("INVITE") || is_method("REGISTER")) && (!isflagset(FLAG_IS_REPLY))) {
if ($sht(rate_limits=>$var(lrpm_realm)) == -1
|| $sht(rate_limits=>$var(lrps_realm)) == -1) {
xlog("L_INFO", "$ci|RL-realm log| Can't find HASHed rate for $var(entity) with $rm method\n");
xlog("L_INFO", "$ci|limiter|can't find HASHed rate for $var(entity) with $rm method\n");
$var(with-realm-request) = "true";
}
}
if ($sht(rate_limits=>$var(ltpm_realm)) == -1
|| $sht(rate_limits=>$var(ltps_realm)) == -1) {
xlog("L_INFO", "$ci|RL-realm log| Can't find HASHed rate for $var(entity) with $rm method\n");
xlog("L_INFO", "$ci|limiter|can't find HASHed rate for $var(entity) with $rm method\n");
$var(with-realm-total) = "true";
}
if (not_empty("$fU")) {
if ($fd =~ IP_REGEX) {
xlog("L_WARNING","$ci|RL-realm log| Fixup for $rm method with IP in from URI: use to-domain\n");
xlog("L_WARNING","$ci|limiter|fixup for $rm method with IP in from URI: use to-domain\n");
$var(entity) = $fU+"@"+$td;
} else {
$var(entity) = $fU+"@"+$fd;
@ -80,13 +80,13 @@ route[DOS_PREVENTION] {
if ((is_method("INVITE") || is_method("REGISTER")) && (!isflagset(FLAG_IS_REPLY))) {
if ($sht(rate_limits=>$var(lrpm_device)) == -1
|| $sht(rate_limits=>$var(lrps_device)) == -1) {
xlog("L_INFO", "$ci|RL-device log| Can't find HASHed rate for $var(entity) with $rm method\n");
xlog("L_INFO", "$ci|limiter|can't find HASHed rate for $var(entity) with $rm method\n");
$var(with-device-request) = "true";
}
}
if ($sht(rate_limits=>$var(ltpm_device)) == -1 || $sht(rate_limits=>$var(ltps_device)) == -1) {
xlog("L_INFO", "$ci|RL-device log| Can't find HASHed rate for $var(entity) with $rm method\n");
xlog("L_INFO", "$ci|limiter| can't find HASHed rate for $var(entity) with $rm method\n");
$var(with-device-total) = "true";
}
}
@ -104,10 +104,10 @@ route[DOS_PREVENTION] {
|| $var(with-realm-total) == "true" ) {
avp_printf("$avp(s:query-request)", "{\"Entity\" : \"$var(entity)\", \"$var(method-key)\" : $var(method-value), \"Event-Category\" : \"rate_limit\", \"Event-Name\" : \"query\", \"With-Realm\" : $var(with-realm-request)}");
xlog("L_INFO", "$ci|RL log| Query: $avp(s:query-request)\n");
xlog("L_INFO", "$ci|limiter|query: $avp(s:query-request)\n");
sl_send_reply("100", "Attempting K query");
if (kazoo_query("frontier", "sbc_config", $avp(s:query-request), "$var(amqp_result)")) {
xlog("L_INFO", "$ci|RL log| Response: $var(amqp_result)\n");
xlog("L_INFO", "$ci|limiter|response: $var(amqp_result)\n");
kazoo_json($var(amqp_result), "Realm.Minute." + $rm, "$var(realm-min)");
kazoo_json($var(amqp_result), "Realm.Second." + $rm, "$var(realm-sec)");
@ -120,44 +120,44 @@ route[DOS_PREVENTION] {
if ( not_empty("$var(realm-min)") ) {
$sht(rate_limits=>$var(lrpm_realm)) = $(var(realm-min){s.int});
xlog("L_INFO", "$ci|RL-realm log| $rm DB=>HASH for $var(lrpm_realm)=$sht(rate_limits=>$var(lrpm_realm))\n");
xlog("L_INFO", "$ci|limiter| $rm DB=>HASH for $var(lrpm_realm)=$sht(rate_limits=>$var(lrpm_realm))\n");
}
if ( not_empty("$var(realm-sec)") ) {
$sht(rate_limits=>$var(lrps_realm)) = $(var(realm-sec){s.int});
xlog("L_INFO", "$ci|RL-realm log| $rm DB=>HASH for $var(lrps_realm)=$sht(rate_limits=>$var(lrps_realm))\n");
xlog("L_INFO", "$ci|limiter| $rm DB=>HASH for $var(lrps_realm)=$sht(rate_limits=>$var(lrps_realm))\n");
}
if ( not_empty("$var(realm-min-total)") ) {
$sht(rate_limits=>$var(ltpm_realm)) = $(var(realm-min-total){s.int});
xlog("L_INFO", "$ci|RL-realm log| $rm DB=>HASH for $var(ltpm_realm)=$sht(rate_limits=>$var(ltpm_realm))\n");
xlog("L_INFO", "$ci|limiter| $rm DB=>HASH for $var(ltpm_realm)=$sht(rate_limits=>$var(ltpm_realm))\n");
}
if ( not_empty("$var(realm-sec-total)") ) {
$sht(rate_limits=>$var(ltps_realm)) = $(var(realm-sec-total){s.int});
xlog("L_INFO", "$ci|RL-realm log| $rm DB=>HASH for $var(ltps_realm)=$sht(rate_limits=>$var(ltps_realm))\n");
xlog("L_INFO", "$ci|limiter| $rm DB=>HASH for $var(ltps_realm)=$sht(rate_limits=>$var(ltps_realm))\n");
}
if ( not_empty("$var(device-min)") ) {
$sht(rate_limits=>$var(lrpm_device)) = $(var(device-min){s.int});
xlog("L_INFO", "$ci|RL-device log| $rm DB=>HASH for $var(lrpm_device)=$sht(rate_limits=>$var(lrpm_device))\n");
xlog("L_INFO", "$ci|limiter| $rm DB=>HASH for $var(lrpm_device)=$sht(rate_limits=>$var(lrpm_device))\n");
}
if ( not_empty("$var(device-sec)") ) {
$sht(rate_limits=>$var(lrps_device)) = $(var(device-sec){s.int});
xlog("L_INFO", "$ci|RL-device log| $rm DB=>HASH for $var(lrps_device)=$sht(rate_limits=>$var(lrps_device))\n");
xlog("L_INFO", "$ci|limiter| $rm DB=>HASH for $var(lrps_device)=$sht(rate_limits=>$var(lrps_device))\n");
}
if ( not_empty("$var(device-min-total)") ) {
$sht(rate_limits=>$var(ltpm_device)) = $(var(device-min-total){s.int});
xlog("L_INFO", "$ci|RL-device log| $rm DB=>HASH for $var(ltpm_device)=$sht(rate_limits=>$var(ltpm_device))\n");
xlog("L_INFO", "$ci|limiter| $rm DB=>HASH for $var(ltpm_device)=$sht(rate_limits=>$var(ltpm_device))\n");
}
if ( not_empty("$var(device-sec-total)") ) {
$sht(rate_limits=>$var(ltps_device)) = $(var(device-sec-total){s.int});
xlog("L_INFO", "$ci|RL-device log| $rm DB=>HASH for $var(ltps_device)=$sht(rate_limits=>$var(ltps_device))\n");
xlog("L_INFO", "$ci|limiter| $rm DB=>HASH for $var(ltps_device)=$sht(rate_limits=>$var(ltps_device))\n");
}
} else {
xlog("L_ERROR", "$ci|RL log| $rm DB unreachable for entity: $var(entity)\n");
xlog("L_ERROR", "$ci|limiter| $rm DB unreachable for entity: $var(entity)\n");
return;
}
}
if ($fd =~ IP_REGEX) {
xlog("L_WARNING","$ci|RL-device log| Fixup for $rm method with IP in from URI: use to-domain\n");
xlog("L_WARNING","$ci|limiter| Fixup for $rm method with IP in from URI: use to-domain\n");
$var(entity) = $td;
} else {
$var(entity) = $fd;
@ -175,7 +175,7 @@ route[DOS_PREVENTION] {
if ( not_empty("$fU") ) {
if ($fd =~ IP_REGEX) {
$var(entity) = $fU+"@"+$td;
xlog("L_WARNING","$ci|RL-device log| Fixup for $rm method with IP in from URI: use to-domain\n");
xlog("L_WARNING","$ci|limiter| Fixup for $rm method with IP in from URI: use to-domain\n");
} else {
$var(entity) = $fU+"@"+$fd;
}
@ -203,12 +203,12 @@ route[DO_DOS_PREVENTION] {
# Personal debug for INVITE and REGISTER
if ((is_method("INVITE") || is_method("REGISTER"))) {
xlog("L_INFO", "$ci|RL-$var(entity-type) log| L/C for $var(rpm) = $var(lrpm)/$sht(rpm=>$var(rpm))\n");
xlog("L_INFO", "$ci|RL-$var(entity-type) log| L/C for $var(rps) = $var(lrps)/$sht(rps=>$var(rps))\n");
xlog("L_INFO", "$ci|limiter| L/C for $var(rpm) = $var(lrpm)/$sht(rpm=>$var(rpm))\n");
xlog("L_INFO", "$ci|limiter| L/C for $var(rps) = $var(lrps)/$sht(rps=>$var(rps))\n");
}
# Commmon debug for ALL packet including INVITE and REGISTER
xlog("L_INFO", "$ci|RL-$var(entity-type) log| L/C for $var(tpm) = $var(ltpm)/$sht(tpm=>$var(tpm))\n");
xlog("L_INFO", "$ci|RL-$var(entity-type) log| L/C for $var(tps) = $var(ltps)/$sht(tps=>$var(tps))\n");
xlog("L_INFO", "$ci|limiter| L/C for $var(tpm) = $var(ltpm)/$sht(tpm=>$var(tpm))\n");
xlog("L_INFO", "$ci|limiter| L/C for $var(tps) = $var(ltps)/$sht(tps=>$var(tps))\n");
# Personal increment just for INVITE and REGISTER
if ((is_method("INVITE") || is_method("REGISTER")) && (!isflagset(FLAG_IS_REPLY))) {
@ -223,31 +223,31 @@ route[DO_DOS_PREVENTION] {
if ((is_method("INVITE") || is_method("REGISTER")) && (!isflagset(FLAG_IS_REPLY))) {
if ($sht(rps=>$var(rps)) > $var(lrps)) {
sl_send_reply(RATE_LIMIT_CODE, RATE_LIMIT_MESSAGE);
xlog("L_INFO", "$ci|RL-$var(entity-type) log| Out of $rm $var(rps) rate limits: $sht(rps=>$var(rps)) > $var(lrps))\n");
xlog("L_INFO", "$ci|limiter| Out of $rm $var(rps) rate limits: $sht(rps=>$var(rps)) > $var(lrps))\n");
exit;
}
if ($sht(rpm=>$var(rpm)) > $var(lrpm)) {
sl_send_reply(RATE_LIMIT_CODE, RATE_LIMIT_MESSAGE);
xlog("L_INFO", "$ci|RL-$var(entity-type) log| Out of $rm $var(rpm) rate limits: $sht(rpm=>$var(rpm)) > $var(lrpm))\n");
xlog("L_INFO", "$ci|limiter| Out of $rm $var(rpm) rate limits: $sht(rpm=>$var(rpm)) > $var(lrpm))\n");
exit;
}
}
# Commmon checks for ALL packet including INVITE and REGISTER
if ($sht(tps=>$var(tps)) > $var(ltps)) {
if (isflagset(FLAG_IS_REPLY)) {
xlog("L_INFO", "$ci|RL-$var(entity-type) log| Out of TOTAL($rm::$rs $rr) $var(tps) rate limits: $sht(tps=>$var(tps)) > $var(ltps))\n");
xlog("L_INFO", "$ci|limiter| Out of TOTAL($rm::$rs $rr) $var(tps) rate limits: $sht(tps=>$var(tps)) > $var(ltps))\n");
} else {
sl_send_reply(RATE_LIMIT_CODE, RATE_LIMIT_MESSAGE);
xlog("L_INFO", "$ci|RL-$var(entity-type) log| Out of TOTAL($rm) $var(tps) rate limits: $sht(tps=>$var(tps)) > $var(ltps))\n");
xlog("L_INFO", "$ci|limiter| Out of TOTAL($rm) $var(tps) rate limits: $sht(tps=>$var(tps)) > $var(ltps))\n");
}
exit;
}
if ($sht(tpm=>$var(tpm)) > $var(ltpm)) {
if (isflagset(FLAG_IS_REPLY)) {
xlog("L_INFO", "$ci|RL-$var(entity-type) log| Out of TOTAL($rm::$rs $rr) $var(tpm) rate limits: $sht(tpm=>$var(tpm)) > $var(ltpm))\n");
xlog("L_INFO", "$ci|limiter| Out of TOTAL($rm::$rs $rr) $var(tpm) rate limits: $sht(tpm=>$var(tpm)) > $var(ltpm))\n");
} else {
sl_send_reply(RATE_LIMIT_CODE, RATE_LIMIT_MESSAGE);
xlog("L_INFO", "$ci|RL-$var(entity-type) log| Out of TOTAL($rm) $var(tpm) rate limits: $sht(tpm=>$var(tpm)) > $var(ltpm))\n");
xlog("L_INFO", "$ci|limiter| Out of TOTAL($rm) $var(tpm) rate limits: $sht(tpm=>$var(tpm)) > $var(ltpm))\n");
}
exit;
}


+ 82
- 0
kamailio/registrar-query.cfg View File

@ -0,0 +1,82 @@
######## Registrar query server module ########
#!trydef KZ_REGISTRAR_QUERY_REPLY_ZONES 0
kazoo.registrar_query_reply_zones = KZ_REGISTRAR_QUERY_REPLY_ZONES descr "0 - all, 1 - local, 2 - remote"
route[REGISTRAR_SEARCH_SUMMARY]
{
xlog("L_INFO", "event|registrar_query|$(kzE{kz.json,Msg-ID}) processing registrar summary query for $(kzE{kz.json,Realm})\n");
$var(Queue) = $(kzE{kz.json,Server-ID});
$var(Domain) = $(kzE{kz.json,Realm});
$var(Username) = $(kzE{kz.json,Username});
$var(Query) = $_s(KZQ_REGISTRAR_SEARCH_SUMMARY);
if($var(Username) != "") {
$var(Query) = $var(Query) + $_s( and username = "$var(Username)");
}
if (sql_xquery("cb", "$var(Query)", "ra") == 1)
{
$var(Registrations) = "";
$var(Sep1) = "";
while($xavp(ra) != $null) {
$var(Registration) = $_s("$(xavp(ra=>username))@$(xavp(ra=>domain))");
$var(Registrations) = $var(Registrations) + $var(Sep1) + $var(Registration);
$var(Sep1)=", ";
pv_unset("$xavp(ra)");
}
}
$var(amqp_payload_request) = $_s({"Event-Category" : "registration", "Event-Name" : "search_resp", "Msg-ID" : "$(kzE{kz.json,Msg-ID})", "Registrations" : [ $var(Registrations) ] });
kazoo_publish("targeted", "$var(Queue)", $var(amqp_payload_request));
}
route[REGISTRAR_SEARCH_DETAIL]
{
xlog("L_INFO", "event|registrar_query|$(kzE{kz.json,Msg-ID}) processing registrar query detail for $(kzE{kz.json,Username}) in realm $(kzE{kz.json,Realm})\n");
$var(Queue) = $(kzE{kz.json,Server-ID});
$var(Msg-ID) = $(kzE{kz.json,Msg-ID});
$var(Domain) = $(kzE{kz.json,Realm});
$var(Username) = $(kzE{kz.json,Username});
$var(Query) = $_s(KZQ_REGISTRAR_SEARCH_DETAIL);
if($var(Username) != "") {
$var(Query) = $var(Query) + $_s( and username = "$var(Username)");
}
if (sql_xquery("cb", "$var(Query)", "ra") == 1)
{
while($xavp(ra) != $null) {
$var(Registration) = $_s({"AOR": "$xavp(ra=>username)@$xavp(ra=>domain)", "Contact":"$(xavp(ra=>contact))", "Received":"$(xavp(ra=>received))", "Path":"$(xavp(ra=>path))", "Expires":$(xavp(ra=>expires)), "Call-ID":"$(xavp(ra=>callid))", "CSeq":"$(xavp(ra=>cseq))", "Last-Modified":"$(xavp(ra=>last_modified))", "User-Agent":"$(xavp(ra=>user_agent){s.escape.common}{s.replace,\','}{s.replace,$$,})", "Socket":"$(xavp(ra=>socket))"});
pv_unset("$xavp(ra)");
$var(amqp_payload_request) = '{"Event-Category" : "registration", "Event-Name" : "search_partial_resp", "Msg-ID" : "$var(Msg-ID)", "Registrations" : [ $var(Registration) ] }';
kazoo_publish("targeted", "$var(Queue)", $var(amqp_payload_request));
}
}
$var(amqp_payload_request) = '{"Event-Category" : "registration", "Event-Name" : "search_resp", "Msg-ID" : "$var(Msg-ID)", "Registrations":[] }';
kazoo_publish("targeted", "$var(Queue)", $var(amqp_payload_request));
}
event_route[kazoo:consumer-event-registration-search-req]
{
$var(Zone) = $(kzE{kz.json,AMQP-Broker-Zone});
if( ($var(Zone) == "MY_AMQP_ZONE" && $sel(cfg_get.kazoo.registrar_query_reply_zones) != 2) ||
($var(Zone) != "MY_AMQP_ZONE" && $sel(cfg_get.kazoo.registrar_query_reply_zones) != 1)) {
switch($(kzE{kz.json,Search-Type})) {
case "summary":
route(REGISTRAR_SEARCH_SUMMARY);
break;
case "detail":
route(REGISTRAR_SEARCH_DETAIL);
break;
default:
xlog("L_INFO", "event|registrar_query|search type '$(kzE{kz.json,Search-Type})' not handled\n");
}
}
}
# vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab

+ 166
- 76
kamailio/registrar-role.cfg View File

@ -8,6 +8,31 @@
#!trydef REGISTRAR_NAT_PING_WORKERS 5
#####
#!ifndef KZ_DISABLE_WEBSOCKETS_REGISTRAR_PORT
#!trydef KZ_WEBSOCKETS_REGISTRAR_PORT 7000
#!endif
#!ifndef KZ_DISABLE_TLS_REGISTRAR_PORT
#!trydef KZ_TLS_REGISTRAR_PORT 7000
#!endif
#!ifndef KZ_DISABLE_TCP_REGISTRAR_PORT
#!trydef KZ_TCP_REGISTRAR_PORT 7000
#!endif
#!ifndef KZ_DISABLE_WEBSOCKETS_REGISTRAR_PROXY_PROTO
#!trydef KZ_WEBSOCKETS_REGISTRAR_PROXY_PROTO "udp"
#!endif
#!ifndef KZ_DISABLE_TLS_REGISTRAR_PROXY_PROTO
#!trydef KZ_TLS_REGISTRAR_PROXY_PROTO "udp"
#!endif
#!ifndef KZ_DISABLE_TCP_REGISTRAR_PROXY_PROTO
#!trydef KZ_TCP_REGISTRAR_PROXY_PROTO "udp"
#!endif
#!trydef REGISTRAR_MIN_EXPIRES 300
#!trydef REGISTRAR_MAX_EXPIRES 3600
#!trydef REGISTRAR_DEFAULT_EXPIRES 600
@ -146,12 +171,14 @@ kazoo.registrar_keepalive_udp_only = KZ_REGISTRAR_KEEPALIVE_UDP_ONLY descr "shou
kazoo.registrar_send_100 = REGISTRAR_SEND_100 descr "should we send 100 reply while doing directory search"
kazoo.registrar_publish_reg_once = KZ_REGISTRAR_PUBLISH_REG_ONCE descr "should publish only new registrations"
#!include_file "registrar-query.cfg"
####### Registrar Logic ########
route[REGISTRAR_NAT_FLAGS]
{
if (isflagset(FLT_NATS)) {
xlog("L_DEBUG", "$ci|log|fixing contact for nat request\n");
xlog("L_DEBUG", "$ci|registrar|fixing contact for nat request\n");
setbflag(FLB_NATB);
fix_nated_register();
@ -163,7 +190,7 @@ route[REGISTRAR_NAT_FLAGS]
|| ($proto =="ws" || $proto == "wss")
|| ($(xavp(ulattrs=>custom_channel_vars){kz.json,Keep-Alive}) == "false")
)) {
xlog("L_DEBUG", "$ci|log|set nat pinging\n");
xlog("L_DEBUG", "$ci|registrar|set nat pinging\n");
setbflag(FLB_NATSIPPING);
}
} else {
@ -173,18 +200,14 @@ route[REGISTRAR_NAT_FLAGS]
route[HANDLE_REGISTER]
{
if (!is_method("REGISTER")) {
return;
}
if (!is_method("REGISTER")) return;
route_if_exists("CUSTOM_HANDLER_REGISTER");
$vn(password) = $null;
#!ifdef PUSHER_ROLE
route(PUSHER_ATTEMPT_REGISTRATION);
#!endif
routes("HANDLE_REGISTER_");
if($sel(cfg_get.kazoo.registrar_failover) == 1) {
xlog("L_INFO", "$ci|log|register|forcing failover\n");
xlog("L_INFO", "$ci|registrar|register|forcing failover\n");
update_stat("registrar:force_failover", "+1");
drop;
}
@ -203,7 +226,7 @@ route[HANDLE_REGISTER]
$xavp(regcfg=>match_received) = $su;
if(registered("location", "$rz:$Au", 2, 1) == 1) {
if($(xavp(ulattrs=>custom_channel_vars){s.len}) > 1) {
$var(password) = $sht(auth_cache=>$Au);
$vn(password) = $sht(auth_cache=>$Au);
update_stat("registrar:cached", "+1");
route(SAVE_LOCATION);
exit;
@ -214,7 +237,7 @@ route[HANDLE_REGISTER]
if($td =~ "[0-9]{1,3}\.[0-9]{1,3}.[0-9]{1,3}\.[0-9]{1,3}" ||
$fd =~ "[0-9]{1,3}\.[0-9]{1,3}.[0-9]{1,3}\.[0-9]{1,3}") {
xlog("L_INFO", "$ci|log|register|invalid domain\n");
xlog("L_INFO", "$ci|registrar|register|invalid domain\n");
update_stat("registrar:ip_realm", "+1");
drop;
}
@ -242,7 +265,7 @@ route[HANDLE_REGISTER]
}
if (!t_newtran()) {
xlog("L_ERROR", "$ci|log|failed to create transaction to query for authentication credentials for $Au $si:$sp\n");
xlog("L_ERROR", "$ci|registrar|failed to create transaction to query for authentication credentials for $Au $si:$sp\n");
update_stat("registrar:new_tran", "+1");
drop;
}
@ -256,9 +279,9 @@ route[HANDLE_REGISTER]
$avp(kz_timeout) = $sel(cfg_get.kazoo.registrar_query_timeout_ms);
$xavp(deltas=>query) = $(TV(Sn){s.replace,.,});
xlog("L_DEBUG", "$ci|amqp|publishing to $def(REGISTRAR_AMQP_EXCHANGE) => $var(amqp_routing_key) : $def(REGISTRAR_AMQP_FLAGS) : $var(amqp_payload_request)\n");
xlog("L_DEBUG", "$ci|registrar|publishing to $def(REGISTRAR_AMQP_EXCHANGE) => $var(amqp_routing_key) : $def(REGISTRAR_AMQP_FLAGS) : $var(amqp_payload_request)\n");
if(kazoo_async_query("$def(REGISTRAR_AMQP_EXCHANGE)", $var(amqp_routing_key), $var(amqp_payload_request), "KZ_AUTHORIZATION_REPLY", "KZ_AUTHORIZATION_TIMEOUT", "$def(REGISTRAR_AMQP_FLAGS)") != 1) {
xlog("L_INFO", "$ci|log|failed to send registrar query for authentication credentials for $Au $si:$sp\n");
xlog("L_INFO", "$ci|registrar|failed to send registrar query for authentication credentials for $Au $si:$sp\n");
update_stat("registrar:amqp_async_error", "+1");
t_drop();
}
@ -267,7 +290,7 @@ route[HANDLE_REGISTER]
failure_route[KZ_AUTHORIZATION_TIMEOUT]
{
if($(kzR{kz.json,Event-Name}) == "message_returned" ) {
xlog("L_WARNING", "$ci|amqp|message was returned by broker $(kzR{kz.json,Error-Code}) $(kzR{kz.json,Error-Reason})\n");
xlog("L_WARNING", "$ci|registrar|message was returned by broker $(kzR{kz.json,Error-Code}) $(kzR{kz.json,Error-Reason})\n");
update_stat("registrar:amqp_returned", "+1");
} else {
xlog("L_WARNING", "$ci|end|failed $T_reply_code $T_reply_reason [$T(id_index):$T(id_label)] querying directory for authentication credentials for $Au $si:$sp\n");
@ -282,8 +305,8 @@ onreply_route[KZ_AUTHORIZATION_REPLY]
$var(StartRoute) = $(TV(Sn){s.replace,.,});
$var(delta_to_start) = $var(StartRoute) - $(kzR{kz.json,AMQP-Received});
$var(delta_from_query) = $(kzR{kz.json,AMQP-Received}) - $xavp(deltas=>query);
xlog("L_INFO", "$ci|log|received $(kzR{kz.json,Event-Category}) $(kzR{kz.json,Event-Name}) reply from $(kzR{kz.json,App-Name})-$(kzR{kz.json,App-Version}) (Δ1 $(kzR{kz.json,AMQP-Elapsed-Micro}) μs , Δ2 $var(delta_to_start) μs, Δ3 $var(delta_from_query) μs)\n");
$var(password) = $(kzR{kz.json,Auth-Password});
xlog("L_INFO", "$ci|registrar|received $(kzR{kz.json,Event-Category}) $(kzR{kz.json,Event-Name}) reply from $(kzR{kz.json,App-Name})-$(kzR{kz.json,App-Version}) (Δ1 $(kzR{kz.json,AMQP-Elapsed-Micro}) μs , Δ2 $var(delta_to_start) μs, Δ3 $var(delta_from_query) μs)\n");
$vn(password) = $(kzR{kz.json,Auth-Password});
$var(nonce) = $adn;
if( $(kzR{kz.json,Event-Name}) == "authn_err" ) {
if($(kzR{kz.json,Permanent-Error}) == "true") {
@ -302,13 +325,13 @@ onreply_route[KZ_AUTHORIZATION_REPLY]
if( $(kzR{kz.json,Trusted-Auth}) == "true" ) {
route(SUCCESS_AUTHORIZATION);
} else {
xlog("L_INFO", "$ci|log|authenticating $Au via $(kzR{kz.json,App-Name})-$(kzR{kz.json,App-Version}) response\n");
xlog("L_INFO", "$ci|registrar|authenticating $Au via $(kzR{kz.json,App-Name})-$(kzR{kz.json,App-Version}) response\n");
route(CHECK_AUTHORIZATION);
}
} else {
update_stat("registrar:authn_unknown", "+1");
update_stat("registrar:drops", "+1");
xlog("L_INFO", "$ci|log|unhandle response from directory $Au via $(kzR{kz.json,App-Name})-$(kzR{kz.json,App-Version})\n");
xlog("L_INFO", "$ci|registrar|unhandle response from directory $Au via $(kzR{kz.json,App-Name})-$(kzR{kz.json,App-Version})\n");
t_drop();
}
}
@ -316,7 +339,7 @@ onreply_route[KZ_AUTHORIZATION_REPLY]
route[CHECK_AUTHORIZATION]
{
if (!pv_auth_check("$fd", "$var(password)", "0", "0")) {
if (!pv_auth_check("$fd", "$vn(password)", "0", "0")) {
#!ifdef ANTIFLOOD_ROLE
route(ANITFLOOD_FAILED_AUTH);
#!endif
@ -337,7 +360,9 @@ route[CHECK_AUTHORIZATION]
route[SUCCESS_AUTHORIZATION]
{
# user authenticated - remove auth header
consume_credentials();
if($hdr(Proxy-Authorization) != $null) {
consume_credentials();
}
$xavp(ulattrs=>custom_channel_vars) = $(kzR{kz.json,Custom-Channel-Vars});
$xavp(ulattrs[0]=>token) = $_s($(kzR{kz.json,Custom-Channel-Vars.Authorizing-ID})@$(kzR{kz.json,Custom-Channel-Vars.Account-ID}));
@ -349,10 +374,10 @@ route[SUCCESS_AUTHORIZATION]
route[SAVE_LOCATION]
{
if ($sht(auth_cache=>$Au) == $null && $var(password) != $null) {
xlog("L_INFO", "$ci|log|caching sip credentials for $Au\n");
if ($sht(auth_cache=>$Au) == $null && $vn(password) != $null) {
xlog("L_INFO", "$ci|registrar|caching sip credentials for $Au\n");
};
$sht(auth_cache=>$Au) = $var(password);
$sht(auth_cache=>$Au) = $vn(password);
route(REGISTRAR_NAT_FLAGS);
@ -387,7 +412,80 @@ route[SAVE_LOCATION]
$var(ip) = "[" + $Ri + "]";
}
route(REGISTRAR_PORT);
route(REGISTRAR_PROTO);
$var(AdvIP) = $RAi;
if(af==INET6) {
$var(AdvIP) = "[" + $RAi + "]";
}
#!ifdef WITH_INTERNAL_LISTENER
#!ifdef WITHOUT_REGISTRAR_PROXY_PATH_PROTO
$var(proxy_path) = $_s(sip:MY_IP_ADDRESS:$def(INTERNAL_PORT));
#!else
$var(proxy_path) = $_s(sip:MY_IP_ADDRESS:$def(INTERNAL_PORT);transport=$def(INTERNAL_PROTO));
#!endif
$var(proto) = $def(INTERNAL_PROTO);
#!else
#!ifdef WITHOUT_REGISTRAR_PROXY_PATH_PROTO
$var(proxy_path) = $_s(sip:MY_IP_ADDRESS:$var(port));
#!else
$var(proxy_path) = $_s(sip:MY_IP_ADDRESS:$var(port);transport=$var(proxy_proto));
#!endif
$var(proto) = $proto;
#!endif
route(PUBLISH_REGISTRATION);
routes("ON_REGISTRATION_");
exit;
}
route[REGISTRAR_PROTO]
{
# allow proto redirection on registration
switch($proto)
{
#!ifdef KZ_WEBSOCKETS_REGISTRAR_PROXY_PROTO
case "ws":
case "wss":
$var(proxy_proto) = KZ_WEBSOCKETS_REGISTRAR_PROXY_PROTO;
break;
#!endif
#!ifdef KZ_TLS_REGISTRAR_PROXY_PROTO
case "tls":
$var(proxy_proto) = KZ_TLS_REGISTRAR_PROXY_PROTO;
break;
#!endif
#!ifdef KZ_UDP_REGISTRAR_PROXY_PROTO
case "udp":
$var(proxy_proto) = KZ_UDP_REGISTRAR_PROXY_PROTO;
break;
#!endif
#!ifdef KZ_TCP_REGISTRAR_PROXY_PROTO
case "tcp":
$var(proxy_proto) = KZ_TCP_REGISTRAR_PROXY_PROTO;
break;
#!endif
default:
$var(proxy_proto) = $proto;
break;
}
}
route[REGISTRAR_PORT]
{
# allow port redirection on registration
switch($proto)
{
#!ifdef KZ_WEBSOCKETS_REGISTRAR_PORT
@ -417,32 +515,8 @@ route[SAVE_LOCATION]
default:
$var(port) = $Rp;
break;
}
$var(AdvIP) = $RAi;
if(af==INET6) {
$var(AdvIP) = "[" + $RAi + "]";
}
#!ifdef WITH_INTERNAL_LISTENER
$var(proxy_path) = $_s(sip:MY_IP_ADDRESS:$def(INTERNAL_PORT));
$var(proto) = $def(INTERNAL_PROTO);
#!else
$var(proxy_path) = $_s(sip:MY_IP_ADDRESS:$var(port));
$var(proto) = $proto;
#!endif
route(PUBLISH_REGISTRATION);
#!ifdef PUSHER_ROLE
route(PUSHER_ON_REGISTRATION);
#!endif
#!ifdef KEEPALIVE_ROLE
route(KEEPALIVE_ON_REGISTRATION);
#!endif
exit;
}
route[PUBLISH_REGISTRATION]
@ -461,44 +535,62 @@ route[PUBLISH_REGISTRATION]
event_route[kazoo:consumer-event-directory-reg-flush]
{
$var(user) = $(kzE{kz.json,Username}) + "@" + $(kzE{kz.json,Realm});
xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|log|received directory flush for $var(user)\n");
if ($sht(auth_cache=>$var(user)) != $null) {
$sht(auth_cache=>$var(user)) = $null;
xlog("L_INFO", "event|registrar|$(kzE{kz.json,Msg-ID}) received directory flush for $var(user)\n");
if ($(kzE{kz.json,Username}) == "") {
sht_rm_value_re("auth_cache=>.*@$(kzE{kz.json,Realm})");
} else {
if ($sht(auth_cache=>$var(user)) != $null) {
$sht(auth_cache=>$var(user)) = $null;
}
}
if( $(kzE{kz.json,Cache-Only}) == "true") {
return;
}
if(reg_fetch_contacts("location", "sip:$var(user)", "caller")) {
$var(i) = 0;
while($var(i) < $(ulc(caller=>count))) {
unregister("location", "sip:$(ulc(caller=>aor))", "$(ulc(caller=>ruid)[$var(i)])");
$var(i) = $var(i) + 1;
}
reg_free_contacts("caller");
$var(Domain) = $(kzE{kz.json,Realm});
$var(Username) = $(kzE{kz.json,Username});
$var(Query) = $_s(KZQ_REGISTRAR_FLUSH);
if($var(Username) != "") {
$var(Query) = $var(Query) + $_s( and username = "$var(Username)");
}
$var(count) = 0;
if (sql_xquery("cb", "$var(Query)", "ra") == 1)
{
while($xavp(ra) != $null) {
unregister("location", "sip:$xavp(ra=>aor)", "$xavp(ra=>ruid)");
pv_unset("$xavp(ra)");
$var(count) = $var(count) + 1;
}
}
if ($(kzE{kz.json,Username}) == "") {
xlog("L_INFO", "event|registrar|$(kzE{kz.json,Msg-ID}) flushed $var(count) entries for realm $(kzE{kz.json,Realm})\n");
}
#!ifdef ANTIFLOOD_ROLE
route(ANTIFLOOD_RESET_AUTH);
#!endif
}
route[REGISTRAR_BINDINGS]
route[KZ_AMQP_BINDING_REGISTRAR_FLUSH]
{
#!import_file "registrar-custom-bindings.cfg"
#!ifndef REGISTRAR_CUSTOM_BINDINGS
$var(payload) = $_s({"name": "registrar-api", "exchange": "registrar", "type": "topic", "queue": "registrar-flush-MY_HOSTNAME", "routing": "registration.flush.*", "federate": 1 });
kazoo_subscribe("$var(payload)");
if(!check_route_exists("KZ_AMQP_BINDING_CUSTOM_REGISTRAR_FLUSH")) {
$var(payload) = $_s({"name": "registrar-flush", "exchange": "registrar", "type": "topic", "queue": "registrar-flush-MY_HOSTNAME", "routing": "registration.flush.*", "federate": true });
kazoo_subscribe("$var(payload)");
}
#!endif
}
#!ifdef REGISTRAR_SYNC_ROLE
route(REGISTRAR_SYNC_BINDINGS);
#!endif
route[KZ_AMQP_BINDING_REGISTRAR_API]
{
if(!check_route_exists("KZ_AMQP_BINDING_CUSTOM_REGISTRAR_API")) {
$var(payload) = $_s({"name": "registrar-api", "exchange": "registrar", "type": "topic", "queue": "registrar-api-MY_HOSTNAME", "routing": "registration.search_req.*", "federate": true });
kazoo_subscribe("$var(payload)");
}
}
@ -557,7 +649,7 @@ event_route[usrloc:contact-expired]
#!endif
## return until we handle this in ecallmr
xlog("L_INFO", "$ulc(exp=>callid)|expired|removed registration for $ulc(exp=>aor) with contact : $ulc(exp=>addr)\n");
xlog("L_INFO", "event|registrar|$ulc(exp=>callid) removed registration for $ulc(exp=>aor) with contact : $ulc(exp=>addr)\n");
return;
$var(transport) = $(ulc(exp=>received){uri.transport});
@ -604,15 +696,13 @@ event_route[usrloc:contact-expired]
$var(amqp_payload_request) = $_s({"Event-Category" : "directory", "Event-Name" : "reg_success", "Status" : "Unregistered", "Event-Timestamp" : $TS, "Expires" : 0, "First-Registration" : false, "Contact" : "$(ulc(exp=>addr){s.escape.common}{s.replace,\','}{s.replace,$$,})", "Call-ID" : "$ulc(exp=>callid)", "Realm" : "$var(domain)", "Username" : "$var(username)", "From-User" : "$var(username)", "From-Host" : "$var(domain)", "To-User" : "$var(username)", "To-Host" : "$var(domain)", "Proxy-Path" : "$ulc(exp=>socket)", "User-Agent" : "$(ulc(exp=>user_agent){s.escape.common}{s.replace,\','}{s.replace,$$,})"});
$var(amqp_routing_key) = "registration.success." + $(var(domain){kz.encode}) + "." + $(var(username){kz.encode});
kazoo_publish("registrar", $var(amqp_routing_key), $var(amqp_payload_request));
xlog("L_INFO", "$ulc(exp=>callid)|expired|notified registration removal with contact : $ulc(exp=>addr)\n");
xlog("L_INFO", "event|registrar|$ulc(exp=>callid) notified registration removal with contact : $ulc(exp=>addr)\n");
}
xlog("L_INFO", "$ulc(exp=>callid)|expired|removed registration for $ulc(exp=>aor) with contact : $ulc(exp=>addr)\n");
xlog("L_INFO", "event|registrar|$ulc(exp=>callid) removed registration for $ulc(exp=>aor) with contact : $ulc(exp=>addr)\n");
}
#!ifdef REGISTRAR_SYNC_ROLE
#!include_file "registrar-sync-role.cfg"
#!endif
#!import_file "registrar-custom-handler.cfg"
# vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab

+ 4
- 4
kamailio/registrar-sync-role.cfg View File

@ -1,9 +1,9 @@
######## Presence sync server module ########
######## REgistrar sync server module ########
event_route[kazoo:consumer-event-directory-reg-sync]
{
$var(Server) = $(kzE{kz.json,Server-ID});
xlog("L_INFO", "received registrar sync from $var(Server) : $kzE\n");
xlog("L_INFO", "event|registrar_sync|received registrar sync from $var(Server) : $kzE\n");
if (sql_xquery("cb", "select * from location", "ra") == 1)
{
@ -11,7 +11,7 @@ event_route[kazoo:consumer-event-directory-reg-sync]
$var(runloop) = 1;
while($xavp(ra) != $null && $var(runloop) < MAX_WHILE_LOOPS ) {
if(registered("location", "sip:$xavp(ra=>username)@$xavp(ra=>domain)", 0, 1)) {
xlog("L_INFO", "[id, username, domain] = [$xavp(ra=>id), $xavp(ra=>username), $xavp(ra=>domain)]\n");
xlog("L_INFO", "event|regisrar_sync|[id, username, domain] = [$xavp(ra=>id), $xavp(ra=>username), $xavp(ra=>domain)]\n");
$var(Expires) = $xavp(ra=>expires) - $TS;
$var(amqp_payload_request) = '{"Event-Category" : "directory", "Event-Name" : "reg_success", "Status" : "Success", "Event-Timestamp" : $TS, "Expires" : $(var(Expires){s.int}), "First-Registration" : false, "Contact" : "$(xavp(ra=>contact){s.escape.common})", "Call-ID" : "$xavp(ra=>callid)", "Realm" : "$xavp(ra=>domain)", "Username" : "$xavp(ra=>username)", "From-User" : "$xavp(ra=>username)", "From-Host" : "$xavp(ra=>domain)", "To-User" : "$xavp(ra=>username)", "To-Host" : "$xavp(ra=>domain)", "User-Agent" : "$(xavp(ra=>user_agent){s.escape.common})" , "Custom-Channel-Vars" : $xavp(ulattrs=>custom_channel_vars), "Proxy-Path" : "sip:$(xavp(ra=>socket){s.substr,4,0})" }';
kazoo_publish("targeted", "$var(Server)", $var(amqp_payload_request));
@ -24,7 +24,7 @@ event_route[kazoo:consumer-event-directory-reg-sync]
}
route[REGISTRAR_SYNC_BINDINGS]
route[KZ_AMQP_BINDING_REGISTRAR_SYNC]
{
$var(payload) = $_s({"exchange": "registrar", "type": "topic", "queue": "registrar-sync-MY_HOSTNAME", "routing": "registration.sync"});
kazoo_subscribe("$var(payload)");


+ 1
- 1
kamailio/sanity.cfg View File

@ -24,7 +24,7 @@ route[SANITY_CHECK]
{
## CVE-2018-14767
if($(hdr(To)[1]) != $null) {
xlog("second To header not null - dropping message");
xlog("L_INFO", "$ci|sanity|second To header not null - dropping message");
drop;
}


+ 22
- 1
kamailio/sip_trace_all-role.cfg View File

@ -13,11 +13,32 @@
####### Siptrace module ##########
loadmodule "siptrace.so"
modparam("siptrace", "duplicate_uri", SIP_TRACE_URI)
modparamx("siptrace", "duplicate_uri", "$def(SIP_TRACE_URI)")
modparam("siptrace", "hep_mode_on", 1)
modparam("siptrace", "hep_version", 3)
modparam("siptrace", "hep_capture_id", HEP_CAPTURE_ID)
modparam("siptrace", "trace_to_database", 0)
modparam("siptrace", "trace_on", KZ_TRACE)
modparam("siptrace", "trace_mode", 1)
modparam("siptrace", "trace_init_mode", 1)
#!trydef KZ_TRACE_IGNORED_PORTS "9494|5090"
#!trydef KZ_TRACE_IGNORED_METHODS "OPTIONS"
kazoo.trace_ignored_ports = KZ_TRACE_IGNORED_PORTS descr "trace ignored ports"
kazoo.trace_ignored_methods = KZ_TRACE_IGNORED_METHODS descr "trace ignored methods"
event_route[siptrace:msg]
{
if($rm =~ $sel(cfg_get.kazoo.trace_ignored_methods)) {
xlog("L_DEBUG", "$ci|trace|dropping trace for method $rm\n");
drop();
}
if($Rp =~ $sel(cfg_get.kazoo.trace_ignored_ports)) {
xlog("L_INFO", "$ci|trace|dropping trace for port $Rp\n");
drop();
}
}

+ 35
- 3
kamailio/tls-role.cfg View File

@ -1,13 +1,45 @@
#!trydef TLS_CONFIG_FILE /etc/kazoo/kamailio/tls.cfg
#!substdef "!TLS_CFG!$def(TLS_CONFIG_FILE)!g"
enable_tls = yes
listen=SIP_TLS_LISTENER
listen=ALG_TLS_LISTENER
#!ifndef WITHOUT_DEFAULT_LISTENER
listen=TLS_LISTENER_SIP
listen=TLS_LISTENER_ALG
#!endif
#!ifdef WITH_EXTERNAL_TLS_LISTENER
listen=TLS_EXTERNAL_LISTENER_SIP
listen=TLS_EXTERNAL_LISTENER_ALG
#!else
#!ifdef WITH_EXTERNAL_TLS_SIP_LISTENER
listen=TLS_EXTERNAL_LISTENER_SIP
#!endif
#!ifdef WITH_EXTERNAL_TLS_ALG_LISTENER
listen=TLS_EXTERNAL_LISTENER_ALG
#!endif
#!endif
#!ifdef WITH_LOAD_BALANCED_TLS_LISTENER
listen=TLS_LOAD_BALANCED_LISTENER_SIP
listen=TLS_LOAD_BALANCED_LISTENER_ALG
#!else
#!ifdef WITH_LOAD_BALANCED_TLS_SIP_LISTENER
listen=TLS_LOAD_BALANCED_LISTENER_SIP
#!endif
#!ifdef WITH_LOAD_BALANCED_TLS_ALG_LISTENER
listen=TLS_LOAD_BALANCED_LISTENER_ALG
#!endif
#!endif
####### TLS Parameters #########
loadmodule "tls.so"
modparam("tls", "config", "/etc/kazoo/kamailio/tls.cfg")
modparam("tls", "config", "TLS_CFG")
modparam("tls", "low_mem_threshold1", 1)
modparam("tls", "low_mem_threshold2", 1)
modparam("tls", "xavp_cfg", "tls")
modparam("debugger", "mod_level", "tls=1")

+ 38
- 26
kamailio/trusted.cfg View File

@ -1,45 +1,54 @@
####### Permissions module ##########
#!trydef KZ_PERMISSIONS_MAX_SUBNET 2048
#!trydef KZ_PERMISSIONS_CACHE 0
#!trydef TRUSTED_AMQP_FLAGS 2048
loadmodule "permissions.so"
modparam("permissions", "db_url", "KAZOO_DB_URL")
modparam("permissions", "db_mode", KZ_PERMISSIONS_CACHE)
modparam("permissions", "peer_tag_avp", "$avp(trusted_x_header)")
modparam("permissions", "max_subnets", KZ_PERMISSIONS_MAX_SUBNET)
modparam("rtimer", "timer", "name=trusted_reload;interval=20;mode=1;")
modparam("rtimer", "timer", "name=trusted_reload;interval=30;mode=1;")
modparam("rtimer", "exec", "timer=trusted_reload;route=TRUSTED_RELOAD")
modparam("rtimer", "exec", "timer=trusted_reload;route=TRUSTED_QUERY")
modparam("pv", "shvset", "trusted_query=i:1")
#!trydef TRUSTED_AMQP_FLAGS 2048
route[TRUSTED_LOAD]
{
$shv(trusted_query) = 0;
$shv(trusted_query) = 2;
$shv(trusted_reload) = 0;
$var(amqp_payload_request) = $_s({"Event-Category" : "trusted" , "Event-Name" : "query"});
$var(amqp_routing_key) = "trusted.query";
xlog("L_DEBUG", "$ci|amqp|publishing to acl => $var(amqp_routing_key) : $var(amqp_payload_request)\n");
xlog("L_INFO", "event|trusted|publishing to acl => $var(amqp_routing_key) : $var(amqp_payload_request)\n");
if(kazoo_query("trusted", $var(amqp_routing_key), $var(amqp_payload_request), "$def(TRUSTED_AMQP_FLAGS)") != 1) {
if($(kzR{kz.json,Event-Name}) == "message_returned" ) {
xlog("L_WARNING", "trusted|query|message was returned by broker $(kzR{kz.json,Error-Code}) $(kzR{kz.json,Error-Reason})\n");
xlog("L_WARNING", "event|trusted|message was returned by broker $(kzR{kz.json,Error-Code}) $(kzR{kz.json,Error-Reason})\n");
} else {
xlog("L_WARNING", "trusted|query|failed $kzR\n");
xlog("L_WARNING", "event|trusted|query failed $kzR\n");
}
$shv(trusted_query) = 1;
return;
}
xlog("L_DEBUG", "trusted|query|got reply $kzR\n");
xlog("L_INFO", "event|trusted|query got reply\n");
avp_delete("$avp(TrustedKeys)/g");
if(kazoo_json_keys($kzR, "Trusted", "$avp(TrustedKeys)") != 1) {
xlog("L_WARNING", "trusted|reply|no keys for Trusted\n");
xlog("L_WARNING", "event|trusted|no keys for Trusted\n");
$shv(trusted_query) = 0;
return;
}
xlog("L_INFO", "event|trusted|cleaning address table\n");
sql_query("exec", "delete from address");
$var(total) = 0;
$var(Count) = $cnt($avp(TrustedKeys));
$var(Idx) = 0;
xlog("L_INFO", "event|trusted|count for trusted is $var(Count)\n");
while($var(Idx) < $var(Count)) {
$var(KeyName) = $(avp(TrustedKeys)[$var(Idx)]);
$var(Key) = $(var(KeyName){s.replace,.,%});
@ -69,33 +78,36 @@ route[TRUSTED_LOAD]
$var(portIdx) = 0;
while($var(portIdx) < $var(port_count)) {
$var(sql) = $_s(insert into address(ip_addr, mask, port, tag) values("$var(ip)", $var(mask), $(avp(ports)[$var(portIdx)]), "$var(token)"));
sql_query("exec", "$var(sql)");
sql_query("exec", "$var(sql)");
$var(portIdx) = $var(portIdx) + 1;
$var(total) = $var(total) + 1;
}
$var(cidr_idx) = $var(cidr_idx) + 1;
$var(total) = $var(total) + 1;
}
$var(Idx) = $var(Idx) + 1;
}
xlog("L_NOTICE", "trusted|query|loaded $var(total) entries into address table\n");
xlog("L_NOTICE", "event|trusted|loaded $var(total) entries into address table\n");
$shv(trusted_reload) = 1;
$shv(trusted_query) = 0;
}
route[RELOAD_TRUSTED]
{
jsonrpc_exec('{"jsonrpc": "2.0", "method": "permissions.addressReload"}');
xlog("L_NOTICE", "trusted|reload|$(jsonrpl(body){kz.json,result})\n");
xlog("L_NOTICE", "event|trusted|reload $(jsonrpl(body){kz.json,result})\n");
$shv(trusted_reload) = 0;
}
route[TRUSTED_RELOAD]
{
if($shv(trusted_reload) == 1) {
$shv(trusted_reload) = 2;
} else if($shv(trusted_reload) == 2) {
route(RELOAD_TRUSTED);
};
$shv(trusted_reload) = 0;
}
route[TRUSTED_QUERY]
@ -105,21 +117,21 @@ route[TRUSTED_QUERY]
};
}
route[TRUSTED_BINDINGS]
route[KZ_AMQP_BINDING_TRUSTED]
{
#!import_file "trusted-custom-bindings.cfg"
#!ifndef TRUSTED_CUSTOM_BINDINGS
$var(payload) = $_s({"name": "trusted-reload", "exchange": "trusted", "type": "topic", "queue": "trusted-reload-MY_HOSTNAME", "routing": "trusted.reload", "federate": 1 });
kazoo_subscribe("$var(payload)");
#!endif
if(!check_route_exists("KZ_AMQP_BINDING_CUSTOM_TRUSTED")) {
$var(payload) = $_s({"name": "trusted-reload", "exchange": "trusted", "type": "topic", "queue": "trusted-reload-MY_HOSTNAME", "routing": "trusted.reload", "federate": true });
kazoo_subscribe("$var(payload)");
}
}
event_route[kazoo:consumer-event-trusted-reload]
{
xlog("L_NOTICE", "received trusted reload\n");
$shv(trusted_query) = 1;
xlog("L_NOTICE", "event|trusted|received trusted reload\n");
if ($shv(trusted_query) == 0) {
xlog("L_NOTICE", "event|trusted|signaling trusted reload\n");
$shv(trusted_query) = 1;
} else {
xlog("L_NOTICE", "event|trusted|signal already active for trusted reload\n");
}
}

+ 71
- 28
kamailio/websockets-role.cfg View File

@ -1,10 +1,56 @@
tcp_accept_no_cl=yes
listen=WS_TCP_LISTENER
#!ifndef WITHOUT_DEFAULT_LISTENER
#!ifdef WS_LISTEN_PLAIN
listen=TCP_LISTENER_WS
#!endif
#!ifdef TLS_ROLE
listen=TLS_LISTENER_WSS
#!endif
#!endif
#!ifdef WITH_EXTERNAL_WEBSOCKETS_LISTENER
#!ifdef WS_LISTEN_PLAIN
listen=TCP_EXTERNAL_LISTENER_WS
#!endif
#!ifdef TLS_ROLE
listen=TLS_EXTERNAL_LISTENER_WSS
#!endif
#!else
#!ifdef WITH_EXTERNAL_WS_LISTENER
#!ifdef WS_LISTEN_PLAIN
listen=TCP_EXTERNAL_LISTENER_WS
#!endif
#!endif
#!ifdef WITH_EXTERNAL_WSS_LISTENER
#!ifdef TLS_ROLE
listen=TLS_EXTERNAL_LISTENER_WSS
#!endif
#!endif
#!endif
#!ifdef WITH_LOAD_BALANCED_WEBSOCKETS_LISTENER
#!ifdef WS_LISTEN_PLAIN
listen=TCP_LOAD_BALANCED_LISTENER_WS
#!endif
#!ifdef TLS_ROLE
listen=TLS_LOAD_BALANCED_LISTENER_WSS
#!endif
#!else
#!ifdef WITH_LOAD_BALANCED_WS_LISTENER
#!ifdef WS_LISTEN_PLAIN
listen=TCP_LOAD_BALANCED_LISTENER_WS
#!endif
#!endif
#!ifdef WITH_LOAD_BALANCED_WSS_LISTENER
#!ifdef TLS_ROLE
listen=WSS_TLS_LISTENER
listen=TLS_LOAD_BALANCED_LISTENER_WSS
#!endif
#!endif
#!endif
######## NAT Traversal module - signaling functions ########
#!ifndef NATHELPER_LOADED
#!trydef NATHELPER_LOADED
@ -14,10 +60,6 @@ loadmodule "nathelper.so"
######## Generic Hash Table container in shared memory ########
modparam("htable", "htable", "websockets=>size=16;initval=0")
######## Basic HTTP request handling ########
loadmodule "xhttp.so"
#!trydef WS_KEEPALIVE_MECHANISM 3
#!trydef WS_KEEPALIVE_TIMEOUT 30
#!trydef WS_KEEPALIVE_PROCESSES 3
@ -46,39 +88,36 @@ kazoo.ws_max_connection_per_proxy = WS_MAX_CONNECTIONS_PER_PROXY desc "max conne
kazoo.ws_connections_via_proxy_only = WS_CONNECTIONS_FROM_PROXY_ONLY desc "only allow connections via proxy"
kazoo.ws_connections_restrict_origin = WS_CONNECTIONS_RESTRICT_ORIGIN desc "restrict origin if MY_WEBSOCKET_DOMAIN is defined"
event_route[xhttp:request]
route[WEBSOCKET_REQUEST]
{
set_reply_close();
set_reply_no_connect();
if (!($rm =~ "GET")) {
xlog("L_INFO", "websocket|log|rejecting HTTP request $rm from $si:$sp\n");
xlog("L_INFO", "http|websocket|rejecting HTTP request $rm from $si:$sp\n");
xhttp_reply("405", "Method Not Allowed", "", "");
exit;
}
if (!($hdr(Connection) =~ "Upgrade")) {
xlog("L_INFO", "websocket|log|rejecting HTTP connection $hdr(Connection) request from $si:$sp\n");
xlog("L_INFO", "http|websocket|rejecting HTTP connection $hdr(Connection) request from $si:$sp\n");
xhttp_reply("400", "Bad Request", "", "");
exit;
}
if (!($hdr(Upgrade) =~ "websocket")) {
xlog("L_INFO", "websocket|log|rejecting HTTP upgrade $hdr(Upgrade) request from $si:$sp\n");
xlog("L_INFO", "http|websocket|rejecting HTTP upgrade $hdr(Upgrade) request from $si:$sp\n");
xhttp_reply("400", "Bad Request", "", "");
exit;
}
if (!($hdr(Sec-WebSocket-Protocol) =~ "sip")) {
xlog("L_INFO", "websocket|log|rejecting request for websocket protocol $hdr(Sec-WebSocket-Protocol) from $si:$sp\n");
xlog("L_INFO", "http|websocket|rejecting request for websocket protocol $hdr(Sec-WebSocket-Protocol) from $si:$sp\n");
xhttp_reply("400", "Bad Request", "", "");
exit;
}
#!ifdef MY_WEBSOCKET_DOMAIN
#!ifndef WEBSOCKET_NO_ORIGIN_RESTRICTION
if($sel(cfg_get.kazoo.ws_connections_restrict_origin) == 1) {
if (!($hdr(Origin) =~ "MY_WEBSOCKET_DOMAIN")) {
xlog("L_INFO", "websocket|log|rejecting HTTP request with unauthorized origin $hdr(Origin) from $si:$sp, allowed origin is MY_WEBSOCKET_DOMAIN\n");
xlog("L_INFO", "http|websocket|rejecting HTTP request with unauthorized origin $hdr(Origin) from $si:$sp, allowed origin is MY_WEBSOCKET_DOMAIN\n");
xhttp_reply("400", "Bad Request", "", "");
exit;
}
@ -87,50 +126,53 @@ event_route[xhttp:request]
if ($hdr(X-Forwarded-For) == $null) {
if($sel(cfg_get.kazoo.ws_connections_via_proxy_only) == 1) {
xlog("L_INFO", "websocket|log|request from $si without X-Forwarded-For Header and only allowed connections are via proxy\n");
xlog("L_INFO", "http|websocket|request from $si without X-Forwarded-For Header and only allowed connections are via proxy\n");
xhttp_reply("403", "Forbidden", "", "");
exit;
} else {
$var(ws_orig_ip) = $si;
}
} else {
xlog("L_INFO", "websocket|log|request X-Forwarded-For $hdr(X-Forwarded-For) from $si\n");
xlog("L_INFO", "http|websocket|request X-Forwarded-For $hdr(X-Forwarded-For) from $si\n");
$var(ws_orig_ip) = $hdr(X-Forwarded-For);
}
if($si != $var(ws_orig_ip)) {
if($si != $var(ws_orig_ip)) {
if(!is_in_subnet($si, $sel(cfg_get.kazoo.ws_allowed_proxies))) {
xlog("L_WARNING", "websocket|log|request X-Forwarded-For $hdr(X-Forwarded-For) from invalid ip $si - allowed $sel(cfg_get.kazoo.ws_allowed_proxies)\n");
xlog("L_WARNING", "http|websocket|request X-Forwarded-For $hdr(X-Forwarded-For) from invalid ip $si - allowed $sel(cfg_get.kazoo.ws_allowed_proxies)\n");
xhttp_reply("403", "Forbidden", "", "");
exit;
}
if($sel(cfg_get.kazoo.ws_max_connection_per_proxy) > 0 && $sht(websockets=>$si::count) > $sel(cfg_get.kazoo.ws_max_connection_per_proxy)) {
xlog("L_WARN", "websocket|log|$si is at the maximum $sel(cfg_get.kazoo.ws_max_connection_per_proxy) allowable sockets per PROXY IP, rejecting request for another websocket\n");
xlog("L_WARN", "http|websocket|$si is at the maximum $sel(cfg_get.kazoo.ws_max_connection_per_proxy) allowable sockets per PROXY IP, rejecting request for another websocket\n");
xhttp_reply("403", "Forbidden", "", "");
exit;
}
}
if($sel(cfg_get.kazoo.ws_max_connection_per_ip) > 0 && $sht(websockets=>$var(ws_orig_ip)::count) > $sel(cfg_get.kazoo.ws_max_connection_per_ip)) {
xlog("L_WARN", "websocket|log|$var(ws_orig_ip) is at the maximum $sel(cfg_get.kazoo.ws_max_connection_per_ip) allowable sockets per IP, rejecting request for another websocket\n");
xlog("L_WARN", "http|websocket|$var(ws_orig_ip) is at the maximum $sel(cfg_get.kazoo.ws_max_connection_per_ip) allowable sockets per IP, rejecting request for another websocket\n");
xhttp_reply("403", "Forbidden", "", "");
exit;
}
route_if_exists("WS_ON_BEFORE_HANSHAKE");
if (ws_handle_handshake()) {
$var(count) = $shtinc(websockets=>$var(ws_orig_ip)::count);
$sht(websockets=>$ws_conid::ws_orig_ip) = $var(ws_orig_ip);
if($si != $var(ws_orig_ip)) {
$var(proxy_count) = $shtinc(websockets=>$si::count);
xlog("L_INFO", "websocket|log|opened proxied websocket $ws_conid from $si for $var(ws_orig_ip):$sp\n");
xlog("L_INFO", "http|websocket|opened proxied websocket $ws_conid from $si for $var(ws_orig_ip):$sp\n");
} else {
xlog("L_INFO", "websocket|log|opened websocket $ws_conid from $var(ws_orig_ip):$sp\n");
xlog("L_INFO", "http|websocket|opened websocket $ws_conid from $var(ws_orig_ip):$sp\n");
}
route_if_exists("WS_ON_SUCCESSFULL_HANSHAKE");
exit;
}
xlog("L_INFO", "websocket|log|unhandled HTTP request $rm from $si:$sp\n");
xlog("L_INFO", "http|websocket|unhandled HTTP request $rm from $si:$sp\n");
xhttp_reply("404", "Not Found", "", "");
}
@ -138,14 +180,15 @@ event_route[websocket:closed]
{
$var(ws_orig_ip) = $sht(websockets=>$ws_conid::ws_orig_ip);
$sht(websockets=>$ws_conid::ws_orig_ip) = $null;
$var(count) = $shtdec(websockets=>$si::count);
if($var(ws_orig_ip) != $null && $si != $var(ws_orig_ip)) {
$var(countip) = $shtdec(websockets=>$var(ws_orig_ip)::count);
xlog("L_INFO", "websocket|log|$si closed proxied websocket $ws_conid for $var(ws_orig_ip):$sp\n");
xlog("L_INFO", "http|websocket|$si closed proxied websocket $ws_conid for $var(ws_orig_ip):$sp\n");
if ($var(countip) < 1) $sht(websockets=>$var(ws_orig_ip)::count) = $null;
} else {
xlog("L_INFO", "websocket|log|closed websocket $ws_conid from $var(ws_orig_ip):$sp\n");
xlog("L_INFO", "http|websocket|closed websocket $ws_conid from $var(ws_orig_ip):$sp\n");
}
if ($var(count) < 1) $sht(websockets=>$si::count) = $null;
route_if_exists("WS_ON_CLOSE");
}

Loading…
Cancel
Save