Aller au contenu

« APT » : différence entre les versions

De Marmits Wiki
Ligne 170 : Ligne 170 :
==== 6. Lister tous les fichiers <code>phased</code> (Version améliorée) ====
==== 6. Lister tous les fichiers <code>phased</code> (Version améliorée) ====


<syntaxhighlight lang="bash" line>
#check_phased_updates.sh
#!/bin/bash
#!/bin/bash


# =====================================================
: '
# 🔍 Rapport sur les mises à jour phasées - Fusionné
============================================================
# =====================================================
Objet  : Générer un rapport clair sur les mises à jour phasées d'apt ubuntu
# Ce script liste tous les paquets Ubuntu en phase de mise à jour (phased updates).
============================================================
# Il fusionne les paquets "différés" et "upgradables phasés" pour éviter les doublons,
# et affiche l'état réel de chaque paquet.
# Il gère automatiquement les locales FR/EN pour parser la sortie d'APT.
# =====================================================


echo "=============================================="
DESCRIPTION :
echo " 🔍 Rapport sur les mises à jour phasées"
Ce script analyse les paquets upgradables signalés par APT et
echo "=============================================="
vérifie s’ils sont soumis au "phasage" (phased updates).
echo


# ==========================
Le phasage est une fonctionnalité d’APT qui déploie certaines
# Couleurs pour la sortie
mises à jour progressivement (ex: 10%, 20%, ... des machines)
# ==========================
afin de limiter l’impact d’éventuels bugs.
RED='\033[0;31m'    # rouge pour pourcentage
GREEN='\033[0;32m'  # vert pour upgradable
YELLOW='\033[1;33m'  # jaune pour différé ou paquet
BLUE='\033[0;34m'    # bleu pour sections
NC='\033[0m'        # reset couleur


# ==========================
Le script :
# Détection de la langue
  1. Récupère la liste des paquets upgradables via
# ==========================
    `apt list --upgradable`.
# On détecte la locale pour adapter le parsing
  2. Pour chaque paquet, interroge `apt-cache show` pour
LANGUAGE=$(echo $LANG | cut -d_ -f1)
    extraire le champ `Phased-Update-Percentage`.
  3. Construit une liste fusionnée des paquets concernés,
    en indiquant le pourcentage de phasage appliqué.
  4. Trie et affiche les résultats par ordre alphabétique.
  5. Résume le nombre total de paquets affectés par le phasage.


if [ "$LANGUAGE" == "fr" ]; then
AFFICHAGE :
    REGEX_DEFERRED="Les mises à jour suivantes ont été différées"
- Chaque paquet est listé avec son pourcentage de phasage.
    REGEX_END="0 mis à jour"
- Un résumé final indique le total de paquets concernés.
else
    REGEX_DEFERRED="The following packages have been kept back"
    REGEX_END="0 upgraded"
fi


# ==========================
UTILISATION :
# 1) Récupérer les paquets différés par phasage
  ./rapport-phasage.sh
# ==========================
# On simule un full-upgrade pour capturer les paquets différés
DEFERRED=$(apt full-upgrade -s 2>/dev/null | awk "/$REGEX_DEFERRED/{flag=1; next} /$REGEX_END/{flag=0} flag")


# Nettoyage de la sortie pour extraire les noms de paquets
PRÉREQUIS :
PKGS_DEFERRED=$(echo "$DEFERRED" | tr -d '\n' | sed 's/  /\n/g' | sed 's/^ *//;s/ *$//' | tr '\n' ' ')
- Debian/Ubuntu (ou dérivés) avec apt >= 2.2
- Droits de lecture sur `apt list` et `apt-cache show`
============================================================
'


# ==========================
# --- Définition des couleurs pour l'affichage ---
# 2) Récupérer les paquets upgradables phasés
RED='\033[0;31m'
# ==========================
GREEN='\033[0;32m'
UPGRADABLE=$(apt list --upgradable 2>/dev/null | awk -F/ 'NR>1 {print $1}')
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'   # Reset couleur (No Color)


# On ne garde que ceux qui ont un pourcentage de phasage
# --- En-tête ---
PHASED_UPGRADABLE=""
echo "=============================================="
for PKG in $UPGRADABLE; do
echo " 🔍 Rapport sur les mises à jour phasées"
    PERC=$(apt-cache show "$PKG" 2>/dev/null | awk '/^Phased-Update-Percentage:/ {print $2}')
echo "=============================================="
    if [ -n "$PERC" ]; then
echo
        PHASED_UPGRADABLE+="$PKG "
    fi
