Загрузка диска: nmon, atop, iostat -x
Информация о железе (мать, проц, память и т.п.): dmidecode
Логика маршрутизации
Логика маршрутизации представляет из себя сумму маршрутов (routes), которые содержат правила обработки сообщений SIP.
Маршруты делятся на два вида:
- основные маршруты (top routes) - это маршруты, которые напрямую запускаются (вызываются) OpenSIPS при возникновении некоторых событий (таких как поступление запроса или ответа, ошибка транзакции и т.п.);
- подмарштуры (sub-routes)- маршруты, которые вызываются из других маршрутов скрипта. Подмаршруты имеют имена и должны вызываться по ним из других маршрутов или подмаршрутов. Подмаршруты могут принимать параметры или возвращать числовой код (избегайте возврата нулевого значения (0), так как это завершит работу всего скрипта). Подмаршруты похожи на процедуры или функции в любом языке программирования!
Для перехода в подмаршрут используется функция route.
route(name [, param1 [, param2 [, ...] ] ] )
Она может принимать до семи параметров, которые в дальнейшем могут быть получены обращением к псевдо переменной '$param(idx)'.
Например, route(HANDLE_SEQUENTIALS, 1, "param", $var(param));
В 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 для получения переменной из соответствующего запроса.
При получении OPTIONS Астериск ищет номер "s" в контексте default.
Поэтому простого диалпана вида
[default]
exten => s,1,Hangup
Просто чтобы не забыть.
Заголовок Path - это такой аналог Record-Route для сообщений REGISTER и ответов на них, т.е. для сообщений вне диалога. Назначение аналогичное - запись цепочки адресов прокси, через которые проходят сообщения. Синтаксис аналогичен Record-Route.
Проверка привязки делается по двум группам в таблице address модуля permissions. Сначала в одной группе ищется совпадение username из реквизитов аутентификации по сети 0.0.0.0/0 (т.е. по всем адресам), затем в другой группе ищется совпадение IP/username. Если совпадает, то запрос обрабатывается обычным образом.
На примере запроса REGISTER. Аккаунту 4521 разрешено подключаться только с IP 10.49.2.78.
Строгая (strict) и свободная (loose) маршрутизация SIP отличаются наличием или отсутствием модификации заголовка Request-URI (R-URI). Строгая маршрутизация устарела, сейчас обычно используется свободная.
При строгой маршрутизации SIP прокси обязан использовать для маршрутизации адреса из заголовка Route повторных запросов (ACK, BYE, Re-INVITE). При этом адрес в R-URI заменяется на "верхний" адрес из Route и сообщение передаётся на этот новый R-URI. Таким образом R-URI всегда содержит адрес следующего хоста (например, следующего прокси или уже самого получателя). Строгая маршрутизация подразумевает, что сообщение пройдет только по хостам, перечисленным в заголовке Route.