L'outil du jour : xbindkeys

19/04/2011 by nono

Dans la série « petit programme qui n'a l'air de rien », une des bases de mon environnement X11 : xbindkeys. Ça sert à lier des commandes à des combinaisons de touches. Par exemple, pour lancer un xterm avec Control-F1 et Emacs avec Control-F2, j'ai mis ces quelques lignes dans mon fichier ~/.xbindkeysrc :

"xterm"
  m:0x4 + c:67

"emacs"
  m:0x4 + c:68

J'en ai quelques autres comme ça, y compris le verrouillage de l'écran par Control-F12 :

"xscreensaver-command -lock"
  m:0x4 + c:96

Xbindkeys peut aussi utiliser les boutons de la souris en plus du clavier. Sa configuration peut aussi s'écrire en Scheme, ce qui a l'air de permettre plus de souplesse, mais je n'en ai pas encore ressenti le besoin.

Posted in geekeries

Un peu de transcodage vidéo 2 : le retour

12/04/2011 by nono

J'en causais ici, 2-3 corrections et ajouts :

  • Les codecs audio de ffmpeg étant ce qu'ils sont, si on a déjà du son qui va bien à la base, il vaut mieux le garder :
    ffmpeg -i beat_it.mp4 -acodec copy -vcodec libx264 \
      -aspect 16:9 -vpre normal -metadata artist="Les Fourmis Acidulees" \
      -metadata title="Beat It" beat_it-web.mp4
  • La syntaxe de ffmpeg2theora est un poil différente ; la commande suivante donnera un fichier beat_it.ogv :
    ffmpeg2theora beat_it.dv --optimize --aspect 16:9 \
      --nometadata --no-oshash --artist "Les Fourmis Acidulees" \
      --title "Beat It" --date "26/02/2011" --location "Les Trois Arts"

Posted in geekeries

Le piège à con du jour : grub et ext3

18/03/2011 by nono

Un bug à la con qui m'a bloqué pendant une journée, bon à savoir.

J'avais un serveur sous Linux au disque dur un peu malade (quand smartctl arrête de compter les blocs défectueux parce qu'il y en a trop, c'est «un peu» malade) et pas trop moyen de l'arrêter une heure le temps de réinstaller l'OS sur un disque vierge. Qu'à cela ne tienne : je branche le nouveau disque sur une autre machine, j'y recopie le système (les données étaient sur des disques intacts), plus qu'à changer le disque, booter sur un CD et installer grub. Durée prévisible de la manip : un quart d'heure en comptant large.

Sauf qu'au dernier moment, pas moyen d'installer grub : monsieur se plaignait de ne pas trouver le fichier /boot/grub/stage1. Pourtant il était là, ce fichier, pas de raison qu'il ait bougé, et il était bien identique à celui d'une machine en état de marche.

Finalement, la clé de l'énigme est là :

[root@carrosse ~]# dumpe2fs /dev/sda1 | grep -i inode.size
dumpe2fs 1.41.12 (17-May-2010)
Inode size:               256

Sur une Fedora récente, par défaut, mkfs.ext3 crée les systèmes de fichiers ext3 avec des i-noeuds de 256 octets. Or mon serveur tourne sous CentOS 5, qui utilise par défaut des i-noeuds de 128 octets. Et bien entendu, le grub de CentOS ne sait pas lire les systèmes de fichiers «à la Fedora».

Y'a des jours, on est content de voir arriver le week-end.

Posted in geekeries

It's alive!

06/03/2011 by nono

Ça y est, les insectes avec un goût bizarre ont leur site web. :-)

http://www.fourmis-acidulees.fr/

Posted in musique

Un peu de transcodage vidéo

06/03/2011 by nono

Juste histoire de ne pas oublier, ce blog est un bloc-notes comme un autre. :-)

Pour convertir une vidéo en h264 :

ffmpeg -i beat_it.dv -acodec libmp3lame -vcodec libx264 \
  -aspect 16:9 -vpre normal -metadata artist="Les Fourmis Acidulees" \
  -metadata title="Beat It" beat_it.mp4

Pour la convertir en Ogg Theora :

ffmpeg2theora -i beat_it.dv --optimize --aspect 16:9 \
  --nometadata --no-oshash --artist "Les Fourmis Acidulees" \
  --title "Beat It" --date "26/02/2011" --location "Les Trois Arts" \
  beat_it.ogv

La finalité, c'est ce greffon Wordpress.

