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