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