opennic2dnsmasq/index.js

70 lines
2.1 KiB
JavaScript
Raw Normal View History

2024-06-05 00:42:16 +03:00
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);
});