Перейти до вмісту

Переписування CLI і CLD зовнішнім скриптом

Цей переклад зроблено автоматично і ще не вичитано. Читати англійську версію

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

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

Крок 1: Ознайомтеся з протоколом

Розділ «Крок 1: Ознайомтеся з протоколом»

Комутатор запускає скрипт один раз і тримає його запущеним. Для кожного дзвінка він записує в стандартний вхід скрипту рядки 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 Параметри заголовків ідентифікації й переадресації

Результат: ви знаєте, що отримує скрипт і що він має повернути.

Крок 2: Напишіть скрипт

Розділ «Крок 2: Напишіть скрипт»

Підійде будь-яка мова, якщо програма читає стандартний вхід рядок за рядком, ніколи не завершується й скидає буфер виводу після кожної відповіді. Разом із комутатором постачається мінімальний приклад на 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.

Крок 3: Встановіть скрипт

Розділ «Крок 3: Встановіть скрипт»

Комутатор шукає файл /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. Зачекайте одну хвилину. Комутатор перевіряє файл щохвилини, запускає скрипт, коли файл з’являється, і перезапускає його, коли файл змінюється. Кожен процес обробки дзвінків запускає до п’яти його копій.

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

Крок 4: Перевірте роботу

Розділ «Крок 4: Перевірте роботу»
  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.