Articles plagiés par lephpfacile [Résolu]
Article paru, non publié sur Planet Libre
problème avec virtualbox
Déménagement de mon blog
Problème VBox 32/64 bits
Google Wave c'est fini ...
®om
4LW
Admin-Linux
agatzebluz
Aldevar
Another Pinky Punky
AnTav
Antistress
Antoine Meme
Antoine Millet
Antonin Moulart
archi02
arNuméral
Artisan Numérique
Asher256
Aternatik
Aurélien Bompard
Bastnic
Benkemoun
Bilbo Planet
Billux
Biscotte
Blogmotion
bochecha
botchchikii
bouleetbil
Boutor
Breizh ardente
Cairo-Dock
Cameleon
Capof's Space
Captaine74
Carl Chenet
Cedynamix
champtoussel dominique
ChEza
Chicha
Chimrod
Christophe-Marie
Clapico
Corbier
Costalfy
Creasy
CSM 'illovae' Seldon
CyberSDF
dada
dahu_fou
Damien Cougar
Damocles
Daria
David Dup
David Larlet
Davromaniak
Ddmdllt
Des nouvelles de Wikilivres
Desidia
Devil505
Dhoko
DigitalSpirit
djibux
Dorian Dd
Duchatelet
Eddy33
Edouard
Effraie
eMerzh
Emilien Macchi
Emilpoe
Emmanuel Gontcho
Emmanuel Kasper
ephase
Equinoxefr
Eric
Exceed
FACIL
Feilong
fgallaire
Finss
florentg
floruby
Fonctionerd
Framablog
François
Franck Archange
Freeblog
Full Circle Magazine
Fuse
Génération Linux
G3L
Gaëtan Tenshu
Geek de France
Geekfault
Gilir
Grégory Gutierez
Gregory Colpart
Guillaume Kulakowski
Guiona
HacKurx
Hugo
Hugues
Hyla project
Il Palazzo-sama
inalgnu
Influence PC
Jérémy Verda
Jeff
jeremy2491
jeromeg
jesuislibre
JJL
Jonathan Ernst
Jonathan Le Lous
Jopa
Jp Fox
Juky
Julien
Julius
ka.da
Kagou
kamagatos
Kate
Kiddo
KissCoolMan
Labo-Linux
LeDucDuBleuet
Lemarinel
Liberez le tux
Libfy
Libre Astux
Linalis
Littlewing
Louis Roché
lowje
Luc
Macsim
Manu Absolacom
Marco
Marty
Matao
Mathieu Comandon
Maxime Carron
McKey
meepix
Michael Zwyssig
Michauko
Mickaël
Minimumserious
Monitoring-FR
Morot
Motarion
mozillaZine-fr
Mr.Yann
MrTom
Nÿco
Naparuba
Nicofo
Nicolargo
Nicosmos
Nicoz
NiKo
nizarus
Noplay
Olivier Faurax
Olivier Prieur
OLPC France
Omega
Oncle Tom
openSyd
opossum1er
Osku
OxyRadio
Pacodastre
Paquet Fedora du Jour
Pascal Chevrel
pc-kc
Peck
Pfff
Phil
Philippe Scoffoni
Pianopenguin
Pingax
PlayOnLinux
Ploum
Pokemon_JOJO
Poupoul2
PPmarcel
ProfNoel
Rémi Samier
Raphaël Hertzog
Ravomavain
Renaud Littolff
Renault
Respawner
Retouche Libre
Ricard
Robin Millette
RollsRox
Rydgel
Saïmon
Samuel Martin
Sauthier
SckyzO
Scurz
Shnoulle
Silvyn
Skhaen
Slobberbone
Splitsch
StandarT
StephZ
Sylvain
System Linux
Taltan
Tbellemb
Tchouvince
theClimber
TheGlu
TheLinuxFr
Thibaut
Thierry Andriamirado
Thom1
Thomas Bassetto
Tigrou Damien
TitaX
toitoinebzh
Toorop
TrouveTonGull.info
Tuxargon
Tuxicoman
U-Classroom
Ubuntu les jours
Uggy
Ulrich Diplodocus
Une goutte de blog
Uselink
Vanaryon
VELCS
Vetsel
Warren Dumortier
Wattazoum
Wavemaker
Webaaz
Weedfast
Yannig
yeKcim
Yellowiscool
Yoho
Yves Gesnel
Zanko
Zic
Zippy
ZitrouilleDe la ligne téléphonique d'une freebox (et sûrement des autres "box") à Skype en passant par les très nombreuses offres disponibles sur le Net, la VOIP (VOix Sur IP) est partout. Pris dans le contexte d'une architecture domestique ou d'entreprise, la VOIP est un nouveau faisceau de service, comme la messagerie, qu'il est possible d'intégrer à un degré professionnel grâce à un outil libre souvent considéré, à tord, comme complexe, Asterisk.

