Ma configuration PC

Je me suis dit que ça serait pas mal de partager ma configuration PC. Elle est assez puissante, tout en évitant de faire un trou profond dans le budget. En effet elle me permet de jouer aux jeux AAA, mais je n’ai pas succombé à la tentation du haut de gamme cliquant de partout avec les processeurs overclockable, les cartes mères à 300 boules et le watercooling.

Voici les critères que j’ai retenu pour définir les composants :

  • une conf « gamer »
  • une conf développeur/sysadmin, c’est à dire avec la capacité de faire tourner des VM, Visual Studio, un serveur SQL et quelques (dizaines) d’onglets Chrome, le tout en même temps
  • une configuration relativement silencieuse
  • un port série pour communiquer avec mon routeur (le petit APU de chez PC Engines)
  • je ne suis pas pété de tune, on tire le maximum avec le minimum
  • j’utilise mon pc, je ne l’admire pas, donc osef que le boitier ou l’intérieur soit racé et à clignoter dans tous les sens (genre tavu !)

Cela donne à peu près ceci :

  • un processeur Intel i7-6700 (318€)
    • pour le gaming, un i5-6600 suffit largement, mais la gamme i7 a l’hyper-threading en plus, soit 8 fils d’exécution simultanés, ce qui n’est pas du tout désagréable dans le contexte de faire tourner des VM ou pour l’exécution de tâches parallélisées
    • Je n’ai pas pris le -K, le surcoût ne me tentait pas pour grappiller un peu en fréquence et avoir le privilège d’overcloacker, surtout lorsque le ratio gain en perf / consommation est défavorable.
    • Quitte à prendre un processeur, autant prendre la dernière gamme, donc Skylake pour ma part car les soldes n’existent pas chez Intel
  • une carte mère Asrock H170 Pro4S (90€).
    • C’était la moins chère avec un chipset H170 et disponible
    • J’aurais pu prendre la version M, qui est plus petite, mais j’utilise un port série sur carte pci-express 1x. La carte mère dispose d’un connecteur série, il faut juste acheter le port pour le racker, donc j’aurais vraiment pu prendre la version M
    • La gamme Hxxx me semble être le meilleur compromis me permettant de disposer d’un chipset bien fourni (6 ports SATA 3, des ports USB) et reste extrêmement abordable. En comparaison la gamme Zxxx, réservée au haut de gamme est très cher, et à moins de faire de l’overcloacking, donc couplé à un processeur -K ou du dual GPU, elle est clairement overkill, y compris pour du gaming
    • la carte est équipée d’un port Ethernet de marque Intel, ce qui est un vrais plus par rapport à des puces Realtek. Je déconseille fortement les puces Atheros en revanche, qu’on trouve encore parfois dans du haut de gamme ! Elles et leur pilotes ne sont pas fiables du tout et provoquent des BSOD.
    • Autre avantage, fournit par le chipset plus que par la carte, est l’apport du TPM 2.0, servant notamment à chiffrer ses partitions (avec Bitlocker pour Windows) sans la nécessiter de brancher une clef USB où le secret est extractible. Avec le TPM, le secret contenu dedans n’est pas extractible
  • 16Go de RAM (84€)
    • Avec Paragon et Mafia 3, je crains que 32Go soit bientôt requis pour mon genre de conf, mais pour le moment 16Go en 2x8Go c’est bien en prenant le soin de recycler Chrome de temps en temps
    • N’importe quelle marque suffira (on est d’accord que no-name, ce n’est pas une marque), pour ma part c’est des Kingston HyperX DDR4-2133
    • Outre la marque pour avoir des barrettes fiables, on fera attention à la fréquence de la barrette, qui pour éviter de gaspiller des cycles CPUs, devrait être aligné avec ce que supporte le processeur au max, ici 2133MT/s, comme indiqué par Intel dans leur base produit.
  • une MSI GTX 1060 6G pour l’aspect graphique (330€)
    • Je ne suis pas sur que les 6Go de RAM soient bien utile… mais mes jeux marchent bien avec 🙂 J’avoue avoir craqué là-dessus. J’apprécie la faible consommation énergétique de cette génération de puce nVidia en comparaison de AMD ou des précédentes puces nVidia, et donc la plus faible élévation de température de la puce
    • C’est du nVidia, donc elle sert aussi de carte CUDA, ce qui peut avoir un certain intérêt pour des calculs hautement parallélisés type calculs de hash. C’est mon petit plus car je ne m’en sert pas souvent.
    • J’ai pris la MSI parce qu’elle rentrait dans mon boitier (point non négligeable) et pour ses deux ventilateurs thermorégulés, par rapport à la carte de nVidia qui n’en possède qu’un. En pleine séance de jeu, les deux ventilateurs soufflent à fond et se font bien entendre, en avoir deux n’est pas de trop pour diminuer leur vitesse et donc le bruit généré !
  • un SSD 850 EVO 250Go de Samsung (100€)
    • C’est ce qui se fait de mieux pour le grand public. Cette gamme dispose également d’un chiffrement matériel qui peut se coupler avec Bitlocker, afin de pouvoir chiffrer le disque sans recourir au CPU
  • un ventirad Noctua NH-U12S (72€)
    • des ventilateurs noctua en 12cm pour aérer le boitier : 2 à l’avant et 2 à l’arrière afin d’avoir un flux propre d’avant vers l’arrière.
    • ce sont les seuls pour lesquels une vraie R&D a été mené pour optimiser leur ventilateur, cela se voit tout de suite en observant les pales en comparaison d’un ventilateur d’une autre marque. Ils sont assez coûteux mais fiable en plus d’être efficace.
    • il n’est pas essentiel si on overclock pas son processeur et que le boitier est proprement ventilé mais il permettra certainement de gagner quelques dB de silence.
  • un boitier Cooler Master Silencio 550 (82€)
    • Ca date un peu, il s’agit de mon boitier de mon ancienne-ancienne config. Si je devais le changer, je me tournerais plutôt vers les Fractal Design je pense. J’avais pris ce boitier pour son silence, je reste un peu sur ma faim concernant ce point, en particulier sur les vibrations dûes aux disques durs
    • Dans le cas d’une carte mère m-ATX, un Cooler Master Silencio 352 me parait pas mal du tout
  • de la récup de mon ancienne configuration, à savoir
    • des ventilateurs noctua. Ils sont moches, noctua a des goûts étrange en matière de couleur, mais il n’y a pas mieux sur le marché car ils sont efficaces au point de rarement les entendre. Il existe plusieurs variantes à utiliser en fonction de la pression à exercer (les ventilateurs à coller sur le radiateur processeur ont un profil différent et donc un comportement et une nuisance sonore différente de ceux à utiliser à l’avant ou à l’arrière du boitier)
    • des disques durs pour stocker le reste (jeux, téléchargements, vidéos…)
    • ma vénérable alimentation Seasonic S12 500W. Vénérable, mais solide. Pour l’anecdocte, un bon paquet de bonnes voire très bonnes alimentations sont en réalité des Seasonic en marque blanche.

Soit une belle configuration à tout de même 1076€.

Configuration Gamer

Pour une configuration juste gamer (je n’ai pas dit gamer riche et stupide !), je changerais les composants ainsi :

Evidemment, il ne sert à rien de refaire une conf entière et on pourra très bien faire des semi-upgrades (juste la carte graphique, ou le triplet proco/mobo/ram), moins chers et je trouve plus durable car on change la pièce qui souffre au besoin. Le boitier par exemple ne nécessite pas d’être changer à chaque nouvelle mise à jour de la carte mère.

