espo-deploy/rmm-tasks/ESPO-01-Grundeinrichtung.sh
Gordon Zimm d4e0294bfd ESPO-01 entfernt ScreenConnect und prueft apt - Ursache der ESPO-02-Fehler
Auf der Test-VM liegt der ScreenConnect-Client des Agenten im Zustand iU
(entpackt, nie konfiguriert), weil ihm java5-runtime fehlt. In diesem Zustand
blockiert er jede apt-Operation; ESPO-02 scheiterte daran, nicht an den
Docker-Pins.

ESPO-01 entfernt den Client jetzt als erstes (Paketname traegt je Geraet ein
anderes Suffix, daher Mustersuche), raeumt mit --fix-broken auf und bricht ab,
wenn apt danach immer noch gebrochene Abhaengigkeiten meldet. Damit ist O-20
im Skript erledigt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-24 09:47:49 +02:00

108 lines
4.8 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>"
# Der RMM-Task ist nur ein duenner Ausloeser, der dieses Skript holt und mit %companyname% aufruft.
# Ob der Lauf erlaubt ist, entscheidet der Task selbst per If/Then auf espo_zustand.
set -u
# Standzeile: zeigt im Protokoll, welche Fassung tatsaechlich gelaufen ist.
echo "ESPO-01-Grundeinrichtung, Skriptstand 2026-09-24"
KUNDE_ROH="${1:-}"
FEHLER=0
# 1. ScreenConnect entfernen. Der Agent rollt den Client aus, ADR 0003 sagt: wir wollen ihn nicht.
# Auf Ubuntu bleibt er ausserdem halb konfiguriert haengen, weil ihm java5-runtime fehlt - und
# in diesem Zustand blockiert er jede weitere apt-Operation auf der VM (gemessen am 24.09.2026).
SC="$(dpkg-query -W -f='${Package}\n' 'connectwisecontrol-*' 2>/dev/null | grep . || true)"
if [ -n "$SC" ]; then
echo "ScreenConnect gefunden: $(echo "$SC" | tr '\n' ' ')"
DEBIAN_FRONTEND=noninteractive apt-get purge -y -q $SC >/dev/null 2>&1 \
|| dpkg --purge --force-depends $SC >/dev/null 2>&1 || true
DEBIAN_FRONTEND=noninteractive apt-get --fix-broken install -y -q >/dev/null 2>&1 || true
if dpkg-query -W -f='${Package}\n' 'connectwisecontrol-*' 2>/dev/null | grep -q .; then
echo "FEHLER: ScreenConnect liess sich nicht entfernen"; FEHLER=1
else
echo "ScreenConnect: entfernt"
fi
else
echo "ScreenConnect: nicht installiert"
fi
# 2. apt muss danach sauber sein, sonst scheitert jeder folgende Schritt an einem fremden Paket.
if ! DEBIAN_FRONTEND=noninteractive apt-get check >/dev/null 2>&1; then
echo "FEHLER: apt meldet weiterhin gebrochene Abhaengigkeiten:"
dpkg -l | awk '$1 !~ /^ii/ && NR > 5 {print " " $0}'
FEHLER=1
else
echo "apt: keine gebrochenen Abhaengigkeiten"
fi
# 3. 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
# 4. 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
# 5. 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
# 6. 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
# 7. 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"
# 8. 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"
# 9. 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
# 10. 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
# 11. 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