summaryrefslogtreecommitdiffstats
path: root/node_modules/pstree.remy/lib
diff options
context:
space:
mode:
authorGravatar Piotr Russ <mail@pruss.it> 2020-11-16 00:10:28 +0100
committerGravatar Piotr Russ <mail@pruss.it> 2020-11-16 00:10:28 +0100
commite06ec920f7a5d784e674c4c4b4e6d1da3dc7391d (patch)
tree55713f725f77b44ebfec86e4eec3ce33e71458ca /node_modules/pstree.remy/lib
downloadwebsite_creator-e06ec920f7a5d784e674c4c4b4e6d1da3dc7391d.tar.gz
website_creator-e06ec920f7a5d784e674c4c4b4e6d1da3dc7391d.tar.bz2
website_creator-e06ec920f7a5d784e674c4c4b4e6d1da3dc7391d.zip
api, login, auth
Diffstat (limited to 'node_modules/pstree.remy/lib')
-rw-r--r--node_modules/pstree.remy/lib/index.js37
-rw-r--r--node_modules/pstree.remy/lib/tree.js37
-rw-r--r--node_modules/pstree.remy/lib/utils.js53
3 files changed, 127 insertions, 0 deletions
diff --git a/node_modules/pstree.remy/lib/index.js b/node_modules/pstree.remy/lib/index.js
new file mode 100644
index 0000000..743e997
--- /dev/null
+++ b/node_modules/pstree.remy/lib/index.js
@@ -0,0 +1,37 @@
+const exec = require('child_process').exec;
+const tree = require('./tree');
+const utils = require('./utils');
+var hasPS = true;
+
+// discover if the OS has `ps`, and therefore can use psTree
+exec('ps', (error) => {
+ module.exports.hasPS = hasPS = !error;
+});
+
+module.exports = function main(pid, callback) {
+ if (typeof pid === 'number') {
+ pid = pid.toString();
+ }
+
+ if (hasPS && !process.env.NO_PS) {
+ return tree(pid, callback);
+ }
+
+ utils
+ .getStat()
+ .then(utils.tree)
+ .then((tree) => utils.pidsForTree(tree, pid))
+ .then((res) =>
+ callback(
+ null,
+ res.map((p) => p.PID)
+ )
+ )
+ .catch((error) => callback(error));
+};
+
+if (!module.parent) {
+ module.exports(process.argv[2], (e, pids) => console.log(pids));
+}
+
+module.exports.hasPS = hasPS;
diff --git a/node_modules/pstree.remy/lib/tree.js b/node_modules/pstree.remy/lib/tree.js
new file mode 100644
index 0000000..bac7cce
--- /dev/null
+++ b/node_modules/pstree.remy/lib/tree.js
@@ -0,0 +1,37 @@
+const spawn = require('child_process').spawn;
+
+module.exports = function (rootPid, callback) {
+ const pidsOfInterest = new Set([parseInt(rootPid, 10)]);
+ var output = '';
+
+ // *nix
+ const ps = spawn('ps', ['-A', '-o', 'ppid,pid']);
+ ps.stdout.on('data', (data) => {
+ output += data.toString('ascii');
+ });
+
+ ps.on('close', () => {
+ try {
+ const res = output
+ .split('\n')
+ .slice(1)
+ .map((_) => _.trim())
+ .reduce((acc, line) => {
+ const pids = line.split(/\s+/);
+ const ppid = parseInt(pids[0], 10);
+
+ if (pidsOfInterest.has(ppid)) {
+ const pid = parseInt(pids[1], 10);
+ acc.push(pid);
+ pidsOfInterest.add(pid);
+ }
+
+ return acc;
+ }, []);
+
+ callback(null, res);
+ } catch (e) {
+ callback(e, null);
+ }
+ });
+};
diff --git a/node_modules/pstree.remy/lib/utils.js b/node_modules/pstree.remy/lib/utils.js
new file mode 100644
index 0000000..8fa5719
--- /dev/null
+++ b/node_modules/pstree.remy/lib/utils.js
@@ -0,0 +1,53 @@
+const spawn = require('child_process').spawn;
+
+module.exports = { tree, pidsForTree, getStat };
+
+function getStat() {
+ return new Promise((resolve) => {
+ const command = `ls /proc | grep -E '^[0-9]+$' | xargs -I{} cat /proc/{}/stat`;
+ const spawned = spawn('sh', ['-c', command], {
+ stdio: ['pipe', 'pipe', 'pipe'],
+ });
+
+ var res = '';
+ spawned.stdout.on('data', (data) => (res += data));
+ spawned.on('close', () => resolve(res));
+ });
+}
+
+function template(s) {
+ var stat = null;
+ // 'pid', 'comm', 'state', 'ppid', 'pgrp'
+ // %d (%s) %c %d %d
+ s.replace(
+ /(\d+) \((.*?)\)\s(.+?)\s(\d+)\s/g,
+ (all, PID, COMMAND, STAT, PPID) => {
+ stat = { PID, COMMAND, PPID, STAT };
+ }
+ );
+
+ return stat;
+}
+
+function tree(stats) {
+ const processes = stats.split('\n').map(template).filter(Boolean);
+
+ return processes;
+}
+
+function pidsForTree(tree, pid) {
+ if (typeof pid === 'number') {
+ pid = pid.toString();
+ }
+ const parents = [pid];
+ const pids = [];
+
+ tree.forEach((proc) => {
+ if (parents.indexOf(proc.PPID) !== -1) {
+ parents.push(proc.PID);
+ pids.push(proc);
+ }
+ });
+
+ return pids;
+}