Différence entre H170 et Z170 ?

Fonctionnellement, les cartes mères d’aujourd’hui sont très peu innovantes. En effet la plupart des constructeurs, et pour l’ensemble de leur gamme (ici Intel), se contentent de construire leur carte mère autour d’un socket processeur avec ses étages d’alimentation, d’un chipset Intel et d’une puce Realtek pour le son. Tout le reste, à savoir les ports internes, externes, les composants soudés ne sont que de la plomberies sans réelle intelligence. Je fais le passe sur le micro-programme (le programme d’initialisation qu’on appelle abusivement BIOS) où il est vrai il y a un peu de travail de la part du constructeur.

z170-platform

On observe sur les schémas des chipsets et des processeurs, qu’en fait l’ensemble la quasi totalité des connections internes ou externes sont directement mappées à l’un ou l’autre composant. Cela signifie que la carte mère est un simple support physique et solide pour que toutes la connectiques ne se cassent pas la gueule. L’ensemble des autres composants servent alors pour l’essentiel à assurer les bonnes tensions / ampérage pour que le tout fonctionne.

Ainsi lorsqu’on parle d’une carte mère H170 ou Z170, on entend par là une carte mère avec un chipset H170 ou Z170, donc pour processeur Intel de la génération Skylake. Intel s’est fait une spécialité de sortir un nouveau chipset avec chaque nouvelle génération de processeur pratiquement depuis les premiers Core iX. Bien évidemment une génération de chipset n’est compatible qu’avec une génération de processeur, de sorte à ce que changer de processeur signifie presque obligatoirement changer de chipset (en plus du socket d’ailleurs), donc de carte mère. Cool hein 🙂

Les différentes entre ces deux chipsets sont mis en évidence sur le Wikipedia et le moins que l’on puisse dire est la faible différence entre les deux. Le Z170 :

  • troque 2 ports USB2 pour avoir 2 ports USB3 supplémentaires
  • bénéficie de plus de lignes PCI Express (4 pour être exact)
  • permet de déverrouiller le multiplier CPU, donc de pousser au niveau de l’overcloacking

Au niveau du seul chipset, je vois deux cas d’usages qui pourraient justifier l’acquisition d’une carte mère précieuse équipée d’un Z170 :

  • le SLI afin de profiter d’une meilleure bande passante sur les deux cartes graphiques
  • avoir plusieurs ports PCI Express 16x (juste le support, le mapping n’est pas 16x)
  • l’overcloacking

Les constructeurs ont voulu pousser ces deux aspects en customisant d’avantage les cartes mères équipées de chipsets de la gamme Z, c’est sur ce genre de produits que nous pourrons trouver :

  • un contrôleur SATA et/ou USB supplémentaire pour disposer d’encore plus de ports SATA et/ou USB
  • un contrôleur Ethernet supplémentaire, le chipset d’Intel n’en gérant qu’un seul, pour passer à 2 ports Ethernet sur la carte
  • du wifi intégré, généralement sous la forme d’une mini-carte PCI-Express comme sur les portables
  • un contrôleur PCI Express afin de faire du SLI sur deux cartes en vrai 2*16 ou sur 3, voire 4 cartes.
  • de boutons et d’un panneau de LED directement sur la carte pour faciliter l’overcloacking
  • du design, des loupiottes ou du plastique tout autour de la carte pour la « protéger ». Bref du marketing pure à ce niveau là

Cela explique en parti l’aspect premium de la gamme Zxxx, l’autre partie étant de faire raquer au maximum les joueurs qui sont prêt à mettre cher dans du matériel qui, honnêtement, servira peu (je parle des surplus exclusifs à la gamme Zxxx) 😀 Un peu comme conseiller de prendre une alim 1000W pour du mono-GPU quoi.

Une bonne carte mère

Avec l’expérience, une bonne carte mère devra à mon sens respecter les critères suivants :

  • avoir les bon ports à l’arrière, notamment ports vidéos dans le cas d’un usage bureautique. Pour ma part c’est HDMI et DVI-D au minimum. Ca parait con mais ce détail peut se révéler fort gênant s’il est impossible de brancher son écran dessus
  • avoir des condensateurs de qualité, sachant que c’est la première cause de mortalité d’un équipement électronique
  • pour ceux qui peuvent déjà s’offrir ce genre de SSD, avoir un port NVMe (un vrai c’est à dire sur un bus mappé en PCI Express et non en SATA)
  • être équipé du chipset qui vous convient (H170, Z170, B170, Q170…) avec donc le nombre de ports USB2/USB3 et SATA désiré

On s’aperçoit avec ces critères qu’une carte « bon marché », c’est à dire aux alentours de 100€ répond parfaitement à ces critères et n’est absolument pas bridé pour du gaming (hors VR probablement)

Le reste, c’est du bonus du genre :

  • les emplacements des ports PCI Express. Cela est néanmoins un critère primordial lorsqu’on souhaite faire du SLI, mais ce n’est pas très compatible avec un PC ayant un bon rapport qualité/prix
  • les boutons power/reset sur la carte mère
  • des leds
  • un indicateur précisant la phase de boot
  • la couleur de la carte
  • les dissipateurs thermiques, en général ils ne sont pas mal, donc inutile d’en chercher des spécifiques

Bien choisir son boitier

Outre le design qui est comme les goûts et les couleurs, un bon boitier devrait respecter les critères suivants :

  • être en aluminium car c’est plus léger et conduit mieux la chaleur que l’acier. On évitera les boîtiers en plastique (oui ça existe XD) qui ont une conduction thermique assez mauvaise, en plus d’être fragile
  • posséder quelques centimètres de battement à l’arrière de la carte mère afin de pouvoir y faire passer un maximum de câble. En effet moins de câble devant la carte mère permet une aération plus efficace, donc des ventilateurs qui tournent plus lentement, donc qui font moins de bruits. CQFD
  • l’aération devra se faire d’avant en arrière. L’air frais rentre par l’avant et ressort à l’arrière. Le boitier devra donc permettre à l’air de rentrer, sous la forme de petites fentes sur les côtés à l’avant du boitier. Il ne doit pas y avoir d’ouverture ou de ventilateurs sur les côtés.
  • Pour le cas de la ventilation haute, il y a deux points :
    • cela empêche d’utiliser le haut du pc comme tablette d’appoint
    • il serait désirable de pouvoir la bloquer, afin de forcer un débit d’avant arrière et ainsi s’assurer que le ventirad soit correctement ventilé. On notera au passage que cela donne une bonne indication de la manière de l’orienter si celui-ci est de type tour.
  • permettre l’installation de ventilateurs 120mm ou 140mm, à hauteur de 1 à l’avant et 1 à l’arrière au minimum. Ceux-ci sont de taille suffisamment grande pour permettre un bon débit sans nécessiter de les faire tourner à fond (ce qui est générateur de nuisances sonores)
  • en bonus pour les maisons poussiéreuses : posséder des filtres au niveau des grilles de ventilation afin de capturer la poussière et permettre un nettoyage plus aisé
Format En passant

A chaque fois j’oublie le paramètre me permettant de cloner un dépôt git en ignorant les vérifications du certificat serveur, lorsqu’on se connecte en HTTP. Je mets donc ici la bonne commande, afin de pouvoir la retrouver facilement :p

git clone --bare -c http.sslVerify=false https://server-git/project-group/project-name.git

 

Revue : Obduction, le successeur spirituel de Myst

