Yohann Martineau, blog

Posts tagged internet

Compiler un firmware de clubinternet box

2009-10-29 14:48:36
Date originale : 5 février 2007

Bonjour,
voici un petit tutorial pour compiler un firmware de clubinternet box, et ainsi pouvoir peronnaliser les fonctions de sa boîte.

Les différentes étapes à suivre sont les suivantes :

  • récupérer les sources du firmware de la clubinternet box (dans mon cas le modèle est AH4222, mais celà devrait être assez proche pour un modèle AH4021),
  • installer la chaîne de compilation fournie,
  • corriger les petites erreurs des sources fournies,
  • compiler les sources et créér une image de système de fichier à flasher sur la ROM de la boîte,
  • transférer cette image sur la boîte.
Cet article décrit la marche à suivre pour compiler ces sources depuis un système GNU/Linux, plus particulièrement Debian Etch.

Obtention des sources

Pour pouvoir compiler les sources, il faut d'abord les obtenir les sources du firmware de la clubinternet box sont disponibles ici. Les versions du firmware doivent à priori évoluer souvent, donc il est possible que ce lien ne marche pas éternellement. En revanche, lorsque ces sources sont mises à disposition du public, une annonce est effectuée sur le forum technique de club-internet, dans la rubrique "Modem ADSL et Téléphonie clubinternet.box et AH-4021". Cette anonce est acutellement intitulée "Code source du firmware Hitachi (V44)", elle contient un lien vers les sources du firmware.

L'accueil des forums de club-internet est accessible ici. Attention, ces sources font quand même environ 84Mo, prévoir un peu de temps pour les télécharger, donc.

Deuxième étape : exploration du contenu de cette archive.

Cette archive contient elle-même deux autres archives et un script d'installation. Une des deux archives (bcm963xx_AH4222.01.2.01L.300L01.V44-08_consumer.tar.gz) contient véritablement le code source du firmware et la seconde archive (bcm963xx_uclibc_crosstools_3.4.2_0.9.27.tar.gz) contient la chaîne de compilation (uclibc) nécessaire pour compiler les sources du firmware avec la bonne cible.

La chaîne de compilation est fournie sous forme de deux paquets rpm, si vous utilisez une distribution gerrant directement les rpm (Mandriva, RedHat, Suse, etc.) vous pouvez vous contenter de lancer le script d'installation en root. L'installation à partir du script d'installation "consumer_install" va créér deux répertoires sous /opt. Si, en revanche vous avez une distribution utilisant des paquets au format debian (Debian, Ubuntu, etc.), comme c'est mon cas, il va falloir décompresser l'archive contenant les deux rpms, puis transformer ces paquets RPM en paquets deb.

Pour cela, on peut utilser le programme alien accouplé à rpm pour générer des paquets .deb à partir de paquets .rpm. La commande suivante, lancée en root permet donc d'installer les programmes nécessaires :

# apt-get install alien rpm

Ensuite pour convertir les paquets il suffit de lancer alien avec en paramètre le paquet à convertir.

# alien uclibc-crosstools-mips.i386.rpm
# alien -scripts uclibc-crosstools-common.i386.rpm

Attention : il faut rajouter l'option -scripts pour le paquet uclibc-crosstools-common.i386.rpm car ce paquet contient des scripts de post-installation, de pré-installation, ou d'un autre type, mais il est nécessaire d'inclure ces scripts dans le paquet généré (pas fait par défaut).

Deux paquets sont normalement disponibles au format .deb maintenant. Pour les installer, il suffit donc de lancer la commande suivante en root :

# dpkg -i *.deb

Les sources du firmware n'utilisent pas directement l'emplacement par défaut de la chaîne de compilation, il est donc nécessaire de rajouter un lien vers la chaîne :

# ln -s /opt/toolchains /opt/toolchains_3_00
Victoire ! La chaîne de compilation est désormais installée, et opérationnelle !

Patchs à effectuer

Avant de se casser les dents sur la compilation, mieux vaut effectuer quelques modifications dans les sources fournies.

