#!/bin/bash #version 1.0 # Цвета для вывода в консоль RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color version="1.0" if [ $# -eq 1 ]; then if [[ "$1" == "-v" ]]; then echo "$version" exit 0 fi fi LOG_FILE="/var/log/comp_settings.log" log_message() { local message="$1" printf '%s - %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$message" >> "$LOG_FILE" } if [ "$(id -u)" != "0" ]; then log_message "Попытка запуска без прав суперпользователя (root) (user: $(whoami))" echo -e "${RED} Ошибка - недостаточно прав" echo "Необходимо запустить из под пользователя 'root'" exit 1 fi if [[ -f /etc/krb5.keytab ]]; then echo -e "${YELLOW}Внимание: АРМ уже находится в домене.${NC}" read -r -p "Вывести из домена и выполнить очистку? (введите yes для подтверждения): " answer if [[ "$answer" == "yes" ]]; then echo "Выполняется вывод из домена и очистка..." log_message "Пользователь подтвердил вывод из домена" # --- БЛОК ОЧИСТКИ --- systemctl stop puppet realm leave sss_cache -E /opt/config/ad_setup.sh > /dev/null getcert stop-tracking -i $(hostname) rm -rf /opt/certs/802.1x/* rm -rf /opt/puppetlabs/puppet/cache/* rm -rf /etc/puppetlabs/puppet/ssl echo -e "${GREEN}Успешно: АРМ выведен из домена, очистка выполнена.${NC}" log_message "Вывод из домена и очистка выполнены успешно" exit 0 else echo "Операция отменена. АРМ остается в домене." log_message "Отмена вывода из домена пользователем" exit 1 fi fi log_message "Запускаем повторный ввод в домен" domain=$(awk '/^search/{print $2}' /etc/resolv.conf) if [[ -z "$domain" ]]; then echo -e "${RED}Ошибка: Не удалось определить домен из /etc/resolv.conf (отсутствует строка search)${NC}" >&2 log_message "Домен не определен в resolv.conf" exit 1 fi read -r -p "Имя АРМ (короткое без домена): " hostname read -r -p "Имя пользователя для ввода в домен: " username hostname=$(echo "$hostname" | xargs) username=$(echo "$username" | xargs) fqdn="${hostname}.${domain}" if [[ -z "$hostname" || -z "$username" ]]; then echo -e "${RED}Ошибка: Одно или несколько полей пустые, продолжение невозможно${NC}" >&2 log_message "Одно или несколько полей пустые" exit 1 fi echo -e "${YELLOW}Подтверждение данных:${NC}" echo "Имя АРМ в формате FQDN: $fqdn" echo "Домен: $domain" echo "Имя пользователя: $username" read -r -p "Продолжить? (y/n): " confirm if [[ ! "$confirm" =~ ^[Yy]$ ]]; then log_message "Пользователь отменил действие" echo "Действие отменено." exit 1 fi log_message "fqdn = $fqdn" log_message "Домен = $domain" log_message "Имя пользователя: $username" log_message "Пользователь подтвердил данные, продолжаем" /opt/config/ad_setup.sh > /dev/null hostnamectl set-hostname "$fqdn" log_message "Имя ПК заменено на $fqdn" sed -i '/^127\.0\.0\.1/d' /etc/hosts sed -i '/^127\.0\.1\.1/d' /etc/hosts sed -i "1i127.0.1.1 $fqdn $hostname" /etc/hosts sed -i "1i127.0.0.1 localhost localhost.localdomain" /etc/hosts astra_version=$(cat /etc/astra_version) log_message "Версия Astra Linux: $astra_version" echo "Выполняется ввод в домен..." adcli_result=$(adcli join --os-name=astralinux --os-version="$astra_version" -U "$username" -D "$domain" 2>&1) adcli_exit_code=$? if [[ $adcli_exit_code -eq 0 ]]; then log_message "Ввод в домен выполнен успешно" else log_message "Ошибка ввода в домен" log_message "Вывод adcli: $adcli_result" echo -e "${RED}Ошибка: Не удалось ввести АРМ в домен!${NC}" >&2 echo "$adcli_result" >&2 exit 1 fi sed -i "/^PluginOptions=/d" /etc/X11/fly-dm/fly-dmrc echo "PluginOptions=winbind.DefaultDomain=${domain},winbind.Domains=${domain}:" >> /etc/X11/fly-dm/fly-dmrc systemctl enable sssd if ! systemctl restart sssd; then echo -e "${YELLOW}Внимание: АРМ в домен заведен, НО служба sssd не стартовала!${NC}" >&2 log_message "Ввод в домен успешен, но служба sssd не запустилась" exit 0 fi echo -e "${GREEN}Успех: АРМ корректно настроен, в домен заведен${NC}" log_message "Ввод в домен полностью завершен успешно" echo "Выполняется первый запуск Puppet..." puppet agent -t > /tmp/puppet_first.log 2>&1 if grep -q "does not match its private key" /tmp/puppet_first.log; then echo -e "${RED}Ошибка: Несовпадение приватного ключа. Удалите старый сертификат на сервере управления.${NC}" >&2 echo -e "${RED}Удалите сертификат на сервере и выполните puppet agent -t" log_message "Ошибка: несовпадение приватного ключа. Требуется удаление сертификата на сервере Puppet" rm -rf /etc/puppetlabs/puppet/ssl rm -f /tmp/puppet_first.log exit 1 fi if grep -qiE "error:|could not|failed" /tmp/puppet_first.log; then log_message "Предупреждение: при первом запуске Puppet обнаружены возможные ошибки. Смотрите /tmp/puppet_first.log" else log_message "Первый запуск Puppet прошел без ошибок сертификатов" fi puppet agent -t > /dev/null 2>&1 systemctl enable puppet if ! systemctl start puppet; then echo -e "${YELLOW}Внимание: Подключение выполнено, но службу Puppet запустить не удалось.${NC}" >&2 log_message "Предупреждение: службу puppet запустить не удалось" else log_message "Служба Puppet успешно запущена" fi echo -e "${GREEN}Успех: АРМ успешно подключен к puppet-серверу${NC}" log_message "АРМ успешно подключен к puppet-серверу" echo -e "${GREEN}Успех: АРМ успешно перезаведен в домен${NC}"