trop de modifications

This commit is contained in:
Cédric Abonnel 2024-07-05 22:29:55 +02:00
parent ab81c71b7d
commit 8bdbfd8b93
8 changed files with 755 additions and 84 deletions

View File

@ -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

28
local/bin/check_sha256.sh Executable file
View File

@ -0,0 +1,28 @@
#!/bin/bash
# Vérifie si le bon nombre d'arguments est fourni
if [ "$#" -ne 2 ]; then
echo "Usage: $0 <expected_hash> <file_path>"
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

99
local/bin/check_smart.sh Executable file
View File

@ -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"

View File

@ -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 <nombre de fichiers>] [-d <répertoire>] [-o <fichier de sortie>]"
echo "Utilisation : $0 [-EU] [-n <nombre de fichiers>] [-d <répertoire>] [-o <fichier de sortie>]"
echo "Options :"
echo " -n <nombre de fichiers> : Nombre de fichiers à inclure dans le M3U"
echo " -d <répertoire> : Répertoire à scanner (y compris les sous-répertoires)"
echo " -o <fichier de sortie> : 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"

View File

@ -0,0 +1,217 @@
<?php
// Fonction pour calculer le fingerprint d'un fichier audio
function calculate_fingerprint($file) {
$return_code = 0;
$file_bash = str_replace(['$'], ['\$'], $file);
exec("fpcalc -json \"$file_bash\" 2>&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 <directory> <database>\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";
?>

View File

@ -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

View File

@ -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

177
local/bin/updateall.sh Executable file
View File

@ -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