From a24dc04ca5934d3159c69d4052d69b6f74b3dce9 Mon Sep 17 00:00:00 2001 From: yaprodunov Date: Wed, 15 Jul 2026 10:55:59 +0300 Subject: [PATCH] =?UTF-8?q?set.sh=20-=20v1.6=20=D0=9E=D0=B1=D1=89=D0=B8?= =?UTF-8?q?=D0=B9=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=B2=D0=B2=D0=BE=D0=B4=D0=B0=20=D0=B2=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD,=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=D0=B0=20?= =?UTF-8?q?=D0=B8=20=D0=BF=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BA=20puppet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- set.sh | 309 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 309 insertions(+) create mode 100644 set.sh diff --git a/set.sh b/set.sh new file mode 100644 index 0000000..2934e1f --- /dev/null +++ b/set.sh @@ -0,0 +1,309 @@ +#!/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