From 653f06fa88ec77b3cff94eb57ff1b1b3ae5cbe11 Mon Sep 17 00:00:00 2001 From: Till Tomczak Date: Mon, 19 May 2025 07:27:55 +0200 Subject: [PATCH] "feat: Implement new debug server components for reservation platform" --- backend/debug-server/app.py | 308 +++++++++++++++++- backend/debug-server/requirements.txt | 3 + backend/debug-server/static/css/style.css | 291 +++++++++++++++++ backend/debug-server/static/js/script.js | 306 +++++++++++++++++ backend/debug-server/templates/index.html | 150 +++++++++ .../debug-server/package.json | 1 + 6 files changed, 1058 insertions(+), 1 deletion(-) create mode 100644 backend/debug-server/requirements.txt create mode 100644 backend/debug-server/static/css/style.css create mode 100644 backend/debug-server/static/js/script.js create mode 100644 backend/debug-server/templates/index.html create mode 100644 packages/reservation-platform/debug-server/package.json diff --git a/backend/debug-server/app.py b/backend/debug-server/app.py index 0519ecba..78c73e03 100644 --- a/backend/debug-server/app.py +++ b/backend/debug-server/app.py @@ -1 +1,307 @@ - \ No newline at end of file +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from flask import Flask, render_template, jsonify +import socket +import platform +import os +import subprocess +import json +import datetime +import psutil +import netifaces + +app = Flask(__name__) +DEBUG_PORT = 5555 # Port für den Debug-Server + +@app.route('/') +def index(): + """Rendert die Hauptseite des Debug-Servers.""" + return render_template('index.html', + hostname=socket.gethostname(), + ip_address=get_ip_address(), + timestamp=datetime.datetime.now().strftime("%d.%m.%Y %H:%M:%S")) + +@app.route('/systeminfo') +def systeminfo(): + """Gibt Systeminformationen zurück.""" + info = { + "hostname": socket.gethostname(), + "platform": platform.platform(), + "architecture": platform.machine(), + "processor": platform.processor(), + "python_version": platform.python_version(), + "uptime": get_uptime(), + "memory": get_memory_info(), + "disk": get_disk_info(), + } + return jsonify(info) + +@app.route('/network') +def network(): + """Gibt Netzwerkinformationen zurück.""" + info = { + "interfaces": get_network_interfaces(), + "connections": get_active_connections(), + "dns_servers": get_dns_servers(), + "gateway": get_default_gateway(), + } + return jsonify(info) + +@app.route('/docker') +def docker(): + """Gibt Docker-Informationen zurück.""" + return jsonify(get_docker_info()) + +@app.route('/ping/') +def ping_host(host): + """Pingt einen Zielhost an und gibt das Ergebnis zurück.""" + if is_valid_hostname(host): + try: + result = subprocess.run(['ping', '-n', '4', host], + capture_output=True, text=True, timeout=10) + return jsonify({ + "success": result.returncode == 0, + "output": result.stdout, + "error": result.stderr, + "return_code": result.returncode + }) + except subprocess.TimeoutExpired: + return jsonify({"success": False, "error": "Zeitüberschreitung beim Ping-Befehl"}) + except Exception as e: + return jsonify({"success": False, "error": str(e)}) + else: + return jsonify({"success": False, "error": "Ungültiger Hostname oder IP-Adresse"}) + +@app.route('/traceroute/') +def traceroute_host(host): + """Führt einen Traceroute zum Zielhost durch und gibt das Ergebnis zurück.""" + if is_valid_hostname(host): + try: + result = subprocess.run(['tracert', host], + capture_output=True, text=True, timeout=30) + return jsonify({ + "success": True, + "output": result.stdout, + "error": result.stderr, + "return_code": result.returncode + }) + except subprocess.TimeoutExpired: + return jsonify({"success": False, "error": "Zeitüberschreitung beim Traceroute-Befehl"}) + except Exception as e: + return jsonify({"success": False, "error": str(e)}) + else: + return jsonify({"success": False, "error": "Ungültiger Hostname oder IP-Adresse"}) + +@app.route('/nslookup/') +def nslookup_host(host): + """Führt eine DNS-Abfrage für den angegebenen Host durch.""" + if is_valid_hostname(host): + try: + result = subprocess.run(['nslookup', host], + capture_output=True, text=True, timeout=10) + return jsonify({ + "success": result.returncode == 0, + "output": result.stdout, + "error": result.stderr, + "return_code": result.returncode + }) + except subprocess.TimeoutExpired: + return jsonify({"success": False, "error": "Zeitüberschreitung beim NSLookup-Befehl"}) + except Exception as e: + return jsonify({"success": False, "error": str(e)}) + else: + return jsonify({"success": False, "error": "Ungültiger Hostname oder IP-Adresse"}) + +@app.route('/backend-status') +def backend_status(): + """Überprüft den Status des Haupt-Backend-Servers.""" + try: + # Benutze den Localhost und den Port des Haupt-Backends (Standard: 5000) + backend_port = 5000 + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.settimeout(2) + result = s.connect_ex(('localhost', backend_port)) + s.close() + + return jsonify({ + "status": "online" if result == 0 else "offline", + "port": backend_port, + "error_code": result + }) + except Exception as e: + return jsonify({ + "status": "error", + "message": str(e) + }) + +# Hilfsfunktionen + +def get_ip_address(): + """Ermittelt die primäre IP-Adresse des Servers.""" + try: + # Für die lokale Netzwerk-IP + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + s.connect(("8.8.8.8", 80)) + return s.getsockname()[0] + except: + return "127.0.0.1" # Fallback auf localhost + finally: + s.close() + +def get_uptime(): + """Ermittelt die Systemlaufzeit.""" + return str(datetime.timedelta(seconds=int(psutil.boot_time()))) + +def get_memory_info(): + """Gibt Informationen über den Speicherverbrauch zurück.""" + mem = psutil.virtual_memory() + return { + "total": format_bytes(mem.total), + "used": format_bytes(mem.used), + "free": format_bytes(mem.available), + "percent": mem.percent + } + +def get_disk_info(): + """Gibt Informationen über den Festplattenspeicher zurück.""" + disk = psutil.disk_usage('/') + return { + "total": format_bytes(disk.total), + "used": format_bytes(disk.used), + "free": format_bytes(disk.free), + "percent": disk.percent + } + +def get_network_interfaces(): + """Gibt Informationen über die Netzwerkschnittstellen zurück.""" + interfaces = {} + for iface in netifaces.interfaces(): + addrs = netifaces.ifaddresses(iface) + if netifaces.AF_INET in addrs: + ipv4 = addrs[netifaces.AF_INET][0] + interfaces[iface] = { + "ip": ipv4.get('addr', ''), + "netmask": ipv4.get('netmask', ''), + "broadcast": ipv4.get('broadcast', '') + } + else: + interfaces[iface] = {"ip": "Keine IPv4-Adresse", "netmask": "", "broadcast": ""} + + return interfaces + +def get_active_connections(): + """Gibt Informationen über aktive Netzwerkverbindungen zurück.""" + connections = [] + for conn in psutil.net_connections(kind='inet'): + if conn.status == 'ESTABLISHED': + connections.append({ + "local_address": f"{conn.laddr.ip}:{conn.laddr.port}", + "remote_address": f"{conn.raddr.ip}:{conn.raddr.port}", + "status": conn.status, + "pid": conn.pid + }) + + return connections[:20] # Begrenze auf 20 Verbindungen + +def get_dns_servers(): + """Ermittelt die DNS-Server-Konfiguration.""" + dns_servers = [] + try: + if os.name == 'nt': # Windows + output = subprocess.check_output( + ['powershell', '-Command', + "Get-DnsClientServerAddress -AddressFamily IPv4 | Select-Object -ExpandProperty ServerAddresses"], + text=True) + for line in output.strip().split('\n'): + line = line.strip() + if line: + dns_servers.append(line) + else: # Linux/Unix + with open('/etc/resolv.conf', 'r') as f: + for line in f: + if line.startswith('nameserver'): + dns_servers.append(line.split()[1]) + except Exception as e: + dns_servers.append(f"Fehler: {str(e)}") + + return dns_servers + +def get_default_gateway(): + """Ermittelt das Standard-Gateway.""" + gateways = netifaces.gateways() + if 'default' in gateways and netifaces.AF_INET in gateways['default']: + return gateways['default'][netifaces.AF_INET][0] + return "Kein Standard-Gateway gefunden" + +def get_docker_info(): + """Gibt Informationen über Docker und laufende Container zurück.""" + docker_info = {"installed": False, "version": "", "containers": []} + + try: + # Prüfe, ob Docker installiert ist + version_result = subprocess.run(['docker', '--version'], + capture_output=True, text=True, timeout=5) + if version_result.returncode == 0: + docker_info["installed"] = True + docker_info["version"] = version_result.stdout.strip() + + # Hole Informationen über laufende Container + container_result = subprocess.run( + ['docker', 'ps', '--format', '{{.ID}},{{.Image}},{{.Status}},{{.Ports}},{{.Names}}'], + capture_output=True, text=True, timeout=5) + + if container_result.returncode == 0: + for line in container_result.stdout.strip().split('\n'): + if line: + parts = line.split(',') + if len(parts) >= 5: + docker_info["containers"].append({ + "id": parts[0], + "image": parts[1], + "status": parts[2], + "ports": parts[3], + "name": parts[4] + }) + except (subprocess.SubprocessError, FileNotFoundError): + pass # Docker ist nicht installiert oder nicht zugänglich + + return docker_info + +def is_valid_hostname(hostname): + """Überprüft, ob ein Hostname oder eine IP-Adresse gültig ist.""" + if len(hostname) > 255: + return False + if hostname == "localhost" or hostname == "127.0.0.1": + return True + + # Prüfe auf IP-Format + try: + socket.inet_pton(socket.AF_INET, hostname) + return True + except socket.error: + pass + + try: + socket.inet_pton(socket.AF_INET6, hostname) + return True + except socket.error: + pass + + # Prüfe auf Hostname-Format + allowed = set("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-.") + return all(c in allowed for c in hostname) and not hostname.startswith(".") + +def format_bytes(size): + """Formatiert Bytes in eine lesbare Größe.""" + power = 2**10 # 1024 + n = 0 + power_labels = {0: 'B', 1: 'KB', 2: 'MB', 3: 'GB', 4: 'TB'} + while size > power and n < 4: + size /= power + n += 1 + return f"{size:.2f} {power_labels[n]}" + +if __name__ == "__main__": + print(f"MYP Backend Debug-Server wird gestartet auf Port {DEBUG_PORT}...") + app.run(host='0.0.0.0', port=DEBUG_PORT, debug=True) \ No newline at end of file diff --git a/backend/debug-server/requirements.txt b/backend/debug-server/requirements.txt new file mode 100644 index 00000000..527e7789 --- /dev/null +++ b/backend/debug-server/requirements.txt @@ -0,0 +1,3 @@ +Flask==2.0.1 +psutil==5.9.0 +netifaces==0.11.0 \ No newline at end of file diff --git a/backend/debug-server/static/css/style.css b/backend/debug-server/static/css/style.css new file mode 100644 index 00000000..cf8c2bd1 --- /dev/null +++ b/backend/debug-server/static/css/style.css @@ -0,0 +1,291 @@ +/* Allgemeine Stile */ +:root { + --primary-color: #3498db; + --secondary-color: #2c3e50; + --background-color: #f5f7fa; + --card-color: #ffffff; + --text-color: #333333; + --border-color: #e0e0e0; + --success-color: #2ecc71; + --warning-color: #f39c12; + --danger-color: #e74c3c; + --shadow: 0 4px 6px rgba(0, 0, 0, 0.1); +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; + line-height: 1.6; + color: var(--text-color); + background-color: var(--background-color); + display: flex; + flex-direction: column; + min-height: 100vh; +} + +/* Header */ +header { + background-color: var(--primary-color); + color: white; + padding: 1rem 2rem; + box-shadow: var(--shadow); +} + +.header-content { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + max-width: 1400px; + margin: 0 auto; +} + +h1 { + font-size: 1.8rem; + margin-bottom: 0.5rem; +} + +.server-info { + display: flex; + flex-wrap: wrap; + gap: 1rem; + font-size: 0.9rem; +} + +/* Navigation */ +nav { + background-color: var(--secondary-color); + display: flex; + justify-content: center; + padding: 0.5rem 1rem; + overflow-x: auto; + white-space: nowrap; +} + +.nav-button { + background: none; + color: white; + border: none; + padding: 0.75rem 1.25rem; + margin: 0 0.25rem; + cursor: pointer; + font-size: 1rem; + border-radius: 4px; + transition: background-color 0.3s; +} + +.nav-button:hover { + background-color: rgba(255, 255, 255, 0.1); +} + +.nav-button.active { + background-color: var(--primary-color); + font-weight: bold; +} + +/* Hauptbereich */ +main { + flex: 1; + padding: 2rem; + max-width: 1400px; + margin: 0 auto; + width: 100%; +} + +.panel { + display: none; +} + +.panel.active { + display: block; +} + +h2 { + margin-bottom: 1.5rem; + color: var(--secondary-color); + border-bottom: 2px solid var(--primary-color); + padding-bottom: 0.5rem; +} + +.card-container { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 1.5rem; +} + +.card { + background-color: var(--card-color); + border-radius: 8px; + padding: 1.5rem; + box-shadow: var(--shadow); +} + +.card.full-width { + grid-column: 1 / -1; +} + +h3 { + margin-bottom: 1rem; + color: var(--secondary-color); + font-size: 1.2rem; +} + +/* Fortschrittsbalken */ +.progress-container { + margin-top: 1rem; + background-color: #f0f0f0; + border-radius: 4px; + height: 10px; + overflow: hidden; +} + +.progress-bar { + height: 100%; + background-color: var(--primary-color); + width: 0%; + transition: width 0.5s ease-in-out; +} + +/* Tool-Karten */ +.tool-card { + display: flex; + flex-direction: column; +} + +.tool-input { + display: flex; + margin-bottom: 1rem; + gap: 0.5rem; +} + +.tool-input input { + flex: 1; + padding: 0.5rem; + border: 1px solid var(--border-color); + border-radius: 4px; + font-size: 1rem; +} + +.tool-input button { + background-color: var(--primary-color); + color: white; + border: none; + padding: 0.5rem 1rem; + cursor: pointer; + border-radius: 4px; + font-size: 1rem; + transition: background-color 0.3s; +} + +.tool-input button:hover { + background-color: #2980b9; +} + +.result-box { + background-color: #f8f9fa; + border: 1px solid var(--border-color); + border-radius: 4px; + padding: 1rem; + overflow: auto; + min-height: 150px; + max-height: 300px; + font-family: 'Consolas', 'Courier New', monospace; + font-size: 0.9rem; + flex: 1; +} + +/* Tabellen */ +table { + width: 100%; + border-collapse: collapse; + margin-top: 1rem; +} + +th, td { + padding: 0.75rem; + text-align: left; + border-bottom: 1px solid var(--border-color); +} + +th { + background-color: #f0f0f0; + font-weight: bold; +} + +tr:hover { + background-color: #f8f9fa; +} + +/* Status-Anzeigen */ +.status { + display: inline-block; + padding: 0.25rem 0.5rem; + border-radius: 4px; + font-size: 0.9rem; + margin-left: 0.5rem; +} + +.status-online { + background-color: var(--success-color); + color: white; +} + +.status-offline { + background-color: var(--danger-color); + color: white; +} + +.status-warning { + background-color: var(--warning-color); + color: white; +} + +/* Footer */ +footer { + background-color: var(--secondary-color); + color: white; + text-align: center; + padding: 1rem; + margin-top: auto; + font-size: 0.9rem; +} + +footer p { + margin: 0.25rem 0; +} + +/* Responsive Design */ +@media (max-width: 768px) { + header { + padding: 1rem; + } + + .header-content { + flex-direction: column; + align-items: flex-start; + } + + .server-info { + margin-top: 1rem; + flex-direction: column; + gap: 0.5rem; + } + + main { + padding: 1rem; + } + + .card-container { + grid-template-columns: 1fr; + } + + .nav-button { + padding: 0.5rem 0.75rem; + font-size: 0.9rem; + } +} \ No newline at end of file diff --git a/backend/debug-server/static/js/script.js b/backend/debug-server/static/js/script.js new file mode 100644 index 00000000..52d909a6 --- /dev/null +++ b/backend/debug-server/static/js/script.js @@ -0,0 +1,306 @@ +// DOM-Element-Referenzen +const navButtons = document.querySelectorAll('.nav-button'); +const panels = document.querySelectorAll('.panel'); + +// Panel-Navigation +navButtons.forEach(button => { + button.addEventListener('click', () => { + const targetPanel = button.dataset.target; + + // Aktiven Button und Panel wechseln + navButtons.forEach(btn => btn.classList.remove('active')); + panels.forEach(panel => panel.classList.remove('active')); + + button.classList.add('active'); + document.getElementById(targetPanel).classList.add('active'); + }); +}); + +// Automatische Aktualisierung der Daten +const updateInterval = 10000; // 10 Sekunden + +// Initialisierung und erste Datenladung +document.addEventListener('DOMContentLoaded', () => { + // Systemdaten laden + loadSystemInfo(); + + // Netzwerkdaten laden + loadNetworkInfo(); + + // Docker-Daten laden + loadDockerInfo(); + + // Backend-Status laden + loadBackendStatus(); + + // Event-Listener für die Netzwerk-Tools + document.getElementById('ping-button').addEventListener('click', performPing); + document.getElementById('traceroute-button').addEventListener('click', performTraceroute); + document.getElementById('nslookup-button').addEventListener('click', performNSLookup); + + // Automatische Aktualisierung einrichten + setInterval(() => { + if (document.getElementById('system-panel').classList.contains('active')) { + loadSystemInfo(); + } else if (document.getElementById('network-panel').classList.contains('active')) { + loadNetworkInfo(); + } else if (document.getElementById('docker-panel').classList.contains('active')) { + loadDockerInfo(); + } else if (document.getElementById('backend-panel').classList.contains('active')) { + loadBackendStatus(); + } + }, updateInterval); +}); + +// API-Anfragen +async function fetchData(endpoint) { + try { + const response = await fetch(endpoint); + if (!response.ok) { + throw new Error(`HTTP-Fehler! Status: ${response.status}`); + } + return await response.json(); + } catch (error) { + console.error(`Fehler beim Abrufen von ${endpoint}:`, error); + return null; + } +} + +// System-Informationen laden +async function loadSystemInfo() { + const data = await fetchData('/systeminfo'); + if (!data) return; + + // Betriebssystem-Info aktualisieren + document.getElementById('platform-info').innerHTML = ` +

