Main menu:

Site search

Categories

July 2009
M T W T F S S
« Jun    
 12345
6789101112
13141516171819
20212223242526
2728293031  

Archive

Comment compiler soi-même une application

Beaucoup de gens ont peur de devoir compiler une application. Je reconnais que c’est une opération à ne pas conseiller. Sous Ubuntu, la méthode recommandée pour installer une application est de passer par Synaptic pour installer un paquet qui se trouve dans les dépôts officiels d’Ubuntu. Un paquet comprend l’application précompilée pour ubuntu et toutes ses dépendances au sens large. En ligne de commande, vous utiliserez apt-get ou aptitude.
Mais il est des situations où il peut être intéressant de compiler soi-même une application. C’est le cas par exemple lorsque l’application que vous voulez utiliser a un bug et que vous savez que la nouvelle version corrige ce bug. malheureusement pour vous, cette nouvelle version ne se trouve pas encore dans les dépôts d’Ubuntu. La solution dans ce cas-là est de télécharger le code source de l’application et de la compiler vous-même.

Pour illustrer cet article, je vous propose de compiler une application qui s’appelle tabu et qui ne se trouve pas dans les dépôts. Tabu est un lecteur audio basé sur gstreamer. Il ressemble à ceci:


tabu - audio player

La première chose à faire est de télécharger l’archive contenant les sources du programmes. Dans le cas de tabu, les sources sont dans un fichier téléchargeable à cette adresse:
http://www.kalmbach.com.ar/download/tabu_audio_player-1.4.1.tar.gz

Pour télécharger l’archive et la décompresser, tapez ceci dans un terminal:

$ wget -c http://www.kalmbach.com.ar/download/tabu_audio_player-1.4.1.tar.gz
$ tar -zxvf tabu_audio_player-1.4.1.tar.gz

La commande tar a créé un répertoire tabu_audio_player-1.4.1 à l’endroit où vous avez téléchargé cette archive. Ce répertoire contient les sources du programmes plus un certain nombre de fichier nécessaire à la compilation de l’application. Lisez aussi les fichiers README et INSTALL. Ce dernier en général, contient les instructions données par l’auteur de l’application pour compiler le programme. Dans ce cas-ci, on peut y lire que le programme nécessite les classiques configure + make + make install.

Avant de pouvoir compiler le programme, il faut que les outils de compilation soient installés. Si ce n’est pas le cas, installez-les en faisant:

$ sudo aptitude install build-essentials

Commençons la compilation. La première chose à faire est de lancer configure qui va tester si toutes les librairies dont a besoin le programme sont présentes sur votre PC et donnera une erreur dans le cas contraire. Il permet aussi de définir certains paramètres.
Comme je veux que le programme soit installé dans /opt/tabu, /opt étant l’endroit où j’installe tous les programmes que je compile ou qui ne viennent pas des dépôts officiels, on peut ajouter à la commande configure un paramètre auquel on donne le répertoire où le programme doit être installé.
Rendons-nous dans le répertoire où se trouvent les sources et lançons la configuration:

$ cd tabu_audio_player-1.4.1
$ ./configure --prefix=/opt/tabu

On peut voir que le programme configure teste un tas de choses. Ce sont toutes les lignes checking… Mais à la fin, on peut lire ceci:

checking for GSTREAMER... configure: error: Package requirements (gstreamer-0.10 >= 0.10) were not met:

No package 'gstreamer-0.10' found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables GSTREAMER_CFLAGS
and GSTREAMER_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.

Zut, une erreur! Il semble qu’il ne trouve pas gstreamer-0.10. Pourtant gstreamer est un des éléments de base de Gnome pour tout ce qui est multimédia. C’est par exemple, gstreamer qui est utilisé par Totem.
En réalité gstreamer est bien installé mais pour pouvoir compiler tabu, le compilateur a besoin de la version de développement qui contient les fichiers d’entêtes de gstreamer. Autrement dit, si configure râle sur une version d’un programme manquant, c’est en général parce qu’il ne trouve pas la version de développement. Un petit tour par Synaptic nous apprend qu’effectivement, libgstreamer0.10-dev n’est pas installée. Installons-la et relançons configure:

