From 2ab22e692ec88059b03f3842ac680511797466cb Mon Sep 17 00:00:00 2001 From: yaprodunov Date: Wed, 15 Jul 2026 11:54:40 +0300 Subject: [PATCH] =?UTF-8?q?802.1x=5Fdomain=5Freconnect.sh=20=D1=81=D0=BA?= =?UTF-8?q?=D1=80=D0=B8=D0=BF=D1=82,=20=D0=BE=D0=BD=20=D1=83=D1=87=D0=B8?= =?UTF-8?q?=D1=82=D1=8B=D0=B2=D0=B0=D0=B5=D1=82=20=D0=BE=D1=81=D0=BE=D0=B1?= =?UTF-8?q?=D0=B5=D0=BD=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D1=8B=20802.1=D1=85=20=D0=BF=D1=80=D0=B8=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B2=D1=82=D0=BE=D1=80=D0=BD=D0=BE=D0=BC=20=D0=B2=D0=B2?= =?UTF-8?q?=D0=BE=D0=B4=D0=B5=20=D0=B2=20=D0=B4=D0=BE=D0=BC=D0=B5=D0=BD.?= =?UTF-8?q?=20v1.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 802.1x_domain_reconnect.sh | 166 +++++++++++++++++++++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100644 802.1x_domain_reconnect.sh diff --git a/802.1x_domain_reconnect.sh b/802.1x_domain_reconnect.sh new file mode 100644 index 0000000..d4eae86 --- /dev/null +++ b/802.1x_domain_reconnect.sh @@ -0,0 +1,166 @@ +#!/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}:" >> /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}" \ No newline at end of file