// DOM-Element-Referenzen const navButtons = document.querySelectorAll('.nav-button'); const panels = document.querySelectorAll('.panel'); // Panel-Navigation navButtons.forEach(button => { button.addEventListener('click', () => { const panelId = button.getAttribute('data-panel'); // 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(panelId).classList.add('active'); // Lade Panel-Daten, wenn sie noch nicht geladen wurden if (panelId === 'system' && document.getElementById('system-container').style.display === 'none') { loadSystemInfo(); } else if (panelId === 'network' && document.getElementById('network-container').style.display === 'none') { loadNetworkInfo(); } else if (panelId === 'services' && document.getElementById('services-container').style.display === 'none') { loadServicesInfo(); } }); }); // API-Anfragen async function fetchData(endpoint) { try { const response = await fetch(endpoint); if (!response.ok) { throw new Error(`HTTP-Fehler: ${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 loader = document.getElementById('system-loader'); const container = document.getElementById('system-container'); loader.style.display = 'block'; container.style.display = 'none'; const data = await fetchData('/api/system'); if (!data) { loader.textContent = 'Fehler beim Laden der Systemdaten'; return; } // Betriebssystem-Info document.getElementById('os-info').innerHTML = `

Plattform: ${data.os.platform}

Distribution: ${data.os.distro}

Version: ${data.os.release}

Architektur: ${data.os.arch}

Betriebszeit: ${data.os.uptime}

`; // CPU-Info document.getElementById('cpu-info').innerHTML = `

Hersteller: ${data.cpu.manufacturer}

Modell: ${data.cpu.brand}

Geschwindigkeit: ${data.cpu.speed} GHz

Kerne: ${data.cpu.cores} (${data.cpu.physicalCores} physisch)

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

Gesamt: ${data.memory.total}

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

Frei: ${data.memory.free}

`; document.getElementById('memory-bar').style.width = `${data.memory.usedPercent}%`; document.getElementById('memory-bar').style.backgroundColor = getColorByPercentage(data.memory.usedPercent); // Festplatten-Info let diskHTML = ''; data.filesystem.forEach(fs => { diskHTML += ` `; }); diskHTML += '
LaufwerkTypGrößeVerwendetVerfügbarNutzung
${fs.mount} ${fs.type} ${fs.size} ${fs.used} ${fs.available}
${fs.usePercent}%
'; document.getElementById('disk-info').innerHTML = diskHTML; // UI anzeigen loader.style.display = 'none'; container.style.display = 'grid'; } // Netzwerk-Informationen laden async function loadNetworkInfo() { const loader = document.getElementById('network-loader'); const container = document.getElementById('network-container'); loader.style.display = 'block'; container.style.display = 'none'; const data = await fetchData('/api/network'); if (!data) { loader.textContent = 'Fehler beim Laden der Netzwerkdaten'; return; } // Netzwerkschnittstellen let interfacesHTML = ''; data.interfaces.forEach(iface => { interfacesHTML += ` `; }); interfacesHTML += '
NameStatusIPv4IPv6MACTypDHCP
${iface.iface} ${iface.operstate} ${iface.ip4 || '-'} ${iface.ip6 || '-'} ${iface.mac || '-'} ${iface.type || '-'} ${iface.dhcp ? 'Ja' : 'Nein'}
'; document.getElementById('network-interfaces').innerHTML = interfacesHTML; // DNS-Server let dnsHTML = ''; document.getElementById('dns-servers').innerHTML = dnsHTML; // Gateway document.getElementById('default-gateway').innerHTML = `

${data.gateway || 'Nicht verfügbar'}

`; // Netzwerkstatistiken let statsHTML = ''; data.stats.forEach(stat => { statsHTML += ` `; }); statsHTML += '
SchnittstelleEmpfangenGesendetEmpfangen/sGesendet/s
${stat.iface} ${stat.rx_bytes} ${stat.tx_bytes} ${stat.rx_sec} ${stat.tx_sec}
'; document.getElementById('network-stats').innerHTML = statsHTML; // UI anzeigen loader.style.display = 'none'; container.style.display = 'grid'; } // Dienst-Informationen laden async function loadServicesInfo() { const loader = document.getElementById('services-loader'); const container = document.getElementById('services-container'); loader.style.display = 'block'; container.style.display = 'none'; const data = await fetchData('/api/services'); if (!data) { loader.textContent = 'Fehler beim Laden der Dienstdaten'; return; } // Frontend-Status document.getElementById('frontend-status').innerHTML = `