Ca y est, je peux enfin jouer à Obduction 🙂 Pas que je ne l’avais pas avant, mais j’ai du changer de carte graphique pour pouvoir réellement en profiter !

Alors avant d’entrer dans le vif du sujet, Obduction c’est quoi ? C’est le dernier né du studio Cyan Inc, ceux qui sont à l’origine de Myst et Riven, deux références dans le genre du puzzle gaming. Obduction s’est concrétisé avec une campagne Kickstarter qui a démarré en octobre 2013, pour une sortie fin août 2016. On pourra dire qu’il s’est bien fait attendre, surtout qu’il a été plusieurs fois retardé. Mais c’est de loin préférable à sortir publiquement et au prix fort un jeu pas fini et buggé de partout (;) E.A.).

Mal de mer dans le désert

Mes premières séances ont été assez mitigées, en raison d’un mal de mer qui arrivait assez rapidement et devenait insoutenable au bout d’une heure seulement de jeu, m’obligeant à interrompre plusieurs heures le temps d’avoir de nouveau les yeux en face des trous. Il y a dans les paramètres graphiques une option nommée « FoV » ou Field of Vision ou champs de vision en français. Ce paramètres, responsable de l’angle de vue horizontale (jusqu’où on peut voir de part et d’autre de l’écran) était fort mal positionné et était la cause de mon malaise.

On l’appelle le motion sickness en anglais et du au fait que le cerveau voit un mouvement mais qui ne colle pas avec l’oreille interne qui ne le perçoit pas (le mouvement). C’est assez symptomatique des écrans PC car du fait de leur proximité, ils recouvrent une grande partie de notre champs de vision. Nofrag explique cela très bien, mais ce qu’il faut retenir pour éviter une séance de vomito est que sur un écran 16/9, on réglera le FoV à 102°.

It’s over 9000 !

Toujours sur la partie graphique, on relève une consommation extrêmement important de la mémoire vive par le jeu. J’ai atteint lors d’une séance 8Go de RAM intégralement bouffé par le jeu. C’est énorme ! Heureusement que j’ai une bécane à 16Go (pour les machines virtuelles). Peut-être que le jeu se comporte à la façon Linux et consomme autant qu’il peut tant qu’il y en a puis relâche la RAM si on lui met la pression ? Que neni mon ami, au bout d’un moment j’ai la fenêtre d’avertissement de Windows me suppliant de fermer une application, suivi un peu plus tard d’un force close du jeu.

Les contrôles

On dispose de plusieurs manières de se déplacer dans le jeu, avec la manette ou avec le couple clavier/souris, en vue libre (style FPS) ou en se déplaçant de nœud en nœud (à la manière de Riven ou Myst 3). En bon excellent joueur, j’ai naturellement choisi le combo clavier-souris mais (et là c’est totalement con, mais alors totalement) il est impossible de changer la configuration des touches au clavier. Le clavier est donc mappé pour un joueur américain (clavier qwerty) et droitier. Je suis ni l’un, ni l’autre. On peut contourner le problème du qwerty en passant à un clavier International sous Windows, mais n’empêche que ne pas avoir laissé la possibilité de modifier les touches… ça me laisse sans voix.

Pour ce qui est d’être gaucher, le jeu propose d’utiliser les touches fléchées mais le mapping est différent. Pour les droitiers, Q et D permettent de se déplacer sur la gauche et sur la droite respectivement, pour les gauchers, les flèches permettent de regarder sur la gauche ou sur la droite. Je n’ai pas compris cette différence de traitement discrimination mais ce n’est vraiment pas pratique, à croire que les gauchers sont détestés chez Cyan…

C’est de l’art

Le jeu suit la même patte graphique que Firewatch ou Team Fortress 2, c’est à dire réaliste-cartoon. C’est pas dégueulasse même si j’aurais préféré miser sur un rendu beaucoup plus photo-réaliste, comme Riven ou Myst 5 en leur temps. Ca aurait dépoté ce jeu avec un rendu Crysis non ?

L’effet visuel lors d’un voyage avec une graine est tout simplement dégueulasse. Sans compter que ce genre d’effet est horrible à gérer par le GPU car chaque point de couleur est géré de manière individuel et on est loin de la norme à ce propos. Je n’ai pas ressenti de ralentissement parce que GTX 1060 oblige, mais il y a pas mal de GPU plus modestes qui ne vont pas apprécier…

Un autre point négatif sont les vidéos incrustées. Sauf celles concernant C.W. lorsqu’il est enfermé dans sa cave, toutes les vidéos sont fortement parasitées avec un filtre de type mauvaise réception TV avec signal analogique. Je me demande si cela n’a pas à voir avec l’incrustation elle-même car mon plus gros reproche concerne les vidéos de C.W.. L’incrustation est juste immonde… Pondre un truc comme ça aujourd’hui… c’est moche, très moche, en particulier au niveau des cheveux.

Vidéo de C.W. incrustée dans le jeu
Vidéo de C.W. incrustée dans le jeu

En revanche, la gestion de la modélisation 3D au niveau des racines, et plus spécifiquement lors du passage d’une racine à une autre en passant par le « couloir » m’a complètement bluffée. Je ne comprends absolument pas comment cela a été codé, mais pour le coup, c’est totalement magique 🙂

Sous l'arbre, devant l'espace - Obduction
Sous l’arbre, devant l’espace – Obduction
De l'autre côté du miroir - Obduction
De l’autre côté du miroir – Obduction
Changer de monde est aussi simple que passer une porte - Obduction
Changer de monde est aussi simple que passer une porte – Obduction
Où est passé le chemin ? - Obduction
Où est passé le chemin ? – Obduction

Les énigmes

Comme je l’ai annoncé, pas de spoil (enfin aussi peu que possible), donc je ne rentrerais pas dans le détail mais cela n’est pas nécessaire de toute façon. Le jeu commence comme tous les Myst, le joueur est transporté dans un monde avec sa propre physique et son histoire propre; et est totalement livré à lui-même. De manière générale, les énigmes sont sans être limpides, pas très difficiles. On évitera néanmoins de faire des séances nocturnes car il faut tout de même prendre le soin de ne pas oublier les indices inutilisables sur le moment pour éviter de se retrouver bloquer. Le jeu se termine en une petite quinzaine d’heures, qui passent très vite.

On est loin de l’énigmes des billes de Riven à placer dans le dôme dorée. Obduction nous offre des portes bloquées de l’autre côté, des manivelles, des interrupteurs, quelques livres et c’est à peu près tout. On passe le plus clair de son temps à faire une balade forcée d’un bout à l’autre de l’univers parce que ce que nous propose Cyan est grand ! Cela devient ennuyant lorsque l’on sait ce qu’il faut faire et ce que cela nécessite en terme de course à pied. Oui joueur, tu vas courir, et même battre le record de Usain !

Le déroulement est également très linéaire. Le monde est ouvert et on se baladera souvent un peu partout lorsqu’on ne sait pas quoi faire, mais il n’existe souvent qu’un seul enchaînement d’action permettant de débloquer une nouvelle zone. On remarque ce manque de liberté qui est surtout présent tout au long du jeu mis à part lorsqu’il devient possible d’avancer dans la jungle où on dispose alors de deux enchaînement au lieu d’un. Wahouu !

J’aurais relevé un curieux défaut scénaristique qui est l’accès au bleeder. De temps en temps, l’accès se débloque petit à petit, presque magiquement. Il n’y a absolument personne mais des wagons se mettent à disparaître. Et tout d’un coup, lorsque C.W. en fait mention, l’accès est miraculeusement ouvert. Le problème de cet accès est qu’un aller prématuré au bleeder ruine le jeu car il déclenche les cinématiques de fin.

