web-dev-qa-db-ja.com

アスタリスク:「ast_yyerror」での通話のドロップ

アスタリスクが発信者へのグリーティングを再生し、電話を鳴らす代わりに通話を切断するという断続的な問題が発生しています。

ここにあるどの電話でも問題を再現できず、多くの発信者が問題なく通じます。ただし、一部の発信者は問題に遭遇し、そのパターンを見つけることができません。

私が見つけた少しの情報は、それがダイヤルプラン式を評価する際のエラーによって引き起こされたと言っていました。私はそれがこの行だと思っています:

 exten => START、n、GotoIf($ [$ {FORCE_CLOSED} = TRUE]?CLOSED、1)

しかし、何が問題なのかわかりません。

コンソールに次のエラーが表示されます。

 [4月4日16:29:49]警告[27038]:ast_expr2.fl:459 ast_yyerror:ast_yyerror():構文エラー:構文エラー、予期しない '='、$ endが必要です;入力:= TRUE ^ 

周囲のコンソール出力:

-[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'(language 'en')
 [Apr 4 16:29:49]警告[27038]: ast_expr2.fl:459 ast_yyerror:ast_yyerror():構文エラー:構文エラー、予期しない '='、$ endが必要です;入力:
 = TRUE 
 ^ 
 [4月4日16 :29:49]警告[27038]:ast_expr2.fl:463 ast_yyerror:質問がある場合は、アスタリスクソースのdoc/tex /channelvariables.texを参照してください。
-[START @ AGInbound: 3] GotoIf( "IAX2/AtlantaTeliax-10086"、 "?CLOSED、1")in new stack 
-Executing [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")を新しいスタック
 [で実行しています。 ____。]

ダイヤルプランの関連する回線:

 exten => START、1、Answer()
 exten => START、n、Background(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)
;上書きなし...完全に閉鎖されます。
 exten => START、n、Goto(CLOSED、1)

表現の何が問題になっているのでしょうか?最近、1.4から1.6にアップグレードしました。

7
Nick

アスタリスク$[]式では、未定義の変数は暗黙的な空の文字列またはゼロを返しません。これらは、式の評価前は「何もない」として展開されるため、変数が(何もない状態で)展開された後は、式パーサーからは見えません。これにより、PabloAlsinaがすでに指摘しているエラーが発生します。

GotoIf("IAX2/AtlantaTeliax-10086", "?CLOSED,1")

これを回避する方法は2つあります。

  1. (Pabloが提案したように)変数を使用する前に、常に適切なデフォルトを設定してください。
  2. $[]式では、変数とリテラルを二重引用符で囲みます。これにより、未定義の変数が空の文字列として処理され、比較の目的で引き続き使用できます。

個人的には、両方をやろうとしています。例えば:

exten => START,n,Set(FORCE_CLOSED=FALSE)
exten => START,n,GotoIf($["${FORCE_CLOSED}"="TRUE"]?CLOSED,1)

${FORCE_CLOSED}と比較値を囲む二重引用符に注意してください。変数が未定義の場合でも、式には""(空の文字列)があり、"TRUE"と比較されます。

実際には、変数の展開に追加されるだけなので、好きな文字を使用できます。変数が未定義の場合に存在することが保証されているリテラル値を提供するだけです。コードが他のプログラミング言語に似ているので、引用符が好きです。 BourneShellスクリプトで一般的に見られる$[x${FORCE_CLOSED}=xTRUE]のようなものを同じように簡単に使用できます。最終結果は同じです。

2

$ {FORCE_CLOSED}を定義するのは誰ですか?

私が見たところ、その変数は時々初期値を取得しないようで、評価するとパーサーが発生してエラーが発生します

GotoIf("IAX2/AtlantaTeliax-10086", "?CLOSED,1")

エラーを発生させる呼び出しがFORCE_CLOSEDに対して妥当な値を持っていることを確認してください

0
Pablo Alsina

これが私があなたに言うことができることです。

yyerrorは、yaccによって生成されたパーサーからのエラーです。

エラーは=を訴えます。したがって、その行では、=は文法がサポートしていない構造であるように見えます。

この質問が向かっているserverfault.comで頑張ってください...

0
bmargulies