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

空空如常

求真得真

相关推荐
许白掰1 小时前
Linux入门篇学习——Linux 工具之 make 工具和 makefile 文件
linux·运维·服务器·前端·学习·编辑器
longze_75 小时前
Ubuntu连接不上网络问题(Network is unreachable)
linux·服务器·ubuntu
Dirschs5 小时前
【Ubuntu22.04安装ROS Noetic】
linux·ubuntu·ros
qianshanxue115 小时前
ubuntu 操作记录
linux
AmosTian8 小时前
【系统与工具】Linux——Linux简介、安装、简单使用
linux·运维·服务器
这我可不懂11 小时前
Python 项目快速部署到 Linux 服务器基础教程
linux·服务器·python
车车不吃香菇11 小时前
java idea 本地debug linux服务
java·linux·intellij-idea
tan77º11 小时前
【Linux网络编程】Socket - TCP
linux·网络·c++·tcp/ip
kfepiza12 小时前
Linux的`if test`和`if [ ]中括号`的取反语法比较 笔记250709
linux·服务器·笔记·bash
CodeWithMe12 小时前
【Note】《深入理解Linux内核》 第十九章:深入理解 Linux 进程通信机制
linux·运维·php