// DNS Things - DNS Tools Module // Initialize IP display functionality async function initIPDisplay() { const ipv4Element = document.getElementById('ipv4'); const ipv6Element = document.getElementById('ipv6'); if (!ipv4Element || !ipv6Element) return; try { // Fetch IPv4 const ipv4Response = await fetch('https://api.ipify.org?format=json'); const ipv4Data = await ipv4Response.json(); ipv4Element.textContent = ipv4Data.ip; } catch (error) { ipv4Element.textContent = 'Unable to fetch'; console.error('Error fetching IPv4:', error); } try { // Fetch IPv6 const ipv6Response = await fetch('https://api64.ipify.org?format=json'); const ipv6Data = await ipv6Response.json(); ipv6Element.textContent = ipv6Data.ip; } catch (error) { ipv6Element.textContent = 'Not available'; console.error('Error fetching IPv6:', error); } } // Initialize DNS lookup form function initDNSForm() { const form = document.getElementById('dns-form'); const input = document.getElementById('domain-input'); const results = document.getElementById('dns-results-container'); const loader = document.getElementById('dns-loader'); if (!form || !input || !results || !loader) return; form.addEventListener('submit', async (e) => { e.preventDefault(); const domain = input.value.trim(); if (!domain) return; // Show loader loader.classList.remove('hidden'); results.innerHTML = ''; try { // DNS record types to query const recordTypes = ['A', 'AAAA', 'MX', 'TXT', 'NS', 'CNAME', 'SOA', 'PTR', 'SRV']; // Create promises for all DNS queries const queries = recordTypes.map(type => fetch(`https://dns.google/resolve?name=${encodeURIComponent(domain)}&type=${type}`) .then(response => response.json()) .then(data => ({ type, data })) .catch(error => ({ type, error })) ); // Wait for all queries to complete const responses = await Promise.all(queries); // Group results by record type const groupedResults = {}; responses.forEach(({ type, data, error }) => { if (error) { console.error(`Error fetching ${type} records:`, error); return; } if (data.Answer && data.Answer.length > 0) { groupedResults[type] = data.Answer.map(record => { // Clean the record data let cleanData = record.data; if (typeof cleanData === 'string') { cleanData = cleanData.replace(/^"(.*)"$/, '$1').replace(/\.$/, ''); } return { ...record, data: cleanData }; }); } }); // Display results if (Object.keys(groupedResults).length === 0) { results.innerHTML = `

No DNS records found

The domain "${domain}" does not have any DNS records or does not exist.

`; } else { let resultsHTML = '
'; Object.entries(groupedResults).forEach(([type, records]) => { resultsHTML += `

${type} Records (${records.length})

'; }); resultsHTML += '
'; results.innerHTML = resultsHTML; } } catch (error) { console.error('DNS lookup error:', error); results.innerHTML = `

Error

Failed to perform DNS lookup. Please try again.

`; } finally { loader.classList.add('hidden'); } }); // Auto-submit on paste input.addEventListener('paste', () => { setTimeout(() => { if (input.value.trim()) { form.dispatchEvent(new Event('submit')); } }, 100); }); } // Initialize reverse DNS lookup form function initReverseDNSForm() { const form = document.getElementById('reverse-dns-form'); const input = document.getElementById('ip-input'); const results = document.getElementById('reverse-dns-results'); const loader = document.getElementById('reverse-dns-loader'); if (!form || !input || !results || !loader) return; // IPv6 reverse DNS helper function ipv6ToReverseDNS(ipv6) { // Expand IPv6 to full format let expanded = ipv6; if (ipv6.includes('::')) { const parts = ipv6.split('::'); const left = parts[0] ? parts[0].split(':') : []; const right = parts[1] ? parts[1].split(':') : []; const middle = new Array(8 - left.length - right.length).fill('0000'); expanded = left.concat(middle).concat(right).join(':'); } // Remove colons and pad each segment to 4 characters const fullHex = expanded.split(':').map(segment => segment.padStart(4, '0') ).join(''); // Reverse and add dots return fullHex.split('').reverse().join('.') + '.ip6.arpa'; } form.addEventListener('submit', async (e) => { e.preventDefault(); const ip = input.value.trim(); if (!ip) return; // Show loader loader.classList.remove('hidden'); results.innerHTML = ''; try { let reverseDomain; // Check if IPv4 or IPv6 if (ip.includes(':')) { // IPv6 try { reverseDomain = ipv6ToReverseDNS(ip); } catch (error) { throw new Error('Invalid IPv6 address format'); } } else { // IPv4 const parts = ip.split('.'); if (parts.length !== 4 || parts.some(part => isNaN(part) || part < 0 || part > 255)) { throw new Error('Invalid IPv4 address format'); } reverseDomain = parts.reverse().join('.') + '.in-addr.arpa'; } // Perform reverse DNS lookup const response = await fetch(`https://dns.google/resolve?name=${encodeURIComponent(reverseDomain)}&type=PTR`); const data = await response.json(); if (data.Answer && data.Answer.length > 0) { let resultsHTML = '
'; data.Answer.forEach(record => { const hostname = record.data.replace(/\.$/, ''); resultsHTML += `
Hostname found:
${hostname}
`; }); resultsHTML += '
'; results.innerHTML = resultsHTML; } else { results.innerHTML = `

No reverse DNS record found

The IP address "${ip}" does not have a reverse DNS (PTR) record.

`; } } catch (error) { console.error('Reverse DNS lookup error:', error); results.innerHTML = `

Error

${error.message || 'Failed to perform reverse DNS lookup. Please check the IP address format.'}

`; } finally { loader.classList.add('hidden'); } }); // Auto-submit on paste input.addEventListener('paste', () => { setTimeout(() => { if (input.value.trim()) { form.dispatchEvent(new Event('submit')); } }, 100); }); }