Asterisk est un projet qui démarré il y a plus de 10 ans (1999) par Mark Spencer. Son objectif était alors de fournir à Linux un commutateur téléphonique complet et totalement libre. Aujourd'hui Asterisk est un PABX (Private Automatic Branch eXchange) d'une rare puissance et souplesse, capable de gérer la téléphonie analogique, mais surtout, et c'est ce qui nous intéresse, la voix sur IP.
La VOIP sur Asterisk passe entre autre par la prise en charge d'un protocole standard, ouvert et très largement utilisé, le SIP (Session Initiation Protocol). SIP qui est un protocole très proche d'HTTP qui n'est pas limité à la seule voix mais qui prend aussi en charge la vidéo et la messagerie instantanée.
D'un point de vue fonctionnalité, Asterisk permet tout ce que l'on peut attendre d'un PABX moderne, et plus particulièrement dans notre contexte :
Asterisk est donc un beau joujou, très simple à mettre en œuvre, mais comme toute chose cela demande du temps. Il faut donc bien se poser l'intérêt de cette technologie dans votre configuration. Pour moi l'élément déterminant permettant de savoir si oui ou non vous devez vous lancer, que ce soit dans le cadre d'une architecture domestique ou professionnelle, tient au nombre de poste et d'utilisateurs. Je ne dis pas cela innocemment car bourrin que je suis, je me suis embarqué dans cette histoire sans suffisamment réfléchir à son utilité dans mon contexte. Et après quelques jours de recherche pour mettre tout ceci en place, je me suis finalement rendu compte, que j'étais le seul chez moi à l'utiliser. Ma douce et tendre préférant largement le bon vieux téléphone à fil connecté à notre Freebox. J'aurais eu plus vite fait de configurer tous mes comptes SIP sur un ekiga et sur mon terminal android, ce que j'ai d'ailleurs fini par faire.
En revanche, si vous avez désirez que votre ligne Freebox (ou autre fournisseur SIP) fasse sonner tous les téléphone sur IP (ce qui est impossible avec freephonie sans PBX), si vous désire irriguer en téléphonie une petite entreprise à moindre frais (les grosses préfèrerons sûrement passer par un prestataire plutôt que bricoler cela eux-même ;-), ou avez une familles plus nombreuse que la mienne, à oui, Asterisk est sans aucun doute une option à envisager sérieusement. Me concernant, cette aventure m'aura au moins permis de démystifier un monument qui m'a toujours fait un peu peur, et j'espère qu'il en sera de même pour vous.
Avant de partir dans l'installation de paquets, sachez qu'il existe de nombreuses distribution Asterisk toutes faites (allez sur la page wikipedia d'asterisk pour en savoir plus), ainsi que des configurateur sensé être user-friendly (par exemple freePBX). Mais si vous êtes ici, c'est que vous aimez savoir ce qui se passe, en direct. Nous allons donc voir comment monter tout cela à la mano, sur une debian de base.
La première chose à faire est évidement d'installer Asterisk. Cela se fait sans douleur sur la grande majorité des distribution modernes, par exemple debian :
aptitude install asterisk asterisk-config asterisk-prompt-fr-proformatiqueInstallation d'asterisk
Ici nous avons installé l'outil, sa configuration, ainsi que, en prévision de la suite, une séries de messages en français de haute qualité pour la boite vocale.
Ceci fait, Asterisk est prêt à être lancé avec sa configuration par défaut dans le dossier /etc/asterisk. Nous allons cependant nous en garder pour faire d'abord un peu de paramétrage.
Un softphone (ou téléphone SIP) est un terme générique désignant aussi bien une application SIP sur votre ordinateur (ex. ekiga) ou un terminal mobile (ex. android), qu'un téléphone physique sur IP ou encore un ATA (Analog Telephone Adapters) transformant un téléphone standard en téléphone sur IP. Pour ma part j'utilise des terminaux Android avec le logiciel libre CSIPSimple qui fonctionne très bien.
Notre configuration va consister paramétrer le SIP d'asterisk, à y déclarer deux téléphones et permettre de passer des appels internes de l'un à l'autre.
Pour commencer, nous allons créer la configuration de la partie SIP en écrasant /etc/asterisk/sip.conf avec la configuration suivante :
[general]
defaultexpirey=1800
dtmfmode=auto
qualify=yesconfiguration de base pour le SIP
Dans cette section [general] sont placés les paramétrages communs à tous les éléments connectés au moteur SIP d'asterisk.
A la suite de sections, nous allons en ajouter deux nouvelles, correspondant aux deux téléphones :
[phone1]
type=friend
username=phone1
qualify=no
secret=phone1_password
host=dynamic
context=maison
language=fr
[phone2]
type=friend
username=phone2
qualify=no
secret=phone2_password
host=dynamic
context=maison
language=frconfiguration du softphone
Bien évidement, vous pouvez remplacer phoneX par les noms de votre choix, de même pour phoneX_password. Ces identifiants et mots de passe seront à reporter, ainsi que l'adresse IP de la machine sur laquelle tourne asterisk, dans la configuration du softphone. Le host est dynamique car on ne connait pas à l'avance l'IP des téléphones. La variable language sera utilisé par la boîte vocale. Enfin notez le context maison commun aux deux téléphones qui vont nous permettre de programmer les extensions.
Les extensions d'Asterisk sont un peu le plan d'adressage des numéros composés en fonction du contexte. De manière grossière, il s'agit d'associer un motif de numéro de téléphone à une commande Asterisk. En réalité, il est possible d'aller très loin et de définir de véritables scripts (avec des fonctions, des goto, etc...).
Pour l'heure nous allons nous contenter de faire correspondre le numéro 11 à phone1 et 12 pour phone2. Cela se fait en écrasant le contenu de /etc/extensions.conf par les informations suivantes :
[maison]
exten => 11,1,Dial(SIP/phone1)
exten => 12,1,Dial(SIP/phone2)Paramétrage du mode talkie-walkie
Nous avons ici déclaré deux extensions dans le contexte maison (celui là même que nous avons défini pour nos téléphones). Chaque extension commence par une série de chiffre à composer sur l'un des cadrant pour déclencher l'extension. Le second paramètre est une priorité car une extension peut être un véritable script composé de plusieurs lignes. Enfin le dernier paramètre est une macro Asterisk, ici Dial, qui va composer le numéro SIP d'un des deux téléphones.
Nous pouvons maintenant faire nos premiers tests. Pour cela, nous allons arrêter Asterisk qui a surement été lancé automatiquement lors de l'installations (/etc/init.d/asterisk stop), puis le relancer à la main en mode "console debug" par la commande asterisk -cvvv.
Ceci fait, il ne nous reste plus qu'à paramétrer les deux softphones en créant un nouveau compte, puis en saisissant l'identifiant, le mot de passe et enfin l'adresse IP de la machine sur laquelle tourne Asterisk. Lorsque le compte est ajouté sur votre softphone, cela devrait provoquer du côté d'Asterisk un message du genre Peer 'phone1' is now Reachable. (117ms / 2000ms). Lorsque les deux téléphones sont actifs, vous pouvez vérifier leur rattachement à asterisk en tapant la commande sip show peers
#/etc/init.d/asterisk stopStopping Asterisk PBX: asterisk.#asterisk -cvvv....[Aug 17 13:39:32] NOTICE[13575]: chan_sip.c:18223 handle_response_peerpoke: Peer 'phone1' is now Reachable. (108ms / 2000ms[Aug 17 13:49:10] NOTICE[13575]: chan_sip.c:18223 handle_response_peerpoke: Peer 'phone2' is now Reachable. (108ms / 2000ms*CLI>#sip show peersName/username Host Dyn Nat ACL Port Statusphone1/phone1 192.168.154.11 D 5060 OK (48 ms)phone2/phone2 192.168.154.22 D 5060 OK (108 ms)2 sip peers [Monitored: 2 online, 0 offline Unmonitored: 0 online, 0 offline]*CLI>#</code>Lancement d'asterisk
Maintenant le test, aller dans l'application SIP du téléphone phone1 et taper le numéro 12, ce qui doit faire sonner le second téléphone et permettre une communication entre les deux appareils. Qui as dit qu'asterisk était compliqué ? Enfin si, c'est super compliqué, mais pour l'instant, il reste magnifiquement simple à mettre en œuvre.
L'ajout d'une boîte vocale n'est pas beaucoup plus compliqué que ce que nous venons de voir. Et lorsque je dis boîte vocale, j'entends le truc complet, avec accueil en français avec voix de qualité pro, interrogation à distance, etc.
Pour mettre cela en œuvre, prenons un exemple un peu idiot, à passer sur la messagerie vocale du propriétaire du second téléphone (phone2) s'il n'est pas joignable (soit il raccroche pendant la sonnerie, soit il ne répond pas, soit son softphone n'est pas connecté).
La première chose à faire est d'écraser un autre fichier de configuration, /etc/asterisk/voicemail.conf
[general]
format=wav49|gsm|wav
serveremail=phone1-voicemail@mon-domaine.com
attach=yes
maxsilence=10
silencethreshold=128
maxlogins=3
sendvoicemail=yes
emaildateformat=%A, %d %B %Y a %H:%M:%S
emailsubject=[ASTERIX] Nouveau message dans la boite ${VM_MAILBOX}
emailbody=Bonjour ${VM_NAME},\n\n\tLe numero ${VM_CALLERID} a tente de vous joindre sans succes le ${VM_DATE}.\nCette personne vous a laisse un message de ${VM_DUR} secondes. Vous pouvez le consulter en appelant votre boite vocale.\n\n\tBonne journee !\n\n\t\t\t\t--Asterix\n
pagerfromstring=[Asterix]
pagersubject=Nouveau message vocal
pagerbody=Nouveau message de ${VM_DUR} secondes dans la boite ${VM_MAILBOX} laisse le ${VM_DATE} par ${VM_CALLERID}.Configuration des boîtes vocales
Là aussi la configuration est assez lisible. Le format est celui des fichiers vocaux, la référence à l'adresse courriel sera utilisé par asterisk comme expéditeur des courriers vous indiquant qu'un nouveau message est arrivé (attach=yes permet, comme chez free, de recevoir le dit message attaché au courrier de notification). Ensuite vient un bloc permettant de personnaliser (ici franciser) les messages envoyés dans le courriel.
Continuons à modifier le fichier voicemail.conf pour créer notre boite vocale à proprement parler en ajoutant à la fin du fichier :
[default]
maison => 1234,Gaston,gaston@son-mail.comConfiguration des boîtes vocales
Ici nous définissons une boîte vocale appelé maison appartenant à gaston (le propriétaire de Phone2), ayant pour code d'accès 1234 et pour adresse de notification gaston@son-mail.com.
Pour ce qui est de la langue de la boîte vocale, nous avons déjà fait le travail de francisation. C'est en effet pour cela que nous avons installer le paquet asterisk-prompt-fr-proformatique (les voix en français), et mis dans la définition de chaque téléphone une variable language=fr. Ce dernier point implique que la langue est spécifique à chaque téléphone. Nous pouvons donc faire une messagerie vocale en chinois sur Phone1, et français sur Phone2. Très utile non ? ;-)
Nous alons maintenant ajouter quelques nouvelles extensions dans extensions.conf, à la suite de celles déjà saisies, dans la section maison :
[default]
exten => 11,1,Dial(SIP/phone1)
exten => 12,1,Dial(SIP/phone2, 10)
exten => 12,2,Voicemail(maison)
exten => 600,1,VoiceMailMain(maison)Configuration des boîtes vocales
La dernière extension permet d'accéder à la boîte vocale. Ainsi en tapant l'extension 600 sur un téléphone du groupe "maison", vous exécutez la commande VoiceMailMain(maison) qui est comprise par Asterisk comme "interrogation de la boîte vocale 'maison'". Vous pouvez, après avoir tapé le code que nous avons défini plus haut (1234), l'interroger, mais ou la configurer. Il s'agit exactement de la même que celle que vous avez coutume d'utiliser avec votre mobile.
L'autre extension que nous avons ajouté est plus intéressante. En réalité nous avons subrepticement modifié l'extension 12 de sorte à rajouter un paramètre 10 à la fonction Dial. 10 voulant dire 10 secondes, ce qui veut dire qu'Asterisk, lorsqu'un téléphone cherchera à composer le 12, fera sonner phone2 pendant 10 secondes maximum. Ensuite c'est l'extension juste en dessous qui prend la main. Comme vous le constatez, ces deux extensions sont les mêmes (le 12), mais diffère le second chiffre qui représente la priorité (ici 2). Du coup c'est cette seconde ligne d'extension qui prend la main lorsque le correspondant sur phone2 n'a pas décroché au bout de 10 secondes. Et l'action qui est induite est bien évidement un passage de mail à la boîte vocale "maison".
Pour tester, vous devez maintenant arrêter (Ctrl-C) puis relancer Asterisk et vérifier que vous pouvez bien atteindre le 600 de phone1 et phone2, puis si vous obtenez bien la boite vocale en laissant phone2 sonner plus de 1à secondes.
Pour l'instant nous avons surtout réussi à fabriquer deux talkie-walkie de luxe. Il est temps de connecter tout cela au vrai monde. Free, à travers son service Freephonie, propose la téléphone SIP en standard à tous ses abonnés. Il est donc possible de connecter ce service à notre PBX. De même vous avez sur internet de très nombreux fournisseurs SIP plus ou moins sympa ou compétitifs. Comme j'ai mon activité professionnelle dans mon garage, et que le numéro de notre freebox est dédiée depuis longtemps à notre famille, j'ai eu besoin d'un autre numéro pour mon boulot. Plutôt que de faire tirer une ligne, j'ai simplement créé un compte chez un fournisseur SIP et le tour était joué. Après pour le choix du fournisseur, c'est question de goût, mais pour l'instant je suis très content d'IPPI qui propose gratuitement un numéro local (en 01, 02, etc..) et permet de recharge par Paypal son compte pour les appels sortants.
Bref, quel que soit votre fournisseur SIP, vous allez pouvoir le connecter à votre PBX. Du coup vous allez pouvoir avoir notre propre boîte vocale (en prenant soin de déconnecter celle du fournisseur), faire sonner tous les téléphones lorsque l'on est appelé de l'extérieur, et aussi passer jusqu'à des appels simultanés (2 pour freephonie, 3 sur IPPI, variable d'un fournisseur à l'autre).
La première chose à faire est d'ajouter un nouveau partenaire de jeu à sip.conf comme pour le téléphone. Mais à la différence du téléphone, il faut en plus ajouter un enregistrement du fournisseur dans la section general pour prendre en charge les appels entrant. Cela nous donne pour freephonie :
[general]
...
register => 09XXXXXX:freephonie_password@freephonie.net
[freephonie]
type=peer
insecure=port,invite
host=freephonie.net
username=09XXXXXXXX
secret=freephonie_password
context=from-freephonie
language=frconfiguration de freephonie
Ici il vous faut remplacer 09XXXXXX et freephonie_password respectivement pas l'identifiant et le mot de passe freephonie. Dans la section [general], ajoutez la commande register permettant à Asterisk de s'enregistrer sur FreePhonie. Ensuite nous créeons une section [freephonie] pour déclarer le nouveau partenaire. Le paramètre insecure est spécifique à se service. Ce paramétrage est le même pour IPPI mais il faudra peut-être le modifier pour un autre fournisseur. Enfin, point important, on définit un contexte from-freephonie qui nous servira pour de nouvelles extension spécifiques aux appels entrant de ce partenaire SIP.
Nous allons maintenant rajouter deux nouvelles extensions.
[default]
exten => 11,1,Dial(SIP/phone1)
exten => 12,1,Dial(SIP/phone2, 10)
exten => 12,2,Voicemail(maison)
exten => 600,1,VoiceMailMain(maison)
exten => _0.,1,Dial(SIP/freephonie/${EXTEN})
[from-freephonie]
exten => s,1,Dial(SIP/phone1&SIP/phone2,10)
exten => s,2,Voicemail(maison)Configuration des boîtes vocales
La première commune à tous les téléphones du groupe maison, va nous permettre de passer des appels en utilisant les tarifs de free. Comme vous le voyez, il s'agit d'une expression régulière indiquant "tous les numéros commençant par un 0". La variable ${EXTEN} permet de composer ce numéro en passant par le partenaire freephonie (défini dans sip.conf).
Deuxième extension, cette fois spécifique au contexte from-freephonie nous permet de gérer les appels entrant. Ici nous indiquons à Asterisk de faire sonner nos deux téléphones simultanément pendant 10 secondes. L'appel sera transféré au premier qui décrochera. Dans le cas contraire (priorité 2 sur la même extension), nous basculons sur la boite vocale.
Certains se demande pourquoi je me casse la nénette avec Skype, un protocole propriétaire qui pour la téléphonie n'apporte pas grand chose (surtout pour le client GNU/Linux) par rapport à SIP. La raison est assez simple, tout le monde, et donc mes clients aussi, l'utilise. On peut se battre comme on veut, c'est comme essayer de leur venter les mérites de GNU/Linux, ça passe le temps mais le taux d'échec est élevé. Bref, Skype est ce qu'il est et il est là. La question est donc de voir comment l'intégrer à notre ensemble SIP.
Cette intégration à Asterisk est possible de trois manière. La première est de passer par le service Skype Connect, 4€95/mois pour un canal et un nuts... le prix du monopole des esprits j'imagine, sans moi, merci bien...
Autre possibilité, acheter une licence pour un module Skype qui s'intègre à Asterisk pour 66$ édité par la société Adium dont le fondateur n'est autre que l'auteur du projet Asterisk. Solution intéressante pour les entreprises, moins pour le particulier.
Et enfin, siptosis, une passerelle Skype vers SIP sous licence libre (GPL v3), SipToSis, multi-plateformes (java), pouvant être utilisée seule, ou intégrée à Asterisk.
Vous l'aurez compris, nous allons opter pour la troisième solution.
Tout commence par le téléchargement de l'archive au format zip que vous décompresserez dans un dossier siptosis où bon vous semble, suivi de l'installation d'un jre java. Ensuite arrive un petit peu de paramétrage pour faire causer cette passerelle avec Asterisk. Cela commence par la modification du fichier siptosis.cfg qu'il faut commencer par recopier du dossier samples vers la racine de l'application. Allez d'abord en ligne 270, et commentez tout le bloc "Sample AUTO Config with NO registration".
Ensuite descendez en ligne 329 pour trouver le bloc "Sample Asterisk registration example", décommentez et modifiez comme ceci :
host_port=5070
contact_url=sip:votre_identifiant_skype@127.0.0.1:5070
from_url="votre_identifiant_skype" <sip:siptosis@127.0.0.1:5060>
username=siptosis
passwd=un_mot_de_passe_pour_siptosis
realm=asterisk
expires=3600
do_register=yes
minregrenewtime=120
regfailretrytime=15Modification de siptosis.cfg pour Asterisk
Rien d'étonnant dans cette configuration, nous y définissons juste les deux URL de la passerelle ainsi qu'un identifiant et mot de passe qui sera utilisé par Asterisk pour s'y enregistrer (que vous devez évidement modifier pour votre installation).
Ensuite, créez à la racine un fichier SkypeToSipAuth.props (attention à la case) et collez-y les informations suivantes :
*,sip:1234@127.0.0.1:5060SkypeToSipAuth.props
Alors ceci va permettre à la passerelle de contacter Asterisk pour les appels venant de Skype. Le principe est que tout appel entrant est redirigé sur l'extension (à définir) 1234 d'asterisk (vous pouvez mettre ici ce qui vous chante).
Étape suivante, une fois de plus modifier sip.conf pour ajouter notre nouveau partenaire.
[siptosis]
type=friend
username=siptosis
secret=un_mot_de_passe_pour_siptosis
context=from-skype
host=dynamic
dtmfmode=auto
canreinvite=no
qualify=yes
incominglimit=1
outgoinglimit=1
call-limit=1
busylevel=1
insecure=invite,port
language=frAjout du partenaire SipToSis au SIP d'asterisk
Vous retrouvez ici peu ou prou la même chose que pour un partenaire SIP classique. Passons donc aux extensions
[default]
exten => 11,1,Dial(SIP/phone1)
exten => 12,1,Dial(SIP/phone2, 10)
exten => 12,2,Voicemail(maison)
exten => 600,1,VoiceMailMain(maison)
exten => _0.,1,Dial(SIP/freephonie/${EXTEN})
exten => _*.,1,Dial(SIP/siptosis/${EXTEN:1})
[from-freephonie]
exten => s,1,Dial(SIP/phone1&SIP/phone2,10)
exten => s,2,Voicemail(maison)
[from-skype]
exten => 1234,1,Dial(SIP/phone1&SIP/phone2,10)
exten => 1234,2,Voicemail(maison)Configuration des boîtes vocales
Pour le block from-skype, on commence à connaître. La seule astuce est ici l'utilisation de l'extension 1234 que l'on a programmé dans SkypeToSipAuth.props. Ceci nous permet donc de router les appels entrants (appels d'autres utilisateurs Skype, ou de lignes téléphone standard si vous avec un numéro SkypeIn) vers l'ensemble des softphones. La ligne suivante est la cerise sur le gâteau, à savoir une messagerie vocale Skype pour pas un rond :-) Car oui, Skype facture tout, la boite vocale, le numéro entrant, la passerelle SIP, et bien sur les appels sortant. Lorsque l'on voit ce que coute un opérateur SIP standard, j'ai du mal à comprendre que certaines sociétés soient passées au "tout skype", peut-être des prix, ou des SkypeNuts...
La dernière extension du block default est quant à elle un peu plus étrange. Il ne faut juste pas imaginer que le caractère * est autre chose que ce qu'il est, à savoir l'étoile du clavier téléphonie. En fait, le principe adopté par cette extension est que tous les "numéros" commençant par * sont automatiquement routé sur Skype. Notez la présence du :1 à la fin de la variable EXTENT, qui demande à Asterisk de supprimer 1 caractère avant de passer le numéro au partenaire SIP.
Ainsi, si vous tapez *echo123 sur l'un des téléphones, vous accéderez au service test de Skype. En tapant *identifiant_skype vous entrez en communication avec un utilisateur Skype. Et si vous avec de crédits SkypeOut, *numéro de téléphone permet d'aller sur le monde extérieur.
Maintenant que tout est en place, il ne reste plus qu'à redémarrer Astesisk pour que toutes nos modifications soient prises en compte, puis lancer SipToSis. A ce stade il y a plusieurs possibilités.
Maintenant il ne reste plus qu'à tester, d'abord en composant *echo123 sur votre softphone. Si tout se passe bien (écoute, enregistrement, etc.) vous pouvez ouvrir une conversation avec echo123 en utilisant le client Skype et taper callme. Quelques secondes plus tard votre softphone devrait sonner pour vous permettre de prendre la communication.
Oui je sais, il manque une fonctionnalité dans notre histoire, la mise en attente et le transfert d'appel. Malheureusement pour le tutoriel, j'ai arrêté mon expérience Asterisk avant d'avoir acquis cette compétence là. Donc si quelqu'un a la méthode, je l'ajouterais avec plaisir :-).
En tout état de chose, j'espère avoir au moins démontré qu'Asterisk est un monstre gentil dont il ne faut vraiment pas avoir peur. Personnellement la simplicité de mis en œuvre et la qualité du résultat obtenu m'a bluffé au regard de tout ce que cet outil sait faire. Chapeau bas donc pour ce très beau soft et bonne téléphonie à vous.
La structure d'un noeud multimédia dépend énormément de l'usage que l'on en fait. Certain possèdent une télévision et apprécient du coup les media center raffinés à la xbmc avec un htpc dédié, d'autre jouent au légo avec des briques uPNP et adorent acheter ou installer renderer, servers et autres controlers. Le cas de notre foyer est un peu différent. Déjà nous n'avons pas de télévision, ni même de possibilité de recevoir des programmes télévisés (Point d'antenne sur notre toit et une FreeBox HD prenant la poussière au grenier). A la place, un grand mur blanc, un vidéo projecteur, des smartphones (deux androids et un iphone, pas de jaloux), et du vieux matos qui ne demandait qu'à reprendre du service. Le principe c'est donc rapidement imposé de pouvoir lire audio et vidéos à travers le LAN en passant par un vieux portable contrôlé par nos téléphones en WIFI.
Notre vidéo-projecteur n'étant pas de première jeunesse (résolution max 1024x768), la puissance de la machine chargée de décodage vidéo importait assez peu. Ce fût donc un vieux Packard Bell avec lecteur DVD intégré qui s'y colla. Pour le contrôle (navigation, lancement de la lecture, réglage du volume, etc.) n'importe quel machine sur le réseau peut être utilisé mais la cible reste nos téléphones, et plus particulièrement le mien sous Android.
Coté logiciel cela commence évidement par une distribution GNU/Linux qui sera la plus allégée possible pour démarrer le plus vite possible. Juste au dessus se trouvera un service X11 dépouillé de tout gestionnaire de login, de fenêtre, ou de bureau. Pour le décodage des vidéos, mon choix c'est porté sur VLC qui avec son interface HTTP rend possible le contrôle à distance par un simple navigateur, ou mieux, par un client dédié. Enfin, ce nœud média étant connecté à la chaîne HIFI du salon, je rajoute un inévitable service MPD chargé de la musique d'ambiance de la pièce. Côté serveur de fichier, un simple montage CIFS sur le NAS familiale, comme pour toutes les machines du réseau.
J'aurais pu choisir une distribution plus légère pour cet usage, mais ma règle est "un OS pour tous et moins de maux de crâne pour moi". Ainsi Papy Packard Bell s'est vu reformatté et mis à jour avec une Ubuntu Lucid qui ne cesse de me fasciner par sa capacité à détecter le matos. Bien évidement la distrib a été très fortement écrémée en virant moultes services et paquets inutiles (mono, gnome, pulseaudio, etc). Une fois le ménage terminé, nous pouvons conclure par l'installation de mpd, vlc et smbfs (pour le partage CIFS). Je ne reviendrais pas sur le paramétrage de MPD et CIFS, respectivement détaillé ici et là.
Ceci fait, nous allons devoir modifier le processus classique de connexion à un GNU/Linux de sorte à tracer à chemin direct et sans intervention entre l'allumage de la machine et l'atterrissage de VLC. La première étape consiste à monter le partage CIFS automatiquement, ce qui se fait très simplement en modifiant /etc/fstab comme ceci :
//nas/partage /partages cifs user,auto,rw,username=box,password=mdp_box,iocharset=utf8 0 0Ajout d'un partage CIFS à fstab
Cette ligne permettra le montage automatique du partage nommé "partage" sur la machine "nas" vers le point "partages". Le paramètre iocharset=utf8 permet un conversion sans problèmes des accents. Enfin les options user et password sont, vous l'aurez compris, le login et le mot de passe à utiliser pour s'authentifier sur le partage. D'un point de vue sécurité, il sera sage de créer un compte spécifique à la boîte avec des droits limités aux seuls chemins qui l'intéresse (vidéos et musiques).
Étape suivante, l'auto-login. En effet, pour que la machine démarre toute seule, sans l'aide d'un gestionnaire de login comme GDM, il va nous falloir bidouiller un peu. Cela commence par la création d'un compte non-privilégié (ex. box) par la commande useradd box et l'affectation d'un mot de passe (commande passwd box). Ceci fait nous allons configurer l'une des consoles (celles accessibles par CTRL-ALT-F1 à F6) de sorte à automatiquement connecter notre utilisateur box.
Les consoles F1-F6 ne sortent pas de nul part. Elles sont gérées par autant de processus mingetty. Cet outil est un terminal minimaliste pour console teletype (tty). Le lancement de ces processus est contrôlé par le fichier /etc/inittab pour les UNIX SysV. Vous y trouverez une série de commande /sbin/mingetty associés à un numéro de console. Sur Ubuntu les choses changent un peu avec le remplacement du vieux système d'initialisation par UpStart. Dans ce dernier cas, le lancement de mingetty est contrôlé par le fichier /etc/init/ttyX.conf (X étant le numéro de la console).
Dans un cas comme dans l'autre, la connexion automatique de notre utilisateur box passe par l'ajout à l'un des terminaux, de l'option --autologin=box, ce qui nous donne sur ubuntu pour une auto-connexion de l'utilisateur box sur le terminal 6:
# tty6 - getty
#
# This service maintains a getty on tty6 from the point the system is
# started until it is shut down again.
start on runlevel [23]
stop on runlevel [!23]
respawn
exec /sbin/mingetty --autologin=box tty6modification de /etc/init/tty6
Ceci fait, un petit redémarrage de la machine permet de voir que sur la console 6, l'utilisateur box est bien connecté et que le partage CIFS est correctement monté.
Maintenant que nous sommes connecté, il nous faut lancer automatiquement le service X11. Cela se fait sans grand problème en créant un script de démarrage (.bash_profile) pour bash à la racine du dossier de l'utilisateur box.
#! /bin/sh
if [ $(tty) == /dev/tty6 ]; then
while [ 1 == 1 ]; do
startx
sleep 5
done
fi~/.bash_profile - Script de démarrage de X11
Le script en lui-même est assez simple. Il s'agit tout d'abord de vérifier que l'on est bien sur la console tty6 ce qui permet de se connecter par les autres consoles, ou par SSH sur le nœud média, sans pour autant lancer X11. La boucle infinie qui encapsule le lancement du service permet, lorsqu'il tombe ou s'arrête, de le relancer automatiquement.
Avant de tester, nous allons ajouter la dernière touche en paramétrant X11 de sorte à lancer automatiquement VLC. Il va pour cela falloir créer un script de démarrage à la racine du dossier utilisateur de box, mais cette fois pour xorg : .xinitrc. Techniquement le fichier .xinitrc est un script lancé par Xorg une fois que tous ses composants matériels et logiciels sont initialisés. C'est une version globale au système de ce script qui permet le lancement de GDM. Dans notre cas, nous allons simplement lancer VNC :
#! /bin/sh
xsetroot -solid black
cvlc~/.xinitrc - Script de dématrrage pour Xorg
Alors un peu d'explications. Tout d'abord le xsetroot permet simplement de coller un fond d'écran noir. Si vous désirez remplacer cela par une belle image, regardez les options de cette commande, elle est aussi faite pour cela.
Ensuite nous lançons non pas vlc, mais cvlc. En réalité il n'y a pas grande différences entre les deux si ce n'est que le second ne se sent pas obligé d'ajouter une interface visuelle. Notez enfin que le script .xinitrc garde le service x11 en vie. En d'autres termes, c'est vlc qui, tant qu'il existe, maintient le service X11 allumé. Si VLC est arrêté, tué ou s'il plante, le service X11 s'arrête et redémarre 5 secondes plus tard grâce au script .bash_profile que nous avons décrit plus haut.
Dernière étape avant les pop-corns, paramétrer VLC. En réalité il n'y a pas grand chose à faire, nous devons simplement nous assurer que VLC fonctionne avec une interface HTTP. Dans une première approche, cette interface est un mini serveur web intégré à VLC permettant, à l'aide d'un navigateur, de commander le lecteur. De manière plus intéressante, cette interface est aussi un moyen simple pour une application dédiée de commander VLC à distance en passant par un réseau IP, sur un protocole HTTP.
Pour paramétrer vlc, le plus simple à mon sens est de se fabriquer un fichier de configuration par défaut en lançant vlc sur une machine, en le fermant, en récupérant le fichier ~/.config/vlc/vlc.rc puis en le plaçant dans le dossier .config/vlc sur le nœud media, dans le compte de l'utilisateur box. Ensuite il ne reste plus qu'à éditer ce fichier pour changer les options qui nous intéressent. Dans notre cas cela consiste essentiellement à modifier la variable extraintf (extra interfaces) comme ceci :
extraintf=httpModification de la configuration de VLC
Voilà, la machine est prête, il ne reste plus qu'à éteindre, puis allumer. Dans le cas de mon vieux portable 20 secondes suffisent à obtenir l'écran noir et VLC prêt à l'emploi. Il ne reste alors plus qu'à se connecter sur le port 8080 de la machine pour découvrir l'interface WEB et lancer la lecture d'une vidéo.


