osgos_postinstall/documentation.md

54 KiB
Raw Permalink Blame History

Описание

Программа postinstall предназначен для автоматизации различных задач по настройке и конфигурации системы после установки. Он предоставляет интерфейс для управления настройками сети, обновлениями системы, установкой программного обеспечения, настройкой SSH, изменением доменного имени и многими другими функциями.

Основные директории и файлы

  • postinstall/: Главная директория проекта.
    • __init__.py: Инициализирует пакет postinstall.
    • logger.py: Определяет функции для ведения логов.
    • __main__.py: Главный исполняемый скрипт, запускающий основные функции проекта.
    • root.py: Сценарий для управления правами суперпользователя.
    • option/: Поддиректория, содержащая скрипты для различных опций настройки и установки.

postinstall/init.py

Этот скрипт представляет собой основную точку входа для выполнения конфигурационных задач системы. Он использует библиотеку dialog для взаимодействия с пользователем через текстовые диалоговые окна и выполняет различные конфигурационные задачи, такие как обновление системы, настройка сети, добавление пользователей, установка пакетов и другие. Скрипт включает в себя функции для чтения и изменения системных конфигураций и резервного копирования.

Импортируемые модули и функции

  • os, subprocess, sys, signal: Стандартные модули Python для работы с операционной системой, выполнения команд и обработки сигналов.
  • Dialog из dialog: Для создания текстовых диалоговых окон.
  • check_root из postinstall.root: Проверка прав суперпользователя.
  • Модули из postinstall.option:
    • network: Настройка сетевых параметров.
    • update: Обновление системы.
    • add_user: Добавление пользователя.
    • install_packages: Установка программ.
    • ssh: Настройка SSH.
    • hostname: Изменение имени хоста.
    • shell: Выбор оболочки.
    • database: Настройка базы данных.
    • docker: Настройка Docker.
  • json: Для работы с JSON-данными.
  • logger из postinstall.logger: Для ведения логов.

Константы

  • SSH_CONFIG_PATH: Путь к конфигурационному файлу SSH.
  • HOSTNAME_FILE: Путь к файлу с именем хоста.
  • AUTOSTART_FILE: Путь к файлу автозапуска.
  • BACKUPS_FILE: Путь к файлу резервных копий.
  • UFW_OPENSSH_CONFIG_PATH: Путь к конфигурации UFW для OpenSSH.

Классы и методы

MenuScreen

  • Методы:
    • __init__(self): Инициализация меню, получение текущих значений конфигурации (SSH порт, имя хоста, автозапуск и т.д.).
    • show_menu(self): Отображение главного меню и обработка выбора пользователя.
    • set_temp_network(self, settings): Установка временных сетевых настроек.
    • check_auto_start(self): Проверка состояния автозапуска.
    • set_auto_start(self, enable: bool): Включение или отключение автозапуска.
    • update_ssh_port(self, new_port): Обновление порта SSH.
    • update_hostname(self, new_hostname): Обновление имени хоста.
    • update_autostart(self, new_state): Обновление состояния автозапуска.

Функции

choose(option, menu)

  • Описание: Обработка выбранной пользователем опции из меню.
  • Аргументы:
    • option: Выбранная опция меню.
    • menu: Объект класса MenuScreen.
  • Возвращаемое значение:
    • False, если произошла ошибка или требуется завершение работы.

signal_handler(sig, frame)

  • Описание: Обработчик сигналов для корректного завершения работы приложения.
  • Аргументы:
    • sig: Сигнал.
    • frame: Контекст сигнала.

main()

  • Описание: Основная функция, которая запускает приложение, обрабатывает сигналы и отображает меню.

Примечания

  • Скрипт требует прав суперпользователя для выполнения некоторых команд.
  • Перед сохранением изменений в системных файлах скрипт делает резервные копии, что позволяет восстановить предыдущие состояния конфигураций при необходимости.

postinstall/logger.py

Модуль logger.py предназначен для настройки и управления логированием в приложении. Он обеспечивает запись логов в файл и добавление информации о текущем пользователе в каждый лог-запись.

Импортируемые модули

  • logging: Стандартный модуль для ведения логов в Python.
  • getpass: Модуль для получения имени текущего пользователя.

Функции

setup_logger()

Настраивает логирование для приложения.

