Added personal scripts, started refactor
parent
4136ab7107
commit
892fc92251
@ -0,0 +1,5 @@
|
||||
export async function main(ns) {
|
||||
while (true) {
|
||||
await ns.hack(ns.getHostname());
|
||||
}
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
import { NS } from "@ns";
|
||||
import { getControllerState } from "/lib/types-and-constants";
|
||||
|
||||
export function printStatus(ns : NS) {
|
||||
const currentHackingLevel = ns.getHackingLevel()
|
||||
const {knownServers} = getControllerState(ns)
|
||||
|
||||
const numServers = knownServers.length
|
||||
const rootedServers = knownServers.filter(server => server.hasAdminRights).length
|
||||
const backdooredServers = knownServers.filter(server => server.backdoorInstalled).length
|
||||
const hackableServers = knownServers.filter(server => server.requiredHackingSkill && server.requiredHackingSkill <= currentHackingLevel).length
|
||||
|
||||
ns.print(`INFO: Current topology stats:\n`)
|
||||
ns.print(` - known: ${numServers}`)
|
||||
ns.print(` - hackable: ${hackableServers}`)
|
||||
ns.print(` - rooted: ${rootedServers}`)
|
||||
ns.print(` - backdoored: ${backdooredServers}`)
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
import { NS, Server } from "@ns"
|
||||
|
||||
const datafile = "/data-state.txt"
|
||||
|
||||
interface ControllerState {
|
||||
knownServers: Server[],
|
||||
assignments: {
|
||||
[droneHostname: string]: {
|
||||
targetHostname: string,
|
||||
attackMode: 'grow' | 'hack' | 'weaken',
|
||||
}
|
||||
},
|
||||
previousAssignments: {
|
||||
[droneHostname: string]: {
|
||||
targetHostname: string,
|
||||
attackMode: 'grow' | 'hack' | 'weaken',
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export function getControllerState(ns : NS) : ControllerState {
|
||||
return JSON.parse(ns.read(datafile) || `{
|
||||
"knownServers": [],
|
||||
"assignments": {},
|
||||
"previousAssignments": {}
|
||||
}`)
|
||||
}
|
||||
|
||||
export function setControllerState(ns : NS, state : ControllerState) {
|
||||
ns.write(datafile, JSON.stringify(state), 'w')
|
||||
}
|
||||
|
@ -0,0 +1,42 @@
|
||||
import { NS } from "@ns";
|
||||
import { printStatus } from "/lib/status";
|
||||
|
||||
const phaseScripts = [
|
||||
'/tasks/01-discovery.js',
|
||||
'/tasks/02-breaching.js',
|
||||
'/tasks/03-targeting.js',
|
||||
'/tasks/04-propogation.js',
|
||||
]
|
||||
|
||||
const numPhases = phaseScripts.length
|
||||
let currentPhase = 0
|
||||
let pid = -1
|
||||
|
||||
export async function main(ns : NS) : Promise<void> {
|
||||
ns.disableLog('ALL')
|
||||
ns.tail()
|
||||
ns.resizeTail(600, 200)
|
||||
|
||||
while (true) {
|
||||
// Print status
|
||||
ns.clearLog()
|
||||
ns.print("currentPhase: " + phaseScripts[currentPhase])
|
||||
printStatus(ns)
|
||||
|
||||
// If current phase is still running, delay and continue
|
||||
if (ns.isRunning(pid)) {
|
||||
await ns.sleep(100)
|
||||
continue
|
||||
}
|
||||
|
||||
// Advance to next phase
|
||||
currentPhase = (currentPhase + 1) % numPhases
|
||||
pid = ns.run(phaseScripts[currentPhase])
|
||||
|
||||
// In case of error
|
||||
if (!pid) {
|
||||
ns.print("Error starting " + phaseScripts[currentPhase])
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
import { NS } from "@ns";
|
||||
import { getControllerState, setControllerState } from "/lib/types-and-constants";
|
||||
|
||||
/** @param {NS} ns */
|
||||
export async function main(ns : NS) : Promise<void> {
|
||||
const datafileState = getControllerState(ns)
|
||||
|
||||
ns.print("INFO Starting automated scan . . .\n")
|
||||
let foundServers : string[] = []
|
||||
let serversToScan = datafileState.knownServers.map(server => server.hostname)
|
||||
|
||||
if(!serversToScan.length) {
|
||||
serversToScan = ['home']
|
||||
}
|
||||
|
||||
while (serversToScan.length) {
|
||||
const currentServer = serversToScan.shift() as string
|
||||
|
||||
if(foundServers.includes(currentServer)) continue
|
||||
|
||||
foundServers = [...foundServers, currentServer]
|
||||
|
||||
ns.print(`INFO Scanning from ${currentServer}\n`)
|
||||
const newVisibleServers = ns.scan(currentServer)
|
||||
.filter(server => !foundServers.includes(server))
|
||||
serversToScan = [...serversToScan, ...newVisibleServers]
|
||||
if(newVisibleServers.length > 0)
|
||||
ns.print(`SUCCESS - Discovered ${newVisibleServers.length} new servers to add to scan list\n`)
|
||||
}
|
||||
|
||||
datafileState.knownServers = foundServers.map(ns.getServer)
|
||||
setControllerState(ns, datafileState)
|
||||
}
|
||||
|
@ -0,0 +1,62 @@
|
||||
import { NS } from "@ns";
|
||||
import { getControllerState, setControllerState } from "/lib/types-and-constants";
|
||||
|
||||
export async function main(ns : NS) : Promise<void> {
|
||||
const datafileState = getControllerState(ns)
|
||||
const {knownServers} = datafileState
|
||||
|
||||
const portConfigs = [{
|
||||
openProperty: 'sshPortOpen',
|
||||
program: 'BruteSSH.exe',
|
||||
func: ns.brutessh
|
||||
}, {
|
||||
openProperty: 'ftpPortOpen',
|
||||
program: 'FTPCrack.exe',
|
||||
func: ns.ftpcrack
|
||||
}, {
|
||||
openProperty: 'sqlPortOpen',
|
||||
program: 'SQLInject.exe',
|
||||
func: ns.sqlinject
|
||||
}, {
|
||||
openProperty: 'httpPortOpen',
|
||||
program: 'HTTPWorm.exe',
|
||||
func: ns.httpworm
|
||||
}, {
|
||||
openProperty: 'smtpPortOpen',
|
||||
program: 'relaySMTP.exe',
|
||||
func: ns.relaysmtp
|
||||
}]
|
||||
|
||||
for (const server of knownServers) {
|
||||
if (server.hostname === 'home' || server.hasAdminRights)
|
||||
continue
|
||||
|
||||
const requiredPorts = server.numOpenPortsRequired ?? 0
|
||||
const alreadyOpen = server.openPortCount ?? 0
|
||||
const openablePorts = portConfigs.filter(port =>
|
||||
!(server as any)[port.openProperty]
|
||||
&& ns.fileExists(port.program))
|
||||
const numberCanOpen = openablePorts.length
|
||||
|
||||
if (alreadyOpen + numberCanOpen < requiredPorts) {
|
||||
ns.print(`WARN: Unable to nuke ${server.hostname}, cannot open enough ports (${alreadyOpen} + ${numberCanOpen} < ${requiredPorts})`)
|
||||
continue
|
||||
}
|
||||
|
||||
for (const port of openablePorts) {
|
||||
ns.tprint(`INFO: Opening ${port.openProperty.replace('PortOpen', '')} on ${server.hostname}`)
|
||||
port.func(server.hostname);
|
||||
(server as any)[port.openProperty] = true
|
||||
}
|
||||
|
||||
ns.tprint(`SUCCESS: Nuking ${server.hostname}`)
|
||||
ns.nuke(server.hostname)
|
||||
|
||||
server.hasAdminRights = true
|
||||
}
|
||||
|
||||
setControllerState(ns, {
|
||||
...datafileState,
|
||||
knownServers
|
||||
})
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
import { NS } from "@ns";
|
||||
|
||||
export async function main(ns : NS) : Promise<void> {
|
||||
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
import { NS } from "@ns";
|
||||
import { getControllerState } from "/lib/types-and-constants";
|
||||
|
||||
export async function main(ns : NS) : Promise<void> {
|
||||
const {knownServers} = getControllerState(ns)
|
||||
const playerHackingSkill = ns.getHackingLevel()
|
||||
|
||||
for (const server of knownServers) {
|
||||
if(!server.hasAdminRights || server.hostname === 'home')
|
||||
continue
|
||||
|
||||
if(server.requiredHackingSkill > playerHackingSkill)
|
||||
continue
|
||||
|
||||
ns.scp('auto-hack.js', server.hostname)
|
||||
const ramCost = ns.getScriptRam('auto-hack.js')
|
||||
const ramAvail = server.maxRam - server.ramUsed
|
||||
const numThreads = Math.floor(ramAvail / ramCost)
|
||||
|
||||
if (numThreads < 1)
|
||||
continue
|
||||
|
||||
ns.exec('auto-hack.js', server.hostname, numThreads)
|
||||
}
|
||||
await ns.sleep(10000)
|
||||
}
|
@ -1,5 +0,0 @@
|
||||
import { NS } from "@ns";
|
||||
|
||||
export async function main(ns: NS): Promise<void> {
|
||||
ns.tprint("Hello Remote API!");
|
||||
}
|
Loading…
Reference in New Issue