在分机注册到freeswitch时,默认使用directory/defalut/*.xml中定义的分机/密码等配置鉴权,如果想直接使用mysql表(或文件等其他数据源)中的分机配置完成鉴权,可以修改lua.conf.xml的配置用自定义lua脚本接管分机注册,鉴权。
- 修改autoload_configs/lua.conf.xml启用lua替代directory目录下的用户配置文件
<param name="xml-handler-script" value="user.lua"/>
<param name="xml-handler-bindings" value="directory"/>
避坑提醒:xml-handler-script参数必须在xml-handler-bindings前面,否则无效;
设置生效启动时输出日志
[INFO] mod_lua.cpp:327 binding '/opt/apps/freeswitch/scripts/user.lua' to 'directory'
此设置生效后,directory目录下的分机配置失效;
- 编写自定义user.lua脚本返回xml
-- 默认返回值-格式同directory/default.xml |1000.xml
-- 有此用户
local xml_ok = [[<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="freeswitch/xml">
<section name="directory">
<domain name="__Domain__">
<user id="__UserId__" cacheable="7200">
<params>
<param name="password" value="__UserPass__"/>
<param name="dial-string" value="{sip_invite_domain=${dialed_domain},presence_id=${dialed_user}@${dialed_domain}}${sofia_contact(${dialed_user}@${dialed_domain})}"/>
</params>
<variables>
<variable name="user_context" value="default"/>
<variable name="sip-force-contact" value="NDLB-connectile-dysfunction-2.0"/>
</variables>
</user>
</domain>
</section>
</document>]]
-- 无此用户
local xml_no = [[<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="freeswitch/xml">
<section name="directory">
</section>
</document>]]
-- 查找directory目录
local xml_dir = nil
local usr_id=params:getHeader("user") --1000
if usr_id then
XML_STRING=xml_no
return
end
local dbh = freeswitch.Dbh("my_odbc_dsn1","db_username","db_passwd")
if dbh:connected() == false then
freeswitch.consoleLog("error", "user.lua cannot connect to database!\n")
XML_STRING=xml_dir
return
end
XML_STRING=string.gsub(xml_ok,'__Domain__', params:getHeader("domain"))
XML_STRING=string.gsub(XML_STRING,'__UserId__', usr_id)
local sql = string.format("select usr_pass from myusers where extentionno='%s' limit 1", usr_id)
assert (dbh:query(sql, function(u) -- there will be only 0 or 1 iteration (limit 1)
XML_STRING=string.gsub(XML_STRING,'__UserPass__',u.usr_pass)
end))
user.lua是一个回调脚本,系统传入参数params,其序列化(params:serialize())字符串为
Event-Name: REQUEST_PARAMS
Core-UUID: 4dcf8f4c-5390-11ef-b229-c159e56f6d06
FreeSWITCH-Hostname: suse12
FreeSWITCH-Switchname: suse12
FreeSWITCH-IPv4: 172.29.181.71
FreeSWITCH-IPv6: %3A%3A1
Event-Date-Local: 2024-08-06%2010%3A06%3A22
Event-Date-GMT: Tue,%2006%20Aug%202024%2002%3A06%3A22%20GMT
Event-Date-Timestamp: 1722909982052105
Event-Calling-File: sofia_reg.c
Event-Calling-Function: sofia_reg_parse_auth
Event-Calling-Line-Number: 3137
Event-Sequence: 1223
action: sip_auth
sip_profile: internal
sip_user_agent: MicroSIP/3.21.3
sip_auth_username: 102001
sip_auth_realm: 192.168.20.79
sip_auth_nonce: 7a1c83c2-5398-11ef-b27b-c159e56f6d06
sip_auth_uri: sip%3A192.168.20.79%3A5060
sip_contact_user: 102001
sip_contact_host: 192.168.20.1
sip_to_user: 102001
sip_to_host: 192.168.20.79
sip_via_protocol: udp
sip_from_user: 102001
sip_from_host: 192.168.20.79
sip_call_id: c9354b1f66414caabb8d09ac7fd060c7
sip_request_host: 192.168.20.79
sip_request_port: 5060
sip_auth_qop: auth
sip_auth_cnonce: 72ccae0fc07644fbb9a727e73eb61d42
sip_auth_nc: 00000001
sip_auth_response: 13ceb98318564736e8ba6e78b13bd68d
sip_auth_method: REGISTER
client_port: 53799
key: id
user: 102001
domain: 192.168.20.79
ip: 192.168.20.1
lua 脚本优先于 xml 配置文件执行;
如果directory/default.xml中保留default组(<group name="default">)则lua返回值XML_STRING为 nil 时就去查找默认的xml配置.
- odbc设置
linux(suse12.5)下Freeswtich使用odbc驱动访问mysql;安装及配置过程如下
#安装odbc
zypper in unixODBC
odbcinst -j #查看odbc驱动
#安装mysql连接器
rpm -ivh mysql-community-common-8.0.18-1.sles12.x86_64.rpm
rpm -ivh mysql-community-libs-8.0.18-1.sles12.x86_64.rpm
rpm -ivh mysql-connector-odbc-8.0.18-1.sles12.x86_64.rpm
#配置odbc-mysql连接串
cat >~/.odbc.ini <<EOF
[my_odbc_dsn1]
Driver = /usr/lib64/libmyodbc8w.so
SERVER = 192.168.20.11
USER = root
PASSWORD = abc1233
PORT = 3306
DATABASE = db_test1
charset = UTF8
OPTION = 3
EOF
#测试odbc连接
echo 'show databases;'| isql my_odbc_dsn1 -v