From 821883141e4492da999b65cbd9a7abdf3f26febc Mon Sep 17 00:00:00 2001 From: Till Tomczak Date: Wed, 4 Jun 2025 12:30:05 +0200 Subject: [PATCH] =?UTF-8?q?F=C3=BCge=20Berechtigungsmanagement=20f=C3=BCr?= =?UTF-8?q?=20Kiosk-User=20hinzu=20und=20erstelle=20ein=20Reparaturskript?= =?UTF-8?q?=20zur=20Korrektur=20von=20Berechtigungen=20nach=20npm-Installa?= =?UTF-8?q?tionen.=20Integriere=20die=20Funktionen=20zur=20Berechtigungsan?= =?UTF-8?q?passung=20in=20die=20Installationsprozesse.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- setup.sh | 301 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 301 insertions(+) diff --git a/setup.sh b/setup.sh index 72256be..2ff6f43 100644 --- a/setup.sh +++ b/setup.sh @@ -1711,6 +1711,283 @@ EOF log " 🛡️ Sichere Berechtigungen gesetzt" } +# =========================== BERECHTIGEN-MANAGEMENT =========================== +fix_project_permissions() { + log "=== BERECHTIGEN-MANAGEMENT FÜR KIOSK-USER ===" + + progress "Korrigiere Projekt-Berechtigungen für kiosk-User..." + + # Prüfe ob kiosk User existiert + if ! id "$KIOSK_USER" &>/dev/null; then + warning "⚠️ Kiosk-User '$KIOSK_USER' existiert nicht - erstelle ihn zuerst" + create_kiosk_user + fi + + local kiosk_home="/home/$KIOSK_USER" + + # Erstelle Entwicklungs-/Arbeitsverzeichnis im kiosk home + local kiosk_project_dir="$kiosk_home/manage-your-printer" + + progress "Erstelle kiosk-Arbeitsverzeichnis: $kiosk_project_dir" + if [ ! -d "$kiosk_project_dir" ]; then + mkdir -p "$kiosk_project_dir" 2>/dev/null || true + fi + + # Kopiere/Synchronisiere Projekt-Dateien zum kiosk-Verzeichnis + progress "Synchronisiere Projekt-Dateien für kiosk-User..." + + # Verwende rsync wenn verfügbar, sonst cp + if command -v rsync >/dev/null 2>&1; then + rsync -av --exclude='.git' --exclude='__pycache__' --exclude='*.pyc' \ + --exclude='instance/ssl/*' --exclude='logs/*' \ + "$CURRENT_DIR/" "$kiosk_project_dir/" 2>/dev/null || { + warning "⚠️ rsync fehlgeschlagen - verwende cp als Fallback" + cp -r "$CURRENT_DIR"/* "$kiosk_project_dir/" 2>/dev/null || true + } + else + cp -r "$CURRENT_DIR"/* "$kiosk_project_dir/" 2>/dev/null || true + fi + + # Setze kiosk als Besitzer des Arbeitsverzeichnisses + progress "Setze kiosk-User als Besitzer des Arbeitsverzeichnisses..." + chown -R "$KIOSK_USER:$KIOSK_USER" "$kiosk_project_dir" 2>/dev/null || warning "⚠️ Ownership konnte nicht vollständig gesetzt werden" + + # Spezielle Berechtigungen für verschiedene Bereiche + progress "Konfiguriere spezielle Berechtigungen..." + + # node_modules: kiosk User soll vollen Zugriff haben + if [ -d "$kiosk_project_dir/node_modules" ]; then + chown -R "$KIOSK_USER:$KIOSK_USER" "$kiosk_project_dir/node_modules" 2>/dev/null || true + chmod -R 755 "$kiosk_project_dir/node_modules" 2>/dev/null || true + success "✅ node_modules Berechtigungen für kiosk-User gesetzt" + fi + + # package.json und package-lock.json: kiosk User soll schreiben können + for file in package.json package-lock.json; do + if [ -f "$kiosk_project_dir/$file" ]; then + chown "$KIOSK_USER:$KIOSK_USER" "$kiosk_project_dir/$file" 2>/dev/null || true + chmod 664 "$kiosk_project_dir/$file" 2>/dev/null || true + fi + done + + # logs Verzeichnis: kiosk User soll schreiben können + if [ -d "$kiosk_project_dir/logs" ]; then + chown -R "$KIOSK_USER:$KIOSK_USER" "$kiosk_project_dir/logs" 2>/dev/null || true + chmod -R 755 "$kiosk_project_dir/logs" 2>/dev/null || true + fi + + # uploads Verzeichnis: kiosk User soll schreiben können + if [ -d "$kiosk_project_dir/uploads" ]; then + chown -R "$KIOSK_USER:$KIOSK_USER" "$kiosk_project_dir/uploads" 2>/dev/null || true + chmod -R 755 "$kiosk_project_dir/uploads" 2>/dev/null || true + fi + + # Auch die Original node_modules in APP_DIR korrigieren + progress "Korrigiere node_modules Berechtigungen in $APP_DIR..." + if [ -d "$APP_DIR/node_modules" ]; then + # Erstelle kiosk-Gruppe und füge root hinzu für geteilten Zugriff + groupadd -f kiosk-shared 2>/dev/null || true + usermod -a -G kiosk-shared root 2>/dev/null || true + usermod -a -G kiosk-shared "$KIOSK_USER" 2>/dev/null || true + + # Setze Gruppe auf kiosk-shared für geteilten Zugriff + chgrp -R kiosk-shared "$APP_DIR/node_modules" 2>/dev/null || true + chmod -R 775 "$APP_DIR/node_modules" 2>/dev/null || true + success "✅ node_modules geteilte Berechtigungen gesetzt" + fi + + # Erstelle npm-Konfiguration für kiosk User + progress "Konfiguriere npm für kiosk-User..." + if [ ! -d "$kiosk_home/.npm" ]; then + mkdir -p "$kiosk_home/.npm" 2>/dev/null || true + chown "$KIOSK_USER:$KIOSK_USER" "$kiosk_home/.npm" 2>/dev/null || true + fi + + # Erstelle .npmrc für kiosk User + cat > "$kiosk_home/.npmrc" << 'EOF' +# npm-Konfiguration für kiosk User +fund=false +audit-level=moderate +progress=false +loglevel=warn +cache=/home/kiosk/.npm +prefix=/home/kiosk/.npm-global +EOF + + chown "$KIOSK_USER:$KIOSK_USER" "$kiosk_home/.npmrc" 2>/dev/null || true + + # npm global Verzeichnis erstellen + mkdir -p "$kiosk_home/.npm-global" 2>/dev/null || true + chown -R "$KIOSK_USER:$KIOSK_USER" "$kiosk_home/.npm-global" 2>/dev/null || true + + success "✅ Projekt-Berechtigungen für kiosk-User konfiguriert" + info " 📁 Kiosk-Arbeitsverzeichnis: $kiosk_project_dir" + info " 👤 Besitzer: $KIOSK_USER" + info " 🔧 npm-Konfiguration erstellt" +} + +create_permission_fix_script() { + log "=== ERSTELLE BERECHTIGEN-REPARATUR-SKRIPT ===" + + local fix_script="$CURRENT_DIR/fix-permissions.sh" + + progress "Erstelle automatisches Berechtigen-Reparatur-Skript..." + + cat > "$fix_script" << 'EOF' +#!/bin/bash + +# =================================================================== +# MYP Berechtigen-Reparatur-Skript +# Behebt Berechtigungsprobleme nach npm install als root +# Kann von jedem User ausgeführt werden +# =================================================================== + +set -euo pipefail + +KIOSK_USER="kiosk" +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +# Farben für Ausgabe +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +log() { + echo -e "${GREEN}[$(date '+%H:%M:%S')] $1${NC}" +} + +warning() { + echo -e "${YELLOW}[WARNUNG] $1${NC}" +} + +error() { + echo -e "${RED}[FEHLER] $1${NC}" + exit 1 +} + +info() { + echo -e "${BLUE}[INFO] $1${NC}" +} + +# Prüfe root-Berechtigung +if [ "$EUID" -ne 0 ]; then + error "Dieses Skript muss als Root ausgeführt werden: sudo $0" +fi + +log "=== MYP BERECHTIGEN-REPARATUR ===" +log "Arbeitsverzeichnis: $SCRIPT_DIR" + +# Prüfe ob kiosk User existiert +if ! id "$KIOSK_USER" &>/dev/null; then + error "Kiosk-User '$KIOSK_USER' existiert nicht!" +fi + +# Lösche node_modules wenn vorhanden (für saubere Neuinstallation) +if [ -d "$SCRIPT_DIR/node_modules" ]; then + log "Entferne bestehende node_modules für saubere Neuinstallation..." + rm -rf "$SCRIPT_DIR/node_modules" +fi + +# Erstelle kiosk-shared Gruppe für geteilten Zugriff +log "Erstelle geteilte Berechtigen-Gruppe..." +groupadd -f kiosk-shared 2>/dev/null || true +usermod -a -G kiosk-shared root 2>/dev/null || true +usermod -a -G kiosk-shared "$KIOSK_USER" 2>/dev/null || true + +# Führe npm install als kiosk User aus +log "Führe npm install als kiosk-User aus..." +if [ -f "$SCRIPT_DIR/package.json" ]; then + # Wechsle zu kiosk User für npm install + sudo -u "$KIOSK_USER" bash -c " + cd '$SCRIPT_DIR' + export HOME=/home/$KIOSK_USER + if npm install --no-optional --no-audit --no-fund 2>/dev/null; then + echo 'npm install erfolgreich (Standard)' + elif npm install --legacy-peer-deps --no-optional 2>/dev/null; then + echo 'npm install erfolgreich (Legacy-Modus)' + elif npm install --force 2>/dev/null; then + echo 'npm install erfolgreich (Force-Modus)' + else + echo 'npm install fehlgeschlagen' + exit 1 + fi + " + + if [ $? -eq 0 ]; then + log "✅ npm install als kiosk-User erfolgreich" + else + warning "⚠️ npm install als kiosk-User fehlgeschlagen - versuche als root mit Berechtigen-Korrektur" + + # Fallback: npm install als root, dann Berechtigungen korrigieren + if npm install --no-optional --no-audit --no-fund 2>/dev/null; then + log "npm install als root erfolgreich - korrigiere Berechtigungen..." + + # Korrigiere node_modules Berechtigungen + if [ -d "$SCRIPT_DIR/node_modules" ]; then + chown -R "$KIOSK_USER:kiosk-shared" "$SCRIPT_DIR/node_modules" 2>/dev/null || true + chmod -R 775 "$SCRIPT_DIR/node_modules" 2>/dev/null || true + log "✅ node_modules Berechtigungen korrigiert" + fi + else + error "npm install auch als root fehlgeschlagen" + fi + fi +else + warning "Keine package.json gefunden" +fi + +# Korrigiere allgemeine Projekt-Berechtigungen +log "Korrigiere allgemeine Projekt-Berechtigungen..." + +# package.json und package-lock.json +for file in package.json package-lock.json; do + if [ -f "$SCRIPT_DIR/$file" ]; then + chown "$KIOSK_USER:kiosk-shared" "$SCRIPT_DIR/$file" 2>/dev/null || true + chmod 664 "$SCRIPT_DIR/$file" 2>/dev/null || true + fi +done + +# logs Verzeichnis +if [ -d "$SCRIPT_DIR/logs" ]; then + chown -R "$KIOSK_USER:kiosk-shared" "$SCRIPT_DIR/logs" 2>/dev/null || true + chmod -R 775 "$SCRIPT_DIR/logs" 2>/dev/null || true +fi + +# uploads Verzeichnis +if [ -d "$SCRIPT_DIR/uploads" ]; then + chown -R "$KIOSK_USER:kiosk-shared" "$SCRIPT_DIR/uploads" 2>/dev/null || true + chmod -R 775 "$SCRIPT_DIR/uploads" 2>/dev/null || true +fi + +# static Verzeichnis (falls der User dort Änderungen macht) +if [ -d "$SCRIPT_DIR/static" ]; then + chgrp -R kiosk-shared "$SCRIPT_DIR/static" 2>/dev/null || true + chmod -R 775 "$SCRIPT_DIR/static" 2>/dev/null || true +fi + +log "✅ Berechtigen-Reparatur abgeschlossen" +info "" +info "📋 Zusammenfassung:" +info " - node_modules gehört jetzt dem kiosk-User" +info " - Geteilte kiosk-shared Gruppe erstellt" +info " - Entwicklungs-Dateien für kiosk-User beschreibbar" +info "" +info "🔧 Verwendung:" +info " - Als kiosk-User: cd $SCRIPT_DIR && npm install" +info " - Als root bei Problemen: sudo $0" +info "" + +EOF + + # Mache Skript ausführbar + chmod +x "$fix_script" 2>/dev/null || warning "⚠️ Konnte fix-permissions.sh nicht ausführbar machen" + + success "✅ Berechtigen-Reparatur-Skript erstellt: $fix_script" + info " 💡 Verwendung nach Setup: sudo ./fix-permissions.sh" +} + install_npm_dependencies() { log "=== NPM-ABHÄNGIGKEITEN INSTALLATION ===" @@ -1730,6 +2007,22 @@ install_npm_dependencies() { warning "⚠️ npm install fehlgeschlagen - überspringe" fi + # WICHTIG: Korrigiere Berechtigungen nach npm install + progress "Korrigiere npm-Berechtigungen für kiosk-User..." + if [ -d "$APP_DIR/node_modules" ]; then + # Erstelle geteilte Gruppe wenn noch nicht vorhanden + groupadd -f kiosk-shared 2>/dev/null || true + usermod -a -G kiosk-shared root 2>/dev/null || true + if id "$KIOSK_USER" &>/dev/null; then + usermod -a -G kiosk-shared "$KIOSK_USER" 2>/dev/null || true + chown -R "$KIOSK_USER:kiosk-shared" "$APP_DIR/node_modules" 2>/dev/null || true + success "✅ node_modules Berechtigungen für kiosk-User korrigiert" + else + warning "⚠️ Kiosk-User nicht gefunden - Berechtigungen werden später korrigiert" + fi + chmod -R 775 "$APP_DIR/node_modules" 2>/dev/null || true + fi + cd "$CURRENT_DIR" else info "Keine package.json gefunden - überspringe npm-Installation" @@ -2248,6 +2541,10 @@ install_dependencies_only() { deploy_application install_npm_dependencies + # Berechtigungen für kiosk-User korrigieren + fix_project_permissions + create_permission_fix_script + # Services für manuelles Testen vorbereiten install_systemd_services enable_and_start_services @@ -2338,6 +2635,10 @@ install_full_production_system() { install_python_packages deploy_application install_npm_dependencies + + # Berechtigungen für kiosk-User korrigieren + fix_project_permissions + create_permission_fix_script else info "Anwendung bereits deployed - überspringe Basis-Installation" # Trotzdem Netzwerk-Sicherheit aktualisieren