Browse Source

KAZOO-2870 - adapt the configuration and script

3.17
lazedo 11 years ago
parent
commit
fe8e256589
5 changed files with 160 additions and 33 deletions
  1. +24
    -0
      kamailio/default.cfg
  2. +32
    -0
      kamailio/dispatcher-role.cfg
  3. +5
    -0
      kamailio/local.cfg
  4. +44
    -11
      kamailio/presence-role.cfg
  5. +55
    -22
      kamailio/registrar-role.cfg

+ 24
- 0
kamailio/default.cfg View File

@ -150,6 +150,16 @@ modparam("db_text", "db_mode", 1)
####### Kazoo Integration module ##########
loadmodule "db_kazoo.so"
modparam("db_kazoo", "node_hostname", "MY_HOSTNAME")
modparam("db_kazoo", "register_fs_path", "MY_IP_ADDRESS")
modparam("db_kazoo", "amqp_connection", "MY_AMQP_URL_1")
modparam("db_kazoo", "amqp_connection", "MY_AMQP_URL_2")
#modparam("db_kazoo", "amqp_connection", "MY_AMQP_URL_3")
#modparam("db_kazoo", "amqp_connection", "MY_AMQP_URL_4")
modparam("db_kazoo", "amqp_max_channels", AMQP_NUMBER_OF_CHANNELS)
modparam("db_kazoo", "amqp_internal_loop_count", 1);
modparam("db_kazoo", "amqp_consumer_loop_count", 3);
####### Role Configurations ##########
#!ifdef DISPATCHER-ROLE
@ -583,4 +593,18 @@ onsend_route {
xlog("L_INFO", "$ci|pass|$sndfrom(ip):$sndfrom(port) -> $sndto(ip):$sndto(port)");
}
event_route[kazoo:mod-init]
{
#!ifdef PRESENCE-ROLE
kazoo_subscribe("dialoginfo", "direct", "BLF-QUEUE-MY_HOSTNAME", "BLF-MY_HOSTNAME");
#!endif
}
event_route[kazoo:consumer-event]
{
xlog("L_INFO","REALLY!! you subscribed for something and you're not handling it ?");
xlog("L_INFO","Payload : $kzE");
}
# vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab

+ 32
- 0
kamailio/dispatcher-role.cfg View File

