import { sortJsonArrayByKey } from "Library.js"; /** @param {NS} ns */ export async function main(ns) { //ns.tail(); ns.disableLog("scp"); let aArgs = ns.args; const sScript = aArgs.shift(); let nThreads = aArgs.shift(); if (nThreads === undefined) { nThreads = 1 }; ns.print(aArgs); const aScriptFiles = ns.ls("home", ".js"); const aTXTFiles = ns.ls("home", ".txt"); //ns.tprint(aScriptFiles); //ns.tprint(aTXTFiles); const sWeakenScript = "RMweaken.js"; const sGrowScript = "RMgrow.js"; const sListName = "serverList.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.print(sScript); ns.print(nThreads); const nScriptSize = ns.getScriptRam(sScript, "home"); let nTotalSize = nScriptSize * nThreads; ns.print("nScriptSize = " + nScriptSize); ns.print("nTotalSize = " + nTotalSize); 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 && entry.serverName !== "home") { ns.scp(aScriptFiles, sHost), "home"; ns.scp(aTXTFiles, sHost), "home"; ns.exec(sScript, sHost, nThreads, ...aArgs); nThreads = 0; nFreeRAM = ns.getServerMaxRam(entry.serverName) - ns.getServerUsedRam(entry.serverName); } else if (nThreads >= 1 && entry.rootAccess && nFreeRAM >= nScriptSize && entry.serverName !== "home") { let nThreadsDist = Math.floor(nFreeRAM / nScriptSize); ns.scp(aScriptFiles, sHost), "home"; ns.scp(aTXTFiles, sHost), "home"; ns.print("room for : " + nThreadsDist + " scripts"); ns.exec(sScript, sHost, nThreadsDist, ...aArgs); nThreads -= nThreadsDist; nFreeRAM = ns.getServerMaxRam(entry.serverName) - ns.getServerUsedRam(entry.serverName); } else if (nThreads >= 1 && entry.rootAccess && nFreeRAM >= nTotalSize) { if (entry.serverName !== "home"){ ns.scp(aScriptFiles, sHost), "home"; ns.scp(aTXTFiles, sHost), "home"; } ns.exec(sScript, sHost, nThreads, ...aArgs); 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); if (entry.serverName !== "home"){ ns.scp(aScriptFiles, sHost), "home"; ns.scp(aTXTFiles, sHost), "home"; } ns.print("room for : " + nThreadsDist + " scripts"); ns.exec(sScript, sHost, nThreadsDist, ...aArgs); nThreads -= nThreadsDist; nFreeRAM = ns.getServerMaxRam(entry.serverName) - ns.getServerUsedRam(entry.serverName); } }); }