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: ami, asterisk, asterisk manager interface