# Принципы функционирования

## 1. Обработка вызова

### Достижимые абоненты

До того как гейткипер начнёт сравнение псевдонимов происходит исключение недоступных по какой либо причине абонентов. Причинами недоступности являются:

- Вызов абонента блокирован выражением 'dial'.
- Нет достаточной для соединения пропускной способности (bandwidth).
- Абонент исчерпал лимит соединений.

Все остальные абоненты считаются доступными и все остальные операции будут производиться только над ними.

### Разрешение вызываемого абонента по строке набора

Обработка строки набора ведётся в следующем порядке:

- Трансляция исходящей строки набора 'translate outgoing callee alias'.
- Сравнение строки набора с объявленными псевдонимами 'alias', 'login creates alias'.
- Трансляция совпавшего псевдонима 'translate incoming callee alias', 'alias ... translate to'.

1. Сначала строка набора попадает на исходящую трансляцию (выражение 'translate outgoing callee alias') объявленную для пользователя набирающего данную строку. Произведена будет только первая совпавшая трансляция. Функция планировалась для преобразования набранной пользователем простой строки в определенную системой, полную, более сложную форму. Результат данной трансляции может быть нулевой строкой для предотвращения дальнейшего совпадения с псевдонимами абонентов. К примеру, Вы можете запретить пользователю набирать определенные строки. Как только строка странслировалась данным выражением, гейткипер начнет просматривать других абонентов для того чтобы сравнить полученную в результате трансляций строку набора с псевдонимами абонента.

2. На этом этапе гейткипер производит сравнение строки набора с псевдонимами определёнными для абонента.

3. После того как псевдонимы успешно совпали и абонент был выбран терминирующим для данного вызова, гейткипер странслирует совпавший псевдоним используя данное правило. Функция планировалась для представления абоненту совпавшего псевдонима в другой, нужной ему форме. К примеру, в случае если абонент является шлюзом в другую телефонную сеть с другим планом набора. Результат данной трансляции не может быть нулевой строкой !

В случае если более одной строки набора присутствует в вызове, каждая из них проходит данный процесс в параллель. Т.е. гейткипер переходит к следующей процедуре только тогда когда все строки набора были обработаны текущей. И каждая строка набора должна совпасть с псевдонимом на стадии 3 чтобы перейти на следующий уровень.

### Балансировка загрузки

Возможна ситуация когда более одного абонента имеют совпадения по псевдонимам. В данном случае все эти абоненты поступают в процедуру балансировки загрузки для того чтобы определить единственного фактически терминирующего абонента. Абоненты балансируются по следующей схеме:

- Выигрывает абонент с меньшей ценой.
- Если цены равны, выигрывает абонент с большей доступной пропускной способностью.
- Если пропускная способность одна и та же для обоих абонентов, выигрывает абонент с меньшей загрузкой.
- Если загрузка на абонентах одинакова, балансировку выигрывает первый случайный.

Формула вычисления загрузки абонента

Load = CurrentConnectionCount+1/MaxConnectionCount

## 2. RADIUS

### Формат пакета

Все пакеты сформатированы в соответствии со спецификациями RFC-2865 и RFC-2866. Обратитесь к этим стандартам за информацией о базовом строении пакетов и о значении полей. Любое обнаруженное отклонение от стандартов должно быть интерпретировано как ошибка реализации. Поля общие для всех пакетов:

NAS-IP-Address

IP адрес гейткипера определённый выражением конфигурации 'system address'.

NAS-Identifier

Идентификатор гейткипера определённый выражением конфигурации 'system identifier'. Атрибут будет пропущен если значение для него не определено.

User-Name

Имя пользователя определённое выражением конфигурации 'user'.

User-Password

Пароль пользователя определённый выражением конфигурации 'user aaa password'. Атрибут будет пропущен если значение для него не определено.

#### Пакет идентификации регистрации

Код пакета - Access-Request. Атрибуты включенные в пакет:

