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

172 lines (171 loc) 5.68 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.getSockets = getSockets; const fs_1 = require("fs"); let sockets = {}; function getSockets() { return __awaiter(this, void 0, void 0, function* () { let promises = []; promises.push(readProcFile("tcp")); promises.push(readProcFile("udp")); promises.push(readProcFile("tcp6")); promises.push(readProcFile("udp6")); yield Promise.all(promises); return sockets; }); } function parseSockets(data, type) { let lines = data.split(/\r\n|\r|\n/); lines.shift(); for (let line of lines) { if (!line) { continue; } let elements = line.trim().split(/\s+/); let inode = elements[9]; sockets[inode] = {}; sockets[inode].protocol = type.slice(0, 3); sockets[inode].state = formatState(elements[3]); [sockets[inode].receiveQueue, sockets[inode].sendQueue] = formatRxTx(elements[4]); if (type.includes("6")) { [sockets[inode].localAddress, sockets[inode].localPort] = formatIPv6(elements[1]); [sockets[inode].peerAddress, sockets[inode].peerPort] = formatIPv6(elements[2]); } else { [sockets[inode].localAddress, sockets[inode].localPort] = formatIPv4(elements[1]); [sockets[inode].peerAddress, sockets[inode].peerPort] = formatIPv4(elements[2]); } let isAddressNull = sockets[inode].localAddress == null || sockets[inode].peerAddress == null; let isAddressLocalhost = sockets[inode].localAddress == sockets[inode].peerAddress || sockets[inode].peerAddress == "localhost"; if (isAddressNull || isAddressLocalhost) { delete sockets[inode]; continue; } sockets[inode].users = {}; sockets[inode].inode = inode; } } function formatIPv4(line) { let lineMap = line.split(":"); let hexAddress = lineMap[0]; let hexPort = lineMap[1]; let hexArray = hexAddress .split(/(..)/g) .filter((s) => s) .map(hexToDecimal); hexArray.reverse(); let address; if (parseInt(hexArray.join("")) == 0) { address = null; } else { address = hexArray.join("."); } let port = hexToDecimal(hexPort) + ""; return [address, port]; } function formatIPv6(line) { let lineMap = line.split(":"); let hexAddress = lineMap[0]; let hexPort = lineMap[1]; let hexArray = hexAddress.split(/(....)/g).filter((s) => s); hexArray.forEach(function (hex, i) { let splitHex = hex.split(/(..)/g).filter((s) => s); splitHex.reverse(); hexArray[i] = splitHex.join(""); }); for (let i = 0; i < hexArray.length; i += 2) { [hexArray[i], hexArray[i + 1]] = [hexArray[i + 1], hexArray[i]]; } let address; let sum = hexToDecimal(hexArray.join("")); if (sum == 0) { address = null; } else if (sum == 1) { address = "::1"; } else if (hexArray.slice(0, 6).join("") == "00000000000000000000FFFF") { let ipV4Part = hexArray[6] + hexArray[7]; address = ipV4Part .split(/(..)/g) .filter((s) => s) .map(hexToDecimal) .join("."); } else { hexArray.forEach(function (hex, i) { let hexInt = parseInt(hex, 16) + ""; hexArray[i] = hexInt == "0000" ? "" : hexArray[i]; }); address = hexArray.join(":"); } let port = hexToDecimal(hexPort) + ""; return [address, port]; } function formatRxTx(line) { let lineMap = line.split(":"); let rx = hexToDecimal(lineMap[0]) + ""; let tx = hexToDecimal(lineMap[1]) + ""; return [rx, tx]; } function formatState(hex) { let state = ""; switch (hex) { case "01": state = "ESTAB"; break; case "02": state = "SYN_SENT"; break; case "03": state = "SYN_RECV"; break; case "04": state = "FIN_WAIT1"; break; case "05": state = "FIN_WAIT2"; break; case "06": state = "TIME_WAIT"; break; case "07": state = "CLOSED"; break; case "08": state = "CLOSE_WAIT"; break; case "09": state = "LAST_ACK"; break; case "0A": state = "LISTEN"; break; case "0B": state = "CLOSING"; break; case "0C": state = "NEW_SYN_RECV"; break; } return state; } function readProcFile(file) { return __awaiter(this, void 0, void 0, function* () { let content = (0, fs_1.readFileSync)("/proc/net/" + file, "utf8"); parseSockets(content, file); }); } function hexToDecimal(str) { return parseInt(Number("0x" + str) + "", 10); }