58 lines
1.5 KiB
JavaScript
58 lines
1.5 KiB
JavaScript
'use strict';
|
|
|
|
var PromiseA = require('bluebird').Promise
|
|
, natpmp = require('nat-pmp')
|
|
, exec = require('child_process').exec
|
|
;
|
|
|
|
exports.pmpForward = function (port) {
|
|
return new PromiseA(function (resolve, reject) {
|
|
exec('ip route show default', function (err, stdout, stderr) {
|
|
var gw
|
|
;
|
|
|
|
if (err || stderr) { reject(err || stderr); return; }
|
|
|
|
// default via 192.168.1.1 dev eth0
|
|
gw = stdout.replace(/^default via (\d+\.\d+\.\d+\.\d+) dev[\s\S]+/m, '$1');
|
|
console.log('Possible PMP gateway is', gw);
|
|
|
|
// create a "client" instance connecting to your local gateway
|
|
var client = natpmp.connect(gw);
|
|
|
|
function setPortForward() {
|
|
// setup a new port mapping
|
|
client.portMapping({
|
|
private: port.private || port.public
|
|
, public: port.public || port.private
|
|
, ttl: port.ttl || 0 // 600
|
|
}, function (err, info) {
|
|
if (err) {
|
|
reject(err);
|
|
return;
|
|
}
|
|
|
|
console.log(info);
|
|
// {
|
|
// type: 'tcp',
|
|
// epoch: 8922109,
|
|
// private: 22,
|
|
// public: 2222,
|
|
// ...
|
|
// }
|
|
resolve();
|
|
});
|
|
}
|
|
|
|
// explicitly ask for the current external IP address
|
|
setTimeout(function () {
|
|
client.externalIp(function (err, info) {
|
|
if (err) throw err;
|
|
console.log('Current external IP address: %s', info.ip.join('.'));
|
|
setPortForward();
|
|
});
|
|
});
|
|
});
|
|
});
|
|
};
|