Add network adapter selection for TFTP server
- Implement `get_network_adapters()` function to dynamically retrieve available network interfaces - Replace IP address entry with a combobox for network adapter selection - Add "Update" button to refresh network adapter list - Improve IP address validation and error handling for TFTP server configuration - Enhance UI with more user-friendly network interface selection
This commit is contained in:
@@ -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])
|
||||
|
||||
# ==========================
|
||||
# Парсер аргументов (не используется)
|
||||
# ==========================
|
||||
|
||||
Reference in New Issue
Block a user