概述
freeswitch是一款简单好用的VOIP开源软交换平台。
mod_xml_curl模块支持从web服务获取xml配置,本文介绍如何动态获取acl配置。
环境
centos:CentOS release 7.0 (Final)或以上版本
freeswitch:v1.6.20
GCC:4.8.5
web服务
mod_xml_curl模块依赖于web服务,需要自己创建一个web接口并动态的返回xml配置。
下面是python3.10实现的一个简单的web服务接口函数,从基类“BaseHTTPRequestHandler”继承并实现简单的返回逻辑。
def fsDialplan(self):
length = int(self.headers['content-length'])
datas = self.rfile.read(length)
logging.info('/fs/dialplan request, data=%s' % urllib.parse.unquote(datas))
respcode = '''<document type="freeswitch/xml">
<section name="dialplan" description="dialplan-url">
<include>
<context name="public">
<extension name="test-url" continue="false">
<condition field="${acl(${network_addr} list_out)}" expression="true"/>
<condition field="destination_number" expression="^(\d+)$">
<action application="answer"/>
<action application="playback" data="/usr/local/freeswitch/sounds/dialplan-test-url.wav"/>
</condition>
</extension>
</context>
</include>
</section>
</document>
'''
self.send_response(200)
self.send_header('Content-Type', 'application;charset=utf-8')
self.end_headers()
self.wfile.write(respcode.encode('utf-8'))
return
def fsConfigAcl(self):
length = int(self.headers['content-length'])
datas = self.rfile.read(length)
# print('fsConfigAcl request, data=', datas.decode())
logging.info('/fs/config/acl request, data=%s' % urllib.parse.unquote(datas))
respcode = '''<document type="freeswitch/xml">
<section name="configuration" description="config-acl">
<configuration name="acl.conf" description="Network Lists">
<network-lists>
<list name="list_out" default="deny">
<node type="allow" cidr="10.55.55.138/32"/>
</list>
</network-lists>
</configuration>
</section>
</document>
'''
self.send_response(200)
self.send_header('Content-Type', 'application;charset=utf-8')
self.end_headers()
self.wfile.write(respcode.encode('utf-8'))
return
web服务响应消息格式注意事项,必须有“section”段,xml格式不能使用压缩格式,否则会解析错误。
fsDialplan函数的响应中增加了acl的条件判断。
fsConfigAcl函数响应添加“list_out”的acl规则。
配置
检查conf/autoload_configs/modules.conf.xml文件,mod_xml_curl模块要放在配置的顶部。
<load module="mod_console"/>
<load module="mod_logfile"/>
<load module="mod_xml_curl"/>
修改conf/autoload_configs/xml_curl.conf.xml文件。
<configuration name="xml_curl.conf" description="cURL XML Gateway">
<bindings>
<binding name="dialplan">
<param name="gateway-url" value="http://10.55.55.137:8080/fs/dialplan" bindings="dialplan"/>
</binding>
<binding name="configuration">
<param name="gateway-url" value="http://10.9.0.27:8080/fs/config-acl" bindings="configuration"/>
</binding>
</bindings>
</configuration>
测试
configuration动态配置需要刷新生效。
freeswitch@localhost.localdomain> reloadacl
+OK acl reloaded
2023-08-04 10:37:59.117939 [NOTICE] switch_utils.c:545 Adding 10.55.55.138/32 (allow) [] to list list_out
使用10011发起呼叫,日志如下。
2023-08-04 10:38:05.277908 [INFO] mod_dialplan_xml.c:637 Processing 10011 <10011>->13712345678 in context public
Dialplan: sofia/external/10011@10.55.55.138 parsing [public->test-url] continue=false
Dialplan: sofia/external/10011@10.55.55.138 Regex (PASS) [test-url] ${acl(${network_addr} list_out)}(true) =~ /true/ break=on-false
Dialplan: sofia/external/10011@10.55.55.138 Regex (PASS) [test-url] destination_number(13712345678) =~ /^(\d+)$/ break=on-false
Dialplan: sofia/external/10011@10.55.55.138 Action answer()
Dialplan: sofia/external/10011@10.55.55.138 Action playback(/usr/local/freeswitch/sounds/dialplan-test-url.wav)
呼叫结果符合预期。
总结
mod_xml_curl模块动态获取config数据,方便对批量的fs集中统一管理配置。
未解决问题。
configuration类型的配置数据动态刷新的边界在哪里,我们可以把哪些配置数据放在web服务统一管理。
如何解决web服务不可用的本地xml配置问题,本地xml配置与web动态配置不一致的问题。
空空如常
求真得真