Page 1 sur 1

[Pacman] Ménage partiel des paquets (résolu)

Publié : ven. 07 févr. 2014, 14:24
par lesebas
Bonjour,

Depuis 1 an que j'ai installé mon système je n'ai jamais vidé le cache des paquets de pacman (ça m'a bien aidé quand il a fallu que je downgrade 1 ou 2 paquets...)

Je voulais savoir s'il y avait moyen de supprimer les paquets sauf les versions courantes installées et les versions -1 voir -2 ?

Re: [Pacman] Ménage partiel des paquets

Publié : ven. 07 févr. 2014, 20:35
par FoolEcho

Re: [Pacman] Ménage partiel des paquets

Publié : ven. 07 févr. 2014, 22:33
par benjarobin
Cela ne répond pas à la question

Re: [Pacman] Ménage partiel des paquets

Publié : ven. 07 févr. 2014, 23:18
par lesebas
Nettoyage des paquets non installés du cache:

Code : Tout sélectionner

pacman -Sc
Ok j'avais vu... si je comprends bien ça supprime les paquets non installés et toutes les versions "obsolètes" des paquets installés en ne gardant que la version courante.

Moi ce que je veux c'est que si j'ai 6 versions d'un paquet, exemple chromium 32.6, 32.4 32.3...


Une commande ne garde que les N dernières versions et supprime les autres.

Re: [Pacman] Ménage partiel des paquets

Publié : sam. 08 févr. 2014, 09:50
par FoolEcho
benjarobin a écrit :Cela ne répond pas à la question
Arf. Je n'ai pas lu la question jusqu'au bout. :oops:
lesebas a écrit :Une commande ne garde que les N dernières versions et supprime les autres.
Il n'y a pas de commande directe pour ça à ma connaissance, il va falloir passer par un script.
Je n'ai pas regardé s'il en existait, mais je peux sûrement te pondre un truc pour me rattraper de mon inattention (dans la journée si je peux). :wink:

Re: [Pacman] Ménage partiel des paquets

Publié : sam. 08 févr. 2014, 11:51
par lesebas
Salut... oui j'ai rien trouvé, je suis sur le script, le début donne ça :

Code : Tout sélectionner

#!/bin/bash

pkgDirectory="/home/sebastien/pkg/"#"/var/cache/pacman/pkg/"
for package in $(pacman -Qq);do
        >/tmp/.package_list
	for file in $(find $pkgDirectory -name $package"*");do
		echo $file":"$(pacman -Qp $file | sed "s/^[^ ]* //g") >> /tmp/.package_list
	done
        cat /tmp/.package_list | sort -t: -k2,2 > /tmp/.package_list
done
Pour chaque paquet installé je récupére un fichier avec une colonne contenant le nom du fichier et une colonne avec la version. Ensuite je trie le fichier par numéro de version.

Il faut que j'optimise le traitement car c'est un peu long "pacman -Qp $file" décompresse le fichier pour récupérer la version.

Re: [Pacman] Ménage partiel des paquets

Publié : sam. 08 févr. 2014, 13:29
par FoolEcho
lesebas a écrit :Il faut que j'optimise le traitement car c'est un peu long "pacman -Qp $file" décompresse le fichier pour récupérer la version.
C'est un mauvais plan à mon avis.
Il faut traiter au maximum au fur et à mesure pour diminuer la lourdeur d'exécution.

En pseudo-code (plus certains conseils/précautions), je verrais plutôt:

Code : Tout sélectionner

Si le nombre de versions à conserver = 0 alors utilisation courageuse de pacman -Scc
Sinon si le nombre de versions à conserver = 1 alors utilisation courageuse de pacman -Sc

(ça garantit d'avoir bon, de limiter le coût et à l'avantage d'être fiable ^^)

Sinon

Lister les archives présentes (par défaut dans /var/cache/pacman/pkg/)

Pour chaque archive présente
  vérifier que l'archive existe toujours (car on va supprimer au fur et à mesure pour améliorer l'efficacité de la procédure, voir plus loin)
  si elle n'existe plus, on passe à l'archive suivante (on limite ainsi l'utilisation du pacman -Qp)

  récupération du nom du paquet (pacman -Qp effectivement)
  si paquet non installé (attention à ce niveau: bien utiliser les regexp pour éviter les soucis avec les noms de paquets qui se déclinent, genre xorg-server, python2, etc. ; a priori l'expression régulière à utiliser est pkgname$ pour éviter toute confusion), alors suppression des archives de ce nom (là encore, attention à la regexp utilisée... a priori pkgname-[0-9]* fait l'affaire et couvre l'essentiel des besoins, sauf des cas très tordus qui proviendraient à mon avis d'un mauvais nommage)

  sinon 
     si un paquet du même nom est installé, alors
        listage des archives présentes du même nom (cf. pkgname-[0-9]* )
        si nombre d'archives > nombre à conserver alors suppression des versions plus anciennes pour atteindre nombre à conserver
(je pense que ça couvre tous les cas de figure)
(je ne conserverai pas la liste des paquets traités au fur et à mesure, dans la mesure où ça sera quasiment aussi efficace/coûteux de vérifier si le nombre d'archives est correct, je pense -- plus à cause du shell en fait: dans un autre langage, il serait plus rapide de garder cette trace)

À voir si ça convient en l'état et si oui, je pense que la mise en œuvre est simple. :)

EDIT: Sinon regarde sur AUR, tu as pacleaner en python qui semble répondre à tes besoins (à part pour la beauté du geste, s'il n'y a pas besoin de réinventer la roue...). :)

Re: [Pacman] Ménage partiel des paquets

Publié : sam. 08 févr. 2014, 17:39
par lesebas
Yes pacleaner semble faire l'affaire :
Script to clean up pacmans cache in a more flexible way than pacman -Sc.

usage: pacleaner.py [-h] [--uninstalled] [--morethan] [--delete] [--number n]
[--cache_path PATH] [--installed_path PATH]

Clean up pacman's cache. More flexible than "pacman -Sc[c]"

optional arguments:
-h, --help show this help message and exit
--uninstalled, -u list packages that is not installed on the system
--morethan, -m list packages that has more than the specified number
of files in the cache
--delete if this option is set, the packages listed by
"uninstalled" or "morethan" is deleted.
--number n, -n n number of packages that you want to keep as a backup.
Defaults to 2.
--cache_path PATH, -c PATH
optional path to pacman's cache
--installed_path PATH, -i PATH
optional path to pacman's installed package db[/quote]

Par contre le paquet n'a pas été mis à jour depuis quasiment 2 ans...

Re: [Pacman] Ménage partiel des paquets

Publié : sam. 08 févr. 2014, 19:41
par FoolEcho
Tu l'as testé ? (parce que les chemins et commandes n'ont pas trop bougé normalement sur la gestion du cache, donc ça pourrait bien fonctionner encore)

Voyant la possibilité pacleaner, je n'ai pas insisté mais sinon, l'option script bash reste possible, comme je t'ai dit, ça ne devrait pas être trop dur (petites infos en passant en voyant ton code :wink: : tu peux utiliser pacman -Qpq pour obtenir directement le nom du paquet, pas besoin de cut ; pour générer un fichier temporaire, il y a la commande mktemp, plus propre ; tu n'as pas besoin de double boucle si tu gères correctement le find+exec et avec ce que j'ai indiqué précédemment tu n'as même pas besoin de find, un subtil ls sur la regexp doit suffire -- j'avais fait un truc du genre sur un script perso pour garder justement les x derniers fichiers).

Re: [Pacman] Ménage partiel des paquets

Publié : dim. 09 févr. 2014, 09:17
par lesebas
FoolEcho a écrit :Tu l'as testé ? (parce que les chemins et commandes n'ont pas trop bougé normalement sur la gestion du cache, donc ça pourrait bien fonctionner encore)
Yes testé et ça marche... du moins ce que j'en ai vu pour garder les versions N des paquets installés. Il faut que je teste dans le détail, s'il prend en compte les paquets non installés...

Du coup j'ai mis à jour le paquet sur AUR, le pkgbuild était obsolète.

Re: [Pacman] Ménage partiel des paquets (résolu)

Publié : mar. 18 févr. 2014, 19:16
par lesebas
Bon apparemment ça marche bien, mais le script est basé sur le nom des fichiers contenus dans les répertoires

/var/cache/pacman/pkg/
/var/lib/pacman/local/

Du coup je me demande si effectivement tous les paquets installés sont bien dans "/var/lib/pacman/local" mais surtout si les noms de fichiers archives des paquets sont bien codés selon des règles stricts...

Si oui pourquoi la commande "pacman -Qp $file" décompresse le paquet pour en retrouver la version (qui à priori est toujours codé dans le nom de fichier de l'archive).

Re: [Pacman] Ménage partiel des paquets (résolu)

Publié : mar. 18 févr. 2014, 20:57
par FoolEcho
lesebas a écrit :Si oui pourquoi la commande "pacman -Qp $file" décompresse le paquet pour en retrouver la version (qui à priori est toujours codé dans le nom de fichier de l'archive).
Parce que c'est plus sûr. Tu as des tas de paquets et de nom de paquets qui poseraient problème en analysant seulement le nom des archives.

Re: [Pacman] Ménage partiel des paquets (résolu)

Publié : mar. 18 févr. 2014, 21:06
par lesebas
C'est bien le problème... pacleaner se base sur les noms de fichier. Donc l'option -u ne doit pas être trés sur, il faut que j'analyse le script en détail... mais je découvre python!

Re: [Pacman] Ménage partiel des paquets (résolu)

Publié : mar. 18 févr. 2014, 21:14
par FoolEcho
Je maîtrise mieux le bash à ce niveau, donc mon offre reste a priori valable... sachant que tu as la procédure si tu veux essayer.