Asterisk Managment Interface (AMI), Часть 2

Skip to end of metadata
Go to start of metadata

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

Полная версия статьи писалась и будет исправляться здесь

Подключение к интерфейсу AM

Для подключения к AMI, можно использовать программу telnet. Так выглядит приветствие системы:

$ telnet 127.0.0.1 5038
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Asterisk Call Manager/1.1

Далее набираем:

Action: login
Username: admin
Secret: passwd1234

два раза Enter, что равносильно вводу CRLF После, должны увидеть такой ответ (пакет Response):

Response: Success
Message: Authentication accepted

Что говорит нам о том, что мы удачно залогинились в интерфейс AMI. Во время успешного входа в AMI, в консоли Астериска мы увидим (в 1.4):

asterisk*CLI>
== Parsing '/etc/asterisk/manager.conf': Found
== Manager 'admin' logged on from 127.0.0.1

В 1.6 устранена необходимость считывать с диска конфигурацию при каждом подключении к AMI. Они считывается единожды при старте программы и может быть перечитана при перезагрузке (команды приведены выше).

Увидеть всех пользователей, соединенных в данный момент с интерфейсом AMI, можно из консоли Астериска:

*CLI> manager show connected

Замена пароля и выполнение команды 'manager reload' никак не влияют на права для уже установленных сессий AMI. Это означает что если в файле изменены пароль или права доступа, то эти изменения не затронут уже работающих с сервером клиентов

Если Вам не нужны события, генерируемые Астериском (их может быть очень много, что затруднить чтение в консоли ответов Астериска), то в параметры, передаваемые во время процедура аутентификации, можно включить еще запись

Events: off

Эта запись предотвратить посылку пакетов Event со стороны сервера в рамках установленного соединения

Чтобы завершить сессию подключения к AMI, необходимо выполнить:

Action: logoff

После чего мы увидим на экране telnet сессии:

Response: Goodbye
Message: Thanks for all the fish.

Во время завершения AMI сессии, в консоли Астериска мы можем увидеть следующее:

asterisk*CLI>
== Manager 'admin' logged off from 127.0.0.1

Примечание Естественно, AMI интерфейс не предназначен для того, чтобы вручную администратор с помощью клиента telnet и ему подобных, осуществлял соединение с сервером Астериск. Здесь этот пример показан исключительно как демонстрация возможностей и наглядности работы обмена пакетами Action, Event и Response. Однако такой подход может пригодиться при обучении и отладке действия той или иной команды.

Примечание Увидеть все команды, относящиеся к CLI интерфейсу управления Астериска AMI, можно набрав в консоли:

asterisk *CLI> help manager

Пароли при авторизации в AM

Важно понимать, что пароли, передаваемые при соединении с AMI интерфейсом передаются открытым текстом. Это может быть угрозой для работы сервиса Астериск. Чтобы скрыть передаваемый пароль, используют алгоритм md5. Использование алгоритм md5 никаким образом не снимает требований к безопасности, описанных выше. Если вы все-таки используете удаленное подключение даже в приватной сети, рекомендуется использовать запрос/ответ и алгоритм md5, принцип которого очень похож на аналогичную аутентификацию протокола HTTP и SIP. Для этого сначала вызываем действие Challenge (Запрос), который предоставит Вам маркер запроса:

Action: Challenge
AuthType: md5

Response: Success
Challenge: 84041345

После этого можно взять маркер полученного запроса и доваить в конце незашифрованный пароль и вычислить контрольную сумму результирующей строки по алгоритму md5. Результат может использоваться для регистрации без необходимости передачи секрета открытым текстом (plain text). Это будет выглядеть следующим образом:

Action: login
AuthType: MD5
Username: admin
Key: qwf32r23p98yvdspa9h4o4woaewv7

где Key — результирующая сумма.

Примечание md5 алгоритм на входе принимает любую длину символов и на выходе выдать 128-битный отпечаток (finger-print) или профиль сообщения (message digest), которое было подано на вход алгоритма. Гипотетически считается, что два сообщения, которые имеют один и тот же профиль сообщения или выработаны любым сообщением, имеют определенный профиль сообщения.

Message digest — коротка цифровая строка фиксированной длины, формируется из более длинного сообщения с использованием специального алгоритма. Алгоритм md5 назначен для цифровой подписи (digital signature) приложений, где большие файлы должны быть «сжаты» в безопасный способ, до того как они будут закриптованы с помощью публичного или скрытого ключа с помощью криптосистемы с открытым ключом, например RSA. Digital signature — цифровая подпись, которая является уникальным электронным идентификатором, обеспечивающим проверку сообщения с установлением подлинности отправителя и гарантии то, что документ не был изменен с момента подписания.

Пакеты Action

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

Action: <key 1>: <value 1>
<key 2>: <value 2>
.......

