tested working upnp and pmp
This commit is contained in:
		
							parent
							
								
									62509a4800
								
							
						
					
					
						commit
						6382701c91
					
				
							
								
								
									
										66
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										66
									
								
								README.md
									
									
									
									
									
								
							| @ -1,17 +1,79 @@ | ||||
| # holepunch | ||||
| 
 | ||||
| A node.js library and cli for using UPnP SSDP | ||||
| A node.js library (api) and command (cli) for using UPnP SSDP | ||||
| and ZeroConf (Bonjour) NAT-PMP | ||||
| to make home and office devices and services Internet-accessible. | ||||
| 
 | ||||
| ## Progress | ||||
| 
 | ||||
| in development | ||||
| it now works :-) | ||||
| 
 | ||||
| still in development | ||||
| 
 | ||||
| ```bash | ||||
| git clone git@github.com:Daplie/holepunch.git | ||||
| 
 | ||||
| pushd holepunch | ||||
| 
 | ||||
| node bin/holepunch.js --debug | ||||
| ``` | ||||
| 
 | ||||
| ## Install | ||||
| 
 | ||||
| **Commandline Tool** | ||||
| ```bash | ||||
| npm install --global holepunch | ||||
| ``` | ||||
| 
 | ||||
| **node.js Library** | ||||
| ``` | ||||
| npm install --save holepunch | ||||
| ``` | ||||
| 
 | ||||
| ## Commandline (CLI) | ||||
| 
 | ||||
| ```bash | ||||
| holepunch --help | ||||
| ``` | ||||
| 
 | ||||
| ``` | ||||
| holepunch --plain-ports 80,65080 --tls-ports 443,65443 | ||||
| ``` | ||||
| 
 | ||||
| TODO `--prebound-ports 22` | ||||
| 
 | ||||
| ``` | ||||
| Usage: | ||||
|   holepunch.js [OPTIONS] [ARGS] | ||||
| 
 | ||||
| Options: | ||||
|       --debug BOOLEAN       show traces and logs | ||||
| 
 | ||||
|       --plain-ports STRING  Port numbers to test with plaintext loopback. | ||||
|                             (default: 65080) | ||||
|                             (formats: <port>,<internal:external>) | ||||
| 
 | ||||
|       --tls-ports STRING    Port numbers to test with tls loopback. | ||||
|                             (default: null) | ||||
| 
 | ||||
|       --ipify-urls STRING   Comma separated list of URLs to test for external ip. | ||||
|                             (default: api.ipify.org) | ||||
| 
 | ||||
|       --protocols STRING    Comma separated list of ip mapping protocols. | ||||
|                             (default: none,upnp,pmp) | ||||
| 
 | ||||
|       --rvpn-configs STRING Comma separated list of Reverse VPN config files in | ||||
|                             the order they should be tried. (default: null) | ||||
| 
 | ||||
|   -h, --help                Display help and usage details | ||||
| ``` | ||||
| 
 | ||||
| ## API | ||||
| 
 | ||||
| ```javascript | ||||
| var punch = require('holepunch'); | ||||
| ``` | ||||
| 
 | ||||
| # License | ||||
| 
 | ||||
| MPL-2.0 | ||||
|  | ||||
| @ -71,7 +71,8 @@ cli.main(function(_, options) { | ||||
|   } | ||||
| 
 | ||||
|   return hp.create(args).then(function () { | ||||
|     console.log('wishing wanting waiting'); | ||||
|     //process.exit(0);
 | ||||
|     //console.log('[HP] wishing wanting waiting');
 | ||||
|     console.log('complete, exiting'); | ||||
|     process.exit(0); | ||||
|   }); | ||||
| }); | ||||
|  | ||||
| @ -41,7 +41,7 @@ function createSocket() { | ||||
|   }); | ||||
| 
 | ||||
