Files
YellowLabTools/lib/tools/redownload/cdnDetector/generateIPList.js
T

71 lines
1.9 KiB
JavaScript

var http = require('https');
var zlib = require('zlib');
var fs = require('fs');
var CDN_ASN_LIST = {
13335: 'Cloudflare',
15133: 'Verizon',
16625: 'Akamai',
20446: 'StackPath',
20940: 'Akamai',
22822: 'Limelight',
54113: 'Fastly'
};
// Downloads a file and ungzip ip directly
function getGzipped(url, callback) {
var buffer = [];
http.get(url, function(res) {
var gunzip = zlib.createGunzip();
res.pipe(gunzip);
gunzip.on('data', function(data) {
buffer.push(data.toString())
}).on('end', function() {
callback(null, buffer.join(''));
}).on('error', function(e) {
callback(e);
})
}).on('error', function(e) {
callback(e)
});
}
// File provided here: https://iptoasn.com/
console.log('Start downloading the file...');
getGzipped('https://iptoasn.com/data/ip2asn-v4.tsv.gz', function(err, data) {
if (err) {
console.log(err);
return;
}
console.log('Download complete, let\'s start parsing...');
parseFile(data);
});
// Parse the CSV formated file and grag only the interesting IP ranges
function parseFile(data) {
var results = [];
var allTextLines = data.split(/\r\n|\n/);
for (var i = 0; i < allTextLines.length; i++) {
var lineData = allTextLines[i].split('\t');
var cdnName = CDN_ASN_LIST[lineData[2]];
if (cdnName) {
// We found an ASN number from our list. Let's save it!
results.push({
rangeStart: lineData[0],
rangeEnd: lineData[1],
cdn: cdnName
});
}
}
console.log('%d IP ranges found', results.length);
var outputFile = __dirname + '/cdn-ip-list.json';
fs.writeFileSync(outputFile, JSON.stringify(results, null, 2));
console.log('File saved here: %s', outputFile);
}