Make database failure based on file status not service status

This commit is contained in:
Marek Wolan
2024-01-10 13:06:48 +00:00
parent f2a496893c
commit 66a42ebc69
5 changed files with 18 additions and 11 deletions

View File

@@ -95,6 +95,8 @@ class Application(IOSoftware):
if self.operating_state == ApplicationOperatingState.CLOSED: if self.operating_state == ApplicationOperatingState.CLOSED:
self.sys_log.info(f"Running Application {self.name}") self.sys_log.info(f"Running Application {self.name}")
self.operating_state = ApplicationOperatingState.RUNNING self.operating_state = ApplicationOperatingState.RUNNING
if self.health_state_actual == SoftwareHealthState.UNUSED:
self.health_state_actual = SoftwareHealthState.GOOD
def _application_loop(self): def _application_loop(self):
"""The main application loop.""" """The main application loop."""

View File

@@ -4,6 +4,7 @@ from typing import Any, Dict, List, Literal, Optional, Union
from primaite import getLogger from primaite import getLogger
from primaite.simulator.file_system.file_system import File from primaite.simulator.file_system.file_system import File
from primaite.simulator.file_system.file_system_item_abc import FileSystemItemHealthStatus
from primaite.simulator.network.transmission.network_layer import IPProtocol from primaite.simulator.network.transmission.network_layer import IPProtocol
from primaite.simulator.network.transmission.transport_layer import Port from primaite.simulator.network.transmission.transport_layer import Port
from primaite.simulator.system.core.software_manager import SoftwareManager from primaite.simulator.system.core.software_manager import SoftwareManager
@@ -24,7 +25,7 @@ class DatabaseService(Service):
password: Optional[str] = None password: Optional[str] = None
connections: Dict[str, datetime] = {} connections: Dict[str, datetime] = {}
backup_server: IPv4Address = None backup_server_ip: IPv4Address = None
"""IP address of the backup server.""" """IP address of the backup server."""
latest_backup_directory: str = None latest_backup_directory: str = None
@@ -66,7 +67,7 @@ class DatabaseService(Service):
:param: backup_server_ip: The IP address of the backup server :param: backup_server_ip: The IP address of the backup server
""" """
self.backup_server = backup_server self.backup_server_ip = backup_server
def backup_database(self) -> bool: def backup_database(self) -> bool:
"""Create a backup of the database to the configured backup server.""" """Create a backup of the database to the configured backup server."""
@@ -75,7 +76,7 @@ class DatabaseService(Service):
return False return False
# check if the backup server was configured # check if the backup server was configured
if self.backup_server is None: if self.backup_server_ip is None:
self.sys_log.error(f"{self.name} - {self.sys_log.hostname}: not configured.") self.sys_log.error(f"{self.name} - {self.sys_log.hostname}: not configured.")
return False return False
@@ -84,7 +85,7 @@ class DatabaseService(Service):
# send backup copy of database file to FTP server # send backup copy of database file to FTP server
response = ftp_client_service.send_file( response = ftp_client_service.send_file(
dest_ip_address=self.backup_server, dest_ip_address=self.backup_server_ip,
src_file_name=self._db_file.name, src_file_name=self._db_file.name,
src_folder_name=self.folder.name, src_folder_name=self.folder.name,
dest_folder_name=str(self.uuid), dest_folder_name=str(self.uuid),
@@ -112,7 +113,7 @@ class DatabaseService(Service):
src_file_name="database.db", src_file_name="database.db",
dest_folder_name="downloads", dest_folder_name="downloads",
dest_file_name="database.db", dest_file_name="database.db",
dest_ip_address=self.backup_server, dest_ip_address=self.backup_server_ip,
) )
if not response: if not response:
@@ -170,16 +171,13 @@ class DatabaseService(Service):
""" """
self.sys_log.info(f"{self.name}: Running {query}") self.sys_log.info(f"{self.name}: Running {query}")
if query == "SELECT": if query == "SELECT":
if self.health_state_actual == SoftwareHealthState.GOOD: if self._db_file.health_status == FileSystemItemHealthStatus.GOOD:
return {"status_code": 200, "type": "sql", "data": True, "uuid": query_id} return {"status_code": 200, "type": "sql", "data": True, "uuid": query_id}
else: else:
return {"status_code": 404, "data": False} return {"status_code": 404, "data": False}
elif query == "DELETE": elif query == "DELETE":
if self.health_state_actual == SoftwareHealthState.GOOD: self._db_file.health_status = FileSystemItemHealthStatus.COMPROMISED
self.health_state_actual = SoftwareHealthState.COMPROMISED
return {"status_code": 200, "type": "sql", "data": False, "uuid": query_id} return {"status_code": 200, "type": "sql", "data": False, "uuid": query_id}
else:
return {"status_code": 404, "data": False}
else: else:
# Invalid query # Invalid query
return {"status_code": 500, "data": False} return {"status_code": 500, "data": False}