Conclusion

Ce jeu m’a assez bien plu mais en vétéran de Riven, je reste sur ma faim. Les graphismes sont cartoons, ce qui permet de lisser le manque de détails et les énigmes sont relativement simple, mis à part le 406 (non, je ne dirais pas ce que c’est), ce jeu se fait assez directement.

Jouer au jeu

Perte du wifi récurrent sur Netgear N750

J’ai chez moi un router wifi faisant uniquement office de borne d’accès wifi. C’est un Netgear N750 (ou DGND4000 pour les intimes) et on ne peut pas dire qu’il soit génial. Sur la porteuse à 2.4GHz, il fait son taff mais sur la porteuse à 5GHz, à moins d’être le nez en face, on a un signal aussi faible qu’inutile. Mais on pourrait dire que c’est du détail tant ça marche, non ?

En effet cette bouse ne fonctionne tout simplement plus au bout d’un moment. Ce moment est assez variable mais l’on peut considérer que c’est une fois par semaine environ. Les symptômes sont qu’on est bien identifié sur l’un des deux réseaux Wifi (celui à 2.4GHz ou l’autre à 5GHz), mais qu’on a rien sur la couche IP. Ayant analysé un peu ce qu’il se passait, je devine que la box, pour une raison qui m’échappe, a sa table d’adresses MAC pleine, ce qui empêche les nouveaux arrivant d’avoir une connectivité IP.

La box Wifi qui lave plus blanc que blanc

Juste pour bien recadrer, c’est le genre de box qui sait tout faire: DHCP, DNS, point d’accès Wifi, firewall, modem ADSL, Wifi « invité », contrôle parental, VPN et même NAS en lui collant un disque en USB.
Sur toute cette panoplie de fonctionnalités, il n’y en a qu’une seule qui m’intéresse et que j’ai donc activé, c’est le point d’accès Wifi. Tu achètes une box spécialisée Wifi, qui ne fait que ça, et elle n’est même pas fichu de faire le taff correctement, c’est vraiment gonflant. D’autant plus que le problème n’est pas matériel, mais bien logiciel, donc solvable par une simple mise à jour du firmware, que j’attends toujours.

A côté, mon routeur/firewall/proxy/dhcp/dns/dpi full open-source (oui, même le BIOS est open-source) Linux se porte comme un charme, lui…

Fuck you Netgear !

Le plombier à la rescousse

Pour restaurer le wifi, il y a deux solutions :

  • le reset (éteindre/allumer, pas une remise en usine avec clear de la mémoire hein)
  • la reconfiguration du wifi via les pages d’admin que j’ai trouvé un peu par hasard

La première solution étant un peu difficile à automatiser, je me suis concentré sur la seconde pour cracher un script que je ferais exécuter par cron par mon routeur disons… toutes les heures.

Pour se faire, rien de plus simple. J’ai analysé un peu comment était foutu le formulaire HTML.
C’est un formulaire tout bidon, sur lequel on a cependant un petit token servant de anti-forgery sur l’action du formulaire.

Pour rappel, un anti-forgery token sert à empêcher de rejouer un formulaire, et donc de pouvoir modifier la configuration du routeur au travers d’une attaque de type XSS par exemple. Cela force à faire la manipulation de manière interactive (du moins en théorie XD…)

Le script devra donc envoyer non pas un appel au routeur mais deux :

  • le premier appel sert à afficher la page et ainsi pouvoir récupérer le token (lequel dépend du temps)
  • le second appel est le POST pour reconfigurer le wifi, et il incorporera le token obtenu précédemment

Le navigateur du moment est Chrome, et celui-ci permet de récupérer tous les appels effectués sous la forme de commande curl, ce qui est bien pratique pour notre cas et ce qui explique pourquoi il y a tout un tas d’en-têtes HTTP totalement inutiles. J’ai donc fait générer ces commandes par Chrome puis adapté légèrement là où il fallait.

Note: ce script ne peut pas marcher chez vous tel quel, car il appliquera ma configuration. Vous devez modifier l’argument –data  dans le script.

Note 2: il faudra vous arranger pour que ce script s’exécute régulièrement. Tout le monde n’a pas de routeur custom comme moi, mais il existe plein d’autre solutions, les tâches planifiées de Windows par exemple.

#!/bin/bash

ip=192.168.3.3
user=admin
pass=password
auth=$( echo -n "${user}:${pass}" | base64 )

TOKEN=$( curl "http://$ip/setup.cgi?next_file=WLG_wireless_2.htm" \
        -H "Authorization: Basic $auth" \
        -H 'DNT: 1' -H 'Accept-Encoding: gzip, deflate, sdch' \
        -H 'Accept-Language: en,en-US;q=0.8,fr-FR;q=0.6,fr;q=0.4' \
        -H 'Upgrade-Insecure-Requests: 1' \
        -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36' \
        -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' \
        -H 'Cache-Control: max-age=0' \
        -H "Referer: http://$ip/WLG_wireless_2.htm&todo=cfg_init" \
        -H 'Connection: keep-alive' \
        --compressed 2> /dev/null | grep action= | gawk 'match($0, /setup\.cgi\?id\=([0-9a-f]{8})"/, ary) { print ary[1] }' )

curl "http://$ip/setup.cgi?id=$TOKEN" \
        -H "Origin: http://$ip" \
        -H 'Accept-Encoding: gzip, deflate' \
        -H 'Accept-Language: en,en-US;q=0.8,fr-FR;q=0.6,fr;q=0.4' \
        -H 'Upgrade-Insecure-Requests: 1' \
        -H "Authorization: Basic $auth" \
        -H 'Content-Type: application/x-www-form-urlencoded' \
        -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' \
        -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36' \
        -H 'Cache-Control: max-age=0' \
        -H "Referer: http://$ip/WLG_wireless_2.htm&todo=cfg_init" \
        -H 'Connection: keep-alive' \
        -H 'DNT: 1' \
        --data 'h_WRegion=Europe&h_ssid_class=primary&tempSetting=0&tempRegion=11&setRegion=11&h_wds_enable=disable&h_wds_enable_an=disable&only_mode=0&show_wps_alert=0&h_enable_ap=enable&h_enable_ap_an=enable&h_ssid_bc=&h_ssid_bc_an=&h_allow_access=disable&h_allow_access_an=disable&h_wire_iso=&h_wire_iso_an=&ssid=Kveer-2G&ssid_an=Kveer-5G&h_w_channel=8&h_w_channel_an=36&h_opmode=300&h_opmode_an=300&h_security_type=WPA2-PSK&h_security_type_an=WPA2-PSK&h_wepenc=0&h_wepenc_an=0&h_wpae_mode=3&h_wpae_mode_an=3&radius_rekey_secs=3600&radius_rekey_secs_an=3600&radiusServer=&radiusServer_an=&textWpaeRadiusPort=1812&textWpaeRadiusPort_an=1812&textWpaeRadiusSecret=&textWpaeRadiusSecret_an=&KEY1=&KEY1_an=&KEY2=&KEY2_an=&KEY3=&KEY3_an=&KEY4=&KEY4_an=&h_wep_key_no=1&h_wep_key_no_an=1&h_authAlgm=3&h_authAlgm_an=3&passphrase=tralala&passphrase_an=tralala&h_ssidSelect=1&h_ssidSelect_an=1&todo=save&load_2g_frame=WLG_2g_wireless2.htm&load_5g_frame=WLG_5g_wireless2.htm&this_file=WLG_wireless_2.htm&next_file=WLG_wireless_2.htm&SID=&Apply=Apply&WRegion=Europe' \
        --compressed

Récupérer son –data

Je suis gentil, je vais vous montrer comment adapter ce script à votre sauce. Mais vous vous démerdez pour le faire exécuter.

  • On commence donc avec Chrome et l’on va sur la page d’accueil du routeur.
  • On ouvre ensuite les outils de développements avec la touche F12, puis on se rend sur l’onglet Network.
  • Dans l’onglet Network des Developer Tools, on clique sur Network, puis on coche Preserve log et All.
  • Sur la page web, on clique sur Apply.
  • De retour dans l’onglet Network, il doit y avoir une ligne, la première normalement, intitulée setup.cgi?id=… et ça doit être le seul de type x-www-form-urlencoded.
  • On fait alors un clic droit puis Copy as cURL (bash) et voilà comment obtenir le second curl du script avec les –data de votre wifi.

Revue : The Eyes of Ara, Myst-like or shit-like ?

Introduction

Garantie spoil-free 🙂

The Eyes of Ara est un jeu qui s’est financé de manière participative via la plateforme Kickstarter en juin 2015. Le développement aura duré 1 an. Les développeurs le décrivent comme je cite

An immersive Adventure-Puzzle game riddled with hidden secrets. Inspired by classics like Myst, with an emphasis on environmental storytelling

Deux autres jeux du même genre sont prévues pour cette année : Obduction et Quern. Le premier est réalisé par Cyan, ceux qui ont fait Myst et Riven. Le second qui est plus indépendant, à l’image the The Eyes of Ara. Au passage, ces trois projets ont tous été financés via Kickstarter. Il est dommage que ce genre de jeux soit trop rare (face à la bouse FIFA, NHL, Battlefield qu’on nous sert chaque année) et je suis donc impatient d’y jouer.

Il faut cependant distinguer deux types de jeux qui sont à mon sens très différents. Nous avons d’un côté les puzzle-like, et d’un autre côté les myst-like. On peut considérer que les myst-like sont des puzzle-like, mais certainement pas l’inverse. Ce qui avait fait le succès de Myst (et encore plus pour Riven) était notamment sa grande immersion avec des graphismes soignés et une bande son collant parfaitement à la fois à l’univers mais également propice à la résolution des puzzles proposés par le jeu. Ainsi les myst-like mettent l’accent sur l’univers, alors que les puzzle-like sont juste une suite d’énigmes à résoudre et peuvent reléguer au second plan le background. Qu’en est-il pour The Eyes of Ara ?

la réalisation

Le jeu est graphiquement agréable… et fluide, ce qui n’était vraiment pas gagné avec ma vieille Radeon R7 250, celle-ci étant aux abois lorsque j’ai lancé Obduction (j’en ferais une revue cet automne). Il n’est pas sublime pour autant mais le niveau de finesse des textures est tout à fait convenable pour un jeu 2016. On notera cependant une faiblesse du côté de l’anti-aliasing, qui brille par son absence (ou son extrême faiblesse) sans que cela soit gênant outre mesure. Les décors sont assez bien détaillés mais les textures pèchent par leur faible résolution. C’est le petit plus qui aurait été bien apprécié pour un jeu de cette classe.

Le joueur évolue dans un univers entièrement en 3D. Les développeurs ont fait le choix d’utiliser le moteur Unity, lequel offre ainsi tout un set d’outils permettant la réalisation assez rapide d’un univers agréable à l’œil et avec la gestion de la profondeur et des reflets (puisque 3D). Il est possible, avec la souris, de regarder tout autour de soi, à 360° et également en l’air, mais les déplacements se font en revanche par point & clic, évitant au joueur de regarder là où il ne faut pas.

L’histoire

Le joueur commence dans une barque et mis à part une lettre se trouvant dans sa valise décrivant la mission qui lui a été affecté, il est dans le flou le plus total sur ce qu’il se passe dans ce château. La prise en main est facile et l’on commence avec des énigmes tout aussi faciles. Assez rapidement cependant, on s’aperçoit qu’il y a deux types de puzzles :

  • les énigmes à la Myst où on a une machine à configurer proprement
  • des objets à trouver, disséminés dans tout le jeu. Certains étant particulièrement difficile compte tenu qu’ils se fondent parfaitement dans le décors. Cela permettant de débloquer des succès

Globalement, le niveau des énigmes est facile. Il y en a quelques-unes assez corsées bloquant donc la continuation mais elles ne sont pas nombreuses. Il faudra atteindre la seconde moitié du jeu avant de les rencontrer.
Si l’on réussit à ne pas être bloqué trop longtemps par ces énigmes, la durée de vie est d’une dizaine d’heures.

Promesse tenue ?

Je ne vais pas tourner autour du pot, ce jeu est décevant.

Les objets à trouver ne servent absolument pas l’histoire. Cela semble une manière peu coûteuse d’ajouter artificiellement du temps de jeu. Pour tout trouver, le joueur sera obligé de passer la souris sur tout l’écran afin de trouver la fichue pièce manquante. C’est juste chiant. Heureusement cela n’est pas obligatoire mais à quoi bon avoir implémenté ce genre de trucs puisque ça ne sert à rien ?!

Quant aux énigmes, elles n’ont pour la plupart strictement aucun sens. Elles sont juste là pour faire chier le joueur dans sa progression et j’ai énormément de mal à voir en quoi elles s’inscrivent dans la trame scénaristique. Cette trame est d’ailleurs assez légère pour justifier la présence des portes bloquées. Je distinguais en préambule la différence entre un puzzle-game, dans sa définition la plus générale, et un myst-like. Contrairement à ce que le développeur annonce, ce jeu n’est PAS un myst-like. A mes yeux, ça serais plus un Mystères du temps++, ou un √(myst).

Bien que j’ai passé pas mal de temps aux toilettes, je ne le classerai pas dans la catégorie déchet. Mais si vous n’avez rien de mieux à faire pendant un week-end : Jouer à The Eyes or Ara

PS : oui, j’a fini le jeu à 100%, et même un peu plus avec les secrets réservés au backers.

git 4 windows avec un certificat SSL non-reconnu

Une histoire de magasin

J’ai de temps en temps besoin d’utiliser git en ligne de commande lorsque le GUI, en l’occurrence Visual Studio, ne suffit pas. Mais dans ce cas, la ligne de commande peut refuser de faire un pull ou un push si le dépôt git commun est accessible via HTTPS et qu’il utilise un certificat interne. C’est à dire que le certificat présenté par le serveur n’est pas auto-signé, mais signé par une autorité de certification non reconnue, comme c’est souvent le cas en entreprise (la vente de certificat n’est rien de plus qu’une grosse arnaque).

Ce problème existe aussi pour les autres outils graphiques qui sont basés sur git for windows, comme l’excellent TortoiseGit.

On est alors confronté au soucis suivant : même si Windows, Visual Studio, Internet Explorer ou Chrome reconnaissent ce certificat, ce n’est pas le cas de git en ligne de commande sous Windows. La raison est que le magasin des certificats racines n’est pas le même. Ce problème avec git n’existe pas sous un système *NIX. Cela arrive typiquement dans les cas suivants :

  • le navigateur est Firefox
  • l’application est écrite en Java
  • l’application embarque mingw ou similaire

Chacune de ces applications ou runtime utilisent leur propre magasin de certificat, ce qui explique qu’une négociation SSL qui passe sous VStudio ne passe plus avec git.

