From fc66e125d64d882c78109d008e7f84039cc19e32 Mon Sep 17 00:00:00 2001 From: Marek Wolan Date: Fri, 7 Feb 2025 10:08:18 +0000 Subject: [PATCH 01/13] Fix action schema for change password --- src/primaite/game/agent/actions/session.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/primaite/game/agent/actions/session.py b/src/primaite/game/agent/actions/session.py index 58a8a555..b7b56d17 100644 --- a/src/primaite/game/agent/actions/session.py +++ b/src/primaite/game/agent/actions/session.py @@ -63,8 +63,6 @@ class NodeSessionsRemoteLoginAction(NodeSessionAbstractAction, discriminator="no class NodeSessionsRemoteLogoutAction(NodeSessionAbstractAction, discriminator="node-session-remote-logoff"): """Action which performs a remote session logout.""" - config: "NodeSessionsRemoteLogoutAction.ConfigSchema" - class ConfigSchema(NodeSessionAbstractAction.ConfigSchema): """Configuration schema for NodeSessionsRemoteLogoutAction.""" @@ -78,14 +76,13 @@ class NodeSessionsRemoteLogoutAction(NodeSessionAbstractAction, discriminator="n return ["network", "node", config.node_name, "service", "terminal", config.verb, config.remote_ip] -class NodeAccountChangePasswordAction(NodeSessionAbstractAction, discriminator="node-account-change-password"): +class NodeAccountChangePasswordAction(AbstractAction, discriminator="node-account-change-password"): """Action which changes the password for a user.""" - config: "NodeAccountChangePasswordAction.ConfigSchema" - - class ConfigSchema(NodeSessionAbstractAction.ConfigSchema): + class ConfigSchema(AbstractAction.ConfigSchema): """Configuration schema for NodeAccountsChangePasswordAction.""" + node_name: str username: str current_password: str new_password: str From 56e81a020ca31c8a8770d7a737f8008166474b50 Mon Sep 17 00:00:00 2001 From: Charlie Crane Date: Tue, 11 Feb 2025 10:53:41 +0000 Subject: [PATCH 02/13] #3060 - Adding version to YAML files within PrimAITE --- .../config/_package_data/basic_lan_network_example.yaml | 2 ++ .../_package_data/client_server_p2p_network_example.yaml | 2 ++ src/primaite/config/_package_data/data_manipulation.yaml | 2 ++ .../config/_package_data/data_manipulation_marl.yaml | 2 ++ .../base_scenario.yaml | 2 ++ .../_package_data/multi_lan_internet_network_example.yaml | 2 ++ .../_package_data/scenario_with_placeholders/scenario.yaml | 2 ++ src/primaite/game/game.py | 5 +++++ tests/assets/configs/action_penalty.yaml | 2 ++ tests/assets/configs/bad_primaite_session.yaml | 2 ++ tests/assets/configs/basic_c2_setup.yaml | 2 ++ tests/assets/configs/basic_firewall.yaml | 1 + .../configs/basic_node_with_software_listening_ports.yaml | 2 ++ tests/assets/configs/basic_node_with_users.yaml | 2 ++ tests/assets/configs/basic_switched_network.yaml | 2 ++ tests/assets/configs/data_manipulation.yaml | 2 ++ tests/assets/configs/dmz_network.yaml | 2 ++ tests/assets/configs/eval_only_primaite_session.yaml | 2 ++ tests/assets/configs/extended_config.yaml | 2 ++ tests/assets/configs/firewall_actions_network.yaml | 2 ++ tests/assets/configs/fixing_duration_one_item.yaml | 2 ++ tests/assets/configs/install_and_configure_apps.yaml | 2 ++ tests/assets/configs/multi_agent_session.yaml | 2 ++ .../configs/nmap_network_service_recon_red_agent_config.yaml | 2 ++ tests/assets/configs/nmap_ping_scan_red_agent_config.yaml | 2 ++ tests/assets/configs/nmap_port_scan_red_agent_config.yaml | 2 ++ tests/assets/configs/no_nodes_links_agents_network.yaml | 2 ++ .../assets/configs/scenario_with_placeholders/scenario.yaml | 2 ++ tests/assets/configs/shared_rewards.yaml | 2 ++ tests/assets/configs/software_fixing_duration.yaml | 2 ++ tests/assets/configs/test_application_install.yaml | 2 ++ tests/assets/configs/test_primaite_session.yaml | 2 ++ tests/assets/configs/wireless_wan_network_config.yaml | 2 ++ .../wireless_wan_network_config_freq_max_override.yaml | 2 ++ ...ireless_wan_network_config_freq_max_override_blocked.yaml | 2 ++ 35 files changed, 72 insertions(+) diff --git a/src/primaite/config/_package_data/basic_lan_network_example.yaml b/src/primaite/config/_package_data/basic_lan_network_example.yaml index 9490ff00..854dfcf3 100644 --- a/src/primaite/config/_package_data/basic_lan_network_example.yaml +++ b/src/primaite/config/_package_data/basic_lan_network_example.yaml @@ -1,3 +1,5 @@ +version: 3.0 + game: ports: - ARP diff --git a/src/primaite/config/_package_data/client_server_p2p_network_example.yaml b/src/primaite/config/_package_data/client_server_p2p_network_example.yaml index 798dd318..702c864f 100644 --- a/src/primaite/config/_package_data/client_server_p2p_network_example.yaml +++ b/src/primaite/config/_package_data/client_server_p2p_network_example.yaml @@ -1,3 +1,5 @@ +version: 3.0 + game: ports: - ARP diff --git a/src/primaite/config/_package_data/data_manipulation.yaml b/src/primaite/config/_package_data/data_manipulation.yaml index 4705c135..72b3f671 100644 --- a/src/primaite/config/_package_data/data_manipulation.yaml +++ b/src/primaite/config/_package_data/data_manipulation.yaml @@ -1,3 +1,5 @@ +version: 3.0 + io_settings: save_agent_actions: true save_step_metadata: false diff --git a/src/primaite/config/_package_data/data_manipulation_marl.yaml b/src/primaite/config/_package_data/data_manipulation_marl.yaml index 0263edb0..178b3322 100644 --- a/src/primaite/config/_package_data/data_manipulation_marl.yaml +++ b/src/primaite/config/_package_data/data_manipulation_marl.yaml @@ -1,3 +1,5 @@ +version: 3.0 + io_settings: save_agent_actions: true save_step_metadata: false diff --git a/src/primaite/config/_package_data/mini_scenario_with_simulation_variation/base_scenario.yaml b/src/primaite/config/_package_data/mini_scenario_with_simulation_variation/base_scenario.yaml index 4c7734d8..9530305a 100644 --- a/src/primaite/config/_package_data/mini_scenario_with_simulation_variation/base_scenario.yaml +++ b/src/primaite/config/_package_data/mini_scenario_with_simulation_variation/base_scenario.yaml @@ -1,3 +1,5 @@ +version: 3.0 + game: max_episode_length: 128 ports: [] diff --git a/src/primaite/config/_package_data/multi_lan_internet_network_example.yaml b/src/primaite/config/_package_data/multi_lan_internet_network_example.yaml index cbd1c01e..4e8f085e 100644 --- a/src/primaite/config/_package_data/multi_lan_internet_network_example.yaml +++ b/src/primaite/config/_package_data/multi_lan_internet_network_example.yaml @@ -1,3 +1,5 @@ +version: 3.0 + game: ports: - ARP diff --git a/src/primaite/config/_package_data/scenario_with_placeholders/scenario.yaml b/src/primaite/config/_package_data/scenario_with_placeholders/scenario.yaml index 1a96e3a0..d34fb310 100644 --- a/src/primaite/config/_package_data/scenario_with_placeholders/scenario.yaml +++ b/src/primaite/config/_package_data/scenario_with_placeholders/scenario.yaml @@ -1,3 +1,5 @@ +version: 3.0 + io_settings: save_agent_actions: true save_step_metadata: false diff --git a/src/primaite/game/game.py b/src/primaite/game/game.py index 1427776e..639b37cf 100644 --- a/src/primaite/game/game.py +++ b/src/primaite/game/game.py @@ -247,6 +247,11 @@ class PrimaiteGame: game.options = PrimaiteGameOptions(**cfg["game"]) game.save_step_metadata = cfg.get("io_settings", {}).get("save_step_metadata") or False + # TODO: Future YAML config should specify the PrimAITE version they are written for. + # For now, we warn that if it is missing, pending a mechanism to handle variations. + if not cfg["version"]: + _LOGGER.warning("Version definition is missing from provided configuration. ") + # 1. create simulation sim = game.simulation net = sim.network diff --git a/tests/assets/configs/action_penalty.yaml b/tests/assets/configs/action_penalty.yaml index 9c117dfe..9561db4f 100644 --- a/tests/assets/configs/action_penalty.yaml +++ b/tests/assets/configs/action_penalty.yaml @@ -1,3 +1,5 @@ +version: 3.0 + io_settings: save_agent_actions: false save_step_metadata: false diff --git a/tests/assets/configs/bad_primaite_session.yaml b/tests/assets/configs/bad_primaite_session.yaml index 18b37466..1f59225b 100644 --- a/tests/assets/configs/bad_primaite_session.yaml +++ b/tests/assets/configs/bad_primaite_session.yaml @@ -1,3 +1,5 @@ +version: 3.0 + game: ports: - ARP diff --git a/tests/assets/configs/basic_c2_setup.yaml b/tests/assets/configs/basic_c2_setup.yaml index ac2b026e..3011457f 100644 --- a/tests/assets/configs/basic_c2_setup.yaml +++ b/tests/assets/configs/basic_c2_setup.yaml @@ -4,6 +4,8 @@ # | node_a |------| switch_1 |------| node_b | # -------------- -------------- -------------- # +version: 3.0 + io_settings: save_step_metadata: false save_pcap_logs: true diff --git a/tests/assets/configs/basic_firewall.yaml b/tests/assets/configs/basic_firewall.yaml index 8108ecbe..1aa1361a 100644 --- a/tests/assets/configs/basic_firewall.yaml +++ b/tests/assets/configs/basic_firewall.yaml @@ -4,6 +4,7 @@ # | client_1 |------| switch_1 |------| client_2 | # -------------- -------------- -------------- # +version: 3.0 io_settings: save_step_metadata: false diff --git a/tests/assets/configs/basic_node_with_software_listening_ports.yaml b/tests/assets/configs/basic_node_with_software_listening_ports.yaml index 7b04196b..b503d66d 100644 --- a/tests/assets/configs/basic_node_with_software_listening_ports.yaml +++ b/tests/assets/configs/basic_node_with_software_listening_ports.yaml @@ -1,3 +1,5 @@ +version: 3.0 + io_settings: save_step_metadata: false save_pcap_logs: true diff --git a/tests/assets/configs/basic_node_with_users.yaml b/tests/assets/configs/basic_node_with_users.yaml index 064519dd..3009b79e 100644 --- a/tests/assets/configs/basic_node_with_users.yaml +++ b/tests/assets/configs/basic_node_with_users.yaml @@ -1,3 +1,5 @@ +version: 3.0 + io_settings: save_step_metadata: false save_pcap_logs: true diff --git a/tests/assets/configs/basic_switched_network.yaml b/tests/assets/configs/basic_switched_network.yaml index c9ac5f8d..7e8a5715 100644 --- a/tests/assets/configs/basic_switched_network.yaml +++ b/tests/assets/configs/basic_switched_network.yaml @@ -4,6 +4,8 @@ # | client_1 |------| switch_1 |------| client_2 | # -------------- -------------- -------------- # +version: 3.0 + io_settings: save_step_metadata: false save_pcap_logs: true diff --git a/tests/assets/configs/data_manipulation.yaml b/tests/assets/configs/data_manipulation.yaml index e9464f0f..baf9df7d 100644 --- a/tests/assets/configs/data_manipulation.yaml +++ b/tests/assets/configs/data_manipulation.yaml @@ -1,3 +1,5 @@ +version: 3.0 + io_settings: save_agent_actions: true save_step_metadata: false diff --git a/tests/assets/configs/dmz_network.yaml b/tests/assets/configs/dmz_network.yaml index 2aa472d8..456920f1 100644 --- a/tests/assets/configs/dmz_network.yaml +++ b/tests/assets/configs/dmz_network.yaml @@ -30,6 +30,8 @@ # | external_computer |------| switch_3 |------| external_server | # ----------------------- -------------- --------------------- # +version: 3.0 + io_settings: save_step_metadata: false save_pcap_logs: true diff --git a/tests/assets/configs/eval_only_primaite_session.yaml b/tests/assets/configs/eval_only_primaite_session.yaml index 3403a7ff..c0a61b9d 100644 --- a/tests/assets/configs/eval_only_primaite_session.yaml +++ b/tests/assets/configs/eval_only_primaite_session.yaml @@ -1,3 +1,5 @@ +version: 3.0 + game: ports: - ARP diff --git a/tests/assets/configs/extended_config.yaml b/tests/assets/configs/extended_config.yaml index 8bf7d506..1b0772c1 100644 --- a/tests/assets/configs/extended_config.yaml +++ b/tests/assets/configs/extended_config.yaml @@ -1,3 +1,5 @@ +version: 3.0 + io_settings: save_agent_actions: true save_step_metadata: false diff --git a/tests/assets/configs/firewall_actions_network.yaml b/tests/assets/configs/firewall_actions_network.yaml index eb39aa1a..b624be52 100644 --- a/tests/assets/configs/firewall_actions_network.yaml +++ b/tests/assets/configs/firewall_actions_network.yaml @@ -30,6 +30,8 @@ # | external_computer |------| switch_3 |------| external_server | # ----------------------- -------------- --------------------- # +version: 3.0 + io_settings: save_step_metadata: false save_pcap_logs: true diff --git a/tests/assets/configs/fixing_duration_one_item.yaml b/tests/assets/configs/fixing_duration_one_item.yaml index ff3a6504..ad94a9da 100644 --- a/tests/assets/configs/fixing_duration_one_item.yaml +++ b/tests/assets/configs/fixing_duration_one_item.yaml @@ -4,6 +4,8 @@ # | client_1 |------| switch_1 |------| client_2 | # -------------- -------------- -------------- # +version: 3.0 + io_settings: save_step_metadata: false save_pcap_logs: true diff --git a/tests/assets/configs/install_and_configure_apps.yaml b/tests/assets/configs/install_and_configure_apps.yaml index 6b80519c..4f96496e 100644 --- a/tests/assets/configs/install_and_configure_apps.yaml +++ b/tests/assets/configs/install_and_configure_apps.yaml @@ -1,3 +1,5 @@ +version: 3.0 + io_settings: save_step_metadata: false save_pcap_logs: false diff --git a/tests/assets/configs/multi_agent_session.yaml b/tests/assets/configs/multi_agent_session.yaml index e99ea49b..263d5f66 100644 --- a/tests/assets/configs/multi_agent_session.yaml +++ b/tests/assets/configs/multi_agent_session.yaml @@ -1,3 +1,5 @@ +version: 3.0 + io_settings: save_agent_actions: false save_step_metadata: false diff --git a/tests/assets/configs/nmap_network_service_recon_red_agent_config.yaml b/tests/assets/configs/nmap_network_service_recon_red_agent_config.yaml index 9b49d466..6abb11ce 100644 --- a/tests/assets/configs/nmap_network_service_recon_red_agent_config.yaml +++ b/tests/assets/configs/nmap_network_service_recon_red_agent_config.yaml @@ -1,3 +1,5 @@ +version: 3.0 + io_settings: save_step_metadata: false save_pcap_logs: true diff --git a/tests/assets/configs/nmap_ping_scan_red_agent_config.yaml b/tests/assets/configs/nmap_ping_scan_red_agent_config.yaml index e3cb33e1..869f4fb8 100644 --- a/tests/assets/configs/nmap_ping_scan_red_agent_config.yaml +++ b/tests/assets/configs/nmap_ping_scan_red_agent_config.yaml @@ -1,3 +1,5 @@ +version: 3.0 + io_settings: save_step_metadata: false save_pcap_logs: true diff --git a/tests/assets/configs/nmap_port_scan_red_agent_config.yaml b/tests/assets/configs/nmap_port_scan_red_agent_config.yaml index 2692a3bc..1d5ab323 100644 --- a/tests/assets/configs/nmap_port_scan_red_agent_config.yaml +++ b/tests/assets/configs/nmap_port_scan_red_agent_config.yaml @@ -1,3 +1,5 @@ +version: 3.0 + io_settings: save_step_metadata: false save_pcap_logs: true diff --git a/tests/assets/configs/no_nodes_links_agents_network.yaml b/tests/assets/configs/no_nodes_links_agents_network.yaml index b20835bc..b79e6bc6 100644 --- a/tests/assets/configs/no_nodes_links_agents_network.yaml +++ b/tests/assets/configs/no_nodes_links_agents_network.yaml @@ -1,3 +1,5 @@ +version: 3.0 + io_settings: save_step_metadata: false save_pcap_logs: true diff --git a/tests/assets/configs/scenario_with_placeholders/scenario.yaml b/tests/assets/configs/scenario_with_placeholders/scenario.yaml index ab8c968c..76b51626 100644 --- a/tests/assets/configs/scenario_with_placeholders/scenario.yaml +++ b/tests/assets/configs/scenario_with_placeholders/scenario.yaml @@ -1,3 +1,5 @@ +version: 3.0 + io_settings: save_agent_actions: true save_step_metadata: false diff --git a/tests/assets/configs/shared_rewards.yaml b/tests/assets/configs/shared_rewards.yaml index 07256f01..68b3b310 100644 --- a/tests/assets/configs/shared_rewards.yaml +++ b/tests/assets/configs/shared_rewards.yaml @@ -1,3 +1,5 @@ +version: 3.0 + io_settings: save_agent_actions: false save_step_metadata: false diff --git a/tests/assets/configs/software_fixing_duration.yaml b/tests/assets/configs/software_fixing_duration.yaml index 63409f2b..2f5613e1 100644 --- a/tests/assets/configs/software_fixing_duration.yaml +++ b/tests/assets/configs/software_fixing_duration.yaml @@ -4,6 +4,8 @@ # | client_1 |------| switch_1 |------| client_2 | # -------------- -------------- -------------- # +version: 3.0 + io_settings: save_step_metadata: false save_pcap_logs: true diff --git a/tests/assets/configs/test_application_install.yaml b/tests/assets/configs/test_application_install.yaml index 0266dd00..d49d9bf2 100644 --- a/tests/assets/configs/test_application_install.yaml +++ b/tests/assets/configs/test_application_install.yaml @@ -1,3 +1,5 @@ +version: 3.0 + io_settings: save_agent_actions: true save_step_metadata: false diff --git a/tests/assets/configs/test_primaite_session.yaml b/tests/assets/configs/test_primaite_session.yaml index 65d16a47..c1206634 100644 --- a/tests/assets/configs/test_primaite_session.yaml +++ b/tests/assets/configs/test_primaite_session.yaml @@ -1,3 +1,5 @@ +version: 3.0 + io_settings: save_agent_actions: true save_step_metadata: true diff --git a/tests/assets/configs/wireless_wan_network_config.yaml b/tests/assets/configs/wireless_wan_network_config.yaml index 40a9126c..b722e50f 100644 --- a/tests/assets/configs/wireless_wan_network_config.yaml +++ b/tests/assets/configs/wireless_wan_network_config.yaml @@ -1,3 +1,5 @@ +version: 3.0 + game: max_episode_length: 256 ports: diff --git a/tests/assets/configs/wireless_wan_network_config_freq_max_override.yaml b/tests/assets/configs/wireless_wan_network_config_freq_max_override.yaml index 13ceee16..4c2f4f86 100644 --- a/tests/assets/configs/wireless_wan_network_config_freq_max_override.yaml +++ b/tests/assets/configs/wireless_wan_network_config_freq_max_override.yaml @@ -1,3 +1,5 @@ +version: 3.0 + game: max_episode_length: 256 ports: diff --git a/tests/assets/configs/wireless_wan_network_config_freq_max_override_blocked.yaml b/tests/assets/configs/wireless_wan_network_config_freq_max_override_blocked.yaml index 6c52fd95..a98b6ee2 100644 --- a/tests/assets/configs/wireless_wan_network_config_freq_max_override_blocked.yaml +++ b/tests/assets/configs/wireless_wan_network_config_freq_max_override_blocked.yaml @@ -1,3 +1,5 @@ +version: 3.0 + game: max_episode_length: 256 ports: From dadf93bc7fd70e459f525d27c429b6514932614b Mon Sep 17 00:00:00 2001 From: Charlie Crane Date: Tue, 11 Feb 2025 14:59:25 +0000 Subject: [PATCH 03/13] #3060 - Address some missed pre-commit errors --- docs/source/how_to_guides/extensible_nodes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/how_to_guides/extensible_nodes.rst b/docs/source/how_to_guides/extensible_nodes.rst index 043d0f06..4819cbb2 100644 --- a/docs/source/how_to_guides/extensible_nodes.rst +++ b/docs/source/how_to_guides/extensible_nodes.rst @@ -52,4 +52,4 @@ class Router(NetworkNode, identifier="router"): Changes to YAML file. ===================== -While effort has been made to ensure that nodes defined within configuration YAML files for use with PrimAITE 3.X remain compatible with PrimAITE v4+, it is encouraged to review for minor changes needed. +While effort has been made to ensure that nodes defined within configuration YAML files for use with PrimAITE 3.X remain compatible with PrimAITE v4+, it is encouraged to review for minor changes needed. From 70fc11f4f110e138c16c4a80030b408b3ecb7f15 Mon Sep 17 00:00:00 2001 From: Charlie Crane Date: Tue, 11 Feb 2025 16:20:11 +0000 Subject: [PATCH 04/13] #3060 - Correct change in game.py that caused test failures --- src/primaite/game/game.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/primaite/game/game.py b/src/primaite/game/game.py index 639b37cf..4741199c 100644 --- a/src/primaite/game/game.py +++ b/src/primaite/game/game.py @@ -247,9 +247,11 @@ class PrimaiteGame: game.options = PrimaiteGameOptions(**cfg["game"]) game.save_step_metadata = cfg.get("io_settings", {}).get("save_step_metadata") or False + config_version = cfg.get("version", {}) + # TODO: Future YAML config should specify the PrimAITE version they are written for. # For now, we warn that if it is missing, pending a mechanism to handle variations. - if not cfg["version"]: + if not isinstance(config_version, int): _LOGGER.warning("Version definition is missing from provided configuration. ") # 1. create simulation From 56699d2377a706c54648b54c5fb72456fbc1961d Mon Sep 17 00:00:00 2001 From: Charlie Crane Date: Wed, 12 Feb 2025 16:18:50 +0000 Subject: [PATCH 05/13] Resolve hardcoding of Agent Logger having agent_name as abstract_agent --- src/primaite/game/agent/interface.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/primaite/game/agent/interface.py b/src/primaite/game/agent/interface.py index a55cd3ff..82edab88 100644 --- a/src/primaite/game/agent/interface.py +++ b/src/primaite/game/agent/interface.py @@ -70,7 +70,7 @@ class AbstractAgent(BaseModel, ABC): config: ConfigSchema = Field(default_factory=lambda: AbstractAgent.ConfigSchema()) - logger: AgentLog = AgentLog(agent_name="Abstract_Agent") + logger: AgentLog = None history: List[AgentHistoryItem] = [] action_manager: ActionManager = Field(default_factory=lambda: ActionManager()) @@ -79,6 +79,12 @@ class AbstractAgent(BaseModel, ABC): _registry: ClassVar[Dict[str, Type[AbstractAgent]]] = {} + def __init__(self, **kwargs): + """init""" + + super().__init__(**kwargs) + self.logger: AgentLog = AgentLog(agent_name=kwargs["config"]["ref"]) + def __init_subclass__(cls, discriminator: Optional[str] = None, **kwargs: Any) -> None: super().__init_subclass__(**kwargs) if discriminator is None: From 7e138d1d61b9e1e2fad0bf5fd9e00ba4e4ea7701 Mon Sep 17 00:00:00 2001 From: Charlie Crane Date: Fri, 14 Feb 2025 11:38:15 +0000 Subject: [PATCH 06/13] #Bug and test fixes --- src/primaite/game/agent/interface.py | 2 +- src/primaite/simulator/network/container.py | 65 ++++++++----------- .../simulator/network/hardware/base.py | 4 +- src/primaite/simulator/system/software.py | 2 + .../extensions/nodes/giga_switch.py | 2 +- .../actions/test_terminal_actions.py | 2 - .../_primaite/_game/_agent/test_agent.py | 2 +- 7 files changed, 34 insertions(+), 45 deletions(-) diff --git a/src/primaite/game/agent/interface.py b/src/primaite/game/agent/interface.py index 82edab88..571c850d 100644 --- a/src/primaite/game/agent/interface.py +++ b/src/primaite/game/agent/interface.py @@ -80,7 +80,7 @@ class AbstractAgent(BaseModel, ABC): _registry: ClassVar[Dict[str, Type[AbstractAgent]]] = {} def __init__(self, **kwargs): - """init""" + """Initialise and setup agent logger""" super().__init__(**kwargs) self.logger: AgentLog = AgentLog(agent_name=kwargs["config"]["ref"]) diff --git a/src/primaite/simulator/network/container.py b/src/primaite/simulator/network/container.py index 2e494910..1fa8c680 100644 --- a/src/primaite/simulator/network/container.py +++ b/src/primaite/simulator/network/container.py @@ -163,15 +163,6 @@ class Network(SimComponent): :param links: Include link details in the output. Defaults to True. :param markdown: Use Markdown style in table output. Defaults to False. """ - nodes_type_map = { - "Router": self.router_nodes, - "Firewall": self.firewall_nodes, - "Switch": self.switch_nodes, - "Server": self.server_nodes, - "Computer": self.computer_nodes, - "Printer": self.printer_nodes, - "Wireless Router": self.wireless_router_nodes, - } if nodes: table = PrettyTable(["Node", "Type", "Operating State"]) @@ -189,19 +180,18 @@ class Network(SimComponent): table.set_style(MARKDOWN) table.align = "l" table.title = "IP Addresses" - for nodes in nodes_type_map.values(): - for node in nodes: - for i, port in node.network_interface.items(): - if hasattr(port, "ip_address"): - if port.ip_address != IPv4Address("127.0.0.1"): - port_str = port.port_name if port.port_name else port.port_num - table.add_row( - [ - node.config.hostname, - port_str, - port.ip_address, - port.subnet_mask, - node.config.default_gateway, + for node in self.nodes.values(): + for i, port in node.network_interface.items(): + if hasattr(port, "ip_address"): + if port.ip_address != IPv4Address("127.0.0.1"): + port_str = port.port_name if port.port_name else port.port_num + table.add_row( + [ + node.config.hostname, + port_str, + port.ip_address, + port.subnet_mask, + node.config.default_gateway, ] ) print(table) @@ -215,22 +205,21 @@ class Network(SimComponent): table.align = "l" table.title = "Links" links = list(self.links.values()) - for nodes in nodes_type_map.values(): - for node in nodes: - for link in links[::-1]: - if node in [link.endpoint_a.parent, link.endpoint_b.parent]: - table.add_row( - [ - link.endpoint_a.parent.config.hostname, - str(link.endpoint_a), - link.endpoint_b.parent.config.hostname, - str(link.endpoint_b), - link.is_up, - link.bandwidth, - link.current_load_percent, - ] - ) - links.remove(link) + for node in self.nodes.values(): + for link in links[::-1]: + if node in [link.endpoint_a.parent, link.endpoint_b.parent]: + table.add_row( + [ + link.endpoint_a.parent.config.hostname, + str(link.endpoint_a), + link.endpoint_b.parent.config.hostname, + str(link.endpoint_b), + link.is_up, + link.bandwidth, + link.current_load_percent, + ] + ) + links.remove(link) print(table) def clear_links(self): diff --git a/src/primaite/simulator/network/hardware/base.py b/src/primaite/simulator/network/hardware/base.py index 8653359a..4c252050 100644 --- a/src/primaite/simulator/network/hardware/base.py +++ b/src/primaite/simulator/network/hardware/base.py @@ -1197,7 +1197,7 @@ class UserSessionManager(Service, discriminator="user-session-manager"): """Request should take the form [username, password, remote_ip_address].""" username, password, remote_ip_address = request response = RequestResponse.from_bool(self.remote_login(username, password, remote_ip_address)) - response.data = {"remote_hostname": self.parent.hostname, "username": username} + response.data = {"remote_hostname": self.parent.config.hostname, "username": username} return response rm.add_request("remote_login", RequestType(func=_remote_login)) @@ -1230,7 +1230,7 @@ class UserSessionManager(Service, discriminator="user-session-manager"): if markdown: table.set_style(MARKDOWN) table.align = "l" - table.title = f"{self.parent.hostname} User Sessions" + table.title = f"{self.parent.config.hostname} User Sessions" def _add_session_to_table(user_session: UserSession): """ diff --git a/src/primaite/simulator/system/software.py b/src/primaite/simulator/system/software.py index 950f77c6..42468057 100644 --- a/src/primaite/simulator/system/software.py +++ b/src/primaite/simulator/system/software.py @@ -20,6 +20,7 @@ from primaite.utils.validation.port import Port if TYPE_CHECKING: from primaite.simulator.system.core.software_manager import SoftwareManager + from primaite.simulator.network.hardware.base import Node class SoftwareType(Enum): @@ -110,6 +111,7 @@ class Software(SimComponent, ABC): "The folder on the file system the Software uses." _fixing_countdown: Optional[int] = None "Current number of ticks left to patch the software." + # parent: Optional[Node] = None def __init__(self, **kwargs): super().__init__(**kwargs) diff --git a/tests/integration_tests/extensions/nodes/giga_switch.py b/tests/integration_tests/extensions/nodes/giga_switch.py index d9599618..5c202ed2 100644 --- a/tests/integration_tests/extensions/nodes/giga_switch.py +++ b/tests/integration_tests/extensions/nodes/giga_switch.py @@ -49,7 +49,7 @@ class GigaSwitch(NetworkNode, discriminator="gigaswitch"): if markdown: table.set_style(MARKDOWN) table.align = "l" - table.title = f"{self.hostname} Switch Ports" + table.title = f"{self.config.hostname} Switch Ports" for port_num, port in self.network_interface.items(): table.add_row([port_num, port.mac_address, port.speed, "Enabled" if port.enabled else "Disabled"]) print(table) diff --git a/tests/integration_tests/game_layer/actions/test_terminal_actions.py b/tests/integration_tests/game_layer/actions/test_terminal_actions.py index c39d8263..6d30644c 100644 --- a/tests/integration_tests/game_layer/actions/test_terminal_actions.py +++ b/tests/integration_tests/game_layer/actions/test_terminal_actions.py @@ -106,7 +106,6 @@ def test_remote_login_change_password(game_and_agent_fixture: Tuple[PrimaiteGame "username": "user123", "current_password": "password", "new_password": "different_password", - "remote_ip": str(server_1.network_interface[1].ip_address), }, ) agent.store_action(action) @@ -146,7 +145,6 @@ def test_change_password_logs_out_user(game_and_agent_fixture: Tuple[PrimaiteGam "username": "user123", "current_password": "password", "new_password": "different_password", - "remote_ip": str(server_1.network_interface[1].ip_address), }, ) agent.store_action(action) diff --git a/tests/unit_tests/_primaite/_game/_agent/test_agent.py b/tests/unit_tests/_primaite/_game/_agent/test_agent.py index a2693591..064537c2 100644 --- a/tests/unit_tests/_primaite/_game/_agent/test_agent.py +++ b/tests/unit_tests/_primaite/_game/_agent/test_agent.py @@ -4,7 +4,7 @@ from primaite.game.agent.scripted_agents.random_agent import RandomAgent def test_creating_empty_agent(): - agent = RandomAgent() + agent = RandomAgent(config={"ref" :"Empty Agent"}) assert len(agent.action_manager.action_map) == 0 assert isinstance(agent.observation_manager.obs, NullObservation) assert len(agent.reward_function.reward_components) == 0 From 7b80d15d8131bc5203c0a34b676746d572700486 Mon Sep 17 00:00:00 2001 From: Charlie Crane Date: Fri, 14 Feb 2025 11:39:25 +0000 Subject: [PATCH 07/13] # Pre-commit actions --- docs/source/how_to_guides/extensible_nodes.rst | 2 +- src/primaite/game/agent/interface.py | 3 +-- src/primaite/simulator/network/container.py | 5 ++--- src/primaite/simulator/system/software.py | 1 - tests/unit_tests/_primaite/_game/_agent/test_agent.py | 2 +- 5 files changed, 5 insertions(+), 8 deletions(-) diff --git a/docs/source/how_to_guides/extensible_nodes.rst b/docs/source/how_to_guides/extensible_nodes.rst index 043d0f06..4819cbb2 100644 --- a/docs/source/how_to_guides/extensible_nodes.rst +++ b/docs/source/how_to_guides/extensible_nodes.rst @@ -52,4 +52,4 @@ class Router(NetworkNode, identifier="router"): Changes to YAML file. ===================== -While effort has been made to ensure that nodes defined within configuration YAML files for use with PrimAITE 3.X remain compatible with PrimAITE v4+, it is encouraged to review for minor changes needed. +While effort has been made to ensure that nodes defined within configuration YAML files for use with PrimAITE 3.X remain compatible with PrimAITE v4+, it is encouraged to review for minor changes needed. diff --git a/src/primaite/game/agent/interface.py b/src/primaite/game/agent/interface.py index 571c850d..07363012 100644 --- a/src/primaite/game/agent/interface.py +++ b/src/primaite/game/agent/interface.py @@ -80,8 +80,7 @@ class AbstractAgent(BaseModel, ABC): _registry: ClassVar[Dict[str, Type[AbstractAgent]]] = {} def __init__(self, **kwargs): - """Initialise and setup agent logger""" - + """Initialise and setup agent logger.""" super().__init__(**kwargs) self.logger: AgentLog = AgentLog(agent_name=kwargs["config"]["ref"]) diff --git a/src/primaite/simulator/network/container.py b/src/primaite/simulator/network/container.py index 1fa8c680..b0426537 100644 --- a/src/primaite/simulator/network/container.py +++ b/src/primaite/simulator/network/container.py @@ -163,7 +163,6 @@ class Network(SimComponent): :param links: Include link details in the output. Defaults to True. :param markdown: Use Markdown style in table output. Defaults to False. """ - if nodes: table = PrettyTable(["Node", "Type", "Operating State"]) if markdown: @@ -192,8 +191,8 @@ class Network(SimComponent): port.ip_address, port.subnet_mask, node.config.default_gateway, - ] - ) + ] + ) print(table) if links: diff --git a/src/primaite/simulator/system/software.py b/src/primaite/simulator/system/software.py index 42468057..8fb64d73 100644 --- a/src/primaite/simulator/system/software.py +++ b/src/primaite/simulator/system/software.py @@ -20,7 +20,6 @@ from primaite.utils.validation.port import Port if TYPE_CHECKING: from primaite.simulator.system.core.software_manager import SoftwareManager - from primaite.simulator.network.hardware.base import Node class SoftwareType(Enum): diff --git a/tests/unit_tests/_primaite/_game/_agent/test_agent.py b/tests/unit_tests/_primaite/_game/_agent/test_agent.py index 064537c2..b555f1b2 100644 --- a/tests/unit_tests/_primaite/_game/_agent/test_agent.py +++ b/tests/unit_tests/_primaite/_game/_agent/test_agent.py @@ -4,7 +4,7 @@ from primaite.game.agent.scripted_agents.random_agent import RandomAgent def test_creating_empty_agent(): - agent = RandomAgent(config={"ref" :"Empty Agent"}) + agent = RandomAgent(config={"ref": "Empty Agent"}) assert len(agent.action_manager.action_map) == 0 assert isinstance(agent.observation_manager.obs, NullObservation) assert len(agent.reward_function.reward_components) == 0 From 2830a2aef5b3002028a580a3aa9aebe469a459f4 Mon Sep 17 00:00:00 2001 From: Charlie Crane Date: Fri, 14 Feb 2025 12:36:23 +0000 Subject: [PATCH 08/13] #3060 - Amendment to new version tag in configuration yaml. Now under the metadata tag --- .../config/_package_data/basic_lan_network_example.yaml | 3 ++- .../_package_data/client_server_p2p_network_example.yaml | 3 ++- src/primaite/config/_package_data/data_manipulation.yaml | 3 ++- src/primaite/config/_package_data/data_manipulation_marl.yaml | 3 ++- .../mini_scenario_with_simulation_variation/base_scenario.yaml | 3 ++- .../_package_data/multi_lan_internet_network_example.yaml | 3 ++- .../_package_data/scenario_with_placeholders/scenario.yaml | 3 ++- tests/assets/configs/action_penalty.yaml | 3 ++- tests/assets/configs/bad_primaite_session.yaml | 3 ++- tests/assets/configs/basic_c2_setup.yaml | 3 ++- tests/assets/configs/basic_firewall.yaml | 3 ++- .../configs/basic_node_with_software_listening_ports.yaml | 3 ++- tests/assets/configs/basic_node_with_users.yaml | 3 ++- tests/assets/configs/basic_switched_network.yaml | 3 ++- tests/assets/configs/data_manipulation.yaml | 3 ++- tests/assets/configs/dmz_network.yaml | 3 ++- tests/assets/configs/eval_only_primaite_session.yaml | 3 ++- tests/assets/configs/extended_config.yaml | 3 ++- tests/assets/configs/firewall_actions_network.yaml | 3 ++- tests/assets/configs/fixing_duration_one_item.yaml | 3 ++- tests/assets/configs/install_and_configure_apps.yaml | 3 ++- tests/assets/configs/multi_agent_session.yaml | 3 ++- .../configs/nmap_network_service_recon_red_agent_config.yaml | 3 ++- tests/assets/configs/nmap_ping_scan_red_agent_config.yaml | 3 ++- tests/assets/configs/nmap_port_scan_red_agent_config.yaml | 3 ++- tests/assets/configs/no_nodes_links_agents_network.yaml | 3 ++- tests/assets/configs/scenario_with_placeholders/scenario.yaml | 3 ++- tests/assets/configs/shared_rewards.yaml | 3 ++- tests/assets/configs/software_fixing_duration.yaml | 3 ++- tests/assets/configs/test_application_install.yaml | 3 ++- tests/assets/configs/test_primaite_session.yaml | 3 ++- tests/assets/configs/wireless_wan_network_config.yaml | 3 ++- .../configs/wireless_wan_network_config_freq_max_override.yaml | 3 ++- .../wireless_wan_network_config_freq_max_override_blocked.yaml | 3 ++- 34 files changed, 68 insertions(+), 34 deletions(-) diff --git a/src/primaite/config/_package_data/basic_lan_network_example.yaml b/src/primaite/config/_package_data/basic_lan_network_example.yaml index 854dfcf3..9996be84 100644 --- a/src/primaite/config/_package_data/basic_lan_network_example.yaml +++ b/src/primaite/config/_package_data/basic_lan_network_example.yaml @@ -1,4 +1,5 @@ -version: 3.0 +metadata: + version: 3.0 game: ports: diff --git a/src/primaite/config/_package_data/client_server_p2p_network_example.yaml b/src/primaite/config/_package_data/client_server_p2p_network_example.yaml index 702c864f..1a9fca98 100644 --- a/src/primaite/config/_package_data/client_server_p2p_network_example.yaml +++ b/src/primaite/config/_package_data/client_server_p2p_network_example.yaml @@ -1,4 +1,5 @@ -version: 3.0 +metadata: + version: 3.0 game: ports: diff --git a/src/primaite/config/_package_data/data_manipulation.yaml b/src/primaite/config/_package_data/data_manipulation.yaml index 72b3f671..81f9aabe 100644 --- a/src/primaite/config/_package_data/data_manipulation.yaml +++ b/src/primaite/config/_package_data/data_manipulation.yaml @@ -1,4 +1,5 @@ -version: 3.0 +metadata: + version: 3.0 io_settings: save_agent_actions: true diff --git a/src/primaite/config/_package_data/data_manipulation_marl.yaml b/src/primaite/config/_package_data/data_manipulation_marl.yaml index 178b3322..71507acb 100644 --- a/src/primaite/config/_package_data/data_manipulation_marl.yaml +++ b/src/primaite/config/_package_data/data_manipulation_marl.yaml @@ -1,4 +1,5 @@ -version: 3.0 +metadata: + version: 3.0 io_settings: save_agent_actions: true diff --git a/src/primaite/config/_package_data/mini_scenario_with_simulation_variation/base_scenario.yaml b/src/primaite/config/_package_data/mini_scenario_with_simulation_variation/base_scenario.yaml index 9530305a..2ea18867 100644 --- a/src/primaite/config/_package_data/mini_scenario_with_simulation_variation/base_scenario.yaml +++ b/src/primaite/config/_package_data/mini_scenario_with_simulation_variation/base_scenario.yaml @@ -1,4 +1,5 @@ -version: 3.0 +metadata: + version: 3.0 game: max_episode_length: 128 diff --git a/src/primaite/config/_package_data/multi_lan_internet_network_example.yaml b/src/primaite/config/_package_data/multi_lan_internet_network_example.yaml index 4e8f085e..deaef3bd 100644 --- a/src/primaite/config/_package_data/multi_lan_internet_network_example.yaml +++ b/src/primaite/config/_package_data/multi_lan_internet_network_example.yaml @@ -1,4 +1,5 @@ -version: 3.0 +metadata: + version: 3.0 game: ports: diff --git a/src/primaite/config/_package_data/scenario_with_placeholders/scenario.yaml b/src/primaite/config/_package_data/scenario_with_placeholders/scenario.yaml index d34fb310..4ec3d257 100644 --- a/src/primaite/config/_package_data/scenario_with_placeholders/scenario.yaml +++ b/src/primaite/config/_package_data/scenario_with_placeholders/scenario.yaml @@ -1,4 +1,5 @@ -version: 3.0 +metadata: + version: 3.0 io_settings: save_agent_actions: true diff --git a/tests/assets/configs/action_penalty.yaml b/tests/assets/configs/action_penalty.yaml index 9561db4f..6700172e 100644 --- a/tests/assets/configs/action_penalty.yaml +++ b/tests/assets/configs/action_penalty.yaml @@ -1,4 +1,5 @@ -version: 3.0 +metadata: + version: 3.0 io_settings: save_agent_actions: false diff --git a/tests/assets/configs/bad_primaite_session.yaml b/tests/assets/configs/bad_primaite_session.yaml index 1f59225b..b8551caf 100644 --- a/tests/assets/configs/bad_primaite_session.yaml +++ b/tests/assets/configs/bad_primaite_session.yaml @@ -1,4 +1,5 @@ -version: 3.0 +metadata: + version: 3.0 game: ports: diff --git a/tests/assets/configs/basic_c2_setup.yaml b/tests/assets/configs/basic_c2_setup.yaml index 3011457f..9b569b44 100644 --- a/tests/assets/configs/basic_c2_setup.yaml +++ b/tests/assets/configs/basic_c2_setup.yaml @@ -4,7 +4,8 @@ # | node_a |------| switch_1 |------| node_b | # -------------- -------------- -------------- # -version: 3.0 +metadata: + version: 3.0 io_settings: save_step_metadata: false diff --git a/tests/assets/configs/basic_firewall.yaml b/tests/assets/configs/basic_firewall.yaml index 1aa1361a..26038270 100644 --- a/tests/assets/configs/basic_firewall.yaml +++ b/tests/assets/configs/basic_firewall.yaml @@ -4,7 +4,8 @@ # | client_1 |------| switch_1 |------| client_2 | # -------------- -------------- -------------- # -version: 3.0 +metadata: + version: 3.0 io_settings: save_step_metadata: false diff --git a/tests/assets/configs/basic_node_with_software_listening_ports.yaml b/tests/assets/configs/basic_node_with_software_listening_ports.yaml index b503d66d..6372de54 100644 --- a/tests/assets/configs/basic_node_with_software_listening_ports.yaml +++ b/tests/assets/configs/basic_node_with_software_listening_ports.yaml @@ -1,4 +1,5 @@ -version: 3.0 +metadata: + version: 3.0 io_settings: save_step_metadata: false diff --git a/tests/assets/configs/basic_node_with_users.yaml b/tests/assets/configs/basic_node_with_users.yaml index 3009b79e..20331ff2 100644 --- a/tests/assets/configs/basic_node_with_users.yaml +++ b/tests/assets/configs/basic_node_with_users.yaml @@ -1,4 +1,5 @@ -version: 3.0 +metadata: + version: 3.0 io_settings: save_step_metadata: false diff --git a/tests/assets/configs/basic_switched_network.yaml b/tests/assets/configs/basic_switched_network.yaml index 7e8a5715..b57ed3e0 100644 --- a/tests/assets/configs/basic_switched_network.yaml +++ b/tests/assets/configs/basic_switched_network.yaml @@ -4,7 +4,8 @@ # | client_1 |------| switch_1 |------| client_2 | # -------------- -------------- -------------- # -version: 3.0 +metadata: + version: 3.0 io_settings: save_step_metadata: false diff --git a/tests/assets/configs/data_manipulation.yaml b/tests/assets/configs/data_manipulation.yaml index baf9df7d..59f97644 100644 --- a/tests/assets/configs/data_manipulation.yaml +++ b/tests/assets/configs/data_manipulation.yaml @@ -1,4 +1,5 @@ -version: 3.0 +metadata: + version: 3.0 io_settings: save_agent_actions: true diff --git a/tests/assets/configs/dmz_network.yaml b/tests/assets/configs/dmz_network.yaml index 456920f1..0accb3b2 100644 --- a/tests/assets/configs/dmz_network.yaml +++ b/tests/assets/configs/dmz_network.yaml @@ -30,7 +30,8 @@ # | external_computer |------| switch_3 |------| external_server | # ----------------------- -------------- --------------------- # -version: 3.0 +metadata: + version: 3.0 io_settings: save_step_metadata: false diff --git a/tests/assets/configs/eval_only_primaite_session.yaml b/tests/assets/configs/eval_only_primaite_session.yaml index c0a61b9d..6085b1e7 100644 --- a/tests/assets/configs/eval_only_primaite_session.yaml +++ b/tests/assets/configs/eval_only_primaite_session.yaml @@ -1,4 +1,5 @@ -version: 3.0 +metadata: + version: 3.0 game: ports: diff --git a/tests/assets/configs/extended_config.yaml b/tests/assets/configs/extended_config.yaml index 1b0772c1..a58a9d4a 100644 --- a/tests/assets/configs/extended_config.yaml +++ b/tests/assets/configs/extended_config.yaml @@ -1,4 +1,5 @@ -version: 3.0 +metadata: + version: 3.0 io_settings: save_agent_actions: true diff --git a/tests/assets/configs/firewall_actions_network.yaml b/tests/assets/configs/firewall_actions_network.yaml index b624be52..66470f5a 100644 --- a/tests/assets/configs/firewall_actions_network.yaml +++ b/tests/assets/configs/firewall_actions_network.yaml @@ -30,7 +30,8 @@ # | external_computer |------| switch_3 |------| external_server | # ----------------------- -------------- --------------------- # -version: 3.0 +metadata: + version: 3.0 io_settings: save_step_metadata: false diff --git a/tests/assets/configs/fixing_duration_one_item.yaml b/tests/assets/configs/fixing_duration_one_item.yaml index ad94a9da..02b69e5c 100644 --- a/tests/assets/configs/fixing_duration_one_item.yaml +++ b/tests/assets/configs/fixing_duration_one_item.yaml @@ -4,7 +4,8 @@ # | client_1 |------| switch_1 |------| client_2 | # -------------- -------------- -------------- # -version: 3.0 +metadata: + version: 3.0 io_settings: save_step_metadata: false diff --git a/tests/assets/configs/install_and_configure_apps.yaml b/tests/assets/configs/install_and_configure_apps.yaml index 4f96496e..35546902 100644 --- a/tests/assets/configs/install_and_configure_apps.yaml +++ b/tests/assets/configs/install_and_configure_apps.yaml @@ -1,4 +1,5 @@ -version: 3.0 +metadata: + version: 3.0 io_settings: save_step_metadata: false diff --git a/tests/assets/configs/multi_agent_session.yaml b/tests/assets/configs/multi_agent_session.yaml index 263d5f66..de0cdad9 100644 --- a/tests/assets/configs/multi_agent_session.yaml +++ b/tests/assets/configs/multi_agent_session.yaml @@ -1,4 +1,5 @@ -version: 3.0 +metadata: + version: 3.0 io_settings: save_agent_actions: false diff --git a/tests/assets/configs/nmap_network_service_recon_red_agent_config.yaml b/tests/assets/configs/nmap_network_service_recon_red_agent_config.yaml index 6abb11ce..f7b8431e 100644 --- a/tests/assets/configs/nmap_network_service_recon_red_agent_config.yaml +++ b/tests/assets/configs/nmap_network_service_recon_red_agent_config.yaml @@ -1,4 +1,5 @@ -version: 3.0 +metadata: + version: 3.0 io_settings: save_step_metadata: false diff --git a/tests/assets/configs/nmap_ping_scan_red_agent_config.yaml b/tests/assets/configs/nmap_ping_scan_red_agent_config.yaml index 869f4fb8..112d7266 100644 --- a/tests/assets/configs/nmap_ping_scan_red_agent_config.yaml +++ b/tests/assets/configs/nmap_ping_scan_red_agent_config.yaml @@ -1,4 +1,5 @@ -version: 3.0 +metadata: + version: 3.0 io_settings: save_step_metadata: false diff --git a/tests/assets/configs/nmap_port_scan_red_agent_config.yaml b/tests/assets/configs/nmap_port_scan_red_agent_config.yaml index 1d5ab323..acd5319a 100644 --- a/tests/assets/configs/nmap_port_scan_red_agent_config.yaml +++ b/tests/assets/configs/nmap_port_scan_red_agent_config.yaml @@ -1,4 +1,5 @@ -version: 3.0 +metadata: + version: 3.0 io_settings: save_step_metadata: false diff --git a/tests/assets/configs/no_nodes_links_agents_network.yaml b/tests/assets/configs/no_nodes_links_agents_network.yaml index b79e6bc6..ed279b51 100644 --- a/tests/assets/configs/no_nodes_links_agents_network.yaml +++ b/tests/assets/configs/no_nodes_links_agents_network.yaml @@ -1,4 +1,5 @@ -version: 3.0 +metadata: + version: 3.0 io_settings: save_step_metadata: false diff --git a/tests/assets/configs/scenario_with_placeholders/scenario.yaml b/tests/assets/configs/scenario_with_placeholders/scenario.yaml index 76b51626..57fe59ab 100644 --- a/tests/assets/configs/scenario_with_placeholders/scenario.yaml +++ b/tests/assets/configs/scenario_with_placeholders/scenario.yaml @@ -1,4 +1,5 @@ -version: 3.0 +metadata: + version: 3.0 io_settings: save_agent_actions: true diff --git a/tests/assets/configs/shared_rewards.yaml b/tests/assets/configs/shared_rewards.yaml index 68b3b310..5aeb99fa 100644 --- a/tests/assets/configs/shared_rewards.yaml +++ b/tests/assets/configs/shared_rewards.yaml @@ -1,4 +1,5 @@ -version: 3.0 +metadata: + version: 3.0 io_settings: save_agent_actions: false diff --git a/tests/assets/configs/software_fixing_duration.yaml b/tests/assets/configs/software_fixing_duration.yaml index 2f5613e1..66ba6f18 100644 --- a/tests/assets/configs/software_fixing_duration.yaml +++ b/tests/assets/configs/software_fixing_duration.yaml @@ -4,7 +4,8 @@ # | client_1 |------| switch_1 |------| client_2 | # -------------- -------------- -------------- # -version: 3.0 +metadata: + version: 3.0 io_settings: save_step_metadata: false diff --git a/tests/assets/configs/test_application_install.yaml b/tests/assets/configs/test_application_install.yaml index d49d9bf2..8a292f83 100644 --- a/tests/assets/configs/test_application_install.yaml +++ b/tests/assets/configs/test_application_install.yaml @@ -1,4 +1,5 @@ -version: 3.0 +metadata: + version: 3.0 io_settings: save_agent_actions: true diff --git a/tests/assets/configs/test_primaite_session.yaml b/tests/assets/configs/test_primaite_session.yaml index c1206634..ad43732f 100644 --- a/tests/assets/configs/test_primaite_session.yaml +++ b/tests/assets/configs/test_primaite_session.yaml @@ -1,4 +1,5 @@ -version: 3.0 +metadata: + version: 3.0 io_settings: save_agent_actions: true diff --git a/tests/assets/configs/wireless_wan_network_config.yaml b/tests/assets/configs/wireless_wan_network_config.yaml index b722e50f..45721d8a 100644 --- a/tests/assets/configs/wireless_wan_network_config.yaml +++ b/tests/assets/configs/wireless_wan_network_config.yaml @@ -1,4 +1,5 @@ -version: 3.0 +metadata: + version: 3.0 game: max_episode_length: 256 diff --git a/tests/assets/configs/wireless_wan_network_config_freq_max_override.yaml b/tests/assets/configs/wireless_wan_network_config_freq_max_override.yaml index 4c2f4f86..20e48a89 100644 --- a/tests/assets/configs/wireless_wan_network_config_freq_max_override.yaml +++ b/tests/assets/configs/wireless_wan_network_config_freq_max_override.yaml @@ -1,4 +1,5 @@ -version: 3.0 +metadata: + version: 3.0 game: max_episode_length: 256 diff --git a/tests/assets/configs/wireless_wan_network_config_freq_max_override_blocked.yaml b/tests/assets/configs/wireless_wan_network_config_freq_max_override_blocked.yaml index a98b6ee2..6342d1b1 100644 --- a/tests/assets/configs/wireless_wan_network_config_freq_max_override_blocked.yaml +++ b/tests/assets/configs/wireless_wan_network_config_freq_max_override_blocked.yaml @@ -1,4 +1,5 @@ -version: 3.0 +metadata: + version: 3.0 game: max_episode_length: 256 From bf30b70bd2055500dfaf88d78682734cdf124af2 Mon Sep 17 00:00:00 2001 From: Charlie Crane Date: Mon, 17 Feb 2025 10:09:39 +0000 Subject: [PATCH 09/13] #3060 - Removal of un-necessary check in game.py --- src/primaite/game/game.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/primaite/game/game.py b/src/primaite/game/game.py index 4741199c..1427776e 100644 --- a/src/primaite/game/game.py +++ b/src/primaite/game/game.py @@ -247,13 +247,6 @@ class PrimaiteGame: game.options = PrimaiteGameOptions(**cfg["game"]) game.save_step_metadata = cfg.get("io_settings", {}).get("save_step_metadata") or False - config_version = cfg.get("version", {}) - - # TODO: Future YAML config should specify the PrimAITE version they are written for. - # For now, we warn that if it is missing, pending a mechanism to handle variations. - if not isinstance(config_version, int): - _LOGGER.warning("Version definition is missing from provided configuration. ") - # 1. create simulation sim = game.simulation net = sim.network From 3651d033d6f2ba5d527de70c00f796c2ff96bfeb Mon Sep 17 00:00:00 2001 From: Marek Wolan Date: Mon, 17 Feb 2025 17:34:22 +0000 Subject: [PATCH 10/13] fix instantiation of network nodes --- src/primaite/simulator/network/hardware/base.py | 4 +--- .../simulator/network/hardware/nodes/host/host_node.py | 4 ++-- .../simulator/network/hardware/nodes/network/router.py | 1 - .../simulator/network/hardware/nodes/network/switch.py | 5 ++--- src/primaite/simulator/system/services/arp/arp.py | 4 ++-- src/primaite/simulator/system/software.py | 2 +- 6 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/primaite/simulator/network/hardware/base.py b/src/primaite/simulator/network/hardware/base.py index 8653359a..b20fb351 100644 --- a/src/primaite/simulator/network/hardware/base.py +++ b/src/primaite/simulator/network/hardware/base.py @@ -639,10 +639,8 @@ class IPWiredNetworkInterface(WiredNetworkInterface, Layer3Interface, ABC): `default_gateway_hello` method is not defined, ignoring such errors to proceed without interruption. """ super().enable() - try: + if hasattr(self._connected_node, "default_gateway_hello"): self._connected_node.default_gateway_hello() - except AttributeError: - pass return True @abstractmethod diff --git a/src/primaite/simulator/network/hardware/nodes/host/host_node.py b/src/primaite/simulator/network/hardware/nodes/host/host_node.py index 76d9167c..2c1910c4 100644 --- a/src/primaite/simulator/network/hardware/nodes/host/host_node.py +++ b/src/primaite/simulator/network/hardware/nodes/host/host_node.py @@ -333,7 +333,7 @@ class HostNode(Node, discriminator="host-node"): class ConfigSchema(Node.ConfigSchema): """Configuration Schema for HostNode class.""" - type: Literal["host-node"] + type: Literal["host-node"] = "host-node" hostname: str = "HostNode" subnet_mask: IPV4Address = "255.255.255.0" ip_address: IPV4Address @@ -375,7 +375,7 @@ class HostNode(Node, discriminator="host-node"): This method is invoked to ensure the host node can communicate with its default gateway, primarily to confirm network connectivity and populate the ARP cache with the gateway's MAC address. """ - if self.operating_state == NodeOperatingState.ON and self.default_gateway: + if self.operating_state == NodeOperatingState.ON and self.config.default_gateway: self.software_manager.arp.get_default_gateway_mac_address() def receive_frame(self, frame: Frame, from_network_interface: NIC): diff --git a/src/primaite/simulator/network/hardware/nodes/network/router.py b/src/primaite/simulator/network/hardware/nodes/network/router.py index 3b35600b..f2a4652c 100644 --- a/src/primaite/simulator/network/hardware/nodes/network/router.py +++ b/src/primaite/simulator/network/hardware/nodes/network/router.py @@ -1351,7 +1351,6 @@ class Router(NetworkNode, discriminator="router"): :return: A dictionary representing the current state. """ state = super().describe_state() - state["num_ports"] = self.config.num_ports state["acl"] = self.acl.describe_state() return state diff --git a/src/primaite/simulator/network/hardware/nodes/network/switch.py b/src/primaite/simulator/network/hardware/nodes/network/switch.py index 1f2bc135..6e5814d0 100644 --- a/src/primaite/simulator/network/hardware/nodes/network/switch.py +++ b/src/primaite/simulator/network/hardware/nodes/network/switch.py @@ -103,8 +103,8 @@ class Switch(NetworkNode, discriminator="switch"): type: Literal["switch"] = "switch" hostname: str = "Switch" - num_ports: int = 24 - "The number of ports on the switch. Default is 24." + num_ports: int = 8 + "The number of ports on the switch." config: ConfigSchema = Field(default_factory=lambda: Switch.ConfigSchema()) @@ -139,7 +139,6 @@ class Switch(NetworkNode, discriminator="switch"): """ state = super().describe_state() state["ports"] = {port_num: port.describe_state() for port_num, port in self.network_interface.items()} - state["num_ports"] = self.config.num_ports # redundant? state["mac_address_table"] = {mac: port.port_num for mac, port in self.mac_address_table.items()} return state diff --git a/src/primaite/simulator/system/services/arp/arp.py b/src/primaite/simulator/system/services/arp/arp.py index b0630d5d..348cc03e 100644 --- a/src/primaite/simulator/system/services/arp/arp.py +++ b/src/primaite/simulator/system/services/arp/arp.py @@ -137,8 +137,8 @@ class ARP(Service, discriminator="arp"): break if use_default_gateway: - if self.software_manager.node.default_gateway: - target_ip_address = self.software_manager.node.default_gateway + if self.software_manager.node.config.default_gateway: + target_ip_address = self.software_manager.node.config.default_gateway else: return diff --git a/src/primaite/simulator/system/software.py b/src/primaite/simulator/system/software.py index 950f77c6..86b57818 100644 --- a/src/primaite/simulator/system/software.py +++ b/src/primaite/simulator/system/software.py @@ -82,7 +82,7 @@ class Software(SimComponent, ABC): """Configurable options for all software.""" model_config = ConfigDict(extra="forbid") - starting_health_state: SoftwareHealthState = SoftwareHealthState.UNUSED + starting_health_state: SoftwareHealthState = SoftwareHealthState.GOOD criticality: SoftwareCriticality = SoftwareCriticality.LOWEST fixing_duration: int = 2 From de88974332076c0f1841b0178674f4b73543701f Mon Sep 17 00:00:00 2001 From: Marek Wolan Date: Mon, 17 Feb 2025 18:14:07 +0000 Subject: [PATCH 11/13] Fix airspace hello --- src/primaite/simulator/network/airspace.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/primaite/simulator/network/airspace.py b/src/primaite/simulator/network/airspace.py index 7ede0bb0..434940f8 100644 --- a/src/primaite/simulator/network/airspace.py +++ b/src/primaite/simulator/network/airspace.py @@ -449,10 +449,8 @@ class IPWirelessNetworkInterface(WirelessNetworkInterface, Layer3Interface, ABC) `default_gateway_hello` method is not defined, ignoring such errors to proceed without interruption. """ super().enable() - try: + if hasattr(self._connected_node, "default_gateway_hello"): self._connected_node.default_gateway_hello() - except AttributeError: - pass @abstractmethod def receive_frame(self, frame: Frame) -> bool: From 46240e49a41510b4f2b708b6d489a6a97e27d40f Mon Sep 17 00:00:00 2001 From: Marek Wolan Date: Mon, 17 Feb 2025 18:46:09 +0000 Subject: [PATCH 12/13] update tests and make office lan creation work like previously --- src/primaite/simulator/network/creation.py | 15 +++++++++++++-- .../_network/_hardware/nodes/test_switch.py | 1 - .../_system/_applications/test_applications.py | 6 +++--- .../_simulator/_system/_services/test_services.py | 12 ++++++------ .../_primaite/_simulator/_system/test_software.py | 4 ++-- 5 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/primaite/simulator/network/creation.py b/src/primaite/simulator/network/creation.py index 255b7bf5..089ed00d 100644 --- a/src/primaite/simulator/network/creation.py +++ b/src/primaite/simulator/network/creation.py @@ -155,7 +155,12 @@ class OfficeLANAdder(NetworkNodeAdder, discriminator="office-lan"): # Create a core switch if more than one edge switch is needed if num_of_switches > 1: core_switch = Switch.from_config( - config={"type": "switch", "hostname": f"switch_core_{config.lan_name}", "start_up_duration": 0} + config={ + "type": "switch", + "hostname": f"switch_core_{config.lan_name}", + "start_up_duration": 0, + "num_ports": 24, + } ) core_switch.power_on() network.add_node(core_switch) @@ -183,7 +188,12 @@ class OfficeLANAdder(NetworkNodeAdder, discriminator="office-lan"): switch_port = 0 switch_n = 1 switch = Switch.from_config( - config={"type": "switch", "hostname": f"switch_edge_{switch_n}_{config.lan_name}", "start_up_duration": 0} + config={ + "type": "switch", + "hostname": f"switch_edge_{switch_n}_{config.lan_name}", + "start_up_duration": 0, + "num_ports": 24, + } ) switch.power_on() network.add_node(switch) @@ -207,6 +217,7 @@ class OfficeLANAdder(NetworkNodeAdder, discriminator="office-lan"): "type": "switch", "hostname": f"switch_edge_{switch_n}_{config.lan_name}", "start_up_duration": 0, + "num_ports": 24, } ) switch.power_on() diff --git a/tests/unit_tests/_primaite/_simulator/_network/_hardware/nodes/test_switch.py b/tests/unit_tests/_primaite/_simulator/_network/_hardware/nodes/test_switch.py index e45fe45d..94b1764d 100644 --- a/tests/unit_tests/_primaite/_simulator/_network/_hardware/nodes/test_switch.py +++ b/tests/unit_tests/_primaite/_simulator/_network/_hardware/nodes/test_switch.py @@ -17,4 +17,3 @@ def switch() -> Switch: def test_describe_state(switch): state = switch.describe_state() assert len(state.get("ports")) is 8 - assert state.get("num_ports") is 8 diff --git a/tests/unit_tests/_primaite/_simulator/_system/_applications/test_applications.py b/tests/unit_tests/_primaite/_simulator/_system/_applications/test_applications.py index dd29f18e..6cccad91 100644 --- a/tests/unit_tests/_primaite/_simulator/_system/_applications/test_applications.py +++ b/tests/unit_tests/_primaite/_simulator/_system/_applications/test_applications.py @@ -18,7 +18,7 @@ def test_scan(application): def test_run_application(application): assert application.operating_state == ApplicationOperatingState.CLOSED - assert application.health_state_actual == SoftwareHealthState.UNUSED + assert application.health_state_actual == SoftwareHealthState.GOOD application.run() assert application.operating_state == ApplicationOperatingState.RUNNING @@ -37,9 +37,9 @@ def test_close_application(application): def test_application_describe_states(application): assert application.operating_state == ApplicationOperatingState.CLOSED - assert application.health_state_actual == SoftwareHealthState.UNUSED + assert application.health_state_actual == SoftwareHealthState.GOOD - assert SoftwareHealthState.UNUSED.value == application.describe_state().get("health_state_actual") + assert SoftwareHealthState.GOOD.value == application.describe_state().get("health_state_actual") application.run() assert SoftwareHealthState.GOOD.value == application.describe_state().get("health_state_actual") diff --git a/tests/unit_tests/_primaite/_simulator/_system/_services/test_services.py b/tests/unit_tests/_primaite/_simulator/_system/_services/test_services.py index 5598e1a7..fe78aa65 100644 --- a/tests/unit_tests/_primaite/_simulator/_system/_services/test_services.py +++ b/tests/unit_tests/_primaite/_simulator/_system/_services/test_services.py @@ -22,7 +22,7 @@ def test_scan(service): def test_start_service(service): assert service.operating_state == ServiceOperatingState.STOPPED - assert service.health_state_actual == SoftwareHealthState.UNUSED + assert service.health_state_actual == SoftwareHealthState.GOOD service.start() assert service.operating_state == ServiceOperatingState.RUNNING @@ -43,7 +43,7 @@ def test_pause_and_resume_service(service): assert service.operating_state == ServiceOperatingState.STOPPED service.resume() assert service.operating_state == ServiceOperatingState.STOPPED - assert service.health_state_actual == SoftwareHealthState.UNUSED + assert service.health_state_actual == SoftwareHealthState.GOOD service.start() assert service.health_state_actual == SoftwareHealthState.GOOD @@ -58,11 +58,11 @@ def test_pause_and_resume_service(service): def test_restart(service): assert service.operating_state == ServiceOperatingState.STOPPED - assert service.health_state_actual == SoftwareHealthState.UNUSED + assert service.health_state_actual == SoftwareHealthState.GOOD service.restart() # Service is STOPPED. Restart will only work if the service was PAUSED or RUNNING assert service.operating_state == ServiceOperatingState.STOPPED - assert service.health_state_actual == SoftwareHealthState.UNUSED + assert service.health_state_actual == SoftwareHealthState.GOOD service.start() assert service.operating_state == ServiceOperatingState.RUNNING @@ -157,11 +157,11 @@ def test_service_fixing(service): def test_enable_disable(service): service.disable() assert service.operating_state == ServiceOperatingState.DISABLED - assert service.health_state_actual == SoftwareHealthState.UNUSED + assert service.health_state_actual == SoftwareHealthState.GOOD service.enable() assert service.operating_state == ServiceOperatingState.STOPPED - assert service.health_state_actual == SoftwareHealthState.UNUSED + assert service.health_state_actual == SoftwareHealthState.GOOD def test_overwhelm_service(service): diff --git a/tests/unit_tests/_primaite/_simulator/_system/test_software.py b/tests/unit_tests/_primaite/_simulator/_system/test_software.py index 8c39c41d..9ad0dbcb 100644 --- a/tests/unit_tests/_primaite/_simulator/_system/test_software.py +++ b/tests/unit_tests/_primaite/_simulator/_system/test_software.py @@ -39,6 +39,6 @@ def test_software_creation(software): def test_software_set_health_state(software): - assert software.health_state_actual == SoftwareHealthState.UNUSED - software.set_health_state(SoftwareHealthState.GOOD) assert software.health_state_actual == SoftwareHealthState.GOOD + software.set_health_state(SoftwareHealthState.COMPROMISED) + assert software.health_state_actual == SoftwareHealthState.COMPROMISED From 22b197a79aaf287895398083e75396a1c9d7c04f Mon Sep 17 00:00:00 2001 From: Charlie Crane Date: Tue, 18 Feb 2025 09:13:33 +0000 Subject: [PATCH 13/13] Removal of leftover comment from software.py --- src/primaite/simulator/system/software.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/primaite/simulator/system/software.py b/src/primaite/simulator/system/software.py index 8fb64d73..950f77c6 100644 --- a/src/primaite/simulator/system/software.py +++ b/src/primaite/simulator/system/software.py @@ -110,7 +110,6 @@ class Software(SimComponent, ABC): "The folder on the file system the Software uses." _fixing_countdown: Optional[int] = None "Current number of ticks left to patch the software." - # parent: Optional[Node] = None def __init__(self, **kwargs): super().__init__(**kwargs)