From da60833abd29aef02fa07098bfdbbb4003bdca26 Mon Sep 17 00:00:00 2001 From: Marek Wolan Date: Wed, 26 Feb 2025 14:07:14 +0000 Subject: [PATCH] Fix os scan action --- src/primaite/game/agent/actions/node.py | 13 ++++++++----- src/primaite/simulator/network/hardware/base.py | 16 ++++++++-------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/primaite/game/agent/actions/node.py b/src/primaite/game/agent/actions/node.py index b1b6ec12..5b62957a 100644 --- a/src/primaite/game/agent/actions/node.py +++ b/src/primaite/game/agent/actions/node.py @@ -37,15 +37,18 @@ class NodeAbstractAction(AbstractAction, ABC): return ["network", "node", config.node_name, config.verb] -class NodeOSScanAction(NodeAbstractAction, discriminator="node-os-scan"): +class NodeOSScanAction(AbstractAction, discriminator="node-os-scan"): """Action which scans a node's OS.""" - config: "NodeOSScanAction.ConfigSchema" + class ConfigSchema(AbstractAction.ConfigSchema, ABC): + """Base Configuration schema for Node actions.""" - class ConfigSchema(NodeAbstractAction.ConfigSchema): - """Configuration schema for NodeOSScanAction.""" + node_name: str - verb: ClassVar[str] = "scan" + @classmethod + def form_request(cls, config: ConfigSchema) -> RequestFormat: + """Return the action formatted as a request which can be ingested by the PrimAITE simulation.""" + return ["network", "node", config.node_name, "os", "scan"] class NodeShutdownAction(NodeAbstractAction, discriminator="node-shutdown"): diff --git a/src/primaite/simulator/network/hardware/base.py b/src/primaite/simulator/network/hardware/base.py index 9cc39848..2b5f4d70 100644 --- a/src/primaite/simulator/network/hardware/base.py +++ b/src/primaite/simulator/network/hardware/base.py @@ -1534,6 +1534,9 @@ class Node(SimComponent, ABC): _registry: ClassVar[Dict[str, Type["Node"]]] = {} """Registry of application types. Automatically populated when subclasses are defined.""" + node_scan_countdown: int = 0 + "Time steps until scan is complete" + # TODO: this should not be set for abstract classes. _discriminator: ClassVar[str] """discriminator for this particular class, used for printing and logging. Each subclass redefines this.""" @@ -1570,9 +1573,6 @@ class Node(SimComponent, ABC): node_scan_duration: int = 10 "How many timesteps until the whole node is scanned. Default 10 time steps." - node_scan_countdown: int = 0 - "Time steps until scan is complete" - red_scan_countdown: int = 0 "Time steps until reveal to red scan is complete." @@ -2019,10 +2019,10 @@ class Node(SimComponent, ABC): # time steps which require the node to be on if self.operating_state == NodeOperatingState.ON: # node scanning - if self.config.node_scan_countdown > 0: - self.config.node_scan_countdown -= 1 + if self.node_scan_countdown > 0: + self.node_scan_countdown -= 1 - if self.config.node_scan_countdown == 0: + if self.node_scan_countdown == 0: # scan everything! for process_id in self.processes: self.processes[process_id].scan() @@ -2098,7 +2098,7 @@ class Node(SimComponent, ABC): to the red agent. """ - self.config.node_scan_countdown = self.config.node_scan_duration + self.node_scan_countdown = self.config.node_scan_duration return True def reveal_to_red(self) -> bool: @@ -2114,7 +2114,7 @@ class Node(SimComponent, ABC): `revealed_to_red` to `True`. """ - self.config.red_scan_countdown = self.config.node_scan_duration + self.red_scan_countdown = self.config.node_scan_duration return True def power_on(self) -> bool: