Archive for the ‘ GNU/Linux ’ Category

Nginx, VirtualHosts SSL & IPv6

Serveur HTTP haute performance et reverse proxy multi-usage, Nginx a été écrit par Igor Sysoev pour les besoins de rambler.ru. Après s’être essayé au développement de modules Apache (voir la section russe de son site), le gars Igor a sorti cet OVNI, redoutable dans la mise à disposition de fichiers statiques, entre autres (le module de streaming déchire pas mal également).

Il faut savoir qu’un Kazakh émigré à Moscou, quand il n’a plus de vodka et qu’il a sucé tous les rinces doigts, il passe à l’antigel. Pas la collection 2012 de chez Lise Charmel hein, mais bien le dégivrant utilisé sur l’aéroport de la capitale russe. Cela se ressent  de temps à autre sur la documentation du projet. Ou alors peut-être devrais-je arrêter le Picon…

Pas mal cet ensemble en tulle multibrins non ?

La majorité des visiteurs masculins étant partis mater des photos de nénettes en deux pièces, continuons avec les assidus et ceux qui sont déjà revenus, apprenant que “tulle” était masculin.  Quoi qu’il en soit, je me suis emmêlé les pinceaux dans les directives pour disposer d’un daemon fonctionnel, servant des name-based virtualhosts, SSL ou non, IPv6 ou non. J’ai fini par repartir à zéro, après m’être tapé des message d’erreurs comme:

nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:443 failed (98: Address already in use)

ou encore

nginx: [emerg] duplicate listen options for [::]:80 in ...
nginx: [emerg] duplicate listen options for [::]:443 in  ...

Une précision tout de même: je pars du principe que l’OS sous-jacent est un GNU/Linux, que le kernel a été paramétré afin que les sockets AF_INET6 écoutent en v4 et V6 (voir section 3.7 du RFC3493). Grossièrement un coup de sysctl pour mettre net.ipv6.bindv6only à 0 (man 7 ipv6).

On a tous notre petit bloc server qui s’occupe de tout ce qui n’est pas prévu par les virtualhosts. Et bien il suffit de se servir des paramètres ipv6only et default_server de la directive listen comme suit:

server {
    listen 80 default_server;
    listen [::]:80 ipv6only=on default_server;
    server_name blah.domain.tld;
  ...
}

Nginx écoute maintenant sur le port 80, en IPv4 et en IPv6. La même chose pour le SSL:

server {
    listen 443 ssl default_server;
    listen [::]:443 ipv6only=on ssl default_server;
    server_name blah.domain.tld;
  ...
}

Et ça roule pour le port 443. Il n’est absolument pas obligatoire de disposer de deux blocs distincts, le tout pouvant parfaitement être regroupé:

server {
    listen 80 default_server;
    listen 443 ssl default_server;
    listen [::]:80 default_server;
    listen [::]:443 ipv6only=on ssl default_server;
    server_name blah.domain.tld;
  ...
}

Les name-based virtualhosts seront plus simplement configurés, sans fioritures:

server {
    listen 80;
    listen [::]:80;
    server_name vh1.domain.tld;
  ...
}
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name vh1.domain.tld;
  ...
}

ou en un seul bloc:

server {
    listen 80;
    listen 443 ssl;
    listen [::]:80;
    listen [::]:443 ssl;
    server_name vh2.domain.tld;
  ...
}

Les virtualhosts ci-dessus sont donc accessibles en IPv6 et v4, sur les ports 80 et 443, SSL activé sur ce dernier.

RTFM !

Au final, rien d’impressionnant: une fois la documentation des paramètres ipv6only et default_server potassée, ça va mieux. Au final, elle est plutôt bien foutue cette doc !

Maudit Picon.

iPhone sur Debian – Part 1

Je côtoie quotidiennement, et je n’ai pas honte de le dire, des utilisateurs de Ubuntu. Autant le préciser de suite: aucune vanne récurrente ne fuse dans le bureau, aucune remarque déplacée, une ambiance somme toute très respectueuse.

Personnellement, je n’ai pas de problème de souris qui arrête de fonctionner (“rhaaa mais qu’est-ce qui brouille le signal bluetooth  ?!?”), de raccourcis-claviers qui disparaissent (“mon Ctrl-K ne fonctionne plus …”),  ou encore de daemon de gestion de son qui fait ce qui lui plait (“rhaaa mais ! pourquoi c’est cette carte qui est sélectionnée par défaut ?!??”). Je regrette de ne pouvoir m’extasier sur l’ensemble de pouick-pouicks clignotants des bureaux Ubuntu annonçant fièrement “Votre batterie est en fin de vie”, ou bien encore voir la photo haute résolution de l’imprimante que j’installe.

