Zum Inhalt

setup-teilnehmer.sh

Pro Teilnehmer ausführen – setzt User, Ports, Lingering und Kursvariablen.

Download und ausführen:

curl -O https://podman.stic.ch/setup/setup-teilnehmer.sh
chmod +x setup-teilnehmer.sh
sudo ./setup-teilnehmer.sh teilnehmer01
sudo ./setup-teilnehmer.sh teilnehmer02
# ...

Was das Skript macht: - User anlegen mit Passwort - subuid/subgid für Rootless Podman konfigurieren - Lingering aktivieren - Podman prüfen / installieren - PORT und USER_NAME in ~/.bash_profile setzen - Kurs-Info Datei erstellen - Login-Anzeige (MOTD) einrichten - Kurztest durchführen


setup-teilnehmer.sh
#!/bin/bash
# =============================================================================
# setup-teilnehmer.sh – Podman Kurs Teilnehmer-Setup
# Verwendung: sudo ./setup-teilnehmer.sh <teilnehmername>
# Beispiel:   sudo ./setup-teilnehmer.sh teilnehmer01
# =============================================================================

set -euo pipefail

# --- Farben für Output ---
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

ok()   { echo -e "${GREEN}[OK]${NC}    $1"; }
info() { echo -e "${YELLOW}[INFO]${NC}  $1"; }
err()  { echo -e "${RED}[FEHLER]${NC} $1"; exit 1; }

