osgos_postinstall/deb_dist/postinstall-1.0.1/postinstall/option/database.py

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