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