done


# ==========================
# Étape 1 : récupération des paquets upgradables
# 3) Fusionner les listes pour éviter les doublons
UPGRADABLE_PKGS=$(apt list --upgradable 2>/dev/null | awk -F/ 'NR>1 {print $1}')
# ==========================
declare -A PACKAGES


# Ajouter les paquets différés dans le tableau associatif
# Étape 2 : carte associative pour stocker les pourcentages
for PKG in $PKGS_DEFERRED; do
declare -A PHASE_MAP
    PERC=$(apt-cache show "$PKG" 2>/dev/null | awk '/^Phased-Update-Percentage:/ {print $2}')
    PACKAGES["$PKG"]="différé|$PERC"
done


# Ajouter les upgradables phasés seulement si non déjà présent
for pkg in $UPGRADABLE_PKGS; do
for PKG in $PHASED_UPGRADABLE; do
     PERC=$(apt-cache show "$pkg" 2>/dev/null | awk '/^Phased-Update-Percentage:/ {print $2}')
     PERC=$(apt-cache show "$PKG" 2>/dev/null | awk '/^Phased-Update-Percentage:/ {print $2}')
     if [ -n "$PERC" ]; then
     if [ -z "${PACKAGES[$PKG]}" ]; then
         PHASE_MAP["$pkg"]="$PERC"
         PACKAGES["$PKG"]="upgradable|$PERC"
     fi
     fi
done
done


