2024-08-09 14:03:22 +00:00

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);