AMI

Asterisk Manager Interface(AMI)는 Asterisk 에서 제공하는 System monitoring/Management interface 이다. 즉, 이벤트 모니터링과 명령 전달을 위한 Interface 란 뜻이다.

AMI 간단 설정

기본적으로 AMI는 disable 로 되어 있다.
AMI를 활성화 하기 위해서는 /etc/asterisk/manager.conf 파일 수정이 필요하다.
/etc/asterisk/manager.conf 파일을 통해서 AMI 접속에 관한 설정을 해주고, /etc/asterisk/manager.d 디렉토리 밑에 각각의 접속에 대한 계정을 설정해준다.

예제로 hello 라는 계정에 world 라는 패스워드를 가진 계정을 추가해보자.

;
; Turn on the AMI and ask it to only accept connections from localhost
;
; By default asterisk will listen on localhost only.
[general]
enabled = yes
webenabled = yes
port = 5038
bindaddr = 192.168.200.10

; No access is allowed by default.
; To set a password, create a file in /etc/asterisk/manager.d
; use creative permission games to allow other serivces to create their own
; files
#include "manager.d/*.conf"

그리고 /etc/asterisk/manager.d 디렉토리 밑에 hello.conf 라는 파일을 하나 추가하자.

pchero@MyDebian:/etc/asterisk/manager.d$ cat hello.conf

; ami configure file for [hello]
[hello]
secret = world
read = all
write = all

이로써, AMI 로 접근이 가능한 hello 라는 계정이 생성되었다. 주의할 점은 아직 TLS/SSL 설정이 안되어있기 때문에 보안에 매우 취약하다는 점이다.

 

AMI 접속 테스트

이제 AMI에 접속해보자. Asterisk는 여러가지 AMI 접속 방법을 제공하는데… 먼저 telnet 부터 접속해보자.

pchero@MyGalaxy:~$ telnet 192.168.200.10 5038
Trying 192.168.200.10...
Connected to 192.168.200.10.
Escape character is '^]'.
Asterisk Call Manager/1.1
Action: Login
Username: hello
Secret: world

Response: Success
Message: Authentication accepted

Event: FullyBooted
Privilege: system,all
Status: Fully Booted

Action: Ping

Response: Success
Ping: Pong
Timestamp: 1395059659.619558

Action: Logoff

Response: Goodbye
Message: Thanks for all the fish.

Connection closed by foreign host.
pchero@MyGalaxy:~$

이번에는 HTTP 를 통한 접속을 해보자.

pchero@MyGalaxy:~$ wget "http://192.168.200.10:8088/rawman?action=login&username=hello&secret=world" --save-cookies cookies.txt -O -
--2014-03-17 13:36:55--  http://192.168.200.10:8088/rawman?action=login&username=hello&secret=world
Connecting to 192.168.200.10:8088... connected.
HTTP request sent, awaiting response... 200 OK
Length: 55 [text/plain]
Saving to: ‘STDOUT’

0% [                                                                                                                                              ] 0           --.-K/s              Response: Success
Message: Authentication accepted

100%[=============================================================================================================================================>] 55          --.-K/s   in 0s

2014-03-17 13:36:55 (6.75 MB/s) - written to stdout [55/55]

pchero@MyGalaxy:~$ wget "http://192.168.200.10:8088/rawman?action=ping" --load-cookies cookies.txt -O -
--2014-03-17 13:37:35--  http://192.168.200.10:8088/rawman?action=ping
Connecting to 192.168.200.10:8088... connected.
HTTP request sent, awaiting response... 200 OK
Length: 63 [text/plain]
Saving to: ‘STDOUT’

0% [                                                                                                                                              ] 0           --.-K/s              Response: Success
Ping: Pong
Timestamp: 1395059855.098176

100%[=============================================================================================================================================>] 63          --.-K/s   in 0s

2014-03-17 13:37:35 (6.22 MB/s) - written to stdout [63/63]

pchero@MyGalaxy:~$ wget "http://192.168.200.10:8088/rawman?action=logoff" --lo
--load-cookies=    --local-encoding=
pchero@MyGalaxy:~$ wget "http://192.168.200.10:8088/rawman?action=logoff" --load-cookies cookies.txt -O -
--2014-03-17 13:38:07--  http://192.168.200.10:8088/rawman?action=logoff
Connecting to 192.168.200.10:8088... connected.
HTTP request sent, awaiting response... 200 OK
Length: 56 [text/plain]
Saving to: ‘STDOUT’

0% [                                                                                                                                              ] 0           --.-K/s              Response: Goodbye
Message: Thanks for all the fish.

100%[=============================================================================================================================================>] 56          --.-K/s   in 0s

2014-03-17 13:38:07 (6.51 MB/s) - written to stdout [56/56]

 

AMI Protocol

AMI 에는 두가지 종류의 메시지가 있다. Manager event 와 manager Action 이다.

Manager Event는 단방향 메시지 전송이며, 메시지는 Asterisk 에서 AMI client로 전송된다. 주로 Asterisk에서 일어난 내용을 접속중인 AMI client로 Notice 하기 위해 사용한다.

Manager Action은 양방향 메시지 전송이며, AMI client 에서 Asterisk로 요청 메시지를 보내고, Asterisk는 처리 결과와 응답메시지를 보내는 방식으로 통신한다.

 

Message Encoding

모든 AMI message들(manager event, manager action, manager action response)은 같은 방식으로 인코딩된다. 모든 메시지들은 text-based 이고, Carriage return 과 Line-feed 기호로 끝맺음된다. 메시지 마지막은 공백 라인으로 끝이난다.

Header1: This is the first header<CR><LF>
Header2: This is the second header<CR><LF>
Header3: This is the last header of this message<CR><LF>
<CR><LF>

Events

모든 Manager event 는 항상 Event header 와 Privilege header 를 포함한다. Event header 에는 해당 event의 이름이, Privilege header 에는 해당 event 의 권한 레벨정보가 표시된다. 다른 헤더들은 해당 event 의 내용에맞는  내용들이 표시된다.

Event: Hangup
Privilege: call,all
Channel: SIP/0004F2060EB4-00000000
Uniqueid: 1283174108.0
CallerIDNum: 2565551212
CallerIDName: Russell Bryant
Cause: 16
Cause-txt: Normal Clearing

Action

모든 manager action 메시지들은 반드시 Action header 를 포함해야 한다. Action header 는 이 메시지가 어떤 명령에 대한 메시지인지를 나타낸다. 그 외 다른 header 들은 Action header 실행을 위한 인자값들로 구성된다. 상세 header 내용들을 확인하고자 한다면 Asterisk CLI 창에서 manager show command <Action> 을 입력하면 확인이 가능하다. 전체 Action list 확인은 manager show commands 명령으로 확인이 가능하다.

MyFBSD*CLI> manager show command ping
[Syntax]
Action: Ping
[ActionID:] <value>

[Synopsis]
Keepalive command.

[Description]
A 'Ping' action will ellicit a 'Pong' response. Used to keep the manager
connection open.

[Arguments]
ActionID
ActionID for this transaction. Will be returned.

[See Also]
Not available

Manager action 메시지에 대한 응답 중 제일 마지막에 오는 메시지는 Response header 를 가지고 있다. 이 Response header 를 통해서 manager action 명령의 성공 여부와 실패했을 경우 실패한 사유등을 확인할 수 있다.

Action: Login
Username: russell
Secret: russell

Response: Success
Message: Authentication accepted

Call originating

AMI 를 통해서 콜을 생성해보자.

Action: Originate
Channel: Sip/0000FFFF0001
Application: Playback
Data: demo-congrats

Response: Success
Message: Originate successfully queued

 

Tags: , ,

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.