# MYP Platform - Häufige Fehler und Lösungen

Dieses Dokument sammelt häufige Installations- und Konfigurationsfehler mit ihren bewährten Lösungen.

## 📦 Python-Paket-Installationsfehler

### Send2Trash Installation schlägt fehl

**Problem:**
```
ERROR: Failed building wheel for Send2Trash
error: Microsoft Visual C++ 14.0 is required
```

**Lösung:**
- Send2Trash wurde aus requirements.txt entfernt
- Native Alternative in `backend/utils/file_utils.py` implementiert
- Verwendet plattformspezifische Papierkorb-APIs:
  - Windows: PowerShell + Visual Basic FileSystem
  - Linux: gio/gvfs-trash/XDG-Standard
  - macOS: osascript + Finder

**Code-Ersatz:**
```python
# Alt:
from send2trash import send2trash
send2trash(file_path)

# Neu:
from utils.file_utils import move_to_trash
move_to_trash(file_path)
```

### Python-magic-bin Windows-Fehler

**Problem:**
```
ERROR: Could not find a version that satisfies the requirement python-magic-bin
```

**Lösung:**
- Paket ist Windows-spezifisch und wird automatisch übersprungen auf Linux
- Setup-Skript erstellt bereinigte requirements.txt ohne problematische Pakete
- Plattformspezifische Conditional-Installation: `; sys_platform == "win32"`

### RPi.GPIO auf Non-Raspberry Pi

**Problem:**
```
RuntimeError: This module can only be run on a Raspberry Pi!
```

**Lösung:**
- Conditional-Installation: `RPi.GPIO; sys_platform == "linux"`
- Wird automatisch übersprungen wenn nicht auf Raspberry Pi
- Fallback-Hardware-Detection in Hardware-Modulen

## 🔧 Systemkonfigurationsfehler

### Hostname-Änderung schlägt fehl

**Problem:**
```
hostnamectl: command not found
/etc/hostname: Permission denied
```

**Lösung:**
```bash
# Prüfe systemd-Verfügbarkeit
if command -v hostnamectl >/dev/null 2>&1; then
    sudo hostnamectl set-hostname m040tbaraspi001
else
    # Fallback für ältere Systeme
    echo "m040tbaraspi001" | sudo tee /etc/hostname
    sudo hostname m040tbaraspi001
fi

# Hosts-Datei aktualisieren
sudo sed -i 's/127.0.1.1.*/127.0.1.1\tm040tbaraspi001/' /etc/hosts
```

### SSL-Zertifikat-Generierung schlägt fehl

**Problem:**
```
openssl: command not found
Permission denied: /opt/myp/ssl/
```

**Lösung:**
```bash
# OpenSSL installieren
sudo apt update && sudo apt install -y openssl

# Verzeichnis mit korrekten Berechtigungen erstellen
sudo mkdir -p /opt/myp/ssl
sudo chown -R $USER:$USER /opt/myp/ssl
sudo chmod 755 /opt/myp/ssl

# Self-signed Zertifikat generieren
openssl req -x509 -newkey rsa:4096 -keyout /opt/myp/ssl/key.pem \
    -out /opt/myp/ssl/cert.pem -days 365 -nodes \
    -subj "/C=DE/ST=NRW/L=Duesseldorf/O=Mercedes-Benz/CN=m040tbaraspi001"
```

### Systemd-Service Installation schlägt fehl

**Problem:**
```
Failed to enable unit: Unit file does not exist
systemctl: command not found
```

**Lösung:**
```bash
# Prüfe systemd-Verfügbarkeit
if ! command -v systemctl >/dev/null 2>&1; then
    echo "systemd nicht verfügbar - verwende alternatives Init-System"
    # Fallback auf SysV init oder manuelle Autostart-Einrichtung
    return 1
fi

# Service-Datei kopieren und aktivieren
sudo cp myp-*.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable myp-app.service
sudo systemctl enable myp-kiosk.service
```

