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
| Imagedateiname | Postsync-Skriptname |
| winxp-fs.cloop | winxp-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
| Variable | gespeicherter Wert |
| $1 | Cachepartition (in der Form
/dev/sda5) |
| $2 | Name der Basis-Imagedatei |
| $3 | Name der Rsync-Imagedatei |
| $4 | Bootpartition |
| $5 | $rootdev | Betriebssystempartition |
| $6 | Kernel |
| $7 | InitRD |
| $8 | Kernel-Append-Parameter |
| $HOSTNAME | Clientname |
| $(hostgroup) | Name der Rechnergruppe (enthält den Rückgabewert der
Funktion hostgroup()) |
| $patchfile | Name 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. | Parameter | Wert im Beispiel | Bemerkung |
| 1 | Befehl | synconly | synchronisiert nur, ohne Start |
| 2 | IP-Adresse des LINBO-Servers | "$myserverip" | wird automatisch aus
/tmp/dhcp.log ermittelt |
| 3 | Cachepartition | "$1" | steht in der Variablen $1 zur
Verfügung (Bsp.: /dev/sda6) |
| 4 | Dateiname des Basisimages | "$mybaseimage" | Dateiname laut start.conf (Bsp.:
maverick.cloop) |
| 5 | Dateiname des Rsyncimages | "$myrsyncimage" | Dateiname laut start.conf, falls nicht definiert muss
"" angegeben werden. |
| 6 | Bootpartition | "" | laut start.conf, kann leer sein, "" muss angegeben
werden. |
| 7 | Rootpartition | "$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.logDazu 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
fiDer Raumpatch muss für dieses Beispiel unter
/var/linbo/<raum>.reg bereitgestellt werden
und kann z.B. einen Standarddrucker-Patch enthalten.