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

205 lines (186 loc) 4.72 kB
import { Box } from "neo-blessed"; import { readFile } from "fs"; import { join } from "path"; import { whois } from "../utils/whois"; let screen: any; let currentBox: any = null; const strings = {}; const stringsNames = ["ports", "protocols", "queues", "states"]; // Load strings stringsNames.forEach(function (name) { readFile(join(__dirname, "..", "..", "src", "strings", name + ".json"), (err: any, data: any) => { if (err) throw err; strings[name] = JSON.parse(data); }); }); export function setDefaultScreen(defaultScreen: any) { screen = defaultScreen; } /** * If a popup exists in currentBox var, focus it. */ export function focusPopup() { if (currentBox != null) { currentBox.focus(); } } /** * Remove popup currently stored in currentBox var and returns focus to main table. */ export function removePopup() { if (currentBox == null) { return; } screen.remove(currentBox); currentBox = null; screen.rewindFocus(); screen.render(); } /** * Store a blessed box in currentBox var and adds keybindings. * * @param content - Text content * @param escapable=true - Is popup escapable with keys */ function createPopup(content: string | null, escapable = true) { if (content == null) { return; } currentBox = createBox(content); if (escapable) { currentBox.key(["enter", "escape"], function () { removePopup(); }); } screen.append(currentBox); screen.render(); currentBox.focus(); } /** * Handle popup creation event according to selected table cell. * * @param column - Column number to determine content type * @param content - Table cell content */ export function handlePopup(column: number, content: string | null) { switch (column) { case 0: createPopup(strings["protocols"][content]); break; case 1: createPopup(strings["states"][content]); break; case 2: createPopup(strings["queues"]["receiveQueue"]); break; case 3: createPopup(strings["queues"]["sendQueue"]); break; case 4: break; case 5: createPopup(getPortText(content)); break; case 6: createPopup("Wait for Whois...", false); whois(content).then(function (response: string) { removePopup(); createPopup(response); }); break; case 7: createPopup(getPortText(content)); break; case 8: createPopup(getUsersText(content)); break; } } /** * Determine if the content is longer than half of screen height. If so, the popup can shrink. * * @param content - Text content */ function canShrink(content: string): boolean { let maxShrinkSize = Math.floor((Math.floor(screen.lines.length / 2) - 1) / 2); let numberOfLines = content.split(/\r\n|\r|\n/).length; return numberOfLines < maxShrinkSize; } /** * Create a blessed Box object with given content. * * @param {string} content - Text content */ function createBox(content: string): Box { let height = "50%"; let scrollable = true; if (canShrink(content)) { height = "shrink"; scrollable = false; } return Box({ top: "center", left: "center", width: "shrink", height: height, scrollable: scrollable, alwaysScroll: true, keys: true, content: content.trim(), tags: true, border: { type: "line", }, style: { fg: "white", border: { fg: "#f0f0f0", }, }, }); } /** * Get popup text content for ports. * * @param port - Port number */ function getPortText(port: string | null): string { let assignment = strings["ports"][port]; if (assignment == undefined) { return "This port is not assigned"; } let text = "{bold}This port is assigned to:{/bold} " + assignment + "\n"; text += "Note that regardless of a port assignment, it can be used in any way."; return text; } /** * Get popup text content for users. * * @param {Object} users - Users object */ function getUsersText(users: any): string | null { if (users.text == "/") { return null; } let text: string = ""; let length: number = Object.keys(users).length - 1; for (let i = 0; i < length; i++) { if (length > 1) { text += "{bold} - - User " + (i + 1) + " - -{/bold}\n"; } text += "{bold}Name:{/bold} " + users[i].name + "\n"; text += "{bold}PID:{/bold} " + users[i].pid + "\n"; text += "{bold}Owner:{/bold} " + users[i].owner + "\n"; text += "{bold}Command:{/bold} " + users[i].cmdline.trim() + "\n"; if (i < length - 1) { text += "\n\n"; } } return text; } /** * Display loading popup. */ export function loadingPopup() { createPopup("Loading{blink}...{/blink}", false); }