Status: ${data.frontend.status}

Name: ${data.frontend.name}

Host: ${data.frontend.host}

Port: ${data.frontend.port}

`; // Backend-Status document.getElementById('backend-status').innerHTML = `

Status: ${data.backend.status}

Name: ${data.backend.name}

Host: ${data.backend.host}

Port: ${data.backend.port}

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

Keine Docker-Container gefunden

'; } // UI anzeigen loader.style.display = 'none'; container.style.display = 'grid'; } // Netzwerk-Tools document.getElementById('ping-button').addEventListener('click', async () => { const hostInput = document.getElementById('ping-host'); const resultBox = document.getElementById('ping-result'); const host = hostInput.value.trim(); if (!host) { resultBox.textContent = 'Bitte geben Sie einen Hostnamen oder eine IP-Adresse ein'; return; } resultBox.textContent = 'Ping wird ausgeführt...'; const data = await fetchData(`/api/ping/${encodeURIComponent(host)}`); if (!data) { resultBox.textContent = 'Fehler beim Ausführen des Ping-Befehls'; return; } resultBox.textContent = data.output || data.error || 'Keine Ausgabe'; }); document.getElementById('traceroute-button').addEventListener('click', async () => { const hostInput = document.getElementById('traceroute-host'); const resultBox = document.getElementById('traceroute-result'); const host = hostInput.value.trim(); if (!host) { resultBox.textContent = 'Bitte geben Sie einen Hostnamen oder eine IP-Adresse ein'; return; } resultBox.textContent = 'Traceroute wird ausgeführt...'; const data = await fetchData(`/api/traceroute/${encodeURIComponent(host)}`); if (!data) { resultBox.textContent = 'Fehler beim Ausführen des Traceroute-Befehls'; return; } resultBox.textContent = data.output || data.error || 'Keine Ausgabe'; }); document.getElementById('nslookup-button').addEventListener('click', async () => { const hostInput = document.getElementById('nslookup-host'); const resultBox = document.getElementById('nslookup-result'); const host = hostInput.value.trim(); if (!host) { resultBox.textContent = 'Bitte geben Sie einen Hostnamen oder eine IP-Adresse ein'; return; } resultBox.textContent = 'DNS-Abfrage wird ausgeführt...'; const data = await fetchData(`/api/nslookup/${encodeURIComponent(host)}`); if (!data) { resultBox.textContent = 'Fehler beim Ausführen des NSLookup-Befehls'; return; } resultBox.textContent = data.output || data.error || 'Keine Ausgabe'; }); // Echtzeit-Monitoring mit WebSockets const socket = io(); // CPU- und RAM-Statistiken socket.on('system-stats', data => { // CPU-Anzeige aktualisieren const cpuPercentage = data.cpu.load; document.getElementById('cpu-percentage').textContent = `${cpuPercentage}%`; document.getElementById('cpu-gauge').style.height = `${cpuPercentage}%`; document.getElementById('cpu-gauge').style.backgroundColor = getColorByPercentage(cpuPercentage); // CPU-Kerne anzeigen const cpuCoresContainer = document.getElementById('cpu-cores-container'); if (cpuCoresContainer.childElementCount === 0) { // Erstelle Kern-Anzeigen, falls sie noch nicht existieren data.cpu.cores.forEach((load, index) => { const coreElement = document.createElement('div'); coreElement.className = 'cpu-core'; coreElement.innerHTML = `
Kern ${index} ${load}%
`; cpuCoresContainer.appendChild(coreElement); }); } else { // Aktualisiere bestehende Kern-Anzeigen data.cpu.cores.forEach((load, index) => { const valueElement = document.getElementById(`cpu-core-${index}-value`); const fillElement = document.getElementById(`cpu-core-${index}-fill`); if (valueElement && fillElement) { valueElement.textContent = `${load}%`; fillElement.style.width = `${load}%`; fillElement.style.backgroundColor = getColorByPercentage(load); } }); } // RAM-Anzeige aktualisieren const memPercentage = data.memory.usedPercent; document.getElementById('memory-percentage').textContent = `${memPercentage}%`; document.getElementById('memory-gauge').style.height = `${memPercentage}%`; document.getElementById('memory-gauge').style.backgroundColor = getColorByPercentage(memPercentage); document.getElementById('memory-details').innerHTML = `

