#1962: merge dev into branch + fix minor diffs + ensure that imports pull from src

This commit is contained in:
Czar.Echavez
2023-11-08 10:36:47 +00:00
201 changed files with 4799 additions and 16458 deletions

View File

@@ -3,7 +3,7 @@ from enum import Enum
from typing import Dict
from primaite import getLogger
from primaite.simulator.core import SimComponent
from src.primaite.simulator.core import SimComponent
_LOGGER = getLogger(__name__)

View File

@@ -1,8 +1,8 @@
from enum import Enum
from typing import Dict, Final, List, Literal, Tuple
from primaite.simulator.core import RequestManager, RequestPermissionValidator, RequestType, SimComponent
from primaite.simulator.domain.account import Account, AccountType
from src.primaite.simulator.core import RequestManager, RequestPermissionValidator, RequestType, SimComponent
from src.primaite.simulator.domain.account import Account, AccountType
# placeholder while these objects don't yet exist

View File

@@ -7,8 +7,8 @@ from pathlib import Path
from typing import Dict, Optional
from primaite import getLogger
from primaite.simulator.file_system.file_system_item_abc import FileSystemItemABC, FileSystemItemHealthStatus
from primaite.simulator.file_system.file_type import FileType, get_file_type_from_extension
from src.primaite.simulator.file_system.file_system_item_abc import FileSystemItemABC, FileSystemItemHealthStatus
from src.primaite.simulator.file_system.file_type import FileType, get_file_type_from_extension
_LOGGER = getLogger(__name__)

View File

@@ -7,11 +7,11 @@ from typing import Dict, Optional
from prettytable import MARKDOWN, PrettyTable
from primaite import getLogger
from primaite.simulator.core import RequestManager, RequestType, SimComponent
from primaite.simulator.file_system.file import File
from primaite.simulator.file_system.file_type import FileType
from primaite.simulator.file_system.folder import Folder
from primaite.simulator.system.core.sys_log import SysLog
from src.primaite.simulator.core import RequestManager, RequestType, SimComponent
from src.primaite.simulator.file_system.file import File
from src.primaite.simulator.file_system.file_type import FileType
from src.primaite.simulator.file_system.folder import Folder
from src.primaite.simulator.system.core.sys_log import SysLog
_LOGGER = getLogger(__name__)

View File

