diff --git a/server/src/scimodom/services/file.py b/server/src/scimodom/services/file.py index 9ee7ad2d..9ea6a3b9 100644 --- a/server/src/scimodom/services/file.py +++ b/server/src/scimodom/services/file.py @@ -1,4 +1,5 @@ import logging +import os import re from enum import Enum from fcntl import flock, LOCK_SH, LOCK_EX, LOCK_UN @@ -26,6 +27,10 @@ DEFAULT_MODE = 0o660 +def write_opener(path, flags): + return os.open(path, flags, DEFAULT_MODE) + + class FileTooLarge(Exception): pass @@ -147,7 +152,7 @@ def update_gene_cache(self, selection_id: int, genes: Iterable[str]) -> None: :type genes: Iterable[str] """ path = Path(self._get_gene_cache_dir(), str(selection_id)) - with open(path, "w", mode=DEFAULT_MODE) as fh: + with open(path, "w", opener=write_opener) as fh: flock(fh.fileno(), LOCK_EX) for g in genes: print(g, file=fh) @@ -167,7 +172,7 @@ def create_project_metadata_file(self, smid: str) -> TextIO: :rtype: TextIO """ metadata_file = Path(self._get_project_metadata_dir(), f"{smid}.json") - return open(metadata_file, "w", mode=DEFAULT_MODE) + return open(metadata_file, "w", opener=write_opener) def create_project_request_file(self, request_uuid) -> TextIO: """Open a metadata (request) file for writing. @@ -179,7 +184,7 @@ def create_project_request_file(self, request_uuid) -> TextIO: """ path = Path(self._get_project_request_file_path(request_uuid)) logger.info(f"Writing project request to {path}...") - return open(path, "w", mode=DEFAULT_MODE) + return open(path, "w", opener=write_opener) def open_project_request_file(self, request_uuid) -> TextIO: """Open a metadata (request) file for reading. @@ -270,7 +275,7 @@ def create_assembly_file(self, taxa_id: int, file_type: AssemblyFileType) -> Tex raise NotImplementedError() path = self.get_assembly_file_path(taxa_id, file_type) self._create_folder(path.parent) - return open(path, "x", mode=DEFAULT_MODE) + return open(path, "x", opener=write_opener) def create_chain_file( self, taxa_id: int, file_name: str, assembly_name @@ -294,7 +299,7 @@ def create_chain_file( chain_assembly_name=assembly_name, ) self._create_folder(path.parent) - return open(path, "xb", mode=DEFAULT_MODE) + return open(path, "xb", opener=write_opener) def delete_assembly(self, taxa_id: int, assembly_name: str) -> None: """Remove assembly directory structure @@ -374,7 +379,7 @@ def _stream_to_file(self, data_stream, path, max_size, overwrite_is_ok=False): self._create_folder(dirname(path)) try: bytes_written = 0 - with open(path, "wb", mode=DEFAULT_MODE) as fp: + with open(path, "wb", opener=write_opener()) as fp: while True: buffer = data_stream.read(self.BUFFER_SIZE) if len(buffer) == 0: