Files
just_scripts/802.1x_domain_reconnect.sh
T
yaprodunov 2ab22e692e 802.1x_domain_reconnect.sh
скрипт, он учитывает особенности работы 802.1х при повторном вводе в домен.
v1.0
2026-07-15 11:54:40 +03:00

166 lines
7.0 KiB
Bash

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