Переписывание CLI и CLD внешним скриптом
Этот перевод выполнен автоматически и ещё не вычитан. Читать английскую версию
Правила трансляции охватывают префиксы, длину и форматы. Когда для решения нужны данные извне звонка, таблица соответствий, время суток или база данных, коммутатор может передать номера вашему собственному скрипту. В этом руководстве вы установите небольшой входящий скрипт, который убирает + в начале CLI и отклоняет звонки на номера 1900 с кодом 403. Заложите около 20 минут.
Перед началом
Заголовок раздела «Перед началом»- У вас есть root-доступ к shell коммутатора, и вы знаете номер среды: столбец Env # (номер среды) в System Management → Environments. В примерах используется среда
1. - Rules & Lists (правила и списки) в среде не используется. Этот модуль устанавливает собственный скрипт по тому же пути; см. предупреждение в шаге 3.
- Вы знаете, где скрипт выполняется в прохождении звонка. Это шаг 5 в разделе Трансляция номеров: после правил трансляции правила аутентификации, правила после аутентификации и аккаунта, перед тарификацией и маршрутизацией.
Шаг 1: Изучите протокол
Заголовок раздела «Шаг 1: Изучите протокол»Коммутатор запускает скрипт один раз и держит его запущенным. Для каждого звонка он записывает в стандартный ввод скрипта строки NAME=value, а после них пустую строку:
I_ACCOUNT=123ORIG_CLI=+442079460123ORIG_CLD=0012125550123CLI=+442079460123CLD=12125550123CALLER_NAME=ReceptionP_ASSERTED_ID=REMOTE_PARTY_ID=REMOTE_IP=203.0.113.10DIVERSION=DIVERSION_PARAMS=| Поле | Значение |
|---|---|
I_ACCOUNT |
ID аккаунта, на который аутентифицирован звонок |
ORIG_CLI, ORIG_CLD |
Номера в том виде, в котором они получены, до любого правила трансляции |
CLI, CLD |
Номера после правил трансляции |
CALLER_NAME |
Отображаемое имя из заголовка From |
P_ASSERTED_ID, REMOTE_PARTY_ID |
Заголовки идентификации звонящего, если они есть |
REMOTE_IP |
IP-адрес, с которого пришёл звонок |
DIVERSION, DIVERSION_PARAMS |
Номер и параметры заголовка Diversion, если он есть |
Скрипт отвечает собственными строками и пустой строкой. CLI и CLD обязательны: возвращайте их без изменений, когда скрипту нечего делать. Отсутствующий CLD означает пустой номер, и коммутатор отклоняет звонок.
| Поле | Действие |
|---|---|
CLI, CLD |
Номера, по которым коммутатор тарифицирует и маршрутизирует звонок |
CALLER_NAME |
Новое отображаемое имя |
FAIL=yes |
Отклонить звонок |
RESULT |
SIP-код для отклонённого звонка, от 400 до 699, кроме 401 и 407. Любое другое значение даёт 500 |
COST |
Сумма, которая добавляется к стоимости звонка; списывается и тогда, когда скрипт отклоняет звонок |
ADD_HEADER |
SIP-заголовок, который добавляется к исходящему INVITE, например ADD_HEADER=X-Customer: 42. Для нескольких заголовков повторите строку |
RURI_PARAMS, TO_URI_PARAMS, FROM_URI_PARAMS |
Параметры, которые добавляются к request URI и к URI заголовков To и From, например user=phone |
P_ASSERTED_ID_PARAMS, P_ASSERTED_ID_URI_PARAMS, REMOTE_PARTY_ID_PARAMS, REMOTE_PARTY_ID_URI_PARAMS, DIVERSION_PARAMS, DIVERSION_URI_PARAMS |
Параметры заголовков идентификации и переадресации |
Результат: вы знаете, что получает скрипт и что он должен вернуть.
Шаг 2: Напишите скрипт
Заголовок раздела «Шаг 2: Напишите скрипт»Подойдёт любой язык, если программа читает стандартный ввод построчно, никогда не завершается и сбрасывает буфер вывода после каждого ответа. Вместе с коммутатором поставляется минимальный пример на shell: /home/ssp/scripts/external_translator.sample. Эта версия добавляет два правила из руководства:
#!/bin/sh# Inbound external translator:# - removes a leading + from the CLI;# - rejects calls to numbers that start with 1900 with 403.while true; do read -r LINE || exit 0 case "$LINE" in CLI=*) CLI=${LINE#CLI=} ;; CLD=*) CLD=${LINE#CLD=} ;; "") CLI=${CLI#+} case "$CLD" in 1900*) echo "FAIL=yes" echo "RESULT=403" ;; esac echo "CLI=$CLI" echo "CLD=$CLD" echo CLI="" CLD="" ;; esacdone-
Сохраните скрипт на коммутаторе, например как
/root/external_translator. -
Проверьте его из shell, прежде чем им начнёт пользоваться коммутатор:
Окно терминала printf 'CLI=+442079460123\nCLD=19005550123\n\n' | sh /root/external_translatorВывод:
FAIL=yes,RESULT=403,CLI=442079460123,CLD=19005550123и пустая строка.
Результат: скрипт правильно отвечает в shell.
Шаг 3: Установите скрипт
Заголовок раздела «Шаг 3: Установите скрипт»Коммутатор ищет файл /var/env<N>/scripts/external_translator, где <N> — номер среды.
-
Скопируйте скрипт на место:
Окно терминала cp /root/external_translator /var/env1/scripts/external_translator -
Сделайте его исполняемым для всех; коммутатор игнорирует файл без всех трёх битов исполнения:
Окно терминала chmod 755 /var/env1/scripts/external_translator -
Подождите одну минуту. Коммутатор проверяет файл каждую минуту, запускает скрипт, когда файл появляется, и перезапускает его, когда файл меняется. Каждый процесс обработки звонков запускает до пяти его копий.
Результат: новые звонки среды проходят через скрипт.
Шаг 4: Проверьте работу
Заголовок раздела «Шаг 4: Проверьте работу»- Сделайте тестовый звонок с аккаунта на номер
1900. Звонящий получает403. - Откройте Tools & Debugs (инструменты и отладка) → SIP Logs Viewer (просмотрщик SIP-логов), найдите звонок и проверьте, что коммутатор ответил
403 Invalid Destination Number. - Сделайте звонок с CLI, который начинается с
+, затем откройте Reports → Call Records (CDRs) (записи о звонках) и детали звонка. Тарифицированный CLI не содержит+, а External Translator (внешний транслятор) в разделе Call Authentication (аутентификация звонка) показывает, что звонок обработал скрипт.
Чтобы отключить скрипт, удалите его или снимите бит исполнения (chmod 644). Коммутатор останавливает его в течение минуты.
Переписывание номеров для каждого вендора
Заголовок раздела «Переписывание номеров для каждого вендора»Второй скрипт, /var/env<N>/scripts/external_translator_outbound, выполняется для каждого подключения, которое пробует коммутатор, после правил трансляции подключения. Он получает I_ACCOUNT, I_VENDOR, I_CONNECTION, ORIG_CLI, ORIG_CLD, CLI1 и CLD1 (номера до правил подключения), CLI и CLD (после них) и CALLER_NAME. Он отвечает CLI, CLD и, при необходимости, CALLER_NAME и ADD_HEADER; отклонить звонок он не может. Пример на shell: /home/ssp/scripts/external_translator_outbound.sample.
Что дальше
Заголовок раздела «Что дальше»- Трансляция номеров: правила, которые выполняются до и после скрипта.
- Примеры правил трансляции: большинство переписываний не требует скрипта.
- Коды ответов SIP: код
External Translator Rejected The Callв CDR.