## 🌐 Netzwerkkonfigurationsfehler

### Firewall blockiert Zugriff

**Problem:**
```
Connection refused: https://m040tbaraspi001.de040.corpintra.net:443
curl: (7) Failed to connect
```

**Lösung:**
```bash
# UFW-Firewall konfigurieren
sudo ufw allow 22/tcp     # SSH
sudo ufw allow 80/tcp     # HTTP
sudo ufw allow 443/tcp    # HTTPS
sudo ufw allow 5000/tcp   # Flask Development
sudo ufw --force enable

# iptables direkt (falls UFW nicht verfügbar)
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables-save | sudo tee /etc/iptables/rules.v4
```

### DNS-Auflösung schlägt fehl

**Problem:**
```
nslookup: can't resolve 'm040tbaraspi001.de040.corpintra.net'
ping: unknown host
```

**Lösung:**
```bash
# Lokale hosts-Datei erweitern
echo "127.0.0.1    m040tbaraspi001.local" | sudo tee -a /etc/hosts
echo "127.0.0.1    m040tbaraspi001.de040.corpintra.net" | sudo tee -a /etc/hosts

# DNS-Server prüfen und setzen
echo "nameserver 8.8.8.8" | sudo tee -a /etc/resolv.conf
echo "nameserver 8.8.4.4" | sudo tee -a /etc/resolv.conf

# NetworkManager DNS (Ubuntu/Debian)
sudo systemctl restart NetworkManager
```

## 🖥️ Desktop- und Kiosk-Fehler

### Graphical Session Target Not Found

**Problem:**
```
graphical session target not found
Unit graphical-session.target could not be found
Failed to start myp-kiosk.service
```

**Ursache**: Das `graphical-session.target` existiert nicht auf allen Raspberry Pi-Konfigurationen

**🚀 SCHNELLE LÖSUNG:**
```bash
# Super-Skript ausführen (behebt ALLES automatisch):
cd /opt/myp
sudo ./setup_https_only.sh

# Das Super-Skript erkennt und behebt automatisch:
# ✅ Graphical session target Problem
# ✅ Service-Konfiguration reparieren
# ✅ Korrekte Targets verwenden  
# ✅ Headless/Desktop-System automatisch erkennen
```

**🔧 Manuelle Lösung:**
```bash
# 1. Service-Datei anpassen
sudo systemctl edit myp-kiosk.service --full

# 2. Ersetze in der [Unit]-Sektion:
# VON: After=graphical-session.target
# ZU:  After=graphical.target

# 3. SystemD neu laden
sudo systemctl daemon-reload
sudo systemctl restart myp-kiosk
```

**📋 Für verschiedene Szenarien:**
```bash
# Headless-System (ohne Display):
sudo systemctl disable myp-kiosk

# Desktop-Environment installieren:
sudo apt install --no-install-recommends xserver-xorg xinit

# Graphical Target als Standard setzen:
sudo systemctl set-default graphical.target

# Verfügbare Targets prüfen:
systemctl list-unit-files --type=target | grep graphical
```

### Chromium startet nicht im Kiosk-Modus

**Problem:**
```
chromium-browser: command not found
[ERROR:gpu_init.cc] GPU initialization failed
```

**Lösung:**
```bash
# Chromium installieren
sudo apt update && sudo apt install -y chromium-browser

# GPU-Acceleration deaktivieren für Headless-Systeme
chromium-browser --no-sandbox --disable-gpu --disable-software-rasterizer \
    --disable-background-timer-throttling --disable-renderer-backgrounding \
    --disable-backgrounding-occluded-windows --kiosk "$URL"

# Fallback auf andere Browser
if ! command -v chromium-browser >/dev/null 2>&1; then
    if command -v firefox >/dev/null 2>&1; then
        firefox --kiosk "$URL"
    elif command -v google-chrome >/dev/null 2>&1; then
        google-chrome --kiosk --no-sandbox "$URL"
    fi
fi
```

