Перейти к содержимому

Переписывание CLI и CLD внешним скриптом

Этот перевод выполнен автоматически и ещё не вычитан. Читать английскую версию

Правила трансляции охватывают префиксы, длину и форматы. Когда для решения нужны данные извне звонка, таблица соответствий, время суток или база данных, коммутатор может передать номера вашему собственному скрипту. В этом руководстве вы установите небольшой входящий скрипт, который убирает + в начале CLI и отклоняет звонки на номера 1900 с кодом 403. Заложите около 20 минут.

  • У вас есть root-доступ к shell коммутатора, и вы знаете номер среды: столбец Env # (номер среды) в System Management → Environments. В примерах используется среда 1.
  • Rules & Lists (правила и списки) в среде не используется. Этот модуль устанавливает собственный скрипт по тому же пути; см. предупреждение в шаге 3.
  • Вы знаете, где скрипт выполняется в прохождении звонка. Это шаг 5 в разделе Трансляция номеров: после правил трансляции правила аутентификации, правила после аутентификации и аккаунта, перед тарификацией и маршрутизацией.

Коммутатор запускает скрипт один раз и держит его запущенным. Для каждого звонка он записывает в стандартный ввод скрипта строки NAME=value, а после них пустую строку:

I_ACCOUNT=123
ORIG_CLI=+442079460123
ORIG_CLD=0012125550123
CLI=+442079460123
CLD=12125550123
CALLER_NAME=Reception
P_ASSERTED_ID=
REMOTE_PARTY_ID=
REMOTE_IP=203.0.113.10
DIVERSION=
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 Параметры заголовков идентификации и переадресации

Результат: вы знаете, что получает скрипт и что он должен вернуть.

Подойдёт любой язык, если программа читает стандартный ввод построчно, никогда не завершается и сбрасывает буфер вывода после каждого ответа. Вместе с коммутатором поставляется минимальный пример на shell: /home/ssp/scripts/external_translator.sample. Эта версия добавляет два правила из руководства:

external_translator
#!/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=""
;;
esac
done
  1. Сохраните скрипт на коммутаторе, например как /root/external_translator.

  2. Проверьте его из shell, прежде чем им начнёт пользоваться коммутатор:

    Окно терминала
    printf 'CLI=+442079460123\nCLD=19005550123\n\n' | sh /root/external_translator

    Вывод: FAIL=yes, RESULT=403, CLI=442079460123, CLD=19005550123 и пустая строка.

Результат: скрипт правильно отвечает в shell.

Коммутатор ищет файл /var/env<N>/scripts/external_translator, где <N> — номер среды.

  1. Скопируйте скрипт на место:

    Окно терминала
    cp /root/external_translator /var/env1/scripts/external_translator
  2. Сделайте его исполняемым для всех; коммутатор игнорирует файл без всех трёх битов исполнения:

    Окно терминала
    chmod 755 /var/env1/scripts/external_translator
  3. Подождите одну минуту. Коммутатор проверяет файл каждую минуту, запускает скрипт, когда файл появляется, и перезапускает его, когда файл меняется. Каждый процесс обработки звонков запускает до пяти его копий.

Результат: новые звонки среды проходят через скрипт.

  1. Сделайте тестовый звонок с аккаунта на номер 1900. Звонящий получает 403.
  2. Откройте Tools & Debugs (инструменты и отладка) → SIP Logs Viewer (просмотрщик SIP-логов), найдите звонок и проверьте, что коммутатор ответил 403 Invalid Destination Number.
  3. Сделайте звонок с 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.