- NAS-IP-Address
- NAS-Identifier
- User-Name
- User-Password
- Service-Type

Service-Type

Для данного типа пакета всегда установлено в "login". Используйте это поле для определения типа пакета.

#### Пакет идентификации соединения

Код пакета - Access-Request. Атрибуты включенные в пакет:

- NAS-IP-Address
- NAS-Identifier
- User-Name
- User-Password
- Service-Type
- Calling-Station-Id
- Called-Station-Id

Service-Type

Для данного типа пакета всегда установлено в "call check". Используйте это поле для определения типа пакета.

Calling-Station-Id

Псевдонимы вызывающей стороны представленные абонентом. Атрибут будет пропущен если ни одного псевдонима не определено. Может быть более одного атрибута данного типа в случае если абонент представил более одного псевдонима.

Called-Station-Id

Псевдонимы вызываемой стороны представленные абонентом. Атрибут будет пропущен если ни одного псевдонима не определено. Может быть более одного атрибута данного типа в случае если абонент представил более одного псевдонима.

#### Стартовый пакет учёта регистрации

Код пакета - Accounting-Request. Атрибуты включенные в пакет:

- NAS-IP-Address
- NAS-Identifier
- User-Name
- Service-Type
- Acct-Authentic
- Acct-Session-Id
- Acct-Status-Type

Service-Type

Для данного типа пакета всегда установлено в "login". Используйте это поле для определения типа пакета.

Acct-Authentic

Установлено в значение "RADIUS" или "Local" в зависимости от того кем был идентифицирован пользователь, RADIUS сервером или только гейткипером.

Acct-Session-Id

Уникальный идентификатор сессии для объединения старт-стоп пакетов.

Acct-Status-Type

Для данного типа пакета всегда установлено в "start".

#### Стоповый пакет учёта регистрации

Код пакета - Accounting-Request. Все атрибуты значения которых не описаны имеют то же значение что и в стартовом пакете. Атрибуты включенные в пакет:

- NAS-IP-Address
- NAS-Identifier
- User-Name
- Service-Type
- Acct-Authentic
- Acct-Session-Id
- Acct-Status-Type
- Acct-Session-Time

Acct-Status-Type

Для данного типа пакета всегда установлено в "stop".

Acct-Session-Time

Время сессии в секундах.

#### Стартовый пакет учёта соединения

Код пакета - Accounting-Request. Атрибуты включенные в пакет:

- NAS-IP-Address
- NAS-Identifier
- User-Name
- Calling-Station-Id
- Called-Station-Id
- Acct-Authentic
- Acct-Session-Id
- Acct-Status-Type

Calling-Station-Id

Псевдонимы вызывающей стороны представленные абонентом. Атрибут будет пропущен если ни одного псевдонима не определено. Может быть более одного атрибута данного типа в случае если абонент представил более одного псевдонима.

Called-Station-Id

Псевдонимы вызываемой стороны представленные абонентом. Атрибут будет пропущен если ни одного псевдонима не определено. Может быть более одного атрибута данного типа в случае если абонент представил более одного псевдонима.

Acct-Authentic

Установлено в значение "RADIUS" или "Local" в зависимости от того кем был идентифицирован пользователь, RADIUS сервером или только гейткипером.

Acct-Session-Id

Уникальный идентификатор сессии для объединения старт-стоп пакетов.

Acct-Status-Type

Для данного типа пакета всегда установлено в "start".

#### Стоповый пакет учёта соединения

Код пакета - Accounting-Request. Все атрибуты значения которых не описаны имеют то же значение что и в стартовом пакете. Атрибуты включенные в пакет:

- NAS-IP-Address
- NAS-Identifier
- User-Name
- Calling-Station-Id
- Called-Station-Id
- Acct-Authentic
- Acct-Session-Id
- Acct-Status-Type
- Acct-Session-Time
- Acct-Input-Octets
- Acct-Output-Octets

Acct-Status-Type

Для данного типа пакета всегда установлено в "stop".

Acct-Session-Time

Время сессии в секундах.

Acct-Input-Octets

Количество октет посланных во время сессии вызывающей стороной. Атрибут присутствует только если "proxy level" установлено в значение "full" для данного звонка.

Acct-Output-Octets

Количество октет посланных во время сессии вызываемой стороной. Атрибут присутствует только если "proxy level" установлено в значение "full" для данного звонка.

## 3. Основные регулярные выражения posix

Язык регулярных выражений это условная запись служащая для описания текстовых шаблонов. Обычно регулярные выражения участвуют в процедуре сравнения их со строками для того чтобы выяснить совпадает ли строка с шаблоном, или для поиска подстроки в строке.

Эта глава описывает Posix запись регулярных выражений. Это не официальное, не точное определение регулярных выражений Posix -- это интуитивное и возможно более доступное описание.

### Введение в регулярные выражения

В простейшем случае регулярное выражение это простая строка из символов которая должна совпасть однозначным образом. К примеру, шаблон:

regexp

совпадает со строкой "regexp" и никакими другими.

Некоторые символы в регулярных выражениях имеют специальное значение. Они не сравниваются посимвольно как это было в предыдущем примере, а напротив описывают более общий шаблон. Для примера, символ * используется для указания что предыдущий элемент регулярного выражения может повторяться 0, 1 или больше раз. В шаблоне:

smooo*th

* указывает что предыдущий символ o может повториться 0 или больше раз. Поэтому шаблон совпадает с:

smooth
smoooth
smooooth
smoooooth
...

Конечно же вы можете иметь потребность написать шаблон в котором специальный символ * должен совпасть символьно -- т.е. вы не хотите чтобы * указывала на допустимое повторение, но совпадала символьно. Для того чтобы реализовать это требуется выделить специальный символ обратным слешем. Шаблон:

smoo\*th

совпадает со строкой:

smoo*th

и ни с какими другими.

Другие параграфы так же описывают различные специальные символы которые могут встречаться в регулярных выражениях.

### Символьные регулярные выражения

Символьное регулярное выражение это строка не содержащая специальных символов. Символьное регулярное выражение совпадает только с точно такой же строкой, и никакой другой. К примеру:

literally

совпадает с

literally

и больше ни с чем.

Как правило, символ пробела, цифры и буквы не являются специальными символами. Некоторые символы препинания являются специальными, некоторые нет (краткая справка в конце этой главы позволяет удобно определять какие символы являются специальными а какие нет).

### Наборы символов

