CACert sous Firefox OS

\"FirefoxJe viens de faire l\’acquisition d\’un Open C de ZTE sous Firefox OS. Après une première étape consistant à rooter le téléphone et à le passer sous Firefox OS 2.1 (qui est très stable), je me suis lancé dans la configuration de mon compte mail Aquilenet (Fournisseur d\’accès à Internet Associatif en Gironde). Seulement voilà… les certificats de sécurité d\’Aquilenet sont signés par CACert. Or, cette autorité de certification n\’est pas \ »de confiance\ ». On pourrait débattre des heures sur la stupidité de ce système d\’autorité de confiance mais ce n\’est pas le propos :-)

Toujours est-il que Firefox OS 2.1 ne permet pas de configurer de compte mail si l\’autorité de certification n\’est pas dans sa liste blanche. La solution ? Ajouter CACert à la main dans cette liste ! Pour ce faire, il existe un \ »tuto\ » qui est proposé en premier résultat lorsqu\’on cherche sur le web à résoudre ce problème. Sauf que ce tutoriel consiste en l\’exécution d\’un script sans la moindre documentation. Après lecture, le script est certes tout à fait sûr mais il manque pas mal d\’informations pour le faire fonctionner. Je me propose donc de vous expliquer tout ça un peu plus en détail. Ce billet est donc directement inspiré du tutoriel en question.

Que va-t-on faire ?

Le principe est simple. Grâce à l\’outil adb, nous allons rapatrier la base de données des certificats de confiance de Firefox OS. Nous allons ensuite y ajouter le certificat de CACert grâce à un petit programme appelé certutil. Enfin, nous allons gentiment reposer cette base de donnée comme si de rien n\’était.

Les pré-requis

Je pars du principe que votre Open C est rooté.

Concernant le téléphone, il faut que le mode \ »débogage\ » soit activé. Vous pouvez le faire de la façon suivante : Paramètres > Développeurs > Débogage USB > ADB Uniquement

Sous Debian, il suffit d\’installer le deux paquets suivant, fournissant respectivement les outils adb et certutil :

$ apt-get install android-tools-adb libnss3-tools

Let\’s hack !

On va commencer par brancher le téléphone en USB et vérifier qu\’il est bien détecté par adb.

$ adb devices
List of devices attached
1a1b5c9 device

À partir de là, vous devriez être capable de vous connecter au téléphone. Un \ »adb connect <id_device>\ » est peut-être nécessaire si ce n\’est pas le cas. Pour vous connecter et obtenir une session :

$ adb shell
root@ZTE_P821A10:/ #

C\’est déjà un bon début ! L\’étape suivante consiste à récupérer le nom du dossier contenant la base de données des certificats. Ce dossier a un nom se terminant par \ ».default\ » et se situe dans \ »/data/b2g/mozilla\ ».

root@ZTE_P821A10:/data # cd /data/b2g/mozilla/
root@ZTE_P821A10:/data/b2g/mozilla # ls -d *.default
hyyegklw.default

L\’emplacement de la base de données dont nous avons besoin est donc chez moi : \ »/data/b2g/mozilla/hyyegklw.default\ ». Vous pouvez alors faire un petit \ »exit\ »  pour quitter la session sur le téléphone. Nous n\’utiliserons désormais plus de session interactive.

Les trois fichiers qu\’il nous faut récupérer maintenant sont les suivants : cert9.db, key4.db et pkcs11.txt. L\’idéal est de les récupérer dans un dossier réservé à cette manipulation et que nous pourrons supprimer à la fin de la procédure. Les commandes adb sont alors :

$ adb pull /data/b2g/mozilla/hyyegklw.default/cert9.db
$ adb pull /data/b2g/mozilla/hyyegklw.default/key4.db
$ adb pull /data/b2g/mozilla/hyyegklw.default/pkcs11.txt

Dans ce même dossier, nous allons maintenant créer un dossier \ »certs\ » dans lequel nous allons mettre la clé du certificat racine de classe 3 de CACert au format PEM. Cette clé est disponible ici : http://www.cacert.org/certs/class3.crt

Revenons maintenant dans le dossier contenant les fichiers de base de donnée. Nous allons utiliser l\’outil certutil pour ajouter une entrée pour CACert dans cette base. Une première commande permet de lister les autorités présentes dans cette liste blanche :

$ certutil -d \'sql:.\' -L

Certificate Nickname Trust Attributes
SSL,S/MIME,JAR/XPI

DigiCert SHA2 Extended Validation Server CA ,,
VeriSign Class 3 Secure Server CA - G3 ,,
GeoTrust SSL CA - G3 ,,
GeoTrust Global CA ,,
DigiCert High Assurance CA-3 ,,
Google Internet Authority G2 ,,
Symantec Class 3 EV SSL CA - G3 ,,
DigiCert SHA2 High Assurance Server CA ,,
DigiCert SHA2 Secure Server CA ,,
GeoTrust SSL CA ,,
TERENA SSL CA ,,
UTN-USERFirst-Hardware ,,
GeoTrust SSL CA - G2 ,,
GlobalSign Organization Validation CA - SHA256 - G2 ,,
DigiCert High Assurance EV CA-1 ,,

L\’option \ »-d \’sql:.\’ permet de dire à certutil quelle base de donnée interroger. En l\’occurrence il s\’agit de celle présente dans \ ».\ », soit le dossier courant. Nous allons à présent redéfinir un mot de passe vide pour cette base de données afin de pouvoir la modifier.

$ certutil -d \'sql:.\' -N --empty-password

Ajoutons maintenant la clé de CACert !

$ certutil -d \'sql:.\' -A -n \"class3.crt\" -t \"C,C,TC\" -i certs/class3.crt
$ certutil -d \'sql:.\' -L

Certificate Nickname Trust Attributes
SSL,S/MIME,JAR/XPI

DigiCert SHA2 Extended Validation Server CA ,,
VeriSign Class 3 Secure Server CA - G3 ,,
GeoTrust SSL CA - G3 ,,
GeoTrust Global CA ,,
DigiCert High Assurance CA-3 ,,
Google Internet Authority G2 ,,
Symantec Class 3 EV SSL CA - G3 ,,
DigiCert SHA2 High Assurance Server CA ,,
DigiCert SHA2 Secure Server CA ,,
GeoTrust SSL CA ,,
TERENA SSL CA ,,
UTN-USERFirst-Hardware ,,
GeoTrust SSL CA - G2 ,,
GlobalSign Organization Validation CA - SHA256 - G2 ,,
DigiCert High Assurance EV CA-1 ,,
class3.crt C,C,C

