Beispiel: Anzahl der Mailbox-Nachrichten mit Expect abfragen

Nehmen wir an, wir wollten über das Manager-Interface die Anzahl der Nachrichten in einer Voicemailbox abfragen. Diese einfache Aufgabe lässt sich leicht mit einem Skript für expect lösen.

Folgendes Expect-Skript verbindet sich mit dem AMI, loggt sich ein und gibt schließlich die Anzahl der neuen und alten Nachrichten in der angegebenen Mailbox aus:

#!/usr/bin/expect
#
# Aufruf: ./vmcount.exp 1234@default

# der Benutzer-Zugang wie in manager.conf eingerichtet:
set username "admin"
set secret "geheim"
set host "127.0.0.1"
set port "5038"

if {[llength $argv] != 1} {
    send_user "Fehler: Geben Sie eine Mailbox an!\n"
    exit 1
}

# erstes Argument ist die abzufragende Mailbox:
set mailbox [lindex $argv 0]
send_user "Mailbox: $mailbox\n"

# Durchschleifen von stdout zum User abschalten:
log_user 0

# Verbindung zum AMI öffnen:
spawn telnet $host $port

# für den Fall, daß telnet abbricht weil keine Verbindung
# hergestellt werden kann:
expect_before eof {
    send_user "Fehler beim Verbinden.\n"
    exit 1
}

# auf die Zeichenfolge "Manager" warten und bei Erfolg
# ein Login-Paket senden:
#
expect "Manager" {
    send_user "Verbunden.\n"
    send "Action: Login\nUsername: $username\nSecret: $secret\n\n"
    # Beachten Sie, daß telnet Zeilenumbrüche (\n) automatisch
    # in CR LF (\r\n) umwandelt. Man darf hier also nicht \r\n
    # angeben.
}

# Login erfolgreich?:
#
expect {
    -re "Response:\\s*Error" {
        send_user "Login fehlgeschlagen.\n"
        exit 1
    }
    -re "Response:\\s*Success" {
        send_user "Eingeloggt.\n"
        # Anzahl der Mailbox-Nachrichten abfragen:
        send "Action: MailboxCount\nMailbox: $mailbox\n\n"
    }
}

expect {
    -re "Response:\\s*Error" {
        send_user "Abfragen der Mailbox fehlgeschlagen.\n"
        exit 1
    }
    -re "Response:\\s*Success" {}
}
expect {
    -re "NewMessages:\\s*(\[\\d]*)" {
        send_user "Neue Nachrichten: $expect_out(1,string)\n"
    }
}
expect {
    -re "OldMessages:\\s*(\[\\d]*)" {
        send_user "Alte Nachrichten: $expect_out(1,string)\n"
    }
}

# Ausloggen - nicht unbedingt nötig, aber sauber:
send "Action: Logoff\n\n"

Wir speichern das Skript als vmcount.exp und setzen es mit chmod a+x vmcount.exp auf ausführbar.

Aufruf:

$ ./vmcount.exp 123@default
Mailbox: 123@default
Verbunden.
Eingeloggt.
Neue Nachrichten: 0
Alte Nachrichten: 0

Version 1.2, November 2002

Neue Version verfügbar

Sie betrachten gerade die alte Version des Buches (Version 1.0). Wir empfehlen Ihnen für Asterisk 1.4 und 1.6 die neue Version des Buches.

Asterisk-Tag 2008

Lernen Sie Mark Spencer (den Erfinder von Asterisk) kennen! Viele Vorträge, Case-Studies und Workshops rund um das Thema VoIP. Asterisk-Tag.org

Das gedruckte Buch