freeswitch用lua脚本接管分机配置

在分机注册到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


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值