#1947: folder/file scan now take multiple time steps to complete

This commit is contained in:
Czar.Echavez
2023-10-23 15:58:37 +01:00
parent ffc4711afb
commit 724beb1a29
9 changed files with 184 additions and 101 deletions

View File

@@ -47,7 +47,7 @@ def convert_size(size_bytes: int) -> str:
return f"{s} {size_name[i]}"
class FileSystemItemStatus(Enum):
class FileSystemItemHealthStatus(Enum):
"""Status of the FileSystemItem."""
GOOD = 0
@@ -73,10 +73,10 @@ class FileSystemItemABC(SimComponent):
name: str
"The name of the FileSystemItemABC."
status: FileSystemItemStatus = FileSystemItemStatus.GOOD
health_status: FileSystemItemHealthStatus = FileSystemItemHealthStatus.GOOD
"Actual status of the current FileSystemItem"
visible_status: FileSystemItemStatus = FileSystemItemStatus.GOOD
visible_health_status: FileSystemItemHealthStatus = FileSystemItemHealthStatus.GOOD
"Visible status of the current FileSystemItem"
previous_hash: Optional[str] = None
@@ -90,8 +90,8 @@ class FileSystemItemABC(SimComponent):
"""
state = super().describe_state()
state["name"] = self.name
state["status"] = self.status.name
state["visible_status"] = self.visible_status.name
state["status"] = self.health_status.name
state["visible_status"] = self.visible_health_status.name
state["previous_hash"] = self.previous_hash
return state
@@ -123,7 +123,7 @@ class FileSystemItemABC(SimComponent):
"""Update the FileSystemItem states."""
super().scan()
self.visible_status = self.status
self.visible_health_status = self.health_status
@abstractmethod
def check_hash(self) -> bool:
@@ -135,7 +135,7 @@ class FileSystemItemABC(SimComponent):
Return False if corruption is detected, otherwise True
"""
# cannot check hash if deleted
if self.status == FileSystemItemStatus.DELETED:
if self.health_status == FileSystemItemHealthStatus.DELETED:
return False
@abstractmethod
@@ -146,7 +146,7 @@ class FileSystemItemABC(SimComponent):
True if successfully repaired. False otherwise.
"""
# cannot repair if deleted
if self.status == FileSystemItemStatus.DELETED:
if self.health_status == FileSystemItemHealthStatus.DELETED:
return False
@abstractmethod
@@ -157,7 +157,7 @@ class FileSystemItemABC(SimComponent):
True if successfully corrupted. False otherwise.
"""
# cannot corrupt if deleted
if self.status == FileSystemItemStatus.DELETED:
if self.health_status == FileSystemItemHealthStatus.DELETED:
return False
def delete(self) -> None:
@@ -166,7 +166,7 @@ class FileSystemItemABC(SimComponent):
True if successfully deleted. False otherwise.
"""
self.status = FileSystemItemStatus.DELETED
self.health_status = FileSystemItemHealthStatus.DELETED
def restore(self) -> None:
"""Restore the file/folder to the state before it got ruined."""
@@ -456,6 +456,10 @@ class Folder(FileSystemItemABC):
"Files by their name as <file name>.<file type>."
deleted_files: Dict[str, File] = {}
"List of files that have been deleted."
scan_duration: int = -1
"How many timesteps to complete a scan."
def describe_state(self) -> Dict:
"""
@@ -465,6 +469,7 @@ class Folder(FileSystemItemABC):
"""
state = super().describe_state()
state["files"] = {file.name: file.describe_state() for uuid, file in self.files.items()}
state["deleted_files"] = {file.name: file.describe_state() for uuid, file in self.deleted_files.items()}
return state
def show(self, markdown: bool = False):
@@ -492,6 +497,21 @@ class Folder(FileSystemItemABC):
"""
return sum(file.size for file in self.files.values() if file.size is not None)
def apply_timestep(self, timestep: int):
"""
Used to run the actions that last over multiple timesteps.
:param: timestep: the current timestep.
"""
super().apply_timestep(timestep=timestep)
# scan files each timestep
if self.scan_duration > -1:
# scan one file per timestep
file = self.get_file_by_id(file_uuid=list(self.files)[self.scan_duration - 1])
file.scan()
self.scan_duration -= 1
def get_file(self, file_name: str) -> Optional[File]:
"""
Get a file by its name.
@@ -573,30 +593,31 @@ class Folder(FileSystemItemABC):
def quarantine(self):
"""Quarantines the File System Folder."""
if self.status != FileSystemItemStatus.QUARANTINED:
self.status = FileSystemItemStatus.QUARANTINED
if self.health_status != FileSystemItemHealthStatus.QUARANTINED:
self.health_status = FileSystemItemHealthStatus.QUARANTINED
self.fs.sys_log.info(f"Quarantined folder ./{self.name}")
def unquarantine(self):
"""Unquarantine of the File System Folder."""
if self.status == FileSystemItemStatus.QUARANTINED:
self.status = FileSystemItemStatus.GOOD
if self.health_status == FileSystemItemHealthStatus.QUARANTINED:
self.health_status = FileSystemItemHealthStatus.GOOD
self.fs.sys_log.info(f"Quarantined folder ./{self.name}")
def quarantine_status(self) -> bool:
"""Returns true if the folder is being quarantined."""
return self.status == FileSystemItemStatus.QUARANTINED
return self.health_status == FileSystemItemHealthStatus.QUARANTINED
def scan(self) -> None:
"""Update Folder visible status."""
super().scan()
# update the status of files in folder
for file_id in self.files:
file = self.get_file_by_id(file_uuid=file_id)
file.scan()
self.fs.sys_log.info(f"Scanning folder {self.name} (id: {self.uuid})")
if self.scan_duration <= -1:
# scan one file per timestep
self.scan_duration = len(self.files)
self.fs.sys_log.info(f"Scanning folder {self.name} (id: {self.uuid})")
else:
# scan already in progress
self.fs.sys_log.info(f"Scan is already in progress {self.name} (id: {self.uuid})")
def check_hash(self) -> bool:
"""
@@ -638,8 +659,8 @@ class Folder(FileSystemItemABC):
repaired = file.repair()
# set file status to good if corrupt
if self.status == FileSystemItemStatus.CORRUPTED:
self.status = FileSystemItemStatus.GOOD
if self.health_status == FileSystemItemHealthStatus.CORRUPTED:
self.health_status = FileSystemItemHealthStatus.GOOD
repaired = True
self.fs.sys_log.info(f"Repaired folder {self.name} (id: {self.uuid})")
@@ -674,8 +695,8 @@ class Folder(FileSystemItemABC):
corrupted = file.corrupt()
# set file status to corrupt if good
if self.status == FileSystemItemStatus.GOOD:
self.status = FileSystemItemStatus.CORRUPTED
if self.health_status == FileSystemItemHealthStatus.GOOD:
self.health_status = FileSystemItemHealthStatus.CORRUPTED
corrupted = True
self.fs.sys_log.info(f"Corrupted folder {self.name} (id: {self.uuid})")
@@ -824,8 +845,8 @@ class File(FileSystemItemABC):
super().repair()
# set file status to good if corrupt
if self.status == FileSystemItemStatus.CORRUPTED:
self.status = FileSystemItemStatus.GOOD
if self.health_status == FileSystemItemHealthStatus.CORRUPTED:
self.health_status = FileSystemItemHealthStatus.GOOD
path = self.folder.name + "/" + self.name
self.folder.fs.sys_log.info(f"Repaired file {self.sim_path if self.sim_path else path}")
@@ -842,8 +863,8 @@ class File(FileSystemItemABC):
corrupted = False
# set file status to good if corrupt
if self.status == FileSystemItemStatus.GOOD:
self.status = FileSystemItemStatus.CORRUPTED
if self.health_status == FileSystemItemHealthStatus.GOOD:
self.health_status = FileSystemItemHealthStatus.CORRUPTED
corrupted = True
path = self.folder.name + "/" + self.name