官方文档讲的非常清楚:
Serving Configuration with Lua | FreeSWITCH Documentation
此外,可以看向这里:
FreeSwitch Directory MySql storage with Lua Dbh
baidu能查到很多类似的资料,但是质量高没瑕疵的示例代码很难找到。
我也写了一个,如下(暂未调试):
--[[
$${base_dir}/scripts/directory.lua
lua.conf.xml配置:
<param name="xml-handler-script" value="directory.lua"/>
<param name="xml-handler-bindings" value="directory"/>
mysql创建directory表和索引:
CREATE TABLE directory (
id SERIAL PRIMARY KEY,
username VARCHAR(32) NOT NULL,
password VARCHAR(32) NOT NULL
);
CREATE UNIQUE INDEX directory_name ON directory(username);
pg创建directory表和索引:
CREATE TABLE directory (
id SERIAL PRIMARY KEY,
username VARCHAR NOT NULL,
password VARCHAR NOT NULL
);
CREATE UNIQUE INDEX directory_name ON directory(username);
参考资料:
https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Modules/mod-lua/Serving-Configuration-with-Lua_3965134/
]]
local do_debug = true -- 是否打印调试信息
local dsn = "odbc://freeswitch:USER:PASSWORD" -- 修改这里
local dbh = freeswitch.Dbh(dsn)
local api = freeswitch.API()
local default_domain = api:execute("global_getvar", "domain") -- 暂时没作用
function do_sql(query)
local rows
assert (dbh:query(query, function(u)
rows = u
end))
return rows
end
if do_debug then
freeswitch.consoleLog("INFO", params:serialize())
end
local section = XML_REQUEST["section"]
local tag_name = XML_REQUEST["tag_name"]
local key_name = XML_REQUEST["key_name"]
local key_value = XML_REQUEST["key_value"]
local user = params:getHeader("user")
local domain = params:getHeader("domain")
-- local purpose = params:getHeader("purpose")
local action = params:getHeader("action")
if section ~= "directory" then return end
if not user then return end
if dbh:connected() == false then -- 如果数据库连接失败,回滚,FreeSWITCH继续查询本地的静态XML配置
XML_STRING =
[[<document type="freeswitch/xml">
<section name="result">
<result type="not found">
</section>
</document>]]
return
end
local row = do_sql("select * from directory where username = " .. "'" .. user .. "'" .. " limit 1")
if not row then -- 没找到,返回空的xml
XML_STRING = "<xml></xml>"
return
end
XML_STRING =
[[<document type="freeswitch/xml">
<section name="directory">
<domain name="]] .. domain .. [[">
<user id="]] .. row.username .. [[">
<params>
<param name="password" value="]] .. row.password .. [["/>
<param name="dial-string" value="presence_id=${dialed_user}@${dialed_domain}}${sofia_contact(${dialed_user}@${dialed_domain})}"/>
<param name="vm-password" value="]] .. row.password .. [["/>
<param name="jsonrpc-allowed-methods" value="verto"/>
<param name="jsonrpc-allowed-event-channels" value="demo,conference"/>
</params>
<variables>
<variable name="toll_allow" value="]] .. "domestic,international,local" .. [["/>
<variable name="user_context" value="]] .. "default" .. [["/>
<variable name="effective_caller_id_name" value="]] .. row.username .. [["/>
<variable name="effective_caller_id_number" value="]] .. row.username .. [["/>
<variable name="outbound_caller_id_name" value="]] .. row.username .. [["/>
<variable name="outbound_caller_id_number" value="]] .. row.username .. [["/>
<variable name="callgroup" value="]] .. "techsupport" .. [["/>
<variable name="sip-force-contact" value="]] .. "NDLB-connectile-dysfunction" .. [["/>
</variables>
</user>
</domain>
</section>
</document>]]
if do_debug then
freeswitch.consoleLog("INFO", XML_STRING .. "\n")
end