extensions.conf - Dialplan

Конфигурация плана набора содержится в файле конфигурации Asterisk - extensions.conf. Это один из самых важных конфигурационных файлов. В нем определяется обработка и маршрутизация входящих и исходящих вызовов. Этот файл управляет поведением всех соединений проходящих через Вашу АТС.

Содержание файла «extensions.conf» разбито на секции, в которых могут быть или определены статические настройки и определения или выполняемые команды плана набора, в этом случае они называются контекстами. Секции, предназначенные для статических настроек, называются general и globals, а имена контекстов определяются системным администратором системы. Специальный тип контекстов – это макрос, помеченный пользовательско определенным именем с префиксом macro-. Это многократно исполняемые шаблоны, подобные процедурам в языке программирования. Каждая секция в файле extensions.conf начинается со строки с именем секции, заключенного в квадратные скобки. Это делает файл extensions.conf, по формату, похожим по на традиционные .ini файлы в системе Windows.

Разделитель, который отделяет аргументы приложения друг от друга, был заменен на запятую (','), так как, именно его нормальные люди привыкли использовать для создания плана набора - extensions.conf. Если Вы используете механизм realtime, то Вам необходимо будет изменить существующий план набора в базе, которую использует realtime, чтобы и там использовался этот разделитель. Чтобы использовать запятую, как обычный символ, а не разделитель, просто экранируйте ее обратной наклонной чертой ('\'). Другой возможный побочный эффект состоит в том, что возможно Вам понадобиться удалить излишнюю экранировку символов, которая была необходима для плена набора версий 1.4 и более ранних. Это было сделано с целью упрощения написания и понимания плана набора в будущем, но требует одноразового и достаточно болезненного перехода с одного формата на другой. Если Вы не хотите немедленно производить данные изменений, установите параметр pbx_realtime=1.4 в секцции [compat] файла asterisk.conf. После того, как изменения были произведены, установите pbx_realtime=1.6 в той же самой секции этого же файла.

[general]

  • В самом начале файла extensions.conf, задается несколько общих значений в секции [general] . Для более детальной информации смотри:

[globals]

Контексты и Екстеншены

  • После секций [general] и [globals] весь остаток файла extensions.conf посвящен определению Вашего плана набора. План набора состоит из набора контекстов. Контекст состоит из набора екстеншенов и шаблонов екстеншенов. Более подробно по этой теме смотри:

Шаблоны екстеншенов

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

Включение одного контекста в другой

Один контекст может содержать другие контексты. Например, рассмотрим следующие контексты:

Context "default":
Extension Description
101 Mark Spencer
102 Wil Meadows
0 Operator


Context "local":
Extension Description
_9NXXXXXX Local calls
include => "default"

Context "longdistance":
Extension Description
_91NXXNXXXXXX Long distance calls
include => "local"

Здесь мы определили три екстеншина:

  • Контекст default позволяет вызвать трех абонентов: Mark, Wil, и Operator.
  • Контекст local имеет один шаблон екстеншена, позволяющий набрать только 7-значные («городские» локальные) номера, а также включает в себя контекст «default», что дает возможность пользователям еще и вызывать абонентов Mark, Wil и Operator.
  • Контекст long distance имеет один шаблон екстеншена, позволяющий совершать вызовы на междугородные номера, а также включает в себя контекст «local», который позволяет набирать локальные 7-значные номера и вызывать абонентов Mark, Wil и Operator.

Используя контексты, Вы можете точно указать, кто к каким услугам имеет доступ.

Если вызываемый номер подходит для нескольких шаблонов, то в этом случае, Asterisk может использовать не тот контекст, который Вы ожидали. Для более детальной информации, смотри:

Когда Asterisk принимает входящий вызов на канале, то он просматривает контекст, который определен для обработки вызовов этого канала, на предмет того, что с этими вызовами нужно сделать. В контексте определены разные, для каждого вызываемого пользователями екстеншена, наборы команд. Например, в контексте может быть определен один набор команд, если пользователь набрал «123», и другой набор команд, если пользователь набирает «9», и совершенно другой, если он набирает любое число, начинающееся с «555».

Для некоторых видов соединений, таких как поступающие звонки с внешней телефонной линии, присутствует только сам факт вызова, а не набор какого-либо номера. В этом случае, Asterisk ведет себя так, как будто пользователь набрал специальный екстеншен с именем «s» (Start). Тогда Asterisk будет искать «номер» екстеншена с именем s в контексте того канала, через который пришел данный вызов.

Например, у нас есть канал «Zap/1», соединененный с телефонным аппаратом в Вашем здании. И предположим, что в файле конфигурации для канала Zap (zapata.conf) Вы определили context=john для канала Zap с номером 1. Итак, когда Вы снимаете телефонную трубку, чтобы набрать номер, тогда Asterisk будет искать контекст с именем «john» в плане набора extensions.conf, чтобы найти набор команд, которые надо выполнить. Вы должны каждое определение контекста в файле extensions.conf начинать с определения его имени, помещенного в квадратные скобки, например, так:

[john]

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

Екстеншены

Екстеншены могут быть двух типов: цифробуквенный или шаблонными.

Цифробуквенный екстеншен может быть числом, таким как 123, а так же может содержать стандартные символы * и #, которые есть у обычных телефонов, так что имя 12#89* является вполне правильным именем екстеншена. Некоторые телефоны имеют на клавиатуре дополнительные DTMF кнопки A, B, C и D, следовательно, имена екстеншенов могут быть определены и с этими символами. Фактически, название екстеншена может содержать любую латинскую букву или число, а так же некоторые знаки препинания. Стоит отметить, что многие VOIP телефоны в состоянии «вызвать номер екстеншена», который может быть обычной текстовой строкой, например, такой как «Office». Следовательно, вполне допустимо задать екстеншен с именем Office в плане набора Asterisk.

Являются ли имена екстеншенов регистрозависимыми? И да, и нет. Являются в том случае, когда Asterisk пытается сопоставить «номеру», набранному пользователем, екстеншен, определенный в контексте, они должны полностью совпадать, включая регистр. Итак, если пользователь в своем VOIP телефоне вызывает екстеншен «OFFICE», тогда Asterisk не будет выполнять команды, которые Вы могли бы определить для екстеншена с именем «Office». С другой стороны, имена екстеншенов регистронезависимые, в том плане, что в одном контексте нельзя определить наборы команд для екстеншенов, которые имеют одинаковые имена и отличаются только регистром. Итак, Вы не сможете в одном контексте определить один набор команд для екстеншена Office и другой для екстеншена OFFICE.

Предопределенные названия екстеншенов

(стандартные екстеншены) Asterisk использует некоторые имена екстеншенов в специальных целях:

  • i : Invalid
  • s : Start
  • h : Hangup
  • t : Timeout
  • T : AbsoluteTimeout?
  • o : Operator

Подробнее, смотри: Стандартные екстеншены в Asterisk

Определение екстеншенов

В отличие от традиционной мини АТС, где каждый екстеншен сопоставляется с каким-то конкретным телефоном, интерфейсом, с системой меню, и т.д. , в Астериске расширение (екстеншин) определяется как набор команд для исполнения. Команды выполняются в порядке, который определяется их параметром «приоритета команды», но некоторые команды, такие как Dial и GotoIf, имеют возможность изменить этот порядок выполнения команд, передав управление к команде с другим приоритетом, в зависимости от условий, которые возникают при выполнении такого класса команд.

Когда происходит вызов на определенный екстеншен, будет выполнена команда с приоритетом 1, далее выполняется команда с приоритетом 2, и так далее. Выполнение команд производится до того момента, пока не возникнет одна из следующих ситуаций:

  • Вызывающий абонент повесил трубку,
  • Команда вернула код возврата -1 (индикатор ошибки),
  • Команды со следующим приоритетом не существует (примечание: Asterisk не будет «перескакивать» через недостающие приоритеты) или
  • Вызов был переброшен на другой екстеншен.

В синтаксисе фала extensions.conf каждый исполняемый шаг для екстеншена описывается в данном формате:

exten = extension,priority,Command(parameters)

можно использовать эквивалентную форму, где после символа «=» идет символ треугольной скобки: «⇒». Данная форма определения используется во многих примерах.

Итак, у нас есть контекст с определенным именем, например, «vasja». И в каждом контексте Вы можете определить один или несколько «екстеншенов». Для каждого из этих екстеншенов Вы должны определить набор выполняемых команд. Итак, как же Вам определить эти екстеншены и наборы команд для них? Все просто, Вам нужно отредактировать файл extensions.conf любым текстовым редактором. Однако, существуют некоторые приложения, которые могут помочь Вам в этом занятии: GUI tool?.

Каждый компонент, выполняемой команды для екстеншена, или строки команды, содержит следующие части:

  • название екстеншена (extension) - это имя экстеншена, которое может быть цифробуквенной строкой (допустимо использовать цифры, буквы и некоторые специальные символы) или может быть шаблонным екстеншеном (см. ниже), который предназначен, например, для обработки сразу группы телефонных номеров. Все команды, которые предназначены для обработки заданного екстеншена, должны иметь одинаковое имя екстеншена.
  • приоритет (priority) - обычно это целое число (однако, бывает и нет, смотри примечание). Это - просто порядковый номер для каждой команды у конкретного екстеншена. Первая выполняемая команда для екстеншена имеет приоритет «1», итак, когда Asterisk переводит вызов на другой екстеншен, то он ищет команду с приоритетом 1. Если не существует команды с приоритетом 1, тогда Asterisk считает, что вызываемый номер не соответствует данному екстеншену, даже если в нем есть команды с другими приоритетами. После выполнения команды с приоритетом 1, Asterisk выполнит команду с приоритетом «2», если только выполняемая команда сама не потребует выполнить команду с другим приоритетом. Если не определена команда со следующим приоритетом для екстеншена, тогда Asterisk закончит выполнение команд для этого екстеншена, даже если существуют другие команды с более высоким приоритетом, чем пропущенный.

Замечание: Использование символов, отличных от цифр, в поле приоритета, может потребоваться в специальных ситуациях или при использовании приоритетов типа n (next) (См:Asterisk Priorities, Asterisk standard extensions).

  • command название команды (также иногда называется приложением) для выполнения. Подробнее, смотри: Список команд Asterisk
  • параметры (parameters) - зависят от конкретной команды. Некоторые команды не содержат параметров, в этом случае круглые скобки можно пропустить.

Пример

exten => 123,1,Answer
exten => 123,2,Playback(tt-weasels)
exten => 123,3,Voicemail(44)
exten => 123,4,Hangup

Это определение единственного екстеншена с именем «123». Когда приходит звонок на екстеншен 123, Asterisk сам ответит на звонок, проиграет звуковой файл с именем «tt-weasels», даст возможность оставить пользователю голосовое сообщение для голосового ящика 44, и затем повесит трубку.

Стоит отметить, что Asterisk не волнует, в каком порядке Вы размещаете команды в файле extensions.conf. Вы можете размещать команды в каком угодно порядке, как в нижеприведенном примере, и это ни как не отразится на порядке выполнения команд, т.к. Asterisk использует приоритет команд для определения порядка выполнения:

exten => 123,4,Hangup
exten => 123,1,Answer
exten => 123,3,Voicemail(44)
exten => 123,2,Playback(tt-weasels)

Другой вариант выбора екстеншена основывается на номере вызывающего абонента, «логика параноика». По этой логике мы определяем набранный екстеншен, в зависимости от того, откуда поступил вызов, основываясь на caller-ID звонящего. Например:

exten => 123/100,1,Answer()
exten => 123/100,2,Playback(tt-weasels)
exten => 123/100,3,Voicemail(123)
exten => 123/100,4,Hangup()

Эта запись соответствует екстеншену 123 и эти команды будут выполнены, ТОЛЬКО ЕСЛИ Caller-ID вызывающего абонента - 100. Аналогичную функциональность можно сделать при помощи шаблонного екстеншена, как например, в этом примере:

exten => 1234/_256NXXXXXX,1,Answer()
and so on...

Эта запись соответствует екстеншену 1234, если Caller ID у вызывающего абонента будет чем-то начинающимся с 256. Это бывает довольно полезно, если Вы хотите оградить себя от ненужных звонящих персон.

Так же можно сделать и так:

exten => s,1,Answer
exten => s/9184238080,2,SetCIDName(EVIL BASTARD)
exten => s,2,SetCIDName(Good Person)
exten => s,3,Dial(SIP/goodperson)

Сначала получаем вызов, на шаге 2 - отсеиваем ненужные персоны, все остальные проходят дальше, и в 3 возвращаем тех, что остались в основной поток.

В контекстах плана набора можно использовать только следующие директивы: exten, include, ignorepat и switch.

Переменные и выражения

В командах плана существует возможность использования переменных, используя конструкцию ${VARIABLENAME}. Так же можно использовать выражения в виде конструкции $[expression] , где EXPRESSION может быть регулярным выражением, сравнением, сложением, вычитанием и многим другим. Смотри описание переменных Asterisk для получения информации о стандартных переменных и описание Asterisk readme.variables?, где описывается использование выражений в Asterisk.

Для более детальной информации об использовании глобальных переменных и переменных для каналов в extensions.conf, см:

Перезагрузка плана набора

Если Вам необходимо перезагрузить план набора для того, чтобы сделанные в нем изменения вступили в силу, не перегружая все остальные конфиги Asterisk, используйте команду CLI Asterisk: extensions reload.

Что использовать один большой файл или несколько маленьких? С помощью директивы #include <имя файла> в файле extensions.conf, Вы можете включать другие файлы в файл конфигурации плана набора. Таким образом, Вы можете разбить Ваш план набора на несколько файлов, к примеру, где extensions.conf - содержит основную конфигурацию, а в файле users.conf - описываются местные пользователи, а файле services.conf будет содержаться описание различных сервисов, такие как конференц-связь. Используя такую или подобную разбивку, Вы сделаете Ваш план набора более удобным с точки зрения его администрирования. Директива #include <имя файла> - это не то же самое, что и директива include <context>. Директива #include может использоваться во всех файлах конфигурации Asterisk.

Перенаправление вызовов на другой Asterisk

Синтаксис:

[iaxprovider]
switch => IAX2/user:[key]@server/context

Выше мы определили отправку вызова на другой сервер. Параметры: user и key должны быть определены в файле конфигурации iax.conf вызываемого сервера. Параметр context - это название контекста в файле extensions.conf, вызываемого сервера.

Получение данных для extensions.conf из внешних источников

  • Asterisk extensions from mysql?
  • Во всех .conf файлах Вы можете использовать директиву #include, чтобы включить другой файл

Простой пример использования директивы #include в файле extensions.conf

#include «my-extra-config-file»

[globals]
ALL=Zap/1&SIP/1000&SIP/1001

[default]
exten => s,1,Answer
exten => s,2,Playback(welcome-message)
; переход на контекст, определенный во включенном файле
exten => s,3,Goto(context-in-include-file,s,1)

Примеры

Использование макросов для создания extensions

[globals]
PHONE1=Zap/1
PHONE2=SIP/6002

[macro-oneline]
exten => s,1,Dial(${ARG1},20,t)
exten => s,2,Voicemail(u${MACRO_EXTEN})
exten => s,3,Hangup
exten => s,102,Voicemail(b${MACRO_EXTEN})
exten => s,103,Hangup

[local]
exten => 6601,1,Macro(oneline,${PHONE1})
exten => 6602,1,Macro(oneline,${PHONE2})

asterisk_setup

  • asterisk/cf/extensions.conf.txt
  • Последние изменения: 2014/05/14