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
© Copyright 2025 ExpyDoc