Voilà, notre noeud multimédia est maintenant prêt et il ne nous reste plus qu'à déguster un bon film. Ceci étant dit, cette solution est plus riche qu'un simple lecteur de vidéos. En effet, il est possible de se connecter en cours de film sur une caméra IP et vérifier que le petit dernier dort bien, se connecter en SSH sur la machine et lancer un diaporama sur le service X11 (voir ici pour savoir comment faire), etc. Les possibilités ne sont limitées que par votre imagination et c'est tout l'avantage d'une solution basée sur une installation standard.
Dans la majorité des cas, les fabricants nous livrent des terminaux mobiles aux droits restreints. C'est une peu comme si, sur votre ordinateur personnel, il vous était interdit de disposer du rôle administrateur. Cela peut se comprendre pour du matériel qui nous est prêté (une freebox, un compteur EDF), mais c'est proprement inacceptable lorsque l'on paye son terminal une petite fortune. Et c'est tout aussi inacceptable pour ses offre miraculeuses avec obligation d'abonnement car si vous faites le calcul, vous vous rendre vite compte que les opérateurs ne font pas de cadeaux et que vous payez souvent le prix fort, mais étalé sur la durée de votre engagement.
Mais au delà de l'aspect étique, cet état de fait est bloquant dans pas mal de situation, interdisant un usage légitime du terminal comme par exemple y installer un serveur FTP ou VNC, faire du partage de connexion 3G, installer une nouvelle ROM, etc...
Tous les terminaux android disposent d'un mode spécial appelé Recovery qui peut être vu comme une sorte de mode "sans échec" permettant de réinitialiser l'appareil en cas de pépin avec le système principal. Ce mode recovery est activable machine éteinte, lors du rallumage, par une combinaison de touche spécifique à chaque appareil. Pour un HTC hero, il suffit de maintenir pressée la touche "home" à l'allumage. Pour un HTC Desire, c'est un peu plus indirect, en maintenant pressé la touche "volume bas" et en sélectionnant recovery dans les options proposées.
Lorsque l'androphone démarrage en mode recovery, il boot sur une partition spéciale appelée elle aussi recovery. Cette partition contient une version minimal de GNU/Linux. Le principe de l'appropriation est donc de remplacer le système d'exploitation contenu dans cette partition, par une version proposant beaucoup plus d'options :
Il existe plusieurs recovery de remplacement, les plus célèbres étant Amon-RA et ClockworkMod, qui proposent peu ou prou les mêmes fonctionnalités. Une fois cette recovery installée, vous avez deux possibilités. Soit vous installez une application appelée "SuperUser" qui permet, un peu comme un sudo, d'accéder aux droits root à la demande. Soit d'installez une nouvelle ROM qui dans la majorité des cas intègre, entre autres choses, cet utilitaire. Dans un cas comme dans l'autre l'appropriation est totale et vous pouvez faire ce que bon vous semble de votre machine.
La manière la plus simple de s'approprier son terminal est de vérifier si par chance il est pris en charge par un utilitaire magique, dénommé génériquement "One Click Root". Ces outils sont en réalité des scripts plus ou moins évolués qui vont se charger, pour un appareil donné, de réaliser pour vous toutes les opérations évoquées plus haut (flashage de la recovery, installation du sudo, etc.). De tels outils existent pour pas mal de téléphone comme le
Ces outils, pour flasher la partition recovery, reposent sur une faille qu'ils exploitent pour outrepasser les limitation imposées par le constructeur. En d'autres termes, il ne faut pas se leurrer, on est très exactement dans le même cas que les iPhones et leur Jailbreaks.
Concernant l'HTC Desire (qui vient remplacer mon Hero dont le digitalizer et le port USB est parti en sucette..), c'est l'équipe

Une fois que l'outil a terminé son travail, vous avez une nouvelle recovery (mouture
La méthode FlashRec n'exploite à ma connaissance pas de faille, et ne passera donc que sur des androphones peu protégés comme l'HTC Hero. Flashrec est une application libre tout ce qu'il y a de plus standard qui permet de sauvegarder et de restaurer la partition recovery, et donc de la replacer par une version plus souple que celle d'origine. Téléchargez la version 20090815 (qui est la seul qui fonctionne chez moi) sur votre machine de bureau. La seconde chose qui va nous falloir est une image de remplacement pour la partition "recovery". Vous pouvez utiliser pour l'HTC Hero l'excellente Amon-RA.
Maintenant nous avons tout ce qu'il nous faut. Pour ne prendre que le minimum de risque, nous allons placer tout cela sur la carte SD du Hero, en prenant soin de la formater préalablement. Si vous avez des choses dessus, recopiez-les en local en faisant glisser la barre de notification du téléphone, puis Connectez avec un câble USB et enfin Monter. La carte devrait apparaître sous Nautilus pour vous permettre la sauvegarde. Ensuite renouveler l'opération en choisissant cette fois Éteindre le périphérique de stockage, puis Éteindre.
Vos données étant maintenant au chaud, vous pouvez formater le disque en exécutant la séquence suivante : boutons home puis menu, paramètres, Carte SD et mémoire, Désactiver la carte SD, puis Formater la carte SD.
Vous pouvez maintenant éteindre le stockage USB. Ensuite, pour lancer l'installation de FlashRec, il va nous falloir un gestionnaire de fichier. Vous en trouverez un gratuit qui s'appelle Linda sur le Market. Une fois l'application installée, lancez là et allez dans le dossier sdcard, vous y retrouverez les deux fichiers. Sélectionnez FlashRec et utilisez l'installateur d'application.
Une fois FlashRec installé, retournez sur la home, affichez la liste des applications disponibles et sélectionnez Recovery Flasher. L'interface est très simple : une zone de saisie et deux boutons. Souvenez vous seulement d'une chose, en aucun cas il ne faut cliquer sur Flash Cyanogen Recovery 1.4.
Prudence étant mère de sûreté, avant tout chose, nous allons créer une copie de sauvegarde de la partition recovery. Pour cela cliquez sur le bouton Backup Recovery Image. Après un moment, vous devez obtenir à la racine de la carte SD, un fichier recovery-backup.img de 5242880 octets. Remontez le disque SD pour vérifier cela et sauvegardez ce fichier sur votre disque local. Ceci fait, éteignez à nouveau le stockage USB.
Retournez sur FlashRec, le bouton que nous avons précédemment utilisé doit maintenant proposer l'opération inverse : Restore Backup Recovery Image. C'est cette option que nous utiliserons si nous avons envie de remettre le téléphone dans son état standard. Pour l'heure nous allons passer au flashage de la nouvelle image en utilisant la zone de saisie et en tapant /sdcard/cm-hero-recovery.img. Attention à la prédiction du clavier qui peut vous rajouter des accents, ce qui se traduirait par le texte Invalid Recovery Image dans le premier bouton. Si vous avez correctement tapé, vous devez avoir dans ce bouton le texte Flash Custom Recovery Image. Si c'est le cas, cliquez dessus. Après un court moment l'image est flashée et il ne nous reste plus qu'à découvrir le fameux mode Recovery.
Pour cela, nous devons éteindre complètement le téléphone en appuyant longuement sur le bouton Décrocher jusqu'à ce qu'un menu apparaisse. Nous sélectionnons alors Éteindre, puis OK. Un fois l'appareil hors-fonction, pour passer en mode recovery, vous devez appuyer sur la touche Home, la maintenir pressée et appuyant sur la touche Décrocher. Maintenez les deux touches pressées ensemble jusqu'à ce que le téléphone vibre et affiche le logo Hero. Vous pouvez alors relâcher et attendre quelques instants. Apparaît alors le menu de notre nouveau mode recovery.
Comme nous le disons plus haut, le mode recovery active par défaut le mode de debuggage de l'USB, nous pouvons donc lancer une commande ./adb shell pour ouvrir un terminal qui disposera des droits root. L'étape suivante va donc être d'installer dans la ROM existante, le poeudo-sudo pour parachever notre rootage.
L'outil que nous allons utiliser s'appelle SuperUser. Son principe est de n'autoriser l'accès root à une application que si vous validez cet accès à l'écran. Une sorte d'Allow-Deny à la Windows Vista. Nous allons donc commencer par télécharger cet outil ici et le décompresser. A l'intérieur se trouve une application android Superuser.apk qui va communiquer avec un utilitaire bas niveau su.
Pour installer nos deux fichiers, nous allons devoir monter la partition system. Cette partition, comme son nom l'indique, contient toutes les applications (system/app), les commandes (system/su), le paramétrage (system/etc), etc. Par défaut, en mode Recovery, cette partition n'est évidement pas montée. Elle correspond au périphérique /dev/block/mtdblock3 qui utilise le système de fichier yaffs2. Pour la monter nous exécutons donc la commande suivante :
gaston$adb shell mount /dev/block/mtdblock4 /systemMontage de la partition system
Nous allons maintenant utiliser la commande adb pour envoyer nos deux fichiers sur le téléphone.
gaston$adb push su /system/bin/gaston$adb push Superuser.apk /system/app/Utilisation d'adb pour pousser les fichiers sur le téléphone
La commande su appartenant à root, elle a besoin du sticky-bit pour permettre l'escalade de privilèges.
gaston$adb shell chmod 4755 /system/bin/suAjout du sticky-bit à su
Et voilà, c'est terminé, vous pouvez maintenant redémarrer votre téléphone
gaston$adb shell rebootRedémarrage du téléphone
Une fois la machine en route, vous pouvez relancer la commande adb pour ouvrir un shell sur le téléphone. Vous êtes alors toujours en utilisateur non-privilégie ($). Tapez la commande su et validez. Sur l'écran du téléphone devrait apparaître une demande de confirmation du passage à root. Cliquez sur le bouton Allow. Et zou, sur la console abd, vous êtes maintenant root (invite #).

Un autre usage bien utile est de permettre de faire une sauvegarde complète du terminal sur la carte SD. Pour cela repassez en mode Recovery, et sélectionnez l'option nandroid backup. Cet utilitaire va nous permettre de sauvegarder complètement notre téléphone et ainsi nous permettre de le restaurer à son état initial en utilisant l'option Restore Latest Backup.
Sélectionnez donc l'option nandroid backup avec le trackball, puis cliquez dessus (en pressant le trackball). Une confirmation vous est demandé en appuyant sur la touche home, après la sauvegarde commence et peut prendre un certain temps car il peut y avoir, selon ce que vous avez installé comme application, jusqu'à 512mo de données à transférer.
Une fois l'opération terminée, l'utilitaire vous renvoie au menu. Sélectionnez l'option Reboot system now pour relancer le téléphone. Lorsque le système c'est totalement initialisé, vous ne devez constater aucune différence avec ce que vous avez l'habitude d'utiliser. Remontez alors le stockage USB et recopiez le dossier nandroid en local pour disposer à l'abris d'une copie de votre système.
L'une des raisons nécessitant le rootage du terminal est l'utilisation d'application qui ne saurait vivre sans les droits root. A titre d'exemple, prenons l'excellent serveur VNC pour android disponible sur le market. Cette application utilisant un accès direct au données de l'écran (framebuffer) ne saurait fonctionner sans les droits root. Du coup, dés que vous la lancez, elle commence par faire appel à la commande SU impliquant une autorisation d'accès de votre part. Si sur le market vous cherchez les mots clefs "root only", vous verrez que de nombreuses applications sont dans ce cas (partage de connexion 3G, serveur FTP, gadget d'activation, sniffer de packet, etc, etc..).