@ -68,6 +68,38 @@ route[DISPATCHER_FIND_ROUTES]
}
#!endif
if (is_method("INVITE")) {
if($hdr(Replaces)!= $null) {
$var(replaced_call_id) = $(hdr(Replaces){s.select,0,;});
xlog("L_INFO", "$ci|log|replaces call-id $var(replaced_call_id)");
$var(amqp_payload_request) = "{'Event-Category' : 'call_event' , 'Event-Name' : 'channel_status_req', 'Call-ID' : '$var(replaced_call_id)', 'Active-Only' : false }";
$var(amqp_routing_key) = "call.status_req." + $var(replaced_call_id);
if(kazoo_query("callevt", $var(amqp_routing_key), $var(amqp_payload_request), "$var(amqp_result)")) {
xlog("L_INFO", "$ci|log|amqp_result = $var(amqp_result)");
kazoo_json("$var(amqp_result)", "Switch-URL", "$du");
if($du != $null) {
xlog("L_INFO", "$ci|log|call-id $var(replaced_call_id) found redirecting call to $du, courtesy of kazoo");
return;
}
}
} else {
## query user channels - maybe we should this only to feature codes, *3... or *
$var(amqp_payload_request) = "{'Event-Category' : 'call_event' , 'Event-Name' : 'query_user_channels_req', 'Realm' : '" + $fd + "', 'Username' : '" + $fU + "', 'Active-Only' : false }";
$var(amqp_routing_key) = "call.status_req.$(ci{kz.encode})";
xlog("L_DBG", "$ci|log|amqp_payload_user_channels = $var(amqp_payload_request)");
xlog("L_DBG", "$ci|log|amqp_payload_user_channels key = $var(amqp_routing_key)");
if(kazoo_query("callevt", $var(amqp_routing_key), $var(amqp_payload_request), "$var(amqp_result)")) {
xlog("L_DBG", "$ci|log|amqp_result_user_channels = $var(amqp_result)");
$du = $(var(amqp_result){kz.json,Channels[0].switch_url});
if($du != $null) {
xlog("L_DBG", "$ci|log|user channels found redirecting call to $du, courtesy of kazoo");
return;
}
}
}
}
if (!ds_select_dst("$var(ds_group)", "0") || $(avp(ds_dst)[0]) == $null) {
# if we selected from group 1, try again in group 2
if ($var(ds_group) == 1) {


+ 5
- 0
kamailio/local.cfg View File

@ -33,6 +33,11 @@ debug = L_INFO
## This should be the primary RabbitMQ server
## in the zone that this server will service.
#!substdef "!MY_AMQP_URL!kazoo://guest:guest@127.0.0.1:5672!g"
#!substdef "!MY_AMQP_URL_1!amqp://guest:guest@127.0.0.1:5672!g"
#!substdef "!MY_AMQP_URL_2!amqp://guest:guest@127.0.0.1:5672!g"
#!substdef "!MY_AMQP_URL_3!amqp://guest:guest@127.0.0.1:5672!g"
#!substdef "!MY_AMQP_URL_4!amqp://guest:guest@127.0.0.1:5672!g"
#!substdef "!MY_AMQP_NUMBER_OF_CHANNELS!100!g"
## This parameter is only required if you are using websockets
## This value must be present in the HTTP


+ 44
- 11
kamailio/presence-role.cfg View File

@ -1,34 +1,29 @@
######## Generic Hash Table container in shared memory ########
modparam("htable", "htable", "dbkp=>size=16;autoexpire=7200")
######## Presence server module ########
loadmodule "presence.so"
loadmodule "presence_dialoginfo.so"
loadmodule "presence_mwi.so"
loadmodule "presence_xml.so"
modparam("presence", "subs_db_mode", 1)
modparam("presence", "subs_db_mode", 0)
modparam("presence", "expires_offset", 60)
modparam("presence", "publ_cache", 0)
modparam("presence", "min_expires", 0)
modparam("presence", "max_expires", 3600)
modparam("presence", "db_url", "MY_AMQP_URL/dialoginfo")
modparam("presence", "send_fast_notify", 0)
modparam("presence", "clean_period", 10)
modparam("presence", "clean_period", 30)
modparam("presence_xml", "integrated_xcap_server", 1)
modparam("presence_xml", "db_url", "MY_AMQP_URL/dialoginfo")
modparam("presence_xml", "force_active", 1)
######## Presence User Agent module ########
loadmodule "pua.so"
modparam("pua", "db_mode", 0)
modparam("pua", "db_url", "MY_AMQP_URL/dialoginfo")
modparam("pua", "db_url", "text:///etc/kazoo/kamailio/dbtext")
modparam("pua", "update_period", 6)
modparam("pua", "min_expires", 300)
modparam("pua", "outbound_proxy", "sip:MY_IP_ADDRESS")
loadmodule "pua_dialoginfo.so"
modparam("pua_dialoginfo", "library_mode", 1)
####### Presence Logic ########
route[HANDLE_SUBSCRIBE]
@ -42,7 +37,21 @@ route[HANDLE_SUBSCRIBE]
sl_reply_error();
exit;
}
handle_subscribe();
##RabbitMQ
$var(fs_path) = "%3C" + $rz + "%3A" + $Ri + "%3A" + $Rp + "%3Btransport=" + $proto + "%3Blr%3Breceived=" + $si+":"+$sp+"%3E";
$var(fs_contact) = "<" + $(ct{tobody.uri}) + ";fs_path=" + $var(fs_path) + ">";
if($(ct{tobody.params}) != $null) {
$var(fs_contact) = $var(fs_contact) + ";" + $(ct{tobody.params});
}
$var(amqp_payload_request) = "{'Event-Category' : 'presence', 'Event-Name' : 'subscription', 'Event-Package' : '" + $hdr(event) + "', 'Expires' : " + $hdr(Expires) + ", 'Queue' : 'BLF-MY_HOSTNAME', 'Server-ID' : 'BLF-MY_HOSTNAME' ,'Contact' : '" + $var(fs_contact) + "', 'Call-ID' : '" + $ci + "', 'From' : '" + $fu +"', 'User' : '" + $tu + "', 'User-Agent' : '" + $ua + "' }";
xlog("L_DBG", "$ci|log|amqp_presence = $var(amqp_payload_request)");
kazoo_publish("dialoginfo_subs", "dialoginfo_subs", $var(amqp_payload_request));
t_release();
exit;
}
@ -55,10 +64,34 @@ route[HANDLE_PUBLISH]
sl_reply_error();
exit;
}
handle_publish();
if($hdr(Sender)!= $null)
handle_publish("$hdr(Sender)");
else
handle_publish();
t_release();
exit;
}
}
event_route[kazoo:consumer-event-presence-update]
{
xlog("L_DBG","AMQP PRESENCE EVENT : $kzE");
kazoo_pua_publish($kzE);
# switch($(kzE{kz.json,Event-Package}))
# {
# case "message-summary":
# kazoo_pua_publish($kzE);
# break;
# case "dialog":
# xlog("L_INFO","kazoo is great.\n");
# kazoo_pua_publish($kzE);
# break;
# default:
# xlog("L_INFO","unhandled event package $(kzE{kz.json,Event-Package})");
# }
}
# vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab

+ 55
- 22
kamailio/registrar-role.cfg View File

@ -4,16 +4,10 @@ modparam("htable", "htable", "failed_auth_hash=>size=14;autoexpire=180;")
####### Authentication Interface module ##########
loadmodule "auth.so"
loadmodule "auth_db.so"
modparam("auth_db", "use_domain", 1)
modparam("auth_db", "version_table", 0)
modparam("auth_db", "calculate_ha1", 1)
modparam("auth_db", "password_column", "password")
modparam("auth_db", "load_credentials", "$avp(password)=password")
####### User Location Implementation module ##########
loadmodule "usrloc.so"
modparam("usrloc", "db_mode", 1)
modparam("usrloc", "db_mode", 0)
modparam("usrloc", "db_update_as_insert", 1)
modparam("usrloc", "use_domain", 1)
modparam("usrloc", "nat_bflag", FLB_NATB)
@ -34,8 +28,6 @@ modparam("registrar", "received_avp", "$avp(AVP_RECV_PARAM)")
modparam("registrar", "min_expires", 300)
modparam("registrar", "max_expires", 3600)
####### Common Module Parameters ##########
modparam("auth_db|usrloc", "db_url", "MY_AMQP_URL/callmgr")
####### Registrar Logic ########
route[HANDLE_REGISTER]
@ -69,21 +61,36 @@ route[HANDLE_REGISTER]
#!endif
if ($sht(auth_cache=>$Au) != $null && pv_auth_check("$fd", "$sht(auth_cache=>$Au)", "0", "0")) {
xlog("L_DBG", "$ci|log|authenticated $Au via cached SIP creds");
xlog("L_INFO", "$ci|log|authenticated $Au via cached SIP creds");
} else {
## RABBITMQ - Credentials fetch
if (!auth_check("$fd", "subscriber", "1")) {
#!ifdef TRAFFIC-FILTER-ROLE
route(FAILED_AUTH_COUNT);
#!endif
$var(amqp_payload_request) = "{'Event-Category' : 'directory' , 'Event-Name' : 'authn_req', 'Method' : 'REGISTER', 'Auth-Realm' : '" + $fd + "', 'Auth-User' : '" + $fU + "', 'From' : '" + $fu + "', 'To' : '" + $tu +"' }";
$var(amqp_routing_key) = "authn.req." + $(fd{kz.encode});
if(kazoo_query("callmgr", $var(amqp_routing_key), $var(amqp_payload_request))) {
$var(password) = $(kzR{kz.json,Auth-Password});
if($var(password) != $null) {
if (!pv_auth_check("$fd", "$var(password)", "0", "0")) {
#!ifdef TRAFFIC-FILTER-ROLE
route(FAILED_AUTH_COUNT);
#!endif
auth_challenge("$fd", "0");
xlog("L_INFO", "$ci|end|failed registration attempt from $si:$sp for $Au");
exit;
} else {
xlog("L_DBG", "$ci|log|caching SIP credentials for $Au");
$sht(auth_cache=>$Au) = $var(password);
}
} else {
auth_challenge("$fd", "0");
xlog("L_INFO", "$ci|log|error getting password from kazoo response");
exit;
}
} else {
auth_challenge("$fd", "0");
xlog("L_INFO", "$ci|end|failed registration attempt from $si:$sp for $Au");
xlog("L_INFO", "$ci|log|error query kazoo for credentials");
exit;
} else {
xlog("L_DBG", "$ci|log|caching SIP credentials for $Au");
$sht(auth_cache=>$Au) = $avp(password);
}
}
} else {
@ -96,7 +103,33 @@ route[HANDLE_REGISTER]
consume_credentials();
save("location");
xlog("L_INFO", "$ci|end|successful registration with contact $ct");
$var(expires) = @contact.expires;
if($var(expires) == $null) {
$var(expires) = $hdr(Expires);
}
if($var(expires) == $null) {
$var(expires) = 190;
}
$var(fs_path) = "%3C" + $rz + "%3A" + $Ri + "%3A" + $Rp + "%3Btransport=" + $proto + "%3Blr%3Breceived=" + $si+":"+$sp+"%3E";
$var(fs_contact) = "<" + $(ct{tobody.uri}) + ";fs_path=" + $var(fs_path) + ">";
if($(ct{tobody.params}) != $null) {
$var(fs_contact) = $var(fs_contact) + ";" + $(ct{tobody.params});
}
xlog("L_INFO", "$ci|end|successful registration with contact $var(fs_contact)");
$var(register_contants) = " 'Presence-Hosts' : 'n/a', 'Profile-Name' : 'sipinterface_1', 'Status' : 'Registered', 'Event-Timestamp' : '" + $TS + "'";
if($var(expires) != $null) {
$var(register_contants) = $var(register_contants) + ", 'Expires' : " + $var(expires);
}
$var(amqp_payload_request) = "{'Event-Category' : 'directory', 'Event-Name' : 'reg_success', 'Contact' : '" + $var(fs_contact) + "', 'Call-ID' : '" + $ci + "', 'Realm' : '" + $fd +"', 'Username' : '" + $fU + "', 'From-User' : '" + $fU + "', 'From-Host' : '" + $fd + "', 'To-User' : '" + $tU +"', 'To-Host' : '" + $td + "', 'User-Agent' : '" + $ua +"' ," + $var(register_contants)+ " }";
$var(amqp_routing_key) = "registration.success." + $(fd{kz.encode}) + "." + $fU;
xlog("L_DBG", "$ci|log|amqp_register_success = $var(amqp_payload_request)");
kazoo_publish("callmgr", $var(amqp_routing_key), $var(amqp_payload_request));
exit;
}
}
@ -151,4 +184,4 @@ route[DOMAIN_FORMAT_CHECK]
}
# vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab
# vim: tabstop=4 softtabstop=4 shiftwidth=4 expandtab

Loading…
Cancel
Save