diff --git a/CHANGELOG.md b/CHANGELOG.md index 5cf17cc..48ac4ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -100,6 +100,7 @@ Other changes | Version | Date | Comment | | -------------- | -------------- | -------- | +| 3.37.0 | 2018-02-11 | extended FreeBSD support `networkStats()` | | 3.36.0 | 2018-02-11 | extended FreeBSD support `networkConnections()` | | 3.35.0 | 2018-02-11 | extended FreeBSD support `processLoad()` | | 3.34.1 | 2018-02-11 | updated docs | diff --git a/README.md b/README.md index c9b12b1..1e41d3a 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,7 @@ async function cpu() { ### Latest Activity (last 7 major and minor version releases) +- Version 3.37.0: extended FreeBSD support `networkStats()` - Version 3.36.0: extended FreeBSD support `networkConnections()` - Version 3.35.0: extended FreeBSD support `processLoad()` - Version 3.34.0: first partial FreeBSD support @@ -289,14 +290,14 @@ I also created a nice little command line tool called [mmon][mmon-github-url] ( | | [0].mac | X | X | X | X | MAC address | | | [0].internal | X | X | X | X | true if internal interface | | si.networkInterfaceDefault(cb) | : string | X | X | X | X | get name of default network interface | -| si.networkStats(iface,cb) | {...} | X | | X | X | current network stats of given interface
iface parameter is optional
defaults to first external network interface| -| | iface | X | | X | X | interface | -| | operstate | X | | X | X | up / down | -| | rx | X | | X | X | received bytes overall | -| | tx | X | | X | X | transferred bytes overall | -| | rx_sec | X | | X | X | received bytes / second (* see notes) | -| | tx_sec | X | | X | X | transferred bytes per second (* see notes) | -| | ms | X | | X | X | interval length (for per second values) | +| si.networkStats(iface,cb) | {...} | X | X | X | X | current network stats of given interface
iface parameter is optional
defaults to first external network interface| +| | iface | X | X | X | X | interface | +| | operstate | X | X | X | X | up / down | +| | rx | X | X | X | X | received bytes overall | +| | tx | X | X | X | X | transferred bytes overall | +| | rx_sec | X | X | X | X | received bytes / second (* see notes) | +| | tx_sec | X | X | X | X | transferred bytes per second (* see notes) | +| | ms | X | X | X | X | interval length (for per second values) | | si.networkConnections(cb) | [{...}] | X | X | X | X | current network network connections
returns an array of all connections| | | [0].protocol | X | X | X | X | tcp or udp | | | [0].localaddress | X | X | X | X | local address | diff --git a/lib/network.js b/lib/network.js index ceb8a65..5e0bbe6 100644 --- a/lib/network.js +++ b/lib/network.js @@ -183,14 +183,15 @@ function calcNetworkSpeed(iface, rx, tx, operstate) { if (_network[iface] && _network[iface].ms) { result.ms = Date.now() - _network[iface].ms; - result.rx_sec = (rx - _network[iface].rx) / (result.ms / 1000); - result.tx_sec = (tx - _network[iface].tx) / (result.ms / 1000); + result.rx_sec = (rx - _network[iface].rx) >= 0 ? (rx - _network[iface].rx) / (result.ms / 1000) : 0; + result.tx_sec = (tx - _network[iface].tx) >= 0 ? (tx - _network[iface].tx) / (result.ms / 1000) : 0; _network[iface].rx = rx; _network[iface].tx = tx; _network[iface].rx_sec = result.rx_sec; _network[iface].tx_sec = result.tx_sec; _network[iface].ms = Date.now(); _network[iface].last_ms = result.ms; + _network[iface].operstate = operstate; } else { if (!_network[iface]) _network[iface] = {}; _network[iface].rx = rx; @@ -199,6 +200,7 @@ function calcNetworkSpeed(iface, rx, tx, operstate) { _network[iface].tx_sec = -1; _network[iface].ms = Date.now(); _network[iface].last_ms = 0; + _network[iface].operstate = operstate; } return result; } @@ -273,7 +275,7 @@ function networkStats(iface, callback) { let cmd, lines, stats; if (!_network[iface] || (_network[iface] && !_network[iface].ms) || (_network[iface] && _network[iface].ms && Date.now() - _network[iface].ms >= 500)) { - if (_linux || _freebsd || _openbsd) { + if (_linux) { if (fs.existsSync('/sys/class/net/' + iface)) { cmd = 'cat /sys/class/net/' + iface + '/operstate; ' + @@ -297,6 +299,25 @@ function networkStats(iface, callback) { resolve(result); } } + if (_freebsd || _openbsd) { + cmd = 'netstat -ibnI ' + iface; + exec(cmd, function (error, stdout) { + if (!error) { + lines = stdout.toString().split('\n'); + for (let i = 1; i < lines.length; i++) { + const line = lines[i].replace(/ +/g, ' ').split(' '); + if (line && line[0] && line[7] && line[10]) { + rx = rx + parseInt(line[7]); + tx = tx + parseInt(line[10]); + operstate = 'up'; + } + } + result = calcNetworkSpeed(iface, rx, tx, operstate); + } + if (callback) { callback(result); } + resolve(result); + }); + } if (_darwin) { cmd = 'ifconfig ' + iface + ' | grep "status"'; exec(cmd, function (error, stdout) { @@ -386,6 +407,7 @@ function networkStats(iface, callback) { result.rx_sec = _network[iface].rx_sec; result.tx_sec = _network[iface].tx_sec; result.ms = _network[iface].last_ms; + result.operstate = _network[iface].operstate; if (callback) { callback(result); } resolve(result); }