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.

Oauth, WordPress & Twitter

Le truc qui tombe à point. Genre on  se promet de tenir un blog de manière sérieuse. Genre on cherche des sujets sympathiques, déjà pour soit, mais également qui le seraient assez pour intéresser d’autres personnes. Et genre paf !

En effet, lors de la mise à jour des composants de ce misérable journal, il a fallu s’occuper également des plugins qui l’accompagnent. L’un deux, WP to Twitter, s’est parfaitement mis à jour mais m’a gratifié d’un joli message d’erreur lors de ses infructueux essais de connexion à mon compte.

De mon temps …

Avant le changement de méthode d’autorisation dans Twitter, il était fréquent d’avoir à fournir ses identifiants Twitter aux applications tierces que l’on souhaitait utiliser pour manipuler son compte. Renseigner son nom d’utilisateur et son mot de passe pour chacune de ces applications, sans vraiment faire attention à ce qu’elle pouvait en faire, n’était pas très malin. Et lors d’un changement de mot de passe, il était impératif de le renseigner à nouveau partout. Assez pénible.

Les gars de chez Twitter, n’étant pas des gamins du matin, ont décidé d’imposer l’utilisation de OAuth, un produit de leur cru, utilisé lors des interactions avec leur API et leurs comptes. En gros, un système d’autorisation ouvert, permettant à des applications tierces de manipuler vos données sans connaître un caractère de vos identifiants. OAuth est à la délégation d’accès ce qu’OpenID est à la délégation d’authentification. Ça vaut vraiment la peine de se documenter sur le sujet tant c’est intéressant.

Bref, ça n’existait pas avant, grâce aux petites mains de Twitter, c’est un protocole plutôt bien foutu, qui complète à merveille OpenID.

Tout ça pour ça ?

Le problème, avec WP to Twitter et OAuth ? En fait aucun. Une fois jeté un coup d’oeil dans le source du plugin, parcouru la documentation et les specs de OAuth, bah on sait plus quoi faire pour que ça fonctionne. Ce satané message d’erreur PHP:

Fatal error: Class ‘OAuthSignatureMethod_HMAC_SHA1’ not found

me brise toujours les gonades. Le paquet PECL OAuth est bien installé, dans sa dernière version stable, et PHP le charge parfaitement.

PHP étant un interpréteur magnifique permettant un debug aisé, simple et efficace, je m’arme de mon print() et hop, me voilà … pas avancé du tout. Au passage, ceux qui aimeraient me parler de xdebug ou de trucs du genre, je les invite courtoisement à continuer à faire du PHP dans leur petit coin sans ouvrir leur clapet. Je hais ce langage.

En dernier recours, je décide de dégager un contrôle sur la classe OAuthException, dans le fichier OAuth.php du plugin, histoire de voir ce que ça donne. C’est à dire enlever:

if (!class_exists('OAuthException')) {}

Et là bim ! Tout fonctionne. Mais ça me dit pas pourquoi ça merde. Pas plus de réussite en manipulant la classe OAuthException. Laissant de côté ce souci pour mettre à jour le plugin d’un autre blog hébergé sur un autre serveur, je me rend compte que le problème n’existe pas. Pas besoin de changer une seule ligne de code. Quelques tests plus tard, le fautif apparait, au final, très standard: PHP.

En effet, PHP, en version 5.2.14 accompagné du package PECL oauth en version 1.0.0 merdoit complètement. Dans d’autre version non.

PHP: je te conchie…

Revival

Les billets ont été rares, le temps alloué pour le blog ayant été à 0 durant ces huit mois. Je ne sais pas comment font les plus assidus pour mettre régulièrement à jour leur journal. A mon avis, ils ne travaillent pas et n’ont pas de vie sexuelle.

Dernièrement, les plages horaires me permettant de mon plonger dans la technique se sont “libérées”, je recommence donc à y mettre les doigts (oui c’est dégueulasse). Une petite mise à jour du WordPress, un rafraîchissement du thème et on relance la machine.

