Files
yaprodunov a24dc04ca5 set.sh - v1.6
Общий скрипт для ввода в домен, вывода и подключения к puppet
2026-07-15 10:55:59 +03:00

310 lines
13 KiB
Bash

#!/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}:<local>" >> /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 <<EOF > /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