Возвращаемое значение:

  • logging.Logger - Настроенный экземпляр логирования.

Подробности:

  1. Создание логов:

    • logger = logging.getLogger()
    • Устанавливается уровень логирования на INFO.
  2. Настройка формата:

    • Формат лог-сообщений: %(asctime)s - User: %(user)s - %(message)s
      • %(asctime)s - Время записи.
      • %(user)s - Имя пользователя, делавшего запись.
      • %(message)s - Сообщение лога.
  3. Создание и настройка обработчика файла:

    • file_handler = logging.FileHandler("/var/log/postinstall.log")
    • Обработчик записывает логи в файл /var/log/postinstall.log.
    • Форматтер применяет формат к записям.
  4. Создание и применение фильтра:

    • UserFilter - Класс фильтра, добавляющий имя пользователя к каждой записи лога.
    • Фильтр используется для добавления пользовательской информации к записям.
  5. Добавление обработчика и фильтра к логам:

    • Обработчик и фильтр добавляются к логам.

Примечание:

  • Файл журнала будет создан в /var/log/.

Переменные

logger

  • Настроенный экземпляр логгера, возвращаемый функцией setup_logger().

postinstall/root.py

Модуль root.py предназначен для проверки, что скрипт запущен с правами суперпользователя (root). Это важно для обеспечения выполнения программы. Postinstall работает только с правами суперпользователя для обеспечения успешной работы всех модулей и функций.

Импортируемые модули

  • os: Модуль для взаимодействия с операционной системой.
  • sys: Модуль для работы с параметрами и функциями интерпретатора Python.

Функции

check_root()

Проверяет, что скрипт запущен от имени суперпользователя.

Возвращаемое значение:

  • Нет (в случае успеха) - Если скрипт запущен с правами суперпользователя, функция просто завершает выполнение без ошибок.
  • sys.exit(1) - Если скрипт не запущен с правами суперпользователя, функция завершает выполнение скрипта с кодом ошибки 1.

Подробности:

  1. Получение идентификатора пользователя:

    • os.geteuid() - Возвращает идентификатор эффективного пользователя текущего процесса.
  2. Проверка прав:

    • Если идентификатор эффективного пользователя не равен 0 (что соответствует root), выводится сообщение об ошибке: "Запустите скрипт с правами суперпользователя".
    • Скрипт завершается с кодом ошибки 1 с помощью sys.exit(1).

option/add_user.py

Скрипт add_user.py предназначен для добавления нового пользователя в систему Linux через текстовый интерфейс. Также предоставляет возможность скрывать или показывать вводимый пароль и проверяет, существует ли уже пользователь в системе.

Импортируемые модули

  • subprocess: Для выполнения команд в командной строке и взаимодействия с процессами.
  • dialog.Dialog: Для создания текстовых диалогов.
  • pwd: Для проверки существования пользователя в системе.
  • postinstall.logger: Для ведения логов, импортирован как logger.

Функции

get_password_with_toggle(d, title)

Функция для ввода пароля с возможностью переключения видимости пароля (показ/скрытие).

Параметры:

  • d (Dialog): Объект Dialog, используемый для создания диалоговых окон.
  • title (str): Заголовок диалогового окна.

Процесс:

  1. Функция отображает диалоговое окно для ввода пароля с возможностью переключения между скрытым и открытым отображением пароля.
  2. Пользователь может нажать кнопку "Показать пароль" или "Скрыть пароль" для изменения состояния видимости пароля.
  3. Если пользователь нажимает "Отмена", функция возвращает None.
  4. Возвращает введённый пароль, если пользователь подтверждает ввод.

add_user()

Основная функция для добавления нового пользователя в систему.

Процесс:

  1. Создание формы для ввода данных:

    • Поля формы включают имя пользователя, полное имя, мобильный телефон, городской телефон и кабинет.
    • После ввода данных в форму, проверяется, существует ли уже пользователь с таким именем.
  2. Проверка существования пользователя:

    • Используется модуль pwd для проверки существования пользователя.
    • Если пользователь уже существует, выводится сообщение об ошибке.
  3. Запрос пароля:

    • Используется get_password_with_toggle для ввода пароля с возможностью его показать/скрыть.
    • Пароль также проверяется на совпадение с подтверждением пароля.
  4. Запрос прав администратора:

    • Диалоговое окно спрашивает, нужно ли сделать пользователя администратором.
  5. Создание пользователя:

    • Выполняется команда useradd для создания пользователя с указанными параметрами.
    • Устанавливается пароль для нового пользователя с помощью команды passwd.
    • Если пользователь назначается администратором, добавляется в группу sudo.
  6. Логирование и сообщение:

    • Записывается информация о созданном пользователе в журнал.
    • Отображается сообщение об успешном добавлении пользователя или об ошибке.

