76 lines
2.4 KiB
Python
76 lines
2.4 KiB
Python
|
|
import subprocess
|
|||
|
|
from dialog import Dialog
|
|||
|
|
import os
|
|||
|
|
|
|||
|
|
HOSTNAME_FILE = "/etc/hostname"
|
|||
|
|
HOSTS_FILE = "/etc/hosts"
|
|||
|
|
|
|||
|
|
|
|||
|
|
def get_current_hostname():
|
|||
|
|
try:
|
|||
|
|
with open(HOSTNAME_FILE, 'r') as f:
|
|||
|
|
return f.read().strip()
|
|||
|
|
except IOError as e:
|
|||
|
|
print(f"Ошибка при чтении hostname: {e}")
|
|||
|
|
return "localhost"
|
|||
|
|
|
|||
|
|
|
|||
|
|
def change_hostname():
|
|||
|
|
d = Dialog(dialog="dialog")
|
|||
|
|
current_hostname = get_current_hostname()
|
|||
|
|
|
|||
|
|
code, new_hostname = d.inputbox(
|
|||
|
|
f"Текущее доменное имя: {current_hostname}\nВведите новое доменное имя:",
|
|||
|
|
init=current_hostname
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
if code != d.OK:
|
|||
|
|
return None
|
|||
|
|
|
|||
|
|
if new_hostname == current_hostname:
|
|||
|
|
d.msgbox("Введенное доменное имя совпадает с текущим. Изменения не требуются.")
|
|||
|
|
return None
|
|||
|
|
|
|||
|
|
# Проверка валидности hostname
|
|||
|
|
if not is_valid_hostname(new_hostname):
|
|||
|
|
d.msgbox("Недопустимое доменное имя. Используйте только буквы, цифры и дефисы.")
|
|||
|
|
return None
|
|||
|
|
|
|||
|
|
# Подтверждение изменения
|
|||
|
|
code = d.yesno(f"Вы уверены, что хотите изменить доменное имя на {new_hostname}?")
|
|||
|
|
if code != d.OK:
|
|||
|
|
return None
|
|||
|
|
|
|||
|
|
return new_hostname
|
|||
|
|
|
|||
|
|
|
|||
|
|
def is_valid_hostname(hostname):
|
|||
|
|
if len(hostname) > 63:
|
|||
|
|
return False
|
|||
|
|
if hostname[-1] == "-":
|
|||
|
|
return False
|
|||
|
|
allowed = set("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-")
|
|||
|
|
return all(char in allowed for char in hostname)
|
|||
|
|
|
|||
|
|
|
|||
|
|
def apply_hostname_change(new_hostname):
|
|||
|
|
try:
|
|||
|
|
subprocess.run(["sudo", "hostnamectl", "set-hostname", new_hostname], check=True)
|
|||
|
|
if os.path.exists(HOSTS_FILE):
|
|||
|
|
subprocess.run(["sudo", "sed", "-i", f"s/^127.0.1.1.*/127.0.1.1\t{new_hostname}/", HOSTS_FILE], check=True)
|
|||
|
|
return True
|
|||
|
|
except subprocess.CalledProcessError as e:
|
|||
|
|
Dialog(dialog="dialog").msgbox(f"Ошибка при изменении доменного имени: {e}")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
|
|||
|
|
def run_change_hostname():
|
|||
|
|
return change_hostname()
|
|||
|
|
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
new_hostname = run_change_hostname()
|
|||
|
|
if new_hostname:
|
|||
|
|
print(f"Новое доменное имя: {new_hostname}")
|
|||
|
|
else:
|
|||
|
|
print("Изменение доменного имени отменено.")
|