[repacman] Utilitaire de (re)création de paquet pacman
- gyo
- Maître du Kyudo
- Messages : 1049
- Inscription : jeu. 19 avr. 2007, 10:40
- Localisation : Nantes (44)
[repacman] Utilitaire de (re)création de paquet pacman
Suite à une demande initiée par melodie : http://forums.archlinux.fr/topic601.html
J'ai créé un petit programme qui permet de recréé un paquet pacman (.pkg.tar.gz) à partir d'un paquet installé sur le système archlinux (si celui-ci n'existe pas déjà dans le cache).
Cela vous permet de restaurer un logiciel X si l'upgrade de X ne donne pas de bon résultats (bug du paquet, incompatibilité avec d'autres logiciels installés, etc.).
Bien sûr avant d'upgrader votre logiciel X que vous jugé sensible vous aurez préalablement recréé le .pkg.tar.gz grâce à ce programme.
Une autre utilisation de ce programme peut être le "snapshot" de votre système actuel et de graver tous les paquets créé ainsi, sur un cd ou dvd.. Le snapshot ne se fait pas encore de manière aisée avec le logiciel, mais ça pourrait être une amélioration à apporter pour réaliser ce processus de manière automatisée puisqu'il faut parcourir tous les logiciels qui sont installés sur le système...
[EDIT]
repacman sort en version 0.96 !
ChangeLog 0.96 :
- repacman.sh renommé en repacman ça fait plus « smart »
- repacman s'exécute désormais dans un environnement fakeroot ci celui-ci existe (utile pour avoir les bonnes permissions de réglées dans le paquet créé)
- repacman est et sera disponible via un fichier .tar.gz pour le téléchargement (ce qui permet en extrayant l'archive d'avoir tout de suite le droit d'exécution sur le script et accessoirement le comprimer)
Voilà, la version actuelle est disponible à cette adresse : http://foulmetal.free.fr/archlinux/repacman-0.96.tar.gz
L'utilisation est ultra simple :
$ repacman nom_du_paquet
Donc, cette commande créé un paquet nom_du_paquet-version_actuelle-rel.pkg.tar.gz dans le répertoire courant.
J'ai créé un petit programme qui permet de recréé un paquet pacman (.pkg.tar.gz) à partir d'un paquet installé sur le système archlinux (si celui-ci n'existe pas déjà dans le cache).
Cela vous permet de restaurer un logiciel X si l'upgrade de X ne donne pas de bon résultats (bug du paquet, incompatibilité avec d'autres logiciels installés, etc.).
Bien sûr avant d'upgrader votre logiciel X que vous jugé sensible vous aurez préalablement recréé le .pkg.tar.gz grâce à ce programme.
Une autre utilisation de ce programme peut être le "snapshot" de votre système actuel et de graver tous les paquets créé ainsi, sur un cd ou dvd.. Le snapshot ne se fait pas encore de manière aisée avec le logiciel, mais ça pourrait être une amélioration à apporter pour réaliser ce processus de manière automatisée puisqu'il faut parcourir tous les logiciels qui sont installés sur le système...
[EDIT]
repacman sort en version 0.96 !
ChangeLog 0.96 :
- repacman.sh renommé en repacman ça fait plus « smart »
- repacman s'exécute désormais dans un environnement fakeroot ci celui-ci existe (utile pour avoir les bonnes permissions de réglées dans le paquet créé)
- repacman est et sera disponible via un fichier .tar.gz pour le téléchargement (ce qui permet en extrayant l'archive d'avoir tout de suite le droit d'exécution sur le script et accessoirement le comprimer)
Voilà, la version actuelle est disponible à cette adresse : http://foulmetal.free.fr/archlinux/repacman-0.96.tar.gz
L'utilisation est ultra simple :
$ repacman nom_du_paquet
Donc, cette commande créé un paquet nom_du_paquet-version_actuelle-rel.pkg.tar.gz dans le répertoire courant.
Dernière modification par gyo le ven. 04 mai 2007, 14:01, modifié 1 fois.
- mélodie
- Maître du Kyudo
- Messages : 2784
- Inscription : lun. 30 oct. 2006, 02:06
- Localisation : Pyrénées
Re: [repacman] Utilitaire de (re)création de paquet pacman
C'est bien aussi pour dupliquer sur plusieurs machines, quelqu'un a deux ou plus de machines, une connexion RTC, ou bien n'a pas envie de retélécharger... et n'a plus le paquet, ou a vidé son cache...gyo a écrit :Cela vous permet de restaurer un logiciel X si l'upgrade de X ne donne pas de bon résultats (bug du paquet, incompatibilité avec d'autres logiciels installés, etc.).
Cool, juste un détail :
- changer le nom du packager par celui contenu du /etc/makepkg.conf (PACKAGER)
Puisqu'on est pas sûr que le paquet est le même que celui offciel (pas à cause de l'outils mais des modifications possibles dans la config, patches sauvages ou que sais-je), il serait bien de ne pas créditer l'auteur original pour ce paquet.
Autres fonctionnalités possibles : écrire les fichiers dans un répertoire temporaire avant de les "tarer". Cela permettrait, par exemple, d'exécuter des scripts dans un répertoires d'addons (du genre /etc/repacman.d) pour modifier les paquets (supprimer les locales , optimiser les images, resampler les sons...) à la volée.
Qui à dit que je ne suis pas satisfait des packages ?!
- changer le nom du packager par celui contenu du /etc/makepkg.conf (PACKAGER)
Puisqu'on est pas sûr que le paquet est le même que celui offciel (pas à cause de l'outils mais des modifications possibles dans la config, patches sauvages ou que sais-je), il serait bien de ne pas créditer l'auteur original pour ce paquet.
Autres fonctionnalités possibles : écrire les fichiers dans un répertoire temporaire avant de les "tarer". Cela permettrait, par exemple, d'exécuter des scripts dans un répertoires d'addons (du genre /etc/repacman.d) pour modifier les paquets (supprimer les locales , optimiser les images, resampler les sons...) à la volée.
Qui à dit que je ne suis pas satisfait des packages ?!
Code : Tout sélectionner
if [ -d /etc/repacman.d ]; then
for addon in `ls /etc/repacman.d/*`; do
if [ -x $addon ]; then
. $addon
fi
done
fi
tar czvf $pkg_dir...
Anarchy for the triple A.
- gyo
- Maître du Kyudo
- Messages : 1049
- Inscription : jeu. 19 avr. 2007, 10:40
- Localisation : Nantes (44)
Ouais, je suis plus ou moins d'accord, ce que l'utilisateur change c'est uniquement les fichiers de config en principe. En ce qui concerne le patchage, il faut que l'utilisateur fasse une modification au niveau des sources donc un autre PKGBUILD et un éventuel changement du nom du packageur, donc ça se fait de manière automatique le changement de packageur (info que je récupère dans le fichier desc du répertoire /var/lib/pacman/local/nom_du_paquet/).mimas a écrit :Cool, juste un détail :
- changer le nom du packager par celui contenu du /etc/makepkg.conf (PACKAGER)
Puisqu'on est pas sûr que le paquet est le même que celui offciel (pas à cause de l'outils mais des modifications possibles dans la config, patches sauvages ou que sais-je), il serait bien de ne pas créditer l'auteur original pour ce paquet.
Mais sinon, peut être effectuer un changement dans les infos pour montrer qu'un paquet installé a été installé à partir d'un paquet paqué par repacman.sh, à voir mais il ne s'agit pas d'une priorité à mon avis.
C'est une idée très intéressante, tu nous fais un patch ?mimas a écrit : Autres fonctionnalités possibles : écrire les fichiers dans un répertoire temporaire avant de les "tarer". Cela permettrait, par exemple, d'exécuter des scripts dans un répertoires d'addons (du genre /etc/repacman.d) pour modifier les paquets (supprimer les locales , optimiser les images, resampler les sons...) à la volée.
Qui à dit que je ne suis pas satisfait des packages ?!
Code : Tout sélectionner
if [ -d /etc/repacman.d ]; then for addon in `ls /etc/repacman.d/*`; do if [ -x $addon ]; then . $addon fi done fi tar czvf $pkg_dir...
- gyo
- Maître du Kyudo
- Messages : 1049
- Inscription : jeu. 19 avr. 2007, 10:40
- Localisation : Nantes (44)
Pour mélodie (comme promis !!) :
« Le bûge de la version 0.9 » *musique d'hypnose*
Au départ, le fonctionnement interne de mon programme était le suivant :
- création d'un répertoire temporaire de travail
- pour chaque fichier du paquet installé (liste des fichiers récupérés dans la base de données pacman) faire selon le type de fichier dans le répertoire de travail :
1) création d'un répertoire si le fichier est un répertoire
2) création d'un lien vers le fichier se trouvant sur le système si le fichier est autre chose qu'un répertoire
3) et enfin création du paquet.
Pour le 3), il fallait que j'utilise l'option -h du programme tar en plus des options czf afin de déréférencer les liens (i.e. récupérer le fichier vers lequel le lien pointe au lieu de seulement prendre en compte le lien bêtement) que mon programme créait dans le répertoire de travail.
Mais le soucis était que si dans le paquet installé il se trouvait déjà un lien (dans mon programme je fais donc un lien sur un lien), ben tar déférençait de manière récursivement tous les liens.
Exemple :
- au niveau système :
- dans le répertoire de travail :
- quand le paquet était créé, un coup d'œil dans l'archive, on avait :où taille1 = taille2
- Donc le paquet, d'une part, ne respectait pas tous les types de fichiers, en l'occurrence les liens symboliques
- et d'autre part le paquet risquait en conséquence d'être plus volumineux que le paquet initial à cause du déférençage de tous les liens.
Donc maintenant, ce problème est résolu, en utilisant une ruse de siouskeuh ; on a toujours un répertoire de travail, mais celui-ci ne sert uniquement pour la création de répertoires puis ensuite je fais un tar czvf -T liste_fichiers (en me plaçant préalablement dans le répertoire de travail) avec comme contenu une liste des fichiers à paquager avec chemins relatifs pour les répertoires et chemins absolus pour les fichiers non répertoire...
Voilà, je peux pas faire mieux comme explication, j'espère que j'ai été assez clair
« Le bûge de la version 0.9 » *musique d'hypnose*
Au départ, le fonctionnement interne de mon programme était le suivant :
- création d'un répertoire temporaire de travail
- pour chaque fichier du paquet installé (liste des fichiers récupérés dans la base de données pacman) faire selon le type de fichier dans le répertoire de travail :
1) création d'un répertoire si le fichier est un répertoire
2) création d'un lien vers le fichier se trouvant sur le système si le fichier est autre chose qu'un répertoire
3) et enfin création du paquet.
Pour le 3), il fallait que j'utilise l'option -h du programme tar en plus des options czf afin de déréférencer les liens (i.e. récupérer le fichier vers lequel le lien pointe au lieu de seulement prendre en compte le lien bêtement) que mon programme créait dans le répertoire de travail.
Mais le soucis était que si dans le paquet installé il se trouvait déjà un lien (dans mon programme je fais donc un lien sur un lien), ben tar déférençait de manière récursivement tous les liens.
Exemple :
- au niveau système :
Code : Tout sélectionner
lrwx rwx rwx /usr/lib/lien_libtruc -> /usr/lib/lien_libtruc
_rwxr_xr_x /usr/lib/libtruc
Code : Tout sélectionner
lrwx rwx rwx $TMP/usr/lib/lien_libtruc -> /usr/lib/lien_libtruc
lrwx r_x r_x $TMP/usr/lib/libtruc -> /usr/lib/libtruc
Code : Tout sélectionner
_rwx rwx rwx /usr/lib/lien_libtruc taille1
_rwxr_xr_x /usr/lib/libtruc taille2
- Donc le paquet, d'une part, ne respectait pas tous les types de fichiers, en l'occurrence les liens symboliques
- et d'autre part le paquet risquait en conséquence d'être plus volumineux que le paquet initial à cause du déférençage de tous les liens.
Donc maintenant, ce problème est résolu, en utilisant une ruse de siouskeuh ; on a toujours un répertoire de travail, mais celui-ci ne sert uniquement pour la création de répertoires puis ensuite je fais un tar czvf -T liste_fichiers (en me plaçant préalablement dans le répertoire de travail) avec comme contenu une liste des fichiers à paquager avec chemins relatifs pour les répertoires et chemins absolus pour les fichiers non répertoire...
Voilà, je peux pas faire mieux comme explication, j'espère que j'ai été assez clair
Vite fait
Les scripts d'extension peuvent connaître le nom répertoire où se trouve les fichiers à repaquetager via la variable $pkg_dir.
EDIT: le changement du packager n'est pas géré. Il y a maintenant modification de .PKGINFO en fonction des fichiers réellement présents dans l'archive, ainsi que de leur poids total.
C'est carrément hacky.
Code : Tout sélectionner
file_stream | while read; do
case $REPLY in
%NAME%) pkginfo_var='pkgname';;
%VERSION%) pkginfo_var='pkgver';;
%DESC%) pkginfo_var='pkgdesc';;
%GROUPS%) pkginfo_var='group';;
%URL%) pkginfo_var='url';;
%LICENSE%) pkginfo_var='license';;
%ARCH%) pkginfo_var='arch';;
%BUILDDATE%) pkginfo_var='builddate';;
%PACKAGER%) pkginfo_var='packager';;
%SIZE%) echo "size = `du -cb . | tail -n 1 | awk '{print $1}'`" >> .PKGINFO;;
%REPLACES%) pkginfo_var='replace';;
%DEPENDS%) pkginfo_var='depend';;
%CONFLICTS%) pkginfo_var='conflict';;
%PROVIDES%) pkginfo_var='provide';;
%BACKUP%) pkginfo_var='backup';;
%*%) unset pkginfo_var;;
*)
if [ -n "$REPLY" -a -n "$pkginfo_var" ]; then
echo "$pkginfo_var = $REPLY" >> .PKGINFO
fi
;;
esac
done
Code : Tout sélectionner
function f_create_tar {
mkdir $FILE_PREP_DIR
cd $FILE_PREP_DIR
[ -e $package_dir/files ] || _f_missed_file files 2
sed -rne '/%FILES%/,/%BACKUP%/{/^(%FILES%|%BACKUP%| *)$/d;p}' $package_dir/files > .FILELIST
# Filtre pour récupérer seulement le répertoires
sed -rne '/^.+\/$/p' .FILELIST | \
while read; do
mkdir -p $FILE_PREP_DIR/$REPLY
done
if [ -e $package_dir/install ]; then
cd $FILE_PREP_DIR
cp $package_dir/install .INSTALL
fi
for directory in `grep "/$" .FILELIST`; do
mkdir -p $directory
done
for file in `grep "[^/]$" .FILELIST`; do
cp -a /$file $file
done
export pkg_dir=$FILE_PREP_DIR
if [ -d /etc/repacman.d ]; then
for addon in `ls /etc/repacman.d/*`; do
if [ -x $addon ]; then
. $addon
fi
done
fi
unset pkg_dir
f_generate_pkginfo
tar cvf /dev/null * | sort >.FILELIST
tar czvf $CURRENT_DIR/$pkgname_ver.pkg.tar.gz --exclude=. --exclude=.. * .*
}
EDIT: le changement du packager n'est pas géré. Il y a maintenant modification de .PKGINFO en fonction des fichiers réellement présents dans l'archive, ainsi que de leur poids total.
C'est carrément hacky.
Dernière modification par mimas le sam. 05 mai 2007, 14:26, modifié 1 fois.
Anarchy for the triple A.
- gyo
- Maître du Kyudo
- Messages : 1049
- Inscription : jeu. 19 avr. 2007, 10:40
- Localisation : Nantes (44)
Pour tous rapports de bugs et demande d'amélioration au sujet de repacman ça se passe par ici maintenant -> http://bugs.archlinux.fr/index.php?tasks=all&project=5 (merci Warnaud \o/)
- warnaud
- Maître du Kyudo
- Messages : 1640
- Inscription : ven. 11 août 2006, 17:05
- Localisation : Rolle (CH)
de rien ^_^"
Plus ça rate, plus ça a de chance de réussir. En somme, un succès n'est qu'une erreur qui a finit par réussir (même par erreur). Ne déséspérez donc pas et perseverez. Utilisez La Rache™
Patientia quod lard quod barrus planto diligo ut licentia
—¤÷(`[¤*Powered By *¤]´)÷¤—
Archlinux ~ Fvwm ~ Irssi ~ URxvt
Patientia quod lard quod barrus planto diligo ut licentia
—¤÷(`[¤*Powered By *¤]´)÷¤—
Archlinux ~ Fvwm ~ Irssi ~ URxvt