Files
schul-laptops/files/clonezilla/schul-reimage.sh
Herb 72d0b11647 Jahres-Reimage: Boot-Check, GRUB-Eintrag, Clonezilla-Batch-Skript
reimage-check erkennt die Platte DEZNTRSICHERUNG mit neuerem Image und
bootet in den GRUB-Eintrag Schul-Neuinstallation (Clonezilla toram).
schul-reimage.sh: Mini-Menue (AUFSPIELEN auto nach 20 s / IMAGE ERSTELLEN /
Abbrechen), ocs-sr im Batch-Modus ohne Nachpruefung (E-004), Hostname
bleibt erhalten, Admin-Key nur auf laptop03 (E-005). local.yml haelt
alles per Pull aktuell.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 13:21:32 +02:00

119 lines
4.7 KiB
Bash

#!/bin/bash
#
# Laeuft in der Clonezilla-Live-Umgebung (via ocs_live_run, toram).
# Eigenes Mini-Menue statt Clonezilla-TUI, alle Sicherheitsschranken aus (E-004):
#
# AUFSPIELEN - neuestes Image von der Platte, Hostname bleibt erhalten
# (vorausgewaehlt, startet nach 20 s automatisch)
# IMAGE ERSTELLEN - sichert diesen Rechner als schule-laptop-<Datum>
# ABBRECHEN - Neustart ins normale System
#
set -u
DISK="sda"
ROOT_PART="/dev/sda2" # 12x identische Hardware: UEFI, sda1=EFI, sda2=System
LABEL="DEZNTRSICHERUNG"
IMG_MNT="/home/partimag" # Clonezilla-Standardpfad fuer Images
VERSION_FILE="/etc/schul-image-version"
rot() { echo -e "\033[0;31m$*\033[0m"; }
gruen(){ echo -e "\033[0;32m$*\033[0m"; }
gelb() { echo -e "\033[1;33m$*\033[0m"; }
# ---------- Image-Platte einbinden ----------
mkdir -p "$IMG_MNT"
if ! mountpoint -q "$IMG_MNT"; then
DEV=$(blkid -L "$LABEL" 2>/dev/null)
if [ -z "$DEV" ] || ! mount "$DEV" "$IMG_MNT"; then
rot "Platte '$LABEL' nicht gefunden — Neustart in 15 s."
sleep 15; reboot; exit 1
fi
fi
NEWEST=$(find "$IMG_MNT" -maxdepth 1 -name 'schule-laptop-*' -type d -printf '%f\n' | sort | tail -1)
# ---------- Hostname aus dem alten System retten ----------
OLD_HOSTNAME=""
mkdir -p /mnt/altes-system
if mount -o ro "$ROOT_PART" /mnt/altes-system 2>/dev/null; then
OLD_HOSTNAME=$(cat /mnt/altes-system/etc/hostname 2>/dev/null | tr -d '[:space:]')
umount /mnt/altes-system
fi
# ---------- Mini-Menue ----------
clear
gruen "==============================================="
gruen " SCHUL-LAPTOPS — IMAGE-STATION"
gruen "==============================================="
echo "Rechner: ${OLD_HOSTNAME:-unbekannt}"
echo "Neuestes Image: ${NEWEST:-KEINES GEFUNDEN}"
echo
echo " [a] AUFSPIELEN (Standard, startet automatisch)"
echo " [i] IMAGE ERSTELLEN (diesen Rechner sichern)"
echo " [x] Abbrechen (Neustart ins normale System)"
echo
gelb "AUFSPIELEN startet in 20 Sekunden ..."
WAHL="a"
read -t 20 -n 1 -r WAHL_INPUT && WAHL="${WAHL_INPUT:-a}"
echo
case "$WAHL" in
i|I)
NEU="schule-laptop-$(date +%Y-%m-%d)"
gelb "Erstelle Image '$NEU' von /dev/$DISK ..."
# Batch, zstd-Kompression, KEINE Nachpruefung des Images (-scs, E-004)
/usr/sbin/ocs-sr -q2 -j2 -z5p -i 4096 -sfsck -senc -scs -batch -p true savedisk "$NEU" "$DISK"
# Eigene Versionsdatei nachziehen: der gesicherte Rechner ist damit "aktuell"
# und bespielt sich nicht beim naechsten Boot selbst mit dem eigenen Image.
if mount "$ROOT_PART" /mnt/altes-system 2>/dev/null; then
echo "$NEU" > /mnt/altes-system$VERSION_FILE
umount /mnt/altes-system
fi
gruen "Image '$NEU' erstellt — Rechner faehrt herunter."
sleep 5; poweroff
;;
x|X)
gelb "Abgebrochen — Neustart."
sleep 3; reboot
;;
*)
if [ -z "$NEWEST" ]; then
rot "Kein Image auf der Platte — Neustart in 15 s."
sleep 15; reboot; exit 1
fi
gelb "Spiele '$NEWEST' auf /dev/$DISK auf ..."
# Batch, KEINE Bestaetigungen, KEINE Nachpruefung (-scr), Groessencheck aus (E-004)
/usr/sbin/ocs-sr -g auto -e1 auto -e2 -r -j2 -icds -k1 -scr -batch -p true restoredisk "$NEWEST" "$DISK"
# ---------- Frisches System personalisieren ----------
gelb "Personalisiere frisches System (${OLD_HOSTNAME:-laptopXX}) ..."
mkdir -p /mnt/neues-system
if mount "$ROOT_PART" /mnt/neues-system; then
if [ -n "$OLD_HOSTNAME" ]; then
echo "$OLD_HOSTNAME" > /mnt/neues-system/etc/hostname
sed -i "s/127.0.1.1.*/127.0.1.1\t$OLD_HOSTNAME/" /mnt/neues-system/etc/hosts
fi
# Neue SSH-Host-Keys + Machine-ID (jeder Klon muss eindeutig sein)
rm -f /mnt/neues-system/etc/ssh/ssh_host_*
chroot /mnt/neues-system ssh-keygen -A
rm -f /mnt/neues-system/etc/machine-id /mnt/neues-system/var/lib/dbus/machine-id
chroot /mnt/neues-system dbus-uuidgen --ensure=/etc/machine-id
cp /mnt/neues-system/etc/machine-id /mnt/neues-system/var/lib/dbus/machine-id
# Versionsdatei: dieses Image ist jetzt installiert
echo "$NEWEST" > /mnt/neues-system$VERSION_FILE
# Privater Gitea-Admin-Key gehoert nur auf laptop03 (E-005)
if [ "$OLD_HOSTNAME" != "laptop03" ]; then
rm -f /mnt/neues-system/home/puettmann/.ssh/id_ed25519 \
/mnt/neues-system/home/puettmann/.ssh/id_ed25519.pub
fi
umount /mnt/neues-system
gruen "Fertig: ${OLD_HOSTNAME:-unbenannt} mit Image '$NEWEST'."
else
rot "Konnte frisches System nicht mounten — Personalisierung uebersprungen!"
rot "Bitte von Hand: first-boot-setup.sh ausfuehren."
sleep 15
fi
sleep 5; poweroff
;;
esac