run_add_user()

Функция-обёртка для вызова функции add_user.

Запуск скрипта

При запуске скрипта напрямую (if __name__ == "__main__":), вызывается функция run_add_user, которая в свою очередь вызывает add_user.

Обработка ошибок

  • subprocess.CalledProcessError: Ловит ошибки выполнения команд в командной строке и записывает их в журнал.
  • Сообщения об ошибках также отображаются в диалоговом окне для пользователя.

option/autostart.py

Скрипт autostart.py отвечает за управление настройками автозапуска при следующем запуске системы. Скрипт использует файл в файловой системе для хранения состояния автозапуска.

Импортируемые модули

  • os: Для работы с файловой системой (проверка наличия файлов, создание и удаление файлов).
  • dialog.Dialog: Для создания текстовых диалогов.
  • postinstall.logger: Для ведения логов, импортирован как logger.

Константы

  • AUTOSTART_FILE: Путь к файлу, который указывает на состояние автозапуска. Если файл существует, автозапуск отключен. Если файл отсутствует, автозапуск включен.

Классы и методы

Класс AutoStartScreen

Методы
  • __init__()

    Конструктор класса AutoStartScreen. Инициализирует объект Dialog для создания текстовых диалогов.

  • check_auto_start() -> bool

    Проверяет текущее состояние автозапуска. Возвращает True, если автозапуск включен (файл AUTOSTART_FILE отсутствует), и False, если автозапуск отключен (файл присутствует).

  • set_auto_start(enable: bool) -> None

    Изменяет состояние автозапуска в зависимости от значения enable.

    • Если enable равно True: Удаляет файл AUTOSTART_FILE, если он существует. Это включает автозапуск.
    • Если enable равно False: Создаёт файл AUTOSTART_FILE, чтобы отключить автозапуск. В файл записывается комментарий.

    В случае ошибок при удалении или создании файла записываются сообщения об ошибках в журнал.

  • show_screen()

    Отображает диалоговое окно для выбора действия по настройке автозапуска. Используется checklist для отображения опций и состояния текущего автозапуска.

    • Если пользователь выбирает опцию "Автозапуск при следующем запуске", состояние автозапуска изменяется в соответствии с выбором.
    • После применения изменений отображается сообщение об успешном сохранении изменений.
    • Если пользователь отменяет изменения, в журнал записывается информация об отмене.

Функция main()

Создаёт экземпляр AutoStartScreen и вызывает метод show_screen() для отображения диалогового окна с настройками автозапуска.

Запуск скрипта

При запуске скрипта напрямую (if __name__ == "__main__":), вызывается функция main, которая инициирует работу с настройками автозапуска.

option/install_packages.py

Скрипт install_packages.py предназначен для установки пакетов на систему Linux. Он предоставляет пользователю интерфейс для выбора базы данных и установки связанных с ней пакетов, а также возможности установки Webmin и дополнительных компонентов.

Импортируемые модули

  • subprocess: Для выполнения команд оболочки и обработки их вывода.
  • dialog.Dialog: Для создания текстовых диалогов.

Функции

main()

Основная функция, которая управляет процессом установки:

  1. Создаёт объект Dialog для создания текстовых диалогов.
  2. Отображает диалоговое окно для выбора базы данных (PostgreSQL или MariaDB).
    • Если пользователь выбирает PostgreSQL или MariaDB, вызываются соответствующие функции для установки пакетов.
    • Независимо от выбранной базы данных, предлагается установка Webmin.
    • Если пользователь соглашается на установку Webmin, вызывается функция install_webmin.

is_installed(package_name)

Проверяет, установлен ли пакет с именем package_name:

  • Выполняет команду dpkg-query -W -f=${Status} package_name для получения статуса пакета.
  • Если вывод команды содержит строку 'install ok installed', возвращает True.
  • В случае ошибки возвращает False.

