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