osgos_postinstall/deb_dist/postinstall-1.5.0/postinstall/option/install_packages.py

127 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()