76 lines
No EOL
2.4 KiB
Python
76 lines
No EOL
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("Изменение доменного имени отменено.") |