Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.

...

Допускается использование следующей конструкции при составлении регулярных выражений PCRE для помещения значений в локальные переменные (от 0 до 9) с помощью цифр, экранированных обратной чертой ('\1-9'). '\0' - весь текст:

Блок кода
languagec#
value-pattern '(some)-(value)'
# значения some и value заносятся в локальные переменные pcre 1 и 2 соответственно
replacement '\2-\1'
# значения переменных меняются местами

Результат замены: value-some

Данные переменные используются в рамках одной модификации. Для использования переменных в разных модификациях одной таблицы модификаций используется модификатор типа copy.

Примечание

При применении на транке/user-interface модификаторов обоих типов одновременно, используется следующий порядок их обработки, в зависимости от направления модификации:

  • IN - сначала применяется модификатор sip затем модификатор common;
  • OUT - сначала применяется модификатор common, затем sip.

mod-table common

Пример использования модификатора common.

...

Данный тип модификации позволяет изменять любые заголовки сообщений SIP.

Примечание

Процесс модификации заголовков отличается в зависимости от режима использования модификатора IN или OUT.

Существуют ограничения на модификацию основных заголовков sip к которым относятся: Call-ID, From, To, Via, CSeq, Contact, Max-Forwards, Route, Record-Route, Content-Type, Content-Lenght, Require, Supported.

После применения к сообщению модификатора IN и использования модификаций основных заголовков, дальнейшая обработка диалога sip будет осуществляться в соответствии с модифицированным сообщением, т.к. в ядро системы попадает модифицированное сообщение. В результате, в ответных сообщениях будут использоваться данные которые могут отличаться от исходного сообщения. Модификация IN также влияет на дальнейшую маршрутизацию сообщения.

Применение к сообщению модификатора OUT и  использования модификаций основных заголовков, изменяет только значения заголовков непосредственно перед отправкой, но не влияет на полследующие сообщения в диалоге, т.к. исходное сообщение формируется ядром системы до применения модификаторов OUT.

Предупреждение

Применение модификаторов к основным заголовкам SIP может привести к нарушению обработки сообщений

Предупреждение

Применение модификаторов к основным заголовкам SIP может привести к нарушению обработки сообщений. Не рекомендуется модифицировать основные заголовки.

Логика обработки сообщения SIP при использовании IN модификации.

...

  • add — добавление заголовка.
  • no-transit — удаление заголовка. Данная команда используется модификация применяется только при использовании в качестве out заголовках (таблицы in всегда вырезают все заголовки, полученные в сообщении из сети).
  • replace — замена заголовка.

  • transit — передача заголовка.  Данная команда используется модификацияприменяется только при использовании в качестве in таблицах   (таблицы out всегда передают все заголовки, полученные с другого плеча).

  • copy - позволяет скопировать значение или часть значения заголовка в переменную для использования этого значения в модификаторах add или transit в рамках одной таблицы модификаций (на одном плече вызова).

...

Модификации в рамках одной таблицы применяются последовательно ко всем заголовкам в порядке добавленном в конфигурации, т.е. первая модификация применяется ко всем заголовкам, затем вторая модификация применится ко всем заголовкам и т.д.

В результате если какой-либо заголовок был добавлен модификацией add а затем этот же заголовок был указан в правиле no-transit, то в исходящем сообщении этот заголовок не будет передан.

Пример:

Таблица модификации SIP_MOD ипользуется в качестве OUT

Блок кода
languagec#
mod-table sip SIP_MOD
  mod 1 add
    sip method pattern '.+'
    sip response-pattern '.+'
    header name Test_header
    header value Test_value
  exit
  mod 2 no-transit
    sip header-pattern 'Test_header'
    sip method pattern '.+'
    sip response-pattern '.+'
    value-pattern 'Test_value'
  exit

...

Блок кода
languagec#
vesr# 
vesr# configure 
vesr(config)# esbc 

#Создание таблицы модификаторов MODTABLE_IN:
vesr(config-esbc)# mod-table sip MODTABLE_IN
vesr(esbc-mod-table)# 

