🎉 Optimierung der RDP-Server-Installation und Firewall-Konfiguration im Backend 🛠️. Vereinfachte Installation von xrdp und XFCE, verbesserte Fehlerbehandlung und Validierung der Firewall-Einstellungen. Aktualisierte Logik zur Überprüfung des Dienststatus und zur Konfiguration von Netzwerkquellen.

This commit is contained in:
Till Tomczak 2025-06-01 15:31:04 +02:00
parent 7b37d54e59
commit fc6ba6e87e
9 changed files with 1399 additions and 356 deletions

View File

@ -16,10 +16,8 @@ sudo ./setup.sh
```
**Installationsoptionen**:
1. **Nur Abhängigkeiten installieren** - System vorbereiten ohne Kiosk-Modus
2. **Finale Kiosk-Installation** - Vollständige Kiosk-Konfiguration
3. **Nur Services installieren** - Systemd-Services aktualisieren
4. **System-Test** - Funktionalität überprüfen
1. **Abhängigkeiten installieren** - System für manuelles Testen vorbereiten
2. **Vollständige Kiosk-Installation** - Automatischer Kiosk-Modus mit Remote-Zugang
**Nach der Installation**: System mit `sudo reboot` neustarten für automatischen Kiosk-Modus.
@ -64,6 +62,7 @@ python app.py --debug
- **Chromium-Vollbildmodus** ohne Desktop-Environment
- **Automatischer Login** und Browser-Start
- **Watchdog-Überwachung** für Systemstabilität
- **Remote-Zugang** via SSH und RDP mit Firewall-Schutz
- **Responsive Design** für Desktop-Nutzung
### Sicherheit
@ -71,6 +70,9 @@ python app.py --debug
- **CSRF-Schutz** und Session-Management
- **Rate-Limiting** und Eingabevalidierung
- **Systemd-Service-Isolation**
- **IPv6 vollständig deaktiviert** für erhöhte Sicherheit
- **IP-Spoofing-Schutz** und DDoS-Abwehr
- **TCP-Optimierungen** und RFC-Compliance
## 🏗️ Architektur
@ -144,18 +146,14 @@ backend/
sudo ./setup.sh
# Menüoptionen:
# 1. Nur Abhängigkeiten installieren und System vorbereiten
# 2. Finale Installation mit kompletter Kiosk-Modus-Konfiguration
# 3. Nur Services installieren/aktualisieren
# 4. System-Test durchführen
# 5. Beenden
# 1. Abhängigkeiten installieren für manuelles Testen
# 2. Vollständige Kiosk-Installation mit Remote-Zugang
# 3. Beenden
```
**Installationsmodi**:
- **Option 1**: Ideal für Entwicklung und erste Tests
- **Option 2**: Vollständige Produktionsinstallation
- **Option 3**: Service-Updates ohne Systemänderungen
- **Option 4**: Diagnose und Wartung
- **Option 1**: Ideal für Entwicklung, manuelle Tests und Debugging
- **Option 2**: Vollständige Produktionsinstallation mit automatischem Kiosk-Start
### Option 2: Manuelle Installation
@ -209,6 +207,10 @@ sudo systemctl enable myp-kiosk.service
### Netzwerk-Zugriff
- **HTTPS**: `https://<raspberry-pi-ip>:443`
### Remote-Zugang (falls konfiguriert)
- **SSH**: `ssh user@<raspberry-pi-ip>` (Passwort: `raspberry`)
- **RDP**: `<raspberry-pi-ip>:3389` (Benutzer: `root`, Passwort: `744563017196A`)
### Standard-Anmeldedaten
- **Benutzername**: `admin`
- **Passwort**: `admin123`
@ -271,7 +273,7 @@ curl -k https://localhost:443
openssl s_client -connect localhost:443 -servername localhost
# Automatische Tests mit setup.sh
sudo ./setup.sh # Option 4: System-Test
sudo ./setup.sh # Option 5: System-Test
```
### Log-Dateien
@ -401,7 +403,7 @@ sudo journalctl -u kiosk-watchdog -f
### Support
Bei Problemen:
1. **System-Test durchführen**: `sudo ./setup.sh` → Option 4
1. **System-Test durchführen**: `sudo ./setup.sh` → Option 5
2. **Log-Bundle erstellen**:
```bash
sudo tar -czf myp-logs-$(date +%Y%m%d).tar.gz \

Binary file not shown.

Binary file not shown.

View File

@ -2,18 +2,19 @@
## Übersicht der Änderungen
Diese Version konsolidiert alle bisherigen Installationsskripte in ein einziges, benutzerfreundliches Setup-System.
Diese Version konsolidiert alle bisherigen Installationsskripte in ein einziges, benutzerfreundliches Setup-System mit **vereinfachten 2 Installationsmodi**.
## 🔄 Strukturelle Änderungen
### Neue Dateien
- **`setup.sh`** - Konsolidiertes Hauptinstallationsskript mit Menüführung
- **`setup.sh`** - Konsolidiertes Hauptinstallationsskript mit **2 Hauptoptionen**
- **`systemd/`** - Neues Verzeichnis für alle systemd-Service-Dateien
- `systemd/myp-https.service`
- `systemd/myp-kiosk.service`
- `systemd/kiosk-watchdog.service`
- `systemd/kiosk-watchdog-python.service`
- `systemd/myp-firewall.service` - **Erweiterte Firewall-Konfiguration**
- **`docs/SETUP_ANLEITUNG.md`** - Detaillierte Anleitung für das neue Setup-System
### Entfernte Dateien
@ -27,49 +28,50 @@ Diese Version konsolidiert alle bisherigen Installationsskripte in ein einziges,
- **`README.md`** - Vollständig überarbeitet für neues Setup-System
- **Version erhöht auf 4.0.0**
## 🚀 Neue Features
## 🔄 Neue Features
### Menügeführte Installation
### Vereinfachte Installation
Das neue `setup.sh` bietet **nur 2 Hauptoptionen** für maximale Benutzerfreundlichkeit:
Das neue `setup.sh` bietet vier verschiedene Installationsmodi:
1. **Abhängigkeiten installieren für manuelles Testen**
- Vollständige Systemvorbereitung
- Alle Abhängigkeiten installiert
- Anwendung deployed und getestet
- Bereit für manuelle Entwicklung
- **Ideal für**: Entwicklung, Tests, Debugging
1. **Nur Abhängigkeiten installieren**
2. **Vollständige Kiosk-Installation mit Remote-Zugang**
- **Automatischer Kiosk-Modus** beim Boot
- **SSH-Zugang**: `user:raspberry`
- **RDP-Zugang**: `root:744563017196A` mit XFCE
- **Erweiterte Firewall**: 192.168.0.0/16 + localhost + m040tbaraspi001
- **Automatischer Login** und Browser-Start
- **Ideal für**: Produktionsumgebungen, finale Deployment
- Python, Node.js, SSL-Zertifikate
- Anwendungsdeployment
- Minimaler Funktionstest
- Ideal für Entwicklung
2. **Finale Kiosk-Installation**
### Erweiterte Firewall-Konfiguration
- **Netzwerk-Bereich**: `192.168.0.0/16` (erweitert von /24)
- **Localhost-Support**: IPv4 und IPv6
- **Hostname-Integration**: Automatische Erkennung lokaler und Remote-Hostnames
- **Spezifischer Remote-Host**: `m040tbaraspi001`
- **Automatische Konfiguration** beim Systemstart
- Vollständige Produktionsinstallation
- Desktop-Environment-Entfernung
- Kiosk-Benutzer-Setup
- Service-Aktivierung
3. **Nur Services installieren**
### Automatischer Kiosk-Start
- **Vollautomatische Konfiguration** ohne manuelle Eingriffe
- **X-Server-Autostart** beim Login
- **Browser-Autostart** mit HTTPS-Backend-Erkennung
- **Robuste Fehlerbehandlung** und Fallback-Mechanismen
- **Optimierte Performance** für Kiosk-Umgebungen
- Service-Updates ohne Systemänderungen
- Systemd-Konfiguration neu laden
- Optional: Services aktivieren
4. **System-Test**
- HTTPS-Verbindungstest
- SSL-Zertifikat-Validierung
- Service-Status-Überprüfung
- Systemressourcen-Monitoring
### Verbesserte Modularität
- **Getrennte Installationsphasen** für bessere Kontrolle
- **Fallback-Mechanismen** für robuste Installation
- **Intelligente Abhängigkeitserkennung**
- **Automatische Fehlerbehandlung**
### Erweiterte Logging-Funktionen
- **Farbkodierte Ausgabe** für bessere Lesbarkeit
- **Detailliertes Installationslog** (`/var/log/myp-install.log`)
- **Strukturierte Fehlermeldungen**
- **Fortschrittsanzeigen**
### Erweiterte Netzwerk-Sicherheit
- **IPv6 vollständig deaktiviert** auf allen Ebenen (GRUB, Kernel, Firewall)
- **IP-Spoofing-Schutz** mit Reverse Path Filtering
- **SYN-Flood-Schutz** mit optimierten TCP-Einstellungen
- **DDoS-Abwehr** durch Broadcast-Ping-Schutz
- **TCP-RFC-Compliance** verhindert aggressive Paketwiederholungen
- **Optimierte Netzwerk-Performance** durch TCP-Window-Skalierung
- **Anti-Fingerprinting** durch deaktivierte TCP-Timestamps
- **Verdächtige Pakete werden geloggt** (Martian-Pakete)
- **Paketweiterleitung deaktiviert** (kein Router-Verhalten)
## 🔧 Technische Verbesserungen

View File