Этот параграф описывает специальные символы . и [.

. совпадает с любым символом исключая символ NULL. К примеру:

p.ck

совпадает с

pick
pack
puck
pbck
pcck
p.ck
...

[ открывает набор символов. Набор символов схож с . в том что он совпадает не с каким либо конкретным символом а с любым из приведённого набора. [ отличается от . тем что при помощи [ вы можете объявить совершенно определённый набор символов.

Набор символов может принимать три формы.

В первой форме набор символов выглядит следующим образом:

[<набор-символов>] -- каждый символ из набора.

Во второй форме набор символов обозначен специальным символом отрицания и выглядит:

[^<набор-символов>] -- каждый символ *не* из набора.

<набор-символов> перечисление набора символов. Оно может быть выражено строкой из индивидуальных символов:

[aeiou]

или как ряд символов:

[0-9]

Два этих формата могут быть смешаны:

[A-za-z0-9_$]

Специальные символы (такие как *) не являются специальными внутри набора символов. -, как показано выше, является специальным, за исключением, когда он находится первым в наборе.

Набор из четырех символов:

[-+*/]

Третья форма набора символов использует предопределённые классы символов:

\<класс-символов> -- каждый символ описанный данным классом.

Поддерживаемые классы символов:

\w - набор букв и цифр
\d - десятичные цифры
\l - строчные буквы
\s - whitespace characters
\u - прописные буквы
Набор класса может быть инвертирован изменением символа класса из строчного в прописной.

Наборы символов могут быть использованы в любом месте регулярного выражения, там же где используются простые символы.

### Подвыражения

Подвыражение это регулярное выражение заключённое в ( ). Подвыражение может быть использовано в любом месте регулярного выражения.

Подвыражения полезны для группировки конструкций регулярного выражения. Для примера, символ повтора, *, обычно применяется только для предыдущего символа. Вспомним:

smooo*th

совпадает с

smooth
smoooth
...

Используя подвыражение мы можем применить * к более длинной строке:

banan(an)*a

совпадает с

banana
bananana
banananana
...

Также подвыражения имеют специальное значение в ссылках и подстановках.

### Повторяющиеся подвыражения

Оператор повтора *, применяется к предыдущему символу, набору символов, подвыражению или к ссылке. * указывает что предыдущий элемент может совпасть 0 или более раз:

bana(na)*

совпадает с

bana
banana
bananana
banananana
...

+ похож на * за исключением что предыдущий элемент должен совпасть как минимум один раз. И так:

bana(na)*

совпадает с

bana

но не совпадает с

bana(na)+

Оба регулярных выражения совпадают с

banana
bananana
banananana
...

Таким образом, bana(na)+ является короткой записью для banana(na)*.

### Факультативные подвыражения

? указывает на то что предыдущий символ, набор символов или подвыражение факультативно. Оно может совпасть или быть пропущено:

CSNY?

совпадает с обоими строками

CSN
CSNY

### Количественные подвыражения

Выражение интервала, {m,n} где m и n неотрицательные целые с n >= m, применяется к предыдущему символу, набору символов, подвыражению или ссылке. И указывает на то что предыдущий элемент должен совпасть как минимум m раз но не более n раз.

К примеру:

c([ad]){1,4}r

совпадает с

car
cdr
caar
cdar
...
caaar
cdaar
...
cadddr
cddddr

### Альтернативные подвыражения

Альтернативные подвыражения имеют форму:

regexp-1|regexp-2|regexp-3|...

Выражение совпадает по любому regexp-n. Для примера:

Crosby, Stills, (and Nash|Nash, and Young)

совпадает с

Crosby, Stills, and Nash
Crosby, Stills, Nash, and Young

### Ссылки, извлечения и подстановки

Ссылка записывается в форме \n. Где n десятичное число отличное от нуля. Для того чтобы ссылка была действительной, в регулярном выражении должно быть как минимум n подвыражений заключённых в скобки.

Ссылка посимвольно совпадает с тем что совпало с соответсвующим подвыражением. Например,

(.*)-\1

совпадает

go-go
ha-ha
wakka-wakka
...

В некоторых случаях подвыражения используются для подстановки используя схему нумерации ссылок. Для примера, команда:

translate alias '90244(\d{,5})' to '90248\1'

сначала совпадает со строкой:

9024412345

подвыражение 1 совпадает с "12345". Команда заменяет совпавшую строку на "90248\1". И после подстановки получается следующее:

9024812345

### Краткая справка по синтаксису регулярных выражений

abcd -- совпадает со строкой посимвольно.

. -- совпадает с любым символом кроме символа NULL.

[a-z_?], ^[a-z_?], \d and \D -- наборы символов.

(подвыражение) -- группировка выражения в подвыражение.

Следующие специальные символы и последовательности могут быть применены к символу, набору символов, подвыражению или к ссылке:

* -- предыдущий элемент повторяется 0 или более раз.

+ -- предыдущий элемент повторяется 1 или более раз.

? -- предыдущий элемент повторяется 0 или 1 раз.

{m,n} -- предыдущий элемент повторяется как минимум m но не более n раз.

regexp-1|regexp-2|.. -- совпадает с любым из regexp-n.

Специальные символы, такие как . или * или ? или + могут быть преобразованы в простые символы добавлением перед ними \.