158 lines
5.5 KiB
Python
158 lines
5.5 KiB
Python
|
|
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()
|