вторник, 11 февраля 2025 г.

Маршруты в OpenSIPS

 Логика маршрутизации

Логика маршрутизации представляет из себя сумму маршрутов (routes), которые содержат правила обработки сообщений SIP.

Маршруты делятся на два вида:

- основные маршруты (top routes) - это маршруты, которые напрямую запускаются (вызываются) OpenSIPS при возникновении некоторых событий (таких как поступление запроса или ответа, ошибка транзакции и т.п.);

- подмарштуры (sub-routes)- маршруты, которые вызываются из других маршрутов скрипта. Подмаршруты имеют имена и должны вызываться по ним из других маршрутов или подмаршрутов. Подмаршруты могут принимать параметры или возвращать числовой код (избегайте возврата нулевого значения (0), так как это завершит работу всего скрипта). Подмаршруты похожи на процедуры или функции в любом языке программирования!


Для перехода в подмаршрут используется функция route.

route(name [, param1 [, param2 [, ...] ] ] )

Она может принимать до семи параметров, которые в дальнейшем могут быть получены обращением к псевдо переменной '$param(idx)'.

Например, route(HANDLE_SEQUENTIALS, 1, "param", $var(param));

   

четверг, 6 февраля 2025 г.

Переменные в OpenSIPS

В OpenSIPS несколько типов переменных. Их отличия в том, в какой части скрипта они видны, за чем закреплены, могут ли хранить несколько значений (как массив) и являются ли перезаписываемыми.

Переменные определяются по наличию знака "$" перед их именем.

Обращение к переменной имеет следующий синтаксис (зеленые поля опциональны): $(<context>name(subname)[index]{transformation})

name - имя переменной. Например: pvar, avp, ru, DLG_status.

subname - идентификатор конкретного значения переменной данного типа (тип задаётся именем). Например: hdr(From), avp(name).

index - индекс в массиве, если переменная поддерживает хранение нескольких значений. Индекс может быть отрицательным числом, где "-1" означает последнее добавленное значение, а "-2" - предпоследнее.

transformation - некоторые преобразования, которые можно применить к переменной. Например: обрезка, преобразование типа, вычисление длины и т.п. Преобразования могут быть каскадными, в этом случае каждое последующее преобразование осуществляется над результатом предыдущего. Список преобразований тут.

context - контекст, где переменная будет востребована. Есть два контекста: reply и request. Контекст reply может быть указан в failure маршруте для получения переменной из ответа на запрос. Контекст request может быть указан в маршруте reply для получения переменной из соответствующего запроса.

пятница, 31 января 2025 г.

Астериск возвращает "404" на запрос OPTIONS

При получении OPTIONS Астериск ищет номер "s" в контексте default.

Поэтому простого диалпана вида

[default]

exten => s,1,Hangup

достаточно, чтобы Астериск возвращал "200", вместо "404".



понедельник, 27 января 2025 г.

Заголовки SIP Path

 Просто чтобы не забыть.

Заголовок Path - это такой аналог Record-Route для сообщений REGISTER и ответов на них, т.е. для сообщений вне диалога. Назначение аналогичное - запись цепочки адресов прокси, через которые проходят сообщения. Синтаксис аналогичен Record-Route.

Подробно в RFC 3327.                              

среда, 22 января 2025 г.

Реализация привязки аккаунта к IP-адресу с помощью модуля permissions в OpenSIPS

Проверка привязки делается по двум группам в таблице address модуля permissions. Сначала в одной группе ищется совпадение username из реквизитов аутентификации по сети 0.0.0.0/0 (т.е. по всем адресам), затем в другой группе ищется совпадение IP/username. Если совпадает, то запрос обрабатывается обычным образом.

На примере запроса REGISTER. Аккаунту 4521 разрешено подключаться только с IP 10.49.2.78.