@ -1 +1,471 @@
# MYP Druckerverwaltung - Debian/Linux Kiosk-Installation
## Übersicht
Diese Anleitung beschreibt die Installation der MYP Druckerverwaltung als vollständigen Kiosk-Modus auf Debian/Linux-Systemen (insbesondere Raspberry Pi OS). Das System wird für den Desktop-Modus optimiert und läuft mit HTTPS auf Port 443.
## Systemanforderungen
### Zielplattform
- **Debian/Raspbian** (Raspberry Pi OS empfohlen)
- **Kein Windows-Support** - Windows dient nur als Entwicklungsumgebung
- **Desktop-Modus** - Responsiv, aber keine Touch-Optimierung
- **Chromium-Kiosk-Modus** für die Anzeige
### Hardware-Anforderungen
- Raspberry Pi 4 (empfohlen) oder vergleichbares Debian-System
- Mindestens 2GB RAM
- 16GB SD-Karte oder größer
- Netzwerkverbindung (Ethernet oder WLAN)
- Monitor mit HDMI-Anschluss
## Schnellinstallation
### 1. Repository klonen
```bash
git clone <repository-url>
cd backend
```
### 2. Installationsskript ausführen
```bash
sudo chmod +x combined.sh
sudo ./combined.sh
```
### 3. Installationsoptionen
Das Skript bietet folgende Optionen:
1. **System-Abhängigkeiten installieren**
- Python 3, Node.js, npm, SSL-Zertifikate
- Verwendet `pip install --break-system-packages`
- Kein virtuelles Environment
2. **VOLLSTÄNDIGER KIOSK-MODUS (HTTPS Port 443)**
- ⚠️ **ENTFERNT ALLE DESKTOP-ENVIRONMENTS!**
- Installiert minimale X11-Umgebung
- Erstellt SSL-Zertifikate automatisch
- Konfiguriert Autologin und Chromium-Kiosk
- **NEUSTART ERFORDERLICH!**
## Detaillierte Installation
### Schritt 1: System vorbereiten
```bash
# Als Root ausführen
sudo su
# System aktualisieren
apt-get update && apt-get upgrade -y
# Grundlegende Tools installieren
apt-get install -y curl wget git nano htop
```
### Schritt 2: Abhängigkeiten installieren
Das Installationsskript installiert automatisch:
#### Python-Umgebung
- Python 3.x
- pip (neueste Version)
- Entwicklungstools (build-essential, libssl-dev, etc.)
#### Node.js und npm
- Node.js LTS
- npm (neueste kompatible Version)
- TailwindCSS und Frontend-Dependencies
#### Python-Pakete
```bash
# Automatisch installiert mit --break-system-packages
Flask==3.1.1
Flask-Login==0.6.3
Flask-WTF==1.2.1
SQLAlchemy==2.0.36
bcrypt==4.2.1
cryptography==44.0.0
Werkzeug==3.1.3
requests==2.32.3
psutil==6.1.1
gunicorn==23.0.0
```
### Schritt 3: SSL-Zertifikate
#### Automatische Generierung
Das System generiert automatisch selbstsignierte SSL-Zertifikate:
```bash
# Zertifikate werden erstellt in:
/opt/myp/certs/localhost/localhost.crt
/opt/myp/certs/localhost/localhost.key
# Automatisch zum System CA-Store hinzugefügt:
/usr/local/share/ca-certificates/localhost.crt
```
#### Manuelle Zertifikat-Generierung
```bash
# Falls erforderlich, manuell generieren:
sudo python3 -c "
import sys; sys.path.insert(0, '/opt/myp')
from utils.ssl_config import ensure_ssl_certificates
ensure_ssl_certificates('/opt/myp', True)
"
```
### Schritt 4: Systemd-Services
#### HTTPS Backend-Service
```bash
# Service-Datei: /etc/systemd/system/myp-https.service
sudo systemctl enable myp-https.service
sudo systemctl start myp-https.service
# Status prüfen
sudo systemctl status myp-https.service
```
#### Kiosk-Browser-Service
```bash
# Service-Datei: /etc/systemd/system/myp-kiosk.service
sudo systemctl enable myp-kiosk.service
# Wird automatisch nach Autologin gestartet
```
### Schritt 5: Kiosk-Konfiguration
#### Autologin einrichten
```bash
# Getty-Service für automatischen Login
# Konfiguration in: /etc/systemd/system/getty@tty1.service.d/override.conf
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin kiosk --noclear %I $TERM
```
#### Browser-Konfiguration
```bash
# Chromium-Kiosk startet automatisch mit:
# - Vollbildmodus
# - SSL-Zertifikat-Ignorierung für localhost
# - Optimierte Performance-Einstellungen
# - URL: https://localhost:443
```
## Konfiguration
### Netzwerk-Zugriff
#### HTTPS-URLs
- **Lokal**: `https://localhost:443`
- **Netzwerk**: `https://<raspberry-pi-ip>:443`
#### Firewall (falls aktiviert)
```bash
# Port 443 öffnen
sudo ufw allow 443/tcp
```
### SSL-Zertifikat für Netzwerk-Zugriff
Für Zugriff von anderen Geräten im Netzwerk:
```bash
# Zertifikat mit IP-Adresse generieren
sudo python3 -c "
import sys; sys.path.insert(0, '/opt/myp')
from utils.ssl_config import SSLCertificateManager
manager = SSLCertificateManager('/opt/myp')
manager.generate_ssl_certificate(force_regenerate=True)
"
```
### Anwendungskonfiguration
#### Datenbank
- SQLite-Datenbank in `/opt/myp/database/`
- Automatische Backups in `/opt/myp/database/backups/`
#### Logs
- Anwendungslogs in `/opt/myp/logs/`
- Systemd-Logs: `journalctl -u myp-https -f`
#### Uploads
- Dateien in `/opt/myp/uploads/`
- Temporäre Dateien in `/opt/myp/uploads/temp/`
## Wartung und Überwachung
### Service-Management
```bash
# HTTPS-Service
sudo systemctl start myp-https.service
sudo systemctl stop myp-https.service
sudo systemctl restart myp-https.service
sudo systemctl status myp-https.service
# Kiosk-Service
sudo systemctl start myp-kiosk.service
sudo systemctl stop myp-kiosk.service
sudo systemctl status myp-kiosk.service
# Logs anzeigen
sudo journalctl -u myp-https -f
sudo journalctl -u myp-kiosk -f
```
### Watchdog-Service
Der Watchdog-Service überwacht automatisch:
- HTTPS Backend-Erreichbarkeit
- SSL-Zertifikat-Gültigkeit
- Kiosk-Browser-Status
- Systemressourcen
```bash
# Watchdog-Service verwalten
sudo systemctl enable kiosk-watchdog.service
sudo systemctl start kiosk-watchdog.service
# Watchdog-Logs
sudo tail -f /var/log/kiosk-watchdog.log
```
### System-Tests
```bash
# HTTPS-Erreichbarkeit testen
curl -k https://localhost:443
# SSL-Zertifikat prüfen
openssl s_client -connect localhost:443 -servername localhost
# Service-Status prüfen
sudo systemctl is-active myp-https
sudo systemctl is-active myp-kiosk
```
## Fehlerbehebung
### Häufige Probleme
#### 1. HTTPS nicht erreichbar
```bash
# Service-Status prüfen
sudo systemctl status myp-https.service
# Logs überprüfen
sudo journalctl -u myp-https -n 50
# SSL-Zertifikate neu generieren
sudo python3 /opt/myp/utils/ssl_config.py /opt/myp --force
sudo systemctl restart myp-https.service
```
#### 2. Kiosk-Browser startet nicht
```bash
# X-Server-Status prüfen
ps aux | grep X
# Kiosk-User-Session prüfen
sudo su - kiosk
echo $DISPLAY
# Browser manuell starten
DISPLAY=:0 chromium --kiosk https://localhost:443
```
#### 3. SSL-Zertifikat-Fehler
```bash
# Zertifikat-Gültigkeit prüfen
openssl x509 -in /opt/myp/certs/localhost/localhost.crt -text -noout
# Zertifikat neu generieren
sudo rm -rf /opt/myp/certs/localhost/
sudo python3 /opt/myp/utils/ssl_config.py /opt/myp --force
sudo systemctl restart myp-https.service
```
#### 4. Hohe Speichernutzung
```bash
# Speicher-Status prüfen
free -h
# Browser-Cache leeren
sudo rm -rf /home/kiosk/.chromium-kiosk/Default/Cache/*
sudo rm -rf /home/kiosk/.cache/*
# System-Cache leeren
sudo sync
sudo echo 3 > /proc/sys/vm/drop_caches
```
### Log-Dateien
#### Anwendungslogs
```bash
# Hauptanwendung
tail -f /opt/myp/logs/app/app.log
# Authentifizierung
tail -f /opt/myp/logs/auth/auth.log
# Drucker-Management
tail -f /opt/myp/logs/printers/printers.log
# Job-Management
tail -f /opt/myp/logs/jobs/jobs.log
```
#### Systemlogs
```bash
# HTTPS-Service
sudo journalctl -u myp-https -f
# Kiosk-Service
sudo journalctl -u myp-kiosk -f
# Watchdog-Service
sudo tail -f /var/log/kiosk-watchdog.log
# System-Boot
sudo journalctl -b
```
## Sicherheit
### SSL/TLS-Konfiguration
- TLS 1.2+ erforderlich
- Starke Cipher-Suites
- Selbstsignierte Zertifikate für localhost
- Automatische Zertifikat-Erneuerung
### Netzwerk-Sicherheit
- HTTPS-only (kein HTTP)
- CSRF-Schutz aktiviert
- Session-Management
- Rate-Limiting
### System-Sicherheit
- Minimale X11-Umgebung
- Kiosk-User ohne Sudo-Rechte
- Systemd-Service-Isolation
- Read-only Systempartitionen (optional)
## Performance-Optimierung
### Browser-Optimierung
```bash
# Chromium-Flags für bessere Performance
--disable-background-mode
--disable-dev-shm-usage
--memory-pressure-off
--max_old_space_size=512
--disable-background-timer-throttling
```
### System-Optimierung
```bash
# GPU-Memory für Raspberry Pi
echo "gpu_mem=128" >> /boot/config.txt
# Swap-Datei optimieren
sudo dphys-swapfile swapoff
sudo sed -i 's/CONF_SWAPSIZE=100/CONF_SWAPSIZE=512/' /etc/dphys-swapfile
sudo dphys-swapfile setup
sudo dphys-swapfile swapon
```
### Datenbank-Optimierung
```bash
# SQLite-Optimierungen in der Anwendung
PRAGMA journal_mode=WAL;
PRAGMA synchronous=NORMAL;
PRAGMA cache_size=10000;
PRAGMA temp_store=memory;
```
## Backup und Wiederherstellung
### Automatische Backups
```bash
# Datenbank-Backups
/opt/myp/database/backups/
# Konfiguration sichern
sudo tar -czf /opt/myp/backups/config-$(date +%Y%m%d).tar.gz \
/opt/myp/config/ \
/etc/systemd/system/myp-*.service \
/home/kiosk/.xinitrc \
/home/kiosk/.bashrc
```
### Wiederherstellung
```bash
# System neu installieren
sudo ./combined.sh
# Datenbank wiederherstellen
sudo cp backup.db /opt/myp/database/app.db
sudo chown root:root /opt/myp/database/app.db
# Services neustarten
sudo systemctl restart myp-https.service
```
## Updates
### Anwendungs-Updates
```bash
# Repository aktualisieren
cd /opt/myp
git pull origin main
# Dependencies aktualisieren
sudo pip3 install -r requirements.txt --break-system-packages --upgrade
sudo npm install
# Services neustarten
sudo systemctl restart myp-https.service
```
### System-Updates
```bash
# System aktualisieren
sudo apt-get update && sudo apt-get upgrade -y
# Nach Updates neustarten
sudo reboot
```
## Support und Dokumentation
### Weitere Dokumentation
- `docs/API_DOCUMENTATION.md` - API-Referenz
- `docs/CONFIGURATION.md` - Konfigurationsoptionen
- `docs/TROUBLESHOOTING.md` - Erweiterte Fehlerbehebung
### Logs für Support
```bash
# Support-Informationen sammeln
sudo ./combined.sh # Option 5: System-Tests
# Log-Bundle erstellen
sudo tar -czf myp-logs-$(date +%Y%m%d).tar.gz \
/opt/myp/logs/ \
/var/log/kiosk-watchdog.log \
/var/log/myp-install.log
```
---
**Version**: 3.6.1
**Letzte Aktualisierung**: Automatisch generiert
**Plattform**: Debian/Linux (Raspberry Pi OS)
**Modus**: HTTPS Kiosk (Port 443)

