osgos_postinstall/postinstall/option/database.py

158 lines
5.5 KiB
Python
Raw Normal View History

2025-06-09 14:32:16 +05:00
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()