Rendez-vous sur Arrakis

C'est lorsque nous croyons savoir quelque chose qu'il faut justement réfléchir un peu plus profondément. F. Herbert

Détecter les paquets inutilisés sur OpenBSD

Si vous avez installé votre OpenBSD depuis quelques temps, peut-être souhaitez-vous faire un peu de ménage.
Rien de tel que de supprimer les ports et paquets inutilisés, puis terminer avec les commandes suivantes pour retirer les dépendances inutiles et vérifier le système :

pkg_delete -a
 pkg_check

Afin de détecter quels paquets ne me servent plus depuis longtemps et que j'ai peut-être oublié, j'utilise le script suivant

Il regarde la liste des paquets installés puis affiche ceux qui ont un exécutable qui n'a pas été utilisé depuis plus d'un mois. (changez la variable DAYS pour un autre délai).

Voici le script :

#!/bin/sh
 # print unused packages that may be deleted
 
 # It only check if last access time of binaries is older than a month by default.
 # It doesn't check for libs, only bins
 
 DAYS=15    # Number of days since last access
 LAST=$(($(date +%s) - ($DAYS * 24 * 3600)))
 
 echo "Those packages haven't been used in the last $DAYS days : "
 
 for P in $(pkg_info | cut -d' ' -f1); do 
         BINS=$(pkg_info -L $P |grep '/usr/local/bin')
         for B in $BINS; do
                 # check if $B is a link
                 B=$(readlink -f $B)
                 if [ $(stat -f %a $B) -lt $LAST ]; then
                         echo "$P  | $B"
                 fi
         done
 done
 

Décidément, que j'aime OpenBSD. La simplicité de ses outils permet de, très facilement, récupérer des informations sans prise de tête.

le 06/12/2017 à 10:06:14, PengouinPdt a dit :

Désolé, @thuban:

$ ./pkg_unused                                                                                                                    
 Those packages haven't been used in the last 30 days : 
 ./pkg_unused[17]: syntax error: `$(stat -f %a $B)' unexpected
 

le 06/12/2017 à 10:40:36, thuban a dit :

@PengouinPdt : Réessaie ;)

le 06/12/2017 à 12:18:44, PengouinPdt a dit :

Réessaie quoi?
l'exécution ?

le 06/12/2017 à 12:43:42, thuban a dit :

Réessaie en telechargeant le script mis en lien exprès.

le 06/12/2017 à 16:36:20, PengouinPdt a dit :

C'est justement avec ton script mis en lien. :(
(dl * 2)

le 06/12/2017 à 16:46:34, thuban a dit :

@PengouinPdt : Merci de l'avoir détecté, c'est corrigé. Problème de cache apparemment, c'est résolu.

le 07/12/2017 à 08:41:08, PengouinPdt a dit :

Bonjour,
Au fait, Xavier, il y a une très petite coquille dans la première phrase :

Si vous avez installé votre OpenBSd...

;)

le 10/12/2017 à 18:28:17, C138 a dit :

Yop
* !e!xécutable ... ;-)

* Ce qui manque généralement dans ce genre de tuto c'est les commentaires adaptés... ce qui permet de sortir de la vision «magie noire» (un peu opposée au message de simplicité quand on y pense ;-)

Du coups, y'a un truc que je pige pas... Les paquets candidats au retrait sont ceux dont *aucun* binaire n'a été utilisé depuis moins de X jours. Et je ne vois pas en quoi la boucle proposée répond à cette question...
(et j'ai même l'impression que c'est le contraire qui est calculé)

Merci pour tout éclaircissement.

* Suggestion : ajouter une extension au nom de script (.sh ou .txt ou...), afin que le navigateur sache quoi en faire automatiquement ;-)

le 10/12/2017 à 19:08:47, thuban a dit :

$(stat -f %a $B) -lt $LAST

vérifie si le dernier accès au fichier est inférieur (donc antérieur) au délai indiqué avant, autrement dit un mois par défaut.

Les paquets candidats sont ceux dont au moins un binaire n'a pas été utilisé depuis plus d'un mois.

Bien sûr, c'est perfectible, mais en l'état ça fait le job en restant simple. Toute contribution est bienvenue, n'hésite pas à coder un truc.

le 11/12/2017 à 19:30:06, C138 a dit :

@thuban :
«Les paquets candidats sont ceux dont au moins un binaire n'a pas été utilisé depuis plus d'un mois.»
Ah ok, je partais plutôt sur la spec «dont aucun binaire n'a été utilisé depuis moins d'un mois», du coups, je n'étais pas raccord...

Alors bon, effectivement, creusons un peu... (le shell c'est pas trop natif chez moi)
N'ayant pas de BSD sous la main, voici une proposition de variante debian-based...

L'idée étant de [retourner le problème] partir sur l'hypothèse qu'un paquet peut être viré sauf si au au moins un|e binaire|lib a été utilisé plus récemment que le seuil donné. On lève un drapeau dans la boucle, on test en sortie de boucle...


 for P in $(dpkg -l | grep ^ii | awk '{print $2}'); do
     BINS=$(dpkg -L  $P |grep -E "(/bin/|/lib/)")
     keep=0
     for B in $BINS; do
    B=$(readlink -f $B)
    atime=$(stat -c "%X" $B)
         if [ $atime -gt $LAST ]; then
        keep=1
         fi
     done
     if [ $keep = 0 ]; then
    echo "$P"
     fi    
 done
 

Sous réserve d'avoir bien pigé la sémantique atime, vu d'avion, ça fonctionne et plutôt intéressant comme résultat ;-)

Merci pour le «titillement»!
PS : Suggestion pour utiliser le script, toujours en debianeux (mode barbare)


 ./script.sh 2>/dev/null | xargs -L1 dpkg --purge
 

c-a-d tenter de supprimer chaque paquet retourné, sous réserve qu'il n'est pas dépendance d'un autre...

Évidemment, à utiliser avec une énorme modération et sans aucune garantie.

le 11/12/2017 à 19:43:03, thuban a dit :

@C138 : Attention avec xargs, c'est dangereux, il faudrait demander confirmation ou bien simuler d'abord avec l'option qui va bien.
Sinon, sous debian, pour virer les paquets inutilisés, t'as déjà deborphan

le 12/12/2017 à 12:08:02, C138 a dit :

@thuban :
C'est pas tellement xargs qui est dangereux, mais bien dpkg ...
Après, dpkg/deborphan, on est ici dans l'analogue. En effet, si tu peux dpkg-purger un paquet sans confirmation, c'est qu'il est "dans" deborphan... sinon (dépendance) dpkg échoue. C'est la raison du -L1 qui permet de continuer le script même si l'un des purges échoue (un peu comme 2>/dev/null cache les erreurs, ou une capture d'exception en programmation).

Cela dit, une bonne(?) variante du script c'est effectivement de remplacer par apt/remove en interactif, ce sera plus laborieux mais plus exhaustif comme nettoyage.

Donc globalement, le danger qui reste c'est celui d'avoir mal évaluer la notion de «inutilisé».

Enfin, deborphan détecte les paquets «feuilles» en terme de dépendance, c'est pas vraiment les paquets «inutilisés» (au sens pas utiles/utilisés).

Pour faire bonne mesure, il faut intégrer dans toute cette vaste réflexion, debfoster (toujours en debianeux)... On n'a pas fini :-P

PS : Désolé pour le jargon debianeux, doit y avoir traduction en *BSD je suppose...