espo-deploy/rmm-tasks/ESPO-01-Grundeinrichtung.sh
Gordon Zimm dcd99c3ba9 Zustandsriegel: die drei Einrichtungsskripte laufen nur bei espo_zustand = NEU
Statt lokaler Merkmale steuert das Custom Field espo_zustand zentral, was laufen
darf. Jedes der drei Skripte nimmt den Wert als Argument und bricht ohne
Aenderung ab, wenn er nicht NEU ist.

In ESPO-03 bleibt die Pruefung auf eine vorhandene Instanz als Rueckfall
erhalten: Der Zustand im RMM ist von Hand aenderbar, eine laufende Instanz ist
es nicht.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 15:10:15 +02:00

86 lines
3.7 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# ESPO-01-Grundeinrichtung – schliesst die Basis-VM ab.
# Laeuft als root, ist idempotent und kann jederzeit wiederholt werden.
# Aufruf: bash ESPO-01-Grundeinrichtung.sh "<Kundenname>" "<Zustand>"
# Der RMM-Task ist nur ein duenner Ausloeser, der dieses Skript holt und mit %companyname%
# und dem Wert des Custom Field espo_zustand aufruft.
set -u
KUNDE_ROH="${1:-}"
ZUSTAND="${2:-}"
FEHLER=0
# 0. Zustandsriegel: Die Einrichtung laeuft nur an einer Instanz, die im RMM als NEU gefuehrt wird.
# Das Custom Field espo_zustand steuert damit zentral, was laufen darf.
if [ "$ZUSTAND" != "NEU" ]; then
echo "FEHLER: espo_zustand ist '${ZUSTAND:-leer}', erwartet NEU - Abbruch ohne Aenderung"
echo "ESPO01_ERGEBNIS: FEHLER"; exit 1
fi
# 1. Hostname aus dem Kundennamen ableiten (klein, nur a-z 0-9 und Bindestrich), damit die
# Flotte im RMM und in Logs eindeutig benannt ist.
KUNDE=$(printf '%s' "$KUNDE_ROH" | tr '[:upper:]' '[:lower:]' | tr -c 'a-z0-9' '-' | sed 's/-\+/-/g; s/^-//; s/-$//')
SOLL="crm-${KUNDE}"
IST=$(hostnamectl --static)
if [ -z "$KUNDE" ]; then
echo "FEHLER: Kundenname leer - Hostname nicht gesetzt"; FEHLER=1
elif [ "$IST" != "$SOLL" ]; then
hostnamectl set-hostname "$SOLL" && sed -i "s/\b${IST}\b/${SOLL}/g" /etc/hosts
echo "Hostname: $IST -> $SOLL"
else
echo "Hostname: $SOLL (unveraendert)"
fi
# 2. Hinweis auf das Initialpasswort aus dem Konsolen-Login entfernen - er hat nach der
# Erstanmeldung keinen Zweck mehr und steht sonst dauerhaft am Anmeldebildschirm.
if grep -q "Initialpasswort" /etc/issue; then
sed -i '/Initialpasswort/d; /beim ersten Anmelden/d' /etc/issue
echo "/etc/issue: Hinweis auf das Initialpasswort entfernt"
else
echo "/etc/issue: kein Hinweis vorhanden"
fi
# 3. Pruefen, dass das Konto ein gueltiges Passwort hat (Status P) - sonst ist die
# Erstinbetriebnahme unvollstaendig.
if [ "$(passwd -S administrator | awk '{print $2}')" = "P" ]; then
echo "Konto administrator: Passwort gesetzt"
else
echo "FEHLER: Konto administrator hat kein gueltiges Passwort"; FEHLER=1
fi
# 4. SSH haerten: keine Root-Anmeldung, wenige Fehlversuche, kurze Anmeldefrist.
install -d -m 755 /etc/ssh/sshd_config.d
cat > /etc/ssh/sshd_config.d/10-espo.conf <<'CONF'
PermitRootLogin no
MaxAuthTries 3
LoginGraceTime 20
CONF
if sshd -t; then systemctl reload ssh && echo "SSH: PermitRootLogin no, MaxAuthTries 3"; else echo "FEHLER: sshd-Konfiguration ungueltig"; FEHLER=1; fi
# 5. Journal begrenzen, damit Logs das Wurzeldateisystem nicht fuellen koennen.
install -d -m 755 /etc/systemd/journald.conf.d
printf '[Journal]\nSystemMaxUse=500M\n' > /etc/systemd/journald.conf.d/10-espo.conf
systemctl restart systemd-journald && echo "journald: SystemMaxUse=500M"
# 6. needrestart daran hindern, containerd automatisch neu zu starten - das wuerde die
# laufenden Container mitreissen. docker ist ab Werk schon ausgenommen.
install -d -m 755 /etc/needrestart/conf.d
printf '# containerd nicht automatisch neu starten (Container haengen daran).\n$nrconf{override_rc}{qr(^containerd)} = 0;\n' > /etc/needrestart/conf.d/10-espo.conf
echo "needrestart: containerd ausgenommen"
# 7. Zeitzone sicherstellen.
if [ "$(timedatectl show -p Timezone --value)" != "Europe/Berlin" ]; then
timedatectl set-timezone Europe/Berlin && echo "Zeitzone auf Europe/Berlin gesetzt"
else
echo "Zeitzone: Europe/Berlin"
fi
# 8. Automatische Sicherheitsupdates nur pruefen, nicht aendern - sie sind Ubuntu-Standard.
if grep -qs '"1"' /etc/apt/apt.conf.d/20auto-upgrades; then
echo "unattended-upgrades: aktiv"
else
echo "WARNUNG: unattended-upgrades nicht aktiv"; FEHLER=1
fi
# 9. Ergebniszeile fuer Monitor und Custom Field.
if [ "$FEHLER" -eq 0 ]; then echo "ESPO01_ERGEBNIS: OK"; exit 0; else echo "ESPO01_ERGEBNIS: FEHLER"; exit 1; fi