Gesamt: ${formatBytes(data.memory.total)}

Verwendet: ${formatBytes(data.memory.used)}

Frei: ${formatBytes(data.memory.free)}

`; }); // Netzwerkstatistiken let networkChart; socket.on('network-stats', data => { const networkThroughput = document.getElementById('network-throughput'); let throughputHTML = ''; data.stats.forEach(stat => { throughputHTML += `
${stat.iface}: ↓ ${formatBytes(stat.rx_sec)}/s | ↑ ${formatBytes(stat.tx_sec)}/s
`; }); networkThroughput.innerHTML = throughputHTML; // Aktualisiere oder erstelle Netzwerk-Chart updateNetworkChart(data.stats); }); // Netzwerk-Chart initialisieren oder aktualisieren function updateNetworkChart(stats) { const ctx = document.getElementById('network-chart').getContext('2d'); if (!networkChart) { // Chart initialisieren, wenn er noch nicht existiert const labels = []; const rxData = []; const txData = []; // Fülle anfängliche Daten for (let i = 0; i < 20; i++) { labels.push(''); rxData.push(0); txData.push(0); } networkChart = new Chart(ctx, { type: 'line', data: { labels: labels, datasets: [ { label: 'Empfangen (Bytes/s)', data: rxData, borderColor: '#3f51b5', backgroundColor: 'rgba(63, 81, 181, 0.1)', borderWidth: 2, tension: 0.2, fill: true }, { label: 'Gesendet (Bytes/s)', data: txData, borderColor: '#f44336', backgroundColor: 'rgba(244, 67, 54, 0.1)', borderWidth: 2, tension: 0.2, fill: true } ] }, options: { responsive: true, maintainAspectRatio: false, scales: { y: { beginAtZero: true, ticks: { callback: function(value) { return formatBytes(value, 0); } } } }, animation: { duration: 300 } } }); } else { // Chart aktualisieren let rxTotal = 0; let txTotal = 0; stats.forEach(stat => { rxTotal += stat.rx_sec || 0; txTotal += stat.tx_sec || 0; }); // Füge neue Daten hinzu und entferne alte networkChart.data.labels.push(''); networkChart.data.labels.shift(); networkChart.data.datasets[0].data.push(rxTotal); networkChart.data.datasets[0].data.shift(); networkChart.data.datasets[1].data.push(txTotal); networkChart.data.datasets[1].data.shift(); networkChart.update(); } } // 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)'; } } function formatBytes(bytes, decimals = 2) { if (bytes === 0) return '0 B'; const k = 1024; const sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB']; const i = Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(decimals)) + ' ' + sizes[i]; } // Initialisierung document.addEventListener('DOMContentLoaded', () => { // Zeit aktualisieren setInterval(() => { document.getElementById('current-time').innerHTML = `Zeitstempel: ${new Date().toLocaleString('de-DE')}`; }, 1000); // Lade Systemdaten, wenn das System-Panel aktiv ist if (document.getElementById('system').classList.contains('active')) { loadSystemInfo(); } // Lade Script für Netzwerk-Chart, falls noch nicht geladen if (typeof Chart === 'undefined') { const script = document.createElement('script'); script.src = 'https://cdn.jsdelivr.net/npm/chart.js'; script.onload = () => { console.log('Chart.js geladen'); }; document.head.appendChild(script); } });