@@ -6,8 +6,8 @@ from enum import Enum
from typing import Dict, Optional
from primaite import getLogger
from primaite.simulator.core import RequestManager, RequestType, SimComponent
from primaite.simulator.system.core.sys_log import SysLog
from src.primaite.simulator.core import RequestManager, RequestType, SimComponent
from src.primaite.simulator.system.core.sys_log import SysLog
_LOGGER = getLogger(__name__)
@@ -41,19 +41,19 @@ def convert_size(size_bytes: int) -> str:
class FileSystemItemHealthStatus(Enum):
"""Status of the FileSystemItem."""
GOOD = 0
GOOD = 1
"""File/Folder is OK."""
COMPROMISED = 1
COMPROMISED = 2
"""File/Folder is quarantined."""
CORRUPT = 2
CORRUPT = 3
"""File/Folder is corrupted."""
RESTORING = 3
RESTORING = 4
"""File/Folder is in the process of being restored."""
REPAIRING = 3
REPAIRING = 5
"""File/Folder is in the process of being repaired."""
@@ -93,8 +93,8 @@ class FileSystemItemABC(SimComponent):
"""
state = super().describe_state()
state["name"] = self.name
state["status"] = self.health_status.name
state["visible_status"] = self.visible_health_status.name
state["health_status"] = self.health_status.value
state["visible_status"] = self.visible_health_status.value
state["previous_hash"] = self.previous_hash
state["revealed_to_red"] = self.revealed_to_red
return state

View File

@@ -5,9 +5,9 @@ from typing import Dict, Optional
from prettytable import MARKDOWN, PrettyTable
from primaite import getLogger
from primaite.simulator.core import RequestManager, RequestType
from primaite.simulator.file_system.file import File
from primaite.simulator.file_system.file_system_item_abc import FileSystemItemABC, FileSystemItemHealthStatus
from src.primaite.simulator.core import RequestManager, RequestType
from src.primaite.simulator.file_system.file import File
from src.primaite.simulator.file_system.file_system_item_abc import FileSystemItemABC, FileSystemItemHealthStatus
_LOGGER = getLogger(__name__)

View File

@@ -6,12 +6,12 @@ from networkx import MultiGraph
from prettytable import MARKDOWN, PrettyTable
from primaite import getLogger
from primaite.simulator.core import RequestManager, RequestType, SimComponent
from primaite.simulator.network.hardware.base import Link, NIC, Node, SwitchPort
from primaite.simulator.network.hardware.nodes.computer import Computer
from primaite.simulator.network.hardware.nodes.router import Router
from primaite.simulator.network.hardware.nodes.server import Server
from primaite.simulator.network.hardware.nodes.switch import Switch
from src.primaite.simulator.core import RequestManager, RequestType, SimComponent
from src.primaite.simulator.network.hardware.base import Link, NIC, Node, SwitchPort
from src.primaite.simulator.network.hardware.nodes.computer import Computer
from src.primaite.simulator.network.hardware.nodes.router import Router
from src.primaite.simulator.network.hardware.nodes.server import Server
from src.primaite.simulator.network.hardware.nodes.switch import Switch
_LOGGER = getLogger(__name__)
@@ -160,8 +160,8 @@ class Network(SimComponent):
state = super().describe_state()
state.update(
{
"nodes": {i for i, node in self._node_id_map.items()},
"links": {i: link.describe_state() for i, link in self._link_id_map.items()},
"nodes": {uuid: node.describe_state() for uuid, node in self.nodes.items()},
"links": {uuid: link.describe_state() for uuid, link in self.links.items()},
}
)
return state
@@ -218,7 +218,9 @@ class Network(SimComponent):
_LOGGER.info(f"Removed node {node.uuid} from network {self.uuid}")
self._node_request_manager.remove_request(name=node.uuid)
def connect(self, endpoint_a: Union[NIC, SwitchPort], endpoint_b: Union[NIC, SwitchPort], **kwargs) -> None:
def connect(
self, endpoint_a: Union[NIC, SwitchPort], endpoint_b: Union[NIC, SwitchPort], **kwargs
) -> Optional[Link]:
"""
Connect two endpoints on the network by creating a link between their NICs/SwitchPorts.
@@ -245,6 +247,7 @@ class Network(SimComponent):
self._nx_graph.add_edge(endpoint_a.parent.hostname, endpoint_b.parent.hostname)
link.parent = self
_LOGGER.debug(f"Added link {link.uuid} to connect {endpoint_a} and {endpoint_b}")
return link
def remove_link(self, link: Link) -> None:
"""Disconnect a link from the network.

View File

@@ -10,22 +10,22 @@ from typing import Any, Dict, Literal, Optional, Tuple, Union
from prettytable import MARKDOWN, PrettyTable
from primaite import getLogger
from primaite.exceptions import NetworkError
from primaite.simulator import SIM_OUTPUT
from primaite.simulator.core import RequestManager, RequestType, SimComponent
from primaite.simulator.domain.account import Account
from primaite.simulator.file_system.file_system import FileSystem
from primaite.simulator.network.protocols.arp import ARPEntry, ARPPacket
from primaite.simulator.network.transmission.data_link_layer import EthernetHeader, Frame
from primaite.simulator.network.transmission.network_layer import ICMPPacket, ICMPType, IPPacket, IPProtocol
from primaite.simulator.network.transmission.transport_layer import Port, TCPHeader
from primaite.simulator.system.applications.application import Application
from primaite.simulator.system.core.packet_capture import PacketCapture
from primaite.simulator.system.core.session_manager import SessionManager
from primaite.simulator.system.core.software_manager import SoftwareManager
from primaite.simulator.system.core.sys_log import SysLog
from primaite.simulator.system.processes.process import Process
from primaite.simulator.system.services.service import Service
from src.primaite.exceptions import NetworkError
from src.primaite.simulator import SIM_OUTPUT
from src.primaite.simulator.core import RequestManager, RequestType, SimComponent
from src.primaite.simulator.domain.account import Account
from src.primaite.simulator.file_system.file_system import FileSystem
from src.primaite.simulator.network.protocols.arp import ARPEntry, ARPPacket
from src.primaite.simulator.network.transmission.data_link_layer import EthernetHeader, Frame
from src.primaite.simulator.network.transmission.network_layer import ICMPPacket, ICMPType, IPPacket, IPProtocol
from src.primaite.simulator.network.transmission.transport_layer import Port, TCPHeader
from src.primaite.simulator.system.applications.application import Application
from src.primaite.simulator.system.core.packet_capture import PacketCapture
from src.primaite.simulator.system.core.session_manager import SessionManager
from src.primaite.simulator.system.core.software_manager import SoftwareManager
from src.primaite.simulator.system.core.sys_log import SysLog
from src.primaite.simulator.system.processes.process import Process
from src.primaite.simulator.system.services.service import Service
_LOGGER = getLogger(__name__)
@@ -859,14 +859,14 @@ class ICMP:
class NodeOperatingState(Enum):
"""Enumeration of Node Operating States."""
OFF = 0
"The node is powered off."
ON = 1
"The node is powered on."
SHUTTING_DOWN = 2
"The node is in the process of shutting down."
OFF = 2
"The node is powered off."
BOOTING = 3
"The node is in the process of booting up."
SHUTTING_DOWN = 4
"The node is in the process of shutting down."
class Node(SimComponent):
@@ -962,6 +962,7 @@ class Node(SimComponent):
kwargs["file_system"] = FileSystem(sys_log=kwargs["sys_log"], sim_root=kwargs["root"] / "fs")
if not kwargs.get("software_manager"):
kwargs["software_manager"] = SoftwareManager(
parent_node=self,
sys_log=kwargs.get("sys_log"),
session_manager=kwargs.get("session_manager"),
file_system=kwargs.get("file_system"),
@@ -1369,7 +1370,8 @@ class Node(SimComponent):
self._service_request_manager.add_request(service.uuid, RequestType(func=service._request_manager))
def uninstall_service(self, service: Service) -> None:
"""Uninstall and completely remove service from this node.
"""
Uninstall and completely remove service from this node.
:param service: Service object that is currently associated with this node.
:type service: Service

View File

@@ -1,7 +1,7 @@
from primaite.simulator.network.hardware.base import NIC, Node
from primaite.simulator.system.applications.web_browser import WebBrowser
from primaite.simulator.system.services.dns.dns_client import DNSClient
from primaite.simulator.system.services.ftp.ftp_client import FTPClient
from src.primaite.simulator.network.hardware.base import NIC, Node
from src.primaite.simulator.system.applications.web_browser import WebBrowser
from src.primaite.simulator.system.services.dns.dns_client import DNSClient
from src.primaite.simulator.system.services.ftp.ftp_client import FTPClient
class Computer(Node):

View File

@@ -7,12 +7,12 @@ from typing import Dict, List, Optional, Tuple, Union
from prettytable import MARKDOWN, PrettyTable
from primaite.simulator.core import RequestManager, RequestType, SimComponent
from primaite.simulator.network.hardware.base import ARPCache, ICMP, NIC, Node
from primaite.simulator.network.transmission.data_link_layer import EthernetHeader, Frame
from primaite.simulator.network.transmission.network_layer import ICMPPacket, ICMPType, IPPacket, IPProtocol
from primaite.simulator.network.transmission.transport_layer import Port, TCPHeader
from primaite.simulator.system.core.sys_log import SysLog
from src.primaite.simulator.core import RequestManager, RequestType, SimComponent
from src.primaite.simulator.network.hardware.base import ARPCache, ICMP, NIC, Node
from src.primaite.simulator.network.transmission.data_link_layer import EthernetHeader, Frame
from src.primaite.simulator.network.transmission.network_layer import ICMPPacket, ICMPType, IPPacket, IPProtocol
from src.primaite.simulator.network.transmission.transport_layer import Port, TCPHeader
from src.primaite.simulator.system.core.sys_log import SysLog
class ACLAction(Enum):
@@ -58,7 +58,14 @@ class ACLRule(SimComponent):
:return: A dictionary representing the current state.
"""
pass
state = super().describe_state()
state["action"] = self.action.value
state["protocol"] = self.protocol.value if self.protocol else None
state["src_ip_address"] = self.src_ip_address if self.src_ip_address else None
state["src_port"] = self.src_port.value if self.src_port else None
state["dst_ip_address"] = self.dst_ip_address if self.dst_ip_address else None
state["dst_port"] = self.dst_port.value if self.dst_port else None
return state
class AccessControlList(SimComponent):
@@ -104,11 +111,11 @@ class AccessControlList(SimComponent):
RequestType(
func=lambda request, context: self.add_rule(
ACLAction[request[0]],
IPProtocol[request[1]],
IPv4Address[request[2]],
Port[request[3]],
IPv4Address[request[4]],
Port[request[5]],
None if request[1] == "ALL" else IPProtocol[request[1]],
IPv4Address(request[2]),
None if request[3] == "ALL" else Port[request[3]],
IPv4Address(request[4]),
None if request[5] == "ALL" else Port[request[5]],
int(request[6]),
)
),
@@ -123,7 +130,12 @@ class AccessControlList(SimComponent):
:return: A dictionary representing the current state.
"""
pass
state = super().describe_state()
state["implicit_action"] = self.implicit_action.value
state["implicit_rule"] = self.implicit_rule.describe_state()
state["max_acl_rules"] = self.max_acl_rules
state["acl"] = {i: r.describe_state() if isinstance(r, ACLRule) else None for i, r in enumerate(self._acl)}
return state
@property
def acl(self) -> List[Optional[ACLRule]]:
@@ -648,7 +660,10 @@ class Router(Node):
:return: A dictionary representing the current state.
"""
pass
state = super().describe_state()
state["num_ports"] = (self.num_ports,)
state["acl"] = (self.acl.describe_state(),)
return state
def route_frame(self, frame: Frame, from_nic: NIC, re_attempt: bool = False) -> None:
"""

View File

@@ -1,4 +1,4 @@
from primaite.simulator.network.hardware.nodes.computer import Computer
from src.primaite.simulator.network.hardware.nodes.computer import Computer
class Server(Computer):

View File

@@ -3,10 +3,9 @@ from typing import Dict
from prettytable import MARKDOWN, PrettyTable
from primaite import getLogger
from primaite.exceptions import NetworkError
from primaite.links.link import Link
from primaite.simulator.network.hardware.base import Node, SwitchPort
from primaite.simulator.network.transmission.data_link_layer import Frame
from src.primaite.exceptions import NetworkError
from src.primaite.simulator.network.hardware.base import Link, Node, SwitchPort
from src.primaite.simulator.network.transmission.data_link_layer import Frame
_LOGGER = getLogger(__name__)
@@ -55,12 +54,11 @@ class Switch(Node):
:return: Current state of this object and child objects.
"""
return {
"uuid": self.uuid,
"num_ports": self.num_ports, # redundant?
"ports": {port_num: port.describe_state() for port_num, port in self.switch_ports.items()},
"mac_address_table": {mac: port for mac, port in self.mac_address_table.items()},
}
state = super().describe_state()
state["ports"] = {port_num: port.describe_state() for port_num, port in self.switch_ports.items()}
state["num_ports"] = self.num_ports # redundant?
state["mac_address_table"] = {mac: port for mac, port in self.mac_address_table.items()}
return state
def _add_mac_table_entry(self, mac_address: str, switch_port: SwitchPort):
"""

View File

@@ -1,19 +1,19 @@
from ipaddress import IPv4Address
from primaite.simulator.network.container import Network
from primaite.simulator.network.hardware.base import NIC, NodeOperatingState
from primaite.simulator.network.hardware.nodes.computer import Computer
from primaite.simulator.network.hardware.nodes.router import ACLAction, Router
from primaite.simulator.network.hardware.nodes.server import Server
from primaite.simulator.network.hardware.nodes.switch import Switch
from primaite.simulator.network.transmission.network_layer import IPProtocol
from primaite.simulator.network.transmission.transport_layer import Port
from primaite.simulator.system.applications.database_client import DatabaseClient
from primaite.simulator.system.services.database.database_service import DatabaseService
from primaite.simulator.system.services.dns.dns_server import DNSServer
from primaite.simulator.system.services.ftp.ftp_server import FTPServer
from primaite.simulator.system.services.red_services.data_manipulation_bot import DataManipulationBot
from primaite.simulator.system.services.web_server.web_server import WebServer
from src.primaite.simulator.network.container import Network
from src.primaite.simulator.network.hardware.base import NIC, NodeOperatingState
from src.primaite.simulator.network.hardware.nodes.computer import Computer
from src.primaite.simulator.network.hardware.nodes.router import ACLAction, Router
from src.primaite.simulator.network.hardware.nodes.server import Server
from src.primaite.simulator.network.hardware.nodes.switch import Switch
from src.primaite.simulator.network.transmission.network_layer import IPProtocol
from src.primaite.simulator.network.transmission.transport_layer import Port
from src.primaite.simulator.system.applications.database_client import DatabaseClient
from src.primaite.simulator.system.services.database.database_service import DatabaseService
from src.primaite.simulator.system.services.dns.dns_server import DNSServer
from src.primaite.simulator.system.services.ftp.ftp_server import FTPServer
from src.primaite.simulator.system.services.red_services.data_manipulation_bot import DataManipulationBot
from src.primaite.simulator.system.services.web_server.web_server import WebServer
def client_server_routed() -> Network:

View File

@@ -5,7 +5,7 @@ from typing import Optional
from pydantic import BaseModel
from primaite.simulator.network.protocols.packet import DataPacket
from src.primaite.simulator.network.protocols.packet import DataPacket
class ARPEntry(BaseModel):

View File

@@ -5,7 +5,7 @@ from typing import Optional
from pydantic import BaseModel
from primaite.simulator.network.protocols.packet import DataPacket
from src.primaite.simulator.network.protocols.packet import DataPacket
class DNSRequest(BaseModel):

View File

@@ -1,7 +1,7 @@
from enum import Enum
from typing import Any, Optional, Union
from primaite.simulator.network.protocols.packet import DataPacket
from src.primaite.simulator.network.protocols.packet import DataPacket
class FTPCommand(Enum):

View File

@@ -1,6 +1,6 @@
from enum import Enum
from primaite.simulator.network.protocols.packet import DataPacket
from src.primaite.simulator.network.protocols.packet import DataPacket
class HttpRequestMethod(Enum):

View File

@@ -4,12 +4,12 @@ from typing import Any, Optional
from pydantic import BaseModel
from primaite import getLogger
from primaite.simulator.network.protocols.arp import ARPPacket
from primaite.simulator.network.protocols.packet import DataPacket
from primaite.simulator.network.transmission.network_layer import ICMPPacket, IPPacket, IPProtocol
from primaite.simulator.network.transmission.primaite_layer import PrimaiteHeader
from primaite.simulator.network.transmission.transport_layer import TCPHeader, UDPHeader
from primaite.simulator.network.utils import convert_bytes_to_megabits
from src.primaite.simulator.network.protocols.arp import ARPPacket
from src.primaite.simulator.network.protocols.packet import DataPacket
from src.primaite.simulator.network.transmission.network_layer import ICMPPacket, IPPacket, IPProtocol
from src.primaite.simulator.network.transmission.primaite_layer import PrimaiteHeader
from src.primaite.simulator.network.transmission.transport_layer import TCPHeader, UDPHeader
from src.primaite.simulator.network.utils import convert_bytes_to_megabits
_LOGGER = getLogger(__name__)

View File

@@ -1,8 +1,8 @@
from typing import Dict
from primaite.simulator.core import RequestManager, RequestType, SimComponent
from primaite.simulator.domain.controller import DomainController
from primaite.simulator.network.container import Network
from src.primaite.simulator.core import RequestManager, RequestType, SimComponent
from src.primaite.simulator.domain.controller import DomainController
from src.primaite.simulator.network.container import Network
class Simulation(SimComponent):
@@ -27,6 +27,7 @@ class Simulation(SimComponent):
rm.add_request("network", RequestType(func=self.network._request_manager))
# pass through domain requests to the domain object
rm.add_request("domain", RequestType(func=self.domain._request_manager))
rm.add_request("do_nothing", RequestType(func=lambda request, context: ()))
return rm
def describe_state(self) -> Dict:

View File

@@ -2,7 +2,7 @@ from abc import abstractmethod
from enum import Enum
from typing import Any, Dict, Set
from primaite.simulator.system.software import IOSoftware, SoftwareHealthState
from src.primaite.simulator.system.software import IOSoftware, SoftwareHealthState
class ApplicationOperatingState(Enum):
@@ -51,7 +51,7 @@ class Application(IOSoftware):
state = super().describe_state()
state.update(
{
"opearting_state": self.operating_state.name,
"opearting_state": self.operating_state.value,
"execution_control_status": self.execution_control_status,
"num_executions": self.num_executions,
"groups": list(self.groups),

View File

@@ -4,10 +4,10 @@ from uuid import uuid4
from prettytable import PrettyTable
from primaite.simulator.network.transmission.network_layer import IPProtocol
from primaite.simulator.network.transmission.transport_layer import Port
from primaite.simulator.system.applications.application import Application, ApplicationOperatingState
from primaite.simulator.system.core.software_manager import SoftwareManager
from src.primaite.simulator.network.transmission.network_layer import IPProtocol
from src.primaite.simulator.network.transmission.transport_layer import Port
from src.primaite.simulator.system.applications.application import Application, ApplicationOperatingState
from src.primaite.simulator.system.core.software_manager import SoftwareManager
class DatabaseClient(Application):

View File

@@ -2,11 +2,11 @@ from ipaddress import IPv4Address
from typing import Dict, Optional
from urllib.parse import urlparse
from primaite.simulator.network.protocols.http import HttpRequestMethod, HttpRequestPacket, HttpResponsePacket
from primaite.simulator.network.transmission.network_layer import IPProtocol
from primaite.simulator.network.transmission.transport_layer import Port
from primaite.simulator.system.applications.application import Application
from primaite.simulator.system.services.dns.dns_client import DNSClient
from src.primaite.simulator.network.protocols.http import HttpRequestMethod, HttpRequestPacket, HttpResponsePacket
from src.primaite.simulator.network.transmission.network_layer import IPProtocol
from src.primaite.simulator.network.transmission.transport_layer import Port
from src.primaite.simulator.system.applications.application import Application
from src.primaite.simulator.system.services.dns.dns_client import DNSClient
class WebBrowser(Application):
@@ -38,7 +38,8 @@ class WebBrowser(Application):
:return: A dictionary capturing the current state of the WebBrowser and its child objects.
"""
return super().describe_state()
state = super().describe_state()
state["last_response_status_code"] = self.latest_response.status_code if self.latest_response else None
def reset_component_for_episode(self, episode: int):
"""

View File

@@ -3,7 +3,7 @@ import logging
from pathlib import Path
from typing import Any, Dict, List, Optional
from primaite.simulator import SIM_OUTPUT
from src.primaite.simulator import SIM_OUTPUT
class _JSONFilter(logging.Filter):

View File

@@ -5,15 +5,15 @@ from typing import Any, Dict, Optional, Tuple, TYPE_CHECKING, Union
from prettytable import MARKDOWN, PrettyTable
from primaite.simulator.core import SimComponent
from primaite.simulator.network.transmission.data_link_layer import EthernetHeader, Frame
from primaite.simulator.network.transmission.network_layer import IPPacket, IPProtocol
from primaite.simulator.network.transmission.transport_layer import Port, TCPHeader
from src.primaite.simulator.core import SimComponent
from src.primaite.simulator.network.transmission.data_link_layer import EthernetHeader, Frame
from src.primaite.simulator.network.transmission.network_layer import IPPacket, IPProtocol
from src.primaite.simulator.network.transmission.transport_layer import Port, TCPHeader
if TYPE_CHECKING:
from primaite.simulator.network.hardware.base import ARPCache
from primaite.simulator.system.core.software_manager import SoftwareManager
from primaite.simulator.system.core.sys_log import SysLog
from src.primaite.simulator.network.hardware.base import ARPCache
from src.primaite.simulator.system.core.software_manager import SoftwareManager
from src.primaite.simulator.system.core.sys_log import SysLog
class Session(SimComponent):

View File

@@ -3,17 +3,18 @@ from typing import Any, Dict, List, Optional, Tuple, TYPE_CHECKING, Union
from prettytable import MARKDOWN, PrettyTable
from primaite.simulator.file_system.file_system import FileSystem
from primaite.simulator.network.transmission.network_layer import IPProtocol
from primaite.simulator.network.transmission.transport_layer import Port
from primaite.simulator.system.applications.application import Application, ApplicationOperatingState
from primaite.simulator.system.core.sys_log import SysLog
from primaite.simulator.system.services.service import Service, ServiceOperatingState
from primaite.simulator.system.software import IOSoftware
from src.primaite.simulator.file_system.file_system import FileSystem
from src.primaite.simulator.network.transmission.network_layer import IPProtocol
from src.primaite.simulator.network.transmission.transport_layer import Port
from src.primaite.simulator.system.applications.application import Application, ApplicationOperatingState
from src.primaite.simulator.system.core.sys_log import SysLog
from src.primaite.simulator.system.services.service import Service, ServiceOperatingState
from src.primaite.simulator.system.software import IOSoftware
if TYPE_CHECKING:
from primaite.simulator.system.core.session_manager import SessionManager
from primaite.simulator.system.core.sys_log import SysLog
from src.primaite.simulator.system.core.session_manager import SessionManager
from src.primaite.simulator.system.core.sys_log import SysLog
from src.primaite.simulator.network.hardware.base import Node
from typing import Type, TypeVar
@@ -25,6 +26,7 @@ class SoftwareManager:
def __init__(
self,
parent_node: "Node",
session_manager: "SessionManager",
sys_log: SysLog,
file_system: FileSystem,
@@ -35,6 +37,7 @@ class SoftwareManager:
:param session_manager: The session manager handling network communications.
"""
self.node = parent_node
self.session_manager = session_manager
self.software: Dict[str, Union[Service, Application]] = {}
self._software_class_to_name_map: Dict[Type[IOSoftwareClass], str] = {}
@@ -62,6 +65,8 @@ class SoftwareManager:
:param software_class: The software class.
"""
# TODO: Software manager and node itself both have an install method. Need to refactor to have more logical
# separation of concerns.
if software_class in self._software_class_to_name_map:
self.sys_log.info(f"Cannot install {software_class} as it is already installed")
return
@@ -77,6 +82,12 @@ class SoftwareManager:
if isinstance(software, Application):
software.operating_state = ApplicationOperatingState.CLOSED
# add the software to the node's registry after it has been fully initialized
if isinstance(software, Service):
self.node.install_service(software)
elif isinstance(software, Application):
self.node.install_application(software)
def uninstall(self, software_name: str):
"""
Uninstall an Application or Service.
@@ -85,6 +96,10 @@ class SoftwareManager:
"""
if software_name in self.software:
software = self.software.pop(software_name) # noqa
if isinstance(software, Application):
self.node.uninstall_application(software)
elif isinstance(software, Service):
self.node.uninstall_service(software)
del software
self.sys_log.info(f"Deleted {software_name}")
return

View File

@@ -3,7 +3,7 @@ from pathlib import Path
from prettytable import MARKDOWN, PrettyTable
from primaite.simulator import SIM_OUTPUT
from src.primaite.simulator import SIM_OUTPUT
class _NotJSONFilter(logging.Filter):

View File

@@ -2,7 +2,7 @@ from abc import abstractmethod
from enum import Enum
from typing import Dict
from primaite.simulator.system.software import Software
from src.primaite.simulator.system.software import Software
class ProcessOperatingState(Enum):

View File

@@ -6,13 +6,13 @@ from typing import Any, Dict, List, Optional, Union
from prettytable import MARKDOWN, PrettyTable
from primaite.simulator.file_system.file_system import File
from primaite.simulator.network.transmission.network_layer import IPProtocol
from primaite.simulator.network.transmission.transport_layer import Port
from primaite.simulator.system.core.software_manager import SoftwareManager
from primaite.simulator.system.services.ftp.ftp_client import FTPClient
from primaite.simulator.system.services.service import Service, ServiceOperatingState
from primaite.simulator.system.software import SoftwareHealthState
from src.primaite.simulator.file_system.file_system import File
from src.primaite.simulator.network.transmission.network_layer import IPProtocol
from src.primaite.simulator.network.transmission.transport_layer import Port
from src.primaite.simulator.system.core.software_manager import SoftwareManager
from src.primaite.simulator.system.services.ftp.ftp_client import FTPClient
from src.primaite.simulator.system.services.service import Service, ServiceOperatingState
from src.primaite.simulator.system.software import SoftwareHealthState
class DatabaseService(Service):

View File

@@ -2,11 +2,11 @@ from ipaddress import IPv4Address
from typing import Dict, Optional
from primaite import getLogger
from primaite.simulator.network.protocols.dns import DNSPacket, DNSRequest
from primaite.simulator.network.transmission.network_layer import IPProtocol
from primaite.simulator.network.transmission.transport_layer import Port
from primaite.simulator.system.core.software_manager import SoftwareManager
from primaite.simulator.system.services.service import Service
from src.primaite.simulator.network.protocols.dns import DNSPacket, DNSRequest
from src.primaite.simulator.network.transmission.network_layer import IPProtocol
from src.primaite.simulator.network.transmission.transport_layer import Port
from src.primaite.simulator.system.core.software_manager import SoftwareManager
from src.primaite.simulator.system.services.service import Service
_LOGGER = getLogger(__name__)

View File

@@ -4,10 +4,10 @@ from typing import Any, Dict, Optional
from prettytable import MARKDOWN, PrettyTable
from primaite import getLogger
from primaite.simulator.network.protocols.dns import DNSPacket
from primaite.simulator.network.transmission.network_layer import IPProtocol
from primaite.simulator.network.transmission.transport_layer import Port
from primaite.simulator.system.services.service import Service
from src.primaite.simulator.network.protocols.dns import DNSPacket
from src.primaite.simulator.network.transmission.network_layer import IPProtocol
from src.primaite.simulator.network.transmission.transport_layer import Port
from src.primaite.simulator.system.services.service import Service
_LOGGER = getLogger(__name__)

View File

@@ -1,13 +1,13 @@
from ipaddress import IPv4Address
from typing import Optional
from primaite.simulator.file_system.file_system import File
from primaite.simulator.network.protocols.ftp import FTPCommand, FTPPacket, FTPStatusCode
from primaite.simulator.network.transmission.network_layer import IPProtocol
from primaite.simulator.network.transmission.transport_layer import Port
from primaite.simulator.system.core.software_manager import SoftwareManager
from primaite.simulator.system.services.ftp.ftp_service import FTPServiceABC
from primaite.simulator.system.services.service import ServiceOperatingState
from src.primaite.simulator.file_system.file_system import File
from src.primaite.simulator.network.protocols.ftp import FTPCommand, FTPPacket, FTPStatusCode
from src.primaite.simulator.network.transmission.network_layer import IPProtocol
from src.primaite.simulator.network.transmission.transport_layer import Port
from src.primaite.simulator.system.core.software_manager import SoftwareManager
from src.primaite.simulator.system.services.ftp.ftp_service import FTPServiceABC
from src.primaite.simulator.system.services.service import ServiceOperatingState
class FTPClient(FTPServiceABC):

View File

@@ -1,11 +1,11 @@
from ipaddress import IPv4Address
from typing import Any, Dict, Optional
from primaite.simulator.network.protocols.ftp import FTPCommand, FTPPacket, FTPStatusCode
from primaite.simulator.network.transmission.network_layer import IPProtocol
from primaite.simulator.network.transmission.transport_layer import Port
from primaite.simulator.system.services.ftp.ftp_service import FTPServiceABC
from primaite.simulator.system.services.service import ServiceOperatingState
from src.primaite.simulator.network.protocols.ftp import FTPCommand, FTPPacket, FTPStatusCode
from src.primaite.simulator.network.transmission.network_layer import IPProtocol
from src.primaite.simulator.network.transmission.transport_layer import Port
from src.primaite.simulator.system.services.ftp.ftp_service import FTPServiceABC
from src.primaite.simulator.system.services.service import ServiceOperatingState
class FTPServer(FTPServiceABC):

View File

@@ -3,10 +3,10 @@ from abc import ABC
from ipaddress import IPv4Address
from typing import Optional
from primaite.simulator.file_system.file_system import File
from primaite.simulator.network.protocols.ftp import FTPCommand, FTPPacket, FTPStatusCode
from primaite.simulator.network.transmission.transport_layer import Port
from primaite.simulator.system.services.service import Service
from src.primaite.simulator.file_system.file_system import File
from src.primaite.simulator.network.protocols.ftp import FTPCommand, FTPPacket, FTPStatusCode
from src.primaite.simulator.network.transmission.transport_layer import Port
from src.primaite.simulator.system.services.service import Service
class FTPServiceABC(Service, ABC):

View File

@@ -1,7 +1,7 @@
from ipaddress import IPv4Address
from typing import Optional
from primaite.simulator.system.applications.database_client import DatabaseClient
from src.primaite.simulator.system.applications.database_client import DatabaseClient
class DataManipulationBot(DatabaseClient):

View File

@@ -2,8 +2,8 @@ from enum import Enum
from typing import Dict, Optional
from primaite import getLogger
from primaite.simulator.core import RequestManager, RequestType
from primaite.simulator.system.software import IOSoftware, SoftwareHealthState
from src.primaite.simulator.core import RequestManager, RequestType
from src.primaite.simulator.system.software import IOSoftware, SoftwareHealthState
_LOGGER = getLogger(__name__)
@@ -15,14 +15,14 @@ class ServiceOperatingState(Enum):
"The service is currently running."
STOPPED = 2
"The service is not running."
INSTALLING = 3
"The service is being installed or updated."
RESTARTING = 4
"The service is in the process of restarting."
PAUSED = 5
PAUSED = 3
"The service is temporarily paused."
DISABLED = 6
DISABLED = 4
"The service is disabled and cannot be started."
INSTALLING = 5
"The service is being installed or updated."
RESTARTING = 6
"The service is in the process of restarting."
class Service(IOSoftware):
@@ -68,7 +68,7 @@ class Service(IOSoftware):
:rtype: Dict
"""
state = super().describe_state()
state["operating_state"] = self.operating_state.name
state["operating_state"] = self.operating_state.value
state["health_state_actual"] = self.health_state_actual
state["health_state_visible"] = self.health_state_visible
return state

