#!/bin/bash

# Функция для вывода цветных сообщений
color_echo() {
    local color=$1
    local message=$2
    case $color in
        red)    echo -e "\033[31m$message\033[0m" ;;
        green)  echo -e "\033[32m$message\033[0m" ;;
        yellow) echo -e "\033[33m$message\033[0m" ;;
        blue)   echo -e "\033[34m$message\033[0m" ;;
        *)      echo -e "$message" ;;
    esac
}

# Запрос имени или IP машины
read -p "Введите имя или IP машины: " remote_host

# Запрос пароля SSH
read -s -p "Введите пароль SSH для пользователя 'administrator': " ssh_password
echo ""

# Функция для выполнения команд через SSH
run_ssh_command() {
    sshpass -p "$ssh_password" ssh -o StrictHostKeyChecking=no -o ConnectTimeout=5 administrator@"$remote_host" "$1"
}

# Проверка доступности хоста
check_host_availability() {
    if ! ping -c 1 -W 2 "$remote_host" &> /dev/null; then
        color_echo red "Хост $remote_host недоступен по ICMP"
        exit 1
    fi

    if ! run_ssh_command "exit" &> /dev/null; then
        color_echo red "Не удалось подключиться к $remote_host по SSH"
        exit 1
    fi
}

# Функция для проверки и перезапуска SSSD
check_and_restart_sssd() {
    color_echo blue "\n=== Проверка статуса SSSD ==="
    local status_output=$(run_ssh_command "sudo systemctl status sssd 2>&1")
    echo "$status_output"

    if echo "$status_output" | grep -q "Preauthentication failed"; then
        color_echo yellow "Обнаружена ошибка: Preauthentication failed. Пытаюсь перезапустить SSSD..."
        run_ssh_command "sudo systemctl restart sssd"

        # Проверяем снова после перезапуска
        local new_status=$(run_ssh_command "sudo systemctl status sssd 2>&1")
        echo "$new_status"

        if echo "$new_status" | grep -q "Preauthentication failed"; then
            color_echo yellow "Ошибка сохраняется. Пытаюсь синхронизировать время..."
            run_ssh_command "sudo ntpdate -u pool.ntp.org"

            # Последняя проверка
            local final_status=$(run_ssh_command "sudo systemctl status sssd 2>&1")
            echo "$final_status"

            if echo "$final_status" | grep -q "Preauthentication failed"; then
                color_echo red "Ошибка не устранена. Возможные причины:"
                color_echo red "1. Проблемы с подключением к домену"
                color_echo red "2. Неправильные учетные данные"
                color_echo red "3. Проблемы с сетью или сервером домена"
                color_echo red "4. Неправильные настройки времени"
            fi
        fi
    else
        color_echo green "SSSD работает нормально"
    fi
}

# Функция для проверки nsswitch.conf
check_nsswitch() {
    color_echo blue "\n=== Проверка /etc/nsswitch.conf ==="
    local nsswitch_content=$(run_ssh_command "cat /etc/nsswitch.conf")
    local expected_content=$(cat << 'EOF'
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd:         files sss
group:          files sss
shadow:         files sss
gshadow:        files

hosts:          files dns mdns4_minimal [NOTFOUND=return]
networks:       files

protocols:      db files
services:       db files sss
ethers:         db files
rpc:            db files

netgroup:       nis sss
sudoers: files sss

automount:      sss
EOF
)

    if [ "$nsswitch_content" != "$expected_content" ]; then
        color_echo yellow "Конфигурация /etc/nsswitch.conf не соответствует шаблону"
        color_echo yellow "Создаю резервную копию и заменяю файл..."
        run_ssh_command "sudo cp /etc/nsswitch.conf /home/administrator/Desktop/nsswitch.conf.bak"
        echo "$expected_content" | run_ssh_command "sudo tee /etc/nsswitch.conf > /dev/null"
        color_echo green "Файл /etc/nsswitch.conf заменен на стандартный"
    else
        color_echo green "Конфигурация /etc/nsswitch.conf в порядке"
    fi
}

