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

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动态配置不一致的问题。

空空如常

求真得真

相关推荐
远游客07132 小时前
centos stream 8下载安装遇到的坑
linux·服务器·centos
马甲是掉不了一点的<.<2 小时前
本地电脑使用命令行上传文件至远程服务器
linux·scp·cmd·远程文件上传
jingyu飞鸟2 小时前
centos-stream9系统安装docker
linux·docker·centos
超爱吃士力架3 小时前
邀请逻辑
java·linux·后端
cominglately5 小时前
centos单机部署seata
linux·运维·centos
魏 无羡5 小时前
linux CentOS系统上卸载docker
linux·kubernetes·centos
CircleMouse5 小时前
Centos7, 使用yum工具,出现 Could not resolve host: mirrorlist.centos.org
linux·运维·服务器·centos
木子Linux6 小时前
【Linux打怪升级记 | 问题01】安装Linux系统忘记设置时区怎么办?3个方法教你回到东八区
linux·运维·服务器·centos·云计算
mit6.8246 小时前
Ubuntu 系统下性能剖析工具: perf
linux·运维·ubuntu
鹏大师运维6 小时前
聊聊开源的虚拟化平台--PVE
linux·开源·虚拟化·虚拟机·pve·存储·nfs