#1706 - Got the code services, application, and process base classes stubbed out. Need them now so that I can leverage them for core node services required.

This commit is contained in:
Chris McCarthy
2023-08-03 21:30:13 +01:00
parent cac4779244
commit 04f1cb0dc6
11 changed files with 378 additions and 82 deletions

View File

@@ -1,6 +1,9 @@
from abc import abstractmethod
from enum import Enum
from typing import Any, Dict, List, Set
from primaite.simulator.core import SimComponent
from primaite.simulator.network.transmission.transport_layer import Port
class SoftwareHealthState(Enum):
@@ -16,43 +19,6 @@ class SoftwareHealthState(Enum):
"The software is undergoing patching or updates."
class ApplicationOperatingState(Enum):
"""Enumeration of Application Operating States."""
CLOSED = 0
"The application is closed or not running."
RUNNING = 1
"The application is running."
INSTALLING = 3
"The application is being installed or updated."
class ServiceOperatingState(Enum):
"""Enumeration of Service Operating States."""
STOPPED = 0
"The service is not running."
RUNNING = 1
"The service is currently running."
RESTARTING = 2
"The service is in the process of restarting."
INSTALLING = 3
"The service is being installed or updated."
PAUSED = 4
"The service is temporarily paused."
DISABLED = 5
"The service is disabled and cannot be started."
class ProcessOperatingState(Enum):
"""Enumeration of Process Operating States."""
RUNNING = 1
"The process is running."
PAUSED = 2
"The process is temporarily paused."
class SoftwareCriticality(Enum):
"""Enumeration of Software Criticality Levels."""
@@ -70,25 +36,101 @@ class SoftwareCriticality(Enum):
class Software(SimComponent):
"""
Represents software information along with its health, criticality, and status.
A base class representing software in a simulator environment.
This class inherits from the Pydantic BaseModel and provides a structured way to store
information about software entities.
Attributes:
name (str): The name of the software.
health_state_actual (SoftwareHealthState): The actual health state of the software.
health_state_visible (SoftwareHealthState): The health state of the software visible to users.
criticality (SoftwareCriticality): The criticality level of the software.
patching_count (int, optional): The count of patches applied to the software. Default is 0.
scanning_count (int, optional): The count of times the software has been scanned. Default is 0.
revealed_to_red (bool, optional): Indicates if the software has been revealed to red team. Default is False.
This class is intended to be subclassed by specific types of software entities.
It outlines the fundamental attributes and behaviors expected of any software in the simulation.
"""
name: str
"The name of the software."
health_state_actual: SoftwareHealthState
"The actual health state of the software."
health_state_visible: SoftwareHealthState
"The health state of the software visible to the red agent."
criticality: SoftwareCriticality
"The criticality level of the software."
patching_count: int = 0
"The count of patches applied to the software, defaults to 0."
scanning_count: int = 0
"The count of times the software has been scanned, defaults to 0."
revealed_to_red: bool = False
"Indicates if the software has been revealed to red agent, defaults is False."
@abstractmethod
def describe_state(self) -> Dict:
"""
Describes the current state of the software.
The specifics of the software's state, including its health, criticality,
and any other pertinent information, should be implemented in subclasses.
:return: A dictionary containing key-value pairs representing the current state of the software.
:rtype: Dict
"""
pass
def apply_action(self, action: List[str]) -> None:
"""
Applies a list of actions to the software.
The specifics of how these actions are applied should be implemented in subclasses.
:param action: A list of actions to apply.
:type action: List[str]
"""
pass
def reset_component_for_episode(self, episode: int):
"""
Resets the software component for a new episode.
This method should ensure the software is ready for a new episode, including resetting any
stateful properties or statistics, and clearing any message queues. The specifics of what constitutes a
"reset" should be implemented in subclasses.
"""
pass
class IOSoftware(Software):
"""
Represents software in a simulator environment that is capable of input/output operations.
This base class is meant to be sub-classed by Application and Service classes. It provides the blueprint for
Applications and Services that can receive payloads from a Node's SessionManager (corresponding to layer 5 in the
OSI Model), process them according to their internals, and send a response payload back to the SessionManager if
required.
"""
installing_count: int = 0
"The number of times the software has been installed. Default is 0."
max_sessions: int = 1
"The maximum number of sessions that the software can handle simultaneously. Default is 0."
tcp: bool = True
"Indicates if the software uses TCP protocol for communication. Default is True."
udp: bool = True
"Indicates if the software uses UDP protocol for communication. Default is True."
ports: Set[Port]
"The set of ports to which the software is connected."
def send(self, payload: Any) -> bool:
"""
Sends a payload to the SessionManager
The specifics of how the payload is processed and whether a response payload
is generated should be implemented in subclasses.
:param payload: The payload to send.
:return: True if successful, False otherwise.
"""
pass
def receive(self, payload: Any) -> bool:
"""
Receives a payload from the SessionManager.
The specifics of how the payload is processed and whether a response payload
is generated should be implemented in subclasses.
:param payload: The payload to receive.
:return: True if successful, False otherwise.
"""
pass