Pour cela nous allons encore utiliser le mode recovery que nous avons installé, et qui est capable de deux choses non encore testées : remettre à zéro le téléphone (aka wipe, littéralement nettoyer), et "flasher" une nouvelle ROM présente sur la carte SD sous la forme d'une archive .zip.
Après, tout le jeu est de trouver la ROM qui vous convient. A titre d'exemple, pour HTC Hero,
Pour installer cette nouvelle ROM, rien de plus simple. Il suffit de la télécharger, de la recopier telle-quelle à la racine de la carte SD. Ensuite, vous n'avez plus qu'à redémarrer la machine en mode recovery.
Avant d'installer la nouvelle ROM, il est préférable de reinitialiser systématiquement la machine avec ses réglages usine (attention, vous perdrez toutes vos données, contacts, etc.). Avant d'aller plus loin, vérifiez donc que vous avez fait une sauvegarde complète de votre système (nandroid) et mieux, que vous avez sauvegardé vos données (sms, contacts, etc.) avec un outil comme titanium backup (qui d'ailleurs est intégré à la ROM modaco).
Lorsque vous êtes prêt, vous pouvez redémarrer sur la partition recovery et sélectionner l'option wipe data/factory reset.
Une fois la machine réinitialisée, sélectionnez apply any zip from sd. Là s'affiche la liste des archives .zip présentes à la racine de la carte. Sélectionnez la ModAco que vous venez de télécharger. Après confirmation (bouton home), l'opération commence et va prendre un certain temps. Une fois la copie des données terminée, vous pouvez redémarrer sélectionner dans le menu le redémarrage de l'appareil (reboot system now).
Après un temps de démarrage, vous devez arriver sur votre nouvelle ROM. Comme elle est visuellement identique à celle d'origine, il faut aller jeter un oeil aux applications pour s'en convaincre ;-).
Voilà, ceci marque la fin du petit tour de piste des étapes nécessaire à ce qu'un appareil que l'on paye 400€ minimum nous appartienne réellement. Il faut être honnête c'est on ne peu plus agaçant. Une autre option est de prendre un terminal plus respectueux de ses acquérreur comme le Geekphone One, mais faut-il encore que les spécifications techniques vous conviennent.
Android est fournit avec un kit de développement qui permet de faire beaucoup de chose qui n'ont rien à voir avec du développement. Il est grâce à ce kit possible d'ouvrir un shell sur le terminal mobile via USB, rediriger des ports (et ainsi utiliser la connexion 3G d'un téléphone sur un portable), faire des copies d'écran et même émuler différentes version d'Android sur un terminal virtuel, par exemple pour tester des applications.

Un OS pour terminaux mobiles sans terminaux mobile ne faisant pas gagner une telle guerre, Google a dés l'origine du projet réuni autours de lui un ensemble de partenaires (HTC, LG, Motorola, Samsung, Sony, etc.) sous la bannière de l'Open Handset Aliance. Pour l'heure Apple et son iPhone ne souffrent pas encore trop, mais le fait qu'Android ait passé ce mois-si la barre des 200000 activation par jour avec plus de 59 terminaux mobiles l'utilisation, risque à terme de compromettre très sérieusement l'hégémonie de Jobs. Situation relativement cocasse lorsque l'on sait qu'Eric Schmidt est toujours au board de la marque à la pomme...
Pour revenir à un peu plus de technique, Android est donc un OS, une interface (avec bureaux virtuels et widgets) et une série d'applications clef en main (gmail, gmap, etc.). Du point de vue développeur, Les applications pour Android utilisent un kit de développement basé Java. Plus exactement, Android embarque une machine virtuelle Java optimisée appelée Dalvik, le langage Java et un sous-ensemble de ses librairies. A ce titre, et contrairement à beaucoup de téléphones du marché, Android n'est pas nième une mouture de J2ME (Java Mobile Edition) mais une toute nouvelle plateforme Java, ce qui ne l'empêche cependant pas de pouvoir exécuter des applications J2ME sous réserve d'installer une JVM compatible (ex. JBed).
Donc ce qui nous intéresse avec ce système d'exploitation c'est que, contrairement à celui de l'iPhone, il est disponible sous licence Apache (version 2) et peut donc être considéré comme libre. A titre d'exemple, sur mon Hero, je tournait sur un Android 2.1 vanilla, totalement compilé par l'équipe
Le kit de développement pour Android ne sert pas qu'aux développeurs. Il permet de compiler soit même des applications Andoid (par exemple la dernière version du client Funambol), ou encore de bénéficier d'outils bien pratiques comme l'émulateur d'Android (une sorte de VirtualBox pour cette plate-forme), ddms qui permet de se connecter sur son téléphone pour en auditer le fonctionnement mais surtout de faire des copies d'écran, et enfin adb que nous allons étudier un peu plus loin.
L'installation du kit de développement s'est grandement simplifié depuis CupCake. Aujourd'hui un centre de contrôle unique permet de télécharger les différentes plateformes, les mises à jour, créer et lancer l'émulateur, etc.
La première chose à faire est donc de télécharger cette application et la décompresser où bon vous semble (ex. /opt/android-sdk). Ensuite, si vous êtes en 64bits, vous devez installer certaines librairies 32bits nécessaire au lancement des outils.



Il ne reste maintenant plus qu'à sélectionner la machine virtuel et clicker sur Start....
Pour utiliser ADB et DDMS, nous allons devoir communiquer avec l'androphone en passant par le câble USB. Par défaut, le lien USB est utilisé pour synchroniser le téléphone avec un ordinateur de bureau ou encore de transformer le téléphone en disque externe. Pour utiliser nos outils et contrôler l'androphone à partir de GNU/Linux, nous allons devoir le configurer pour que l'USB fonctionne selon un troisième mode "USB Debug". Pour cela, allez dans les réglages du téléphone, dans la section Applications, puis Développement et cochez Débogage USB.
Lorsque c'est fait, vous pouvez raccorder le téléphone à votre ordinateur par le câble USB. En tapant dmesg dans une console, vous devez obtenir les informations suivantes :
root#dmesgusb 8-4: new high speed USB device using ehci_hcd and address 69usb 8-4: New USB device found, idVendor=0bb4, idProduct=0c02usb 8-4: New USB device strings: Mfr=3, Product=2, SerialNumber=1usb 8-4: Product: Android Phoneusb 8-4: Manufacturer: HTCusb 8-4: SerialNumber: HT97FL903160usb 8-4: configuration #1 chosen from 1 choicescsi70 : SCSI emulation for USB Mass Storage devicesusb-storage: device found at 69usb-storage: waiting for device to settle before scanningscsi 70:0:0:0: Direct-Access HTC Android Phone 0100 PQ: 0 ANSI: 2sd 70:0:0:0: [sdd] Attached SCSI removable disksd 70:0:0:0: Attached scsi generic sg4 type 0usb-storage: device scan completeMobile Android en mode débogage USB
La liaison USB est maintenant prête à être utilisée. Pour tester, toujours dans le dossier tools, lancez la commande ./ddms. Apparaît alors une nouvelle application qui n'est autre que le debugger/moniteur de la machine virtuelle du téléphone (aka Dalvik). Si ce dernier est correctement reconnu, vous devriez voir apparaître sa référence en tête d'une petit arborescence. Dans le cas contraire vous aurez des points d'interrogation indiquant que DDMS n'arrive point à communiquer avec le téléphone. Si vous avez bien branché le câble et bien activé le mode Debug, il se peut que ce soit là un problème de droit sur le périphérique USB. Dans ce cas, tentez de créer le fichier suivant
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0bb4", ATTRS{idProduct}=="0c02", MODE="0666"
Notez que nous faisons correspondre les identifiants 0bb4 et 0c02 avec ce que nous voyons dans la trace donnée plus haut. Une fois le fichier sauvegardé, débranchez et rebranchez le câble pour vérifier que l'ami ddms se porte mieux.
Une fois que le téléphone est correctement pris en charge, vous pouvez créer une copie de l'écran en cours en allant dans Device/Screen Capture..., tout simplement. Bien évidement DDMS est beaucoup plus utile que cela... pour un développeur :-)
Non, l'outil qui lui va nous être vraiment très utile est ADB. ADB (pour Android Debug Bridge) est un couteau suisse que tout bidouilleur d'Android se doit de connaître. Il permet en effet de communiquer en direct avec Android par la même connexion USB que DDBS pour y exécuter un tas de commandes utiles allant jusqu'à un véritable shell (un peu comme un ssh).
Comme nous savons grâce à l'étape précédent que la connexion USB du téléphone est fonctionnelle, il ne reste plus qu'à lancer un adb shell pour se balader dans le téléphone
root#./adb shellgaston$lssqlite_stmt_journalscachesdcardetcsystemsyssbinproclogo.rleinit.rcinit.hero.rcinit.goldfish.rcinitdefault.propdatarootdevgaston$exitLancement de la commande adb
Ici fonctionne la majorité des commandes dont vous avez l'habitude en console unix (ls, find, rm, etc..) mais comme vous le constatez, le $ vous signifie bien que vous n'êtes pas root sur cette machine. Beaucoup d'opérations vous seront donc interdites.
Beaucoup d'autres commandes existent pour cet outil. Vous pouvez en obtenir la liste en tapant simplement ./adb. Vous pouvez ainsi lire et écrire sur le système de fichier en utilisant les commande ./adb push un_fichier un_dossier distant ou dans l'autre sens ./adb pull un_fichier_distant un_dossier_local. Ou encore, avec adb logcat obtenir les traces du système android en temps réel.
root#./adb logcatI/Contact WidgetView( 122): com.htc.android.mail.intent.change changed mContentChanged? true changed falseD/NotificationFlashLightUtility getIncomingCall( 343): load fail~~~~~~~~~~D/NewMailNotification( 343): 06021143 createNotification: isFlashEnabled> true, sound> 0, vibrate>1D/NewMailNotification( 343): 06021143 enableJogBallLight>I/Contact WidgetView( 122): android.intent.action.NOTIFICATION_ADD changed mContentChanged? true changed falseD/HardwareService( 65): vibratePattern , repeat=-1I/HardwareService( 65): vibrating with pattern: 0 250 250 250D/HardwareService( 65): VibrateThread , run startD/MailWidget( 122): BroadcastReceiver: ACTION_HTC_MAIL_CHANGE...D/MailWidget( 122): BroadcastReceiver: EXTRA_HTC_MAIL_FLAG_CHANGE: false, true, false, false, falseI/Contact WidgetView( 122): com.htc.android.mail.intent.change changed mContentChanged? true changed falseD/Rosie ( 122): request to update icon, itemId : 2D/Rosie ( 122): request to update icon, itemId : 33D/Rosie ( 122): request to update icon, itemId : 73D/KeyguardViewMediator( 65): wakeWhenReadyLocked(6)D/KeyguardViewMediator( 65): handleWakeWhenReady(6)...adb logcat - les traces d'android
Comme vous le voyez, le kit de développement d'Android est vrai paradis pour bidouilleur. Le seul regret reste ici qu'il ne soit toujours pas fournit en version 64 bits.
il n'est nul besoin de présenter GNU-BASH (Bourne-Again SHell), le célèbre interpréteur de ligne de commande disponible sur à peu prés toutes les plate-formes, d'UNIX bien évidement, à Windows (via cigwin). Il n'est pas non plus nécessaire de présenter une des fonctionnalités que tout utilisateur de bash utilise de manière constante et permanente, l'auto-complètement avec la touche [TAB] pour éviter de taper de longues successions de noms de dossier, gagnant ainsi beaucoup de temps. Ce qui est en revanche beaucoup moins connu, c'est la capacité de bash d'appliquer l'auto-complètement à bien plus que de simple dossier ou noms de fichier.
Quel utilisateur d'aptitude (ce n'est qu'un exemple) n'a pas rêvé taper aptitude [TAB] pour obtenir la liste de toutes les commandes disponibles et ainsi éviter d'avoir à taper et/ou se rappeler chacune d'entre elles ? De même quel utilisateur d'urpmi n'a pas un jour espéré obtenir d'un simple appui sur TAB puisse la liste des paquets disponibles ? Et bien ce genre de petits miracles est à porté d'installation d'un simple paquet.
# sur une mandrivaroot#urpmi bash-completion# sur une debianroot#aptitude install bash-completioninstallation des extensions de l'auto-completion
Pour tester, fermez votre console et ouvrez-en une nouvelle :
root#aptitude [TAB]autoclean clean forbid-version hold markauto remove show update why-notbuild-dep dist-upgrade forget-new install purge safe-upgrade unhold upgradechangelog download full-upgrade keep-all reinstall search unmarkauto whyyoran@badbox:~$ aptitudetest de l'auto-complètement sur debian avec aptitude
root#urpmi apache-mod[TAB]Display all 215 possibilities? (y or n)apache-mod_activex_filter apache-mod_but apache-mod_form apache-mod_ndb apache-mod_sqilapache-mod_annodex apache-mod_bw apache-mod_form-devel apache-mod_nss apache-mod_sslapache-mod_anticrack apache-mod_bwshare apache-mod_fortress apache-mod_ntlm apache-mod_stats...apache-mod_bt-utils apache-mod_file_cache apache-mod_mya apache-mod_spin apache-mod_zrkadloroot@antinea [~] # urpmi apache-modtest de l'auto-complètement sur mandriva avec urpmi
Magique non ? Bien évidement, cela ne se limite pas à ces deux commandes et ce paquet ajoute l'auto-complètement sur des choses aussi diverses que gitn, svn, chkconfig, gcc, configure, etc, etc, etc... Pour avoir une idée des possibles, regardez ce que vous avez maintenant dans le dossier /etc/bash_completion.d, cela peut surprendre.
Une fois que l'on a mis le doigt dans l'auto-complètement, difficile de se limiter à ce que l'on veut bien nous fournir. On passe ainsi bien vite sa vie à râler lorsque bash devient aphone à l'appui frénétique sur la touche tab. Fort heureusement, même un âne (pour preuve j'y arrive !), peut étendre l'auto-complètement. Commençons directement par un exemple (stupide) et créez le fichier /etc/bash_completion.d/compte. L'exemple en question va faire l'auto-complètement sur une commande fictive compte qui prend comme premier paramètre la langue (anglais, français, espagnol) et comme second un chiffre en toute lettres (ex. un, tres, etc..). J'ai prévenu que c'était stupide !!
_compte() {
local choix mot_courant
case "$COMP_CWORD" in
# si nous sommes au premier paramètres, nous donnons la liste des langues
1)
choix="français anglais espagnol"
;;
# second niveau, la langue a donc été choisie
2)
langue=${COMP_WORDS[1]}
case "$langue" in
anglais)
choix="one two three"
;;
français)
choix="un deux trois"
;;
espagnol)
choix="un dos tres"
;;
*)
choix="késako"
;;
esac
;;
*)
words=()
;;
esac
# création de la liste finale de choix
mot_courant=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=( $( compgen -W '$choix' -- $mot_courant ) )
}
complete -F _compte comptecontenu de /etc/bash_completion.d/compte
Avant de dépioter ce code, testons notre oeuvre :
# d'abord on le charge dans l'espace de travail courantgaston$. ./compte# en on testegaston$compte [TAB][TAB]anglais espagnol français
Ok, ça fonctionne pour les premiers arguments, testons les suivant :
gaston$compte espagnol [TAB][TAB]un dos tres
Voilà, tout marche parfaitement. Maintenant quelques explications sur le fonctionnement. La fonction magique est celle qui se trouve à la fin du script complete -F _compte compte. Cette fonction instruit BASH sur l'association entre l'auto-complètement de la commande compte (dernier paramètre) et une fonction BASH _compte. Ainsi, dés que la commande compte est saisie, BASH utiliser la fonction _compte pour en faire l'auto-complètement.
Dans la fonction _compte la première chose que nous regardons est le contenu de la variable COMP_CWORD qui bash renseigne avec le nombre de "mots" sur la ligne de commande. Au démarrage il n'y en a qu'un, la commande compte elle-même. C'est le sens du test (case "$COMP_CWORD" in) qui entame la fonction. Dans le cas où nous avons un seul mot, nous renseignons la liste des choix avec la liste des langues. Si la langue est déjà fournie, la valeur de $COMP_CWORD est 2 et nous utilisons cette fois le tableau COMP_WORDS qui contient chaque mot déjà saisi (de même que le dernier mot saisi partiellement). Nous récupérons donc le second élément de ce tableau, la langue, et nous faisons un simple test pour définir une liste de choix pour chacune d'entre elles.
Les deux dernières lignes de la fonction sont les plus importantes. La première ligne récupère le dernier mot de la liste. Il s'agit donc du mot saisi partiellement (ou vide). La seconde utilise la fonction BASH compgen qui va prendre la liste des choix que nous avons créée et le mot vide ou partiellement saisi pour opérer un filtrage des choix possibles (ex. si le mot partiel est a, que les choix sont 'anglais français espagnol', la liste des choix sera filtrée pour ne plus laisser que anglais). Cette liste est assigné, sous la forme d'un tableau NASH; à la variable COMPREPLY qui comme son nom le suggère contient la liste des choix à afficher à l'utilisateur.
Voilà, c'est tout et ça fonctionne à merveille. Pour rendre ce "greffon" utilisable pour tous sans avoir à le lancer, il suffit soit de le placer dans le dossier /etc/bash_completion.d ou alors de faire un symlink vers ce dossier. Dans les deux cas, il faudra démarrer une nouvelle session pour que ce soit actif par défaut.
Sous bash, l'auto-complétion est géré par la librairie GNU/readline. Cette librairie est hautement paramétrable pour personnaliser encore un peu mieux la gestion de l'auto-complétion. Un exemple, je déteste le fonctionnement des débian impliquant de devoir taper deux fois sur [TAB] pour faire apparaître la liste des choix. Voyons comment changer cela.
La librairie readline est configurée à travers le fichier globale /etc/inputrc ou localement par ~/.inputrc. Ce fichier contient tout ce qu'il faut à readline pour fonctionner comme le mapping des touches, la gestion des caractères étendus, de la touche méta, et aussi de l'auto-complétion. Une liste complète des paramétrages est disponible ici.
Dans le cas du double tab, il s'agit en fait d'un effet de bord lié à ce que readline est configuré sur la debian pour n'afficher la liste des choix de manière directe que s'il n'y a aucune ambiguïté. Du coup un ls [TAB] est considéré comme un monde d'ambiguïté qu'il faut forcer en tapant une seconde fois sur [TAB].
Pour régler cela, il suffit donc de dire à readline de présenter la liste dans toutes les situations, ambiguïté ou pas. Cela se fait en ajoutant à la fin du fichier /etc/inputrc les réglages suivants :
set show-all-if-ambiguous on
set page-completions offPassage en auto-complétion simple tab
Le premier réglage est assez évident, le second permet en plus de ne pas paginer (more) la liste des possibles. A vous de voir si cela vous convient, et ne mettez pas ce second paramètre si ce n'est pas le cas.
| complete -F fonction commande | Association d'une la fonction BASH à une commande |
| $COMP_CWORD | Le nombre de mots saisis (y compris la commande et les mots incomplets) |
| $COMP_WORDS | Le tableau des mots saisis |
| compgen -W 'liste' -- courant | Génère une liste de choix à partir d'une liste source et d'un mot courant (qui peut être vide) |
| $COMPREPLY | Le tableau des choix à afficher |
Cette auto-complètement est une bénédiction pour qui utilise massivement la ligne de commande. Et cette possibilité, tellement simple, de pouvoir écrire ses propres greffons lui donne un nouveau souffle. En tout cas c'est mon avis et je le partage ;-)
Postfix est un serveur libre de messagerie électronique développé à l'origine comme une alternative, plus simple et plus sécurisée, à sendmail. Aujourd'hui c'est une énorme usine à gaz qui demanderait quelques bonnes vies de chat pour être correctement maîtrisée. L'objectif de ce tutoriel est de voir comment nous pouvons utiliser cet outil de manière très fortement allégée dans le seul but de gagner en indépendance vis à vis d'un fournisseur, mais aussi en puissance et en souplesse.