Plattform: ${data.platform}

+

Python Version: ${data.python_version}

+

Betriebszeit: ${data.uptime}

+ `; + + // Hardware-Info aktualisieren + document.getElementById('hardware-info').innerHTML = ` +

Prozessor: ${data.processor}

+

Architektur: ${data.architecture}

+ `; + + // Speicher-Info aktualisieren + document.getElementById('memory-info').innerHTML = ` +

Gesamt: ${data.memory.total}

+

Verwendet: ${data.memory.used} (${data.memory.percent}%)

+

Frei: ${data.memory.free}

+ `; + document.getElementById('memory-bar').style.width = `${data.memory.percent}%`; + document.getElementById('memory-bar').style.backgroundColor = getColorByPercentage(data.memory.percent); + + // Festplatten-Info aktualisieren + document.getElementById('disk-info').innerHTML = ` +

Gesamt: ${data.disk.total}

+

Verwendet: ${data.disk.used} (${data.disk.percent}%)

+

Frei: ${data.disk.free}

+ `; + document.getElementById('disk-bar').style.width = `${data.disk.percent}%`; + document.getElementById('disk-bar').style.backgroundColor = getColorByPercentage(data.disk.percent); +} + +// Netzwerk-Informationen laden +async function loadNetworkInfo() { + const data = await fetchData('/network'); + if (!data) return; + + // Netzwerkschnittstellen aktualisieren + let interfacesHTML = ''; + for (const [name, info] of Object.entries(data.interfaces)) { + interfacesHTML += ` + + + + + + + `; + } + interfacesHTML += '
SchnittstelleIP-AdresseNetzmaskeBroadcast
${name}${info.ip}${info.netmask}${info.broadcast}
'; + document.getElementById('network-interfaces').innerHTML = interfacesHTML; + + // DNS-Server aktualisieren + let dnsHTML = '
    '; + for (const server of data.dns_servers) { + dnsHTML += `
  • ${server}
  • `; + } + dnsHTML += '
'; + document.getElementById('dns-servers').innerHTML = dnsHTML; + + // Gateway aktualisieren + document.getElementById('default-gateway').innerHTML = `