Détaillons un peu cette commande : l\’option \ »-A\ » signifie que nous voulons ajouter une entrée dans la base de données. À l\’inverse, l\’utilisation de \ »-D\ » supprimera une entrée. L\’option \ »-n \ »class3.crt\ »\ » permet de nommer cette entrée tandis que \ »-i certs/class3.crt\ » donne le chemin du certificat. Enfin, l\’option \ »-t \ »C,C,TC\ »\ » définit la confiance qu\’on souhaite accorder à ce certificat. La documentation de certutil l\’explique de cette façon :

-t trustargs Set the certificate trust attributes:
trustargs is of the form x,y,z where x is for SSL, y is for S/MIME,
and z is for code signing. Use ,, for no explicit trust.
p prohibited (explicitly distrusted)
P trusted peer
c valid CA
T trusted CA to issue client certs (implies c)
C trusted CA to issue server certs (implies c)
u user cert
w send warning
g make step-up cert

Une information importante ici : les arguments que je vous propose sont ceux utilisés sur le tutoriel évoqué précédemment. À la lecture du manuel, ils me semblent tout à fait raisonnables et rendent l\’utilisation de ma boite mail fonctionnelle. Ceci dit, il serait intéressant de creuser la question pour bien comprendre ce que tout ça implique. Vu que, je vous le rappelle, il est question de faire confiance à quelqu\’un pour une couche de sécurité…

Bref, la base de données est augmentée du certificat dont nous avons besoin. Il ne reste plus qu\’à remettre tout ça en place ! Mais avant tout, nous allons tuer le processus b2g que nous allons relancer une fois la base de données mise à jour sur le téléphone. Cette étape permet de prendre en compte cette modification sans procéder à un hard reboot.

$ adb shell stop b2g
$ adb push cert9.db /data/b2g/mozilla/hyyegklw.default/cert9.db
$ adb push key4.db /data/b2g/mozilla/hyyegklw.default/key4.db
$ adb push pkcs11.txt /data/b2g/mozilla/hyyegklw.default/pkcs11.txt
$ adb shell start b2g

Et voilà ! Le tour est joué ! Vous devriez dorénavant pouvoir configurer le client mail avec un serveur dont le certificat de sécurité est fourni par CACert.

sec_error_untrusted_issuer dans Firefox/Iceweasel ou Thunderbird/Icedove

Avec la récente faille dans OpenSSL, bon nombre de certificats ont dû être révoqués et remplacés par de nouveaux. Ce changement a pu déclencher dans Firefox (ou Iceweasel) une alerte pour certaines pages ressemblant à ceci :

\"Alerte

Cette alerte peut sembler familière puisqu\’elle ressemble à la demande d\’ajout d\’exception pour les certificats qui ne sont pas délivrés par les \ »autorités de confiance\ ». Or ici, il s\’agit au contraire d\’une erreur de type \ »sec_error_untrusted_issuer\ » dont la seule issue proposée est de quitter la page… Sur Thunderbird (ou Icedove) la comportement est un peu différent. Des pop-ups s\’affichent régulièrement vous demandant si vous souhaitez accepter le certificat attestant de l\’identité du serveur que vous tentez de joindre. J\’ai eu beau valider une bonne dizaine de fois, la question revient en boucle. Bref, en bricolant un peu, j\’ai trouvé une solution qui remet tout ça en ordre. L\’idée est d\’aller supprimer les références à l\’ancien certificat dans une des bases de données attachées à Firefox et Thunderbird (chacun ayant la sienne). Et c\’est dans permissions.sqlite qu\’il nous faudra intervenir. La seule chose dont vous aurez besoin est du paquet sqlite3 (apt-get install sqlite3 sous Debian et dérivés). On commencera par quitter les applications concernées. Allons-y :

cd ~/.mozilla/firefox/

Pour Icedove, il faudra effectuer la même opération mais dans le dossier ~/.icedove (et probablement ~/.thunderbird dans les autres cas).
Nous allons maintenant ouvrir la base de données permissions

sqlite3 permissions.sqlite

Pour plus de lisibilité avec les requêtes SQL que nous allons effectuer, il est recommandé d\’entrer les deux commandes suivantes permettant d\’une part d\’afficher le nom des champs et d\’autre part de fournir un affichage propre sous forme de tableau.

sqlite> .headers on
sqlite> .mode column

La requête suivante va lister toutes les exceptions ajoutées dans l\’application concernant les certificats qui ne sont pas délivrés par les \ »autorités de confiance\ ».

sqlite> SELECT * FROM moz_hosts;

On va ensuite chercher les enregistrements qui concernent le nom de domaine ayant provoqué l\’erreur dans le navigateur ou les pop-ups dans le client mail.

sqlite> SELECT * FROM moz_hosts WHERE host LIKE \'%aquilenet%\';

De mon côté, cette requête a donné ceci :

id          host                type        permission  expireType  expireTime     appId       isInBrowserElement
----------  ------------------  ----------  ----------  ----------  -------------  ----------  ------------------
133         cloud.aquilenet.fr  sts/use     1           2           1430744362518  0           0                 
134         cloud.aquilenet.fr  sts/subd    2           0           0              0           0

Il suffit donc de supprimer ces deux enregistrements de cette façon et de quitter la session sqlite.

sqlite> DELETE FROM moz_hosts WHERE id=133 or id=134;
.quit

Et voilà ! Il ne reste plus qu\’à relancer le navigateur ou le client mail et le tour est joué !

[Bug fix] rssLounge for Android v0.2.1

\"LogoUn petit billet rapide pour vous annoncer qu\’une petite mise à jour de rssLounge for Android vient d\’être publiée. Cette mise à jour corrige un bug qui m\’a été reporté par plusieurs utilisateurs et qui ne permettait pas d\’avoir de caractères spéciaux dans son login ou son mot de passe… Bref, ce problème est maintenant corrigé et a donc donné lieu à une version 0.2.1 de cette application. Comme d\’habitude (!!) toutes les infos concernant rssLounge for Android et notamment son téléchargement se trouvent ici :

http://www.francoistessier.info/rssLoungeAndroid/

Mise à jour de rssLounge pour Android (v0.2)

\"LogoEt voilà! Une semaine après la première release de \ »rssLounge for Android\ », la version 0.2 est là. En si peu de temps ce n\’est évidemment pas une révolution mais il y a malgré tout un certain nombre de nouveautés. En voici la liste :

  • Si aucune URL n\’a été spécifiée (au premier lancement par exemple), l\’écran de préférence est lancé au démarrage.
  • Le support d\’HTTPS a été ajouté! Je n\’ai pas encore trouvé de solution idéale, donc j\’ai dû faire comme grand nombre d\’applications Android  : les certificats ne sont pas vérifiés. Ce support n\’est pas automatique. Il faut cocher une option dans les préférences pour autoriser en toute connaissance de cause ce type de connexion.
  • Un menu contextuel est disponible sur l\’écran listant les flux. Pour le faire apparaitre, il suffit de faire un appui long sur un des items de la liste. Ce menu permet d\’ouvrir le flux dans le navigateur web du smartphone ou de marquer le flux comme lu ou non lu.
  • Un nouveau menu est disponible aussi lorsqu\’on lit un flux. Cette entrée permet encore une fois d\’ouvrir le flux dans un navigateur.
  • Dans la fenêtre dans laquelle les flux sont listés, il est maintenant possible de switcher entre \ »All\ » et \ »Only unread\ » sans avoir à retourner en page d\’accueil
  • Enfin, un dizaine de bugs ont été corrigés : vérification du préfixe \ »http://\ », problèmes d\’affichage, problèmes de traduction, etc…

