forked from coolaj86/goldilocks.js
		
	
		
			
				
	
	
		
			96 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| function bindTcpAndRelease(port, cb) {
 | |
|   var server = require('net').createServer();
 | |
|   server.on('error', function (e) {
 | |
|     cb(e);
 | |
|   });
 | |
|   server.listen(port, function () {
 | |
|     server.close();
 | |
|     cb();
 | |
|   });
 | |
| }
 | |
| 
 | |
| function bindUdpAndRelease(port, cb) {
 | |
|   var socket = require('dgram').createSocket('udp4');
 | |
|   socket.on('error', function (e) {
 | |
|     cb(e);
 | |
|   });
 | |
|   socket.bind(port, function () {
 | |
|     socket.close();
 | |
|     cb();
 | |
|   });
 | |
| }
 | |
| 
 | |
| function checkTcpPorts(cb) {
 | |
|   var bound = {};
 | |
|   var failed = {};
 | |
| 
 | |
|   bindTcpAndRelease(80, function (e) {
 | |
|     if (e) {
 | |
|       failed[80] = e;
 | |
|       //console.log(e.code);
 | |
|       //console.log(e.message);
 | |
|     } else {
 | |
|       bound['80'] = true;
 | |
|     }
 | |
| 
 | |
|     bindTcpAndRelease(443, function (e) {
 | |
|       if (e) {
 | |
|         failed[443] = e;
 | |
|       } else {
 | |
|         bound['443'] = true;
 | |
|       }
 | |
| 
 | |
|       if (bound['80'] && bound['443']) {
 | |
|         cb(null, bound);
 | |
|         return;
 | |
|       }
 | |
| 
 | |
|       console.warn("default ports 80 and 443 are not available, trying 8443");
 | |
| 
 | |
|       bindTcpAndRelease(8443, function (e) {
 | |
|         if (e) {
 | |
|           failed[8443] = e;
 | |
|         } else {
 | |
|           bound['8443'] = true;
 | |
|         }
 | |
| 
 | |
|         cb(failed, bound);
 | |
|       });
 | |
|     });
 | |
|   });
 | |
| }
 | |
| 
 | |
| function checkUdpPorts(cb) {
 | |
|   var bound = {};
 | |
|   var failed = {};
 | |
| 
 | |
|   bindUdpAndRelease(53, function (e) {
 | |
|     if (e) {
 | |
|       failed[53] = e;
 | |
|     } else {
 | |
|       bound[53] = true;
 | |
|     }
 | |
| 
 | |
|     if (bound[53]) {
 | |
|       cb(null, bound);
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     console.warn("default DNS port 53 not available, trying 8053");
 | |
|     bindUdpAndRelease(8053, function (e) {
 | |
|       if (e) {
 | |
|         failed[8053] = e;
 | |
|       } else {
 | |
|         bound[8053] = true;
 | |
|       }
 | |
| 
 | |
|       cb(failed, bound);
 | |
|     });
 | |
|   });
 | |
| }
 | |
| 
 | |
| module.exports.checkTcpPorts = checkTcpPorts;
 | |
| module.exports.checkUdpPorts = checkUdpPorts;
 |