Asterisk function 'SHELL'
Обзор
Выполняет команду используя системную оболочку и возвращает результат.
Описание
Получаем вывод после выполнения указанной команды (в отличии от Asterisk app: System, которая вернет только true/false
Например: Set(foo=${SHELL(echo bar)})
Команда, вызываемая этой функцией, будет выполняться системной оболочкой, обычно указанной в переменной среды SHELL.
Существует множество различных системных оболочек, с разными поведением, поэтому результат, генерируемый этой функцией, может различаться между платформами. Если 'live_dangerously' в //'asterisk.conf'// установлен в 'no', эта функция может быть выполнена только из диалплана, а не из API.
синтаксис
SHELL(command)
Аргументы
command - Выполняемая команда.
Пример #1
[in] exten => _1XX,1,Set(_OP1=${EXTEN}) exten => _1XX,n,set(_TST=${CALLERID(num)} 1 ${EXTEN}) exten => _1XX,n,Goto(s,1) exten => s,1,Set(name=${SHELL(php /var/www/html/shmitrix/callerid.php ${TST})}) exten => s,n,Set(CALLERID(name)=${name}) exten => s,n,Set(CALLFILENAME=/mnt/share/${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}-${CALLERID(num)}.wav) exten => s,n,MixMonitor(${CALLFILENAME}) exten => s,n,Goto(from-internal,${OP1},1)
Пример #2 AntiDDOS
[from-test] exten => s,1,NoOp(Incoming: caller number: ${CALLERID(num)}) exten => s,n,Set(resp=${SHELL(php /var/lib/asterisk/agi-bin/antiddos.php ${CALLERID(num)})}); exten => s,n,Gosubif($[${resp}==stop]?${EXTEN},${MATH(${PRIORITY}+1),int}:${EXTEN},${MATH(${PRIORITY}+2),int}); exten => s,n,Hangup() exten => s,n,Set(CHANNEL(musicclass)=Amstrong) exten => s,n,Goto(from-internal,1000,1)
Пример #3
Intraservice API + Asterisk + cURL
Получим информацию при помощи curl запроса и используем ее в диалплане.
Запросы будем делать к API системы учета заявок IntraService
бизнес логика:
Абонент вводит номер заявки, Asterisk получает номер исполнителя по номеру заявки и соединяет с ним клиента.
Легенда:
- Получим значение поля «Мобильный телефон», в примере: «88001234567»
- Запрос: curl -H "Authorization: Basic <BASE64>=" https://<YOURNAME>.intraservice.ru/api/task/"${task}"?include=User | json_pp | grep -e "\"MobilePhone\" : \".*\","
- Пояснения по телу запроса:
- <BASE64> - закодированная в BASE 64 пара: «login:password»
- <YOURNAME> - имя площадки
- ${task} - переменная с номером заявки.
- конструкция grep -e "\"MobilePhone\" : \".*\"," - выбирает нужное нам поле из json.* ниже рассмотрим вариант покрасивее
- получим что-то такое: "MobilePhone" : "88001234567",
- ${phone} - переменная с полученным номером
- в примере отправлена напрямую в транк, или же, например: goto(from-internal,${phone},1)
exten => _X.,1,noop(test) same => n,read(task,beep,,,4,15) ; получаем от абонента номер заявки same => n,set(output=${SHELL(curl -H "Authorization: Basic <BASE64>=" https://<YOURNAME>.intraservice.ru/api/task/"${task}"?include=User | json_pp| grep -e "\"MobilePhone\" : \".*\",")} ) ; отправляем зарос same => n,set(phone=${POP(output,: )}) ; препарируем данные, удаляем ключ и освобождаем от кавычек. same => n,set(phone=${SHIFT(phone)}) same => n,set(foo1=${POP(phone,",)}) same => n,set(foo2=${SHIFT(phone,",)}) same => n,dial(SIP/${phone}@sip_trunk,,r) ;используем полученные данные для вызова
Парсинг JSON из командной строки
Утилита jq позволит разобрать JSON при запросе и упростит диалплан.
curl -H "Authorization: Basic <BASE64>" https://TEST.intraservice.ru/api/task/149?include=User | jq '.'
А теперь только нужные данные - '.Users[1].MobilePhone':
curl -H "Authorization: Basic <BASE64>" https://TEST.intraservice.ru/api/task/149?include=User | jq -r '.Users[1].MobilePhone' | tr -d '\n' 88001234567
Диалплан
На этот раз запросим значение поля «Phone»:
exten => _X.,1,noop(test) same => n,read(task,beep,,,4,15) same => n,set(phone=${SHELL(curl -H "Authorization: Basic <BASE64>" https://TEST.intraservice.ru/api/task/"${task}"?include=User | jq -r '.Users[1].Phone' | tr -d '\n')} ) same => n,goto(from-internal,${phone},1)