Projektarbeit-MYP/backend/kiosk-watchdog.service

112 lines
4.9 KiB
Desktop File

[Unit]
Description=MYP Kiosk Watchdog Service - Überwacht HTTPS Backend und Kiosk-Browser
Documentation=https://github.com/MYP-Druckerverwaltung
After=multi-user.target myp-https.service
Wants=myp-https.service
[Service]
Type=simple
User=root
Restart=always
RestartSec=30
ExecStart=/bin/bash -c '\
while true; do \
# Prüfe HTTPS Backend-Service (Port 443) \
if ! systemctl is-active --quiet myp-https; then \
echo "$(date): HTTPS Backend-Service nicht aktiv - starte neu" >> /var/log/kiosk-watchdog.log; \
systemctl start myp-https; \
sleep 10; \
fi; \
\
# Prüfe HTTPS Backend-Erreichbarkeit (Port 443) \
if ! curl -k -s --connect-timeout 5 https://localhost:443 >/dev/null 2>&1; then \
echo "$(date): HTTPS Backend nicht erreichbar - starte Service neu" >> /var/log/kiosk-watchdog.log; \
systemctl restart myp-https; \
sleep 15; \
fi; \
\
# Prüfe SSL-Zertifikat-Gültigkeit \
if [ -f /opt/myp/certs/localhost/localhost.crt ]; then \
if ! openssl x509 -in /opt/myp/certs/localhost/localhost.crt -noout -checkend 86400 >/dev/null 2>&1; then \
echo "$(date): SSL-Zertifikat läuft ab - regeneriere Zertifikat" >> /var/log/kiosk-watchdog.log; \
python3 -c "import sys; sys.path.insert(0, \"/opt/myp\"); from utils.ssl_config import ensure_ssl_certificates; ensure_ssl_certificates(\"/opt/myp\", True)" || true; \
systemctl restart myp-https; \
sleep 10; \
fi; \
else \
echo "$(date): SSL-Zertifikat fehlt - generiere neues Zertifikat" >> /var/log/kiosk-watchdog.log; \
python3 -c "import sys; sys.path.insert(0, \"/opt/myp\"); from utils.ssl_config import ensure_ssl_certificates; ensure_ssl_certificates(\"/opt/myp\")" || true; \
systemctl restart myp-https; \
sleep 10; \
fi; \
\
# Prüfe Kiosk-Benutzer Session \
if ! pgrep -u kiosk > /dev/null; then \
echo "$(date): Kiosk-Benutzer nicht angemeldet - prüfe Autologin" >> /var/log/kiosk-watchdog.log; \
# Versuche getty@tty1 Service zu restarten für Autologin \
systemctl restart getty@tty1.service; \
sleep 15; \
fi; \
\
# Prüfe Chromium Kiosk-Prozess \
if pgrep -u kiosk > /dev/null && ! pgrep -u kiosk -f "chromium.*kiosk" > /dev/null; then \
echo "$(date): Chromium-Kiosk nicht gefunden aber Kiosk-User aktiv - starte Browser" >> /var/log/kiosk-watchdog.log; \
# Versuche Kiosk-Service zu starten \
systemctl --user start myp-kiosk 2>/dev/null || true; \
sleep 10; \
fi; \
\
# Prüfe X-Server für Kiosk-Display \
if pgrep -u kiosk > /dev/null && ! pgrep -f "X.*:0" > /dev/null; then \
echo "$(date): X-Server nicht gefunden aber Kiosk-User aktiv - starte X" >> /var/log/kiosk-watchdog.log; \
# Versuche X-Server über Kiosk-User zu starten \
sudo -u kiosk DISPLAY=:0 startx 2>/dev/null & \
sleep 15; \
fi; \
\
# Prüfe Display-Verfügbarkeit \
if pgrep -u kiosk > /dev/null && [ -z "$(DISPLAY=:0 xdpyinfo 2>/dev/null)" ]; then \
echo "$(date): Display :0 nicht verfügbar - starte X-Session neu" >> /var/log/kiosk-watchdog.log; \
# Beende alle X-Prozesse des Kiosk-Users und starte neu \
pkill -u kiosk -f "X" 2>/dev/null || true; \
sleep 5; \
sudo -u kiosk DISPLAY=:0 startx 2>/dev/null & \
sleep 15; \
fi; \
\
# Prüfe Systemressourcen und bereinige bei Bedarf \
MEMORY_USAGE=$(free | grep Mem | awk "{print (\$3/\$2) * 100.0}"); \
if (( $(echo "$MEMORY_USAGE > 90" | bc -l) )); then \
echo "$(date): Hohe Speichernutzung ($MEMORY_USAGE%) - bereinige System" >> /var/log/kiosk-watchdog.log; \
# Bereinige Browser-Cache \
rm -rf /home/kiosk/.chromium-kiosk/Default/Cache/* 2>/dev/null || true; \
rm -rf /home/kiosk/.cache/* 2>/dev/null || true; \
# Garbage Collection \
sync; \
echo 3 > /proc/sys/vm/drop_caches 2>/dev/null || true; \
fi; \
\
# Warte 30 Sekunden vor nächster Prüfung \
sleep 30; \
done'
# Umgebungsvariablen für HTTPS-Überwachung
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Environment=DISPLAY=:0
Environment=PYTHONPATH=/opt/myp
Environment=SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt
# Logging
StandardOutput=append:/var/log/kiosk-watchdog.log
StandardError=append:/var/log/kiosk-watchdog.log
# Sicherheitseinstellungen
NoNewPrivileges=false
PrivateTmp=false
ReadWritePaths=/var/log
ReadWritePaths=/opt/myp
ReadWritePaths=/home/kiosk
ReadWritePaths=/proc/sys/vm
[Install]
WantedBy=multi-user.target