L'architecture cible n'est pas totalement triviale mais se veut la plus sûre possible. L'idée est de disposer d'une machine distante chargée de recevoir le courrier à travers un service SMTP (postfix) et de le traiter avec outil anti-SPAM (spamassassin). Ensuite, le courrier est ré-acheminer vers la machine correspondant au domaine correspondant à l'adresse cible. Étant entendu que les domaines pris en charge sont exclusivement les nôtres et/ou éventuellement ceux de quelques ami(e)s.
L'avantage de cette architecture est qu'elle permet de rentabiliser une machine louée par exemple pour un hébergement WEB (ex. dédibox) tout en préservant la sécurité du réseau local car seule cette machine distante est autorisée à parler avec notre machine locale.
Cela dit, toute complète qu'elle soit, cette architecture reste très simplement dégradable pour ne fonctionner qu'avec un seul serveur local. A vous de sécuriser proprement son accè, par exemple en la plaçant dans une DMZ.
Pour recevoir du courrier l'idéal est de disposer d'une IP fixe, ce qui est automatique avec une dédibox ou une freebox, et en option gratuite pour Orange en mode Pro. Il existe cependant des solutions IP variables en passant par des services comme DynDNS.org.
Pour pouvoir utiliser notre IP, il nous faut aussi acheter un nom de domaine. Il s'agit là d'une formalité qui ne coûte pas le service qu'il rend (12€ chez Gandi pour un .fr ou un .net). Et une fois ce domaine en poche, il ne nous reste plus qu'à configurer ses zones de sorte à ce que notre nouveau nom pointe sur notre IP.
Chez Gandi cela se fait très facilement avec un peu de courage et de gougueulage en passant par l'interface "gestion des Zones", en mode Avancé ou Expert. La version la plus simple que nous devons obtenir pour le routage du courrier doit ressembler à cela :
mon_server 300 IN A 11.22.33.44
smtp.mon_domaine.net 300 IN CNAME mon_server
@ 300 IN MX 10 smtp.mon_domaine.net.
Sans rentrer dans les arcanes de la syntaxe DNS, tout ceci indique que la machine mon_serveur pointe sur l'adresse IP 11.22.33.44 de sorte à ce qu'un ping mon_server.mon_domaine.net réponde positivement. C'est ce que l'on appelle une enregistrement A (principal).
Ensuite vient un enregistrement CNAME qui n'est autre q'un alias sur un enregistrement A. Ce n'est pas strictement nécessaire mais c'est plus propre ainsi, notre serveur SMTP sera donc accessible par smtp.mon_domaine.net.
Enfin vient un enregistrement MX qui définit le nom qualifié de la machine qui est censée prendre en charge le courrier entrant (n'oubliez pas le . final). Notez le chiffre 10 qui définit la priorité de cet enregistrement. L'idée est que si vous avez des amis qui ont eux aussi un domaine et un serveur courriel, vous pouvez ajouter d'autres enregistrement MX pointant chez eux. Ainsi si le MX de plus forte priorité ne répond pas, le courrier est envoyé à celui qui une priorité inférieur. Ainsi il est possible de renforcer mutuellement plusieurs serveurs pour être certain de ne rien perdre.
Pour chacun des enregistrements 300 indique un délai en secondes que les serveurs utilisent comme base de temps pour les mises à jour. Ici, la mise à jour est faite, en cas de changement des données DNS, toutes les 5 minutes.
Une fois que vos modifications sont correctement propagées sur le net (comptez 24 heures pour la première fois), la mécanique fonctionne de la manière suivante. Lorsqu'un utilisateur du Net veut vous envoyer un courriel, il le fait à l'adresse gaston@mon_domaine.net. Son client de courriel va généralement le poster au serveur de courriel de son fournisseur d'accès. On parle ici de serveur SMTP (Simple Mail Transport Protocol). Le SMTP du FAI va regarder le domaine du destinataire et regarder dans sa définition de zone (celle que nous venons de propager) s'il trouve un enregistrement MX. Lorsqu'il en trouve un il remonte (je simplifie ;-)) à l'enregistrement CNAME pour finalement récupérer son IP par son enregistrement A.
Là, il va se connecter sur cette IP, la vôtre, sur le port 25 qui correspond à SMTP. Maintenant il faut que quelqu'un lui réponde sinon c'est la cata, courriel perdu, amis fâchés, tout ça, tout ça. Passons donc à l'installation chez nous de ce fameux serveur SMTP, M. Postfix.

Les messages peuvent ainsi être distribués soit localement en les insérant dans la file maildrop ou à distance en passant par le service SMTP. Dans les deux cas, les messages finissent par être pris en charge par le démon cleanup qui les stocke dans la file incoming. Ensuite le démon qmrg ventile les messages vers du stockage local, un autre serveur SMTP ou vers le démon lmtp communiquant via le protocole LMTP (Light Mail Transport Protocol) très bien adapté au transport local du courrier, par exemple vers le serveur dovcot (imap).
Ici rien de sorcier, tout est dans le même paquet sur la grande majorité des distributions, sur une debian cela donnerait donc
aptitude install postfixinstallation de postfix
Le résultat sera une installation quasi vierge que nous allons pouvoir paramétrer proprement.
L'installation de postfix ne pose aucun problème, c'est plus sa configuration qui rend chauve prématurément. Pour rentrer directement dans le vif de sujet, allons jeté un oeil à ce que devra être la configuration principale du serveur, le fichier /etc/postfix/main.cf. Ce qui suit est une configuration qui fonctionne sur trois serveurs dont j'ai la charge et ce sans problème depuis des années.
Pour éviter de trop donner d'informations au monde extérieur sur ce qui tourne sur notre machine, nous donnons ici de charmants petits noms d'oiseaux au serveur :
smtpd_banner = $myhostname Tagazok !
mail_name = PiouPiou
mail_version = 6.6.6limitation de l'identification au strict minimum
Ici nous allons spécifier la manière dont postfix "écoute" le réseau. Cela consiste basiquement à le connecter à toutes les IP de la machine (c'est un serveur ouvert sur l'extérieur) et à se concentrer sur IPV4.
inet_interfaces = all
inet_protocols = ipv4Paramétrage de l'écoute
Nous avons là le paramétrage du domaine à gérer par postfix. Assez simple nous concernant.
# le nom qualifié du serveur
myhostname = mon_serveur.mon_domaine.net
# le domaine principal géré par le serveur
mydomain = mon_domaine.net
# Lorsqu'un mail part d'ici, c'est ce domaine qui est inscrit dedans.
myorigin = mon_domaine.net
# On indique ici que le courrier n'est pas à re-expédier ailleurs, mais stocker localement
mydestination = mon_domaine.netdéfinition du domaine
Maintenant il nous faut définir nos "réseaux de confiances", c'est à dire les plages d'adresses IP pour lesquels postfix vous autorisera par exemple l'envoi de courriels vers d'autres serveurs. On y ajoute donc notre réseau local car c'est de là que sera expédié le courrier (plus la peine d'utiliser le SMTP de votre FAI). L'ajout du localhost nous permettra d'installer par exemple un WebMail comme SquirrelMail ou Roundcube sur la même machine que postfix.
mynetworks = 127.0.0.0/8,192.168.154.0/28réseaux de confiance
Ensuite nous indiquons les domaines que postfix a le droit de relayer. Attention à ce paramétrage car il ne faudrait pas que votre serveur devienne ce que l'on appelle un "relais ouvert" permettant aux spammeurs d'accomplir leur méfaits. Vous allez y mettre bien sur votre domaine (mydestination), mais vous pouvez aussi ajouter les domaines "amis" que nous prenons en charge que ce soient ceux correspondant à nos enregistrements MX de backup ou simplement des domaines que vous hébergez chez vous.
relay_domains = $mydestination domaine_ami.netdéfinition des domaines relayables
Normalement lorsque l'on utilise notre postfix pour envoyer un mail, il va chercher directement à contacter le serveur SMTP du destinataire. Si vous ajoutez le paramètre suivant, le courrier sera plutôt envoyé à un serveur intermédiaire. Cette option est pratique par exemple si vous n'avez pas de reverse-dns (genre chez orange...) et que vos destinataires prennent votre serveur pour une source de SPAM
relayhost = smtp.free.frdéfinition d'un serveur SMTP de relais
Notre ennemi juré, c'est le SPAM. Le but est donc maintenant d'ajouter au serveur SMTP un ensemble de règles lui permettant de qualifier le courrier entrant. Le principe est que c'est très mais alors très rapide en comparaison de SpamAssassin car directement intégré au moteur SMTP de postfix. Si le test ne passe pas, le vilain est jeté sans somation.
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination
check_recipient_access hash:/etc/postfix/spam,
permitQualification des courriels entrant
Alors j'ai mis ici les règles les plus "safe" en ajoutant un "plus" particulièrement intéressant, la référence à un fichier /etc/postfix/spam pouvant contenir des motifs d'adresse cible à rejeter. Cela va nous permettre d'éliminer des adresses non utilisées mais très polluées, typiquement des adresses que vous avez "grillées" et qui sont pourries de SPAM.
Pour initier cette liste, commencez par la créer (avec nano, vi, etc.) et y ajouter une adresse suivie d'une action REJECT. Le principe sera que dés que le serveur SMTP verra arriver cette adresse cible (dans le champ TO), il arrêtera tout traitement concernant ce courriel. Brutal mais efficace.
vielle_adresse@mon_domaine.net REJECTexemple de fichier /etc/postfix/spam
En l'état cette liste n'est pas utilisable par postfix. Elle doit préalablement être "compilée" en une base de donnée. Pour cela, utilisez la commande postmap
root#postmap spamroot#ls spam*spam spam.dbCompilation d'une table postfix
Comme vous le voyez, la commande à généré un fichier spam.db, la version indexée de la liste d'origine. A chaque fois que vous modifiez une table, vous devrez lancer cette commande dessus.
Les alias sont une étape optionnelle si vous ne gérez qu'un domaine et que vous n'avez au final qu'un compte mail cible par adresse source. En réalité ce cas n'est jamais vérifié car nous avons tous besoin au minimum de rediriger une série d'adresses sur un même compte (ex. root@mon_domain.com vers mon adresse standard). Les alias permettent donc de jouer le rôle de redirecteur d'une adresse, d'un groupe d'adresse ou même d'un domaine complet vers une autre adresse.
Pour mettre ceci en oeuvre, nous ajoutons allons ajouter une autre liste (comme pour les spams) qui va nous permettre cette mise en relation :
virtual_alias_maps = hash:/etc/postfix/aliasesDéfinition des aliases
Reste maintenant à nourrir ce fichier :
# tous les courriers pour le domaine mon_domaine.net et mon_second_domaine.net va en priorité à gaston
@mon_domaine.net gaston
@mon_second_domaine.net gaston
# le courrier de robert lui revient
robert@mon_domaine.net robertexemple de fichier /etc/postfix/aliases
Comme pour la liste des spams, nous devons compiler cette liste après modification à l'aide de la commande postmap.
root#postmap aliasesroot#ls aliasesaliases aliases.dbCompilation d'une table postfix
Pour terminer, vous pouvez aussi modifier les limites de tailles imposées à un message et une boîte aux lettres (en octets). Cette opération nous permet de recevoir de très gros fichiers sans encombres, ce qui est un autre avantage à posséder son propre serveur :
message_size_limit = 104857600
mailbox_size_limit = 104857600limitation de la taille des messages et des boîtes aux lettres
Le soft bounce est à manier avec beaucoup de précaution. D'une certaine manière, il assure que vos courriels ne seront jamais rejetés mais stocké en queue si par exemple votre espace disque est totalement consommé ou que SpamAssassin est parti en vrille. En contrepartie, il va ré-émettre comme un sauvage les courriels à "faux numéro", ce qui a le don d'exaspérer les serveurs d'en face avec le risque de vous faire marquer comme spammeur. Personnellement je le laisse à no et le passe à yes lorsque je fais des opérations de maintenance pour ne pas perdre de courrier.
soft_bounce=nodéfinition du 'soft bounce'
Lorsque soft bounce est à no, nous avons donc le risque de perdre du courrier si un élément est défaillant dans la chaîne de traitement des messages (spamassassin en carafe, disque plein, etc). Pour contrer cela, l'astuce est de changer le code d'erreur généré pour un destinataire invalide de 550 (ce qui veut dire "mail rejeté") à 450 (ce qui veut dire "essayez un peu plus tard"). Du coup le serveur d'en face va (de mémoire) retenter l'envoi toutes les 10 minutes pendant 4 heures, avant de déclarer que votre courrier est vraiment mort.
unknown_local_recipient_reject_code = 450stratégie de récupération d'erreurs
Maintenant que nous avons paramétré notre serveur, il nous reste à vérifier que cela fonctionne. La première chose à faire sera évidement de le (re)démarrer
root#/etc/init.d/postfix restartStopping Postfix Mail Transport Agent: postfix.Starting Postfix Mail Transport Agent: postfix.Redémarrage de postfix
Ensuite pour tester, le plus simple dans un premier temps est d'utiliser l'antique client telnet que nous allons connecter au port 25 (SMTP) de notre serveur :
root#telnet smtp.mon_domaine.net 25Trying 11.22.33.44...Connected to smtp.mon_domaine.net (11.22.33.44).Escape character is '^]'.220 mon_serveur.mon_domaine.net Tagazok !!>ehlo son_domaine.net250-smtp.mon_domaine.net250-PIPELINING250-SIZE 1004857600250-VRFY250-ETRN250-ENHANCEDSTATUSCODES250-8BITMIME250 DSN>mail from: robert@son_domaine.net250 2.1.0 Ok>rcpt to: gaston@mon_domaine.net250 2.1.5 Ok>data354 End data with <CR><LF>.<CR><LF>>Robert parle à gaston !!>>.250 2.0.0 Ok: queued as D421D908DA0>quit221 2.0.0 ByeConnection closed by foreign host.root#Session de test de notre serveur Telnet
Si tout c'est bien passé, gaston devrait ainsi recevoir un courriel de robert. Cette approche peut aussi être utilisée pour tester les barrières anti-spam. Toujours est-il que cela fonctionne, nous pouvons donc passer à la suite, le stockage du courrier.
A ce stade, notre serveur postfix est capable de prendre en charge le courrier entrant, c'est déjà une bonne chose. Côté stockage, si rien n'est fait, le courrier de gaston est posé, à l'ancienne, dans le dossier /var/mail/gaston.
Si votre serveur postfix est sur votre réseau local, vous pouvez changer cela pour utiliser plutôt un stockage via un serveur IMAP comme cyrus ou dovecot (un tutoriel pour cyrus est dispo iciici, et pour dovecot par là).
Mais si votre serveur postfix est sur une machine distante (ex. une dédibox), il va falloir trouver un moyen pour que votre courriers soient ré-acheminés sur votre serveur local. C'est aussi le cas si vous êtes serveur secondaire pour un ami.
Pour y arriver, une solution assez simple est d'installer un second serveur postfix sur votre réseau local. Ce serveur postfix sera configuré pour ne prendre en charge que le courrier de votre domaine ce qui au fond reprend à peu prés (au delta du paramétrage des domaines amis) la configuration que nous venons de voir.
Ensuite, la seule chose à faire est d'indiquer au postfix distant comment ré-acheminer le courriels de votre domaine. Pour cela nous allons rajouter une nouvelle table transport
transport_maps = hash:/etc/postfix/transportDéfinition de la table de transport
Nous pouvons maintenant créer et alimenter cette table :
mon_domaine.net smtp:[11.22.33.44]
domaine_ami.net smtp:[mail.domain_ami.org]Exemple de fichier /etc/postfix/transport
Comme toujours, pensez à recompiler la table avec la commande postmap après modification.
Comme vous le voyez, c'est aussi là que nous traitons le ré-acheminement du courrier du domaine ami que nous avons déclaré plus haut par relay_domains.
Une fois nos deux postfix paramétrés, le courriel arrive sur le premier (le serveur distant), est accepté (à cause de relay_domains), puis redirigé sur le serveur local grâce à la table transport. Là vous pouvez un routage final vers votre serveur IMAP, et c'est terminé.
A ce stade tout est presque prêt sauf un léger détail, postfix va rejeter tous ces courriels non-locaux parce qu'ils sont... non locaux... Pour éviter ce gag, il faut demander à notre ami de ne plus vérifier que le destinataire dispose d'un compte en local pour traiter son courriel :
local_recipient_maps =Déclaration d'une table de destinataires vide

S'agissant d'un processus qui consomme un peu de CPU, il est préférable, si vous avez une configuration à deux serveurs postfix, de le poser sur la machine la plus véloce. Pour se faire, il faut commencer par installer les paquets spamassassin, spamc et pyzor. Ce dernier est un système collaboratif et ouvert de détection de spam qui va nous permettre d'augmenter l'efficacité de spamassassin.
aptitude install spamassassin spamc pyzorinstallation de spam assassin
le paquet spamassassin contient à la fois le moteur de traitement de spam et un démon, spamd, qui va permettre de charger en mémoire plusieurs instance du moteur prêtes à l'emploi. spamc est quant à lui le client de ce démon.
Spamassassin a ses fichiers de paramétrages placés en /etc/spamassasin. Ce dossier contient entre autre /etc/spamassasin/local.cf que vous pouvez modifier comme suit :
dns_available yes
# Activation du systeme Bayes
use_bayes 1
bayes_auto_learn 1
bayes_learn_to_journal 1
bayes_journal_max_size 0
bayes_path /var/spool/spamassassin/bayes
# Activation de l'auto whitelist
use_auto_whitelist 1
auto_whitelist_path /var/spool/spamassassin/auto-whitelist
auto_whitelist_file_mode 0666
# Activation de DCC
use_dcc 1
dcc_timeout 8
dcc_home /var/spool/spamassassin/dcc
# Activation de Pyzor
use_pyzor 1
# Activatin de Razor
use_razor2 1
razor_timeout 8
# Optimisation des scores
score DCC_CHECK 4.500
score SPF_FAIL 10.000
score SPF_HELO_FAIL 10.000
score RAZOR2_CHECK 2.500
score RAZOR2_CF_RANGE_51_100 3.500
score BAYES_99 5.300
score BAYES_95 4.500
score BAYES_80 3.500
score BAYES_60 2.500
score BAYES_50 2.000
# Langages
ok_languages en fr vi
ok_locales en
#required_hits 5
#add_header all Report _REPORT_
header Subject /SPAM/
report_safe 1configuration spamassassin
Pas grand chose à signaler sur cette configuration assez simple à comprendre. Pour les différentes stratégies de filtrage (bayes, pyzor, razor2, etc.) demandez à M. Google qui expliquera cela beaucoup mieux que moi.
La version 3 de spamassassin fonctionne par plugins. Il y en a deux qui nous intéresse d'activer par rapport à notre configuration : dcc et textcat. Le premier va utiliser une base de données de spam, le second permet de deviner le langage d'un spam. Pour cela nous devons éditer le fichier /etc/mail/spamassassin/v310.pre pour décommenter les deux lignes suivante :
loadplugin Mail::SpamAssassin::Plugin::DCC
(...)
loadplugin Mail::SpamAssassin::Plugin::TextCatparamétrage des greffons spamassassin
Nous allons maintenant créer un utilisateur spamassassin qui va avoir comme dossier home /var/spool/spamassassin. Ce dossier contiendra tout le paramétrage et les mise à jours de spamassassin :
root#mkdir /var/spool/spamassassinroot#useradd -d /var/spool/spamassassin -s /bin/false spamassassinroot#chown spamassassin:spamassassin /var/spool/spamassassin -Rccréation de l'utilisateur spamassassin
Maintenant que spamassassin est paramétré, il nous reste à vérifier que son démon, spamd, fonctionne. Sous Debian, le paramétrage du lancement de spamd est contrôlé par le fichier /etc/default/spamassassin.
ENABLED=1
OPTIONS="--create-prefs --max-children 5 --helper-home-dir -u spamassassin -g spamassassin"
PIDFILE="/var/run/spamd.pid"
CRON=1paramétrage de spamd
Avec ce paramétrage nous avons activé le serveur spamd (ENABLED=1) et la mise à jour automatique de spamassassin (CRON=1). Enfin vous pouvez en plus rajouter -D dans les options pour obtenir de très nombreuses traces de deboggage.
Il suffit maintenant de lancer spamd et de vérifier dans les logs que tout s'est bien passé:
root#/etc/init.d/spamassassin restartRestarting SpamAssassin Mail Filter Daemon: spamd.root#tail -f /var/log/syslog...
Si aucune erreur n'apparaît dans les logs, le démon spamassassin est en route. Reste maintenant à paramétrer postfix.
Nous allons indiquer à postfix d'insérer un script de notre cru dans la chaîne de traitement des courriers, juste après la réception par le moteur SMTP. Pour cela, modifier le fichier /etc/postfix/master.cf comme suit :
smtp inet n - n - - smtpd -o content_filter=spamassassin:insertion du filtrage de SPAM sur le module SMTP de postfix
et rajouter à la fin du fichier :
spamassassin unix - n n - - pipe flags=Rq user=spamassassin argv=/etc/postfix/spamassassin.sh -f ${sender} -- ${recipient}insertion du filtrage de SPAM sur le module SMTP de postfix
Tout est en place, il faut maintenant fabriquer le script de filtrage dont le but est de recevoir le courrier entrant (postfix), de le traiter avec spamassassin via spamc/spamd, puis de le ré-expédier sur la chaîne suivante. Le script est à placer (par exemple) dans le fichier /etc/postfix/spamassassin.sh :
#!/bin/bash
IP="$1" ; shift
FROM="$1"; shift
TO="$1"
logger -t spamd "$FILE Client:$IP From:$FROM To:$TO CC:$@"
/usr/bin/spamc -u $TO | /usr/sbin/sendmail -i -f $FROM "$@"
exit $?script de filtrage des spams - /etc/postfix/spamassassin.sh
Ceci fait, il faut juste rendre ce script exécutable et opérer un petit redemarrage de postfix et c'est fini. Vous pouvez auditer les logs par un tail -f /var/log/syslog pour vérifier que tout ce passe correctement. Et si tout marche, il ne reste plus qu'à attendre 10 secondes qu'un pourriel se présente :)
L'objectif de cette commande est de permettre aux messages d'être à nouveau interprétés par postfix pour être replacés dans les bonnes queues. Elle est notamment très utile lorsque l'on a des erreurs de configuration qui une fois corrigées laissent des messages en attente (ex. désinstallation d'amavis et message d'erreur warning: connect to transport smtp-amavis: No such file or directory) :
root#postsuper -r ALLpostsuper: Requeued: 5 messagesremise en queue des messages
Lorsque Postfix n'arrive à rien faire d'un message, il le met en file d'attente. Les commande suivantes permette d'avoir l'état de ces files :
# ces deux commandes sont équivalentesroot#postqueue -f-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------1DEC5908D05 3716 Mon Jan 19 14:33:50 tcpv@mon_domaine.com(mail forwarding loop for tartignole@mon_domaine.com)root#mailq-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------1DEC5908D05 3716 Mon Jan 19 14:33:50 tcpv@mon_domaine.com(mail forwarding loop for tartignole@mon_domaine.com)Affichage des messages en non-traités
La commande précédente donne la liste des messages en attente dans la queue de postfix (généralement des spams :/). Chaque message dispose d'un ID qui permet de le détruire spécifiquement :
root#postqueue -d ID_MESSAGEdestruction d'un message unique
S'il s'agit de détruire tous les messages en queue (attention !!) vous pouvez utilisez la commande suivante :
root#postqueue -d ALLpostsuper: Deleted: 5 messagesdestruction de tous les messages en queue
Pour voir de plus prés l'utilisation d'une queue :
root#qshape deferredT 5 10 20 40 80 160 320 640 1280 1280+TOTAL 7 0 0 0 0 0 0 0 1 0 6chez.com 6 0 0 0 0 0 0 0 0 0 6tiscali.fr 1 0 0 0 0 0 0 0 1 0 0Profile des queues
Si vous avez dans vos logs l'erreur suivante warning: mail_queue_enter: create file maildrop/163133.6208: Permission denied, une solution possible est de lancer les commandes suivantes :
root#postfix set-permissionsroot#postfix reloadcorrection des droits postfix
Voilà, fin du petit tour de l'horizon postfix et associés. Qui a dit que la liberté n'avait pas de prix ? ;-)
Dernièrement certain ont pu constater un "léger" problème avec les applications Java/SWT (au hasard eclipse) : les boutons se sont mis à "coller"... Par coller je veux dire que l'on a beau cliquer dessus, ils refusent obstinément de déclencher l'action qu'on est en droit d'attendre d'eux, nous obligeant à utiliser le clavier.

D'après leurs auteurs, les avantages de cette approche sont multiples : elle évite le "lag" induis par les conversations entre le serveur et client X11, elle permet aussi d'uniformiser et simplifier le fonctionnement de GTK entre Windows, GNU/Linux, Mac & co. Enfin, de manière plus contestable, l'idée est aussi de préparer les zigouigouis-plasmoesques de la prochaine version de Gnome à base de .
Que du bon pour les amateurs de zigouigouis, un peu moins pour ceux qui bossent avec des applications Java/SWT comme éclipse, ou utilisent certaines applications Flash, qui elles, n'apprécient pas trop la plaisanterie.
Voilà donc pour le blabla, voyons finalement la solution qui consiste bêtement à désactiver pour les applications problématiques le "client side windows". Cela se fait très simplement de la manière suivante :
Voilà, grâce à cela, vous applications Java/SWT arrêtent de coller et fonctionnera comme elles doivent. Il n'y aura donc pas pour elles de zigouigouis...
Beaucoup (toutes ? ;-) de ROM que l'on trouve pour Android se prétendent plus rapides et plus stables. De toute celle que j'ai testé (une bonne dizaines), c'est tout de même la MoDaCo qui ment le moins. D'un point de vue fonctionnel, la couche applicative étant la même que la ROM HTC Hero d'origine, il n'y a guère de surprises. Tout fonctionne à l'identique (bluetooth, APN à 5Mp, etc.). Pour la stabilité c'est un peu la même chose puisque cette ROM tourne sous Android 1.5 pour lequel a été conçu et testé cette couche applicative. Enfin concernant les performances, elles sont sans aucun doute meilleur. Le mérite revenant en grande partie à l'utilisation du Teknologist Kernel, un noyau linux optimisé pour le Hero, qui active le CompCache. Mais malgré cela, il est possible d'obtenir encore mieux de cette petite bestiole.
Pour ce qui suit, il vaut mieux que vous ayez déjà suivi ce tutoriel.

