Patchklassen für Postsync-Scripte

Die Bereiche, für die Anpassungen vorgenommen werden sollen, heißen Patchklassen.

Ablage der Patches

Zunächst ist das Verzeichnis /srv/linbo/linuxmuster-client/ anzulegen:

mkdir -p /srv/linbo/linuxmuster-client/

Unter /srv/linbo/linuxmuster-client/ sind weitere Unterverzeichnisse für die sog. Patchklassen anzulegen.

In der ersten Ebene wird nach dem verwendeten Imagenamen (qcow2-Datei) unterschieden. Bei Linuxmuster-Clients 20.04 (Focal Fossa) wäre dies z.B. das Verzeichnis focalfossa, oder bei Einsatz von Pop! OS 22.04 popos2204:

/srv/linbo/linuxmuster-client/focalfossa/
/srv/linbo/linuxmuster-client/popos2204/

In der nächsten Ebene können weitere Unterscheidungen nach folgendem Schema angewendet werden:

im Unterverzeichnis .../common liegende Patches erhalten alle Rechner, die dieses Image nutzen.
im Unterverzeichnis  .../r100 liegende Patches erhalten nur die Rechner in Raum r100.
im Unterverzeichnis .../r100-pc01 liegende Patches erhält nur der PC01 in Raum r100.

Hinweis

In der Geräteverwaltung muss der Rechnername nach dem Schema RaumName-PCName benannt worden sein. Beispiel: Raum: r100 Rechnermane: r100-pc01

Unterhalb dieser Verzeichnisse sind alle Anpassungen so abzulegen, dass sie mit der Verzeichnisstruktur der betreffenden Clients identisch sind. So wird z.B. beim Anlegen der Datei auf dem Server:

../common/etc/cups/cups.conf

Die cups.conf im Verzeichnis /etc/cups auf allen Clients der Patchklasse entsprechend angepasst.

In der Patchklasse focalfossa würde eine Änderung der Datei rc.local auf allen Rechnern in folgendem Server-Verzeichnis abgelegt werden:

/srv/linbo/linuxmuster-client/focalfossa/common/etc/rc.local

Weitere Skripte ausführen

Das universelle Postsync-Script ist so aufgebaut, dass auch noch weitere Scripte ausgeführt werden können.

So können z.B. spezielle Anpassungen von PCs in einem bestimmten Raum vorgenommen werden. Alle abzuarbeitenden Scripte müssen im Verzeichnis postsync.d liegen.

Sollen Scripte für die Patchklasse focalfossa und dann nur auf PCs im Raum r100 angewendet werden, so müssen die Scripte in folgendem Verzeichnis liegen:

/srv/linbo/linuxmuster-client/focalfossa/r100/postsync.d/

Die Skripte müssen sh-Scripte sein, da Linbo keine BASH als Shell kennt. In diesen Scripten ist der Shebang #!/bin/sh voranzustellen. Diese Scripte müssen zur Anwendung für die gewünschte Patchklasse in das jeweilige Verzeichnis kopiert und angepasst werden. Diese Scripte werden entsprechend ihrer lexikalischen Reihenfolge ausgeführt, also hier beginnend mit der niedrigsten Ziffer.

Beispiel

Nachstehender Verzeichnisbaum verdeutlicht, dass für Linuxmuster-Clients für alle PCs der Patchklasse focalfossa alles unterhalb von ./common angewendet wird. Modulare Postsync-Scripte finden sich unter ./common/postsync.d/ und werden in lexikalischer Reihenfolge abgearbeitet. Zudem wird für den raum1 alles unterhalb von ./raum1 angewendet und schließlich wird für den Lehrer-PC in raum1 alles unterhalb von ./raum1-lehrer-pc angewendet.

