85 lines
2.4 KiB
JavaScript
85 lines
2.4 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
var PromiseA = require('bluebird').Promise
|
||
|
, updateIp = require('./helpers/update-ip.js').update
|
||
|
, request = PromiseA.promisifyAll(require('request'))
|
||
|
, requestAsync = PromiseA.promisify(require('request'))
|
||
|
, upnpForward = require('./helpers/upnp-forward').upnpForward
|
||
|
, pmpForward = require('./helpers/pmp-forward').pmpForward
|
||
|
, loopbackHttps = require('./loopback-https')
|
||
|
//, checkip = require('check-ip-address')
|
||
|
;
|
||
|
|
||
|
function openPort(ip, port) {
|
||
|
if (!/tcp|https|http/.test(port.protocol || 'tcp')) {
|
||
|
throw new Error('not yet supported \'' + port.protocol + '\'');
|
||
|
}
|
||
|
|
||
|
if (false === port.testable) {
|
||
|
return PromiseA.resolve();
|
||
|
}
|
||
|
|
||
|
return loopbackHttps.create(ip, port.private, port.public).then(function () {
|
||
|
console.log('success');
|
||
|
}).catch(function (err) {
|
||
|
// TODO test err
|
||
|
return upnpForward(port).catch(function (err) {
|
||
|
console.error('[ERROR] UPnP Port Forward');
|
||
|
console.error(err);
|
||
|
// TODO test err
|
||
|
return pmpForward(port);
|
||
|
}).then(function () {
|
||
|
return loopbackHttps.create(ip, port.private, port.public);
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
|
||
|
// 1. update dyndns
|
||
|
// 1.5. check ip every 5 min
|
||
|
// 2. loopback test on ip for http / https / ssh
|
||
|
// 3. if needed: discover gateway, map ports
|
||
|
function beacon(hostnames, ports) {
|
||
|
// test with
|
||
|
// dig -p 53 @redirect-www.org pi.nadal.daplie.com A
|
||
|
return updateIp({
|
||
|
updater: 'redirect-www.org'
|
||
|
, port: 65443
|
||
|
, ddns: hostnames.map(function (hostname) {
|
||
|
return { "name": hostname /*, "value": ipaddress, "type": "A"*/ };
|
||
|
})
|
||
|
}).then(function (data) {
|
||
|
var promises = [];
|
||
|
|
||
|
console.log("Updated DynDNS");
|
||
|
console.log(data);
|
||
|
|
||
|
ports.forEach(function (port) {
|
||
|
promises.push(openPort(JSON.parse(data)[0].answers[0] || hostname, port));
|
||
|
});
|
||
|
|
||
|
return PromiseA.all(promises);
|
||
|
}).then(function () {
|
||
|
console.log('opened ports');
|
||
|
});
|
||
|
|
||
|
/*
|
||
|
request.getAsync('http://checkip.hellabit.com').spread(function (resp, data) {
|
||
|
console.log("External IP is", data);
|
||
|
}).then(function () {
|
||
|
return upnpForward().catch(function (err) {
|
||
|
console.error('ERROR: UPnP failure:');
|
||
|
console.error(err);
|
||
|
});
|
||
|
}).then(function () {
|
||
|
return pmpForward().catch(function (err) {
|
||
|
console.error('TODO: Notify user that their router is not compatible');
|
||
|
});
|
||
|
});
|
||
|
|
||
|
// TODO test roundtrip
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
//setInterval(beacon, 5 * 60 * 1000);
|
||
|
exports.run = beacon;
|