import { sortJsonArrayByKey } from "Library.js"; /** @param {NS} ns */ export async function main(ns) { //ns.tail(); ns.disableLog("ALL"); const sScript = ns.args[0]; // script let nThreads = ns.args[1]; // threads const sTarget = ns.args[2]; // target server const bRepeat = ns.args[3]; // should this script loop const nMsecDelay = ns.args[4]; // MsecDelay const sWeakenScript = "RMweaken.js"; const sGrowScript = "RMgrow.js"; const sHackScript = "RMhack.js"; const sListName = "serverList.txt"; const sWorkerList = "WorkerList.txt"; if (!ns.fileExists(sListName, "home")) { ns.print(`ERROR ${sListName} does not exist.`); return false; }; let sServerList = ns.read(sListName); let aSortedList; if (sScript === sWeakenScript || sScript === sGrowScript) { aSortedList = sortJsonArrayByKey(sServerList, "serverCores", "maxRam").reverse(); } else { aSortedList = sortJsonArrayByKey(sServerList, "serverCores", "maxRam"); } //ns.tprint(aSortedList); ns.print(sScript); ns.print(nThreads); ns.print(sTarget); const nScriptSize = ns.getScriptRam(sScript, "home"); let nTotalSize = nScriptSize * nThreads; ns.print("nScriptSize = " + nScriptSize); ns.print("nTotalSize = " + nTotalSize); // get sorted list of most cores servers /* aSortedList.forEach((entry) => { if (entry.rootAccess && entry.maxRam >= 1 && entry.serverCores > 1) { // if cores equal to previous entry put into same array? } }) */ // get total free RAM per number of cores // calculate effect of cores on each server with cores > 1 // update nThreads // run weaken/grow on core servers until cores = 1 // get sorted list of biggest RAM servers // get total free RAM on core 1 servers // run remaining weaken/grow // run hack untill RAM on cores 1 servers run out // run remaining hacks on smallest to biggest core servers aSortedList.forEach((entry) => { let sHost = entry.serverName; ns.print("sHost = " + sHost) let nFreeRAM = ns.getServerMaxRam(entry.serverName) - ns.getServerUsedRam(entry.serverName); if (nThreads >= 1 && entry.rootAccess && nFreeRAM >= nTotalSize) { ns.scp(sScript, sHost); ns.exec(sScript, sHost, nThreads, sTarget, bRepeat, nMsecDelay); nThreads = 0; nFreeRAM = ns.getServerMaxRam(entry.serverName) - ns.getServerUsedRam(entry.serverName); } else if (nThreads >= 1 && entry.rootAccess && nFreeRAM >= nScriptSize) { let nThreadsDist = Math.floor(nFreeRAM / nScriptSize); ns.scp(sScript, sHost); ns.print("room for : " + nThreadsDist + " scripts"); ns.exec(sScript, sHost, nThreadsDist, sTarget, bRepeat, nMsecDelay); nThreads -= nThreadsDist; nFreeRAM = ns.getServerMaxRam(entry.serverName) - ns.getServerUsedRam(entry.serverName); } }); /* for (i = 0; ; i++) { let sHost = ""; ns.exec(sScript, sHost, nThreads, sTarget, bRepeat, nMsecDelay); } */ }