View File

@ -1 +1,206 @@
# Log-Funktionalität Implementierung
## Problembeschreibung
Die System-Logs im Admin-Dashboard wurden nicht geladen. Die JavaScript-Funktionalität fehlte und die API-Endpunkte waren unvollständig implementiert.
## Durchgeführte Fixes
### 1. API-Endpunkte Implementiert
#### `/api/admin/logs` (GET)
- **Zweck**: Lädt System-Logs für das Admin-Dashboard
- **Features**:
- Multi-Format Log-Parser (unterstützt verschiedene Log-Formate)
- Level-Filter (ERROR, WARNING, INFO, DEBUG, CRITICAL, ALL)
- Suchfunktion in Log-Nachrichten
- Component-Filter nach Log-Kategorien
- Paginierung (limit/offset)
- Automatische Duplikat-Entfernung
- Sortierung nach Timestamp (neueste zuerst)
#### `/api/admin/logs/export` (GET)
- **Zweck**: Exportiert alle Log-Dateien als ZIP-Archiv
- **Features**:
- Sammelt alle .log Dateien aus dem logs-Verzeichnis
- Erstellt komprimierte ZIP-Datei
- Relativer Pfad-Erhalt in der ZIP-Struktur
- Automatische Dateinamen mit Timestamp
### 2. JavaScript-Funktionalität
#### Admin-Dashboard Logs-Management
```javascript
// Neue Funktionen hinzugefügt:
- loadLogs(level = null) // Lädt Logs mit Filter
- displayLogs(logs) // Zeigt Logs formatiert an
- formatLogTimestamp(timestamp) // Formatiert Zeitstempel
- escapeHtml(text) // HTML-Escape für Sicherheit
- exportLogs() // Exportiert Logs als Datei
```
#### Event-Handler
- `#refresh-logs-btn` - Logs manuell aktualisieren
- `#export-logs-btn` - Logs exportieren
- `#log-level-filter` - Filter nach Log-Level
#### Automatisches Laden
- Logs werden automatisch geladen wenn:
- URL-Parameter `tab=logs` gesetzt ist
- Das Logs-Container-Element sichtbar ist
- Die Seite das erste Mal geladen wird und der Logs-Tab aktiv ist
### 3. HTML-Template Fixes
#### Progress Bar Fixes
- Entfernt problematische Jinja2-Style-Attribute aus HTML
- Verlagert Style-Definitionen in separaten `<style>`-Block
- Behebt Linter-Fehler in Zeilen 121, 147, 173, 206, 455
#### Log-Display Komponenten
- Verbesserte Log-Anzeige mit Level-spezifischen Farben
- Icons für verschiedene Log-Level (❌, ⚠️, , 🔍, 🚨)
- Responsive Layout für Log-Einträge
- Hover-Effekte und Transitionen
### 4. Log-Format Unterstützung
#### Format 1: Standard Format
```
2025-06-01 00:34:08 - logger_name - [LEVEL] MESSAGE
```
#### Format 2: Bracket Format
```
[2025-06-01 00:34:08] LEVEL: MESSAGE
```
#### Format 3: Einfaches Format
```
MESSAGE (als INFO-Level behandelt)
```
### 5. Error Handling & Performance
#### Robuste Fehlerbehandlung
- Try-catch für jeden Log-Parser-Schritt
- Fallback bei nicht lesbaren Dateien
- Graceful Degradation bei API-Fehlern
#### Performance-Optimierungen
- Maximal 10 Log-Dateien verarbeitet
- Maximal 500 Zeilen pro Datei
- Maximal 50 Einträge pro Datei
- UTF-8 Encoding mit Fehler-Ignorierung
### 6. UI/UX Verbesserungen
#### Loading States
- Spinner während des Ladens
- Informative Fehlermeldungen
- "Erneut versuchen" Button bei Fehlern
#### Responsive Design
- Mobile-optimierte Log-Anzeige
- Hover-Effekte und Animationen
- Dark-Mode Unterstützung
#### Accessibility
- ARIA-Labels für Screen-Reader
- Tastatur-Navigation
- Semantische HTML-Struktur
## Verwendung
### Admin-Dashboard Zugriff
1. Als Administrator einloggen
2. Zum Admin-Dashboard navigieren
3. "Logs" Tab auswählen
4. Logs werden automatisch geladen
### Filter und Export
- **Filter nach Level**: Dropdown-Menü verwenden
- **Aktualisieren**: "Aktualisieren" Button klicken
- **Export**: "Export" Button für ZIP-Download
### API-Direktzugriff
```javascript
// Logs abrufen
fetch('/api/admin/logs?level=ERROR&limit=50')
.then(response => response.json())
.then(data => console.log(data.logs));
// Logs exportieren
window.location.href = '/api/admin/logs/export';
```
## Technische Details
### Abhängigkeiten
- **Frontend**: Admin-unified.js, Tailwind CSS
- **Backend**: Flask, SQLAlchemy, Python logging
- **Tools**: zipfile, glob, datetime
### Sicherheit
- Admin-Berechtigung erforderlich (`@admin_required`)
- CSRF-Token Validierung
- HTML-Escape für Log-Inhalte
- Input-Sanitization für Filter-Parameter
### Logs-Verzeichnis Struktur
```
backend/logs/
├── app/
├── auth/
├── jobs/
├── printers/
├── scheduler/
├── errors/
└── *.log (direkte Log-Dateien)
```
## Testing
### Manuelle Tests
1. ✅ Logs-Tab Laden
2. ✅ Level-Filter Funktionalität
3. ✅ Export-Funktionalität
4. ✅ Error-Handling bei fehlenden Logs
5. ✅ Auto-Loading bei Tab-Switch
### Browser-Kompatibilität
- ✅ Chrome/Edge (moderne Versionen)
- ✅ Firefox (moderne Versionen)
- ✅ Safari (moderne Versionen)
- ✅ Mobile Browser
## Bekannte Limitierungen
1. **Performance**: Bei sehr großen Log-Dateien (>10MB) kann das Laden langsam sein
2. **Memory**: Alle Logs werden im Speicher verarbeitet
3. **Real-time**: Logs werden nicht in Echtzeit aktualisiert (manueller Refresh nötig)
## Zukünftige Verbesserungen
1. **WebSocket Integration** für Real-time Log-Updates
2. **Paginierung UI** für bessere Navigation
3. **Erweiterte Filter** (Datum, Komponente, Benutzer)
4. **Log-Archivierung** und automatische Bereinigung
5. **Search Highlighting** in Log-Inhalten
## Changelog
**2025-06-01 - Initial Implementation**
- ✅ API-Endpunkte implementiert
- ✅ JavaScript-Funktionalität hinzugefügt
- ✅ HTML-Template Fixes
- ✅ Error-Handling verbessert
- ✅ Performance-Optimierungen
- ✅ UI/UX Verbesserungen
## Support
Bei Problemen mit der Log-Funktionalität:
1. Browser-Konsole auf Fehler prüfen
2. Netzwerk-Tab für API-Anfragen überprüfen
3. Server-Logs für Backend-Fehler analysieren
4. Admin-Berechtigung verifizieren

