condition字符串匹配问题

概述
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配置很方便,但是也容易出错。
空空如常
求真得真
condition字符串匹配问题的更多相关文章
- 字符串匹配的KMP算法
~~~摘录 来源:阮一峰~~~ 字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串”BBC ABCDAB ABCDABCDABDE”,我想知道,里面是否包含另一个字符串”ABCDABD”? 许 ...
- {Reship}{KMP字符串匹配}
关于KMP字符串匹配的介绍和归纳,作者的思路非常清晰,推荐看一下 http://blog.csdn.net/v_july_v/article/details/7041827
- 字符串匹配(hash算法)
hash函数对大家来说不陌生吧 ? 而这次我们就用hash函数来实现字符串匹配. 首先我们会想一下二进制数. 对于任意一个二进制数,我们将它化为10进制的数的方法如下(以二进制数1101101为例): ...
- 【C++实现python字符串函数库】二:字符串匹配函数startswith与endswith
[C++实现python字符串函数库]字符串匹配函数startswith与endswith 这两个函数用于匹配字符串的开头或末尾,判断是否包含另一个字符串,它们返回bool值.startswith() ...
- sdut 2125串结构练习--字符串匹配【两种KMP算法】
串结构练习——字符串匹配 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目链接:http://acm.sdut.edu.cn/sduto ...
- C语言字符串匹配函数
C语言字符串匹配函数,保存有需要时可以用: #include <stdio.h> #include <stdlib.h> #include <string.h> # ...
- 字符串匹配--Karp-Rabin算法
主要特征 1.使用hash函数 2.预处理阶段时间复杂度O(m),常量空间 3.查找阶段时间复杂度O(mn) 4.期望运行时间:O(n+m) 本文地址:http://www.cnblogs.com/a ...
- 字符串匹配的KMP算法详解及C#实现
字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD" ...
- zstu.4194: 字符串匹配(kmp入门题&& 心得)
4194: 字符串匹配 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 206 Solved: 78 Description 给你两个字符串A,B,请 ...
- 字符串匹配与KMP算法实现
>>字符串匹配问题 字符串匹配问题即在匹配串中寻找模式串是否出现, 首先想到的是使用暴力破解,也就是Brute Force(BF或蛮力搜索) 算法,将匹配串和模式串左对齐,然后从左向右一个 ...
随机推荐
- 一份快速入门的 Makefile 教程
目录 一份快速入门的 Makefile 教程 关于 Makefile,你应该知道的一些事情 什么是 Makefile? Makefile 能做什么? Makefile 怎么写? Makefile 与 ...
- Java基础:throw和throws的详解
总结来说,throw是用来抛出一个具体的异常实例,而throws是用来声明方法可能会抛出哪些类型的异常,是对调用者的一种通知和要求. 1. throw 作用: throw关键字用于在方法体内实际抛出一 ...
- 你了解Vim的增删改查吗 ?
增: 在Vim的Normal模式中输入A/I/O,a/i/o字符进行对应的增加操作. 删 在Vim的Normal模式中, 输入x 删除光标对应的一个字符(4x代表删除4个字符): 输入dd删除光标所在 ...
- Mysql 使用(一)
一.数据库的种类 关系型数据库 非关系型数据库 二.常见关系型数据库 oracle:在以前的大型项目中使用,银行,电信等项目 mysql:web时代使用最广泛的关系型数据库 ms sql server ...
- 不是人家太装逼,而是我们太low
在一个社团的迎新的时候,每个人自我介绍.等到一个一身LV,爱马仕的女孩子自我介绍,说起爱好,她想了想说:喜欢跑车.然后很淡定的坐下了.很多同学你看我我看你,投以"炫富"的判断目光- ...
- ubuntu20 python3 安装 easysnmp
前言 最近在 ubuntu20 上通过 pip3 安装 easysnmp,安装失败,系统提示:net-snmp/net-snmp-config.h: No such file or directory ...
- yb课堂 VSCODE编译器和开发环境搭建 《二十五》
前端编辑器 vscode:免费开源的现代化轻量级代码编辑器,支持大部分主流的开发语言的语法高亮.智能代码补全.自定义热键.代码对比DIFF.GIT等特性,支持插件扩展,软件跨平台支持Win.Mac以及 ...
- Luogu P2036 [COCI2008-2009 #2] PERKET
今天我们来看一道题:Luogu P2036 [COCI2008-2009 #2] PERKET 这道题不难,典型的暴力枚举 由于食材数量随机,无法直接用循环解,但是可以使用递归 \(MY_{CODE: ...
- yolov5+deepsort+slowfast复现
1.运行环境 ubuntu 18.04.1 Cuda 11.5 Python 3.8.15 torch 1.10.1+cu113 torchvision 0.11.2+cu113 2.安装PyTorc ...
- 新一代云原生日志架构 - Loggie的设计与实践
Loggie萌芽于网易严选业务的实际需求,成长于严选与数帆的长期共建,持续发展于网易数帆与网易传媒.中国工商银行的紧密协作.广泛的生态,使得项目能够基于业务需求不断完善.成熟.目前已经开源:https ...