chore: Änderungen commited
This commit is contained in:
@ -35,7 +35,8 @@
|
||||
"Bash(ls:*)",
|
||||
"Bash(rg:*)",
|
||||
"Bash(grep:*)",
|
||||
"Bash(grep:*)"
|
||||
"Bash(grep:*)",
|
||||
"Bash(chmod:*)"
|
||||
],
|
||||
"deny": []
|
||||
}
|
||||
|
444
backend/setup/aio_installer.sh
Normal file
444
backend/setup/aio_installer.sh
Normal file
@ -0,0 +1,444 @@
|
||||
#!/bin/bash
|
||||
|
||||
#######################################################################
|
||||
# MYP AIO-Installer (All-in-One Installation System)
|
||||
#
|
||||
# Automatisierte Installation und Einrichtung des MYP-Systems für
|
||||
# Mercedes-Benz 3D-Drucker-Management auf Debian/Linux-Systemen
|
||||
#
|
||||
# Autor: Till Tomczak
|
||||
# Version: 1.0.0
|
||||
# Datum: $(date +%Y-%m-%d)
|
||||
#
|
||||
# Funktionen:
|
||||
# - Vollständige Systemeinrichtung
|
||||
# - Desktop-Environment Installation (LXDE)
|
||||
# - Chromium Kiosk-Modus
|
||||
# - Python/Node.js Dependencies
|
||||
# - SystemD Services
|
||||
# - Firewall-Konfiguration
|
||||
# - Upgrade-Funktionalität
|
||||
#######################################################################
|
||||
|
||||
set -euo pipefail # Strenge Fehlerbehandlung
|
||||
|
||||
# === KONSTANTEN UND KONFIGURATION ===
|
||||
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
readonly PROJECT_ROOT="$(dirname "${SCRIPT_DIR}")"
|
||||
readonly LOG_FILE="/var/log/myp-installer.log"
|
||||
readonly CONFIG_FILE="${SCRIPT_DIR}/installer.conf"
|
||||
|
||||
# Projekt-Konfiguration
|
||||
readonly PROJECT_NAME="MYP"
|
||||
readonly PROJECT_USER="myp"
|
||||
readonly PROJECT_GROUP="myp"
|
||||
readonly INSTALL_PATH="/opt/myp"
|
||||
readonly SERVICE_NAME="myp-https"
|
||||
readonly KIOSK_SERVICE="myp-kiosk"
|
||||
|
||||
# System-Konfiguration
|
||||
readonly HOSTNAME_DEFAULT="myp-terminal"
|
||||
readonly CHROMIUM_FLAGS="--kiosk --disable-infobars --disable-session-crashed-bubble --disable-restore-session-state --disable-background-timer-throttling --disable-backgrounding-occluded-windows --disable-renderer-backgrounding --disable-features=TranslateUI --disable-web-security --disable-features=VizDisplayCompositor --no-first-run --autoplay-policy=no-user-gesture-required"
|
||||
|
||||
# Farben für Ausgabe
|
||||
readonly RED='\033[0;31m'
|
||||
readonly GREEN='\033[0;32m'
|
||||
readonly YELLOW='\033[1;33m'
|
||||
readonly BLUE='\033[0;34m'
|
||||
readonly NC='\033[0m' # No Color
|
||||
|
||||
# === UTILITY-FUNKTIONEN ===
|
||||
|
||||
log() {
|
||||
local level="$1"
|
||||
shift
|
||||
local message="$*"
|
||||
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
|
||||
|
||||
case "$level" in
|
||||
"INFO") echo -e "${GREEN}[INFO]${NC} $message" | tee -a "$LOG_FILE" ;;
|
||||
"WARN") echo -e "${YELLOW}[WARN]${NC} $message" | tee -a "$LOG_FILE" ;;
|
||||
"ERROR") echo -e "${RED}[ERROR]${NC} $message" | tee -a "$LOG_FILE" ;;
|
||||
"DEBUG") echo -e "${BLUE}[DEBUG]${NC} $message" | tee -a "$LOG_FILE" ;;
|
||||
esac
|
||||
|
||||
echo "[$timestamp] [$level] $message" >> "$LOG_FILE"
|
||||
}
|
||||
|
||||
check_root() {
|
||||
if [[ $EUID -ne 0 ]]; then
|
||||
log "ERROR" "Dieses Skript muss als root ausgeführt werden"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
check_system() {
|
||||
log "INFO" "Überprüfe Systemvoraussetzungen..."
|
||||
|
||||
# Debian/Ubuntu Check
|
||||
if ! command -v apt &> /dev/null; then
|
||||
log "ERROR" "Dieses System wird nicht unterstützt (kein APT Package Manager)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Internetverbindung
|
||||
if ! ping -c 1 8.8.8.8 &> /dev/null; then
|
||||
log "ERROR" "Keine Internetverbindung verfügbar"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Speicherplatz (mindestens 2GB frei)
|
||||
local free_space=$(df / | awk 'NR==2 {print $4}')
|
||||
if [[ $free_space -lt 2097152 ]]; then
|
||||
log "ERROR" "Nicht genügend Speicherplatz (mindestens 2GB erforderlich)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log "INFO" "Systemvoraussetzungen erfüllt"
|
||||
}
|
||||
|
||||
confirm_action() {
|
||||
local message="$1"
|
||||
local default="${2:-n}"
|
||||
|
||||
if [[ "${FORCE_YES:-}" == "true" ]]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
while true; do
|
||||
read -p "$message [y/N]: " -n 1 -r
|
||||
echo
|
||||
case $REPLY in
|
||||
[Yy]* ) return 0;;
|
||||
[Nn]* ) return 1;;
|
||||
"" ) [[ "$default" == "y" ]] && return 0 || return 1;;
|
||||
* ) echo "Bitte mit 'y' oder 'n' antworten.";;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
# === INSTALLATION MODULES ===
|
||||
|
||||
# Lädt alle Installationsmodule
|
||||
source "${SCRIPT_DIR}/modules/environment.sh"
|
||||
source "${SCRIPT_DIR}/modules/packages.sh"
|
||||
source "${SCRIPT_DIR}/modules/python_node.sh"
|
||||
source "${SCRIPT_DIR}/modules/desktop.sh"
|
||||
source "${SCRIPT_DIR}/modules/services.sh"
|
||||
source "${SCRIPT_DIR}/modules/firewall.sh"
|
||||
source "${SCRIPT_DIR}/modules/testing.sh"
|
||||
|
||||
# === HAUPTFUNKTIONEN ===
|
||||
|
||||
show_banner() {
|
||||
clear
|
||||
cat << 'EOF'
|
||||
███╗ ███╗██╗ ██╗██████╗ ██╗███╗ ██╗███████╗████████╗ █████╗ ██╗ ██╗ ███████╗██████╗
|
||||
████╗ ████║╚██╗ ██╔╝██╔══██╗ ██║████╗ ██║██╔════╝╚══██╔══╝██╔══██╗██║ ██║ ██╔════╝██╔══██╗
|
||||
██╔████╔██║ ╚████╔╝ ██████╔╝ ██║██╔██╗ ██║███████╗ ██║ ███████║██║ ██║ █████╗ ██████╔╝
|
||||
██║╚██╔╝██║ ╚██╔╝ ██╔═══╝ ██║██║╚██╗██║╚════██║ ██║ ██╔══██║██║ ██║ ██╔══╝ ██╔══██╗
|
||||
██║ ╚═╝ ██║ ██║ ██║ ██║██║ ╚████║███████║ ██║ ██║ ██║███████╗███████╗███████╗██║ ██║
|
||||
╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═══╝╚══════╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚══════╝╚══════╝╚═╝ ╚═╝
|
||||
EOF
|
||||
echo
|
||||
echo " Mercedes-Benz 3D-Drucker Management System"
|
||||
echo " AIO-Installer v1.0.0"
|
||||
echo
|
||||
echo "=================================================================================="
|
||||
echo
|
||||
}
|
||||
|
||||
show_menu() {
|
||||
echo "Verfügbare Optionen:"
|
||||
echo
|
||||
echo "1) Vollinstallation (Empfohlen für neue Systeme)"
|
||||
echo "2) Upgrade bestehender Installation"
|
||||
echo "3) Nur System-Test durchführen"
|
||||
echo "4) Einzelne Komponenten installieren"
|
||||
echo "5) System-Information anzeigen"
|
||||
echo "6) Deinstallation"
|
||||
echo "0) Beenden"
|
||||
echo
|
||||
}
|
||||
|
||||
full_installation() {
|
||||
log "INFO" "Starte Vollinstallation des MYP-Systems..."
|
||||
|
||||
if ! confirm_action "Vollinstallation durchführen? Dies wird das System erheblich verändern."; then
|
||||
log "INFO" "Installation abgebrochen"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Installations-Schritte in definierter Reihenfolge
|
||||
local steps=(
|
||||
"setup_environment"
|
||||
"update_system_packages"
|
||||
"install_python_dependencies"
|
||||
"install_node_dependencies"
|
||||
"setup_desktop_environment"
|
||||
"create_system_user"
|
||||
"setup_systemd_services"
|
||||
"configure_firewall"
|
||||
"setup_autostart"
|
||||
"test_installation"
|
||||
)
|
||||
|
||||
local total_steps=${#steps[@]}
|
||||
local current_step=0
|
||||
|
||||
for step in "${steps[@]}"; do
|
||||
current_step=$((current_step + 1))
|
||||
log "INFO" "Schritt $current_step/$total_steps: $step"
|
||||
|
||||
if ! $step; then
|
||||
log "ERROR" "Fehler bei Schritt $step"
|
||||
return 1
|
||||
fi
|
||||
|
||||
log "INFO" "Schritt $current_step/$total_steps abgeschlossen"
|
||||
done
|
||||
|
||||
log "INFO" "Vollinstallation erfolgreich abgeschlossen!"
|
||||
show_completion_info
|
||||
}
|
||||
|
||||
upgrade_installation() {
|
||||
log "INFO" "Starte Upgrade bestehender Installation..."
|
||||
|
||||
if [[ ! -d "$INSTALL_PATH" ]]; then
|
||||
log "ERROR" "Keine bestehende Installation gefunden in $INSTALL_PATH"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Backup erstellen
|
||||
create_backup
|
||||
|
||||
# Upgrade-Schritte
|
||||
update_system_packages
|
||||
install_python_dependencies
|
||||
install_node_dependencies
|
||||
update_project_files
|
||||
restart_services
|
||||
test_installation
|
||||
|
||||
log "INFO" "Upgrade erfolgreich abgeschlossen!"
|
||||
}
|
||||
|
||||
component_installation() {
|
||||
echo "Einzelne Komponenten:"
|
||||
echo "1) Umgebung einrichten"
|
||||
echo "2) System-Packages aktualisieren"
|
||||
echo "3) Python-Abhängigkeiten installieren"
|
||||
echo "4) Node.js-Abhängigkeiten installieren"
|
||||
echo "5) Desktop-Environment einrichten"
|
||||
echo "6) Systemd-Services einrichten"
|
||||
echo "7) Firewall konfigurieren"
|
||||
echo "8) Tests durchführen"
|
||||
echo "0) Zurück"
|
||||
|
||||
read -p "Komponente auswählen: " choice
|
||||
|
||||
case $choice in
|
||||
1) setup_environment ;;
|
||||
2) update_system_packages ;;
|
||||
3) install_python_dependencies ;;
|
||||
4) install_node_dependencies ;;
|
||||
5) setup_desktop_environment ;;
|
||||
6) setup_systemd_services ;;
|
||||
7) configure_firewall ;;
|
||||
8) test_installation ;;
|
||||
0) return ;;
|
||||
*) log "ERROR" "Ungültige Auswahl" ;;
|
||||
esac
|
||||
}
|
||||
|
||||
show_system_info() {
|
||||
echo "=== SYSTEM-INFORMATION ==="
|
||||
echo "Betriebssystem: $(lsb_release -d | cut -f2)"
|
||||
echo "Kernel: $(uname -r)"
|
||||
echo "Architektur: $(uname -m)"
|
||||
echo "Verfügbarer Speicher: $(free -h | awk 'NR==2{print $7}')"
|
||||
echo "Festplattenspeicher: $(df -h / | awk 'NR==2{print $4}')"
|
||||
echo
|
||||
|
||||
if [[ -d "$INSTALL_PATH" ]]; then
|
||||
echo "=== MYP-INSTALLATION ==="
|
||||
echo "Installationspfad: $INSTALL_PATH"
|
||||
echo "Status: $(systemctl is-active $SERVICE_NAME 2>/dev/null || echo 'Nicht installiert')"
|
||||
echo "Version: $(cat $INSTALL_PATH/VERSION 2>/dev/null || echo 'Unbekannt')"
|
||||
echo
|
||||
fi
|
||||
|
||||
echo "=== NETZWERK ==="
|
||||
echo "IP-Adresse: $(hostname -I | awk '{print $1}')"
|
||||
echo "Hostname: $(hostname)"
|
||||
echo
|
||||
}
|
||||
|
||||
uninstall_system() {
|
||||
log "WARN" "WARNUNG: Dies wird das gesamte MYP-System entfernen!"
|
||||
|
||||
if ! confirm_action "Sind Sie sicher, dass Sie das System deinstallieren möchten?"; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
if ! confirm_action "LETZTE WARNUNG: Alle Daten gehen verloren! Fortfahren?"; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
log "INFO" "Starte Deinstallation..."
|
||||
|
||||
# Services stoppen und entfernen
|
||||
systemctl stop "$SERVICE_NAME" 2>/dev/null || true
|
||||
systemctl stop "$KIOSK_SERVICE" 2>/dev/null || true
|
||||
systemctl disable "$SERVICE_NAME" 2>/dev/null || true
|
||||
systemctl disable "$KIOSK_SERVICE" 2>/dev/null || true
|
||||
|
||||
# Service-Dateien entfernen
|
||||
rm -f "/etc/systemd/system/${SERVICE_NAME}.service"
|
||||
rm -f "/etc/systemd/system/${KIOSK_SERVICE}.service"
|
||||
systemctl daemon-reload
|
||||
|
||||
# Benutzer entfernen
|
||||
if id "$PROJECT_USER" &>/dev/null; then
|
||||
userdel -r "$PROJECT_USER" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
# Installationsverzeichnis entfernen
|
||||
rm -rf "$INSTALL_PATH"
|
||||
|
||||
# Desktop-Konfiguration entfernen
|
||||
rm -rf "/home/$PROJECT_USER"
|
||||
|
||||
log "INFO" "Deinstallation abgeschlossen"
|
||||
}
|
||||
|
||||
show_completion_info() {
|
||||
echo
|
||||
echo "=================================================================================="
|
||||
echo " INSTALLATION ABGESCHLOSSEN"
|
||||
echo "=================================================================================="
|
||||
echo
|
||||
echo "Das MYP-System wurde erfolgreich installiert und konfiguriert."
|
||||
echo
|
||||
echo "Wichtige Informationen:"
|
||||
echo
|
||||
echo "• System-URL: https://$(hostname -I | awk '{print $1}')"
|
||||
echo "• Installationspfad: $INSTALL_PATH"
|
||||
echo "• Service: $SERVICE_NAME"
|
||||
echo "• Benutzer: $PROJECT_USER"
|
||||
echo "• Log-Datei: $LOG_FILE"
|
||||
echo
|
||||
echo "Nächste Schritte:"
|
||||
echo "1. System neu starten: sudo reboot"
|
||||
echo "2. Nach Neustart automatischer Kiosk-Modus"
|
||||
echo "3. Admin-Zugang über: https://IP-ADRESSE/admin"
|
||||
echo
|
||||
echo "Bei Problemen:"
|
||||
echo "• Logs prüfen: sudo journalctl -u $SERVICE_NAME -f"
|
||||
echo "• Service-Status: sudo systemctl status $SERVICE_NAME"
|
||||
echo "• Installer-Log: sudo cat $LOG_FILE"
|
||||
echo
|
||||
echo "=================================================================================="
|
||||
}
|
||||
|
||||
create_backup() {
|
||||
if [[ -d "$INSTALL_PATH" ]]; then
|
||||
local backup_dir="/opt/myp-backup-$(date +%Y%m%d-%H%M%S)"
|
||||
log "INFO" "Erstelle Backup in $backup_dir"
|
||||
cp -r "$INSTALL_PATH" "$backup_dir"
|
||||
log "INFO" "Backup erstellt: $backup_dir"
|
||||
fi
|
||||
}
|
||||
|
||||
# === HAUPTPROGRAMM ===
|
||||
|
||||
main() {
|
||||
# Log-Datei initialisieren
|
||||
touch "$LOG_FILE"
|
||||
chmod 644 "$LOG_FILE"
|
||||
|
||||
log "INFO" "MYP AIO-Installer gestartet"
|
||||
|
||||
# Root-Rechte prüfen
|
||||
check_root
|
||||
|
||||
# System prüfen
|
||||
check_system
|
||||
|
||||
# Banner anzeigen
|
||||
show_banner
|
||||
|
||||
# Hauptmenü
|
||||
while true; do
|
||||
show_menu
|
||||
read -p "Option auswählen: " choice
|
||||
|
||||
case $choice in
|
||||
1) full_installation ;;
|
||||
2) upgrade_installation ;;
|
||||
3) test_installation ;;
|
||||
4) component_installation ;;
|
||||
5) show_system_info ;;
|
||||
6) uninstall_system ;;
|
||||
0)
|
||||
log "INFO" "Installation beendet"
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
log "ERROR" "Ungültige Auswahl: $choice"
|
||||
;;
|
||||
esac
|
||||
|
||||
echo
|
||||
read -p "Drücken Sie Enter zum Fortfahren..."
|
||||
clear
|
||||
show_banner
|
||||
done
|
||||
}
|
||||
|
||||
# Kommandozeilen-Argumente verarbeiten
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
--full)
|
||||
FORCE_YES="true"
|
||||
full_installation
|
||||
exit $?
|
||||
;;
|
||||
--upgrade)
|
||||
FORCE_YES="true"
|
||||
upgrade_installation
|
||||
exit $?
|
||||
;;
|
||||
--test)
|
||||
test_installation
|
||||
exit $?
|
||||
;;
|
||||
--uninstall)
|
||||
uninstall_system
|
||||
exit $?
|
||||
;;
|
||||
--help|-h)
|
||||
echo "MYP AIO-Installer"
|
||||
echo "Verwendung: $0 [OPTION]"
|
||||
echo
|
||||
echo "Optionen:"
|
||||
echo " --full Vollinstallation ohne Bestätigung"
|
||||
echo " --upgrade Upgrade bestehender Installation"
|
||||
echo " --test Nur Tests durchführen"
|
||||
echo " --uninstall System deinstallieren"
|
||||
echo " --help, -h Diese Hilfe anzeigen"
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
log "ERROR" "Unbekannte Option: $1"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
# Hauptprogramm ausführen wenn keine Kommandozeilen-Argumente
|
||||
main
|
||||
|
||||
exit 0
|
335
backend/setup/modules/environment.sh
Normal file
335
backend/setup/modules/environment.sh
Normal file
@ -0,0 +1,335 @@
|
||||
#!/bin/bash
|
||||
|
||||
#######################################################################
|
||||
# MYP AIO-Installer - Environment Setup Module
|
||||
#
|
||||
# Dieses Modul behandelt die grundlegende Umgebungseinrichtung:
|
||||
# - Kopieren der Projektdaten von relativen zu absoluten Pfaden
|
||||
# - Setzen der korrekten Berechtigungen
|
||||
# - Deinstallation bestehender Desktop-Environments
|
||||
# - Vorbereitung des Zielsystems
|
||||
#######################################################################
|
||||
|
||||
# Funktionsdeklarationen für Environment Setup
|
||||
|
||||
setup_environment() {
|
||||
log "INFO" "=== UMGEBUNGSEINRICHTUNG STARTEN ==="
|
||||
|
||||
# Grundlegende Verzeichnisstruktur erstellen
|
||||
create_directory_structure
|
||||
|
||||
# Projektdateien kopieren
|
||||
copy_project_files
|
||||
|
||||
# Berechtigungen setzen
|
||||
set_file_permissions
|
||||
|
||||
# Bestehende Desktop-Environments entfernen
|
||||
remove_existing_desktop_environments
|
||||
|
||||
# Hostname konfigurieren
|
||||
configure_hostname
|
||||
|
||||
log "INFO" "Umgebungseinrichtung abgeschlossen"
|
||||
}
|
||||
|
||||
create_directory_structure() {
|
||||
log "INFO" "Erstelle Verzeichnisstruktur..."
|
||||
|
||||
# Hauptinstallationsverzeichnis
|
||||
mkdir -p "$INSTALL_PATH"
|
||||
mkdir -p "$INSTALL_PATH/backend"
|
||||
mkdir -p "$INSTALL_PATH/logs"
|
||||
mkdir -p "$INSTALL_PATH/uploads"
|
||||
mkdir -p "$INSTALL_PATH/instance/backups"
|
||||
mkdir -p "$INSTALL_PATH/instance/sessions"
|
||||
mkdir -p "$INSTALL_PATH/database"
|
||||
mkdir -p "$INSTALL_PATH/certs"
|
||||
mkdir -p "$INSTALL_PATH/static"
|
||||
mkdir -p "$INSTALL_PATH/templates"
|
||||
|
||||
# System-Verzeichnisse
|
||||
mkdir -p "/var/log/myp"
|
||||
mkdir -p "/etc/myp"
|
||||
mkdir -p "/usr/local/bin/myp"
|
||||
|
||||
# Desktop-Konfiguration Verzeichnisse
|
||||
mkdir -p "/home/$PROJECT_USER/.config"
|
||||
mkdir -p "/home/$PROJECT_USER/.local/share/applications"
|
||||
mkdir -p "/home/$PROJECT_USER/Desktop"
|
||||
|
||||
log "INFO" "Verzeichnisstruktur erstellt"
|
||||
}
|
||||
|
||||
copy_project_files() {
|
||||
log "INFO" "Kopiere Projektdateien von $PROJECT_ROOT nach $INSTALL_PATH..."
|
||||
|
||||
# Prüfe ob Quelldateien existieren
|
||||
if [[ ! -d "$PROJECT_ROOT" ]]; then
|
||||
log "ERROR" "Projekt-Quellverzeichnis nicht gefunden: $PROJECT_ROOT"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Kopiere alle Projektdateien (außer temporäre/cache Dateien)
|
||||
rsync -av --progress \
|
||||
--exclude="__pycache__" \
|
||||
--exclude="*.pyc" \
|
||||
--exclude=".git" \
|
||||
--exclude="node_modules" \
|
||||
--exclude="*.log" \
|
||||
--exclude="database/myp.db*" \
|
||||
--exclude="instance/sessions/*" \
|
||||
"$PROJECT_ROOT/" "$INSTALL_PATH/"
|
||||
|
||||
# Spezielle Dateien individuell behandeln
|
||||
cp "$PROJECT_ROOT/requirements.txt" "$INSTALL_PATH/" 2>/dev/null || true
|
||||
cp "$PROJECT_ROOT/package.json" "$INSTALL_PATH/" 2>/dev/null || true
|
||||
cp "$PROJECT_ROOT/package-lock.json" "$INSTALL_PATH/" 2>/dev/null || true
|
||||
cp "$PROJECT_ROOT/tailwind.config.js" "$INSTALL_PATH/" 2>/dev/null || true
|
||||
cp "$PROJECT_ROOT/postcss.config.js" "$INSTALL_PATH/" 2>/dev/null || true
|
||||
|
||||
# Version-Datei erstellen
|
||||
echo "1.0.0-$(date +%Y%m%d)" > "$INSTALL_PATH/VERSION"
|
||||
|
||||
log "INFO" "Projektdateien erfolgreich kopiert"
|
||||
}
|
||||
|
||||
set_file_permissions() {
|
||||
log "INFO" "Setze Dateiberechtigungen..."
|
||||
|
||||
# Besitzer für Installationsverzeichnis
|
||||
chown -R "$PROJECT_USER:$PROJECT_GROUP" "$INSTALL_PATH"
|
||||
|
||||
# Grundlegende Verzeichnisberechtigungen
|
||||
find "$INSTALL_PATH" -type d -exec chmod 755 {} \;
|
||||
find "$INSTALL_PATH" -type f -exec chmod 644 {} \;
|
||||
|
||||
# Ausführbare Dateien
|
||||
find "$INSTALL_PATH" -name "*.sh" -exec chmod +x {} \;
|
||||
find "$INSTALL_PATH" -name "*.py" -exec chmod +x {} \;
|
||||
|
||||
# Spezielle Berechtigungen für sensible Verzeichnisse
|
||||
chmod 700 "$INSTALL_PATH/instance"
|
||||
chmod 700 "$INSTALL_PATH/database"
|
||||
chmod 700 "$INSTALL_PATH/certs"
|
||||
chmod 755 "$INSTALL_PATH/uploads"
|
||||
chmod 755 "$INSTALL_PATH/static"
|
||||
|
||||
# Log-Verzeichnis Berechtigungen
|
||||
chown -R "$PROJECT_USER:$PROJECT_GROUP" "/var/log/myp"
|
||||
chmod 755 "/var/log/myp"
|
||||
|
||||
# Konfigurationsverzeichnis
|
||||
chown -R "$PROJECT_USER:$PROJECT_GROUP" "/etc/myp"
|
||||
chmod 755 "/etc/myp"
|
||||
|
||||
log "INFO" "Dateiberechtigungen gesetzt"
|
||||
}
|
||||
|
||||
remove_existing_desktop_environments() {
|
||||
log "INFO" "Entferne bestehende Desktop-Environments..."
|
||||
|
||||
# Liste der zu entfernenden Desktop-Environments
|
||||
local desktop_packages=(
|
||||
# GNOME
|
||||
"gnome-shell"
|
||||
"gnome-session"
|
||||
"gnome-desktop3"
|
||||
"gnome-core"
|
||||
"gnome-minimal"
|
||||
"gdm3"
|
||||
|
||||
# KDE/Plasma
|
||||
"kde-plasma-desktop"
|
||||
"plasma-desktop"
|
||||
"kde-full"
|
||||
"kde-standard"
|
||||
"sddm"
|
||||
|
||||
# XFCE
|
||||
"xfce4"
|
||||
"xfce4-session"
|
||||
"xfce4-panel"
|
||||
"lightdm"
|
||||
|
||||
# MATE
|
||||
"mate-desktop-environment"
|
||||
"mate-session-manager"
|
||||
|
||||
# Cinnamon
|
||||
"cinnamon-desktop-environment"
|
||||
"cinnamon-session"
|
||||
|
||||
# Unity (falls noch vorhanden)
|
||||
"unity"
|
||||
"unity-session"
|
||||
|
||||
# Andere Display Manager
|
||||
"slim"
|
||||
"nodm"
|
||||
"xdm"
|
||||
)
|
||||
|
||||
# Stoppe alle Desktop-Services
|
||||
systemctl stop gdm3 2>/dev/null || true
|
||||
systemctl stop sddm 2>/dev/null || true
|
||||
systemctl stop lightdm 2>/dev/null || true
|
||||
systemctl stop slim 2>/dev/null || true
|
||||
systemctl stop xdm 2>/dev/null || true
|
||||
|
||||
# Deaktiviere Desktop-Services
|
||||
systemctl disable gdm3 2>/dev/null || true
|
||||
systemctl disable sddm 2>/dev/null || true
|
||||
systemctl disable lightdm 2>/dev/null || true
|
||||
systemctl disable slim 2>/dev/null || true
|
||||
systemctl disable xdm 2>/dev/null || true
|
||||
|
||||
# Entferne Desktop-Packages
|
||||
for package in "${desktop_packages[@]}"; do
|
||||
if dpkg -l | grep -q "^ii.*$package"; then
|
||||
log "INFO" "Entferne Desktop-Package: $package"
|
||||
apt-get remove --purge -y "$package" 2>/dev/null || true
|
||||
fi
|
||||
done
|
||||
|
||||
# Autoremove nicht mehr benötigte Pakete
|
||||
apt-get autoremove --purge -y 2>/dev/null || true
|
||||
|
||||
# Bereinige Desktop-Konfigurationsdateien
|
||||
rm -rf /etc/gdm3 2>/dev/null || true
|
||||
rm -rf /etc/sddm* 2>/dev/null || true
|
||||
rm -rf /etc/lightdm 2>/dev/null || true
|
||||
rm -rf /etc/X11/default-display-manager 2>/dev/null || true
|
||||
|
||||
log "INFO" "Desktop-Environment Bereinigung abgeschlossen"
|
||||
}
|
||||
|
||||
configure_hostname() {
|
||||
log "INFO" "Konfiguriere Hostname..."
|
||||
|
||||
local current_hostname=$(hostname)
|
||||
local new_hostname="$HOSTNAME_DEFAULT"
|
||||
|
||||
# Frage nach gewünschtem Hostname (außer bei automatischer Installation)
|
||||
if [[ "${FORCE_YES:-}" != "true" ]]; then
|
||||
read -p "Hostname [$HOSTNAME_DEFAULT]: " input_hostname
|
||||
if [[ -n "$input_hostname" ]]; then
|
||||
new_hostname="$input_hostname"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ "$current_hostname" != "$new_hostname" ]]; then
|
||||
log "INFO" "Ändere Hostname von '$current_hostname' zu '$new_hostname'"
|
||||
|
||||
# Hostname setzen
|
||||
echo "$new_hostname" > /etc/hostname
|
||||
hostnamectl set-hostname "$new_hostname"
|
||||
|
||||
# /etc/hosts aktualisieren
|
||||
sed -i "s/127.0.1.1.*/127.0.1.1\t$new_hostname/" /etc/hosts
|
||||
|
||||
# Füge Eintrag hinzu falls nicht vorhanden
|
||||
if ! grep -q "127.0.1.1" /etc/hosts; then
|
||||
echo "127.0.1.1 $new_hostname" >> /etc/hosts
|
||||
fi
|
||||
|
||||
log "INFO" "Hostname konfiguriert: $new_hostname"
|
||||
else
|
||||
log "INFO" "Hostname bereits korrekt konfiguriert: $current_hostname"
|
||||
fi
|
||||
}
|
||||
|
||||
update_project_files() {
|
||||
log "INFO" "Aktualisiere Projektdateien..."
|
||||
|
||||
# Backup der aktuellen Konfiguration
|
||||
if [[ -f "$INSTALL_PATH/config/settings.py" ]]; then
|
||||
cp "$INSTALL_PATH/config/settings.py" "$INSTALL_PATH/config/settings.py.backup.$(date +%Y%m%d-%H%M%S)"
|
||||
fi
|
||||
|
||||
# Neue Dateien kopieren (ohne Konfigurationsdateien zu überschreiben)
|
||||
rsync -av --progress \
|
||||
--exclude="__pycache__" \
|
||||
--exclude="*.pyc" \
|
||||
--exclude=".git" \
|
||||
--exclude="node_modules" \
|
||||
--exclude="*.log" \
|
||||
--exclude="database/myp.db*" \
|
||||
--exclude="instance/sessions/*" \
|
||||
--exclude="config/settings.py" \
|
||||
"$PROJECT_ROOT/" "$INSTALL_PATH/"
|
||||
|
||||
# Berechtigungen wieder setzen
|
||||
set_file_permissions
|
||||
|
||||
log "INFO" "Projektdateien aktualisiert"
|
||||
}
|
||||
|
||||
cleanup_environment() {
|
||||
log "INFO" "Bereinige temporäre Dateien..."
|
||||
|
||||
# Temporäre Python-Dateien
|
||||
find "$INSTALL_PATH" -name "*.pyc" -delete 2>/dev/null || true
|
||||
find "$INSTALL_PATH" -name "__pycache__" -type d -exec rm -rf {} + 2>/dev/null || true
|
||||
|
||||
# Alte Log-Dateien (älter als 30 Tage)
|
||||
find "/var/log/myp" -name "*.log" -mtime +30 -delete 2>/dev/null || true
|
||||
|
||||
# Alte Session-Dateien
|
||||
find "$INSTALL_PATH/instance/sessions" -name "*.pkl" -mtime +7 -delete 2>/dev/null || true
|
||||
|
||||
# Package-Cache bereinigen
|
||||
apt-get clean
|
||||
apt-get autoclean
|
||||
|
||||
log "INFO" "Umgebung bereinigt"
|
||||
}
|
||||
|
||||
verify_environment() {
|
||||
log "INFO" "Überprüfe Umgebungseinrichtung..."
|
||||
|
||||
local errors=0
|
||||
|
||||
# Verzeichnisse prüfen
|
||||
local required_dirs=(
|
||||
"$INSTALL_PATH"
|
||||
"$INSTALL_PATH/backend"
|
||||
"/var/log/myp"
|
||||
"/etc/myp"
|
||||
)
|
||||
|
||||
for dir in "${required_dirs[@]}"; do
|
||||
if [[ ! -d "$dir" ]]; then
|
||||
log "ERROR" "Erforderliches Verzeichnis fehlt: $dir"
|
||||
errors=$((errors + 1))
|
||||
fi
|
||||
done
|
||||
|
||||
# Wichtige Dateien prüfen
|
||||
local required_files=(
|
||||
"$INSTALL_PATH/app.py"
|
||||
"$INSTALL_PATH/requirements.txt"
|
||||
"$INSTALL_PATH/models.py"
|
||||
)
|
||||
|
||||
for file in "${required_files[@]}"; do
|
||||
if [[ ! -f "$file" ]]; then
|
||||
log "ERROR" "Erforderliche Datei fehlt: $file"
|
||||
errors=$((errors + 1))
|
||||
fi
|
||||
done
|
||||
|
||||
# Berechtigungen prüfen
|
||||
if [[ ! -O "$INSTALL_PATH" ]]; then
|
||||
log "ERROR" "Falscher Besitzer für $INSTALL_PATH"
|
||||
errors=$((errors + 1))
|
||||
fi
|
||||
|
||||
if [[ $errors -eq 0 ]]; then
|
||||
log "INFO" "Umgebungsverifikation erfolgreich"
|
||||
return 0
|
||||
else
|
||||
log "ERROR" "Umgebungsverifikation fehlgeschlagen ($errors Fehler)"
|
||||
return 1
|
||||
fi
|
||||
}
|
496
backend/setup/modules/packages.sh
Normal file
496
backend/setup/modules/packages.sh
Normal file
@ -0,0 +1,496 @@
|
||||
#!/bin/bash
|
||||
|
||||
#######################################################################
|
||||
# MYP AIO-Installer - System Packages Module
|
||||
#
|
||||
# Dieses Modul behandelt die Installation und Aktualisierung von:
|
||||
# - System-Updates und Upgrades
|
||||
# - Grundlegende System-Packages
|
||||
# - Zusätzliche Sources und Repositories
|
||||
# - Abhängigkeiten für das MYP-System
|
||||
#######################################################################
|
||||
|
||||
# Funktionsdeklarationen für Package Management
|
||||
|
||||
update_system_packages() {
|
||||
log "INFO" "=== SYSTEM-PACKAGES AKTUALISIEREN ==="
|
||||
|
||||
# APT Sources konfigurieren
|
||||
configure_apt_sources
|
||||
|
||||
# System-Update durchführen
|
||||
perform_system_update
|
||||
|
||||
# Grundlegende Packages installieren
|
||||
install_base_packages
|
||||
|
||||
# Spezielle Repositories hinzufügen
|
||||
add_additional_repositories
|
||||
|
||||
# Cleanup durchführen
|
||||
cleanup_packages
|
||||
|
||||
log "INFO" "System-Package-Aktualisierung abgeschlossen"
|
||||
}
|
||||
|
||||
configure_apt_sources() {
|
||||
log "INFO" "Konfiguriere APT-Sources..."
|
||||
|
||||
# Backup der aktuellen sources.list
|
||||
cp /etc/apt/sources.list /etc/apt/sources.list.backup.$(date +%Y%m%d)
|
||||
|
||||
# Detect Debian/Ubuntu Version
|
||||
local os_id=$(lsb_release -si)
|
||||
local os_codename=$(lsb_release -sc)
|
||||
|
||||
log "INFO" "Erkanntes System: $os_id $os_codename"
|
||||
|
||||
case "$os_id" in
|
||||
"Debian")
|
||||
configure_debian_sources "$os_codename"
|
||||
;;
|
||||
"Ubuntu"|"Raspbian")
|
||||
configure_ubuntu_sources "$os_codename"
|
||||
;;
|
||||
*)
|
||||
log "WARN" "Unbekanntes System, verwende Standard-Konfiguration"
|
||||
;;
|
||||
esac
|
||||
|
||||
# Sicherstellen dass Universe und Multiverse aktiviert sind (Ubuntu/Raspbian)
|
||||
if [[ "$os_id" == "Ubuntu" ]] || [[ "$os_id" == "Raspbian" ]]; then
|
||||
add-apt-repository universe -y 2>/dev/null || true
|
||||
add-apt-repository multiverse -y 2>/dev/null || true
|
||||
fi
|
||||
|
||||
log "INFO" "APT-Sources konfiguriert"
|
||||
}
|
||||
|
||||
configure_debian_sources() {
|
||||
local codename="$1"
|
||||
|
||||
log "INFO" "Konfiguriere Debian Sources für $codename"
|
||||
|
||||
# Standard Debian Sources
|
||||
cat > /etc/apt/sources.list << EOF
|
||||
# Debian $codename - Hauptrepositories
|
||||
deb http://deb.debian.org/debian $codename main contrib non-free
|
||||
deb-src http://deb.debian.org/debian $codename main contrib non-free
|
||||
|
||||
# Debian $codename - Updates
|
||||
deb http://deb.debian.org/debian $codename-updates main contrib non-free
|
||||
deb-src http://deb.debian.org/debian $codename-updates main contrib non-free
|
||||
|
||||
# Debian $codename - Security Updates
|
||||
deb http://security.debian.org/debian-security $codename-security main contrib non-free
|
||||
deb-src http://security.debian.org/debian-security $codename-security main contrib non-free
|
||||
|
||||
# Debian $codename - Backports (falls verfügbar)
|
||||
deb http://deb.debian.org/debian $codename-backports main contrib non-free
|
||||
deb-src http://deb.debian.org/debian $codename-backports main contrib non-free
|
||||
EOF
|
||||
}
|
||||
|
||||
configure_ubuntu_sources() {
|
||||
local codename="$1"
|
||||
|
||||
log "INFO" "Konfiguriere Ubuntu/Raspbian Sources für $codename"
|
||||
|
||||
# Ubuntu/Raspbian Sources
|
||||
cat > /etc/apt/sources.list << EOF
|
||||
# Ubuntu/Raspbian $codename - Hauptrepositories
|
||||
deb http://archive.ubuntu.com/ubuntu $codename main restricted universe multiverse
|
||||
deb-src http://archive.ubuntu.com/ubuntu $codename main restricted universe multiverse
|
||||
|
||||
# Ubuntu/Raspbian $codename - Updates
|
||||
deb http://archive.ubuntu.com/ubuntu $codename-updates main restricted universe multiverse
|
||||
deb-src http://archive.ubuntu.com/ubuntu $codename-updates main restricted universe multiverse
|
||||
|
||||
# Ubuntu/Raspbian $codename - Security Updates
|
||||
deb http://security.ubuntu.com/ubuntu $codename-security main restricted universe multiverse
|
||||
deb-src http://security.ubuntu.com/ubuntu $codename-security main restricted universe multiverse
|
||||
|
||||
# Ubuntu/Raspbian $codename - Backports
|
||||
deb http://archive.ubuntu.com/ubuntu $codename-backports main restricted universe multiverse
|
||||
deb-src http://archive.ubuntu.com/ubuntu $codename-backports main restricted universe multiverse
|
||||
EOF
|
||||
}
|
||||
|
||||
perform_system_update() {
|
||||
log "INFO" "Führe System-Update durch..."
|
||||
|
||||
# APT-Cache aktualisieren
|
||||
log "INFO" "Aktualisiere APT-Cache..."
|
||||
apt-get update -y || {
|
||||
log "ERROR" "APT-Update fehlgeschlagen"
|
||||
return 1
|
||||
}
|
||||
|
||||
# Upgrade durchführen
|
||||
log "INFO" "Führe System-Upgrade durch..."
|
||||
DEBIAN_FRONTEND=noninteractive apt-get upgrade -y || {
|
||||
log "ERROR" "APT-Upgrade fehlgeschlagen"
|
||||
return 1
|
||||
}
|
||||
|
||||
# Dist-Upgrade für kritische Updates
|
||||
log "INFO" "Führe Distribution-Upgrade durch..."
|
||||
DEBIAN_FRONTEND=noninteractive apt-get dist-upgrade -y || {
|
||||
log "WARN" "Dist-Upgrade hatte Probleme, fortfahren..."
|
||||
}
|
||||
|
||||
log "INFO" "System-Update abgeschlossen"
|
||||
}
|
||||
|
||||
install_base_packages() {
|
||||
log "INFO" "Installiere grundlegende System-Packages..."
|
||||
|
||||
# Essentielle System-Tools
|
||||
local base_packages=(
|
||||
# Grundlegende Tools
|
||||
"curl"
|
||||
"wget"
|
||||
"git"
|
||||
"unzip"
|
||||
"zip"
|
||||
"tar"
|
||||
"gzip"
|
||||
"rsync"
|
||||
"htop"
|
||||
"tree"
|
||||
"nano"
|
||||
"vim-tiny"
|
||||
|
||||
# Netzwerk-Tools
|
||||
"net-tools"
|
||||
"iputils-ping"
|
||||
"dnsutils"
|
||||
"ssh"
|
||||
"openssh-server"
|
||||
|
||||
# Build-Tools
|
||||
"build-essential"
|
||||
"gcc"
|
||||
"g++"
|
||||
"make"
|
||||
"cmake"
|
||||
"pkg-config"
|
||||
|
||||
# Python-Grundlagen
|
||||
"python3"
|
||||
"python3-pip"
|
||||
"python3-dev"
|
||||
"python3-venv"
|
||||
"python3-setuptools"
|
||||
"python3-wheel"
|
||||
|
||||
# SSL/TLS
|
||||
"ca-certificates"
|
||||
"openssl"
|
||||
|
||||
# System-Utilities
|
||||
"systemd"
|
||||
"systemctl"
|
||||
"cron"
|
||||
"logrotate"
|
||||
"sudo"
|
||||
|
||||
# Raspberry Pi spezifisch
|
||||
"rpi-update"
|
||||
"raspberrypi-kernel-headers"
|
||||
|
||||
# Zusätzliche Libraries
|
||||
"libffi-dev"
|
||||
"libssl-dev"
|
||||
"libxml2-dev"
|
||||
"libxslt1-dev"
|
||||
"zlib1g-dev"
|
||||
"libjpeg-dev"
|
||||
"libpng-dev"
|
||||
"libfreetype6-dev"
|
||||
"liblcms2-dev"
|
||||
"libwebp-dev"
|
||||
"tcl8.6-dev"
|
||||
"tk8.6-dev"
|
||||
"python3-tk"
|
||||
|
||||
# Firewall
|
||||
"ufw"
|
||||
"iptables"
|
||||
"iptables-persistent"
|
||||
|
||||
# Monitoring
|
||||
"psmisc"
|
||||
"lsof"
|
||||
"strace"
|
||||
)
|
||||
|
||||
# Installiere Packages in Batches für bessere Fehlerbehandlung
|
||||
local batch_size=10
|
||||
local total_packages=${#base_packages[@]}
|
||||
local current_batch=0
|
||||
|
||||
for ((i=0; i<total_packages; i+=batch_size)); do
|
||||
current_batch=$((current_batch + 1))
|
||||
local batch=("${base_packages[@]:i:batch_size}")
|
||||
|
||||
log "INFO" "Installiere Package-Batch $current_batch (${#batch[@]} Packages)..."
|
||||
|
||||
if ! DEBIAN_FRONTEND=noninteractive apt-get install -y "${batch[@]}"; then
|
||||
log "WARN" "Batch $current_batch hatte Probleme, installiere einzeln..."
|
||||
|
||||
# Installiere einzeln bei Fehlern
|
||||
for package in "${batch[@]}"; do
|
||||
if ! DEBIAN_FRONTEND=noninteractive apt-get install -y "$package"; then
|
||||
log "WARN" "Package konnte nicht installiert werden: $package"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
done
|
||||
|
||||
log "INFO" "Grundlegende Packages installiert"
|
||||
}
|
||||
|
||||
add_additional_repositories() {
|
||||
log "INFO" "Füge zusätzliche Repositories hinzu..."
|
||||
|
||||
# Node.js Repository (NodeSource)
|
||||
add_nodejs_repository
|
||||
|
||||
# Chromium Repository (falls nicht verfügbar)
|
||||
add_chromium_repository
|
||||
|
||||
# Docker Repository (optional, für erweiterte Funktionen)
|
||||
# add_docker_repository
|
||||
|
||||
log "INFO" "Zusätzliche Repositories hinzugefügt"
|
||||
}
|
||||
|
||||
add_nodejs_repository() {
|
||||
log "INFO" "Füge Node.js Repository hinzu..."
|
||||
|
||||
# NodeSource GPG-Key hinzufügen
|
||||
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add - || {
|
||||
log "WARN" "Node.js GPG-Key konnte nicht hinzugefügt werden"
|
||||
return 1
|
||||
}
|
||||
|
||||
# Node.js 18.x Repository
|
||||
local os_codename=$(lsb_release -sc)
|
||||
echo "deb https://deb.nodesource.com/node_18.x $os_codename main" > /etc/apt/sources.list.d/nodesource.list
|
||||
echo "deb-src https://deb.nodesource.com/node_18.x $os_codename main" >> /etc/apt/sources.list.d/nodesource.list
|
||||
|
||||
# APT-Cache aktualisieren
|
||||
apt-get update -y || {
|
||||
log "WARN" "Node.js Repository-Update fehlgeschlagen"
|
||||
return 1
|
||||
}
|
||||
|
||||
log "INFO" "Node.js Repository hinzugefügt"
|
||||
}
|
||||
|
||||
add_chromium_repository() {
|
||||
log "INFO" "Prüfe Chromium-Verfügbarkeit..."
|
||||
|
||||
# Prüfe ob Chromium bereits verfügbar ist
|
||||
if apt-cache search chromium-browser | grep -q chromium-browser; then
|
||||
log "INFO" "Chromium ist bereits über Standard-Repository verfügbar"
|
||||
return 0
|
||||
fi
|
||||
|
||||
# Füge Snap für Chromium hinzu falls APT-Version nicht verfügbar
|
||||
if command -v snap >/dev/null 2>&1; then
|
||||
log "INFO" "Snap verfügbar, Chromium wird über Snap installiert"
|
||||
return 0
|
||||
fi
|
||||
|
||||
# Installiere Snap falls nicht vorhanden
|
||||
if ! DEBIAN_FRONTEND=noninteractive apt-get install -y snapd; then
|
||||
log "WARN" "Snap konnte nicht installiert werden"
|
||||
return 1
|
||||
fi
|
||||
|
||||
log "INFO" "Snap für Chromium-Installation vorbereitet"
|
||||
}
|
||||
|
||||
add_docker_repository() {
|
||||
log "INFO" "Füge Docker Repository hinzu (optional)..."
|
||||
|
||||
# Docker GPG-Key
|
||||
curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add - || {
|
||||
log "WARN" "Docker GPG-Key konnte nicht hinzugefügt werden"
|
||||
return 1
|
||||
}
|
||||
|
||||
# Docker Repository
|
||||
local os_codename=$(lsb_release -sc)
|
||||
echo "deb [arch=amd64,arm64,armhf] https://download.docker.com/linux/debian $os_codename stable" > /etc/apt/sources.list.d/docker.list
|
||||
|
||||
# APT-Cache aktualisieren
|
||||
apt-get update -y || {
|
||||
log "WARN" "Docker Repository-Update fehlgeschlagen"
|
||||
return 1
|
||||
}
|
||||
|
||||
log "INFO" "Docker Repository hinzugefügt"
|
||||
}
|
||||
|
||||
install_security_updates() {
|
||||
log "INFO" "Installiere Sicherheitsupdates..."
|
||||
|
||||
# Unattended-upgrades für automatische Sicherheitsupdates
|
||||
DEBIAN_FRONTEND=noninteractive apt-get install -y unattended-upgrades apt-listchanges || {
|
||||
log "WARN" "Unattended-upgrades konnte nicht installiert werden"
|
||||
}
|
||||
|
||||
# Konfiguriere automatische Sicherheitsupdates
|
||||
cat > /etc/apt/apt.conf.d/20auto-upgrades << 'EOF'
|
||||
APT::Periodic::Update-Package-Lists "1";
|
||||
APT::Periodic::Unattended-Upgrade "1";
|
||||
APT::Periodic::AutocleanInterval "7";
|
||||
EOF
|
||||
|
||||
# Konfiguriere welche Updates automatisch installiert werden
|
||||
cat > /etc/apt/apt.conf.d/50unattended-upgrades << 'EOF'
|
||||
Unattended-Upgrade::Allowed-Origins {
|
||||
"${distro_id}:${distro_codename}-security";
|
||||
"${distro_id} ESMApps:${distro_codename}-apps-security";
|
||||
"${distro_id} ESM:${distro_codename}-infra-security";
|
||||
};
|
||||
|
||||
Unattended-Upgrade::Package-Blacklist {
|
||||
// Keine Packages blockieren für MYP-System
|
||||
};
|
||||
|
||||
Unattended-Upgrade::AutoFixInterruptedDpkg "true";
|
||||
Unattended-Upgrade::MinimalSteps "true";
|
||||
Unattended-Upgrade::Remove-Unused-Dependencies "true";
|
||||
Unattended-Upgrade::Automatic-Reboot "false";
|
||||
Unattended-Upgrade::SyslogEnable "true";
|
||||
EOF
|
||||
|
||||
log "INFO" "Automatische Sicherheitsupdates konfiguriert"
|
||||
}
|
||||
|
||||
cleanup_packages() {
|
||||
log "INFO" "Bereinige Package-System..."
|
||||
|
||||
# Nicht mehr benötigte Packages entfernen
|
||||
apt-get autoremove --purge -y || {
|
||||
log "WARN" "Autoremove hatte Probleme"
|
||||
}
|
||||
|
||||
# APT-Cache bereinigen
|
||||
apt-get autoclean || {
|
||||
log "WARN" "Autoclean hatte Probleme"
|
||||
}
|
||||
|
||||
apt-get clean || {
|
||||
log "WARN" "Clean hatte Probleme"
|
||||
}
|
||||
|
||||
# Alte Kernel entfernen (behalte nur die letzten 2)
|
||||
if command -v purge-old-kernels >/dev/null 2>&1; then
|
||||
purge-old-kernels --keep 2 -y || {
|
||||
log "WARN" "Alte Kernel konnten nicht bereinigt werden"
|
||||
}
|
||||
fi
|
||||
|
||||
log "INFO" "Package-System bereinigt"
|
||||
}
|
||||
|
||||
verify_packages() {
|
||||
log "INFO" "Überprüfe installierte Packages..."
|
||||
|
||||
local errors=0
|
||||
|
||||
# Kritische Packages prüfen
|
||||
local critical_packages=(
|
||||
"python3"
|
||||
"python3-pip"
|
||||
"git"
|
||||
"curl"
|
||||
"wget"
|
||||
"build-essential"
|
||||
"openssh-server"
|
||||
"systemd"
|
||||
)
|
||||
|
||||
for package in "${critical_packages[@]}"; do
|
||||
if ! dpkg -l | grep -q "^ii.*$package"; then
|
||||
log "ERROR" "Kritisches Package fehlt: $package"
|
||||
errors=$((errors + 1))
|
||||
fi
|
||||
done
|
||||
|
||||
# System-Dienste prüfen
|
||||
local critical_services=(
|
||||
"ssh"
|
||||
"systemd-resolved"
|
||||
"cron"
|
||||
)
|
||||
|
||||
for service in "${critical_services[@]}"; do
|
||||
if ! systemctl is-active --quiet "$service"; then
|
||||
log "WARN" "Service nicht aktiv: $service"
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ $errors -eq 0 ]]; then
|
||||
log "INFO" "Package-Verifikation erfolgreich"
|
||||
return 0
|
||||
else
|
||||
log "ERROR" "Package-Verifikation fehlgeschlagen ($errors Fehler)"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
optimize_raspberry_pi() {
|
||||
log "INFO" "Optimiere System für Raspberry Pi..."
|
||||
|
||||
# Prüfe ob es sich um einen Raspberry Pi handelt
|
||||
if [[ ! -f /proc/device-tree/model ]] || ! grep -q "Raspberry Pi" /proc/device-tree/model; then
|
||||
log "INFO" "Kein Raspberry Pi erkannt, überspringe Optimierungen"
|
||||
return 0
|
||||
fi
|
||||
|
||||
# GPU Memory Split optimieren
|
||||
if command -v raspi-config >/dev/null 2>&1; then
|
||||
log "INFO" "Konfiguriere GPU Memory Split..."
|
||||
raspi-config nonint do_memory_split 128
|
||||
fi
|
||||
|
||||
# Overclock aktivieren (vorsichtig)
|
||||
if [[ -f /boot/config.txt ]]; then
|
||||
log "INFO" "Aktiviere moderate Overclock-Einstellungen..."
|
||||
|
||||
# Backup der config.txt
|
||||
cp /boot/config.txt /boot/config.txt.backup.$(date +%Y%m%d)
|
||||
|
||||
# Füge Overclock-Einstellungen hinzu
|
||||
cat >> /boot/config.txt << 'EOF'
|
||||
|
||||
# MYP System Optimierungen
|
||||
# Moderate Overclock für bessere Performance
|
||||
arm_freq=1200
|
||||
gpu_freq=400
|
||||
sdram_freq=500
|
||||
over_voltage=2
|
||||
|
||||
# USB Power
|
||||
max_usb_current=1
|
||||
|
||||
# Audio deaktivieren (nicht benötigt)
|
||||
dtparam=audio=off
|
||||
EOF
|
||||
fi
|
||||
|
||||
# Swap optimieren
|
||||
if [[ -f /etc/dphys-swapfile ]]; then
|
||||
log "INFO" "Optimiere Swap-Konfiguration..."
|
||||
sed -i 's/CONF_SWAPSIZE=100/CONF_SWAPSIZE=1024/' /etc/dphys-swapfile
|
||||
systemctl restart dphys-swapfile
|
||||
fi
|
||||
|
||||
log "INFO" "Raspberry Pi Optimierungen abgeschlossen"
|
||||
}
|
Reference in New Issue
Block a user