128 lines
4.6 KiB
Python
128 lines
4.6 KiB
Python
|
|
import subprocess
|
||
|
|
from dialog import Dialog
|
||
|
|
import os
|
||
|
|
from postinstall.logger import logger
|
||
|
|
|
||
|
|
logging = logger
|
||
|
|
|
||
|
|
AVAILABLE_PACKAGES = [
|
||
|
|
"neofetch",
|
||
|
|
"webmin",
|
||
|
|
"usermin",
|
||
|
|
"cups",
|
||
|
|
"wireguard",
|
||
|
|
"wg-cmd",
|
||
|
|
]
|
||
|
|
|
||
|
|
|
||
|
|
def check_sudo():
|
||
|
|
return os.geteuid() == 0
|
||
|
|
|
||
|
|
|
||
|
|
def run_command_with_log(dialog, command, message):
|
||
|
|
"""Run a command and log output, showing a message box on success."""
|
||
|
|
try:
|
||
|
|
subprocess.run(command, check=True, capture_output=True, text=True)
|
||
|
|
logging.info(f"{message}: успешно выполнено.")
|
||
|
|
return True
|
||
|
|
except subprocess.CalledProcessError as e:
|
||
|
|
logging.error(f"{message}: ошибка - {e}")
|
||
|
|
dialog.msgbox(f"{message}: ошибка.\n{e}")
|
||
|
|
return False
|
||
|
|
|
||
|
|
|
||
|
|
def install_packages():
|
||
|
|
d = Dialog(dialog="dialog")
|
||
|
|
|
||
|
|
if not check_sudo():
|
||
|
|
d.msgbox("Для установки пакетов необходимы права суперпользователя.")
|
||
|
|
return
|
||
|
|
|
||
|
|
# Создаем список пакетов для выбора
|
||
|
|
choices = [(package, "", False) for package in AVAILABLE_PACKAGES]
|
||
|
|
|
||
|
|
# Показываем checklist для выбора пакетов
|
||
|
|
code, tags = d.checklist(
|
||
|
|
"Выберите пакеты для установки:", choices=choices, title="Установка программ"
|
||
|
|
)
|
||
|
|
|
||
|
|
if code != d.OK:
|
||
|
|
return
|
||
|
|
|
||
|
|
if not tags:
|
||
|
|
d.msgbox("Вы не выбрали ни одного пакета для установки.")
|
||
|
|
return
|
||
|
|
|
||
|
|
# Подтверждение установки
|
||
|
|
code = d.yesno(
|
||
|
|
f"Вы уверены, что хотите установить следующие пакеты:\n{', '.join(tags)}?"
|
||
|
|
)
|
||
|
|
if code != d.OK:
|
||
|
|
return
|
||
|
|
|
||
|
|
# Создаем gauge для отображения прогресса
|
||
|
|
d.gauge_start("Установка пакетов...", percent=0)
|
||
|
|
|
||
|
|
try:
|
||
|
|
# Обновление списка пакетов
|
||
|
|
d.gauge_update(10, "Обновление списка пакетов...")
|
||
|
|
subprocess.run(["apt", "update"], check=True, capture_output=True)
|
||
|
|
|
||
|
|
logging.info(f"Установка пакетов: {', '.join(tags)}")
|
||
|
|
# Установка выбранных пакетов
|
||
|
|
d.gauge_update(20, f"Установка пакетов: {', '.join(tags)}...")
|
||
|
|
process = subprocess.Popen(
|
||
|
|
["apt", "install", "-y"] + tags,
|
||
|
|
stdout=subprocess.PIPE,
|
||
|
|
stderr=subprocess.PIPE,
|
||
|
|
universal_newlines=True,
|
||
|
|
)
|
||
|
|
|
||
|
|
# Чтение вывода процесса и обновление gauge
|
||
|
|
for i, line in enumerate(process.stdout):
|
||
|
|
d.gauge_update(20 + (i % 70), line.strip())
|
||
|
|
|
||
|
|
process.wait()
|
||
|
|
|
||
|
|
if process.returncode != 0:
|
||
|
|
error = process.stderr.read()
|
||
|
|
raise subprocess.CalledProcessError(process.returncode, process.args, error)
|
||
|
|
|
||
|
|
# Проверяем, если вебмин был выбран для установки
|
||
|
|
if "webmin" in tags:
|
||
|
|
d.gauge_update(90, "Настройка Webmin...")
|
||
|
|
# Установка cpanminus
|
||
|
|
run_command_with_log(
|
||
|
|
d, ["apt", "install", "-y", "cpanminus"], "Установка cpanminus"
|
||
|
|
)
|
||
|
|
|
||
|
|
# Разрешение порта 10000/tcp в ufw
|
||
|
|
if run_command_with_log(
|
||
|
|
d, ["sudo", "ufw", "allow", "10000/tcp"], "Настройка Firewall"
|
||
|
|
):
|
||
|
|
d.msgbox("Порт 10000/tcp разрешен в ufw.")
|
||
|
|
|
||
|
|
# # Установка модулей DBI и DBD::Pg через cpanminus
|
||
|
|
# if run_command_with_log(d, ['cpanm', '--quit', 'DBI'], "Установка модуля DBI"):
|
||
|
|
# d.msgbox("Модуль DBI успешно установлен.")
|
||
|
|
# if run_command_with_log(d, ['cpanm', '--quit', 'DBD::Pg'], "Установка модуля DBD::Pg"):
|
||
|
|
# d.msgbox("Модуль DBD::Pg успешно установлен.")
|
||
|
|
|
||
|
|
# Перезагрузка Webmin
|
||
|
|
if run_command_with_log(
|
||
|
|
d, ["systemctl", "reload", "webmin"], "Перезагрузка Webmin"
|
||
|
|
):
|
||
|
|
d.msgbox("Webmin успешно перезагружен.")
|
||
|
|
|
||
|
|
d.gauge_update(100, "Установка завершена успешно!")
|
||
|
|
d.gauge_stop()
|
||
|
|
|
||
|
|
except subprocess.CalledProcessError as e:
|
||
|
|
logging.error(f"Ошибка при установке пакетов: {e}")
|
||
|
|
d.gauge_stop()
|
||
|
|
d.msgbox(f"Ошибка при установке пакетов: {e}")
|
||
|
|
|
||
|
|
|
||
|
|
def run_install_packages():
|
||
|
|
install_packages()
|