From 8bdbfd8b9352c47fec8f789efe7017b6dd396dd2 Mon Sep 17 00:00:00 2001 From: cedricAbonnel Date: Fri, 5 Jul 2024 22:29:55 +0200 Subject: [PATCH] trop de modifications --- .config/files_local-bin | 5 +- local/bin/check_sha256.sh | 28 ++++ local/bin/check_smart.sh | 99 +++++++++++++ local/bin/generate_playlist.sh | 167 +++++++++++++++++++-- local/bin/generate_playlist_fp.php | 217 ++++++++++++++++++++++++++++ local/bin/update_bullseye2buster.sh | 77 ++++++++++ local/bin/updateall | 69 --------- local/bin/updateall.sh | 177 +++++++++++++++++++++++ 8 files changed, 755 insertions(+), 84 deletions(-) create mode 100755 local/bin/check_sha256.sh create mode 100755 local/bin/check_smart.sh create mode 100644 local/bin/generate_playlist_fp.php create mode 100644 local/bin/update_bullseye2buster.sh delete mode 100755 local/bin/updateall create mode 100755 local/bin/updateall.sh diff --git a/.config/files_local-bin b/.config/files_local-bin index 02020a1..cb08b22 100644 --- a/.config/files_local-bin +++ b/.config/files_local-bin @@ -1,10 +1,13 @@ updateall +check_sha256.sh +generate_playlist.sh +generate_playlist_fp.php +check_smart.sh convertMKV.sh castopod_update.sh mkv_extract.sh podcast_convertImage.sh random_music_player.sh play_tophaire.sh -generate_playlist.sh convertPDF.sh check_domain_cert.sh diff --git a/local/bin/check_sha256.sh b/local/bin/check_sha256.sh new file mode 100755 index 0000000..cc3f324 --- /dev/null +++ b/local/bin/check_sha256.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# Vérifie si le bon nombre d'arguments est fourni +if [ "$#" -ne 2 ]; then + echo "Usage: $0 " + exit 1 +fi + +expected_hash=$1 +file_path=$2 + +# Vérifie si le fichier existe +if [ ! -f "$file_path" ]; then + echo "Error: File $file_path does not exist." + exit 1 +fi + +# Calculer le hash SHA-256 du fichier et le comparer avec le hash attendu +echo "$expected_hash $file_path" | sha256sum -c - > /dev/null 2>&1 + +# Vérifier le code de sortie de sha256sum +if [ $? -eq 0 ]; then + echo "Hash match: OK" + exit 0 +else + echo "Hash match: FAILED" + exit 1 +fi diff --git a/local/bin/check_smart.sh b/local/bin/check_smart.sh new file mode 100755 index 0000000..2e610b5 --- /dev/null +++ b/local/bin/check_smart.sh @@ -0,0 +1,99 @@ +#!/bin/bash + +# Fonction de hachage SHA-256 +hash_serial() { + echo -n "$1" | sha256sum | awk '{print $1}' +} + +# Fonction pour exécuter le script avec sudo +run_with_sudo() { + sudo "$0" "$@" + exit $? +} + +# Envoi des infos +send_tracker() { + # Envoyer les données au site checksmart.abonnel.fr via HTTP POST avec la date et l'heure + status_disk=$1 + date_time=$(date "+%Y-%m-%d %H:%M:%S") + echo "Envoi des données sur smartctl.abonnel.fr" + curl -d "serial_number=$hashed_serial&data=$status_disk&date_time=$date_time" https://checksmart.abonnel.fr/api/submit + echo -e "\n" +} + +# Vérifier si l'utilisateur a les privilèges sudo +if [ "$EUID" -ne 0 ]; then + echo "Ce script nécessite des privilèges sudo. Tentative de relance avec sudo..." + run_with_sudo "$@" +fi + + +# Vérifier si smartctl est installé +if ! command -v smartctl &> /dev/null; then + echo "Le programme smartctl n'est pas installé sur ce système." + + # Vérifier quel gestionnaire de paquets est utilisé + if command -v apt &> /dev/null; then + read -p "Voulez-vous installer smartmontools avec apt ? (O/N) " choice + if [[ "$choice" =~ ^[oO] ]]; then + apt install smartmontools + else + echo "Installation annulée." + exit 1 + fi + elif command -v yum &> /dev/null; then + read -p "Voulez-vous installer smartmontools avec yum ? (O/N) " choice + if [[ "$choice" =~ ^[oO] ]]; then + yum install smartmontools + else + echo "Installation annulée." + exit 1 + fi + else + echo "Gestionnaire de paquets non pris en charge. Veuillez installer smartmontools manuellement." + exit 1 + fi +fi + + +# Numéro de série du disque +serial_number=$(smartctl -i /dev/sda | grep "Serial Number" | awk '{print $3}') +hashed_serial=$(hash_serial "$serial_number") + +# Récupérer la liste des disques +disks=$(lsblk -o NAME -n -d) + + +# Parcourir tous les disques et vérifier l'état SMART +for disk in $disks; do + # Date et heure actuelles + + echo "----------------------------------------------" + # Utiliser smartctl pour vérifier si le disque prend en charge SMART + if smartctl -i /dev/$disk > /dev/null 2>&1; then + echo "Vérification de l'état SMART pour le disque $disk :" + output=$(smartctl -H /dev/$disk) + if [[ "$output" =~ "PASSED" ]]; then + status="OK" + else + status="En panne" + fi + echo "État : $status" + + #echo "Lancement d'un scan pour la prochaine passe." + #smartctl -t long "/dev/$disk" + + status_disk=$(smartctl -a /dev/$disk) + send_tracker "$status_disk" + + else + echo "Le périphérique $disk ne prend pas en charge SMART et est exclu de la vérification." + echo "----------------------------------------------" + fi +done + +# URL de consultation des informations +url="https://checksmart.abonnel.fr/?hs=$hashed_serial" + +# Afficher un message pour indiquer que les données sont consultables +echo "Consultez les informations à l'adresse : $url" \ No newline at end of file diff --git a/local/bin/generate_playlist.sh b/local/bin/generate_playlist.sh index eb281ab..b9038e9 100755 --- a/local/bin/generate_playlist.sh +++ b/local/bin/generate_playlist.sh @@ -7,17 +7,32 @@ date_format=$(date +"%Y%m%d_%H%M%S") # Fonction pour afficher l'utilisation du script usage() { - echo "Utilisation : $0 [-n ] [-d ] [-o ]" + echo "Utilisation : $0 [-EU] [-n ] [-d ] [-o ]" echo "Options :" echo " -n : Nombre de fichiers à inclure dans le M3U" echo " -d : Répertoire à scanner (y compris les sous-répertoires)" echo " -o : Nom du fichier M3U de sortie" + echo " -E : Recherche des doublons basée sur l'empreinte auditive" + echo " -U : Mise à jour de la base de données" exit 1 } + +# Temps de début d'exécution +start_time=$(date +%s) + +# search_type +search_type="S" # standard + # Analyse des options de ligne de commande -while getopts "n:d:o:" opt; do +while getopts "n:d:o:EU" opt; do case $opt in + E) + search_type="E" # empreintes identiques + ;; + U) + search_type="U" # mise à jour de la base + ;; n) num_files=$OPTARG ;; @@ -34,6 +49,14 @@ while getopts "n:d:o:" opt; do esac done + +# Définition du dossier des paramètres +CONFIG_DIR=${HOME}/.config/cedrix/generate_playlist +if [ ! -d "$CONFIG_DIR" ]; then + mkdir -p ${CONFIG_DIR} +fi + + # Vérifier si le fichier user-dirs.dirs existe if [[ -f ~/.config/user-dirs.dirs ]]; then # Charger les variables depuis le fichier user-dirs.dirs @@ -43,14 +66,14 @@ if [[ -f ~/.config/user-dirs.dirs ]]; then if [[ -v XDG_MUSIC_DIR ]]; then # Le répertoire XDG_MUSIC_DIR existe mkdir -p "$XDG_MUSIC_DIR/playlists" - output_file="$XDG_MUSIC_DIR/playlists/playlist_${date_format}_${num_files}.m3u" + output_file="$XDG_MUSIC_DIR/playlists/playlist_${date_format}.m3u" else # La variable XDG_MUSIC_DIR n'est pas définie - output_file="$HOME/playlist_${date_format}_${num_files}.m3u" + output_file="$HOME/playlist_${date_format}.m3u" fi else # Le fichier user-dirs.dirs n'existe pas - output_file="$HOME/playlist_${date_format}_${num_files}.m3u" + output_file="$HOME/playlist_${date_format}.m3u" fi @@ -60,18 +83,134 @@ if [ ! -d "$directory" ]; then usage fi -# Création d'un fichier temporaire pour stocker la liste des fichiers audio avec leur date de création +# Création d'un fichier temporaire pour stocker la liste des fichiers audio temp_file=$(mktemp) -echo "Recherche en cours des fichiers audios dans \"$directory\"" -find "$directory" -type f \( -name "*.mp3" -o -name "*.opus" -o -name "*.ogg" -o -name "*.m4a" \) -exec stat --format="%Z %n" {} + > "$temp_file" -echo "Nombre de fichiers audios trouvé dans $directory : "$(wc -l "$temp_file") +count=0 -# Création de la liste des fichiers audio les plus récents à partir du fichier temporaire -sort -n -r -o "$temp_file" "$temp_file" -head -n "$num_files" "$temp_file" | awk '{print $2}' > "$output_file" +# Si l'option -E est spécifiée, rechercher les doublons basés sur l'empreinte auditive +if [ "$search_type" == "S" ]; then + echo "Recherche en cours des $num_files derniers fichiers audios dans \"$directory\"" + find "$directory" -type f \( -name "*.mp3" -o -name "*.opus" -o -name "*.ogg" -o -name "*.m4a" \) -exec stat --format="%Z %n" {} + > "$temp_file" + + echo "Nombre de fichiers audios trouvé dans $directory : "$(wc -l "$temp_file") + + # Création de la liste des fichiers audio les plus récents à partir du fichier temporaire + sort -n -r -o "$temp_file" "$temp_file" + head -n "$num_files" "$temp_file" | awk '{print $2}' > "$output_file" + +elif [ "$search_type" == "E" ]; then + # Code pour rechercher les doublons basés sur l'empreinte auditive + echo "Option -E spécifiée : Recherche des doublons basés sur l'empreinte auditive. Veuillez patienter ..." + + # Chemin de la base de données SQLite + db_file=${CONFIG_DIR}/database.sqlite + + # Requête SQL pour récupérer les fichiers avec des empreintes identiques + query="SELECT acoustid, GROUP_CONCAT(file_id) AS file_ids, COUNT(*) AS count + FROM metadata + GROUP BY acoustid + HAVING count > 1;" + + # Exécuter la requête SQL et afficher les résultats + sqlite3 "$db_file" "$query"| while IFS='|' read -r acoustid file_ids count; do + echo "Empreinte digitale ID : $acoustid" + echo "Fichiers associés : $file_ids" + echo "Nombre de fichiers : $count" + echo "-------------------------" +done + + exit + +elif [ "$search_type" == "U" ]; then + # Code pour rechercher les doublons basés sur l'empreinte auditive + echo "Mise à jour de la base de données. Le traitement peut être un peu long. Veuillez patienter ..." + + # Vérifier si fpcalc est installé et l'installer si nécessaire + if ! command -v fpcalc &>/dev/null; then + echo "Téléchargement de fpcalc..." + mkdir -p "$HOME/.local/bin" + wget -O /tmp/chromaprint.tar.gz https://github.com/acoustid/chromaprint/releases/download/v1.5.1/chromaprint-fpcalc-1.5.1-linux-x86_64.tar.gz + tar -xzf /tmp/chromaprint.tar.gz -C "$HOME/.local/bin" --strip-components=1 + rm /tmp/chromaprint.tar.gz + chmod +x "$HOME/.local/bin/fpcalc" + echo "fpcalc installé avec succès." + fi + + + # Vérifier si PHP est installé + if ! command -v php &>/dev/null; then + echo "PHP n'est pas installé. Installation en cours..." + if command -v dnf &>/dev/null; then + sudo dnf install -y php + elif command -v apt &>/dev/null; then + sudo apt install -y php + elif command -v yum &>/dev/null; then + sudo yum install -y php + else + echo "Système de gestion de paquets non pris en charge." + exit 1 + fi + echo "PHP installé avec succès." + fi + + # Vérifier si SQLite pour PHP est installé + if ! php -m | grep -q "sqlite3"; then + echo "SQLite pour PHP n'est pas installé. Installation en cours..." + if command -v dnf &>/dev/null; then + sudo dnf install -y php-sqlite3 + elif command -v apt &>/dev/null; then + sudo apt install -y php-sqlite3 + elif command -v yum &>/dev/null; then + sudo yum install -y php-sqlite3 + else + echo "Système de gestion de paquets non pris en charge." + exit 1 + fi + echo "SQLite pour PHP installé avec succès." + fi + + # Chemin de la base de données SQLite + db_file=${CONFIG_DIR}/database.sqlite + + # Chemin complet du script PHP + php_script="$(dirname "$0")/generate_playlist_fp.php" + + # Appeler le script PHP avec les paramètres appropriés + php "$php_script" "$directory" "$db_file" + + +fi + +echo -e " and more...\n" # Suppression du fichier temporaire -rm "$temp_file" +rm -v "$temp_file" -echo "Le fichier M3U a été créé avec les $num_files fichiers audio les plus récents dans le répertoire $directory : $output_file" + + +# ajout du nombre de fichiers de la playlist dans le nom du fichier +num_files_real=$(wc -l $output_file) + +# Extraire le nom de fichier sans l'extension +filename_without_extension="${output_file%.*}" + +# Extraire l'extension du fichier +extension="${original_file##*.}" + +# Construire le nouveau nom de fichier avec num_files_real ajouté avant l'extension +output_new_file="${filename_without_extension}_${num_files_real}.${extension}" + +mv -v "${output_file}" "${output_new_file}" + + +echo "Le fichier M3U a été créé avec les $num_files_real fichiers audio les plus récents dans le répertoire $directory : $output_file" + + +# Temps de fin d'exécution +end_time=$(date +%s) + +# Calcul du temps écoulé +execution_time=$((end_time - start_time)) + +echo "Temps d'exécution: $execution_time secondes" diff --git a/local/bin/generate_playlist_fp.php b/local/bin/generate_playlist_fp.php new file mode 100644 index 0000000..9c70169 --- /dev/null +++ b/local/bin/generate_playlist_fp.php @@ -0,0 +1,217 @@ +&1", $output, $return_code); + // Vérifier s'il y a eu une erreur lors de l'exécution de la commande + if ($return_code !== 0) { + // Enregistrer l'erreur dans un fichier journal par exemple + error_log("Erreur lors du calcul du fingerprint pour le fichier \"$file_bash\" : " . implode("\n", $output)); + return null; // Retourner null pour indiquer une erreur + } + + // Traitement de la réponse + $result = json_decode(implode('', $output), true); + + // Vérifier si le résultat est valide + if (isset($result['fingerprint'])) { + return $result['fingerprint']; // Retourner le fingerprint + } else { + // Enregistrer un message d'erreur dans le journal + error_log("Réponse invalide lors du calcul du fingerprint pour le fichier $file : " . implode("\n", $output)); + return null; // Retourner null en cas de réponse invalide + } +} + + +function getTagValue($metadataInFile, $tagKey) { + // Vérifier si la clé existe dans le tableau et retourner sa valeur si c'est le cas + if (isset($metadataInFile['streams'][0]['tags'][$tagKey])) { + return $metadataInFile['streams'][0]['tags'][$tagKey]; + } else { + // Retourner null si la clé n'existe pas + return null; + } +} + + +// Fonction pour extraire les métadonnées d'un fichier audio +function extract_metadata($file) { + + # Extraire les métadonnées avec ffprobe + $ffprobe_output = shell_exec("ffprobe -hide_banner -loglevel fatal -show_error -show_format -show_streams -print_format json \"$file\""); + + // Décoder la sortie JSON + $metadataInFile = json_decode($ffprobe_output, true); + + // Vérifier si les métadonnées contiennent les tags + if (isset($metadataInFile['streams'][0]['tags'])) { + + + // Extraire les metadonnées + $metadata['ARTIST'] = getTagValue($metadataInFile, 'ARTIST'); + $metadata['TITLE'] = getTagValue($metadataInFile, 'TITLE'); + $metadata['ALBUM'] = getTagValue($metadataInFile, 'ALBUM'); + $metadata['ACOUSTID'] = getTagValue($metadataInFile, 'ACOUSTID_ID'); + $metadata['duration'] = isset($metadataInFile['format']['duration']) ? (float)$metadataInFile['format']['duration'] : null; + + } + + + if (isset($metadata)) { + return $metadata; + } else { + return null; + } + + +} + +// Vérifier si le nombre de paramètres est correct +if ($argc != 3) { + die("Usage: php scan_files.php \n"); +} + +$directory = $argv[1]; +$db_file = $argv[2]; + +// Vérifier si le dossier existe +if (!is_dir($directory)) { + die("Le dossier spécifié n'existe pas.\n"); +} + +// Vérifier si la base de données existe, sinon la créer +if (!file_exists($db_file)) { + echo "La base de données n'existe pas. Création en cours...\n"; + $db = new PDO("sqlite:$db_file"); + $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + + // Créer les tables + $db->exec("CREATE TABLE IF NOT EXISTS files ( + id INTEGER PRIMARY KEY, + file_path TEXT UNIQUE, + first_referenced DATETIME, + last_updated DATETIME + )"); + $db->exec("CREATE TABLE IF NOT EXISTS fingerprints ( + id INTEGER PRIMARY KEY, + file_id INTEGER UNIQUE, + fingerprint TEXT, + FOREIGN KEY (file_id) REFERENCES files(id) + )"); + $db->exec("CREATE TABLE IF NOT EXISTS metadata ( + file_id INTEGER PRIMARY KEY, + artist TEXT, + title TEXT, + album TEXT, + duration REAL, + acoustid TEXT, + FOREIGN KEY (file_id) REFERENCES files(id) + )"); + + // Création de la table system_info si elle n'existe pas déjà + $db->exec("CREATE TABLE IF NOT EXISTS system_info ( + id INTEGER PRIMARY KEY, + version INTEGER NOT NULL + )"); + + // Insertion des données de version + $version = "1"; + $insert_version_sql = "INSERT INTO system_info (version) VALUES (:version)"; + $stmt = $db->prepare($insert_version_sql); + $stmt->bindParam(':version', $version, PDO::PARAM_STR); + $stmt->execute(); + + echo "Base de données créée avec succès.\n"; +} else { + // Connexion à la base de données SQLite + $db = new PDO("sqlite:$db_file"); +} + +// Préparation de la requête d'insertion des fichiers +$insert_file_stmt = $db->prepare("INSERT INTO files (file_path, first_referenced, last_updated) VALUES (:file_path, DATETIME('now'), DATETIME('now'))"); + +// Préparer la requête SQL d'insertion ou de mise à jour des empreintes digitales +$insert_fingerprint_sql = "INSERT INTO fingerprints (file_id, fingerprint) + VALUES (:file_id, :fingerprint) + ON CONFLICT(file_id) DO UPDATE + SET fingerprint = :fingerprint"; + +$insert_fingerprint_stmt = $db->prepare($insert_fingerprint_sql); + +// Préparer la requête SQL d'insertion ou de mise à jour des métadonnées +$insert_metadata_sql = "INSERT INTO metadata (file_id, artist, title, album, acoustid, duration) + VALUES (:file_id, :artist, :title, :album, :acoustid, :duration) + ON CONFLICT(file_id) DO UPDATE + SET artist = :artist, + title = :title, + album = :album, + acoustid = :acoustid, + duration = :duration"; + +$insert_metadata_stmt = $db->prepare($insert_metadata_sql); + +$count = 0; // Initialisation du compteur + +// Parcourir les fichiers audio +$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory)); +foreach ($iterator as $file) { + + $file_bash = escapeshellarg($file); + + if ($file->isFile() && in_array($file->getExtension(), ['mp3', 'opus', 'ogg', 'm4a'])) { + + if ($count % 10 == 0) { + echo "\rProgress: $count files processed\n"; + } + + $file_path = $file->getPathname(); + + // Vérifier si le fichier existe déjà dans la base de données + $result = $db->query("SELECT id FROM files WHERE file_path = " . $db->quote($file_path)); + $file_id = $result->fetchColumn(); + + if (!$file_id) { + // Insérer le fichier dans la base de données + $insert_file_stmt->execute([':file_path' => $file_path]); + $file_id = $db->lastInsertId(); + + // Calculer le fingerprint du fichier + // $fingerprint = calculate_fingerprint($file_path); + + // Insérer le fingerprint dans la base de données + // $insert_fingerprint_stmt->execute([':file_id' => $file_id, ':fingerprint' => $fingerprint]); + + } else { + // Mettre à jour la date de dernière mise à jour du fichier + $db->exec("UPDATE files SET last_updated = DATETIME('now') WHERE id = $file_id"); + } + + + // Extraire les métadonnées du fichier audio + $metadata = extract_metadata($file_path); + + // Insérer les métadonnées dans la base de données + $insert_metadata_stmt->execute([ + ':file_id' => $file_id, + ':artist' => isset($metadata['ARTIST']) ? $metadata['ARTIST'] : null, + ':title' => isset($metadata['TITLE']) ? $metadata['TITLE'] : null, + ':album' => isset($metadata['ALBUM']) ? $metadata['ALBUM'] : null, + ':acoustid' => isset($metadata['ACOUSTID']) ? $metadata['ACOUSTID'] : null, + ':duration' => isset($metadata['duration']) ? (int)$metadata['duration'] : null + ]); + + $count++; + } +} + +// Fermer la connexion à la base de données +$db = null; + +echo "Terminé.\n"; + +?> \ No newline at end of file diff --git a/local/bin/update_bullseye2buster.sh b/local/bin/update_bullseye2buster.sh new file mode 100644 index 0000000..8ef9677 --- /dev/null +++ b/local/bin/update_bullseye2buster.sh @@ -0,0 +1,77 @@ +#!/bin/bash + +# Fonction pour vérifier si une ligne existe déjà dans un fichier +line_exists() { + grep -Fq "$1" "$2" +} + +# Vérifie si le système est sous Buster +check_buster() { + if grep -Fq "buster" /etc/os-release; then + echo "Le système est sous Buster." + return 0 + else + echo "Le système n'est pas sous Buster." + return 1 + fi +} + +# Vérifie si non-free-firmware est configuré +check_non_free_firmware() { + if grep -Eq "non-free-firmware" /etc/apt/sources.list /etc/apt/sources.list.d/*; then + echo "Le dépôt non-free-firmware est déjà configuré." + return 0 + else + echo "Le dépôt non-free-firmware n'est pas configuré." + return 1 + fi +} + +# Met à jour les sources.list pour passer de Buster à Bullseye ou une version ultérieure +update_sources() { + local new_codename="$1" + sed -i.bak -e "s/buster/$new_codename/g" /etc/apt/sources.list /etc/apt/sources.list.d/* + echo "Mise à jour de /etc/apt/sources.list et /etc/apt/sources.list.d/* pour passer à $new_codename." +} + +# Ajoute non-free-firmware aux sources.list si nécessaire +add_non_free_firmware() { + if ! check_non_free_firmware; then + if check_buster; then + # Ajouter non-free-firmware pour la version Bookworm ou ultérieure + sed -i.bak -e '/deb .*main/ s/$/ contrib non-free non-free-firmware/' /etc/apt/sources.list /etc/apt/sources.list.d/* + echo "Ajout de non-free-firmware aux dépôts." + fi + fi +} + +# Main script +echo "Mise à jour de votre système Debian..." + +# Mettre à jour le système dans sa version actuelle +sudo apt-get update +sudo apt-get upgrade -y +sudo apt-get full-upgrade -y + +# Vérifier si des sauvegardes ont été effectuées (cette étape est manuelle) + +# Mise à jour des sources.list +if check_buster; then + update_sources "bullseye" + add_non_free_firmware +fi + +# Nettoyer et mettre à jour les listes de paquets +sudo apt-get clean +sudo apt-get update + +# Effectuer la mise à niveau majeure +sudo apt-get upgrade -y +sudo apt-get full-upgrade -y + +# Supprimer les paquets non nécessaires +sudo apt-get autoremove -y + +# Redémarrer le système +echo "Redémarrage du système pour appliquer les changements..." +sudo shutdown -r now diff --git a/local/bin/updateall b/local/bin/updateall deleted file mode 100755 index 62d83d0..0000000 --- a/local/bin/updateall +++ /dev/null @@ -1,69 +0,0 @@ -#!/bin/bash - -# Mise à jour des machines présentes dans .ssh/config avec choix d'ignorer certaines. - -# Fonction pour mettre à jour avec apt -update_with_apt() { - echo "--- Mise à jour avec apt sur $1" - ssh -tt "$1" 'sudo apt update && sudo apt upgrade --assume-yes' -} - -# Fonction pour mettre à jour avec dnf -update_with_dnf() { - echo "--- Mise à jour avec dnf sur $1" - ssh -tt "$1" 'sudo dnf check-update && sudo dnf upgrade -y' -} - - -# Déclaration d'une fonction pour récupérer les alias à partir du fichier ~/.ssh/config -get_ssh_aliases() { -# Parcours du fichier ~/.ssh/config et récupération du premier Host (excluant "*") - awk 'tolower($1) == "host" && $2 != "*" && !seen[$2]++ {print $2}' ~/.ssh/config - - # Parcours des fichiers dans le dossier ~/.ssh/include et récupération du premier Host (excluant "*") - for include_file in ~/.ssh/include/*; do - awk 'tolower($1) == "host" && $2 != "*" && !seen[$2]++ {print $2}' "$include_file" - done -} - -# Récupérer les alias SSH -machines=($(get_ssh_aliases)) - -# Parcourir la liste des machines - -for machine in "${machines[@]}"; do - # Vérification si le nom de machine est présent dans le fichier .config/updateall-hosts - if grep -q "^$machine " ~/.config/updateall-hosts; then - status=$(grep "^$machine " ~/.config/updateall-hosts | awk '{print $2}') - if [ "$status" = "1" ]; then - echo "--------------------------------------------------------------------------------" - echo "--- Vérification du gestionnaire de paquets sur $machine" - if timeout 5 ssh "$machine" which apt > /dev/null 2>&1; then - update_with_apt "$machine" - elif timeout 5 ssh "$machine" which dnf > /dev/null 2>&1; then - update_with_dnf "$machine" - else - echo "[x] Aucun gestionnaire de paquets trouvé sur $machine" - fi - fi - else - echo "--------------------------------------------------------------------------------" - if timeout 5 ssh "$machine" which apt > /dev/null 2>&1; then - update_with_apt "$machine" - elif timeout 5 ssh "$machine" which dnf > /dev/null 2>&1; then - update_with_dnf "$machine" - else - echo "[x] Aucun gestionnaire de paquets trouvé sur $machine" - fi - read -p "--- Le traitement pour $machine vient de se terminer. Souhaitez-vous le refaire les prochaines fois ? (o/n) " choice - if [ "$choice" = "o" ]; then - echo "$machine 1" >> ~/.config/updateall-hosts - else - echo "$machine 0" >> ~/.config/updateall-hosts - continue - fi - fi - - -done - diff --git a/local/bin/updateall.sh b/local/bin/updateall.sh new file mode 100755 index 0000000..c9eb1a8 --- /dev/null +++ b/local/bin/updateall.sh @@ -0,0 +1,177 @@ +#!/bin/bash + +# Variables pour les codes de couleur ANSI +RED='\033[0;31m' +GREEN='\033[0;32m' +NC='\033[0m' # No Color + +# Mise à jour des machines présentes dans .ssh/config avec choix d'ignorer certaines. + +# Fonction pour mettre à jour avec apt +update_with_apt() { + echo -e " - Mise à jour avec apt sur $1 \n" + ssh -tt "$1" ' + sudo apt -y -q clean && + sudo apt -y -q update && + sudo apt -y -q full-upgrade && + sudo apt -y -q autoremove + ' + echo -e "\n" +} + +# Fonction pour mettre à jour avec dnf +update_with_dnf() { + echo -e " - Mise à jour avec dnf sur $1 \n" + ssh -tt "$1" 'sudo dnf check-update && sudo dnf upgrade -y' + echo -e "\n" +} + + +# Déclaration d'une fonction pour récupérer les alias à partir du fichier ~/.ssh/config +get_ssh_aliases() { +# Parcours du fichier ~/.ssh/config et récupération du premier Host (excluant "*") + awk 'tolower($1) == "host" && $2 != "*" && !seen[$2]++ {print $2}' ~/.ssh/config + + # Parcours des fichiers dans le dossier ~/.ssh/include et récupération du premier Host (excluant "*") + for include_file in ~/.ssh/include/*; do + awk 'tolower($1) == "host" && $2 != "*" && !seen[$2]++ {print $2}' "$include_file" + done +} + + +check_keyinstall() { + local machine="$1" + local uniqkey="$2" + local uniqkey_file="/etc/cedrix_updateall" + + echo -n " - Vérification d'une mise à jour déjà effectuée sur "$machine" : " + + if ! timeout 5 ssh "$machine" '[ -f "$uniqkey_file" ]'; then + echo -e "${GREEN}mise à jour à faire.${NC}" + return 0 + fi + + if timeout 5 ssh "$machine" "grep -q '$uniqkey' $uniqkey_file"; then + echo -e "${RED}mise à jour déjà faite.${NC}" + return 1 + fi + + timeout 5 ssh "$machine" "sudo rm "$uniqkey_file"" + echo -e "${GREEN}mise à jour à faire et clé à modifier.${NC}" + return 0 +} + + +create_installkey() { + local machine="$1" + local uniqkey="$2" + local uniqkey_file="/etc/cedrix_updateall" + + echo -n " - Indiquer à $machine que le script est passé ... " + # Si la clé unique n'est pas présente, la déposer dans le fichier + echo "$uniqkey" | timeout 5 ssh "$machine" "sudo su -c \"cat > $uniqkey_file\"" + result="$?" + + if [ $result -eq 0 ]; then + echo -e "${GREEN}OK${NC}" + else + echo -e "${RED}une erreur est survenue. Désactivation des prochaines mise à jour.${NC}" + + fi + + return + +} + +update_machine () { + local machine="$1" + echo -n " - Détection du gestionnaire de mise à jour ... " + if timeout 5 ssh "$machine" which apt > /dev/null 2>&1; then + echo -e "${GREEN}apt${NC}" + update_with_apt "$machine" + elif timeout 5 ssh "$machine" which dnf > /dev/null 2>&1; then + echo -e "${GREEN}dnf${NC}" + update_with_dnf "$machine" + else + echo " ${RED} non détecté${NC}" + fi +} + + + +confirm_update() { + local machine="$1" + read -p " - Executer la mise à jour pour $machine ? (o/n) " choice + if [ "$choice" = "o" ]; then + echo "$machine 1" >> ~/.config/updateall-hosts + else + echo "$machine 0" >> ~/.config/updateall-hosts + continue + fi +} + + +check_host() { + local machine="$1" + + echo -n " - Check host " + # Vérifier la résolution du nom d'hôte + if ssh "$machine" hostname > /dev/null 2>&1; then + echo -e "... ${GREEN}OK${NC}" + return 1 + else + echo -e "... ${RED}KO${NC}" + return 0 + fi + +} + + +# Générer une clé unique +uniqkey=$(uuidgen) +echo "Clé d'installation : $uniqkey" + +# Récupérer les alias SSH +machines=($(get_ssh_aliases)) + +# Parcourir la liste des machines + +for machine in "${machines[@]}"; do + # Vérification si le nom de machine est présent dans le fichier .config/updateall-hosts + echo -e "\n" + echo -n " >> $machine " + + if grep -q "^$machine " ~/.config/updateall-hosts; then + status=$(grep "^$machine " ~/.config/updateall-hosts | awk '{print $2}') + if [ "$status" = "1" ]; then + echo -e "${GREEN}connue${NC}" + + check_host "$machine" + machine_online="$?" + + if [ "$machine_online" -eq 1 ]; then + check_keyinstall "$machine" "$uniqkey" + keyinstall_present="$?" + if [ "$keyinstall_present" -eq 0 ]; then + update_machine "$machine" + create_installkey "$machine" "$uniqkey" + fi + fi + else + echo -e "${RED}ignorée${NC}" + fi + else + if [ "$machine_online" -eq 1 ]; then + echo -e "${RED}vue pour la 1re fois${NC}" + + check_host "$machine" + machine_online="$?" + + confirm_update "$machine" + update_machine "$machine" + create_installkey "$machine" "$uniqkey" + fi + fi + +done +