BUG Or ???
Got a strange situation
[ext-queues]
… exten => h,2,ExecIf($[${CALLERID(num)} = ‘ ‘]?Set(var29=${SHELL(curl -X
POST –header “Content-Type: application/json” –header “Accept:
application/json” -d “{\”Phone\”: ${FROMEXTEN}, \”Source\”: \”asterisk\”}” ”
http://sIte.com:80/api/v1/calls?apiKey=UABVAEI&clientId=3″)}))
exten => h,3,NoOp(${var29})
exten => h,4,Macro(hangupcall,)
;–== end of [ext-queues] ==–;
so when i execute it got
— Executing [h@ext-queues:1] NoOp(“SIP/100-00000050”, “100”) in new stack
— Executing [h@ext-queues:2] ExecIf(“SIP/100-00000050”,
“0?Set(var29=[{“RequestedCount”:0,”MissedCount”:7,”Total”:7}])”)
in new stack
— Executing [h@ext-queues:3] NoOp(“SIP/100-00000050”, “”) in new stack
— Executing [h@ext-queues:4] Macro(“SIP/100-00000050”, “hangupcall,”)
in new st
U can see that Execif = 0 = falce but somehow Shell ${SHELL(curl -X POST –header “Content-Type: application/json”
–header “Accept: application/json” -d “{\”Phone\”: ${FROMEXTEN},
\”Source\”: \”asterisk\”}” ”
http://sIte.com:80/api/v1/calls?apiKey=UABVAEI&clientId=3″)}
executes and get answer from the server
[{“RequestedCount”:0,”MissedCount”:7,”Total”:7}]
i dont want it to be executed
Thanks list for your help
3 thoughts on - BUG Or ???
The Set isn’t being executed by the ExecIf. However the ${} substitution containing the SHELL is evaluated before anything else is examined. This isn’t a bug but the order of how things are evaluated. You will have to do what you want another way:
same = n,GotoIf($[“${CALLERID(num)}” = “”]?skip)
same = n,Set(var29=${SHELL(…)})
same = n(skip),NoOp(${var29})
Richard
Thanks U Richard i know about this solution but the main question why “${} substitution containing the SHELL is evaluated before anything else”
Can U describe the rules when and why it happens?
Thanks
2017-02-24 23:44 GMT+02:00 Richard Mudgett:
For the same reason why you do raising to powers before multiplications and divisions, and all those before you do additions and subtractions. It’s just a mathematical convention, agreed upon a long time ago and handed down verbatim from generation to generation ever since.
The order goes something like this (this is from memory; check docs for definitive version):
* ${} variable substitution / munging
* $[] expression evaluation
– () round brackets
– – arithmetical negation
– * / % multiply and divide
– + – add and subtract
– < = > and =~ comparison
– ! and ~ NOT
– && and & AND
– !! and | ^ OR and EOR
* ?: embedded IFELSE operator
Since ${} has a higher priority than ?: then the contents of the ${SHELL …}
expression will be evaluated *before* Asterisk decides whether to do the bit between the ? and the : or the bit after the : . (And the most deepest embedded ${FROMEXTEN} needs to be evaluated before the shell can even be spawned to deal with the command). Having performed the SHELL command and got a result for the ${}, it *then* begins dealing with the $[] expression.
${CALLERID(num)} is compared against the target. It’s found to be false
(empty string or numeric zero), therefore the Set(var29=…) does *not*
happen. But, thanks to operator precedence, Asterisk has *already* evaluated what it would have set var29 to *before* it decides not to set it.
It is generally better to use a GotoIf() to skip past a step you don’t want done, rather than embed it into an ExecIf() . This is not the 1980s anymore, and the odd well-placed GOTO is perfectly OK (and I’d reckon, actually *more*
readable than the circumlocution necessary to avoid using it).
—
AJS
Note: Originating address only accepts e-mail from list! If replying off-
list, change address to asterisk1list at earthshod dot co dot uk .
—