Pêle-mêle: la série iPhone-mon-amour sera complétée, et même peut-être accompagnée de sa version RoastBeef. J’ai également quelques projets en tête, à partager, tel ce truc-qui-casse-des-culs dont ce Monsieur m’a parlé, ou bien nous discuterons de filesystem et autre joyeusetés. Je continuerai également de mettre en ligne quelques recettes, uniquement en Français. De toutes façons, les Rouquins n’aimeraient pas. Je m’essaierai, peut être, à une ou deux thématiques différentes de la bouffe et du minusque, suivant l’envie et, toujours, le temps.

Voilà, c’est dit. Yaka.

Lean Manufacturing au CTDEC

Au Centre Technique de l’Industrie du Décolletage, la dernière réalisation de mon frangin est en place.

En effet, l’atelier-école de lean manufacturing est opérationnel. Et vu la hauteur d’investissement du JB, c’est pas rien.

Pour ceux qui souhaitent découvrir ce qu’est le lean manufacturing, ils peuvent se tourner vers la page Wikipedia dédiée à cette explication. La page en langue de Shakespeare est plus complète.

Je vous ai gardé pour la fin la vidéo explicative du CTDEC, sur laquelle on voit mon frère, dont je ne suis pas peu fier !

Edit: Malheureusement, la vidéo a été supprimée.

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.

Bouton Download

Histoire d’en faire la promotion, et surtout parce que je compte l’utiliser, l’ami r3m1 a mis au point un petit plugin WordPress qui affiche un joli bouton pour télécharger de la mie.

Alors on hésite pas : http://www.absurde.org/blog/2010/02/15/creer-un-plugin-wordpress-pour-ajouter-un-bouton-download-dans-les-posts#more-327

Pâté aux pommes de terre

Le pâté aux pommes de terre est plat typique du Bourbonnais. Sa réalisation est extrêmement simple: des ingrédients simples et peu onéreux, une réalisation rapide.

Ingrédients:

  • des pommes de terre
  • de la pâte feuilletée, ou brisée selon le goût. Prévoir une surface équivalente à deux tartes.
  • du persil
  • de l’ail
  • 50cl, au moins, de crème fraiche épaisse
  • sel, poivre

Préparation:

Après avoir épluché les pommes de terre, les couper en rondelles peu epaisses, 3-4 mm tout au plus et les rincer. Bien les sécher dans un torchon afin d’enlever toute l’humidité.

Hacher le persil et l’ail grossièrement.

Dans une tôle à tarte, placer un morceau de papier sulfurisé pour y déposer la première surface de pâte. La piquer pour éviter sa déformation durant la cuisson. Mettre directement l’ail haché sur le fond.

Les pommes de terre peuvent alors être déposées, une couche après l’autre, en prenant soin de bien poivrer chacune des couches et de saler uniquement quelques couches, suivant les goûts. Ajouter également une grosse pincée de persil.

Une fois atteinte une hauteur appréciable de pommes de terre, prendre la seconde surface de pâte et la déposer délicatement par dessus le dôme. Souder délicatement et soigneusement les deux pâtes afin de rendre le pâté étanche.

Placer le tout au four (chaleur tournante, c’est mieux), à 180°C, pendant 50 minutes / 1heure. Plonger la pointe d’un couteau afin de vérifier la cuisson.

Sortir le pâté du four. Découper soigneusement la pâte autour du dôme et enlever le chapeau ainsi formé.

Déposer délicatement et progressivement la crème fraîche sur les pommes de terre encore très chaudes. Bien répartir la crème épaisse et reposer le chapeau de pâte.

Enfourner à nouveau le pâté quelques minutes, four éteint, afin que la crème se faufile un chemin et que l’ensemble reprenne un peu de température.

Servir les parts du pâté avec un peu de salade verte.

[Les photos viendront dans un second temps]