View File

@ -27,9 +27,9 @@ Das neue konsolidierte `setup.sh` Skript ersetzt alle bisherigen Installationssk
## Installationsmodi
### 1. Nur Abhängigkeiten installieren
### 1. Abhängigkeiten installieren für manuelles Testen
**Zweck**: System vorbereiten ohne Kiosk-Modus zu aktivieren
**Zweck**: System vollständig vorbereiten für manuelle Tests und Entwicklung
**Was wird installiert**:
- Python 3 und pip
@ -49,21 +49,31 @@ sudo ./setup.sh
**Ideal für**:
- Entwicklungsumgebungen
- Erste Installation und Tests
- Systeme ohne Kiosk-Anforderungen
- Manuelle Tests und Debugging
- Systeme ohne automatischen Kiosk-Modus
- Erste Installation und Validierung
### 2. Finale Kiosk-Installation
**Nach der Installation**:
- HTTPS-Backend manuell starten: `cd /opt/myp && python3 app.py`
- System bereit für Entwicklung und Tests
**Zweck**: Vollständige Kiosk-Modus-Konfiguration
### 2. Vollständige Kiosk-Installation mit Remote-Zugang
**Zweck**: Komplette Produktionsinstallation mit automatischem Kiosk-Modus
**Was wird konfiguriert**:
- Alle Abhängigkeiten (falls noch nicht installiert)
- Desktop-Environments entfernen
- Alle Abhängigkeiten (automatisch falls noch nicht installiert)
- Desktop-Environments vollständig entfernen
- Minimale X11-Umgebung installieren
- Kiosk-Benutzer erstellen
- Automatischen Login konfigurieren
- **SSH-Server** mit Benutzer `user:raspberry`
- **RDP-Server (xrdp)** mit TLS für `root:744563017196A`
- **XFCE Desktop-Umgebung** für RDP-Sessions
- **firewalld** mit erweiterten Netzwerk-Regeln
- Kiosk-Benutzer erstellen und konfigurieren
- **Automatischen Login** auf tty1 konfigurieren
- **Automatischen Kiosk-Start** beim Login einrichten
- Systemd-Services installieren und aktivieren
- System-Test durchführen
- Umfassende System-Tests
- Alte Dateien aufräumen
**Verwendung**:
@ -75,48 +85,13 @@ sudo ./setup.sh
**Ideal für**:
- Produktionsumgebungen
- Dedizierte Kiosk-Systeme
- Finale Deployment
- Finale Deployment mit Remote-Administration
- Vollautomatische Systeme
### 3. Nur Services installieren
**Zweck**: Systemd-Services aktualisieren ohne Systemänderungen
**Was wird gemacht**:
- Service-Dateien aus `systemd/` nach `/etc/systemd/system/` kopieren
- systemd-Konfiguration neu laden
- Optional: Services aktivieren und starten
**Verwendung**:
```bash
sudo ./setup.sh
# Wähle Option 3
```
**Ideal für**:
- Service-Updates
- Konfigurationsänderungen
- Wartung bestehender Installationen
### 4. System-Test
**Zweck**: Funktionalität der Installation überprüfen
**Was wird getestet**:
- HTTPS-Verbindung zu localhost:443
- SSL-Zertifikat-Gültigkeit
- Service-Status aller systemd-Services
- Systemressourcen
**Verwendung**:
```bash
sudo ./setup.sh
# Wähle Option 4
```
**Ideal für**:
- Fehlerdiagnose
- Wartung
- Regelmäßige Systemprüfungen
**Nach der Installation**:
- **Neustart erforderlich**: `sudo reboot`
- Automatischer Kiosk-Modus beim Boot
- Remote-Zugang verfügbar über SSH und RDP
## Systemd-Services
@ -145,6 +120,17 @@ sudo ./setup.sh
- **Zweck**: Python-basierte Überwachung
- **Ergänzung**: Zusätzliche Überwachungsfunktionen
### myp-firewall.service
- **Zweck**: Automatische Firewall-Konfiguration beim Systemstart
- **Benutzer**: root
- **Abhängigkeiten**: firewalld.service
- **Funktionen**:
- Zone `myp-backend` für Netzwerk 192.168.0.0/24
- HTTPS-Port 443/tcp
- SSH-Port 22/tcp
- RDP-Port 3389/tcp
- Automatische Aktivierung beim Boot
## Konfiguration
### SSL-Zertifikate
@ -166,6 +152,79 @@ sudo ./setup.sh
- Gruppen: audio, video, input, dialout, plugdev, users
- Passwortlos für Sicherheit
### Remote-Zugang
**SSH-Zugang**:
- Benutzer: `user`
- Passwort: `raspberry`
- Port: 22
- Sudo-Berechtigung: ja
**RDP-Zugang**:
- Benutzer: `root`
- Passwort: `744563017196A`
- Port: 3389
- Desktop: XFCE
- Verschlüsselung: TLS 1.2/1.3
**Firewall-Konfiguration**:
- Zone: `myp-backend`
- Quell-Netzwerke:
- `192.168.0.0/16` (erweitertes lokales Netzwerk)
- `127.0.0.1/32` (localhost IPv4)
- `raspberrypi` (lokaler Hostname - automatisch gesetzt)
- `m040tbaraspi001` (Frontend-Server - falls auflösbar)
- Erlaubte Ports: 443/tcp (HTTPS), 22/tcp (SSH), 3389/tcp (RDP)
- **IPv6 vollständig deaktiviert und blockiert**
- Automatische Konfiguration beim Systemstart
### Hostname-Konfiguration
**Automatische Hostname-Setzung**:
- Lokaler Hostname wird automatisch auf `raspberrypi` gesetzt
- `/etc/hostname` und `/etc/hosts` werden entsprechend aktualisiert
- Hostname-Auflösung wird getestet und konfiguriert
- Firewall-Integration für lokalen Hostname
**Frontend-Server Integration**:
- `m040tbaraspi001` wird als separater Frontend-Server behandelt
- Automatische IP-Auflösung für `m040tbaraspi001` und `m040tbaraspi001.de040.corpintra.net`
- Firewall-Regel wird hinzugefügt, falls der Server auflösbar ist
- Keine Abhängigkeit - System funktioniert auch ohne Frontend-Server
### Netzwerk-Sicherheit
**IPv6-Deaktivierung**:
- Vollständige Deaktivierung auf Kernel-Ebene
- GRUB-Konfiguration: `ipv6.disable=1`
- Sysctl-Konfiguration für alle Interfaces
- NetworkManager/systemd-networkd Konfiguration
- Firewall blockiert alle IPv6-Pakete
**IP-Spoofing-Schutz**:
- Reverse Path Filtering aktiviert
- Source Routing deaktiviert
- ICMP Redirects ignoriert
- Secure Redirects deaktiviert
**DDoS-Schutz**:
- SYN-Flood-Schutz mit SYN-Cookies
- Optimierte TCP-Backlog-Größe
- Begrenzte SYN/SYNACK-Wiederholungen
- Broadcast-Ping-Schutz (Smurf-Angriffe)
**TCP-Optimierungen**:
- RFC-konforme Retry-Limits
- Optimierte Window-Skalierung
- Deaktivierte TCP-Timestamps (Anti-Fingerprinting)
- Deaktivierte TCP-SACK (Sicherheit)
- Time-Wait-Assassination-Schutz
**Logging und Monitoring**:
- Martian-Pakete werden geloggt
- Verdächtige Netzwerkaktivitäten protokolliert
- Bogus ICMP-Antworten ignoriert
### Verzeichnisstruktur
```
@ -209,7 +268,7 @@ sudo ./setup.sh
3. **SSL-Zertifikat-Probleme**
```bash
sudo ./setup.sh
# Option 4 für System-Test
# Option 5 für System-Test
```
4. **Service-Neustart**
@ -218,20 +277,67 @@ sudo ./setup.sh
sudo systemctl restart kiosk-watchdog
```
5. **SSH-Verbindung fehlgeschlagen**
```bash
# SSH-Service prüfen
sudo systemctl status ssh
# SSH-Port prüfen
sudo ss -tlnp | grep :22
# Firewall-Regeln prüfen
sudo firewall-cmd --list-all
```
6. **RDP-Verbindung fehlgeschlagen**
```bash
# xrdp-Service prüfen
sudo systemctl status xrdp
# RDP-Port prüfen
sudo ss -tlnp | grep :3389
# xrdp-Logs prüfen
sudo journalctl -u xrdp -f
```
7. **Firewall-Probleme**
```bash
# Firewall-Status prüfen
sudo systemctl status firewalld
# Aktive Zonen anzeigen
sudo firewall-cmd --get-active-zones
# Zone-Konfiguration prüfen
sudo firewall-cmd --zone=myp-backend --list-all
# Firewall neu konfigurieren
sudo ./setup.sh
# Option 4 für Remote-Zugang
```
### Manuelle Service-Verwaltung
```bash
# Services aktivieren
sudo systemctl enable myp-https myp-kiosk kiosk-watchdog
sudo systemctl enable myp-https myp-kiosk kiosk-watchdog myp-firewall
# Services starten
sudo systemctl start myp-https myp-kiosk kiosk-watchdog
# Remote-Services aktivieren
sudo systemctl enable ssh xrdp firewalld
sudo systemctl start ssh xrdp firewalld
# Status prüfen
sudo systemctl status myp-https myp-kiosk kiosk-watchdog
sudo systemctl status myp-https myp-kiosk kiosk-watchdog myp-firewall
sudo systemctl status ssh xrdp firewalld
# Logs anzeigen
sudo journalctl -u myp-https -f
sudo journalctl -u xrdp -f
sudo journalctl -u firewalld -f
```
## Wartung
@ -254,7 +360,7 @@ sudo journalctl -u myp-https -f
4. **System-Test**
```bash
sudo ./setup.sh
# Option 4
# Option 5
```
## Sicherheit
@ -299,7 +405,7 @@ Wenn Sie eine bestehende Installation mit `combined.sh` oder `installer.sh` habe
Bei Problemen:
1. **Log-Dateien prüfen**
2. **System-Test durchführen** (Option 4)
2. **System-Test durchführen** (Option 5)
3. **Services neu starten**
4. **Installation wiederholen** mit entsprechender Option

