networkInterfaces() catch errors
This commit is contained in:
parent
2bc1ee6621
commit
4f60a4c947
@ -30,6 +30,7 @@ For major (breaking) changes - version 3 and 2 see end of page.
|
||||
|
||||
| Version | Date | Comment |
|
||||
| -------------- | -------------- | -------- |
|
||||
| 4.34.6 | 2020-01-12 | `networkInterfaces()` catch errors |
|
||||
| 4.34.5 | 2020-01-07 | `networkInterfaceDefault()` fixed CMD popup (windows) |
|
||||
| 4.34.4 | 2020-01-06 | `system()` fixed vitrual catch error |
|
||||
| 4.34.3 | 2020-01-06 | `graphics()` fixed non nvidia-smi controllers (win) |
|
||||
|
||||
@ -83,6 +83,11 @@
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th scope="row">4.34.6</th>
|
||||
<td>2020-01-12</td>
|
||||
<td><span class="code">networkInterfaces()</span> catch errors</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">4.34.5</th>
|
||||
<td>2020-01-07</td>
|
||||
|
||||
@ -169,7 +169,7 @@
|
||||
<img class="logo" src="assets/logo.png">
|
||||
<div class="title">systeminformation</div>
|
||||
<div class="subtitle"><span id="typed"></span></div>
|
||||
<div class="version">Current Version: <span id="version">4.34.5</span></div>
|
||||
<div class="version">Current Version: <span id="version">4.34.6</span></div>
|
||||
<button class="btn btn-light" onclick="location.href='https://github.com/sebhildebrandt/systeminformation'">View on Github <i class=" fab fa-github"></i></button>
|
||||
</div>
|
||||
<div class="down">
|
||||
@ -208,7 +208,7 @@
|
||||
<div class="title">Downloads last month</div>
|
||||
</div>
|
||||
<div class="col-xl-4 col-lg-4 col-md-4 col-12">
|
||||
<div class="numbers">366</div>
|
||||
<div class="numbers">367</div>
|
||||
<div class="title">Dependents</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
369
lib/network.js
369
lib/network.js
@ -685,132 +685,133 @@ function networkInterfaces(callback, rescan = true) {
|
||||
}
|
||||
return new Promise((resolve) => {
|
||||
process.nextTick(() => {
|
||||
let ifaces = os.networkInterfaces();
|
||||
|
||||
let result = [];
|
||||
let nics = [];
|
||||
let dnsSuffixes = [];
|
||||
let nics8021xInfo = [];
|
||||
// seperate handling in OSX
|
||||
if (_darwin || _freebsd || _openbsd || _netbsd) {
|
||||
nics = getDarwinNics();
|
||||
try {
|
||||
let ifaces = os.networkInterfaces();
|
||||
|
||||
// seperate handling in OSX
|
||||
if (_darwin || _freebsd || _openbsd || _netbsd) {
|
||||
nics = getDarwinNics();
|
||||
|
||||
|
||||
nics.forEach(nic => {
|
||||
nics.forEach(nic => {
|
||||
|
||||
if ({}.hasOwnProperty.call(ifaces, nic.iface)) {
|
||||
ifaces[nic.iface].forEach(function (details) {
|
||||
if (details.family === 'IPv4') {
|
||||
nic.ip4subnet = details.netmask;
|
||||
}
|
||||
if (details.family === 'IPv6') {
|
||||
nic.ip6subnet = details.netmask;
|
||||
}
|
||||
if ({}.hasOwnProperty.call(ifaces, nic.iface)) {
|
||||
ifaces[nic.iface].forEach(function (details) {
|
||||
if (details.family === 'IPv4') {
|
||||
nic.ip4subnet = details.netmask;
|
||||
}
|
||||
if (details.family === 'IPv6') {
|
||||
nic.ip6subnet = details.netmask;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
result.push({
|
||||
iface: nic.iface,
|
||||
ifaceName: nic.iface,
|
||||
ip4: nic.ip4,
|
||||
ip4subnet: nic.ip4subnet || '',
|
||||
ip6: nic.ip6,
|
||||
ip6subnet: nic.ip6subnet || '',
|
||||
mac: nic.mac,
|
||||
internal: nic.internal,
|
||||
virtual: nic.internal ? false : testVirtualNic(nic.iface, nic.iface, nic.mac),
|
||||
operstate: nic.operstate,
|
||||
type: nic.type,
|
||||
duplex: nic.duplex,
|
||||
mtu: nic.mtu,
|
||||
speed: nic.speed,
|
||||
dhcp: getDarwinIfaceDHCPstatus(nic.iface),
|
||||
dnsSuffix: '',
|
||||
ieee8021xAuth: '',
|
||||
ieee8021xState: '',
|
||||
carrierChanges: 0
|
||||
});
|
||||
}
|
||||
|
||||
result.push({
|
||||
iface: nic.iface,
|
||||
ifaceName: nic.iface,
|
||||
ip4: nic.ip4,
|
||||
ip4subnet: nic.ip4subnet || '',
|
||||
ip6: nic.ip6,
|
||||
ip6subnet: nic.ip6subnet || '',
|
||||
mac: nic.mac,
|
||||
internal: nic.internal,
|
||||
virtual: nic.internal ? false : testVirtualNic(nic.iface, nic.iface, nic.mac),
|
||||
operstate: nic.operstate,
|
||||
type: nic.type,
|
||||
duplex: nic.duplex,
|
||||
mtu: nic.mtu,
|
||||
speed: nic.speed,
|
||||
dhcp: getDarwinIfaceDHCPstatus(nic.iface),
|
||||
dnsSuffix: '',
|
||||
ieee8021xAuth: '',
|
||||
ieee8021xState: '',
|
||||
carrierChanges: 0
|
||||
});
|
||||
});
|
||||
_networkInterfaces = result;
|
||||
if (callback) { callback(result); }
|
||||
resolve(result);
|
||||
} else {
|
||||
if ((JSON.stringify(ifaces) === JSON.stringify(_ifaces)) && !rescan) {
|
||||
// no changes - just return object
|
||||
result = _networkInterfaces;
|
||||
|
||||
_networkInterfaces = result;
|
||||
if (callback) { callback(result); }
|
||||
resolve(result);
|
||||
} else {
|
||||
_ifaces = Object.assign({}, ifaces);
|
||||
if ((JSON.stringify(ifaces) === JSON.stringify(_ifaces)) && !rescan) {
|
||||
// no changes - just return object
|
||||
result = _networkInterfaces;
|
||||
|
||||
if (callback) { callback(result); }
|
||||
resolve(result);
|
||||
} else {
|
||||
_ifaces = Object.assign({}, ifaces);
|
||||
|
||||
if (_windows) {
|
||||
nics = getWindowsNics();
|
||||
nics.forEach(nic => {
|
||||
let found = false;
|
||||
Object.keys(ifaces).forEach(key => {
|
||||
if (!found) {
|
||||
ifaces[key].forEach(value => {
|
||||
if (Object.keys(value).indexOf('mac') >= 0) {
|
||||
found = value['mac'] === nic.mac;
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
if (_windows) {
|
||||
nics = getWindowsNics();
|
||||
nics.forEach(nic => {
|
||||
let found = false;
|
||||
Object.keys(ifaces).forEach(key => {
|
||||
if (!found) {
|
||||
ifaces[key].forEach(value => {
|
||||
if (Object.keys(value).indexOf('mac') >= 0) {
|
||||
found = value['mac'] === nic.mac;
|
||||
ifaces[nic.name] = [{ mac: nic.mac }];
|
||||
}
|
||||
});
|
||||
|
||||
nics8021xInfo = getWindowsWiredProfilesInformation();
|
||||
dnsSuffixes = getWindowsDNSsuffixes();
|
||||
}
|
||||
if (_linux) {
|
||||
_dhcpNics = getLinuxDHCPNics();
|
||||
}
|
||||
for (let dev in ifaces) {
|
||||
let ip4 = '';
|
||||
let ip4subnet = '';
|
||||
let ip6 = '';
|
||||
let ip6subnet = '';
|
||||
let mac = '';
|
||||
let duplex = '';
|
||||
let mtu = '';
|
||||
let speed = -1;
|
||||
let carrierChanges = 0;
|
||||
let operstate = 'down';
|
||||
let dhcp = false;
|
||||
let dnsSuffix = '';
|
||||
let ieee8021xAuth = '';
|
||||
let ieee8021xState = '';
|
||||
let type = '';
|
||||
|
||||
if ({}.hasOwnProperty.call(ifaces, dev)) {
|
||||
let ifaceName = dev;
|
||||
ifaces[dev].forEach(function (details) {
|
||||
if (details.family === 'IPv4') {
|
||||
ip4 = details.address;
|
||||
ip4subnet = details.netmask;
|
||||
}
|
||||
if (details.family === 'IPv6') {
|
||||
if (!ip6 || ip6.match(/^fe80::/i)) {
|
||||
ip6 = details.address;
|
||||
ip6subnet = details.netmask;
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
if (!found) {
|
||||
ifaces[nic.name] = [{ mac: nic.mac }];
|
||||
}
|
||||
});
|
||||
|
||||
nics8021xInfo = getWindowsWiredProfilesInformation();
|
||||
dnsSuffixes = getWindowsDNSsuffixes();
|
||||
}
|
||||
if (_linux) {
|
||||
_dhcpNics = getLinuxDHCPNics();
|
||||
}
|
||||
for (let dev in ifaces) {
|
||||
let ip4 = '';
|
||||
let ip4subnet = '';
|
||||
let ip6 = '';
|
||||
let ip6subnet = '';
|
||||
let mac = '';
|
||||
let duplex = '';
|
||||
let mtu = '';
|
||||
let speed = -1;
|
||||
let carrierChanges = 0;
|
||||
let operstate = 'down';
|
||||
let dhcp = false;
|
||||
let dnsSuffix = '';
|
||||
let ieee8021xAuth = '';
|
||||
let ieee8021xState = '';
|
||||
let type = '';
|
||||
|
||||
if ({}.hasOwnProperty.call(ifaces, dev)) {
|
||||
let ifaceName = dev;
|
||||
ifaces[dev].forEach(function (details) {
|
||||
if (details.family === 'IPv4') {
|
||||
ip4 = details.address;
|
||||
ip4subnet = details.netmask;
|
||||
}
|
||||
if (details.family === 'IPv6') {
|
||||
if (!ip6 || ip6.match(/^fe80::/i)) {
|
||||
ip6 = details.address;
|
||||
ip6subnet = details.netmask;
|
||||
}
|
||||
}
|
||||
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) && parseInt(process.versions.node.split('.'), 10) === 8) {
|
||||
if (Object.keys(_mac).length === 0) {
|
||||
_mac = getMacAddresses();
|
||||
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) && parseInt(process.versions.node.split('.'), 10) === 8) {
|
||||
if (Object.keys(_mac).length === 0) {
|
||||
_mac = getMacAddresses();
|
||||
}
|
||||
mac = _mac[dev] || '';
|
||||
}
|
||||
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;
|
||||
});
|
||||
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;
|
||||
@ -836,86 +837,90 @@ function networkInterfaces(callback, rescan = true) {
|
||||
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');
|
||||
const connectionName = getLinuxIfaceConnectionName(iface);
|
||||
dhcp = getLinuxIfaceDHCPstatus(iface, connectionName, _dhcpNics);
|
||||
dnsSuffix = getLinuxIfaceDNSsuffix(connectionName);
|
||||
ieee8021xAuth = getLinuxIfaceIEEE8021xAuth(connectionName);
|
||||
ieee8021xState = getLinuxIfaceIEEE8021xState(ieee8021xAuth);
|
||||
} 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]);
|
||||
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'; }
|
||||
}
|
||||
if (_windows) {
|
||||
|
||||
|
||||
dnsSuffix = getWindowsIfaceDNSsuffix(dnsSuffixes.ifaces, dev);
|
||||
nics.forEach(detail => {
|
||||
if (detail.mac === mac) {
|
||||
ifaceName = detail.name;
|
||||
dhcp = detail.dhcp;
|
||||
operstate = detail.operstate;
|
||||
speed = detail.speed;
|
||||
type = detail.type;
|
||||
let lines = [];
|
||||
try {
|
||||
lines = execSync(cmd).toString().split('\n');
|
||||
const connectionName = getLinuxIfaceConnectionName(iface);
|
||||
dhcp = getLinuxIfaceDHCPstatus(iface, connectionName, _dhcpNics);
|
||||
dnsSuffix = getLinuxIfaceDNSsuffix(connectionName);
|
||||
ieee8021xAuth = getLinuxIfaceIEEE8021xAuth(connectionName);
|
||||
ieee8021xState = getLinuxIfaceIEEE8021xState(ieee8021xAuth);
|
||||
} catch (e) {
|
||||
util.noop();
|
||||
}
|
||||
});
|
||||
|
||||
if (dev.toLowerCase().indexOf('wlan') >= 0 || ifaceName.toLowerCase().indexOf('wlan') >= 0 || ifaceName.toLowerCase().indexOf('802.11n') >= 0 || ifaceName.toLowerCase().indexOf('wireless') >= 0 || ifaceName.toLowerCase().indexOf('wi-fi') >= 0 || ifaceName.toLowerCase().indexOf('wifi') >= 0) {
|
||||
type = 'wireless';
|
||||
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]);
|
||||
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'; }
|
||||
}
|
||||
if (_windows) {
|
||||
|
||||
const IEEE8021x = getWindowsIEEE8021x(type, dev, nics8021xInfo);
|
||||
ieee8021xAuth = IEEE8021x.protocol;
|
||||
ieee8021xState = IEEE8021x.state;
|
||||
|
||||
dnsSuffix = getWindowsIfaceDNSsuffix(dnsSuffixes.ifaces, dev);
|
||||
nics.forEach(detail => {
|
||||
if (detail.mac === mac) {
|
||||
ifaceName = detail.name;
|
||||
dhcp = detail.dhcp;
|
||||
operstate = detail.operstate;
|
||||
speed = detail.speed;
|
||||
type = detail.type;
|
||||
}
|
||||
});
|
||||
|
||||
if (dev.toLowerCase().indexOf('wlan') >= 0 || ifaceName.toLowerCase().indexOf('wlan') >= 0 || ifaceName.toLowerCase().indexOf('802.11n') >= 0 || ifaceName.toLowerCase().indexOf('wireless') >= 0 || ifaceName.toLowerCase().indexOf('wi-fi') >= 0 || ifaceName.toLowerCase().indexOf('wifi') >= 0) {
|
||||
type = 'wireless';
|
||||
}
|
||||
|
||||
const IEEE8021x = getWindowsIEEE8021x(type, dev, nics8021xInfo);
|
||||
ieee8021xAuth = IEEE8021x.protocol;
|
||||
ieee8021xState = IEEE8021x.state;
|
||||
}
|
||||
let internal = (ifaces[dev] && ifaces[dev][0]) ? ifaces[dev][0].internal : false;
|
||||
if (dev.toLowerCase().indexOf('loopback') > -1 || ifaceName.toLowerCase().indexOf('loopback') > -1) {
|
||||
internal = true;
|
||||
}
|
||||
const virtual = internal ? false : testVirtualNic(dev, ifaceName, mac);
|
||||
result.push({
|
||||
iface: dev,
|
||||
ifaceName,
|
||||
ip4,
|
||||
ip4subnet,
|
||||
ip6,
|
||||
ip6subnet,
|
||||
mac,
|
||||
internal,
|
||||
virtual,
|
||||
operstate,
|
||||
type,
|
||||
duplex,
|
||||
mtu,
|
||||
speed,
|
||||
dhcp,
|
||||
dnsSuffix,
|
||||
ieee8021xAuth,
|
||||
ieee8021xState,
|
||||
carrierChanges,
|
||||
});
|
||||
}
|
||||
let internal = (ifaces[dev] && ifaces[dev][0]) ? ifaces[dev][0].internal : false;
|
||||
if (dev.toLowerCase().indexOf('loopback') > -1 || ifaceName.toLowerCase().indexOf('loopback') > -1) {
|
||||
internal = true;
|
||||
}
|
||||
const virtual = internal ? false : testVirtualNic(dev, ifaceName, mac);
|
||||
result.push({
|
||||
iface: dev,
|
||||
ifaceName,
|
||||
ip4,
|
||||
ip4subnet,
|
||||
ip6,
|
||||
ip6subnet,
|
||||
mac,
|
||||
internal,
|
||||
virtual,
|
||||
operstate,
|
||||
type,
|
||||
duplex,
|
||||
mtu,
|
||||
speed,
|
||||
dhcp,
|
||||
dnsSuffix,
|
||||
ieee8021xAuth,
|
||||
ieee8021xState,
|
||||
carrierChanges,
|
||||
});
|
||||
}
|
||||
_networkInterfaces = result;
|
||||
if (callback) { callback(result); }
|
||||
resolve(result);
|
||||
}
|
||||
_networkInterfaces = result;
|
||||
if (callback) { callback(result); }
|
||||
resolve(result);
|
||||
}
|
||||
} catch (e) {
|
||||
if (callback) { callback(result); }
|
||||
resolve(result);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user