$ sudo aptitude install libgstreamer0.10-dev
$ ./configure --prefix=/opt/tabu

configure re-teste tout et…à la fin, il nous donne une autre erreur:

checking for TAGLIB... configure: error: Package requirements (taglib_c >= 1.5) were not met:

No package 'taglib_c' found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables TAGLIB_CFLAGS
and TAGLIB_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.

Manifestement, il lui manque une librairie taglibc ou quelque chose d’approchant. Un petit tour dans Synaptic nous montre qu’il existe un ensemble de librairies qui portent le noms de libtag* dont une est une version de développement libtagc0-dev. Lorsque vous choisissez installer, Synaptic vous dit qu’il doit aussi installer libtag1-dev et libtagc0 pour que les dépendances soient respectées. Suivons les recommandations de Synaptic et relançons configure une troisième fois:

$ sudo aptitude install libtagc0-dev libtag1-dev libtagc0
$ ./configure --prefix=/opt/tabu

Cette fois-ci, plus d’erreur. configure est content:

Tabu 1.4.1 configuration summary:

        prefix                   : /opt/tabu
        source code location     : .
        compiler                 : gcc
        compiler flags           : -g -O2 -Wall
	      debug support            : no

Maintenant que tout est en ordre, que toutes les librairies nécessaires sont installées, il ne reste plus qu’à compiler le programme. Ceci se fait avec la commande make:

$ make

En principe tout doit bien se passer et vous ne devez pas avoir de message d’erreur. Dans le cas de tabu, la compilation est rapide mais ce n’est pas toujours le cas. Recompiler un noyau par exemple peut prendre d’une demi-heure à plusieurs heures suivant la palteforme et les options demandées.
Le programme étant compilé, on peut maintenant l’installer dans son répertoire /opt/tabu. Ceci se réalise avec la commande make install et doit se faire avec des droits d’administration:

$ sudo make install

Dans le répertoire /opt/tabu, make install a créé un répertoire bin dans lequel se trouve l’exécutable et un répertoire share qui contient le fichier applications/tabu.desktop qui est le fichier nécessaire pour créer une entrée dans le menu Applications de Gnome. Editez-le avec gedit et modifiez les lignes suivantes de façon à ce qu’elle contiennent ceci:

Exec=/opt/tabu/bin/tabu
Icon=/opt/tabu/share/pixmaps/tabu.png

Ensuite copier ce fichier dans /usr/shar/applications:

$ sudo cp /opt/tabu/share/applications/tabu.desktop /usr/share/applications

Voilà, votre application est compilée et une entrée se retrouve dans le menu Audio et vidéo.

Monter un système de fichiers grâce à sshfs

Il peut être intéressant de monter dans son propre système de fichiers un autre système de fichiers auquel on aurait accès via ssh. Cela permet d’utiliser tous les outils dont on dispose dans son propre système pour accéder au système de fichiers distant.

La première chose à veiller est que fuse soit installé.
Pour installer fuse et vous ajouter au groupe fuse, exécutez les deux commandes suivantes:

$ sudo aptitude install fuse-utils
$ sudo adduser $USER fuse

Ensuite, il faut installer sshfs proprement dit:

$ sudo aptitude install sshfs

Maintenant que tout est installé, créez un répertoire où vous monterez le système de fichiers distants et utilisez la commande sshfs pour monter le système de fichier:

$ mkdir distfs
$ sudo login@serveur_distant:/path/ distfs

Vous pouvez évidemment donner le nom que vous voulez au répertoire. distfs est juste un exemple. login est le login avec lequel vous vous connectez au serveur distant via ssh et serveur_distant peut être un nom de domaine ou une adresse IP.

Lorsque vous avez fini de travailler avec le serveur distant, démontez le système de fichiers distant en utilisant la commande suivante:

$ fusermount -u distfs

Comme vous pouvez le voir ci-dessus, une fois que sshfs est installé, c’est tout simple à utiliser et il peut vous rendre de grands services.

Installer le Media Player Songbird