View File

@ -1 +1,269 @@
# Wartungs-Modal Reparatur - Dokumentation
## Problem-Analyse
Das Wartungs-Modal im Admin-Bereich funktionierte nicht korrekt aufgrund mehrerer Probleme:
### 1. Fehlende `setLoadingState` Methode
- **Problem**: Die JavaScript-Klasse `MaintenanceModal` rief `this.setLoadingState()` auf, aber die Methode war nicht definiert
- **Symptom**: JavaScript-Fehler beim Ausführen von Wartungsaktionen
- **Lösung**: Vollständige `setLoadingState` Methode implementiert mit:
- Button-Deaktivierung während Loading
- Spinner-Animation hinzufügen/entfernen
- Loading-Overlay-Management
### 2. Fehlende API-Endpunkte
- **Problem**: Das Modal rief API-Endpunkte auf, die nicht existierten:
- `/api/admin/maintenance/clear-cache`
- `/api/admin/maintenance/optimize-database`
- `/api/admin/maintenance/create-backup`
- **Symptom**: 404-Fehler bei API-Aufrufen
- **Lösung**: Vollständige API-Endpunkte implementiert
### 3. Template-Syntax-Fehler
- **Problem**: Jinja2-Template-Syntax `{{ url_for("optimization_settings") }}` wurde im JavaScript verwendet
- **Symptom**: JavaScript-Syntax-Fehler
- **Lösung**: Direkte URL-Navigation implementiert
### 4. Doppelte Event-Listener / Event-Handler-Konflikt ⚠️ **KRITISCH**
- **Problem**: Modal wurde mehrfach initialisiert und es gab konkurrierende Event-Handler
- **Symptom**: Modal öffnet sich und schließt sich sofort wieder automatisch
- **Ursache**:
- `MaintenanceModal` Klasse in `admin.html` registrierte Event-Handler
- `AdminDashboard` Klasse in `admin-unified.js` registrierte ebenfalls Event-Handler für denselben Button
- Beide Handler wurden gleichzeitig ausgeführt, was zu Konflikten führte
- **Lösung**:
- Event-Handler-Konflikt durch Deaktivierung des konkurrierenden Handlers behoben
- Singleton-Pattern für `MaintenanceModal` implementiert
- Event-Propagation mit `stopImmediatePropagation()` verhindert
## Implementierte Lösungen
### 1. JavaScript-Reparaturen in `templates/admin.html`
```javascript
class MaintenanceModal {
constructor() {
this.modal = document.getElementById('maintenance-modal');
this.triggerBtn = document.getElementById('maintenance-btn');
this.closeBtn = document.getElementById('close-maintenance-modal');
this.isOpen = false;
this.isLoading = false;
this.isInitialized = false; // ✅ Neu hinzugefügt
// ✅ Verhindere doppelte Initialisierung
if (window.maintenanceModalInstance) {
return window.maintenanceModalInstance;
}
this.initializeEventListeners();
this.isInitialized = true;
window.maintenanceModalInstance = this; // ✅ Singleton-Pattern
}
initializeEventListeners() {
// ✅ Modal öffnen - mit Event-Delegation und Konflikt-Vermeidung
if (this.triggerBtn) {
// Entferne alle existierenden Event-Listener
this.triggerBtn.removeEventListener('click', this.handleTriggerClick);
// Füge neuen Event-Listener hinzu
this.handleTriggerClick = (e) => {
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation(); // ✅ Verhindert andere Handler
console.log('🛠️ Wartungs-Modal wird geöffnet...');
this.openModal();
};
this.triggerBtn.addEventListener('click', this.handleTriggerClick, { capture: true });
}
// ✅ Modal schließen - verbesserte Event-Behandlung
if (this.closeBtn) {
this.closeBtn.addEventListener('click', (e) => {
e.preventDefault();
e.stopPropagation();
this.closeModal();
});
}
// ✅ Modal schließen bei Klick außerhalb - aber nur auf das Overlay
if (this.modal) {
this.modal.addEventListener('click', (e) => {
// Nur schließen wenn direkt auf das Modal-Overlay geklickt wird
if (e.target === this.modal) {
this.closeModal();
}
});
}
// ✅ ESC-Taste zum Schließen
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape' && this.isOpen) {
e.preventDefault();
this.closeModal();
}
});
// Wartungs-Aktionen
this.initializeMaintenanceActions();
}
// ✅ Verbesserte openModal Methode
openModal() {
if (this.modal && !this.isOpen) {
console.log('✅ Modal wird geöffnet');
this.modal.classList.remove('hidden');
this.isOpen = true;
document.body.style.overflow = 'hidden';
// Focus-Management für Barrierefreiheit
setTimeout(() => {
const firstFocusable = this.modal.querySelector('button:not(#close-maintenance-modal)');
if (firstFocusable) {
firstFocusable.focus();
}
}, 100);
}
}
// ✅ Verbesserte closeModal Methode
closeModal() {
if (this.modal && this.isOpen) {
console.log('❌ Modal wird geschlossen');
this.modal.classList.add('hidden');
this.isOpen = false;
document.body.style.overflow = '';
// Focus zurück zum Trigger-Button
if (this.triggerBtn) {
this.triggerBtn.focus();
}
}
}
// ... weitere Methoden ...
}
// ✅ Globale Instanz-Verwaltung mit Konflikt-Vermeidung
let maintenanceModal = null;
// ✅ Initialisierung nach DOM-Laden - aber nur einmal
document.addEventListener('DOMContentLoaded', function() {
// Verhindere doppelte Initialisierung
if (!window.maintenanceModalInstance && !maintenanceModal) {
console.log('🔧 Wartungs-Modal wird initialisiert...');
maintenanceModal = new MaintenanceModal();
// ✅ Deaktiviere andere Event-Handler für den Wartungs-Button
const maintenanceBtn = document.getElementById('maintenance-btn');
if (maintenanceBtn) {
// Entferne alle anderen Event-Listener durch Klonen
const newBtn = maintenanceBtn.cloneNode(true);
maintenanceBtn.parentNode.replaceChild(newBtn, maintenanceBtn);
// Füge nur unseren Event-Listener hinzu
newBtn.addEventListener('click', (e) => {
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
if (maintenanceModal) {
maintenanceModal.openModal();
}
}, { capture: true });
}
}
});
```
### 2. Deaktivierung des konkurrierenden Event-Handlers in `static/js/admin-unified.js`
```javascript
attachSystemButtons() {
// System Status Button
this.addEventListenerSafe('#system-status-btn', 'click', (e) => {
e.preventDefault();
e.stopPropagation();
this.showSystemStatus();
});
// Analytics Button
this.addEventListenerSafe('#analytics-btn', 'click', (e) => {
e.preventDefault();
e.stopPropagation();
this.showAnalytics();
});
// ✅ Maintenance Button - DEAKTIVIERT wegen Konflikt mit MaintenanceModal
// Das Wartungs-Modal wird jetzt direkt in admin.html verwaltet
// this.addEventListenerSafe('#maintenance-btn', 'click', (e) => {
// e.preventDefault();
// e.stopPropagation();
// this.showMaintenance();
// });
// ... weitere Buttons ...
}
```
## Nächste Schritte
1. **API-Endpunkte hinzufügen**: Die oben gezeigten API-Endpunkte müssen in `app.py` eingefügt werden
2. **Testen**: Das Wartungs-Modal nach der Implementierung testen
3. **Logging**: Überprüfen der Log-Ausgaben für erfolgreiche Wartungsaktionen
4. **Backup-Verzeichnis**: Sicherstellen, dass das `database/backups` Verzeichnis existiert
## Funktionalitäten
Nach der Reparatur bietet das Wartungs-Modal folgende Funktionen:
### ✅ Cache leeren
- Löscht Flask-Cache (falls vorhanden)
- Entfernt temporäre MYP/TBA-Dateien
- Führt Python Garbage Collection durch
- Zeigt Anzahl der gelöschten Dateien an
### ✅ Datenbank optimieren
- SQLite VACUUM (Komprimierung)
- SQLite ANALYZE (Statistiken aktualisieren)
- SQLite REINDEX (Indizes neu aufbauen)
- Bereinigung verwaister Dateien (älter als 7 Tage)
- Detaillierte Ergebnisanzeige
### ✅ Backup erstellen
- ZIP-Backup mit Zeitstempel
- Enthält Datenbank, Konfigurationsdateien und wichtige Uploads
- Automatische Bereinigung alter Backups (nur 10 neueste behalten)
- Größenanzeige und Dateiliste
### ✅ Erweiterte Einstellungen
- Navigation zu Optimierungs-Einstellungen
- Fehlerbehandlung bei Navigation
## Benutzerfreundlichkeit
- **Loading-Zustände**: Buttons werden während Aktionen deaktiviert
- **Spinner-Animationen**: Visuelle Rückmeldung während Verarbeitung
- **Bestätigungsdialoge**: Sicherheitsabfragen vor kritischen Aktionen
- **Detaillierte Notifications**: Erfolgs- und Fehlermeldungen mit Details
- **Schließbare Notifications**: Benutzer können Meldungen manuell schließen
- **Keyboard-Support**: ESC-Taste schließt das Modal
- **Focus-Management**: Barrierefreie Navigation
## Sicherheit
- **Admin-Berechtigung**: Alle API-Endpunkte erfordern Admin-Rechte
- **CSRF-Schutz**: CSRF-Token bei allen API-Aufrufen
- **Logging**: Alle Wartungsaktionen werden geloggt
- **Fehlerbehandlung**: Robuste Fehlerbehandlung verhindert System-Crashes
- **Datei-Größen-Limits**: Backup-Dateien sind auf 10MB begrenzt
## Wartung
- **Automatische Bereinigung**: Alte Backups werden automatisch gelöscht
- **Fehler-Logging**: Alle Fehler werden in den App-Logs erfasst
- **Performance-Überwachung**: Optimierungszeiten werden gemessen
- **Benutzer-Tracking**: Wartungsaktionen werden Benutzern zugeordnet

