diff --git a/lib/gtop.js b/lib/gtop.js index 2e62772..d9975e0 100644 --- a/lib/gtop.js +++ b/lib/gtop.js @@ -87,7 +87,7 @@ function init() { new monitor.Mem(memLine, memDonut, swapDonut); new monitor.Net(netSpark); new monitor.Disk(diskDonut); - new monitor.Proc(procTable); // no Windows support + new monitor.Proc(procTable, screen); // no Windows support } process.on('uncaughtException', function(err) { diff --git a/lib/monitor/proc.js b/lib/monitor/proc.js index 415d3f5..f99a03f 100644 --- a/lib/monitor/proc.js +++ b/lib/monitor/proc.js @@ -9,7 +9,11 @@ var pars = { m: 'mem', }; -function Proc(table) { +const blessed = require("blessed") +let processSearchTerm = "" + +function Proc(table, screen) { + this.screen = screen this.table = table; this.pSort = pars.c; @@ -20,7 +24,18 @@ function Proc(table) { var updater = function() { si.processes(data => { - that.updateData(data); + + // If processSearchTerm looks like a regular expression use that to filter + // the process list. Otherwise, just do a simple string match. + if (processSearchTerm.length > 0) { + if (processSearchTerm[0] === "/" && processSearchTerm[processSearchTerm.length - 1] === "/") { + const regex = new RegExp(processSearchTerm.slice(1, -1)) + data.list = data.list.filter(p => regex.test(p.name.toLowerCase()) || regex.test(p.command.toLowerCase())) + } else { + data.list = data.list.filter(p => p.name.toLowerCase().includes(processSearchTerm) || p.command.toLowerCase().includes(processSearchTerm)) + } + } + that.updateData(data) }); }; updater(); @@ -35,6 +50,23 @@ function Proc(table) { that.reIndex = true; updater(); }); + + this.screen.key(['s'], (ch, key) => { + try { + const dialogMessage = + `Enter Search Parameter + (Use regular expressions by wrapping in //)` + let searchPrompt = blessed.prompt({top: "top", left: "center", width: "shrink", height: "shrink", border: { type: "line" }}) + screen.append(searchPrompt) + searchPrompt.readInput(dialogMessage, processSearchTerm, (err, obj) => { + processSearchTerm = err ? "" : obj.toString().toLowerCase() + }) + updater() + } catch (e) { + console.log(e.message) + consol.error(e) + } + }) } Proc.prototype.updateData = function(data) { @@ -53,7 +85,11 @@ Proc.prototype.updateData = function(data) { ]; }); - var headers = ['PID', 'Command', '%CPU', '%MEM']; + let searchedCommand = `Command` + if (processSearchTerm.length > 0) { + searchedCommand = `Command (${processSearchTerm})` + } + var headers = ['PID', searchedCommand, '%CPU', '%MEM']; headers[ { diff --git a/package-lock.json b/package-lock.json index 88ccf0c..8592fba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "gtop", - "version": "1.1.2", + "version": "1.1.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "gtop", - "version": "1.1.2", + "version": "1.1.3", "license": "MIT", "dependencies": { "blessed": "^0.1.81", @@ -17,6 +17,7 @@ "gtop": "bin/gtop" }, "devDependencies": { + "@types/blessed": "^0.1.19", "marked-man": "^0.7.0", "prettier": "1.19.1" }, @@ -24,6 +25,21 @@ "node": ">=4.0.0" } }, + "node_modules/@types/blessed": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@types/blessed/-/blessed-0.1.19.tgz", + "integrity": "sha512-r4qnseYWBsi/kxo5AAlCS22EnTXFbGpnvuXUubJikVeRnYB3e5HwV3NtcwJ0Sk5KOGaLvo9Rtwb8hzxfbqbQPg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "18.13.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz", + "integrity": "sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==", + "dev": true + }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -695,6 +711,21 @@ } }, "dependencies": { + "@types/blessed": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@types/blessed/-/blessed-0.1.19.tgz", + "integrity": "sha512-r4qnseYWBsi/kxo5AAlCS22EnTXFbGpnvuXUubJikVeRnYB3e5HwV3NtcwJ0Sk5KOGaLvo9Rtwb8hzxfbqbQPg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/node": { + "version": "18.13.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz", + "integrity": "sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==", + "dev": true + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", diff --git a/package.json b/package.json index ba26a0f..1af4f9e 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,9 @@ "lint-check": "prettier --check --single-quote --trailing-comma es5 'lib/**/*.js'", "prepublishOnly": "marked-man --version $npm_package_version --manual 'Gtop Help' --section 1 ./CLI.md > gtop.1" }, - "man": ["./gtop.1"], + "man": [ + "./gtop.1" + ], "repository": { "type": "git", "url": "git+https://github.com/aksakalli/gtop.git" @@ -42,6 +44,7 @@ "node": ">=4.0.0" }, "devDependencies": { + "@types/blessed": "^0.1.19", "marked-man": "^0.7.0", "prettier": "1.19.1" }