Media Player Songbird
Le 18 juin est sorti la version 1.2 de Songbird. Songbird est un Media Player à la iTunes vous donnant accès à votre bibliothèque multimédia. Songbird utilise la plateforme XULRunner de Mozilla ce qui veut dire qu’il est compatible avec tous les OS les plus fréquents et qu’il est possible comme pour Firefox, par exemple, de lui ajouter des extensions. Songbird utilise le framework multimedia GStreamer comme la plupart des applications multimedia sous Linux. Veillez donc à installer tous les plugins et codecs GStreamer que vous trouverez dans les dépôts (paquets gstreamer good, bad et ugly).

En plus des caractéristiques ci-dessus, on peut ajouter:

  • Synchronisable avec iTunes
  • Modification de l’apparence au moyens de skins
  • Compatible avec les périphériques MTP (iPod et autres)
  • Edition des métatags
  • Possibilité de créer des mix
  • Surveillance des répertoires de la bibliothèque
  • Normalisation du niveau sonore
  • De nombreuses extensions
  • etc…

L’installation sous Ubuntu n’est vraiment pas compliquée. Comme d’habitude, je vous propose de l’installer dans le répertoire /opt qui est destiné à ce genre d’installation faite par l’utilisateur.
La première chose à faire est de télécharger l’archive contenant Songbird. Ensuite il suffit de décompresser cette archive dans /opt, de créer un lien symbolique dans /usr/local/bin et de créer une entrée pour Songbird dans le menu Applications/Son et vidéo:

$ wget -c http://download.songbirdnest.com/installer/linux/i686/Songbird_1.2.0-1146_linux-i686.tar.gz
$ sudo tar -C /opt -zxvf Songbird_1.2.0-1146_linux-i686.tar.gz
$ sudo ln -s /opt/Songbird/songbird /usr/local/bin/songbird

Pour ajouter Songbird dans le menu Son et vidéo, rendez-vous dans le menu Système/Préférences/Menu principal. Dans le panneau de gauche, cliquez sur Son et vidéo et, à droite, cliquez sur Nouvel élément. Remplissez les champs, choisissez l’icône que vous voulez (Songbird en propose une dans le répertoire d’installation) et fermez la fenêtre. Songbird doit maintenant apparaître dans le menu.

Un navigateur en quelques lignes de Python

Avec un langage comme Python et Webkit, il est extrêmement facile de créer une application qui affiche un site internet. Jugez-en vous-même.
Le programme ci-dessous, en 9 lignes de code, affiche dans une une fenêtre une page web dont l’adresse est spécifiée dans le programme:

#!/usr/bin/env python  

import gtk  
import webkit  
import gobject  

gobject.threads_init()  
window = gtk.Window()
window.set_default_size(800, 600)
window.connect("destroy"lambda a: gtk.main_quit()) 
browser = webkit.WebView()  
browser.open("http://linux.leunen.com")  
window.add(browser)  
window.show_all()  
gtk.main()  

On peut améliorer légèrement le programme pour qu’il ressemble un peu plus à un navigateur en rajoutant dans le haut de la fenêtre une barre d’adresse dans laquelle une URL peut être tapée. Lorsque vous appuierez sur la touche Enter, la page sera affichée dans la zone inférieure de la fenêtre. N’oubliez pas de mettre le http:// devant l’adresse du site que vous voulez visualiser:

#!/usr/bin/env python  
# -*- coding: utf-8 -*-

import gtk  
import gobject  
import webkit

# Fonction appelée lorsqu'on appuie sur enter dans la barre d'adresse
def browse(widget):
  # On affiche l'URL contenue dans la barre d'adresse
  browser.open(widget.get_text()) 

gobject.threads_init()

# Création de la fenêtre
window = gtk.Window()
# On définit sa taille par défaut
window.set_default_size(800, 600)
# Exécute gtk.main_quit() quand on clique sur la croix
window.connect("destroy"lambda a: gtk.main_quit()) 

# La barre d'adresse et la zone où s'affiche la page internet
# sont placées dans une boîte verticale
vbox = gtk.VBox(False,0)
window.add(vbox)
add = gtk.Entry()
# la fonction browse est appelée quand on tape sur Enter
add.connect("activate", browse)
vbox.pack_start(add, False, True, 0)