# Функция для проверки 99-regald
check_regald() {
    color_echo blue "\n=== Проверка /etc/X11/Xsession.d/99-regald ==="
    local regald_content=$(run_ssh_command "cat /etc/X11/Xsession.d/99-regald 2>/dev/null")
    local expected_content=$(cat << 'EOF'
#!/bin/bash
HST=`hostname -s`
HST_FQDN=`hostname --fqdn`
DTTM=`date "+%x %X"`
CPU=`lscpu | grep -oP 'Имя модели:\s*\K.*'`
BVER=`cat /etc/astra/build_version`
( ping -W 1 -c1 172.21.0.5 &>/dev/null|| ping -W 1 -c1 172.21.0.6 &>/dev/null) && ( \
ipa user-mod $USER --postalcode="$HST logon $DTTM" &>/dev/null ; \
ipa host-mod $HST_FQDN --desc="$USER logon $DTTM $CPU $BVER" &>/dev/null )
EOF
)

    if [ -z "$regald_content" ]; then
        color_echo yellow "Файл /etc/X11/Xsession.d/99-regald не существует"
    elif [ "$regald_content" != "$expected_content" ]; then
        color_echo yellow "Содержимое /etc/X11/Xsession.d/99-regald не соответствует шаблону"
    else
        color_echo green "Файл /etc/X11/Xsession.d/99-regald в порядке"
    fi
}

# Функция для проверки VIPNet и конфигурации DNS
check_vipnet_and_dns() {
    color_echo blue "\n=== Проверка VIPNet и DNS ==="
    vipnet_check=$(run_ssh_command "cat /etc/vipnet.conf 2>&1")

    if [[ "$vipnet_check" == *"Нет такого файла или каталога"* ]]; then
        color_echo green "VIPNet не установлен"
    else
        color_echo green "VIPNet установлен"
        echo "$vipnet_check"

        # Проверяем конфигурацию resolv.conf
        resolv_check=$(run_ssh_command "grep '^options use-vc' /etc/resolv.conf 2>&1")

        if [ -z "$resolv_check" ]; then
            color_echo yellow "Опция 'use-vc' не найдена в /etc/resolv.conf"
            color_echo yellow "Исправляю конфигурацию сети..."

            # Получаем имя активного подключения и изменяем настройки
            run_ssh_command "sudo bash -c '\
                NCONN=\$(nmcli -t -f name connection show --active | head -n1); \
                nmcli connection modify \$NCONN ipv4.dns-options \"use-vc\"; \
                systemctl restart NetworkManager'"

            color_echo green "Настройки сети обновлены, NetworkManager перезапущен"
        else
            color_echo green "Конфигурация /etc/resolv.conf в порядке (use-vc присутствует)"
        fi
    fi
}

# Функция для проверки версии Astra и aldpro-client
check_system_info() {
    color_echo blue "\n=== Информация о системе ==="

    # Версия Astra
    astra_version=$(run_ssh_command "cat /etc/astra_version 2>/dev/null || echo 'Не удалось определить версию Astra'")
    color_echo green "Версия Astra: $astra_version"

    # Версия aldpro-client
    aldpro_version=$(run_ssh_command "dpkg -l aldpro-client 2>/dev/null | grep '^ii' | awk '{print \$3}' | cut -d'-' -f1 || echo 'не установлен'")
    color_echo green "Версия aldpro-client: ${aldpro_version}"

    # Содержимое /home/
    color_echo blue "\n=== Содержимое /home/ ==="
    run_ssh_command "ls -la /home/"
}

# Основное выполнение скрипта
main() {
    check_host_availability
    check_system_info
    check_vipnet_and_dns
    check_nsswitch
    check_regald
    check_and_restart_sssd

    color_echo green "\nПроверка завершена"
}

main
