From a9e969aa13cc5d824356a451f32fb7ae9d8d4de6 Mon Sep 17 00:00:00 2001 From: Marek Wolan Date: Fri, 25 Aug 2023 15:29:53 +0100 Subject: [PATCH] init work on database --- .../file_system/file_system_file_type.py | 8 ++++ .../simulator/system/services/database.py | 41 +++++++++++++++++++ .../simulator/system/services/service.py | 12 ++++++ 3 files changed, 61 insertions(+) create mode 100644 src/primaite/simulator/system/services/database.py diff --git a/src/primaite/simulator/file_system/file_system_file_type.py b/src/primaite/simulator/file_system/file_system_file_type.py index 7e2d8706..88aeb430 100644 --- a/src/primaite/simulator/file_system/file_system_file_type.py +++ b/src/primaite/simulator/file_system/file_system_file_type.py @@ -87,6 +87,14 @@ class FileSystemFileType(str, Enum): GZ = 31 "Gzip compressed file." + # Database file types + MDF = 32 + "MS SQL Server primary database file" + NDF = 33 + "MS SQL Server secondary database file" + LDF = 34 + "MS SQL Server transaction log" + file_type_sizes_KB = { FileSystemFileType.UNKNOWN: 0, diff --git a/src/primaite/simulator/system/services/database.py b/src/primaite/simulator/system/services/database.py new file mode 100644 index 00000000..29e3f242 --- /dev/null +++ b/src/primaite/simulator/system/services/database.py @@ -0,0 +1,41 @@ +from primaite.simulator.file_system.file_system_file_type import FileSystemFileType +from primaite.simulator.network.hardware.base import Node +from primaite.simulator.system.services.service import Service + + +class DatabaseService(Service): + """TODO.""" + + def __init__(self, parent_node: Node, **kwargs): + super().__init__(**kwargs) + self._setup_files_on_node() + + def _setup_files_on_node( + self, + db_size: int = 1000, + use_secondary_db_file: bool = False, + secondary_db_size: int = 300, + folder_name: str = "database", + ): + """Set up files that are required by the database on the parent host. + + :param db_size: Initial file size of the main database file, defaults to 1000 + :type db_size: int, optional + :param use_secondary_db_file: Whether to use a secondary database file, defaults to False + :type use_secondary_db_file: bool, optional + :param secondary_db_size: Size of the secondary db file, defaults to None + :type secondary_db_size: int, optional + :param folder_name: Name of the folder which will be setup to hold the db files, defaults to "database" + :type folder_name: str, optional + """ + folder = self.parent.file_system.create_folder(folder_name) + self.parent.file_system.create_file("db_primary_store", db_size, FileSystemFileType.MDF, folder=folder) + self.parent.file_system.create_file("db_transaction_log", "1", FileSystemFileType.LDF, folder=folder) + if use_secondary_db_file: + self.parent.file_system.create_file( + "db_secondary_store", secondary_db_size, FileSystemFileType.NDF, folder=folder + ) + + # todo next: + # create session? (maybe not) + # add actions for setting service state to compromised? (probably definitely) diff --git a/src/primaite/simulator/system/services/service.py b/src/primaite/simulator/system/services/service.py index eafff3f0..ed2aa23b 100644 --- a/src/primaite/simulator/system/services/service.py +++ b/src/primaite/simulator/system/services/service.py @@ -2,6 +2,7 @@ from abc import abstractmethod from enum import Enum from typing import Any, Dict, List +from primaite.simulator.network.hardware.base import Node from primaite.simulator.system.software import IOSoftware @@ -32,6 +33,17 @@ class Service(IOSoftware): operating_state: ServiceOperatingState "The current operating state of the Service." + @abstractmethod + def __init__(self, parent_node: Node, **kwargs): + """Create the service on a node. + + :param parent_node: The node on which this service runs. + :type parent_node: Node + """ + super().__init__(**kwargs) + self.parent: Node = parent_node + self.parent.software_manager.add_service(self) + @abstractmethod def describe_state(self) -> Dict: """