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();
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								};
							 |