# Initialisation de l'objet webkit
browser = webkit.WebView()
vbox.pack_start(browser)

window.show_all()  
gtk.main()  

Les codes sources de ces deux exemples peuvent être téléchargés ici:
exemple 1
exemple 2

Et voici une capture d’écran qui vous montre à quoi ça ressemble:

browse2.py

Les différents sytèmes audio sous Linux

Sous Linux, il existe toute une série de systèmes dédiés au son et il est parfois très difficile de s’y retrouver. Voyons ici brièvement et rapidement les principaux.

Gstreamer

Gstreamer est un framework multimedia. C’est à dire un ensemble de composants permettant de lire, enregister, faire du streaming et de l’édition audio et video. Ce framework est multi-plateforme. Il devient un standard pour les applications audio/vidéo sous Linux surtout grâce à Gnome au départ. Grâce à une architecture de plugins, il est aisé d’ajouter à Gstreamer de nouvelles fonctionnalités. Gstreamer supporte comme backends aussi bien Alsa qu’OSS ou PulseAudio. Il est donc bien adapté pour la création d’applications. Par exemple: Banshee, Amarok, Jokosher, RythmBox, Totem, Elisa, Sound Juicer etc… sont tous basés sur Gstreamer.

Jack

Jack est un serveur de sons permettant l’interconnexion d’applications audio professionnelles avec des périphériques audio et/ou MIDI ou d’autres applications professionnelles. C’est un système temps réel caractérisé par une faible latence. Il supporte Alsa et OSS comme backends mais pas PulseAudio (à ma connaissance!).

Alsa

Advanced Linux Sound Architecture
Implémenté directement comme composant du noyau, c’est lui qui fournit l’interfaçage avec les périphériques audio (cartes sons) et MIDI. Il a été créé pour remplacer OSS qui était devenu obsolète. Pour servir de base à la création d’applications, Alsa dispose d’une API au niveau utilisateur qui est plus facile a utiliser que celle au niveau noyau. Il est aussi compatible avec OSS ce qui veut dire que les applications nécessitant OSS fonctionnent avec Alsa.

PulseAudio

PulseAudio est un serveur de son. Il peut router des sons provenant de plusieurs sources, processus ou périphériques de capture et les envoyer vers d’autres processus, cartes sons ou son propre système de streaming. PulseAudio se sert d’Alsa (on dit qu’il se place on top of Alsa) comme source et aussi d’Alsa pour envoyer les données après traitement vers la carte son. PulseAudio est surtout utilisé dans les applications réseau. Il permet aussi la connexion à un serveur Jack.

Oss

Open Sound System
C’est le système le plus ancien, apparu avant Alsa et que ce dernier remplace. PulseAudio par exemple ne peut fonctionner avec OSS. On en dira pas plus. Beaucoup de choses manquent à OSS et c’est ce qui a nécessité l’écriture d’un système plus complet.

En résumé: Alsa, PulseAudio et OSS peuvent être considérés comme des backends, c’est à dire l’interface bas niveau qui gère le son au niveau des périphériques, PulseAudio étant une sur-couche d’Alsa. On peut se servir de l’API d’Alsa ou de PulseAudio pour écrire des applications mais il est plus intéressant d’utiliser un framework du genre de Gstreamer pour le faire. Gstreamer gérant les codecs de façon transparente par exemple. Si vous voulez créer une application professionnelle qui nécessite de travailler en temps réel, tournez-vous vers Jack.

Analyse réseau avec tcpdump

tcpdump est un outil d’analyse des paquets transitant sur le réseau. Ses possibilités sont très étendues et en font un outil de base pour l’analyse permettant de résoudre les problèmes réseau et de sécurité. Il peut aussi être utile simplement parce que vous êtes intéressé d’examiner ce qui transite sur votre réseau. On verra aussi qu’il est possible de sauvegarder les paquets filtrés par tcpdump pour les relire sur une machine équipée de Wireshark. L’avantage est évidemment de pouvoir profiter de la lisibilité que donne une application graphique.