|   socket.on('message', function (chunk, info) { | ||||
|     var message = chunk.toString(); | ||||
|     var message = chunk.toString('utf8'); | ||||
| 
 | ||||
|     console.log('[MESSAGE RECEIVED]'); | ||||
|     console.log(info); | ||||
|  | ||||
							
								
								
									
										14
									
								
								lib/index.js
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								lib/index.js
									
									
									
									
									
								
							| @ -14,7 +14,7 @@ module.exports.create = function (args) { | ||||
| 
 | ||||
|   if (args.debug) { | ||||
|     console.log('[HP] create servers'); | ||||
|     console.log(servers); | ||||
|     //console.log(servers);
 | ||||
|   } | ||||
| 
 | ||||
|   function getExternalIps() { | ||||
| @ -63,8 +63,8 @@ module.exports.create = function (args) { | ||||
|       return portInfo; | ||||
|     }, function (err) { | ||||
|       if (args.debug) { | ||||
|         console.error('[HP] loopback test err'); | ||||
|         console.error(err.stack); | ||||
|         console.log('[HP] loopback did not complete'); | ||||
|         console.log(err.stack); | ||||
|       } | ||||
| 
 | ||||
|       return PromiseA.reject(err); | ||||
| @ -83,7 +83,7 @@ module.exports.create = function (args) { | ||||
|       ip.ports = []; | ||||
| 
 | ||||
|       if (opts.debug) { | ||||
|         console.log('[HP] no pretest', opts.pretest); | ||||
|         console.log('[HP] pretest = ', opts.pretest); | ||||
|       } | ||||
| 
 | ||||
|       if (!opts.pretest) { | ||||
| @ -124,12 +124,18 @@ module.exports.create = function (args) { | ||||
|       if (-1 !== args.protocols.indexOf('upnp') | ||||
|         ||  -1 !== args.protocols.indexOf('ssdp') | ||||
|       ) { | ||||
|         if (args.debug) { | ||||
|           console.log('[HP] will try upnp'); | ||||
|         } | ||||
|         mappers.push(require('./upnp')); | ||||
|       } | ||||
| 
 | ||||
|       if (-1 !== args.protocols.indexOf('pmp') | ||||
|         || -1 !== args.protocols.indexOf('nat-pmp') | ||||
|       ) { | ||||
|         if (args.debug) { | ||||
|           console.log('[HP] will try nat-pmp'); | ||||
|         } | ||||
|         mappers.push(require('./pmp')); | ||||
|       } | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										12
									
								
								lib/pmp.js
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								lib/pmp.js
									
									
									
									
									
								
							| @ -68,9 +68,11 @@ function pmpForwardHelper(gw, portInfo) { | ||||
|     // TODO why did I use a setTimeout here? event loop / timing bug?
 | ||||
|     setTimeout(function () { | ||||
|       client.externalIp(function (err, info) { | ||||
|         if (err) { | ||||
|           console.error('[HP] Error: setTimeout client.externalIp:'); | ||||
|           console.error(err.stack); | ||||
|         if (err) { return PromiseA.reject(err); } | ||||
|           return PromiseA.reject(err); | ||||
|         } | ||||
|         console.log('Current external IP address: %s', info.ip.join('.')); | ||||
|         setPortForward(); | ||||
|       }); | ||||
| @ -78,13 +80,17 @@ function pmpForwardHelper(gw, portInfo) { | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| function pmpForward(port) { | ||||
| function pmpForward(portInfo) { | ||||
|   return getGateway().then(function (gw) { | ||||
|     return pmpForwardHelper(gw, port); | ||||
|     return pmpForwardHelper(gw, portInfo); | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| module.exports = function (args, ips, portInfo) { | ||||
|   if (args.debug) { | ||||
|     console.log('[HP] [pmp] portInfo'); | ||||
|     console.log(portInfo); | ||||
|   } | ||||
|   return pmpForward(portInfo); | ||||
| }; | ||||
| 
 | ||||
|  | ||||
| @ -8,8 +8,10 @@ function requestAsync(opts) { | ||||
|   return new PromiseA(function (resolve, reject) { | ||||
|     var httpr = (false === opts.secure) ? http : https; | ||||
| 
 | ||||
|     console.log('[HP] loopback test opts'); | ||||
|     if (opts.debug) { | ||||
|       console.log('[HP] requestAsync opts'); | ||||
|       console.log(opts); | ||||
|     } | ||||
| 
 | ||||
|     var req = httpr.request(opts, function (res) { | ||||
|       var data = ''; | ||||
| @ -22,10 +24,13 @@ function requestAsync(opts) { | ||||
|         reject(err); | ||||
|       }); | ||||
|       res.on('data', function (chunk) { | ||||
|         clearTimeout(req.__timtok); | ||||
| 
 | ||||
|         if (opts.debug > 2) { | ||||
|           console.log('HP: request chunk:'); | ||||
|           console.log(chunk); | ||||
|         } | ||||
| 
 | ||||
|         data += chunk.toString('utf8'); | ||||
|       }); | ||||
|       res.on('end', function () { | ||||
| @ -38,6 +43,13 @@ function requestAsync(opts) { | ||||
|     }); | ||||
| 
 | ||||
|     req.on('error', reject); | ||||
|     req.setTimeout(3 * 1000); | ||||
|     req.on('socket', function (socket) { | ||||
|       req.__timtok = setTimeout(function () { | ||||
|         req.abort(); | ||||
|       }, 3 * 1000); | ||||
|       socket.setTimeout(3 * 1000); | ||||
|     }); | ||||
|     req.end(); | ||||
|   }); | ||||
| } | ||||
|  | ||||
							
								
								
									
										18
									
								
								lib/upnp.js
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								lib/upnp.js
									
									
									
									
									
								
							| @ -1,17 +1,27 @@ | ||||
| 'use strict'; | ||||
| 
 | ||||
| //var PromiseA = require('bluebird').Promise;
 | ||||
| var PromiseA = require('bluebird').Promise; | ||||
| var natUpnp = require('holepunch-upnp'); | ||||
| 
 | ||||
| function upnpForward(opts) { | ||||
|   return natUpnp.createClient({ timeout: 3000 }).then(function (client) { | ||||
|   if (opts.debug) { | ||||
|     console.log('[HP] [upnp] opts'); | ||||
|     console.log(opts); | ||||
|   } | ||||
| 
 | ||||
|   return natUpnp.createClient({ timeout: 3 * 1000 }).then(function (client) { | ||||
|     if (opts.debug) { | ||||
|       console.log('[HP] [upnp] created client'); | ||||
|       console.log(client); | ||||
|     } | ||||
| 
 | ||||
|     return client.portMapping({ | ||||
|       public: opts.external || opts.public || opts.internal | ||||
|     , private: opts.internal || opts.private || opts.public || opts.external | ||||
|     , ttl: opts.ttl || 0 | ||||
|     }).then(function (result) { | ||||
|       if (opts.debug) { | ||||
|         console.log('[HP] upnp result'); | ||||
|         console.log('[HP] [upnp] result'); | ||||
|         console.log(result); | ||||
|       } | ||||
|       return result; | ||||
| @ -37,7 +47,9 @@ module.exports = function (args, ips, portInfo) { | ||||
|   return upnpForward({ | ||||
|     debug: args.debug | ||||
|   , private: portInfo.internal | ||||
|   , internal: portInfo.internal | ||||
|   , public: portInfo.external | ||||
|   , external: portInfo.external | ||||
|   // , localAddress: ip.localAddress
 | ||||
|   }); | ||||
| }; | ||||
|  | ||||
| @ -1,10 +1,10 @@ | ||||
| { | ||||
|   "name": "holepunch", | ||||
|   "version": "1.0.0-alpha.1", | ||||
|   "version": "1.0.0-alpha.2", | ||||
|   "description": "Get a direct ip connection by any means possible - direct (public ip), upnp (Microsoft), nat-pmp (Apple), or punch a hole through a firewall using a Reverse VPN (Daplie).", | ||||
|   "main": "index.js", | ||||
|   "bin": { | ||||
|     "holepunch": "holepunch.js" | ||||
|     "holepunch": "bin/holepunch.js" | ||||
|   }, | ||||
|   "directories": { | ||||
|     "example": "examples" | ||||
| @ -16,10 +16,11 @@ | ||||
|     "holepunch-nat-pmp": "^1.0.0-alpha.1", | ||||
|     "holepunch-upnp": "^1.0.0-alpha.1", | ||||
|     "localhost.daplie.com-certificates": "^1.1.2", | ||||
|     "netroute": "^1.0.2", | ||||
|     "request": "^2.67.0", | ||||
|     "scmp": "^1.0.0" | ||||
|   }, | ||||
|   "optionalDependencies": { | ||||
|     "netroute": "^1.0.2" | ||||
|   }, | ||||
|   "devDependencies": {}, | ||||
|   "scripts": { | ||||
|     "test": "echo \"Error: no test specified\" && exit 1" | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user