condition字符串匹配问题

news/2024/11/19 16:22:17/文章来源:https://www.cnblogs.com/qiuzhendezhen/p/18347549

 

 

概述

freeswitch是一款简单好用的VOIP开源软交换平台。

fs使用dialplan配置文件执行业务流程,condition条件变量的配置是必然会使用的,这里记录一次配置过程中的错误示范。

环境

CentOS 7.9

freeswitch 1.10.7

问题描述

dialplan配置如下,本意是根据通道变量${poolType}的值,执行不同的app。

<context name="saxb_bind_axb">
<extension name="saxb_bind_axb" continue="true">
<condition field="${call_result}" expression="0" break="never">
<condition field="${poolType}" expression="APP" break="never">
<action application="saxb_bind_axb" />
<action application="transfer" data="${destination_number} XML saxb_bridge"/>
</condition>

<condition field="${poolType}" expression="SIP" break="never">
<action application="transfer" data="${destination_number} XML saxb_bridge"/>
</condition>

<condition field="${poolType}" expression="AX" break="never">
<action application="saxb_bind_ax" />
<action application="transfer" data="${destination_number} XML saxb_bridge"/>
</condition>

<condition field="${poolType}" expression="AXB" break="never">
<action application="saxb_bind_axb" />
<action application="transfer" data="${destination_number} XML saxb_bridge"/>
</condition>

<anti-action application="transfer" data="${destination_number} XML saxb_get_ax2"/>
</condition>
</extension>
</context>

问题现象

呼叫发起后的日志如下,其中通道变量${poolType}的值为AXB,但是在AX和AXB的分支都匹配成功并PASS了,业务流程执行了错误的分支。

2024-07-29 16:10:48.492821 [INFO] mod_dialplan_xml.c:637 Processing 10011 <10011>->13987654321 in context saxb_bind_axb

Dialplan: sofia/external/10011@10.55.55.138 parsing [saxb_bind_axb->saxb_bind_axb] continue=true

Dialplan: sofia/external/10011@10.55.55.138 Regex (PASS) [saxb_bind_axb] ${call_result}(0) =~ /0/ break=never

|--- Dialplan: Processing recursive conditions level:1 [saxb_bind_axb_recur_1] require-nested=TRUE

|--- Dialplan: sofia/external/10011@10.55.55.138 Regex (FAIL) [saxb_bind_axb_recur_1] ${poolType}(AXB) =~ /APP/ break=never

|--- Dialplan: sofia/external/10011@10.55.55.138 Regex (FAIL) [saxb_bind_axb_recur_1] ${poolType}(AXB) =~ /SIP/ break=never

|--- Dialplan: sofia/external/10011@10.55.55.138 Regex (PASS) [saxb_bind_axb_recur_1] ${poolType}(AXB) =~ /AX/ break=never

|--- Dialplan: sofia/external/10011@10.55.55.138 Action saxb_bind_ax()

|--- Dialplan: sofia/external/10011@10.55.55.138 Action transfer(${destination_number} XML saxb_bridge)

|--- Dialplan: sofia/external/10011@10.55.55.138 Regex (PASS) [saxb_bind_axb_recur_1] ${poolType}(AXB) =~ /AXB/ break=never

|--- Dialplan: sofia/external/10011@10.55.55.138 Action saxb_bind_axb()

|--- Dialplan: sofia/external/10011@10.55.55.138 Action transfer(${destination_number} XML saxb_bridge)

 

问题分析

<condition field="${poolType}" expression="AX" break="never">

默认的模式匹配不是精确匹配,所以也可以匹配通过。

解决方案

修改配置如下,修改"AX"字符串为"^AX$"。

<condition field="${poolType}" expression="^AX$" break="never">

测试结果如下。

|--- Dialplan: sofia/external/10011@10.55.55.138 Regex (FAIL) [saxb_bind_axb_recur_1] ${poolType}(AXB) =~ /^AX$/ break=never

condition匹配规则

在 FreeSWITCH 的拨号计划(dialplan)中,condition 是一个非常强大的特性,它允许你基于特定的条件来匹配和执行不同的命令。condition 可以匹配各种类型的字符串,包括但不限于用户输入、呼叫变量、环境变量等。

 

以下是一些常见的 condition 匹配规则。

精确匹配:

使用等号 == 进行精确匹配。如果左侧的表达式与右侧的字符串完全相同,则条件为真。

<condition field="destination_number" expression="^13712345678$">

 

正则表达式匹配:

使用 =~ 进行正则表达式匹配。FreeSWITCH 支持 Perl 兼容的正则表达式。

<condition field="destination_number" expression="^137[1-9]\d{7}$">

 

分组:

使用|匹配多个值。

<condition field="destination_number" expression="^13712345678|13799999999$">

 

多条件组合。

<conditionregex="all|any|xor">
<regexfield="some_field"expression="Some Value"/>
<regexfield="another_field"expression="^Another Value$"/>
<action(s)...>
<anti-action(s)...>
</condition>

 

