set.sh - v1.6
Общий скрипт для ввода в домен, вывода и подключения к puppet
This commit is contained in:
@@ -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}:<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
|
||||||
Reference in New Issue
Block a user