Finition au poignet

Bref, j’utilise un système rétrograde, qui ne fournit pas le Flash, dont le bureau est en noir et blanc, sur lequel je compile un noyau dès que je veux créer un répertoire: Debian GNU/Linux

J’essaie tout de même de rester dans la modernité car je dispose d’un iPhone, fourni par mon employeur. Jusqu’à maintenant, j’utilisais une machine virtuelle pour exécuter iTunes, me permettant d’effectuer les mises à jour du petit monstre et de l’alimenter en musique numérique acquise parfaitement légalement. L’appareil n’est pas “jailbreaké”, pour des raisons de garantie. J’en ai déjà pété deux et je n’ai pas envie de jouer avec Apple (oui, c’est pas solide).

J’en suis arrivé à un stade où la VM me les brise menu, surtout pour le transfert de fichiers musicaux. En gros il me fallait quelque chose qui me permette de

  • monter ce téléphone propriétaire construit par des petites mains d’enfants,
  • effectuer des manipulations de fichiers,
  • démonter proprement.

Mais je n’aime pas attendre une fonctionnalité qui apparaîtra au bon vouloir d’un éditeur, quand il l’aura décidé, ou lorsqu’il trouvera cela pertinent. Plusieurs projets existent, et s’ils ont l’air de parfaitement fonctionner avec un iPod, il semble que l’iPhone reste leur bête noire.

Un certain Héctor Martín Cantero, dont les doigts ne sont pas dans un certain orifice, nous gratifie d’un bon petit projet: usbmuxd. Recette qu’ il faudra assaisonner avec du libiphone/libimobiledevice de Matt Colyer.

Bon, c’est quoi le merdier ?

Lorsqu’on branche le smartphone directement, sans préparation de l’OS, on obtient évidemment un message émanant du kernel nous informant qu’un nouveau matériel est branché:

usb 2-3: new high speed USB device using ehci_hcd and address 2
usb 2-3: New USB device found, idVendor=05ac, idProduct=1292
usb 2-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 2-3: Product: iPhone
usb 2-3: Manufacturer: Apple Inc.
usb 2-3: SerialNumber: ici_le_numero_de_serie_de_la_bête
usb 2-3: configuration #1 chosen from 4 choices

Et c’est tout.

C’est sans compter sur les informations se trouvant sur http://wikee.iphwn.org/.

iPhone Linux Stack

Le tout repose bien évidemment sur la libusb.

En s’intéressant en particulier aux communications de l’iPhone, on apprend que ce smartphone communique au travers d’un “multiplexeur USB”. Grossièrement un bout de soft qui permet de parler TCP, sur USB, pour échanger des messages avec l’aïfaune.  Et justement, le usbmuxd du Marcan, c’est un ensemble deamon/proxy qui permet ces échanges. Un bon gros travail de reverse engineering.

Sauf qu’il faut savoir le comprendre et quoi lui dire, au bestiau. C’est là qu”intervient libimobiledevice, anciennement libiphone. Cette bibliothèque permet de parler correctement le protocole propriétaire, peu châtié, des appareils Apple de la trempe iPhone, Ipod Touch et iPad. Grâce à elle, on a accès au système de fichiers, aux paramètres, aux applications installées, bref, à tout ce qui se trouve dans ces machines.

C’est donc sur cette lib que repose le magnifique ifuse ou le bakend afc du vomitif gvfs. Pour le reste, on verra plus tard.

Hey dis donc Jamy ! Ca fonctionne en vrai ?

Bah oui Fred. Je te montre, mais après tu me laisses tranquille, j’ai des trucs à faire avec la petite voix.

Avant tout, il faut que tu saisisses que l’ensemble de l’installation suivante est faite sur une Debian GNU/Linux testing, avec de l’apt-pinning pour sid et experimental.

L’installation du package usbmuxd:

filthy:~# apt-get install usbmuxd
Paramétrage de libusbmuxd1 (1.0.3-1) ...
Paramétrage de usbmuxd (1.0.3-1) ...

