Asterisco: derrubando chamadas com um “ast_yyerror”

5

Estou com um problema intermitente em que o asterisco toca nossa saudação ao chamador e, em seguida, cancela a chamada em vez de fazer nossos telefones tocarem.

Não consigo reproduzir o problema com nenhum telefone que tenho aqui, e muitos chamadores acabam bem. Alguns chamadores, no entanto, se deparam com o problema, e não consigo encontrar nenhum padrão.

A informação que eu encontrei foi causada por um erro na avaliação de uma expressão de plano de discagem. Estou pensando que é essa linha:

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

Mas não tenho certeza do que há de errado com isso.

Eu vejo o seguinte erro no console:

[Apr  4 16:29:49] WARNING[27038]: ast_expr2.fl:459 ast_yyerror: ast_yyerror():  syntax error: syntax error, unexpected '=', expecting $end; Input:=TRUE^

Saída do console circundante:

-- Executing [START@AGInbound:1] Answer("IAX2/AtlantaTeliax-10086", "") in new stack
-- Executing [START@AGInbound:2] BackGround("IAX2/AtlantaTeliax-10086", 0000_AG_THANK_YOU_FOR_CALLING_AG") in new stack
--  Playing '0000_AG_THANK_YOU_FOR_CALLING_AG.slin' (language 'en')
[Apr  4 16:29:49] WARNING[27038]: ast_expr2.fl:459 ast_yyerror: ast_yyerror():  syntax error: syntax error, unexpected '=', expecting $end; Input:
=TRUE
^
[Apr  4 16:29:49] WARNING[27038]: ast_expr2.fl:463 ast_yyerror: If you have questions, please refer to doc/tex/channelvariables.tex in the asterisk source.
    -- Executing [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") in new stack
    -- Executing [START@AGInbound:5] GotoIfTime("IAX2/AtlantaTeliax-10086", "10:0-18:30|sat|*|*?OPEN,1") in new stack
    -- Executing [START@AGInbound:6] GotoIfTime("IAX2/AtlantaTeliax-10086", "12:0-17:0|sun|*|*?OPEN,1") in new stack

Linhas relevantes do plano de discagem:

exten => START,1,Answer()
exten => START,n,Background(0000_AG_THANK_YOU_FOR_CALLING_AG)

; See if we're open
; Force Closed if no one's going to be answering
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$
; ...and we're not. But maybe the time of day has been overridden?
exten => START,n,GotoIf($[${OVERRIDE_TIME_OF_DAY}=TRUE]?OPEN,1)
; No override... We're definatly closed.
exten => START,n,Goto(CLOSED,1)

Alguma ideia do que há de errado com a expressão? Recentemente, atualizamos de 1,4 para 1,6.

    
por Nick 04.04.2010 / 23:10

3 respostas

2

Em uma expressão Asterisk $[] , as variáveis indefinidas não retornam uma cadeia vazia implícita ou zero. Eles se expandem como "nada" antes da avaliação da expressão, portanto, depois que a variável é expandida (para nada), ela não é visível para o analisador de expressão. Isso faz com que o erro já observado por Pablo Alsina:

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

Existem duas maneiras de evitar isso:

  1. Sempre dê às suas variáveis padrões razoáveis antes de usá-los (como sugerido por Pablo).
  2. Em qualquer expressão $[] , coloque suas variáveis e literais com aspas duplas. Isso fará com que uma variável indefinida seja tratada como uma string vazia, que ainda pode ser usada para fins de comparação.

Pessoalmente, tento fazer as duas coisas. Por exemplo:

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

Observe as aspas duplas em torno de ${FORCE_CLOSED} e o valor de comparação. Mesmo que a variável seja indefinida, a expressão terá "" (uma string vazia) para comparar com "TRUE" .

Realmente, você pode usar qualquer caractere que quiser, porque ele será anexado à expansão da variável. Ele apenas fornece um valor literal garantido, caso a variável seja indefinida. Eu gosto de citações porque faz o código se assemelhar a outras linguagens de programação. Você poderia facilmente usar algo como $[x${FORCE_CLOSED}=xTRUE] , que é comumente visto no shell script do Bourne. O resultado final é o mesmo.

    
por 07.04.2010 / 23:08
0

Veja o que posso te dizer.

yyerror é um erro de um analisador gerado pelo yacc.

O erro reclama do =. Assim, parece que, nessa linha, o = é um constructo que a gramática não suporta.

Boa sorte no serverfault.com onde esta pergunta está indo ...

    
por 05.04.2010 / 00:09
0

Quem define $ {FORCE_CLOSED}?

Pelo que vejo, parece que essa variável às vezes não obtém um valor inicial e, em seguida, o analisador gera um erro quando você avalia

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

Verifique se as chamadas que geram um erro têm um valor razoável para FORCE_CLOSED

    
por 07.04.2010 / 21:26

Tags