Files
Inventarsystem/fix-all.sh
T
2026-04-10 14:48:52 +02:00

1105 lines
42 KiB
Bash
Executable File

#!/bin/bash
#
# fix-all.sh - All-in-One Reparaturskript für das Inventarsystem
#
# Dieses Skript führt alle notwendigen Reparaturschritte für das Inventarsystem durch:
# - Berechtigungen für alle Verzeichnisse und Dateien korrigieren
# - Virtual Environment und Python-Pakete reparieren
# - Git Repository-Berechtigungen setzen
# - Log-Verzeichnisse und Dateien erstellen und Berechtigungen setzen
# - Web-Verzeichnisberechtigungen korrigieren
# - MongoDB-Backup-Verzeichnisse einrichten
# - Bekannte Konflikte zwischen pymongo und bson beheben
# - Uploads-Verzeichnisse sowohl in Entwicklungs- als auch in Produktionsumgebungen verwalten
#
# Verwendung: sudo ./fix-all.sh [--check-only] [--verbose] [--fix-permissions] [--fix-venv] [--fix-pymongo] [--auto] [--setup-cron]
# Parse command line arguments
CHECK_ONLY=false
VERBOSE=false
FIX_PERMISSIONS=true
FIX_VENV=true
FIX_PYMONGO=true
FIX_PNG_TO_JPG=true
AUTO_MODE=false
SETUP_CRON=false
for arg in "$@"; do
case $arg in
--check-only)
CHECK_ONLY=true
shift
;;
--verbose)
VERBOSE=true
shift
;;
--fix-permissions)
FIX_PERMISSIONS=true
FIX_VENV=false
FIX_PYMONGO=false
shift
;;
--fix-venv)
FIX_VENV=true
FIX_PERMISSIONS=false
FIX_PYMONGO=false
shift
;;
--fix-pymongo)
FIX_PYMONGO=true
FIX_PERMISSIONS=false
FIX_VENV=false
FIX_PNG_TO_JPG=false
shift
;;
--fix-png-jpg)
FIX_PNG_TO_JPG=true
FIX_PERMISSIONS=false
FIX_VENV=false
FIX_PYMONGO=false
shift
;;
--no-fix-png-jpg)
FIX_PNG_TO_JPG=false
shift
;;
--auto)
AUTO_MODE=true
shift
;;
--setup-cron)
SETUP_CRON=true
shift
;;
--email=*)
echo "Hinweis: Die E-Mail-Funktion wurde entfernt. Option \"$arg\" wird ignoriert."
shift
;;
--help)
echo "Usage: $0 [OPTIONS]"
echo "Repariert alle bekannten Probleme im Inventarsystem."
echo ""
echo "Options:"
echo " --check-only Nur Prüfen, keine Änderungen durchführen"
echo " --verbose Ausführlichere Ausgabe"
echo " --fix-permissions Nur Berechtigungen korrigieren"
echo " --fix-venv Nur virtuelle Umgebung reparieren"
echo " --fix-pymongo Nur pymongo/bson-Konflikte beheben"
echo " --fix-png-jpg Nur PNG-zu-JPG Konvertierung durchführen"
echo " --no-fix-png-jpg PNG-zu-JPG Konvertierung überspringen"
echo " --auto Automatischer Modus - erkennt und behebt Probleme ohne Benutzerinteraktion"
echo " --setup-cron Richtet einen Cron-Job für regelmäßige Prüfungen ein"
echo " --help Diese Hilfe anzeigen"
echo ""
echo "Features:"
echo " - Intelligente Diagnose und zielgerichtete Reparatur"
echo " - Automatisches Erstellen und Verknüpfen von Upload-Verzeichnissen"
echo " - Erkennung und Korrektur von Entwicklungs- und Produktionsumgebungen"
echo " - Korrektur von Berechtigungsproblemen und fehlenden Verzeichnissen"
echo " - Behebt Probleme mit fehlenden Buch-Cover-Bildern in der Produktionsumgebung"
exit 0
;;
*)
# Unknown option
echo "Unbekannte Option: $arg"
echo "Verwenden Sie --help für Hilfe."
exit 1
;;
esac
done
set -e # Exit on error
# Get the script directory
SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
VENV_DIR="$SCRIPT_DIR/.venv"
LOG_FILE="$SCRIPT_DIR/logs/fix_all.log"
# Create logs directory immediately
mkdir -p "$SCRIPT_DIR/logs"
chmod -R 777 "$SCRIPT_DIR/logs" 2>/dev/null || true
# Function to setup a cron job for automatic fixing
setup_cron_job() {
if ! command -v crontab &> /dev/null; then
echo "crontab nicht verfügbar. Cron-Job kann nicht eingerichtet werden."
return 1
fi
# Define cron job to run daily at 1:00 AM
CRON_JOB="0 1 * * * cd $SCRIPT_DIR && sudo $SCRIPT_DIR/fix-all.sh --auto --verbose >> $SCRIPT_DIR/logs/auto_fix.log 2>&1"
# Check if cron job already exists
EXISTING_CRON=$(sudo crontab -l 2>/dev/null | grep -F "fix-all.sh --auto")
if [ -z "$EXISTING_CRON" ]; then
echo "Richte täglichen Cron-Job für automatische Systemprüfung ein..."
# Add to root's crontab (since we need sudo privileges)
(sudo crontab -l 2>/dev/null; echo "$CRON_JOB") | sudo crontab -
if [ $? -eq 0 ]; then
echo "Cron-Job erfolgreich eingerichtet. Das System wird täglich um 1:00 Uhr morgens automatisch überprüft."
else
echo "Fehler beim Einrichten des Cron-Jobs."
return 1
fi
else
echo "Cron-Job bereits vorhanden, keine Änderungen vorgenommen."
fi
return 0
}
# Email-Versand entfernt: Berichte werden stattdessen in die Konsole und nach logs/auto_fix_report.log geschrieben
# Function to handle automatic mode
handle_auto_mode() {
local has_problems=0
local report=""
# Check permissions
report+="Prüfung: Verzeichnisberechtigungen\n"
check_directory_permissions "$SCRIPT_DIR/logs" "777" "recursive" || has_problems=1
check_directory_permissions "$SCRIPT_DIR/Web/uploads" "777" "recursive" 2>/dev/null || has_problems=1
check_directory_permissions "$SCRIPT_DIR/Web/thumbnails" "777" "recursive" 2>/dev/null || has_problems=1
check_directory_permissions "$SCRIPT_DIR/Web/previews" "777" "recursive" 2>/dev/null || has_problems=1
check_directory_permissions "$SCRIPT_DIR/Web/QRCodes" "777" "recursive" 2>/dev/null || has_problems=1
check_directory_permissions "$SCRIPT_DIR/mongodb_backup" "777" "recursive" 2>/dev/null || has_problems=1
if [ $has_problems -eq 1 ]; then
report+="Status: Probleme mit Berechtigungen gefunden, werden repariert\n"
else
report+="Status: Keine Berechtigungsprobleme gefunden\n"
fi
# Check virtual environment
report+="\nPrüfung: Virtuelle Python-Umgebung\n"
set +e
check_venv_health
local venv_status=$?
set -e
if [ $venv_status -ne 0 ]; then
has_problems=1
report+="Status: Probleme mit virtueller Umgebung gefunden, werden repariert\n"
else
report+="Status: Virtuelle Umgebung ist gesund\n"
fi
# Check for pymongo/bson conflict
report+="\nPrüfung: PyMongo/BSON-Konflikte\n"
set +e
check_pymongo_bson_conflict
local pymongo_status=$?
set -e
if [ $pymongo_status -ne 0 ] && [ $pymongo_status -ne 2 ]; then
has_problems=1
report+="Status: PyMongo/BSON-Konflikte gefunden, werden repariert\n"
elif [ $pymongo_status -eq 2 ]; then
report+="Status: PyMongo/BSON konnte nicht überprüft werden\n"
else
report+="Status: Keine PyMongo/BSON-Konflikte gefunden\n"
fi
# Check system services
report+="\nPrüfung: Systemdienste\n"
set +e
check_services
local services_status=$?
set -e
if [ $services_status -ne 0 ] && [ $services_status -ne 2 ]; then
has_problems=1
report+="Status: Einige Dienste sind nicht aktiv, werden gestartet\n"
elif [ $services_status -eq 2 ]; then
report+="Status: Systemdienste konnten nicht überprüft werden\n"
else
report+="Status: Alle Dienste sind aktiv\n"
fi
# If no problems or in check-only mode, just return
if [ $has_problems -eq 0 ]; then
report+="\nErgebnis: Alle Systeme funktionieren korrekt. Keine Reparaturen notwendig.\n"
# Print report to console and write to file
echo -e "$report"
echo -e "$report" >> "$SCRIPT_DIR/logs/auto_fix_report.log"
return 0
fi
if [ "$CHECK_ONLY" = true ]; then
report+="\nErgebnis: Probleme gefunden, aber nur Prüfung durchgeführt (--check-only).\n"
# Print report to console and write to file
echo -e "$report"
echo -e "$report" >> "$SCRIPT_DIR/logs/auto_fix_report.log"
return 1
fi
# Auto fix the issues
report+="\nStarte automatische Reparatur...\n"
# Fix permissions if needed
if [ $has_problems -eq 1 ]; then
# All the fixes will be performed by the main script
report+="\nReparaturen wurden durchgeführt. Details im Log: $LOG_FILE\n"
fi
# Print report to console and write to file
echo -e "$report"
echo -e "$report" >> "$SCRIPT_DIR/logs/auto_fix_report.log"
return 0
}
# Function to log messages
log_message() {
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo -e "[\e[1;36m$timestamp\e[0m] $1" | tee -a "$LOG_FILE" 2>/dev/null || echo -e "[\e[1;36m$timestamp\e[0m] $1"
}
# Function to log success messages
log_success() {
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo -e "[\e[1;32m$timestamp\e[0m] ✓ $1" | tee -a "$LOG_FILE" 2>/dev/null || echo -e "[\e[1;32m$timestamp\e[0m] ✓ $1"
}
# Function to log error messages
log_error() {
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo -e "[\e[1;31m$timestamp\e[0m] ✗ $1" | tee -a "$LOG_FILE" 2>/dev/null || echo -e "[\e[1;31m$timestamp\e[0m] ✗ $1"
}
# Function to log warning messages
log_warning() {
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo -e "[\e[1;33m$timestamp\e[0m] ! $1" | tee -a "$LOG_FILE" 2>/dev/null || echo -e "[\e[1;33m$timestamp\e[0m] ! $1"
}
# Function to log verbose messages
log_verbose() {
if [ "$VERBOSE" = true ]; then
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo -e "[\e[1;90m$timestamp\e[0m] $1" | tee -a "$LOG_FILE" 2>/dev/null || echo -e "[\e[1;90m$timestamp\e[0m] $1"
fi
}
# Function to log section headers
log_section() {
echo ""
echo -e "\e[1;33m====== $1 ======\e[0m" | tee -a "$LOG_FILE" 2>/dev/null || echo -e "\e[1;33m====== $1 ======\e[0m"
echo ""
}
# Function to check if a directory has correct permissions
check_directory_permissions() {
local dir="$1"
local expected_perm="$2"
local is_recursive="$3"
local result=0
if [ ! -d "$dir" ]; then
log_verbose "Verzeichnis nicht gefunden: $dir"
return 2
fi
if [ "$is_recursive" = "recursive" ]; then
find "$dir" -type d -not -perm "$expected_perm" | grep -q . && result=1
else
[ "$(stat -c %a "$dir")" != "$expected_perm" ] && result=1
fi
if [ $result -eq 1 ]; then
return 1
fi
return 0
}
# Function to check if a file has correct permissions
check_file_permissions() {
local file="$1"
local expected_perm="$2"
if [ ! -f "$file" ]; then
log_verbose "Datei nicht gefunden: $file"
return 2
fi
if [ "$(stat -c %a "$file")" != "$expected_perm" ]; then
return 1
fi
return 0
}
# Function to check if pymongo/bson conflict exists
check_pymongo_bson_conflict() {
if [ ! -d "$VENV_DIR" ]; then
log_verbose "Virtuelle Umgebung nicht gefunden"
return 2
fi
# Check for standalone bson package
if [ -d "$VENV_DIR/lib/python3.12/site-packages/bson" ] && [ -d "$VENV_DIR/lib/python3.12/site-packages/pymongo" ]; then
return 1
fi
return 0
}
# Function to check if virtual environment is healthy
check_venv_health() {
if [ ! -d "$VENV_DIR" ]; then
log_verbose "Virtuelle Umgebung nicht gefunden"
return 2
fi
# Check for critical components
if [ ! -f "$VENV_DIR/bin/python" ] || [ ! -f "$VENV_DIR/bin/pip" ]; then
return 1
fi
# Try importing the runtime packages required at app startup
if ! "$VENV_DIR/bin/python" -c "import pymongo, flask, gunicorn, requests, PIL, apscheduler" 2>/dev/null; then
return 1
fi
return 0
}
# Function to create and fix upload directories in all environments
fix_uploads_directories() {
log_message "Erstelle und korrigiere Upload-Verzeichnisse in allen Umgebungen..."
# Development environment directories
local DEV_DIRS=(
"$SCRIPT_DIR/Web/uploads"
"$SCRIPT_DIR/Web/thumbnails"
"$SCRIPT_DIR/Web/previews"
"$SCRIPT_DIR/Web/QRCodes"
)
# Production environment directories
local PROD_DIRS=(
"/var/Inventarsystem/Web/uploads"
"/var/Inventarsystem/Web/thumbnails"
"/var/Inventarsystem/Web/previews"
"/var/Inventarsystem/Web/QRCodes"
)
# Create and set permissions for development directories
for dir in "${DEV_DIRS[@]}"; do
if [ ! -d "$dir" ]; then
log_message "Erstelle Verzeichnis: $dir"
mkdir -p "$dir" 2>/dev/null || log_error "Fehler beim Erstellen von $dir"
fi
log_message "Setze Berechtigungen für $dir"
chmod -R 777 "$dir" 2>/dev/null || log_error "Fehler beim Setzen von Berechtigungen für $dir"
chown -R "$ACTUAL_USER:$ACTUAL_GROUP" "$dir" 2>/dev/null || log_error "Fehler beim Setzen von Eigentümerrechten für $dir"
done
# Check if we are in production environment
if [ -d "/var/Inventarsystem" ] || [ -L "/var/Inventarsystem" ]; then
# Create and set permissions for production directories
for dir in "${PROD_DIRS[@]}"; do
if [ ! -d "$dir" ]; then
log_message "Erstelle Produktions-Verzeichnis: $dir"
mkdir -p "$dir" 2>/dev/null || log_error "Fehler beim Erstellen von $dir"
fi
log_message "Setze Berechtigungen für $dir"
chmod -R 777 "$dir" 2>/dev/null || log_error "Fehler beim Setzen von Berechtigungen für $dir"
# In production, use www-data as owner
chown -R www-data:www-data "$dir" 2>/dev/null || log_error "Fehler beim Setzen von Produktions-Eigentümerrechten für $dir"
done
# Create symlinks if needed - for example if the app is looking in one path but files are in another
# This ensures that whether the app looks in dev or prod paths, it will find the files
if [ ! -L "/var/Inventarsystem/Web/uploads" ] && [ -d "$SCRIPT_DIR/Web/uploads" ]; then
# If production directory is empty but development has files, create symlink
if [ -z "$(ls -A "/var/Inventarsystem/Web/uploads" 2>/dev/null)" ] && [ -n "$(ls -A "$SCRIPT_DIR/Web/uploads" 2>/dev/null)" ]; then
log_message "Produktions-Upload-Verzeichnis ist leer, erstelle Symlink zu Entwicklungsverzeichnis"
rm -rf "/var/Inventarsystem/Web/uploads" 2>/dev/null
ln -sf "$SCRIPT_DIR/Web/uploads" "/var/Inventarsystem/Web/uploads" 2>/dev/null || log_error "Fehler beim Erstellen des Symlinks für uploads"
fi
fi
# Ensure the application can find images in either location
log_message "Überprüfe Dateiübereinstimmung zwischen Entwicklungs- und Produktionsumgebung"
for env_dir in uploads thumbnails previews QRCodes; do
dev_dir="$SCRIPT_DIR/Web/$env_dir"
prod_dir="/var/Inventarsystem/Web/$env_dir"
# If both directories exist and are not symlinks to each other
if [ -d "$dev_dir" ] && [ -d "$prod_dir" ] && [ ! -L "$prod_dir" ]; then
# Check for missing files in production that exist in development
for file in $(find "$dev_dir" -type f -name "*" 2>/dev/null); do
filename=$(basename "$file")
if [ ! -f "$prod_dir/$filename" ]; then
log_message "Kopiere fehlende Datei in die Produktionsumgebung: $filename"
cp -f "$file" "$prod_dir/" 2>/dev/null || log_error "Fehler beim Kopieren von $filename nach $prod_dir"
chmod 666 "$prod_dir/$filename" 2>/dev/null
fi
done
# Check for missing files in development that exist in production
for file in $(find "$prod_dir" -type f -name "*" 2>/dev/null); do
filename=$(basename "$file")
if [ ! -f "$dev_dir/$filename" ]; then
log_message "Kopiere fehlende Datei in die Entwicklungsumgebung: $filename"
cp -f "$file" "$dev_dir/" 2>/dev/null || log_error "Fehler beim Kopieren von $filename nach $dev_dir"
chmod 666 "$dev_dir/$filename" 2>/dev/null
fi
done
fi
done
fi
log_success "Upload-Verzeichnisse wurden erstellt und Berechtigungen gesetzt"
}
# Function to ensure PNG images are converted to JPG for universal compatibility
fix_png_to_jpg_conversion() {
if [ "$FIX_PNG_TO_JPG" != true ]; then
log_verbose "PNG zu JPG Konvertierung übersprungen (--no-fix-png-jpg Flag gesetzt)"
return 0
fi
log_section "Überprüfe PNG zu JPG Konvertierung"
log_message "Das System verwendet einheitlich JPG-Dateien für maximale Kompatibilität."
# Check if the converter script exists
if [ ! -f "$SCRIPT_DIR/png_jpg_converter.py" ]; then
log_error "PNG zu JPG Konverter-Skript nicht gefunden: png_jpg_converter.py"
return 1
fi
# Check if PIL/Pillow is installed in the virtual environment
if ! "$VENV_DIR/bin/pip" list | grep -i "pillow" >/dev/null 2>&1; then
log_message "Installiere Pillow für Bildkonvertierung..."
"$VENV_DIR/bin/pip" install pillow >/dev/null 2>&1
if [ $? -ne 0 ]; then
log_error "Konnte Pillow nicht installieren"
return 1
fi
log_success "Pillow erfolgreich installiert"
fi
# Run the converter in dry-run mode first
log_message "Überprüfe PNG-Dateien im System..."
PNG_COUNT=$("$VENV_DIR/bin/python" "$SCRIPT_DIR/png_jpg_converter.py" | grep "Total PNG files:" | awk '{print $4}')
if [ -z "$PNG_COUNT" ]; then
PNG_COUNT=0
fi
if [ "$PNG_COUNT" -eq 0 ]; then
log_success "Keine PNG-Dateien gefunden, System verwendet bereits einheitlich JPG-Dateien"
return 0
fi
log_message "Gefunden: $PNG_COUNT PNG-Dateien, die zu JPG konvertiert werden sollten"
if [ "$CHECK_ONLY" = true ]; then
log_warning "Im Check-Only-Modus wird keine Konvertierung durchgeführt"
return 0
fi
# Confirm with user in interactive mode
if [ "$AUTO_MODE" != true ]; then
read -p "Möchten Sie alle PNG-Dateien zu JPG konvertieren? (j/n): " confirm
if [[ ! "$confirm" =~ ^[jJ] ]]; then
log_message "PNG zu JPG Konvertierung übersprungen"
return 0
fi
fi
# Run the converter with execute flag
log_message "Konvertiere PNG-Dateien zu JPG..."
"$VENV_DIR/bin/python" "$SCRIPT_DIR/png_jpg_converter.py" --execute --quality 95
if [ $? -eq 0 ]; then
log_success "PNG zu JPG Konvertierung erfolgreich abgeschlossen"
else
log_error "Fehler bei der PNG zu JPG Konvertierung"
return 1
fi
return 0
}
# Function to check if system services are running
check_services() {
if ! command -v systemctl >/dev/null 2>&1; then
log_verbose "systemctl nicht verfügbar"
return 2
fi
local services_status=0
if ! systemctl is-active --quiet mongodb 2>/dev/null; then
services_status=1
fi
if ! systemctl is-active --quiet inventarsystem-gunicorn.service 2>/dev/null; then
services_status=1
fi
if ! systemctl is-active --quiet inventarsystem-nginx.service 2>/dev/null; then
services_status=1
fi
return $services_status
}
# Function to check if we are in production environment
check_production_environment() {
local prod_path="/var/Inventarsystem"
local in_prod=false
if [ -d "$prod_path" ] || [ -L "$prod_path" ]; then
in_prod=true
log_message "Produktionsumgebung erkannt: $prod_path"
# Verify directory structure
if [ ! -d "$prod_path/Web" ]; then
log_warning "Produktionsumgebung unvollständig: Web-Verzeichnis fehlt"
mkdir -p "$prod_path/Web" 2>/dev/null || log_error "Konnte Web-Verzeichnis nicht erstellen"
fi
else
log_verbose "Keine Produktionsumgebung unter $prod_path gefunden"
fi
# Check if we're installed to /var/www
if [ -d "/var/www/Inventarsystem" ] || [ -L "/var/www/Inventarsystem" ]; then
in_prod=true
log_message "Alternative Produktionsumgebung erkannt: /var/www/Inventarsystem"
fi
if [ "$in_prod" = true ]; then
return 0
else
return 1
fi
}
# Check if running as root
if [ "$(id -u)" -ne 0 ]; then
log_error "Dieses Skript muss als root oder mit sudo ausgeführt werden"
log_error "Bitte starten Sie das Skript mit: sudo $0"
exit 1
fi
# Determine the actual user who invoked sudo
if [ -n "$SUDO_USER" ]; then
ACTUAL_USER="$SUDO_USER"
ACTUAL_GROUP="$(id -gn "$SUDO_USER")"
else
# If not using sudo, use the current user
ACTUAL_USER="$(whoami)"
ACTUAL_GROUP="$(id -gn)"
fi
log_section "ALL-IN-ONE REPARATUR GESTARTET"
log_message "Benutzerinformation: $ACTUAL_USER:$ACTUAL_GROUP"
log_message "Systempfad: $SCRIPT_DIR"
if [ "$CHECK_ONLY" = true ]; then
log_message "Modus: Nur Prüfung (keine Änderungen werden durchgeführt)"
fi
# Diagnostic phase - check what needs to be fixed
log_section "SYSTEMDIAGNOSE"
log_message "Überprüfe den aktuellen Systemzustand..."
PERM_STATUS=0
VENV_STATUS=0
PYMONGO_STATUS=0
SERVICES_STATUS=0
# Check permissions
log_message "Überprüfe Verzeichnisberechtigungen..."
check_directory_permissions "$SCRIPT_DIR/logs" "777" "recursive" || PERM_STATUS=1
check_directory_permissions "$SCRIPT_DIR/Web/uploads" "777" "recursive" 2>/dev/null || PERM_STATUS=1
check_directory_permissions "$SCRIPT_DIR/Web/thumbnails" "777" "recursive" 2>/dev/null || PERM_STATUS=1
check_directory_permissions "$SCRIPT_DIR/Web/previews" "777" "recursive" 2>/dev/null || PERM_STATUS=1
check_directory_permissions "$SCRIPT_DIR/Web/QRCodes" "777" "recursive" 2>/dev/null || PERM_STATUS=1
check_directory_permissions "$SCRIPT_DIR/mongodb_backup" "777" "recursive" 2>/dev/null || PERM_STATUS=1
# Check virtual environment
log_message "Überprüfe virtuelle Python-Umgebung..."
set +e
check_venv_health
VENV_STATUS=$?
set -e
# Check for pymongo/bson conflict
log_message "Überprüfe auf pymongo/bson-Konflikte..."
set +e
check_pymongo_bson_conflict
PYMONGO_STATUS=$?
set -e
# Check system services
log_message "Überprüfe Systemdienste..."
set +e
check_services
SERVICES_STATUS=$?
set -e
# Display diagnosis results
log_section "DIAGNOSEERGEBNISSE"
if [ $PERM_STATUS -eq 0 ]; then
log_success "Verzeichnisberechtigungen: Korrekt"
else
log_warning "Verzeichnisberechtigungen: Probleme gefunden"
fi
if [ $VENV_STATUS -eq 0 ]; then
log_success "Virtuelle Python-Umgebung: Gesund"
elif [ $VENV_STATUS -eq 2 ]; then
log_warning "Virtuelle Python-Umgebung: Nicht gefunden"
else
log_warning "Virtuelle Python-Umgebung: Probleme gefunden"
fi
if [ $PYMONGO_STATUS -eq 0 ]; then
log_success "PyMongo/BSON: Keine Konflikte gefunden"
elif [ $PYMONGO_STATUS -eq 2 ]; then
log_warning "PyMongo/BSON: Konnte nicht überprüft werden"
else
log_warning "PyMongo/BSON: Konflikt gefunden"
fi
if [ $SERVICES_STATUS -eq 0 ]; then
log_success "Systemdienste: Alle aktiv"
elif [ $SERVICES_STATUS -eq 2 ]; then
log_warning "Systemdienste: Konnte nicht überprüft werden"
else
log_warning "Systemdienste: Einige Dienste sind nicht aktiv"
fi
# Setup cron job if requested
if [ "$SETUP_CRON" = true ]; then
log_section "CRON-JOB EINRICHTUNG"
if setup_cron_job; then
log_success "Cron-Job für automatische Prüfung wurde eingerichtet"
log_message "Das System wird täglich um 1:00 Uhr morgens automatisch überprüft und repariert"
else
log_error "Fehler beim Einrichten des Cron-Jobs"
fi
# If only setting up cron job, exit here
if [ "$AUTO_MODE" = false ] && [ "$CHECK_ONLY" = true ]; then
exit 0
fi
fi
# Handle auto mode if enabled
if [ "$AUTO_MODE" = true ]; then
log_section "AUTOMATISCHER MODUS"
log_message "Automatischer Reparaturmodus ist aktiviert"
log_message "Überprüfe und behebe Probleme ohne Benutzerinteraktion..."
# Let the auto mode handler determine if fixes are needed, but don't abort on non-zero due to set -e
set +e
handle_auto_mode
HM_STATUS=$?
set -e
# If auto mode with check-only, exit here
if [ "$CHECK_ONLY" = true ]; then
log_section "AUTOMATISCHE PRÜFUNG ABGESCHLOSSEN"
log_message "Keine Änderungen wurden durchgeführt (--check-only ist aktiviert)"
log_message "Prüfbericht wurde in logs/auto_fix_report.log gespeichert"
exit $HM_STATUS
fi
fi
# If check-only mode, exit here
if [ "$CHECK_ONLY" = true ]; then
log_section "PRÜFUNG ABGESCHLOSSEN"
log_message "Keine Änderungen wurden durchgeführt."
log_message "Um Probleme zu beheben, führen Sie das Skript ohne --check-only aus."
exit 0
fi
# Fix phase - only fix what's needed based on diagnosis
log_section "REPARATURPHASE"
# Step 1: Create and fix permissions for critical directories
if [ $PERM_STATUS -ne 0 ] && [ "$FIX_PERMISSIONS" = true ]; then
log_section "VERZEICHNISBERECHTIGUNGEN KORRIGIEREN"
# Logs directory
log_message "Berechtigungen für logs-Verzeichnis korrigieren..."
mkdir -p "$SCRIPT_DIR/logs"
chmod -R 777 "$SCRIPT_DIR/logs" 2>/dev/null || log_error "Fehler beim Setzen von Berechtigungen für logs-Verzeichnis"
chown -R "$ACTUAL_USER:$ACTUAL_GROUP" "$SCRIPT_DIR/logs" 2>/dev/null || log_error "Fehler beim Setzen von Eigentümerrechten für logs-Verzeichnis"
# Create log files if they don't exist
log_message "Erstelle Log-Dateien mit korrekten Berechtigungen..."
touch "$SCRIPT_DIR/logs/Backup_db.log" "$SCRIPT_DIR/logs/daily_update.log" "$SCRIPT_DIR/logs/error.log" "$SCRIPT_DIR/logs/access.log" "$SCRIPT_DIR/logs/permission_fixes.log" "$SCRIPT_DIR/logs/fix_all.log" "$SCRIPT_DIR/logs/scheduler.log" "$SCRIPT_DIR/logs/restore.log" 2>/dev/null
chmod 666 "$SCRIPT_DIR/logs"/*.log 2>/dev/null
chown "$ACTUAL_USER:$ACTUAL_GROUP" "$SCRIPT_DIR/logs"/*.log 2>/dev/null
# Fix all upload directories in both development and production environments
fix_uploads_directories
# Convert any PNG files to JPG for universal compatibility
fix_png_to_jpg_conversion
# Fix Web directory permissions and structure
if [ -d "$SCRIPT_DIR/Web" ]; then
log_message "Berechtigungen für Web-Verzeichnis korrigieren..."
# Set base permissions for Web directory
chmod -R 755 "$SCRIPT_DIR/Web" 2>/dev/null || log_error "Fehler beim Setzen von Berechtigungen für Web-Verzeichnis"
# Set ownership
chown -R "$ACTUAL_USER:$ACTUAL_GROUP" "$SCRIPT_DIR/Web" 2>/dev/null || log_error "Fehler beim Setzen von Eigentümerrechten für Web-Verzeichnis"
# Create and fix all uploads directories both in development and production
fix_uploads_directories
log_success "Web-Verzeichnisberechtigungen korrigiert"
else
log_error "Web-Verzeichnis nicht gefunden: $SCRIPT_DIR/Web"
mkdir -p "$SCRIPT_DIR/Web" 2>/dev/null && {
log_message "Web-Verzeichnis wurde erstellt"
chmod 755 "$SCRIPT_DIR/Web" 2>/dev/null
chown -R "$ACTUAL_USER:$ACTUAL_GROUP" "$SCRIPT_DIR/Web" 2>/dev/null
fix_uploads_directories
}
fi
# Create and set permissions for SSL certificates directory
if [ -d "$SCRIPT_DIR/certs" ]; then
log_message "Berechtigungen für SSL-Zertifikate korrigieren..."
chmod 755 "$SCRIPT_DIR/certs" 2>/dev/null
find "$SCRIPT_DIR/certs" -name "*.key" -exec chmod 600 {} \; 2>/dev/null
find "$SCRIPT_DIR/certs" -name "*.crt" -exec chmod 644 {} \; 2>/dev/null
chown -R "$ACTUAL_USER:$ACTUAL_GROUP" "$SCRIPT_DIR/certs" 2>/dev/null
log_success "SSL-Zertifikatberechtigungen korrigiert"
fi
# Create and set permissions for backups directory
log_message "Berechtigungen für Backup-Verzeichnisse korrigieren..."
BACKUP_BASE_DIR="/var/backups"
if [ ! -d "$BACKUP_BASE_DIR" ]; then
mkdir -p "$BACKUP_BASE_DIR" 2>/dev/null
fi
chmod 755 "$BACKUP_BASE_DIR" 2>/dev/null || log_error "Fehler beim Setzen von Berechtigungen für $BACKUP_BASE_DIR"
# Local backups directory
mkdir -p "$SCRIPT_DIR/backups" 2>/dev/null
chmod 777 "$SCRIPT_DIR/backups" 2>/dev/null
chown -R "$ACTUAL_USER:$ACTUAL_GROUP" "$SCRIPT_DIR/backups" 2>/dev/null
# MongoDB backup directory
mkdir -p "$SCRIPT_DIR/mongodb_backup" 2>/dev/null
chmod 777 "$SCRIPT_DIR/mongodb_backup" 2>/dev/null
chown -R "$ACTUAL_USER:$ACTUAL_GROUP" "$SCRIPT_DIR/mongodb_backup" 2>/dev/null
log_success "Backup-Verzeichnisberechtigungen korrigiert"
# Step 2: Fix Git repository permissions
log_section "GIT REPOSITORY BERECHTIGUNGEN"
log_message "Setze Git Repository als sicheres Verzeichnis..."
# For root
git config --global --add safe.directory "$SCRIPT_DIR" 2>/dev/null || log_error "Fehler beim Setzen des Git safe.directory für root"
# For the actual user (if different from root)
if [ "$ACTUAL_USER" != "root" ]; then
su - "$ACTUAL_USER" -c "git config --global --add safe.directory '$SCRIPT_DIR'" 2>/dev/null || log_error "Fehler beim Setzen des Git safe.directory für $ACTUAL_USER"
fi
log_success "Git Repository-Berechtigungen korrigiert"
# Step 3: Fix executable permissions for scripts
log_section "SKRIPT-BERECHTIGUNGEN"
log_message "Mache alle Skripte ausführbar..."
find "$SCRIPT_DIR" -name "*.sh" -type f -exec chmod +x {} \; 2>/dev/null
find "$SCRIPT_DIR" -name "*.py" -type f -exec chmod +x {} \; 2>/dev/null
log_success "Skript-Berechtigungen korrigiert"
else
if [ "$FIX_PERMISSIONS" = true ]; then
log_success "Überspringe Berechtigungskorrekturen - alle Berechtigungen sind bereits korrekt"
else
log_verbose "Berechtigungskorrekturen wurden übersprungen (gemäß Befehlszeilenoption)"
fi
fi
# Step 4: Fix virtual environment
if [ $VENV_STATUS -ne 0 ] && [ "$FIX_VENV" = true ]; then
log_section "PYTHON VIRTUELLE UMGEBUNG"
log_message "Repariere virtuelle Python-Umgebung..."
if [ ! -d "$VENV_DIR" ]; then
log_message "Virtuelle Umgebung nicht gefunden. Erstelle neue Umgebung..."
python3 -m venv "$VENV_DIR" || {
log_error "Fehler beim Erstellen der virtuellen Umgebung"
log_message "Versuche alternative Methode..."
python3 -m venv "$VENV_DIR" --system-site-packages || {
log_error "Virtuelle Umgebung konnte nicht erstellt werden. Abbruch."
exit 1
}
}
# Set ownership immediately after creation
chown -R "$ACTUAL_USER:$ACTUAL_GROUP" "$VENV_DIR" 2>/dev/null
log_success "Neue virtuelle Umgebung erstellt"
else
log_message "Bestehende virtuelle Umgebung gefunden. Setze Berechtigungen..."
fi
# Fix directory and file permissions
log_message "Setze Verzeichnis- und Dateirechte..."
find "$VENV_DIR" -type d -exec chmod 755 {} \; 2>/dev/null || log_error "Fehler beim Setzen der Verzeichnisberechtigungen"
find "$VENV_DIR" -type f -exec chmod 644 {} \; 2>/dev/null || log_error "Fehler beim Setzen der Dateiberechtigungen"
# Make bin files executable
if [ -d "$VENV_DIR/bin" ]; then
log_message "Mache Bin-Dateien ausführbar..."
chmod 755 "$VENV_DIR/bin" 2>/dev/null
find "$VENV_DIR/bin" -type f -exec chmod 755 {} \; 2>/dev/null || log_error "Fehler beim Setzen der Bin-Dateirechte"
fi
# Set ownership for virtual environment
log_message "Setze Eigentümerrechte für virtuelle Umgebung..."
chown -R "$ACTUAL_USER:$ACTUAL_GROUP" "$VENV_DIR" 2>/dev/null || log_error "Fehler beim Setzen der Eigentümerrechte für virtuelle Umgebung"
log_success "Berechtigungen für virtuelle Umgebung korrigiert"
else
if [ "$FIX_VENV" = true ]; then
log_success "Überspringe Reparatur der virtuellen Umgebung - bereits in gutem Zustand"
else
log_verbose "Reparatur der virtuellen Umgebung wurde übersprungen (gemäß Befehlszeilenoption)"
fi
fi
# Step 5: Fix pymongo/bson conflict
if [ $PYMONGO_STATUS -ne 0 ] && [ "$FIX_PYMONGO" = true ]; then
log_section "PYMONGO/BSON KONFLIKTE"
# Detect bson/pymongo conflict
if [ -d "$VENV_DIR/lib/python3.12/site-packages/bson" ]; then
log_message "Potentieller bson/pymongo Konflikt erkannt. Behebe das Problem..."
rm -rf "$VENV_DIR/lib/python3.12/site-packages/bson" || {
log_error "Fehler beim Entfernen des Bson-Verzeichnisses. Versuche mit sudo..."
sudo rm -rf "$VENV_DIR/lib/python3.12/site-packages/bson" || {
log_error "Fehler beim Entfernen des Bson-Verzeichnisses."
}
}
log_message "Konfliktierendes Bson-Paket entfernt"
fi
# Install/upgrade pip in the virtual environment
log_message "Installiere/aktualisiere pip in der virtuellen Umgebung..."
# Try to activate the virtual environment and install packages
if [ -f "$VENV_DIR/bin/pip" ]; then
log_message "Benutze pip aus der virtuellen Umgebung..."
# Remove conflicting packages
"$VENV_DIR/bin/pip" uninstall -y bson pymongo 2>/dev/null || true
# Install pymongo
"$VENV_DIR/bin/pip" install --upgrade pip 2>/dev/null || log_error "Fehler beim Aktualisieren von pip"
"$VENV_DIR/bin/pip" install pymongo==4.6.1 2>/dev/null || {
log_error "Fehler beim Installieren von pymongo mit venv pip"
"$VENV_DIR/bin/python" -m pip install pymongo==4.6.1 2>/dev/null || {
log_error "Alle Versuche zur Installation von pymongo in der virtuellen Umgebung sind fehlgeschlagen"
}
}
# Verify core runtime imports
if "$VENV_DIR/bin/python" -c "import pymongo, flask, gunicorn, requests, PIL, apscheduler" 2>/dev/null; then
log_success "Runtime-Abhängigkeiten wurden korrekt installiert"
else
log_error "Runtime-Abhängigkeiten konnten nicht verifiziert werden"
fi
# Install requirements
if [ -f "$SCRIPT_DIR/requirements.txt" ]; then
log_message "Installiere Abhängigkeiten aus requirements.txt..."
# Filter out pymongo
grep -v "^pymongo" "$SCRIPT_DIR/requirements.txt" > "$SCRIPT_DIR/requirements_filtered.txt"
"$VENV_DIR/bin/pip" install -r "$SCRIPT_DIR/requirements_filtered.txt" 2>/dev/null || log_error "Fehler beim Installieren einiger Abhängigkeiten"
rm -f "$SCRIPT_DIR/requirements_filtered.txt"
fi
else
log_error "Pip nicht in der virtuellen Umgebung gefunden"
log_message "Versuche die Umgebung zu aktivieren und pip zu verwenden..."
source "$VENV_DIR/bin/activate" 2>/dev/null && {
pip install --upgrade pip 2>/dev/null || log_error "Fehler beim Aktualisieren von pip"
pip uninstall -y bson pymongo 2>/dev/null || true
pip install pymongo==4.6.1 2>/dev/null || log_error "Fehler beim Installieren von pymongo"
# Verify core runtime imports
if python -c "import pymongo, flask, gunicorn, requests, PIL, apscheduler" 2>/dev/null; then
log_success "Runtime-Abhängigkeiten wurden korrekt installiert"
else
log_error "Runtime-Abhängigkeiten konnten nicht verifiziert werden"
fi
# Install requirements
if [ -f "$SCRIPT_DIR/requirements.txt" ]; then
log_message "Installiere Abhängigkeiten aus requirements.txt..."
grep -v "^pymongo" "$SCRIPT_DIR/requirements.txt" > "$SCRIPT_DIR/requirements_filtered.txt"
pip install -r "$SCRIPT_DIR/requirements_filtered.txt" 2>/dev/null || log_error "Fehler beim Installieren einiger Abhängigkeiten"
rm -f "$SCRIPT_DIR/requirements_filtered.txt"
fi
deactivate
} || log_error "Konnte virtuelle Umgebung nicht aktivieren"
fi
else
if [ "$FIX_PYMONGO" = true ]; then
log_success "Überspringe PyMongo/BSON-Reparatur - keine Konflikte gefunden"
else
log_verbose "PyMongo/BSON-Reparatur wurde übersprungen (gemäß Befehlszeilenoption)"
fi
fi
# Step 6: Check system service status
log_section "SYSTEMDIENSTE ÜBERPRÜFEN"
log_message "Überprüfe Systemdienste..."
if command -v systemctl >/dev/null 2>&1; then
if systemctl is-active --quiet mongodb; then
log_success "MongoDB-Dienst läuft"
else
log_warning "MongoDB-Dienst läuft nicht"
log_message "Versuche MongoDB zu starten..."
systemctl start mongodb 2>/dev/null || log_error "Konnte MongoDB-Dienst nicht starten"
fi
# Check for Inventarsystem services
if systemctl is-active --quiet inventarsystem-gunicorn.service 2>/dev/null; then
log_success "Inventarsystem Gunicorn-Dienst läuft"
else
log_warning "Inventarsystem Gunicorn-Dienst läuft nicht"
fi
if systemctl is-active --quiet inventarsystem-nginx.service 2>/dev/null; then
log_success "Inventarsystem Nginx-Dienst läuft"
else
log_warning "Inventarsystem Nginx-Dienst läuft nicht"
fi
else
log_message "Systemctl nicht verfügbar. Dienststatus kann nicht überprüft werden."
fi
# Step 7: Set correct ownership for entire project
log_section "PROJEKT-EIGENTÜMERRECHTE"
log_message "Setze Eigentümerrechte für das gesamte Projekt..."
chown -R "$ACTUAL_USER:$ACTUAL_GROUP" "$SCRIPT_DIR" 2>/dev/null || log_error "Fehler beim Setzen der Eigentümerrechte für das gesamte Projekt"
log_success "Projekt-Eigentümerrechte gesetzt"
# Run a second diagnostic to confirm fixes
log_section "REPARATURVERIFIKATION"
log_message "Überprüfe den Systemzustand nach Reparaturen..."
PERM_STATUS_AFTER=0
VENV_STATUS_AFTER=0
PYMONGO_STATUS_AFTER=0
SERVICES_STATUS_AFTER=0
# Check permissions
check_directory_permissions "$SCRIPT_DIR/logs" "777" "recursive" || PERM_STATUS_AFTER=1
check_directory_permissions "$SCRIPT_DIR/Web/uploads" "777" "recursive" 2>/dev/null || PERM_STATUS_AFTER=1
check_directory_permissions "$SCRIPT_DIR/Web/thumbnails" "777" "recursive" 2>/dev/null || PERM_STATUS_AFTER=1
check_directory_permissions "$SCRIPT_DIR/Web/previews" "777" "recursive" 2>/dev/null || PERM_STATUS_AFTER=1
check_directory_permissions "$SCRIPT_DIR/Web/QRCodes" "777" "recursive" 2>/dev/null || PERM_STATUS_AFTER=1
check_directory_permissions "$SCRIPT_DIR/mongodb_backup" "777" "recursive" 2>/dev/null || PERM_STATUS_AFTER=1
# Check virtual environment
set +e
check_venv_health
VENV_STATUS_AFTER=$?
set -e
# Check for pymongo/bson conflict
set +e
check_pymongo_bson_conflict
PYMONGO_STATUS_AFTER=$?
set -e
# Check system services
set +e
check_services
SERVICES_STATUS_AFTER=$?
set -e
# Report fixed and remaining issues
if [ $PERM_STATUS_AFTER -eq 0 ] && [ $PERM_STATUS -ne 0 ]; then
log_success "Verzeichnisberechtigungen wurden erfolgreich korrigiert"
elif [ $PERM_STATUS_AFTER -ne 0 ] && [ $PERM_STATUS -ne 0 ]; then
log_error "Es bestehen weiterhin Probleme mit Verzeichnisberechtigungen"
fi
if [ $VENV_STATUS_AFTER -eq 0 ] && [ $VENV_STATUS -ne 0 ]; then
log_success "Virtuelle Python-Umgebung wurde erfolgreich repariert"
elif [ $VENV_STATUS_AFTER -ne 0 ] && [ $VENV_STATUS -ne 0 ]; then
log_error "Es bestehen weiterhin Probleme mit der virtuellen Python-Umgebung"
fi
if [ $PYMONGO_STATUS_AFTER -eq 0 ] && [ $PYMONGO_STATUS -ne 0 ]; then
log_success "PyMongo/BSON-Konflikte wurden erfolgreich behoben"
elif [ $PYMONGO_STATUS_AFTER -ne 0 ] && [ $PYMONGO_STATUS -ne 0 ]; then
log_error "Es bestehen weiterhin PyMongo/BSON-Konflikte"
fi
if [ $SERVICES_STATUS_AFTER -eq 0 ] && [ $SERVICES_STATUS -ne 0 ]; then
log_success "Systemdienste wurden erfolgreich gestartet"
elif [ $SERVICES_STATUS_AFTER -ne 0 ] && [ $SERVICES_STATUS -ne 0 ]; then
log_warning "Es laufen weiterhin nicht alle Systemdienste"
fi
# Final step: Summary
log_section "REPARATUR ABGESCHLOSSEN"
log_message "Die All-in-One Reparatur wurde abgeschlossen."
if [ "$AUTO_MODE" = true ]; then
log_success "Automatischer Reparaturmodus: Alle erkannten Probleme wurden behoben"
log_message "Ein detaillierter Bericht wurde in logs/auto_fix_report.log gespeichert"
# Restart services automatically in auto mode
if command -v systemctl >/dev/null 2>&1; then
log_message "Starte Dienste automatisch neu..."
# Restart MongoDB if it was stopped
if ! systemctl is-active --quiet mongodb 2>/dev/null; then
systemctl restart mongodb 2>/dev/null
fi
# Restart Inventarsystem services
if systemctl list-unit-files | grep -q inventarsystem-gunicorn.service; then
systemctl restart inventarsystem-gunicorn.service 2>/dev/null
fi
if systemctl list-unit-files | grep -q inventarsystem-nginx.service; then
systemctl restart inventarsystem-nginx.service 2>/dev/null
fi
log_success "Dienste wurden neu gestartet"
fi
else
log_message "Nächste Schritte:"
log_message "1. Starten Sie das System neu mit: sudo ./restart.sh"
log_message "2. Überprüfen Sie die Log-Dateien im logs-Verzeichnis"
log_message "3. Bei anhaltenden Problemen versuchen Sie: sudo ./rebuild-venv.sh"
log_message ""
log_message "Tipp: Um dieses Skript automatisch auszuführen, verwenden Sie:"
log_message "sudo ./fix-all.sh --setup-cron"
fi
log_success "FERTIG"
exit 0