Expect- Script für das automatisierte Update mehrerer Silverpeaks

Spätestens wenn der Rollout der Silver Peak WAN Beschleuniger in allen Aussenstellen realisiert ist, steht man vor dem Problem, dass das Update der einzelnen Geräte doch recht zeitintensiv wird.
Eine Möglichkeit dies zu minimieren ist der Einsatz des Global Management Systems GMS. Da dies jedoch mit nicht unerheblichen Kosten verbunden ist, und zudem noch viele Funktionen enthalten sind, die man eigentlich nicht unbedingt braucht, bleibt noch eine automatisierte Lösung über die Shell.
Genau das ist es was folgendes Expect- Script erledigt.
Das Script liest aus der Datei "silverpeaks" (Beispiel siehe unten), die im gleichen Verzeichnis wie das Expect-Script liegen muss, die Hostnamen, dern Anmeldenamen und das Kennwort für die Silver Peak Appliances aus, die aktualisiert werden sollen.
Als Übergabeparameter erwartet das Expect-Script den Namen der Image- Datei, z.B.  
./update-silverpeaks.exp image-6.0.4.0_44936.zip
  Die Download- URL für das Imagefile wird im Expect-Script selbst in Zeile 2 festgelegt. Selbstverständlich muss das zu installierende Image dort bereits vorhanden sein.

Um das Update auch im Produktivbetrieb durchführen zu können habe ich bewusst auf einen automatischen Neustart verzichtet. Es wird lediglich das nächste zu bootende Image auf die neue Version gesetzt, so dass beim nächsten Neustart die aktualisierte Version verwendet wird.
Das Vorgehen für die Einrichtung eines automatischen, zeitgesteuerten Neustart findet sich hier.

Expect- Script

#!/usr/bin/expect
set downloadurl "http://www.bayreuth.tk/up/"
set hostlist "./silverpeaks"
set imagename [lindex $argv 0]
set timeout 30

if ($argc!=1) {
   send_error "Usage: $argv0 Imagename\n"
   exit 1;
}

set fd [open $hostlist r]
set linebuffer [read -nonewline $fd]
close $fd

foreach line [split $linebuffer "\n" ] {
  set hostconfig [split $line "|" ]
  set host [lindex $hostconfig 0]
  set login [lindex $hostconfig 1]
  set password [lindex $hostconfig 2]

  set downloadcomplete 0

  spawn ssh $login@$host
  expect "Password:"
  send "$password\r"
  expect " > "
  send "enable\r"
  expect " # "
  send "conf t\r"
  expect "(config) #"
  send "image install $downloadurl$imagename\r"
  expect " # "
  while {$downloadcomplete == 0} {
    send "show image status\r"
    expect -re {Install End time:([[:space:]]+)(\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2})} {
      set downloadcomplete 1
    }
    sleep 10
  }
  send "image boot next\r"
  expect "(config) #"
  send "exit\r"
  expect " # "
  send "exit\r"

}

Konfigurationsdatei

silver-peak.1.doma.in|update|SECRET
silver-peak.2.doma.in|admin|ABSOLUTELYSECRET