run_command_with_log(dialog, command, title)

Запускает команду и выводит лог её выполнения в диалоговое окно:

  • Создаёт процесс для выполнения команды с помощью subprocess.Popen.
  • Читает стандартный вывод и стандартный ошибки процесса, собирая их в список log_output.
  • Отображает результат в диалоговом окне с заголовком title.
  • Возвращает True, если команда выполнена успешно, иначе False.

install_package(dialog, package_name)

Устанавливает указанный пакет с выводом лога:

  • Отображает сообщение о начале установки пакета.
  • Обновляет список пакетов с помощью команды apt-get update.
  • Устанавливает пакет с помощью apt-get install -y package_name.
  • Отображает сообщение об успешной установке или ошибке.

install_postgresql(dialog)

Устанавливает PostgreSQL и связанный пакет Harlequin:

  • Проверяет и устанавливает пакеты postgresql-16, python3-harlequin, и python3-harlequin-postgres, если они не установлены.

install_mariadb(dialog)

Устанавливает MariaDB:

  • Проверяет и устанавливает пакеты mariadb-server и python3-harlequin, если они не установлены.

install_webmin(dialog)

Устанавливает Webmin и связанные пакеты:

  • Проверяет, установлен ли Webmin. Если нет, выполняет установку:
    • Устанавливает Webmin и дополнительные пакеты (postgresql-server-dev-16 и cpanminus).
    • Разрешает порт 10000/tcp в ufw (брандмауэр).
    • Устанавливает Perl-модули DBI и DBD::Pg через cpanm.
    • Перезагружает Webmin.
  • Отображает сообщения о каждом шаге процесса установки.

Запуск скрипта

При запуске скрипта напрямую (if __name__ == "__main__":), вызывается функция main, которая инициирует процесс установки пакетов.

option/docker.py

Скрипт docker_config.py управляет установкой и удалением Docker и Portainer. Логирование выполняется через модуль logger из postinstall.logger.

Импортируемые модули

  • subprocess: Для выполнения команд оболочки и обработки их вывода.
  • os: Для работы с файловой системой.
  • re: Для работы с регулярными выражениями.
  • shlex: Для безопасного разбора команд.
  • abc, abstractmethod: Для создания абстрактных базовых классов и методов.
  • Optional, List, Callable: Для аннотаций типов.
  • Dialog: Для создания текстовых диалогов.
  • logger: Для логирования.

Константы

  • REGISTRY_URL: URL Docker registry.
  • REGISTRY_LOGIN: Логин для Docker registry.
  • REGISTRY_PASSWORD: Пароль для Docker registry.
  • DOCKER_COMPOSE_FILE_PATH: Путь к файлу docker-compose.yml.

Классы и их методы

CommandExecutor

  • Методы:
    • run_command(command: str, shell: bool = False, input_data: Optional[str] = None, ignore_errors: List[int] = []) -> subprocess.CompletedProcess: Выполняет команду и возвращает результат выполнения. Обрабатывает ошибки и логирует их.

SystemChecker

  • Методы:
    • is_command_installed(command: str) -> bool: Проверяет, установлен ли командный инструмент.

ProgressGauge

  • Методы:
    • __init__(self, dialog: Dialog, title: str, total_steps: int): Инициализирует объект с диалогом и настройками для отображения индикатора выполнения.
    • update(self, step: int, message: str): Обновляет индикатор выполнения.
    • __enter__(self): Запускает индикатор выполнения.
    • __exit__(self, exc_type, exc_val, exc_tb): Останавливает индикатор выполнения.

DockerManager

  • Методы:
    • install(progress_callback: Callable[[int, str], None]): Устанавливает Docker и Docker Compose.
    • uninstall(progress_callback: Callable[[int, str], None]): Удаляет Docker и Docker Compose.
    • login_to_registry(): Выполняет вход в Docker registry.

UFWManager

  • Методы:
    • add_rule(port: str): Добавляет правило для открытия порта в UFW.
    • remove_rule(port: str): Удаляет правило для порта в UFW.

PortainerManager

  • Методы:
    • install(port: str, password: str, ip: str, progress_callback: Callable[[int, str], None]): Устанавливает Portainer с указанными параметрами.
    • uninstall(progress_callback: Callable[[int, str], None]): Удаляет Portainer.
    • _generate_password_hash(password: str) -> str: Генерирует хеш пароля для Portainer.
    • _create_docker_compose_file(port: str, password_hash: str, ip: str): Создаёт файл docker-compose.yml для Portainer.