#Добавление в таблицу модификаторов правила на добавление заголовка:
vesr(esbc-mod-table)# mod 0 add
vesr(esbc-mod-table-modification)# 

#Выбор запроса, в котором будет добавлен заголовок(в данном случае INVITE):
vesr(esbc-mod-table-modification)# sip- method type Invite 

#Указать название заголовка, который необходимо вставить (в данном случае Test_header):
vesr(esbc-mod-table-modification)# header name Test_header

#Указать содержимое заголовка, которое необходимо вставить (в данном случае example string):
vesr(esbc-mod-table-modification)# header value "example string"

vesr(esbc-mod-table-modification)# exit
vesr(esbc-mod-table)# exit

#Привязать таблицу модификаторов к входящему транку TRUNK_IN:
vesr(config-esbc)# trunk sip TRUNK_IN 
vesr(config-esbc-trunk-sip)# mod-table sip in MODTABLE_IN 

#Применить и подтвердить изменения:
vesr(config-esbc-trunk-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesr(config-esbc-trunk-sip)# do confirm 
Configuration has been confirmed. Commit timer canceled.

...

Блок кода
languagec#
vesr# 
vesr# configure 
vesr(config)# esbc 

#Создание таблицы модификаторов MODTABLE_OUT:
vesr(config-esbc)# mod-table sip MODTABLE_OUT
vesr(esbc-mod-table)# 

#Добавление в таблицу модификаторов правила на удаление заголовка:
vesr(esbc-mod-table)# mod 0 no-transit
vesr(esbc-mod-table-modification)# 

#Выбор запроса, в котором будет удален заголовок (в данном случае INVITE):
vesr(esbc-mod-table-modification)# sip- method type Invite

#Указать название заголовка, который необходимо удалить (в данном случае Test_header):
vesr(esbc-mod-table-modification)# sip header-header pattern Test_header

#Указать содержимое заголовка, при совпадении с которым заголовок будет удален (в данном случае example string):
vesr(esbc-mod-table-modification)# value-pattern "example string"

vesr(esbc-mod-table-modification)# exit
vesr(esbc-mod-table)# exit

#Привязать таблицу модификаторов к исходящему транку TRUNK_OUT:
vesr(config-esbc)# trunk sip TRUNK_OUT 
vesr(config-esbc-trunk-sip)# mod-table sip out MODTABLE_OUT 

#Применить и подтвердить изменения:
vesr(config-esbc-trunk-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesr(config-esbc-trunk-sip)# do confirm 
Configuration has been confirmed. Commit timer canceled.

...

Блок кода
languagec#
vesr# 
vesr# configure 
vesr(config)# esbc 

#Создание таблицы модификаторов MODTABLE_IN:
vesr(config-esbc)# mod-table sip MODTABLE_IN
vesr(esbc-mod-table)# 

#Добавление в таблицу модификаторов правила на транзитзамену заголовка:
vesr(esbc-mod-table)# mod 01 transit
vesr(esbc-mod-table-modification)# 

replace

#Выбор запроса, в котором будетбудут транзититься заголовок (в данном случае INVITE)заменяться заголовки:
vesr(esbc-mod-table-modification)# sip method-method type Invite  

#Указать название заголовка, содержимое которыйкоторого необходимо транзитить (в данном случае Test_header)заменить:
vesr(esbc-mod-table-modification)# sip header-header pattern Test_header

#Указать место в содержимом заголовка, которое необходимо заменить (конец строки исходного содержимого заголовка):
vesr(esbc-mod-table-modification)# exitvalue-pattern $

#Добавление в таблицу модификаторов правила на замену заголовка#Добавить правило для подмены содержимого заголовка (к концу строки исходного содержимого заголовка добавляется 456):
vesr(esbc-mod-table-modification)# modreplacement 1 replace456

#Выбор запроса, в котором будут заменяться заголовки:
vesr(esbc-mod-table-modification)# sip-method type Invite

#Указать название заголовка, содержимое которого необходимо заменитьexit
vesr(esbc-mod-table)# exit

#Привязать таблицу модификаторов к входящему транку TRUNK_IN:
vesr(config-esbc-mod-table-modification)# trunk sip TRUNK_IN
vesr(config-esbc-trunk-sip)# mod-table sip-header patternin TestMODTABLE_headerIN 

#Указать#Применить местои в содержимом заголовка, которое необходимо заменить (конец строки исходного содержимого заголовка)подтвердить изменения:
vesr(config-esbc-modtrunk-table-modificationsip)# do value-patterncommit $

#Добавить правило для подмены содержимого заголовка (к концу строки исходного содержимого заголовка добавляется 456):
vesr(esbc-mod-table-modification)# replacement 456

vesr(esbc-mod-table-modification)# exit
vesr(esbc-mod-table)# exit

#Привязать таблицу модификаторов к входящему транку TRUNK_IN:
vesr(config-esbc)# trunk sip TRUNK_IN
vesr(config-esbc-trunk-sip)# mod-table sip in MODTABLE_IN 

#Применить и подтвердить изменения:
vesr(config-esbc-trunk-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesr(config-esbc-trunk-sip)# do confirm 
Configuration has been confirmed. Commit timer canceled.

Scroll Pagebreak
После внесения изменений в конфигурацию с TRUNK_IN приходит следующий INVIITE:


Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesr(config-esbc-trunk-sip)# do confirm 
Configuration has been confirmed. Commit timer canceled.


Scroll Pagebreak
После внесения изменений в конфигурацию с TRUNK_IN приходит следующий INVIITE:

Блок кода
INVITE sip:24000@192.168.114.130:5461 SIP/2.0
Via: SIP/2.0/UDP 192.168.114.129:5461;branch=z9hG4bK-375510-1-5
From: "Simple UAC send bye"  <sip:24001@192.168.114.130;cpc=priority>;tag=1375510
To: "24000" <sip:24000@192.168.114.130>
Call-ID: 1-375510@192.168.114.129
CSeq: 1 INVITE
Contact: <sip:24001@192.168.114.129:5461>
Max-Forwards: 70
#Заголовок, который необходимо протранзитить и заменить:
Test_header: 123
Content-Type: application/sdp
Content-Length:   149

v=0
o=tester 123456 654321 IN IP4 192.168.114.129
s=A conversation
c=IN IP4 192.168.114.129
t=0 0
m=audio 7624 RTP/AVP 8
a=rtpmap:8 PCMA/8000

На TRUNK_OUT отправляется уже модифицированный INVITE с измененным заголовком:

Блок кода
languagec#
Блок кода
INVITE sip:24000@192.168.114.130129:54615460 SIP/2.0
Via: SIP/2.0/UDP 192.168.114.129130:54615460;rport;branch=z9hG4bK-375510-1-5z9hG4bKPjIbcILUaVB0cQTFaGLLb7ccpnbTQIRvV3
Max-Forwards: 70
From: "Simple UAC send bye"  <sip:24001@192.168.114.130130>;cpc=priority>;tag=1375510toP8wIO79wo47ChSYy69MFOyd4vhGRNF
To: "24000" <sip:24000@192.168.114.130>
Call-ID: 1-375510@192.168.114.129
CSeq: 1 INVITE
129>
Contact: <sip:24001@192.168.114.129:5461>
Max-Forwards: 70
#Заголовок, который необходимо протранзитить и заменить130:5460;transport=udp>
Call-ID: dLsiFI4-aD2faceSTLZu.-kuHfN.pJtG
CSeq: 22556 INVITE
Allow: PRACK, SUBSCRIBE, NOTIFY, REFER, INVITE, ACK, BYE, CANCEL, UPDATE
Supported: timer, 100rel, replaces
Session-Expires: 1800
Min-SE: 90
#Измененный заголовок:
Test_header: 123123456
Content-Type: application/sdp
Content-Length:   149157

v=0
o=tester 1234563927607871 6543213927607871 IN IP4 192.168.114.129130
s=A conversation
c=IN IP4 192.168.114.129130
t=0 0
m=audio 76248090 RTP/AVP 8
a=rtpmap:8 PCMA/8000

...

Scroll Pagebreak

Пример использования локальных переменных pcre в  модификации replace (схема та же):

Блок кода
languagec#
INVITE sip:24000@192.168.114.129:5460 SIP/2.0
Via: SIP/2.0/UDP 192.168.114.130:5460;rport;branch=z9hG4bKPjIbcILUaVB0cQTFaGLLb7ccpnbTQIRvV3
Max-Forwards: 70
From: "Simple UAC send bye" <sip:24001@192.168.114.130>;tag=toP8wIO79wo47ChSYy69MFOyd4vhGRNF
To: "24000" <sip:24000@192.168.114.129>
Contact: <sip:24001@192.168.114.130:5460;transport=udp>
Call-ID: dLsiFI4-aD2faceSTLZu.-kuHfN.pJtG
CSeq: 22556 INVITE
Allow: PRACK, SUBSCRIBE, NOTIFY, REFER, INVITE, ACK, BYE, CANCEL, UPDATE
Supported: timer, 100rel, replaces
Session-Expires: 1800
Min-SE: 90
#Измененный заголовок:
Test_header: 123456
Content-Type: application/sdp
Content-Length:   157

v=0
o=tester 3927607871 3927607871 IN IP4 192.168.114.130
s=A conversation
c=IN IP4 192.168.114.130
t=0 0
m=audio 8090 RTP/AVP 8
a=rtpmap:8 PCMA/8000

Scroll Pagebreak
Есть возможность разбивать скобками шаблон value-pattern на группы (максимум 9 групп). И оперировать ими в replacement с помощью цифр, экранированных обратной чертой ('\1-9'). '\0' - весь текст. 
Пример (схема та же):

vesr# 
vesr# configure 
vesr(config)# esbc 

#Создание таблицы модификаторов MODTABLE_IN:
vesr(config-esbc)# mod-table sip MODTABLE_IN
vesr(esbc-mod-table)# 
#Добавление в таблицу модификаторов правила на замену заголовка:
vesr(esbc-mod-table)# mod 1 replace

#Выбор запроса, в котором будут заменяться заголовки:
vesr(esbc-mod-table-modification)# sip method-type Invite

#Указать название заголовка, содержимое которого необходимо заменить:
vesr(esbc-mod-table-modification)# sip header-pattern Date

#Указать место в содержимом заголовка, которое необходимо заменить (шаблон - дата в формате "год-месяц-число"):
vesr(esbc-mod-table-modification)# value-pattern "(\\d{4})-(\\d{2})-(\\d{2})"

#Добавить правило для подмены содержимого заголовка (меняем формат даты на "месяц/число/год"):
vesr(esbc-mod-table-modification)# replacement "\\2/\\3/\\1"

vesr(esbc-mod-table-modification)# exit
vesr(esbc-mod-table)# exit

#Привязать таблицу модификаторов к входящему транку TRUNK_IN:
vesr(config-esbc)# trunk sip TRUNK_IN
vesr(config-esbc-trunk-sip)# mod-table sip in MODTABLE_IN 

#Применить и подтвердить изменения:
vesr(config-esbc-trunk-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesr(config-esbc-trunk-sip)# do confirm 
Configuration has been confirmed. Commit timer canceled.

Scroll Pagebreak
После внесения изменений в конфигурацию с TRUNK_IN приходит следующий INVIITE:

Блок кода
INVITE sip:135@10.25.72.151:5060 SIP/2.0
Via: SIP/2.0/UDP 10.25.72.35:5063;rport;branch=z9hG4bK-1104631-1-0
From: <sip:134@10.25.72.151:5060;user=phone>;tag=1
To: <sip:135@10.25.72.151:5060;user=phone>
Call-ID: 1-1104631@10.25.72.35
CSeq: 1 INVITE
Max-Forwards: 70
Supported: replaces, timer
Contact: <sip:134@10.25.72.35:5063>
#Заголовок, который необходимо протранзитить и изменить
Date: 2024-09-10
Content-Type: application/sdp
Content-Length:   153

На TRUNK_OUT отправляется уже модифицированный INVITE с измененным заголовком:

Блок кода
languagec#
Via: SIP/2.0/UDP 10.25.72.151:5060;rport;branch=z9hG4bKPjc5kLf-R0rh5Stla2eTvpoVAxOc0Jr.kX
Max-Forwards: 70
From: <sip:134@10.25.72.151>;tag=lMWgbj2x66hzNDHhP8ef8tWvB2HT2DwH
To: <sip:135@192.168.23.140>
Contact: <sip:134@10.25.72.151:5060;transport=udp>
Call-ID: c09c3761560702267daaee76eb769a9c
CSeq: 5021 INVITE
Allow: PRACK, SUBSCRIBE, NOTIFY, REFER, INVITE, ACK, BYE, CANCEL, UPDATE
Supported: 100rel, replaces
#Измененный заголовок:
Date: 09/10/2024
Content-Type: application/sdp
Content-Length:   163

Пример использования модификатора копирования (copy)

Схема: 

Image AddedВ конфигурации есть два транка, настроена маршрутизация. Вызов, который приходит из TRUNK_IN уходит в TRUNK_OUT. В TRUNK_OUT отправляется запрос INVITE, в теле которого есть заголовок Diversion (предварительно следует настроить таблицу модификации на IN транка TRUNK_IN для транзита заголовка Dicersion на второе плечо). Требуется, чтобы в запросе INVITE, который отправляется в TRUNK_OUT, вырезался заголовок Diversion, а его значение из user part было добавлено в display name заголовка From.

Блок кода
languagec#
vesr# 
vesr# configure 
vesr(config)# esbc 

#Создание таблицы модификаторов MODTABLE_OUT:
vesr(config-esbc)# mod-table sip MODTABLE_OUT
vesr(esbc-mod-table)# 

#Добавление в таблицу модификаторов правила copy для копирования значения user part в переменную u01:
vesr(esbc-mod-table)# mod 0 copy
vesr(esbc-mod-table-modification)# 

#Выбор запроса, в котором будет использоваться модификатор cpoy (в данном случае INVITE):
vesr(esbc-mod-table-modification)# sip method type Invite

#Указать название заголовка, из которого необходимо копировать значение (в данном случае Diversion):
vesr(esbc-mod-table-modification)# sip header-pattern Diversion

#Указать содержимое заголовка, при совпадении с которым будет выполнено копирование в пременную. В переменную будет скопирована та часть отбора которая указана в скобках:
vesr(esbc-mod-table-modification)# value-pattern '<sip:(.+)@'

#Указать переменную в которую будет скопировано значение указанное в скобках, в примере - (.+):
vesr(esbc-mod-table-modification)# variable-str 'u01'
vesr(esbc-mod-table-modification)# exit
Блок кода
languagec#
vesr# 
vesr# configure 
vesr(config)# esbc 

#Создание таблицы модификаторов MODTABLE_IN:
vesr(config-esbc)# mod-table sip MODTABLE_IN
vesr(esbc-mod-table)# 

#Добавление в таблицу модификаторов правила наreplace для транзитзамены заголовка From:
vesr(esbc-mod-table)# mod 0 transit 1 replace

#Указать название заголовка, в котором будет осуществляться замена:
vesr(esbc-mod-table-modification)# sip header-pattern 'From'

#Выбор запроса, в котором будет использоваться транзититьсямодификатор заголовокreplace (в данном случае INVITE):
vesr(esbc-mod-table-modification)# sip- method type Invite  

#Указать названиечасть содержимого заголовка, которыйкоторую необходимо транзититьзаменить:
vesr(esbc-mod-table-modification)# sipvalue-headerpattern pattern Date

vesr(esbc-mod-table-modification)# exit

#Добавление в таблицу модификаторов правила на замену заголовка:
vesr(esbc-mod-table)# mod 1 replace

#Выбор запроса, в котором будут заменяться заголовки'.+ <sip:'

# Указать переменную u01, которая содержит значение, полученное в модификации copy:
vesr(esbc-mod-table-modification)# sip-method type Invite

#Указать название заголовка, содержимое которого необходимо заменить:replacement '\u01 <sip:$'
vesr(esbc-mod-table-modification)# sip-header pattern Dateexit

#Указать место#Добавление в содержимомтаблицу заголовка,модификаторов которое необходимо заменить (шаблон - дата в формате "год-месяц-число")правила no-transit для удаления заголовка Diversion:
vesr(esbc-mod-table-modification)# value-pattern "(\\d{4})-(\\d{2})-(\\d{2})"

#Добавить правило для подмены содержимого заголовка (меняем формат даты на "месяц/число/год"):mod 2 no-transit
vesr(esbc-mod-table-modification)# sip header-pattern 'Diversion'
vesr(esbc-mod-table-modification)# sip method replacement "\\2/\\3/\\1"

type Invite
vesr(esbc-mod-table-modification)# exit
vesr(esbc-mod-table)# exit

#Привязать таблицу модификаторов к входящемуисходящему транку TRUNK_INOUT:
vesr(config-esbc)# trunk sip TRUNK_INOUT 
vesr(config-esbc-trunk-sip)# mod-table sip inout MODTABLE_INOUT 

#Применить и подтвердить изменения:
vesr(config-esbc-trunk-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesr(config-esbc-trunk-sip)# do confirm 
Configuration has been confirmed. Commit timer canceled.

...


После внесения изменений в конфигурацию с TRUNK_IN приходит следующий INVIITE:

Блок кода
languagec#
INVITE sip:135@1024001@192.25168.7280.151129:50605080 SIP/2.0
Via: SIP/2.0/UDP 10192.25168.7280.3526:50635070;rport;branch=z9hG4bK-1104631473191-1-01
From: test <sip:134@1024001@192.25168.7280.151:5060;user=phone>26:5070>;tag=1
To: sut <sip:135@1023002@192.25168.7280.151:5060;user=phone>129:5070>
Call-ID: 1-1104631@10473191@192.25168.7280.3526
CSeqCseq: 1 INVITE
Contact: <sip:24001@192.168.80.26:5070>
Max-Forwards: 70
Supported: replaces, timer
Contact: <sip:134@10.25.72.35:5063>#Заголовок, который необходимо протранзитить и изменить
Date: 2024-09-10
Diversion: <sip:11111@test.loc>;reason=time-of-day
Subject: Performance Test
Allow: INVITE, ACK, BYE, CANCEL, UPDATE, SUBSCRIBE
Content-Type: application/sdp
Content-Length:   153118

[SDP]...

На TRUNK_OUT отправляется уже модифицированный INVITE с измененным заголовком From и без заголовка Diversion:

Блок кода
languagec#
INVITE sip:23002@192.168.80.26:5080 SIP/2.0
Via: SIP/2.0/UDP 10192.25168.7280.151129:50605080;rport;branch=z9hG4bKPjc5kLf-R0rh5Stla2eTvpoVAxOc0Jrz9hG4bKPjbURYAQZxa2m1zsT6x.kXs6RQ28ONE4EifS
Max-Forwards: 70
From: "11111" <sip:134@1024001@192.25168.7280.151>129>;tag=lMWgbj2x66hzNDHhP8ef8tWvB2HT2DwHJfl7n8XBMrh6vjCcB036Ogz6QX4BTDCo
To: "sut" <sip:135@19223002@192.168.2380.140>26>
Contact: <sip:134@1024001@192.25168.7280.151:5060;transport=udp>129:5080>
Call-ID: c09c3761560702267daaee76eb769a9cbbf5db1c228015eecddfe0d7079ce876
CSeq: 50218798 INVITE
Allow: PRACK, SUBSCRIBE, NOTIFY, REFER, INVITE, ACK, BYE, CANCEL, UPDATE
Supported: 100rel, replaces
#Измененный заголовок:
Date: 09/10/2024
Content-Type: application/sdp
Content-Length:   163119

[SDP]...

Scroll Pagebreak
Работа с логами

...