#!/bin/bash


#================================================================================
# Алгоритм
#================================================================================

# ! Запуск должен быть произведён от рута
# ! Система должна быть в режиме Advanced или выше
#
# HDD обрабатываем SecDel'ом
# SSD обрабатываем FSTrim'ом (если не поддерживает то SecDel'ом)
#
# SSH ключи администратора не должны быть затёрты
#
# ? На каком типе диска HOME_DIR
#   - SSD
#       ? Устройство является съёмным
#           - Да, работаем как с HDD
#           - Нет
#               ? Диск поддерживает TRIM?
#                   - Да, удаляем все файлы HOME_DIR юзера (кроме исключений) и используем fstream на раздел после удаления файлов пользователя.
#                   - Нет, работаем как с HDD
#   - HDD
#       ? secdel активен
#           - Нет, включаем
#           - Да
#               ? Контролирует ли secdel раздел, на котором находится homedir юзер
#                   - Нет, добавляем разделу secdel, перемонтируем раздел на лету
#                   - Да,удаляем все файлы HOME_DIR юзера (кроме исключений). Зачистка данных происходит автоматом. Вернём систему в исходное состояние

#================================================================================
# Инициализация
#================================================================================

# Определяем местоположение скрипта
SCRIPT_PATH=$(dirname "$(readlink -f "$0")")
# Импортируем функции
source $SCRIPT_PATH/super_user_check
source $SCRIPT_PATH/astra-mobile-clean-constants
source $SCRIPT_PATH/astra-mobile-clean-functions

check_root_rights
# Работа функционала доступна только в режиме 'Advanced' и выше!
checkExecutionAllowed

declare -a USERS

# Если список парамеров пуст
if [[ -z "$@" ]]; then
    # Запросим список всех пользователей системы
    userList USERS
    echo "Clear all users home!"
else
    # Получаем список пользователей из параметров
    USERS=( $@ )
    echo "Clear users: [${USERS[@]}] home!"
fi

#================================================================================
# Функции
#================================================================================
## @initExclusions
## @brief - Функция инициализирует список исключений
## Исключениями являются:
##  1) SSH ключи администратора
function initExclusions() {
    declare -a ADMIN_LIST
    adminList ADMIN_LIST

    for User in "${ADMIN_LIST[@]}"
    do
        SshDir="$(userGetHomeDir $User)/.ssh"

        if [ -d "$SshDir" ]; then
            local Files=()
            findFiles "$SshDir" '*' Files

            for File in "${Files[@]}"
            do
                #  Проверяем что файл является ключём
                Err=$(ssh-keygen -l -f "$File" 2>&1 >/dev/null)

                if [ -z "$Err" ]; then
                    exclusionsAdd "$File"
                fi
            done
        fi
    done
}

## appendExclusionsForUser
## @brief - Функция добавит исключения для директории пользователя
## @param $1 - Путь к директории пользователя
function appendExclusionsForUser() {
    local IN_USER_HOME_DIR="$1"

    for ((i=0; i < ${#DEFAULT_WHITE_LIST[@]}; ++i))
    do
        exclusionsAdd "$IN_USER_HOME_DIR/${DEFAULT_WHITE_LIST[$i]}"
    done
}

#================================================================================
# main
#================================================================================

# На всякий случай удалим список исключений
exclusionsClear
# Инициализируем список исключений
initExclusions

# Пустой список директорий для обработки через SecDel
DirsToSecDel=()
# Пустой список директорий для обработки через fstrim
DirsToFsTrim=()

# Обрабатываем данные для всех пользователей
for User in ${USERS[@]}
do
    # Пропустим системных пользователей
    if [ $(id -u "$User") -lt 1000 ]; then continue; fi
    # Получим домашнюю директорию пользователя
    UserHomeDir="$(userGetHomeDir "$User")"

    # Рассматриваем только пользователя с домашней директорией
    if [ -d "$UserHomeDir" ]; then
        # Получаем системный раздел, на котором находится директория пользователя
        DirDriveName=$(driveNameByPartition $(drivePartitionByPartFS "$UserHomeDir"))
        # Определяем режим обработки для раздела
        ProcessMode=$(useMode $DirDriveName)

        # Разделим директории для разных режимов обработки
        if [ $ProcessMode == $FSTRIM_MODE ]; then
            DirsToFsTrim[${#DirsToFsTrim[*]}]="$UserHomeDir"
        else
            DirsToSecDel[${#DirsToSecDel[*]}]="$UserHomeDir"
        fi

        # Добавим исключения для данного пользователя
        appendExclusionsForUser "$UserHomeDir"
    fi
done

# Обрабатываем директории соответствующим методом
processDirsFSTrim DirsToFsTrim
processDirsSecDel DirsToSecDel

# Очищаем список исключений
exclusionsClear
#================================================================================