InputValidator

  • Методы:
    • validate(value: str, pattern: str) -> bool: Проверяет значение на соответствие регулярному выражению.

UIElement

  • Методы:
    • __init__(self, dialog: Dialog): Инициализирует элемент пользовательского интерфейса.
    • show(self): Абстрактный метод для отображения UI элемента.

Menu

  • Методы:
    • show(self): Отображает меню для выбора действия (установка или удаление Docker).

YesNoUI

  • Методы:
    • show(self, text: str): Отображает диалоговое окно с вопросом и возвращает ответ пользователя.

PasswordInput

  • Методы:
    • show(self): Отображает диалоговое окно для ввода пароля и возвращает его, если пароль соответствует требованиям.

PortInput

  • Методы:
    • show(self): Отображает диалоговое окно для ввода порта и возвращает его, если порт корректен.

IPInput

  • Методы:
    • show(self): Отображает диалоговое окно для ввода IP-адреса и возвращает его, если IP корректен.

DockerConfigUI

  • Методы:
    • __init__(self): Инициализирует UI для конфигурации Docker.
    • run(self): Запускает основной цикл работы UI.
    • _handle_docker(self): Обрабатывает установку или удаление Docker.
    • handle_portainer(self): Обрабатывает установку или удаление Portainer.
    • _install_portainer(self): Устанавливает Portainer с запросом необходимых данных у пользователя.

Запуск скрипта

При запуске скрипта напрямую вызывается функция run, которая создаёт объект DockerConfigUI и запускает его метод run, инициируя процесс конфигурации Docker и Portainer.

option/hostname.py

Скрипт change_hostname.py предназначен для изменения доменного имени (hostname) системы. Скрипт читает текущее доменное имя, позволяет пользователю ввести новое доменное имя, проверяет его валидность и применяет изменения.

Импортируемые модули

  • subprocess: Для выполнения команд оболочки.
  • Dialog: Для создания текстовых диалогов.
  • os: Для работы с файловой системой.

Константы

  • HOSTNAME_FILE: Путь к файлу, содержащему текущее доменное имя.
  • HOSTS_FILE: Путь к файлу hosts, где также может быть указано доменное имя.

Функции и их назначения

get_current_hostname()

  • Описание: Читает текущее доменное имя из файла /etc/hostname.
  • Возвращаемое значение: Возвращает текущее доменное имя или "localhost" в случае ошибки.

change_hostname()

  • Описание: Отображает диалоговые окна для ввода нового доменного имени. Проверяет, совпадает ли новое имя с текущим, и если нет, проверяет его валидность. Запрашивает подтверждение изменения.
  • Возвращаемое значение: Возвращает новое доменное имя, если изменения подтверждены, или None, если изменения отменены или имя недопустимо.

is_valid_hostname(hostname)

  • Описание: Проверяет, соответствует ли введённое доменное имя требованиям.
  • Параметры:
    • hostname: Проверяемое доменное имя.
  • Возвращаемое значение: Возвращает True, если имя допустимо, и False в противном случае.

apply_hostname_change(new_hostname)

  • Описание: Применяет изменение доменного имени, обновляя файлы /etc/hostname и /etc/hosts.
  • Параметры:
    • new_hostname: Новое доменное имя.
  • Возвращаемое значение: Возвращает True, если изменения применены успешно, и False в случае ошибки.

run_change_hostname()

  • Описание: Вызывает функцию change_hostname и возвращает результат её выполнения.
  • Возвращаемое значение: Возвращает результат выполнения change_hostname.

Основной блок выполнения

  • При запуске скрипта напрямую вызывается функция run_change_hostname(), которая запускает процесс изменения доменного имени.
  • Если новое доменное имя получено и изменения подтверждены, оно будет выведено на экран. В противном случае будет выведено сообщение об отмене изменения.

Логирование и ошибки

  • Ошибки при чтении файлов или выполнении команд оболочки обрабатываются и выводятся пользователю через диалоговые окна.
  • Успешное изменение доменного имени или отмена изменений также сообщаются пользователю через диалоговые окна.

option/network.py

