FreeSWITCH user directory

官方文档讲的非常清楚:

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值