\"Settings     \"Contextual

Et voilà! D\’autres choses devraient arriver rapidement et notamment des gestures permettant de passer rapidement d\’un flux à un autre en mode lecture.

Comme pour la première fois, toutes les infos sont disponibles à cette adresse : http://www.francoistessier.info/rssLoungeAndroid/. Vous y trouverez notamment un QRcode pour télécharger l\’apk qui va bien.

Enfin, n\’hésitez pas à me donner vos avis, remarques, suggestions. Pour les bugs, la page SourceForge du projet a une section \ »tickets\ » parfaite pour ça.

rssLounge for Android v0.1 is out!

\"LogoAprès une pause de près d\’un an dans son développement, je me suis enfin décidé à sortir une première version de rssLounge pour Android. Cette sortie a été possible grâce à la collaboration de Tobias Zeising, créateur de rssLounge, qui a bien voulu adapter la partie web afin de pouvoir l\’exploiter depuis un terminal Android. Cette version smartphone de rssLounge permet tout simplement la gestion de ses flux de façon synchronisée avec votre instance web. Elle nécessite, côté serveur, la version 1.7 de l\’application.

Comme vous pouvez le voir, cette première version est estampillée 0.1. Concrètement, cela signifie que l\’application est fonctionnelle mais qu\’elle ne fait pour le moment que le strict minimum à savoir : lire ses flux RSS (filtres \ »all\ » et \ »only unread\ » disponibles) et les marquer comme lu/non lu, tout ça de façon synchronisée. C\’est peu en terme de fonctionnalités mais cette partie était certainement la plus complexe à mettre en oeuvre donc des nouveautés devraient apparaître plus rapidement.

Parmi les ajouts que je suis en train d\’implémenter, il devrait y avoir la gestion du HTTPS, quelques gestures pour naviguer dans l\’application ou encore quelques petites corrections de bugs.

Enfin, cette application est évidemment gratuite et open-source! Elle est distribuée sous licence AGPL. Elle n\’est pas disponible sur le Market Android et ne le sera probablement jamais… En revanche, je réfléchis à l\’idée de la proposer d\’ici peu sur un market alternatif comme YAAM ou le CyanogenMarket si celui-ci voit le jour.

Toutes les infos concernant \ »rssLounge for Android\ » sont disponibles à cette adresse : http://www.francoistessier.info/rssLoungeAndroid/

N\’hésitez pas à me donner vos avis ou suggestions.

Programmation Arduino en ligne de commande

Aujourd\’hui, c\’est un nouveau rédacteur qui fait son entrée sur ce blog! Fabien nous propose un article sur la programmation des cartes Arduino depuis le terminal.
À propos de l\’auteur : Fabien Danieau est doctorant à Rennes, entre l\’INRIA et Technicolor. Titulaire d\’un diplôme d\’Ingénieur en Cognitique, ses travaux portent actuellement sur l\’application des interfaces haptiques pour le multimédia.

 

\"Arduino\"Arduino est une plateforme de prototypage électronique. Cela se présente sous la forme d\’une petite carte, avec un circuit imprimé et un microprocesseur, qui permet de réaliser très facilement et très rapidement des montages électroniques. De plus un éditeur simplissime est fourni afin que les débutants en programmation puisse s\’adonner aux joies de l\’électronique. Un langage basé sur le C++ est proposé, les programmes sont appelés \ »sketch\ ». Pour couronner le tout, hardware et software sont tous les deux open source. Ainsi cette plateforme connaît un véritable engouement et les projets fleurissent sur la toile.

La force de ce produit est donc sa simplicité. L\’environnement de programmation y contribue en grande partie. Seules quelques lignes de codes suffisent à allumer ses premières LEDs. Cependant cette simplicité devient vite une limite lorsque l\’on veut développer de plus gros projets. Gérer un code compliqué avec beaucoup de dépendances peut devenir un vrai casse-tête. De plus l\’éditeur n\’est encore qu\’une version alpha (0022 à l\’écriture de ce billet) et n\’est donc pas exempt de bugs. Sur ma machine, la carte n\’est pas toujours détectée lors de son branchement à un port USB. De ce fait il m\’est parfois impossible de charger un programme…
Bref pour diverses raisons on peut vouloir comprendre ce qui se passe derrière l\’éditeur. Ne serait-ce que pour être capable d\’utiliser un autre environnement de programmation. Nous allons donc voir comment compiler et charger un sketch à la main. Suite à cela, diverses alternatives à l\’environnement de développement fourni par Arduino seront proposées.

Pré-requis

Une grande partie des explications seront bâties sur l\’exemple suivant. Il est volontairement basique, les deux premiers tutos du site Arduino suffisent à le comprendre (cf. tuto Blink et tuto DigitalReadSerial). La seule chose que fait ce code est d\’allumer la LED liée à la pin 13 et d\’écrire \ »Starting\ » puis \ »Running\ » toutes les secondes et demi sur la sortie série.

int ledPin = 13;

