/** * 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
WHOIS-Daten werden abgefragt...
${data.error}
${p.domain_name}
${p.registrar}
${p.creation_date}
${p.expiration_date}
${p.updated_date}
${p.nameservers.join('
')}
${p.dnssec}
${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();
})();