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.

Portal premier du nom sous GNU/Linux

Ça marche bien, quelques freeze habituels avec les jeux Valve sous Linux (liés à ma carte graphique Intel HD3000 sans doute) mais… un nouveau joueur verrait ses parties gâchées par quelques glitchs. Voyez plutôt :

Bon en tout cas, ça ne m'enpêchera pas de faire quelques sauts !

L'IPv6 sur FreeBSD 9-STABLE

Les variables ipv6_enable et ipv6_prefer sont dépréciées sur FreeBSD 9.1-RELEASE et encore plus sur 9-STABLE, et après un long moment à me demander pourquoi le serveur perdait sa route par défaut, qui en plus était mauvaise, un peut de man rc.conf et j'ai fini par trouver comment bien faire.

ip6addrctl_policy="ipv6_prefer"
ipv6_activate_all_interfaces=yes
ifconfig_em0_ipv6="inet6 2001:41d0:8:b81f::1 prefixlen 64"
ipv6_defaultrouter="2001:41d0:8:b8ff:ff:ff:ff:ff"

Bien entendu, adapter l'ip/interface/préfixe à ce qui vous avez. Aller en prime, une définition d'alias sur une interface :

ifconfig_em0_alias0="inet6 2001:41d0:8:b81f::2 prefixlen 128"

Un petit coup de /etc/netstart et voilà la conf réseau qui roule ;)

ZFS - FreeBSD 9.1-RELEASE et 9-STABLE

Bon, cette fois plutôt que de tout expliquer parce que c'est déjà fait, je vous propose un script adaptable très facilement en fonction de vos besoins.

Je vous conseil de vous faire un « mirroir » pour l'installation. Téléchargez le script, les archives que vous voulez, mettez ça sur quelconque serveur web/FTP, modifiez le script selon vos besoins et zou !

Ajoutez aussi quelques fichiers de conf dont vous pouvez avoir besoin pour votre machine. Par exemple, un serveur qui une fois démarré n'est plus accessible que par le réseau… a besoin d'avoir le réseau configuré au démarrage. Captain obvious !

  • Démarrez en mode LiveCD (ou en rescue-pro chez OVH ça marche aussi)
$ root
$ kbdmap

  • Configurez le réseau : dhclient, ifconfig…
$ dhclient <interface>
$ # Ou alors
$ ifconfig <interface> <ip>

$ cd /tmp
$ fetch http://<source>/zfs.sh
$ chmod +x zfs.sh
$ ./zfs.sh

  • Vous être chrootés dans le nouveau système, bricolez, rebootez, savourez !

#!shebang - fixit

Les vilains

Des personnes peu scrupuleuses qui n'utilisent pas les bons outils pour déclarer leur shebang et qui enquiquinent le monde avec des #!/usr/bin/python quand on veut #!/usr/local/bin/python, il y en a beaucoup. C'est chiant, voilà.

Sous FreeBSD :

find . -name "*.py" -exec sed -e '1 s@^#\!/usr/bin@#\!/usr/local/bin@g' -i "" {} \;

Les gentils

Les gentils eux font les choses comme cela :

#!/usr/bin/env truc_qui_va_mouliner_le_script

Bon par contre en utilisant cette technique, on se retrouve à ne pas pouvoir passer de paramètre à notre moulinette. Cependant, quand on fait bien les choses, on ne devrait pas en avoir besoin ;)