Letzte Woche => Endspurt!Montag den 29.01.07 geht das Buch in die Produktion. Bis dahin laeuft der Beta-Test noch in vollem Umfang. Bitte melden Sie Fehler! Siehe Beta-Test FAQ. Erscheinungstermin: 03.03.07. Das Buch wird auf dem Asterisk-Tag.org in Chemnitz vorgestellt und kann dort auch erworben werden. 10 Tage spaeter wird es im Buchhandel sein. Wer nicht in Chemnitz sein kann, sollte das Buch vorbestellen: Amazon oder direkt beim Verlag Asterisk-Schulungen und Consulting vom Autor dieses Buches finden Sie auf http://www.amooma.de. Naechste Asterisk-Schulung: 12.02. - 13.02.07 (noch 1 Platz frei) - Ach ja, ... wir suchen auch noch Asterisk Entwickler! => http://www.amooma.de/jobs/ |
Das Manager-Interface aktiviert man, indem man in der manager.conf
im Abschnitt [general]
den Parameter enabled=yes
setzt.
Das sollte man nie auf einem Server mit öffentlichem Zugang machen, außer man schützt sich zusätzlich durch iptables, ipfw oder eine andere Firewall oder einen SSH-Tunnel!
Ganz unten legen wir uns einen Benutzer-Eintrag mit dem Namen admin
an:
[admin] secret = geheim deny = 0.0.0.0/0.0.0.0 permit = 127.0.0.1/255.255.255.255 read = all,system,call,log,verbose,command,agent,user,config write = all,system,call,log,verbose,command,agent,user,config
Die Optionen nach read
und write
geben an, für welche Befehlsklassen wir dem User Rechte geben.[124]
Diese großzügige Rechtevergabe dient nur zum Testen! Mit dem Recht command
kann der User z.B. Asterisk stoppen. Seit 1.4 ist es sogar möglich, durch das AMI den Dialplan zu verändern und dann evtl. mit System()
auf der Shell Befehle mit root-Rechten auszuführen!
Nach einem Restart von Asterisk können wir uns auf Port 5038 mit dem AMI verbinden, was wir auf der Shell mit telnet[125]ausprobieren:
$
telnet 127.0.0.1 5038
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Asterisk Call Manager/1.0
Man kann hier von Hand Befehle (die meist aus mehreren Zeilen bestehen) eintippen, z.B.:
Action: Login ActionID: 1 Username: admin Secret: geheim
Alle Befehls-Pakete werden wurch zwei Returns abgeschlossen.
Antwort:
Response: Success ActionID: 1 Message: Authentication accepted
Die primäre Verwendung liegt aber ganz klar im automatisierten Zugriff durch Skripte.
Die Manager-API ist nicht unbedingt dafür berühmt, viele gleichzeitige Verbindungen handhaben zu können (auch wenn sich das in der Version 1.4 stark verbessert hat). In so einer Last-Situation könnte man über den Einsatz eines speziellen Proxys wie den „Simple Asterisk Manager Proxy“[126] (ein Perl-Skript) nachdenken, der viele Verbindungen entgegennimmt und zu einer bündelt - für die zugreifenden Skripte völlig transparent. Für die folgenden „Spielereien“ ist das aber unnötig.
Nach erfolgreicher Authentifizierung können in beiden Richtung Pakete gesendet werden. Die Art des Pakets wird immer von der ersten Zeile darin bestimmt. Der Client sendet Action
-Pakete, der Server antwortet mit Response
oder kann auch von sich aus Event
-Pakete schicken. Die Reihenfolge der Zeilen in einem Paket ist ansonsten aber irrelevant. Zeilen werden durch CR LF[127] beendet, das ganze Paket durch ein weiteres CR LF. Normalerweise sendet der Client in jeder Action
ein ActionID
-Feld mit beliebigem, möglichst eindeutigem, Inhalt[128], das der Server so in seine Response
übernimmt, damit sich die Antworten bei Überschneidungen zuordnen lassen.
Der Server sendet Event
-Pakete, um den Client über verschiedene Ereignisse zu informieren. Es gibt auch Ereignisse, die von einer Action
des Clients ausgelöst werden. Dann sendet der Server ein Response: Follows
gefolgt von den Events (die dann ebenfalls die ActionID
beinhalten) und ein abschließendes Event (normalerweise Aktionsname
Complete).
Wenn Ihr Client keine Events benötigt, kann er direkt im ersten Authentifizierungs-Paket den Parameter Events: off
senden, um dann nur Antworten auf von ihm gesendete Actions zu erhalten.
Die Liste der verfügbaren Befehle erhält man im CLI mit show manager commands (bzw. manager show commands), Informationen über einen Befehl mit show manager command Befehlsname
(bzw. manager show command Befehlsname
):
mos-eisley*CLI> manager show commands Action Privilege Synopsis ------ --------- -------- AbsoluteTimeout call,all Set Absolute Timeout AgentCallbackLo agent,all Sets an agent as logged in by callback AgentLogoff agent,all Sets an agent as no longer logged in Agents agent,all Lists agents and their status ChangeMonitor call,all Change monitoring filename of a channel Command command,all Execute Asterisk CLI Command DBGet system,all Get DB Entry DBPut system,all Put DB Entry Events <none> Control Event Flow ExtensionState call,all Check Extension Status GetConfig config,all Retrieve configuration Getvar call,all Gets a Channel Variable Hangup call,all Hangup Channel IAXnetstats <none> Show IAX Netstats IAXpeers <none> List IAX Peers ListCommands <none> List available manager commands Logoff <none> Logoff Manager MailboxCount call,all Check Mailbox Message Count MailboxStatus call,all Check Mailbox Monitor call,all Monitor a channel Originate call,all Originate Call Park call,all Park a channel ParkedCalls <none> List parked calls PauseMonitor call,all Pause monitoring of a channel Ping <none> Keepalive command PlayDTMF call,all Play DTMF signal on a specific channel. QueueAdd agent,all Add interface to queue. QueuePause agent,all Makes a queue member temporarily unavailable QueueRemove agent,all Remove interface from queue. Queues <none> Queues QueueStatus <none> Queue Status Redirect call,all Redirect (transfer) a call SetCDRUserField call,all Set the CDR UserField Setvar call,all Set Channel Variable SIPpeers system,all List SIP peers (text format) SIPshowpeer system,all Show SIP peer (text format) Status call,all Lists channel status StopMonitor call,all Stop monitoring a channel UnpauseMonitor call,all Unpause monitoring of a channel UpdateConfig config,all Update basic configuration UserEvent user,all Send an arbitrary event WaitEvent <none> Wait for an event to occur
Diese Befehle sind fast immer gleichlautend mit einer entsprechenden Dialplan-Applikation - neu ist vor allem die Action Originate
, mit der man einen ausgehenden Anruf veranlassen kann, und Command
, was einen Befehl direkt auf dem CLI ausführt. Da wir unserem User admin
alle Rechte gegeben haben (s.o.), darf er alle Befehle ausführen. Wie man einen Befehl benutzt, erfährt man so:
mos-eisley*CLI> manager show command Command Action: Command Synopsis: Execute Asterisk CLI Command Privilege: command,a Description: Run a CLI command. Variables: (Names marked with * are required) *Command: Asterisk CLI command to run ActionID: Optional Action id for message matching.
Die von Asterisk verschickten Events sind bisher so gut wie undokumentiert. Auf http://www.voip-info.org/wiki/view/asterisk+manager+events findet sich eine zusammengesammelte Liste mit spärlichen Hinweisen. Ein paar Erklärungen kann man auf http://asterisk-java.sourceforge.net/apidocs/net/sf/asterisk/manager/event/package-frame.html nachlesen[129].
[124] Welche Rechte-Klassen man zum Ausführen eines Befehls haben muss, erfährt man im CLI mit show manager commands bzw. manager show commands.
[125] Hier kommt nur das Tool telnet zum Einsatz. Das hat nichts mit dem Telnet-Protokoll oder Port zu tun.
[127] Carriage Return (ASCII 13 dezimal) und Line Feed (ASCII 10 dezimal)
[128] hier bietet sich etwa der Name des Skripts ein Timestamp und eine fortlaufende Nummer für jede Action an, z.B. testskript.php-1169405408-1
[129] Nicht verwirren lassen, das ist eigentlich eine Java-Dokumentation.
© by Stefan Wintermeyer