osgos_postinstall/deb_dist/postinstall-1.5.0/build/lib/postinstall/option/database.py

157 lines
5.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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