Faire marcher git en SSL avec un certificat interne

J’indique dans ce billet comment ajouter un certificat racine pour git 4 windows. La commande est extrêmement simple, mais la difficulté a résidé à savoir quel est le fichier à modifier. En effet, si l’on regarde le packaging de git, on peut voir des certificats trainer un peu partout, ce n’est pas très propre:

  • ~/usr/ssl/certs/ca-bundle.crt
  • ~/usr/ssl/certs/ca-bundle.trust.crt
  • ~/usr/ssl/cert.pem
  • ~/etc/pki/ca-trust/extracted/java/cacerts
  • ~/etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt
  • ~/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
  • ~/mingw64/etc/pki/ca-trust/extracted/java/cacerts
  • ~/mingw64/etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt
  • ~/mingw64/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
  • ~/mingw64/share/pki/ca-trust-source/ca-bundle.trust.crt
  • ~/mingw64/ssl/cert.pem
  • ~/mingw64/ssl/certs/ca-bundle.crt
  • ~/mingw64/ssl/certs/ca-bundle.trust.crt

Alors lequel est-ce ? Et bien c’est l’avant dernier.

Une fois qu’on l’a identifié, la manipulation est enfantine : il suffit d’éditer ce fichier et de lui coller tous les certificats racines supplémentaires au format PEM, comme le fait cette commande avec un shell type bash :

cat ca.crt >> /c/Program\ Files/Git/mingw64/ssl/certs/ca-bundle.crt

Cette manipulation sera à refaire après chaque mise à jour de git for windows.

Il existe un paramètre permettant d’indiquer à l’outil en ligne de commande de ne pas vérifier le certificat du serveur. Cela n’est pas du tout équivalent à ma solution en ce sens que ma solution permet bien d’authentifier le serveur, et que cette solution, si elle fonctionne pour git, ne fonctionne pas forcément pour les outils basés sur git comme TortoiseGit.

Revue: Dreamfall Chapters Redux

 Attention : spoilers !

 

Ça y est, le cinquième et dernier volet de Dreamfall Chapters, intitulé Redux, est enfin sorti hier. Après 5 long mois d’attente, nous allons enfin avoir la conclusion de Dreamfall Chapters, et cela clôturera également l’arc The Longest Journey, commencé en 1999.

5 mois d’attente, cela représente pas mal de temps et je m’attendais donc en toute logique à un bon gros chapitre, au moins aussi épais que les précédents et bourré de révélations car c’est qu’on s’en posait des questions. Je dois dire également que le teaser sorti quelques semaines avant avait encore plus attisé mon impatience.

Sitôt disponible, je le récupère donc et commence à jour une petite heure samedi. Les développeurs ont pensé à mettre un récapitulatif de TLJ et Dreamfall afin de se remettre en bain. C’est bien vu car au vu de l’interruption forcée depuis le Book 4, je n’étais plus vraiment au fait de l’histoire, des personnages ou même de leur nom.

durée de vie du chapitre

Le Book 5 commence, on retrouve Zöé dans une chambre qui émerge de son coma et l’éditeur nous propose en introduction une énigme un chouya plus coriace qu’à l’habitude car elle contient une séquence (effectuer une action A pour déverrouiller l’énigme B en étant dans la même pièce, ce qui nécessite d’interagir avec le décor surtout après ce fameux déclencheur A).

Une petite heure passe, la vie IRL me rattrape et je reprends le jeu le lendemain une petite heure. La fin.
Oui, le Book 5 n’a duré en tout et pour tout que 2 heures, et sans pousser pourtant. Je suis très déçu par ce dernier volet et pas uniquement sur la durée de vie. il n’y avait que très peu d’énigmes, voir pire très peu de moment interactif : j’ai eu l’impression de passer plus de temps à regarder une vidéo animé qu’à contrôler les personnages. Les cinématiques s »enchaînaient les unes derrières les autres, nous révélant et nous expliquant qui est le grand méchant loup. J’ai eu des doutes sur son identité, notamment dans la tour d’Abnaxus, mais j’ai choisi de faire confiance, à tort ^^.

des questions, toujours

La seconde raison de ma déception vient de ces révélations. Pour moi, ce chapitre est un sabotage, les explications s’enchaînent sans qu’on ai eu à les chercher, je les trouve complètement expédiées, et beaucoup de questions demeurent malgré cela :

  • Comment Brian arrive à mettre la main sur le sceptre ?
  • Brian contrôle le Undreaming (le cas au début) ou bien est-ce le Undreaming qui le contrôle (lorsque Westhouse arrive à Stark) ? Brian arrive à expulser le Undreaming de son corps dans la pierre âme mais arrive à conserver des pouvoirs magiques ?
  • Crow est mort, mais en fait non ?
  • Pourquoi Brian se téléporte à Stark lorsque le Undreaming retourne en lui ? Le simple fait qu’il se trouve au centre du vortex me semble assez léger.
  • Comment est née l’alliance entre Brian et Helena ? La timeline ne tient pas, Brian provenant du Stark du 20ième siècle, alors que l’histoire se déroule dans le Stark du 22ième siècle. Il a fallu donc traverser le Divide pour qu’Héléna puisse prendre contact avec Westhouse.
  • Pourquoi le Undreaming a-t-il voulu s’échapper du Storytime, il s’emmerdait ?
  • Qu’est-il advenu de la Mère Utana ? Pourquoi souhaite-t-elle continuer la purge des êtres magiques alors même que la machine est définitivement hors service et que le prophète n’est plus ?
  • Comment s’est déroulé le voyage de Kian, Saga et Likho à Sadir ? Ont-ils éliminé la mère Utana en lui donnant une gross baffe comme il se devait ? Il y avait vraiment matière à développer se passage qui est jeté comme on balance un os à un chien.
  • Brian est le bad boy de l’histoire, mais ses motivations ne collent pas. Revenir chez lui n’est vraiment pas synonyme de détruire toute magie ni de réunir Stark et Arcadia.
  • Brian libère Klaks pour qu’il lui conçoive la grande calculatrice, mais on a pu voir Klaks dans le ghetto magique vendre des potions. Je pense qu’il avait mieux à faire. L’hypothèse de Klaks dans le ghetto servant sa couverture me semble farfelue et dangereux pour Klaks.
  • La relation entre Saga et April est flou. Où Saga a-t-elle pris connaissance des prophéties, des histoires ? Où est-elle allé après avoir quitté la maison entre les mondes ? Comme elle le dit dans le jeu, elle est vraiment en mode cheat-code (style iddt et idkfa)
  • Qui demande à dead-Crow de montrer les révélations à Zöe ?

Le passage dans storytime avec Crow et Zöe me rappelle d’ailleurs le dernier volet de Life is Strange où le même principe a été utilisé pour balancer un tas de révélations et expédier la fin. Justement c’est trop expédié, je n’y vois aucune finesse et donne une impression de travail baclé.

Trop d’interrogations demeurent et voilà pourquoi je trouve à cette conclusion et à la façon dont elle a été raconté un goût amer. Dommage car j’ai bien apprécié les 4 premiers chapitres.

Contrôler les LEDs de l’APU (PC Engines)

Depuis 2 ans déjà, j’utilise pour mon accès à Internet personnel non pas une de ces box merdiques, moches, bancales (hello Freebox v6), obscures (black box) et pleines de vide (coucou Freebox v6) mais un APU de PC Engines. C’est une carte mère disposant d’un processeur intégré AMD à architecture amd64, 3 ports Ethernet et 3 leds accessibles via GPIO, donc grosso-modo un mini-pc à consommation très réduite. Ce truc est génial.