### Desktop-Verknüpfung wird nicht angezeigt

**Problem:**
```
.desktop file created but not visible
Icon not displayed
```

**Lösung:**
```bash
# Desktop-Datei ausführbar machen
chmod +x ~/Desktop/myp-kiosk.desktop

# Icon kopieren
sudo cp backend/static/mercedes.svg /usr/share/pixmaps/myp-mercedes.svg
sudo chmod 644 /usr/share/pixmaps/myp-mercedes.svg

# Desktop-Datenbank aktualisieren
update-desktop-database ~/.local/share/applications/
xdg-desktop-menu forceupdate

# Gnome: Trusted Application markieren
dconf write /org/gnome/desktop/interface/enable-animations false
```

## 📊 Datenbank- und Persistenzfehler

### SQLite-Datenbank Berechtigungsfehler

**Problem:**
```
sqlite3.OperationalError: attempt to write a readonly database
PermissionError: [Errno 13] Permission denied: 'instance/myp.db'
```

**Lösung:**
```bash
# Verzeichnis und Datei-Berechtigungen korrigieren
sudo chown -R $USER:$USER /opt/myp/instance/
chmod 755 /opt/myp/instance/
chmod 644 /opt/myp/instance/*.db

# Backup-Verzeichnis mit Schreibrechten
mkdir -p /opt/myp/instance/backups
chmod 755 /opt/myp/instance/backups
```

### Backup-Prozess schlägt fehl

**Problem:**
```
rsync: command not found
tar: cannot create backup
disk full
```

**Lösung:**
```bash
# Notwendige Tools installieren
sudo apt install -y rsync tar gzip

# Speicherplatz prüfen
df -h /opt/myp/

# Alte Backups aufräumen (älter als 30 Tage)
find /opt/myp/instance/backups -name "*.tar.gz" -mtime +30 -delete

# Komprimierte Backups
tar -czf backup_$(date +%Y%m%d_%H%M%S).tar.gz instance/
```

## 🔐 Sicherheits- und Authentifizierungsfehler

### JWT-Token-Validierung schlägt fehl

**Problem:**
```
jwt.DecodeError: Invalid token
SECRET_KEY not set
```

**Lösung:**
```python
# In config.py sicherstellen:
import secrets
SECRET_KEY = secrets.token_urlsafe(32)

# Oder aus Umgebungsvariable:
SECRET_KEY = os.environ.get('SECRET_KEY') or secrets.token_urlsafe(32)

# Token-Expiration prüfen:
JWT_ACCESS_TOKEN_EXPIRES = timedelta(hours=24)
```

### SSL Browser-Kompatibilitätsfehler (ERR_SSL_KEY_USAGE_INCOMPATIBLE)

**Problem:**
```
ERR_SSL_KEY_USAGE_INCOMPATIBLE
This site can't provide a secure connection
SSL certificate key usage incompatible
```

**🚀 SUPER-SKRIPT LÖSUNG (Intelligente Komplettlösung):**
```bash
# Das EINZIGE Super-Skript für ALLE Probleme:
cd /opt/myp
sudo ./setup_https_only.sh

# Das intelligente Super-Skript macht automatisch:
# ✅ ERR_SSL_KEY_USAGE_INCOMPATIBLE beheben
# ✅ Browser-kompatible SSL-Zertifikate erstellen
# ✅ Port 5000 blockieren, nur Port 443 öffnen
# ✅ SSL-Zertifikat-Gesundheit prüfen und erneuern
# ✅ Alle SSL-Probleme automatisch reparieren
# ✅ Connection refused beheben
# ✅ Graphical session target beheben
# ✅ Service-Dependencies reparieren
# ✅ Port-Konflikte lösen
# ✅ Kiosk intelligent konfigurieren
# ✅ Firewall für maximale Sicherheit
```

