Advertisement
Guest User

hopefully better

a guest
Jun 21st, 2023
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /** @param {NS} ns */
  2. export async function main(ns) {
  3.  
  4.   /**Settings definitions*/
  5.  
  6.   const securityThresh = 1.5;// if security level is more than value * minimum security level
  7.   const moneyThresh = 0.8;// if available money is less than value * maximum money
  8.   const percentTakenPerHack = 0.1;// sets the
  9.   const maxScanDepth = 20;// Sets max depth(# of connections between this and home) to scan to
  10.   const settings = { // groups settings together for passing between functions
  11.     securityThresh: securityThresh,
  12.     moneyThresh: moneyThresh,
  13.     percentTakenPerHack: percentTakenPerHack,
  14.     maxScanDepth: maxScanDepth
  15.   };
  16.  
  17.   /**Variable declarations*/
  18.  
  19.   var allServers = getallservers(settings) // array of all servers and their ram capacity
  20.   var scriptServers = allServers.filter(filterByRamCap);// filtered array of servers with enough ram to run scripts as objects
  21.   var targetInfo = {   // scripts will be deployed based on this information
  22.     name: ns.args[0],
  23.     hackLvlReq: ns.getServerRequiredHackingLevel(ns.args[0]),
  24.     maxMoney: ns.getServerMaxMoney(ns.args[0]),
  25.     minSecurity: ns.getServerMinSecurityLevel(ns.args[0])
  26.   };
  27.  
  28.   /**Preparing server environment*/
  29.  
  30.   await attackAllServers(...allServers);// gains root access to as many servers as possible
  31.  
  32.   /**Program logic*/
  33.  
  34.   while (true) {
  35.     let scriptType = chooseScriptType(settings, targetInfo);// determines what operation the program should initiate
  36.     // scriptType has properties(scriptName, cost, waitTime)
  37.     for (let target of findRam(scriptType.scriptName, getNeededThreads(scriptType, targetInfo, settings), ...scriptServers)) {
  38.       //getNeededThreads returns an integer
  39.       //findRam returns an array of objects with properties(serverName, threadCount)
  40.       ns.scp(scriptType.scriptName, target.serverName, "home");
  41.       ns.exec(scriptType.scriptName, target.serverName, target.threadCount, targetInfo.name);
  42.     };
  43.     await ns.sleep(scriptType.waitTime);// waits for scripts to finish before proceeding
  44.     await ns.sleep(1000);// prevents freezing from infinite looping
  45.   }
  46.  
  47.  
  48.   /**Filtering functions*/
  49.  
  50.  
  51.   function filterByRamCap(serverObj) { // Return true if serverobj has more than the ram needed to run scripts
  52.     if (serverObj.ramCap > 2) {  // else will return false
  53.       return true;
  54.     }
  55.     return false;
  56.   }
  57.  
  58.  
  59.   /**Returning/Synched Functions*/
  60.  
  61.  
  62.   function getallservers(settings) {
  63.     // settings has properties( maxScanDepth, moneyThresh,percentTakenPerHack, securityThresh)
  64.     let serverList = [{ name: "home", ramCap: ns.getServerMaxRam("home") }]; // Iterable list of server objects
  65.     for (let i = 0; i < settings.maxScanDepth; i++) { // Causes scan to run recursively maxDepth times
  66.       for (let serverObj of serverList) { // Scans serverList for connections not already listed.
  67.         let moreServerObjs = ns.scan(serverObj.name);
  68.         for (let moreServerObj of moreServerObjs) { // checks if found connections are already listed
  69.           let testServerObj = { // temporary object made to test for redundancy
  70.             name: moreServerObj,
  71.             ramCap: ns.getServerMaxRam(moreServerObj)
  72.           };
  73.           if (!serverList.some(obj => obj.name === testServerObj.name)) {
  74.             // runs if testServerObj does not share a name property with any index of serverList
  75.             serverList.push(
  76.               {
  77.                 name: moreServerObj,
  78.                 ramCap: ns.getServerMaxRam(moreServerObj)
  79.               }
  80.             );
  81.           }
  82.         }
  83.       }
  84.     }
  85.     serverList.push(serverList.shift());// moves home server to final index so that it is not prioritized for ram
  86.     return [...serverList];// returns full array of server objects
  87.   }// returns an array of objects with properties(name, ramCap)
  88.  
  89.  
  90.   function chooseScriptType(settings, targetInfo) {
  91.     // settings has properties(maxScanDepth, moneyThresh, percentTakenPerHack, securityThresh)
  92.     // targetInfo has properties (name, hackLvlReq, maxMoney, minSecurity)
  93.     let securityLevel = ns.getServerSecurityLevel(targetInfo.name);
  94.     let availableMoney = ns.getServerMoneyAvailable(targetInfo.name);
  95.     if (securityLevel > (targetInfo.minSecurity * settings.securityThresh)) {
  96.       // if security level is too high return weaken script
  97.       return ({
  98.         scriptName: "weaken.js",
  99.         cost: ns.getScriptRam("weaken.js", "home"),
  100.         waitTime: ns.getWeakenTime(targetInfo.name)
  101.       });
  102.     } else if (availableMoney < (targetInfo.maxMoney * settings.moneyThresh)) {
  103.       // if too little money is left return grow script
  104.       return ({
  105.         scriptName: "grow.js",
  106.         cost: ns.getScriptRam("grow.js", "home"),
  107.         waitTime: ns.getGrowTime(targetInfo.name)
  108.       });
  109.     } else {
  110.       // if both thresholds are met return hack script
  111.       return ({
  112.         scriptName: "hack.js",
  113.         cost: ns.getScriptRam("hack.js", "home"),
  114.         waitTime: ns.getHackTime(targetInfo.name)
  115.       });
  116.     }
  117.   }// returns with properties(scriptName, cost, waitTime)
  118.  
  119.  
  120.   function findRam(scriptCost, neededThreads, ...scriptServers) {
  121.     // scriptServers is an array of objects with properties(name, ramCap)
  122.     let threadsPerServer = []// array to be returned
  123.     let threadsLeft = neededThreads;// keeps track of how many more threads are needed
  124.     for (let scriptServer of scriptServers) {
  125.       if (threadsLeft <= 0) {
  126.         return [...threadsPerServer];
  127.       }
  128.       let threadsPossible = Math.floor((scriptServer.ramCap - ns.getServerUsedRam(scriptServer.name)) / scriptCost);
  129.       // the maximum number of threads that can be run without exceeding ram capacity
  130.       if (threadsLeft < threadsPossible) { // if the server can handle all remaining threads
  131.         if (threadsPossible >= 1) {
  132.           threadsPerServer.push({
  133.             serverName: scriptServer.name,
  134.             threadCount: threadsLeft
  135.           });
  136.         }
  137.         return [...threadsPerServer];
  138.       } else {
  139.         if (threadsPossible >= 1) { // only adds server if it can run at least one thread to prevent ns.exec error
  140.           threadsPerServer.push({
  141.             serverName: scriptServer.name,
  142.             threadCount: threadsPossible
  143.           });
  144.           threadsLeft -= threadsPossible;
  145.         }
  146.       }
  147.     }
  148.     ns.print("unable to find enough ram to run script");
  149.     return [...threadsPerServer];
  150.   }// returns an array of objects with properties(serverName, threadCount)
  151.  
  152.  
  153.   function getNeededThreads(scriptType, targetInfo, settings) {
  154.     // scriptType has properties(scriptName, cost, waitTime)
  155.     // targetInfo has properties(name, hackLvlReq, maxMoney, minSecurity)
  156.     // settings has properties(maxScanDepth, moneyThresh, percentTakenPerHack, securityThresh)
  157.     let securityLevel = ns.getServerSecurityLevel(targetInfo.name);
  158.     let availableMoney = ns.getServerMoneyAvailable(targetInfo.name);
  159.     if (scriptType.scriptName == "weaken.js") {
  160.       return (Math.ceil((securityLevel - targetInfo.minSecurity) / ns.weakenAnalyze(1)));
  161.       // divides difference between current and minimum security by weakenanalyze to get result
  162.     } else if (scriptType.scriptName == "grow.js") {
  163.       return (Math.ceil(ns.growthAnalyze(targetInfo.name, (targetInfo.maxMoney / availableMoney))));
  164.       // growthanalyze based on how much larger maximum money is than current money
  165.     } else if (scriptType.scriptName == "hack.js") {
  166.       return (Math.ceil(settings.percentTakenPerHack / ns.hackAnalyze(targetInfo.name)));
  167.     } else {
  168.       ns.alert("something went wrong in PID: " + ns.pid);
  169.     }
  170.   }// returns positive integer
  171.  
  172.  
  173.   /**Nonreturning/Asynched functions*/
  174.  
  175.  
  176.   async function attackAllServers(...targetList) {
  177.     // targetList is an array of objects with properties(name, ramCap)
  178.     for (let target of targetList) {
  179.       if (target.name != "home" && target.name != "darkweb") {
  180.         await attack(target.name);
  181.       }
  182.     }
  183.   }
  184.  
  185.  
  186.   async function attack(server) {
  187.     var hacktoolnum = 0;
  188.     if (!ns.hasRootAccess(server)) {
  189.       ns.toast('Opening ports on ' + server);
  190.       if (ns.fileExists('BruteSSH.exe', 'home')) {// attempt to open SSH port
  191.         ns.brutessh(server);
  192.         hacktoolnum++;
  193.       }
  194.       if (ns.fileExists('FTPCrack.exe', 'home')) {// attempt to open FTP port
  195.         ns.ftpcrack(server);
  196.         hacktoolnum++;
  197.       }
  198.       if (ns.fileExists('relaySMTP.exe', 'home')) {// attempt to opem SMTP port
  199.         ns.relaysmtp(server);
  200.         hacktoolnum++;
  201.       }
  202.       if (ns.fileExists('HTTPWorm.exe', 'home')) {// attempt to open HTTP port
  203.         ns.httpworm(server);
  204.         hacktoolnum++;
  205.       }
  206.       if (ns.fileExists('SQLInject.exe', 'home')) {// attempt to open SQL port
  207.         ns.sqlinject(server);
  208.         hacktoolnum++;
  209.       }
  210.     }
  211.     if (ns.getServerNumPortsRequired(server) <= hacktoolnum && !ns.hasRootAccess(server)) {
  212.       ns.toast("nuking " + server);
  213.       ns.nuke(server);
  214.     }
  215.     if (!ns.hasRootAccess(server)) {
  216.       ns.toast("unable to gain root to " + server, "error");
  217.     }
  218.   }
  219. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement