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)

#check_phased_updates.sh
#!/bin/bash

# =====================================================
# 🔍 Rapport sur les mises à jour phasées - Fusionné
# =====================================================
# 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 "=============================================="
echo " 🔍 Rapport sur les mises à jour phasées"
echo "=============================================="
echo

# ==========================
# Couleurs pour la sortie
# ==========================
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

# ==========================
# Détection de la langue
# ==========================
# On détecte la locale pour adapter le parsing
LANGUAGE=$(echo $LANG | cut -d_ -f1)

if [ "$LANGUAGE" == "fr" ]; then
    REGEX_DEFERRED="Les mises à jour suivantes ont été différées"
    REGEX_END="0 mis à jour"
else
    REGEX_DEFERRED="The following packages have been kept back"
    REGEX_END="0 upgraded"
fi

# ==========================
# 1) Récupérer les paquets différés par phasage
# ==========================
# 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
PKGS_DEFERRED=$(echo "$DEFERRED" | tr -d '\n' | sed 's/  /\n/g' | sed 's/^ *//;s/ *$//' | tr '\n' ' ')

# ==========================
# 2) Récupérer les paquets upgradables phasés
# ==========================
UPGRADABLE=$(apt list --upgradable 2>/dev/null | awk -F/ 'NR>1 {print $1}')

# On ne garde que ceux qui ont un pourcentage de phasage
PHASED_UPGRADABLE=""
for PKG in $UPGRADABLE; do
    PERC=$(apt-cache show "$PKG" 2>/dev/null | awk '/^Phased-Update-Percentage:/ {print $2}')
    if [ -n "$PERC" ]; then
        PHASED_UPGRADABLE+="$PKG "
    fi
done

# ==========================
# 3) Fusionner les listes pour éviter les doublons
# ==========================
declare -A PACKAGES

# Ajouter les paquets différés dans le tableau associatif
for PKG in $PKGS_DEFERRED; do
    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 $PHASED_UPGRADABLE; do
    PERC=$(apt-cache show "$PKG" 2>/dev/null | awk '/^Phased-Update-Percentage:/ {print $2}')
    if [ -z "${PACKAGES[$PKG]}" ]; then
        PACKAGES["$PKG"]="upgradable|$PERC"
    fi
done

# ==========================
# 4) Affichage des résultats
# ==========================
COUNT_DIFF=0
COUNT_UP=0

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