nous donne deux binaires: le daemon usbmuxd, le multiplexeur, et la commande iproxy, interface au daemon. Comme les choses sont bien faites, on dispose également d’un fichier de règles pour udev, prévues pour exécuter le daemon lorsqu’un smartphone à base de pomme est branché:

usbmux  31488  0.0  0.0  18576   880 ?     S<  23:11   0:00 /usr/sbin/usbmuxd -u -U

Ceux qui ont un appareil jailbreaké peuvent d’ores et déjà jouer avec la commande iproxy.

Pour les autres, continuons avec l’installation de la libimobiledevice:

filthy:~# apt-get install libimobiledevice1 libimobiledevice-utils
Paramétrage de libplist1 (1.2-3) ...
Paramétrage de libimobiledevice1 (1.0.0-1) ...
Paramétrage de libimobiledevice-utils (1.0.0-1) ...

La libplist1 permet l’accès aux formats binaires et XML ‘made in Apple’.

Ceux qui disposent d’un iPhone avec un OS d’origine peuvent désormais manipuler un peu. En effet, libimobiledevice-utils installe quelques binaires illustrant les accès aux informations contenues dans le téléphone:

arapaho@filthy:~$ ideviceinfo
BuildVersion: 7E18
CPUArchitecture: armv6
DeviceClass: iPhone
DeviceName: Hustler
FirmwareVersion: iBoot-636.66.33
HardwareModel: N82AP
HostAttached: true
ModelNumber: MB489
PasswordProtected: false
ProductType: iPhone1,2
ProductVersion: 3.1.3
ProductionSOC: true
ProtocolVersion: 2
RegionInfo: FD/A
SBLockdownEverRegisteredKey: true
SIMStatus: kCTSIMSupportSIMStatusReady
SomebodySetTimeZone: true
TimeIntervalSince1970: 1270055897
TimeZone: Europe/Paris
TimeZoneOffsetFromUTC: 7200.000000
TrustedHostAttached: true
UniqueChipID: 2569498033525
Uses24HourClock: true
iTunesHasConnected: true

Volontairement, je n’ai pas mis l’intégralité de l’output de la commande. Il peut être assez important et contient des informations sensibles sur le téléphone et la vie privée. Il est possible de passer en paramètre (-q), à ideviceinfo, le domaine de recherche que l’on souhaite. La documentation est présente dans le package, il suffit de la lire.

On a également accès à une sorte de syslog peu verbeux avec idevicesyslog,  ou bien encore effectuer une sauvegarde avec idevicebackup. Bref, tout cela pour se rendre compte que ça fonctionne pas mal.

Il nous reste à monter le système de fichier, en installant dans cet objectif iFuse:

filthy:~# apt-get install -t sid ifuse
Paramétrage de ifuse (1.0.0-1) ...

Un point de montage créé plus tard, et hop tout roule:

arapaho@filthy:~$ mkdir ~/iphone
arapaho@filthy:~$ ifuse ~/iphone/
arapaho@filthy:~$ mount
[...snip...]
ifuse on /home/arapaho/iphone type fuse.ifuse (rw,nosuid,nodev,user=arapaho)
arapaho@filthy:~$ df -TH
Sys. de fich. Type      Tail.  Occ.  Disp. %Occ. Monté sur
[...snip...]
ifuse   fuse.ifuse     7,6G   497M   7,1G   7% /home/arapaho/iphone

Maintenant, on commence à respirer. On entrevoit facilement que se libérer de l’immonde iTunes, au combien lourd et lent, au combien propriétaire et fermé, est tout à fait possible. Tout en gardant un iPhone sous garantie, sans jailbreak. C’est donc tout naturellement que nous pouvons remercier les auteurs des différentes briques utilisées ici.

Dans une seconde partie, j’aborderai les aspects pratiques de la manipulation quotidienne de ces smartphones: transfert de musique, sauvegarde, etc …

A noter que cette méthode pour accéder aux iPhone est disponible depuis un bout de temps, et que plusieurs personnes l’utilisent quotidiennement, sans avoir besoin d’attendre que l’éditeur de leur distribution décide de ce qui est bon pour eux ou pas. Je me réjouis d’avance sur les exclamations de mes camarades qui, une fois leur distribution magique upgradée rapidement et sans heurts, brancheront leur iPhone et s’exclameront: “Woa, trop bien sa mère Ubuntu ! Je vois mon iPhone !”. Ce sera à la fin du mois.