**Lösung:**

**🍓 RASPBERRY PI (Zielsystem) - PRIMÄRE LÖSUNG:**
```bash
# SSL-Fix auf Raspberry Pi ausführen
ssh pi@m040tbaraspi001
sudo chmod +x /tmp/fix_ssl_raspberry.sh
sudo /tmp/fix_ssl_raspberry.sh

# Oder via Setup-Skript
cd /opt/myp
sudo ./setup.sh  # Option [1] wählen
```

**🔧 Alternative Tools:**
```bash
# Cross-Platform Python Tool
cd backend
python3 ssl_fix.py

# Oder manuell neue browser-kompatible Zertifikate generieren:
cd backend/ssl
openssl genrsa -out key.pem 2048

# Erstelle OpenSSL-Konfiguration mit korrekten Extensions
cat > ssl_fix.conf << 'EOF'
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no

[req_distinguished_name]
C = DE
ST = Baden-Wuerttemberg
L = Stuttgart
O = Mercedes-Benz AG
OU = MYP Druckerverwaltung
CN = m040tbaraspi001

[v3_req]
basicConstraints = critical, CA:FALSE
keyUsage = critical, digitalSignature, keyEncipherment, keyAgreement
extendedKeyUsage = critical, serverAuth, clientAuth
subjectAltName = critical, @alt_names
nsCertType = server

[alt_names]
DNS.1 = localhost
DNS.2 = m040tbaraspi001
DNS.3 = m040tbaraspi001.de040.corpintra.net
IP.1 = 127.0.0.1
EOF

# Generiere browser-kompatibles Zertifikat
openssl req -new -x509 -key key.pem -out cert.pem -days 365 \
    -config ssl_fix.conf -extensions v3_req -sha256

# Validiere Extensions
openssl x509 -in cert.pem -noout -text | grep -A5 "Key Usage"

# Danach: Browser-Cache leeren und MYP neu starten
```

### HTTPS-Redirect-Loop

**Problem:**
```
ERR_TOO_MANY_REDIRECTS
Infinite redirect between http and https
```

**Lösung:**
```python
# In Flask-App prüfen:
from flask_talisman import Talisman

# Nur HTTPS forcieren wenn Zertifikat verfügbar
if os.path.exists('/opt/myp/ssl/cert.pem'):
    Talisman(app, force_https=True)
else:
    # Development: HTTP erlauben
    Talisman(app, force_https=False)
```

## 📝 Log-Dateien zur Fehlerdiagnose

### Wichtige Log-Standorte:
```bash
# MYP Application Logs
/opt/myp/logs/app/app.log
/opt/myp/logs/errors/error.log

# Systemd Service Logs
journalctl -u myp-app.service -f
journalctl -u myp-kiosk.service -f

# System-Logs
/var/log/syslog
/var/log/nginx/error.log  # Falls Nginx verwendet wird
```

### Log-Analyse-Befehle:
```bash
# Letzte 50 Fehler
tail -50 /opt/myp/logs/errors/error.log | grep ERROR

# Live-Monitoring
tail -f /opt/myp/logs/app/app.log

# Fehler der letzten Stunde
journalctl -u myp-app.service --since "1 hour ago" | grep ERROR
```

## 🛠️ Debugging-Tools

### System-Informationen sammeln:
```bash
# System-Overview
uname -a
lsb_release -a
python3 --version
pip3 list | grep -E "(Flask|requests)"

# Netzwerk-Status
ip addr show
ss -tulpn | grep :443
curl -I http://localhost:5000/health

# Prozess-Status
ps aux | grep -E "(python|myp)"
systemctl status myp-*
```

### Performance-Monitoring:
```bash
# CPU und Memory
top -p $(pgrep -f "python.*myp")
htop

# Disk I/O
iotop
df -h /opt/myp/

# Network
iftop
netstat -i
```

## 📋 Vorbeugende Maßnahmen

