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
JavaScript
;
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));
}