diff --git a/img/gtop_updated_demo.gif b/img/gtop_updated_demo.gif new file mode 100644 index 0000000..9a9b960 Binary files /dev/null and b/img/gtop_updated_demo.gif differ diff --git a/lib/gtop.js b/lib/gtop.js index e19b875..dc0fdc0 100644 --- a/lib/gtop.js +++ b/lib/gtop.js @@ -2,6 +2,13 @@ var blessed = require('blessed'), contrib = require('blessed-contrib'), monitor = require('./monitor'); +const { argv } = require('yargs'); + +var netInterface = null; + +if(typeof argv.net != 'undefined') { + netInterface = argv.net; +} var screen = blessed.screen() var grid = new contrib.grid({ @@ -17,6 +24,12 @@ var cpuLine = grid.set(0, 0, 4, 12, contrib.line, { showLegend: true, }) +var hostnameWidget = grid.set(0, 8, 1, 2, contrib.markdown, { + label: "HOSTNAME", + fg: "green", + selectedFg: "green" +}) + var memLine = grid.set(4, 0, 4, 8, contrib.line, { showNthLabel: 5, maxY: 100, @@ -69,7 +82,7 @@ var procTable = grid.set(8, 6, 4, 6, contrib.table, { procTable.focus() screen.render(); -screen.on('resize', function(a) { +screen.on('resize', function (a) { cpuLine.emit('attach'); memLine.emit('attach'); memDonut.emit('attach'); @@ -79,24 +92,25 @@ screen.on('resize', function(a) { procTable.emit('attach'); }); -screen.key(['escape', 'q', 'C-c'], function(ch, key) { +screen.key(['escape', 'q', 'C-c'], function (ch, key) { return process.exit(0); }); function init() { new monitor.Cpu(cpuLine); //no Windows support new monitor.Mem(memLine, memDonut, swapDonut); - new monitor.Net(netSpark); + new monitor.Net(netSpark, netInterface); new monitor.Disk(diskDonut); - new monitor.Proc(procTable); // no Windows support + new monitor.Proc(procTable, blessed, screen); // no Windows support + new monitor.Host(hostnameWidget); } -process.on('uncaughtException', function(err) { +process.on('uncaughtException', function (err) { // avoid exiting due to unsupported system resources in Windows }); module.exports = { init: init, monitor: monitor -}; +}; \ No newline at end of file diff --git a/lib/monitor/hostname.js b/lib/monitor/hostname.js new file mode 100644 index 0000000..322be8a --- /dev/null +++ b/lib/monitor/hostname.js @@ -0,0 +1,21 @@ +var si = require('systeminformation'), + utils = require('../utils'); + +var colors = utils.colors; + +function Host(markdown) { + this.markdown = markdown; + + this.interval = setInterval(() => { + this.updateData(); + }, 1000); +} + +Host.prototype.updateData = function () { + si.osInfo((info) => { + this.markdown.setMarkdown(info.hostname); + }) +} + + +module.exports = Host; diff --git a/lib/monitor/index.js b/lib/monitor/index.js index 945fd3a..e8eaf43 100644 --- a/lib/monitor/index.js +++ b/lib/monitor/index.js @@ -3,5 +3,6 @@ module.exports = { Mem: require('./mem'), Net: require('./net'), Disk: require('./disk'), - Proc: require('./proc') + Proc: require('./proc'), + Host: require('./hostname') } diff --git a/lib/monitor/net.js b/lib/monitor/net.js index 9fd0d47..765d3e1 100644 --- a/lib/monitor/net.js +++ b/lib/monitor/net.js @@ -3,23 +3,23 @@ var si = require('systeminformation'), var colors = utils.colors; -function Net(sparkline) { +function Net(sparkline, netInterface) { this.sparkline = sparkline; this.netData = [Array(61).fill(0), Array(61).fill(0)]; - si.networkInterfaceDefault(iface => { - var that = this; - var updater = function() { - si.networkStats(iface, data => { - that.updateData(data[0]); - }); - } - updater(); - this.interval = setInterval(updater, 1000); - }) + si.networkInterfaceDefault(iface => { + var that = this; + var updater = function () { + si.networkStats(netInterface == null ? iface : netInterface, data => { + that.updateData(data[0], netInterface == null ? iface : netInterface); + }); + } + updater(); + this.interval = setInterval(updater, 1000); + }) } -Net.prototype.updateData = function(data) { +Net.prototype.updateData = function (data, iface) { var rx_sec = Math.max(0, data['rx_sec']); var tx_sec = Math.max(0, data['tx_sec']); @@ -30,12 +30,12 @@ Net.prototype.updateData = function(data) { this.netData[1].shift(); this.netData[1].push(tx_sec); - rx_label = 'Receiving: ' + + rx_label = iface + ' Receiving: ' + utils.humanFileSize(rx_sec) + '/s \nTotal received: ' + utils.humanFileSize(data['rx_bytes']); - tx_label = 'Transferring: ' + + tx_label = iface + ' Transferring: ' + utils.humanFileSize(tx_sec) + '/s \nTotal transferred: ' + utils.humanFileSize(data['tx_bytes']); diff --git a/lib/monitor/proc.js b/lib/monitor/proc.js index 921cf4c..3363df6 100644 --- a/lib/monitor/proc.js +++ b/lib/monitor/proc.js @@ -9,7 +9,7 @@ var pars = { m: 'pmem' } -function Proc(table) { +function Proc(table, blessed, screen) { this.table = table; this.pSort = 'pcpu'; @@ -38,6 +38,46 @@ function Proc(table) { updater(); }); + var form; + + this.table.rows.on('select', (node, index) => { + this.selectedProc = node.parent.value.match(/[0-9]+/g)[0]; + + form = blessed.form({ + parent: screen, + width: 60, + height: 4, + keys: true, + border: { + type: 'line' + }, + top: 'center', + left: 'center' + }); + + blessed.text({ + parent: form, + fg: 'green', + content: 'Press y button to kill process #'+this.selectedProc+ ' \n Or, press n button to cancel' + }); + + form.on('submit', (data) => { + screen.remove(form); + process.kill(this.selectedProc, 'SIGHUP'); + }); + + screen.render(); + }); + + screen.key(['y'], (ch, key) => { + form.submit(); + }); + + screen.key(['n'], (ch, key) => { + screen.remove(form); + this.selectedProc = 0; + }); + } Proc.prototype.updateData = function(data) { diff --git a/package-lock.json b/package-lock.json index 3c9ee2f..c019a7b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -68,6 +68,11 @@ "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, "cardinal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-1.0.0.tgz", @@ -102,6 +107,44 @@ "colors": "1.0.3" } }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, "colors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", @@ -112,6 +155,11 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, "drawille-blessed-contrib": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/drawille-blessed-contrib/-/drawille-blessed-contrib-1.0.0.tgz", @@ -129,6 +177,11 @@ "x256": ">=0.0.1" } }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -157,6 +210,19 @@ } } }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, "gl-matrix": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-2.8.1.tgz", @@ -180,11 +246,25 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", @@ -263,6 +343,32 @@ "wordwrap": "~0.0.2" } }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, "picture-tuber": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/picture-tuber/-/picture-tuber-1.0.2.tgz", @@ -300,11 +406,26 @@ "esprima": "~3.0.0" } }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, "sparkline": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/sparkline/-/sparkline-0.1.2.tgz", @@ -314,6 +435,31 @@ "nopt": "~2.1.2" } }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", @@ -342,11 +488,49 @@ "resolved": "https://registry.npmjs.org/term-canvas/-/term-canvas-0.0.5.tgz", "integrity": "sha1-WXr6wvpjaabxeGC86cX2bW6gypY=" }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, "x256": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/x256/-/x256-0.0.2.tgz", @@ -365,6 +549,38 @@ "version": "9.0.7", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yargs": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.0.tgz", + "integrity": "sha512-/is78VKbKs70bVZH7w4YaZea6xcJWOAwkhbR0CFuZBmYtfTYF0xjGJF43AYd8g2Uii1yJwmS5GR2vBmrc32sbg==", + "requires": { + "cliui": "^5.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^15.0.0" + } + }, + "yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-xLTUnCMc4JhxrPEPUYD5IBR1mWCK/aT6+RJ/K29JY2y1vD+FhtgKK0AXRWvI262q3QSffAQuTouFIKUuHX89wQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } } diff --git a/package.json b/package.json index 9d82d60..6fbd30f 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,8 @@ "dependencies": { "blessed": "^0.1.81", "blessed-contrib": "^4.8.16", - "systeminformation": "^4.14.4" + "systeminformation": "^4.14.4", + "yargs": "^14.2.0" }, "engines": { "node": ">=4.0.0"