aboutsummaryrefslogtreecommitdiff
path: root/mx-aaaa/resolve-mx-aaaa.js
diff options
context:
space:
mode:
Diffstat (limited to 'mx-aaaa/resolve-mx-aaaa.js')
-rw-r--r--mx-aaaa/resolve-mx-aaaa.js140
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();
+};