From 09e4518bb90f5e010fae3cd3cab63b6199980bfd Mon Sep 17 00:00:00 2001 From: Sebastian Hildebrandt Date: Thu, 1 Sep 2016 10:53:53 +0200 Subject: [PATCH] improved default network interface --- README.md | 3 +++ lib/index.js | 52 +++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 44 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 76a4603..9277bbc 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,7 @@ Here all changes more detailed: New Functions +- `networkInterfaceDefault`: returns default network interface (new in version 3.4) - `processes`: now returns also a process list with all process details (new in version 3.3) - `battery`: retrieves battery status and charging level (new in version 3.2) - `dockerContainers`: returns a list of all docker containers (new in version 3.1) @@ -239,6 +240,7 @@ This library is splitted in several sections: | - [0].ip4 | X | X | ip4 address | | - [0].ip6 | X | X | ip6 address | | - [0].internal | X | X | true if internal interface | +| si.networkInterfaceDefault(cb) | X | X | get name of default network interface | | si.networkStats(iface,cb) | X | X | current network stats of given interface
iface parameter is optional
defaults to first external network interface| | - iface | X | X | interface | | - operstate | X | X | up / down | @@ -373,6 +375,7 @@ I am happy to discuss any comments and suggestions. Please feel free to contact | Version | Date | Comment | | -------------- | -------------- | -------- | +| 3.4.2 | 2016-09-01 | improved default network interface | | 3.4.1 | 2016-08-30 | updated docs | | 3.4.0 | 2016-08-30 | rewritten processes current cpu usage | | 3.3.0 | 2016-08-24 | process list added to processes | diff --git a/lib/index.js b/lib/index.js index 1811382..2e39497 100644 --- a/lib/index.js +++ b/lib/index.js @@ -80,6 +80,7 @@ // -------------------------------- // // version date comment +// 3.4.2 2016-09-01 improved default network interface // 3.4.1 2016-08-30 updated docs // 3.4.0 2016-08-30 rewritten current process cpu usage (linux) // 3.3.0 2016-08-24 added process list @@ -115,6 +116,7 @@ const os = require('os') , exec = require('child_process').exec + , execSync = require('child_process').execSync , fs = require('fs') , lib_version = require('../package.json').version; @@ -1162,23 +1164,51 @@ exports.disksIO = disksIO; // 8. Network // ---------------------------------------------------------------------------------- -function getFirstExternalNetworkInterface() { +function getDefaultNetworkInterface() { let ifacename = ''; - let ifaces = os.networkInterfaces(); + let cmd = (_linux ? "route | grep default | awk '{print $8}'" : "route get 0.0.0.0 2>/dev/null | grep interface: | awk '{print $2}'"); + let result = execSync(cmd); + ifacename = result.toString().split('\n')[0]; - for (let dev in ifaces) { - if (ifaces.hasOwnProperty(dev)) { - ifaces[dev].forEach(function (details) { - if (details && details.internal == false) { - ifacename = ifacename || dev; - } - }) + if (!ifacename) { // fallback - "first" external interface + const sortObject = o => Object.keys(o).sort().reduce((r, k) => (r[k] = o[k], r), {}); + + let ifaces = sortObject(os.networkInterfaces()); + + for (let dev in ifaces) { + if (ifaces.hasOwnProperty(dev)) { + ifaces[dev].forEach(function (details) { + if (details && details.internal == false) { + ifacename = ifacename || dev; + } + }) + } } } + if (ifacename) _default_iface = ifacename; return ifacename; } +function networkInterfaceDefault(callback) { + + return new Promise((resolve, reject) => { + process.nextTick(() => { + if (_windows) { + let error = new Error(NOT_SUPPORTED); + if (callback) { callback(NOT_SUPPORTED) } + reject(error); + } + + let result = getDefaultNetworkInterface(); + if (callback) { callback(result) } + resolve(result); + }); + }); +} + +exports.networkInterfaceDefault = networkInterfaceDefault; + // -------------------------- // NET - interfaces @@ -1258,7 +1288,7 @@ function networkStats(iface, callback) { reject(error); } - _default_iface = _default_iface || getFirstExternalNetworkInterface(); + _default_iface = _default_iface || getDefaultNetworkInterface(); iface = iface || _default_iface; // (_darwin ? 'en0' : 'eth0'); let result = { @@ -2647,7 +2677,7 @@ function getDynamicData(srv, iface, callback) { reject(error); } - iface = iface || getFirstExternalNetworkInterface(); + iface = iface || getDefaultNetworkInterface(); srv = srv || ''; // use closure to track ƒ completion