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'));
|
||||
}
|
||||
|
||||
|
|
16
lib/pmp.js
16
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) {
|
||||
console.error('[HP] Error: setTimeout client.externalIp:');
|
||||
console.error(err.stack);
|
||||
if (err) { return PromiseA.reject(err); }
|
||||
if (err) {
|
||||
console.error('[HP] Error: setTimeout client.externalIp:');
|
||||
console.error(err.stack);
|
||||
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');
|
||||
console.log(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…
Reference in New Issue