Florent Peterschmitt

Gérer ses dépôt RPM - script maison

Plop, on va faire simple. J’avais besoin de gérer des dépôts de paquets RPM et aussi envie de faire mumuse avec python. Bah ça donne ça :

On a le script buildrpmrepo.py qui affiche une zolie aide :

$ ./buildrpmrepo.py --help
Usage: buildrpmrepo.py [options]

Options:
  -h, --help         show this help message and exit
  --base=BASE        base dir for everything
  --version=VERSION  version of distro
  --arch=ARCH        architecture
  --repo=REPO        repository for symlinks to rpm
  --fake             run fake remake
  --real             run real remake
  --unsigned         link unsigned packages
  --verbose          if an action is performed, say it
  --report           like verbose but makes a report of all actions
  --cleanup          clean old versions/release of a package. dont touch
                     signed packages unless --force-delete
  --force-delete     force deletion of old packages, event if signed. use with
                     CAUTION.
  --wipe-repo        wipe repository instead of just remake missing/invalid
                     symlinks to RPM

Un petit n’exemple (tiré du code source) :

How to use ?

/home/rpmuser/rpm  <-- base dir

Where we have RPMs:
base
    RHEL6              <-- version
        noarch          <-- unvalid version/arch
        i686              <-- valid version/arch
        x86_64          <-- valid version/arch
        other_rpms   <-- for rpms from « outside », arch automaticaly discovered

Where we have repositories:

base
    www/RHEL6-x86_64/RPMS.test    <-- repository's root/name

Have a look in __init__, for __www and __link_relative

Use example for previous tree:
./buildrpmrepo.py --base /home/racvision/rpm --version RHEL6 --arch x86_64 --repo RPMS.test --cleanup --unsigned --real --report

En français :

  • pour les paquets de la distribution RHEL6-x86_64
  • créer/mettre à jour le dépôt RPMS.test, nettoyer les anciens paquets non signés (—force-delete supprimera aussi les paquets signés)
  • prendre les paquets non signés dans le dépôt (ne pas mettre cette option ne fera prendre que les paquets signés)
  • faire réellement les actions demandées (—fake fait une simulation)
  • afficher un rapport d’exécution à la fin. (—verbose affiches les actions au fil de l’exécution)

Et on obtient ce genre de chose :

$ ../br-racdev-rh6-64.sh
=> Working on repo RPMS.racdevel for RHEL6 on arch x86_64
=> Options:
          * Take unsigned packages
          * Keep valid symlinks
          * Real mode
          * Print report at the end
4/6 Deleting duplicated packages…
 * check_mk
         + delete check_mk-1.2.0p2-201306051211.noarch.rpm signed: False
         +   take check_mk-1.2.0p2-201306051410.noarch.rpm signed: False
6/6 Populating repo…
Spawning worker 0 with 1 pkgs
Workers Finished
Gathering worker results

Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete

 + delete old : check_mk-1.2.0p2-201306051211.noarch.rpm (signed: False)
 + removed symlink : check_mk-1.2.0p2-201306051211.noarch.rpm
 + linked : check_mk-1.2.0p2-201306051410.noarch.rpm

À partir de « spawning worker » jusqu’à « sqlite DBs complete », c’est createrepo —update qui prend le relais, pour tout le reste, c’est pyrpm-manage. C’est sous licence BSD (histoire d’en avoir une) ça requière python 2.6/2.7, python-rpm et ça tourne sur RHEL/CentOS 6, Fedora et même Debian (unstable).

Have fun.

Comments