void setup(){
pinMode(ledPin, OUTPUT);
Serial.begin(115200);
Serial.println(\"Starting\");
}

void loop(){
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(500);
Serial.println(\"Running\");
}

Pour la suite de l\’article nous supposerons que ce code fonctionne sans soucis sur la carte en utilisant l\’éditeur Arduino. Nous appellerons ce sketch \ »blink.pde\ ». Vous devriez obtenir un résultat similaire à celui-ci.

\"\"

A titre indicatif l\’ensemble des manipulations présentées ont été effectué sur une distribution Linux Debian Squeeze 64bits, une carte Arduino Uno SMD (microprocesseur atmel mega 328p) et l\’éditeur en version 0022 (téléchargé depuis le site officiel. La version dans les dépots de Debian est obsolète).

Le secret de l\’IDE Arduino

L\’idée de ce billet est de compiler l\’exemple précédent sans passer par l\’éditeur d\’Arduino. Une première étape consiste à demander à l\’éditeur de nous expliquer ce qu\’il fait lorsqu\’il compile. En faisant cela nous pourrons comprendre les mécanismes sous-jacents à la compilation et au chargement de sketchs sur la carte.
Par défaut l\’éditeur n\’est pas très loquace. Pour le rendre un peu plus bavard il faut modifier quelques options dans les préférences. Ouvrez le fichier de préférences avec votre éditeur favori.

gedit .arduino/preferences.txt

Puis rajoutez les deux options suivantes à la fin du fichier.

build.verbose=true
upload.verbose=true

Une fois ceci fait, lancez une nouvelle compilation du programme. Tout le processus de compilation est détaillé! Quelque chose dans ce goût là devrait apparaître.
\"\"

La deuxième option que nous avons rajouté sert à afficher le même genre d\’information mais lors du chargement (upload) du programme sur la carte.

Si on regarde ce que nous affiche l\’éditeur lors de la compilation on peut voir des commandes du style \ »avr-gcc\ », \ »avr-ar\ » ou encore \ »avr-objcopy\ ». La plateforme Arduino repose en fait sur la solution open source avrdude qui permet de communiquer avec des microprocesseurs atmel. Il suffit donc d\’utiliser directement cet outil pour programmer notre carte!
Avant de se lancer dans le détail du processus de compilation, il faut d\’abord installer avrdude. Normalement un simple apt-get devrait suffire chez les utilisateurs de Debian et autres distributions dérivées.

sudo apt-get install avrdude

Processus de compilation

Conversion du sketch en fichier cpp

Une chose qui surprend de prime abord est que notre fichier blink.pde n\’apparait nulle part dans les infos affichées par l\’éditeur. Par contre nous avons un fichier blink.cpp qui est compilé. En réalité avrdude permet de compiler des fichiers c/c++, les sketch ne sont qu\’en fait une surcouche créés par Arduino pour simplifier l\’écriture de code. Avrdude ne comprend pas ce \ »langage\ » donc une première chose que fait l\’éditeur est de traduire le sketch en fichier c++. Cela est très simple en pratique, il n\’y a pas de grande différences. L\’éditeur ne fait qu\’ajouter un \ »include\ » et les en-têtes des fonctions utilisées dans le sketch. Ce qui donne le fichier \ »blink.cpp\ ».

#include \"WProgram.h\"
void setup();
void loop();
//plus le reste du code affiché plus haut

Le fichier \ »WProgram.h\ » ajouté est fourni avec l\’éditeur. On peut le trouver dans le répertoire d\’installation ( quelque chose du genre arduino-0022/hardware/arduino/cores/arduino/) . Ce dossier contient tous les fichiers nécessaires à la création d\’un programme compréhensible par la carte arduino et sont compilés à chaque fois que l\’on compile un sketch.

Compilation des sources

Pour créer notre programme, la première étape consiste à compiler notre fichier \ »blink.cpp\ ». Cela se fait par la commande suivante.

avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=22 -I /home/fabien/Apps/arduino-0022/hardware/arduino/cores/arduino/ -o blink.o blink.cpp

Il vous faudra bien sûr adapter cette commande à votre configuration. Notamment après le \ »-I\ » où vous devez indiquez le chemin vers le répertoire d\’installation de l\’éditeur arduino. Nous n\’irons pas plus loin dans l\’explication des différents arguments. Ce degré de détails n\’est pas forcément l\’objet de ce billet et je ne suis pas non plus familier avec toutes les options. A l\’issue de cette commande vous devriez obtenir le fichier \ »blink.o\ ».
Le travail n\’est pas fini, vous avez sans doute remarqué que l\’éditeur compile beaucoup plus de fichiers. Comme je l\’ai dit plus haut, toutes les sources situées avec le fichier \ »WProgram.h\ » sont compilées. C\’est ce que nous allons faire à présent.
Pour plus de clarté nous allons faire les prochaines manipulations dans un sous-dossier que j’appellerai \ »core\ ».

mkdir core
cd core

Ensuite la commande de compilation reste la même qu\’au dessus. Par exemple pour le fichier \ »Print.cpp\ »:

avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=22 -I /home/fabien/Apps/arduino-0022/hardware/arduino/cores/arduino/ -o Print.o /home/fabien/Apps/arduino-0022/hardware/arduino/cores/arduino/Print.cpp

A noter que certaines sources sont en C. Il faut donc appeler avr-gcc cette fois-ci et enlever \ »-ffunction-sections\ ». Par exemple pour le fichier \ »wiring.c\ »:

avr-gcc -c -g -Os -w -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=22 -I /home/fabien/Apps/arduino-0022/hardware/arduino/cores/arduino/ -o wiring.o /home/fabien/Apps/arduino-0022/hardware/arduino/cores/arduino/wiring.c

En tout il y a 13 sources à compiler et autant de \ ».o\ » à créer. Ce n\’est pas l\’étape la plus rigolote c\’est sûr. Elle est intéressante à faire une fois pour bien comprendre le processus. Nous verrons à la fin les outils qui font tout pour nous :).
La dernière étape de la compilation est la création de la librairie. Nous sommes toujours dans notre dossier \ »core\ » avec nos 13 \ ».o\ ». Il suffit d\’appeler \ »avr-ar\ » pour tous les compiler en une librairie.

avr-ar rcsv core.a *.o

Et voilà le travail, la librairie \ »core.a\ » devrait être présente dans votre dossier. On remarque que l\’éditeur refait toute la procédure de création de la librairie à chaque compilation. Pourtant l\’édition d\’un sketch ne modifie que \ »blink.pde\ » et donc \ »blink.cpp\ ». On peut se demander si cela à un réel intérêt…

linkage et creation de l\’\ »executable\ »

La prochaine étape vise à lier notre programme compilé, \ »blink.o\ » avec la librairie \ »core.a\ ». Nous remontons d\’un niveau (\ »cd ..\ ») pour nous retrouver dans le dossier contenant ledit \ »blink.o\ » et le dossier \ »core\ ». La commande suivante fera l\’affaire.

avr-gcc -Os -Wl,--gc-sections -mmcu=atmega328p -o blink.elf blink.o ./core/core.a -L core -lm

Le fichier \ »blink.elf\ » devrait apparaître.
Nous touchons à la fin. La dernière étape vise à créer l\’équivalent d\’un exécutable que l\’on pourra charger sur la carte. La création se fait ainsi.

avr-objcopy -O ihex -R .eeprom blink.elf blink.hex

Ca y est tout est compilé! Le fichier \ »blink.hex\ » nouvellement créé est le signe de notre réussite.

Upload

Allez c\’est bientôt fini. Nous allons maintenant charger ce programme sur la carte. Branchons la sur un port usb. Et lançons une dernière commande.

avrdude -v -p m328p -P /dev/ttyACM0 -b115200 -c arduino -U flash:w:blink.hex

Chez vous il faut indiquer le port correspondant à votre carte à la place du /dev/ttyACM0. Si vous utilisez une arduino Uno ça devrait être pareil. Le nombre 115200 correspond à la vitesse de communication entre la carte et le pc fixée à 115200 bauds, et doit être le même que celui indiqué dans le code \ »blink.pde\ ».
Si tout se passe bien la LED liée à la pin 13 doit clignoté à l\’issue du chargement sur la carte. Tout s\’est bien passé, vous avez réussi à compiler votre premier programme à la main!

Communication série

C\’est bien beau tout ça, mais vous allez me demander où s\’affichent les fameux messages \ »Starting\ » et \ »Running\ ». Avec l\’éditeur il suffisait d\’afficher le moniteur, mais maintenant? Avons-nous perdu un outil dans la bataille?
Pas du tout n\’ayez crainte. Nous allons utiliser une alternative appelé \ »screen\ ». Elle permet entre autres d\’émuler un terminal. En lançant la commande suivante dans une console vous devrez voir les messages que l\’on croyait perdus.

screen /dev/ttyACM0 115200

Vous trouverez cet outil dans les dépôts s\’il n\’est pas installé. Le résultat doit approcher celui-ci:

\"\"

Conclusion et alternatives

Voilà nous savons maintenant compiler un programme pour Arduino à la main. Cependant le processus complet est un peu fastidieux. Il est intéressant de le faire une fois pour bien comprendre le mécanisme mais ce n\’est pas vraiment pratique pour une utilisation régulière.
Par contre en connaissant la chaine de compilation utilisant avrdude, rien ne nous empèche de l\’adapter et de l\’utiliser avec notre environnement de développement préféré. Plusieurs solutions existent déjà et vous permettent de compiler un sketch via un makefile, CMake, Scons or encore sous Eclipse.

Réferences

Ajouter une barre des tâches dans GNOME Shell (tint2)

On va aborder ici un point sensible de GNOME Shell : la suppression pure et simple de la barre des tâches. Certains sont plutôt d\’accord avec cette décision et s\’en sortent très bien avec la fenêtre des activités et les nombreux raccourcis clavier. D\’autre au contraire sont vraiment gênés par ça et cherchent désespérément leurs fenêtres partout. Je pense être en ce moment un peu entre les deux… Et bien que je sois partisan du \ »tout clavier\ » ou presque, je pense que ce que je vais vous proposer va intéresser du monde.

En me baladant un peu sur le net, je suis tombé sur un projet intéressant appelé tint2. Il se présente comme une barre des tâches non intrusive et légère. Ce projet est visiblement toujours maintenu puisque des commits ont eu lieu en mars dernier. Enfin, et c\’est là où c\’est intéressant : tint2 s\’intègre très bien dans GNOME Shell!

Installation sous ArchLinux

L\’installation sous ArchLinux est simple :

$ sudo yaourt -S tint2

Et pour voir à quoi ça ressemble :

$ tint2
\"tint2\"

Cette barre des tâche est entièrement configurable mais nous y reviendront un peu plus loin. Quoi qu\’il en soit, si vous êtes conquis par cet outils, vous pouvez ordonner son lancement au démarrage en lançant dans un terminal :

$ gnome-session-properties

Puis ajoutez une entrée dont la commande sera tint2. Enregistrez, fermez et le tour est joué!

À vous d\’adapter ensuite l\’installation en fonction de votre distribution. Dans le cas où cette application ne serait pas dans les dépôts, le dossier des sources contient un fichier INSTALL expliquant comment procéder manuellement.

Configuration

Comme je l\’ai évoqué précédemment, cette barre est entièrement paramétrable. Pour accéder à l\’interface de configuration, il suffit de lancer depuis un terminal :

$ tint2conf

Cliquez ensuite sur le premier bouton \ »Show properties\ ».

\"tint2conf\"

Je ne vais pas détailler entièrement cette éditeur de configuration vu que tout est très bien expliqué ici. En revanche, voici les quelques modifications que j\’ai apporté sur ma version :

  • Dans l\’onglet \ »Clock\ », j\’ai décoché \ »Show\ » de façon à supprimer l\’affichage de l\’horloge dans la barre des tâches. L\’affichage intégré dans GNOME Shell me convient parfaitement et je ne vois pas l\’intérêt d\’un doublon.
  • Dans l\’onglet \ »Mouse\ », j\’ai changé le clic droit (\ »Right Mouse Click Action\ ») de \ »close\ » à \ »none\ ». En effet, le clic droit qui ferme la fenêtre ne me plaisait pas du tout. Du coup je n\’ai donné aucun comportement au clic droit. Il est possible de lui donner le même comportement que le clic gauche mais après avoir essayé, j\’ai trouvé ça trop confus.
  • Enfin, j\’ai un peu adapté l\’opacité dans le premier onglet (\ »Background 1 > Background color\ ») pour que la barre soit un peu moins transparente.

Toute cette configuration est écrite dans le fichier texte $HOME/.config/tint2/tint2rc. Les commentaires sur cette page regorgent d\’exemples de configuration qu\’il peut être intéressant de regarder.

 

Pour conclure, je ne sais pas encore si je vais conserver cette barre de tâches. Je vais l\’essayer quelques jours et voir ce que ça donne. Ce que j\’aurais à lui reprocher dans un premier temps c\’est l\’absence de menu au clic droit et le systray fixe (ne réagit pas à la réception d\’un mail ou d\’un message sur empathy par exemple). Enfin, et c\’est le plus important, cette barre ne court-circuite-t-elle pas tout le principe de l\’interface GNOME Shell? Et vous, l\’avez vous essayé? Qu\’en avez-vous pensé?

Aquilenet, FAI associatif Aquitain : Interview d\’un des fondateurs

\"Aquilenet\"J\’avais déjà évoqué l\’association Aquilenet dans un billet précédent puisque c\’est elle qui avait organisé il y a quelques semaines la conférence \ »Internet et Libertés\ » en présence de Jérémie Zimmermann de la Quadrature Du Net.

Si je lui consacre entièrement un billet aujourd\’hui, c\’est parce que depuis quelques jours, ce FAI associatif a lancé officiellement ses ouvertures de lignes ADSL. Aquilenet se présente ainsi :

Aquilenet est une association fournisseur d\’accès à Internet (FAI), actuellement sur sa lancée de lignes ADSL \ »avec du vrai Internet\ » en Aquitaine depuis janvier 2011, membre fondateur de la Fédération FDN. Nous avons préféré attendre d\’avoir quelques lignes en fonction avant d\’ouvrir publiquement le service, il est maintenant temps pour de nouveaux adhérents de nous rejoindre, pour s\’abonner ou simplement nous soutenir !

Pourquoi Aquilenet ? Parce qu\’il s\’agit de \ »vrai Internet\ »: un Internet sans bridage, sans filtres, sans collecte d\’informations à des fins commerciales et sans contrainte à l\’innovation. Il s\’agit donc d\’un branchement direct au réseau avec des services fournis au maximum de la bande passante possible. Une IP fixe, (un reverse DNS, une délégation DNS, etc.), une interface de gestion de son compte, un coût mensuel maîtrisé. Étant une association loi 1901, Aquilenet offre de la transparence sur les comptes et n\’a pas d\’objectif de rentabilité. Nous facturons donc les lignes en fonction de leur prix de revient, et chaque adhérent peut le vérifier. L\’association n\’utilise que des solutions libres, ce qui nous permet d\’être dans une démarche de construction des services avec les adhérents. Chacun peut participer à développer l\’infrastructure…

Pour en savoir un peu plus, j\’ai interrogé Samuel Thibault un des fondateurs de l’association.

Bonjour Samuel, peux-tu te présenter brièvement?

Je suis enseignant-chercheur à l\’Université Bordeaux 1, spécialisé en calcul parallèle haute performance. Je suis par ailleurs développeur Debian, dont je m\’occupe de l\’accessibilité, et je suis un des mainteneurs de GNU/Hurd. De plus, je joue de la batterie et du trombone dans divers orchestres. Enfin, je suis trésorier d\’Aquilenet.

Peux-tu nous expliquer en quelques mots ce qu\’est Aquilenet?

Il s\’agit d\’une association pour remuer le réseau Internet en Aquitaine. Elle est notamment Fournisseur d\’Accès Internet: elle fournit actuellement un accès à Internet via des lignes ADSL. Elle compte également développer la structure du réseau Internet en Aquitaine: interconnexion locale et avec nos voisins à Brives, Sames, Toulouse, Lyon, … plutôt que systématiquement remonter à Paris.

Quel est l\’intérêt d\’un FAI associatif?

L\’intérêt d\’un FAI associatif est que les abonnés sont adhérents de l\’association, c\’est-à-dire qu\’ils ont droit de regard sur la politique menée par l\’association et peuvent mettre la main à la pâte: politique de non-filtrage, tarification (avec tarifs étudiants par exemple), développement de nouveaux services, etc.

Et pourquoi une implantation régionale?

Il y a plusieurs réponses. FDN est le premier Fournisseur d\’Accès Internet français encore en activité. Il se trouve qu\’il est associatif. Récemment, FDN a commencé à grossir de plus en plus (200 lignes ADSL à l\’heure actuelle), et cela commence à poser problème: il y a typiquement une centaine de personnes qui assistent à l\’AG ! Fonder des FAIs locaux, qui restent à taille humaine, permet de décharger en quelque sorte FDN. Fonder des opérateurs est par ailleurs bénéfique pour le réseau ! Lorsque l\’on regarde l\’implantation des LIRs en France (https://lirportal.ripe.net/maps/locator/) on note une centralisation extrême à Paris, alors que nos voisins européens voient leurs opérateurs répartis géographiquement. En France la topologie du réseau est essentiellement en étoile, or on sait bien que c\’est moins robuste et efficace qu\’un maillage. Fonder des opérateurs locaux est donc une manière de remailler le territoire. C\’est également une manière de dynamiser le réseau localement. Au datacenter de Bordeaux-Lac par exemple, il n\’y a pas d\’IX, l\’outil qui pourrait permettre aux PMI/PME de s\’interconnecter directement en local, plutôt que remonter tous les flux à Paris juste pour redescendre aussitôt à Bordeaux, encombrant ainsi les fibres entre les deux alors qu\’il suffit de mettre un câble en local. Aquilenet compte aider à la création d\’un GIXE qui s\’en occuperait. C\’est enfin un point de rencontre local pour les férus de réseau ! Aller à Paris juste pour causer switches Ethernet, c\’est onéreux. Un opérateur local peut organiser des rencontres locales pour causer, boire des bières, etc. qui sont autant d\’occasions de plus facilement convaincre des gens de s\’abonner à un FAI associatif.

Peux-tu nous expliquer comment tout ça fonctionne (à qui appartiennent les lignes? à quel niveau intervenez-vous? etc…)?

Aquilenet n\’est pour le moment qu\’une \ »marque blanche\ », c\’est-à-dire qu\’elle ne fait que commander des lignes à FDN pour le compte de ses adhérents, et récolter les sous :) Nous comptons par la suite nous occuper petit à petit de plus en plus des différents éléments de l\’accès Internet. Par ailleurs, FDN ne possède pas sa propre infrastructure ADSL et sous-traite à Nerim, qui lui-même sous-traite à SFR (cas dégroupé) ou à France Télécom (cas non dégroupé). Actuellement, ce qui se passe lors d’une prise de ligne ADSL dégroupée est donc:

  • un adhérent soumet sa demande de souscription à Aquilenet.
  • Aquilenet commande la ligne auprès de FDN, qui la commande auprès de Nerim, qui la commande auprès de SFR, qui la commande auprès de France Télécom.
  • SFR remonte la collecte ADSL à Paris et la livre à Nerim, qui la livre à FDN.
  • FDN réceptionne la collecte, et redistribue vers Internet via l\’opérateur alternatif Gitoyen.
  • SFR facture à Nerim, qui facture à FDN. Gitoyen facture à FDN. FDN facture à Aquilenet, qui facture à l\’adhérent.

Cela parait bien long comme chemin, il est vrai qu\’ajouter des intérmédiaires pourrait nuire. Il se trouve que la construction de ligne ne prend tout de même typiquement que quelques jours. Les intermédiaires prennent bien sûr leurs marges, mais de toutes façons pour l\’ADSL il n\’y a guère le choix: ni France Télécom ni free ne sont ouverts à fournir le service, SFR n\’accepte plus de traiter directement avec FDN, et malgré sa bonne volonté, Nerim n\’est pas forcément encline à établir des contrats avec de nombreux FAIs locaux. Poser soi-même des DSLAMs nécessite enfin un investissement bien trop important pour une association. Aquilenet n\’a donc qu\’un rôle purement administratif pour l\’ADSL, et sous-traite toute la technique à FDN. Une autre possibilité aurait été de n\’acheter que la collecte à FDN: le scénario aurait été le même, sauf que plutôt que redistribuer vers Internet, FDN aurait livré la collecte à Aquilenet, qui devrait alors se débrouiller pour redistribuer vers Internet. Le hic, c\’est que la livraison ADSL a à priori de toutes façons lieu à Paris, cela nous a donc semblé inutile de dépenser du temps pour finalement rester dans un scénario centralisé à Paris, nous préférons le dépenser sur des projets plus locaux.

Où intervient le libre?

Tout le chemin entre le modem de l\’abonné et FDN appartient tantôt à France Télécom, SFR, Nerim, donc dépend d\’eux a priori. Mais ceux-ci n\’ont pas à regarder ce qui y passe, le contrat ne stipule que la fourniture d\’un câble virtuel entre l\’abonné et FDN, qui est alors utilisé librement pour faire passer n\’importe quoi, notamment de l\’IPv4 et de l\’IPv6 sous toutes leurs formes, sans aucune contrainte, que ce soit en termes de différenciation de débits, de fermetures de ports, de possibilités de routages, etc.: c\’est vraiment juste un câble passif, avec lequel on fait ce que l\’on veut entre l\’abonné et FDN. Si ces opérateurs le voulaient vraiment (mais ils n\’auraient pas suffisamment d\’intérêt commercial à cela), ils pourraient dépenser du matériel et du temps pour ajouter un DPI ; on pourrait alors au pire utiliser une option de chiffrement de PPP. À l\’inverse, les fournisseurs d\’accès commerciaux ont tendance à fermer certains ports, refuser de fournir aux abonnés différentes IP (statiques), une délégation rDNS, voire différencier les flux: ralentir volontairement le débit disponible depuis certains sites jugés concurrents.

La \ »neutralité du réseau\ » que vous proposez suppose donc que vous êtes à l\’abri du flicage (HADOPI) et du filtrage (LOPPSI)?

On ne peut pas être à l\’abri des lois: si une loi (et surtout, les décrets correspondant) impose un flicage ou un filtrage, on n\’a guère d\’autre choix que de l\’appliquer, sinon c\’est du pénal. Il peut par contre arriver que l\’on traîne à le faire, et apporter une justification de difficulté technique (qui est réelle !), ou simplement montrer une volonté relative d\’obtempérer. On a vu Free fournir des listings sous forme papier 😉

Comment se traduit cette neutralité chez Aquilenet?

Pour l\’instant, puisque Aquilenet n\’effectue pas elle-même sa collecte et redistribution, c\’est surtout du côté de FDN qu\’elle se traduit, Aquilenet ne fait que retransmettre le service de FDN, qui correspond bien à son éthique: tout est ouvert et indifférencié, tout simplement. Si les décrets passent, FDN devra commencer à essayer de mettre en place flicage et filtrage (FDN a pour principe de respecter la loi). Aquilenet devra alors se poser la question.

Pourquoi adhérer à l\’association?

Pour nous soutenir ! Financièrement bien sûr, mais aussi Aquilenet commence à toquer à la porte des collectivités locales, et a bien plus de poids lorsqu\’elle a des adhérents derrière.

Enfin, quand est-ce que les premières lignes ADSL pourront être ouvertes et quel sera le prix mensuel de l\’abonnement?

Dès maintenant ! Le prix mensuel est aligné sur celui de FDN, 28€/mois en dégroupé partiel SFR, 41€/mois en non-dégroupé SFR, auquel s\’ajoute le coût de la ligne France Télécom. Des tarifs réduits (27€/36€) sont proposés pour les étudiants, RMIstes, chômeurs, etc.

 

Merci à Samuel pour le temps qu\’il a consacré à cette interview. Vous trouverez davantage d\’informations sur http://www.aquilenet.fr. Si vous avez des questions, n\’hésitez pas à les contacter ou à laisser un commentaire sur ce blog. Je ferai suivre la question à Samuel et tâcherai d\’y répondre rapidement.

Zenity, pour rendre ses scripts plus interactifs

Le contexte est le suivant : Ma belle-mère, que j\’ai converti à Ubuntu il y a maintenant un peu plus d\’un an, s\’est offert il y a quelques jours un lecteur multimédia Archos 3cam Vision. Bien que l\’appareil ne casse pas trois pattes à un canard, il reste raisonnable vu son prix (70€). Bref, Belle-maman étant fan d\’opéras en tous genre, elle a donc extrait plusieurs CD en MP3 (merci Sound Juicer!) et les a transférés sur son Archos. Problème : Un opéra, ça s\’écoute dans l\’ordre et malgré des noms de fichiers suivant l\’ordre alphabétique, les MP3 se retrouvaient complètement mélangés quand on les parcourait depuis le lecteur.

Après quelques recherches, j\’ai appris que chez Archos, ils n\’ont rien trouvé de mieux que de classer les fichiers non pas par ordre alphabétique comme la logique le voudrait, mais par date de transfert… Je ne sais pas quelle est la raison de ce choix mais j\’imagine que Windows doit copier les fichiers d\’un emplacement à un autre par ordre alphabétique et que, comme la majorité des PC tournent sous Windows, blablabla, on connaît la chanson. Il s\’agit d\’une simple supposition mais je ne vois pas vraiment d\’autres explications rationnelles…

Quoi qu\’il en soit c\’est un problème connu et en cherchant un peu sur le Net, j\’ai trouvé une ligne de commande permettant de copier le contenu d\’un dossier vers un autre emplacement en transférant les fichiers un par un dans l\’ordre alphabétique. La ligne provient de et ressemble à ça :

find . -type f -print0 | sort -z -n  | xargs -0 cp --target-directory=\'/media/A3cam/Music/mon_album\'

Seulement voilà! Je me voyais mal expliquer à Belle-maman que pour transférer un album, il fallait qu\’elle crée préalablement dans /media/A3cam/Music un dossier de destination pour l\’album en question, qu\’elle se rende en ligne de commande dans le dossier contenant les MP3 qu\’elle souhaitait transférer et qu\’elle exécute cette ligne de commande tout en modifiant le chemin de destination en conséquence… Dieu sait si j\’aime la ligne de commande mais, même moi, ça me gênerait de devoir faire ça pour mettre correctement de la musique sur mon lecteur MP3. Bref, c\’est là qu\’intervient Zenity et j\’ai envie de dire qu\’après une intro comme ça, il était temps 😉

Zenity, qu\’est-ce que c\’est? Zenity, installé de base sur Ubuntu (et sur Arch avec Gnome?), permet de créer des boîtes de dialogue simples en GTK+ depuis le shell. Ce n\’est pas fait pour créer une interface complète mais ça permet quand même de donner une peu d\’interactivité à ses scripts. Le principe est très simple. La commande zenity suivie d\’une option (–file-selection, –info, –calendar, …) permet de générer une boîte de dialogue. Chaque boîte possède ensuite ses propres options de façon à la personnaliser. Ainsi, j\’ai pu adapter la ligne de commande précédente de la façon suivante :

#!/bin/sh

ARCHOS=\'/media/A3cam/Music\'

if [ ! -d $ARCHOS ]
        zenity --error --text=\"Le lecteur MP3 ne semble pas branché\\!\"
        exit
fi
FILE=`zenity --file-selection --filename=/home/user/Musique/ --directory --title=\"Sélectionnez un dossier à transférer\"`
case $? in

0)

