@ -61,6 +61,24 @@ loadmodule "sqlops.so"
#!endif
#!endif
modparam("sqlops","sqlcon", "exec = >KAZOO_DB_URL")
modparam("sqlops","sqlcon", "exec = >KAZOO_DB_URL")
#!ifdef FAST_PICKUP_ROLE
#!include_file "fast-pickup-role.cfg"
#!endif
#!ifdef PRESENCE_QUERY_ROLE
#!include_file "presence_query-role.cfg"
#!endif
#!ifdef PRESENCE_NOTIFY_SYNC_ROLE
#!include_file "presence_notify_sync-role.cfg"
#!endif
#!include_file "presence-reset.cfg"
####### Presence Logic ########
#!ifdef NAT_TRAVERSAL_ROLE
route[PRESENCE_NAT]
route[PRESENCE_NAT]
{
{
if (client_nat_test("3")) {
if (client_nat_test("3")) {
@ -71,8 +89,8 @@ route[PRESENCE_NAT]
force_rport();
force_rport();
}
}
#!endif
####### Presence Logic ########
route[HANDLE_SUBSCRIBE]
route[HANDLE_SUBSCRIBE]
{
{
if (!is_method("SUBSCRIBE")) {
if (!is_method("SUBSCRIBE")) {
@ -175,10 +193,16 @@ route[HANDLE_PUBLISH]
event_route[kazoo:consumer-event-presence-dialog-update]
event_route[kazoo:consumer-event-presence-dialog-update]
{
{
xlog("L_INFO", "$(kzE{kz.json,Call-ID})|log|received $(kzE{kz.json,Event-Package}) update for $(kzE{kz.json,From}) state $(kzE{kz.json,State})\n");
xlog("L_INFO", "$(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,Switch-URI})\n");
$var(JObj) = $kzE;
#!ifdef FAST_PICKUP_ROLE
route(FAST_PICKUP_INIT);
#!endif
if(pres_has_subscribers("$(kzE{kz.json,From})", "dialog")) {
if(pres_has_subscribers("$(kzE{kz.json,From})", "dialog")) {
xlog("L_INFO", "$(kzE{kz.json,Call-ID})|log|publishing dialog update for $(kzE{kz.json,From})\n");
xlog("L_INFO", "$(kzE{kz.json,Call-ID})|log|publishing dialog update for $(kzE{kz.json,From})\n");
kazoo_pua_publish_dialoginfo($kzE);
kazoo_pua_publish_dialoginfo($var(JObj) );
pres_refresh_watchers("$(kzE{kz.json,From})", "dialog", 1);
pres_refresh_watchers("$(kzE{kz.json,From})", "dialog", 1);
} else {
} else {
xlog("L_INFO", "$(kzE{kz.json,Call-ID})|log|skip dialog update for $(kzE{kz.json,From})\n");
xlog("L_INFO", "$(kzE{kz.json,Call-ID})|log|skip dialog update for $(kzE{kz.json,From})\n");
@ -220,116 +244,33 @@ event_route[kazoo:consumer-event-presence-update]
}
}
route[RESET_ZONE]
{
xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|received presence reset for this zone\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");
}
route[RESET_ACCOUNT ]
route[PRESENCE_BINDINGS]
{
{
xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|received presence reset for realm $(kzE{kz.json,Realm})\n");
sql_query("exec", 'delete from presentity where domain = "$(kzE{kz.json,Realm})" ');
$var(presentities) = $sqlrows(exec);
sql_query("exec", 'update active_watchers set expires = $TS where watcher_domain="$(kzE{kz.json,Realm})" ');
$var(watchers) = $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");
}
#!import_file "presence-custom-bindings.cfg"
#!ifndef PRESENCE_CUSTOM_BINDINGS
$var(payload) = "{ 'exchange' : 'presence' , 'queue' : 'presence-dialog-MY_HOSTNAME', 'exclusive' : 0 ,'type' : 'topic', 'routing' : 'dialog.*.*', 'federate' : 1 }";
kazoo_subscribe("$var(payload)");
route[RESET_WILDCARD]
{
if($(kzE{kz.json,Realm}) = = "*") {
if($(kzE{kz.json,Username}) = = "MY_AMQP_ZONE") {
route(RESET_ZONE);
} else {
xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|received presence reset for zone $(kzE{kz.json,Username}). 'MY_AMQP_ZONE' doesn't care\n");
}
exit();
} else {
route(RESET_ACCOUNT);
}
}
$var(payload) = "{ 'exchange' : 'presence' , 'queue' : 'presence-presence-MY_HOSTNAME', 'exclusive' : 0 ,'type' : 'topic', 'routing' : 'update.*.*', 'federate' : 1 }";
kazoo_subscribe("$var(payload)");
$var(payload) = "{ 'exchange' : 'presence' , 'queue' : 'presence-mwi-MY_HOSTNAME', 'exclusive' : 0 ,'type' : 'topic', 'routing' : 'mwi_updates.*', 'federate' : 1 }";
kazoo_subscribe("$var(payload)");
#!endif
event_route[kazoo:consumer-event-presence-reset]
{
if($(kzE{kz.json,Username}) = = "*" || $(kzE{kz.json,Realm}) == "*") {
route(RESET_WILDCARD);
exit();
}
xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|received presence reset for $(kzE{kz.json,Username})@$(kzE{kz.json,Realm})\n");
$var(presentity) = "sip:" + $(kzE{kz.json,Username}) + "@" + $(kzE{kz.json,Realm});
sql_query("exec", 'delete from presentity where domain = "$(kzE{kz.json,Realm})" and username = "$(kzE{kz.json,Username})"');
if(pres_has_subscribers("$var(presentity)", "message-summary")) {
xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|notifying message-summary subscribers of $var(presentity)\n");
pres_refresh_watchers("$var(presentity)", "message-summary", 1);
} else {
xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|skip message-summary subscriber notification for $var(presentity))\n");
}
if(pres_has_subscribers("$var(presentity)", "presence")) {
xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|notifying presence subscribers of $var(presentity)\n");
pres_refresh_watchers("$var(presentity)", "presence", 1);
} else {
xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|skip presence subscriber notification for $var(presentity))\n");
}
if(pres_has_subscribers("$var(presentity)", "dialog")) {
xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|notifying dialog subscribers of $var(presentity)\n");
pres_refresh_watchers("$var(presentity)", "dialog", 1);
} else {
xlog("L_INFO", "$(kzE{kz.json,Msg-ID})|reset|skip dialog subscriber notification for $var(presentity))\n");
}
route(PRESENCE_RESET_BINDINGS);
#!ifdef PRESENCE_QUERY_ROLE
route(PRESENCE_QUERY_BINDINGS);
#!endif
}
#!ifdef FAST_PICKUP_ROLE
route(FAST_PICKUP_START);
#!endif
route[HANDLE_PRESENCE_UPDATE]
{
$var(call-id) = $(kzE{kz.json,Call-ID});
if( $(kzE{kz.json,Event-Package}) = = "dialog") {
if($sht(p = >$var(call-id)) != $(kzE{kz.json,State}) || $(kzE{kz.json,Flush-Level}) != $null) {
xlog("L_INFO", "$(kzE{kz.json,Target-Call-ID})|log|received $(kzE{kz.json,Event-Package}) update for $(kzE{kz.json,From}) state $(kzE{kz.json,State}) $kzE\n");
$sht(p = >$(kzE{kz.json,Call-ID})) = $(kzE{kz.json,State});
#!ifdef FAST_PICKUP_ROLE
route(FAST_PICKUP_INIT);
#!endif
kazoo_pua_publish($kzE);
pres_refresh_watchers("$(kzE{kz.json,From})", "$(kzE{kz.json,Event-Package})", 1);
$var(Presence) = $(kzE{re.subst,/"Event-Package": "dialog"/"Event-Package": "presence"/g});
xlog("L_INFO", "PRESENCE $var(Presence)");
kazoo_pua_publish($var(Presence));
pres_refresh_watchers("$(var(Presence){kz.json,From})", "$(var(Presence){kz.json,Event-Package})", 1);
} else {
xlog("L_INFO", "$var(call-id)|log|received duplicate $(kzE{kz.json,Event-Package}) update for $(kzE{kz.json,From}) state $(kzE{kz.json,State}) $kzE\n");
xlog("L_INFO", "$var(call-id)|log|payload $kzE\n");
}
} else {
xlog("L_INFO", "$var(call-id)|log|received $(kzE{kz.json,Event-Package}) update for $(kzE{kz.json,From}) $kzE\n");
kazoo_pua_publish($kzE);
pres_refresh_watchers("$(kzE{kz.json,From})", "$(kzE{kz.json,Event-Package})", 1);
}
}
}
#!ifndef PRESENCE_CUSTOM_BINDINGS
route[PRESENCE_BINDINGS]
{
$var(payload) = "{ 'exchange' : 'presence' , 'queue' : 'presence-dialog-MY_HOSTNAME', 'exclusive' : 0 ,'type' : 'topic', 'routing' : 'dialog.*.*', 'federate' : 1 }";
kazoo_subscribe("$var(payload)");
$var(payload) = "{ 'exchange' : 'presence' , 'queue' : 'presence-presence-MY_HOSTNAME', 'exclusive' : 0 ,'type' : 'topic', 'routing' : 'update.*.*', 'federate' : 1 }";
kazoo_subscribe("$var(payload)");
$var(payload) = "{ 'exchange' : 'presence' , 'queue' : 'presence-mwi-MY_HOSTNAME', 'exclusive' : 0 ,'type' : 'topic', 'routing' : 'mwi_updates.*', 'federate' : 1 }";
kazoo_subscribe("$var(payload)");
$var(payload) = "{ 'exchange' : 'presence' , 'queue' : 'presence-reset-MY_HOSTNAME', 'exclusive' : 0 ,'type' : 'topic', 'routing' : 'presence.reset.*.*', 'federate' : 1 }";
kazoo_subscribe("$var(payload)");
}
#!endif
# vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab
# vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab