S'abonner au Flux RSS

mercredi, décembre 12 2012

Passer le temps en geekant

Un inconvénient d'être freelance et que l'on a parfois du temps chômé entre les missions, l'avantage quand on est geek c'est que cela donne du temps pour geeker :-) J'ai donc profité de ces derniers jours pour assouvir mon envie de jouer avec icecast ; depuis toujours passionné de radio il me tardait de trouver l'idée qui me permettrait de créer un projet autour de cet outil. Deux autres éléments ont été à l'origine de mon idée, tout d'abord la découverte de l'excellente radio http://www.ledjamradio.com/ puis plus récemment de jukebox. Je serais presque jaloux de ledjam d'avoir eu l'idée de cette radio et du système de vote, mais je le suis totalement de leur jingles ; là vous devez faire une pause et lancer la radio dans un onglet. En ce qui concerne Jukebox j'ai apprécié l'interface mais beaucoup moins l'architecture qui en fait au final un outil un plutôt instable (notamment à cause de libshout).

Cette introduction faite il est temps de lâcher le morceaux, j'ai utilisé ces 4 derniers jours à coder Calorine (jeu concours : trouver ce qui a inspiré ce nom), la base de l'idée avoir une radio communautaire, dédiée à un groupe restreint comme le serait par exemple un canal IRC Écouter une radio à plusieurs même dans des lieux physiques différent créé une ambiance de groupe qui se rapproche de la sensation d'équipe dans un bureau commun, c'est très agréable de pouvoir chambrer un peu les collègues sur leurs goûts musicaux du vendredi (ils se reconnaîtront).

Venons-en aux fonctionnalités de Calorine, stream d'une playlist composées à plusieurs de façon communautaire sans hiérarchie, ça c'est la base. La radio dispose d'un pool de fichier ogg/vorbis dans lequel l'auditeur pioche, il ajoute ses titres à la playlist commune. Tout un chacun peut également consulter la playlist en cours et ajouter un vote à un titre, les titres avec le plus grand nombre de votes sont joués en premier, viennent ensuite les titres les plus anciens dans la playlist, et enfin si celle-ci est vide un titre aléatoire est joué. On a pour faire cela une interface écrite en Django ainsi qu'un bot IRC qui annonce le titre joué sur le canal et permet d'ajouter un titre à la playlist en effectuant une recherche full-text sur les ID3 du fichier musical.
Sur le principe technique, les path des fichiers sont stockés dans la base de données utilisées par l'app django. Icecast2 stream le flux audio, ices2 alimente le flux avec le mode script, ices2 appelle un script pour obtenir le chemin du fichieir audio à lire. J'ai préféré cette méthode de couplage ices/icecast plus robuste que d'utiliser libshout comme le fait Jukebox, cela donne aussi une totale indépendance entre l'ihm et le flux radio. L'indexage full-text est lui réalisé avec Haystack et le backend whoosh (des tests de solR sont en cours). Dans le repo il y 2 scripts qui permettent pour l'un d'alimenter la base de données (fill.py) et pour l'autre de convertir un répertoire de fichier mp3 en ogg (covert.py).
Comme tout projet de 4 jours il y a des petits bugs partout et beaucoup de chose à finir, mais c'est déjà fonctionnel et nous permet de nous faire mutuellement découvrir des titres.
Si vous souhaitez monter votre radio communautaire tout est dispo sous GPL sur github.

lundi, octobre 29 2012

Nagios et les MIBS perdues dans Debian

