#!/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- # 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