воскресенье, 30 декабря 2012 г.

Востанавливаем „убитый“ FritzBox




Автор:    Alex Gilz
11.04.2011 22:07

Вариант 1, Recovery.exe

      AVM предлагает программы восстановления боксов различных моделей, с помощью которых можно восстановить Box который не отвечает на запросы. В интернете можно найти программу recovery.exe (ftp://ftp.avm.de) которая поможет вам в этом начинании. Найти необходимый имидж на сервере довольно просто, в папке для нужной модели лежит актуальная бета прошивка для скачивания, а в самораспаковывающемся архиве найдется также подходящий файлик для восстановления  Box’a.
   Для восстановления необходимо подключить бокс напрямую к компьютеру. При первом старте recovery.exe изменяет один параметр в реестре и просит перезапустить компьютер. Изменения в реестре касаются DHCP-Mediasensing что позволяет ускорить обмен сетевых настроек. После рестарта компьютера программа предложит включить FritzBox, далее следует попытка распознания сетевого физического интерфейса и пробное соединение с Bootloader ADAM2 бокса. 
    Иногда приходится повторять этот шаг несколько раз, не отчаивайтесь, если не получилось с первого раза. Так как во время восстановления полностью стирается Flash и все предидущие установки стираются.

Вариант 2. Ручная установка.


      Все действия которые проделывает программа восстановления можно провести в ручном режиме, но только в том случае если recovery.exe не помогла либо вы являетесь специалистом и знаете на что идете. Дело в том что во время старта Bootloader ADAM2 включает, на короткий промежуток времени (несколько секунд), FTP-Server который доступен по адресу 192.168.178.1. Трюк заключается в том что бы отослать команду FTP-Connect в нужное время, если же во временном интервале не последовало FTP команды на соединение, то Bootloader  передает управление в Linux FritzBox. 
      Кстати эту процедуру можно опробовать и на рабочем боксе, тогда в критической ситуации у вас уже будет навык и чувство времени когда надо делать подключение. Перед началом надо убедится что сетевые установки компьютера верны. 

Итак IP: 192.168.178.2, сетевая маска 255.255.255.0 

Запускаем CMD  и задаем ftp 192.168.178.1, после этого включаем FritzBox. Как только на компьютере в первый раз появится „сетевое соединение“ нажимаем Enter. Если вы получили приглашение на ввод имени пользователя значит у вас получилось, в противном случае придется повторить процедуру сначала. Имя  пользователя и пароль „adam2“.
Так же как и в первом варианте предварительно не мешало бы отключить DHCPMediaSense, для этого необходимо добавить в ключ

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters

Новую переменную REG_DWORD с именем DisableDHCPMediaSense и значением 1. 
После этого необходимо перестартовать ПК.  Этот трюк позволяет несколько увеличить временной интервал на который включается FTP сервер. Что именно изменяется в системе с изменением параметра в регистре я описывать не буду, это можно найти в интернете, но после успешного восстановления желательно удалить этот ключ из реестра.
Перед тем как начать работу с  ADAM2 рассмотрим устройство системы FritzBox’a.

mtd0: Filesystem, root, 3 bis ca. 6 MByte
mtd1: Linux Kernel, 704 KByte
mtd2: ADAM2 Bootloader, 64 KByte
mtd3, mtd4: 2 блока по 128 или 256 KByte (TFFS) для записи конфигурации

Следующая команда показывает расположение блоков с стартовыми и конечными адресами на рабочем боксе если вы зайдете на бокс через telnet.

cat /proc/sys/dev/adam2/environment

в некоторых моделях объеденены блоки файловой системы mtd0 и ядра mtd1, в этом случае стартовые и конечные адреса идентичны и их размер равен 0.  mtd1 в данном случае заметно больше по объему.

И так мы уже залогинились в  ADAM2 при помощи команды

quote GETENV mtd0   можно посмотреть размер блока mtd0.

      В принципе теперь просто необходимо переписать блоки 0 и 1 рабочим имиджем. Как это сделать?
Решение довольно простое. Оба блока имеются в наличии в имидже который вы скачали с сервераAVM.  Несмотря на то что скачаный файл имеет расширение .image
    По своей структуре это обыкновенный .tar файл. Переименуем его в tar и откроем допустим WinRar’ом. Нам необходимы два файла kernel.image и  filesystem.imageВ моделях где 2 блока объединены размер filesystem.image равен 0.
Теперь необходимо залить в нужное место флеш-памяти  эти два файла.

Заливаем Kernel-Update.

      В боксах в которых файловая система и ядро разделены на 2 блока, как минимум заливка ядра проходит без проблем. Последовательность команд следуюшая:

debug
bin
quote MEDIA FLSH
put kernel.image “kernel.image mtd1“

      Не паникуйте если не увидите никакой реакции на экране, команде put требуется порядка 30 сек и более, перед тем как начнется заливка блок должен быть подготовлен (стерт). После этого начинается сама заливка и все происходит за считанные секунды. 
     Далее следует заливка для 2 блока (файловая система). Тот кто думает что все пройдет также легко, глубоко ошибается. Во первых блок намного больше по размеру соответственно чистка флеша займет больше времени, за это время FTP-Client оборвет соединение по timeout’у, кроме того ADAM2-FTP переваривает только небольшие пакеты не более 1 Mbyte, при передаче более емких пакетов он просто загибается. 
     Но и тут имеется решение, необходимо разделить весь filesystem.image на дольки которые бы можно было передать не опасаясь обрыва соединения. Для дележки можно использовать HJSplit. На практике очень хорошо себя показали дольки по 512 Kbyte и так делим весь файл на части по 512, получится порядка 6 частей. Перед тем как мы начнем заливку в бокс необходимо рассчитать стартовый и конечный адрес для каждой части в отдельности.
Наберите комманду

qoute GETENV mtd0

с помощью ее мы узнаем длинну всего блока, например (0x900C0000 bis 0x903C0000)  но перед тем как загружать части нашего имеджа надо, проведем корректировку, так как мы записываем не весь блок целиком, а только его часть. 
Стартовый адрес остается 0x900C0000 , но конечный теперь 0x9014000Соответственно необходимо поменять и системную переменную с помощью команды

quote SETENV mtd0,0x900C0000,0x9014000

Теперь можно загрузить первую часть

debug
bin
quote SETENV mtd0,0x900C0000,0x90140000
quote MEDIA FLSH
put filesystem.image.001 “filesystem.image.001 mtd0“

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

debug
bin
quote SETENV mtd0,0x90140000,0x901C0000
quote MEDIA FLSH
put filesystem.image.002 “filesystem.image.002 mtd0“

и так далее для оставшихся частей. После этого бокс перезагрузится и ему потребуется несколько попыток пока он правильно стартует, дайте ему около 5 минут.
Если во время загрузки отдельных частей бокс вдруг перестартовал, то надо продолжить с той части которая была последней при загрузке, работенка нудная, но если вам нужен бокс снова придется потерпеть.
На это все.

Это свободный перевод статьи из журнала techchannel.


пятница, 28 декабря 2012 г.

Искусство Asterisk  Диалпланы
Сегодня поговорим о структуре "сердца" Asterisk - файла диалпланов extensions.conf.
Именно в этом файле мы определяем, как будет вести себя asterisk при входящих и исходящих вызовах. По сути, он состоит из списка инструкций или шагов, которым будет следовать Asterisk. В отличие от традиционных систем телефонной связи, диалплан Asterisk является полностью настраиваемым. Чтобы добиться успеха в построении собственной системы Asterisk, необходимо понять концепцию диалплана. Если вы пытались прочитать некоторые примеры диалпланов и сочли их невыполнимыми или пробовали написать диалплан Asterisk и не достигли успеха, не отчаивайтесь, сейчас мы все попробуем разобрать.
Диалплан состоит из четырех основных элементов: контекстов, добавочных номеров, приоритетов и приложений. Мы рассмотрим все эти части и то, как они работают вместе. После объяснения роли каждого из этих элементов в диалплане перейдем к процессу поэтапного создания базового функционального диалплана.

Контексты

Диалпланы разбиты на разделы, называемые контекстами. Контексты – это именованные группы добавочных номеров, которые выполняют несколько функций.
Контексты изолируют разные части диалплана, предотвращая возможность их взаимодействия. Добавочный номер, определенный в одном контексте, полностью изолирован от добавочных номеров другого контекста, если только взаимодействие не разрешено специально.
Контексты различаются по именам. Имена контекстов заключаются в квадратные скобки ([ ]). Допустимыми символами для образования имени являются буквы от A до Z (верхнего и нижнего регистра), цифры от 0 до 9, дефис и символ подчеркивания. Например, контекст для входящих вызовов может выглядеть так:
[incoming]
Все инструкции, размещаемые после описания контекста и до описания следующего контекста, являются частью данного контекста. В начале диалплана находятся два специальных контекста, [general] и [globals].
Раздел [general] содержит список общих настроек диалплана (о которых, вероятно, вам никогда не придется беспокоиться), а о контексте [globals] мы поговорим в другой статье, когда речь пойдет о «Глобальных переменных». Пока что достаточно знать, что эти два контекста являются специальными. Созданные вами контексты можно называть как угодно, только не используйте имена [general] и [globals]!
При описании канала (а именно так выполняется подключение элементов к системе) одним из параметров этого описания является контекст. Иначе говоря, контекст – это точка диалплана, с которой будет начинаться обработка соединений, выполняемых через этот канал.
Другое важное применение контекстов (возможно, самое важное) – обеспечение безопасности. Правильно применяя контексты, определенным абонентам можно предоставить доступ к функциям (таким, как междугородная связь), которые недоступны для других. Если диалплан разработан неаккуратно, пользователи из-за ваших же косяков могут получить возможность мошенничать в вашей системе.

Добавочные номера

В мире телекоммуникаций термин «добавочный номер» (extension) обычно обозначает числовой идентификатор, который присвоен линии, идущей к конкретному телефону. Однако в Asterisk это намного более широкое понятие, поскольку оно определяет уникальные последовательности шагов (каждый шаг включает приложение), которые
Asterisk будет применять к вызову по этой линии. В каждом контексте может быть задано столько добавочных номеров, сколько требуется.
При вызове конкретного добавочного номера (входящим или внутренним звонком) Asterisk будет выполнять шаги, определенные для этого добавочного номера. Поэтому именно добавочные номера определяют, что происходит со звонками при их обработке соответственно диалплану.
Синтаксис добавочного номера – это слово exten, за которым следует стрелка, образованная знаками равенства и «больше чем»:
exten =>
Далее указывается имя (или номер). В традиционных системах телефонной связи под добавочными номерами мы понимаем цифры, которые надо набрать, чтобы другой телефон зазвонил.
Полный добавочный номер состоит из трех компонентов:

  • Имени (или номера).
  • Приоритета (каждый добавочный номер может включать множество шагов; порядковый номер шага называется его приоритетом).
  • Приложения (или команды), которое выполняет некоторое действие над вызовом.
Эти три компонента разделяются запятыми:
exten => имя,приоритет,приложение()
Вот пример того, как может выглядеть настоящий добавочный номер:
exten => 123,1,Answer()
В этом примере имя добавочного номера – 123, приоритет – 1, а приложение – Answer(). Теперь пойдем дальше и рассмотрим, что такое приоритеты и приложения.

Приоритеты

Каждый добавочный номер может включать множество шагов, называемых приоритетами. Каждый приоритет пронумерован последовательно, начиная с 1, и выполняет одно определенное приложение. Например, следующий добавочный номер отвечает на звонок (в приоритете под номером 1) и затем выполняет разъединение (в приоритете под
номером 2):
exten => 123,1,Answer()
exten => 123,2,Hangup()
Не переживайте, если вы не понимаете, что такое Answer() и Hangup(), мы очень скоро их рассмотрим. Здесь главное – запомнить, что для отдельного добавочного номера Asterisk выполняет приоритеты по порядку.

Ненумерованные приоритеты

Начиная с версии 1.2 Asterisk был введен приоритет n, что означает «следующий». Каждый раз, когда Asterisk встречает приоритет n, она берет номер предыдущего приоритета и добавляет 1. Это упрощает внесение изменений в диалплан, поскольку
теперь не надо изменять номера всех шагов. Например, диалплан может быть таким:
exten => 123,1,Answer()
exten => 123,n,выполнить что-то
exten => 123,n,выполнить что-то еще
exten => 123,n,выполнить последнее
exten => 123,n,Hangup()
Asterisk будет самостоятельно вычислять номер следующего приоритета при каждой встрече с приоритетом n. Однако следует отметить, что приоритет под номером 1 должен быть задан обязательно. Если случайно для идущего первым приоритета задать n вместо 1, добавочный номер будет недоступен.

Приложения

Приложения – это рабочие лошадки диалплана. Каждое приложение выполняет определенное действие над данным каналом, например воспроизведение звука, прием тонального ввода, вызов канала, разрыв соединения и т. д. В предыдущем примере было представлено два простых приложения: Answer() и Hangup(). Сейчас мы подробнее рассмотрим, как они работают.
Для выполнения некоторых приложений, таких как Answer() и Hangup(), не требуется никаких дополнительных инструкций. Некоторым приложениям необходима дополнительная информация. Эти данные, называемые аргументами, могут передаваться в приложения, чтобы оказывать влияние на то, как они выполняют свои действия. Чтобы передать аргументы в приложение, разместите их через запятую в круглых скобках, следующих за именем приложения.

Простой диалплан

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

Добавочный номер s

Прежде чем приступить к настройке диалплана, придется остановиться еще на одном вопросе. Необходимо рассмотреть добавочный номер s. Когда в контекст поступают вызовы, для которых не указан конкретный добавочный номер, они передаются на добавочный номер s. (s – сокращение от start (начало), поскольку именно здесь начнется обработка вызова, если с ним не передана информация о добавочном номере.)
Поскольку это именно то, что требуется для нашего диалплана, перейдем к делу. Для каждого вызова будет выполняться три действия (ответ на него, воспроизведение звукового файла и разъединение), поэтому добавочному номеру s понадобится три приоритета. Поместим три приоритета в контекст [incoming], поскольку было принято реше-
ние о том, что все входящие вызовы должны обрабатываться в этом контексте.
[incoming]
exten => s,1,приложение()
exten => s,n,приложение()
exten => s,n,приложение()
Теперь осталось только вставить приложения – и наш первый диалплан готов.

Приложения Answer(), Playback() и Hangup()

Прежде чем мы будем отвечать на звонок, воспроизводить звуковой файл и затем выполнять разъединение вызова, нам нужно научиться это делать. Приложение Answer() (Ответ) используется для ответа каналу, по которому выполняется звонок. Оно выполняет исходную настройку для канала, получающего входящий вызов. (Некоторые приложения не требуют обязательного ответа каналу, но соответствующий ответ на звонок перед тем, как выполнять какие-либо действия над каналом, является очень хорошей практикой.)
Как упоминалось ранее, Answer() не принимает аргументов. Приложение Playback() (Воспроизведение) воспроизводит в канале предварительно записанный звуковой файл. При использовании приложения Playback() ввод, поступающий от пользователя, просто игнорируется.
Чтобы использовать Playback(), задайте в качестве аргумента имя файла (без расширения). Например, Playback(filename) обеспечит воспроизведение звукового файла filename.gsm (о форматах и кодеках разговор будет в другой статье), предполагая, что он размещен в стандартной папке для звуковых файлов. Обратите внимание, что по желанию можно указать и полный путь к файлу.
Приложение Hangup() (Разъединить) выполняет именно то, что подразумевается под его именем: оно разъединяет активный канал. Это приложение должно применяться в конце контекста для завершения текущего вызова, что защитит от несанкционированного использования диалплана абонентами. Приложение Hangup() не принимает аргументов.


Наш первый диалплан
Теперь, когда добавочный номер готов, сведем все вместе и создадим наш первый диалплан.
В первом приоритете нашего добавочного номера мы будем отвечать на звонок, во втором – воспроизводить звуковой файл hello-world.gsm, а в третьем будет выполнен разрыв соединения. Вот как выглядит диалплан:
[incoming]
exten => s,1,Answer()
exten => s,n,Playback(hello-world)
exten => s,n,Hangup()
Даже несмотря на то что этот пример очень мал и прост, он раскрывает основные принципы контекстов, добавочных номеров, приоритетов и приложений. Если все получилось и этот диалплан заработал, значит, вы разобрались с основами, на базе которых создаются все диалпланы.

Создание интерактивного диалплана
Созданный в предыдущей части диалплан был статическим; он всегда выполняет одни и те же действия для всех вызовов. Теперь мы собираемся добавить некоторую логику в диалплан, чтобы он осуществлял разные действия на основании ввода пользователя. Для этого необходимо рассмотреть еще некоторые приложения.

Приложения Background(), WaitExten() и Goto()
Один из самых важных ключей к построению интерактивных диалпланов Asterisk – приложение Background()(Фон). Как и Playback(), это приложение воспроизводит записанный звуковой файл. Однако, в отличие от Playback(), если пользователь нажимает кнопку (или последовательность кнопок) на клавиатуре телефона, оно прерывает воспроизведение и переходит к добавочному номеру соответственно нажатым цифрам. Например, если абонент нажмет кнопку 5, Asterisk прекратит воспроизводить звуковое сообщение и передаст управление вызовом первому приоритету добавочного номера 5.
Чаще всего приложение Background() используется для создания голосовых меню (которые часто называют автоответчиками или интерактивными секретарями). Многие компании используют голосовые меню для направления абонентов на соответствующий добавочный номер, таким образом освобождая своих секретарей от необходимости отвечать на все звонки.
Синтаксис Background() аналогичен синтаксису Playback():
exten => 123,1,Answer()
exten => 123,n,Background(main-menu)
В более ранних версиях Asterisk, если приложение Background() завершало воспроизведение звукового сообщения и в текущем добавочном номере больше не было приоритетов, Asterisk ничего не делала и ожидала ввода абонента. Такое поведение больше не является для Asterisk принятым по умолчанию. Если требуется, чтобы Asterisk ожидала ввода абонента после завершения воспроизведения звукового сообщения, можно вызвать приложение WaitExten() (Ожидание добавочного номера). Приложение WaitExten() ожидает от абонента набора телефонного номера и часто вызывается сразу после приложения Background(), как в данном фрагменте диалплана:
exten => 123,1,Answer()
exten => 123,n,Background(main-menu)
exten => 123,n,WaitExten()
Если требуется, чтобы приложение WaitExten() ожидало ответа в течение определенного времени (вместо использования времени ожидания по умолчанию), просто укажите число, соответствующее необходимому количеству секунд, в качестве первого аргумента в WaitExten():
exten => 123,n,WaitExten(5)
И Background(), и WaitExten() позволяют абоненту производить набор номера. После этого Asterisk пытается найти в текущем контексте добавочный номер, соответствующий введенным абонентом цифрам. Если Asterisk находит однозначное соответствие, она направляет вызов на этот добавочный номер. Продемонстрируем это, добавив несколько строк в наш пример:
exten => 123,1,Answer()
exten => 123,n,Background(main-menu)
exten => 123,n,WaitExten()
exten => 2,1,Playback(digits/2)
exten => 3,1,Playback(digits/3)
exten => 4,1,Playback(digits/4)
Если вызвать добавочный номер 123 из примера выше, он воспроизведет звуковое сообщение с фразой «main menu» (главное меню) и после этого будет ожидать ввода цифр 2, 3 или 4. Если нажать одну из этих цифр, Asterisk воспроизведет ее для вас. Также вы обнаружите, что, если ввести другую цифру (например, 5), Asterisk не обеспечит ожида-
емого результата.
Также возможна ситуация, когда Asterisk обнаружит неоднозначное соответствие. Это можно легко продемонстрировать, введя в предыдущий пример добавочный номер под именем 1:
exten => 123,1,Answer()
exten => 123,n,Background(main-menu)
exten => 123,n,WaitExten()
exten => 1,1,Playback(digits/1)
exten => 2,1,Playback(digits/2)
exten => 3,1,Playback(digits/3)
exten => 4,1,Playback(digits/4)
Наберите добавочный номер 123 и затем по подсказке главного меню введите 1. Почему Asterisk сразу же не воспроизводит этот номер? Потому, что цифра 1 неоднозначна; Asterisk не понимает, какой добавочный номер вызывается, 1 или 123. Он ожидает несколько секунд ввода другой цифры (например, 2 для вызова добавочного номера 123). Если набора никаких других цифр не последовало, по завершении времени
ожидания Asterisk направляет вызов на добавочный номер 1. (Задавать собственные значения времени ожидания мы научимся посже)
Прежде чем двигаться дальше, посмотрим, что было сделано на данный момент. Вызвав наш диалплан, абоненты услышат приветствие. Если они нажмут 1, то услышат номер 1, если 2 – то номер 2 и т. д. Для начала это неплохо, но давайте это все немного усовершенствуем. С помощью приложения Goto() (Перейти к) заставим диалплан повторять приветствие после воспроизведения номера.
Как следует из его имени, приложение Goto() используется для перенаправления вызова в другую часть диалплана. Синтаксис Goto() требует передачи в него в качестве аргументов целевого контекста, добавочного номера и приоритета:
exten => 123,n,Goto(контекст,добавочныйномер,приоритет)
Теперь давайте применим приложение Goto() в нашем диалплане:
[incoming]
exten => 123,1,Answer()
exten => 123,n,Background(main-menu)
exten => 1,1,Playback(digits/1)
exten => 1,n,Goto(incoming,123,1)
exten => 2,1,Playback(digits/2)
exten => 2,n,Goto(incoming,123,1)
Две новые строки обеспечат возвращение управления над вызовом добавочному номеру 123 после воспроизведения выбранного номера.

Обработка ошибочных вводов и времени ожидания
Теперь, когда создание нашего первого голосового меню уже близится к завершению, введем специальные добавочные номера. Во-первых, нам необходим добавочный номер для недействительных вводов; когда абонент нажимает не ту кнопку (например, 9 для предыдущего примера), вызов направляется на добавочный номер i. Во-вторых, необходим
добавочный номер для обработки ситуаций, когда абонент не производит ввод вовремя (время ожидания по умолчанию – 10 с). Если абонент слишком долго не нажимает кнопку после запуска приложения WaitExten(), вызовы направляются на добавочный номер t. Вот как будет выглядеть диалплан после введения этих двух добавочных номеров:
[incoming]
exten => 123,1,Answer()
exten => 123,n,Background(enter-ext-of-person)
exten => 123,n,WaitExten()
exten => 1,1,Playback(digits/1)
exten => 1,n,Goto(incoming,123,1)
exten => 2,1,Playback(digits/2)
exten => 2,n,Goto(incoming,123,1)
exten => 3,1,Playback(digits/3)
exten => 3,n,Goto(incoming,123,1)
exten => i,1,Playback(pbx-invalid)
exten => i,n,Goto(incoming,123,1)
exten => t,1,Playback(vm-goodbye)
exten => t,n,Hangup()
Использование добавочных номеров i и t делает диалплан несколько более надежным и практичным. Но надо сказать, он по-прежнему довольно примитивен, потому что внешние абоненты не имеют возможности соединения с реальным живым человеком. Для этого нам придется ознакомиться с еще одним приложением – Dial() (Звонить).
Одно из самых ценных свойств Asterisk – это возможность установления соединения между разными абонентами. Это особенно полезно, когда абоненты используют разные методы связи. Например, абонент А может звонить по традиционной аналоговой телефонной линии, тогда как пользователь В может сидеть в кафе в другой части света и говорить по IP-телефону. К счастью, большую часть тяжелой работы по установлению соединения и выполнению преобразований между разными сетями Asterisk берет на себя. От вас требуется лишь научиться использовать приложение Dial().
Синтаксис Dial() немного сложнее, чем синтаксис приложений, которые применялись до сих пор, но не пугайтесь. Dial() принимает четыре аргумента. Первый – получатель вызова. Он состоит (в самой простой форме) из названия технологии (или транспортного протокола), с помощью которой выполняется вызов, символа слэш и имени удаленной
конечной точки или ресурса. Самыми широко используемыми типами технологий являются Zap (для аналоговых каналов и каналов T1/E1/J1), SIP и IAX2. Например, допустим, требуется вызвать конечную точку Zap, определенную как Zap/1, которая представляет собой FXS-канал с подключенным к нему аналоговым телефоном. Технология –
Zap, ресурс – 1. Аналогично, для вызова устройства SIP получателем вызова может быть SIP/Jane, а для устройства IAX – IAX2/Fred. Если бы потребовалось, чтобы при вызове добавочного номера 123 диалплана Asterisk звонил по каналу Zap/1, мы бы ввели следующий добавочный номер:
exten => 123,1,Dial(Zap/1)
Также можно звонить по нескольким каналам одновременно, объединяя получателей вызова с помощью символа амперсанда (&):
exten => 123,1,Dial(Zap/1&Zap/2&SIP/Jane)
Приложение Dial() будет дозваниваться всем заданным получателям вызовов одновременно и установит связь с любым из заданных каналов, который ответит первым. Если приложение не может связаться ни с одним вызываемым абонентом, Asterisk задаст переменной DIALSTATUS (статус звонка) значение, соответствующее ситуации невозможности дозвониться на вызываемые номера, и продолжит выполнение следующего приоритета добавочного номера.
Приложение Dial() также позволяет устанавливать связь с удаленной конечной точкой VoIP, которая не была предварительно описана в конфигурационных файлах канала. Вот полный синтаксис такого типа соединения:
Dial(технология/пользователь[:пароль]@удаленный_хост[:порт][/удаленный_доба-
вочный_номер])
В качестве примера можно позвонить на демонстрационный сервер Digium, который использует протокол IAX2, по следующему добавочному номеру:
exten => 500,1,Dial(IAX2/guest@misery.digium.com/s)
Полный синтаксис приложения Dial() для звоноков по каналам Zap немного иной, как показано ниже:
Dial(Zap/[gGrR]канал_или_группа[/удаленный_добавочный_номер])
Например, вот как описывался бы вызов номера 1-800-555-1212 по Zap-каналу под номером 4.
exten => 501,1,Dial(Zap/4/18005551212)
Второй аргумент приложения Dial() – время ожидания, задаваемое в секундах. Если время ожидания задано, Dial() будет пытаться дозвониться по заданным номерам в течение этого количества секунд, а потом перейдет к следующему приоритету добавочного номера. Если время ожидания не задано, Dial() будет дозваниваться на вызываемые
каналы до тех пор, пока кто-нибудь не ответит или пока вызывающий абонент не повесит трубку. Введем для нашего добавочного номера время ожидания 10 с:
exten => 123,1,Dial(Zap/1,10)
Если ответ на звонок получен до истечения времени ожидания, связь между каналами устанавливается и диалплан выполнен. Если вызываемый номер просто не отвечает, занят или недоступен по какой-то другой причине, Asterisk задаст переменную DIALSTATUS и перейдет к следующему приоритету добавочного номера.
Давайте применим то, что изучили на данный момент, в другом примере:
exten => 123,1,Dial(Zap/1,10)
exten => 123,n,Playback(vm-nobodyavail)
exten => 123,n,Hangup()
Как видите, этот пример будет воспроизводить звуковой файл vm-nobodyavail.gsm в случае, если звонок остается без ответа.
Третий аргумент Dial() – строка опций. Она может содержать один или более символов, влияющих на поведение приложения Dial(). Список возможных опций слишком велик, чтобы приводить его здесь ( о нем мы поговорим позже); рассмотрим лишь самую популярную из них – опцию m. Если указать m в качестве третьего аргумента, вызывающая сторона, пока выполняется дозвон до вызываемого абонента, будет слышать во время ожидания вместо гудков музыку (конечно, если эта музыка сконфигурирована правильно). Чтобы добавить опцию m в наш последний пример, просто
изменим первую строку:
exten => 123,1,Dial(Zap/1,10,m)
exten => 123,n,Playback(vm-nobodyavail)
exten => 123,n,Hangup()
Теперь, когда мы научились использовать приложение Dial(), добавочные номера 1 и 2 в диалплане стали бесполезными. Давайте заменим их новыми добавочными номерами, которые позволят внешним абонентам дозваниваться до Виталия (Vit) и Елены (Lena):
[incoming]
exten => 123,1,Answer()
exten => 123,n,Background(enter-ext-of-person)
exten => 123,n,WaitExten()
exten => 1,1,Dial(Zap/1,10)
exten => 1,n,Playback(vm-nobodyavail)
exten => 1,n,Hangup()
exten => 2,1,Dial(SIP/Lena,10)
exten => 2,n,Playback(vm-nobodyavail)
exten => 2,n,Hangup()
exten => i,1,Playback(pbx-invalid)
exten => i,n,Goto(incoming,123,1)
exten => t,1,Playback(vm-goodbye)
exten => t,n,Hangup()
Четвертый и последний аргумент приложения Dial() – URL. Если вызываемый канал поддерживает прием URL в момент вызова, заданный URL будет передан (например, если используется IP-телефон, поддерживающий прием URL, этот URL появится на дисплее телефона; аналогично, если используется программный телефон, URL может
быть выведен на экран монитора). Этот аргумент применяется очень редко.
Обратите внимание, что второй, третий и четвертый аргументы могут быть опущены. Например, если требуется определить опцию, но при этом вы не собираетесь задавать время ожидания, просто оставьте пропуск на месте аргумента времени ожидания, как в данном примере:
exten => 1,1,Dial(Zap/1,,m)




Кэширующий DNS в паре с Asterisk

Вчера повторно столкнулся с уже практически забытой проблемой, связанной с Asterisk и падением указанных в системе DNS серверов. Для новичка поведение системы при недоступности DNS будет просто шокирующим:

  • Внутренние телефоны теряют регистрацию, вне зависимости используют они DNS или нет
  • Нет регистрации на внешних серверах
  • Перезагрузка chan_sip происходит долго и “равно”

Я как решение предлагаю настроить кэширование DNS запросов на сервере с астериском и отслеживать работоспособность указанных в системе DNS серверов.
Я думал, что возникновение подобных ситуаций исправлено в 1.6, но это казалось не так. Если такая ситуация встретилась, то рекомендую настроить локальный кэширующий DNS-сервер. 
При отказе внешних серверов Астериск продолжит получать кэшированные результаты с локального DNS.
В named.conf прописать или раскомментировать следующие строки:
forwarders { 208.67.222.222; 208.67.220.220; };
listen-on port 53 { 127.0.0.1; };
 
После этого рестартовать BIND и посмотреть на результат. Естественно не забыть в настройках системы заменить уже прописанные DNS на 127.0.0.1.
В примере указаны серверы проекта OpenDNS. Можно конечно не настраивать локально DNS сервер, а прописать большее количество серверов в системе, на практике практически невозможна ситуация когда они откажут одновременно. Однако на на той же практике, канал в интернет бывает достаточно нестабилен и при каждом его отказе внешние DNS сервера будут недоступны, со всеми вытекающими.