/** * HexaDNS.de - DNS Tools & Server Landing Page * Main JavaScript */ // API Base URL (wird über data-attribute im HTML gesetzt) const API = document.body.dataset.api || '/api'; // Tab Switching document.querySelectorAll('.tool-tab').forEach(tab => { tab.addEventListener('click', () => { document.querySelectorAll('.tool-tab').forEach(t => t.classList.remove('active')); document.querySelectorAll('.tool-panel').forEach(p => p.classList.remove('active')); tab.classList.add('active'); document.getElementById('panel-' + tab.dataset.tool).classList.add('active'); }); }); // Enter key handlers ['dns-domain', 'prop-domain', 'whois-domain', 'ssl-domain', 'ping-domain', 'reverse-ip'].forEach(id => { const el = document.getElementById(id); if (el) { el.addEventListener('keypress', e => { if (e.key === 'Enter') { el.closest('.tool-card').querySelector('.btn').click(); } }); } }); // DNS Lookup async function dnsLookup() { const domain = document.getElementById('dns-domain').value.trim(); const results = document.getElementById('dns-results'); if (!domain) { results.innerHTML = '
Bitte Domain eingeben
'; return; } results.innerHTML = '
; Abfrage läuft...
'; try { const res = await fetch(`${API}/dns-lookup.php?domain=${encodeURIComponent(domain)}`); const data = await res.json(); if (data.error) { results.innerHTML = `
; Fehler: ${data.error}
`; return; } displayDnsResults(data); } catch (e) { results.innerHTML = `
; Netzwerkfehler: ${e.message}
`; } } function displayDnsResults(data) { const results = document.getElementById('dns-results'); let html = `
; <<>> HexaDNS Lookup <<>> ${data.domain}
`; html += `
; Abfrage um ${data.timestamp}
`; html += `
;
`; const r = data.records; if (r.A?.length) { html += `
;; A RECORDS (IPv4):
`; r.A.forEach(a => html += `
${data.domain}. ${a.ttl} IN A ${a.ip}
`); } if (r.AAAA?.length) { html += `
;; AAAA RECORDS (IPv6):
`; r.AAAA.forEach(a => html += `
${data.domain}. ${a.ttl} IN AAAA ${a.ipv6}
`); } if (r.NS?.length) { html += `
;; NS RECORDS:
`; r.NS.forEach(a => html += `
${data.domain}. ${a.ttl} IN NS ${a.target}
`); } if (r.MX?.length) { html += `
;; MX RECORDS:
`; r.MX.forEach(a => html += `
${data.domain}. ${a.ttl} IN MX ${a.priority} ${a.target}
`); } if (r.TXT?.length) { html += `
;; TXT RECORDS:
`; r.TXT.forEach(a => html += `
${data.domain}. ${a.ttl} IN TXT "${a.txt}"
`); } if (r.CNAME?.length) { html += `
;; CNAME RECORDS:
`; r.CNAME.forEach(a => html += `
${data.domain}. ${a.ttl} IN CNAME ${a.target}
`); } if (r.SOA?.length) { html += `
;; SOA RECORD:
`; r.SOA.forEach(a => html += `
${data.domain}. ${a.ttl} IN SOA ${a.mname} ${a.rname} ${a.serial}
`); } html += `
`; html += `
;; Query time: ${data.query_time_ms} msec
`; html += `
;; WHEN: ${data.timestamp}
`; results.innerHTML = html; } // Propagation Check async function propagationCheck() { const domain = document.getElementById('prop-domain').value.trim(); const type = document.getElementById('prop-type').value; const results = document.getElementById('prop-results'); const status = document.getElementById('prop-status'); const progress = document.getElementById('prop-progress'); if (!domain) { status.innerHTML = 'Bitte Domain eingeben'; return; } results.innerHTML = ''; status.innerHTML = ''; progress.style.display = 'block'; document.getElementById('prop-progress-fill').style.width = '30%'; try { const res = await fetch(`${API}/dns-propagation.php?domain=${encodeURIComponent(domain)}&type=${type}`); document.getElementById('prop-progress-fill').style.width = '100%'; setTimeout(() => progress.style.display = 'none', 500); const data = await res.json(); if (data.error) { status.innerHTML = `${data.error}`; return; } const ps = data.propagation_status; const color = ps.percentage === 100 ? 'var(--success)' : ps.percentage > 50 ? 'var(--warning)' : 'var(--error)'; status.innerHTML = `
${ps.percentage}%
propagiert (${ps.servers_responding}/${ps.total_servers} Server)
`; results.innerHTML = data.servers.map(s => `