Tout d'abord, il est nécessaire de patcher la génération de configuration du noyau linux. Il faut modifier le fichier suivant :

/opt/bcm963xx_router/kernel/linux/scripts/kconfig/mconf.c
Dans ce fichier, il faut remplacer toutes les occurences de current_menu par un autre nom non déjà pris, par exemple current_mconf_menu.

Ensuite, il faut patcher le système de gestion de la configuration de la clubinternet box.

Dans le fichier :

/opt/bcm963xx_router/userapps/broadcom/cfm/util/system/syscall.c
Supprimer les références à sha1.h, c'est à dire :
  • supprimer la ligne #include "sha1.h"
  • supprimer tout ce qu'il y a après la ligne :
    /********************** end base64 decode and encode functions **********************/
Cela correspond aux méthodes liées à sha1.h dont l'implémentation n'est pas fournie.

Compilation

Ouf, la compilation va maintenant pouvoir commencer.

Les cibles disponibles pour la compilation sont présentes dans le répertoire targets des sources du firmware, désormais installées dans /opt/bcm963xx_router. Dans notre cas, il y a un répertoire 96348GWV ou similaire qui nous donne le nom de la cible à passer en paramètre à la compilation.

La commande à taper (toujours en root) pour lancer la compilation est donc la suivante :

# make PROFILE=96348GWV
Là, on croise bien fort les doigts et quelques minutes plus tard, une image de disque ROM a été générée et est prête à être transférée dans la mémoire de la clubinternet box. Si la compilation s'est bien passée, un message l'indique en donnant le nom de l'image du système de fichier à ralonge qui a été générée. Dans mon cas le nom de l'image générée est la suivante :
bcm96348GWV_fs_kernel_AH4222.01.2.01.300L01.V44-08.mgcp.dspApp3341_fxo.LE9500-070204_1656

Transfert de l'image

Maintenant que nous avons notre image, le plus dûr à été effectué. Il reste tout de même à installer sur sa machine un serveur tftp pour pouvoir transférer l'image sur la boîte. En effet, lorsque la boîte effectue ses mises à jour en tant normal, elle transfert son image en utilisant un client tftp un peu allégé. Ce client récupère en tant normal l'image sur le site suivant : tftp-ht.voip.club-internet.fr mais nous allons désormais lui faire utiliser notre machine, sur laquelle vient d'être générée une image toute neuve.

Sous debian, il suffit d'utiliser la commande apt-get install tftpd pour installer un serveur tftp, il doit certainement y avoir l'équivalent pour les distributions au format rpm. La racine du serveur tftp sous debian se trouve dans /srv/tftp, il suffit donc de copier l'image générée dans ce répertoire.

Ensuite on peut se connecter via telnet à la clubinternet box :

$ telnet 192.168.1.1
L'utilisateur est root, et le mot de passe est clubadmin. Une fois connecté, une invite de commande commançant par > s'affiche. Il est désormais possible de transférer l'image et de la flasher immédiatement avec la commande suivante :
> tftp -g -f bcm96348GWV_fs_kernel_AH4222.01.2.01.300L01.V44-08.mgcp.dspApp3341_fxo.LE9500-070204_1656 192.168.1.2
-g est l'option correspondant à get
-f pour spécifier le nom du fichier distant à transférer et l'adresse de la machine sur laquelle on est à passer à la fin (éventuellement à adapter)

Si vous vous trompez de fichier ou que vous ne spécifiez pas une image valide à transférer, la clubinternet box va le détecter et à son prochain reboot, elle téléchargera l'image du firmware depuis le site de club-internet.

Après le "flashage", la boîte redémarre, il faut lui laisser quelques minutes, et si après ces quelques minutes vous pouvez vous connecter à internet, c'est gagné ! vous avez réussi à installer votre image de système de fichier sur la boîte !

Personnaliser sa boîte

