#!/usr/bin/env bash
# ===========================================================================================
# Point d'entree principal (CLI parser & orchestrateur)
# ===========================================================================================
# Activation du mode securite Bash strict
set -euo pipefail
# Determination du dossier racine du script pour les chargements relatifs, on s'y deplace via la commande cd
# et on se rassure que nous y sommes bien via la commande pwd
# Note: la variable BASH_SOURCE est une commande speciale integree au shell bash initialisee des son lancement au moment de l'execution du script
# elle contient le chemin relatif ou absolu du fichier de script Bash actuellement en cours d'execution
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# Chargement du fichier de configuration et des bibliotheques
if [[ -f "${SCRIPT_DIR}/settings.env" ]]; then
# S'il existe, on le charge dans l'environnement
source "${SCRIPT_DIR}/settings.env"
else
echo "[!] ERREUR CRITIQUE: fichier de configuration settings.env introuvable." >&2
exit 1
fi
source "${SCRIPT_DIR}/lib/sanitize.sh"
source "${SCRIPT_DIR}/lib/extractor.sh"
source "${SCRIPT_DIR}/lib/anonymizer.sh"
source "${SCRIPT_DIR}/lib/compressor.sh"
# Fonction d'affichage de l'aide
usage(){
echo "Usage: $0 -d <log_directory> [-l <lines_count>]"
echo " -d <dir> Specifie le repertoire contenant les journeaux a analyser (obligatoire)."
echo " -l <lines Specifie le nombre de lignes a extraire par fichier (defaut: ${DEFAULT_LINES})."
echo " -h Affiche ce message d'aide."
}
# Initialiation des variables
LOG_DIR=""
LINES_COUNT="${DEFAULT_LINES}"
# Parsing des options CLI via getopts (repertoire cible et nombre de lignes)
while getopts ":d:l:h" opt; do
case "${opt}" in
d) LOG_DIR="${OPTARG}";;
l) LINES_COUNT="${OPTARG}";;
h) usage;;
:\?) echo "[!] Option inconnue: -${OPTARG}" >&2; usage;;
:) echo "[!] L'option -${OPTARG} requiert un argument." >&2; usage;;
esac
done
# Verification des arguments obligatoire (repertoire cible)
if [[ -z "${LOG_DIR}" ]]; then
echo "[!] ERREUR: Le parametre -d <dir> est obligatoire." >&2
usage
fi
# Application de substitution conditionnelle (au cas ou les arguements optionnels n'auraient pas ete fournis: nombre de lignes a lire)
LINES_COUNT="${LINES_COUNT:-$DEFAULT_LINES}"
# Controle de securite : EUID
if ! check_privileges; then
exit 1 # Utilisateur non root, on met fin au processus
fi
# Controle de securite : Sanitisation du repertoire
if ! sanitize_directory "${LOG_DIR}"; then
exit 2 # Repertoire vide ou autre erreur liee aux controles internes (cf module sanitize.sh)
fi
# Pipeline d'extraction, anonymisation et compression (via des tuples)
echo "[*] Demarrage de l'extraction et de l'anonymisation dans ${LOG_DIR}"
ARCHIVE_PATH=$(extract_logs "${LOG_DIR}" "${LINES_COUNT}" | anonymize_stream | compress_and_export ".")
if [[ -n "${ARCHIVE_PATH}" && -f "${ARCHIVE_PATH}" ]] ; then
echo "[!] Rapport genere et anonymise avec succes: ${ARCHIVE_PATH}"
exit 0
else
echo "[!] Echec de la generation du rapport." >&2
return 3
fi