root@server:/srv/linbo/linuxmuster-client/focalfossa # ls -ld $(find .)
drwxr-xr-x 7 root root 4096 Nov 20 10:25 .
drwxr-xr-x 3 root root 4096 Apr 22  2016 ./common
drwxr-xr-x 3 root root 4096 Mär 17 12:54 ./common/etc
drwxrwxr-x 2 root root 4096 Mai  9  2016 ./common/etc/cups
-rw-r--r-- 1 root root   21 Mai  9  2016 ./common/etc/cups/client.conf
-rw-r--r-- 1 root root  797 Mär 31 09:16 ./common/etc/fstab
-rw-r--r-- 1 root root  443 Mai  9  2016 ./common/etc/hosts
drwxr-xr-x 3 root root 4096 Mär 17 12:54 ./common/postsync.d
-rw-r--r-- 1 root root   21 Mai  9  2016 ./common/postsync.d/00-lcst-fix-initrd.sh
-rw-r--r-- 1 root root  797 Mär 31 09:16 ./common/postsync.d/01-lcst-setlocalpasswords.sh
drwxr-xr-x 4 root root 4096 Mär 26  2015 ./raum1
drwxr-xr-x 7 root root 4096 Nov 20 10:10 ./raum1/etc
drwxr-xr-x 2 root root 4096 Apr 14 10:38 ./raum1/etc/cups
-rw------- 1 root root 3588 Apr 14 10:40 ./raum1/etc/cups/printers.conf
drwxr-xr-x 2 root root 4096 Mär 26  2015 ./raum1/etc/default
-rw-r--r-- 1 root root  369 Nov  5  2011 ./raum1/etc/default/epoptes
-rw-r--r-- 1 root root  668 Nov 20 10:01 ./raum1/etc/default/epoptes-client
drwxr-xr-x 2 root root 4096 Mär 26  2015 ./raum1/etc/epoptes
-rw-r--r-- 1 root root  875 Mär 26  2015 ./raum1/etc/epoptes/server.crt
-rw------- 1 root root  916 Mär 26  2015 ./raum1/etc/epoptes/server.key
-rw-r--r-- 1 root root  984 Nov 20 10:18 ./raum1/etc/hosts
drwxr-xr-x 2 root root 4096 Mär 26  2015 ./raum1/etc/init.d
-rwxr-xr-x 1 root root 1645 Apr  8  2012 ./raum1/etc/init.d/epoptes
-rwxr-xr-x 1 root root 1124 Apr  8  2012 ./raum1/etc/init.d/epoptes-client
drwxr-xr-x 3 root root 4096 Mär 26  2015 ./raum1/etc/xdg
drwxr-xr-x 2 root root 4096 Mär 26  2015 ./raum1/etc/xdg/autostart
-rw-r--r-- 1 root root  428 Nov 20 10:45 ./raum1/etc/xdg/autostart/epoptes-client.desktop
drwxr-xr-x 5 root root 4096 Jan 22 18:23 ./raum1-lehrer-pc
drwxr-xr-x 7 root root 4096 Nov 20 10:10 ./raum1-lehrer-pc/etc
drwxr-xr-x 2 root root 4096 Okt 23  2014 ./raum1-lehrer-pc/etc/cups
-rw------- 1 root root 3588 Apr 14 10:40 ./raum1-lehrer-pc/etc/cups/printers.conf
drwxr-xr-x 2 root root 4096 Mär 26  2015 ./raum1-lehrer-pc/etc/default
-rw-r--r-- 1 root root  370 Nov 20 10:14 ./raum1-lehrer-pc/etc/default/epoptes
-rw-r--r-- 1 root root    0 Nov 20 10:21 ./raum1-lehrer-pc/etc/default/epoptes-client
drwxr-xr-x 2 root root 4096 Mär 26  2015 ./raum1-lehrer-pc/etc/epoptes
-rw-r--r-- 1 root root  875 Mär 26  2015 ./raum1-lehrer-pc/etc/epoptes/server.crt
-rw-r--r-- 1 root root  916 Mär 26  2015 ./raum1-lehrer-pc/etc/epoptes/server.key
-rw-r--r-- 1 root root  983 Nov 20 10:17 ./raum1-lehrer-pc/etc/hosts
drwxr-xr-x 2 root root 4096 Mär 26  2015 ./raum1-lehrer-pc/etc/init.d
-rwxr-xr-x 1 root root 1645 Apr  8  2012 ./raum1-lehrer-pc/etc/init.d/epoptes
-rwxr-xr-x 1 root root    0 Nov 20 10:22 ./raum1-lehrer-pc/etc/init.d/epoptes-client

Universelles Postsync-Script