On peut passer à tcpdump un certain nombre d’options et des expressions booléennes. Les options agissent sur la façon dont seront représentés les paquets une fois que ceux-ci auront été capturés. Les expressions permettent de ne capturer que les paquets qui nous intéressent. Ces expressions peuvent être combinées au moyen d’opérateur booléens (and, or,…) pour former un filtre qui ne laissera passer que les paquets désirés.

Avant de pouvoir utiliser tcpdump, il faut l’installer:

$ sudo aptitude install tcpdump

et il faut le lancer avec des droits d’administrations pour pouvoir avoir accès aux interfaces réseau.

Les options

  • -i ethx spécifie sur quelle interface se fait la capture
  • -X affiche le contenu du paquet en hexa et ascii
  • -n pas de résolution des noms, on affiche l’adresse IP
  • -nn pas de résolution des noms ni des ports
  • -s0 indique qu’on capture le paquet entier
  • -cx on capture seulement x paquets
  • -v, -vv, -vvv augmente le nombre d’infos sur les paquets qui sont affichés
  • -w file écrit les paquets raw dans un fichier plutôt que d’être traités et affichés

exemple:

$ sudo tcpdump -Xvvn

rafraîchissez la page dans votre navigateur et observez.

Les expressions

Les expressions associées aux opérations booléennes permettent d’effectuer un puissant filtrage sur les paquets et en fin de compte de n’afficher que ce qui vous intéresse.

  • host permet de spécifier une adresse IP ou un nom d’hôte:
    ex: tcpdump host 192.168.8.1
  • src, dst spécifie une adresse IP source ou destination
    ex: tcpdump dst 192.168.8.1
  • net spécifie un réseau (notation CIDR)
    ex: tcpdump net 192.168.8.0/24
  • port spécifie un port sur lequel la capture se fera (peut être combiné avec src ou dst)
    ex: tcpdump port 80
        tcpdump src port 80
  • proto spécifie le protocole utilisé (tcp, udp, and icmp)
    ex: tcpdump icmp

Les opérateurs logiques

  • and (ou &&)
  • or (ou ||)
  • not (ou !)

Pour les opérations complexes avec des parenthèses, les options doivent être encadrées par des apostrophes.

exemples:

$ sudo tcpdump -Xvvnn src 192.168.8.10 and dst 192.168.8.1
$ sudo tcpdump 'src 192.168.8.10 and (dst port 110 or 25)'

Filtrage suivant les flags TCP

Il est possible aussi de filtrer en fonction des flags contenus dans l’entête TCP. Ces flags sont:

  • SYN-ACK ‘tcp[13] = 18′
  • FIN ‘tcp[13] & 1 != 0′
  • SYN ‘tcp[13] & 2 != 0′
  • RST ‘tcp[13] & 4 != 0′
  • PSH ‘tcp[13] & 8 != 0′
  • ACK ‘tcp[13] & 16 != 0′
  • URG ‘tcp[13] & 32 != 0′

Ceci signifie qu’on prend le 13ième octet dans l’entête TCP (tcp[13]). Chaque bit de cet octet représente un flag. On effectue ensuite une opération logique pour obtenir la valeur de ce bit et on le test par rapport à 0.

exemple:

$ sudo tcpdump 'tcp[13] & 2 != 0'

Exploitation des paquets avec Wireshark

Il est possible d’enregistrer les paquets capturés dans un fichier et ainsi de les analyser plus tard, sur une autre machine éventuellement, avec Wireshark et de bénéficier des avantages d’une représentation graphique des paquets. On utilisera cette méthode, par exemple, lorsque l’on doit analyser les paquets arrivant sur un serveur ne disposant pas d’interface graphique permettant de faire tourner Wireshark.

L’enregistrement des paquets se fait en utilisant l’option -w qui dit à tcpdump d’enregister les paquets bruts dans un fichier. Par exemple:

$ sudo tcpdump -Xvvnns0 port 80 -w dump.cap

Ensuite il ne reste plus qu’à analyser le fichier dump.cap dans Wireshark en le lançant avec le nom de fichier en argument:

$ wireshark -r dump.cap

Note: on peut évidemment aussi ouvrir le fichier en utilisant l’interface graphique de Wireshark mais comme tout le reste se fait dans un terminal, pourquoi ne pas lancer Wireshark directement depuis le terminal? Non?