UNPKG

neoss

Version:

<div align="center"> <h1>neoss</h1> <i>Socket statistics, with a UI.</i> </div> <p align="center"> <a href="https://img.shields.io/github/v/release/pablolec/neoss" target="_blank"> <img src="https://img.shields.io/github/v/release/pablolec/neo

101 lines (100 loc) 3.56 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getUsedSockets = getUsedSockets; exports.getUserData = getUserData; const fs_1 = require("fs"); const child_process_1 = require("child_process"); let socketMap; function getUsedSockets() { return __awaiter(this, void 0, void 0, function* () { socketMap = {}; let processes = []; let files = (0, fs_1.readdirSync)("/proc/"); files.forEach((file) => { if (isNumeric(file)) { processes.push(file); } }); let procPromises = []; processes.forEach((proc, i) => { procPromises.push(Promise.race([timeout(100), getProcSockets(proc)])); }); yield Promise.allSettled(procPromises); return socketMap; }); } function getProcSockets(proc) { return __awaiter(this, void 0, void 0, function* () { let fd = "/proc/" + proc + "/fd/"; let files; try { files = (0, fs_1.readdirSync)(fd); } catch (EACCES) { return; } let sockets = []; files.forEach((file) => { let linkString; try { linkString = (0, fs_1.readlinkSync)(fd + file); } catch (ENOENT) { return; } if (linkString && linkString.includes("socket")) { let match = linkString.match(/socket:\[(\d+)]/); if (match != null) { sockets.push(match[1]); } } }); sockets.forEach((socket) => { if (socket in socketMap) { socketMap[socket].push(proc); } else { socketMap[socket] = [proc]; } }); }); } function getUserData(user) { return __awaiter(this, void 0, void 0, function* () { let status; try { status = (0, fs_1.readFileSync)("/proc/" + user + "/status", "utf8"); } catch (ENOENT) { return ["error", "error", "error"]; } let lines = status.split(/\r\n|\r|\n/); let name = lines[0].trim().split(/\s+/)[1]; let uid = lines[9].trim().split(/\s+/)[1]; let owner = (0, child_process_1.execSync)("id -nu " + uid) + ""; let cmdline; try { let cmdlineFile = (0, fs_1.readFileSync)("/proc/" + user + "/cmdline", "utf8"); cmdline = cmdlineFile.split("\0").join(" "); } catch (ENOENT) { cmdline = "Unable to retrieve cmdline. Process already terminated."; } return [name, owner.trim(), cmdline]; }); } function isNumeric(str) { return !isNaN(parseInt(str)); } function timeout(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); }