geoip-lite
Version:
A light weight native JavaScript implementation of GeoIP API from MaxMind
96 lines (74 loc) • 1.71 kB
JavaScript
var fs = require('fs');
var ifile = process.argv[2];
var ofile = process.argv[3];
if(!ifile || !ofile) {
console.warn("No input/output file");
process.exit();
}
var lastline = "";
function process_line(line, i, a) {
var fields = line.split(/, */);
if(fields.length < 6) {
console.log("weird line: %s::", line);
return;
}
var sip, eip, cc, b, bsz, i;
cc = fields[4].replace(/"/g, '');
if(fields[0].match(/:/)) {
// IPv6
bsz = 34;
sip = aton6(fields[0]);
eip = aton6(fields[1]);
b = new Buffer(bsz);
for(i=0; i<sip.length; i++)
b.writeUInt32(sip[i], i*4, 'big');
for(i=0; i<eip.length; i++)
b.writeUInt32(eip[i], 16+i*4, 'big');
}
else {
// IPv4
bsz = 10;
sip = parseInt(fields[2].replace(/"/g, ''), 10);
eip = parseInt(fields[3].replace(/"/g, ''), 10);
b = new Buffer(bsz);
b.writeUInt32(sip, 0, 'big');
b.writeUInt32(eip, 4, 'big');
}
b.write(cc, bsz-2);
fs.writeSync(ofd, b, 0, bsz, null);
}
function aton6(ip) {
var l, i;
ip = ip.replace(/"/g, '').split(/:/);
l = ip.length-1;
if(ip[l] === "")
ip[l] = 0;
if(l < 7) {
ip.length=8;
for(i=l; i>=0 && ip[i] !== ""; i--) {
ip[7-l+i] = ip[i];
}
}
for(i=0; i<8; i++) {
if(!ip[i])
ip[i]=0;
else
ip[i] = parseInt(ip[i], 16);
}
var r = [];
for(i=0; i<4; i++) {
r.push(((ip[2*i]<<16)+ip[2*i+1])>>>0);
}
return r;
}
function process_input(data) {
var lines = data.split(/[\r\n]+/);
lines[0] = lastline + lines[0];
lastline = lines.pop();
lines.forEach(process_line);
//console.log("wrote %d lines", lines.length);
}
var ofd = fs.openSync(ofile, "w");
var istream = fs.createReadStream(ifile);
istream.setEncoding('utf8');
istream.on('data', process_input);