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') # Разрешение порта 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()