Kamailio and Kazoo

Kamailio and Kazoo
Presented by Karl Anderson
Karl Anderson
Senior Bit Herder
What is Kazoo
What is AMQP
What is db_kazoo
Anca Vamanu
How do we use it
modparam("auth_db|usrloc", "db_url", "kazoo://guest:[email protected]:5672/callmgr")
modparam("presence", "db_url", "kazoo://guest:[email protected]:5672/dialoginfo")
####### Authentication module ##########
loadmodule "auth.so"
loadmodule "auth_db.so"
modparam("auth_db", "version_table", 0)
modparam("auth_db", "password_column", "password")
modparam("auth_db", "load_credentials", "$avp(password)=password")
####### User Location module ##########
loadmodule "usrloc.so"
modparam("usrloc", "db_mode", 1)
modparam("usrloc", "db_update_as_insert", 1)
route[HANDLE_REGISTER]
{
if (is_method("REGISTER")) {
if (auth_check("$fd", "subscriber", "1")) {
consume_credentials();
save("location");
} else {
auth_challenge("$fd", "0");
}
exit;
}
}
######## Generic Hash Table in shared memory ########
modparam("htable", "htable", "dbkp=>size=16;autoexpire=7200")
######## Presence User Agent ########
loadmodule "pua_dialoginfo.so"
modparam("pua_dialoginfo", "library_mode", 1)
######## Presence Server ########
loadmodule "presence.so"
loadmodule "presence_dialoginfo.so"
modparam("presence", "subs_db_mode", 1)
####### Presence Logic ########
route[HANDLE_SUBSCRIBE]
{
if (is_method("SUBSCRIBE")) {
if (!t_newtran()) {
sl_reply_error();
exit;
}
handle_subscribe();
t_release();
exit;
}
}
How does it work
int db_kazoo_bind_api(db_func_t *dbb)
{
dbb->init
= db_kazoo_init;
dbb->use_table
= db_kazoo_use_table;
dbb->close
= db_kazoo_close;
dbb->query
= db_kazoo_query;
dbb->free_result
= db_kazoo_free_result;
dbb->insert
= db_kazoo_insert;
dbb->replace
= db_kazoo_replace;
dbb->insert_update
= db_kazoo_insert_update;
dbb->delete
= db_kazoo_delete;
dbb->update
= db_kazoo_update;
dbb->raw_query
= db_kazoo_raw_query;
dbb->cap
= DB_CAP_ALL;
return 0;
}
int dbk_credentials_query(const db1_con_t* _h, ..., db1_res_t** _r) {
amqp_mb.len = sprintf(messagebody, "{\"Method\":\"REGISTER\","
"\"Auth-Realm\":\"%.*s\","
"\"Auth-User\":\"%.*s\","
"\"From\":\"%.*s@%.*s\","
"\"To\":\"%.*s@%.*s\","
"\"Server-ID\":\"%s\","
"\"Node\":\"kamailio@%.*s\","
"\"Msg-ID\":\"%.*s\","
"\"App-Version\":\"%s\","
"\"App-Name\":\"%s\","
"\"Event-Name\":\"authn_req\","
"\"Event-Category\":\"directory\"}",
_v[1].val.str_val.len, _v[1].val.str_val.s,
_v[0].val.str_val.len, _v[0].val.str_val.s,
_v[0].val.str_val.len, _v[0].val.str_val.s,
_v[1].val.str_val.len, _v[1].val.str_val.s,
_v[0].val.str_val.len, _v[0].val.str_val.s,
_v[1].val.str_val.len, _v[1].val.str_val.s,
serverid,
dbk_node_hostname.len, dbk_node_hostname.s,
unique_string.len, unique_string.s,
VERSION, NAME);
amqp_mb.bytes = messagebody;
if (!amqp_basic_publish(rmq->conn, rmq->channel, ..., amqp_mb)) {
goto error;
}
while (body_received < body_target) {
if (dbk_rmq_wait_for_data(rmq->conn) < 0 ) {
goto error;
}
memcpy(body + body_received, frame.payload.body_fragment.bytes,
frame.payload.body_fragment.len);
body_received += frame.payload.body_fragment.len;
if (body_received != body_target) {
goto error;
}
}
body[body_received] = '\0';
db1_res_t* db_res = dbk_creds_build_result(body, _c, _nc);
*_r = db_res;
return 0;
}
What next
github.com/2600hz
2600hz.com
Learn more!
voipkb.com
KAZOO
California, San Francisco
June 2-4
FreeSWITCH
Wisconsin, Milwaukee
June 23-25