#!/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 } # Fonction pour récupérer la valeur de /etc/os-release get_os_release() { ssh "$1" 'grep "^PRETTY_NAME=" /etc/os-release' | cut -d'=' -f2 | tr -d \" } update_machine () { local machine="$1" echo -n " - Détection du gestionnaire de mise à jour ... " # recupérer le nom de l'OS os_name=$(get_os_release "$machine") echo -n " - Système d'exploitation : ${GREEN}$os_name${NC}" 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