networkInterfaces() catch errors

This commit is contained in:
Sebastian Hildebrandt 2021-01-12 23:58:27 +01:00
parent 2bc1ee6621
commit 4f60a4c947
4 changed files with 196 additions and 185 deletions

View File

@ -30,6 +30,7 @@ For major (breaking) changes - version 3 and 2 see end of page.
| Version | Date | Comment | | 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.5 | 2020-01-07 | `networkInterfaceDefault()` fixed CMD popup (windows) |
| 4.34.4 | 2020-01-06 | `system()` fixed vitrual catch error | | 4.34.4 | 2020-01-06 | `system()` fixed vitrual catch error |
| 4.34.3 | 2020-01-06 | `graphics()` fixed non nvidia-smi controllers (win) | | 4.34.3 | 2020-01-06 | `graphics()` fixed non nvidia-smi controllers (win) |

View File

@ -83,6 +83,11 @@
</tr> </tr>
</thead> </thead>
<tbody> <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> <tr>
<th scope="row">4.34.5</th> <th scope="row">4.34.5</th>
<td>2020-01-07</td> <td>2020-01-07</td>
@ -2059,4 +2064,4 @@
</body> </body>
</html> </html>

View File

@ -169,7 +169,7 @@
<img class="logo" src="assets/logo.png"> <img class="logo" src="assets/logo.png">
<div class="title">systeminformation</div> <div class="title">systeminformation</div>
<div class="subtitle"><span id="typed"></span></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> <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>
<div class="down"> <div class="down">
@ -208,7 +208,7 @@
<div class="title">Downloads last month</div> <div class="title">Downloads last month</div>
</div> </div>
<div class="col-xl-4 col-lg-4 col-md-4 col-12"> <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 class="title">Dependents</div>
</div> </div>
</div> </div>

View File

@ -685,132 +685,133 @@ function networkInterfaces(callback, rescan = true) {
} }
return new Promise((resolve) => { return new Promise((resolve) => {
process.nextTick(() => { process.nextTick(() => {
let ifaces = os.networkInterfaces();
let result = []; let result = [];
let nics = []; let nics = [];
let dnsSuffixes = []; let dnsSuffixes = [];
let nics8021xInfo = []; let nics8021xInfo = [];
// seperate handling in OSX try {
if (_darwin || _freebsd || _openbsd || _netbsd) { let ifaces = os.networkInterfaces();
nics = getDarwinNics();
// seperate handling in OSX
if (_darwin || _freebsd || _openbsd || _netbsd) {
nics = getDarwinNics();
nics.forEach(nic => { nics.forEach(nic => {
if ({}.hasOwnProperty.call(ifaces, nic.iface)) { if ({}.hasOwnProperty.call(ifaces, nic.iface)) {
ifaces[nic.iface].forEach(function (details) { ifaces[nic.iface].forEach(function (details) {
if (details.family === 'IPv4') { if (details.family === 'IPv4') {
nic.ip4subnet = details.netmask; nic.ip4subnet = details.netmask;
} }
if (details.family === 'IPv6') { if (details.family === 'IPv6') {
nic.ip6subnet = details.netmask; 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;
_networkInterfaces = result;
if (callback) { callback(result); }
resolve(result);
} else {
if ((JSON.stringify(ifaces) === JSON.stringify(_ifaces)) && !rescan) {
// no changes - just return object
result = _networkInterfaces;
if (callback) { callback(result); } if (callback) { callback(result); }
resolve(result); resolve(result);
} else { } 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) { if (!found) {
ifaces[key].forEach(value => { ifaces[nic.name] = [{ mac: nic.mac }];
if (Object.keys(value).indexOf('mac') >= 0) { }
found = value['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;
mac = details.mac; // fallback due to https://github.com/nodejs/node/issues/13581 (node 8.1 - node 8.2)
// 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 (mac.indexOf('00:00:0') > -1 && (_linux || _darwin) && parseInt(process.versions.node.split('.'), 10) === 8) { if (Object.keys(_mac).length === 0) {
if (Object.keys(_mac).length === 0) { _mac = getMacAddresses();
_mac = getMacAddresses(); }
mac = _mac[dev] || '';
} }
mac = _mac[dev] || ''; });
} if (_linux) {
}); let iface = dev.split(':')[0].trim().toLowerCase();
if (_linux) { const cmd = `echo -n "addr_assign_type: "; cat /sys/class/net/${iface}/addr_assign_type 2>/dev/null; echo;
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;
@ -836,86 +837,90 @@ function networkInterfaces(callback, rescan = true) {
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');
const connectionName = getLinuxIfaceConnectionName(iface); const connectionName = getLinuxIfaceConnectionName(iface);
dhcp = getLinuxIfaceDHCPstatus(iface, connectionName, _dhcpNics); dhcp = getLinuxIfaceDHCPstatus(iface, connectionName, _dhcpNics);
dnsSuffix = getLinuxIfaceDNSsuffix(connectionName); dnsSuffix = getLinuxIfaceDNSsuffix(connectionName);
ieee8021xAuth = getLinuxIfaceIEEE8021xAuth(connectionName); ieee8021xAuth = getLinuxIfaceIEEE8021xAuth(connectionName);
ieee8021xState = getLinuxIfaceIEEE8021xState(ieee8021xAuth); ieee8021xState = getLinuxIfaceIEEE8021xState(ieee8021xAuth);
} catch (e) { } catch (e) {
util.noop(); 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;
} }
}); duplex = util.getValue(lines, 'duplex');
duplex = duplex.startsWith('cat') ? '' : duplex;
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) { mtu = parseInt(util.getValue(lines, 'mtu'), 10);
type = 'wireless'; 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; dnsSuffix = getWindowsIfaceDNSsuffix(dnsSuffixes.ifaces, dev);
ieee8021xState = IEEE8021x.state; 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);
} }
}); });
}); });