forked from coolaj86/walnut.js
		
	
		
			
				
	
	
		
			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();
 | 
						|
        });
 | 
						|
      });
 | 
						|
    });
 | 
						|
  });
 | 
						|
};
 |