Скрипт network.py предназначен для настройки сетевых интерфейсов в системе. Скрипт позволяет пользователю выбирать сетевой интерфейс и конфигурировать его для работы с DHCP, статическим IP или CIDR. После настройки, скрипт применяет изменения и обновляет конфигурационные файлы.

Импортируемые модули

  • subprocess: Для выполнения команд оболочки.
  • ipaddress: Для работы с IP-адресами и сетями.
  • Dialog: Для создания текстовых диалогов.

Класс NetworkConfig

Метод __init__(self)

  • Описание: Инициализирует объект NetworkConfig. Создает объект Dialog и пустой словарь для хранения временных сетевых настроек.

Метод select_interface(self)

  • Описание:
    1. Получает список доступных сетевых интерфейсов.
    2. Позволяет пользователю выбрать интерфейс из списка.
    3. Показывает текущие настройки выбранного интерфейса.
  • Возвращаемое значение: Имя выбранного интерфейса или None, если интерфейс не выбран.

Метод get_network_interfaces()

  • Описание: Получает список доступных сетевых интерфейсов.
  • Возвращаемое значение: Список имен интерфейсов или пустой список в случае ошибки.

Метод show_current_settings(self, interface)

  • Описание:
    1. Получает текущие настройки для указанного интерфейса.
    2. Показывает информацию о типе настройки (DHCP или Static) и текущем IP-адресе.
  • Возвращаемое значение: Нет.

Метод configure_dhcp(self, interface)

  • Описание:
    1. Позволяет пользователю ввести настройки для DHCP (опционально DNS).
    2. Сохраняет настройки в временный словарь.
  • Возвращаемое значение: Нет.

Метод configure_static(self, interface)

  • Описание:
    1. Позволяет пользователю ввести настройки для статического IP (IP-адрес, маска подсети, шлюз и опционально DNS).
    2. Сохраняет настройки в временный словарь.
  • Возвращаемое значение: Нет.

Метод configure_cidr(self, interface)

  • Описание:
    1. Позволяет пользователю ввести CIDR, шлюз и опционально DNS.
    2. Распознает IP-адрес и маску из CIDR и сохраняет настройки в временный словарь.
  • Возвращаемое значение: Нет.

Метод run(self)

  • Описание:
    1. Позволяет пользователю выбрать интерфейс и действия для его настройки.
    2. Запускает соответствующие методы для настройки (DHCP, статический IP, CIDR).
    3. Возвращает словарь временных сетевых настроек.
  • Возвращаемое значение: Словарь временных сетевых настроек.

Метод save_and_apply_network_settings(self)

  • Описание:
    1. Сохраняет и применяет временные сетевые настройки.
    2. Обновляет файл конфигурации интерфейсов и файл DNS.
    3. Перезапускает сетевую службу.
  • Возвращаемое значение: True при успешном применении настроек и False в случае ошибки.

Метод save_dhcp(self, interface, settings)

  • Описание: Сохраняет настройки DHCP для указанного интерфейса в конфигурационный файл.
  • Возвращаемое значение: Нет.

Метод save_static(self, interface, settings)

  • Описание: Сохраняет статические настройки IP для указанного интерфейса в конфигурационный файл.
  • Возвращаемое значение: Нет.

Метод update_interface_config(self, interface, interface_config)

  • Описание: Обновляет конфигурационный файл /etc/network/interfaces с учетом новых настроек интерфейса.
  • Возвращаемое значение: Нет.

Метод update_resolv_conf(self, dns)

  • Описание: Обновляет файл /etc/resolv.conf с новым DNS-сервером.
  • Возвращаемое значение: Нет.

Основной блок выполнения

  • При запуске скрипта напрямую создается объект NetworkConfig и вызывается метод run(), который запускает процесс настройки сетевых интерфейсов.

Примечания

  • Скрипт требует прав суперпользователя для внесения изменений в конфигурационные файлы и перезапуска сетевой службы.
  • Для корректной работы необходимо наличие утилиты dialog и доступа к командам ip и systemctl.
  • При использовании CIDR, маска подсети автоматически рассчитывается на основе IP-адреса и CIDR.

option/shell.py

Скрипт shell.py предназначен для изменения командной оболочки для пользователей системы. Скрипт позволяет выбирать между установкой zsh (или другой оболочки) и изменением оболочки для всех пользователей системы или для конкретных пользователей.

