Skip to content

Linux Attitude

Le libre est un état d'esprit

Archive

Archive for January, 2011

Niveau :      
Résumé : ditaa

Aujourd'hui je voudrais partager avec vous un petit soft que je viens de découvrir : ditaa.

Qu'est-ce que ça fait ?

C'est un outil très simple qui vous permet de faire des diagrammes en ascii art. Non pas de les dessiner comme le ferait emacs artist-mode mais de les transformer en un vrai png propre et beau.

Exemple : Je dessine ceci (par exemple avec asciio)

    +--------+   +-------+    +-------+
    |        | --+ ditaa +--> |       |
    |  Text  |   +-------+    |diagram|
    |Document|   |!magic!|    |       |
    |cRED {d}|   |cBLU   |    |cRED   |
    +---+----+   +-------+    +-------+
        :                         ^
        |       Lots of work      |
        +-------------------------+

Cela devient automatiquement ceci :

Intégration

C'est tellement magique que je n'ai pas hésité et je l'ai intégré à mon site directement. En effet avant à chaque fois que je devais faire un diagramme il fallait que je sorte inkscape, que fasse attention à caler correctement les cases et les flèches et que je pense à sauvegarder l'image et l'uploader sur le serveur.

Maintenant j'intègre tout simplement le code dans le texte de mon article et ca marche !

Je n'ai pas trouvé de code qui faisait cela, je l'ai donc fait moi-même. Un peu rapidement il est vrai, il n'y a pas de gestion des différents cas d'erreur. Mais je vous laisse le code au cas où vous voudriez faire de même chez vous.

    function __macroDITAA($s)
    {
        $base=$_SERVER['DOCUMENT_ROOT']."/public/ditaa";
        $tmp="/tmp/ditaa";

        # first line of code is for ditaa parameters
        $p = strpos($s, "\n");
        $args = substr($s, 0, $p-2);
        $data = substr($s, $p+1 );

        # md5sum to generate a unique id
        $id = md5($data);

        # file test
        if(!file_exists("$base/$id.png")) {
            # create tmp
            $f = fopen("$tmp", "w");
            fwrite($f, $data);
            fclose($f);

            # call ditaa (beware of safe mode)
            system("ditaa $args $tmp > /dev/null");

            # move file
            rename("$tmp.png", "$base/$id.png");
        }

        return "<img src='/public/ditaa/$id.png'>";
    }

Puisque ditaa est malgré tout un peu lourd, on crée un identifiant d'image avec le md5 de la ligne de commande et le contenu. Et on ne fait l'appel qu'une fois (attention je n'ai pas de safe_mode ici), lorsque le fichier n'existe pas encore. Ensuite le serveur web l'utilise le fichier directement comme n'importe quel autre.

Sur mon site, j'ai une syntaxe dotclear2, j'ai donc dû enregistrer un nouveau mot clé pour la syntaxe ditaaa "///ditaa" :

# dans class.wiki2xhtml.php / class wiki2xhtml / function __construct()
$this->registerFunction('macro:ditaa','__macroDITAA');

A vous de faire de même pour la syntaxe wordpress !

Cloonix

Jan 18

Niveau :      
Résumé : ./start_cloonix_net ; ./graph

De temps en temps je vous fais un article sur le réseau, et je teste quasiment tous mes articles dans la vraie vie. Et là vous vous dites, mais c'est énorme ! Mais comment que fait-il ? A-t-il l'infrastructure ?

En fait non, enfin si mais non. Pour tester le réseau, j'utilise tout simplement cloonix.

Cloonix n'est pas une distribution, mais un outil permettant de gérer des machines virtuelles et de les mettre en réseau. Pratique, tout se fait graphiquement ou presque.

Installation

La version ubuntu ne marche pas sur ma debian, j'ai donc du utiliser les sources. Ça compile bien, il suffit d'appeler doitall dans le répertoire sources. Par contre faites attention, la version source ne contient pas de vm de démo.

Donc après compilation récupérez le répertoire virtual_platform_configs ainsi que le répertoire bulk du package ubuntu et déposez-les dans le répertoire de cloonix.

Le répertoire bulk contient les images disque de base des distribution à virtualiser.

Le répertoire virtual_platform_configs contient la définition des vm, les personnalisation spécifiques à chaque machine, ainsi que la façon dont les machines sont reliées.

Utilisation

./start_cloonix_net
./graph

Vous pouvez alors cliquer sur le bouton droit et charger une topologie. C'est à dire une infrastructure telle que stockée dans un des répertoires de virtual_platform_configs. Un fois que toutes les vm sont chargées vous obtenez ceci : Cloonix_IHM

