我遇到了一个间歇性问题,星号会向来电者播放我们的问候语,然后挂断电话而不是让我们的电话响铃。
我在这里的任何电话都无法重现该问题,而且许多呼叫者都可以正常接通。但是,有些呼叫者遇到了问题,我找不到任何模式。
我能找到的一些信息说它是由评估拨号计划表达式的错误引起的。我想是这条线:
exten => START,n,GotoIf($[${FORCE_CLOSED}=TRUE]?CLOSED,1)
但我不确定它有什么问题。
我在控制台上看到以下错误:
[Apr 4 16:29:49] 警告 [27038]: ast_expr2.fl:459 ast_yyerror: ast_yyerror(): 语法错误:语法错误,意外的 '=',期待 $end; 输入:=真^
周围的控制台输出:
-- 在新堆栈中执行 [START@AGInbound:1] Answer("IAX2/AtlantaTeliax-10086", "") -- 在新堆栈中执行 [START@AGInbound:2] BackGround("IAX2/AtlantaTeliax-10086", 0000_AG_THANK_YOU_FOR_CALLING_AG") -- 播放“0000_AG_THANK_YOU_FOR_CALLING_AG.slin”(语言“en”) [Apr 4 16:29:49] 警告 [27038]: ast_expr2.fl:459 ast_yyerror: ast_yyerror(): 语法错误:语法错误,意外的 '=',期待 $end; 输入: =真 ^ [Apr 4 16:29:49] WARNING[27038]: ast_expr2.fl:463 ast_yyerror: 如果您有任何疑问,请参阅星号源中的 doc/tex/channelvariables.tex。 -- 在新堆栈中执行 [START@AGInbound:3] GotoIf("IAX2/AtlantaTeliax-10086", "?CLOSED,1") -- 在新堆栈中执行 [START@AGInbound:4] GotoIfTime("IAX2/AtlantaTeliax-10086", "9:30-17:0|mon-fri|*|*?OPEN,1") -- 在新堆栈中执行 [START@AGInbound:5] GotoIfTime("IAX2/AtlantaTeliax-10086", "10:0-18:30|sat|*|*?OPEN,1") -- 在新堆栈中执行 [START@AGInbound:6] GotoIfTime("IAX2/AtlantaTeliax-10086", "12:0-17:0|sun|*|*?OPEN,1")
拨号计划中的相关线路:
扩展 => 开始,1,答案() 扩展 => 开始,n,背景(0000_AG_THANK_YOU_FOR_CALLING_AG) ; 看看我们是否开放 ; 如果没有人会回答,则强制关闭 exten => START,n,GotoIf($[${FORCE_CLOSED}=TRUE]?CLOSED,1) exten => START,n,GotoIfTime(${AG_WEEKDAY_OPEN_HOUR}:${AG_WEEKDAY_OPEN_MIN}-${AG$ exten => START,n,GotoIfTime(${AG_SATURDAY_OPEN_HOUR}:${AG_SATURDAY_OPEN_MIN}-${$ exten => START,n,GotoIfTime(${AG_SUNDAY_OPEN_HOUR}:${AG_SUNDAY_OPEN_MIN}-${AG_S$ ; ......我们不是。但也许一天中的时间已被覆盖? exten => START,n,GotoIf($[${OVERRIDE_TIME_OF_DAY}=TRUE]?OPEN,1) ; 没有覆盖......我们肯定会关闭。 扩展 => 开始,n,转到(关闭,1)
知道表达式有什么问题吗?我们最近从 1.4 升级到 1.6。
在 Asterisk
$[]
表达式中,未定义的变量不返回隐式空字符串或零。它们在评估表达式之前扩展为“无”,因此在变量扩展(无)之后,表达式解析器将看不到它。这会导致 Pablo Alsina 已经指出的错误:有两种方法可以避免这种情况:
$[]
表达式中,用双引号将变量和文字括起来。这将导致未定义的变量作为空字符串处理,该字符串仍可用于比较目的。就个人而言,我尝试两者都做。例如:
注意周围的双引号
${FORCE_CLOSED}
和比较值。即使变量未定义,表达式也会有""
(一个空字符串)来比较"TRUE"
。真的,你可以使用任何你喜欢的字符,因为它只会被附加到变量扩展上。它只是为您提供一个保证在变量未定义的情况下存在的文字值。我喜欢引号,因为它使代码类似于其他编程语言。您可以轻松地使用类似 的东西
$[x${FORCE_CLOSED}=xTRUE]
,这在 Bourne shell 脚本中很常见。最终结果是一样的。这是我可以告诉你的。
yyerror 是来自 yacc 生成的解析器的错误。
该错误抱怨=。所以看起来,在那一行,= 是语法不支持的结构。
祝你在这个问题所在的 serverfault.com 上好运......
谁定义了 ${FORCE_CLOSED}?
从我所见,似乎该变量有时没有获得初始值,然后在您评估时解析器引发并出错
检查引发错误的调用是否具有合理的 FORCE_CLOSED 值