Импортируемые модули

  • subprocess: Для выполнения команд оболочки.
  • Dialog: Для создания текстовых диалогов.
  • pwd: Для получения информации о пользователях.
  • os: Для проверки существования файлов и путей.
  • logger из postinstall.logger: Для ведения логов.

Функции

Функция get_users()

  • Описание: Получает список пользователей системы с UID >= 1000 и добавляет "root" в список, если его нет.
  • Возвращаемое значение: Список имен пользователей.

Функция install_zsh()

  • Описание:
    1. Обновляет список пакетов.
    2. Устанавливает zsh.
  • Возвращаемое значение: True при успешной установке и False в случае ошибки.

Функция change_shell()

  • Описание: Основная функция для изменения оболочки.
    1. Создает объект Dialog.
    2. Получает список пользователей с помощью get_users().
    3. Позволяет пользователю выбрать способ изменения оболочки (для всех пользователей или для конкретных).
    4. Позволяет выбрать новую оболочку (bash или zsh).
    5. Если выбран zsh и он не установлен, вызывает install_zsh() для его установки.
    6. Применяет изменения: изменяет оболочку для всех или выбранных пользователей с помощью команды chsh.
  • Возвращаемое значение: Нет.

Функция run_change_shell()

  • Описание: Запускает функцию change_shell().
  • Возвращаемое значение: Нет.

Основной блок выполнения

  • При запуске скрипта напрямую вызывается функция run_change_shell(), которая запускает процесс изменения оболочки.

Примечания

  • Установка zsh происходит только если выбранная оболочка zsh не установлена на системе.
  • Логи об ошибках и успешных действиях сохраняются с помощью объекта logger.

option/ssh.py

Скрипт ssh.py предназначен для управления конфигурацией SSH-сервиса на системе. Он позволяет:

  1. Управлять состоянием службы SSH (запуск, остановка).
  2. Изменять порт SSH.
  3. Изменять метод аутентификации SSH.

Константы

  • SSH_CONFIG_PATH: Путь к конфигурационному файлу SSH (/etc/ssh/sshd_config).
  • SSH_AUTH_CONFIG_PATH: Путь к файлу конфигурации аутентификации SSH (/etc/ssh/sshd_config.d/auth.conf).
  • UFW_OPENSSH_CONFIG_PATH: Путь к файлу конфигурации UFW для OpenSSH (/etc/ufw/applications.d/openssh-server).

Класс SSHConfig

Методы

__init__(self)
  • Описание: Инициализация класса. Создает объект Dialog и получает текущие настройки порта и метода аутентификации SSH.
  • Возвращаемое значение: Нет.
get_sshd_status(self)
  • Описание: Получает статус службы SSH.
  • Возвращаемое значение: Строка, представляющая статус службы (active, inactive, или unknown).
toggle_sshd_service(self, action)
  • Описание: Запускает или останавливает службу SSH в зависимости от переданного действия (start или stop).
  • Возвращаемое значение: Нет.
get_current_ssh_port(self)
  • Описание: Получает текущий порт SSH из конфигурационного файла.
  • Возвращаемое значение: Текущий порт SSH (или "22", если порт не найден).
change_ssh_port(self)
  • Описание: Позволяет пользователю ввести новый порт SSH и подтверждает изменение.
  • Возвращаемое значение: Нет.
get_current_auth_method(self)
  • Описание: Получает текущий метод аутентификации SSH из конфигурационного файла.
  • Возвращаемое значение: Строка, представляющая метод аутентификации ("По ключу и паролю", "Только по ключу", или "Только по паролю").
change_auth_method(self)
  • Описание: Позволяет пользователю выбрать метод аутентификации SSH.
  • Возвращаемое значение: Нет.
apply_changes(self)
  • Описание: Применяет изменения порта и/или метода аутентификации, если они были сделаны.
  • Возвращаемое значение: Нет.
main_menu(self)
  • Описание: Основное меню, которое позволяет пользователю выбрать действие: включение/выключение службы SSH, изменение порта SSH, изменение метода аутентификации.
  • Возвращаемое значение: True, если были внесены изменения, иначе False.

