goldilocks.js/lib/check-ports.js

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;