You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					45 lines
				
				1.0 KiB
			
		
		
			
		
	
	
					45 lines
				
				1.0 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								"use strict";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const net = require("net");
							 | 
						||
| 
								 | 
							
								const execa = require("execa");
							 | 
						||
| 
								 | 
							
								const dests = ["default", "0.0.0.0", "0.0.0.0/0", "::", "::/0"];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const args = {
							 | 
						||
| 
								 | 
							
								  v4: ["-rn", "-f", "inet"],
							 | 
						||
| 
								 | 
							
								  v6: ["-rn", "-f", "inet6"],
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const parse = stdout => {
							 | 
						||
| 
								 | 
							
								  let result;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  (stdout || "").trim().split("\n").some(line => {
							 | 
						||
| 
								 | 
							
								    const [target, gateway, _, iface] = line.split(/ +/) || [];
							 | 
						||
| 
								 | 
							
								    if (dests.includes(target) && gateway && net.isIP(gateway)) {
							 | 
						||
| 
								 | 
							
								      result = {gateway, interface: (iface ? iface : null)};
							 | 
						||
| 
								 | 
							
								      return true;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (!result) {
							 | 
						||
| 
								 | 
							
								    throw new Error("Unable to determine default gateway");
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return result;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const promise = async family => {
							 | 
						||
| 
								 | 
							
								  const {stdout} = await execa("netstat", args[family]);
							 | 
						||
| 
								 | 
							
								  return parse(stdout);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const sync = family => {
							 | 
						||
| 
								 | 
							
								  const {stdout} = execa.sync("netstat", args[family]);
							 | 
						||
| 
								 | 
							
								  return parse(stdout);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports.v4 = () => promise("v4");
							 | 
						||
| 
								 | 
							
								module.exports.v6 = () => promise("v6");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports.v4.sync = () => sync("v4");
							 | 
						||
| 
								 | 
							
								module.exports.v6.sync = () => sync("v6");
							 |