View File

@@ -1,22 +1,39 @@
from ipaddress import IPv4Address
from typing import Any, Optional
from typing import Any, Dict, Optional
from urllib.parse import urlparse
from primaite.simulator.network.protocols.http import (
from src.primaite.simulator.network.protocols.http import (
HttpRequestMethod,
HttpRequestPacket,
HttpResponsePacket,
HttpStatusCode,
)
from primaite.simulator.network.transmission.network_layer import IPProtocol
from primaite.simulator.network.transmission.transport_layer import Port
from primaite.simulator.system.applications.database_client import DatabaseClient
from primaite.simulator.system.services.service import Service
from src.primaite.simulator.network.transmission.network_layer import IPProtocol
from src.primaite.simulator.network.transmission.transport_layer import Port
from src.primaite.simulator.system.applications.database_client import DatabaseClient
from src.primaite.simulator.system.services.service import Service
class WebServer(Service):
"""Class used to represent a Web Server Service in simulation."""
last_response_status_code: Optional[HttpStatusCode] = None
def describe_state(self) -> Dict:
"""
Produce a dictionary describing the current state of this object.
Please see :py:meth:`primaite.simulator.core.SimComponent.describe_state` for a more detailed explanation.
:return: Current state of this object and child objects.
:rtype: Dict
"""
state = super().describe_state()
state["last_response_status_code"] = (
self.last_response_status_code.value if self.last_response_status_code else None
)
return state
def __init__(self, **kwargs):
kwargs["name"] = "WebServer"
kwargs["protocol"] = IPProtocol.TCP
@@ -66,6 +83,7 @@ class WebServer(Service):
self.send(payload=response, session_id=session_id)
# return true if response is OK
self.last_response_status_code = response.status_code
return response.status_code == HttpStatusCode.OK
def _handle_get_request(self, payload: HttpRequestPacket) -> HttpResponsePacket:

View File

@@ -3,11 +3,11 @@ from enum import Enum
from ipaddress import IPv4Address
from typing import Any, Dict, Optional
from primaite.simulator.core import RequestManager, RequestType, SimComponent
from primaite.simulator.file_system.file_system import FileSystem, Folder
from primaite.simulator.network.transmission.transport_layer import Port
from primaite.simulator.system.core.session_manager import Session
from primaite.simulator.system.core.sys_log import SysLog
from src.primaite.simulator.core import RequestManager, RequestType, SimComponent
from src.primaite.simulator.file_system.file_system import FileSystem, Folder
from src.primaite.simulator.network.transmission.transport_layer import Port
from src.primaite.simulator.system.core.session_manager import Session
from src.primaite.simulator.system.core.sys_log import SysLog
class SoftwareType(Enum):
@@ -121,9 +121,9 @@ class Software(SimComponent):
state = super().describe_state()
state.update(
{
"health_state": self.health_state_actual.name,
"health_state_red_view": self.health_state_visible.name,
"criticality": self.criticality.name,
"health_state": self.health_state_actual.value,
"health_state_red_view": self.health_state_visible.value,
"criticality": self.criticality.value,
"patching_count": self.patching_count,
"scanning_count": self.scanning_count,
"revealed_to_red": self.revealed_to_red,