--[[ * UK01 FreeSWITCH system * * User directory Lua binding * * Developed by Seventh Signal Ltd. & Co. KG, 2011 * Daniel Swarbrick ]] -- SQL callback function to generate a directory user entry function user_cb(row) local dial_string, callgroup if row.msisdn ~= "" then dial_string = string.format("{sip_invite_domain=${dialed_domain},presence_id=${dialed_user}@${dialed_domain}}[leg_delay_start=%d]${sofia_contact(${dialed_user}@${dialed_domain})},sofia/internal/1%s%s@10.20.3.16", row.leg_delay_start, row.prefix, row.msisdn) else dial_string = "{sip_invite_domain=${dialed_domain},presence_id=${dialed_user}@${dialed_domain}}${sofia_contact(${dialed_user}@${dialed_domain})}" end if (row.group_name == nil) or (row.group_name == "") then callgroup = "default" else callgroup = row.group_name end user_xml = string.format( [[ ]], row.user_id, row.password, dial_string, row.msisdn, row.effective_caller_id_name, callgroup, row.prefix) end -- -- SQL callback function to generate a gateway entry function gateway_cb(row) -- We don't register gateways, but Sofia will alias any listed domains to the requesting profile gateway_xml = gateway_xml .. string.format( [[ ]], row.domain_name) .. "\n" end -- SQL callback function to generate a group entry function group_cb(row) user_cb(row) group_xml = group_xml .. user_xml .. "\n" end xml_stub = [[
%s
]] local dsn = "smepbx" local dbh = freeswitch.Dbh(dsn, "smepbx", "smeswitch") if not dbh:connected() then freeswitch.consoleLog("crit", "directory.lua cannot connect to database " .. dsn .. "\n") return end local query local user = params:getHeader("user") local domain = params:getHeader("domain") if user and domain then user_xml = "" query = string.format("SELECT dir_users.*, domain_name, prefix, group_name FROM dir_users " .. "INNER JOIN dir_domains ON (domain_id=dir_domains.id) " .. "LEFT JOIN dir_groups ON (callgroup_id=dir_groups.id) " .. "WHERE user_id = '%s' AND domain_name ='%s'", user, domain) assert(dbh:query(query, user_cb)) local tmp = string.format([[%s]], domain, user_xml) XML_STRING = string.format(xml_stub, tmp) else local event_name = params:getHeader("Event-Name") local purpose = params:getHeader("purpose") local action = params:getHeader("action") if event_name == "REQUEST_PARAMS" then if purpose == "gateways" then -- triggered by "sofia profile rescan" query = "SELECT domain_name FROM dir_domains ORDER BY domain_name" gateway_xml = "" assert(dbh:query(query, gateway_cb)) XML_STRING = string.format(xml_stub, gateway_xml) elseif action == "group_call" then local domain = params:getHeader("domain") local group = params:getHeader("group") group_xml = string.format([[]], domain, group) query = string.format("SELECT dir_users.*, domain_name, prefix FROM dir_users " .. "INNER JOIN dir_group_members ON (dir_users.id=dir_group_members.user_id) " .. "INNER JOIN dir_groups ON (dir_group_members.group_id=dir_groups.id) " .. "INNER JOIN dir_domains ON (dir_groups.domain_id=dir_domains.id) " .. "WHERE domain_name='%s' AND group_name='%s'", domain, group) assert(dbh:query(query, group_cb)) group_xml = group_xml .. "" XML_STRING = string.format(xml_stub, group_xml) else -- dump request freeswitch.consoleLog("info", "directory.lua - (unhandled request) - params:\n" .. params:serialize() .. "\n") end else -- dump request freeswitch.consoleLog("info", "directory.lua - (unhandled request) - params:\n" .. params:serialize() .. "\n") end end -- Comment the following line for production: --if XML_STRING then freeswitch.consoleLog("debug", "directory.lua - generated XML:\n" .. XML_STRING .. "\n") end