import axios from 'axios'; import { readFileSync, writeFileSync } from 'fs'; import { fileURLToPath } from 'url'; import { dirname } from 'path'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); const fileAsns = `${__dirname}/../data/asns.csv`; const fileCidrs = `${__dirname}/../data/asns_cidrs.csv`; const fileNord = `${__dirname}/../data/ips_nord.csv`; const opts = { responseType: 'blob' }; console.log('Building data files, please wait...'); const promises = [ axios.get('https://github.com/Umkus/asn-ip/releases/download/latest/as.csv', opts).then((res) => writeFileSync(fileAsns, res.data)), axios.get('https://github.com/Umkus/asn-ip/releases/download/latest/ranges_ipv4.csv', opts).then((res) => writeFileSync(fileCidrs, res.data)), axios.get('https://github.com/Umkus/nordvpn-ips/releases/download/ips/ips.csv', opts).then((res) => writeFileSync(fileNord, res.data)), ]; const countries = readFileSync(`${__dirname}/../node_modules/@ip-location-db/asn-country/asn-country-ipv4-num.csv`).toString().split('\n') .map((row) => { const item = row.split(','); item[0] = +item[0]; item[1] = +item[1]; return item; }); const asnToCountry = []; Promise.all(promises) .then(() => { readFileSync(`${__dirname}/../data/asns_cidrs.csv`).toString().split('\n').slice(0) .forEach((row) => { const items = row.split(','); const asn = +items[0]; if (asnToCountry[asn] !== undefined || isNaN(asn)) { return false; } const start = +items[2]; const end = +items[3]; let country = ''; const foundCountry = countries.find((country) => start >= country[0] && end <= country[1]); if (foundCountry) { country = foundCountry[2]; } asnToCountry[asn] = country; }); const asnsWithCountries = readFileSync(`${__dirname}/../data/asns.csv`).toString().split('\n').slice(1) .map((row) => { if (row.length <= 2) { return row; } const item = row.split(','); const country = asnToCountry[+item[0]] || '-'; row = `${item[0]},${item[1]},${country},${item[2]}`; return row; }) .join('\n'); writeFileSync(`${__dirname}/../data/asns.csv`, asnsWithCountries); });