# ==========================
# Étape 3 : affichage trié
# 4) Affichage des résultats
if [ ${#PHASE_MAP[@]} -eq 0 ]; then
# ==========================
    echo -e " ${GREEN}→ Aucun paquet soumis au phasage${NC}"
COUNT_DIFF=0
else
COUNT_UP=0
    for pkg in $(printf "%s\n" "${!PHASE_MAP[@]}" | sort); do
        echo -e "  - ${YELLOW}$pkg${NC} → ${RED}${PHASE_MAP[$pkg]}% en phase${NC}"
    done
    echo
    echo "=============================================="
    echo -e " ✅ ${GREEN}Analyse terminée${NC}"
    echo "  Résumé : ${#PHASE_MAP[@]} paquets concernés par le phasage"
    echo "=============================================="
fi


echo -e "${BLUE}📦 Paquets phasés fusionnés :${NC}"
for PKG in "${!PACKAGES[@]}"; do
    STATE=$(echo "${PACKAGES[$PKG]}" | cut -d'|' -f1)  # différé / upgradable
    PERC=$(echo "${PACKAGES[$PKG]}" | cut -d'|' -f2)  # Pourcentage de phasage
   
    # Déterminer la couleur et compter les totaux
    if [ "$STATE" == "différé" ]; then
        COLOR_STATE="${YELLOW}différé${NC}"
        COUNT_DIFF=$((COUNT_DIFF+1))
    else
        COLOR_STATE="${GREEN}upgradable${NC}"
        COUNT_UP=$((COUNT_UP+1))
    fi
   
    # Affichage du paquet avec son état et pourcentage
    if [ -n "$PERC" ]; then
        echo -e "  - ${YELLOW}$PKG${NC} → ${RED}$PERC% en phase${NC} (${COLOR_STATE})"
    else
        echo -e "  - ${YELLOW}$PKG${NC} → phasage actif (${COLOR_STATE})"
    fi
done
# Totaux
echo
echo "  🔢 Total différés : $COUNT_DIFF"
echo "  🔢 Total upgradables phasés : $COUNT_UP"
echo
echo "=============================================="
echo -e " ✅ ${GREEN}Analyse terminée${NC}"
echo "  Résumé : $COUNT_DIFF différés, $COUNT_UP upgradables phasés"
echo "=============================================="


</syntaxhighlight>
</syntaxhighlight>

Version du 29 août 2025 à 17:13

Paquets APT

Sur Debian (et ses dérivés comme Ubuntu), apt est un outil en ligne de commande pour gérer les paquets logiciels. Il permet d’installer, mettre à jour, supprimer et gérer les logiciels provenant des dépôts officiels de Debian.

Mise à jour de la liste des paquets

sudo apt update

Voir ce qui peut être mis à jour

sudo apt list --upgradable

Installation

sudo apt install --only-upgrade firefox

Ne gère pas les dépendances

sudo apt upgrade

Gère les dépendances

(permet l'installation de nouveaux paquets pour résoudre les dépendances)

sudo apt --with-new-pkgs upgrade

(peut également supprimer des paquets pour satisfaire les dépendances) => plus agressive

sudo apt full-upgrade

Supprimez tous les paquets devenus obsolètes et qui ne sont plus nécessaires

Supprime les anciens noyaux installés

sudo apt-get autoremove --purge

Supprimez le cache des paquets qui ne peuvent plus être téléchargés

sudo apt autoclean

Télécharge et installe les dépendances manquantes pour réparer les paquets cassés.

sudo apt --fix-broken install

Affichage des infos d'un paquet

apt show firefox

Recherche de paquets

apt search mot-clé


Termine la configuration des paquets interrompus.

Voir commande

voir tous les paquets

apt list --installed

voir si un paquet est à jour

apt-cache policy firefox

compter les paquets installés sur Ubuntu

filtre pour ne montrer que les paquets actifs.

sudo apt list --installed | wc -l

voir si des paquets sont cassés

sudo apt-get check

phased => déféré (retardé)

Cette commande permet de calculer un score entre 0 et 99 à partir de votre machine-id, utilisé par Ubuntu pour les phased updates (mises à jour progressives).

1 .Calcul du Score de Phase

echo $((0x$(cut -c1-16 /etc/machine-id | head -c 8) % 100))

ou

awk '{print strtonum("0x" substr($0,1,8)) % 100}' /etc/machine-id

2. Résumé

Étape Action Exemple
1 Extraire les 16 premiers caractères de /etc/machine-id a1b2c3d4e5f6g7h
2 Garder les 8 premiers caractères a1b2c3d4
3 Convertir en décimal (hexadécimal 0x...) 2712849364
4 Appliquer % 100 64
5 Score final 64

3. À Quoi Sert Ce Score ?

  • Phased Updates : Ubuntu déploie les mises à jour par vagues (ex : 10%, 30%, 50% des machines).
  • Votre score (64) détermine si vous recevez une mise à jour :
    • Si la phase actuelle est ≤ 64 → Vous l’obtenez.
    • Si la phase est > 64 → Vous devrez attendre.

4. Pourquoi Cette Méthode ?

  • Déterminisme : Le score est toujours le même pour votre machine (car basé sur machine-id).
  • Répartition uniforme : Les scores sont distribués entre 0 et 99 pour équilibrer le déploiement.

5. Lister tous les fichiers phased (old version)

#check_phased_updates.sh
#!/bin/bash

# Liste des paquets en phased updates 
PACKAGES=$(apt list --upgradable | grep -E "*" | cut -d'/' -f1)
echo "Checking phased updates"
# Parcourir chaque paquet et extraire le pourcentage de phased updates
for PACKAGE in $PACKAGES; do
    echo $PACKAGE
    apt-cache policy $PACKAGE | grep "phased"
done
chmod +x check_phased_updates.sh
./check_phased_updates.sh

6. Lister tous les fichiers phased (Version améliorée)

  1. !/bin/bash
'
================================================
Objet  : Générer un rapport clair sur les mises à jour phasées d'apt ubuntu
================================================

DESCRIPTION : Ce script analyse les paquets upgradables signalés par APT et vérifie s’ils sont soumis au "phasage" (phased updates).

Le phasage est une fonctionnalité d’APT qui déploie certaines mises à jour progressivement (ex: 10%, 20%, ... des machines) afin de limiter l’impact d’éventuels bugs.

Le script :

 1. Récupère la liste des paquets upgradables via
    `apt list --upgradable`.
 2. Pour chaque paquet, interroge `apt-cache show` pour
    extraire le champ `Phased-Update-Percentage`.
 3. Construit une liste fusionnée des paquets concernés,
    en indiquant le pourcentage de phasage appliqué.
 4. Trie et affiche les résultats par ordre alphabétique.
 5. Résume le nombre total de paquets affectés par le phasage.

AFFICHAGE : - Chaque paquet est listé avec son pourcentage de phasage. - Un résumé final indique le total de paquets concernés.

UTILISATION :

 ./rapport-phasage.sh

PRÉREQUIS : - Debian/Ubuntu (ou dérivés) avec apt >= 2.2 - Droits de lecture sur `apt list` et `apt-cache show`

================================================

'

  1. --- Définition des couleurs pour l'affichage ---

RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # Reset couleur (No Color)

  1. --- En-tête ---

echo "==============================================" echo " 🔍 Rapport sur les mises à jour phasées" echo "==============================================" echo

  1. Étape 1 : récupération des paquets upgradables

UPGRADABLE_PKGS=$(apt list --upgradable 2>/dev/null | awk -F/ 'NR>1 {print $1}')

  1. Étape 2 : carte associative pour stocker les pourcentages

declare -A PHASE_MAP

for pkg in $UPGRADABLE_PKGS; do

   PERC=$(apt-cache show "$pkg" 2>/dev/null | awk '/^Phased-Update-Percentage:/ {print $2}')
   if [ -n "$PERC" ]; then
       PHASE_MAP["$pkg"]="$PERC"
   fi

done

  1. Étape 3 : affichage trié

if [ ${#PHASE_MAP[@]} -eq 0 ]; then

   echo -e " ${GREEN}→ Aucun paquet soumis au phasage${NC}"

else

   for pkg in $(printf "%s\n" "${!PHASE_MAP[@]}" | sort); do
       echo -e "  - ${YELLOW}$pkg${NC} → ${RED}${PHASE_MAP[$pkg]}% en phase${NC}"
   done
   echo
   echo "=============================================="
   echo -e " ✅ ${GREEN}Analyse terminée${NC}"
   echo "   Résumé : ${#PHASE_MAP[@]} paquets concernés par le phasage"
   echo "=============================================="

fi


</syntaxhighlight>

chmod +x check_phased_updates.sh
./check_phased_updates.sh

Script bash APT historique

#!/bin/bash
# Permet de consulter l'historique APT sur un système debian
#Usage: ./apt_log_history0.sh [OPTIONS]
#Options:
#  -f, --upgrades    Affiche uniquement les mises à jour
#  -i, --installs    Affiche uniquement les installations
#  -u, --removals    Affiche uniquement les suppressions
#  -r, --reset       Affiche tout (réinitialise le filtre)
#  -h, --help        Affiche ce message d'aide


# Fonction pour traiter les fichiers
process_apt_history() {
    local file="$1"
    local filter="${2:-.*}"  # Filtre par défaut : tout afficher

    echo -e "\033[1;35m\nFichier: ${file##*/}\033[0m"

    if [[ "$file" == *.gz ]]; then
        zcat "$file"
    else
        cat "$file"
    fi | awk -v filter="$filter" '
        /Start-Date:/ {
            start_pos = index($0, "Start-Date:") + 11;
            date = substr($0, start_pos, 19);
            current_date = "\033[1;32m[" date "]\033[0m";
            has_matching_action = 0;
        }
        /Commandline:/ {
            cmd = substr($0, index($0, "Commandline:") + 12);
            current_cmd = cmd;
        }
        /Install:|Upgrade:|Remove:|Installation:|Mise à jour:|Suppression:/ {
            action = $1;
            details = substr($0, index($0, ": ") + 2);

            if (action ~ filter) {
                if (!has_matching_action) {
                    print current_date;
                    if (current_cmd != "") {
                        printf "  \033[33m● Commande: %s\033[0m\n", current_cmd;
                    }
                    has_matching_action = 1;
                }

                # Couleurs
                color = "\033[36m"; # Par défaut (bleu cyan)
                if (action ~ /Install|Installation/) color = "\033[32m"; # Vert
                if (action ~ /Remove|Suppression/) color = "\033[31m";   # Rouge

                printf "  %s%-12s\033[0m %s\n", color, action, details;
            }
        }
    '
}

# Affichage de l'aide
display_help() {
    echo "Usage: $0 [OPTIONS]"
    echo "Options:"
    echo "  -f, --upgrades    Affiche uniquement les mises à jour"
    echo "  -i, --installs    Affiche uniquement les installations"
    echo "  -u, --removals    Affiche uniquement les suppressions"
    echo "  -r, --reset       Affiche tout (réinitialise le filtre)"
    echo "  -h, --help        Affiche ce message d'aide"
    exit 0
}

# Paramètres
FILTER=".*"  # Affiche tout par défaut

# Traitement des options
while getopts "fiurh" opt; do
    case $opt in
        f) FILTER="Upgrade|Mise à jour";;
        i) FILTER="Install|Installation";;
        u) FILTER="Remove|Suppression";;
        r) FILTER=".*";;
        h) display_help;;
        *) display_help;;
    esac
done

# Affichage
echo -e "\033[1;34m=== HISTORIQUE APT (Filtre: ${FILTER}) ===\033[0m"

# D'abord les archives (.gz)
for f in $(ls -v /var/log/apt/history.log*.gz 2>/dev/null); do
    process_apt_history "$f" "$FILTER"
done

# Puis le fichier courant
[ -f "/var/log/apt/history.log" ] && process_apt_history "/var/log/apt/history.log" "$FILTER"