freeswitch的mod_xml_curl模块动态获取configuration

概述

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动态配置需要刷新生效。

[email protected]> 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/[email protected] parsing [public->test-url] continue=false

Dialplan: sofia/external/[email protected] Regex (PASS) [test-url] {acl({network_addr} list_out)}(true) =~ /true/ break=on-false

Dialplan: sofia/external/[email protected] Regex (PASS) [test-url] destination_number(13712345678) =~ /^(\d+)$/ break=on-false

Dialplan: sofia/external/[email protected] Action answer()

Dialplan: sofia/external/[email protected] Action playback(/usr/local/freeswitch/sounds/dialplan-test-url.wav)

呼叫结果符合预期。

总结

mod_xml_curl模块动态获取config数据,方便对批量的fs集中统一管理配置。

未解决问题。

configuration类型的配置数据动态刷新的边界在哪里,我们可以把哪些配置数据放在web服务统一管理。

如何解决web服务不可用的本地xml配置问题,本地xml配置与web动态配置不一致的问题。

空空如常

求真得真

相关推荐
藥瓿锻20 分钟前
2024 CKA题库+详尽解析| 15、备份还原Etcd
linux·运维·数据库·docker·容器·kubernetes·cka
bbsh209929 分钟前
WebFuture:Ubuntu 系统上在线安装.NET Core 8 的步骤
linux·ubuntu·.netcore·webfuture
ZZZKKKRTSAE38 分钟前
快速上手Linux全局搜索正则表达式(grep)
linux·服务器·正则表达式
waving-black2 小时前
利用frp和腾讯云服务器将内网暴露至外网(内网穿透)
linux·服务器·腾讯云·frp·内网穿透
stormsha2 小时前
Linux中su与sudo命令的区别:权限管理的关键差异解析
linux·运维·服务器·鸿蒙系统·ux·batch命令
筏.k3 小时前
grep、wc 与管道符快速上手指南
linux
Johny_Zhao3 小时前
华为MAAS、阿里云PAI、亚马逊AWS SageMaker、微软Azure ML各大模型深度分析对比
linux·人工智能·ai·信息安全·云计算·系统运维
CodeOfCC3 小时前
c语言 封装跨平台线程头文件
linux·c语言·windows
科文小白狼3 小时前
Linux下VSCode开发环境配置(LSP)
linux·vscode·里氏替换原则·lsp
jugt5 小时前
CentOS 7.9安装Nginx1.24.0时报 checking for LuaJIT 2.x ... not found
linux·运维·centos