Конфигурационные файлы Asterisk отвечают за настройку модулей, приложений, пиров, практически, всех аспектов работы программного комплекса IP АТС Asterisk.
Asterisk:acl.conf - Access Control List - Списки контроля доступа. Используется для создания списков ip адресов или подсетей, для разрешения или запрещения SIPрегистраций.
Команда плана набора Asterisk While - Повторять цикл (loop) пока условие верно.
Описание
Петля создается между приложениями While() и EndWhile() и выполняется,
пока условие заданное в While(условие) верно.
Условие вычисляется один раз за цикл, в самом начале.
примечания:
Цикл While/EndWhile может параллельно выполнять множество наборов за раз.
Если условие неверно, выполнение диалплана продолжается после EndWhile
Еще один модификатор цикла, приложение ContunueWhile
-- Executing [4881@from-fs-pjsip:1] Goto("PJSIP/fs_pjsip-00000089", "from-test-2,4881,1") in new stack
-- Goto (from-test-2,4881,1)
-- Executing [4881@from-test-2:1] Answer("PJSIP/fs_pjsip-00000089", "") in new stack
-- Executing [4881@from-test-2:2] Set("PJSIP/fs_pjsip-00000089", "i=1") in new stack
-- Executing [4881@from-test-2:3] While("PJSIP/fs_pjsip-00000089", "1") in new stack
-- Executing [4881@from-test-2:4] SayNumber("PJSIP/fs_pjsip-00000089", "1") in new stack
-- <PJSIP/fs_pjsip-00000089> Playing 'digits/1.gsm' (language 'en')
-- Executing [4881@from-test-2:5] Set("PJSIP/fs_pjsip-00000089", "i=2") in new stack
-- Executing [4881@from-test-2:6] EndWhile("PJSIP/fs_pjsip-00000089", "") in new stack
-- Executing [4881@from-test-2:3] While("PJSIP/fs_pjsip-00000089", "1") in new stack
-- Executing [4881@from-test-2:4] SayNumber("PJSIP/fs_pjsip-00000089", "2") in new stack
-- <PJSIP/fs_pjsip-00000089> Playing 'digits/2.gsm' (language 'en')
-- Executing [4881@from-test-2:5] Set("PJSIP/fs_pjsip-00000089", "i=3") in new stack
-- Executing [4881@from-test-2:6] EndWhile("PJSIP/fs_pjsip-00000089", "") in new stack
-- Executing [4881@from-test-2:3] While("PJSIP/fs_pjsip-00000089", "1") in new stack
-- Executing [4881@from-test-2:4] SayNumber("PJSIP/fs_pjsip-00000089", "3") in new stack
-- <PJSIP/fs_pjsip-00000089> Playing 'digits/3.gsm' (language 'en')
-- Executing [4881@from-test-2:5] Set("PJSIP/fs_pjsip-00000089", "i=4") in new stack
-- Executing [4881@from-test-2:6] EndWhile("PJSIP/fs_pjsip-00000089", "") in new stack
-- Executing [4881@from-test-2:3] While("PJSIP/fs_pjsip-00000089", "1") in new stack
-- Executing [4881@from-test-2:4] SayNumber("PJSIP/fs_pjsip-00000089", "4") in new stack
-- <PJSIP/fs_pjsip-00000089> Playing 'digits/4.gsm' (language 'en')
-- Executing [4881@from-test-2:5] Set("PJSIP/fs_pjsip-00000089", "i=5") in new stack
-- Executing [4881@from-test-2:6] EndWhile("PJSIP/fs_pjsip-00000089", "") in new stack
-- Executing [4881@from-test-2:3] While("PJSIP/fs_pjsip-00000089", "0") in new stack
-- Auto fallthrough, channel 'PJSIP/fs_pjsip-00000089' status is 'UNKNOWN'
Команда диалплана Asterisk - при получении входящего генерирует специальный тональный сигнал,
который блокирует вызов системы обзвона абонентов (телемаркетинга).
Возвращает переменную ${ZAPATELLERSTATUS} с одним из следующих значений:
NOTHING
ANSWERED
ZAPPED
синтаксис
Zapateller(options)
==аргументы
options - опции разделенные запятой.
answer: Ответить на вызов, перед генерацией тонального сигнала.
nocallerid - генерировать тон, только при отсутствии callerid.
[Synopsis]
Block telemarketers with SIT (Special information tones). [Description]
Generates special information tone (SIT) to block telemarketers from calling you.
This application will set the following channel variable upon completion:${ZAPATELLERSTATUS}: This will contain the last action accomplished by the
Zapateller application. Possible values include:
NOTHING
ANSWERED
ZAPPED [Syntax]
Zapateller(options)[Arguments]
options
Comma delimited list of options.
answer: Causes the line to be answered before playing the tone.
nocallerid: Causes Zapateller to only play the tone if there is no
callerid information available. [See Also]
Not available
Команда динамически добавляет интерфейс в существующую очередь вызовов, для обработки поступающих в нее вызовов (интерфейс как бы регистрируется в очереди вызовов, так же как агент, с использованием команды AgentCallbackLogin).
Аргументы
queuename - имя очереди вызовов, в которую необходимо добавить интерфейс.
interface - Название интерфейса для добавления в очередь, если не указано, используется текущий интерфейс.
penalty - Целое число большее или равное нулю, доступные участники, обрабатывающие очередь, с меньшим значением пенальти получают вызовы в первую очередь.
options: (версии 1.2+)
j - Если заданный интерфейс уже обрабатывает поступающие вызовы данной очереди и существует команда с приоритетом n+101, тогда с нее продолжиться выполнение команд плана набора. Иначе, команда выйдет с кодом ошибки.
В версии 1.6+ нет значений для поля «options», т.к. параметр «j» был удален, но, если необходимо указать остальные параметры, то этот аргумент должен быть указан как пустой параметр: ,,
membername - имя для участника обработки очереди, под которым он будет добавлен.
stateinterface - альтернативный интерфейс, который будет использоваться для определения состояния участника обработки очереди.
Код возврата
При возникновении ошибки возвращает -1.
По завершению выполнения, команда также установит переменную AQMSTATUS в одно из значений:
ADDED
MEMBERALREADY
NOSUCHQUEUE
Пример:
AddQueueMember(sales,PJSIP/2666)
Используя вариант этой команды: AddQueueMember(<queuename>), вы добавите интерфейс, который совершает вызов, в список участников, которые обрабатывают очередь.
<queuename> - это имя очереди вызовов, описанной в файле queues.conf
пример2:
exten => _101,1,Noop(agent logged on)
same => n,Set(queueN=q${EXTEN:0:1})
same => n,AddQueueMember(${queueN},Local/${CALLERID(num)}@from-queue/n)
same => n,PlayBack(ru/agent-loginok)
*CLI> queue show q1
q1 has 0 calls (max 11) in 'random' strategy (0s holdtime, 0s talktime), W:0, C:0, A:0, SL:0.0% within 0s
Members:
Local/4887@from-queue/n (ringinuse disabled) (dynamic) (Not in use) has taken no calls yet
No Callers
В данном документе приведен список команд, которые Вы можете использовать в плане набора (extensions.conf). Получить список и описание приложений, доступных на вашем сервере Asterisk Вы можете командами CLI: core show applicationsи core show application <name>.
MinivmMWI: Send Message Waiting Notification to subscriber(s) of mailbox.
MinivmNotify: Notify voicemail owner about new messages.
MinivmRecord: Receive Mini-Voicemail and forward via e-mail.
Asterisk: MixMonitor: Record a call and mix the audio during the recording. Use of StopMixMonitor is required to guarantee the audio file is available for processing during dialplan execution.
Организация очередей входящих вызовов для создания колл центра.
Конфигурация очереди осуществляется в файле /etc/asterisk/queues.conf.
Для создания статической очереди, достаточно определить её имя в квадратных скобках и стратегиювызова операторов.
Остальные параметры будут назначены по умолчанию.
/etc/asterisk/queues.conf
[queue_01]
strategy = ringall
В дальнейшем имя очереди будет использовано для вызова ее в диалплане командой Queue.
exten => s,1,Queue(queue_01)
Для применения параметров очередей и управления ими, могут быть использованы команды консоли Asterisk:
*CLI> queue
add reload remove reset set show pause unpause
queue reload
*CLI> queue reload
members parameters rules all
Выполните queue reload allдля инициации новой очереди и queue show <имя очереди>для её отображения в консоли Asterisk:
*CLI> queue show queue_01
queue_01 has 0 calls (max unlimited) in 'ringall' strategy (0s holdtime, 0s talktime), W:0, C:0, A:0, SL:0.0% within 0s
No Members
No Callers
В данном случае очередь пуста, принимать вызовы некому. Агенты принимающие вызовы в очереди могут быть статическими, т.е. назначены в конфиге очереди - queues.conf:
/etc/asterisk/queues.conf
[queue_01]
strategy = ringall
member = PJSIP/2777
Теперь у очереди есть members, пользователи для обработки входящих вызовов:
*CLI> queue show queue_01
queue_01 has 0 calls (max unlimited) in 'ringall' strategy (0s holdtime, 0s talktime), W:0, C:0, A:0, SL:0.0% within 0s
Members:
PJSIP/2777 (ringinuse enabled) (Not in use) has taken no calls yet
No Callers
Или же, агенты могут быть динамическими, т.е. добавляться при помощи интерфейсов Asterisk - CLI, AMIили AGI.
Пример конфигурации очереди
Комментарии даны относительно заданного значения.
[queue_01] ;имя очереди, все параметры заданные после него и до следующих […] скобок, будут относится к данной очереди.
Сохранять каждого динамического пользователя во внутренней БД Asterisk (astdb),
чтобы после перезагрузки, все пользователи были восстановлены из записей очереди в astdb.
см. также RemoveQueueMember
По умолчанию:
persistentmembers = no
AutoFill Behavior (Автозаполнение очереди)
Старое, по умолчанию, поведение очереди (autofill=no) подразумевало последовательный тип подключения, при котором ожидающий абонент, подключался к пользователю, только с первой позиции в очереди.
Новое поведение по умолчанию, (autofill=yes) позволяет ожидающему абоненту, подключится к пользователю (агенту) очереди, с любой позиции, если есть свободные агенты, не дожидаясь, пока он займет головную позицию.
Такое поведение позволяет быстрее обрабатывать вызовы и является предпочтительным.
autofill = yes
Monitor Type (Приложение для записи разговоров )
Приложение MixMonitorзаписывает разговор непосредственно в один файл,
в отличии от устаревшего Monitor,
раздельно записывающего вх. исх. голосовые потоки.
monitor-type = MixMonitor
UpdateCDR behavior(Изменить поведение CDR)
Записать в поле CDRdstchannelимя агента, которое вы можете установить
во время входа в систему с параметром MemberName AddQueueMember.
updatecdr = yes
shared_lastcall (общий последний вызов)
Если оператор (агент) обслуживает больше чем одну очередь, учитывать параметры,
такие как wrapuptime (пауза после завершения разговора в течении которой на агента не поступают вызовы),
для всех вызовов, из всех очередей.
shared_lastcall=no
Negative_penalty_invalid
Рассматривать операторов с отрицательным пенальти, как неактивных (не подавать на них вызовы).
negative_penalty_invalid = no
log_membername_as_agent
Регистрировать агентов с именем, а не номером интерфейса.
параметр для обратной совместимости, поведение как при работе с модулем chan_agents.
log_membername_as_agent = no
Параметры очередей
[queuename]
Musicclass
Устанавливает класс Музыки на Удержании (MOH) используемый данной очередью.
Эта установка будет иметь приоритет над всеми, кроме переменной канала, заданной в диалплане: Set(CHANNEL(musicclass)=whatever)
musicclass = default
announce
Сообщение пользователю обслуживающему очередь.
Сообщение может быть проиграно пользователю (а не вызывающему абоненту)
перед тем, как он примет вызов, например , для идентификации очереди,
из которой поступил вызов, если агент обслуживает более одной очереди.
announce = file_to_play
strategy
Стратегия вызова операторов очереди.
Важнейший параметр, указывает как будет распределяться вызовы между агентами:
ringall - вызываются все пользователи одновременно, пока кто-нибудь не ответит (по умолчанию)
leastrecent - вызвать оператора дольше всех не принимавшего вызовы.
fewestcalls - вызвать оператора принявшего меньше всего вызовов.
random - распределить вызовы случайным образом.
rrmemory - по кругу, после агента отвечавшего крайним.
rrordered - тоже самое, что и rrmemory, но пользователи вызываются в порядке перечисления в конфиге очереди.
linear - вызывать начиная с первого в порядке перечисления. Динамические агенты, будут вызываться в порядке добавления.
wrandom - звонит случайный интерфейс, но использует штраф этого участника в качестве веса (weight) при расчете метрики.
Таким образом, оператор с пенальти 0 будет иметь метрику в диапазоне от 0 до 1000,
оператор с пенальти 1 от 0 до 2000,
а оператор с пенальти 2 будет иметь метрику между 0 и 3000.
Обратите внимание, что при использовании этой стратегии, пенальти оператора не такой же,
как при использовании других стратегий очереди.
Он используется ТОЛЬКО в качестве весового коэффициента для вычисления метрики.
strategy = ringall
servicelevel
Параметр статистики. Задает диапазон от 0 до servicelevel=в секундах.
Приложение app_queueвысчитает процент вызовов, отвеченных за указанный период.
Например, если servicelevel=30 ожидавших в очереди не более 30-ти секунд.
servicelevel=30
Ниже приведен пример, где мы видим, что 89.4% процента вызовов в очереди q1были отвечены в течении 30 секунд (SL:89.4% within 30s).
*CLI> queue show q1
q1 has 0 calls (max unlimited) in 'leastrescent' strategy (6s holdtime, 120s talktime), W:0, C:5156, A:584, SL:89.4% within 30s
Members:
SIP/4886 (ringinuse disabled) (Not in use) has taken no calls yet
SIP/4887 (ringinuse disabled) (Not in use) has taken no calls yet
PJSIP/4889 (ringinuse disabled) (Unavailable) has taken no calls yet
No Callers
context
Указывает на контекст диалплана, в который ожидающий в очереди абонент может попасть набором одной цифры в DTMF.
В контексте должен быть определен екстеншен для обработки этой цифры.
Например, можно использовать для интерактивного меню.
context = context_name
penaltymemberslimit
не использовать penalty, если очередь обслуживают кол-во операторов меньшее или равное тому, что указано:
penaltymemberslimit = 5
Примечание для рассматриваемых далее таймаутов очереди.
Таймаут выхода из очереди по не ответу, не является параметром очереди, а может быть назначен как опция вызова приложения Queue Queue(queuename,[options],[optionalurl],[announceoverride],[timeout])
Пример:
Queue(queuename,t,,,45)
queue timing options
Очередь имеет два разных «таймаута» связанных с ней. Один из них назначается в queue.conf.
Этот таймаут указывает в течении какого промежутка времени, в секундах, будет вызываться телефон пользователя, прежде чем будет считаться, что он не ответил. Второй таймаут, это аргумент приложения Queue(). Это абсолютный таймаут, по истечении которого, вызов выходит из очереди и переходит на следующий приоритет в контексте. В некоторых ситуациях, эти таймауты сталкиваются. Например, если таймаут в queue.confустановлен 5 секунд, retry = 4 секунды, а таймаут приложения Queue()задан 10 секунд
произойдет следующее:
вызов попадает в очередь
очередь выбирает оператора и вызывает его в течении 5 секунд
затем выдерживается время retry - 4 секунды
очередь выбирает второго оператора.
Как долго будет вызываться второй оператор? Осталась 1 секунда до истечения абсолютного таймаута приложения Queue().
Будет ли второй оператор вызываться 1 секунду или 5 как задано в таймауте queue.conf?
Эту коллизию призван разрешить параметр timeoutpriority: если timeoutpriority=conf, то второй оператор будет вызваться в течении 5-ти секунд. Если timeoutpriority=app, то в течении 1-й секунды.
Существуют и некоторые исключения и приведенных выше правил:
предположим timeoutpriority=app, в queues.confтаймаут равен 0, а аргумент приложения Queueзадан 10 сек.
Тогда timeoutpriorityигнорируется, а таймаут приложенияиспользуется как таймаут вызова операторов queues/conf.
И наоборот, если таймаут приложенияне задан, тогда timeoutpriorityигнорируется и таймаут конф. файлаqueues.confвсегда используется.
Несмотря на то, что timeoutpriority=confтаймаут конфигурационного файлаqueues.confимеет приоритет над таймаутом приложения,
если таймаут конф. файларавен 0, каждый участник очереди будет вызываться в течении неопределенного времени, а таймаут приложениябудет проверяться после этих попыток.
По умолчанию: timeoutpriority=app
timeout = 15
retry = 5
timeoutpriority = app|conf
weight
Чем выше вес (weight) очереди, тем выше приоритет для вызова оператора обслуживающего больше одной очереди.
по умолч. 0
weight=0
wrapuptime
После завершения успешного вызова, время отдыха оператора, прежде чем он снова сможет принимать вызовы.
по умолч. 0
wrapuptime=0
autofill
Переопределяет глобальную установку autofill, рассмотренную выше, отдельно для каждой очереди.
autofill=yes|no
autopause
Поставить оператора на паузу, если он не ответил на вызов. см. также PauseQueueMember
no: Не использовать автопаузу для данной очереди.
yes: Поставить на паузу, только в данной очереди.
all: Поставить на паузу во всех очередях, которые обслуживает оператор.
autopause=no|yes|all
Autopausedelay
Отложить постановку на паузу оператора на время, с момента завершения последнего неудачного вызова.
autopausedelay=60
Autopausebusy
Ставить или нет оператора на паузу, если он занят (BUSY).
autopausebusy=no
Autopauseunavail
Ставить или нет оператора на паузу, если он недоступен (UNAVAILABEL).
autopauseunavail=no
maxlen
Максимально кол-во ожидающих в очереди. Если превышено, последующие вызовы будут отвергаться.
0 - неограниченно.
maxlen=0
variables
Примечание для рассматриваемых ниже параметров очереди - setinterfacevar, setqueueentryvar, setqueuevar.
Если канал оператора (member channel) определен как Local,
то для установки переменных он должен быть оптимизирован при помощи опции /n.
Например:
Local/2666@from-queue/n
Если setinterfacevar=yes, то следующие переменные будут назначены в каналах вызывающего абонента и оператора очереди:
MEMBERINTERFACE - наименование интерфейса оператора(например. Local/1234)
MEMBERNAME - имя оператора (например. O.Agentova)
MEMBERCALLS - кол-во вызовов принятых данным интерфейсом оператора.
MEMBERLASTCALL - Время последнего вызова (UNIX-time).
MEMBERPENALTY - штраф (penalty) оператора.
MEMBERDYNAMIC - указывает динамический пользователь или нет.
MEMBERREALTIME - указывает realtime конфигурация оператора или нет.
setinterfacevar=no
пример
мы видим что интерфейс SIP/4887 динамический и время последнего вызова в UNIX-time.
exten => s,1,Queue(q1,cF,,,30)
same => n,verbose(${MEMBERLASTCALL})
same => n,verbose(${MEMBERDYNAMIC})
same => n,verbose(${MEMBERINTERFACE})
-- Executing [s@from-fs-pjsip:1] Queue("PJSIP/fs_pjsip-0000003b", "q1,cF,,,30")
-- Called SIP/4887
-- SIP/4887-00000041 is ringing
-- SIP/4887-00000041 answered PJSIP/fs_pjsip-0000003b
-- Stopped music on hold on PJSIP/fs_pjsip-0000003b
-- Executing [s@from-fs-pjsip:2] Verbose("PJSIP/fs_pjsip-0000003d", "1476870427")
-- Executing [s@from-fs-pjsip:3] Verbose("PJSIP/fs_pjsip-0000003b", "1")
-- Executing [s@from-fs-pjsip:4] Verbose("PJSIP/fs_pjsip-0000003b", "SIP/4887")
setqueueentryvar
Если setqueueentryvar=yes, то следующие переменные будут назначены в каналах вызывающего абонента и оператора очереди:
QEHOLDTIME - время ожидания вызывающего абонента.
QEORIGINALPOS - позиция в очереди.
setqueueentryvar=no
setqueuevar
Если setqueuevar=yes, то следующие переменные будут назначены в каналах вызывающего абонента и оператора очереди, при соединении или когда вызывающий абонент покидает очередь:
QUEUENAME - имя очереди.
QUEUEMAX - максимальное кол-во вызовов разр. в очереди;
QUEUESTRATEGY - стратегия очереди;
QUEUECALLS - текущее кол-во вызовов в очереди;
QUEUEHOLDTIME - среднее время ожидания в очереди на данный момент;
Как часто анонсировать позицию в очереди и среднее время ожидания.
Если 0 то не анонсировать.
Примечание: этот параметр игнорируется при изменении позиции абонента в очереди (см. min-announce-frequency)
announce-frequency = 90
min-announce-frequency
Минимальный интервал между моментом перехода на следующую позицию и анонсом среднего времени удержания.
Это полезно для избежания постоянных объявлений когда позиция в очереди абонента часто меняется.
т.е., если позиция в очереди изменилась, то не оповещать, даже если подошло время announce-frequency.
(см. announce-frequency)
Если включено, то объявления будут проигрываться первому в очереди. Это может привести к ситуации, когда агент готов принять вызов, но соединени откладывается из-за объявления и приведет к задержкам в очереди. по умолчанию выключено.
announce-to-first-user = no
announce-position-limit
Если назначено «limit» или «more» в announce-positionбудет задействован этот параметр.
announce-position-limit = 5
announce-round-seconds
Округлять тайминги объявлений до заданного значения, если не = 0
Возможные значения 0, 5, 10, 15, 20, and 30.
announce-round-seconds = 10
Аудио файлы используемые для объявлений
Если не заданы другие, используются файлы перечисленные ниже:
queue-youarenext = queue-youarenext ;(«You are now first in line.»)
Для включения записи вызовов, требуется задать «monitor-format»,
если monitor-formatне задан, запись разговоров считается выключенной.
Вызовы будут записаны только с момента поднятию трубки оператором.
monitor-format = gsm|wav|wav49
Queue Empty Options(параметры заполнения очереди)
Параметры очереди Asterisk «joinempty» и «leavewhenempty» регламентируют условия при которых абонент может встать в очередь и покинуть ее, соответственно.
Параметры «joinempty» и «leavewhenempty» могут принимать несколько значений, перечисленных через запятые.
Ниже приведем список факторов влияющих на эти параметры:
paused: считать недоступным, если оператор на паузе;
penalty: считать недоступным, если пенальти оператора меньше чем QUEUE_MAX_PENALTY;
inuse: считать недоступным, если телефон оператора в данный момент вызывается (звонит);
ringing: a member is not considered available if his phone is currently ringing
unavailable: Касается в основном каналов Agent (заданных в agents.conf). если агент назначен в agent.conf, но не зарегистрировался(каналы Agent можно считать устаревшими)
invalid: Интерфейсы имеющие статус «invalid».
unknown: Не имеющий явного статуса оператор.
wrapup: Оператор на таймауте wrapuptimeпосле вызова.
Пример, не подключаться к очереди,если все операторы имеют один из перечисленных статусов:
joinempty = paused,inuse,invalid
Покинуть очередь, если все операторы имеют один из указанных статусов:
leavewhenempty = inuse,ringing
;
Устаревшие значения, могут быть указаны для обратной совместимости:
yes - (empty) for joinempty; penalty,paused,invalid for leavewhenempty
no - penalty,paused,invalid for joinempty; (empty) for leavewhenempty
strict - penalty,paused,invalid,unavailable
loose - penalty,invalid
reportholdtime
Если нужно оповестить оператора о том сколько абонент ожидал в очереди.
reportholdtime = no
ringinuse
Чтобы избежать посылки вызова на оператора, чей интерфейс находится с состоянии 'in use',
установите = no. Помимо общего значения очереди, можно установить этот параметр для отдельных пользователей очереди через команду QUEUE_MEMBER, поле 'ringinuse' реалтайм пользователей и CLI/AMI:
*CLI> queue set ringinuse no on SIP/4887 in queue1
SIP/4887 (ringinuse disabled) (dynamic) (Not in use)
*CLI> queue set ringinuse yes on SIP/4887 in queue1
SIP/4887 (ringinuse enabled) (dynamic) (Not in use)
только драйверы каналов SIPи PJSIP поддерживают в данный момент статус 'in use'
ringinuse = no
memberdelay
Параметр устанавливает время задержки между моментом, когда агент отвечает на вызов и соединения его с вызывающим абонентом.
memberdelay = 0
timeoutrestart
Если параметр «timeoutrestart» установлен в значение yes, тогда значение таймаута для агента будет сбрасываться, если от него будет получен сигнал BUSY или CONGESTION. Это бывает полезно, когда агент имеет возможность отметить вызов, отвергая его или, производя некоторые действия, которые имеют подобный эффект. (Обнаружено, что если вызов агента завершился со статусом NOANSWER (ring, no-answer), это так же заставляет вызов отправить к следующему агенту в очереди по алгоритму roundrobin).
timeoutrestart = no
defaultrule
назначить правила по умолчанию. Конфигурация находится в queuerules.conf
defaultrule = myrule
Members
Каждый пользователь очереди перечисляется в отдельной строке
в виде технология/строка набора. Под пользователем понимается оператор очереди.
Дополнительный параметр penaltyможет быть задан после запятой.
Каждый оператор очереди Asteriskимеет параметр penalty.
Пенальти может быть определен в настройках пользователя очереди:
member ⇒ interface[,penalty][,membername][,state_interface][,ringinuse]
или при добавлении динамического агента:
queue add member <dial string> to <queue> [[[penalty <penalty>] as <membername>] state_interface <interface>]
Данный параметр определяет приоритет для посылки вызова на оператора, чем ниже пенальти, тем выше приоритет при выборе оператора для вызова.
Если пенальти не задан, то по умолчанию = 0
Предположим, очередь обслуживают 3 оператора с пенальти - 0,1 и 2 соответственно.
Первым будет вызван оператор с пенальти = 0 и только если он недоступен, оператор с пенальти = 1 и так далее.
Пенальти оператора может быть динамически изменен, например через CLI:
queue set penalty <penalty> on <interface> [in <queue>]
Пользователи с большим значением пенальти имеют, более низкий приоритет для вызовов.
После второй запятой назначается имя.
Использование имени может быть удобно для представления в логах очереди.
Разные интерфейсы могут использовать одно имя.
Дополнительное описание интерфейса указывается после третьей запятой.
На этот интерфейс будут посылаться уведомления app_queue,
но для вызова будет всегда использоваться указанный первым интерфейс.
member => interface [,penalty][,membername][,state_interface][,ringinuse]
member => DAHDI/1
member => DAHDI/2,10
member => DAHDI/3,10,Stev Morrissev
member => Local/1000@default,0,Patty Smithoff,SIP/1000
member => Local/2000@default,0,Syd Buratinov,SIP/2000,no
Установка, настройка и обслуживание IP АТС Asterisk и FreeSWITCH.
Мы предлагаем услуги по установке,
настройке и обслуживанию IP АТС Aterisk и FreeSWITCH.
За годы работы, мы накопили внушительный опыт внедрения открытых
и проприетарных телекоммуникационных платформ,
что позволяет, предлагать нашим клиентам самые оптимальные решения.
Для внедрения IP АТС небольшой емкости (до 100 абонентов), прекрасно подходит
программная АТС Asterisk с веб интерфейсом FreePBX.
Русскоязычный, простой и интуитивно понятный веб интерфейс
позволит вам, в дальнейшем, обслуживать АТС без дополнительных затрат.
Все используемое ПО является свободно распространяемым
и вы платите только за пусконаладку (от 10 000 рублей).
Приобретая базовую установку Asterisk вы гарантировано получаете:
Программное обеспечение и функционал:
Asterisk 13
FreePBX 13 - веб интерфейс настройки Asterisk
CDR-viewer - веб интерфейс записи и детализации вызовов
ARI (RESTful) и AMI - интерфейсы приложений.
Протоколы связи: SIP, IAX2, h323, DAHDI
Функции: Очереди, Группы приема вызовов, Телеконференции, Автосекретарь, Маршрутизация вызовов, Переадресация вызовов, Факс-на-ЕМайл.
Операционная система: Centos 7 (Centos 6, Ubuntu или Debian - по требованию)
Базовую настройку IP АТС Asterisk:
Создание требуемого кол-ва IP абонентов
Подключение требуемого кол-ва SIP (или h323) транков к провайдеру IP телефонии.
Подключение потоков ISDN PRI E1.
Настройку входящей/исходящей маршрутизации по вашему ТЗ.
Настройку дневного/ночного режима
Настройка голосового меню (IVR)
Настройка групп приема вызовов.
Базовые настройки безопасности (IPtables и fail2ban)
Настройка приобретенного у нас оборудования (VoIPшлюзов, IP телефонов).
Консультации по настройке вашего оборудования.
Базовое обучение использования FreePBX для настройки Asterisk (Подключение IP абонентов, IP транков; создание очередей, телеконференций, голосовых меню, групп приема вызовов; использование сервисных кодов и отчетов о звонках.)
Бесплатную тех. поддержку в течении месяца с момента ввода в эксплуатацию.
Варианты установки:
Продажа сервера с установкой и настройкой системы.
Установка на сервере заказчика.
Удаленная установка/настройка на сервере заказчика.
Установка на VPS хостинге
Установка на embedded устройства (например роутеры поддерживающие работу с OpenWRT, функционал может быть ограничен)
Модуль cdr_adaptive_odbcпозволяет добавлять собственные переменные в CDR,
создавать псевдонимы (alias) и фильтровать данные. Добавлять альтернативные
таблицы CDR, с уникальным содержанием.
Как и следует из названия, модуль cdr_adaptive_odbc сохраняет CDRв базу данных через ODBC.
«adaptive» в данном случае означает, что она пытается приспособиться к структуре таблицы:
нет статической структуры таблиц, которые должны быть использованы с этим модулем.
Когда модуль загружен (или при перезагрузке), он читает структуру таблицы. Он ищет имя столбца, которому соответствует переменная CDR.
Это относится как к встроенным CDRпеременным, так и к пользовательским переменным.
Например, чтобы передавать данные из встроенной (builtin) переменной CDRchannel, в таблице базы данных должен быть столбец channel.
пример:
Добавим в кастомную CDRпеременную useragentзначение равное номеру SIPтелефона.
Чтобы данные переменной useragentбыли занесены через cdr_adaptive_odbc, надо создать столбец useragentв БД.
В файле конфигурации cdr_adaptive_odbc можно создать множество таблиц. Имя секции может быть любым, модуль не использует его. Вот пример простой конфигурации таблицы:
; The point of this module is to allow you log whatever you like in terms of
; the CDR variables. Do you want to log uniqueid? Then simply ensure that
; your table has that column. If you don't want the column, ensure that it
; does not exist in the table structure. If you'd like to call uniqueid
; something else in your table, simply provide an alias in the configuration
; file that maps the standard CDR field name (uniqueid) to whatever column
; name you like.
; Perhaps you'd like some extra CDR values logged that aren't
; in the standard repertoire of CDR variables (some that come to mind are
; certain values used for LCR: route, per_minute_cost, and per_minute_price).
; Simply set those CDR variables in your dialplan, i.e. Set(CDR(route)=27),
; ensure that a corresponding column exists in your table, and cdr_adaptive_odbc
; will do the rest.
;
; This configuration defines the connections and tables for which CDRs may
; be populated. Each context specifies a different CDR table to be used.
;
; The columns in the tables should match up word-for-word (case-insensitive)
; to the CDR variables set in the dialplan. The natural advantage to this
; system is that beyond setting up the configuration file to tell you what
; tables to look at, there isn't anything more to do beyond creating the
; columns for the fields that you want, and populating the corresponding
; CDR variables in the dialplan. For the builtin variables only, you may
; create aliases for the real column name.
;
; Please note that after adding columns to the database, it is necessary to
; reload this module to get the new column names and types read.
;
; Warning: if you specify two contexts with exactly the same connection and
; table names, you will get duplicate records in that table. So be careful.
;
;[first]
;connection=mysql1
;table=cdr
;[second]
;connection=mysql1
;table=extracdr
;[third]
;connection=sqlserver
;table=AsteriskCDR
;schema=public ; for databases which support schemas
;usegmtime=yes ; defaults to no
;alias src => source
;alias channel => source_channel
;alias dst => dest
;alias dstchannel => dest_channel
;
; Any filter specified MUST match exactly or the CDR will be discarded
;filter accountcode => somename
;filter src => 123
; Negative filters are also now available
;filter src != 456
;
; Additionally, we now support setting static values per column. The reason
; for this is to allow different sections to specify different values for
; a certain named column, presumably separated by filters.
;static "Some Special Value" => identifier_code
;
; Add quoted indentifiers for table and columns names.
;quoted_identifiers=" ; Default to null
;
; Asterisk Call Management CDR
;
[general]
enabled = no
; The "mappings" category can be used to define additional "key: value" pairs
; that will be included in the manager event. (after AccountCode, Source, etc).
;
; Each line like "varname => label" will include a "label: ${CDR(varname)}"
; in the generated event where ${CDR(varname)} its replaced with its value
;
;[mappings]
;rate => Rate
;carrier => Carrier
Параметры подключения к базе данных записи событий CDR.
Пример cdr_mysql.conf
Этот пример конфигурации, подразумевает, что SQLсервер локальный.
Примечание – если сервер базы данных запущен на той же машине, что и
сервер Астериск, для связи с локальным сокетом Unix можно задать:
hostname=localhost
portи sock– необязательные параметры. Если hostname определен
не как «localhost», тогда cdr_mysql будет пытаться подсоединиться
по указанному порту или использовать порт по умолчанию. Если hostname не указано
или если hostname это «localhost», тогда cdr_mysql будет пытаться, подсоединиться
к сокет файлу, указанному sock, или в ином случае использовать сокет файл по умолчанию.
Включите последнюю опцию, если вы хотите использовать SetCDRUserField
Файл mysql.sock присутствует только, пока mysql сервер поднят и запущен.
Найти его местоположение можно командой:
настройка соединения с БД CDRпри помощи драйвера ODBC. Устарело, используйте в новых установках cdr_adaptive_odbc.conf
;
; cdr_odbc.conf
;
;[global]
;dsn=MySQL-test
;loguniqueid=yes
;dispositionstring=yes
;table=cdr ;"cdr" is default table name
;usegmtime=no ; set to "yes" to log in GMT
;hrtime=yes ;Enables microsecond accuracy with the billsec and duration fields
;newcdrcolumns=yes ; Enable logging of post-1.8 CDR columns (peeraccount, linkedid, sequence)
Соединение с СУБД PostgreSQL для записи CDR. Устарело, используйте в новых установках cdr_adaptive_odbc.conf
; Sample Asterisk config file for CDR logging to PostgresSQL
;
; Note that you can use TLS connections to your database server.
; This is configured for your PostgreSQL client installation
; on this system (check for pgsessions.conf)
[global]
;hostname=localhost
;port=5432
;dbname=asterisk
;password=password
;user=postgres
;appname=asterisk ; Postgres application_name support (optional). Whitespace not allowed.
;table=cdr ;SQL table where CDRs will be inserted
;encoding=LATIN9 ; Encoding of logged characters in Asterisk
;timezone=UTC ; Uncomment if you want datetime fields in UTC/GMT
cdr_tds модуль использует FreeTDS библиотеку для отправки CDR Microsoft SQL Server или Sybase БД.
;
; Asterisk Call Detail Records (CDR) - FreeTDS Backend
;
;[global]
; Connection - соединение
;
; Используйте ключ 'connection' для указания имени подключения в файле 'freedtds.conf'
; 'freetds.conf' это конфигурационный файл библиотеки FreeTDS, а не Asterisk (см. документацию FreeTDS)
;
; http://www.freetds.org/userguide/freetdsconf.htm
;
; Значения: Одно из соединений, назначенных в freetds.conf
;connection=ConnectionFromFreeTDSConf
; Database Name - имя базы данных
;
; 'dbname' - указывает имя базы данных для использования CDR.
;
; Значение: имя существующей базы данных.
;dbname=AsteriskCDRs
; Database Table Name - имя таблицы Базы Данных
;
; 'table' ключ идентификации таблицы базы данных CDR.
;
; Значение: имя существующей таблицы базы данных CDR.
; Значение по умолчанию: Если не задано будет использовано - 'cdr'.
;table=cdr
; Credentials - полномочия
;
; 'username' и 'password' ключи идентификации пользователя.
;
;Значение: пользователь и пароль базы данных.
;username=mangUsr
;password=
; Language
;
; The 'language' ключ изменения языка для сообщений об ошибках и информационных сообщений возвращаемых SQL сервером.
; Каждая БД и пользователь имеют собственное значение по умолчанию, которое перекрывается данным ключом.
;
; Значение: Язык поддерживаемый севером SQL.
; Значение по умолчанию: us_english
;language=us_english
; Character Set
;
; The 'charset' setting is used to change the character set used when connecting
; to the database server. Each database and database user has their own
; character set setting, and this default can be overriden here.
;
; Accepted value: Any valid character set available on the target SQL server.
; Default value: iso_1
;charset=BIG5
; High Resolution Times
;
; The 'hrtime' включить значения высокой точности для полей 'billsec' и 'duration'.
;
; Значение: true или false
; Значение по умолчанию: false
;hrtime=false
Документация по конфигурации и использованию функций модуля res_pjsip_acl.
ACLмодуль используется res_pjsip. Данный модуль не зависит от ENDPOINTs и управляет всеми входящими подключениями через res_pjsip.
Есть два основных способа назначить ACLпри помощи соответствующих опций. Можно использовать привычные 'permit' и 'deny', которые действуют в отношении IP адресов.
Или 'contactpermit' и 'contactdeny', которые действуют на основании адреса из заголовка 'Contact' входящего SIPзапроса REGISTER.
Возможно комбинировать разные опции и создавать смешанный списки контроля доступа (ACL).
В добавление к этому, вместо назначения ACLс помощью опций, можно задать адреса IP или заголовки Contact ACLв файле «acl.conf» при помощи 'acl' и 'contactacl' опций.
При установке Ubuntu выберите обязательно OpenSSH server и LAMP сервер. Установите дополнительные пакеты на ваше усмотрение.
В ходе установки системы вам будет предложено задать пароль root пользователя MySQL, если вы не уверены, можно отставить пустым.
если пароль задан, он потребуется в дальнейшем для работы с MySQL.
Задайте пароль root пользователя системы
$ sudo passwd root
Enter new UNIX password:
Retype new UNIX password:
passwd: password update successfully
Это требуется чтобы загрузить свежую версию ядра после апгрейда. Если вы уверены что загруженная версия последняя, можно не перезагружаться.
reboot
Установите PearDB
pear uninstall db
pear channel-update pear.php.net
pear install -Z db-1.7.14
Error: Error: cannot download "pear/DB"
Ошибка при установке DB
(На данный момент, я не до разобрался в причине этой проблемы, но после танцев с бубном, все заработало.)
root@asterisk:/usr/src# pear install DB-1.7.14
WARNING: "pear/DB" is deprecated in favor of "pear/MDB2"
downloading DB-1.7.14.tgz ...
Starting to download DB-1.7.14.tgz (133,103 bytes)
.............................done: 133,103 bytes
could not extract the package.xml file from "/build/buildd/php5-5.5.9+dfsg/pear-build-download/DB-1.7.14.tgz"
Download of "pear/DB" succeeded, but it is not a valid package archive
Error: cannot download "pear/DB"
Download failed
install failed
Решение - установим вручную
Смотрим путь:
pear config-get php_dir
В моем случае это:
/usr/share/php
Качаем DB 1.7.14
cd /usr/src/
wget http://download.pear.php.net/package/DB-1.7.14.tgz
tar zvxf DB-1.7.14.tgz
Далее при вводе pear install db-1.7.14, получаем ответ что уже установлено.
root@asterisk:/usr/share/php# pear install db-1.7.14
pear/db is already installed and is the same as the released version 1.7.14
install failed
Установка Asterisk
Как использовать данное руководство.
Блоки команд с ключом '&&' могут быть скопированы вместе и будут выполняться последовательно. '&&' выполняет переход к следующей команде, при условии успешного выполнения предыдущей. Если вы хотите полностью, пошагово, контролировать процесс установки, выполните каждую команду отдельно, без ввода '&&'.
root@ubuntu:/usr/src# ls -la
total 47960
drwxr-xr-x 5 root root 4096 Dec 9 11:18 .
drwxr-xr-x 10 root root 4096 Dec 9 09:55 ..
-rw-r--r-- 1 root root 31832204 Nov 20 23:55 asterisk-13-current.tar.gz
-rw-r--r-- 1 root root 7630719 Sep 22 23:20 dahdi-linux-complete-current.tar.gz
drwxr-xr-x 8 root root 4096 Dec 9 11:18 jansson
-rw-r--r-- 1 root root 1336025 Apr 14 2010 lame-3.98.4.tar.gz
-rw-r--r-- 1 root root 338633 Jun 16 21:50 libpri-1.4-current.tar.gz
drwxr-xr-x 24 root root 4096 Dec 9 09:57 linux-headers-3.13.0-32
drwxr-xr-x 7 root root 4096 Dec 9 09:57 linux-headers-3.13.0-32-generic
-rw-r--r-- 1 root root 4628649 Dec 9 11:18 pjproject-2.2.1.tar.bz2
Скомпилируйте и установите Lame (mp3)
cd /usr/src &&
tar zxvf lame-3.98.4.tar.gz &&
cd lame-3.98.4 &&
./configure &&
make &&
make install
Скомпилируйте и установите DAHDI и LibPRI
cd /usr/src &&
tar xvfz dahdi-linux-complete-current.tar.gz &&
tar xvfz libpri-1.4-current.tar.gz &&
rm -f dahdi-linux-complete-current.tar.gz libpri-1.4-current.tar.gz &&
cd dahdi-linux-complete-* &&
make all &&
make install &&
make config &&
cd /usr/src/libpri-1.4.* &&
make &&
make install
kernel error
Ошибка - отсутствуют исходники ядра
/usr/src/dahdi-linux-complete-2.10.0.1+2.10.0.1# make all
make -C linux all
make[1]: Entering directory `/usr/src/dahdi-linux-complete-2.10.0.1+2.10.0.1/linux'
make -C drivers/dahdi/firmware firmware-loaders
make[2]: Entering directory `/usr/src/dahdi-linux-complete-2.10.0.1+2.10.0.1/linux/drivers/dahdi/firmware'
make[2]: Leaving directory `/usr/src/dahdi-linux-complete-2.10.0.1+2.10.0.1/linux/drivers/dahdi/firmware'
You do not appear to have the sources for the 3.2.0-4-amd64 kernel installed.
make[1]: *** [modules] Error 1
make[1]: Leaving directory `/usr/src/dahdi-linux-complete-2.10.0.1+2.10.0.1/linux'
make: *** [all] Error 2
Решение - установить исходники)
apt-get install linux-headers-`uname -r`
Скомпилируйте и установите pjproject
(Требуется для поддержки драйвера SIPканала PjSIP)
cd /usr/src &&
tar -xjvf pjproject-2.2.1.tar.bz2 &&
cd pjproject-2.2.1 &&
CFLAGS='-DPJ_HAS_IPV6=1' ./configure --prefix=/usr --enable-shared --disable-sound\
--disable-resample --disable-video --disable-opencore-amr &&
make dep &&
make &&
make install
Скомпилируйте и установите jansson
cd /usr/src/jansson &&
autoreconf -i &&
./configure &&
make &&
make install
Скомпилируйте и установите Asterisk
cd /usr/src &&
tar xvfz asterisk-13-current.tar.gz &&
rm -f asterisk-13-current.tar.gz &&
cd asterisk-* &&
./configure &&
contrib/scripts/get_mp3_source.sh &&
make menuselect
После ввода команды make menuselect, вам будет предложено выбрать устанавливаемые модули. Большинство требуемых модулей выбираются автоматически. Для поддержки mp3 включите модуль 'format_mp3'.
В разделе Core Sound Packages выберете поддержку русскоязычных файлов (если требуется)
В разделе Extra Sound Packages выберете дополнительные звуковые файлы.
В завершении выберете Save & Exitи продолжите установку.
make &&
make install &&
make config &&
ldconfig
Установка и настройка FreePBX
Скачайте и распакуйте FreePBX.
cd /usr/src &&
wget http://mirror.freepbx.org/freepbx-12.0.43.tgz &&
tar zxvf freepbx-*.tgz &&
cd /usr/src/freepbx
Git
при установке из гит репозитория возникает ошибка:missing modgettext.class.php (incomplete application of changeset 12995?)
поэтому лучше скачивать архив.
export VER_FREEPBX=12.0 &&
cd /usr/src &&
git clone http://git.freepbx.org/scm/freepbx/framework.git freepbx &&
cd freepbx &&
git checkout release/${VER_FREEPBX}
Создайте пользователя Asterisk и задайте права пользователя.
Далее в руководстве freepbx.org, предлагается удалить директорию веб сервера:
Удалять директорию /var/www/html может быть опасно для ваших данных.
rm -rf /var/www/html
Это делается, т.к. при установке FreePBX скриптом, если папка существует, появляется сообщение о ошибке,
что может быть исправлено, просто, повторным запуском скрипта установки.
Настроим Apache
sed -i 's/\(^upload_max_filesize = \).*/\120M/' /etc/php5/apache2/php.ini &&
sed -ie 's/\;date\.timezone\ \=/date\.timezone\ \=\ "Europe\/Moscow"/g' /etc/php5/apache2/php.ini &&
cp /etc/apache2/apache2.conf /etc/apache2/apache2.conf_orig &&
sed -i 's/^\(User\|Group\).*/\1 asterisk/' /etc/apache2/apache2.conf &&
sed -i 's/AllowOverride None/AllowOverride All/' /etc/apache2/apache2.conf &&
service apache2 restart
root@aster:~# sed -i 's/AllowOverride None/AllowOverride All/' /etc/apache2/apache2.conf
root@aster:~# cat /etc/apache2/apache2.conf | grep AllowOverride
AllowOverride All
AllowOverride All
AllowOverride All
# AllowOverride All
# create the configuration file in the "available" section
echo "ServerName localhost" | sudo tee /etc/apache2/conf-available/servername.conf
# enable it by creating a symlink to it from the "enabled" section
a2enconf servername
# restart the server
service apache2 restart
Подготовим MySQL
Требуется создать безопасный пароль для связи FreePBX и MySQL
Замените asteriskuserна имя пользователя, которое вам нравится. Например: YOURUSER@localhost. Можно оставить как есть.
mysql -u root -e "GRANT ALL PRIVILEGES ON asterisk.* TO asteriskuser@localhost IDENTIFIED BY '${ASTERISK_DB_PW}';"
mysql -u root -e "GRANT ALL PRIVILEGES ON asteriskcdrdb.* TO asteriskuser@localhost IDENTIFIED BY '${ASTERISK_DB_PW}';"
mysql -u root -e "flush privileges;"
Запустим Asterisk и установим FreePBX.
Если в предыдущем пункте вы задали собственное имя пользователя, замените asteriskuserна него. Например: –username=YOURUSER
Если выполнение скрипта прерывается и появилось сообщение о ошибке, попробуйте запустить установку ещё раз.
Spoiler
...
*************************************************************************
* Note: It's possible that if you click the red 'Update Now' bar BEFORE *
* updating your modules, your machine will start dropping calls. Ensure *
* that all modules are up to date BEFORE YOU CLICK THE RED BAR. As long *
* as this is observed, your machine will be fully functional whilst the *
* upgrade is in progress. *
*************************************************************************
****************************************
* At This Time Please Restart Asterisk *
****************************************
amportal a ma download manager
amportal a ma install manager
amportal a ma installall
amportal a ma refreshsignatures
amportal a reload
amportal chown
В завершении настроим создадим ссылку на директорию Music On Hold формата mp3
Поверим состояние Asterisk подключившись к консоли
asterisk -vvr
Asterisk 13.0.1, Copyright (C) 1999 - 2014, Digium, Inc. and others.
Created by Mark Spencer <markster@digium.com>
Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core show warranty' for details.
This is free software, with components licensed under the GNU General Public
License version 2 and other licenses; you are welcome to redistribute it under
certain conditions. Type 'core show license' for details.
=========================================================================
Connected to Asterisk 13.0.1 currently running on ubuntu (pid = 24513)
ubuntu*CLI>core restart now
Подключимся к FreePBX
http://IP.Address.FreePBX.Server/admin
Первым делом, вам будет предложено задать имя пользователя и пароль FreePBX
Чтобы работало переключение на русский язык в панели управления, необходимо отредактировать файл /etc/locale.alias. Ищем строку russian ru_RU.ISO-8859-5 и правим ее.
nano +67 /etc/locale.alias
russian ru_RU.UTF-8
или sed:
sed -i 's/ru_RU.ISO-8859-5/ru_RU.UTF-8/g' /etc/locale.alias
Asterisk CDR - Call Detail Records - Детализированный отчет о звонках
CDR - детализированный отчет о звонках. Лог вызовов через ODBC: MySQL, PostgreSQL, TDS и др.
Детализированные отчеты о звонках используются для выставления счетов (биллинг),
анализа объемов голосового трафика или для отладки Asterisk.
Поля CDR записей
R/O - read only
Option
Value/Example
Notes
accountcode
54321
Код аккаунта присвоенный абоненту, для биллинга например. По умолчанию не задан.
src
8129981138
Идентификатор вызывающего абонента(Caller ID). Источник вызова, сохраняется автоматически. R/O
dst
111
Пункт назначения вызова.Вызываемое расширение диалплана.
dcontext
from-internal
Контекст назначения обработки вызова. auto, R/O
clid
"Olegus" <81239981138>
Caller ID вызывающего абонента в полном формате - "name" <number>. auto, R/O
channel
SIP/0004F2040808-a1bc23ef
Канал инициатор вызова. A-leg(side).auto, R/O
dstchannel
SIP/0004F2046969-9786b0b0
Канал назначения вызова. B-Leg(side).auto, R/O
lastapp
Dial
Приложениеобработки вызова выполненное последним в канале. auto, R/O
lastdata
SIP/0004F2046969,30,tT
Данные (например 'Dial(данные)') приложения выполненного последним.auto, R/O
start
2016-05-27 12:02:00
Время поступления вызова вызова. auto, R/O
answer
2016-05-27 12:02:15
Время ответа на вызов абонентом или ответ приложения. auto, R/O
end
2016-05-27 12:08:15
Время окончания соединения.Hangup. auto, R/O
duration
195
Общая продолжительность вызова в секундах.auto, R/O
billsec
180
Продолжительность соединения в секундах с момента ответа(снятия трубки или выполнения команды Asterisk app: Answerв диалплане).auto, R/O
disposition
ANSWERED
Состояние обработки вызова. Может быть: NO ANSWER, FAILED, BUSY, ANSWEREDили UNKNOWN.
Поля CDRзаписей могут быть назначены в диалплане Asterisk функцией CDR() ().
Функция CDR() также может быть использована для установки полей CDR, которые определяются пользователем.
exten => 177,1,Verbose(Call start time: ${CDR(start)})
same => n,Set(CDR(userfield)=red_eyes)
Также можно добавить собственные поля:
exten => 177,1,NoOp()
same => n,Set(CDR(mycustomfield)=greentea)
same => n,Verbose(I need some more ${CDR(mycustomfield)})
Если создано кастомное поле CDR, в базе данных тоже потребуется дополнительное поле.
Приложения и функции диалплана связанные с CDR
ForkCDR: Разделить запись CDRтекущего канала . NoCDR: Не сохранять CDRдля текущего вызова. ResetCDR: Сбросить CDRдля текущего канала. function 'CDR': Задать пользовательское значение CDRв канале. Не работает для Read Onlyполей CDR.
Сохранять или нет информацию о неотвеченных вызовах. Не касается внешних вызовов. О них сохраняется полная информация, независимо от значения данной опции.
endbeforehexten
no
Закрыть и сохранить запись CDRдо выполнения расширения 'h' (hangup). Если значение - 'no', закрытие CDRпроизойдет, только по завершению всех шагов диалплана. Если - 'yes', при завершении вызова, независимо от того продолжается выполнение диалплана в контексте или нет
initiatedseconds
no
По умолчанию 'billsec' вычисляется, просто как разница 'end' минус 'answer' в секундах. Включение опции initiatedseconds=yes, укажет Asterisk использовать точные значения до микросекунд
batch
no
Записывать CDRгруппой, вместо записи каждого вызова отдельно. Снижает нагрузку на Asterisk. Зависит от перечисленных ниже опций.
size
100
Кол-во строк CDRв буфере, при достижении которого, будет произведена запись.
time
300
Предел времени хранения данных в буфере. Запись будет произведена, независимо от порога строк в буфере, заданного параметром size.
scheduleronly
no
Set whether CDR batch processing should be done by spawning a new thread, or within the context of the CDR batch scheduler. The default value is no, and we recommend not changing it.
safeshutdown
yes
Блокировать остановку Asterisk, пока буфер не очищен (данные сохранены).Предотвращает потерю данных, при корректномвыключении Asterisk.
backends
Модули баз данных предоставляют различные бакенды для записи CDR. Все они требуют специфических настроек.
Проверка подключенных backends: CLI>cdr show status
Call Detail Record (CDR) settings
----------------------------------
Logging: Enabled
Mode: Simple
Log unanswered calls: No
Log congestion: No
* Registered Backends
-------------------
mysql
Adaptive ODBC
cdr-custom
cdr_adaptive_odbc
Как следует из названия, модуль cdr_adaptive_odbc сохраняет CDRв базу данных через ODBC.
«adaptive» в данном случае означает, что она пытается приспособиться к структуре таблицы: нет статической структуры таблиц, которые должны быть использованы с этим модулем.
Когда модуль загружен (или при перезагрузке), он читает структуру таблицы. Он ищет имя столбца, которому соответствует переменная CDR.
Это относится как к встроенным CDRпеременным, так и к пользовательским переменным.
Например, чтобы передавать данные из встроенной переменной CDRchannel, в таблице базы данных должен быть столбец channel.
пример:
Добавим в кастомную CDRпеременную useragentзначение равное номеру SIPтелефона.
Чтобы данные переменной useragentбыли занесены через cdr_adaptive_odbc, надо создать столбец useragentв БД.
В файле конфигурации cdr_adaptive_odbc можно создать множество таблиц. Имя секции может быть любым, модуль не использует его. Вот пример простой конфигурации таблицы:
Данный модуль используется для создания пользовательского (custom) CSV файла.
Конфигурационный файл модуля cdr_custom.conf.
Единственная секция [mappings] может быть использована в этом файле. Шаблон задается с помощью функций диалплана Asterisk.
В следующем примере cdr_customсоздает файл /var/log/asterisk/cdr-custom/Master.csv. Шаблон использует функции function 'CDR'() для извлечения значений и
function 'CSV_QUOTE'() обеспечивающую правильное форматирование CSV файла (${CSV_QUOTE(${CDR(lastdata)})}).
Файл конфигурации - cdr_mysql.conf
Данный модуль для сохранения CDRв MySQL. В новых системах рекомендуется, по возможности, использовать модуль cdr_adaptive_odbc.
cdr_odbc
Файл конфигурации - cdr_odbc.conf
Модуль для сохранения CDRчерез ODBC драйвер. В новых системах рекомендуется, по возможности, использовать модуль cdr_adaptive_odbc.
cdr_pgsql
Файл конфигурации - cdr_pgsql.conf
Модуль для сохранения CDRв базу данных PostgreSQL. В новых системах рекомендуется, по возможности, использовать модуль cdr_adaptive_odbc.
CDRбакенд для сохранения данных в SQLite БД версии 3. База данных создается модулем, как /var/log/asterisk/master.db
Данный модуль использует конфигурационный файл cdr_sqlite3_custom.conf.
Конфигурация указывает имя таблицы CDRи пользовательские переменные, если требуется.
Spoiler
[master]
table = cdr
;
; List the column names to use when inserting CDRs.
;
columns => calldate, clid, dcontext, channel, dstchannel, lastapp, lastdata,
duration, billsec, disposition, amaflags, accountcode, uniqueid, userfield,
test
;
; Map CDR contents to the previously specified columns.
;
values => '${CDR(start)}','${CDR(clid)}','${CDR(dcontext)}','${CDR(channel)}','${CDR(dstchannel)}','${CDR(lastapp)}','${CDR(lastdata)}','${CDR(duration)}','${CDR(billsec)}','${CDR(disposition)}','${CDR(amaflags)}','${CDR(accountcode)}','${CDR(uniqueid)}','${CDR(userfield)}','${CDR(test)}'
In the cdr_sqlite3_custom.conf file, the contents of the columns and values options must each be on a single line.
cdr_syslog
Сохраняет CDRиспользуя syslog linux. Чтобы включить данную возможность, сперва добавьте запись в конфиг syslog, /etc/syslog.conf.
Например:
cdr_tdsмодуль использует FreeTDS библиотеку для отправки CDR Microsoft SQL Server или Sybase БД.
FreeTDS возможно использовать с unixODBC, так что конфигурация может быть сделана и в cdr_adaptive_odbc.
Реалтайм Архитектура Asterisk - набор драйверов и функций для конфигурации в режиме реального времени.
Существует два типаконфигурации - статический и динамический:
- Статический хранит конфигурации в БД, как конфигурационные файлы и также обновляет данные при перезагрузке модулей.
- Динамический используется для создания и обновления объектов в режиме реального времени, при совершении вызовов.
Оба режима могут использоваться одновременно.
Реалтайм архитектура поддерживает разные типы хранилищ.
В данный момент, большинство драйверов основаны на SQL,
но есть и поддержка других методов, например LDAPи CURL.
В данный момент поддерживаются следующие бэкенды:
ODBC: при помощи UnixODBC, интегрированная в Asterisk UnixODBC подсистема поддерживает множество разных БД.
MySQL: нативная поддержка MySQL, интегрирована в Asterisk
PostgreSQL: нативная поддержка PostgreSQL, интегрирована в Asterisk
SQLite и SQLite3: для небольших БД можно использовать SQLite3.
LDAP: получайте учетные данные из LDAPдиректорий.
cURL: Получайте и отправляйте данные веб приложений и связанных с ними БД.
Статическая конфигурация
Использует базы данных, как хранилище статических конфигураций.
Конфигурации обновляются при загрузке модулей, как и в случае с
конфигурационными файлами.
Все настройки записываются под одной категорией - [settings]
Конфиг ⇒ Драйвер БД, база данных, таблица базы данных.
Если таблица не указана, будет использовано имя конф. файла.
file.conf => driver,database[,table[,priority]]
Пример записи для загрузки 'queues.conf' через ODBC и 'extensions.conf' из SQlite:
Следующие конфиги НЕ МОГУТбыть использованы в реалтайм хранилище:
asterisk.conf
extconfig.conf (данный файл)
logger.conf
Также, некоторые конфиги не загрузятся из Realtime хранилища,
если драйвер БД (хранилища) не был, ранее,
загружен оператором 'preload' в конфиге 'modules.conf':
manager.conf
cdr.conf
rtp.conf
features.conf
cel.conf
indications.conf
Списки контроля доступа (ACL) также не смогут быть использованы
в manager.conf без предварительной загрузки драйвера хранилища. /etc/asterisk/modules.conf
Структура статической таблицы БД реалтайм архитектуры Asterisk
значительно отличается от, собственно, Realtimeтаблиц.
Она предполагает единую схему для всех подключаемых конфигов.
static ast_config.sql
create table ast_config (
id int(11) NOT NULL auto_increment,
cat_metric int(11) NOT NULL default '0',
var_metric int(11) NOT NULL default '0',
commented int(11) NOT NULL default '0',
filename varchar(128) NOT NULL default '',
category varchar(128) NOT NULL default '',
var_name varchar(128) NOT NULL default '',
var_val varchar(128) NOT NULL default '',
PRIMARY KEY (id),
KEY `filename_comment` (`filename`,`commented`)
)ENGINE = InnoDB;
'cat_metric' и 'var_metric' определяют порядок (очередность). 'cat_metric' во всей конфигурации, а 'var_metric', внутри категории. Метрика с меньшим значением представляется раньше, метрика с большим позднее. На примере порядка выбора кодеков в sip.conf, это будет работать так: 'disallow=all' - метрика 0 представляется 1-й, затем 'allow=alaw' - метрика 1 и далее 'allow=g729'
Если поле 'commented' не равно '0', строка считается закомметированной и игнорируется.
`filename` - Конфиг которому предназначены данные (например extensions.conf).
'category' - контекст диалплана или категория конфига.
; Realtime configuration engine
;
; maps a particular family of realtime
; configuration to a given database driver,
; database and table (or uses the name of
; the family if the table is not specified
;
;example => odbc,asterisk,alttable,1
;example => mysql,asterisk,alttable,2
;example2 => ldap,"dc=oxymium,dc=net",example2
;
; Additionally, priorities are now supported for use as failover methods
; for retrieving realtime data. If one connection fails to retrieve any
; information, the next sequential priority will be tried next. This
; especially works well with ODBC connections, since res_odbc now caches
; when connection failures occur and prevents immediately retrying those
; connections until after a specified timeout. Note: priorities must
; start at 1 and be sequential (i.e. if you have only priorities 1, 2,
; and 4, then 4 will be ignored, because there is no 3).
;
;
; Possible driver backends:
;
; "odbc" is shown in the examples below, but is not the only valid realtime
; engine. Here are several of the possible options:
; odbc ... res_config_odbc
; sqlite ... res_config_sqlite
; sqlite3 ... res_config_sqlite3
; pgsql ... res_config_pgsql
; curl ... res_config_curl
; ldap ... res_config_ldap
; mysql ... res_config_mysql (available via add-ons in menuselect)
;
; Note: The res_config_pgsql and res_config_sqlite backends configure the
; database used in their respective configuration files and ignore the
; database name configured in this file.
;
;iaxusers => odbc,asterisk
;iaxpeers => odbc,asterisk
;sippeers => odbc,asterisk
;sipregs => odbc,asterisk ; (avoid sipregs if possible, e.g. by using a view)
;ps_endpoints => odbc,asterisk
;ps_auths => odbc,asterisk
;ps_aors => odbc,asterisk
;ps_domain_aliases => odbc,asterisk
;ps_endpoint_id_ips => odbc,asterisk
;voicemail => odbc,asterisk
;extensions => odbc,asterisk
;meetme => mysql,general
;queues => odbc,asterisk
;queue_members => odbc,asterisk
;queue_rules => odbc,asterisk
;acls => odbc,asterisk
;musiconhold => mysql,general
;queue_log => mysql,general
;
;
; While most dynamic realtime engines are automatically used when defined in
; this file, 'extensions', distinctively, is not. To activate dynamic realtime
; extensions, you must turn them on in each respective context within
; extensions.conf with a switch statement. The syntax is:
; switch => Realtime/[[db_context@]tablename]/<opts>
; The only option available currently is the 'p' option, which disallows
; extension pattern queries to the database. If you have no patterns defined
; in a particular context, this will save quite a bit of CPU time. However,
; note that using dynamic realtime extensions is not recommended anymore as a
; best practice; instead, you should consider writing a static dialplan with
; proper data abstraction via a tool like func_odbc.