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)
