Author Topic: Asterisk Manager Interface <- Astmanproxy <- Client  (Read 1598 times)

p

  • Global Moderator
  • Apache
  • *****
  • Posts: 110
  • Karma: +27/-0
    • View Profile
Asterisk Manager Interface <- Astmanproxy <- Client
« on: October 16, 2013, 11:34:23 am »
Auf unserer auf Asterisk basierenden Telefonanlage wird derzeit ein Webinterface (für DAU) aufgesetzt.
Die benötigten Informationen (zB laufende Gespräche, Konferenzen, Hotlines) müssen teils direkt aus Asterisk extrahiert werden - Konfigurationsparameter (wie Durchwahlen, Namen, etc) werden in einer Datenbank abgelegt.
Für den direkten, dynamischen Zugriff haben wir uns für das Asterisk Manager Interface (AMI) entschieden - da aber mehrere gleichzeitige Zugriffe das AMI schnell überlasten könnten, soll ein Proxy davor geschaltet werden.
Es gibt nicht viel Auswahl an bestehenden AMI-Proxys.. In unseren Augen ist aber Astmanproxy einer der Besten, auch wenn nur noch eine einzelne Person daran hin und wieder irgendwas werkelt/patcht/entwickelt.
Durch mangelnde Nutzung und Dokumentation von Astmanproxy sind wir in ein paar Probleme gelaufen, welche wir aber nun größtenteils beheben konnten. Aus diesem Grund schreibe ich hier mal eben die grobe Usage von Astmanproxy mit PHP nieder. Vielleicht hilft es einmal irgendwem. :)
Hilfreiche Links dazu:
http://das-asterisk-buch.de/1.6/asterisk-manager-api.html
http://www.voip-info.org/wiki/view/Asterisk+manager+API
http://www.phonesuite.de/hlp/de/ast/ast/asterisk_manager_proxy.htm
http://bugs.ingenius.com/?W204
http://wiki.metasec.de/index.php/Astmanproxy_config

-

/etc/asterisk/manager.conf:
Code: [Select]
[general]
enabled = yes
port = 5038
bindaddr = 0.0.0.0
[XXX]
secret = XXXXXX
deny=0.0.0.0/0.0.0.0
permit=127.0.0.1/255.255.255.0
read = all
write = all

asterisk -r
manager reload

Nicht vergessen ;)

##

Installation brauche ich wohl nicht erleutern. Ein einfaches make&&make install reicht.

##

/etc/asterisk/astmanproxy.conf:
Code: [Select]
host = 127.0.0.1, 5038, XXX, XXXXXX, on, off
listenport = 5039
authrequired = no
Der Rest ist auf defaultvalules belassen.
Besonders zu beachten ist die Schreibweise des Passwortes :ugly;
Astmanproxy liest das Passwort für die AMI Connection aus der /etc/asterisk/astmanproxy.conf aus und motherfucking lowercased es -> lowercase Passwort in der manager.conf verwenden..


##

Über astmanproxy -ddddd astmanproxy im Debugmodus ausführen und darauf achten, dass sich Astmanproxy auch erfolgreich zum AMI verbindet:
Code: [Select]
asterisk@127.0.0.1 got: Asterisk Call Manager/1.1
asterisk@127.0.0.1 got: Response: Success
asterisk@127.0.0.1 got: Message: Authentication accepted

##

Zum Testen:
Code: [Select]
telnet 127.0.0.1 5039
Action: Login<Enter>
Username: XXX<Enter>
Secret: XXXXXX<Enter><Enter>

Response: Success
Message: Authentication accepted

Action: Command<Enter>
Command: sip show peers<Enter><Enter>

Action: Logoff<Enter><Enter>

Goodbye: Y'all come back now, y'hear?

##

Und das ganze jetzt in PHP ;)
Code: [Select]
<?php
$socket 
socket_create(AF_INETSOCK_STREAMSOL_TCP);
if (
$socket 0) {
   echo 
"socket_create() failed: reason: " socket_strerror($socket) ."\n";
}
$result socket_connect($socket'127.0.0.1'5039);
if (
$result 0) {
   echo 
"socket_connect() failed.\nReason: ($result) " .socket_strerror($result) . "\n";
}

if (!
$socket) {
        echo 
"$errstr ($errno)<br />\n";
} else {
        echo 
"";
        
socket_write($socket"Action: Command\r\n");
        
socket_write($socket"Command: sip show peers\r\n\r\n");
        echo 
"<pre>";
        while(
$buffer socket_read($socket512PHP_NORMAL_READ)){
                if(
trim($buffer) == "Response: Error") {
                        echo 
"Received error - <b>".trim($buffer)."</b>.<br>Number probably not found";
                        break;
                }
                if(
trim($buffer) == "--END COMMAND--"||substr_count($buffer,"Server:") >0) {
                        echo 
$buffer;
                        break;
                }
                echo 
$buffer;
                
flush();
        }
        echo 
"</pre>";
        
socket_write($socket"Action: Logoff\r\n\r\n");
        
socket_close($socket);
}
?>

##

Es hatte eine Weile gedauert, bis wir das zum Rennen gebracht haben.
Die ersten Tests wurden mit Action:Getconfig, Filename: sip.conf gemacht und gaben nicht das gewünschte Ergebnis zurück: Nach 255 Zeilen kam kein Output mehr. Wir wissen noch nicht warum, da andere Actions durchaus den richtigen und kompletten (auch größeren) Content zurück geben - ist uns aber eigentlich auch Wurscht. Die benötigten Informationen können mit funktionierenden Actions abgerufen werden. ;)


Fragen, Anregungen, Ideen, Blurp:
Immer nur her damit!