const axios = require('axios'); const { JSDOM } = require('jsdom'); const WIKI_TLDS_URL = 'https://wiki.opennic.org/opennic/dot'; const CLOSEST_NIC_URL = 'https://api.opennic.org/geoip/?json=&res=4&ipv=4'; const USER_OPENNIC_NS = process.env.OPENNIC_NS; const SELECTOR = process.argv[2]; let CLOSEST_NIC = ''; if (!USER_OPENNIC_NS) { axios .get(CLOSEST_NIC_URL) .then(response => { CLOSEST_NIC = response.data[0].ip; console.log('# using the closest server: ', CLOSEST_NIC) }) .catch(error => { console.error('# Error scraping:', error); }); } const dnsmasqConfigPrerryPrint = cfg => { return cfg.map(({tld, ns}) => `server=/${tld}/${ns}`).join('\n'); }; const processWiki = response => { const { document } = new JSDOM(response.data).window; const tables = document.querySelectorAll('tbody'); const opennicNs = USER_OPENNIC_NS || CLOSEST_NIC; // First table - OpenNIC TLDs const OpenNICTLDs = Array .from(tables[0].querySelectorAll('th')) .map(row => ({ tld: row.textContent.trim().slice(1), ns: opennicNs })); const PeeredTLDs = Array .from(tables[2].querySelectorAll('tr')) .map(row => { const cells = Array.from(row.querySelectorAll('td')); const TLD = cells[0].firstChild.textContent.trim().slice(1); const NSs = cells[3].textContent.trim(); return NSs.split('\n').map(NS => ({ tld: TLD, ns: NS })); }) .reduce((acc, record) => acc.concat(record), []); const OpenNICconfig = dnsmasqConfigPrerryPrint(OpenNICTLDs); const OpenNICPeeredConfig = dnsmasqConfigPrerryPrint(PeeredTLDs) if (SELECTOR === '-opennic') { console.log(`# OpenNIC TLDs \n${OpenNICconfig}\n# ---------- \n`); } else if (SELECTOR === '-peered') { console.log(`# OpenNIC Peered TLDs \n${OpenNICPeeredConfig}\n# ---------- \n`); } else { console.log(`# OpenNIC TLDs \n\n${OpenNICconfig}\n# ---------- \n`); console.log(`# OpenNIC Peered TLDs \n${OpenNICPeeredConfig}\n# ---------- \n`); } } axios.get(WIKI_TLDS_URL) .then(processWiki) .catch(error => { console.error('# Error scraping:', error); });