EDIT : Et la version Flash, pour les gens qui sont encore au XXème siècle :

ffmpeg -i beat_it.dv -aspect 16:9 -s 426x240 -ar 44100 \
  -metadata artist="Les Fourmis Acidulees" \
  -metadata title="Beat It" beat_it.flv

Posted in geekeries

Lancer puppet depuis cron

24/02/2011 by nono

Puppet, c'est bien. Ça a juste un tout petit inconvénient : c'est écrit en ruby, avec la consommation mémoire que ça implique. Vous me direz, 200 Mo, sur une machine moderne, c'est rien. Sauf que si vous commencez à jouer avec des isolateurs, vous allez vite vous rendre compte que 30 fois 200 Mo, ça finit par faire beaucoup. Surtout pour un outil qui passe 98% de son temps à dormir (non, il ne libère pas la mémoire pour autant).

J'ai donc pondu un petit bout de script shell pour lancer puppetd uniquement quand on a besoin de lui. J'en ai profité pour améliorer un peu la gestion de la périodicité. En gros,

  • par défaut, puppetd tourne une fois par heure,
  • si le fichier /var/run/puppet/run-often existe, il tourne toutes les 5 minutes pendant une heure au plus (il supprime le fichier après ce délai),
  • si le fichier /var/run/puppet/never-auto-run existe, il refuse de tourner (pratique pour les maintenances où on ne veut pas se battre contre puppet).

Tout ça, c'est géré par cron de cette façon :

*/5 * * * * /usr/local/sbin/run-puppet -often
42 * * * * /usr/local/sbin/run-puppet

