mirror of
https://github.com/abrendan/l00kup.git
synced 2025-06-16 12:45:05 +02:00
160 lines
4.7 KiB
JavaScript
160 lines
4.7 KiB
JavaScript
// Generated by CoffeeScript 1.9.3
|
|
(function() {
|
|
var _, net, optimist, punycode, util;
|
|
|
|
_ = require('underscore');
|
|
|
|
net = require('net');
|
|
|
|
punycode = require('punycode');
|
|
|
|
util = require('util');
|
|
|
|
this.SERVERS = require('./servers.json');
|
|
|
|
this.lookup = (function(_this) {
|
|
return function(addr, options, done) {
|
|
var data, parts, server, socket, tld;
|
|
if (typeof done === 'undefined' && typeof options === 'function') {
|
|
done = options;
|
|
options = {};
|
|
}
|
|
_.defaults(options, {
|
|
follow: 2
|
|
});
|
|
done = _.once(done);
|
|
server = options.server;
|
|
if (!server) {
|
|
switch (true) {
|
|
case _.contains(addr, ':'):
|
|
done(new Error('lookup: IPv6 not supported'));
|
|
return;
|
|
case _.contains(addr, '@'):
|
|
done(new Error('lookup: email addresses not supported'));
|
|
return;
|
|
case (addr.match(/^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/)) != null:
|
|
server = _this.SERVERS['_']['ipv4'];
|
|
break;
|
|
default:
|
|
tld = punycode.toASCII(addr);
|
|
while (true) {
|
|
server = _this.SERVERS[tld];
|
|
if (!tld || server) {
|
|
break;
|
|
}
|
|
tld = tld.replace(/^.+?(\.|$)/, '');
|
|
}
|
|
}
|
|
}
|
|
if (!server) {
|
|
done(new Error('lookup: no whois server is known for this kind of object'));
|
|
return;
|
|
}
|
|
if (typeof server === 'string') {
|
|
parts = server.split(':');
|
|
server = {
|
|
host: parts[0],
|
|
port: parts[1]
|
|
};
|
|
}
|
|
_.defaults(server, {
|
|
port: 43,
|
|
query: "$addr\r\n"
|
|
});
|
|
socket = net.connect(server.port, server.host, function() {
|
|
return socket.write(server.query.replace('$addr', punycode.toASCII(addr)));
|
|
});
|
|
socket.setEncoding('utf-8');
|
|
if (options.timeout != null) {
|
|
socket.setTimeout(options.timeout);
|
|
}
|
|
data = '';
|
|
socket.on('data', function(chunk) {
|
|
return data += chunk;
|
|
});
|
|
socket.on('timeout', function() {
|
|
return done(new Error('lookup: timeout'));
|
|
});
|
|
socket.on('error', function(err) {
|
|
return done(err);
|
|
});
|
|
return socket.on('close', function(err) {
|
|
var match;
|
|
if (options.follow > 0) {
|
|
match = data.match(/(ReferralServer|Registrar Whois|Whois Server):\s*(r?whois:\/\/)?(.+)/);
|
|
if (match != null) {
|
|
options = _.extend({}, options, {
|
|
follow: options.follow - 1,
|
|
server: match[3]
|
|
});
|
|
_this.lookup(addr, options, function(err, parts) {
|
|
if (err != null) {
|
|
return done(err);
|
|
}
|
|
if (options.verbose) {
|
|
return done(null, [
|
|
{
|
|
server: server,
|
|
data: data
|
|
}
|
|
].concat(parts));
|
|
} else {
|
|
return done(null, parts);
|
|
}
|
|
});
|
|
return;
|
|
}
|
|
}
|
|
if (options.verbose) {
|
|
return done(null, [
|
|
{
|
|
server: server,
|
|
data: data
|
|
}
|
|
]);
|
|
} else {
|
|
return done(null, data);
|
|
}
|
|
});
|
|
};
|
|
})(this);
|
|
|
|
if (module === require.main) {
|
|
optimist = require('optimist').usage('$0 [options] address')["default"]('s', null).alias('s', 'server').describe('s', 'whois server')["default"]('f', 0).alias('f', 'follow').describe('f', 'number of times to follow redirects').boolean('v')["default"]('v', false).alias('v', 'verbose').describe('v', 'show verbose results').boolean('h')["default"]('h', false).alias('h', 'help').describe('h', 'display this help message');
|
|
if (optimist.argv.h) {
|
|
console.log(optimist.help());
|
|
process.exit(0);
|
|
}
|
|
if (optimist.argv._[0] == null) {
|
|
console.log(optimist.help());
|
|
process.exit(1);
|
|
}
|
|
this.lookup(optimist.argv._[0], {
|
|
server: optimist.argv.server,
|
|
follow: optimist.argv.follow,
|
|
verbose: optimist.argv.verbose
|
|
}, (function(_this) {
|
|
return function(err, data) {
|
|
var i, len, part, results;
|
|
if (err != null) {
|
|
console.log(err);
|
|
process.exit(1);
|
|
}
|
|
if (util.isArray(data)) {
|
|
results = [];
|
|
for (i = 0, len = data.length; i < len; i++) {
|
|
part = data[i];
|
|
console.log(part.server.host);
|
|
console.log(part.data);
|
|
results.push(console.log);
|
|
}
|
|
return results;
|
|
} else {
|
|
return console.log(data);
|
|
}
|
|
};
|
|
})(this));
|
|
}
|
|
|
|
}).call(this);
|