View File

@@ -52,10 +52,12 @@ class FTPServiceABC(Service, ABC):
folder_name = payload.ftp_command_args["dest_folder_name"] folder_name = payload.ftp_command_args["dest_folder_name"]
file_size = payload.ftp_command_args["file_size"] file_size = payload.ftp_command_args["file_size"]
real_file_path = payload.ftp_command_args.get("real_file_path") real_file_path = payload.ftp_command_args.get("real_file_path")
health_status = payload.ftp_command_args["health_status"]
is_real = real_file_path is not None is_real = real_file_path is not None
file = self.file_system.create_file( file = self.file_system.create_file(
file_name=file_name, folder_name=folder_name, size=file_size, real=is_real file_name=file_name, folder_name=folder_name, size=file_size, real=is_real
) )
file.health_status = health_status
self.sys_log.info( self.sys_log.info(
f"{self.name}: Created item in {self.sys_log.hostname}: {payload.ftp_command_args['dest_folder_name']}/" f"{self.name}: Created item in {self.sys_log.hostname}: {payload.ftp_command_args['dest_folder_name']}/"
f"{payload.ftp_command_args['dest_file_name']}" f"{payload.ftp_command_args['dest_file_name']}"
@@ -110,6 +112,7 @@ class FTPServiceABC(Service, ABC):
"dest_file_name": dest_file_name, "dest_file_name": dest_file_name,
"file_size": file.sim_size, "file_size": file.sim_size,
"real_file_path": file.sim_path if file.real else None, "real_file_path": file.sim_path if file.real else None,
"health_status": file.health_status,
}, },
packet_payload_size=file.sim_size, packet_payload_size=file.sim_size,
status_code=FTPStatusCode.OK if is_response else None, status_code=FTPStatusCode.OK if is_response else None,

View File

@@ -2,6 +2,7 @@ from ipaddress import IPv4Address
import pytest import pytest
from primaite.simulator.file_system.file_system_item_abc import FileSystemItemHealthStatus
from primaite.simulator.network.hardware.base import Node from primaite.simulator.network.hardware.base import Node
from primaite.simulator.network.hardware.node_operating_state import NodeOperatingState from primaite.simulator.network.hardware.node_operating_state import NodeOperatingState
from primaite.simulator.network.hardware.nodes.computer import Computer from primaite.simulator.network.hardware.nodes.computer import Computer
@@ -42,6 +43,7 @@ def test_ftp_client_store_file(ftp_client):
"dest_folder_name": "downloads", "dest_folder_name": "downloads",
"dest_file_name": "file.txt", "dest_file_name": "file.txt",
"file_size": 24, "file_size": 24,
"health_status": FileSystemItemHealthStatus.GOOD,
}, },
packet_payload_size=24, packet_payload_size=24,
status_code=FTPStatusCode.OK, status_code=FTPStatusCode.OK,

View File

@@ -1,5 +1,6 @@
import pytest import pytest
from primaite.simulator.file_system.file_system_item_abc import FileSystemItemHealthStatus
from primaite.simulator.network.hardware.base import Node from primaite.simulator.network.hardware.base import Node
from primaite.simulator.network.hardware.node_operating_state import NodeOperatingState from primaite.simulator.network.hardware.node_operating_state import NodeOperatingState
from primaite.simulator.network.hardware.nodes.server import Server from primaite.simulator.network.hardware.nodes.server import Server
@@ -41,6 +42,7 @@ def test_ftp_server_store_file(ftp_server):
"dest_folder_name": "downloads", "dest_folder_name": "downloads",
"dest_file_name": "file.txt", "dest_file_name": "file.txt",
"file_size": 24, "file_size": 24,
"health_status": FileSystemItemHealthStatus.GOOD,
}, },
packet_payload_size=24, packet_payload_size=24,
) )