### Regelmäßige Wartung:
```bash
# System-Updates
sudo apt update && sudo apt upgrade -y

# Python-Pakete aktualisieren
pip3 list --outdated
python3 -m pip install --upgrade pip

# Log-Rotation einrichten
sudo logrotate -f /etc/logrotate.conf

# Disk-Cleanup
sudo apt autoremove -y
sudo apt autoclean
```

### Monitoring-Setup:
```bash
# Cron-Job für Health-Check (alle 5 Minuten)
echo "*/5 * * * * curl -f http://localhost:5000/health || systemctl restart myp-app.service" | crontab -

# Log-Size monitoring
echo "0 2 * * * find /opt/myp/logs -name '*.log' -size +100M -exec truncate -s 50M {} \;" | crontab -
```

---

**💡 Tipp:** Vor jeder größeren Änderung ein vollständiges Backup erstellen:
```bash
sudo tar -czf /tmp/myp_backup_$(date +%Y%m%d_%H%M%S).tar.gz /opt/myp/
```

### Connection Refused (Kiosk-Modus)

**Problem:**
```
Connection refused
ERR_CONNECTION_REFUSED
Kiosk startet aber kann sich nicht mit MYP-Server verbinden
```

**Ursachen:**
- MYP-Server läuft nicht (myp-https/myp-app Service)
- Ports 443/5000 sind blockiert oder nicht belegt
- SSL-Zertifikate fehlen oder sind ungültig
- Python-Module fehlen oder sind defekt
- Firewall blockiert Verbindungen

**🚀 Schnelle Lösung:**
```bash
# Super-Skript ausführen (INTELLIGENTE Komplettlösung):
cd /opt/myp
sudo ./setup_https_only.sh

# Das Super-Skript erkennt und repariert automatisch:
# ✅ Connection refused Probleme
# ✅ Service-Status prüfen und reparieren
# ✅ Python-Module reparieren
# ✅ Port-Konflikte lösen
# ✅ SSL-Zertifikate validieren
```

**🔍 Manuelle Diagnose (falls nötig):**
```bash
# Service-Logs prüfen
journalctl -u myp-production -f
journalctl -u myp-https -f
journalctl -u myp-app -f

# Port-Status prüfen
netstat -tulpn | grep -E ':(443|5000|80)'
```

**🔧 Manuelle Reparatur:**
```bash
# 1. Services stoppen und neu starten
sudo systemctl stop myp-kiosk myp-https myp-app
sudo systemctl start myp-app myp-https myp-kiosk

# 2. Firewall-Ports öffnen
sudo ufw allow 443
sudo ufw allow 5000
sudo ufw allow 80

# 3. SSL-Zertifikate regenerieren
cd /opt/myp
sudo ./fix_ssl_raspberry.sh

# 4. Python-Module neu installieren
cd /opt/myp
sudo python3 -m pip install -r requirements.txt --break-system-packages --force-reinstall

# 5. App manuell testen
cd /opt/myp
python3 app.py
```

**🎯 Verbindungstest:**
```bash
# Teste lokale Verbindungen
curl -k https://localhost:443
curl http://localhost:5000
curl -k https://m040tbaraspi001.de040.corpintra.net

# Teste von anderem System
curl -k https://192.168.1.XXX:443
```

**📋 Häufige Lösungen:**
- **Service läuft nicht**: `sudo systemctl enable --now myp-https`
- **Port blockiert**: `sudo ufw allow 443 && sudo ufw allow 5000`
- **SSL-Fehler**: `sudo ./fix_ssl_raspberry.sh`
- **Python-Fehler**: `sudo python3 -m pip install flask --break-system-packages`
- **Kiosk-URL falsch**: Prüfe `/etc/systemd/system/myp-kiosk.service`

---

**📞 Support:** Bei ungelösten Problemen alle relevanten Logs und die Ausgabe der Debugging-Tools sammeln. 