Im Zweifel die Quellen
Beschleicht Sie der Verdacht, dass die Dokumentation bei [6] veraltet ist, oder brauchen Sie den Datentyp eines Rückgabewerts, hilft das Studium des Asterisk-Quelltextes. Die Quelltextdatei für den Befehl »AGI« trägt den Namen »Asterisk-Quellverzeichnis/res/res_agi.c«. Unter [7] gibt es zudem eine mit Doxygen erstellte Dokumentation der Asterisk-Quellen. Daten, die Asterisk an das AGI-Programm schickt, beginnen im Quelltext mit »fdprintf(fd,« oder »fdprintf(agi->fd,«.
Für jeden AGI-Befehl gibt es in der Datei eine eigene Funktion, für »STREAM FILE« beispielsweise ist die Funktion »handle_streamfile()« zuständig. Die beiden Zeilen
fdprintf(agi->fd, "200 result=%d endpos=%ldn", 0, sample_offset); fdprintf(agi->fd, "200 result=%d endpos=%ldn", res, sample_offset);
machen klar, dass Asterisk eine Antwort in der Art »200 result=%d endpos=%ldn« zurückliefern wird, wobei »%d« ein Integer ist und »%ld« ein Long Integer.
Dead-AGI beim Hangup
Eine weitere Möglichkeit, AGI-Programme zu starten, bietet der Dialplan-Befehl »DeadAGI«. Er dient dazu, Programme in einer Hangup-Extension aufzurufen. Der folgende Context stellt das dar:
[default] exten => 69,1,Answer() exten => 69,2,AGI(agi.php) exten => 69,3,Hangup() exten => h,1,DeadAGI(deadagi.php)
Wenn ein Benutzer auflegt, während »agi.php« läuft, springt Asterisk sofort in die Extension »h«, ohne die Priority 3 in der Extension »69« auszuführen. In »h« startet »DeadAGI« dann das Programm »deadagi.php«.
Dead-AGI-Programme werden gern benutzt, um Aufräumarbeiten zu erledigen. So könnte zum Beispiel das Programm »agi.php« mehrere temporäre Dateien gespeichert haben, deren Namen alle mit dem Namen des Channel beginnen. Da der Channel-Name auch in »deadagi.php« zur Verfügung steht, können Sie darin alle temporären Dateien löschen, die mit dem Channel-Namen beginnen.
Die Abfrage des Channel-Status mit dem AGI-Befehl »CHANNEL STATUS« in »deadagi.php« liefert möglicherweise überraschend die Antwort »Line is up« – und das selbst bei folgendem Context:
[default] exten => 69,1,Answer() exten => 69,2,Hangup() exten => h,1,DeadAGI(deadagi.php)
Dies ist wichtig für Abrechnungsfragen. Wenn in dem eben gezeigten Context das Dead-AGI-Programm nichts anderes macht, als 10 Sekunden zu warten, dann zeigt Asterisk in den Call Detail Records eine Abrechnungszeit von mindestens 10 Sekunden an. Die wohl eher gewünschte Abrechnungszeit von 0 Sekunden liefert dagegen der Context:
[default] exten => 69,1,Answer() exten => 69,2,Hangup() exten => h,1,ResetCDR(w) exten => h,2,DeadAGI(deadagi.php)
Der Befehl »ResetCDR(w)« speichert den momentanen Zustand des Call Detail Record. Nach dem Aufruf des Dead-AGI-Programms in der Hangup-Extension können natürlich weitere Priorities folgen, die Asterisk nach Beendigung des Dead-AGI-Programms ausführen soll.






