#!/bin/bash #version 1.0 # - relise #version 1.1 # - added gkrs,uaz,ak,sgik,aepk #version 1.2 # - added grenn # - added fix for puppet in 1.7.6 #version 1.3 # - added tvel #version 1.4 # - added rums,chuni,aem,vnin,rir,ocks,cpti,rcr,cifr,rep,rnr,nw,cpir,rmt,tens # - added manual entry for puppet server #version 1.5 #add new environment new_base for puppet #version 1.6 # - изменен шебанг с /bin/sh на /bin/bash # - функция логирования echo заменено на printf # - изменение функции add_domain # - изменение получения значения домена с grep на awk # - добавлена проверка наличия домена в resolv.conf # - исправлены ошибки дальше по коду, значительно расширено логирование. # - Добавлены проверки отмены и нажатий esc version="1.6" 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 "Ошибка - недостаточно прав" echo "Необходимо запустить из под пользователя 'root'" exit 1 fi log_message "Скрипт запущен" #Функции add_domain() { log_message "Запуск функции ввода в домен" domain=$(awk '/^search/{print $2}' /etc/resolv.conf) if [ -z "$domain" ]; then whiptail --backtitle "Ошибка" --title "Ошибка" --msgbox "Не удалось определить домен из /etc/resolv.conf (отсутствует строка search)" 10 60 log_message "Имя домена отсутствует в resolv.conf" exit 1 fi if [ -f /etc/krb5.keytab ]; then whiptail --backtitle "Ошибка" --title "Ошибка" --msgbox "АРМ уже заведен в домен, для повторного заведения в домен необходимо сначала вывести АРМ из домена" 10 60 log_message "АРМ уже был добавлен в домен ранее" exit 1 fi hostname=$(whiptail --inputbox "Имя АРМ (короткое без домена):" 16 51 --title "Ввод данных" 3>&1 1>&2 2>&3) retval_hostname=$? username=$(whiptail --inputbox "Имя пользователя для ввода в домен:" 16 51 --title "Ввод данных" 3>&1 1>&2 2>&3) retval_username=$? # Проверяем, не нажал ли пользователь Cancel или Esc if [[ $retval_hostname -ne 0 || $retval_username -ne 0 ]]; then log_message "Пользователь отменил ввод" exit 1 fi # Обрезаем случайные пробелы по краям с помощью xargs hostname=$(echo "$hostname" | xargs) username=$(echo "$username" | xargs) log_message "Имя пк: $hostname" log_message "Имя пользователя для ввода в домен: $username" fqdn="${hostname}.${domain}" log_message "fqdn: $fqdn" if [[ -z "$hostname" || -z "$username" ]]; then whiptail --backtitle "Ошибка" --title "Ошибка" --msgbox "Одно или несколько полей пустые, продолжение невозможно" 10 60 log_message "Одно или несколько полей пустые" exit 1 fi if ! whiptail --title "Подтверждение" --yesno "Имя АРМ в формате FQDN: $fqdn\nДомен: $domain\nИмя пользователя для ввода в домен: $username\n\nПродолжить?" 16 51; then log_message "Пользователь отменил действие" exit 1 fi 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) adcli_result=$(adcli join --os-name=astralinux --os-version="$astra_version" -U "$username" -D "$domain" 2>&1) log_message "Версия Astra Linux: $astra_version" adcli_exit_code=$? if [[ $adcli_exit_code -eq 0 ]]; then log_message "Ввод в домен выполнен успешно" log_message "Вывод adcli: $adcli_result" else log_message "Ошибка ввода в домен" log_message "Вывод adcli: $adcli_result" whiptail --backtitle "Ошибка" --title "Ошибка" --msgbox "Что-то пошло не так, АРМ в домен завести не удалось!!!" 10 60 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 whiptail --backtitle "Ошибка" --title "Ошибка" --msgbox "АРМ в домен заведен, НО служба sssd не стартовала!!!" 10 60 log_message "Ввод в домен успешен, но служба sssd не запустилась. Проверьте статус sssd.service" exit 1 fi whiptail --backtitle "Успешно" --title "Успех" --msgbox "АРМ корректно настроен, в домен заведен, можно устанавливать СЗИ" 10 60 log_message "Ввод в домен полностью завершен успешно" exit 0 } remove_domain() { if [ ! -f /etc/krb5.keytab ]; then whiptail --backtitle "Ошибка" --title "Ошибка" --msgbox "АРМ уже не в домене, запуск невозможен" 10 60 log_message "ПК уже не в домене, выполнение прервано" exit 1 fi # Проверяем успешность вывода из домена if ! realm leave; then whiptail --backtitle "Ошибка" --title "Ошибка" --msgbox "Не удалось вывести АРМ из домена (ошибка realm leave)" 10 60 log_message "Ошибка при выполнении realm leave" exit 1 fi sss_cache -E /opt/config/ad_setup.sh > /dev/null whiptail --backtitle "Успешно" --title "Успех" --msgbox "АРМ успешно выведен из домена" 10 60 log_message "ПК успешно выведен из домена" exit 0 } puppet_connect() { if [ ! -f /etc/krb5.keytab ]; then whiptail --backtitle "Ошибка" --title "Ошибка" --msgbox "Для подключения к puppet, введите ПК в домен" 10 60 log_message "Ошибка puppet: ПК не введен в домен" exit 1 fi # Исправлена проверка существования файлов сертификатов if ls /etc/puppetlabs/puppet/ssl/private_keys/*.pem 1> /dev/null 2>&1; then whiptail --backtitle "Ошибка" --title "Ошибка" --msgbox "АРМ уже подключен к puppet" 10 60 log_message "АРМ уже подключен к puppet" exit 1 fi systemctl stop puppet # Убрано лишнее echo $(...) ou=$(hostname | cut -d'-' -f1 | tr '[:upper:]' '[:lower:]') log_message "Определена OU: $ou" case "$ou" in tvel) mgmt_server="tvel-s-synd01.gk.rosatom.local" ;; gren) mgmt_server="gren-s-synd01.gk.rosatom.local" ;; grenn) mgmt_server="grenn-s-synd01.gk.rosatom.local" ;; gkrs) mgmt_server="gkrs-s-synd01.gk.rosatom.local" ;; ak|sgik|uaz) mgmt_server="gkrs-s-synd02.gk.rosatom.local" ;; aepk) mgmt_server="aepk-s-synd01.gk.rosatom.local" ;; rums) mgmt_server="rums-s-synd01.gk.rosatom.local" ;; chuni) mgmt_server="chuni-s-synd01.gk.rosatom.local" ;; aem) mgmt_server="aem-s-synd01.gk.rosatom.local" ;; vnin) mgmt_server="vnin-s-synd01.gk.rosatom.local" ;; rir) mgmt_server="rir-s-synd01.gk.rosatom.local" ;; ocks) mgmt_server="ocks-s-synd01.gk.rosatom.local" ;; cpti) mgmt_server="cpti-s-synd01.gk.rosatom.local" ;; rcr) mgmt_server="rcr-s-synd01.gk.rosatom.local" ;; cifr) mgmt_server="cifr-s-synd01.gk.rosatom.local" ;; rep) mgmt_server="rep-s-synd01.gk.rosatom.local" ;; rnr) mgmt_server="rnr-s-synd01.gk.rosatom.local" ;; nw) mgmt_server="nw-s-synd01.gk.rosatom.local" ;; cpir) mgmt_server="cpir-s-synd01.gk.rosatom.local" ;; rmt) mgmt_server="rmt-s-synd01.gk.rosatom.local" ;; tens) mgmt_server="tens-s-synd01.gk.rosatom.local" ;; *) mgmt_server=$(whiptail --backtitle "Ручной ввод" --title "Неизвестная OU: $ou" \ --inputbox "OU не определена, просьба сообщить об этом на yaprodunov@greenatom.ru\n\nПример сервера: gkrs-s-synd01.gk.rosatom.local\n\nВведите адрес сервера Puppet вручную:" \ 14 60 "" 3>&1 1>&2 2>&3) # Проверяем, не нажал ли пользователь Cancel if [[ $? -ne 0 ]]; then log_message "Отмена ввода сервера Puppet вручную" exit 1 fi # Проверяем, что поле не пустое (если нажали OK) if [[ -z "$mgmt_server" ]]; then whiptail --backtitle "Ошибка" --title "Ошибка" --msgbox "Не указан сервер управления. Подключение к Puppet прервано." 10 60 log_message "Ошибка: Не указан сервер Puppet для неизвестной OU: $ou" exit 1 fi ;; esac case "$ou" in gren|grenn|gkrs|tens) environment="new_base" ;; *) environment="base" ;; esac log_message "Настройка Puppet: Сервер=$mgmt_server, Окружение=$environment" cat < /etc/puppetlabs/puppet/puppet.conf [main] server = $mgmt_server runinterval = 60m environment = $environment EOF puppet agent -t > /tmp/puppet_first.log 2>&1 if grep -q "does not match its private key" /tmp/puppet_first.log; then whiptail --backtitle "Ошибка" --title "Ошибка" --msgbox "Удалите старый сертификат на сервере управления" 10 60 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 # Проверяем, стартанул ли puppet if ! systemctl start puppet; then whiptail --backtitle "Внимание" --title "Внимание" --msgbox "Подключение к Puppet выполнено, но службу запустить не удалось. Проверьте статус вручную." 10 60 log_message "Предупреждение: службу puppet запустить не удалось" else log_message "Служба Puppet успешно запущена" fi whiptail --backtitle "Успешно" --title "Успех" --msgbox "АРМ успешно подключен к puppet-серверу $mgmt_server" 10 60 log_message "АРМ успешно подключен к puppet-серверу $mgmt_server" } # основной блок TITLE="Утилита для настройки ПК" MESSAGE="Выберите действие" OPTIONS=("add_domain" "Ввод в домен" "remove_domain" "Вывод из домена" "puppet_connect" "Подключение к puppet") choice=$(whiptail --title "$TITLE" --menu "$MESSAGE" 20 80 4 "${OPTIONS[@]}" 3>&1 1>&2 2>&3) retval=$? case $retval in 0) case "$choice" in "add_domain") log_message "Пользователь выбрал: Ввод в домен" add_domain ;; "remove_domain") log_message "Пользователь выбрал: Вывод из домена" remove_domain ;; "puppet_connect") log_message "Пользователь выбрал: Подключение к puppet" puppet_connect ;; esac ;; 1) log_message "Пользователь отменил выбор (Cancel)" ;; 255) log_message "Пользователь нажал Esc" ;; *) log_message "Непредвиденная ошибка выбора: код возврата $retval" ;; esac