From 81717ac7461a5bf9f5c81830527ac5def4fc8425 Mon Sep 17 00:00:00 2001 From: Isaac Shoebottom Date: Fri, 3 Nov 2023 14:25:02 -0300 Subject: [PATCH] Add some util functions --- servers/home/utils.ts | 92 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 90 insertions(+), 2 deletions(-) diff --git a/servers/home/utils.ts b/servers/home/utils.ts index 4e5505a..c5acc4d 100644 --- a/servers/home/utils.ts +++ b/servers/home/utils.ts @@ -1,7 +1,15 @@ +// noinspection JSUnusedGlobalSymbols + import {NS} from "NetscriptDefinitions"; + +/** + * Recursively scans all servers connected to the current server, excluding home + * @param ns global NS object + * @returns A list of all servers connected to the current server + */ export function recursiveScan(ns: NS) { // Starting case - let servers = ns.scan(ns.getHostname()); + let servers = ns.scan("home"); // Add all servers to the list let allServers: string[] = []; while (servers.length > 0) { @@ -17,7 +25,87 @@ export function recursiveScan(ns: NS) { } } // Remove the current server - allServers.splice(allServers.indexOf(ns.getHostname()), 1); + allServers.splice(allServers.indexOf("home"), 1); // Print all servers return allServers; +} + +/** + * Removes files passed in from all servers + * @param ns Global NS object + * @param files The files to remove + * @returns void + * @example Removes all files from the folder "no-ports" from all servers. + * removeFilesOnAllServers(ns, ns.ls("home", "no-ports")); + * @note ns.ls() returns the full path of every file, so if the file is not in the same place in every server, + * you will need to modify each file path to match the server you are removing it from. + */ +export function removeFilesOnAllServers(ns: NS, files: string[]) { + let hosts = recursiveScan(ns); + for(const host of hosts) { + for (const file of files) { + ns.rm(file, host) + } + } +} + +/** + * Tries to gain root access to a server + * @param ns Global NS object + * @param server The server to gain root access to + * @returns The number of programs used to gain root access + */ +export function rootServer(ns: NS, server: string) { + let counter = 0; + if (ns.fileExists("BruteSSH.exe", "home")) { + ns.brutessh(server); + counter++; + } + if (ns.fileExists("FTPCrack.exe", "home")) { + ns.ftpcrack(server); + counter++; + } + if (ns.fileExists("SMTPCrack.exe", "home")) { + ns.relaysmtp(server); + counter++; + } + if (ns.fileExists("HTTPWorm.exe", "home")) { + ns.httpworm(server); + counter++; + } + if (ns.fileExists("SQLInject.exe", "home")) { + ns.sqlinject(server); + counter++; + } + ns.nuke(server) + return counter; +} + +/** + * Performs a function on a server if the player is capable of doing so, otherwise returns false + * @param ns Global NS object + * @param server The server to perform the function on + * @param func The function to perform + * @param args The arguments to pass to the function + * @returns The result of the function if it is performed or true if the function does not return anything, otherwise false + */ +export function performFunctionIfCapable(ns: NS, server: string, func: CallableFunction, args: any[]) { + if (ns.getHackingLevel() < ns.getServerRequiredHackingLevel(server)) { + return false; + } + if (ns.getServerNumPortsRequired(server) < ns.getServer(server).openPortCount) { + if (rootServer(ns, server) < ns.getServerNumPortsRequired(server)) { + return false; + } + } + if (!ns.hasRootAccess(server)) { + return false; + + } + let result = func(...args); + if (result === undefined) { + return true; + } else { + return result; + } } \ No newline at end of file