diff options
Diffstat (limited to 'mx-aaaa/resolve-mx-aaaa.js')
-rw-r--r-- | mx-aaaa/resolve-mx-aaaa.js | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/mx-aaaa/resolve-mx-aaaa.js b/mx-aaaa/resolve-mx-aaaa.js new file mode 100644 index 0000000..870626a --- /dev/null +++ b/mx-aaaa/resolve-mx-aaaa.js @@ -0,0 +1,140 @@ +import {parseList, ResolveMXAAAA} from './modules/mx-aaaa.js'; + +const rt_status = document.getElementById('status'); +const rt_cardHolder = document.getElementById('card-holder'); +const rt_output = document.getElementById('output'); +const i_txtlist = document.getElementById('txtlist'); +const rt_hlist = document.getElementById('hlist'); + +function onresolvereducer (what, obj, map) { + try { + const cnt_mx = map.mxmap[obj.domain].mx.length; + const cnt_a = map.mxmap[obj.domain].acnt; + const cnt_aaaa = map.mxmap[obj.domain].aaaacnt; + + function determineCard () { + if (cnt_mx === 0) { + return; + } + else if ((cnt_a > 0 && cnt_mx !== cnt_a) || + (cnt_aaaa > 0 && cnt_mx !== cnt_aaaa)) + { + return ['redDomainCard', 'some mx missing']; + } + else if (cnt_aaaa > 0) { + if (cnt_a > 0) { + return ['greenDomainCard', 'dual stack']; + } + else { + return ['magentaDomainCard', 'ipv6 only']; + } + } + else if (cnt_a > 0) { + return ['yellowDomainCard', 'ipv4 only']; + } + else { + return ['redDomainCard', 'no a or aaaa']; + } + } + + const cardId = `resolve-mx-card-${obj.domain}`; + const card = document.getElementById(cardId); + const statusLine = card.getElementsByClassName('domainStatus')[0]; + + statusLine.innerText = `mx: ${cnt_mx}, a: ${cnt_a}, aaaa: ${cnt_aaaa}`; + switch (what) { + case 'a': + case 'aaaa': + const d = determineCard(); + if (d) { + card.classList = `domainCard ${d[0]}`; + statusLine.innerText += ` (${d[1]})`; + } + break; + } + + } + catch (e) { + console.error(e); + } + finally { + rt_output.innerText += what + ': ' + JSON.stringify(obj) + '\n'; + } +} + +function initCards (list) { + for (const domain of list) { + const subtitle = document.createElement('p'); + subtitle.className = 'domainSubtitle'; + subtitle.innerText = domain; + + const statusLine = document.createElement('span'); + statusLine.className = 'domainStatus'; + statusLine.innerText = 'mx: 0, a: 0, aaaa: 0 (pending)'; + + const card = document.createElement('div'); + card.classList = 'domainCard redDomainCard'; + card.id = `resolve-mx-card-${domain}`; + + rt_cardHolder.appendChild(card); + card.appendChild(subtitle); + card.appendChild(statusLine); + } +} + +new Promise(async function () { + let progressCounter = 0; + function doProgressRender () { + const dots = '.'.repeat(progressCounter); + + rt_status.innerText = 'in progress ' + dots; + progressCounter = (progressCounter + 1) % 4; + } + + doProgressRender(); + const progressRenderTimer = setInterval(doProgressRender, 500); + + try { + let txt = localStorage.getItem("domains"); + + if (txt) { + i_txtlist.innerText = txt; + rt_hlist.innerText = 'List *(from localStorage)'; + } + else { + const rsp = await fetch('./domains.txt'); + i_txtlist.innerText = txt = await rsp.text(); + rt_hlist.innerText = 'List'; + } + + const list = parseList(txt); + const m = new ResolveMXAAAA(onresolvereducer); + + initCards(list); + + const result = await m.doResolve(list); + const percent = (result.counts.has_aaaa / result.counts.mx * 100).toFixed(2); + + rt_status.innerText = `SUCCESS: ${result.counts.has_aaaa} of ${result.counts.mx} service providers have AAAA (${percent}%)`; + rt_output.innerText += '\n'; + rt_output.innerText += JSON.stringify(result, null, '\t'); + } + catch (e) { + rt_status.innerText = "ERROR: " + e; + throw e; + } + finally { + clearInterval(progressRenderTimer); + } +}); + + +document.getElementById('btn-listapply').onclick = function () { + localStorage.setItem("domains", i_txtlist.innerText); + location.reload(); +}; + +document.getElementById('btn-listreset').onclick = function () { + localStorage.removeItem("domains"); + location.reload(); +}; |