import subprocess from dialog import Dialog def main(): dialog = Dialog(dialog="dialog") # Диалоговое окно с выбором базы данных code, choice = dialog.menu( "Выберите базу данных для установки:", choices=[ ("PostgreSQL", "Установить PostgreSQL"), ("MariaDB", "Установить MariaDB"), ], ) if code == dialog.OK: dialog.msgbox(f"Вы выбрали: {choice}", title="Выбор подтверждён") if choice == "PostgreSQL": install_postgresql(dialog) elif choice == "MariaDB": install_mariadb(dialog) # Независимо от выбранной базы данных, предложить установку Webmin if ( dialog.yesno("Установить Webmin?", yes_label="Да", no_label="Нет") == dialog.OK ): install_webmin(dialog) else: dialog.msgbox("Выбор базы данных отменён", title="Отмена") def is_installed(package_name): """Проверяет, установлен ли пакет""" try: result = subprocess.run( ["dpkg-query", "-W", "-f=${Status}", package_name], check=True, capture_output=True, text=True, ) return "install ok installed" in result.stdout except subprocess.CalledProcessError: return False def run_command_with_log(dialog, command, title): """Запуск команды с выводом лога в диалоговое окно""" process = subprocess.Popen( command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True ) log_output = [] for line in iter(process.stdout.readline, ""): log_output.append(line.strip()) stderr_output = process.stderr.read().strip() if stderr_output: log_output.append(stderr_output) process.stdout.close() process.stderr.close() process.wait() dialog.msgbox("\n".join(log_output), title=title, height=20, width=60) return process.returncode == 0 def install_package(dialog, package_name): """Устанавливает указанный пакет с выводом лога""" dialog.infobox(f"Начало установки {package_name}...") if not run_command_with_log(dialog, ["apt-get", "update"], "Обновление пакетов"): dialog.msgbox(f"Ошибка при обновлении пакетов для {package_name}.") return if not run_command_with_log( dialog, ["apt-get", "install", "-y", package_name], f"Установка {package_name}" ): dialog.msgbox(f"Ошибка при установке {package_name}.") return dialog.msgbox(f"{package_name} успешно установлен.") def install_postgresql(dialog): """Установка PostgreSQL и Harlequin""" if not is_installed("postgresql-16"): install_package(dialog, "postgresql-16") else: dialog.msgbox("PostgreSQL уже установлен.") if not is_installed("python3-harlequin"): install_package(dialog, "python3-harlequin") else: dialog.msgbox("python3-harlequin уже установлен.") if not is_installed("python3-harlequin-postgres"): install_package(dialog, "python3-harlequin-postgres") else: dialog.msgbox("python3-harlequin-postgres уже установлен.") def install_mariadb(dialog): """Установка MariaDB""" if not is_installed("mariadb-server"): install_package(dialog, "mariadb-server") else: dialog.msgbox("MariaDB уже установлена.") if not is_installed("python3-harlequin"): install_package(dialog, "python3-harlequin") else: dialog.msgbox("python3-harlequin уже установлен.") def install_webmin(dialog): """Установка Webmin и дополнительных пакетов""" if not is_installed("webmin"): install_package(dialog, "webmin") # Установка cpanminus install_package(dialog, "postgresql-server-dev-16") install_package(dialog, "cpanminus") run_command_with_log( dialog, ["sudo", "ufw", "allow", "webmin"], "Настройка Firewall" ) # Разрешение порта 10000/tcp в ufw if run_command_with_log( dialog, ["sudo", "ufw", "allow", "10000/tcp"], "Настройка Firewall" ): dialog.msgbox("Порт 10000/tcp разрешен в ufw.") # Установка модулей DBI и DBD::Pg через cpanminus if run_command_with_log( dialog, ["cpanm", "--quit", "DBI"], "Установка модуля DBI" ): dialog.msgbox("Модуль DBI успешно установлен.") if run_command_with_log( dialog, ["cpanm", "--quit", "DBD::Pg"], "Установка модуля DBD::Pg" ): dialog.msgbox("Модуль DBD::Pg успешно установлен.") # Перезагрузка Webmin if run_command_with_log( dialog, ["systemctl", "reload", "webmin"], "Перезагрузка Webmin" ): dialog.msgbox("Webmin успешно перезагружен.") else: dialog.msgbox("Webmin уже установлен.") if __name__ == "__main__": main()