Maintenant que nous savons compiler notre image et la transférer sur la boîte, nous allons (enfin) pouvoir commencer à faire des choses amusantes avec la boîte. Nous allons réalser les étapes suivantes :

  • écrire un "Hello world" en c,
  • le compiler au bon format,
  • placer le binaire au bon endroit,
  • recompiler l'image,
  • la transférer,
  • tester notre super programme.
Ecrire un fichier helloworld.c :
#include

int main() {
  printf("Hello, world!\n");
  return 0;
}
C'est rudimentaire, mais très utile pour pouvoir effectuer des tests simples.

Maintenant, nous pouvons compiler notre premier programme avec la chaîne de compilation :

/opt/toolchains/uclibc-crosstools/bin/mips-uclibc-gcc helloworld.c
Nous avons donc maintenant un fichier binaire a.out. Ce fichier est au format MIPS, nous pouvons le vérifier avec la commande suivante :
# file a.out
a.out: ELF 32-bit MSB executable, MIPS, MIPS-I version 1 (SYSV), dynamically linked (uses shared libs), not stripped

Une fois que nous avons ce fichier binaire exécutable sur la clubinternet box, nous pouvons le placer au bon endroit dans l'arborescence du système de fichier utilisé pour créér l'image de disque ROM :

# cp a.out /opt/bcm963xx_router/targets/fs.src/usr/bin
les fichiers exécutables que l'on génère sont à placer dans /usr/bin dans /opt/bcm963xx_router/targets/fs.src et non dans /bin, car ces programmes ne concernent pas le fonctionnement du système directement. Et surtout des vérifications sont effectuées lors de la compilation sur la suppression des entêtes et autres données "inutiles" (strip) dans le programme sous forme de fichier binaire.
Maintenant, tout est prêt pour regénérer l'image de disque ROM (une nouvelle image est générée et l'ancienne n'est pas écrasée). Voir plus haut. Idem pour le transfert de l'image.

Une fois que l'image a été générée, on peut déjà vérifier que rien n'a été cassé en essayant de se connecter à internet. Si tout fonctionne, nous pouvons continuer et tester notre programme.
Il faut donc à nouveau se connecter sur la boite (telnet 192.168.1.1 root/clubadmin). Mais maintenant que l'invite en > apparaît, nous allons lancer un shell pour pouvoir exécuter notre programme. Il suffit de taper la commande suivante :

> sh

BusyBox v1.00 (2007.02.04-15:52+0000) Built-in shell (msh)
Enter "help" for a list of built-in commands.

#
Nous pouvons maintenant enfin lancer notre programme hors du commun avec la commande suivante :
# /usr/bin/helloworld
Hello, world!
#
Victoire, nous pouvons exécuter le code que nous voulons sur la boîte !!!

Remarques

Un client http (wget) est directement fourni sur la boîte, nous aurions donc pu simplement compiler le programme, le mettre sur un serveur web et le transférer avec wget a.out en le plaçant dans la partition /var accessible en écriture sur la boîte, puis le rendre exécutable (chmod 755) et le lancer directement. En revanche, le fait d'insérer notre programme dans /var limite sa taille fortement (en général, entre 50 et 150 ko sont disponibles dans /var), alors que la ROM de la club internet box peut contenir jusqu'à 4,2Mo de données. Mais surtout /var n'est pas l'endroit adequat pour l'exécution des programmes sous linux.

Voilà, j'espère que ce petit tutorial aura pu vous aider...

Permanent link
linux, internet, embedded systems, development, français

Comments

Ecouter de la musique celtique gratuitement

2009-03-31 22:02:05
Date originale : 10 décembre 2007

Etant apprenti sonneur (joueur de cornemuse), je suis amateur de musique celtique. Or celle-ci se fait plutôt rare sur le web... légalement tout du moins.

En effet, en parcourant le site allcelticmusic.com, je me suis rendu compte que ce n'était peut-être pas si difficile que ça d'entendre ses artistes préférés... En parcourant le site je me suis rendu compte qu'il était possible d'écouter en entier les chansons de certains albums. Si un lecteur flash peut lire cette musique, alors il doit être possible de la lire autrement ! Mon premier réflexe a été de faire une capture de ce qui circulait sur le réseau avec wireshark. Mais rien de très inspirant à priori... un player flash est retourné dans une page s'appelant player.html...

J'ai donc téléchargé à la main l'applet flash permettant d'écouter la musique. L'utilitaire file de linux m'a appris que ce fichier correspondait à :

Macromedia Flash compressed data, version 7.
Rien de surprenant, donc. Cependant, il est rare qu'une donnée compressée soit absoluement impossible à décompresser... Une recherche sur google m'a donc emmené vers un exécutable windows en version d'évaluation permettant de décompresser les fichiers .swf compressés. Le nom de cet exécutable est asvdemo, contenu dans une archive : asvdemo.zip.

Pour lancer cet exécutable windows sous linux, il suffit donc simplement de "l'enrouler" avec wine :

wine avsdemo.exe
Cet utilitaire une fois lancé, permet d'explorer le contenu du fichier .swf, c'est-à-dire de l'Action Script, intéressant. Il est également possible d'exporter le contenu de ce qui a pu être décompressé vers un simple fichier texte, c'est donc ce que j'ai fait, l'environement fourni par wine n'étant pas ce qu'il y a de plus ergonomique...

Un petit coup d'oeil sur ce fichier, et là ô miracle, une variable s'appelle fileUrl :

var fileUrl = "w47bc/";
Dans le fichier player.html retourné précédemment, il y avait tout de même une variable nommée file=297.mp3 dans une url ou dans les paramètres passés à l"objet flash"

C'est ce qui m'a mis sur la voie d'un wget bien inspiré :

wget http://www.allcelticmusic.com/w47bc/297.mp3
Le fichier téléchargé, je pouvais écouter à ma guise l'air que je cherchais de Robert Mathieson, un grand soliste de cornemuse écossaise ; ce sans lecteur flash et sans perte de qualité (un simple enregistrement du mixeur de mon système d'exploitation aurait permis l'enregistrement, mais avec une conversion numérique => analogique supplémentaire).

Malheureusement, dès aujourd'hui (manipulation réalisée hier, le 9 décembre 2007), le site a changé de présentation et le player flash n'est plus accessible, il n'est de plus plus possible d'écouter des titres en ligne... La supercherie aurait-elle été démasquée ? Aucune idée, cependant on ne pourra pas m'accuser de piratage, vu que cette astuce ne fonctionne plus désormais.

Cela dit, le principe de "décrypter" du flash pour retrouver des urls vers des fichiers multimédia reste valable et probablement applicable à d'autres sites. Il suffit de les chercher...

Permanent link
protocol, multimedia, internet, français

Comments

Ecouter des extraits sur le site de la FNAC sous debian

2009-03-31 22:01:34
Date originale : 10 décembre 2007

Comme le titre de cet article le laisse supposer, ce n'est pas immédiat sous debian de lire des extraits musicaux d'albums sur le site de la fnac. Cela dit, à coeur vaillant rien d'impossible, il est donc possible de lire ces flux mutlimedia d'une façon (un peu) détournée.

Prenons un exemple, je vais sur l'album de Peter Cincotti : East of Angel Town. Je clique sur Goodbye Philadelphia, et je choisis ouvrir, avec un éditeur de texte, gedit fera très bien l'affaire. Là, je vois que ce fichier contient simplement une URI :

pnm://multimedia.fnac.com/audio/3/9/7/0093624991793A02.ra
Première observation, je ne connais pas le préfixe de cette URI, en revanche l'extension du fichier ne semble pas totalement inconnue : .ra extension des fichiers Real Player. Après une petite recherche sur google, j'apprends que ce protocole est le nouveau nom du protocole PNA, dont j'ignore la signification. En investigant légèrement plus je découvre que ce protocole est assez proche du RTSP, intéressant... Autre point intéressant à noter, le port part défaut de ce protocole est le port 7070.

