condition字符串匹配问题

news2024/9/25 21:19:07

概述

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.coloradmin.cn/o/1989003.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何做到项目真实性优化?保姆级写简历指南第五弹!

大家好&#xff0c;我是程序员鱼皮。做知识分享这些年来&#xff0c;我看过太多简历、也帮忙修改过很多的简历&#xff0c;发现很多同学是完全不会写简历的、会犯很多常见的问题&#xff0c;不能把自己的优势充分展示出来&#xff0c;导致措施了很多面试机会&#xff0c;实在是…

pdf拆分需要怎么做?6个软件帮助你快速拆分pdf文件

pdf拆分需要怎么做&#xff1f;6个软件帮助你快速拆分pdf文件 拆分PDF文件可以让你更方便地处理和管理文档内容&#xff0c;无论是提取特定页面还是将文件分成更小的部分。以下是六款帮助你快速拆分PDF文件的软件&#xff0c;每款软件都有其独特的功能和优势&#xff0c;供你选…

4章4节:临床数据科学中如何用R来进行缺失值的处理

在临床科研中,由于失访、无应答或记录不清等各种原因,经常会遇到数据缺失的问题。本文将深入探讨医学科研中数据缺失的成因、分类、影响以及应对方法,结合R语言的实际应用,为医学研究人员提供全面的解决方案。 一、认识缺失数据 其实,很多医学的纵向研究因获取数据资料时…

铜山金杏·打响区域公用品牌,助力乡村振兴新征程

为进一步提升徐州市铜山区农业产业发展的重要战略布局&#xff0c;从而更好地助力乡村振兴&#xff0c;徐州市铜山区农业农村局借助“铜山金杏地理标志农产品保护工程项目”联合山东百仕达地标产业有限公司打造铜山农特产品区域公用品牌——“铜山金杏”&#xff0c;充分挖掘铜…

大搜罗2024年数据恢复软件TOP3,互联网人士的年度推荐!

不管是咱们普通人&#xff0c;还是大大小小的公司&#xff0c;都怕数据一去不复返。好在科技给力&#xff0c;现在数据恢复软件越来越牛&#xff0c;帮我们解决了这块心病。今儿个&#xff0c;就给大家聊聊几款2024年超火的数据恢复软件&#xff0c;如转转大师数据恢复软件等&a…

防盗、防泄露、防篡改,我们把 ZooKeeper 的这种认证模式玩明白了

作者&#xff1a;子葵 你的 ZooKeeper 安全吗&#xff1f; 在当下网络安全事件频发的背景下&#xff0c;安全防护的构建成为日常开发与运维工作中的重中之重。ZooKeeper 存储着系统敏感实例信息与配置数据&#xff0c;但传统的使用方式并未为 ZooKeeper 配备强制身份验证机制…

Ubuntu查看IP地址

Ubuntu查看IP地址 文章目录 Ubuntu查看IP地址查看IP地址的命令遇到的问题解决方案 查看IP地址的命令 1.使用ifconfig 2.使用hostname -I&#xff08;-之前一个空格&#xff09; 3.使用ip addr show 遇到的问题 1.使用ifconfig只显示一个127.0.0.1地址 2.使用hostname -I …

成功解决LabVIEW中加载 lvanlys.dll动态链接库(DLL)初始化例程失败

‍‍&#x1f3e1;博客主页&#xff1a; virobotics(仪酷智能)&#xff1a;LabVIEW深度学习、人工智能博主 &#x1f384;所属专栏&#xff1a;『奇怪问题及Bug解决』 &#x1f4d1;精选文章&#xff1a;LabVIEW人工智能深度学习指南 &#x1f37b;本文由virobotics(仪酷智能)原…

事务和索引(面试常问)

面试常问&#xff1a; 一、数据库隔离级别&#xff1f;事务隔离级别解决的问题&#xff1f; 答&#xff1a;1.数据库隔离级别&#xff1a; READ_UNCOMMITTED 读未提交 READ_COMMITTED 读提交&#xff08;不可重复读&#xff09; REPEATABLE_READ 可重复读 SERIALIZABLE 串行化…

Spring学习(三)-Bean的作用域和生命周期