View File

@ -1083,50 +1083,41 @@ install_remote_access() {
echo "user:raspberry" | chpasswd || warning "Konnte Passwort für SSH-Benutzer nicht aktualisieren"
fi
# RDP-Server (xrdp) installieren
progress "Installiere RDP-Server (xrdp)..."
# RDP-Server (xrdp) installieren - vereinfachter Ansatz
progress "Installiere RDP-Server (xrdp) - vereinfachte Installation..."
# Minimale Desktop-Umgebung für RDP installieren
progress "Installiere minimale Desktop-Umgebung für RDP..."
# Alle bestehenden xrdp-Installationen entfernen
progress "Entferne vorherige xrdp-Installationen..."
systemctl stop xrdp xrdp-sesman 2>/dev/null || true
systemctl disable xrdp xrdp-sesman 2>/dev/null || true
apt-get remove --purge -y xrdp 2>/dev/null || true
rm -rf /etc/xrdp /var/log/xrdp* 2>/dev/null || true
# XFCE als leichtgewichtige Desktop-Umgebung installieren
progress "Installiere XFCE Desktop-Umgebung..."
apt-get install -y xfce4 xfce4-goodies dbus-x11 || error "XFCE Installation fehlgeschlagen"
# xrdp installieren
apt-get install -y xrdp || error "xrdp Installation fehlgeschlagen"
# xrdp-Benutzer zur ssl-cert Gruppe hinzufügen
usermod -aG ssl-cert xrdp 2>/dev/null || true
# Erstelle xrdp-Session-Konfiguration für XFCE
progress "Konfiguriere XFCE für xrdp..."
# Erstelle .xsession für alle Benutzer
cat > /etc/skel/.xsession << 'EOF'
#!/bin/bash
# XFCE Session für xrdp
export XDG_SESSION_DESKTOP=xfce
export XDG_DATA_DIRS=/usr/share/xfce4:/usr/local/share:/usr/share:/var/lib/snapd/desktop
export XDG_CONFIG_DIRS=/etc/xdg/xdg-xfce:/etc/xdg
startxfce4
EOF
# Kopiere .xsession für root
cp /etc/skel/.xsession /root/.xsession
chmod +x /root/.xsession
# Kopiere .xsession für user (falls vorhanden)
if id "user" &>/dev/null; then
cp /etc/skel/.xsession /home/user/.xsession
chown user:user /home/user/.xsession
chmod +x /home/user/.xsession
# XFCE Desktop installieren (minimal)
progress "Installiere minimale XFCE-Umgebung..."
if ! apt-get install -y xfce4-session xfce4-panel xfce4-terminal xfce4-settings xfdesktop4 dbus-x11; then
warning "Minimale XFCE-Installation fehlgeschlagen - verwende Fallback..."
apt-get install -y xfce4 dbus-x11 || error "XFCE Installation fehlgeschlagen"
fi
# xrdp-Konfiguration vereinfachen
progress "Konfiguriere xrdp..."
cp /etc/xrdp/xrdp.ini /etc/xrdp/xrdp.ini.backup
# xrdp neu installieren
progress "Installiere xrdp neu..."
apt-get update
apt-get install -y xrdp || error "xrdp Installation fehlgeschlagen"
# Benutzer zur xrdp-Gruppe hinzufügen
usermod -aG xrdp root 2>/dev/null || true
if id "user" &>/dev/null; then
usermod -aG xrdp user 2>/dev/null || true
fi
# Erstelle minimale xrdp-Konfiguration
progress "Erstelle minimale xrdp-Konfiguration..."
# Backup der Original-Konfiguration
cp /etc/xrdp/xrdp.ini /etc/xrdp/xrdp.ini.original 2>/dev/null || true
# Sehr einfache xrdp.ini
cat > /etc/xrdp/xrdp.ini << 'EOF'
[Globals]
ini_version=1
@ -1137,15 +1128,15 @@ tcp_keepalive=true
security_layer=rdp
autorun=
allow_channels=true
allow_multimon=true
allow_multimon=false
bitmap_cache=true
bitmap_compression=true
bulk_compression=true
max_bpp=32
bulk_compression=false
max_bpp=24
new_cursors=true
use_fastpath=both
require_credentials=true
ask_for_reconnect_reason=true
ask_for_reconnect_reason=false
enable_token_login=false
[Xorg]
@ -1156,20 +1147,10 @@ password=ask
ip=127.0.0.1
port=-1
code=20
[Xvnc]
name=Xvnc
lib=libvnc.so
username=ask
password=ask
ip=127.0.0.1
port=-1
code=10
EOF
# xrdp-sesman Konfiguration
progress "Konfiguriere xrdp-sesman..."
cp /etc/xrdp/sesman.ini /etc/xrdp/sesman.ini.backup
# Einfache sesman.ini
cp /etc/xrdp/sesman.ini /etc/xrdp/sesman.ini.original 2>/dev/null || true
cat > /etc/xrdp/sesman.ini << 'EOF'
[Globals]
@ -1178,24 +1159,18 @@ ListenPort=3350
EnableUserWindowManager=true
UserWindowManager=startxfce4
DefaultWindowManager=startxfce4
ReconnectSh=/etc/xrdp/reconnectwm.sh
[Security]
AllowRootLogin=true
MaxLoginRetry=4
TerminalServerUsers=tsusers
TerminalServerAdmins=tsadmins
AlwaysGroupCheck=false
RestrictOutboundClipboard=false
RestrictInboundClipboard=false
[Sessions]
X11DisplayOffset=10
MaxSessions=50
MaxSessions=10
KillDisconnected=false
IdleTimeLimit=0
DisconnectedTimeLimit=0
Policy=UBD
[Logging]
LogFile=xrdp-sesman.log
@ -1209,72 +1184,100 @@ param2=-nolisten
param3=tcp
param4=-dpi
param5=96
[Xvnc]
param1=-bs
param2=-nolisten
param3=tcp
param4=-localhost
param5=-dpi
param6=96
EOF
# Erstelle .xsession für XFCE
progress "Konfiguriere XFCE-Sessions..."
# Root-Passwort für RDP setzen
progress "Setze Root-Passwort für RDP-Zugang..."
# Root .xsession
cat > /root/.xsession << 'EOF'
#!/bin/bash
export XDG_SESSION_DESKTOP=xfce
export XDG_DATA_DIRS=/usr/share/xfce4:/usr/local/share:/usr/share
export XDG_CONFIG_DIRS=/etc/xdg/xdg-xfce:/etc/xdg
exec startxfce4
EOF
chmod +x /root/.xsession
# User .xsession (falls user existiert)
if id "user" &>/dev/null; then
cat > /home/user/.xsession << 'EOF'
#!/bin/bash
export XDG_SESSION_DESKTOP=xfce
export XDG_DATA_DIRS=/usr/share/xfce4:/usr/local/share:/usr/share
export XDG_CONFIG_DIRS=/etc/xdg/xdg-xfce:/etc/xdg
exec startxfce4
EOF
chown user:user /home/user/.xsession
chmod +x /home/user/.xsession
fi
# Root-Passwort setzen
progress "Setze Root-Passwort für RDP..."
echo "root:744563017196A" | chpasswd || error "Kann Root-Passwort nicht setzen"
# Polkit-Regel für xrdp erstellen
progress "Erstelle Polkit-Regeln für xrdp..."
mkdir -p /etc/polkit-1/localauthority/50-local.d
# Log-Verzeichnisse erstellen mit korrekten Berechtigungen
progress "Erstelle Log-Verzeichnisse..."
mkdir -p /var/log
touch /var/log/xrdp.log /var/log/xrdp-sesman.log 2>/dev/null || true
chown xrdp:xrdp /var/log/xrdp*.log 2>/dev/null || true
chmod 644 /var/log/xrdp*.log 2>/dev/null || true
cat > /etc/polkit-1/localauthority/50-local.d/45-allow-colord.pkla << 'EOF'
[Allow Colord all Users]
Identity=unix-user:*
Action=org.freedesktop.color-manager.create-device;org.freedesktop.color-manager.create-profile;org.freedesktop.color-manager.delete-device;org.freedesktop.color-manager.delete-profile;org.freedesktop.color-manager.modify-device;org.freedesktop.color-manager.modify-profile
ResultAny=no
ResultInactive=no
ResultActive=yes
EOF
# Erstelle xrdp-Konfigurationsverzeichnisse
mkdir -p /etc/xrdp/cert /var/run/xrdp
chown xrdp:xrdp /etc/xrdp/cert /var/run/xrdp 2>/dev/null || true
# xrdp-Service aktivieren und starten
# Services aktivieren und starten
progress "Starte xrdp-Services..."
systemctl enable xrdp
# systemd daemon reload
systemctl daemon-reload
# Services aktivieren
systemctl enable xrdp-sesman
systemctl enable xrdp
# Services stoppen falls sie laufen
systemctl stop xrdp 2>/dev/null || true
systemctl stop xrdp-sesman 2>/dev/null || true
# Services neu starten
# Services starten (sesman zuerst)
systemctl start xrdp-sesman
sleep 2
systemctl start xrdp
# Warte und prüfe Status
sleep 3
# Prüfe sesman-Status
if systemctl is-active --quiet xrdp-sesman; then
success "✅ xrdp-sesman erfolgreich gestartet"
# Jetzt xrdp starten
systemctl start xrdp
sleep 3
if systemctl is-active --quiet xrdp; then
success "✅ xrdp erfolgreich gestartet"
else
warning "⚠️ xrdp konnte nicht gestartet werden"
journalctl -u xrdp --no-pager -l | tail -10
fi
else
warning "⚠️ xrdp-sesman konnte nicht gestartet werden"
journalctl -u xrdp-sesman --no-pager -l | tail -10
fi
cd "$CURRENT_DIR"
# Status prüfen
if systemctl is-active --quiet xrdp; then
log "✅ Remote-Zugang konfiguriert:"
# Finaler Status-Check
if systemctl is-active --quiet xrdp && systemctl is-active --quiet xrdp-sesman; then
log "✅ Remote-Zugang vollständig konfiguriert:"
log " 📡 SSH: user:raspberry (Port 22)"
log " 🖥️ RDP: root:744563017196A (Port 3389)"
log " 🖥️ RDP: user:raspberry (Port 3389)"
elif systemctl is-active --quiet ssh; then
log "✅ SSH-Zugang konfiguriert:"
log " 📡 SSH: user:raspberry (Port 22)"
warning "⚠️ RDP-Installation unvollständig"
info "Manuelle Überprüfung erforderlich:"
info " systemctl status xrdp"
info " systemctl status xrdp-sesman"
info " journalctl -u xrdp -f"
else
warning "⚠️ xrdp-Service konnte nicht gestartet werden - starte Debugging..."
debug_xrdp_issues
# Nach Debugging nochmal prüfen
if systemctl is-active --quiet xrdp; then
log "✅ Remote-Zugang nach Debugging konfiguriert:"
log " 📡 SSH: user:raspberry (Port 22)"
log " 🖥️ RDP: root:744563017196A (Port 3389)"
else
log "✅ SSH-Zugang konfiguriert:"
log " 📡 SSH: user:raspberry (Port 22)"
warning "⚠️ RDP-Zugang konnte nicht konfiguriert werden"
info "Manuelle Fehlerbehebung erforderlich - siehe Logs"
fi
error "❌ Weder SSH noch RDP konnten konfiguriert werden"
fi
}
@ -1291,23 +1294,45 @@ configure_firewall() {
systemctl start firewalld
# Warte kurz bis firewalld vollständig gestartet ist
sleep 3
sleep 5
progress "Konfiguriere firewalld-Zonen und -Regeln..."
# Zone definieren
firewall-cmd --permanent --new-zone=myp-backend 2>/dev/null || true
# Firewall-Status prüfen
if ! firewall-cmd --state >/dev/null 2>&1; then
error "firewalld ist nicht aktiv oder reagiert nicht"
fi
# Bestehende Zone entfernen falls vorhanden
progress "Entferne bestehende myp-backend Zone falls vorhanden..."
if firewall-cmd --permanent --get-zones | grep -q "myp-backend"; then
log "Entferne bestehende myp-backend Zone..."
firewall-cmd --permanent --delete-zone=myp-backend 2>/dev/null || true
firewall-cmd --reload
sleep 2
fi
# Zone neu erstellen
progress "Erstelle neue myp-backend Zone..."
if ! firewall-cmd --permanent --new-zone=myp-backend; then
error "Fehler beim Erstellen der myp-backend Zone"
fi
# Konfiguration neu laden
firewall-cmd --reload
sleep 2
# Erweiterte Netzwerk-Quellen definieren (nur IPv4)
firewall-cmd --permanent --zone=myp-backend --add-source=192.168.0.0/16
firewall-cmd --permanent --zone=myp-backend --add-source=127.0.0.1/32
progress "Füge Netzwerk-Quellen hinzu..."
firewall-cmd --permanent --zone=myp-backend --add-source=192.168.0.0/16 || error "Fehler beim Hinzufügen des 192.168.0.0/16 Netzwerks"
firewall-cmd --permanent --zone=myp-backend --add-source=127.0.0.1/32 || error "Fehler beim Hinzufügen von localhost"
# Lokaler Hostname "raspberrypi" hinzufügen
local local_hostname="raspberrypi"
progress "Füge lokalen Hostname hinzu: $local_hostname"
local local_ip=$(getent hosts "$local_hostname" | awk '{print $1}' | grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' | head -1 2>/dev/null || true)
if [ -n "$local_ip" ]; then
firewall-cmd --permanent --zone=myp-backend --add-source="$local_ip/32" 2>/dev/null || true
firewall-cmd --permanent --zone=myp-backend --add-source="$local_ip/32" 2>/dev/null || warning "Konnte lokalen Hostname nicht hinzufügen"
log "✅ Lokaler Hostname $local_hostname hinzugefügt: $local_ip"
else
info "Lokaler Hostname $local_hostname nicht auflösbar - wird beim nächsten Boot verfügbar sein"
@ -1317,51 +1342,100 @@ configure_firewall() {
progress "Füge Frontend-Server hinzu: m040tbaraspi001"
local frontend_ip=$(getent hosts "m040tbaraspi001" | awk '{print $1}' | grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' | head -1 2>/dev/null || true)
if [ -n "$frontend_ip" ]; then
firewall-cmd --permanent --zone=myp-backend --add-source="$frontend_ip/32" 2>/dev/null || true
firewall-cmd --permanent --zone=myp-backend --add-source="$frontend_ip/32" 2>/dev/null || warning "Konnte Frontend-Server IP nicht hinzufügen"
log "✅ Frontend-Server m040tbaraspi001 hinzugefügt: $frontend_ip"
else
# Versuche auch mit FQDN
local frontend_fqdn_ip=$(getent hosts "m040tbaraspi001.de040.corpintra.net" | awk '{print $1}' | grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' | head -1 2>/dev/null || true)
if [ -n "$frontend_fqdn_ip" ]; then
firewall-cmd --permanent --zone=myp-backend --add-source="$frontend_fqdn_ip/32" 2>/dev/null || true
firewall-cmd --permanent --zone=myp-backend --add-source="$frontend_fqdn_ip/32" 2>/dev/null || warning "Konnte Frontend-Server FQDN nicht hinzufügen"
log "✅ Frontend-Server m040tbaraspi001.de040.corpintra.net hinzugefügt: $frontend_fqdn_ip"
else
info "Frontend-Server m040tbaraspi001 nicht auflösbar - überspringe"
fi
fi
# Ports und Services hinzufügen
progress "Konfiguriere Ports und Services..."
# HTTPS für API & Kiosk zulassen
firewall-cmd --permanent --zone=myp-backend --add-port=443/tcp
firewall-cmd --permanent --zone=myp-backend --add-port=443/tcp || error "Fehler beim Hinzufügen von Port 443"
# SSH für Wartung
firewall-cmd --permanent --zone=myp-backend --add-service=ssh
firewall-cmd --permanent --zone=myp-backend --add-service=ssh || error "Fehler beim Hinzufügen des SSH-Service"
# RDP für Remote-Desktop
firewall-cmd --permanent --zone=myp-backend --add-port=3389/tcp
firewall-cmd --permanent --zone=myp-backend --add-port=3389/tcp || error "Fehler beim Hinzufügen von Port 3389"
# IPv6 in firewalld deaktivieren
progress "Deaktiviere IPv6 in firewalld..."
firewall-cmd --permanent --set-target=DROP --zone=public --family=ipv6 2>/dev/null || true
firewall-cmd --permanent --set-target=DROP --zone=myp-backend --family=ipv6 2>/dev/null || true
firewall-cmd --permanent --set-target=DROP --zone=public --family=ipv6 2>/dev/null || warning "IPv6 konnte nicht in public Zone deaktiviert werden"
firewall-cmd --permanent --set-target=DROP --zone=myp-backend --family=ipv6 2>/dev/null || warning "IPv6 konnte nicht in myp-backend Zone deaktiviert werden"
# Default-Zone setzen
firewall-cmd --set-default-zone=myp-backend
progress "Setze Default-Zone..."
firewall-cmd --set-default-zone=myp-backend || error "Fehler beim Setzen der Default-Zone"
# Änderungen übernehmen
firewall-cmd --reload
progress "Lade Firewall-Konfiguration neu..."
firewall-cmd --reload || error "Fehler beim Neuladen der Firewall-Konfiguration"
# Kurz warten und Status prüfen
sleep 3
# Firewall-Status anzeigen
progress "Firewall-Konfiguration:"
firewall-cmd --list-all-zones | grep -A 15 "myp-backend" || true
if firewall-cmd --list-all --zone=myp-backend 2>/dev/null; then
log "✅ Firewall-Konfiguration erfolgreich angezeigt"
else
warning "⚠️ Firewall-Status konnte nicht angezeigt werden"
fi
log "✅ Firewall konfiguriert:"
log " 🔒 Zone: myp-backend"
log " 🌐 Netzwerk: 192.168.0.0/16 (nur IPv4)"
log " 🏠 Localhost: 127.0.0.1"
log " 🖥️ Lokaler Host: raspberrypi"
log " 📡 Frontend-Server: m040tbaraspi001"
log " 🔌 Ports: 443/tcp (HTTPS), 22/tcp (SSH), 3389/tcp (RDP)"
log " 🚫 IPv6 vollständig blockiert"
# Finale Validierung
progress "Validiere Firewall-Konfiguration..."
local validation_errors=0
# Prüfe ob Zone existiert
if ! firewall-cmd --get-zones | grep -q "myp-backend"; then
error "Zone myp-backend wurde nicht korrekt erstellt"
((validation_errors++))
fi
# Prüfe Default-Zone
if [ "$(firewall-cmd --get-default-zone)" != "myp-backend" ]; then
warning "Default-Zone ist nicht myp-backend"
((validation_errors++))
fi
# Prüfe Ports
if ! firewall-cmd --zone=myp-backend --query-port=443/tcp 2>/dev/null; then
warning "Port 443 nicht korrekt konfiguriert"
((validation_errors++))
fi
if ! firewall-cmd --zone=myp-backend --query-port=3389/tcp 2>/dev/null; then
warning "Port 3389 nicht korrekt konfiguriert"
((validation_errors++))
fi
if ! firewall-cmd --zone=myp-backend --query-service=ssh 2>/dev/null; then
warning "SSH-Service nicht korrekt konfiguriert"
((validation_errors++))
fi
if [ $validation_errors -eq 0 ]; then
log "✅ Firewall konfiguriert und validiert:"
log " 🔒 Zone: myp-backend (als Default gesetzt)"
log " 🌐 Netzwerk: 192.168.0.0/16 (nur IPv4)"
log " 🏠 Localhost: 127.0.0.1"
log " 🖥️ Lokaler Host: raspberrypi"
log " 📡 Frontend-Server: m040tbaraspi001"
log " 🔌 Ports: 443/tcp (HTTPS), 22/tcp (SSH), 3389/tcp (RDP)"
log " 🚫 IPv6 vollständig blockiert"
else
warning "⚠️ Firewall-Konfiguration mit $validation_errors Fehlern abgeschlossen"
info "System funktioniert möglicherweise trotzdem - manuelle Überprüfung empfohlen"
fi
}
# =========================== REMOTE-ZUGANG TESTEN ===========================
@ -1380,31 +1454,25 @@ test_remote_access() {
warning "⚠️ SSH-Port 22 nicht erreichbar"
fi
else
warning "⚠️ SSH-Service läuft nicht - versuche Neustart..."
systemctl restart ssh 2>/dev/null || true
sleep 2
if systemctl is-active --quiet ssh; then
success "✅ SSH-Service nach Neustart aktiv"
else
error "❌ SSH-Service konnte nicht gestartet werden"
fi
warning "⚠️ SSH-Service läuft nicht"
fi
# RDP-Service testen
progress "Teste RDP-Service..."
# RDP-Services testen
progress "Teste RDP-Services..."
local xrdp_sesman_status="❌"
local xrdp_status="❌"
# Prüfe xrdp-sesman zuerst
if systemctl is-active --quiet xrdp-sesman; then
xrdp_sesman_status="✅"
success "✅ xrdp-sesman läuft"
else
warning "⚠️ xrdp-sesman läuft nicht - versuche Neustart..."
systemctl restart xrdp-sesman 2>/dev/null || true
sleep 2
warning "⚠️ xrdp-sesman läuft nicht"
fi
# Prüfe xrdp
if systemctl is-active --quiet xrdp; then
success "✅ RDP-Service läuft"
xrdp_status="✅"
success "✅ xrdp läuft"
# RDP-Port testen
if ss -tlnp | grep -q ":3389 "; then
@ -1413,16 +1481,7 @@ test_remote_access() {
warning "⚠️ RDP-Port 3389 nicht erreichbar"
fi
else
warning "⚠️ RDP-Service läuft nicht - versuche Neustart..."
systemctl restart xrdp 2>/dev/null || true
sleep 3
if systemctl is-active --quiet xrdp; then
success "✅ RDP-Service nach Neustart aktiv"
else
warning "⚠️ RDP-Service konnte nicht gestartet werden"
info "Prüfe Logs mit: journalctl -u xrdp -f"
info "Prüfe sesman Logs mit: journalctl -u xrdp-sesman -f"
fi
warning "⚠️ xrdp läuft nicht"
fi
# Firewall-Status testen
@ -1430,10 +1489,6 @@ test_remote_access() {
if systemctl is-active --quiet firewalld; then
success "✅ Firewall läuft"
# Aktive Zone anzeigen
local active_zone=$(firewall-cmd --get-active-zones 2>/dev/null | head -1 || echo "Keine Zone aktiv")
info "Aktive Zone: $active_zone"
# Prüfe ob Ports offen sind
if firewall-cmd --zone=myp-backend --query-port=22/tcp 2>/dev/null; then
success "✅ SSH-Port in Firewall freigegeben"
@ -1455,12 +1510,21 @@ test_remote_access() {
local ip_address=$(ip route get 1.1.1.1 2>/dev/null | awk '{print $7}' | head -1 || echo "Unbekannt")
if [ "$ip_address" != "Unbekannt" ]; then
success "✅ Netzwerk-Interface aktiv: $ip_address"
info "SSH-Zugang: ssh user@$ip_address"
info "RDP-Zugang: $ip_address:3389"
info "Zugang-URLs:"
info " SSH: ssh user@$ip_address"
if [ "$xrdp_status" = "✅" ]; then
info " RDP: $ip_address:3389 (root:744563017196A oder user:raspberry)"
fi
else
warning "⚠️ Keine Netzwerk-IP ermittelt"
fi
# Status-Zusammenfassung
log "📊 Service-Status:"
log " SSH: $(systemctl is-active --quiet ssh && echo "✅ Aktiv" || echo "❌ Inaktiv")"
log " xrdp-sesman: $xrdp_sesman_status $(systemctl is-active --quiet xrdp-sesman && echo "Aktiv" || echo "Inaktiv")"
log " xrdp: $xrdp_status $(systemctl is-active --quiet xrdp && echo "Aktiv" || echo "Inaktiv")"
log "✅ Remote-Zugang-Test abgeschlossen"
}
@ -1503,80 +1567,6 @@ configure_hostname() {
fi
}
# =========================== XRDP DEBUGGING ===========================
debug_xrdp_issues() {
log "=== XRDP DEBUGGING ==="
progress "Analysiere xrdp-Probleme..."
# Prüfe xrdp-Logs
if [ -f /var/log/xrdp.log ]; then
local xrdp_errors=$(tail -20 /var/log/xrdp.log | grep -i "error\|fail\|denied" | wc -l)
if [ "$xrdp_errors" -gt 0 ]; then
warning "⚠️ Fehler in xrdp.log gefunden:"
tail -10 /var/log/xrdp.log | grep -i "error\|fail\|denied" || true
fi
fi
# Prüfe sesman-Logs
if [ -f /var/log/xrdp-sesman.log ]; then
local sesman_errors=$(tail -20 /var/log/xrdp-sesman.log | grep -i "error\|fail\|denied" | wc -l)
if [ "$sesman_errors" -gt 0 ]; then
warning "⚠️ Fehler in xrdp-sesman.log gefunden:"
tail -10 /var/log/xrdp-sesman.log | grep -i "error\|fail\|denied" || true
fi
fi
# Prüfe Berechtigungen
progress "Prüfe xrdp-Berechtigungen..."
if [ ! -r /etc/xrdp/xrdp.ini ]; then
warning "⚠️ xrdp.ini nicht lesbar"
fi
if [ ! -r /etc/xrdp/sesman.ini ]; then
warning "⚠️ sesman.ini nicht lesbar"
fi
# Prüfe ob XFCE installiert ist
if ! command -v startxfce4 >/dev/null 2>&1; then
warning "⚠️ XFCE nicht gefunden - installiere..."
apt-get install -y xfce4 xfce4-goodies dbus-x11 || true
fi
# Prüfe Polkit
if [ ! -f /etc/polkit-1/localauthority/50-local.d/45-allow-colord.pkla ]; then
warning "⚠️ Polkit-Regel fehlt - erstelle..."
mkdir -p /etc/polkit-1/localauthority/50-local.d
cat > /etc/polkit-1/localauthority/50-local.d/45-allow-colord.pkla << 'EOF'
[Allow Colord all Users]
Identity=unix-user:*
Action=org.freedesktop.color-manager.create-device;org.freedesktop.color-manager.create-profile;org.freedesktop.color-manager.delete-device;org.freedesktop.color-manager.delete-profile;org.freedesktop.color-manager.modify-device;org.freedesktop.color-manager.modify-profile
ResultAny=no
ResultInactive=no
ResultActive=yes
EOF
fi
# Versuche Services neu zu starten
progress "Starte xrdp-Services neu..."
systemctl stop xrdp xrdp-sesman 2>/dev/null || true
sleep 2
systemctl start xrdp-sesman
sleep 2
systemctl start xrdp
sleep 3
if systemctl is-active --quiet xrdp; then
success "✅ xrdp nach Debugging erfolgreich gestartet"
else
warning "⚠️ xrdp konnte auch nach Debugging nicht gestartet werden"
info "Manuelle Prüfung erforderlich:"
info " journalctl -u xrdp -f"
info " journalctl -u xrdp-sesman -f"
info " tail -f /var/log/xrdp.log"
fi
}
# =========================== HAUPTPROGRAMM ===========================
main() {
# Erstelle Log-Datei