From a252a0f1532876cf31c363f55bf4262e7dcfdb9f Mon Sep 17 00:00:00 2001 From: Lowa Date: Sun, 16 Feb 2025 03:31:32 +0300 Subject: [PATCH] Prevent duplicate TFTP server log messages and improve state tracking - Add filtering mechanism to prevent repeated server start/stop log entries - Implement state tracking flags to manage server status - Remove redundant log messages in both ComConfigCopy.py and TFTPServer.py - Enhance log callback to avoid unnecessary logging of server state changes --- ComConfigCopy.py | 23 +++++++++++++++++++---- TFTPServer.py | 32 ++++++++------------------------ 2 files changed, 27 insertions(+), 28 deletions(-) diff --git a/ComConfigCopy.py b/ComConfigCopy.py index d691199..e4218cd 100644 --- a/ComConfigCopy.py +++ b/ComConfigCopy.py @@ -924,7 +924,20 @@ class SerialAppGUI(tk.Tk): # Устанавливаем callback для логирования def log_callback(message): + # Фильтруем дублирующиеся сообщения о запуске/остановке сервера + if "[INFO] TFTP сервер запущен" in message and hasattr(self, '_server_started'): + return + if "[INFO] TFTP сервер остановлен" in message and hasattr(self, '_server_stopped'): + return + self.append_tftp_log(message) + + # Устанавливаем флаги для отслеживания состояния + if "[INFO] TFTP сервер запущен" in message: + self._server_started = True + elif "[INFO] TFTP сервер остановлен" in message: + self._server_stopped = True + # Обновляем информацию о передачах self.update_transfers_info() @@ -944,8 +957,6 @@ class SerialAppGUI(tk.Tk): self.tftp_ip_entry.config(state="disabled") self.tftp_port_entry.config(state="disabled") - self.append_tftp_log(f"[INFO] TFTP сервер запущен на {ip}:{port}") - # Запускаем периодическое обновление информации о передачах self.update_transfers_periodically() @@ -968,6 +979,12 @@ class SerialAppGUI(tk.Tk): self.start_tftp_button.config(state="disabled") self.stop_tftp_button.config(state="disabled") + # Сбрасываем флаги состояния + if hasattr(self, '_server_started'): + delattr(self, '_server_started') + if hasattr(self, '_server_stopped'): + delattr(self, '_server_stopped') + # Останавливаем сервер self.tftp_server.stop_server() @@ -987,8 +1004,6 @@ class SerialAppGUI(tk.Tk): self.tftp_ip_entry.config(state="normal") self.tftp_port_entry.config(state="normal") - self.append_tftp_log("[INFO] TFTP сервер остановлен") - # Очищаем таблицу передач for item in self.transfers_tree.get_children(): self.transfers_tree.delete(item) diff --git a/TFTPServer.py b/TFTPServer.py index 8a038e4..f01bd89 100644 --- a/TFTPServer.py +++ b/TFTPServer.py @@ -97,7 +97,6 @@ class TFTPServer: except: pass self.server_socket = None - self.log("[INFO] TFTP сервер остановлен.") def stop_server(self): """ @@ -160,7 +159,7 @@ class TFTPServer: self.log(f"[ERROR] Ошибка при остановке сервера: {str(e)}") finally: self.running = False # Гарантируем, что флаг running будет False - self.log("[INFO] TFTP сервер остановлен.") + self.log("[INFO] TFTP сервер остановлен") def handle_request(self, data, client_addr): """ @@ -223,17 +222,6 @@ class TFTPServer: def send_file(self, file_path, client_addr): """ Передача файла клиенту по протоколу TFTP. - - В процессе передачи обновляется состояние активной передачи, которое логируется с информацией: - - адрес клиента, - - имя файла, - - размер файла, - - количество переданных байт, - - оставшиеся байты, - - время передачи. - - :param file_path: Полный путь к файлу для передачи. - :param client_addr: Адрес клиента. """ BLOCK_SIZE = 512 transfer_socket = None @@ -356,21 +344,17 @@ class TFTPServer: except Exception as e: if not self.running: self.log(f"[INFO] Передача файла '{file_basename}' клиенту {client_addr} прервана: сервер остановлен") - else: - self.log(f"[ERROR] Ошибка при передаче файла '{file_basename}' " - f"клиенту {client_addr}: {str(e)}") raise except Exception as e: if not self.running: - self.log(f"[INFO] Передача файла прервана: сервер остановлен") - else: - self.log(f"[ERROR] Ошибка при передаче файла '{os.path.basename(file_path)}' " - f"клиенту {client_addr}: {str(e)}") - try: - self.send_error(client_addr, 0, str(e)) - except: - pass + return # Не логируем повторно о прерывании передачи + self.log(f"[ERROR] Ошибка при передаче файла '{os.path.basename(file_path)}' " + f"клиенту {client_addr}: {str(e)}") + try: + self.send_error(client_addr, 0, str(e)) + except: + pass finally: # Закрываем сокет передачи if transfer_socket: