Convertir un RPM en tgz
À mon travail, j’ai un compte Unix sur un serveur AIX sur lequel il n’y a pas tout ce que je veux…; Du coup j’ai envie d’en ajouter un peu…;
Première solution: compiler moi-même les programmes que je veux. Problème: il faut le compilateur, il faut arriver à compiler (et ce n’est pas toujours évident sous AIX — c’est un PowerPC, beaucoup de programmes systèmes ne sont pas identiques à Linux, l’assembleur d’IBM est buggé, etc.).
Deuxième solution; installer les RPM fournis par Redhat. Il faut bidouiller son .rpmmacros. Mais les RPM d’IBM sont mal conçus et ne sont pas relocalisables. Les RPM utilisent en dur /opt/freeware et ne sont pas relocalisables. Bouhhhh.
Dernière solution: extraire le contenu du RPM et l’utiliser tel quel. Je fais cela avec rpm2cpio et cpio. Mais comme le rpm2cpio d’AIX semble buggué, j’ai eu l’idée de faire ça sous Linux pour générer un tgz…; Voici mon programme:
[python]
#!/bin/sh
#verbose. set to ‘v’ for verbose mode
v= »
#the original working directory (in order to restaure context)
pwdorig=$(pwd)
if [ « $v » == « v » ] ; then
echo pwdorig=$pwdorig
fi
#catch interrupt
trap ‘echo « Cleaning up » >&2; cd « $pwdorig » ; rm -rf $tmp ; exit’ 1 2 3 15
RDS_extract() {
echo « Extract RPM $file »
cd $tmpdir
rpm2cpio $file | cpio -id$v |
}
RDS_tarball() {
echo « Build tarball $destfile »
cd $tmpdir
tar c${v}zf $destfile *
}
RDS_finish(){
echo « Cleaning temp files »
cd $pwdorig
cp $tmpdir/$destfile .
rm -rf $tmpdir
}
echo « rpm2tgz $* »
for file in $*
do
tmpdir=$(mktemp -d)
destfile=$(dirname $1)/$(basename $file .rpm).tgz
#$file is the absolute path of the file
if [ ! « $(echo $file | cut -c 1) » = « / » ] ; then |
file=$pwdorig/$file
fi
RDS_extract
RDS_tarball
RDS_finish
done
[/python]
Et oui, je sais: j’ai réinventé la roue.