networtInterfaces() optimized for maxos
This commit is contained in:
parent
b90c1c8a97
commit
f361f43c82
254
lib/network.js
254
lib/network.js
@ -232,10 +232,13 @@ function parseLinesDarwinNics(sections) {
|
|||||||
iface: '',
|
iface: '',
|
||||||
mtu: -1,
|
mtu: -1,
|
||||||
mac: '',
|
mac: '',
|
||||||
|
ip6: '',
|
||||||
|
ip4: '',
|
||||||
speed: -1,
|
speed: -1,
|
||||||
type: '',
|
type: '',
|
||||||
operstate: '',
|
operstate: '',
|
||||||
duplex: '',
|
duplex: '',
|
||||||
|
internal: false
|
||||||
};
|
};
|
||||||
const first = section[0];
|
const first = section[0];
|
||||||
nic.iface = first.split(':')[0].trim();
|
nic.iface = first.split(':')[0].trim();
|
||||||
@ -244,9 +247,16 @@ function parseLinesDarwinNics(sections) {
|
|||||||
if (isNaN(nic.mtu)) {
|
if (isNaN(nic.mtu)) {
|
||||||
nic.mtu = -1;
|
nic.mtu = -1;
|
||||||
}
|
}
|
||||||
|
nic.internal = parts[0].indexOf('LOOPBACK') > -1;
|
||||||
section.forEach(line => {
|
section.forEach(line => {
|
||||||
if (line.trim().startsWith('ether ')) {
|
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');
|
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.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.operstate = util.getValue(section, 'status').toLowerCase().indexOf('active') > -1 ? 'up' : 'down';
|
||||||
nic.duplex = util.getValue(section, 'media').toLowerCase().indexOf('half-duplex') > -1 ? 'half' : 'full';
|
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;
|
return nics;
|
||||||
}
|
}
|
||||||
@ -282,8 +294,16 @@ function getDarwinNics() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function testVirtualNic(iface, ifaceName, mac) {
|
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']
|
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']
|
||||||
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;
|
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) {
|
function networkInterfaces(callback) {
|
||||||
@ -293,55 +313,79 @@ function networkInterfaces(callback) {
|
|||||||
let ifaces = os.networkInterfaces();
|
let ifaces = os.networkInterfaces();
|
||||||
let result = [];
|
let result = [];
|
||||||
let nics = [];
|
let nics = [];
|
||||||
if (JSON.stringify(ifaces) === JSON.stringify(_ifaces)) {
|
// seperate handling in OSX
|
||||||
// no changes - just return object
|
if (_darwin || _freebsd || _openbsd || _netbsd) {
|
||||||
result = _networkInterfaces;
|
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); }
|
if (callback) { callback(result); }
|
||||||
resolve(result);
|
resolve(result);
|
||||||
} else {
|
} else {
|
||||||
_ifaces = ifaces;
|
if (JSON.stringify(ifaces) === JSON.stringify(_ifaces)) {
|
||||||
if (_windows) {
|
// no changes - just return object
|
||||||
nics = getWindowsNics();
|
result = _networkInterfaces;
|
||||||
}
|
|
||||||
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 (ifaces.hasOwnProperty(dev)) {
|
if (callback) { callback(result); }
|
||||||
let ifaceName = dev;
|
resolve(result);
|
||||||
ifaces[dev].forEach(function (details) {
|
} 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') {
|
if (ifaces.hasOwnProperty(dev)) {
|
||||||
ip4 = details.address;
|
let ifaceName = dev;
|
||||||
}
|
ifaces[dev].forEach(function (details) {
|
||||||
if (details.family === 'IPv6') {
|
|
||||||
if (!ip6 || ip6.match(/^fe80::/i)) {
|
if (details.family === 'IPv4') {
|
||||||
ip6 = details.address;
|
ip4 = details.address;
|
||||||
}
|
}
|
||||||
}
|
if (details.family === 'IPv6') {
|
||||||
mac = details.mac;
|
if (!ip6 || ip6.match(/^fe80::/i)) {
|
||||||
// fallback due to https://github.com/nodejs/node/issues/13581 (node 8.1 - node 8.2)
|
ip6 = details.address;
|
||||||
if (mac.indexOf('00:00:0') > -1 && (_linux || _darwin)) {
|
}
|
||||||
if (Object.keys(_mac).length === 0) {
|
|
||||||
_mac = getMacAddresses();
|
|
||||||
}
|
}
|
||||||
mac = _mac[dev] || '';
|
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 (_linux) {
|
if (Object.keys(_mac).length === 0) {
|
||||||
let iface = dev.split(':')[0].trim().toLowerCase();
|
_mac = getMacAddresses();
|
||||||
const cmd = `echo -n "addr_assign_type: "; cat /sys/class/net/${iface}/addr_assign_type 2>/dev/null; echo;
|
}
|
||||||
|
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 "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 "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;
|
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 "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 "wireless: "; cat /proc/net/wireless 2>/dev/null \| grep ${iface}; echo
|
||||||
echo -n "wirelessspeed: "; iw dev ${iface} link 2>&1 \| grep bitrate; echo;`;
|
echo -n "wirelessspeed: "; iw dev ${iface} link 2>&1 \| grep bitrate; echo;`;
|
||||||
let lines = [];
|
let lines = [];
|
||||||
try {
|
try {
|
||||||
lines = execSync(cmd).toString().split('\n');
|
lines = execSync(cmd).toString().split('\n');
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
util.noop();
|
util.noop();
|
||||||
}
|
}
|
||||||
duplex = util.getValue(lines, 'duplex');
|
duplex = util.getValue(lines, 'duplex');
|
||||||
duplex = duplex.startsWith('cat') ? '' : duplex;
|
duplex = duplex.startsWith('cat') ? '' : duplex;
|
||||||
mtu = parseInt(util.getValue(lines, 'mtu'), 10);
|
mtu = parseInt(util.getValue(lines, 'mtu'), 10);
|
||||||
let myspeed = parseInt(util.getValue(lines, 'speed'), 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]);
|
|
||||||
speed = isNaN(myspeed) ? -1 : myspeed;
|
speed = isNaN(myspeed) ? -1 : myspeed;
|
||||||
}
|
let wirelessspeed = util.getValue(lines, 'wirelessspeed').split('tx bitrate: ');
|
||||||
carrierChanges = parseInt(util.getValue(lines, 'carrier_changes'), 10);
|
if (speed === -1 && wirelessspeed.length === 2) {
|
||||||
operstate = util.getValue(lines, 'operstate');
|
myspeed = parseFloat(wirelessspeed[1]);
|
||||||
type = operstate === 'up' ? (util.getValue(lines, 'wireless').trim() ? 'wireless' : 'wired') : 'unknown';
|
speed = isNaN(myspeed) ? -1 : myspeed;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
});
|
carrierChanges = parseInt(util.getValue(lines, 'carrier_changes'), 10);
|
||||||
if (dev.toLowerCase().indexOf('wlan') >= 0 || ifaceName.toLowerCase().indexOf('wlan') >= 0 || ifaceName.toLowerCase().indexOf('wireless') >= 0) {
|
operstate = util.getValue(lines, 'operstate');
|
||||||
type = 'wireless';
|
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) {
|
||||||
if (_darwin || _freebsd || _openbsd || _netbsd) {
|
nics.forEach(detail => {
|
||||||
nics.forEach(nic => {
|
if (detail.mac === mac) {
|
||||||
if (nic.iface === dev) {
|
ifaceName = detail.name;
|
||||||
mtu = nic.mtu;
|
operstate = detail.operstate;
|
||||||
duplex = nic.duplex;
|
speed = detail.speed;
|
||||||
speed = nic.speed;
|
type = detail.type;
|
||||||
type = nic.type;
|
}
|
||||||
operstate = nic.operstate;
|
});
|
||||||
|
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);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user