${s.server}

${s.ip} • ${s.location}
${s.records.length ? s.records.join('
') : 'Keine Records'}
${s.response_time}ms
`).join(''); } catch (e) { progress.style.display = 'none'; status.innerHTML = `Fehler: ${e.message}`; } } // WHOIS Lookup async function whoisLookup() { const domain = document.getElementById('whois-domain').value.trim(); const results = document.getElementById('whois-results'); const raw = document.getElementById('whois-raw'); if (!domain) { results.innerHTML = '

Fehler

Bitte Domain eingeben

'; return; } results.innerHTML = '

Laden...

WHOIS-Daten werden abgefragt...

'; raw.innerHTML = ''; try { const res = await fetch(`${API}/whois-lookup.php?domain=${encodeURIComponent(domain)}`); const data = await res.json(); if (data.error) { results.innerHTML = `

Fehler

${data.error}

`; return; } const p = data.whois.parsed; results.innerHTML = `

Domain

${p.domain_name}

${p.registrar ? `

Registrar

${p.registrar}

` : ''} ${p.creation_date ? `

Registriert

${p.creation_date}

` : ''} ${p.expiration_date ? `

Läuft ab

${p.expiration_date}

` : ''} ${p.updated_date ? `

Aktualisiert

${p.updated_date}

` : ''} ${p.nameservers?.length ? `

Nameserver

${p.nameservers.join('
')}

` : ''} ${p.dnssec ? `

DNSSEC

${p.dnssec}

` : ''} `; raw.innerHTML = `
${data.whois.raw.replace(/`;
    } catch (e) {
        results.innerHTML = `

Fehler

${e.message}

`; } } // SSL Check async function sslCheck() { const domain = document.getElementById('ssl-domain').value.trim(); const results = document.getElementById('ssl-results'); if (!domain) { results.innerHTML = '

Fehler

Bitte Domain eingeben

'; return; } results.innerHTML = '

Laden...

SSL-Zertifikat wird geprüft...

'; try { const res = await fetch(`${API}/ssl-check.php?domain=${encodeURIComponent(domain)}`); const data = await res.json(); const ssl = data.ssl; if (!ssl.has_ssl) { results.innerHTML = `

Kein SSL

${ssl.error || 'Kein SSL-Zertifikat gefunden'}

`; return; } const cert = ssl.certificate; const statusClass = ssl.is_valid ? (cert.days_until_expiry <= 30 ? 'warning' : 'success') : 'error'; results.innerHTML = `

Status

${ssl.is_valid ? (cert.is_expired ? '❌ Abgelaufen' : '✅ Gültig') : '❌ Ungültig'}

Domain

${cert.subject?.common_name || domain}

Aussteller

${cert.issuer?.organization || cert.issuer?.common_name || '-'}

Gültig ab

${cert.valid_from}

Gültig bis

${cert.valid_to}
${cert.days_until_expiry} Tage verbleibend

Algorithmus

${cert.signature_algorithm || '-'}

${cert.san_domains?.length ? `

Alternative Namen

${cert.san_domains.slice(0,5).join('
')}${cert.san_domains.length > 5 ? `
+${cert.san_domains.length-5} weitere` : ''}

` : ''} `; } catch (e) { results.innerHTML = `

Fehler

${e.message}

`; } } // Ping Check async function pingCheck() { const domain = document.getElementById('ping-domain').value.trim(); const results = document.getElementById('ping-results'); if (!domain) { results.innerHTML = '

Fehler

Bitte Domain eingeben

'; return; } results.innerHTML = '

Laden...

Verfügbarkeit wird geprüft...

'; try { const res = await fetch(`${API}/ping-check.php?domain=${encodeURIComponent(domain)}`); const data = await res.json(); const r = data.results; const statusColors = { online: 'success', partial: 'warning', dns_only: 'warning', offline: 'error' }; const statusText = { online: '✅ Online', partial: '⚠️ Teilweise erreichbar', dns_only: '⚠️ Nur DNS', offline: '❌ Offline' }; results.innerHTML = `

Status

${statusText[r.overall_status]}

DNS

${r.dns_resolution.resolved ? `✅ ${r.dns_resolution.ip}` : '❌ Nicht auflösbar'}
${r.dns_resolution.response_time_ms}ms

HTTPS (443)

${r.https.reachable ? `✅ Status ${r.https.status_code}` : '❌ Nicht erreichbar'}
${r.https.response_time_ms}ms

HTTP (80)

${r.http.reachable ? `✅ Status ${r.http.status_code}` : '❌ Nicht erreichbar'}
${r.http.response_time_ms}ms

ICMP Ping

${r.icmp_ping.reachable ? `✅ ${r.icmp_ping.response_time_ms}ms` : '⚠️ Nicht verfügbar'}
Packet Loss: ${r.icmp_ping.packet_loss ?? '-'}%

${r.https.server ? `

Server

${r.https.server}

` : ''} `; } catch (e) { results.innerHTML = `

Fehler

${e.message}

`; } } // Reverse DNS async function reverseLookup() { const ip = document.getElementById('reverse-ip').value.trim(); const results = document.getElementById('reverse-results'); if (!ip) { results.innerHTML = '

Fehler

Bitte IP-Adresse eingeben

'; return; } results.innerHTML = '

Laden...

Reverse Lookup wird durchgeführt...

'; try { const res = await fetch(`${API}/reverse-dns.php?ip=${encodeURIComponent(ip)}`); const data = await res.json(); if (data.error) { results.innerHTML = `

Fehler

${data.error}

`; return; } const r = data.result; results.innerHTML = `

IP-Adresse

${data.ip}
${data.ip_version}

Hostname

${r.hostname || 'Kein PTR-Record gefunden'}

${r.forward_verified !== undefined ? `

Forward-Check

${r.forward_verified ? '✅ Verifiziert' : '⚠️ Nicht verifiziert'}

` : ''}

IP-Typ

${r.ip_info?.type || '-'}

${r.additional_info?.provider ? `

Provider

${r.additional_info.provider}

` : ''} `; } catch (e) { results.innerHTML = `

Fehler

${e.message}

`; } } // Network Animation (function() { const canvas = document.getElementById('networkCanvas'); if (!canvas) return; const ctx = canvas.getContext('2d'); let width, height, particles = []; const particleCount = 40; function init() { resize(); particles = []; for (let i = 0; i < particleCount; i++) { particles.push({ x: Math.random() * width, y: Math.random() * height, vx: (Math.random() - 0.5) * 0.3, vy: (Math.random() - 0.5) * 0.3, r: Math.random() * 2 + 1 }); } } function resize() { width = canvas.width = window.innerWidth; height = canvas.height = window.innerHeight; } function animate() { ctx.clearRect(0, 0, width, height); particles.forEach((p, i) => { p.x += p.vx; p.y += p.vy; if (p.x < 0 || p.x > width) p.vx *= -1; if (p.y < 0 || p.y > height) p.vy *= -1; ctx.beginPath(); ctx.arc(p.x, p.y, p.r, 0, Math.PI * 2); ctx.fillStyle = 'rgba(255,81,249,0.4)'; ctx.fill(); for (let j = i + 1; j < particles.length; j++) { const p2 = particles[j]; const dx = p.x - p2.x; const dy = p.y - p2.y; const dist = Math.sqrt(dx * dx + dy * dy); if (dist < 120) { ctx.beginPath(); ctx.moveTo(p.x, p.y); ctx.lineTo(p2.x, p2.y); ctx.strokeStyle = `rgba(0,207,255,${(1 - dist / 120) * 0.2})`; ctx.stroke(); } } }); requestAnimationFrame(animate); } window.addEventListener('resize', resize); init(); animate(); })();