Par défaut la première LED indique simplement si le routeur est alimenté ou non et les deux autres leds sont éteintes. Je me suis enfin décidé à me pencher dessus afin de m’en servir pour afficher des indicateurs plus utiles tels que la charge réseau ou la charge cpu.

Le noyau Linux, actuellement en version 4.4.3 au moment où j’écris ces lignes, ne dispose pas de pilotes LED ou GPIO permettant d’accéder à ces LEDS depuis le user-space. Cependant Daduke a développé un petit module linux pour combler ce petit manque.

Après une correction mineure sur les sources, probablement du à une évolution des interfaces du noyau depuis, le module compile bien, se charge bien et permet bien d’accéder aux leds. Ceux-ci sont rendus accessibles par le kernel au userspace dans le dossier /sys/class/leds/.

Une fois que les leds sont accessibles, il suffit de les contrôler manuellement en envoyant 0 ou 255 à /sys/class/leds/{your_led}/brightness  comme suit :

# switch off the first led
echo 0 > /sys/class/leds/apu\:1/brightness

# swich on the first led
echo 255 > /sys/class/leds/apu\:1/brightness

Il est également possible d’utiliser un déclencheur géré directement par le kernel, ce qui est bien plus efficace que d’utiliser un processus en user-space si le trigger existe déjà dans le kernel :

# list available triggers on the first led
# the current trigger is in brackets
cat /sys/class/leds/apu\:1/trigger

# set the trigger heartbeat on the first led
echo heartbeat > /sys/class/leds/apu\:1/trigger

Génération du package Gentoo

L’écriture du package se découpe en 3 parties :

  • le fichier Makefile (ou Makefile.am)
  • le fichier ebuild
  • enfin le mode de génération du Makefile (statique ou via configure)

Maintenant que l’on a bien vérifié que ça marche, il est temps de packager afin de faciliter les mises à jour du noyau et éviter de crasser le système avec un vieux make install en dehors de tout contrôle du système de packages de la distribution.

Tout d’abord le Makefile : doit-on l’écrire, doit-on passer par automake, aclocal, autoscan, autoconf, tous ces outils ensembles ? Je n’ai pu trouver qu’un seul how-to sur Internet indiquant comment créer un configure en charge de générer le Makefile pour un module kernel utilisant ces outils, qui pour rappels, permettent entre autre de procéder à un certain nombre de vérification sur le système, la présence de librairies, et générer un Makefile compatible avec le système.
Le tutoriel ne fonctionne pas, indiquant à autoconf une instruction non reconnue.
Vu que tout ces outils semblent un peu trop usine à gaz, je décide de laisser tomber pour le moment et de me contenter du Makefile d’origine.

Ensuite c’est l’écriture de l’ebuild. Celui-ci n’a pas été trop difficile, la documentation des eclass étant plutôt complète et il existe des ebuilds sur lequel on peut s’appuyer comme net-firewall/ipset ou net-firewall/xtables-addons. Cela donne l’ebuild qui suit (cet ebuild compile 2 modules et non un seul, qu’on va voir dans la section suivante) :

# Copyright 1999-2016 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

EAPI=5
inherit autotools linux-info linux-mod

DESCRIPTION="Kernel modules to access to leds on the apu motherboard"
HOMEPAGE="https://blog.kveer.fr"
SRC_URI=""

LICENSE="GPL-2"
SLOT="0"
KEYWORDS="amd64"
IUSE=""

DEPEND=""
RDEPEND="${DEPEND}"

MODULE_NAMES='leds-apu(kernel/drivers/leds) apu-btn-gpio(kernel/drivers/gpio)'

pkg_setup() {
    kernel_is -lt 4 3 3 && die "${PN} requires kernel greater than 4.3.3."

    CONFIG_CHECK='LEDS_CLASS MODULES'
    ERROR_LEDS_CLASS='leds-apu requires LEDS_CLASS support in your kernel.'
    ERROR_MODULES='Nonmodular kernel detected. Build modular kernel.'

    linux-mod_pkg_setup
}

