import { NS, Server } from '@ns' /** @param {NS} ns */ export async function main(ns: NS): Promise { if (ns.args.length == 0) { ns.tprint("argument required") ns.tprint("search all server and print to json") ns.tprint("run cmd [filePath]") ns.exit() } const filePath = String(ns.args[0]) const collectedData = selectAllServerList(ns) const buf = JSON.stringify(collectedData, undefined, 2) await ns.write(filePath, buf, "w") } export interface ServerInfo extends Server{ relHost:string[]; } /** * @param {NS} ns * @param func */ export function visitAllServerList(ns: NS, func:(data: ServerInfo)=>void):void { /** @type {string[]} */ const queue: string[] = ["home"] /** @type {Set} */ const visited = new Set() //breadth first search while (queue.length > 0) { const vHost = queue.pop() // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const data = getServersInfo(ns, vHost!) func(data) visited.add(vHost) for (const h of data.relHost) { if (!visited.has(h)) { queue.push(h) } } } } /**@param {NS} ns */ export function selectAllServerList(ns: NS): ServerInfo[] { const collectedData: ServerInfo[] = [] visitAllServerList(ns, (data) => { collectedData.push(data) }) return collectedData } export function isRootedServer(server:Server):boolean{ return server.hasAdminRights } export function selectRootedServerList(ns:NS): ServerInfo[]{ return selectAllServerList(ns).filter(isRootedServer) } /** @param {NS} ns * @param {string} host * @return {Server & {relHost: string[]}} */ export function getServersInfo(ns: NS, host: string): ServerInfo { const neighbor = ns.scan(host) const info = ns.getServer(host) return { ...info, relHost: neighbor } }