diff --git a/ComConfigCopy.py b/ComConfigCopy.py index e4218cd..0ed0818 100644 --- a/ComConfigCopy.py +++ b/ComConfigCopy.py @@ -39,6 +39,7 @@ from serial.serialutil import SerialException from about_window import AboutWindow from TFTPServer import TFTPServer # from TFTPServer import TFTPServerThread +import socket # Создаем необходимые папки os.makedirs("Logs", exist_ok=True) @@ -138,25 +139,37 @@ def list_serial_ports(): # Функции работы с сетевыми адаптерами (не используются) # ========================== -# def list_network_adapters(): -# """Возвращает список названий сетевых адаптеров (Windows).""" -# adapters = [] -# if platform.system() == "Windows": -# try: -# output = subprocess.check_output( -# 'wmic nic get NetConnectionID', -# shell=True, -# encoding="cp866" -# ) -# for line in output.splitlines(): -# line = line.strip() -# if line and line != "NetConnectionID": -# adapters.append(line) -# except Exception as e: -# logging.error(f"Ошибка при получении списка адаптеров: {e}", exc_info=True) -# else: -# adapters = ["eth0"] -# return adapters +def get_network_adapters(): + """Получение списка сетевых адаптеров и их IP-адресов.""" + adapters = [] + try: + # Получаем имя хоста + hostname = socket.gethostname() + # Получаем все адреса для данного хоста + addresses = socket.getaddrinfo(hostname, None) + + # Создаем множество для хранения уникальных IP-адресов + unique_ips = set() + + for addr in addresses: + ip = addr[4][0] + # Пропускаем IPv6 и локальные адреса + if ':' not in ip and not ip.startswith('127.'): + unique_ips.add(ip) + + # Добавляем все найденные IP-адреса в список + for ip in sorted(unique_ips): + adapters.append(f"{ip}") + + # Добавляем 0.0.0.0 для прослушивания всех интерфейсов + adapters.insert(0, "0.0.0.0") + + except Exception as e: + logging.error(f"Ошибка при получении списка сетевых адаптеров: {e}", exc_info=True) + # В случае ошибки возвращаем хотя бы 0.0.0.0 + adapters = ["0.0.0.0"] + + return adapters # ========================== # Функции работы с COM-соединением @@ -843,8 +856,12 @@ class SerialAppGUI(tk.Tk): ip_frame.pack(fill=X, padx=5, pady=2) ttk.Label(ip_frame, text="IP адрес:").pack(side=LEFT, padx=5) self.tftp_ip_var = StringVar(value="0.0.0.0") - self.tftp_ip_entry = ttk.Entry(ip_frame, textvariable=self.tftp_ip_var) - self.tftp_ip_entry.pack(fill=X, expand=True, padx=5) + self.tftp_ip_combo = ttk.Combobox(ip_frame, textvariable=self.tftp_ip_var, state="readonly") + self.tftp_ip_combo.pack(side=LEFT, fill=X, expand=True, padx=5) + ttk.Button(ip_frame, text="Обновить", command=self.update_network_adapters).pack(side=LEFT, padx=5) + + # Заполняем список адаптеров + self.update_network_adapters() # Порт port_frame = ttk.Frame(controls_frame) @@ -916,8 +933,20 @@ class SerialAppGUI(tk.Tk): def start_tftp_server(self): """Запуск TFTP сервера.""" try: + # Получаем выбранный IP-адрес ip = self.tftp_ip_var.get() - port = int(self.tftp_port_var.get()) + if not ip: + messagebox.showerror("Ошибка", "Выберите IP-адрес для TFTP сервера") + return + + # Проверяем корректность порта + try: + port = int(self.tftp_port_var.get()) + if port <= 0 or port > 65535: + raise ValueError("Порт должен быть в диапазоне 1-65535") + except ValueError as e: + messagebox.showerror("Ошибка", f"Некорректный порт: {str(e)}") + return # Создаем экземпляр TFTP сервера self.tftp_server = TFTPServer("Firmware") @@ -951,10 +980,10 @@ class SerialAppGUI(tk.Tk): ) self.tftp_server_thread.start() - # Обновляем состояние кнопок + # Обновляем состояние кнопок и элементов управления self.start_tftp_button.config(state="disabled") self.stop_tftp_button.config(state="normal") - self.tftp_ip_entry.config(state="disabled") + self.tftp_ip_combo.config(state="disabled") self.tftp_port_entry.config(state="disabled") # Запускаем периодическое обновление информации о передачах @@ -1001,7 +1030,7 @@ class SerialAppGUI(tk.Tk): # Обновляем состояние кнопок self.start_tftp_button.config(state="normal") self.stop_tftp_button.config(state="disabled") - self.tftp_ip_entry.config(state="normal") + self.tftp_ip_combo.config(state="normal") self.tftp_port_entry.config(state="normal") # Очищаем таблицу передач @@ -1058,6 +1087,13 @@ class SerialAppGUI(tk.Tk): # Планируем следующее обновление через 1 секунду self.after(1000, self.update_transfers_periodically) + def update_network_adapters(self): + """Обновление списка сетевых адаптеров.""" + adapters = get_network_adapters() + self.tftp_ip_combo["values"] = adapters + if not self.tftp_ip_var.get() in adapters: + self.tftp_ip_var.set(adapters[0]) + # ========================== # Парсер аргументов (не используется) # ==========================