127 lines
3.2 KiB
JavaScript
127 lines
3.2 KiB
JavaScript
|
"use strict";
|
||
|
|
||
|
var PromiseA = require('bluebird').Promise;
|
||
|
var ifaces = require('os').networkInterfaces();
|
||
|
var dns = PromiseA.promisifyAll(require('dns'));
|
||
|
var https = require('https');
|
||
|
|
||
|
function getExternalAddresses() {
|
||
|
var iftypes = {};
|
||
|
|
||
|
Object.keys(ifaces).forEach(function (ifname) {
|
||
|
ifaces[ifname].forEach(function (iface) {
|
||
|
if (iface.internal) {
|
||
|
return;
|
||
|
}
|
||
|
/*
|
||
|
if (/^(::|f[cde])/.test(iface.address)) {
|
||
|
console.log('non-public ipv6');
|
||
|
return;
|
||
|
}
|
||
|
*/
|
||
|
|
||
|
iftypes[iface.family] = true;
|
||
|
});
|
||
|
});
|
||
|
|
||
|
var now = Date.now();
|
||
|
|
||
|
return PromiseA.all([
|
||
|
dns.lookupAsync('api.ipify.org', { family: 4/*, all: true*/ }).then(function (ans) {
|
||
|
iftypes.IPv4 = { address: ans[0], family: ans[1], time: Date.now() - now };
|
||
|
}).error(function () {
|
||
|
//console.log('no ipv4', Date.now() - now);
|
||
|
iftypes.IPv4 = false;
|
||
|
})
|
||
|
, dns.lookupAsync('api.ipify.org', { family: 6/*, all: true*/ }).then(function (ans) {
|
||
|
iftypes.IPv6 = { address: ans[0], family: ans[1], time: Date.now() - now };
|
||
|
}).error(function () {
|
||
|
//console.log('no ipv6', Date.now() - now);
|
||
|
iftypes.IPv6 = false;
|
||
|
})
|
||
|
]).then(function () {
|
||
|
var requests = [];
|
||
|
|
||
|
if (iftypes.IPv4) {
|
||
|
requests.push(new PromiseA(function (resolve) {
|
||
|
var req = https.request({
|
||
|
method: 'GET'
|
||
|
, hostname: iftypes.IPv4.address
|
||
|
, port: 443
|
||
|
, headers: {
|
||
|
Host: 'api.ipify.org'
|
||
|
}
|
||
|
, path: '/'
|
||
|
//, family: 4
|
||
|
// TODO , localAddress: <<external_ipv4>>
|
||
|
}, function (res) {
|
||
|
var result = '';
|
||
|
|
||
|
res.on('error', function (/*err*/) {
|
||
|
resolve(null);
|
||
|
});
|
||
|
|
||
|
res.on('data', function (chunk) {
|
||
|
result += chunk.toString('utf8');
|
||
|
});
|
||
|
res.on('end', function () {
|
||
|
resolve({ address: result, family: 4/*, wan: result === iftypes.IPv4.localAddress*/, time: iftypes.IPv4.time });
|
||
|
});
|
||
|
});
|
||
|
|
||
|
req.on('error', function () {
|
||
|
resolve(null);
|
||
|
});
|
||
|
req.end();
|
||
|
}));
|
||
|
}
|
||
|
|
||
|
if (iftypes.IPv6) {
|
||
|
requests.push(new PromiseA(function (resolve) {
|
||
|
var req = https.request({
|
||
|
method: 'GET'
|
||
|
, hostname: iftypes.IPv6.address
|
||
|
, port: 443
|
||
|
, headers: {
|
||
|
Host: 'api.ipify.org'
|
||
|
}
|
||
|
, path: '/'
|
||
|
//, family: 6
|
||
|
// TODO , localAddress: <<external_ipv6>>
|
||
|
}, function (res) {
|
||
|
var result = '';
|
||
|
|
||
|
res.on('error', function (/*err*/) {
|
||
|
resolve(null);
|
||
|
});
|
||
|
|
||
|
res.on('data', function (chunk) {
|
||
|
result += chunk.toString('utf8');
|
||
|
});
|
||
|
res.on('end', function () {
|
||
|
resolve({ address: result, family: 6/*, wan: result === iftypes.IPv6.localAaddress*/, time: iftypes.IPv4.time });
|
||
|
});
|
||
|
});
|
||
|
|
||
|
req.on('error', function () {
|
||
|
resolve(null);
|
||
|
});
|
||
|
req.end();
|
||
|
}));
|
||
|
}
|
||
|
|
||
|
return PromiseA.all(requests).then(function (ips) {
|
||
|
ips = ips.filter(function (ip) {
|
||
|
return ip;
|
||
|
});
|
||
|
|
||
|
return {
|
||
|
addresses: ips
|
||
|
, time: Date.now() - now
|
||
|
};
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
|
||
|
exports.getExternalAddresses = getExternalAddresses;
|