Titelseite

7.3.3.10. Postsync-Skripte einsetzen

Zu jeder Image-Datei kann im LINBO-Verzeichnis /var/linbo ein Postsync-Shell-Skript nach dem Schema image.cloop.postsync bzw. image.rsync.postsync angelegt werden. Beispiel:

Tabelle: Postsync-Skripte

ImagedateinamePostsync-Skriptname
winxp-fs.cloopwinxp-fs.cloop.postsync

Das Skript wird zur LINBO-Laufzeit in den lokalen Client-Cache heruntergeladen, nach der Synchronisation mit dem Image (Bsp.: winxp-fs.cloop) und vor dem Start des Betriebssystems ausgeführt. Sind Cloop- und Rsync-Image definiert und für beide Postsync-Skripte vorhanden, wird analog zum Verhalten bei Windows-Registry-Patches nur das Rsync-Postsync-Skript ausgeführt.

Für LINBO-Postsync-Skripte gelten die Syntaxvorgaben der ash-Shell[52]. Folgende Variablen sind zur Laufzeit verfügbar:

Tabelle: Variablen, die Postsync-Skripten zur Verfügung stehen

Variablegespeicherter Wert
$1Cachepartition (in der Form /dev/sda5)
$2Name der Basis-Imagedatei
$3Name der Rsync-Imagedatei
$4Bootpartition
$5 | $rootdevBetriebssystempartition
$6Kernel
$7InitRD
$8Kernel-Append-Parameter
$HOSTNAMEClientname
$(hostgroup)Name der Rechnergruppe (enthält den Rückgabewert der Funktion hostgroup())
$patchfileName der Registry-Patch-Datei

Wenn man jetzt noch weiß, dass zur Laufzeit des Skripts die Betriebssystempartition unter /mnt und die Cachepartition unter /cache gemountet sind, kann man mit dem Skripten loslegen. Hier einige Beispiele:

Beispiel 1: Nach der Synchronisation mit einem bestimmten Image ein zweites System sychronisieren.

echo "##### POSTSYNC BEGIN #####"

# Name des Basisimages das zusaetzlich synchronisert werden soll (muss angepasst werden)
mybaseimage=maverick.cloop

# Name des Rsyncimages, ggf. eintragen
myrsyncimage=""

# Zielpartition auf die gesynct werden werden soll, muss angepasst werden
myrootpartition=/dev/sda2

# Ab hier muss nichts mehr veraendert werden.

# IP des LINBO-Servers, wird automatisch aus dhcp.log ermittelt
myserverip="$(grep ^linbo_server /tmp/dhcp.log | tail -1 | awk -F\' '{ print $2 }')"

# Ausgabe der Parameter auf der LINBO-Konsole
echo "cachepartition:  $1"
echo "myserverip:      $myserverip"
echo "mybaseimage:     $mybaseimage"
echo "myrsyncimage:    $myrsyncimage"
echo "myrootpartition: $myrootpartition"

# Befehl zur Synchronisation der zweiten Partition
/usr/bin/linbo_cmd synconly "$myserverip" "$1" "$mybaseimage" "$myrsyncimage" "" "$myrootpartition"

# Syntax fuer linbo_cmd synconly:
# /usr/bin/linbo_cmd synconly "<LINBO-Server-IP>" "<Cachepartition>" "<Basisimage>" "<Rsyncimage>"
#  "<Bootpartition>" "<Rootpartition>"
# Cachepartition steht in der Variablen $1 zur Verfuegung.
# Bootpartition ist optional, falls leer muessen Anfuehrungszeichen gesetzt werden.

echo "##### POSTSYNC END #####"

Das Postsync-Skript ruft linbo_cmd mit folgenden Parametern auf:

Tabelle: Beispiel-Parameter für linbo_cmd im Postsync-Skript

Pos.ParameterWert im BeispielBemerkung
1Befehlsynconlysynchronisiert nur, ohne Start
2IP-Adresse des LINBO-Servers"$myserverip"wird automatisch aus /tmp/dhcp.log ermittelt
3Cachepartition"$1"steht in der Variablen $1 zur Verfügung (Bsp.: /dev/sda6)
4Dateiname des Basisimages"$mybaseimage"Dateiname laut start.conf (Bsp.: maverick.cloop)
5Dateiname des Rsyncimages"$myrsyncimage"Dateiname laut start.conf, falls nicht definiert muss "" angegeben werden.
6Bootpartition""laut start.conf, kann leer sein, "" muss angegeben werden.
7Rootpartition"$myrootpartition"Betriebssystempartition laut start.conf (Bsp.: /dev/sda2)

Nach dem eigentlichen Synchronisationsvorgang wird in diesem Beispiel zusätzlich die zweite Partition der ersten Festplatte (/dev/sda2) mit dem Image maverick.cloop synchronisiert.

Beispiel 2: Einen gruppenspezifischen Registry-Patch in den Cache herunterladen und anwenden.

# Namen der Patchdatei anhand der Gruppe bestimmen
local gruppenpatch="$(hostgroup).reg"

# IP des LINBO-Servers, wird automatisch aus dhcp.log ermittelt
myserverip="$(grep ^linbo_server /tmp/dhcp.log | tail -1 | awk -F\' '{ print $2 }')"

# alte Gruppenpatch-Datei löschen, falls vorhanden
[ -e "/cache/$gruppenpatch" ] && rm /cache/$gruppenpatch

# neue Gruppenpatch-Datei mit rsync vom Server in den Cache herunterladen
rsync $myserverip::linbo/$gruppenpatch /cache

# Patch anwenden falls vorhanden, Ausgabe in Logdatei umleiten
[ -e "/cache/$gruppenpatch" ] && patch_registry "/cache/$gruppenpatch" /mnt 2>&1 >>/tmp/patch.log

Dazu muss die gruppenspezifische Patchdatei unter /var/linbo/<gruppe>.reg bereitgestellt werden.

Beispiel 3: Die Hosts eines bestimmten Computerraums patchen.

# Raum aus Hostnamen ermitteln
local raum=""
case $HOSTNAME in
 r100-*) raum=r100 ;;
 r200-*) raum=r200 ;;
 *) ;;
esac

# weitere Verarbeitung nur, wenn $raum nicht leer ist
if [ -n "$raum" ]; then

 # Namen der Patchdatei anhand des Raumes bestimmen
 local raumpatch="$raum.reg"

 # alte Raumpatch-Datei löschen, falls vorhanden
 [ -e "/cache/$raumpatch" ] && rm /cache/$raumpatch

 # IP des LINBO-Servers, wird automatisch aus dhcp.log ermittelt
 myserverip="$(grep ^linbo_server /tmp/dhcp.log | tail -1 | awk -F\' '{ print $2 }')"

 # neue Raumpatch-Datei mit rsync vom Server in den Cache herunterladen
 rsync $myserverip::linbo/$raumpatch /cache

 # Patch anwenden falls vorhanden, Ausgabe in Logdatei umleiten
 [ -e "/cache/$raumpatch" ] && patch_registry "/cache/$raumpatch" /mnt 2>&1 >>/tmp/patch.log

fi

Der Raumpatch muss für dieses Beispiel unter /var/linbo/<raum>.reg bereitgestellt werden und kann z.B. einen Standarddrucker-Patch enthalten.

5.0.1