Notez que ces deux invocations ne lancent pas puppetd immédiatement ; elles attendent «un certain temps» (calculé en fonction de l'adresse IPv4 de la machine, je voulais des intervalles fixes entre deux passages de Puppet).

Le script accepte aussi une option -now qui lui indique de lancer puppet immédiatement ; cette option est conçue pour invoquer le script directement en ligne de commande.

Finalement, le script lui-même :

#!/bin/bash
#
# Arnaud Gomes 2010
#
# Trigger a puppet run.
#
# Usage:
#
#   run-puppet
#       Run sometime in the next hour.
#
#   run-puppet -often
#       Run sometime in the next 5 minutes if $runoftenfile exists.
#
#   run-puppet -now
#       Run now.
#
# This script will exit immediately if $dontrunfile exists.
#
# Needs /usr/bin/lockfile (from procmail).

flagdir="/var/run/puppet"
runoftenfile=${flagdir}"/run-often"
dontrunfile=${flagdir}"/never-auto-run"
lockfile=${flagdir}"/lock"
puppetd="/usr/sbin/puppetd"
flags="--no-daemonize --onetime --no-splay"

usage () {
        echo "Usage: $0 [ -often | -now ]"
        exit 1
}

dontrun () {
        echo "$dontrunfile present, skipping this run."
        exit 0
}

run () {
        lockfile $lockfile
        $puppetd $flags
        rm -f $lockfile
}

[ $# -le 1 ] || usage
[ -f $dontrunfile ] && dontrun

# $seed is used for computing splay time. We do not make it random
# as we want each machine to run puppet every hour (or whatever), not
# "more or less randomely averaging to once every hour".
#
# This horrible perl thing just means "last two bytes from IPv4 address,
# reversed". We reverse them as the last byte probably is more evenly
# distributed.
seed=$(($(facter ipaddress | perl -pe 's/^([0-9]+\.){2}([0-9]+)\.([0-9]+)$/$3 * 256 + $2/')))
splay=$(($seed % 3600))

# Exit if called with -often and no $runoftenfile.
# If $runoftenfile is here, we run within 5 minutes instead of within
# an hour.
if [ "$1" = "-often" ]
then
        [ -f $runoftenfile ] || exit 0
        splay=$(($seed % 300))
fi

# Of course option -now removes any splay time.
if [ "$1" = "-now" ]
then
        splay=0
        flags="$flags --verbose"
fi

sleep $splay
run

# Remove $runoftenfile after an hour. We don't want to run every 5 minutes
# for ever, only when needed.
[ -f $runoftenfile ] && find $runoftenfile -cmin +60 -exec rm -f {} \;

Posted in geekeries

L'outil du jour : nagstamon

10/12/2010 by nono

Juste un petit post rapide pour mentionner un outil qu'il est bien : nagstamon. Ça se présente sous la forme d'une petite icone qui s'insère dans votre *panel ou votre barre de ce que vous voulez et qui affiche une synthèse de l'état de votre nagios (vert = tout va bien, rouge = problème).

Je surveille mes serveurs uniquement aux heures de bureau (pas d'astreintes) et à l'usage l'icone rouge en bas à droite du bureau constitue une remontée d'alerte nettement plus efficace qu'un courrier électronique.

Posted in geekeries

Des sauvegardes à la maison

28/11/2010 by nono

Je suis administrateur système. Je sais faire des sauvegardes. Je sais même en ressortir des données en cas de besoin. Sauf que les systèmes « lourds » que j'utilise au boulot sont assez peu adaptés à un usage domestique.

J'ai (principalement) deux machines à la maison : un PC de bureau assez récent et raisonablement puissant et un petit serveur qui ronronne dans un coin (c'est lui qui héberge ce blog, entre autres). Pour le PC de bureau, pas de problème, je branche de temps en temps un disque externe et j'ai un bout de script à base de rdiff-backup qui fait le reste. Je pourrais faire de même pour le serveur ; je l'ai même fait pendant pas mal de temps. Sauf que le disque externe qui servait à ça a fini par devenir trop petit, alors que le disque interne de mon PC de bureau est presque vide. Le genre de problème qui a de quoi vous motiver un geek.

Une machine virtuelle

Pourquoi utiliser une machine virtuelle pour héberger mon serveur de sauvegardes, plutôt qu'héberger le service directement sur le PC ? Plein de raisons :

  • ça évite de tout casser lors des mises à jour (j'utilise une distribution Linux assez réputée dans ce domaine),
  • si j'ai besoin de tirer un peu sur le PC (pour faire du mixage audio par exemple), je peux arrêter la machine virtuelle et je suis sûr qu'une sauvegarde ne se déclenchera pas au mauvais moment,
  • j'avais envie de jouer avec KVM et avec la libvirt.

Bref, me voilà parti à jouer avec la couche de virtualisation de Fedora. Rien de bien sorcier : après un petit tour dans la doc, j'ai créé un groupe libvirt dans lequel j'ai ajouté mon compte et j'ai ajouté ou modifié les lignes suivantes dans /etc/libvirt/libvirtd.conf :

unix_sock_group = "libvirt"
unix_sock_rw_perms = "0770"
auth_unix_rw = "none"

Je peux maintenant lancer virt-manager en tant qu'utilisateur de base ; ensuite, il n'y a plus qu'à cliquer. J'ai donc créé une machine virtuelle appelée backuppc et j'y ai installé une Debian Squeeze.

BackupPC

J'ai ensuite installé l'excellent BackupPC dans la machine virtuelle en question. Opération très compliquée :

aptitude install backuppc

L'installeur du paquet Debian génère un mot de passe pour accéder à l'interface web de BackupPC ; il vaut mieux le garder sous le coude, il resservira plus tard.

À part ça, c'est prêt, BackupPC est installé et va maintenant sauvegarder automatiquement... bah, il va falloir lui dire quoi. Ça peut tout à fait se faire à l'ancienne en allant éditer la config dans le répertoire /etc/backuppc/. Comme j'avais envie de faire dans le high-tech et d'utiliser l'interface web, j'ai procédé autrement.

mDNS

À ma droite, une machine (virtuelle) qui obtient son adresse IP en DHCP (par dnsmasq). À ma gauche, un navigateur web. Comment leur apprendre à parler entre eux ? Mais c'est bien sûr, c'est un boulot pour mDNS !

Serveur : la machine virtuelle

De ce côté, pas grand chose à faire :

aptitude install avahi-daemon

Ça installe un serveur mDNS et ça lance tout ce qu'il faut comme il faut. Pour une fois que c'est Debian qui fait simple, ça mérite qu'on le souligne. :-)

Client : le PC sous Fedora

Sur le principe, c'est à peine plus compliqué :

yum install nss-mdns

Ça installe les bouts de résolveur qui vont bien et ça va éditer /etc/nsswitch.conf comme il faut. Dans le détail, ça se passe sur cette ligne :

hosts:      files mdns4_minimal [NOTFOUND=return] dns

Ce qui est important, c'est mdns4_minimal ; ça veut dire « quand tu veux résoudre un nom qui se termine par .local, va voir si des fois il n'y aurait pas une adresse IPv4 annoncée en mDNS pour aller en face. Pourquoi seulement .local ? Simplement pour éviter les timeouts. Si vous y tenez, vous pouvez remplacer mdns4_minimal par mdns4 pour changer ce comportement, mais ne venez pas vous plaindre ensuite que vous avez transformé votre PC formule 1 en char à boeufs. Pourquoi seulement en IPv4 ? Parce qu'en IPv6, sur les sous-réseaux sans routeur (ce qui est par défaut le cas du réseau virtuel géré par la libvirt), vous ne récupérerez que des adresses lien-local qui ont des chances d'être inutilisables.

Mais alors, maintenant, si je tape host backuppc.local, ça va me renvoyer l'adresse IP de ma machine virtuelle ? Hé non, tout simplement parce que la commande host fait directement une résolution DNS sans passer par NSS. Dommage, c'était bien essayé.

Mais alors, maintenant, si je tape ping backuppc.local, ça va marcher ? Hé non, mais là c'est plus embêtant. Après enquête rapide, c'était la faute au pare-feu de la machine hôte qui bloquait le port UDP 5353 (celui ou les échanges mDNS passent sur le groupe multicast 224.0.0.251). Une fois le dit port ouvert, ça devrait mieux marcher.

Mais alors, maintenant... ? Non, toujours pas. Parce que quand la libvirt configure le pont virtuel virbr0 où les machines virtuelles invitées sont accrochées par défaut, elle configure une NAT sur tout ce qui sort du port en question (bien), et que la NAT en question ratisse un peu trop large et touche à la source des paquets multicast. En quoi c'est grave ? Ça change le port source des paquets mDNS, qui devrait toujours être le port UDP 5353. Et ça déplait profondément à Avahi (l'implémentation de mDNS la plus courante sous Linux). Et comme les choses sont bien faites, la libvirt ajoute ses règles avant celles qui sont déjà configurées (pas moyen donc d'ajouter explicitement une exception dans la config iptables de la machine) et les règles en question sont en dur dans son code (bande de cons).

Une lueur d'espoir : les versions récentes de la libvirt disposent de hooks qui permettent de lui faire exécuter nos propres scripts. Sauf que manifestement le script daemon est exécuté avant la mise en place des règles iptables, ce qui ne nous aide pas. La seule solution que j'ai trouvée est d'ouvrir le pare-feu dans le script qemu, ce qui marche mais qui n'est pas propre (ça va insérer la même règle une fois pour chaque machine virtuelle lancée). Au final ça donne un script /etc/libvirt/hooks/qemu qui ressemble à ça :

#!/bin/sh

PATH=/sbin:/usr/sbin:/bin:/usr/bin

if [ "$2" = "start" ]
then
        iptables -t nat -I POSTROUTING 1 -d 224.0.0.0/4 -j RETURN
fi

if [ "$2" = "shutdown" ]
then
        iptables -t nat -D POSTROUTING -d 224.0.0.0/4 -j RETURN
fi

Apparemment il y a moyen de faire à peu près la même chose avec le driver de filtre réseau de la libvirt, mais ça reste lié à chaque machine invitée plutôt qu'à l'hôte lui-même.

Une fois que tout ce bazar est en place, ça finit par tomber en marche :

arnaud@carrosse:~% getent hosts backuppc.local
192.168.122.231 backuppc.local

Yapluka !

Ça y est, c'est prêt, l'interface web de BackupPC est accessible à l'adresse http://backuppc.local/backuppc/. Le login de l'administrateur est backuppc, est le mot de passe est celui dont il était question quelques paragraphes plus haut. L'interface web permet d'éditer directement la config du serveur, y compris la liste des machines à sauvegarder.

Pour ma part, j'utilise la méthode de sauvegarde rsync qui s'appuie sur rsync (on l'aurait deviné) et ssh. Il faut donc que l'utilisateur backuppc de la machine virtuelle ait le droit de se connecter en ssh aux machines à sauvegarder, sous un compte ayant assez de droits pour lire tout ce qui doit être sauvegardé et écrire tout ce qui doit être restauré. Pour ma part j'utilise le compte root ; il y a sûrement moyen d'affiner un peu, mais dans mon cas ça ne vaut pas le coup (ça concerne tellement de fichiers qu'un utilisateur qui y a accès pourra de toute façon tout casser, root ou pas). Sur la machine virtuelle, donc :

su - backuppc
ssh-keygen -t rsa
(laisser la passphrase vide)
ssh-copy-id root@monserveur

En cliquant dans l'interface, j'ai généré un fichier de config pour la machine à sauvegarder qui ressemble à ça :

$Conf{RsyncShareName} = [
  '/etc',
  '/var/www/html',
  '/home'
];
$Conf{XferMethod} = 'rsync';

Ce fichier s'appelle /etc/backuppc/lenomdelamachine.pl ; vous pouvez bien sûr l'éditer avec votre vi favori, mais si vous retournez cliquer dans l'interface il se peut que vous perdiez vos modifs si elles sont un peu trop compliquées pour l'éditeur de config. À manier avec précaution donc.

Conclusion

J'ai juste décrit les grandes lignes de ma config, ce blog n'est pas vraiment le lieu pour réécrire la doc de BackupPC ; je vous encourage tout de même à vous plonger dans le logiciel, sous des apparences un peu rustiques il s'avère excellent pour ce qu'il sait faire, c'est à dire sauvegarder des « petites » machines, y compris des portables (mais pas des gros serveurs, pas qu'il ne sache pas faire, mais ça demande une machine de sauvegarde puissante et dotée d'un stockage performant). Dans un autre contexte, je l'utilise pour sauvegarder plusieurs dizaines de postes de travail et il donne toute satisfaction.

Posted in geekeries

Mes aventures au pays du wifi

07/11/2010 by nono

Je suis depuis peu l'heureux utilisateur d'un netbook flambant neuf et ma foi de fort bonne facture. L'occasion de ressortir ma bonne vieille Apple Airport.

Sauf que l'Airport a quelques gros incovénients, à commencer par son âge canonique et ce qui va avec (en gros, elle parle 802.11b agrémenté d'un pitoyable chiffrement WEP). Surtout, elle n'est administrable qu'en utilisant un logiciel privateur, qui peut tourner sur un système pas trop hostile, certes, mais tout de même. Un de ces jours, j'y installerai Linux, mais en attendant je cherchais quelque chose d'un peu plus moderne.

Entre les considérations dont je vous assomme dans le paragraphe précédent et mon expérience avec OpenWrt, que j'utilise au boulot, j'ai donc décidé de m'offrir un nouveau routeur wifi. Mon premier choix s'était porté sur un TP-Link 1043 qui s'est malheureusement révélé à peu près introuvable en magasin. Dommage, 5 ports gigabit et un port USB, ça ouvre pas mal de possibilités. Je me suis donc rabattu sur le premier modèle venu, le sachant supporté par OpenWrt.

Bah non.

Raté.

Parce que monsieur Dlink ne trouve rien de mieux à faire que de vendre des machines différentes sous la même référence. Et OpenWrt sur un DIR-615 D1, (notez le D1, c'est important), bah ça marche pas. Ou plutôt si, ça marche depuis quelques jours, mais on sent bien que la peinture est encore fraiche.

Ce qui ne m'a pas empêché de m'y essayer, pensez bien, sinon ça ne serait pas drôle. Téléchargement, installation, tout comme dans le livre, tout marche très bien sauf le wifi. Pas que ce soit une idée fixe, mais quand même, sur un routeur wifi, ça peut être pratique, parfois. Pas grave, me dis-je, je vais réinstaller le firmware de Dlink et j'y reviendrai quand j'aurai un peu plus de temps.

J'en profite pour télécharger la dernière version du dit firmware, et c'est parti comme dans la doc : je copie mon fichier lefirmware.bin sur le routeur, et je tape la commande qui va bien :

mtd -e firmware -r write monfirmware.bin firmware

Important de s'en souvenir, de celle-là : elle casse très bien le routeur. Si, si, je vous assure. Un bon moyen de transformer un Dlink en D-brique.

Heureusement, monsieur Dlink a pensé à mettre un cheat code sur sa machine. Encore plus heureusement et contrairement à ce qu'on peut lire un peu partout, sur le DIR-615 en tout cas, c'est utilisable avec Firefox (en tout cas la version fournie avec Ubuntu 10.10). Bref, quelques clics plus tard, voilà mon DIR-615 revenu à sa configuration première avec un firmware marqué Dlink dessus. Juste une chose importante à retenir : le firmware de secours héberge bien un serveur web, mais il ne sait pas répondre à un ping. Ça peut surprendre au premier abord.

Et vous savez quoi ? Il a même gardé sa config. :-)

Posted in geekeries

La haute disponibilité dans la vraie vie

03/08/2010 by nono

Voici les transparents de ma présentation d'hier.

La haute disponibilité dans la vraie vie

Posted in geekeries