${data.gateway}

`; + + // Aktive Verbindungen aktualisieren + if (data.connections && data.connections.length > 0) { + let connectionsHTML = ''; + for (const conn of data.connections) { + connectionsHTML += ` + + + + + + + `; + } + connectionsHTML += '
Lokale AdresseRemote-AdresseStatusPID
${conn.local_address}${conn.remote_address}${conn.status}${conn.pid}
'; + document.getElementById('active-connections').innerHTML = connectionsHTML; + } else { + document.getElementById('active-connections').innerHTML = '

Keine aktiven Verbindungen gefunden.

'; + } +} + +// Docker-Informationen laden +async function loadDockerInfo() { + const data = await fetchData('/docker'); + if (!data) return; + + // Docker-Status aktualisieren + if (data.installed) { + document.getElementById('docker-status').innerHTML = ` +

Installiert

+

Version: ${data.version}

+ `; + + // Container aktualisieren + if (data.containers && data.containers.length > 0) { + let containersHTML = ''; + for (const container of data.containers) { + containersHTML += ` + + + + + + + + `; + } + containersHTML += '
IDNameImageStatusPorts
${container.id}${container.name}${container.image}${container.status}${container.ports}
'; + document.getElementById('docker-containers').innerHTML = containersHTML; + } else { + document.getElementById('docker-containers').innerHTML = '

Keine laufenden Container gefunden.

'; + } + } else { + document.getElementById('docker-status').innerHTML = '

Nicht installiert

'; + document.getElementById('docker-containers').innerHTML = '

Docker ist nicht installiert oder nicht zugänglich.

'; + } +} + +// Backend-Status laden +async function loadBackendStatus() { + const data = await fetchData('/backend-status'); + if (!data) return; + + let statusHTML = ''; + if (data.status === 'online') { + statusHTML = ` +