Функция run_ssh_config()

  • Описание: Создает экземпляр SSHConfig, запускает основное меню и возвращает объект конфигурации и флаг, указывающий на наличие изменений.
  • Возвращаемое значение: Кортеж (SSHConfig, changes_made).

Основной блок выполнения

  • При запуске скрипта напрямую вызывается функция run_ssh_config(). Она запускает основной процесс управления конфигурацией SSH и применяет изменения, если они были внесены.

Примечания

  • Используются команды sed и ufw для обновления конфигураций, а также перезапуск службы SSH для применения изменений.
  • Логи об ошибках и успешных действиях сохраняются с помощью модуля logging.

option/update.py

Скрипт update.py предназначен для обновления системы. Он выполняет обновление списка пакетов и обновление установленных пакетов до последних доступных версий.

Функции

run_update()

  • Описание: Выполняет обновление системы. Запрашивает подтверждение у пользователя, выполняет команды обновления через apt, и отображает процесс обновления с помощью индикатора gauge библиотеки dialog.

  • Шаги выполнения:

    1. Запрос подтверждения: Появляется диалоговое окно с запросом на подтверждение обновления системы. Если пользователь не подтверждает, функция завершает выполнение.
    2. Инициализация индикатора прогресса: Запускается индикатор прогресса с начальным значением 0%.
    3. Выполнение команд обновления:
      • Выполняются команды apt update и apt upgrade -y с обновлением индикатора прогресса в зависимости от выполнения команд.
      • Вывод команд отображается в диалоговом окне.
      • Если команда завершается с ошибкой, возникает исключение subprocess.CalledProcessError, и выводится сообщение об ошибке.
    4. Обработка ошибок:
      • Если происходит ошибка при выполнении команды, логируется ошибка, и отображается сообщение об ошибке.
      • Если возникает неожиданная ошибка, также логируется и отображается соответствующее сообщение.
    5. Завершение обновления: Обновление системы завершено, отображается сообщение об успешном завершении.

Основной блок выполнения

  • При запуске скрипта напрямую вызывается функция run_update().

option/database.py

Скрипт database.py предназначен для установки и настройки баз данных PostgreSQL и MariaDB, а также для установки Webmin и необходимых дополнительных пакетов.

Основные функции

  1. Выбор базы данных для установки:

    • Пользователь может выбрать установку PostgreSQL или MariaDB через диалоговое окно.
  2. Установка PostgreSQL:

    • Проверка и установка PostgreSQL и сопутствующих пакетов, включая python3-harlequin и python3-harlequin-postgres.
  3. Установка MariaDB:

    • Проверка и установка MariaDB и python3-harlequin.
  4. Установка Webmin:

    • Проверка и установка Webmin, разрешение порта 10000/tcp в ufw, установка модулей DBI и DBD::Pg через cpanminus, и перезагрузка Webmin.

Основные функции и методы

main()

Основная функция, которая запускает диалоговый интерфейс для выбора базы данных и выполнения соответствующих установок.

is_installed(package_name: str) -> bool

Проверяет, установлен ли указанный пакет.

Параметры:

  • package_name: Название пакета для проверки.

Возвращает:

  • True, если пакет установлен, иначе False.

run_command_with_log(dialog: Dialog, command: list[str], title: str) -> bool

Запускает указанную команду и отображает лог выполнения в диалоговом окне.

Параметры:

  • dialog: Экземпляр диалогового окна для отображения логов.
  • command: Список команд и параметров для выполнения.
  • title: Заголовок диалогового окна.

Возвращает:

  • True, если команда выполнена успешно, иначе False.

install_package(dialog: Dialog, package_name: str)

Устанавливает указанный пакет и отображает статус установки в диалоговом окне.

Параметры:

  • dialog: Экземпляр диалогового окна.
  • package_name: Название пакета для установки.

install_postgresql(dialog: Dialog)

Устанавливает PostgreSQL и сопутствующие пакеты.

Параметры:

  • dialog: Экземпляр диалогового окна.

install_mariadb(dialog: Dialog)

Устанавливает MariaDB и python3-harlequin.

Параметры:

  • dialog: Экземпляр диалогового окна.

install_webmin(dialog: Dialog)

Устанавливает Webmin и выполняет дополнительные настройки, такие как разрешение порта в ufw, установка модулей через cpanminus, и перезагрузка Webmin.

Параметры:

  • dialog: Экземпляр диалогового окна.