Das universelle Postsync-Script ist unter /srv/linbo/images/<LinuxImageVerzeichnis>/<LinuxImageName>.postsync mit folgendem Inhalt anzulegen bzw. wie zuvor beschrieben zu kopieren und gemäß der eigenen Anforderungen anzupassen:

echo "##### POSTSYNC BEGIN #####"
LOG=/mnt/var/log/postsync.log
echo "##### POSTSYNC BEGIN #####" >  $LOG
NOW=$(date +%Y%m%d-%H%M)
echo $NOW | tee -a $LOG

# IP-Adresse des Servers für LINBO 4.1
SERVERIP=$LINBOSERVER

# Die Hostgruppe des aktuellen Rechners  wird mit $HOSTGROUP abgerufen

# Raum feststellen. Dieses Skript geht davon aus
# dass die Rechner Namen der Form
# raumname-hostname haben, also z.B. cr01-pc18
RAUM=${HOSTNAME%%-*}

# wenn der string leer ist, Raum auf unknown setzen
if [ "x${RAUM}" == "x" ]; then
    RAUM="unknown"
fi

# UVZ für die Patches auf dem Server. Mit dieser Variablen
# kann man verschiedene Patches, z.B. für unterschiedliche
# Linux-Versionen bereitstellen.
# Wenn man hier $HOSTGROUP einträgt, erhält jede Rechnerklasse
# ein eigenes Patchklassenverzeichnis auf dem Server.
# Damit kann man verschiedene Patchklassen mit derselben cloop-Datei
# bedienen, wenn man das benötigt.
PATCHCLASS="focalfossa" #Name der Patchklasse anpassen

# Das Verzeichnis, in dem die Serverpatches
# im lokalen Clientcache synchronisiert werden.
PATCHCACHE=/linuxmuster-client/serverpatches

echo "" | tee -a $LOG
echo "Hostname:      ${HOSTNAME}" | tee -a $LOG
echo "Raum:          ${RAUM}" | tee -a $LOG
echo "Patchcache:    ${PATCHCACHE}" | tee -a $LOG
echo "Hostgruppe:    ${HOSTGROUP}"   | tee -a $LOG
echo "Patchclass:    ${PATCHCLASS}" | tee -a $LOG
echo "" | tee -a $LOG

# -----------------------------------------
# Patchdateien auf das lokale Image rsyncen
# -----------------------------------------
echo " - getting patchfiles" | tee -a $LOG

# RAUM     -> Raumname
# HOSTNAME -> Rechnername
# Verzeichnis anlegen, damit es sicher existiert
mkdir -p /cache/${PATCHCACHE}
rsync --delete --progress -r "${SERVERIP}::linbo/linuxmuster-client/${PATCHCLASS}" "/cache/${PATCHCACHE}" | tee -a $LOG

echo " - patching local files"  | tee -a $LOG