Status: Online

+

Port: ${data.port}

+ `; + } else if (data.status === 'offline') { + statusHTML = ` +

Status: Offline

+

Port: ${data.port}

+

Fehlercode: ${data.error_code}

+ `; + } else { + statusHTML = ` +

Status: Fehler

+

Nachricht: ${data.message}

+ `; + } + document.getElementById('main-backend-status').innerHTML = statusHTML; +} + +// Netzwerk-Tools +async function performPing() { + const hostInput = document.getElementById('ping-host'); + const resultElement = document.getElementById('ping-result'); + const host = hostInput.value.trim(); + + if (!host) { + resultElement.textContent = 'Bitte geben Sie einen Hostnamen oder eine IP-Adresse ein.'; + return; + } + + resultElement.textContent = 'Ping wird ausgeführt...'; + + const data = await fetchData(`/ping/${encodeURIComponent(host)}`); + if (!data) { + resultElement.textContent = 'Fehler beim Ausführen des Ping-Befehls.'; + return; + } + + if (data.success) { + resultElement.textContent = data.output; + } else { + resultElement.textContent = `Fehler: ${data.error || 'Unbekannter Fehler'}`; + } +} + +async function performTraceroute() { + const hostInput = document.getElementById('traceroute-host'); + const resultElement = document.getElementById('traceroute-result'); + const host = hostInput.value.trim(); + + if (!host) { + resultElement.textContent = 'Bitte geben Sie einen Hostnamen oder eine IP-Adresse ein.'; + return; + } + + resultElement.textContent = 'Traceroute wird ausgeführt...'; + + const data = await fetchData(`/traceroute/${encodeURIComponent(host)}`); + if (!data) { + resultElement.textContent = 'Fehler beim Ausführen des Traceroute-Befehls.'; + return; + } + + if (data.success) { + resultElement.textContent = data.output; + } else { + resultElement.textContent = `Fehler: ${data.error || 'Unbekannter Fehler'}`; + } +} + +async function performNSLookup() { + const hostInput = document.getElementById('nslookup-host'); + const resultElement = document.getElementById('nslookup-result'); + const host = hostInput.value.trim(); + + if (!host) { + resultElement.textContent = 'Bitte geben Sie einen Hostnamen oder eine IP-Adresse ein.'; + return; + } + + resultElement.textContent = 'DNS-Abfrage wird ausgeführt...'; + + const data = await fetchData(`/nslookup/${encodeURIComponent(host)}`); + if (!data) { + resultElement.textContent = 'Fehler beim Ausführen des NSLookup-Befehls.'; + return; + } + + if (data.success) { + resultElement.textContent = data.output; + } else { + resultElement.textContent = `Fehler: ${data.error || 'Unbekannter Fehler'}`; + } +} + +// Hilfsfunktionen +function getColorByPercentage(percent) { + // Farbverlauf von Grün über Gelb nach Rot + if (percent < 70) { + return 'var(--success-color)'; + } else if (percent < 90) { + return 'var(--warning-color)'; + } else { + return 'var(--danger-color)'; + } +} \ No newline at end of file diff --git a/backend/debug-server/templates/index.html b/backend/debug-server/templates/index.html new file mode 100644 index 00000000..c5d9b26b --- /dev/null +++ b/backend/debug-server/templates/index.html @@ -0,0 +1,150 @@ + + + + + + MYP Backend Debug-Server + + + + +
+
+

MYP Backend Debug-Server

+
+ Hostname: {{ hostname }} + IP-Adresse: {{ ip_address }} + Timestamp: {{ timestamp }} +
+
+
+ + + +
+ +
+

Systeminformationen

+
+
+

Betriebssystem

+
Wird geladen...
+
+
+

Hardware

+
Wird geladen...
+
+
+

Speicher

+
Wird geladen...
+
+
+
+
+
+

Festplatte

+
Wird geladen...
+
+
+
+
+
+
+ + +
+

Netzwerkinformationen

+
+
+

Netzwerkschnittstellen

+
Wird geladen...
+
+
+

DNS Server

+
Wird geladen...
+
+
+

Standard-Gateway

+
Wird geladen...
+
+
+

Aktive Verbindungen

+
Wird geladen...
+
+
+
+ + +
+

Docker-Informationen

+
+
+

Docker-Status

+
Wird geladen...
+
+
+

Container

+
Wird geladen...
+
+
+
+ + +
+

Netzwerk-Tools

+
+
+

Ping

+
+ + +
+
Geben Sie einen Hostnamen oder eine IP-Adresse ein...
+
+ +
+

Traceroute

+
+ + +
+
Geben Sie einen Hostnamen oder eine IP-Adresse ein...
+
+ +
+

DNS-Lookup

+
+ + +
+
Geben Sie einen Hostnamen oder eine IP-Adresse ein...
+
+
+
+ + +
+

Backend-Status

+
+
+

Haupt-Backend

+
Wird geladen...
+
+
+
+
+ +
+

© 2025 MYP (Manage your Printer) | Debug-Server v1.0.0

+

Netzwerk- und Systemdiagnose-Tool

+
+ + + + \ No newline at end of file diff --git a/packages/reservation-platform/debug-server/package.json b/packages/reservation-platform/debug-server/package.json new file mode 100644 index 00000000..0519ecba --- /dev/null +++ b/packages/reservation-platform/debug-server/package.json @@ -0,0 +1 @@ + \ No newline at end of file