118 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| var PromiseA = require('bluebird');
 | |
| 
 | |
| module.exports.match = function (servername, opts) {
 | |
|   return PromiseA.promisify(require('ipify'))().then(function (externalIp) {
 | |
|     var dns = PromiseA.promisifyAll(require('dns'));
 | |
| 
 | |
|     opts.externalIps = [ { address: externalIp, family: 'IPv4' } ];
 | |
|     opts.ifaces = require('./local-ip.js').find({ externals: opts.externalIps });
 | |
|     opts.externalIfaces = Object.keys(opts.ifaces).reduce(function (all, iname) {
 | |
|       var iface = opts.ifaces[iname];
 | |
| 
 | |
|       iface.ipv4.forEach(function (addr) {
 | |
|         if (addr.external) {
 | |
|           addr.iface = iname;
 | |
|           all.push(addr);
 | |
|         }
 | |
|       });
 | |
|       iface.ipv6.forEach(function (addr) {
 | |
|         if (addr.external) {
 | |
|           addr.iface = iname;
 | |
|           all.push(addr);
 | |
|         }
 | |
|       });
 | |
| 
 | |
|       return all;
 | |
|     }, []).filter(Boolean);
 | |
| 
 | |
|     function resolveIps(hostname) {
 | |
|       var allIps = [];
 | |
| 
 | |
|       return PromiseA.all([
 | |
|         dns.resolve4Async(hostname).then(function (records) {
 | |
|             records.forEach(function (ip) {
 | |
|               allIps.push({
 | |
|                 address: ip
 | |
|               , family: 'IPv4'
 | |
|               });
 | |
|             });
 | |
|           }, function () {})
 | |
|         , dns.resolve6Async(hostname).then(function (records) {
 | |
|             records.forEach(function (ip) {
 | |
|               allIps.push({
 | |
|                 address: ip
 | |
|               , family: 'IPv6'
 | |
|               });
 | |
|             });
 | |
|           }, function () {})
 | |
|       ]).then(function () {
 | |
|         return allIps;
 | |
|       });
 | |
|     }
 | |
| 
 | |
|     function resolveIpsAndCnames(hostname) {
 | |
|       return PromiseA.all([
 | |
|         resolveIps(hostname)
 | |
|       , dns.resolveCnameAsync(hostname).then(function (records) {
 | |
|           return PromiseA.all(records.map(function (hostname) {
 | |
|             return resolveIps(hostname);
 | |
|           })).then(function (allIps) {
 | |
|             return allIps.reduce(function (all, ips) {
 | |
|               return all.concat(ips);
 | |
|             }, []);
 | |
|           });
 | |
|         }, function () {
 | |
|           return [];
 | |
|         })
 | |
|       ]).then(function (ips) {
 | |
|         return ips.reduce(function (all, set) {
 | |
|           return all.concat(set);
 | |
|         }, []);
 | |
|       });
 | |
|     }
 | |
| 
 | |
|     return resolveIpsAndCnames(servername).then(function (allIps) {
 | |
|       var matchingIps = [];
 | |
| 
 | |
|       if (!allIps.length) {
 | |
|         console.warn("Could not resolve '" + servername + "'");
 | |
|       }
 | |
| 
 | |
|       // { address, family }
 | |
|       allIps.some(function (ip) {
 | |
|         function match(addr) {
 | |
|           if (ip.address === addr.address) {
 | |
|             matchingIps.push(addr);
 | |
|           }
 | |
|         }
 | |
| 
 | |
|         opts.externalIps.forEach(match);
 | |
|         // opts.externalIfaces.forEach(match);
 | |
| 
 | |
|         Object.keys(opts.ifaces).forEach(function (iname) {
 | |
|           var iface = opts.ifaces[iname];
 | |
| 
 | |
|           iface.ipv4.forEach(match);
 | |
|           iface.ipv6.forEach(match);
 | |
|         });
 | |
| 
 | |
|         return matchingIps.length;
 | |
|       });
 | |
| 
 | |
|       matchingIps.externalIps = {
 | |
|         ipv4: [
 | |
|           { address: externalIp
 | |
|           , family: 'IPv4'
 | |
|           }
 | |
|         ]
 | |
|       , ipv6: [
 | |
|         ]
 | |
|       };
 | |
|       matchingIps.matchingIps = matchingIps;
 | |
|       return matchingIps;
 | |
|     });
 | |
|   });
 | |
| };
 |