diff --git a/owrx/controllers/file.py b/owrx/controllers/file.py index 569fdcff..b90a2d6e 100644 --- a/owrx/controllers/file.py +++ b/owrx/controllers/file.py @@ -6,14 +6,14 @@ import re class FileController(AssetsController): def getFilePath(self, file): - return Storage().getFilePath(file) + return Storage.getFilePath(file) class FilesController(WebpageController): def template_variables(self): isimg = re.compile(r'.*\.(png|bmp|gif|jpg)$') issnd = re.compile(r'.*\.(mp3|wav)$') - files = Storage().getStoredFiles() + files = Storage.getSharedInstance().getStoredFiles() rows = "" for i in range(len(files)): diff --git a/owrx/fax.py b/owrx/fax.py index 838487a9..0b361218 100644 --- a/owrx/fax.py +++ b/owrx/fax.py @@ -32,19 +32,19 @@ class FaxParser(ThreadModule): def closeFile(self): if self.file is not None: try: - logger.debug("Closing bitmap file '%s'." % self.fileName) + logger.debug("Closing bitmap file '%s'." % self.file.name) self.file.close() self.file = None if self.height==0 or self.line0 else '' - return pattern.format(d + f) + with self.lock: + if not os.path.exists(filePath): + return open(filePath, "wb", buffering = buffering) + elif filePath.contains("."): + filePathX = "-{0}.".join(filePath.rsplit(".", 1)) + for i in range(99): + filePath1 = filePathX.format(i) + if not os.path.exists(filePath1): + return open(filePath1, "wb", buffering = buffering) - # Get complete path to a stored file from its filename by - # adding folder name - def getFilePath(self, filename: str): - return os.path.join(CoreConfig().get_temporary_directory(), filename) + raise FileExistsError("File '{0}' already exists.".format(filePath)) # Get list of stored files, sorted in reverse alphabetic order # (so that newer files appear first) def getStoredFiles(self): dir = CoreConfig().get_temporary_directory() - files = [os.path.join(dir, f) for f in os.listdir(dir) if re.match(self.filePattern, f)] + with self.lock: + files = [os.path.join(dir, f) for f in os.listdir(dir) if re.match(self.filePattern, f)] files.sort(key=lambda x: os.path.getmtime(x), reverse=True) return [os.path.basename(f) for f in files] @@ -43,16 +58,39 @@ class Storage(object): pm = Config.get() keep = pm["keep_files"] dir = CoreConfig().get_temporary_directory() - files = [os.path.join(dir, f) for f in os.listdir(dir) if re.match(self.filePattern, f)] - files.sort(key=lambda x: os.path.getmtime(x), reverse=True) - for f in files[keep:]: - logger.debug("Deleting stored file '%s'." % os.path.basename(f)) - try: - os.unlink(f) - except Exception as e: - logger.debug("cleanStoredFiles(): " + str(e)) + with self.lock: + files = [os.path.join(dir, f) for f in os.listdir(dir) if re.match(self.filePattern, f)] + files.sort(key=lambda x: os.path.getmtime(x), reverse=True) + for f in files[keep:]: + logger.debug("Deleting stored file '%s'." % os.path.basename(f)) + try: + os.unlink(f) + except Exception as e: + logger.debug("cleanStoredFiles(): " + str(e)) + + # Get file name pattern + @staticmethod + def getNamePattern(): + return Storage.filePattern + + # Get complete path to a stored file from its filename by + # adding folder name + @staticmethod + def getFilePath(filename: str): + return os.path.join(CoreConfig().get_temporary_directory(), filename) + + # Create stored file name by inserting current UTC date + # and time into the pattern spot designated with "{0}" + @staticmethod + def makeFileName(pattern: str = '{0}', frequency: int = 0): + d = datetime.utcnow().strftime('%y%m%d-%H%M%S') + f = ('-%d' % (frequency // 1000)) if frequency>0 else '' + return pattern.format(d + f) + + # Convert given file from BMP to PNG format using ImageMagick + @staticmethod def convertImage(self, inFile: str): # Adds storage path if not inFile.startswith('/'): diff --git a/owrx/toolbox.py b/owrx/toolbox.py index 64efd712..2f80e1e2 100644 --- a/owrx/toolbox.py +++ b/owrx/toolbox.py @@ -32,12 +32,12 @@ class TextParser(LineBasedModule): def closeFile(self): if self.file is not None: try: - logger.debug("Closing log file '%s'." % self.fileName) + logger.debug("Closing log file '%s'." % self.file.name) self.file.close() self.file = None # Delete excessive files from storage logger.debug("Performing storage cleanup...") - Storage().cleanStoredFiles() + Storage.getSharedInstance().cleanStoredFiles() except Exception as exptn: logger.debug("Exception closing file: %s" % str(exptn)) @@ -46,9 +46,8 @@ class TextParser(LineBasedModule): def newFile(self, fileName): self.closeFile() try: - self.fileName = Storage().getFilePath(fileName + ".txt") - logger.debug("Opening log file '%s'..." % self.fileName) - self.file = open(self.fileName, "wb", buffering = 0) + logger.debug("Opening log file '%s'..." % fileName) + self.file = Storage.getSharedInstance().newFile(fileName, buffering = 0) self.cntLines = 0 except Exception as exptn: @@ -58,7 +57,7 @@ class TextParser(LineBasedModule): def writeFile(self, data): # If no file open, create and open a new file if self.file is None and self.filePfx is not None: - self.newFile(Storage().makeFileName(self.filePfx+"-{0}", self.frequency)) + self.newFile(Storage.makeFileName(self.filePfx+"-{0}", self.frequency) + ".txt") # If file open now... if self.file is not None: # Write new line into the file