From f361f43c82d6f96129c23a4bda40c5c9ee35997e Mon Sep 17 00:00:00 2001 From: Sebastian Hildebrandt Date: Sun, 23 Jun 2019 20:41:33 +0200 Subject: [PATCH] networtInterfaces() optimized for maxos --- lib/network.js | 254 ++++++++++++++++++++++++++++--------------------- 1 file changed, 144 insertions(+), 110 deletions(-) diff --git a/lib/network.js b/lib/network.js index c1893f9..00cb28e 100644 --- a/lib/network.js +++ b/lib/network.js @@ -232,10 +232,13 @@ function parseLinesDarwinNics(sections) { iface: '', mtu: -1, mac: '', + ip6: '', + ip4: '', speed: -1, type: '', operstate: '', duplex: '', + internal: false }; const first = section[0]; nic.iface = first.split(':')[0].trim(); @@ -244,9 +247,16 @@ function parseLinesDarwinNics(sections) { if (isNaN(nic.mtu)) { nic.mtu = -1; } + nic.internal = parts[0].indexOf('LOOPBACK') > -1; section.forEach(line => { if (line.trim().startsWith('ether ')) { - nic.mac = line.split('ether ')[1].toLowerCase(); + nic.mac = line.split('ether ')[1].toLowerCase().trim(); + } + if (line.trim().startsWith('inet6 ')) { + nic.ip6 = line.split('inet6 ')[1].toLowerCase().split('%')[0]; + } + if (line.trim().startsWith('inet ')) { + nic.ip4 = line.split('inet ')[1].toLowerCase().split(' ')[0]; } }); let speed = util.getValue(section, 'link rate'); @@ -265,7 +275,9 @@ function parseLinesDarwinNics(sections) { nic.type = util.getValue(section, 'type').toLowerCase().indexOf('wi-fi') > -1 ? 'wireless' : 'wired'; nic.operstate = util.getValue(section, 'status').toLowerCase().indexOf('active') > -1 ? 'up' : 'down'; nic.duplex = util.getValue(section, 'media').toLowerCase().indexOf('half-duplex') > -1 ? 'half' : 'full'; - nics.push(nic); + if (nic.ip6 || nic.ip4 || nic.mac) { + nics.push(nic); + } }); return nics; } @@ -282,8 +294,16 @@ function getDarwinNics() { } function testVirtualNic(iface, ifaceName, mac) { - const virtualMacs = ['00:03:FF', '00:05:69', '00:0C:29', '00:0F:4B', '00:0F:4B', '00:13:07', '00:13:BE', '00:15:5d', '00:16:3E', '00:1C:42', '00:21:F6', '00:21:F6', '00:24:0B', '00:24:0B', '00:50:56', '00:A0:B1', '00:E0:C8', '08:00:27', '0A:00:27', '18:92:2C', '3C:F3:92', '54:52:00', 'FC:15:97'] - return virtualMacs.indexOf(mac.toUpperCase()) > -1 || iface.toLowerCase().indexOf(' virtual ') > -1 || ifaceName.toLowerCase().indexOf(' virtual ') > -1 || ifaceName.toLowerCase().indexOf('vethernet ') > -1 || ifaceName.toLowerCase().indexOf('vethernet ') > -1; + const virtualMacs = ['00:00:00:00:00:00', '00:03:FF', '00:05:69', '00:0C:29', '00:0F:4B', '00:0F:4B', '00:13:07', '00:13:BE', '00:15:5d', '00:16:3E', '00:1C:42', '00:21:F6', '00:21:F6', '00:24:0B', '00:24:0B', '00:50:56', '00:A0:B1', '00:E0:C8', '08:00:27', '0A:00:27', '18:92:2C', '16:DF:49', '3C:F3:92', '54:52:00', 'FC:15:97'] + if (mac) { + return virtualMacs.filter(item => { return mac.toUpperCase().toUpperCase().startsWith(item.substr(0, mac.length)); }).length > 0 || + iface.toLowerCase().indexOf(' virtual ') > -1 || + ifaceName.toLowerCase().indexOf(' virtual ') > -1 || + iface.toLowerCase().indexOf('vethernet ') > -1 || + ifaceName.toLowerCase().indexOf('vethernet ') > -1 || + iface.toLowerCase().startsWith('veth ') || + ifaceName.toLowerCase().startsWith('veth '); + } else return false; } function networkInterfaces(callback) { @@ -293,55 +313,79 @@ function networkInterfaces(callback) { let ifaces = os.networkInterfaces(); let result = []; let nics = []; - if (JSON.stringify(ifaces) === JSON.stringify(_ifaces)) { - // no changes - just return object - result = _networkInterfaces; + // seperate handling in OSX + if (_darwin || _freebsd || _openbsd || _netbsd) { + nics = getDarwinNics(); + // console.log(nics); + // console.log('-------'); + // console.log(ifaces); + nics.forEach(nic => { + result.push({ + iface: nic.iface, + ifaceName: nic.iface, + ip4: nic.ip4, + ip6: nic.ip6, + mac: nic.mac, + internal: nic.internal, + virtual: testVirtualNic(nic.iface, nic.iface, nic.mac), + operstate: nic.operstate, + type: nic.type, + duplex: nic.duplex, + mtu: nic.mtu, + speed: nic.speed, + carrierChanges: 0 + }); + }); if (callback) { callback(result); } resolve(result); } else { - _ifaces = ifaces; - if (_windows) { - nics = getWindowsNics(); - } - if (_darwin) { - nics = getDarwinNics(); - } - for (let dev in ifaces) { - let ip4 = ''; - let ip6 = ''; - let mac = ''; - let duplex = ''; - let mtu = ''; - let speed = -1; - let carrierChanges = 0; - let operstate = 'down'; - let type = ''; + if (JSON.stringify(ifaces) === JSON.stringify(_ifaces)) { + // no changes - just return object + result = _networkInterfaces; - if (ifaces.hasOwnProperty(dev)) { - let ifaceName = dev; - ifaces[dev].forEach(function (details) { + if (callback) { callback(result); } + resolve(result); + } else { + _ifaces = ifaces; + if (_windows) { + nics = getWindowsNics(); + } + for (let dev in ifaces) { + let ip4 = ''; + let ip6 = ''; + let mac = ''; + let duplex = ''; + let mtu = ''; + let speed = -1; + let carrierChanges = 0; + let operstate = 'down'; + let type = ''; - if (details.family === 'IPv4') { - ip4 = details.address; - } - if (details.family === 'IPv6') { - if (!ip6 || ip6.match(/^fe80::/i)) { - ip6 = details.address; + if (ifaces.hasOwnProperty(dev)) { + let ifaceName = dev; + ifaces[dev].forEach(function (details) { + + if (details.family === 'IPv4') { + ip4 = details.address; } - } - mac = details.mac; - // fallback due to https://github.com/nodejs/node/issues/13581 (node 8.1 - node 8.2) - if (mac.indexOf('00:00:0') > -1 && (_linux || _darwin)) { - if (Object.keys(_mac).length === 0) { - _mac = getMacAddresses(); + if (details.family === 'IPv6') { + if (!ip6 || ip6.match(/^fe80::/i)) { + ip6 = details.address; + } } - mac = _mac[dev] || ''; - } - }); - if (_linux) { - let iface = dev.split(':')[0].trim().toLowerCase(); - const cmd = `echo -n "addr_assign_type: "; cat /sys/class/net/${iface}/addr_assign_type 2>/dev/null; echo; + mac = details.mac; + // fallback due to https://github.com/nodejs/node/issues/13581 (node 8.1 - node 8.2) + if (mac.indexOf('00:00:0') > -1 && (_linux || _darwin)) { + if (Object.keys(_mac).length === 0) { + _mac = getMacAddresses(); + } + mac = _mac[dev] || ''; + } + }); + if (_linux) { + let iface = dev.split(':')[0].trim().toLowerCase(); + const cmd = `echo -n "addr_assign_type: "; cat /sys/class/net/${iface}/addr_assign_type 2>/dev/null; echo; echo -n "address: "; cat /sys/class/net/${iface}/address 2>/dev/null; echo; echo -n "addr_len: "; cat /sys/class/net/${iface}/addr_len 2>/dev/null; echo; echo -n "broadcast: "; cat /sys/class/net/${iface}/broadcast 2>/dev/null; echo; @@ -366,79 +410,69 @@ function networkInterfaces(callback) { echo -n "type: "; cat /sys/class/net/${iface}/type 2>/dev/null; echo; echo -n "wireless: "; cat /proc/net/wireless 2>/dev/null \| grep ${iface}; echo echo -n "wirelessspeed: "; iw dev ${iface} link 2>&1 \| grep bitrate; echo;`; - let lines = []; - try { - lines = execSync(cmd).toString().split('\n'); - } catch (e) { - util.noop(); - } - duplex = util.getValue(lines, 'duplex'); - duplex = duplex.startsWith('cat') ? '' : duplex; - mtu = parseInt(util.getValue(lines, 'mtu'), 10); - let myspeed = parseInt(util.getValue(lines, 'speed'), 10); - speed = isNaN(myspeed) ? -1 : myspeed; - let wirelessspeed = util.getValue(lines, 'wirelessspeed').split('tx bitrate: '); - if (speed === -1 && wirelessspeed.length === 2) { - myspeed = parseFloat(wirelessspeed[1]); + let lines = []; + try { + lines = execSync(cmd).toString().split('\n'); + } catch (e) { + util.noop(); + } + duplex = util.getValue(lines, 'duplex'); + duplex = duplex.startsWith('cat') ? '' : duplex; + mtu = parseInt(util.getValue(lines, 'mtu'), 10); + let myspeed = parseInt(util.getValue(lines, 'speed'), 10); speed = isNaN(myspeed) ? -1 : myspeed; - } - carrierChanges = parseInt(util.getValue(lines, 'carrier_changes'), 10); - operstate = util.getValue(lines, 'operstate'); - type = operstate === 'up' ? (util.getValue(lines, 'wireless').trim() ? 'wireless' : 'wired') : 'unknown'; - if (iface === 'lo' || iface.startsWith('bond')) { type = 'virtual'; } - // rx_bytes = parseInt(util.getValue(lines, 'rx_bytes'), 10); - // rx_dropped = parseInt(util.getValue(lines, 'rx_dropped'), 10); - // rx_errors = parseInt(util.getValue(lines, 'rx_errors'), 10); - // tx_bytes = parseInt(util.getValue(lines, 'tx_bytes'), 10); - // tx_dropped = parseInt(util.getValue(lines, 'tx_dropped'), 10); - // tx_errors = parseInt(util.getValue(lines, 'tx_errors'), 10); - } - if (_windows) { - nics.forEach(detail => { - if (detail.mac === mac) { - ifaceName = detail.name; - operstate = detail.operstate; - speed = detail.speed; - type = detail.type; + let wirelessspeed = util.getValue(lines, 'wirelessspeed').split('tx bitrate: '); + if (speed === -1 && wirelessspeed.length === 2) { + myspeed = parseFloat(wirelessspeed[1]); + speed = isNaN(myspeed) ? -1 : myspeed; } - }); - if (dev.toLowerCase().indexOf('wlan') >= 0 || ifaceName.toLowerCase().indexOf('wlan') >= 0 || ifaceName.toLowerCase().indexOf('wireless') >= 0) { - type = 'wireless'; + carrierChanges = parseInt(util.getValue(lines, 'carrier_changes'), 10); + operstate = util.getValue(lines, 'operstate'); + type = operstate === 'up' ? (util.getValue(lines, 'wireless').trim() ? 'wireless' : 'wired') : 'unknown'; + if (iface === 'lo' || iface.startsWith('bond')) { type = 'virtual'; } + // rx_bytes = parseInt(util.getValue(lines, 'rx_bytes'), 10); + // rx_dropped = parseInt(util.getValue(lines, 'rx_dropped'), 10); + // rx_errors = parseInt(util.getValue(lines, 'rx_errors'), 10); + // tx_bytes = parseInt(util.getValue(lines, 'tx_bytes'), 10); + // tx_dropped = parseInt(util.getValue(lines, 'tx_dropped'), 10); + // tx_errors = parseInt(util.getValue(lines, 'tx_errors'), 10); } - } - if (_darwin || _freebsd || _openbsd || _netbsd) { - nics.forEach(nic => { - if (nic.iface === dev) { - mtu = nic.mtu; - duplex = nic.duplex; - speed = nic.speed; - type = nic.type; - operstate = nic.operstate; + if (_windows) { + nics.forEach(detail => { + if (detail.mac === mac) { + ifaceName = detail.name; + operstate = detail.operstate; + speed = detail.speed; + type = detail.type; + } + }); + if (dev.toLowerCase().indexOf('wlan') >= 0 || ifaceName.toLowerCase().indexOf('wlan') >= 0 || ifaceName.toLowerCase().indexOf('wireless') >= 0) { + type = 'wireless'; } + } + let internal = (ifaces[dev] && ifaces[dev][0]) ? ifaces[dev][0].internal : null; + const virtual = testVirtualNic(dev, ifaceName, mac); + result.push({ + iface: dev, + ifaceName, + ip4, + ip6, + mac, + internal, + virtual, + operstate, + type, + duplex, + mtu, + speed, + carrierChanges, }); } - let internal = (ifaces[dev] && ifaces[dev][0]) ? ifaces[dev][0].internal : null; - const virtual = testVirtualNic(dev, ifaceName, mac); - result.push({ - iface: dev, - ifaceName, - ip4, - ip6, - mac, - internal, - virtual, - operstate, - type, - duplex, - mtu, - speed, - carrierChanges, - }); } + _networkInterfaces = result; + if (callback) { callback(result); } + resolve(result); } - _networkInterfaces = result; - if (callback) { callback(result); } - resolve(result); } }); });