首页 > 其他分享 >condition字符串匹配问题

condition字符串匹配问题

时间:2024-08-07 17:49:56浏览次数:13  
标签:匹配 bind sofia 10.55 saxb 字符串 10011 Dialplan 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/[email protected] parsing [saxb_bind_axb->saxb_bind_axb] continue=true

Dialplan: sofia/external/[email protected] 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/[email protected] Regex (FAIL) [saxb_bind_axb_recur_1] ${poolType}(AXB) =~ /APP/ break=never

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

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

|--- Dialplan: sofia/external/[email protected] Action saxb_bind_ax()

|--- Dialplan: sofia/external/[email protected] Action transfer(${destination_number} XML saxb_bridge)

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

|--- Dialplan: sofia/external/[email protected] Action saxb_bind_axb()

|--- Dialplan: sofia/external/[email protected] 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/[email protected] 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配置很方便,但是也容易出错。

 

空空如常

求真得真

 

标签:匹配,bind,sofia,10.55,saxb,字符串,10011,Dialplan,condition
From: https://www.cnblogs.com/qiuzhendezhen/p/18347549

相关文章

  • 上海泗博技术分享:kepware如何读取西门子PLC的中文字符串?
    随着信息化水平的不断提升,实际生产运行过程中,各类PLC不可避免地需要应对字符信息的应用场景,这种需求日益凸显,对于提高生产效率和数据管理的精准性至关重要。考虑到国内环境的需求,中文字符串的支持也成为项目改造和应用的重要环节。一些报警信息和事件如果可以通过中文字符串的形式......
  • 以 \n 作为字节读取字节字符串
    我有一个字节字符串,我想将其读入python中。该字符串是从numpyfloat64到字节的浮点转换。问题是我的一些数据在转换时最终将换行符'\n'字符作为字节。如何阻止python继续运行当遇到“\n”字符时很疯狂这是我的数据value:np.float64=np.float64(0.054765......
  • [MRCTF2020]套娃 php字符串解析绕过,jsfuck编码
    进来看到代码<!--//1st$query=$_SERVER['QUERY_STRING'];if(substr_count($query,'_')!==0||substr_count($query,'%5f')!=0){die('Y0uareSocutE!');}if($_GET['b_u_p_t']!=='23333'......
  • Java实现字符串中字符出现次数统计
    在编程过程中,我们经常需要对字符串进行处理。今天,我将为大家分享一个Java示例,用于统计字符串中每个字符出现的次数。让我们一起来看看吧!在日常生活中,我们经常会遇到需要统计字符串中字符出现次数的场景。例如,统计一篇文章中各个字母的出现次数,以便进行词频分析。本文将带大家......
  • pb函数库之字符串操作函数
    Fill()功能建立一个由指定字符串填充的指定长度的字符串。语法Fill(chars,n)参数chars:string类型,指定用于重复填充的字符串n:long类型,指定由该函数返回的字符串的长度返回值String。函数执行成功时返回n个字符的字符串,该字符串以参数chars中的字符串重复填充而成。如果参数c......
  • [Java的写法]之MD5对字符串签名操作
    对字符串签名后,1:长字符串变为32位字符:aacfbe08d042fddd8ee778b148efc9232:只要长字符串内容不变,签名后得到的32位字符不变。适合用来做ID等。privateStringgenKeyId(StringkeyStr){returnMd5Utils.getStringMD5(keyStr);}Md5Utils类如下:`importjava.io.File;impor......
  • 8 Python字符串与二进制文本相互转换
     欢迎来到@一夜看尽长安花博客,您的点赞和收藏是我持续发文的动力对于文章中出现的任何错误请大家批评指出,一定及时修改。有任何想要讨论的问题可联系我:[email protected]。发布文章的风格因专栏而异,均自成体系,不足之处请大家指正。   专栏:java全栈C&C++PythonAIP......
  • 我在将列表更改为字符串时遇到错误
    我想将列表更改为字符串,如下所示,但出现以下错误TypeError:sequenceitem0:expectedstrinstance,listfound下面是我的代码和输入src=pd.read_excel(r"C:\Temp\CopyofTARAKXCODES.xlsx",dtype=object,sheet_name="Sheet1")src1=src.values.tolist()store......
  • Python科研武器库 - 字符串操作 - 字符串开头结尾判断 startswith() endswith()
    使用场景:按照开头的前缀、结尾的后缀来判断、筛选目标字符串。使用函数:str.startswith(search_string,start,end)str.endswith(search_string,start,end)search_string:要匹配的目标字符串。start:要从中匹配search_string的str的起始索引。end:要考虑匹配的str的结......
  • C++学习笔记----Strings与String View(4)-- 字符串操作
        今天讲点简单易懂的,字符串操作,当然了,不是全部,列出几个典型的字符串操作,完整地可以参考相关资料,网上一搜一把哦。substr(pos,len):返回特定位置pos,特定长度的子字符串。find(str):返回字符串的位置,如未找到则返回string::npos。replace(pos,len,str):用新的字符串str......