FOLDER=${ARCHOS}/`basename $FILE`

mkdir $FOLDER

find $FILE -type f -print0 | sort -z -n | xargs -0 cp -v --target-directory=\"$FOLDER\"

zenity --info --text=\"Transfert effectué avec Succès\\!\";;

1|-1)

zenity --error --text=\"Impossible d\'effectuer de transfert. Le lecteur MP3 est-il bien branché et allumé? Avez-vous bien sélectionné le dossier à transférer?\";;

esac

Détaillons rapidement tout ça :

  • La première ligne spécifie le chemin vers le dossier Music de l\’Archos. La suite teste l\’existence de ce chemin et renvoie une pop-up d\’erreur le cas échéant.\"Erreur\"
  • On récupère ensuite dans la variable FILE le chemin choisi dans la fenêtre de sélection de dossier créée par Zenity. À noter le paramètre –filename qui permet de présélectionner un dossier, le paramètre –directory qui oblige à ne sélectionner que des dossiers, et le paramètre –title afin de donner un titre à la boîte de dialogue.\"Selection
  • Zenity retourne également un code de sortie qui est égal à 0 si tout s\’est bien passé, 1 ou -1 sinon (erreur, annulation). En bash, la variable $? permet de récupérer le code de sortie de la dernière commande exécutée. Un switch/case classique permet alors de trier ces codes de retour.
    • Si un dossier a bien été sélectionné, on crée un dossier de même nom sur le lecteur MP3 (on notera l\’utilisation de basename qui, entre autres, pour un chemin quelconque renvoie le nom du dossier courant). On exécute la commande qui va faire la copie élément par élément par ordre alphabétique et on génère une pop-up quand cette copie est terminée.\"Transfert
    • Dans le cas où la sélection de dossier retourne un code d\’erreur, on génère une pop-up en conséquence.\"Erreur\"

