243 lines
8.9 KiB
Python
243 lines
8.9 KiB
Python
import subprocess
|
||
import ipaddress
|
||
from dialog import Dialog
|
||
|
||
|
||
class NetworkConfig:
|
||
def __init__(self):
|
||
self.d = Dialog(dialog="dialog")
|
||
self.temp_network_settings = {}
|
||
|
||
def select_interface(self):
|
||
interfaces = self.get_network_interfaces()
|
||
if not interfaces:
|
||
self.d.msgbox("Нет доступных сетевых интерфейсов.")
|
||
return None
|
||
|
||
code, tag = self.d.menu(
|
||
"Выберите интерфейс:", choices=[(iface, "") for iface in interfaces]
|
||
)
|
||
|
||
if code == self.d.OK:
|
||
self.d.msgbox(f"Выбран интерфейс: {tag}")
|
||
self.show_current_settings(tag) # Добавлено окно с текущими настройками
|
||
return tag
|
||
else:
|
||
self.d.msgbox("Интерфейс не выбран.")
|
||
return None
|
||
|
||
@staticmethod
|
||
def get_network_interfaces():
|
||
try:
|
||
result = subprocess.run(
|
||
["ls", "/sys/class/net/"], capture_output=True, text=True, check=True
|
||
)
|
||
interfaces = result.stdout.strip().split("\n")
|
||
return interfaces
|
||
except subprocess.CalledProcessError:
|
||
return []
|
||
|
||
def show_current_settings(self, interface):
|
||
try:
|
||
result = subprocess.run(
|
||
["ip", "-o", "addr", "show", interface], capture_output=True, text=True, check=True
|
||
)
|
||
current_settings = result.stdout.strip()
|
||
|
||
ip_address = None
|
||
if "inet " in current_settings:
|
||
ip_address = current_settings.split("inet ")[1].split("/")[0]
|
||
|
||
if "dhcp" in current_settings:
|
||
config_type = "DHCP"
|
||
elif ip_address:
|
||
config_type = "Static"
|
||
else:
|
||
config_type = "Неизвестно"
|
||
|
||
message = f"Тип настройки: {config_type}\nIP-адрес: {ip_address}" if ip_address else "IP-адрес не настроен"
|
||
|
||
self.d.msgbox(f"Текущие настройки интерфейса {interface}:\n\n{message}", height=10, width=50)
|
||
except subprocess.CalledProcessError as e:
|
||
self.d.msgbox(f"Ошибка получения настроек для интерфейса {interface}: {e}")
|
||
|
||
def configure_dhcp(self, interface):
|
||
code, dns = self.d.inputbox("Введите DNS сервер (опционально):")
|
||
if code == self.d.OK:
|
||
self.temp_network_settings[interface] = {
|
||
"type": "dhcp",
|
||
"dns": dns,
|
||
"interface": interface,
|
||
}
|
||
self.d.msgbox("DHCP настройка сохранена.")
|
||
else:
|
||
self.d.msgbox("DHCP настройка отменена.")
|
||
|
||
def configure_static(self, interface):
|
||
code, ip = self.d.inputbox("Введите IP адрес:")
|
||
if code != self.d.OK:
|
||
return
|
||
code, mask = self.d.inputbox("Введите маску подсети:")
|
||
if code != self.d.OK:
|
||
return
|
||
code, gateway = self.d.inputbox("Введите шлюз:")
|
||
if code != self.d.OK:
|
||
return
|
||
code, dns = self.d.inputbox("Введите DNS сервер (опционально):")
|
||
|
||
if ip and mask and gateway:
|
||
self.temp_network_settings[interface] = {
|
||
"type": "static",
|
||
"ip": ip,
|
||
"mask": mask,
|
||
"gateway": gateway,
|
||
"dns": dns,
|
||
"interface": interface,
|
||
}
|
||
self.d.msgbox("Статические настройки сохранены.")
|
||
else:
|
||
self.d.msgbox("Некоторые параметры не заданы.")
|
||
|
||
def configure_cidr(self, interface):
|
||
code, cidr = self.d.inputbox("Введите CIDR (например, 192.168.1.154/24):")
|
||
if code != self.d.OK:
|
||
return
|
||
code, gateway = self.d.inputbox("Введите шлюз:")
|
||
if code != self.d.OK:
|
||
return
|
||
code, dns = self.d.inputbox("Введите DNS сервер (опционально):")
|
||
|
||
if cidr:
|
||
try:
|
||
ip = ipaddress.ip_interface(cidr).ip
|
||
network = ipaddress.ip_network(cidr, strict=False)
|
||
mask = network.netmask
|
||
self.temp_network_settings[interface] = {
|
||
"type": "static",
|
||
"ip": str(ip),
|
||
"mask": str(mask),
|
||
"gateway": gateway,
|
||
"dns": dns,
|
||
"interface": interface,
|
||
}
|
||
self.d.msgbox("CIDR конфигурация сохранена.")
|
||
except ValueError as e:
|
||
self.d.msgbox(f"Неверный формат CIDR: {e}")
|
||
else:
|
||
self.d.msgbox("CIDR не задан.")
|
||
|
||
def run(self):
|
||
while True:
|
||
interface = self.select_interface()
|
||
if not interface:
|
||
break
|
||
|
||
code, tag = self.d.menu(
|
||
"Выберите действие для интерфейса:",
|
||
choices=[
|
||
("1", "Настроить DHCP"),
|
||
("2", "Настроить статический IP"),
|
||
("3", "Настроить CIDR"),
|
||
("4", "Выбрать другой интерфейс"),
|
||
("5", "Выход"),
|
||
],
|
||
)
|
||
|
||
if code == self.d.OK:
|
||
if tag == "1":
|
||
self.configure_dhcp(interface)
|
||
elif tag == "2":
|
||
self.configure_static(interface)
|
||
elif tag == "3":
|
||
self.configure_cidr(interface)
|
||
elif tag == "4":
|
||
continue
|
||
elif tag == "5":
|
||
break
|
||
else:
|
||
break
|
||
|
||
return self.temp_network_settings
|
||
|
||
def save_and_apply_network_settings(self):
|
||
for interface, settings in self.temp_network_settings.items():
|
||
try:
|
||
if settings["type"] == "dhcp":
|
||
self.save_dhcp(interface, settings)
|
||
elif settings["type"] == "static":
|
||
self.save_static(interface, settings)
|
||
if settings.get("dns"):
|
||
self.update_resolv_conf(settings["dns"])
|
||
except Exception as e:
|
||
self.d.msgbox(f"Ошибка применения настроек для {interface}: {e}")
|
||
return False
|
||
|
||
try:
|
||
subprocess.run(["systemctl", "restart", "networking"], check=True)
|
||
self.d.msgbox("Сетевые настройки успешно применены.")
|
||
return True
|
||
except Exception as e:
|
||
self.d.msgbox(f"Ошибка перезапуска сетевой службы: {e}")
|
||
return False
|
||
|
||
def save_dhcp(self, interface, settings):
|
||
interface_config = f"""
|
||
auto {interface}
|
||
iface {interface} inet dhcp
|
||
"""
|
||
self.update_interface_config(interface, interface_config)
|
||
|
||
def save_static(self, interface, settings):
|
||
ip = settings["ip"]
|
||
mask = settings["mask"]
|
||
gateway = settings["gateway"]
|
||
interface_config = f"""
|
||
auto {interface}
|
||
iface {interface} inet static
|
||
address {ip}
|
||
netmask {mask}
|
||
"""
|
||
if gateway:
|
||
interface_config += f"gateway {gateway}\n"
|
||
self.update_interface_config(interface, interface_config)
|
||
|
||
def update_interface_config(self, interface, interface_config):
|
||
try:
|
||
with open("/etc/network/interfaces", "r") as f:
|
||
lines = f.readlines()
|
||
|
||
with open("/etc/network/interfaces", "w") as f:
|
||
skip_section = False
|
||
for line in lines:
|
||
if interface in line:
|
||
skip_section = True
|
||
continue
|
||
if skip_section and line.strip() == "":
|
||
skip_section = False
|
||
if not skip_section:
|
||
f.write(line)
|
||
f.write(interface_config.strip() + "\n")
|
||
except Exception as e:
|
||
self.d.msgbox(f"Ошибка обновления конфигурации интерфейса: {e}")
|
||
|
||
def update_resolv_conf(self, dns):
|
||
if not dns:
|
||
return
|
||
|
||
dns_entry = f"nameserver {dns}"
|
||
try:
|
||
with open("/etc/resolv.conf", "r") as f:
|
||
resolv_lines = f.readlines()
|
||
|
||
if any(line.strip() == dns_entry for line in resolv_lines):
|
||
return
|
||
|
||
with open("/etc/resolv.conf", "a") as f:
|
||
f.write(dns_entry + "\n")
|
||
except Exception as e:
|
||
self.d.msgbox(f"Ошибка обновления /etc/resolv.conf: {e}")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
configurator = NetworkConfig()
|
||
configurator.run()
|