Et c'est parti, vous avez plusieurs machines virtuelles préconfigurées directement utilisables. Pour ouvrir un shell sur une des machine, double cliquez dessus. Vous pouvez aussi en ajouter dynamiquement, relier deux cartes réseau ...

Lorsque vous avez fini tuez cloonix et ses vm :

./ctrl -kill

Détails

Très pratique, quasiment rien à faire, cloonix sait utiliser UML ou KVM au besoin.

Pour les tests réseau vous pouvez faire ce que vous voulez, pensez à enregistre votre topologie pour les tests fréquents.

Pensez aussi à modifier la distribution de base dans bulk pour ne plus avoir de modifications a porteriori à faire car tout le contenu d'une vm est perdu dès qu'elle s'éteint.

Enfin pour ceux qui font des tests avec les couches basses du réseau, il est nécessaire d'autoriser le passage des interface en mode promiscuous depuis cloonix avec une commande de la forme :

# le nom de la vm, ne nom de l'interface, 1 pour activer
./ctrl -promisc ROUTER3 eth0 1

La documentation est minimaliste, mais suffit pour s'en sortir.

PS : Si vous avez des idées d'article à me suggérer n'hésitez pas à utiliser la boite à idées.

Vous avez été très nombreux à répondre à mon sondage et je vous en remercie.

Résultats

Puisque vous avez participé, vous allez savoir quels sont les résultats.

Tout d'abord vous vous y connaissez déjà en linux. 50% se sont déclarés connaisseur et 35% professionnel. Et vous connaissez ce site depuis un certain temps (15% seulement depuis moins d'un mois). Il y a évidemment une relation de cause à effet du simple fait que vous ayez répondu.

Ensuite vous aimez ce site : 96% indiquent qu'ils ont déjà appris quelque chose ici.
Vous trouvez ce site instructif (80%), intéressant (75%) et utile (50%).

Je pensais faire une section de type "interrogez l'expert" mais moins de 25% ont un problème à partager (combien le feraient ?). Il y a d'ailleurs de nombreux forums sur le net permettant d'avoir réponse à une question spécifique. J'ai donc plutôt choisi d'ouvrir une boîte à idée. Si vous voulez voir traiter un sujet spécifique, il vous suffit de mettre votre idée là et avec un peu de chance j'en ferai un article.

Devinez-quoi la boîte à idée est déjà prête et est disponible en haut de ce site ! J'en au aussi profité pour ajouter des suggestions à la fin de chaque article. Je ne sais pas si je dois aussi les mettre dans le flux rss.

Une dernière chose qui peut en étonner un certain nombre, surtout pour un publique plutôt technophile et informatisé, 75% des personnes ayant répondu préfèrent le livre papier !

Commentaires

Enfin je vous remercie pour tous les encouragement que vous m'avez laissé dans les commentaires, certains étant vraiment dithyrambiques. En tout cas personne n'a laissé de commentaire négatif, merci de les avoir gardés pour vous. Je garde pour moi le fait qu'on s'en fout de l'apparence du site.

Je vais essayer de répondre aux différentes questions que vous m'y avez posé.

  • Mea culpa, 1024x1280 n'est pas une résolution d'écran, 92dpi est ma résolution
  • Difficile pour moi de faire plus d'articles étant donné que ce n'est pas dans le cadre de mon boulot. Je vais donc rester à cette allure pendant encore quelque temps.
  • Pour ce qui est de la programmation système, je suppose qu'il s'agit de développement noyau, j'ai beau avoir déjà fait un module, je ne suis pas un expert désolé
  • Il est possible de me contacter par jabber à peck @ jabber.org, n'en abusez pas ;-)

Enfin les questions à propos d'un livre correspondent effectivement à un livre que j'ai envie d'écrire. Soyez patient car je ne sais pas combien de temps ça prendra, mais j'ai déjà commencé ! Je vous en parlerai un peu plus lorsqu'il aura pris du volume.

Niveau :      
Résumé : modprobe bonding ; ifenslave

Récemment nous avons vu l'agrégation sur couche 3, celle d'IP. Naturelle, pratique pour redonder des chemins réseaux, elle n'est pas forcément adaptée pour de la redondance sur réseau local.

Il existe une autre solution qui fonctionne sur la couche du dessous, le bonding (aussi appelé trunking chez les fabriquants de switch, ou etherchannel qui est la cas particulier du mode 802.3ad). Il permet de communiquer à travers 2 chemins physiques différents avec une machine présente sur le même réseau local.

Le principe est très simple, au lieu de mettre un câble réseau on en met 2. Au lieu de mettre une carte, on en met 2

Matériel

Il vous faut :

  • 2 cartes réseau
  • 2 câbles
  • un switch
    • ou 2
    • ou le même matériel sur la machine en face (connexion directe sans switch)

Selon le mode de bonding choisi, il se peut que vous ayez besoin d'un support particulier sur le switch et sur les driver des cartes.

Méthode

C'est simple, on crée un nouvelle interface virtuelle, comme on ferait avec un bridge et on lui affecte 2 cartes physiques.

# bizarrement le bonding se configure au modprobe ... on a vu mieux
# mode actif-passif et détection auto du débranchement du câble en 100ms
$ modprobe bonding mode=1 miimon=100

# Ajout des interfaces au bond
$ ip link set bond0 up
$ ifenslave bond0 eth0
$ ifenslave bond0 eth1

# Configuration comme une carte normale :
$ ip addr add 10.0.0.1/24 dev bond0

Reste plus qu'a faire pareil si besoin de l'autre côté et c'est bon on peut maintenant débrancher un câble sans être coupé du réseau (enfin pas plus de 100ms).

Pour rendre la chose permanente, il faut ajouter le chargement de module avec ses options dans /etc/modules et mettre les lignes ifenslave en post-up dans /etc/network/interfaces.

Bridge, machinbox

Pourquoi ne fait-on pas un bridge, c'est beau un bridge ?
Il faut savoir qu'un bridge n'a pas le même usage que le bonding. Le bridge est là pour relier 2 réseaux différents. Nous voulons seulement relier 2 cartes sur le même réseau. Évitez d'ajouter un bridge là où ce n'est pas nécessaire, ça vous évitera les problèmes de boucle et de spanning tree.

Et si on a un bridge en face ?
Remarquez que c'est le cas de la plupart des machinbox et autres routeurs wifi. Ils installent un bridge entre les ports wifi et les ports ethernet ce qui leur permet de ne pas avoir à router les paquets. Dans ce cas vous êtes sur le même réseau des 2 côtés, comme sur un switch. Vous pouvez alors mettre du bonding sur votre machine.

# cette fois on détecte la coupure avec des envois de paquet arp
# l'adresse ip est celle de votre passerelle juste en face
$ modprobe bonding mode=1 arp_interval=100 arp_ip_target=192.168.0.1 primary=eth0

$ ip link set bond0 up
$ ifenslave bond0 eth0
$ ifenslave bond0 wlan0

# configuration auto tant qu'à faire
$ dhclient bond0

Et voilà vous êtes toujours connectés, de façon automatique, même lors d'un basculement entre wifi et filaire.

Choix de configuration

Avant de mettre en place une solution de bonding, il faut savoir à quoi il va servir, car plusieurs modes sont disponibles, je ne vous ai parlé que du mode 1 ou active-backup.

Si vous avez 2 câbles, 2 cartes et un switch vous vous prémunissez d'une erreur de branchement (humaine) ou d'une carte qui grille (rare), mais aussi d'un port de switch qui grille.

Ajoutez un 2e switch et vous vous prémunissez en plus du cas du switch entier qui grille ou de sa prise qui se retrouve débranchée par erreur.

Il est aussi possible d'avoir pour but de doubler la bande passante de la machine. Dans ce cas choisissez de préférence un switch adapté (pour en profiter dans les 2 sens) et le mode 802.3ad.

Enfin un cas très intéressant est de pouvoir passer d'un mode de transport à un autre automatiquement en fonction des besoins : wifi <-> câble physique.

La liste des modes ainsi que la documentation complète se trouve sur le site de la linux fundation.

Sondage

Jan 5

Salut,

Aujourd'hui pas d'article technique, juste un petit sondage. Je sais, vous vous faites sonder régulièrement et ça commence à racler. Mais cette fois c'est différent ...

Ce petit questionnaire me permettra d'améliorer le site et, je l'espère, correspondre au mieux à ce que vous voudriez voir ici.

Merci !

Niveau :      
Résumé : Bonne année

Plutôt que de vous souhaiter une bonne année comme tout le monde avec des vœux et du bonheur je vais plutôt vous écrire un article utile.

J'en profite pour ne pas vous demander vos résolutions, de toute façon une résolution est faite pour ne pas être tenue, sinon ça serait déjà fait ! La mienne sera comme tous les ans 1024x1280.

Faire un grep d'un mot (et non pas d'une suite de caractère) :

$ grep -w lemot "lemotte lemot"

Faire un xargs mais résistant aux entrées vides :

$ xargs -r rm < list

Faire un append en fin de fichier :

$ echo toto >> fichier

Faire un insert en début de fichier :

$ sed -i -e '1i\toto/' fichier

Lister les dernières erreurs de connexion :

$ faillog