Asterisk 13.22.0 - функция SHELL() - не пропускает несколько переменных Asterisk
Я прекратил попытки использовать system() для вызова скриптов BASH с параметрами из Asterisk 13.
Оказалось, под Asterisk 13.22.0 System() работает, но только если вы НЕ пытаетесь передать какие-либо параметры вызываемому скрипту.
Это работает и надежно вызывает скрипт:
same=>n,System(/bin/bash /usr/src/bash/setData.sh)
Однако, момент, когда вы делаете это:
same=>n,System(/bin/bash /usr/src/bash/setData.sh ${CHANNEL(accountcode)})
ты получаешь
WARNING[30982][C-00000238] app_system.c: Unable to execute '/usr/src`/bash/setData.sh'`
Поэтому я попытался использовать SHELL(), чтобы сделать то, что я пытался сделать с SYSTEM().
Это также не работает, так как SHELL(), по-видимому, может анализировать только ОДИН параметр звездочки в отправленной ему строке. Все остальные отправляются как пустые.
Если я сделаю это:
same=>n,Set(nothing=${SHELL(/usr/src/verdi/bash/verdiLogIncomingCall.sh NA 201807270838t49hgzs SIP/centra-out-00006d9a IN SIP/3027-00006db1 SIP/3027-00006db1 ApiLogIncomingCall.java 1)})
Скрипт видит при выполнении диалплана:
[root@acasterisk bash]# cat passed_param.txt
http://127.0.0.1/api/logIncomingCall?account_reference=NA&call_reference=201807270838t49hgzs&originating_channel_id=SIP/centra-out-00006d9a&direction=IN&requested_endpoint=SIP/3027-00006db1&caller_id=SIP/3027-00006db1&sourced_from=ApiLogIncomingCall.java&successfully_sent_to_server=1
[root@acasterisk bash]#
Например присутствуют все параметры - потому что никакие переменные ссылки не должны быть проанализированы.
Если я использую это:
[macro-verdianswer]
exten=>s,1,NoOp(Entering Verdi answer macro - picked up by ${CHANNEL})
same=>n,NoOp(Source Channel: ${sourceChannel})
same=>n,NoOp(Answering Channel: ${CHANNEL})
same=>n,NoOp(Lodging CDR accountcode: ${curIncAccCode} as an incoming call from ${numbersource} with VerDi and answered by ${CHANNEL}...)
same=>n,Set(CHANNEL(accountcode)=${curIncAccCode})
same=>n,Set(nothing=${SHELL(/usr/src/verdi/bash/verdiLogIncomingCall.sh NA ${curIncAccCode} ${sourceChannel} IN ${CHANNEL} ${numbersource} ApiLogIncomingCall.java 1)})
same=>n,MacroExit()
давая это на exection:
-- SIP/3002-000070c2 answered SIP/centra-out-000070bf
-- Executing [s@macro-verdianswer:1] NoOp("SIP/3002-000070c2", "Entering Verdi answer macro - picked up by SIP/3002-000070c2") in new stack
-- Executing [s@macro-verdianswer:2] NoOp("SIP/3002-000070c2", "Source Channel: SIP/centra-out-000070bf") in new stack
-- Executing [s@macro-verdianswer:3] NoOp("SIP/3002-000070c2", "Answering Channel: SIP/3002-000070c2") in new stack
-- Executing [s@macro-verdianswer:4] NoOp("SIP/3002-000070c2", "Lodging CDR accountcode: 2018072709061hrriyu
-- as an incoming call from xxxxxxxxxx with VerDi and answered by SIP/3002-000070c2...") in new stack
-- Executing [s@macro-verdianswer:7] Set("SIP/3002-000070c2", "nothing=Incoming call NOT stored. Contact software support.
-- ") in new stack
Например, мои переменные заполнены, и если я их не использую, они имеют значения.
В этой ситуации скрипт, вызываемый через SHELL(), видит:
[root@acasterisk bash]# cat passed_param.txt http://127.0.0.1/api/logIncomingCall?account_reference=NA&call_reference=2018072709061hrriyu&originating_channel_id=&direction=&requested_endpoint=&caller_id=&sourced_from=&successfully_sent_to_server=
Например SHELL(), очевидно, только когда-либо анализирует переменную FIRST Asterisk, переданную в него как строку, и никогда не анализирует последующие ссылки на переменные.
Кто-нибудь может подтвердить или предложить решение?
Мне отчаянно нужно иметь возможность выполнять внешние BASH-скрипты и как-то передавать им несколько параметров. Ничто, которое работало в 1.8 для этого, не работает в 13...
Спасибо!
Стефан
1 ответ
Вот мой связанный вопрос, который имеет точно такую же причину и был решен точно таким же образом
Хорошо, это решено.
Оказалось, что проблема заключалась в том, что одна из переменных, которые я передавал в функцию набора номеров Asterisk 13.22.0 SHELL(), содержала символ перевода строки (\n или hex 0x0a).
Это также случилось с ПЕРВОЙ переменной, которую я передавал в вызов SHELL().
Таким образом, оказалось, что SHELL анализировал только один параметр - это было - но ПРИЧИНОЙ, что он не анализировал следующие параметры и не оценивал их для данных канала Asterisk, было наличие этого трейлинга \ n в первой канальной переменной Asterisk 13.22.0 I переходил в ОБОЛОЧКУ ().
Решение проблемы было простым, я просто удалил завершающий символ \ n из первой переменной канала Asterisk, переданной в SHELL () в Asterisk 13.22.0, и SHELL () начал работать, как и ожидалось.
Таким образом, существенное различие между Asterisk 1.8 и Asterisk 10 / 11 / 12 / 13 для приложений SYSTEM() и SHELL (), по-видимому, состоит в том, что если какие-либо ссылки на параметры оцениваются в строке параметров, передаваемой в SYSTEM() и SHELL (), при разборе и оценка указанных строк параметров SYSTEM() или SHELL () останавливается в точке, где встречается символ перевода строки.
Поэтому все, что мне нужно было сделать, - в моем скрипте, генерирующем UUID, который я передавал в качестве первого параметра - который нарушал SYSTEM() и SHELL() - должен был опустить завершающий \n.
Мой скрипт отправил данные из BASH следующим образом:
echo $uuid
Все, что мне нужно было сделать, это изменить эту строку на
echo -n $uuid
в сценарии BASH генератора UUID.
Как только это было сделано, приложение и план набора номера Asterisk 13.22.0 SYSTEM() и SHELL () начали работать и работать так же, как и в Asterisk 1.8.32.3, где код изначально разрабатывался.
Поэтому, работая с Asterisk 13 и более поздними версиями, имейте в виду любые переводы строки - особенно в проанализированных и оцененных ссылках на переменные канала - подразумеваемые в строке параметров, отправляемой в SYSTEM() или SHELL() - очевидно, они прекращают анализировать и оценивать переменные в тот момент, когда они встретить \ n или символ перевода строки.
Насколько я могу судить, это НЕ относится к версиям Asterisk версии 1.8.32.3 и ниже.
Надеюсь, это кому-нибудь поможет.