Spring学习&#xff08;三&#xff09;-Bean的作用域和生命周期 –2020年06月25日 一、bean的作用域 概念&#xff1a; Spring 2.5之前的Bean 的作用域只有两种 Springleton&#xff1a;单例Bean Prototype &#xff1a; 原型Bean Spring 2.5 之后Bean的作用域有一下五种 …

C语言 Unix 时间戳 和 时间日期相互转换

Unix 时间戳&#xff08;也称为 POSIX 时间戳&#xff09;是一个表示从 1970 年 1 月 1 日 UTC 时刻开始所经过的秒数的数值。这个时间戳是与时间区域无关的&#xff0c;也就是说它在全球任何地方都表示同一个时刻。 如果你要将 Unix 时间戳转换为某个特定时区的时间&#xff…

封闭式蓝牙耳机推荐?4款更实用的开放式耳机推荐

封闭式耳机我想应该是头戴式耳机中的一种耳机类型吧&#xff0c;而开放式耳机则是一种范围比较大的耳机类型&#xff0c;这两种耳机类型确实有比较大的区别&#xff1a; 声音泄漏与隔音效果&#xff1a; 开放式耳机&#xff1a;由于其设计允许空气流通&#xff0c;因此声音会…

调用DXGI截图初始化失败,提示0xf 887a0004

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

09.FreeRTOS时间片调度与任务相关函数

文章目录 09. FreeRTOS时间片调度与任务相关函数1. FreeRTOS时间片调度2. 任务状态查询API函数3. 任务时间统计API函数 09. FreeRTOS时间片调度与任务相关函数 1. FreeRTOS时间片调度 时间片调度简介&#xff1a; 时间片调度实验流程&#xff1a; 核心代码&#xff1a; 开…

盲盒卡牌风靡市场,抽卡机小程序成为新的机遇

如今&#xff0c;在商场中都可以看到卡牌的身影&#xff0c;拆卡成为了当下年轻人休闲娱乐的新宠&#xff0c;卡牌市场逐渐升温。抽卡机小程序作为一个能够快速拆卡的新模式&#xff0c;已经逐渐成为了用户拆卡的重要渠道&#xff0c;也为卡牌市场的发展提供了重要方式。本文将…

数字化转型如何通过数据改变企业的运营流程?

不仅仅是技术层面的革新&#xff0c;更是企业运营理念、组织架构、文化氛围及市场策略的全面升级。数字化转型通过深度融合云计算、大数据、人工智能、物联网等前沿技术&#xff0c;优化企业运营流程&#xff0c;提升效率&#xff0c;增强竞争力&#xff0c;从而在快速变化的市…

RTOS(8)信号量和互斥量

1.信号量 信号量分为二值信号量和计数信号量 与队列相比&#xff1a;他不能传输数据&#xff0c;但同时他不需要传输数据&#xff0c;占用的空间也更小&#xff0c;运行更快&#xff1b; 2.互斥量 与二值信号量类似&#xff0c;是特殊的信号量&#xff0c;本身是想实现谁上锁…

【Harmony Next】在鸿蒙项目中一键添加卡片

【Harmony Next】在鸿蒙项目中一键添加卡片 1.下载鸿蒙编译器DevEco Studio的插件DevEco CodeGenie【下载链接】 在华为的编译器现在官网下面可以下载DevEco CodeGenie的压缩包&#xff0c;安装后可以使用DevEco CodeGenie进行智能问答、生成卡片、知识查询等操作 2.安装DevE…

MapStruct实体映射工具

一丶MapStruct是什么 MapStruct 是一个代码生成器,它基于配置方法的约定,极大地简化了 Java Bean 类型之间映射的实现,生成的映射代码使用普通方法调用,因此快速、类型安全且易于理解。 官方网站 MapStruct – Java bean mappings, the easy way! 二丶为什么需要MapStru…

桌管系统能否查微信聊天记录?这篇文章告诉你答案

桌面管理系统&#xff08;简称“桌管系统”&#xff09;确实可以用来监控和查看员工的微信聊天记录。以“安企神”这款桌管系统为例&#xff0c;它提供了全面的功能来帮助企业管理和监控员工的上网行为及通信记录。以下是关于安企神系统如何查看微信聊天记录的一些具体信息&…