Ce script est encore perfectible mais il permet de proposer l\’exécution d\’une commande spécifique de manière un tant soit peu interactive. Zenity est au bout du compte très basique mais suffisant pour beaucoup de choses. On notera par exemple le calendrier ou la barre de progression. Enfin de la personnalisation de contenu est possible grâce à des balises type HTML. Une documentation est disponible sur le site de Gnome et sur Ubuntu-fr.

NB : Si quelqu\’un possède un Archos 3cam Vision ou équivalent, a-t-il une idée de comment sont organisés les dossiers? Les fichiers, maintenant c\’est assez clair, mais les dossiers ont l\’air de suivre encore une autre logique… Les gars de chez Archos ont-ils choisi de trier les dossier en fonction de la taille moyenne des noms de fichiers qu\’ils contiennent?!…

Mon premier paquet AUR : fortune-mod-kaamelott

Suite au billet de Devil505 expliquant qu\’il avait packagé pour Frugalware et pour l\’application fortune-mod des citations des Tontons Flingueurs, je me suis dit qu\’il était temps pour moi de proposer mon premier paquet AUR pour ArchLinux sur le même principe. En effet, il y a quelques mois, j\’avais extrait de Wikiquote.org plus de 500 citations de la série Kaamelott de façon à les utiliser avec fortune. Je faisais l\’installation à la main sous Ubuntu (si on peut vraiment parler d\’installation vu qu\’il s\’agit de copier deux fichiers…). Dorénavant, il suffira de faire sous ArchLinux :