src_unpack() {
    mkdir "$S"
    cp "${FILESDIR}"/* "${S}/"
}

src_compile() {
    set_arch_to_kernel
    #KERNEL_DIR=$KERNEL_DIR emake
    BUILD_PARAMS="KERNEL_DIR=$KERNEL_DIR CONFIG_DEBUG_SECTION_MISMATCH=y" linux-mod_src_compile
}

src_install() {
    BUILD_PARAMS="KERNEL_DIR=$KERNEL_DIR" linux-mod_src_install
}

On peut maintenant revenir au Makefile. J’ai trouvé une bonne référence indiquant comment fonctionne les scripts de compilation du kernel et comment de fait écrire un Makefile. Le problème rencontré avec le Makefile de Daduke est qu’il n’est capable de compiler qu’un seul module, or j’en avais deux. Cela m’a amené à créer deux fichiers:

  • un Makefile qui est extrêmement simple, se contentant de passer la main au makefile du noyau Linux
  • un Kbuild qui contient la liste des modules et les fichiers nécessaires à la compilation de chacun des modules
PWD = $(shell pwd)
KDIR = $(KERNEL_DIR)

modules module:
        $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

install: $(MODULE)
        $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules_install

clean:
        $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean
obj-m := leds-apu.o apu-btn-gpio.o
leds-apu.y := leds-apu.c
apu-btn-gpio.y := apu-btn-gpio.c

Configurer les LEDs de l’apu

J’ai configuré mes leds comme suit:

  • la première led indique la charge CPU du routeur. J’utilise pour cela le module heartbeat, qui fait clignoter la led. La fréquence de clignotement est proportionnelle à la charge CPU (plus le routeur travaille, plus ça clognote vite)
  • la seconde led clignote pour tout paquet arrivant de l’interface wan
  • la dernière led clignote pour tout paquet arrivant de l’interface lan et sortant sur le net

Je paramètre les leds au démarrage du routeur avec ce petit script :

#!/bin/bash

echo heartbeat > /sys/devices/platform/apu-led/leds/apu\:1/trigger
echo netfilter-lednet-in > /sys/devices/platform/apu-led/leds/apu\:2/trigger
echo netfilter-lednet-out > /sys/devices/platform/apu-led/leds/apu\:3/trigger

J’utilise iptables pour déclencher le bip sur les paquets entrants ou sortants (ces deux règles sont un peu bidon et ne servent d’exemple qu’à l’utilisation de la cible LED, il faudra procéder de manière similaire pour capturer des trames IPv6 ou autre avec ebtables) :

iptables -A PREROUTING -i enp1s0 -j LED --led-trigger-id "lednet-in" --led-delay 10 --led-always-blink
iptables -A POSTROUTING -o enp1s0 -j LED --led-trigger-id "lednet-out" --led-delay 10 --led-always-blink

Enfin, on n’oubliera pas de charger les modules au démarrage en modifiant le fichier /etc/conf.d/modules :

modules='led_class ledtrig-heartbeat ledtrig-oneshot ledtrig-timer leds-apu'

N’hésitez pas à me laisser vos script en commentaires.

Amélioration du code du module

Avant de considérer le package comme terminé, j’ai activé tous les warning à gcc en ajoutant les flags -Wall CONFIG_DEBUG_SECTION_MISMATCH=y  et compilé le module, dans le but de corriger tous les warning relevés.  Et c’est là, c’est la merde…

Le principal warning est Section mismatch in reference from the function ma_function() to the variable ma_variable() . De ce que j’ai pu comprendre, cet avertissement indique qu’une fonction fait appel à une variable qui se trouve en dehors de sa section, donc potentiellement qui n’existe plus ou pas encore (donc un pointer stale).

C’est la merde parce que une fois l’erreur comprise, on lit le code source, on cherche à savoir comment ce type d’erreur se résout et on se rend compte que la documentation concernant les fonctions du kernel Linux et la manière de bien écrire un module est très morcelée. Je soulèverai notamment que :

  • pour beaucoup de fonctions constituantes du noyau Linux, il faut se contenter des deux pauvres lignes au-dessus de la signature de la fonction comme seule documentation, sans aucune information de contexte ou d’usage
  • la documentation est complètement éparpillée, entre le code source, les quelques rares fichiers du dossier Documentation dans les sources du noyau et le bouquin d’O’Reilly périmé, et les quelques mail d’une ML officielle ou d’une réponse sur stackoverflow d’un gars connaissant le noyau suffisamment

Franchement non seulement ça ne facilite en rien la maîtrise de l’infrastructure du noyau (et pour ma part cela ne concernait que la partie concernant les modules linux et les IO bruts, c’est à dire une infime partie du noyau), mais ça en devient même frustrant et retire pour ma part tout volonté à y apporter ma contribution (déjà que débugger du C sous Linux c’est une tanné, alors si en plus c’est en mode kernel avec une doc de merde…).

Fin

A mon sens et contrairement à d’autres projets utilisant des langages plus structurés (oui le C c’est quand même bien dégueulasse), il est absolument nécessaire d’avoir une documentation claire indiquant précisant l’impact de certaines macros telles que module_init, module_exit, la différence avec la macro module_platform_driver, l’impact du nom du driver, les différents moyens de déclarer de la mémoire, le mécanisme permettant de la mémoire privée pour un pilote, etc… J’ai dû découvrir tous ces éléments par essais successifs, ce qui n’est pas une méthode d’apprentissage très efficace. En l’état actuel, le développement dans le noyau Linux est pour ma part un no go.

Au final, je n’ai pu résoudre les SECTIONS MISMATCH. Cependant j’ai séparé le module initial de Daduke en 2, l’un concernant uniquement le bouton reset (qui se trouve sur la carte mère), et l’autre concernant le contrôle des LEDs. Le code source pourrait être factorisé mais après avoir passé une nuit à comprendre le fonctionnement d’un module Linux, je n’ai plus le courage de faire ce dev et perdre tous mes cheveux lors du débogage.

Je livre néanmoins le package permettant de compiler le module avec Gentoo, qui se trouve sur mon repo perso. Au moins, mes leds clignotent dans tous les sens, et ça c’est sympa #sapin-de-noel.

Pilote RAID LSI1064E pour ESXi (serveur SYS)

OVH a proposé pendant un moment des serveurs pas cher avec une carte RAID pas chère sous la marque SYS (SoYouStart).

La carte RAID n’est pas ce qu’il y a de plus ouf par rapport à un RAID software mais c’est un pré-requis à l’utilisation de VMware ESXi avec du RAID (non, une vm avec du raid software ne me semble vraiment pas une bonne idée).

Malheureusement, et j’ai été vraiment déçu que cela ne soit indiqué nulle part, le monitoring matériel dans le vSphere Client n’indiquait absolument rien quand à l’état du RAID. En fait, il ne semble tout simplement exister aucun pilote permettant à VMware d’avoir une vue sur le RAID, que ça soit de la part de VMware, LSI (aujourd’hui Avagotech) ou OVH. Pas cool.

Quelques posts de forums semblaient toutefois laisser entendre qu’il était possible d’utiliser un pilote dédiée à une autre carte RAID. C’est ce que je viens de tester, et ça marche !

Sur le site du constructeur, j’ai récupéré le VMWare SMIS Provider VIB – 5.5 (une copie est disponible à la fin du billet au cas où le lien saute). C’est un zip contenant un vib à charger sur l’esxi (en manuel via ssh ou update manager)

Si le chargement a été fait en ssh, on installera le vib de la manière suivante (l’argument –no-sig-check  est important pour que l’os accepte le package à l’installation) :

esxcli software vib install -v /tmp/vmware-esx-provider-lsiprovider.vib  --no-sig-check

On redémarre comme demandé, et si c’est compatible, on verra ça:

Sondes matérielles indiquant l'état du RAID
Sondes matérielles indiquant l’état du RAID

Ça marche ! Enjoy 😉

Autres ressources

Se connecter à TigerVPN avec Linux

J’ai profité d’une offre promotionnelle proposée par TigerVPN pour leur service de VPN à vie pour 30€. C’est toujours pratique de pouvoir changer d’IP en cas de route réseau défectueuse ou lorsque l’IP du FAI est banni par le service qu’on essaye d’atteindre (les restriction géographique par exemple tombent dans ce cas).

Bref, Tiger et la plupart de ses concurrents proposent des VPN clé-en-main pour plateforme Windows et mobile. On a donc souvent du IPSec/L2TP, OpenVPN, ou parfois l’utilisation d’un client maison (mais c’est vraiment pas génial sur mobile, du fait de la mauvaise intégration d’un point de vue de la continuité du service et de la consommation batterie). Sur ces plateformes, ça marche mais on ne trouve aucune informations techniques permettant de s’y connecter proprement depuis un client Linux.

Voici ma configuration, après pas mal d’essais, pour se connecter à TigerVPN en utilisant Strongswan sous Gentoo.

Tout d’abord, on aura besoin des paquets suivants :

emerge va xl2tpd strongswan

La configuration de la partie IPSec. Elle établit un tunnel entre le Linux et TigerVPN, uniquement pour les paquets udp sur le port 1701. C’est le port qu’utilise par défaut le protocole L2TP.

conn tigervpn
        add=route
        type=transport
        right=xxx.tigervpn.com
        esp=aes256-sha1!
        ike=aes256-sha1-modp1024!
        rekey=no
        keyingtries=1
        leftprotoport=udp/1701
        rightprotoport=udp/1701
        leftid=192.168.12.14
        leftsubnet=192.168.12.14/32
        rightid=%any
        leftcert=
        leftca=
        rightca=
        leftauth=psk
        rightauth=psk
        keyexchange=ikev1
        mobike=yes
192.168.12.14 %any : PSK "secret-partagé-tigervpn"

Maintenant, on passe à la configuration de la couche L2TP :

[lac tigervpn]
lns = xxx.tigervpn.com
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
require authentication = yes

Puis la configuration de la couche PPP :

ipcp-accept-local
ipcp-accept-remote
refuse-eap
require-mschap-v2
noccp
noauth
idle 1800
#crtscts
mtu 1410
mru 1410
nodefaultroute
lock
proxyarp
silent
name your-username
password your-very-secret-password

On vérifiera que les fichiers contenant des mot de passes ne sont accessibles que par root !

Maintenant, on peut démarrer les différents services :

/etc/init.d/ipsec start
/etc/init.d/xl2tpd start
sleep 3
echo "c tigervpn" > /var/run/xl2tpd/l2tp-control

Le sleep s’assure que les deux daemons soient bien initialisées.

La commande echo demande à xl2tpd de se connecter au lac nommé tigervpn. Ce lac a pour LNS xxx.tigervpn.com, lequel doit passer en IPSec.

Si tout a bien fonctionné, une nouvelle interface pppX est visible. Il n’y aura plus qu’à ajouter les différentes routes vers les destinations que l’on souhaite faire passer dans le VPN.

Enjoy !