--[[ * UK01 FreeSWITCH system * * Look up called number and populate session vars and possibly bridge application args * * Developed by Seventh Signal Ltd. & Co. KG, 2011 * Daniel Swarbrick ]] -- Set variable - or print to console if no session is available function setvar(key, val) if session then session:setVariable(key, val) elseif stream then stream:write(string.format("%20s : %s\n", key, val)) else -- A script executed using luarun does not have a stream print(key .. " : " .. val) end end function extn_match(row) local alt, count for key, val in pairs(row) do if key ~= "password" and key ~= "effective_caller_id_name" then setvar(key, val) -- Substitute underscores with minus symbols for poorly chosen var names alt, count = key:gsub("_", "-") if count then setvar(alt, val) end end end if row.msisdn then setvar("ignore_early_media", "true") end svc_type = "extn" setvar("svc_type", svc_type) end local dsn = "smepbx" local dbh = freeswitch.Dbh(dsn, "smepbx", "smeswitch") if not dbh:connected() then freeswitch.consoleLog("crit", "num_lookup.lua cannot connect to database " .. dsn .. "\n") return end local query local dest_num = argv[1] local domain = argv[2] svc_type = nil -- Lookup dest_num in SIP extensions for caller's domain, or in MSISDN numbers query = string.format("SELECT dir_users.*, domain_name, prefix FROM dir_users " .. "INNER JOIN dir_domains ON (domain_id=dir_domains.id) " .. "WHERE (user_id='%s' AND domain_name='%s') OR msisdn='%s'", dest_num, domain, dest_num) assert(dbh:query(query, extn_match)) if svc_type then return end -- If we don't have a svc_type yet, check in services table query = string.format("SELECT extension, application, params FROM services " .. "INNER JOIN dir_domains ON (domain_id=dir_domains.id) " .. "WHERE extension='%s' AND domain_name='%s'", dest_num, domain) assert(dbh:query(query, function(row) svc_type = "app" setvar("svc_type", svc_type) setvar("svc_extn", row.extension) setvar("svc_application", row.application) setvar("svc_params", row.params) end)) if svc_type then return end -- If we don't have a svc_type yet, check in DID table query = string.format("SELECT svc_type, svc_id FROM did WHERE did_number = '%s'", dest_num) assert(dbh:query(query, function(row) svc_type = row.svc_type svc_id = row.svc_id setvar("svc_type", svc_type) end)) if svc_type == "extn" then -- DID maps to local SIP extension (with possible MSISDN) query = string.format("SELECT dir_users.*, domain_name, prefix FROM dir_users " .. "INNER JOIN dir_domains ON (domain_id=dir_domains.id) " .. "WHERE dir_users.id = %d", svc_id) assert(dbh:query(query, extn_match)) elseif svc_type == "app" then -- DID maps to a service query = string.format("SELECT extension, application, params, domain_name FROM services " .. "INNER JOIN dir_domains ON (domain_id=dir_domains.id) " .. "WHERE services.id = %d", svc_id) assert(dbh:query(query, function(row) setvar("svc_type", svc_type) setvar("svc_extn", row.extension) setvar("svc_application", row.application) setvar("svc_params", row.params) setvar("domain_name", row.domain_name) end)) end