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