$ yaourt -S fortune-mod fortune-mod-kaamelott

Permettant ainsi d\’avoir de superbes citations :

$ fortune kaamelott
C est pas que c est difficile de la récupérer... C est que c est sa mère
difficile de la récupérer, la race de sa grand-mère !
[Karadoc, Livre IV, Le Vice De Forme]

Bref, je vais profiter de ce billet pour expliquer brièvement comment j\’ai créé et soumis ce paquet AUR. Le principe est finalement très simple puisque que j\’ai créé d\’une part une archive des \ »sources\ » hébergée sur mon serveur contenant les citations de Kaamelott au format \ »fortune\ » et d\’autre part une archive contenant le fichier PKGBUILD qui permet de décrire le paquet (que ce soit des informations sur la version ou la licence comme la fonction permettant l\’installation). Pour écrire ce fichier, je me suis inspiré de PKGBUILD existants et notamment celui de fortume-mod-chucknorris. Voilà ce que ça donne :

# Maintainer: François Tessier

pkgname=fortune-mod-kaamelott
pkgver=1
pkgrel=1
pkgdesc=\"French Fortune cookies from Kaamelott\"
arch=(any)
license=(\'CCPL\')
depends=(fortune-mod)
makedepends=(coreutils)
source=\"http://www.francoistessier.info/blog/wp-content/uploads/2011/02/fortune-kaamelott.tar.gz\"
url=\"http://www.francoistessier.info/blog/2011/02/14/mon-premier-paquet-aur-fortune-mod-kaamelott\"
md5sums=(\'a490897ecfdf4b1944e1411bd97b6a17\')

build() {
  cd $startdir/src
  mkdir -p $startdir/pkg/usr/share/fortune
  fold -w 80 -s fortune-kaamelott/kaamelott > \\
  	$startdir/pkg/usr/share/fortune/kaamelott || exit 1
  strfile $startdir/pkg/usr/share/fortune/kaamelott || exit 2
}

Quelques précisions concernant cette archive : une fois le PKGBUILD rédigé, j\’ai dû générer le hash MD5 du fichier spécifié dans le champ \ »source\ ». Un outils permet de faire ça simplement : makepkg. Ainsi, une fois dans le dossier contenant mon PKGBUILD :

$ makepkg -g >> PKGBUILD

Cette commande va télécharger la source, en générer le hash et l\’écrire à la fin du fichier PKGBUILD. Pour plus de lisibilité, j\’ai déplacé cette ligne au-dessus de la fonction build(). Enfin, pour générer proprement l\’archive qu\’il faudra uploader sur http://aur.archlinux.org, toujours dans le même dossier :

$ makepkg --source

Un fichier fortune-mod-kaamelott-1-1.src.tar.gz a été créé. L\’upload s\’est bien passé et l\’installation via yaourt aussi! Bref, je suis vraiment très impressionné par la simplicité de la procédure permettant de soumettre un paquet AUR. Qui plus est la documentation est assez fournie. Ce système est vraiment puissant et encourage la communauté à participer ou tout du moins ne la décourage pas! Qui dit mieux?!

PS : Les citations de Wikiquote.org étant sous licence CC by-sa, j\’ai soumis mon paquet à la même licence et j\’ai cité Wikiquote.org dans mon README. Qu\’en pensez-vous? Suis-je bien en règle en procédant ainsi?