# common: Bekommen alle clients der Patchklasse
# files
if [ -d /cache/${PATCHCACHE}/${PATCHCLASS}/common ]; then
    echo "   - patching common to /mnt" | tee -a $LOG
    cp -ar /cache/${PATCHCACHE}/${PATCHCLASS}/common/* /mnt/ | tee -a $LOG
fi

# tarpacks
if [ -d /cache/${PATCHCACHE}/${PATCHCLASS}/common/tarpacks ]; then
  echo "   - unpacking tarpacks from common/tarpacks to /mnt" | tee -a $LOG
  for pack in /cache/${PATCHCACHE}/${PATCHCLASS}/common/tarpacks/*; do
     echo "     - unpacking: $pack" | tee -a $LOG
     tar xvzf $pack -C /mnt | tee -a $LOG
  done
fi

# Raum: Nur die Clients des Raums
# files
if [ -d /cache/${PATCHCACHE}/${PATCHCLASS}/${RAUM} ]; then
    echo "   - patching ${RAUM} to /mnt" | tee -a $LOG
    cp -ar /cache/${PATCHCACHE}/${PATCHCLASS}/${RAUM}/* /mnt/ | tee -a $LOG
fi

# tarpacks
if [ -d /cache/${PATCHCACHE}/${PATCHCLASS}/${RAUM}/tarpacks ]; then
  echo "   - unpacking tarpacks from ${RAUM}/tarpacks to /mnt" | tee -a $LOG
  for pack in /cache/${PATCHCACHE}/${PATCHCLASS}/${RAUM}/tarpacks/*; do
     echo "     - unpacking: $pack" | tee -a $LOG
     tar xvzf $pack -C /mnt | tee -a $LOG
  done
fi

# Host: Nur der Rechner
# files
if [ -d /cache/${PATCHCACHE}/${PATCHCLASS}/${HOSTNAME} ]; then
    echo "   - patching ${HOSTNAME} to /mnt"  | tee -a $LOG
    cp -ar /cache/${PATCHCACHE}/${PATCHCLASS}/${HOSTNAME}/* /mnt/ | tee -a $LOG
fi

# tarpacks
if [ -d /cache/${PATCHCACHE}/${PATCHCLASS}/${HOSTNAME}/tarpacks ]; then
  echo "   - unpacking tarpacks from ${HOSTNAME}/tarpacks to /mnt" | tee -a $LOG
 for pack in /cache/${PATCHCACHE}/${PATCHCLASS}/${HOSTNAME}/tarpacks/*; do
     echo "     - unpacking: $pack" | tee -a $LOG
    tar xvzf $pack -C /mnt | tee -a $LOG
 done
fi

# Hook, um eigene Skripte auszuführen
if [ -d /mnt/postsync.d ]; then
     for SCRIPT in /mnt/postsync.d/*
    do
        chmod 755 $SCRIPT
        echo "Executing: $SCRIPT" | tee -a $LOG
        #$SCRIPT > /dev/null 2>&1
        $SCRIPT | tee -a $LOG
        echo " ...done." | tee -a $LOG
    done
    rm -rf /mnt/postsync.d
fi

# wenn es /mnt/tarpacks gibt - löschen
rm -rf /mnt/tarpacks

# hostname in /etc/hosts patchen
# es muss eine Datei hosts im Verzeichnis
# /srv/linbo/linuxmuster-client/$HOSTGROUP/common|raum|hostname/etc/
# geben, die den HOSTNAME anpasst. Zudem muss dort die SERVERIP angepasst werden.
# Fehlt diese Datei werden der Hostname und die SERVERIP nicht ersetzt.
sed -i "s/HOSTNAME/$HOSTNAME/g" /mnt/etc/hosts
sed -i "s/#SERVERIP/$SERVERIP/g" /mnt/etc/hosts

# Zeitstempel letzter sync hinterlegen
echo $NOW > /mnt/lastsync

echo "##### POSTSYNC END #####" | tee -a $LOG

# Folgende Zeile stellt sicher, dass bei Änderungen des Postsync-Scriptes auf dem Server
# diese auch auf den Client übertragen werden.
# Achtung: Imageverzeichnis und Imagename sind anzupassen
rsync --progress -r $LINBOSERVER::linbo/images/focalfossa/focalfossa.postsync /cache/

Achtung

Um Komplikationen vorzubeugen, verwende das Kommando exit in keinem Deiner Postsync-Scripte!

Variablen im Postsync-Script

In LINBO 4.1 stehen für die Postsync-Scripte bereits Variablen zum Abruf bereit. Nachstehende Übersicht mit Bildschirmausgaben nach dem Schema Text -> Variablenwert veranschaulicht dies:

echo "# postsync script example"
echo "os partition  : $root"
echo "os name       : $name"
echo "os description: $description"
echo "cache device  : $cache"
echo "baseimage     : $baseimage"
echo "kernel        : $kernel"
echo "initrd        : $initrd"
echo "append        : $append"
echo "hostgroup     : $HOSTGROUP"
echo "hostname      : $HOSTNAME"
echo "domain        : $DOMAIN"
echo "ip            : $IP"
echo "netmask       : $SUBNET"
echo "bitmask       : $MASK"
echo "server ip     : $LINBOSERVER"
echo "server name   : $SNAME"

Anwendung des Postsync

Wurden alle Patchklassen und Scripte definiert, die Dateiberechtigungen wie angegeben kontrolliert und das Postsync-Script in dem Image-Verzeichnis hinterlegt, fehlt noch ein wesentlicher Schritt, um das Postsync Script anzuwenden.

Achtung

Das Postsync-Script wird erst angewendet, wenn die betreffenden Clients partitioniert, formatiert und synchronisiert wurden. Erst hierbei wird das Postsync-Script auf den Client übertragen !