# --- Parameter prüfen ---
if [[ $# -ne 1 ]]; then
  echo "Verwendung: sudo $0 <teilnehmername>"
  echo "Beispiel:   sudo $0 teilnehmer01"
  exit 1
fi

USERNAME="$1"
# Standardpasswort – vor dem Kurs ändern wenn gewünscht
PASSWORD="Kurs2024!"

# Port-Bereich basierend auf User-Nummer zuweisen
# teilnehmer01 → 8100-8199, teilnehmer02 → 8200-8299, etc.
NUM=$(echo "$USERNAME" | grep -oE '[0-9]+$' || true)
if [[ -n "$NUM" ]]; then
  PORT_BASE=$((8000 + NUM * 100))
  PORT_END=$((PORT_BASE + 99))
  PORT_INFO="${PORT_BASE}${PORT_END}"
else
  PORT_BASE=8900
  PORT_END=8999
  PORT_INFO="8900–8999 (kein Nummer im Username erkannt)"
fi

SERVER_IP=$(hostname -I | awk '{print $1}')

echo ""
echo "=============================================="
echo "  Podman Kurs – Teilnehmer Setup"
echo "  User: ${USERNAME}"
echo "=============================================="
echo ""

# --- Root-Check ---
if [[ $EUID -ne 0 ]]; then
  err "Dieses Skript muss als root ausgeführt werden (sudo)."
fi

# =============================================================================
# SCHRITT 1 – User anlegen
# =============================================================================
info "Lege User '${USERNAME}' an..."

if id "$USERNAME" &>/dev/null; then
  info "User '${USERNAME}' existiert bereits – überspringe useradd."
else
  useradd -m -s /bin/bash "$USERNAME"
  ok "User '${USERNAME}' angelegt."
fi

# Passwort setzen
echo "${USERNAME}:${PASSWORD}" | chpasswd
ok "Passwort gesetzt."

# =============================================================================
# SCHRITT 2 – subuid / subgid für Rootless Podman
# =============================================================================
info "Prüfe subuid/subgid für Rootless Podman..."

if grep -q "^${USERNAME}:" /etc/subuid; then
  ok "subuid Eintrag vorhanden."
else
  # Letzte verwendete UID ermitteln und nächsten freien Block nehmen
  LAST_END=$(awk -F: '{print $2+$3}' /etc/subuid 2>/dev/null | sort -n | tail -1)
  START=${LAST_END:-100000}
  usermod --add-subuids "${START}-$((START + 65535))" "$USERNAME"
  ok "subuid konfiguriert (${START}-$((START + 65535)))."
fi

if grep -q "^${USERNAME}:" /etc/subgid; then
  ok "subgid Eintrag vorhanden."
else
  LAST_END=$(awk -F: '{print $2+$3}' /etc/subgid 2>/dev/null | sort -n | tail -1)
  START=${LAST_END:-100000}
  usermod --add-subgids "${START}-$((START + 65535))" "$USERNAME"
  ok "subgid konfiguriert."
fi

# =============================================================================
# SCHRITT 3 – Lingering aktivieren
# =============================================================================
info "Aktiviere Lingering für '${USERNAME}'..."

if loginctl show-user "$USERNAME" 2>/dev/null | grep -q "Linger=yes"; then
  ok "Lingering bereits aktiv."
else
  loginctl enable-linger "$USERNAME"
  ok "Lingering aktiviert – Container laufen nach Logout weiter."
fi

# =============================================================================
# SCHRITT 4 – Podman prüfen
# =============================================================================
info "Prüfe ob Podman installiert ist..."

if ! command -v podman &>/dev/null; then
  info "Podman nicht gefunden – installiere..."
  dnf install -y podman podman-compose container-tools podman-docker
  ok "Podman installiert."
else
  ok "Podman ist installiert ($(podman --version))."
fi

# =============================================================================
# SCHRITT 5 – Kurs-Info Datei erstellen
# =============================================================================
info "Erstelle Kurs-Info Datei..."

cat > "/home/${USERNAME}/.kurs-info" << EOF
====================================
  Podman Kurs – Deine Umgebung
====================================
User:        ${USERNAME}
Passwort:    ${PASSWORD}
Port-Range:  ${PORT_INFO}
Server-IP:   ${SERVER_IP}

Schnellstart:
  podman images
  podman run -d -p ${PORT_BASE}:80 --name mein-nginx nginx
  curl http://localhost:${PORT_BASE}

Nützliche Befehle:
  podman ps          – laufende Container
  podman ps -a       – alle Container
  podman logs <name> – Logs anzeigen
  podman exec -it <name> /bin/bash  – in Container einloggen
====================================
EOF

chown "${USERNAME}:${USERNAME}" "/home/${USERNAME}/.kurs-info"
ok "Kurs-Info Datei erstellt unter /home/${USERNAME}/.kurs-info"

# =============================================================================
# SCHRITT 6 – Kursvariablen im bash_profile setzen
# =============================================================================
info "Setze Kursvariablen PORT und USER_NAME in ~/.bash_profile..."

BASH_PROFILE="/home/${USERNAME}/.bash_profile"

# Sicherstellen dass bash_profile existiert
touch "$BASH_PROFILE"

# Bestehende Kurs-Variablen-Einträge entfernen (idempotent)
sed -i '/# PODMAN KURS VARIABLEN/,/# END PODMAN KURS VARIABLEN/d' "$BASH_PROFILE" 2>/dev/null || true

# Variablen anhängen
cat >> "$BASH_PROFILE" << VARSEOF

# PODMAN KURS VARIABLEN
export USER_NAME="${USERNAME}"
export PORT=${PORT_BASE}
# END PODMAN KURS VARIABLEN
VARSEOF

chown "${USERNAME}:${USERNAME}" "$BASH_PROFILE"
ok "Kursvariablen gesetzt: USER_NAME=${USERNAME}, PORT=${PORT_BASE}"

# =============================================================================
# SCHRITT 7 – MOTD beim Login anzeigen
# =============================================================================
info "Konfiguriere Login-Anzeige..."

PROFILE_SCRIPT="/etc/profile.d/kurs-info.sh"
if [[ ! -f "$PROFILE_SCRIPT" ]]; then
  echo 'cat ~/.kurs-info 2>/dev/null || true' > "$PROFILE_SCRIPT"
  chmod +x "$PROFILE_SCRIPT"
  ok "Login-Anzeige konfiguriert."
else
  ok "Login-Anzeige bereits vorhanden."
fi

# =============================================================================
# ABSCHLUSS – Zusammenfassung und Kurztest
# =============================================================================
echo ""
echo "=============================================="
echo "  Setup abgeschlossen – Kurztest läuft..."
echo "=============================================="
echo ""

# Test: kann User podman aufrufen?
if su - "$USERNAME" -c "podman --version" &>/dev/null; then
  ok "Podman als '${USERNAME}' aufrufbar."
else
  err "Podman als '${USERNAME}' nicht aufrufbar – bitte manuell prüfen."
fi

# Test: subuid gesetzt?
if su - "$USERNAME" -c "podman unshare cat /proc/self/uid_map" &>/dev/null; then
  ok "Rootless Podman (UID-Mapping) funktioniert."
else
  err "UID-Mapping funktioniert nicht – subuid/subgid prüfen."
fi

echo ""
echo "=============================================="
ok "User '${USERNAME}' ist bereit für den Kurs!"
echo ""
echo "  SSH-Zugang:  ssh ${USERNAME}@${SERVER_IP}"
echo "  Passwort:    ${PASSWORD}"
echo "  Ports:       ${PORT_INFO}"
echo "=============================================="
echo ""