Приведем пример, как с помощью AMI интерфейса можно осуществить вызов (допустим сессия Manager'а уже установлена):

Action: Originate
Channel: SIP/2401
Context: incoming
Exten: 2401
Priority: 1
Callerid: 2401
Variable: ANSWER=1
Variable: _ACC=2

Необходимо, чтобы SIP пользователь 2401 присутствовал в системе и был зарегистрирован. После нажатия двух раз Enter, мы получили вызов на SIP-телефон. В это время в консоли Астериска получим такое:

Action: Originate
Channel: SIP/2401
Context: incoming
Exten: 2401
Priority: 1
Callerid: 2401
Variable: ANSWER=1
Variable: _ACC=2

Event: Newchannel
Privilege: call,all
Channel: SIP/2401-09a1f418
State: Down
CallerIDNum: CallerIDName: Uniqueid: 1237301090.1

Event: Newcallerid
Privilege: call,all
Channel: SIP/2401-09a1f418
CallerID: 2401
CallerIDName: Uniqueid: 1237301090.1
CID-CallingPres: 0 (Presentation Allowed, Not Screened)

Event: Newstate
Privilege: call,all
Channel: SIP/2401-09a1f418
State: Ringing
CallerID: 2401
CallerIDName: Uniqueid: 1237301090.1

Event: Hangup
Privilege: call,all
Channel: SIP/2401-09a1f418
Uniqueid: 1237301090.1
Cause: 19
Cause-txt: User alerting, no answer

Чтобы увидеть все события, которые ожидают отправки в Астериске, необходимо в CLI написать;

asterisk*CLI> manager show eventq

на что в ответ получим:

Usecount: 1
Category: 2
Event:
Event: Hangup
Privilege: call,all
Channel: SIP/2401-09a1f418
Uniqueid: 1237301603.2
Cause: 21
Cause-txt:

Как видно из примера, мы выполнили команду Originate, которая доступна в интерфейсе AMI. Более подробную информацию по каждой из команд AMI, можно увидеть выполнив в CLI команду:

asterisk *CLI> manager show command [имя_команды]

Уровни авторизации read и write

Параметры read и write в файле manager.conf задают уровни авторизации для различных классов команд AMI. Например, если для пользователя AMI определено в настройках manager.conf обе секции read и write без уровня авторизации «command», тогда этот пользователь не сможет выполнять те команды, для которых определены привилегии — privilege:command. Узнать, какой класс привилегий необходимо иметь, чтобы выполнить ту или иную AMI команду в Астериске, можно просмотрев описание этой команды в консоли Астериска:

asterisk*CLI> manager show command Command
Action: Command
Synopsis: Execute Asterisk CLI Command
Privilege: command,all
Description: Run a CLI command.
Variables: (Names marked with * are required)
*Command: Asterisk CLI command to run
ActionID: Optional Action id for message matching.

В выводе присутствует краткое описание (Synopsis) действия,выполняемого на Астериске. В Privilege говориться о том, какие привилегии должны быть установлены в manager.conf подключенному пользователю, чтобы выполнить ее в сессии AMI. Variables говорит нам о том, какие параметры возможно передать для успешной отработки команды. Команда обозначенная звездочкой — *Command, является обязательной (не во всех командах соблюден такой порядок обозначения), а вот [ActionID] — опционально.

Как было сказано выше, в manager.conf мы определяем пользователей AMI — список доступа (access list). Для каждого из пользователей со списка, необходимо определить множество событий (events) и действий (actions), которые этим пользователям будут давать доступ. Это задается директивами read/write. Read директива определяет те типы событий, которые отсылаются к пользователю AMI.

Write директива определяет, что для AMI пользователей разрешено инициировать действия, определенные этой директивой. Следующая информация по значениям для директивы read/write, должна пролить свет на их предназначение:

  • system — действия и события, которые относятся к ядру Астериска, такие как SIP пиры и БД;
  • call — действия и события, относящиеся непосредственно статусов экстеншинов, протекание и управление звонком;
  • log — Logging information, исходная документация не дает детальной информации о том, что именно определено событиями этого типа;
  • verbose - Verbose information, исходная документация не дает детальной информации о том, что именно определено событиями этого типа;
  • command — эта директива позволяет присоединенным пользователям отсылать команды в консоль CLI Астериска;
  • agent — действия и события, которые относятся к приложения очередей (queue);
  • user — определяет события, которые могут быть сгенерированы с номерного плана, используя приложение[UserEvent]. Использование событий этого типа является полезным средством для разработки приложений, которые соединяют номерной план, AGI, AMI одновременно;
  • config - возможность читать и записывать содержимое в конфигурационные файлы;
  • dtmf - получение DTMF событий (только чтение);
  • reporting - возможность получать информацию о системе;
  • cdr - результаты работы модуля cdr_manager (если загружен, только чтение);
  • dialplan - получение событий [NewExten] и [VarSet] (только чтение);
  • originate - доступ к возможности создавать новые вызовы (только запись).

Примечание Следует сказать, что время от времени AMI интерфейс расширяется новыми функциями и возможностями. Например, в версии Астериска 1.4 и 1.6 были переписаны AMI интерфейсы, что позволит реализовывать много-поточные операции и лучше управлять потоками (flow control) или обменом сигналами, присоединенных пользователей. Не смотря на постоянно совершенствование AMI интерфейса, шанс получить при активной работе с AMI взаимную блокировку потоков существует. Примеры использования AMI. Почему нужен уникальный [ActionID]. Параметры команд AMI

В списке команд AMI есть команда, которая запрашивает конфигурационные данные от Астериска. Более подробную информацию можно узнать:

asterisk *CLI> manager show command [GetConfig]

Запрос на получения настроек файла sip.conf можно получить так:

Action: GetConfig
Filename: sip.conf
ActionID: 435430239485234

После чего мы получим следующее:

Response: Success
ActionID: 435430239485234
Category-000000: general
Line-000000-000000: context=incoming
Line-000000-000001: language=ru
Line-000000-000002: allowguest=yes
Line-000000-000003: bindport=5060
Line-000000-000004: bindaddr=0.0.0.0
Line-000000-000005: dtmfmode=info
Line-000000-000006: disallow=all
Line-000000-000007: allow=alaw
Line-000000-000008: allow=ulaw
Line-000000-000009: allow=gsm
Line-000000-000010: nat=never
Line-000000-000011: canreinvite=no
Category-000001: 2401
Line-000001-000000: type=friend
Line-000001-000001: host=dynamic
Line-000001-000002: username=2401
Line-000001-000003: secret=2401
Line-000001-000004: callerid=2401
Line-000001-000005: context=incoming

В пакете Action мы сгенерировали номер, который настоятельно рекомендуется делать уникальным, а в ответе Response мы получили такой же [ActionID]. Если бы мы сгенерировали много запросов через интерфейс AMI, при этом не обозначив каждый из запросов уникальным [ActionID] и имея «плохой» канал связи, в котором могли быть задержки, пакеты, сгенерированный со стороны клиента (Action-пакеты), в ответ от Астериска, вызывали бы несколько ответных Response-пакетов. В виду плохого канала, ответные Response-пакеты приходили бы не в том порядке, в котором они были сгенерированы клиентом AMI. Следовательно, программа пославшая Action-пакеты, не знала бы на какой запрос Action пришел тот или иной Response. Это могло бы вызвать проблемы с обработкой пакетов на стороне клиента, который имеет соединение через AMI интерфейс.

Чтобы перезагрузить конфигурацию sip.conf, через AMI можно сделать следующее:

Action: Command
Command: sip reload
ActionID: 230432984582

Получаем ответ от AMI:

Response: Follows
Privilege: Command
ActionID: 230432984582
--END COMMAND--

Event: ChannelReload
Privilege: system,all
Channel: SIP
ReloadReason: CLIRELOAD (Channel module reload by CLI command)
Registry_Count: 0
Peer_Count: 2
User_Count: 2

Часто может оказаться полезным делать обновление конфигурационных файлов через AMI интерфейс. Для этого используется команда [UpdateConfig]. Например, удалим пользователя 2402 из файла sip.conf. Команда [UpdateConfig]имеет много параметров:

asterisk*CLI> manager show command UpdateConfig
Action: UpdateConfig
Synopsis: Update basic configuration
Privilege: config,all
Description: A 'UpdateConfig' action will modify, create, or delete
configuration elements in Asterisk configuration files.
Variables (X's represent 6 digit number beginning with 000000):
SrcFilename: Configuration filename to read(e.g. foo.conf)
DstFilename: Configuration filename to write(e.g. foo.conf)
Reload: Whether or not a reload should take place (or name of specific module)
Action-XXXXXX: Action to Take (NewCat,RenameCat,DelCat,Update,Delete,Append)
Cat-XXXXXX: Category to operate on
Var-XXXXXX: Variable to work on
Value-XXXXXX: Value to work on
Match-XXXXXX: Extra match required to match line

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

  • [SrcFilename]: имеет статус обязательного параметра вызова команды [UpdateConfig], определяет имя конфигурационного файла из которого следует считать текущую конфигурацию;
  • [DstFilename]: обязательный, имя записываемого конфигурационного файла;
  • Reload: необязательный, определяет, должна ли быть выполнена перезагрузка после того, как конфигурация обновится или же задает имя конкретного модуля, который необходимо перегрузить;
  • Action-XXXXX: обязательный, действие, которое необходимо предпринять. Это может быть: [NewCat][RenameCat],[DelCat], Update, Delete или Append;
  • Cat-XXXXX: обязательный, имя изменяемой категории;
  • Var-XXXXX: необязательный, имя изменяемой переменной;
  • Value-XXXXX: необязательный, значение изменяемой переменной;
  • Match-XXXXX: необязательный, если задан,является дополнительным параметром, которому должен соответствовать параметр линии;
  • [ActionID]: необязательный, идентификатор, который используется для обозначения ответа на команду.
Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.