| 
									
										
										
										
											2015-02-12 09:40:37 +00:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-14 17:00:28 +00:00
										 |  |  | var PromiseA = require('bluebird').Promise; | 
					
						
							|  |  |  | var updateIp = require('./helpers/update-ip.js').update; | 
					
						
							|  |  |  | var request = PromiseA.promisifyAll(require('request')); | 
					
						
							|  |  |  | var requestAsync = PromiseA.promisify(require('request')); | 
					
						
							|  |  |  | var upnpForward = require('./helpers/upnp-forward').upnpForward; | 
					
						
							|  |  |  | var pmpForward = require('./helpers/pmp-forward').pmpForward; | 
					
						
							|  |  |  | var loopbackHttps = require('./loopback-https'); | 
					
						
							|  |  |  | //var checkip = require('check-ip-address');
 | 
					
						
							| 
									
										
										
										
											2015-02-12 09:40:37 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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); | 
					
						
							| 
									
										
										
										
											2015-08-14 17:00:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-12 09:40:37 +00:00
										 |  |  |     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; |