#!/bin/bash
# Очистка серверного кэша 1С:Предприятие (Linux)
# Запуск: sudo ./clear_1c_server_cache.sh

set -euo pipefail

echo "============================================"
echo " Очистка кэша сервера 1С:Предприятие (Linux)"
echo "============================================"
echo ""

# --- Проверка прав ---
if [[ $EUID -ne 0 ]]; then
    echo "ОШИБКА: Запустите скрипт с правами root (sudo)"
    exit 1
fi

# --- Определение служб 1С (может быть несколько) ---
SERVICES=()

# Ищем все запущенные и остановленные юниты содержащие srv1cv8
while IFS= read -r svc; do
    [[ -n "$svc" ]] && SERVICES+=("$svc")
done < <(systemctl list-units --full --all --no-legend 2>/dev/null \
    | awk '{print $1}' | grep 'srv1cv8' || true)

# Fallback: ищем через list-unit-files если выше ничего не нашли
if [[ ${#SERVICES[@]} -eq 0 ]]; then
    while IFS= read -r svc; do
        [[ -n "$svc" ]] && SERVICES+=("$svc")
    done < <(systemctl list-unit-files --no-legend 2>/dev/null \
        | awk '{print $1}' | grep 'srv1cv8' || true)
fi

# Fallback: старый sysvinit/service
if [[ ${#SERVICES[@]} -eq 0 ]]; then
    while IFS= read -r svc; do
        [[ -n "$svc" ]] && SERVICES+=("$svc")
    done < <(service --status-all 2>/dev/null \
        | awk '{print $NF}' | grep 'srv1cv8' || true)
fi

# --- Остановка служб ---
if [[ ${#SERVICES[@]} -eq 0 ]]; then
    echo "[1/3] ПРЕДУПРЕЖДЕНИЕ: Службы 1С не найдены, продолжаем без остановки..."
else
    echo "[1/3] Найдены службы:"
    for svc in "${SERVICES[@]}"; do
        echo "      - $svc"
    done
    echo ""
    echo "      Останавливаем..."
    for svc in "${SERVICES[@]}"; do
        systemctl stop "$svc" 2>/dev/null || service "$svc" stop 2>/dev/null || true
    done

    # Ждём реального завершения процессов
    echo "      Ожидаем завершения процессов..."
    for proc in ragent rmngr rphost; do
        timeout 15 bash -c "while pgrep -x $proc > /dev/null; do sleep 1; done" \
            || pkill -9 -x "$proc" 2>/dev/null || true
    done
    echo "      Службы остановлены."
fi

# --- Определение путей к кэшу ---
echo ""
echo "[2/3] Поиск и удаление кэша snccntx*..."

SEARCH_PATHS=(
    "/home/usr1cv8/.1cv8/1C/1cv8"       # Debian/Ubuntu (deb-пакет)
    "/var/opt/1C/v8.3/x86_64"           # RPM-based (CentOS/RHEL)
    "/var/opt/1C/v8.3/i386"             # 32-bit RPM
    "/opt/1cv8/srvinfo"                 # Ручная установка вариант 1
    "/opt/1C/v8.3/x86_64/srvinfo"       # Ручная установка вариант 2
    "/opt/1C/v8.3/i386/srvinfo"
)

# Добавляем home-директорию пользователя usr1cv8 если отличается от стандартной
USR_HOME=$(getent passwd usr1cv8 2>/dev/null | cut -d: -f6 || true)
if [[ -n "$USR_HOME" && "$USR_HOME" != "/home/usr1cv8" ]]; then
    SEARCH_PATHS+=("${USR_HOME}/.1cv8/1C/1cv8")
fi

DELETED=0

for base in "${SEARCH_PATHS[@]}"; do
    # Перебираем все кластеры reg_* внутри каждого пути
    for reg_dir in "${base}"/reg_*/; do
        [[ -d "$reg_dir" ]] || continue
        for snc_dir in "${reg_dir}"snccntx*/; do
            [[ -d "$snc_dir" ]] || continue
            echo "      Удаление: $snc_dir"
            rm -rf "$snc_dir"
            DELETED=$((DELETED + 1))
        done
    done
done

if [[ $DELETED -eq 0 ]]; then
    echo "      Папки snccntx* не найдены (возможно уже чисто)"
else
    echo "      Удалено папок: $DELETED"
fi

# --- Очистка /tmp ---
echo ""
echo "[3/3] Очистка временных файлов 1С в /tmp..."
find /tmp -name "1Cv8*" -delete 2>/dev/null \
    && echo "      /tmp очищен" \
    || echo "      /tmp — нечего удалять"

# --- Запуск служб ---
echo ""
if [[ ${#SERVICES[@]} -gt 0 ]]; then
    echo "Запускаем службы..."
    for svc in "${SERVICES[@]}"; do
        systemctl start "$svc" 2>/dev/null || service "$svc" start 2>/dev/null || true
    done
    sleep 3

    # Проверка статуса каждой службы
    ALL_OK=true
    for svc in "${SERVICES[@]}"; do
        if systemctl is-active --quiet "$svc" 2>/dev/null; then
            echo "      ✓ $svc — запущена"
        else
            echo "      ✗ $svc — не запустилась, проверьте: systemctl status $svc"
            ALL_OK=false
        fi
    done

    if [[ "$ALL_OK" == false ]]; then
        echo ""
        echo "ПРЕДУПРЕЖДЕНИЕ: Одна или несколько служб не запустились!"
    fi
fi

echo ""
echo "============================================"
echo " Готово! Время: $(date)"
echo "============================================"