gaston$adb shell cat system/init.d/ramzswap.sh/system/xbin/insmod /system/lib/modules/tun.ko/system/xbin/insmod /system/lib/modules/lzo_decompress.ko/system/xbin/insmod /system/lib/modules/lzo_compress.ko/system/xbin/insmod /system/lib/modules/xvmalloc.ko/system/xbin/insmod /system/lib/modules/ramzswap.ko disksize_kb=131072/system/xbin/swapon /dev/block/ramzswap0echo "10" > /proc/sys/vm/swappinessecho "performance" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governorcontenu de ramzswap.sh
Comme vous le voyez, mis à par le module tun qui n'a rien à voir, la mise en oeuvre de compcache implique les modules de compression/décompression lzo, xvmalloc, un gestionnaire de mémoire écrit pour compcache et bien sur ramzswap qui est le swap en mémoire compressé fixé ici (pour une MoDaCo 3.1) à 128mo. Ensuite il ne reste plus qu'à activer le swap de linux (swapon) sur le device créé par ramzswap et de modifier la valeur de swapiness pour en profiter.
A l'usage le système est en effet plus réactif, ce n'est pas une illusion. Mais malgré cela on ne peut s'empêcher de pense qu'il s'agit là d'une emplâtre sur une jambe de bois. Loin de moi l'idée de dénigrer ce très bon travail mais consommer du CPU pour compresser de la mémoire n'entraîne un gain de performance que si le temps passé à vider la mémoire inutilisé est inférieur au temps passé à compresser les pages de swap. C'est pragmatiquement le cas mais le gain reste faible et on ne peut s'empêcher de se dire qu'une meilleur gestion de la dite mémoire devrait être plus efficace. Et c'est en faisant des recherches dans ce sens que je suis tombé sur l'auto-taskkiller.Il existe une multitude de tueurs de tâches sur le market Android et ils ont à peu prés tous les deux mêmes défauts : ils sont aveugles s'agissant des tâches systèmes et surtout, on doit les utiliser... Fort heureusement il existe une autre approche beaucoup plus intelligente directement intégré au noyau linux pour Androphone, le taskkiller interne. Son principe est de brider quelque peu le gros avantage d'android sur iphone, le multi-tache. En effet, a force de lancer des applications qui elles-mêmes lancent des processus, etc, etc, la mémoire se trouve vite saturée (et le CPU aussi au fond). Le principe du taskkiller est une heuristique pour déterminer quelle tâches ne sont plus utiles et de les détruire pour gagner de la mémoire. Cette fonctionnalité est gérée par un pilote spécifique à Android, LowMemoryKiller, réglable par un simple echo dans /sys/... permettant d'indiquer les contraintes de destruction de processus en fonction de la mémoire restante.
Le principe technique de ce consiste à associer à chaque processus lancé, un score appelé oomadj (pour out of memory adjustement) allant de -17 à +15. Plus le score est élevé, plus le processus est jugé inutile en cas de crise de mémoire. Le score en lui-même est réglé par Android selon les références suivantes :
SYSTEM_ADJ -16
CORE_SERVER_ADJ -12
FOREGROUND_APP_ADJ 0
VISIBLE_APP_ADJ 1
SECONDARY_SERVER_ADJ 2
HIDDEN_APP_MIN_ADJ 7
CONTENT_PROVIDER_ADJ 14
EMPTY_APP_ADJ 15
Comme on le voit, les applications critiques sont positionné avec un score négatif (-12), c'est typiquement le cas de la téléphonie. A -16 c'est le système lui-même qui tourne.
Au score 0 nous avons les applications en premier plan, celles donc qu'il n'est cool de tuer car l'utilisateur bosse dessus :-) Ensuite nous avons les applications visibles (1), celles avec interface mais en arrière plan (7), etc.
Le réglage du taskkiller va fonctionner en associant un score de processus "tuables", avec un niveau de mémoire minimum servant de déclencheur. La liste des scores tuables est lisible dans le fichier /sys/module/lowmemorykiller/parameters/adj :
$adb shell cat /sys/module/lowmemorykiller/parameters/adj0,1,2,7,14,15Liste des scores tuables
Nous retrouvons ici les scores donnés plus haut, et uniquement les positifs (non-système). Maintenant pour les limites de mémoire libre, c'est le fichier /sys/module/lowmemorykiller/parameters/minfree :
$adb shell cat /sys/module/lowmemorykiller/parameters/minfree1536,2048,4096,5120,5632,6144Liste des niveaux de mémoire libre
Ces valeurs sont exprimés en "pages de 4ko". Ainsi les applications de score 7 sont tuées dés que la mémoire libre tombe au dessous de 5120x4=20mo. Les processus visibles mais qui ne sont pas utilisé à un moment T (score 1) sont tuées à 2048*4=8mo, etc... Sachant cela il est possible d'injecter dans le kernel des valeurs un peu plus agressives, comme par exemple !
$adb shell echo "1024,2048,4096,8192,16384,32768" > /sys/module/lowmemorykiller/parameters/minfreeListe des niveaux de mémoire libre
Avec ces nouvelles valeurs nous avons une tuerie de processus qui débute dés que la mémoire libre passe en dessous des 128mo (4*32768) avec une libération des applications en avant plan à 4mo de libre. De quoi garder en permanence de la mémoire sous la pédale, et donc de la réactivité.
Maintenant ces valeurs sont les miennes et vous pouvez en tester d'autres.
Pour simplifier nous allons prendre comme base le script d'initialisation de compcache de la MoDaCo que nous allons joyeusement remplacer par nos valeurs pour lowmemorykiller. Pour cela nous allons récupérer ce script en local :
gaston$adb pull /system/init.d/ramzswap.sh ramzswap.sh12 KB/s (527 bytes in 0.042s)Liste des niveaux de mémoire libre
Ceci fait, avec votre éditeur préféré, vous allez modifier ce script pour mettre en commentaire les éléments de compcache et ajouter ceux du tueur
#/system/xbin/insmod /system/lib/modules/tun.ko # pas besoin de ce module pour moi
#/system/xbin/insmod /system/lib/modules/lzo_decompress.ko
#/system/xbin/insmod /system/lib/modules/lzo_compress.ko
#/system/xbin/insmod /system/lib/modules/xvmalloc.ko
#/system/xbin/insmod /system/lib/modules/ramzswap.ko disksize_kb=131072
#/system/xbin/swapon /dev/block/ramzswap0
#echo "10" > /proc/sys/vm/swappiness
echo "performance" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo "1024,2048,4096,8192,16384,32768" > /sys/module/lowmemorykiller/parameters/minfreescripte ramzswap.sh
Voilà c'est tout. Vous pouvez maintenant ré-injecter le fichier dans le téléphone et redémarrer
# remontage de la partition système en écrituregaston$adb remount# injection du nouveau scriptgaston$adb push ramzswap.sh /system/init.d/ramzswap.sh12 KB/s (527 bytes in 0.042s)# redémarragegaston$adb shell rebootListe des niveaux de mémoire libre
Le taskkiller permet d'adresser le problème de la taille limité des androphones qui implique un travail trop intensif du garbage collector de la machine virtuel lorsqu'elle vient à manquer. Sur ce point, cette technique est à mon sens plus efficace que compcache. Maintenant s'agissant de la rapidité pour passer d'une application à l'autre, il est évident que compcache est plus adapté car taskkiller va vous obliger à relancer vos applications, avec donc un temps de démarrage supplémentaire. A vous de voir ce qui convient le mieux à votre usage.
Toujours est-il que si on avait un doute, Android est bien un petit GNU/Linux qu'il est possible de tweaker à loisir.
Avec l'expansion pandémique (le terme est à la mode
de "services" comme Google Analytics, les moyens de se prémunir des SpyWebs prennent de plus à en plus d'importance. Et si des outils comme adBlock offre une très protection locale efficace, la protection d'un réseau dans son entier ne peut se passer de privoxy, un proxy filtrant aux possibilités étonnantes et disponible sur beaucoup de systèmes de Windows à Linux en passant par AmigaOS.
Pour faire simple, le SpyWeb est à la toile ce que le SpyWare est à Windows, des applications qui s'exécutent dans votre dos par le simple fait de visiter un site. Et les dangers liés à leur présence sont aussi nombreux que clairement sous-estimés :
Entendons-nous bien, je comprends parfaitement l'importance des outils statistiques pour la gestion de la stratégie d'un site. Mais il existe aujourd'hui d'autres solutions (awstats, piwik (anciennement phpmyvisites), etc.) qui stockent localement les données des utilisateurs. Il est aujourd'hui parfaitement possible, avec certes un peu plus d'efforts, d'obtenir les mêmes résultats avec en prime un respect de ses utilisateurs, et une maîtrise des données.
Autre point intéressant, même si vaguement hors sujet, Google a mis en place un tableau de bord (dashboard) permettant de savoir ce qui est stocké par ses services à votre nom. Malheureusement il n'est pour l'instant possible que d'avoir accès à ce qui est directement rattaché à votre compte gmail et pas ce qui a été collecté à partir de votre adresse IP... C'est un premier pas qu'il faut saluer, mais il est à espérer que Google ne s'arrête pas en si bon chemin.
Toujours est il que cette page résume assez bien le problème de l'utilisation de services (le fameux cloud computing) dont on ne saisit pas les tenants et aboutissants.
J'y ai par exemple découvert avec un peu d'horreur que l'ensemble des mes conversations privées via mes comptes gtalk étaient consciencieusement archivées... Sur le dashboard, vous avez ainsi accès à la liste de toutes vos conversations avec la possible de les supprimer (en espérant que ce soit fait honnêtement et en n'oubliant pas de vider la corbeille) et paramétrer gtalk pour ne plus archiver l'historique dans l'avenir (là aussi en espérant que ce soit honnête). Pour plus de sécurité vous pouvez aussi passer par un compte jabber plus sur, mais cela n'empêche pas votre correspondant d'utiliser gtalk. Une option plus simple est peut-être de simplement demander à vos correspondant d'installer le plugin de chiffrement Off-the-Record Messaging pour pidgin.
Pour revenir à nos spywebs, il existe quelques méthodes pour s'en débarrasser localement des SpyWebs mais privoxy demeure la plus efficace s'agissant de protéger globalement un réseau.
Privoxy est un proxy HTTP "filtrant" dont le rôle est "simplement" d'analyse chaque page de chaque sites que vous visitez pour y éradiquer publicités et SpyWebs.
Pour arriver à ses fins, privoxy dispose de deux techniques. Soit il va interdire, comme le ferait AdBlock, l'accès à certains sites, soit il va modifier, "à la volée" les pages que vous recevez (par exemple pour altérer des scripts dangereux).
Privoxy est en outre capable de "désanimer" des images GIF, de nettoyer vos cookies pour qu'ils ne laissent pas passer d'information, de maquiller l'identité de votre navigateur. Bref, c'est un outil complet, simple d'utilisation, rapide à installer, prêt à l'emploi et complètement paramétrable pour filtrer encore plus loin.
Au final, le navigateur va recevoir une page la plus "pure" possible débarrassée de tout ce qui peut nuire à la lisibilité, à la bande passante et à la sécurité.
Maintenant la suppression des encarts de pub est un peu plus litigieuse que celles des SpyWebs. En effet le modèle de financement et donc de développement de la toile s'appuie très massivement sur la publicité. Et même si je suis le premier à regretter les abus grandissant ces dernières années (on est loin de l'époque du linteau de pub en haut de la page), le choix de les supprimer purement et simplement n'est pas forcement la bonne solution.
Malheureusement l'éradication de la publicité devient ici un des dommages collatéraux lié à la guerre anti-SpyWebs. En effet, autoriser la publicité et pas les SpyWebs n'a aucun sens car les deux reposent sur les mêmes mécanismes. A titre d'exemple, GoogleAd se base sur un script show_ads.js pour afficher la pub. Aujourd'hui Google Analytics se base lui sur le script urchin.js. On pourrait logiquement autoriser le premier et bloquer le second. Mais si cette pratique se généralise, Google aura tôt fait de vider urchin.js pour transférer la logique d'espionnage sur show_ads.js rendant la protection caduque. La destruction systématique des scripts externes est donc la priorité même si la publicité en pâtie.
La seule solution que j'ai trouvé à ce problème consiste à débloquer la publicité sur les sites que je considère comme "ami", ce qui se fait très simplement avec Privoxy.
Privoxy peut être installé sur une machine de bureau mais prend sa pleine puissance une fois mis en place sur tout un réseau. Il va donc falloir choisir une machine qui sera connue des autres mais il n'est pas nécessaire qu'elle soit dédiée à cette tâche. Privoxy prend peu de ressource mémoire et CPU, n'importe quelle machine sous n'importe quel système devrait convenir pour peu qu'elle soit allumée en permanence. Pour la suite j'appellerais cette machine, machine_privoxy.
Toutes les versions binaires pour tous les Systèmes sont téléchargeables ici. Pour un système GNU/Linux l'installation se fait comme suit :
root#urpmi privoxyouroot#apt-get install privoxyroot#/etc/init.d/privoxy startLancement de privoxy : [ OK ]root#
Normalement, privoxy est installé avec sa configuration /etc/privoxy/config prête à l'emploi. Cependant il peut être utile de faire son propre paramétrage, ne serait-ce que pour mettre le service en écoute d'une adresse IP publique (par défaut c'est localhost:8118). Voici la mienne que j'ai commenté :
# dossier de configuration
confdir /etc/privoxy
# dossier de stockage des traces
logdir /var/log/privoxy
logfile privoxy.log
# niveau de debuggage dans les traces.
debug 1 # Affiche toutes les connections et éventuels "crunch"
# debug 2 # Affiche le statut des connexions
# debug 4 # Affiche le statut des entrées-sorties
# debug 8 # Affiche le parsing des headers
# debug 16 # Afficher toutes les données reçues ou envoyées (un peu lourd !)
debug 32 # debug force feature
debug 64 # debug regular expression filters
debug 128 # debug redirects
debug 256 # debug GIF de-animation
debug 4096 # Startup banner and warnings.
debug 8192 # Non-fatal errors
# Actions
actionsfile standard.action
actionsfile default.action
actionsfile user.action
# Filtres
buffer-limit 4096 # limite de taille des contenus filtrables
filterfile default.filter
#filterfile user.filter # peut être décommenté pour créer ses filtres custom
# adresse et port sur lesquels sont ouvert le proxy
listen-address 192.168.154.102:8118
# A décommenter (et modifier) pour chaîner à un autre proxy
# forward / localhost:3128
# Autorise l'utilisation en proxy transparent
accept-intercepted-requests 1
# statuts
toggle 1 # activé au démarrage
enable-remote-toggle 1 # désactivable à distance
enable-remote-http-toggle 1 # désactivable à distance (WEB)
enable-edit-actions 1 # actions éditables (WEB)
enforce-blocks 1 # on peut forcer un blockage/etc/privoxy/config
L'avantage d'un proxy http est qu'il n'existe pas à ma connaissance de navigateur qui ne sache pas l'utiliser. Pour l'exemple nous allons faire ici le paramétrage de FireFox, mais il pourrait tout aussi bien s'agir de Safari, Opéra et même Internet Explorer...
Il faut donc maintenant aller sur la machine cliente pour indiquer à son navigateur d'aller chercher ses pages web sur la machine_privoxy. Dans FireFox allez dans les menus Édition/Préférence/Réseau/Paramètres. Sélectionnez configuration manuelle du proxy et entrez pour HTTP les valeurs machine_provoxy et 8118. Cliquer ensuite sur OK et enfin Fermer.
C'est tout ! Pour vérifier que tout fonctionne, saisissez l'adresse http://config.privoxy.org/ et validez. Vous devez voir apparaître la page de configuration de privoxy.
Tout est donc opérationnel. Pour se convaincre que tout est en place, il suffit d'ouvrir une console sur la machine privoxy et d'y faire un tail -f /var/log/privoxy/logfile.
Ensuite sur le poste client, allez faire un tout avec votre navigateur sur le site www.liberation.fr et regardez ce qu'affiche privoxy :
root#tail -f /var/log/privoxy/logfileRequest: www.liberation.fr/Request: www.liberation.fr/_looks/liberation/scripts/rObj.js(...)www.smartadserver.com/call/pubj/252/1276/225/M/7424944326/? crunch!Request: www.liberation.fr/_looks/liberation/images/fond_pub_728x90.gif(...)Request: www.smartadserver.com/call/pubj/252/1276/163/S/7424944326/? crunch!Request: www.liberation.fr/_looks/liberation/images/onglet_forum_on.gif(...)Request: cmhtml.fr.overture.com/d/search/p/standard/eu/js/flat/ctxt/ls/?ctxtId=libe_fr_annuaire&NGrp=2&NKw=4&Pg=1&keywordCharEnc=utf-8&outputCharEnc=utf-8&Partner=liberation_js_fr_ctxtls_libe crunch!(...)www.liberation.fr/interactif/question/libeblogs/_files/file_258326_34465_petite_vignette.jpgRequest: www.smartadserver.com/call/pubj/252/1276/276/S/7424944326/? crunch!(...)Request: www.smartadserver.com/call/pubj/252/1276/94/S/7424944326/? crunch!Request: www.liberation.fr/interactif/question/libeblogs/_files/file_260788_26585_petite_vignette.jpg(...)Request: www.google-analytics.com/urchin.js crunch!(...)Request: logi8.xiti.com/hit.xiti?s=197813&s2=2&p=homepage&hl=8x59x22&lng=fr&r=1280x886x32x32&re=1280x746&ref= crunch!root#
A chaque fois que privoxy affiche crunch, il a bloquer le navigateur. Nous voyons ainsi qu'en standard, privoxy bloque efficacement les publicités, Google Analytics et Xiti. Cela fait déjà beaucoup de nuisance en moins. Mais nous allons pouvoir aller un peu plus loin.
Comme vous l'avez vu, Privoxy par défaut marche déjà très bien. Il est cependant possible d'aller plus loin. Pour changer les paramètres de Privoxy, vous avez deux solutions. Vous pouvez soit utiliser l'interface WEB (personnellement je ne la trouve pas très simple), soit taper directement dans les fichiers de configuration. Pour cela, il faut simplement éditer le fichier /etc/privoxy/user.action. Notez que le simple fait d'en faire sauvegarde implique son rechargement. Aucun besoin donc de redémarrer privoxy.
Le fichier user.action contient les règles que vous avez le "droit" de changer. Vous pouvez changer aussi les autres mais cela risque de vous créer plus de problèmes qu'autre chose. Par défaut il contient déjà plein d'exemples utiles.
Vous allez pouvoir ajouter ici, des règles et des alias. Une règle est la combinaison d'une ou plusieurs actions et est appliquée à une ou plusieurs URL. Pour la liste complète des actions que Privoxy propose, allez jeter un oeil ici.
Prenons un exemple et imagions que nous voulions supprimer l'envoi de tous les cookies sortant pour le site wwww.mauvais-site.fr. En langage privoxy cela nous donne :
{ +crunch-outgoing-cookies }
.mauvais-site.fr
Cette règle très simple va ajouter l'action "crunch-outgoing-cookies" (qui supprime les envois de cookies) à toutes les urls appartenant à .mauvais-site.fr. Le signe + indique que la directive doit être ajoutée aux autres règles. A l'inverse, si nous ajoutons :
{ -crunch-outgoing-cookies }
bonne-page.mauvais-site.fr
Toutes les pages du domaine mauvais-site.fr auront leur cookie mangé sauf bonne-page.mauvais-site.fr.
Vous pouvez des * dans les URL, par exemple ad*.site-de-pube.fr, ou même une expression régulière comme pour adBlock comme www[1-9a-ez].example.c*.
Vous pouvez aussi mettre plusieurs actions entre les accolades, soit sur une seule ligne en les séparant par des espaces, soit sur plusieurs lignes en ajoutant un \ à la fin de chaque ligne. Cela nous donne par exemple pour supprimer cookies entrant ET sortant:
{ +crunch-outgoing-cookies \
+crunch-incoming-cookies }
ad*.mauvais-site.fr
www[1-9a-ez].example.c*
Comme nous l'avons vu, il est possible de mettre plusieurs actions entre accolade. Il peut être alors pratique de pouvoir regrouper un ensemble d'actions sous un seul alias. Par exemple, si nous voulons regrouper la suppression de tous les cookies vue plus haut, nous ajouterions dans le fichier user.action :
{{alias}}
interdiction-cookies = +crunch-incoming-cookies +crunch-outgoing-cookies
autorisation-cookies = -crunch-incoming-cookies -crunch-outgoing-cookies
Une règle pour ajouter, une autre pour enlever, l'exemple parle de lui-même. Ainsi la règle sur "mauvais-site" pourrait s'écrire avec un de nos deux nouveaux alias :
{ interdiction-cookies }
.mauvais-site.fr
Par défaut dans user.action il y a deux alias très pratiques. Le premier shop va nous permettre d'assouplir les règles pour les rendre compatibles avec un site de commerce branlant. L'autre s'appelle fragile et permet de ne pas "casser" les sites souvent mal fichu. Si vous avez une boutique qui ne marche plus, ou un site fragile, vous pouvez alors ajouter :
{ shop }
www.boutique-branlante.fr
{ fragile }
www.site-mal-fichu.fr
Il est possible d'améliorer encore privoxy pour ne plus rien laisser passer ou presque. Au début vous allez observer ce que les sites font exactement en observant les logs de Privoxy. Et à chaque fois que vous voyez quelque chose de louche, vous pouvez ajouter une règle comportant l'action { +block } suivi à la ligne suivante de chaque url posant problèmes. Ce qui au final peut donner quelque chose comme cela :
définition des sites que l'on bloque gravementRetourner au sommaire
# ########################################################"
{ +block }
# Régies publicitaires/ Plate-formes d'annonce
.netavenir.com # http://www.netavenir.com/
.turn.com # http://www.turn.com/corp/how/how-it-works.jsp
.bluestreak.com # http://www.bluestreak.com/whowhat/index.asp
.criteo.com # http://www.criteo.com/en/bloggers.aspx
.blogbang.com/demo/js/blogbang_ad.php\?id= # http://www.blogbang.com/demo/
/.*\/microsoft_adcenterconversion\.js # Régie Microsoft
*.*.marketingsolutions.yahoo.com/* # Régie Yahoo
www.googleadservices.com/* # Régie Google
.fmpub.net # http://federatedmedia.net/whyadvertise/index
pubsrv.allopass.com/* # http://www.allopass.com/
.comclick.com # http://www.comclick.com/
.regieci.com # http://www.regieci.com/fr/accueil/index.asp
.allo-audience.fr # http://www.allo-audience.fr/
.audientia.net # http://www.audientia.net/new/fr/new/
.clickintext.com # http://www.clickintext.com/
.clickintext.net
.intellitxt.com
payperpost.com # http://payperpost.com/
# Les enregistreurs/relecteurs
.clicktale.* # http://www.clicktale.com/faq.html
cetrk.com/* # http://crazyegg.com/overview
*.robotreplay.com/* # http://www.robotreplay.com/
/.*/clickheat.js
# médiamêtrie/traçage
.estat.com # http://www.estat.com/service/services_form.html
.sitemeter.com # http://www.sitemeter.com/
.w3counter.com # http://www.w3counter.com/
.reinvigorate.net # http://report.reinvigorate.net/snoop
/.*\/webanalytics # http://france.webanalytics.be/
.opentracker.net # http://www.opentracker.net/index.jsp
.weborama.* # http://weborama.com/
.quantserve.com # http://www.quantcast.com/
.performancing.com # http://performancing.com/tracker
.ToutLeMondeEnBlogue.com # http://www.toutlemondeenblogue.com/index.aspx
stats.wordpress.com # http://www.wordpress.com
*.technorati.com/* # http://www.technorati.com
embed.technorati.com/linkcount #
/.*xiti.js # http://www.xiti.com/
*.getclicky.com/* # http://www.getclicky.com/help/
*.iminr.com/* # http://www.iminr.com/
.netprofitblueprint.com/* # http://www.netprofitblueprint.com/capture.html (assez opaque celui-la...)
.converdge.com # http://www.converdge.com/features
.cybermonitor.com
my.blogitexpress.com/.*\.js # http://www.blogitexpress.com/
www.atoomic.com/js/* # http://www.atoomic.com/
.clustrmaps.com/counter/*
.trackalyzer.com
log.tf1.fr
# Page ranking
www.free-pagerank.com/fcgi-bin/alive_js.fcgi.*
external.wikio.fr/blogs/top/getrank
www.pagerank.fr/pagerank-actuel.gif
# Loggers un peu trop traçeurs
.mybloglog.com # http://www.mybloglog.com/
# traçage des flux (feeds)
feedjit.com/* # http://feedjit.com/
# Spécial Google
/.*utm.js # variante d'urchin
/.*stat.*\.js # un filtrage générique
/.*\/urchin.js # variante d'urchin
/.*s_code.js # variate d'urchin
/.*google-analyticator.* # le plugin pour wordpress
# Nuisances
.snap.com/* # Charge les liens en tâche de fond pour en faire des vignettes. Sympa en soit mais pompe pas mal de resources.
.ixnp.com/*
.twitter.com/*
.webreseau.com # http://www.webreseau.com/fr/fonctionnement.asp
*.devfr.net/* # Pas identifié, si quelqu'un a une idée...
badge.facebook.com/badge/*
.blogbar.org
Le dernier bloc de cette liste ne sont pas des SpyWebs à proprement parler mais des "fonctions" qui me fatiguent car elles ralentissent l'affichage des pages. Donc si vous n'en voulez pas, libre à vous, tout ceci est à adapter à vos besoins.
Enfin, pour peaufiner encore notre couverture, nous avons allons ajouter deux règles biens pratiques. La première consiste à empêcher les sites de savoir d'où vous venez en lui faisant croire que vous venez toujours de chez eux (referrer). L'URL utilisé est ici le / ce qui veut dire "pour tous les sites".
{ +hide-referrer{forge} }
/Et puis, pour s'amuser un peu nous pouvons aussi maquiller l'identité de notre navigateur. Là, je vais faire croire que j'utilise un FireFox 4.1 sur un Oric Atmos
{ +hide-user-agent{Mozilla/5.0 (TV; U; Oric Atmos 6502c; en-US; rv:r91.6) Gecko/19870508 TranDOS Firefox/4.1} }
/Quelques mots sur l'interface WEB
Même s'il n'est pas bien pratique pour éditer la configuration, l'interface WEB est en revanche très efficace pour contrôler le proxy. Si vous tapez l'URL http://config.privoxy.org/. Vous avez la possibilité d'activer ou de désactiver le proxy (http://config.privoxy.org/toggle), de demander à privoxy d'afficher les règles qu'il aurait appliqué à une URL que vous saisissez à la main (http://config.privoxy.org/show-url-info) et enfin de visualiser et modifier la configuration ( http://config.privoxy.org/show-status ).
Cette dernière option offre cependant possibilité un peu cachée qui est de régler le niveau de sévérité du proxy. En effet, si sur la ligne default.action vous clickez sur Edit.Vous allez voir apparaître trois niveaux : Cautious (précautionneux), Medium et Advanced. Le premier offre un niveau de sécurité correcte mais laisse par exemple plus passer les cookies. C'est le mode par défaut qui ne "casse" aucun site marchand. Le dernier est un blocage quasi complet mais qui vous demande souvent d'ajouter un site marchand dans la section { shop } (cf plus haut). A chacun de voir en fonction de sa paranoïa, moi je suis sur Advanced
Passer Privoxy en mode \"transparent\"
Un Proxy transparent est un concept ultra-pratique permettant de ne pas configurer les navigateurs sur les machines clientes. Comment cela se passe ? Simplement en y déclarant que la passerelle internet n'est plus votre routeur, mais la machine privoxy. Ainsi, tout le traffic internet va être redirigé sur cette machine qui va ensuite, après filtrage, le rediriger sur internet. Du coup, sans que cela ne soit visible, toutes les machines du réseau utilisent de manière transparente privoxy et ce sans avoir à faire le moindre paramétrage.
Pour arriver à ce résultat, la première chose à faire est de modifier le fichier de configuration de privoxy /etc/privoxy/config et d'ajouter (ou modifier) la ligne accept-intercepted-requests 1.
Ensuite, il nous faut mettre en place le routage. Cela implique qu'iptables soit installé sur la machine privoxy
#! /bin/sh
filter="iptables -t filter"
nat="iptables -t nat"
$nat -F
$nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8118
$nat -A OUTPUT -m owner --uid-owner 96 -j ACCEPT
$nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-port 8118
$nat -L
$filter -L
echo 1 > /proc/sys/net/ipv4/ip_forwardscript d'activation du proxy transparentLa première règle a pour rôle de transférer tout le traffic entrant sur le port 80 de l'interface eth0, vers le port 8118, celui de privoxy. Cette ligne associée au echo 1 > /proc/sys/net/ipv4/ip_forward, permet à tout le réseau de bénéficier de privoxy, sous réserve de paramétrer chaque machine de sorte à utiliser notre serveur comme passerelle (gateway).
Les deux règles suivantes sont quant à elle chargée de faire la même chose, mais pour le serveur lui-même. En effet, dans ma nouvelle architecture, le serveur est aussi ma machine de travail, et j'aimerais donc bien profiter de privoxy. Le principe est le même que pour la première règle pour le traffic local, mais avec une exception faite pour le processus possédé par l'utilisateur 96, qui est celui de privoxy. Vérifiez donc quel utilisateur votre privoxy utilise pour remplacer 96 par l'UID qui va bien.
Après vous pouvez très salement ajouter ces commandes à la fin de /etc/rc.local ou, selon le fonctionnement de votre distribution, les poser dans le script dédiés à iptables.
Notre serveur transparent étant en place, il ne nous reste plus qu'à indiquer aux machines clients que la nouvelle passerelle (gatewaw) est la machine_privoxy. Cela peut se faire en configurant votre routeur, en dur sur les machines ou via votre serveur dhcp.
Enfin, si vous aviez configuré le proxy de votre navigateur, il est temps de supprimer ces réglages. Et lorsque c'est réalisé et que les machines clients ont renouvelées leur IP, vous pouvez vérifier que tout fonctionne et naviguant sur l'une d'entre elles tout en observant les logs sur la machine de privoxy.
Conclusion
Ce tutorial ne couvre pas toutes les possibilités de privoxy, loin de là. C'est une mise en jambe pour un outil indispensable qui même sans paramétrage offre une très bonne protection.
"L'offre légale ne se développera que si cesse le piratage"... Qui n'a pas entendu cette petite phrase contre laquelle il est si difficile de lutter. Personnellement j'ai toujours pensé que l'offre légale ne se développera que lorsqu'elle fournira un service de qualité, et il semblerait que ce n'est pas encore gagné.

Une offre légale de qualité, c'est donc au minimum la même chose que ce que nous avons déjà. Et pas, comme on tente vainement de nous le faire croire, celui de pouvoir télécharger dans la seconde un album au lieu d'attendre qu'il arrive par la poste ? La possession d'un album peut se temporiser quelques jours, c'est pas comme une envie de pisser !
Dans cette idée, l'offre légale actuelle est donc à mon sens de très mauvaise qualité car elle fournit des morceaux compressés à la sauvage, et donc de qualité inférieur à celle d'un CD vieux de 20 ans. En plus, on nous y colle des DRM, des saletés qui m'interdisent un tas de trucs, comme le fait de lire un album sous Linux (ce qui marche très bien avec mon vieux CD) ou de le prêter à un pote pour qu'il me le rende de sorte à le léguer à mon fils.
A cela certain vont (car m'ont déjà
m'argumenter que l'avenir, c'est de la musique en ligne avec tout accessible directement comme une gigantesque webradio et qu'avoir chacun sa propre musique est archaïque. A cela je réponds qu'on l'on ne mange déjà plus que le 1/4 de la variété alimentaire de nos grands parents, alors on aura l'air malin le jour où le Brel d'origine ne sera plus disponible car déjà (re)produit en 40 générations de gargouilleurs de la Star académie...
En bref, pour l'heure, le CD reste THE offre légale de qualité. C'était du moins ma position jusqu'à ce que je tombe sur Starzik. Un vaste choix d'albums, la possibilité d'acheter à la piste (ce qui est un plus par rapport à l'offre légale "CD"), énormément de morceaux sans DRM, une équipe qui semble sympa et dynamique, et cerise sur le gâteau, la possibilité de télécharger en FLAC. A vue de nez, comme ça, c'est un carton plein.
Seulement, triste est notre monde et comme toujours il y a un hic. En effet, la première piste d'essai que j'achète en FLAC ne sonne pas très loseless... Du coup j'achète une seconde piste, mais cette fois d'un album que je possède déjà au format CD, et que je viens justement d'encoder en FLAC. Et là, il n'y a pas photo, avec un bon casque y'a un truc qui coince.
Après quelque recherches je me rend compte que je n'étais pas le seul à avoir remarqué comme un souci. Alors pour en avoir le coeur net, je tente l'expérience. Je télécharge sur Starzik une version MP3 supplémentaire du même morceau, et je donne les 3 pistes (mon FLAC, celui de Starzik et leur MP3) en pâture à audacity pour obtenir un spectre de chacun d'entre eux. En voici le résultat.

En arrière plan, vous avez mon FLAC. En second plan, le FLAC de Starzic. Déjà là, on voit le problème, une perte sèche de tout ce qui se trouve au dessus de 18khz. Mais le plus "drôle", c'est la courbe en premier plan, qui se trouve être... le MP3 qui semble juste un peu dégradé par rapport à la courbe du FLAC de Starzic...
Alors bien évidement il ne s'agit pas de prendre le spectre comme argument qualité mais plus de s'en servir comme "signature" permettant de deviner quelle est la source de l'encodage FLAC. Ici on voit donc que ce n'est clairement pas le CD d'origine ou une source de meilleur qualité. La petite perte entre FLAC et MP3 semble quant à elle indiquer que cette origine n'est non plus pas le MP3, ce qui est heureux.
Si l'on se base sur cette réponse du forum de Starzik, le réalité est entre les deux. La source est variable d'un album à l'autre en fonction de ce qui est fournit par la maison de disque. Pour l'album qui m'a servi de test, l'encodage n'est pas indiqué et seul le bitrate l'est (192kbps). On peut donc seulement dire que la source est une compression avec perte pour un bitrate de 192kbps. Du coup pourquoi proposer du FLAC ? Starzik est en cheville avec les fournisseur de disque durs ? Car proposer le téléchargement de ce format est un non-sens puisque la qualité est la même qu'un MP3 de base, mais prenant 10 fois l'espace disque de ce dernier...
Cette offre légale n'apporte donc pas la même qualité qu'un classique CD (du moins pour le test que j'ai effectué) et perd du coup beaucoup de son attrait. Ceci étant dit, les prix concrètement inférieurs à l'offre légale "CD" peuvent continuer à me tenter sur le principe "moins bon mais moins cher" convenant assez bien à certains albums. Mais cet approche s'évapore assez vite lorsque l'on décortique les conditions générales de vente, et plus particulièrement l'article 10 :
En ce qui concerne les fichiers musicaux, la société Starzik rappelle qu'elle est seule titulaire du droit de diffusion de ces fichiers et que ceux ci sont protégés par les réglementations nationales et internationales en matière de droit d'auteur.
Et pour mieux éclaire cela
Le Client ne bénéficie quant à lui que d'un droit d'utilisation personnel de ces fichiers et limité aux informations fournies au moment de la sélection des fichiers musicaux et sketches, dans un cadre strictement privé et gratuit. (...)
Pour faire simple, avec l'offre légale "CD" aussi, l'usage est strictement privé et gratuit, et l'on ne dispose aussi, que d'un droit d'utilisation personnel. La grosse différence tient à ce que ce droit est lié à la possession du support dans le cas du CD, et il est lié à l'acte d'achat entre le fournisseur et son client dans le cas de starzik. Ainsi, si je peux donner mon CD, le prêter, le léguer ou encore le revendre, je ne peux rien faire de tel avec un morceau acheté ici...
Et dans la série des bonnes questions, que se passe t-il si Starzik disparaît du jour au lendemain ?
En conclusion, dans cette offre légale qui est à mon sens la plus performante sur le marché, j'achète pour un peu moins cher un album de qualité moindre qu'un CD et je n'ai pour cet album qu'un droit personnel d'utilisation. Avec l'offre légale "CD", je possède le support et j'ai un droit d'utilisation sur son contenu qui est de qualité optimum. A ce stade, malgré la petite différence de prix, le choix est assez vite fait...
Il y a fort à parier que Starzik n'est pour rien dans cet état de fait (ils pourraient juste éviter de faire du FLAC sans intérêt et trompeur) qui doit, je l'imagine bien, être imposé par les maisons de disque. Mais me concernant, l'offre légale "CD" reste de loin celle qui présente les meilleurs critères de qualité. Je vais donc continuer à puiser dans le marché d'occasion pour y récupérer mes "antiques" galettes numériques