asterisk模式。该模式没有xml模式灵活,应该是为了兼容老版本的过度模式。

<condition field="destination_number" expression="_13712345678">

总结

fs的dialplan配置很方便,但是也容易出错。

 

空空如常

求真得真

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/779347.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Harmony Next】七夕前学会创建开屏动画拿下女同事的芳心

【Harmony Next】七夕前学会创建开屏动画拿下女同事的芳心 一个优秀的项目需要一个*格够高的动画来开启,下面教你用三步快速实现鸿蒙应用的开屏动画1.创建窗口 使用windowStage.createSubWindow("splash_window")创建窗口对窗口进行管理,实现加载开屏动画在UIAbili…

获取客户端真实IP

出于安全考虑,近期在处理一个记录用户真实IP的需求。本来以为很简单,后来发现没有本来以为的简单。这里主要备忘下,如果服务器处于端口回流(hairpin NAT),keepalived,nginx之后,如何取得客户端的外网IP。  来自客户端PC的流量路径如上,在这样的拓扑中,在应用服务中取…

获取客户端真实IP备忘

出于安全考虑,近期在处理一个记录用户真实IP的需求。本来以为很简单,后来发现没有本来以为的简单。这里主要备忘下,如果服务器处于端口回流(hairpin NAT),keepalived,nginx之后,如何取得客户端的外网IP。  来自客户端PC的流量路径如上,在这样的拓扑中,在应用服务中取…

[OI] 欢夏!邪龙?马拉车!

标题来自原神 算法概述 Maracher 算法 用途:寻找回文串,最板子的情况下用于字符串的回文子串计数给定一个字符串 \(S\),求出它全部的回文子串容易想到一种暴力的 \(n^{2}\) 做法,即枚举全部中心点,开双指针向两边扩展,每扩展一次就提供 \(1\) 的贡献. 事实上,对于这样的…

一行命令搞定内网穿透

一行命令搞定内网穿透 一款开源免费的内网穿透工具:localtunnel ,基于 nodejs 实现,无需修改 DNS 和防火墙设置,方便快捷的将内网服务暴露到外网,为开发人员、测试人员以及需要分享本地项目的人提供实时的公网访问方式,以便于测试和共享!功能特性一行命令启动,无需复杂…

中电信翼康济世数据中台基于Apache SeaTunnel构建数据集成平台经验分享

Apache SeaTunnel作为一个高效、灵活的数据集成平台,在数据中台战略中扮演着重要角色。通过本文的介绍,读者可以了解如何基于SeaTunnel快速搭建数据集成平台,并在实际应用中灵活运用。未来,随着技术的不断发展,SeaTunnel将继续在数据集成领域发挥重要作用,助力企业实现数…

数据集可以自己找开源

数据集可以自己找开源,比如GitHub上面的等等。 比如这个:https://github.com/bstabler/TransportationNetworks/tree/master其他相关项目 TRB网络建模委员会 InverseVIsTraffic是一个开源存储库,它实现了一些针对单类和多类交通网络提出的逆变分不等式 (VI) 公式。该软件包还…

js实战小项目随笔

获取事件源 var img = document.getElementById("imgs"); setAttribute为事件源赋值 img.setAttribute("src", "./image/" + index + ".jpg"); 图片切换

泛微OA移动端在公网IP变更和无法打开Install.do界面下修改插件库地址(122,128报错)

事情起因 因为公司搬迁,公网IP变更,服务器搬迁时未提前调整好泛微oa服务器的IP,但是旧地址仍留有主路由可以使用。 发现问题移动端无法正常连接,/install.do的界面也无法打开,无法进入修改插件库服务器IP的页面 联系了技术,技术表示/install.do无法打开的话也无能为力(因…

[Paper Reading] DEFORMABLE DETR: DEFORMABLE TRANSFORMERS FOR END-TO-END OBJECT DETECTION

DEFORMABLE DETR: DEFORMABLE TRANSFORMERS FOR END-TO-END OBJECT DETECTION link 时间:2021(ICLR) 机构:Sensetime & USTC & CUHK TL;DR 参考2D Deformable Conv,通过在Reference Point附近增加sample points,将DETR的收敛速度提升10倍,对于小目标效果也更好。 …

js学习

变量通过prompt收集输入信息声明变量特殊情况八股文字符类型可以随时变换js中数字前补0为八进制,补0x为十六进制方法:isNaN(),如果是数字返回false,反之返回true字符串转义符字符串与别的类型拼接,拼接后为字符串字符串内设置变量布尔值数据类型,true参与运算时作为1,…

QStyledItemDelegate 和QTreeView实现鼠标hover消息

1.QTreeView设置属性mousetracking和tablettracing 重写QStyledItemDelegate类,重写函数 bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index); 这个函数里可以处理鼠标hover和点击事件;bo…