UNPKG

@onlabsorg/stilo

Version:

Command line tool for managing olojs document packages

200 lines (186 loc) 5.01 kB
'use strict'; const ProcfsError = require('./lib/procfs-error'); const parsers = require('./lib/parsers'); const { read, readLink, readBuffer, readdir, devIdGetMinor, devIdGetMajor, devIdFromMajorMinor, } = require('./lib/utils'); class Procfs { constructor(root) { if (root === undefined) { root = '/proc'; } this.root = root; this.rootSlash = `${root}/`; } processes() { try { return parsers.processes(readdir(this.root)); } catch (error) { /* istanbul ignore next should not ever happen when procfs exists */ throw ProcfsError.generic(error); } } processFds(pid) { if (pid !== undefined && (!Number.isInteger(pid) || pid <= 0)) { throw new TypeError('pid'); } try { return parsers.processFds(readdir(`${this.rootSlash}${pid === undefined ? 'self' : pid}/fd`)); } catch (error) { throw ProcfsError.generic(error); } } processThreads(pid) { if (pid !== undefined && (!Number.isInteger(pid) || pid <= 0)) { throw new TypeError('pid'); } try { return parsers.processThreads(readdir(`${this.rootSlash}${pid === undefined ? 'self' : pid}/task`)); } catch (error) { throw ProcfsError.generic(error); } } processFdinfo(fd, pid) { if (pid !== undefined && !(Number.isInteger(pid) && pid >= 0)) { throw new TypeError('pid'); } if (!Number.isInteger(fd) || fd <= 0) { throw new TypeError('fd'); } try { return parsers.processFdinfo(read(`${this.rootSlash}${pid === undefined ? 'self' : pid}/fdinfo/${fd}`)); } catch (error) { throw ProcfsError.generic(error); } } processFd(fd, pid) { if (pid !== undefined && !(Number.isInteger(pid) && pid >= 0)) { throw new TypeError('pid'); } if (!Number.isInteger(fd) || fd <= 0) { throw new TypeError('fd'); } try { return parsers.processFd(readLink(`${this.rootSlash}${pid === undefined ? 'self' : pid}/fd/${fd}`)); } catch (error) { throw ProcfsError.generic(error); } } config() { try { return parsers.config(readBuffer(`${this.rootSlash}config.gz`)); } catch (error) { /* istanbul ignore next should not ever happen when procfs exists and kernel properly configured */ throw ProcfsError.generic(error); } } } Procfs.prototype.devIdGetMinor = devIdGetMinor; Procfs.prototype.devIdGetMajor = devIdGetMajor; Procfs.prototype.devIdFromMajorMinor = devIdFromMajorMinor; for (let [name, path] of [ ['processExe', '/exe'], ['processCwd', '/cwd'], ]) { Procfs.prototype[name] = function (pid) { if (pid !== undefined && !(Number.isInteger(pid) && pid >= 0)) { throw new TypeError('pid'); } try { return parsers[name](readLink(`${this.rootSlash}${pid === undefined ? 'self' : pid}${path}`)); } catch (error) { throw ProcfsError.generic(error); } }; } for (let [name, path] of [ ['processMountinfo', '/mountinfo'], ['processIo', '/io'], ['processUidMap', '/uid_map'], ['processGidMap', '/gid_map'], ['processEnviron', '/environ'], ['processOomScore', '/oom_score'], ['processTimerslackNs', '/timerslack_ns'], ['processCmdline', '/cmdline'], ['processAutogroup', '/autogroup'], ['processStatm', '/statm'], ['processComm', '/comm'], ['processPersonality', '/personality'], ['processCgroups', '/cgroup'], ['processCpuset', '/cpuset'], ['processLimits', '/limits'], ['processStat', '/stat'], ['processStatus', '/status'], ['processNetDev', '/net/dev'], ['processNetWireless', '/net/wireless'], ['processNetUnix', '/net/unix'], ['processNetTcp4', '/net/tcp'], ['processNetTcp6', '/net/tcp6'], ['processNetUdp4', '/net/udp'], ['processNetUdp6', '/net/udp6'], ]) { Procfs.prototype[name] = function (pid) { if (pid !== undefined && !(Number.isInteger(pid) && pid >= 0)) { throw new TypeError('pid'); } try { return parsers[name](read(`${this.rootSlash}${pid === undefined ? 'self' : pid}${path}`)); } catch (error) { throw ProcfsError.generic(error); } }; } for (let name of [ 'cpuinfo', 'loadavg', 'uptime', 'version', 'cmdline', 'swaps', 'stat', 'devices', 'filesystems', 'diskstats', 'partitions', 'meminfo', 'cgroups', ]) { Procfs.prototype[name] = function () { try { return parsers[name](read(this.rootSlash + name)); } catch (error) { /* istanbul ignore next should not ever happen when procfs exists */ throw ProcfsError.generic(error); } }; } for (let [name, parser, path] of [ ['netDev', 'processNetDev', 'net/dev'], ['netWireless', 'processNetWireless', 'net/wireless'], ['netUnix', 'processNetUnix', 'net/unix'], ['netTcp4', 'processNetTcp4', 'net/tcp'], ['netTcp6', 'processNetTcp6', 'net/tcp6'], ['netUdp4', 'processNetUdp4', 'net/udp'], ['netUdp6', 'processNetUdp6', 'net/udp6'], ]) { Procfs.prototype[name] = function () { try { return parsers[parser](read(this.rootSlash + path)); } catch (error) { /* istanbul ignore next should not ever happen when procfs exists */ throw ProcfsError.generic(error); } }; } const procfs = new Procfs(); module.exports = { procfs, Procfs, ProcfsError, };