Il faut désormais activer non-free dans Debian pour pouvoir utiliser les MIBS snmp ( voir http://wiki.debian.org/SNMP), action qui n'est pas réalisable dans de nombreuses architectures. Sans les MIBS utiliser SNMP devient vite une gageure, devoir déclarer les commandes Nagios en se basant sur les OID des directives extend est fastidieux et difficilement maintenable dans le temps. Afin de simplifier cette utilisation j'ai écrit un script pour simplifier la déclaration dans Nagios en se passant des MIBS.

mibchecks génère les définitions Nagios en analysant le fichier de configuration du démon snmp, il est disponible sur gitorious pour download et/ou fork.

Repo : https://gitorious.org/mibchecks/mibchecks

mibchecks lit le fichier /etc/snmp/snmpd.conf, en extrait les définitions extend, convertit les noms de commandes en OID et écrit sur la sortie standard les définitions de command à inclure dans la configuration de nagios. Un exemple de sortie.

Le script est actuellement en version 1.0.2 et attend vos patch et/ou amélioration.

jeudi, août 16 2012

Utiliser CLOC avec Jenkins

J'utilise depuis quelque temps l'outil d'integration continue jenkins et j'apprécie de pouvoir suivre le nombre de lignes de codes dans mes développements, peut-être pas orgeuil, mais découvrir 3 mois plus tard l'existence d'une librairie qui remplace 10K lignes de code maison rend aussi plus humble. Je me suis donc penché sur la longue liste de plugins pour Jenkins et ai utilisé pendant un temps le SLOCCount Plugin.

SLOCCount bien que faisant le travail n'a pas évolué depuis 2004 et surtout il ne détecte pas l'ensemble des langages utilisés dans mes projets, comme par exemple JavaScript. J'ai alors recherché d'autres outils de métriques de code et j'ai trouvé CLOC qui est plus récent et plus exhaustif que SLOCCount. CLOC annonce (cloc --show-lang) reconnaitre 100 langages quand SLOCCount n'en identifie que 27, loin d'utiliser autant de langage CLOC couvre au moins mes besoins en identifiant ceux qui m'intéressent.

Voulant utiliser CLOC au lieu de SLOCCount j'ai cherché en vain un plugin pour Jenkins. Le plugin SLOCCount lui par contre me satisfaisant j'ai décidé de contourner le problème en écrivant un script python exécutant CLOC et formattant la sortie de celui-ci au format de SLOCCount attendu par Jenkins. J'ai désormais tous mes langages de comptabilisés pour un moindre effort.

Si le script clokins.py vous intéresse il est disponible sur gitorious et pour l'anecdote il est utilisé pour compter ses propres lignes sur http://jenkins.quiedeville.org/job/Clokins/.

Et si vous utilisez une autre méthode de comptage dans Jenkins commentez ce billet cela sera utile pour tout le monde.

Publié en GPLv3 toutes les contributions sont les bienvenues.

mardi, mai 31 2011

Plugins munin pour GeoWebCache

Ayant récemment déployé des serveurs GeoWebCache j'ai voulu en suivre les métriques d'utilisation.Mais après une recherche sur le web je n'ai pas trouvé de plugins existants pour munin ; ce qui m'a amené à en écrire pour les données suivantes :

  • geowebcache_bandwidth
  • geowebcache_blankitems
  • geowebcache_ratio
  • geowebcache_volume

Ces plugins sont publiés sur mon compte Gitorious sous licence GPLv2 ; ils sont également disponible dans l'archive attachées à ce billet.

Si vous voyez d'autres mesures à monitorer et/ou des améliorations à faire aux plugins existants, laissez un commentaire sur ce billet.

mardi, octobre 13 2009

Le hack du train

Rien de tel pour tester un paquet debian qu'une machine vierge de toute installation préalable, et pour disposer de machines à volonté la libvirt est bien utile. J'ai sur mon disque une image de chaque version de Debian en install version minimale que je clone à loisir suivant mes besoins. J'ai même au boot une génération de 4 machines vierges. Seulement lors du clonage l'option --name de virt-clone s'arrête au nom du fichier xml de la machine, la nouvelle machine clonée se nomme donc comme l'originale. J'ai souhaité automatiser le nommage automatique des clones, et cela dans un environnement réseau simple, à savoir pas de dépendance d'une ressource extérieure et valable pour tous les modes de réseau des VM. Il me fallait donc trouver un stockage du nom de la machine depuis l'hôte accessible par la machine virtuelle. J'ai pour habitude de nommer mes machines le plus simplement possible, pour les clônes j'utilise une numération simple mais néanmoins élégamment verbalisable au travers du bibi-binaire (merci Boby) ! Mes clones pour Squeeze se nomment par exemple haka, hake, haki ce qui donne respectivement 25,26 et 27 ; utile pour paramétrer le DHCP en statique.

Si vous avez suivi toutes les étapes vous êtes peut-être arrivé au même résultat que moi, la machine se nomme heke et son IP est déclarée dans le serveur DHCP, nous allons donc stocker le nom de la machine dans l'adresse mac.

De plus virt-clone permet de spécifier celle-ci avec l'option --mac. Reste à utiliser celle-ci au boot de la machine, une légère modification des scripts rc et le tour sera joué.

Lors du boot le nom de la machine est définit par /etc/rcS.d/S02hostname.sh, assez tôt somme toute, nous allons le redéfinir en S39 par exemple en créant un fichier exécutable /etc/rcS.d/S39bibihostname :

[shell]
#!/bin/sh
### BEGIN INIT INFO
# Short-Description: Set hostname based on the mac address
# Description:       Execute /usr/bin/bibidec and write it's
#                    output to /etc/hostname
### END INIT INFO

echo "# Automatically set by /usr/bin/bibidec" > /etc/hostname

/usr/bin/bibidec >> /etc/hostname

hostname -F /etc/hostname

Vous remarquerez l'appel au script bibidec, il faut donc inclure aussi celui-ci, ici il est écrit en perl, les animaux à sang froids sauront le ré-écrire assez facilement.

[perl]
#!/usr/bin/perl

use strict;
use vars qw ($mac);

open(FNAME,"-|",'/sbin/ifconfig eth0 | head -1 | awk "{ print \$5 }" | cut -d : -f 6');
$mac = <FNAME>;
close(FNAME);

chop($mac);

my @bibi = ('ho','ha','he','hi',
            'bo','ba','be','bi',
            'ko','ka','ke','ki',
            'do','da','de','di');

my @array = split(//,sprintf "%s",$mac);

printf "%s", @bibi[hex($_)] foreach  (@array);

print "\n";

L'ordre de lancement de ce script varie suivants les différentes version de Debian, l'exemple ici est pour Squeeze, à adapter suivant les cas. Je l'exécute assez tard car je souhaite écrire le nom de la machine dans /etc/hostname, il faut donc que les filesystems soient montés en RW ;-)

Pour l'encodage j'utilise ce script, qui prend en entrée un entier entre 17 et 254, ceci afin de limiter le nom à 2 syllables. Le résultat en sortie est le nom de la VM et son adresse mac.

[perl]
#!/usr/bin/perl

use strict;
use vars qw ($addr);

my $num = shift;

die "Must be beetween 16 and 256" if ($num < 16 || $num > 254);

my $prefix = "00:16:36:00:56";

my @bibi = ('ho','ha','he','hi',
            'bo','ba','be','bi',
            'ko','ka','ke','ki',
            'do','da','de','di');

my @array = split(//,sprintf"%s",sprintf "%x",$num);

$addr .= sprintf "%s", @bibi[hex($_)] foreach  (@array);

printf "%s %s:%s\n", $addr, $prefix,sprintf "%x",$num;

Ecrit dans le train lors d'un aller-retour Auray-Nantes ce hack convient à mon utilisation particulière de VM jetables, il est largement optimisable, je le livre ici dans l'état, libre à vous de l'adapter. Une variante possible serait d'utiliser la table ASCII pour avoir des noms moins Bobysé ;-)

Dans la machine modèle pensez à supprimer les règles udev qui fixent le nom de l'interface en fonction de l'adresse mac, faute de quoi lors du démarrage d'un clone son interface sera montée en eth1.

Si vous changer l'adresse mac d'une VM depuis son fichier de définition xml pensez à faire un virsh define sur le fichier, faute de quoi la nouvelle adresse n'est pas prise en compte.

Je me suis bien amusé sur ce petit hack, j'espère qu'il vous sera utile autant qu'à moi.

Je n'ai pas inclus les notices de copyright, mais tous le code publié dans ce billet l'est sous GPL v3.