Je décide donc de tenter ma chance avec mplayer, car bien que mplayer ne supporte ce procole PNM, il supporte le procole RTSP. Je lance donc la commande suivante dans mon terminal préféré :

mplayer rtsp://multimedia.fnac.com:7070/audio/3/9/7/0093624991793A02.ra
et là, ô surprise, après un léger temps de mise en mémoire tampon, la lecture du début de la chanson commence !

Le "hasard" faisant plutôt bien les choses, si vous voulez écouter plusieurs chansons, elles sont dans l'ordre, la prochaine chanson, Be Careful, peut s'écouter avec l'URI suivante :

rtsp://multimedia.fnac.com:7070/audio/3/9/7/0093624991793A03.ra

Permanent link
protocol, multimedia, linux, internet, debian, français

Comments

Peers : nouveau softphone SIP

2009-03-31 22:00:52
Date originale : 2 décembre 2007

Bonjour,

Après plusieurs mois de développement, la première version de Peers est sortie ! Peers est un softphone SIP minimaliste écrit en java. Peers est donc un logiciel permettant de téléphoner d'un ordinateur à un autre sur un réseau local. Pour appeler une personne, il suffit de taper : sip:192.168.0.1 avec la bonne adresse. L'ordinateur appelé décroche automatiquement et l'appel est établi. Ensuite, l'appelé ou l'appelant peuvent raccrocher avec le bouton "hang up".

Pourquoi ?

En effet, il existe déjà d'autres piles SIP écrites en java, alors pourquoi se lancer dans cette implémentation ? Pour deux raisons. Premièrement, il n'existe à ma connaissance pas plus de deux implémentations open source en java d'une pile SIP :

  • Jain-sip, implémentée par NIST, un institut de recherche américain,
  • MjSip, implémentée par l'université de Parme.
Dans les deux cas, ces implémentations sont des implémentations complètes de la spécification de SIP : la RFC 3261, c'est-à-dire qu'il est possible de créér tous les éléments d'un réseau SIP grâce à ces implémentations : User-Agent, Proxy, Registrar, etc. Or, réaliser l'abstraction entre ces différents rôles ajoute une complexité importante aux implémentations. De plus, les ressources nécessaires dans la vie de tous les jours pour implémenter ces rôles sont très différentes. Je m'explique, un User-Agent est un softphone, c'est donc un logiciel qui va se lancer sur l'ordinateur d'un utilisateur. Cet utilisateur utilisera des fonctions éventuellement avancées au niveau media mais pas au niveau contrôle de session. SIP intervient au niveau du contrôle de sessions. Le User-Agent est en gros un logiciel client. Pour les autres rôles (Registrar, Proxy, ...) il s'agit d'implémenter des serveurs n'ayant aucune interface utilisateur et étant optimisés au maximum pour gérer un maximum de sessions en parallèle ou un maximum de messages, etc.

Pour en revenir aux autres implémentations, elles permettent donc de réaliser tous les éléments d'un réseau SIP, mais ce n'est pas le but de Peers. Le but de Peers est d'écrire un logiciel permettant le maximum d'interactions possibles avec les autres utilisateurs, et que ces fonctionnalités soient facilement évolutives. L'implémentation de Peers se veut simple. Malgré ses 10 000 lignes de code (environ), l'implémentation de peers se veut minimaliste et évolutive. C'est son évolutivité qui lui donne se volume. Le but de Peers n'est pas de devenir un serveur, mais bel et bien d'être lancé sur un poste utilisateur.

La deuxième raison est la possibilité d'apprendre par la pratique. Rien n'est plus formateur que de comparer son implémentation avec les plus réputées pour voir d'où viennent les problèmes, et ceci tout en lisant plusieurs fois les RFCs pour bien comprendre les concepts et ne pas tomber dans une implémentation uniquement empirique. SIP est pour moi un protocol nouveau, il y a un an, je ne connaissais rien à SIP.

Pour plus d'informations, vous pouvez me contacter par mail, voir ma page contact.

Permanent link
protocol, peers, multimedia, java, internet, development, français

Comments