Planet Fellowship (fr)

Friday, 22 August 2014

Comment générer un mot de passe avec caractères spéciaux

André on Free Software » Français | 17:19, Friday, 22 August 2014

Après Matthias m’a montré comment générer un mot de passe, je voulais être capable de créer un seul avec des caractères spéciaux. Ainsi, vous n’avez pas besoin de les ajouter plus tard au mot vous-même.

J’ai commencé avec pwgen essaie, que vous pouvez installer dans la ligne de commande avec:

apt-get install pwgen

Si vous exécutez pwgen essaie, vous pouvez générer des mots de passe aléatoires comme :

vuaJ9aes

Les mots de passe sont tous composés de 8 caractères et vous obtenez 160 d’entre eux à la fois.

Si vous souhaitez appliquer les chiffres dans les mots de passe, que vous saisissez dans la ligne de commande -n :

pwgen -n

Si vous voulez avoir au moins une lettre majuscule à chaque mot de passe, vous tapez -c :

pwgen -c

Si vous souhaitez générer complètement les mots de passe aléatoires, vous tapez -s :

pwgen -s

Et si vous voulez avoir une avec au moins un symbole spécial dans chaque mot de passe que vous choisissez -y :

pwgen -y

Donc, si vous ajoutez tout haut, si vous tapez :

pwgen -c -n -s -y

vous pouvez faire votre propre mot de passe à partir d’un résultat comme ceci :

7?|%Wr0! \xXJk7Mp OY=CD@2i !0;I.,\a j2%aFf5: {GIBK4nZ O’_73K>8 P.1@Nm2e
9y(<bG{Z B)db4(H# /iYy”?0) Yc6/OJ/& 5It&=,>8 \n6#F)%N 8+@nljiF M*H5?<nq
#9I4LEk\ S’h-e0Ax 8lEw’v?y w3n,y,iQ FBk$w7or $p^W9[/| #7eA|D8f 2[ACJDv+
q\s.70Do 7!)]}QmA rU!RdIA8 7p@K?3cD 7=/~’Rhe ;{2OCqYn z9>+”N]l 6UYz!]q[
/3UB_{)@ ]_P]8M#4 P]1t0t?# xT~3HzOh :c~A9RA{ %S?X?2cf E7{>uO(_ T)^=1>AX
Q3.Ez!N\ m0M`m3x$ 6WY=z-x2 H’W)$_98 9″V2.+$S xEAv5`~n GR$Zz:|7 |W3AqXHe
gE`rSMU4 fKa*HLs8 &kQ~s0<i eq)U_8.W %|rD6n+S 5XBV’38k ;9(*AMzB ,u’6IU@2
U`G2F`y. hd05BEg? [26T&U#+ dj1&7tdX V+i>:a32 c^.RGNh1 ^U"3XVR[ eZnc!a56
otr2J*0U VQO;{^S4 rd)E\z7I pMn,xHx6 H%`dUu1? 0_<LKv<# f8&Y)U=\ 1D~d|#er
`ylKnp@8 c+CL`/57 sI7J|}_[ z46Vm>9Z !."rT?q1 {0.}"!Hf i]<-=0Rz Sw&0pB<V
RT4snTs- WEl,35uS g<u?UM7/ :g1c.F”q “&JrK1Cb 88%2#’xJ }Z;”.”2E “b`LI3Q(
,3QH8LW’ 7zU_+\i- 1~!Be-sH nr6!J$R| vp65Ha/H 8Q?&uy#| ‘K/m1NU% 4CB5)(Ln
z@=0tAr# 5S={\|(Z g?o4A<3| =7Azd:AQ Qsl8HE`d Z%-;0Ob3 .N8′fcoI Og_5JB4J
>6feWQ%$ SP1D,7c” N~6N}jmm )q|w7pvI Mpo5=R%X }F2|bnPC q0rN{pAx ;&’,.6iL
~rZ5,,’u alg=Z1y@ +],jk4B3 L+”nfQ5i ]p`7l_O% “-L<6rvz AJ+’3!uW 1bj>Ps}6
[}o1Y8)& cZ12'+={ 4YN[}lKN BjyO\X5l 4rxw|s/U (>QnS&7i 0z(3n>U0 4|=!XC=B
^9v+mP]# >4NzKd8Q x/S3u5G. ‘[I|2*Uw C}2'1Z9r !An2F;s0 `;8ZZ.6R 8!mx>aDH
<N!4un!+ ihg<o2TB 1~'^n@yQ T5WY2kO` A(9|_\iJ C7e_GZLm :0sYS_=s D=nUJ3PN
~72J#}>7 /W!_ZB2\ xZ5E>aA= =F!k\@!0 ./kDOPZ2 ]M|g3x>; )%|,&AY4 HP}V2bg{
_B”^)H)8 (r+{Q&5x 65Tq/*`f q)Ci722] !QATS’$4 zIMIAN7\ 7″7Py93s “xdYe5@<

Friday, 15 August 2014

L’étudient

André on Free Software » Français | 19:42, Friday, 15 August 2014

Si vous vivez dans une ville universitaire vous ont parfois contact avec un étudiant.

Lundi soir. Un homme athlétique chandelles devant ma porte.

Bonjour. Notre société d’étudiants vous donne la carte d’abonnement pour votre ordinateur.

Je dis que je ne savais pas que ce sujet.

C’est E 15,- par mois. Nous nous engageons à résoudre votre problèmes avec l’ordinateur. Tout le quartier est invité ainsi.

Je m’oppose et dire que je n’ai pas que les problèmes informatiques.

Est-ce que vous n’avez pas des problèmes avec l’ordinateur? Quelle est votre version de Windows?

Je dis que j’utile la libre Debian GNU/Linux système d’exploitation.

L’étudiant est de plus en plus en colère et s’en va. Je ferme la porte et fais une sauvegarde de mon ordinateur.

Monday, 04 August 2014

Logiciel Libre et un fonds de pension

André on Free Software » Français | 13:37, Monday, 04 August 2014

Le fonds de pension que je suis avec demande pas-libre flash-software dans la web site. Les membres avons le choix: installer flash ou être pas d’informe.

En les Pays Bas, trop gens sont obligatoire membre d’un fonds de pension. Le choix quel fonds de pension n’est pas la.

Mon fonds de pension a dans la web site un module avec mon information personnel. Je nécessite pas-libre flash-software pour l’emploi.

J’ai rempli un formulaire dans le web site (e-mail n’est pas possible) ou j’ai dit quand on pas installons pas-libre flash-software on ne pas voir pas du tout après log-in. Mois d’après, il n’a pas un réaction de le fonds de pension.

“C’est pourquoi, en 2014, nous faisons la web site même plus meilleur.” – Fonds de pension dans la brochure annuel, comme traduit de moi.

Est-ce que je suis la seule que va dans cette expérience?

Wednesday, 30 July 2014

Bienvenu sur mon blog

André on Free Software » Français | 19:47, Wednesday, 30 July 2014

Bonjour. Je m’appelle André est je suis de la Pays Bas. Je traduis pour la Free Software Foundation Europe. Bienvenu sur mon blog.

Monday, 28 July 2014

5 approximations à rectifier pour bien s’y repérer dans les licences libres

Hugo - planet FSFE | 13:13, Monday, 28 July 2014

Le Journal du Net publiait la semaine dernière Comment se repérer dans la jungle des licences open source. L’article a été pas mal partagé sur Twitter. Malheureusement, il souffre de plusieurs approximations dommageables.

Voici 5 rectifications :

1. Licences libres et licences « open source », c’est pareil

L’article semble semer la confusion en essayant de diviser et de cataloguer les licences.

Les licences libres et les licences open source forment une seule et même catégorie. Autrement dit, il n’y a pas de différence entre ces types de licences : une licence non-copyleft comme la licence MIT est autant une licence libre qu’une licence « open source », une licence copyleft comme la GNU GPL est autant une licence libre qu’une licence « open source ». La preuve? Il suffit de regarder la liste des licences maintenues par l’Open Source Initiative et la liste maintenue par GNU pour constater qu’en pratique, les critères sont les mêmes puisqu’on aboutit aux mêmes résultats

Pour mieux comprendre les raisons historiques de l’existence de ces deux termes, l’article de Björn en fait l’exposé.

2. Le copyleft, ce n’est pas un virus

On qualifie de licence copyleft une licence libre qui contient des obligations supplémentaires de manière à sauvegarder les libertés des utilisateurs. Autrement dit, une clause copyleft interdit d’interdire.

L’article utilise le terme « contaminant » pour qualifier ce type de clause. Ce vocabulaire nous vient directement de la propagande de Microsoft de la fin des années 1990, qui se référait au logiciel libre comme un « cancer ». Il est temps de s’écarter du vocabulaire de la pathologie ! Le logiciel libre n’est pas un mal incurable, c’est un vecteur de libertés. (Si vous cherchez absolument à remplacer le mot copyleft par un mot du langage courant, clause d’hérédité ou héréditaire fonctionne plutôt bien).

Ainsi, le qualificatif de « contaminant » est on ne peut plus approximatif. Si on s’intéresse à l’analogie, on voit qu’elle ne tient pas. Si quelqu’un me contamine de sa maladie, je suis passif : je subis, je reçois la contamination et j’en fais les frais. C’est le contact d’un autre qui est la source de ma misère. Ce qui m’amène à une troisième approximation de l’article…

3. Ce qui déclenche le copyleft, c’est la distribution, pas la publication

Les licences libres étant principalement des licences de droits d’auteur (ou copyright selon la juridiction), l’acte qui déclenche les obligations relatives à la clause copyleft coïncide avec l’acte auquel le droit d’auteur attache des obligations.

Ainsi, en droit d’auteur, on ne peut pas distribuer une copie d’une œuvre (ici, un logiciel) sans la permission de son ou ses auteurs. La distribution, c’est la transmission d’une copie d’une personne, physique ou morale, à une autre personne. C’est cet acte là, tout à fait volontaire, qui déclenche les obligations relatives au droit d’auteur, qui requiert l’autorisation. Cette autorisation est déjà donnée par une licence libre, la clause copyleft en est cependant une condition. (On voit bien ici à quel point l’analogie avec la contamination épidémique est mauvaise.)

Plus spécifiquement, cette condition :

  • concerne uniquement les développements du logiciel qui sont eux mêmes basés sur le logiciel publié sous licence copyleft; et non les logiciels qui fonctionnent indépendamment
  • il ne s’agit pas d’une condition de publication des modifications, en effet il est tout à fait possible de respecter la licence simplement en distribuant avec les binaires distribué aux tiers, l’intégralité des sources correspondantes1
    • si ce n’est pas le cas, il y a alors pendant trois ans obligation d’offrir aux tiers à qui on a distribué une copie la possibilité de demander les sources (voir les détails de la licence pour plus de précisions)

Par conséquent, il a bien été montré que c’est la distribution du logiciel qui déclenche les obligations.2 Ainsi, on peut tout à fait prendre un logiciel libre sous licence copyleft, y apporter pléthores de modifications, et gardes ces modifications privées voire secrètes si bon vous semble. Ça fait partie des libertés intégrantes du logiciel libre : on peut les utiliser pour tout usage, l’utilisation n’est absolument pas restreinte ; et on peut les modifier de façon à ce qu’ils fonctionnent comme on l’entend.

4. Pas de distinction entre libre d’un côté et commercial de l’autre

Contrairement à ce qui est suggéré dans l’article, qui oppose d’un côté des licences libres et d’un autre côté des licences commerciales ; il n’y a en réalité pas de raison de procéder à une distinction.

Comme il vient d’être souligné, un logiciel libre est forcément utilisable sans restriction. Une clause qui limite l’utilisation du logiciel à une activité non-commerciale est donc fondamentalement incompatible avec une licence de logiciel libre.

Il y a d’un côté les licences libres, qui sont généralement des licences publiques — c’est-à-dire que chacun peut les utiliser pour ses propres logiciels à destination du public ; et de l’autre côté, les licences propriétaires qui sont généralement des licences spécifiques ou spéciales, qui sont utilisées seulement par quelques entreprises et pas forcément à destination du public mais au contraire parfois pour des logiciels écrits spécialement avec des modifications propres au client (ce qu’il est tout à fait possible de faire avec une licence libre par ailleurs, le client jouira ainsi également des libertés conférées par les licences).

5. La licence GNU GPL est applicable en France

Enfin la GPL comme son nom l’indique est une licence et non un contrat de cessions de droits d’auteur. Les obligations de formalités du droit français qui s’attachent aux contrats de cessions de droit sont donc inopérantes pour la GPL. D’ailleurs la version 3 de la GNU GPL a été écrite lors d’un processus large et documenté, qui comprenait des avocats de plusieurs juridictions (notamment l’Allemagne) spécialement pour pallier l’éventualité de distorsions.

Pour s’en convaincre, il suffit de constater que la licence GPL-2.0 a bien été appliquée en Allemagne à plusieurs reprises (par exemple contre Skype). Bien qu’en France la licence n’ait pas vraiment fait l’objet d’un examen poussé par un juge (le fait qu’il y ait peu de litiges est en soi une bonne nouvelle en fait), son invocation ici et là n’a pas entraîné la déclaration de son incompatibilité.

(Seule la loi Toubon pourrait causer quelques problèmes, mais rien de très grave en réalité ; ça se résout très bien en utilisant des doubles licences et ça ne vaut pas dans tous les cas. Les administrations publiques peuvent très bien faire développer et utiliser des logiciels libres et elles le font déjà !)


Quoiqu’il en soit, l’objectif de l’article est louable et le petit tableau récapitulatif partagé sur Twitter est assez utile.

Pour bien s’y repérer, il y a heureusement plusieurs moyens :

  • Le livre de Benjamin Jean, Option Libre. Du bon usage des licences libres.
  • L’International Free and Open Source Software Law Book qui permet d’aborder les aspects juridiques de plusieurs juridictions, dont la France.
  • L’International Free and Open Source Software Law Review ou IFOSSLR qui permet d’aller dans le détail avec plusieurs articles à chaque édition.

Sinon, la communauté du logiciel libre est également là pour aider chacun à s’y repérer. L’équipe juridique de la FSFE répond régulièrement à ce genre de questions.


  1. Dans la GPL-3.0 voir le paragraphe « 6. Conveying Non-Source Forms » ↩

  2. Une précision importante toutefois, il peut exister d’autres cas de figure où les obligations du copyleft sont déclenchées. Par exemple, dans la licence AGPL, la réunion de deux conditions déclenche aussi ces obligations (section 13): 1) la modification du code source, 2) l’interaction des utilisateurs avec le logiciel par l’intermédiaire du réseau (par exemple dans le cas d’une application web). ↩

Saturday, 24 May 2014

La FSFE (Free Software Foundation Europe)

Hugo - planet FSFE | 09:00, Saturday, 24 May 2014

La FSFE : Free Software Foundation Europe

La FSFE (fondation européenne du logiciel libre) œuvre depuis 2001 pour la promotion du Logiciel Libre en Europe. Présentation de l’organisation, ses campagnes, ses groupes d’expertise juridique et retour sur plus de 10 ans d’activisme : des procès gagnés contre Microsoft au niveau de l’Union européenne aux batailles contre les brevets logiciels et les DRM. Quels seront les défis pour le logiciel libre que nous aurons à relever ensemble ?

<figure class="slides"> <figcaption>diapos (speakerdeck.com)</figcaption>

<iframe allowfullscreen="true" frameborder="0" height="580" mozallowfullscreen="true" src="http://hroy.eu//speakerdeck.com/player/9bace740c96e01316e3b2eda2b59ba96" title="FSFE - Ubuntu Party" webkitallowfullscreen="true" width="666"></iframe>

</figure>

Friday, 28 March 2014

Mais qui est donc Madame Michu ?

Hugo - planet FSFE | 12:11, Friday, 28 March 2014

Mais qui est donc Madame Michu ? La grand’mère, l’utilisateur inexpérimenté, le critère absolu du concepteur d’une interface pour juger de l’expérience-utilisateur, l’ignare qui n’y connaît rien à rien et qui s’en fout, l’inconnu qui ignore mais ne demande qu’à apprendre… Tout ça à la fois ?

Le fait est que « Madame Michu » est une expression employée pour désigner une personne abstraite, qui n’existe pas réellement. C’est une fiction, prise pour une réalité, c’est-à-dire une hypostase comme on en trouve de nombreuses en droit par exemple : le bon père de famille en droit civil français, l’homme du métier en droit des brevets (et ses cousins anglo-américains, les « persons having ordinary skills in the art »), etc.

Certes, c’est simplificateur. Mais les mots sont des simplificateurs nécessaires à l’articulation et la communication de la pensée. Comme beaucoup d’autres termes, l’objectif de Madame Michu n’est pas de rendre compte exactement d’une réalité. On sait bien que, en vrai, Madame Michu n’existe pas. Ce n’est pas à ce critère qu’on peut juger l’efficacité de l’expression, ni qu’on peut en déduire son contenu.

En tout cas, je n’utilise pas l’expression car la plupart du temps je la trouve inadaptée à communiquer ce que j’essaye de dire. Mais je suppose que si j’avais à la placer quelque part, Madame Michu pour moi est à l’autre bout de l’utilisateur-Turing, autrement dit comme disait Ted Nelson, c’est « just a user » !

Ça n’est pas dénigrant ou élitiste pour autant ! On est tous passé par là. L’utilisateur, c’est un itinéraire de progression qui va dans une direction, dans un rythme propre à chacun. C’est comme lorsque Benjamin Bayart nous parle de l’internaute qui débarque. L’internaute qui débarque, c’est Madame Michu ! Même si ça peut être un monsieur (le seul fait qu’on lui donne un genre est en soi une raison pour rejeter le terme à mon humble avis, il faut utiliser quelque chose de plus englobant).

En attendant, l’expression a certainement ses défauts. Mais ne faisons pas de procès d’intention forcément à ceux qui l’utilisent. La plupart du temps où j’ai entendu le terme, c’est lorsqu’on essaye de se donner du mal pour rendre quelque chose meilleur, pour communiquer autour d’un sujet important. Et le simple fait qu’on s’inquiète suffisamment de la personne de Madame Michu pour avoir eu besoin de la nommer est en soi un bon signe.

PS : c’est fou ce qu’on peut dire de plus construit lorsqu’on se détache cinq petites minutes du carcan à 140 signes qu’est Twitter.

Mais qui est donc Madame Michu ?

Hugo - planet FSFE | 12:11, Friday, 28 March 2014

Mais qui est donc Madame Michu ? La grand’mère, l’utilisateur inexpérimenté, le critère absolu du concepteur d’une interface pour juger de l’expérience-utilisateur, l’ignare qui n’y connaît rien à rien et qui s’en fout, l’inconnu qui ignore mais ne demande qu’à apprendre… Tout ça à la fois ?

Le fait est que « Madame Michu » est une expression employée par désigner une personne abstraite, qui n’existe pas réellement. C’est une fiction, prise pour une réalité, c’est-à-dire une hypostase comme on en trouve de nombreuses en droit par exemple : le bon père de famille en droit civil français, l’homme du métier en droit des brevets (et ses cousins anglo-américains, les « persons having ordinary skills in the art »), etc.

Certes, c’est simplificateur. Mais les mots sont des simplificateurs nécessaires à l’articulation et la communication de la pensée. Comme beaucoup d’autres termes, l’objectif de Madame Michu n’est pas de rendre compte exactement d’une réalité. On sait bien que, en vrai, Madame Michu n’existe pas. Ce n’est pas à ce critère qu’on peut juger l’efficacité de l’expression, ni qu’on peut en déduire son contenu.

En tout cas, je n’utilise pas l’expression car la plupart du temps je la trouve inadaptée à communiquer ce que j’essaye de dire. Mais je suppose que si j’avais à la placer quelque part, Madame Michu pour moi est à l’autre bout de l’utilisateur-Turing, autrement dit comme disait Ted Nelson, c’est « just a user » !

Ça n’est pas dénigrant ou élitiste pour autant ! On est tous passé par là. L’utilisateur, c’est un itinéraire de progression qui va dans une direction, dans un rythme propre à chacun. C’est comme lorsque Benjamin Bayart nous parle de l’internaute qui débarque. L’internaute qui débarque, c’est Madame Michu ! Même si ça peut être un monsieur (le seul fait qu’on lui donne un genre est en soi une raison pour rejeter le terme à mon humble avis, il faut utiliser quelque chose de plus englobant).

En attendant, l’expression a certainement ses défauts. Mais ne faisons pas de procès d’intention forcément à ceux qui l’utilisent. La plupart du temps où j’ai entendu le terme, c’est lorsqu’on essaye de se donner du mal pour rendre quelque chose meilleur, pour communiquer autour d’un sujet important. Et le simple fait qu’on s’inquiète suffisamment de la personne de Madame Michu pour avoir eu besoin de la nommer est en soi un bon signe.

PS : c’est fou ce qu’on peut dire de plus construit lorsqu’on se détache cinq petites minutes du carcan à 140 signes qu’est Twitter.

Thursday, 05 December 2013

Mardis de Doisneau

Thinking out loud » French | 13:15, Thursday, 05 December 2013

Depuis que j’ai quitté les éclés pour m’exiler à Berlin, les ados me manquent. L’adolescence est une période folle où tout est intense, l’amour, le désespoir, l’enthousiasme, l’ennui et… la propension à la geekerie.

Un des plus grand lycées de France, le lycée Doisneau à Corbeil-Essonnes, organise tous les mois des sessions d’ouverture sur différents sujets. Nous avons la possibilité de consacrer la session de février à internet. Une heure et demie avec plusieurs classes pour parler collaboration, commons, partage du savoir et liberté. Les programmes officiels ne prévoient que des actions de sensibilisation au droit d’auteur et aux dangers d’internet..

Il me faut donc maintenant trouver un/une intervenant/e pour co-animer la séance. Les “objectifs” que j’ai en tête sont:

  • les faire rêver et trancher à la fois avec les discours anxiogènes et le marketing des boites de SaaS, Facebook, Google et leurs petits cousins.
  • briser le cliché du geek et faire comprendre que tout le monde a sa place dans les communautés qui s’occupent de technologie
  • aborder la technologie et ses utilisations comme des enjeux politiques

Pour une fois, je ne pense pas centrer mon discours sur les questions de surveillance et/ou de censure, mais plutôt sur l’incroyable collaboration permise par internet et la copie à volonté Ex: Wikipedia, logiciel libre, différents projets Arduino… Je compte montrer des réalisations concrètes et motivantes puis expliquer pourquoi elles ne sont possibles que grâce à un réseau ouvert et neutre.

Qu’en pensez-vous ?

Ces prochains jours je vais contacter plusieurs personnes que j’imagine très bien dans ce type de discussion. Au travail pour mettre sur pied une sessions que les ados n’oublieront pas de si tôt !

Thursday, 21 November 2013

MutterWare #2: aller (encore) plus loin dans son utilisation du mail

Hugo - planet FSFE | 18:20, Thursday, 21 November 2013

(initalement publié sur blogs.fsfe.org)

Mardi soir, Nicolas organisait le 2e MutterWare. Mais qu’est-ce que c’est que ça ?

Le MutterWare est une réunion d’utilisateurs de Mutt qui veulent partager leurs bonnes pratiques et quelques astuces bien utiles. Les non-utilisateurs de mutt curieux sont bienvenus, surtout s’ils sont légèrement blasés de leur client email ☺

Le nom est inspiré directement du TupperVIM organisé chez Mozilla, à Paris.

Pour cette deuxième édition, nous avons cette fois été invités à admirer les bureaux somptueux de Mozilla boulevard Montmartre. Voir la photo prise par Yoann :

Démonstration par Paul
Mutterware

Encore une fois, ce MutterWare était un bon mélange entre utilisateurs (très) expérimentés, et non-utilisateurs de Mutt curieux de voir comment fonctionne le machin et prêts à ouvrir leur terminal pour commencer à configurer la bête !

Quelques informations ont été ajoutées au wiki de la FSFE : https://wiki.fsfe.org/groups/Paris/Mutterware.

Pour ma part, j’insisterai sur cette très bonne page qui permet de démarrer sur Mutt. C’est en anglais mais c’est bien écrit. Cette page a cependant deux défauts à mon avis : elle se concentre sur l’usage à partir d’un serveur mail chez Google (or Gmail a des tas de particularités pas très orthodoxes) et elle se limite à un seul compte. Or je ne sais pas pour vous mais moi, j’ai deux comptes : l’un est plus, « personnel ».

Enfin, la cerise sur le gâteau, c’est Emmanuel qui l’a apportée en me montrant l’outil t-prot, qui permet de nous débarrasser de toutes ces petites choses qui peuvent être désagréables dans le mail : les gens qui font des citations trop longues, les gens qui font du top-posting ou encore les gens ont des signatures de 3 kilomètres. T-prot a aussi des fonctions particulières pour Mutt, comme par exemple l’argument --pgp-move qui déplace les informations relatives aux signatures openPGP d’un email vers le bas, et non vers le haut comme c’est le cas par défaut, ce qui permet d’avoir accès plus directement au contenu du mail, sans avoir à scroller ! Plus d’infos sur la config T-prote d’Emmanuel sur le wiki.

Du coup, j’ai touché pas mal à ma config (dispo sur https://github.com/hugoroy/.mutt). Tout est désormais plus sobre depuis que j’ai modifié les barres de statuts, retiré la barre d’aide, et remplacé quelques codes couleurs. Lire ses mails sur Mutt est encore plus plaisant qu’avant ☺

À bientôt pour la 3e édition ! N’hésitez pas à vous inscrire sur la liste fsfe Paris https://lists.fsfe.org/mailman/listinfo/paris ou à nous rejoindre sur irc #fellows-paris.

MutterWare #2: aller (encore) plus loin dans son utilisation du mail

With/in the FSFE » Français | 14:18, Thursday, 21 November 2013

[Note : Je vais cesser d’écrire en français sur ce blog. Désormais, ce que j’écris en français est publié sur mon blog personnel, y compris lorsque cela est lié à la FSFE.]

Mardi soir, Nicolas organisait le 2e MutterWare. Mais qu’est-ce que c’est que ça ?

Le MutterWare est une réunion d’utilisateurs de Mutt qui veulent partager leurs bonnes pratiques et quelques astuces bien utiles. Les non-utilisateurs de mutt curieux sont bienvenus, surtout s’ils sont légèrement blasés de leur client email ☺

Le nom est inspiré directement du TupperVIM organisé chez Mozilla, à Paris.

Pour cette deuxième édition, nous avons cette fois été invités à admirer les bureaux somptueux de Mozilla boulevard Montmartre. Voir la photo prise par Yoann :

Encore une fois, ce MutterWare était un bon mélange entre utilisateurs (très) expérimentés, et non-utilisateurs de Mutt curieux de voir comment fonctionne le machin et prêts à ouvrir leur terminal pour commencer à configurer la bête !

Quelques informations ont été ajoutées au wiki : https://wiki.fsfe.org/groups/Paris/Mutterware.

Pour ma part, j’insisterai sur cette très bonne page qui permet de démarrer sur Mutt. C’est en anglais mais c’est bien écrit. Cette page a cependant deux défauts à mon avis : elle se concentre sur l’usage à partir d’un serveur mail chez Google (or Gmail a des tas de particularités pas très orthodoxes) et elle se limite à un seul compte. Or je ne sais pas pour vous mais moi, j’ai deux comptes : l’un est plus, « personnel ».

Enfin, la cerise sur le gâteau, c’est Emmanuel qui l’a apportée en me montrant l’outil t-prot, qui permet de nous débarrasser de toutes ces petites choses qui peuvent être désagréables dans le mail : les gens qui font des citations trop longues, les gens qui font du top-posting ou encore les gens ont des signatures de 3 kilomètres. T-prot a aussi des fonctions particulières pour Mutt, comme par exemple l’argument --pgp-move qui déplace les informations relatives aux signatures openPGP d’un email vers le bas, et non vers le haut comme c’est le cas par défaut, ce qui permet d’avoir accès plus directement au contenu du mail, sans avoir à scroller ! Plus d’infos sur la config T-prote d’Emmanuel sur le wiki.

Du coup, j’ai touché pas mal à ma config (dispo sur https://github.com/hugoroy/.mutt). Tout est désormais plus sobre depuis que j’ai modifié les barres de statuts, retiré la barre d’aide, et remplacé quelques codes couleurs. Lire ses mails sur Mutt est encore plus plaisant qu’avant ☺

À bientôt pour la 3e édition ! N’hésitez pas à vous inscrire sur la liste fsfe Paris https://lists.fsfe.org/mailman/listinfo/paris ou à nous rejoindre sur irc #fellows-paris.

flattr this!

Sunday, 02 June 2013

Introduction aux licences libres

Hugo - planet FSFE | 00:00, Sunday, 02 June 2013

Introduction aux licences libres

Une introuction générale aux licences libres donnée lors de l’Ubuntu Party de Paris en 2013.

<iframe allowfullscreen="true" frameborder="0" height="580" mozallowfullscreen="true" src="http://hroy.eu//speakerdeck.com/player/8fe36d90df470130c6cd66a20ab46c20" title="Introduction aux licelinces libres" webkitallowfullscreen="true" width="666"></iframe> diapos (speakerdeck.com)

Wednesday, 01 May 2013

Installation d’etherpad-lite avec ldap / ssl / apache

Facteur d'entropie | 00:30, Wednesday, 01 May 2013

Au boulo, suite à une demande d’utilisateurs, j’ai dû mettre en place un service de publication collaborative en ligne. Le choix s’est porté sur etherpad-lite qui a fait ses preuves.
Celui-ci est disponible sur le site: http://etherpad.org/

Installation

Le port n’existant pas dans gentoo, on va devoir se taper l’installation à la pogne.
Donc dans un premier temps, on installe les dépendances (ici node.js) puis on récupère l’archive.

echo "net-libs/nodejs ~amd64" >> /etc/portage/package.keywords
emerge -uD nodejs
cd /opt
git clone git://github.com/ether/etherpad-lite.git

On va créer l’utilisateur et le groupe etherpad et passer le dossier sous cette identité

useradd etherpad -U -d /opt/etherpad-lite -s /bin/bash
chown etherpad:etherpad ./etherpad-lite
cd ./etherpad-lite/bin

Enfin on teste:

ulysse bin # su etherpad -c /opt/etherpad-lite/bin/run.sh
Ensure that all dependencies are up to date...  If this is the first time you have run Etherpad please be patient.
Ensure jQuery is downloaded and up to date...
Clear minfified cache...
ensure custom css/js files are created...
start...
[2013-04-29 17:10:38.824] [WARN] console - You need to set a sessionKey value in settings.json, this will allow your users to reconnect to your Etherpad Instance if your instance restarts
[2013-04-29 17:10:38.826] [WARN] console - DirtyDB is used. This is fine for testing but not recommended for production.
[2013-04-29 17:10:39.211] [INFO] console - Installed plugins: ep_etherpad-lite
[2013-04-29 17:10:39.226] [INFO] console - Your Etherpad Lite git version is 2273cf9
[2013-04-29 17:10:39.226] [INFO] console - Report bugs at https://github.com/ether/etherpad-lite/issues
[2013-04-29 17:10:39.260] [INFO] console -    info  - 'socket.io started'
[2013-04-29 17:10:39.282] [INFO] console - You can access your Etherpad-Lite instance at http://127.0.0.1:9001/
[2013-04-29 17:10:39.282] [WARN] console - Admin username and password not set in settings.json.  To access admin please uncomment and edit 'users' in settings.json

En allant dans votre butineur favori, vous devriez voir ceci à l’adresse: http://127.0.0.1:9001/


Nous avons donc maintenant, une installation sommaire avec plein de log WARN (Cf ci-dessus)

Configuration

On va stocker les données dans une base MySQL. On va donc créer une base “etherpad” ainsi qu’un utilisateur “ethertap” avec des droits dessus:

CREATE DATABASE etherpad CHARACTER SET UTF8 COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON etherpad.* TO 'etherpad'@'localhost' IDENTIFIED BY 'MOTDEPASSEMYSQL';

Pour la connexion à MySQL, on passera par les sockets

Ici vous trouverez le nécessaire pour la génération des clés / certificats du serveur.

Puis, on complète le fichier de configuration est: /opt/etherpad-lite/settings.json

{
        "title": "Nom du PAD",
        "favicon": "favicon.ico",
        "ip": "adresse d'écoute",
        "port" : 9001,
        "sessionKey" : "chaine_session",
        "ssl" : {
                "key"  : "/etc/ssl/epad/epl-server.key",
                "cert" : "/etc/ssl/epad/epl-server.crt"
        },
        "dbType" : "mysql",
        "dbSettings" : {
                "user"    : "etherpad",
                "port"    : "/var/run/mysqld/mysqld.sock",
                "password": "MOTDEPASSEMYSQL",
                "database": "etherpad"
        },
        "defaultPadText" : "Message d'accueil sur un PAD vierge",
        "requireSession" : false,
        "editOnly" : false,
        "minify" : true,
        "maxAge" : 21600,
        "abiword" : null,
        "requireAuthentication": false,
        "requireAuthorization": false,
        "users": {
                "admin": {
                        "password": "MOTDEPASSEADMIN",
                        "is_admin": true
                }
        },
        "socketTransportProtocols" : ["xhr-polling", "jsonp-polling", "htmlfile"],
        "loglevel": "INFO",
        "logconfig" : {
                "appenders": [
                        {
                                "type": "file",
                                "filename": "/opt/etherpad-lite/etherpad.log",
                                "backups": 3
                        }
                ]
        }
}

En ligne 14, on indique à MySQL que l’on veut s’y connecter au moyen de sockets.
En ligne 24, on a désactivé l’authentification pour les utilisateurs classiques, car on va se servir de ldap avec apache pour les authentifier.

Maintenant vous pouvez vous rendre sur: https://adresse_d_ecoute:9001
là vous devriez voir l’interface de création / ouverture d’un document.
L’interface web d’administration se trouve à l’adresse: https://adresse_d_ecoute:9001/admin/
vous y trouverez un onglet concernant les plugins, a vous de personnaliser votre etherpad-lite…

Mode reverse-proxy avec Apache + Authentification LDAP

Maintenant, on va faciliter l’accès: on va se donner une joli adresse web et faire une translation de port
Il va falloir installer apache avec son module proxy et modifier le fichier /etc/conf.d/apache2 en rajoutant -D PROXY dans la liste des options de lancement.
On va avoir besoin aussi d’un fichier de configuration de l’hôte virtuel:

<VirtualHost ADRESSE_SERVEUR:443>
        ServerAdmin admin@localhost
        ServerName NOM_DOMAINE
        ServerSignature Off
        CustomLog /var/log/apache2/etherpad_access.log combined
        ErrorLog /var/log/apache2/etherpad_error.log
        SSLEngine on
        SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
        SSLCertificateFile /etc/ssl/epad/epl-server.crt
        SSLCertificateKeyFile /etc/ssl/epad/epl-server.key
        <Location />
                AuthType Basic
                AuthName "Access restreint"
                AuthBasicProvider       ldap
                AuthzLDAPAuthoritative  off
                AuthLDAPRemoteUserIsDN  off
                AuthLDAPGroupAttributeIsDN      off
                AuthLDAPURL             ldap://serveur_ldap/base_ldap?uid?sub
                Require valid-user
                addDefaultCharset UTF-8
        </Location>
        <Directory />
                Options -Indexes FollowSymlinks Multiviews
                AllowOverride All
                Order deny,allow
                Allow from all
        </Directory>
        <IfModule mod_proxy.c>
                ProxyVia On
                SSLProxyEngine on
                ProxyRequests Off
                SSLProxyCACertificateFile /etc/ssl/epad/epl-server.crt
                ProxyPass / https://ADRESSE_ECOUTE_ETHERPAD:9001/
                ProxyPassReverse / https://ADRESSE_ECOUTE_ETHERPAD:9001/
                ProxyPreserveHost on
                <Proxy *>
                        Options FollowSymLinks MultiViews
                        AllowOverride All
                        Order deny,allow
                        allow from all
                </Proxy>
        </IfModule>
</VirtualHost>

Les lignes 11 à 21 concernent l’authentification via LDAP. Les lignes 30 à 42 concernent le renvoie vers l’adresse du serveur etherpad sur le port 9001.

EtherPad-lite comme un service

Ici vous trouverez les différents scripts à mettre pour pouvoir lancer Etherpad-lite comme les autres services sur votre serveur.
En gros, sur la gentoo, on va créer un script /etc/init.d/etherpad-lite:

#!/sbin/runscript
# Copyright 1999-2013 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

depend() {
        need net mysql
        after apache2
}

start() {
        ebegin "Starting ${RC_SVCNAME}"
        start-stop-daemon -S -m --pidfile ${PIDFILE} -x ${NODE} -u ${USER} -d "${ETHERPATH}" -b -- ${ARGS}
        eend $?
}

stop() {
        ebegin "Stopping ${RC_SVCNAME}"
        start-stop-daemon -K -x ${NODE} -u ${USER} -d "${ETHERPATH}"
        eend $?
}

suivit d’un petit:

chmod 0755 /etc/init.d/etherpad-lite

et son fichier de conf /etc/conf.d/etherpad-lite:

ETHERPATH="/opt/etherpad-lite/"
ARGS="node_modules/ep_etherpad-lite/node/server.js"
ETHERLOG="${ETHERPATH}/etherpad.log"
USER="etherpad"
PIDFILE="/var/run/etherpad-lite.pid"
NODE="/usr/bin/node"

on test le lancement du service:

/etc/init.d/etherpad-lite start

On se rend sur l’adresse habituelle et on devrait voir la même chose.
Si tout fonctionne bien, il nous suffit de configurer le lancement automatique:

rc-update add etherpad-lite default

Et de changer le shell de connexion de l’utilisateur etherpad dans /etc/password en remplaçant /bin/bash par /sbin/nologin

Rotation des logs

On va rajouter la rotation des logs. Pour ce faire, on ajoute un petit script:
/etc/logrotate.d/etherpad-lite

/opt/etherpad-lite/*log {
  missingok
  notifempty
  sharedscripts
  postrotate
  /etc/init.d/etherpad-lite restart > /dev/null 2>&1 || true
  endscript
}

Exports supplémentaires

Afin de donner la possibilité de réaliser des exports sympas comme pdf, odt, doc, etc. On va avoir besoin d’abiword avec son plugin “command-line”.

echo "app-office/abiword plugins" >> /etc/portage/package.use
emerge -D abiword

Puis dans le fichier de configuration d’etherpad-lite (/opt/etherpad-lite/settings.json), on rajoute le chemin vers le binaire abiword que l’on obtiens ainsi:

whereis abiword

Dans ce fichier, en ligne 23, on remplace la valeur “null” en face d’abiword par le chemin précédemment trouvé.

Reste à faire:

Il ne reste plus qu’à binder l’authentification LDAP sur celle de etherpad. (Investigation en cours)
N’hésitez pas à me faire remonter vos remarques si ça ne paraît pas clair voire faux.

http://mclear.co.uk/2010/02/03/etherpad-with-active-directory-ldapad/

Wednesday, 03 April 2013

Récupération de données sous linux [WiP]

Facteur d'entropie | 18:45, Wednesday, 03 April 2013

>> Ceci est un Work in Progress, je le compléterai au fur et à mesure <<
Disclaimer: Bien évidemment, tout ce qui pourrait survenir en suivant les indications mentionnées ci-dessous relève de votre entière responsabilité.

J’ai dû récemment faire de la récupération de données sur un disque de portable contenant des partitions de type NTFS. La machine ne voulait plus démarrer dessus et bien évidemment le possesseur du-dit disque n’avait pas de sauvegarde récente.
Le disque avait une taille de 500Go.

Il existe toute une série d’utilitaires disques qui permettent de traiter ce type de situation.

  • badblocks
  • smartctl
  • fdisk
  • ddrescue
  • Les utilitaires propres au système de fichier que vous utilisez.

1/ On branche le disque via un adaptateur usb, puis on regarde les logs avec dmesg.

dmesg

[185475.284780] hub 2-1:1.0: state 7 ports 8 chg 0000 evt 0004
[185475.285088] hub 2-1:1.0: port 2, status 0101, change 0001, 12 Mb/s
[185475.389105] hub 2-1:1.0: debounce: port 2: total 100ms stable 100ms status 0x101
[185475.400067] hub 2-1:1.0: port 2 not reset yet, waiting 10ms
[185475.462195] usb 2-1.2: new high-speed USB device number 7 using ehci_hcd
[185475.472994] hub 2-1:1.0: port 2 not reset yet, waiting 10ms
[185475.547776] usb 2-1.2: default language 0x0409
[185475.548612] usb 2-1.2: udev 7, busnum 2, minor = 134
[185475.548616] usb 2-1.2: New USB device found, idVendor=152d, idProduct=2338
[185475.548618] usb 2-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=5
[185475.548620] usb 2-1.2: Product: USB to ATA/ATAPI bridge
[185475.548622] usb 2-1.2: Manufacturer: JMicron
[185475.548623] usb 2-1.2: SerialNumber: 000001D91880
[185475.548770] usb 2-1.2: usb_probe_device
[185475.548773] usb 2-1.2: configuration #1 chosen from 1 choice
[185475.549117] usb 2-1.2: adding 2-1.2:1.0 (config #1, interface 0)
[185475.549399] usb-storage 2-1.2:1.0: usb_probe_interface
[185475.549405] usb-storage 2-1.2:1.0: usb_probe_interface - got id
[185475.550000] scsi10 : usb-storage 2-1.2:1.0
[185476.551237] scsi 10:0:0:0: Direct-Access     WDC WD50 00BEVT-75A0RT0        PQ: 0 ANSI: 2 CCS
[185476.551678] sd 10:0:0:0: Attached scsi generic sg2 type 0
[185476.552069] sd 10:0:0:0: [sdb] 976773168 512-byte logical blocks: (500 GB/465 GiB)
[185476.552819] sd 10:0:0:0: [sdb] Write Protect is off
[185476.552824] sd 10:0:0:0: [sdb] Mode Sense: 28 00 00 00
[185476.553690] sd 10:0:0:0: [sdb] No Caching mode page present
[185476.553695] sd 10:0:0:0: [sdb] Assuming drive cache: write through
[185476.556210] sd 10:0:0:0: [sdb] No Caching mode page present
[185476.556213] sd 10:0:0:0: [sdb] Assuming drive cache: write through
[185478.233649]  sdb: sdb1 sdb2 sdb3
[185478.236550] sd 10:0:0:0: [sdb] No Caching mode page present
[185478.236558] sd 10:0:0:0: [sdb] Assuming drive cache: write through
[185478.236565] sd 10:0:0:0: [sdb] Attached SCSI disk

Les lignes surlignés vous donnent les infos nécessaires (taille, et identification du disque)
On identifie la partition qui nous intéresse à l’aide de fdisk:

fdisk -l /dev/sdb

Disque /dev/sdb : 500.1 Go, 500107862016 octets, 976773168 secteurs
Unités = secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
Identifiant de disque : 0x1c6264cf

Périphérique Amorce  Début        Fin      Blocs     Id  Système
/dev/sdb1              63       80324       40131   de  Dell Utility
/dev/sdb2   *       81920    30801919    15360000    7  HPFS/NTFS/exFAT
/dev/sdb3        30801920   976771119   472984600    7  HPFS/NTFS/exFAT

On a ici la partition de boot qui se trouve en /dev/sdb2 et sûrement une partition contenant les documents en /dev/sdb3.
On identifie le système de fichier sur la partition:

blkid /dev/sdb2
/dev/sdb2: LABEL="RECOVERY" UUID="6AD2B230D2B1FFFD" TYPE="ntfs"
blkid /dev/sdb3
/dev/sdb3: LABEL="OS" UUID="E60AB6450AB61293" TYPE="ntfs"

2/ On utilise les smartmontools pour regarder la santé du disque:

ulysse alex # smartctl -H /dev/sdb
smartctl 5.42 2011-10-20 r3458 [x86_64-linux-3.7.10-gentoo-r1] (local build)
Copyright (C) 2002-11 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

Si tout s’est bien passé, vous devriez voir le mot PASSED sur la dernière ligne.
Puis on se lance sur les tests plus longs:

ulysse alex # smartctl -t long /dev/sdb
smartctl 5.42 2011-10-20 r3458 [x86_64-linux-3.7.10-gentoo-r1] (local build)
Copyright (C) 2002-11 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION ===
Sending command: "Execute SMART Extended self-test routine immediately in off-line mode".
Drive command "Execute SMART Extended self-test routine immediately in off-line mode" successful.
Testing has begun.
Please wait 62 minutes for test to complete.
Test will complete after Sat May 11 19:34:33 2013

En enfin, une fois le test terminé (comptez environ un quart d’heure de plus pour être sûr), on lance la commande suivante pour obtenir les résultats:

ulysse alex # smartctl -l selftest /dev/sdb
smartctl 5.42 2011-10-20 r3458 [x86_64-linux-3.7.10-gentoo-r1] (local build)
Copyright (C) 2002-11 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF READ SMART DATA SECTION ===
SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Extended offline    Completed without error       00%      5464         -
# 2  Short offline       Completed without error       00%      5463         -

3/ on tente un montage en lecture seule pour être certain d’agir sur la bonne partition:

mount -o ro -t ntfs /dev/sdb3 /mnt/usb

Ici, on n’a pas le soucis de montage du disque. Cela fonctionne. Le problème est que le disque contient pas mal de secteurs défectueux.
Une fois la partition identifiée, on démonte afin de commencer le traitement.

umount /mnt/usb

On va avoir besoin d’un autre disque de bonne taille et formaté selon un système de fichier permettant de stocker de gros fichiers.
on monte donc le disque qui devra recevoir la copie de travail.

mount /dev/sdc1 /mnt/rescue

Dans un premier temps, on peut essayer de déterminer si la partition concernée contient des secteurs défectueux (ceci en mode lecture seule):

badblocks -v /dev/sdb3 > /mnt/rescue/bb_sdc.lst
Vérification des blocs 0 à 976761559
Vérification des blocs défectueux (test en mode lecture seule) :   0.05% effectué, 15:12 écoulé. (24/0/0 erreurs)

Cette opération prend pas mal de temps…
En fait, vous pouvez vous en passer au profit de la prochaine étape car ddrescue utilisé avec un fichier de log permet via ddrescuelog de transformer ce fichier de log en fichier au format badblock.

Puis, on va créer une image la plus fidèle possible de la partition contenant les données que l’on souhaite récupérer. Pour cela, on utilise ddrescue pour commencer la récupération puis ddrescuelog pour convertir les logs en liste badblock que l’on pourra utiliser ultérieurement dans la réparation du système de fichiers:

ddrescue -r 3 /dev/sdb3 /mnt/rescue/sdb3.img /mnt/rescue/sdb3.log
ddrescuelog -l -b4096 /mnt/rescue/sdb3.log > /mnt/rescue/sdb3.badblocks

Cette opération peut prendre plusieurs heures, donc vous pouvez vous mettre sur autre chose en attendant. Si l’opération s’arrête sur une erreur,
vous pouvez toujours la relancer telle quelle. Le fichier de log assurera la suite et la récupération reprendra là où elle s’est arrêtée.

Après vous devez utiliser le logiciel de réparation adapté à votre système de fichier. Il sera disponible normalement sous la dénomination:
fsck.le_systeme_de_fichier, par expl:
fsck, fsck.ext4, fsck.jfs, fsck.reiserfs,
fsck.cramfs, fsck.ext4dev, fsck.minix, fsck.vfat,
fsck.ext2, fsck.hfs, fsck.msdos, fsck.xfs,
fsck.ext3, fsck.hfsplus, fsck.reiser4, fsck_hfs

Ces utilitaires vous permettrons de ré-utiliser le fichier liste des badblocks:

fsck.MONFS -f -l /mnt/rescue/sdb3.badblocks /mnt/rescue/sdb3.img

(Vous devrez bien entendu remplacer MONFS par une des valeurs de la liste ci-dessus)
Ici, la page man de ces utilitaires vous donnera accès aux options spécifiques des systèmes de fichiers utilisés

Certains autres par contre seront des outils à part comme:
btrfsck ou ntfsck/ntfsfix

Dans le cas envisagé ici, on a:

ntfsfix -b /mnt/rescue/sdb3.img

L’option -b permet de nettoyer les mauvais secteurs. Si le volume persiste à ne pas vouloir se monter, vous pouvez utiliser l’option -d de ntfsfix qui efface le drapeau “dirty” du volume.

Enfin après tout ceci, il nous reste à monter l’image en lecture seule:

mount -o loop,ro -t ntfs /mnt/rescue/sdb3.img /mnt/cdrom

Et là, normalement, tout se trouvera dans le répertoire /mnt/cdrom.

Partie à réaliser:
* Récupération de fichiers effacés ou perdus

Ressources:

Friday, 25 January 2013

Installer une gentoo 64 bits sur un toshiba portege R830-137

Facteur d'entropie | 17:02, Friday, 25 January 2013

Encore un billet bloc-note qui évoluera (manque la partie graphique à faire)

Caractéristiques de l’installation:

  • Gentoo 64 bits
  • UTF-8
  • Btrfs
  • Cryptage de la swap et des partitions
  • Utilisation du lecteur d’empreintes digitales
  • Fluxbox (A faire)
  • Conky (A faire)
  • Installation / Utilisation de toshset

Caractéristiques de la machine:

  • Proc: Intel Corei7 – 2620M:
  • Mémoire: 4 Go
  • Disque dur SSD de 256 Go SATA
  • 3G: F5521 21/5.76 HSPA
uname -a
Linux ulysse 3.5.7-gentoo #1 SMP Wed Oct 31 03:12:52 CET 2012 x86_64 Intel(R) Core(TM) i7-2620M CPU @ 2.70GHz GenuineIntel GNU/Linux

lspci
00:00.0 Host bridge: Intel Corporation 2nd Generation Core Processor Family DRAM Controller (rev 09)
00:02.0 VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (rev 09)
00:16.0 Communication controller: Intel Corporation 6 Series/C200 Series Chipset Family MEI Controller #1 (rev 04)
00:16.3 Serial controller: Intel Corporation 6 Series/C200 Series Chipset Family KT Controller (rev 04)
00:19.0 Ethernet controller: Intel Corporation 82579LM Gigabit Network Connection (rev 04)
00:1a.0 USB controller: Intel Corporation 6 Series/C200 Series Chipset Family USB Enhanced Host Controller #2 (rev 04)
00:1b.0 Audio device: Intel Corporation 6 Series/C200 Series Chipset Family High Definition Audio Controller (rev 04)
00:1c.0 PCI bridge: Intel Corporation 6 Series/C200 Series Chipset Family PCI Express Root Port 1 (rev b4)
00:1c.1 PCI bridge: Intel Corporation 6 Series/C200 Series Chipset Family PCI Express Root Port 2 (rev b4)
00:1c.2 PCI bridge: Intel Corporation 6 Series/C200 Series Chipset Family PCI Express Root Port 3 (rev b4)
00:1c.4 PCI bridge: Intel Corporation 6 Series/C200 Series Chipset Family PCI Express Root Port 5 (rev b4)
00:1c.5 PCI bridge: Intel Corporation 6 Series/C200 Series Chipset Family PCI Express Root Port 6 (rev b4)
00:1c.6 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev b4)
00:1d.0 USB controller: Intel Corporation 6 Series/C200 Series Chipset Family USB Enhanced Host Controller #1 (rev 04)
00:1f.0 ISA bridge: Intel Corporation QM67 Express Chipset Family LPC Controller (rev 04)
00:1f.2 SATA controller: Intel Corporation 6 Series/C200 Series Chipset Family 6 port SATA AHCI Controller (rev 04)
01:00.0 System peripheral: Ricoh Co Ltd PCIe SDXC/MMC Host Controller (rev 04)
04:00.0 Network controller: Intel Corporation Centrino Advanced-N 6230 (rev 34)
05:00.0 USB controller: NEC Corporation uPD720200 USB 3.0 Host Controller (rev 04)

lsusb
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 08ff:168b AuthenTec, Inc.
Bus 001 Device 005: ID 0bda:58e5 Realtek Semiconductor Corp.
Bus 001 Device 006: ID 0930:1314 Toshiba Corp.
Bus 002 Device 004: ID 8086:0189 Intel Corp.

L’accès au BIOS se fait en pressant la touche F2 au démarrage.

Préambule:

  1. Création des dvd de restauration
  2. Enregistrer vos empreintes digitales (Pour le contrôle lors du lancement de la machine)

Une fois tout ceci fini, on va pouvoir se concentrer sur l’installation. Pour ceci, on va suivre un schéma d’action
très général qui correspond peu ou prou aux installations habituelles:

  1. On boot la machine grâce à un livecd contenant les outils nécessaires aux opérations de base: partitionnement, formatage, cryptage, etc. On peut aussi se servir d’une image réseau. Bref on démarre la machine avec une trousse à outils adéquate
  2. La machine boot et le système s’installe dans la mémoire. On va pouvoir travailler sur le disque. On le partitionne et on formate les partitions avec le système de fichier choisit
  3. On va monter le partitions sur la racine du système actuel qui se trouve être en mémoire.
  4. On va activer la swap, binder le répertoire /dev contenant les références aux périphériques et monter le répertoire /proc
  5. A ce moment, on dispose d’un support disque bien en place. On va y installer une archives contenant les outils de base de gentoo (la toolchain, les outils systèmes, le shell, les outils permettant de gérer la distribution, etc) ainsi qu’une archive contenant l’arbre portage. On fait ça en récupérant un tarball directement sur le site de gentoo.
  6. Ceci fait, notre arborescence est complète sur le disque et l’on a pas mal d’outils pour continuer: on va se chrooter dans la nouvelle arborescence.
  7. Il ne nous reste plus qu’à paramétrer notre système (table des partitions, configuration réseau), compiler le noyau, installer du bootloader et encore quelques outils comme la journalisation, cron, etc.
  8. Enfin, on sort du chroot, on démonte toutes les partitions et on reboot. Voilà c’est fait !

Une fois le boot terminé et que l’on a accès à la console, on va configurer
quelques trucs:
* La langue

loadkeys fr

* L’accès au réseau (eth0)

dhcpcd eth0

Préparation du disque

On efface complètement le disque dur (Peut prendre du temps selon la taille du hd)

shred -n 7 /dev/sda

On partitionne:
fidsk /dev/sda #on commence à 2048
/boot ext2 32M
swap 8G
/ le reste (dispo pour lvm+ext4 ou btrfs)
On formate /boot

mke2fs /dev/sda1

On crypte la swap

cryptsetup -c blowfish -h sha256 -d /dev/urandom create swap /dev/sda2
mkswap /dev/mapper/swap
swapon /dev/mapper/swap

On monte la clé USB
On va y générer une clé aléatoire, on crypte la partition avec, puis on active la partition cryptée

mount /dev/sdb1 /mnt/key
dd if=/dev/random count=1 of=/mnt/key/root_key
cryptsetup -v --cipher serpent-cbc-essiv:sha256 --key-size 256 luksFormat /dev/sda3 /mnt/key/root_key
cryptsetup --key-file /mnt/key/root_key luksOpen /dev/sda3 root

On peut rajouter un mot de passe en cas de perte de la clé:

cryptsetup luksAddKey /dev/sda3 --key-file /mnt/usb/root_key

Formatage / Organisation du disque

Alternative 1 (lvm + ext4)
On va créé les volumes et tout le reste pour LVM2

pvcreate --dataalignment 512k /dev/mapper/root
vgcreate --physicalextentsize 512k vg_ssd /dev/mapper/root
lvcreate -L10G -nroot vg_ssd
lvcreate -L10G -nusr vg_ssd
lvcreate -L30G -nhome vg_ssd
lvcreate -L4G -nvar vg_ssd

Puis, on formate en ext4. (classique)

Alternative 2 (Btrfs)
Pour ceci, si vous n’avez pas les binaires dans le livecd, vous récupérez
les sources puis vous compilez en static (make LDFLAGS=-all-static)
Vous mettez tout ça sur une clé usb puis direction la machine à formater.
On formate et on monte:

mkfs.btrfs -L GENTOO_ROOT /dev/mapper/root
mkdir /mnt/btrfs
mount -t btrfs -o compress,compress-force,ssd,noacl /dev/mapper/root /mnt/btrfs
btrfsctl -S system /mnt/btrfs
btrfsctl -S var /mnt/btrfs
btrfsctl -S usr /mnt/btrfs
btrfsctl -S home /mnt/btrfs
umount /mnt/btrfs
mount /dev/mapper/root -o subvol=system,compress,ssd /mnt/gentoo
mkdir /mnt/gentoo/{usr,var,home,boot}
mount /dev/mapper/root -o subvol=usr,compress,ssd /mnt/gentoo/usr
mount /dev/mapper/root -o subvol=var,compress,ssd /mnt/gentoo/var
mount /dev/mapper/root -o subvol=home,compress,ssd /mnt/gentoo/home
mount /dev/sda1 /mnt/gentoo/boot

Portage et autres trucs du manuel

Ici on suit le manuel d’installation avec ce fichier /etc/portage/make.conf dans le chroot.

CFLAGS="-O2 -march=corei7 -pipe"
CXXFLAGS="${CFLAGS}"
CHOST="x86_64-pc-linux-gnu"
USE="mmx sse sse2 sse3 ssse3 mmx X -kde -gnome alsa dvd cdr dvdr gnutls ldap gcrypt
acpi bash-completion vim-syntax unicode jpeg tiff udev xinerama startup-notification
djvu png qt4 curl nsplugin xml libnotify truetype usb v4l v4l2 python perl xft opengl
urandom vaapi pulseaudio caps tcpd udev glib libsamplerate"
MAKEOPTS="-j5 -l4"
LINGUAS="fr"
VIDEO_CARDS="intel"
DISTDIR="/var/portage/distfiles"
INPUT_DEVICES="evdev keyboard mouse wacom synaptics"
KBUILD_OUTPUT="/mnt/work"
source /var/lib/layman/make.conf

* On peut ré-utiliser les binaires statics de btrfs pour la génération de l’initram

Comme on est sur un ssd, on va compiler sur un disque mémoire tmpfs qui sera monté sur /var/tmp/portage. De même
on va monter l’arbre portage sur une image squashfs.

mount -t tmpfs -o size=2G tmpfs /usr/portage
mount -t tmpfs -o size=2G tmpfs /var/tmp/portage (utilisé pour les compilations)
emerge-webrsync
mkdir -p /var/portage/distfiles
mksquashfs /usr/portage /var/portage/portage.sqsh (créé l'archive squashfs que l'on montera à chaque démarrage)

* On se localise en utf8
on va créer le fichier /etc/env.d/02locale et y placer:

LANG="fr_FR.UTF-8"
LC_COLLATE="C"

Initram

USE="static" emerge -D busybox
mkdir /usr/src/initramfs
cd /usr/src/initramfs
mkdir -p bin lib dev etc mnt/root mnt/key proc root sbin sys
cp -a /dev/{console,null,random,sda1,tty,urandom} ./dev/
cp -a /bin/busybox /usr/src/initramfs/bin/
cp -a /sbin/cryptsetup /usr/src/initramfs/bin/
On va y ajouter un fichier init à la racine
nano /usr/src/initramfs/init

Contenu du fichier init:

#!/bin/busybox sh
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs none /dev
sleep 3
mount /dev/sdb2 /mnt/key

cryptsetup --key-file /mnt/key/root_key luksOpen /dev/sda2 swap &&
cryptsetup --key-file /mnt/key/root_key luksOpen /dev/sda3 root &&
mount -t btrfs -o ro,subvol=system,ssd,compress /dev/mapper/root /mnt/root

umount /{mnt/key,proc,sys,dev}

exec switch_root /mnt/root /sbin/init
chmod +x /usr/src/initramfs/init
find . -print0 | cpio --null -ov --format=newc | gzip -9 > /boot/initramfs.cpio.gz

Le noyau

Pour ça, on va recréé un système de fichier tmpfs et on va compiler dessus

emerge gentoo-sources
mkdir /mnt/work
mount -t tmps -o size=2G tmpfs /mnt/work
cd /usr/src/linux
make O=/mnt/work menuconfig    #Ici on n'oublie pas l'option du support de initramfs
make O=/mnt/work
make O=/mnt/work modules_install
cp /mnt/work/{System.map,arch/x86/boot/bzImage} /boot/

Et hop, le noyau est installé

Le fichier de conf du noyau (version 3.7):

CONFIG_64BIT=y
CONFIG_X86_64=y
CONFIG_X86=y
CONFIG_INSTRUCTION_DECODER=y
CONFIG_OUTPUT_FORMAT="elf64-x86-64"
CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"
CONFIG_LOCKDEP_SUPPORT=y
CONFIG_STACKTRACE_SUPPORT=y
CONFIG_HAVE_LATENCYTOP_SUPPORT=y
CONFIG_MMU=y
CONFIG_NEED_DMA_MAP_STATE=y
CONFIG_NEED_SG_DMA_LENGTH=y
CONFIG_GENERIC_ISA_DMA=y
CONFIG_GENERIC_BUG=y
CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
CONFIG_GENERIC_HWEIGHT=y
CONFIG_GENERIC_GPIO=y
CONFIG_ARCH_MAY_HAVE_PC_FDC=y
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
CONFIG_GENERIC_CALIBRATE_DELAY=y
CONFIG_ARCH_HAS_CPU_RELAX=y
CONFIG_ARCH_HAS_DEFAULT_IDLE=y
CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
CONFIG_ARCH_HAS_CPU_AUTOPROBE=y
CONFIG_HAVE_SETUP_PER_CPU_AREA=y
CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y
CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
CONFIG_ARCH_SUSPEND_POSSIBLE=y
CONFIG_ZONE_DMA32=y
CONFIG_AUDIT_ARCH=y
CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=y
CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
CONFIG_X86_64_SMP=y
CONFIG_X86_HT=y
CONFIG_ARCH_HWEIGHT_CFLAGS="-fcall-saved-rdi -fcall-saved-rsi -fcall-saved-rdx -fcall-saved-rcx -fcall-saved-r8 -fcall-saved-r9 -fcall-saved-r10 -fcall-saved-r11"
CONFIG_ARCH_CPU_PROBE_RELEASE=y
CONFIG_ARCH_SUPPORTS_UPROBES=y
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
CONFIG_HAVE_IRQ_WORK=y
CONFIG_IRQ_WORK=y
CONFIG_BUILDTIME_EXTABLE_SORT=y
CONFIG_EXPERIMENTAL=y
CONFIG_INIT_ENV_ARG_LIMIT=32
CONFIG_CROSS_COMPILE=""
CONFIG_LOCALVERSION=""
CONFIG_HAVE_KERNEL_GZIP=y
CONFIG_HAVE_KERNEL_BZIP2=y
CONFIG_HAVE_KERNEL_LZMA=y
CONFIG_HAVE_KERNEL_XZ=y
CONFIG_HAVE_KERNEL_LZO=y
CONFIG_KERNEL_GZIP=y
CONFIG_DEFAULT_HOSTNAME="dervishe.net"
CONFIG_SWAP=y
CONFIG_SYSVIPC=y
CONFIG_SYSVIPC_SYSCTL=y
CONFIG_POSIX_MQUEUE=y
CONFIG_POSIX_MQUEUE_SYSCTL=y
CONFIG_BSD_PROCESS_ACCT=y
CONFIG_TASKSTATS=y
CONFIG_TASK_DELAY_ACCT=y
CONFIG_TASK_XACCT=y
CONFIG_TASK_IO_ACCOUNTING=y
CONFIG_AUDIT=y
CONFIG_AUDITSYSCALL=y
CONFIG_AUDIT_WATCH=y
CONFIG_AUDIT_TREE=y
CONFIG_HAVE_GENERIC_HARDIRQS=y
CONFIG_GENERIC_HARDIRQS=y
CONFIG_GENERIC_IRQ_PROBE=y
CONFIG_GENERIC_IRQ_SHOW=y
CONFIG_GENERIC_PENDING_IRQ=y
CONFIG_IRQ_FORCED_THREADING=y
CONFIG_SPARSE_IRQ=y
CONFIG_CLOCKSOURCE_WATCHDOG=y
CONFIG_ARCH_CLOCKSOURCE_DATA=y
CONFIG_GENERIC_TIME_VSYSCALL=y
CONFIG_GENERIC_CLOCKEVENTS=y
CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y
CONFIG_GENERIC_CMOS_UPDATE=y
CONFIG_TICK_ONESHOT=y
CONFIG_NO_HZ=y
CONFIG_HIGH_RES_TIMERS=y
CONFIG_TREE_RCU=y
CONFIG_RCU_FANOUT=64
CONFIG_RCU_FANOUT_LEAF=16
CONFIG_IKCONFIG=m
CONFIG_IKCONFIG_PROC=y
CONFIG_LOG_BUF_SHIFT=18
CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y
CONFIG_CGROUPS=y
CONFIG_CGROUP_FREEZER=y
CONFIG_CPUSETS=y
CONFIG_PROC_PID_CPUSET=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_RESOURCE_COUNTERS=y
CONFIG_CGROUP_SCHED=y
CONFIG_FAIR_GROUP_SCHED=y
CONFIG_CHECKPOINT_RESTORE=y
CONFIG_SYSFS_DEPRECATED=y
CONFIG_SYSFS_DEPRECATED_V2=y
CONFIG_RELAY=y
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE=""
CONFIG_RD_GZIP=y
CONFIG_SYSCTL=y
CONFIG_ANON_INODES=y
CONFIG_EXPERT=y
CONFIG_UID16=y
CONFIG_SYSCTL_SYSCALL=y
CONFIG_KALLSYMS=y
CONFIG_HOTPLUG=y
CONFIG_PRINTK=y
CONFIG_BUG=y
CONFIG_ELF_CORE=y
CONFIG_PCSPKR_PLATFORM=y
CONFIG_HAVE_PCSPKR_PLATFORM=y
CONFIG_BASE_FULL=y
CONFIG_FUTEX=y
CONFIG_EPOLL=y
CONFIG_SIGNALFD=y
CONFIG_TIMERFD=y
CONFIG_EVENTFD=y
CONFIG_SHMEM=y
CONFIG_AIO=y
CONFIG_HAVE_PERF_EVENTS=y
CONFIG_PERF_EVENTS=y
CONFIG_VM_EVENT_COUNTERS=y
CONFIG_PCI_QUIRKS=y
CONFIG_SLUB_DEBUG=y
CONFIG_SLUB=y
CONFIG_PROFILING=y
CONFIG_TRACEPOINTS=y
CONFIG_HAVE_OPROFILE=y
CONFIG_OPROFILE_NMI_TIMER=y
CONFIG_KPROBES=y
CONFIG_OPTPROBES=y
CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
CONFIG_KRETPROBES=y
CONFIG_USER_RETURN_NOTIFIER=y
CONFIG_HAVE_IOREMAP_PROT=y
CONFIG_HAVE_KPROBES=y
CONFIG_HAVE_KRETPROBES=y
CONFIG_HAVE_OPTPROBES=y
CONFIG_HAVE_ARCH_TRACEHOOK=y
CONFIG_HAVE_DMA_ATTRS=y
CONFIG_USE_GENERIC_SMP_HELPERS=y
CONFIG_GENERIC_SMP_IDLE_THREAD=y
CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
CONFIG_HAVE_DMA_API_DEBUG=y
CONFIG_HAVE_HW_BREAKPOINT=y
CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y
CONFIG_HAVE_USER_RETURN_NOTIFIER=y
CONFIG_HAVE_PERF_EVENTS_NMI=y
CONFIG_HAVE_ARCH_JUMP_LABEL=y
CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y
CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y
CONFIG_HAVE_CMPXCHG_LOCAL=y
CONFIG_HAVE_CMPXCHG_DOUBLE=y
CONFIG_ARCH_WANT_OLD_COMPAT_IPC=y
CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
CONFIG_SECCOMP_FILTER=y
CONFIG_SLABINFO=y
CONFIG_RT_MUTEXES=y
CONFIG_BASE_SMALL=0
CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
CONFIG_MODULE_FORCE_UNLOAD=y
CONFIG_STOP_MACHINE=y
CONFIG_BLOCK=y
CONFIG_BLK_DEV_BSG=y
CONFIG_PARTITION_ADVANCED=y
CONFIG_OSF_PARTITION=y
CONFIG_AMIGA_PARTITION=y
CONFIG_MAC_PARTITION=y
CONFIG_MSDOS_PARTITION=y
CONFIG_BSD_DISKLABEL=y
CONFIG_MINIX_SUBPARTITION=y
CONFIG_SOLARIS_X86_PARTITION=y
CONFIG_UNIXWARE_DISKLABEL=y
CONFIG_SGI_PARTITION=y
CONFIG_SUN_PARTITION=y
CONFIG_KARMA_PARTITION=y
CONFIG_EFI_PARTITION=y
CONFIG_BLOCK_COMPAT=y
CONFIG_IOSCHED_NOOP=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y
CONFIG_DEFAULT_CFQ=y
CONFIG_DEFAULT_IOSCHED="cfq"
CONFIG_PREEMPT_NOTIFIERS=y
CONFIG_PADATA=y
CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
CONFIG_INLINE_READ_UNLOCK=y
CONFIG_INLINE_READ_UNLOCK_IRQ=y
CONFIG_INLINE_WRITE_UNLOCK=y
CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
CONFIG_MUTEX_SPIN_ON_OWNER=y
CONFIG_FREEZER=y
CONFIG_ZONE_DMA=y
CONFIG_SMP=y
CONFIG_X86_MPPARSE=y
CONFIG_X86_EXTENDED_PLATFORM=y
CONFIG_X86_SUPPORTS_MEMORY_FAILURE=y
CONFIG_SCHED_OMIT_FRAME_POINTER=y
CONFIG_NO_BOOTMEM=y
CONFIG_MEMTEST=y
CONFIG_MCORE2=y
CONFIG_X86_INTERNODE_CACHE_SHIFT=6
CONFIG_X86_CMPXCHG=y
CONFIG_X86_L1_CACHE_SHIFT=6
CONFIG_X86_XADD=y
CONFIG_X86_WP_WORKS_OK=y
CONFIG_X86_INTEL_USERCOPY=y
CONFIG_X86_USE_PPRO_CHECKSUM=y
CONFIG_X86_P6_NOP=y
CONFIG_X86_TSC=y
CONFIG_X86_CMPXCHG64=y
CONFIG_X86_CMOV=y
CONFIG_X86_MINIMUM_CPU_FAMILY=64
CONFIG_X86_DEBUGCTLMSR=y
CONFIG_PROCESSOR_SELECT=y
CONFIG_CPU_SUP_INTEL=y
CONFIG_HPET_TIMER=y
CONFIG_HPET_EMULATE_RTC=y
CONFIG_DMI=y
CONFIG_SWIOTLB=y
CONFIG_IOMMU_HELPER=y
CONFIG_NR_CPUS=64
CONFIG_SCHED_SMT=y
CONFIG_SCHED_MC=y
CONFIG_PREEMPT_VOLUNTARY=y
CONFIG_X86_LOCAL_APIC=y
CONFIG_X86_IO_APIC=y
CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y
CONFIG_X86_MCE=y
CONFIG_X86_MCE_INTEL=y
CONFIG_X86_MCE_THRESHOLD=y
CONFIG_X86_THERMAL_VECTOR=y
CONFIG_MICROCODE=y
CONFIG_MICROCODE_INTEL=y
CONFIG_MICROCODE_OLD_INTERFACE=y
CONFIG_X86_MSR=y
CONFIG_X86_CPUID=y
CONFIG_ARCH_PHYS_ADDR_T_64BIT=y
CONFIG_ARCH_DMA_ADDR_T_64BIT=y
CONFIG_DIRECT_GBPAGES=y
CONFIG_NUMA=y
CONFIG_X86_64_ACPI_NUMA=y
CONFIG_NODES_SPAN_OTHER_NODES=y
CONFIG_NODES_SHIFT=6
CONFIG_ARCH_SPARSEMEM_ENABLE=y
CONFIG_ARCH_SPARSEMEM_DEFAULT=y
CONFIG_ARCH_SELECT_MEMORY_MODEL=y
CONFIG_ARCH_PROC_KCORE_TEXT=y
CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
CONFIG_SELECT_MEMORY_MODEL=y
CONFIG_SPARSEMEM_MANUAL=y
CONFIG_SPARSEMEM=y
CONFIG_NEED_MULTIPLE_NODES=y
CONFIG_HAVE_MEMORY_PRESENT=y
CONFIG_SPARSEMEM_EXTREME=y
CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
CONFIG_SPARSEMEM_ALLOC_MEM_MAP_TOGETHER=y
CONFIG_SPARSEMEM_VMEMMAP=y
CONFIG_HAVE_MEMBLOCK=y
CONFIG_HAVE_MEMBLOCK_NODE_MAP=y
CONFIG_ARCH_DISCARD_MEMBLOCK=y
CONFIG_PAGEFLAGS_EXTENDED=y
CONFIG_SPLIT_PTLOCK_CPUS=4
CONFIG_COMPACTION=y
CONFIG_MIGRATION=y
CONFIG_PHYS_ADDR_T_64BIT=y
CONFIG_ZONE_DMA_FLAG=1
CONFIG_BOUNCE=y
CONFIG_VIRT_TO_BUS=y
CONFIG_MMU_NOTIFIER=y
CONFIG_KSM=y
CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y
CONFIG_TRANSPARENT_HUGEPAGE=y
CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
CONFIG_CROSS_MEMORY_ATTACH=y
CONFIG_CLEANCACHE=y
CONFIG_X86_CHECK_BIOS_CORRUPTION=y
CONFIG_X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK=y
CONFIG_X86_RESERVE_LOW=64
CONFIG_MTRR=y
CONFIG_MTRR_SANITIZER=y
CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT=0
CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT=1
CONFIG_X86_PAT=y
CONFIG_ARCH_USES_PG_UNCACHED=y
CONFIG_ARCH_RANDOM=y
CONFIG_EFI=y
CONFIG_SECCOMP=y
CONFIG_CC_STACKPROTECTOR=y
CONFIG_HZ_1000=y
CONFIG_HZ=1000
CONFIG_SCHED_HRTICK=y
CONFIG_KEXEC=y
CONFIG_CRASH_DUMP=y
CONFIG_PHYSICAL_START=0x1000000
CONFIG_RELOCATABLE=y
CONFIG_PHYSICAL_ALIGN=0x1000000
CONFIG_HOTPLUG_CPU=y
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
CONFIG_USE_PERCPU_NUMA_NODE_ID=y
CONFIG_ARCH_HIBERNATION_HEADER=y
CONFIG_SUSPEND=y
CONFIG_SUSPEND_FREEZER=y
CONFIG_HIBERNATE_CALLBACKS=y
CONFIG_HIBERNATION=y
CONFIG_PM_STD_PARTITION="/dev/mapper/swap"
CONFIG_PM_SLEEP=y
CONFIG_PM_SLEEP_SMP=y
CONFIG_PM_RUNTIME=y
CONFIG_PM=y
CONFIG_PM_DEBUG=y
CONFIG_PM_ADVANCED_DEBUG=y
CONFIG_CAN_PM_TRACE=y
CONFIG_ACPI=y
CONFIG_ACPI_SLEEP=y
CONFIG_ACPI_PROCFS=y
CONFIG_ACPI_PROCFS_POWER=y
CONFIG_ACPI_PROC_EVENT=y
CONFIG_ACPI_AC=m
CONFIG_ACPI_BATTERY=m
CONFIG_ACPI_BUTTON=y
CONFIG_ACPI_VIDEO=y
CONFIG_ACPI_FAN=m
CONFIG_ACPI_DOCK=y
CONFIG_ACPI_PROCESSOR=m
CONFIG_ACPI_HOTPLUG_CPU=y
CONFIG_ACPI_PROCESSOR_AGGREGATOR=m
CONFIG_ACPI_THERMAL=m
CONFIG_ACPI_NUMA=y
CONFIG_ACPI_BLACKLIST_YEAR=0
CONFIG_ACPI_PCI_SLOT=m
CONFIG_X86_PM_TIMER=y
CONFIG_ACPI_CONTAINER=m
CONFIG_ACPI_SBS=m
CONFIG_ACPI_HED=y
CONFIG_ACPI_CUSTOM_METHOD=m
CONFIG_ACPI_BGRT=m
CONFIG_ACPI_APEI=y
CONFIG_ACPI_APEI_GHES=y
CONFIG_ACPI_APEI_PCIEAER=y
CONFIG_ACPI_APEI_EINJ=m
CONFIG_ACPI_APEI_ERST_DEBUG=m
CONFIG_CPU_FREQ=y
CONFIG_CPU_FREQ_TABLE=y
CONFIG_CPU_FREQ_STAT=m
CONFIG_CPU_FREQ_STAT_DETAILS=y
CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
CONFIG_CPU_FREQ_GOV_POWERSAVE=m
CONFIG_CPU_FREQ_GOV_USERSPACE=m
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
CONFIG_X86_PCC_CPUFREQ=m
CONFIG_X86_ACPI_CPUFREQ=m
CONFIG_CPU_IDLE=y
CONFIG_CPU_IDLE_GOV_LADDER=y
CONFIG_CPU_IDLE_GOV_MENU=y
CONFIG_INTEL_IDLE=y
CONFIG_PCI=y
CONFIG_PCI_DIRECT=y
CONFIG_PCI_MMCONFIG=y
CONFIG_PCI_DOMAINS=y
CONFIG_PCIEPORTBUS=y
CONFIG_PCIEAER=y
CONFIG_PCIE_ECRC=y
CONFIG_PCIEASPM=y
CONFIG_PCIEASPM_DEBUG=y
CONFIG_PCIEASPM_POWERSAVE=y
CONFIG_PCIE_PME=y
CONFIG_ARCH_SUPPORTS_MSI=y
CONFIG_HT_IRQ=y
CONFIG_PCI_IOAPIC=y
CONFIG_PCI_LABEL=y
CONFIG_ISA_DMA_API=y
CONFIG_BINFMT_ELF=y
CONFIG_COMPAT_BINFMT_ELF=y
CONFIG_ARCH_BINFMT_ELF_RANDOMIZE_PIE=y
CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
CONFIG_BINFMT_MISC=y
CONFIG_IA32_EMULATION=y
CONFIG_COMPAT=y
CONFIG_COMPAT_FOR_U64_ALIGNMENT=y
CONFIG_SYSVIPC_COMPAT=y
CONFIG_KEYS_COMPAT=y
CONFIG_HAVE_TEXT_POKE_SMP=y
CONFIG_X86_DEV_DMA_OPS=y
CONFIG_NET=y
CONFIG_PACKET=m
CONFIG_UNIX=m
CONFIG_UNIX_DIAG=m
CONFIG_XFRM=y
CONFIG_XFRM_ALGO=m
CONFIG_XFRM_USER=m
CONFIG_NET_KEY=m
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
CONFIG_IP_ADVANCED_ROUTER=y
CONFIG_IP_MULTIPLE_TABLES=y
CONFIG_IP_ROUTE_MULTIPATH=y
CONFIG_IP_ROUTE_VERBOSE=y
CONFIG_IP_ROUTE_CLASSID=y
CONFIG_IP_PNP=y
CONFIG_IP_PNP_DHCP=y
CONFIG_IP_PNP_BOOTP=y
CONFIG_IP_PNP_RARP=y
CONFIG_NET_IPIP=m
CONFIG_NET_IPGRE_DEMUX=m
CONFIG_NET_IPGRE=m
CONFIG_NET_IPGRE_BROADCAST=y
CONFIG_IP_MROUTE=y
CONFIG_IP_PIMSM_V1=y
CONFIG_IP_PIMSM_V2=y
CONFIG_SYN_COOKIES=y
CONFIG_INET_TUNNEL=m
CONFIG_INET_LRO=m
CONFIG_INET_DIAG=m
CONFIG_INET_TCP_DIAG=m
CONFIG_INET_UDP_DIAG=m
CONFIG_TCP_CONG_ADVANCED=y
CONFIG_TCP_CONG_CUBIC=y
CONFIG_DEFAULT_CUBIC=y
CONFIG_DEFAULT_TCP_CONG="cubic"
CONFIG_TCP_MD5SIG=y
CONFIG_IPV6=m
CONFIG_IPV6_PRIVACY=y
CONFIG_IPV6_ROUTER_PREF=y
CONFIG_IPV6_ROUTE_INFO=y
CONFIG_INET6_AH=m
CONFIG_INET6_ESP=m
CONFIG_INET6_TUNNEL=m
CONFIG_INET6_XFRM_MODE_TRANSPORT=m
CONFIG_INET6_XFRM_MODE_TUNNEL=m
CONFIG_INET6_XFRM_MODE_BEET=m
CONFIG_IPV6_SIT=m
CONFIG_IPV6_NDISC_NODETYPE=y
CONFIG_IPV6_TUNNEL=m
CONFIG_IPV6_MULTIPLE_TABLES=y
CONFIG_IPV6_SUBTREES=y
CONFIG_IPV6_MROUTE=y
CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y
CONFIG_IPV6_PIMSM_V2=y
CONFIG_NETLABEL=y
CONFIG_NETWORK_SECMARK=y
CONFIG_NETFILTER=y
CONFIG_NETFILTER_ADVANCED=y
CONFIG_BRIDGE_NETFILTER=y
CONFIG_NETFILTER_NETLINK=y
CONFIG_NETFILTER_NETLINK_ACCT=m
CONFIG_NETFILTER_NETLINK_QUEUE=m
CONFIG_NETFILTER_NETLINK_LOG=y
CONFIG_NF_CONNTRACK=m
CONFIG_NF_CONNTRACK_MARK=y
CONFIG_NF_CONNTRACK_SECMARK=y
CONFIG_NF_CONNTRACK_ZONES=y
CONFIG_NF_CONNTRACK_PROCFS=y
CONFIG_NF_CONNTRACK_EVENTS=y
CONFIG_NF_CONNTRACK_TIMESTAMP=y
CONFIG_NF_CT_PROTO_DCCP=m
CONFIG_NF_CT_PROTO_GRE=m
CONFIG_NF_CT_PROTO_SCTP=m
CONFIG_NF_CT_PROTO_UDPLITE=m
CONFIG_NF_CONNTRACK_AMANDA=m
CONFIG_NF_CONNTRACK_FTP=m
CONFIG_NF_CONNTRACK_H323=m
CONFIG_NF_CONNTRACK_IRC=m
CONFIG_NF_CONNTRACK_BROADCAST=m
CONFIG_NF_CONNTRACK_NETBIOS_NS=m
CONFIG_NF_CONNTRACK_SNMP=m
CONFIG_NF_CONNTRACK_PPTP=m
CONFIG_NF_CONNTRACK_SANE=m
CONFIG_NF_CONNTRACK_SIP=m
CONFIG_NF_CONNTRACK_TFTP=m
CONFIG_NF_CT_NETLINK=m
CONFIG_NETFILTER_TPROXY=m
CONFIG_NETFILTER_XTABLES=y
CONFIG_NETFILTER_XT_MARK=m
CONFIG_NETFILTER_XT_CONNMARK=m
CONFIG_NETFILTER_XT_TARGET_AUDIT=m
CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m
CONFIG_NETFILTER_XT_TARGET_CT=m
CONFIG_NETFILTER_XT_TARGET_DSCP=m
CONFIG_NETFILTER_XT_TARGET_HL=m
CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m
CONFIG_NETFILTER_XT_TARGET_LED=m
CONFIG_NETFILTER_XT_TARGET_LOG=m
CONFIG_NETFILTER_XT_TARGET_MARK=m
CONFIG_NETFILTER_XT_TARGET_NFLOG=m
CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
CONFIG_NETFILTER_XT_TARGET_NOTRACK=m
CONFIG_NETFILTER_XT_TARGET_RATEEST=m
CONFIG_NETFILTER_XT_TARGET_TEE=m
CONFIG_NETFILTER_XT_TARGET_TPROXY=m
CONFIG_NETFILTER_XT_TARGET_TRACE=m
CONFIG_NETFILTER_XT_TARGET_SECMARK=m
CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m
CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m
CONFIG_NETFILTER_XT_MATCH_CLUSTER=m
CONFIG_NETFILTER_XT_MATCH_COMMENT=m
CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m
CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
CONFIG_NETFILTER_XT_MATCH_CPU=m
CONFIG_NETFILTER_XT_MATCH_DCCP=m
CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m
CONFIG_NETFILTER_XT_MATCH_DSCP=m
CONFIG_NETFILTER_XT_MATCH_ECN=m
CONFIG_NETFILTER_XT_MATCH_ESP=m
CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
CONFIG_NETFILTER_XT_MATCH_HELPER=m
CONFIG_NETFILTER_XT_MATCH_HL=m
CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
CONFIG_NETFILTER_XT_MATCH_LENGTH=m
CONFIG_NETFILTER_XT_MATCH_LIMIT=m
CONFIG_NETFILTER_XT_MATCH_MAC=m
CONFIG_NETFILTER_XT_MATCH_MARK=m
CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
CONFIG_NETFILTER_XT_MATCH_NFACCT=m
CONFIG_NETFILTER_XT_MATCH_OSF=m
CONFIG_NETFILTER_XT_MATCH_OWNER=m
CONFIG_NETFILTER_XT_MATCH_POLICY=m
CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
CONFIG_NETFILTER_XT_MATCH_QUOTA=m
CONFIG_NETFILTER_XT_MATCH_RATEEST=m
CONFIG_NETFILTER_XT_MATCH_REALM=m
CONFIG_NETFILTER_XT_MATCH_RECENT=m
CONFIG_NETFILTER_XT_MATCH_SCTP=m
CONFIG_NETFILTER_XT_MATCH_SOCKET=m
CONFIG_NETFILTER_XT_MATCH_STATE=m
CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
CONFIG_NETFILTER_XT_MATCH_STRING=m
CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
CONFIG_NETFILTER_XT_MATCH_TIME=m
CONFIG_NETFILTER_XT_MATCH_U32=m
CONFIG_NF_DEFRAG_IPV4=m
CONFIG_NF_CONNTRACK_IPV4=m
CONFIG_NF_CONNTRACK_PROC_COMPAT=y
CONFIG_IP_NF_QUEUE=m
CONFIG_IP_NF_IPTABLES=m
CONFIG_IP_NF_MATCH_AH=m
CONFIG_IP_NF_MATCH_ECN=m
CONFIG_IP_NF_MATCH_RPFILTER=m
CONFIG_IP_NF_MATCH_TTL=m
CONFIG_IP_NF_FILTER=m
CONFIG_IP_NF_TARGET_REJECT=m
CONFIG_IP_NF_TARGET_ULOG=m
CONFIG_NF_NAT=m
CONFIG_NF_NAT_NEEDED=y
CONFIG_IP_NF_TARGET_MASQUERADE=m
CONFIG_IP_NF_TARGET_NETMAP=m
CONFIG_IP_NF_TARGET_REDIRECT=m
CONFIG_NF_NAT_SNMP_BASIC=m
CONFIG_NF_NAT_PROTO_DCCP=m
CONFIG_NF_NAT_PROTO_GRE=m
CONFIG_NF_NAT_PROTO_UDPLITE=m
CONFIG_NF_NAT_PROTO_SCTP=m
CONFIG_NF_NAT_FTP=m
CONFIG_NF_NAT_IRC=m
CONFIG_NF_NAT_TFTP=m
CONFIG_NF_NAT_AMANDA=m
CONFIG_NF_NAT_PPTP=m
CONFIG_NF_NAT_H323=m
CONFIG_NF_NAT_SIP=m
CONFIG_IP_NF_MANGLE=m
CONFIG_IP_NF_TARGET_CLUSTERIP=m
CONFIG_IP_NF_TARGET_ECN=m
CONFIG_IP_NF_TARGET_TTL=m
CONFIG_IP_NF_RAW=m
CONFIG_IP_NF_SECURITY=m
CONFIG_IP_NF_ARPTABLES=m
CONFIG_IP_NF_ARPFILTER=m
CONFIG_IP_NF_ARP_MANGLE=m
CONFIG_NF_DEFRAG_IPV6=m
CONFIG_NF_CONNTRACK_IPV6=m
CONFIG_IP6_NF_IPTABLES=m
CONFIG_IP6_NF_MATCH_AH=m
CONFIG_IP6_NF_MATCH_EUI64=m
CONFIG_IP6_NF_MATCH_FRAG=m
CONFIG_IP6_NF_MATCH_OPTS=m
CONFIG_IP6_NF_MATCH_HL=m
CONFIG_IP6_NF_MATCH_IPV6HEADER=m
CONFIG_IP6_NF_MATCH_MH=m
CONFIG_IP6_NF_MATCH_RPFILTER=m
CONFIG_IP6_NF_MATCH_RT=m
CONFIG_IP6_NF_TARGET_HL=m
CONFIG_IP6_NF_FILTER=m
CONFIG_IP6_NF_TARGET_REJECT=m
CONFIG_IP6_NF_MANGLE=m
CONFIG_IP6_NF_RAW=m
CONFIG_IP6_NF_SECURITY=m
CONFIG_IP_SCTP=m
CONFIG_SCTP_HMAC_MD5=y
CONFIG_ATM=m
CONFIG_ATM_CLIP=m
CONFIG_ATM_CLIP_NO_ICMP=y
CONFIG_ATM_LANE=m
CONFIG_ATM_MPOA=m
CONFIG_ATM_BR2684=m
CONFIG_ATM_BR2684_IPFILTER=y
CONFIG_L2TP=m
CONFIG_L2TP_DEBUGFS=m
CONFIG_L2TP_V3=y
CONFIG_L2TP_IP=m
CONFIG_L2TP_ETH=m
CONFIG_STP=m
CONFIG_BRIDGE=m
CONFIG_BRIDGE_IGMP_SNOOPING=y
CONFIG_LLC=m
CONFIG_ATALK=m
CONFIG_DEV_APPLETALK=m
CONFIG_IPDDP=m
CONFIG_IPDDP_ENCAP=y
CONFIG_IPDDP_DECAP=y
CONFIG_PHONET=m
CONFIG_NET_SCHED=y
CONFIG_NET_CLS=y
CONFIG_NET_EMATCH=y
CONFIG_NET_EMATCH_STACK=32
CONFIG_NET_CLS_ACT=y
CONFIG_NET_SCH_FIFO=y
CONFIG_DNS_RESOLVER=y
CONFIG_BATMAN_ADV=m
CONFIG_BATMAN_ADV_BLA=y
CONFIG_RPS=y
CONFIG_RFS_ACCEL=y
CONFIG_XPS=y
CONFIG_BQL=y
CONFIG_BT=m
CONFIG_BT_RFCOMM=m
CONFIG_BT_RFCOMM_TTY=y
CONFIG_BT_BNEP=m
CONFIG_BT_BNEP_MC_FILTER=y
CONFIG_BT_BNEP_PROTO_FILTER=y
CONFIG_BT_HIDP=m
CONFIG_BT_HCIBTUSB=m
CONFIG_BT_HCIBTSDIO=m
CONFIG_BT_HCIUART=m
CONFIG_BT_HCIUART_H4=y
CONFIG_BT_HCIUART_BCSP=y
CONFIG_BT_HCIUART_LL=y
CONFIG_BT_HCIBCM203X=m
CONFIG_BT_HCIBPA10X=m
CONFIG_BT_HCIBFUSB=m
CONFIG_BT_HCIVHCI=m
CONFIG_AF_RXRPC=m
CONFIG_FIB_RULES=y
CONFIG_WIRELESS=y
CONFIG_CFG80211=m
CONFIG_NL80211_TESTMODE=y
CONFIG_CFG80211_DEFAULT_PS=y
CONFIG_LIB80211=m
CONFIG_MAC80211=m
CONFIG_MAC80211_HAS_RC=y
CONFIG_MAC80211_RC_MINSTREL=y
CONFIG_MAC80211_RC_MINSTREL_HT=y
CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y
CONFIG_MAC80211_RC_DEFAULT="minstrel_ht"
CONFIG_MAC80211_LEDS=y
CONFIG_RFKILL=y
CONFIG_RFKILL_LEDS=y
CONFIG_RFKILL_INPUT=y
CONFIG_RFKILL_REGULATOR=y
CONFIG_CAIF=m
CONFIG_CAIF_NETDEV=m
CONFIG_CAIF_USB=m
CONFIG_CEPH_LIB=m
CONFIG_HAVE_BPF_JIT=y
CONFIG_UEVENT_HELPER_PATH=""
CONFIG_DEVTMPFS=y
CONFIG_DEVTMPFS_MOUNT=y
CONFIG_STANDALONE=y
CONFIG_PREVENT_FIRMWARE_BUILD=y
CONFIG_FW_LOADER=y
CONFIG_FIRMWARE_IN_KERNEL=y
CONFIG_EXTRA_FIRMWARE=""
CONFIG_DEBUG_DEVRES=y
CONFIG_DMA_SHARED_BUFFER=y
CONFIG_CONNECTOR=y
CONFIG_PROC_EVENTS=y
CONFIG_PNP=y
CONFIG_PNP_DEBUG_MESSAGES=y
CONFIG_PNPACPI=y
CONFIG_BLK_DEV=y
CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_LOOP_MIN_COUNT=8
CONFIG_BLK_DEV_CRYPTOLOOP=y
CONFIG_BLK_DEV_NBD=m
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_COUNT=16
CONFIG_BLK_DEV_RAM_SIZE=16384
CONFIG_BLK_DEV_XIP=y
CONFIG_SENSORS_LIS3LV02D=m
CONFIG_TIFM_CORE=m
CONFIG_TIFM_7XX1=m
CONFIG_PCH_PHUB=m
CONFIG_SENSORS_LIS3_I2C=m
CONFIG_HAVE_IDE=y
CONFIG_SCSI_MOD=y
CONFIG_SCSI=y
CONFIG_SCSI_DMA=y
CONFIG_SCSI_PROC_FS=y
CONFIG_BLK_DEV_SD=y
CONFIG_BLK_DEV_SR=y
CONFIG_BLK_DEV_SR_VENDOR=y
CONFIG_CHR_DEV_SG=y
CONFIG_SCSI_CONSTANTS=y
CONFIG_SCSI_WAIT_SCAN=m
CONFIG_SCSI_SPI_ATTRS=y
CONFIG_ATA=y
CONFIG_ATA_VERBOSE_ERROR=y
CONFIG_ATA_ACPI=y
CONFIG_SATA_PMP=y
CONFIG_SATA_AHCI=y
CONFIG_ATA_SFF=y
CONFIG_ATA_BMDMA=y
CONFIG_ATA_PIIX=y
CONFIG_PATA_OLDPIIX=y
CONFIG_PATA_SCH=y
CONFIG_PATA_MPIIX=m
CONFIG_PATA_ACPI=m
CONFIG_MD=y
CONFIG_BLK_DEV_MD=y
CONFIG_MD_AUTODETECT=y
CONFIG_BLK_DEV_DM=y
CONFIG_DM_CRYPT=y
CONFIG_DM_SNAPSHOT=y
CONFIG_DM_MIRROR=y
CONFIG_DM_ZERO=y
CONFIG_I2O=y
CONFIG_I2O_LCT_NOTIFY_ON_CHANGES=y
CONFIG_I2O_EXT_ADAPTEC=y
CONFIG_I2O_EXT_ADAPTEC_DMA64=y
CONFIG_I2O_CONFIG=m
CONFIG_I2O_CONFIG_OLD_IOCTL=y
CONFIG_I2O_BUS=m
CONFIG_I2O_BLOCK=m
CONFIG_I2O_SCSI=m
CONFIG_I2O_PROC=m
CONFIG_NETDEVICES=y
CONFIG_NET_CORE=y
CONFIG_BONDING=m
CONFIG_MII=m
CONFIG_NETCONSOLE=y
CONFIG_NETPOLL=y
CONFIG_NET_POLL_CONTROLLER=y
CONFIG_ATM_DRIVERS=y
CONFIG_ETHERNET=y
CONFIG_NET_VENDOR_INTEL=y
CONFIG_E1000E=y
CONFIG_NET_VENDOR_WIZNET=y
CONFIG_USB_USBNET=m
CONFIG_USB_NET_AX8817X=m
CONFIG_USB_NET_CDCETHER=m
CONFIG_USB_NET_CDC_EEM=m
CONFIG_USB_NET_CDC_NCM=m
CONFIG_USB_NET_NET1080=m
CONFIG_USB_NET_CDC_SUBSET=m
CONFIG_USB_BELKIN=y
CONFIG_USB_ARMLINUX=y
CONFIG_USB_NET_ZAURUS=m
CONFIG_USB_HSO=m
CONFIG_USB_CDC_PHONET=m
CONFIG_USB_IPHETH=m
CONFIG_WLAN=y
CONFIG_IWLWIFI=m
CONFIG_IWLWIFI_DEVICE_TESTMODE=y
CONFIG_IWLWIFI_P2P=y
CONFIG_IWLWIFI_EXPERIMENTAL_MFP=y
CONFIG_VMXNET3=m
CONFIG_INPUT=y
CONFIG_INPUT_FF_MEMLESS=y
CONFIG_INPUT_POLLDEV=y
CONFIG_INPUT_SPARSEKMAP=m
CONFIG_INPUT_MOUSEDEV=y
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
CONFIG_INPUT_EVDEV=y
CONFIG_INPUT_KEYBOARD=y
CONFIG_KEYBOARD_ATKBD=y
CONFIG_INPUT_MOUSE=y
CONFIG_MOUSE_PS2=y
CONFIG_MOUSE_PS2_ALPS=y
CONFIG_MOUSE_PS2_LOGIPS2PP=y
CONFIG_MOUSE_PS2_SYNAPTICS=y
CONFIG_MOUSE_PS2_LIFEBOOK=y
CONFIG_MOUSE_PS2_TRACKPOINT=y
CONFIG_MOUSE_SYNAPTICS_I2C=m
CONFIG_INPUT_TABLET=y
CONFIG_TABLET_USB_WACOM=m
CONFIG_SERIO=y
CONFIG_SERIO_I8042=y
CONFIG_SERIO_SERPORT=y
CONFIG_SERIO_LIBPS2=y
CONFIG_VT=y
CONFIG_CONSOLE_TRANSLATIONS=y
CONFIG_VT_CONSOLE=y
CONFIG_VT_CONSOLE_SLEEP=y
CONFIG_HW_CONSOLE=y
CONFIG_VT_HW_CONSOLE_BINDING=y
CONFIG_UNIX98_PTYS=y
CONFIG_SERIAL_NONSTANDARD=y
CONFIG_N_GSM=m
CONFIG_KCOPY=m
CONFIG_DEVKMEM=y
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_FIX_EARLYCON_MEM=y
CONFIG_SERIAL_8250_PCI=y
CONFIG_SERIAL_8250_PNP=y
CONFIG_SERIAL_8250_NR_UARTS=32
CONFIG_SERIAL_8250_RUNTIME_UARTS=4
CONFIG_SERIAL_8250_EXTENDED=y
CONFIG_SERIAL_8250_MANY_PORTS=y
CONFIG_SERIAL_8250_SHARE_IRQ=y
CONFIG_SERIAL_8250_DETECT_IRQ=y
CONFIG_SERIAL_8250_RSA=y
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y
CONFIG_HW_RANDOM=y
CONFIG_HW_RANDOM_INTEL=y
CONFIG_NVRAM=y
CONFIG_HPET=y
CONFIG_TCG_TPM=y
CONFIG_TCG_TIS=y
CONFIG_TCG_NSC=m
CONFIG_TCG_ATMEL=m
CONFIG_TCG_INFINEON=m
CONFIG_DEVPORT=y
CONFIG_I2C=y
CONFIG_I2C_BOARDINFO=y
CONFIG_I2C_COMPAT=y
CONFIG_I2C_CHARDEV=m
CONFIG_I2C_MUX=m
CONFIG_I2C_MUX_PCA9541=m
CONFIG_I2C_MUX_PCA954x=m
CONFIG_I2C_HELPER_AUTO=y
CONFIG_I2C_ALGOBIT=y
CONFIG_I2C_I801=y
CONFIG_I2C_EG20T=m
CONFIG_I2C_OCORES=m
CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
CONFIG_GPIOLIB=y
CONFIG_POWER_SUPPLY=y
CONFIG_PDA_POWER=m
CONFIG_HWMON=y
CONFIG_HWMON_VID=m
CONFIG_SENSORS_ASC7621=m
CONFIG_SENSORS_GPIO_FAN=y
CONFIG_SENSORS_CORETEMP=y
CONFIG_SENSORS_DME1737=m
CONFIG_SENSORS_EMC1403=m
CONFIG_SENSORS_EMC2103=m
CONFIG_SENSORS_EMC6W201=m
CONFIG_SENSORS_ACPI_POWER=m
CONFIG_THERMAL=y
CONFIG_THERMAL_HWMON=y
CONFIG_WATCHDOG=y
CONFIG_I6300ESB_WDT=m
CONFIG_ITCO_WDT=m
CONFIG_ITCO_VENDOR_SUPPORT=y
CONFIG_SSB_POSSIBLE=y
CONFIG_BCMA_POSSIBLE=y
CONFIG_MFD_CORE=m
CONFIG_LPC_SCH=m
CONFIG_LPC_ICH=m
CONFIG_REGULATOR=y
CONFIG_MEDIA_SUPPORT=m
CONFIG_MEDIA_CONTROLLER=y
CONFIG_VIDEO_DEV=m
CONFIG_VIDEO_V4L2_COMMON=m
CONFIG_VIDEO_V4L2_SUBDEV_API=y
CONFIG_DVB_CORE=m
CONFIG_DVB_NET=y
CONFIG_VIDEO_MEDIA=m
CONFIG_MEDIA_TUNER=m
CONFIG_MEDIA_TUNER_SIMPLE=m
CONFIG_MEDIA_TUNER_TDA8290=m
CONFIG_MEDIA_TUNER_TDA827X=m
CONFIG_MEDIA_TUNER_TDA18271=m
CONFIG_MEDIA_TUNER_TDA9887=m
CONFIG_MEDIA_TUNER_TEA5761=m
CONFIG_MEDIA_TUNER_TEA5767=m
CONFIG_MEDIA_TUNER_MT20XX=m
CONFIG_MEDIA_TUNER_XC2028=m
CONFIG_MEDIA_TUNER_XC5000=m
CONFIG_MEDIA_TUNER_XC4000=m
CONFIG_MEDIA_TUNER_MC44S803=m
CONFIG_VIDEO_V4L2=m
CONFIG_VIDEOBUF2_CORE=m
CONFIG_VIDEOBUF2_MEMOPS=m
CONFIG_VIDEOBUF2_VMALLOC=m
CONFIG_VIDEO_CAPTURE_DRIVERS=y
CONFIG_VIDEO_MSP3400=m
CONFIG_VIDEO_CS53L32A=m
CONFIG_VIDEO_WM8775=m
CONFIG_VIDEO_SAA711X=m
CONFIG_VIDEO_CX25840=m
CONFIG_VIDEO_CX2341X=m
CONFIG_V4L_USB_DRIVERS=y
CONFIG_USB_VIDEO_CLASS=m
CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y
CONFIG_V4L_PCI_DRIVERS=y
CONFIG_V4L_PLATFORM_DRIVERS=y
CONFIG_DVB_MAX_ADAPTERS=8
CONFIG_AGP=y
CONFIG_AGP_INTEL=y
CONFIG_VGA_ARB=y
CONFIG_VGA_ARB_MAX_GPUS=16
CONFIG_DRM=y
CONFIG_DRM_KMS_HELPER=y
CONFIG_DRM_I915=y
CONFIG_DRM_I915_KMS=y
CONFIG_STUB_POULSBO=y
CONFIG_VIDEO_OUTPUT_CONTROL=y
CONFIG_FB=y
CONFIG_FB_BOOT_VESA_SUPPORT=y
CONFIG_FB_CFB_FILLRECT=y
CONFIG_FB_CFB_COPYAREA=y
CONFIG_FB_CFB_IMAGEBLIT=y
CONFIG_FB_FOREIGN_ENDIAN=y
CONFIG_FB_BOTH_ENDIAN=y
CONFIG_FB_MODE_HELPERS=y
CONFIG_FB_TILEBLITTING=y
CONFIG_FB_VESA=y
CONFIG_FB_EFI=y
CONFIG_BACKLIGHT_LCD_SUPPORT=y
CONFIG_LCD_CLASS_DEVICE=y
CONFIG_LCD_PLATFORM=y
CONFIG_BACKLIGHT_CLASS_DEVICE=y
CONFIG_BACKLIGHT_GENERIC=y
CONFIG_VGA_CONSOLE=y
CONFIG_VGACON_SOFT_SCROLLBACK=y
CONFIG_VGACON_SOFT_SCROLLBACK_SIZE=64
CONFIG_DUMMY_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
CONFIG_FONTS=y
CONFIG_FONT_8x16=y
CONFIG_FONT_AUTOSELECT=y
CONFIG_LOGO=y
CONFIG_LOGO_LINUX_CLUT224=y
CONFIG_SOUND=m
CONFIG_SOUND_OSS_CORE=y
CONFIG_SOUND_OSS_CORE_PRECLAIM=y
CONFIG_SND=m
CONFIG_SND_TIMER=m
CONFIG_SND_PCM=m
CONFIG_SND_HWDEP=m
CONFIG_SND_SEQUENCER=m
CONFIG_SND_SEQ_DUMMY=m
CONFIG_SND_OSSEMUL=y
CONFIG_SND_MIXER_OSS=m
CONFIG_SND_PCM_OSS=m
CONFIG_SND_PCM_OSS_PLUGINS=y
CONFIG_SND_SEQUENCER_OSS=y
CONFIG_SND_HRTIMER=m
CONFIG_SND_SEQ_HRTIMER_DEFAULT=y
CONFIG_SND_DYNAMIC_MINORS=y
CONFIG_SND_SUPPORT_OLD_API=y
CONFIG_SND_VERBOSE_PROCFS=y
CONFIG_SND_VMASTER=y
CONFIG_SND_KCTL_JACK=y
CONFIG_SND_DMA_SGBUF=y
CONFIG_SND_DRIVERS=y
CONFIG_SND_PCI=y
CONFIG_SND_HDA_INTEL=m
CONFIG_SND_HDA_PREALLOC_SIZE=64
CONFIG_SND_HDA_HWDEP=y
CONFIG_SND_HDA_CODEC_REALTEK=y
CONFIG_SND_HDA_CODEC_ANALOG=y
CONFIG_SND_HDA_CODEC_SIGMATEL=y
CONFIG_SND_HDA_CODEC_VIA=y
CONFIG_SND_HDA_CODEC_HDMI=y
CONFIG_SND_HDA_CODEC_CIRRUS=y
CONFIG_SND_HDA_CODEC_CONEXANT=y
CONFIG_SND_HDA_CODEC_CA0110=y
CONFIG_SND_HDA_CODEC_CA0132=y
CONFIG_SND_HDA_CODEC_CMEDIA=y
CONFIG_SND_HDA_CODEC_SI3054=y
CONFIG_SND_HDA_GENERIC=y
CONFIG_SND_USB=y
CONFIG_HID=y
CONFIG_HIDRAW=y
CONFIG_HID_GENERIC=y
CONFIG_HID_GYRATION=y
CONFIG_HID_NTRIG=y
CONFIG_HID_PANTHERLORD=y
CONFIG_PANTHERLORD_FF=y
CONFIG_HID_PETALYNX=y
CONFIG_HID_SAMSUNG=y
CONFIG_HID_SONY=y
CONFIG_HID_SUNPLUS=y
CONFIG_HID_TOPSEED=y
CONFIG_USB_HID=y
CONFIG_HID_PID=y
CONFIG_USB_HIDDEV=y
CONFIG_USB_ARCH_HAS_OHCI=y
CONFIG_USB_ARCH_HAS_EHCI=y
CONFIG_USB_ARCH_HAS_XHCI=y
CONFIG_USB_SUPPORT=y
CONFIG_USB_COMMON=y
CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB=y
CONFIG_USB_DEBUG=y
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
CONFIG_USB_SUSPEND=y
CONFIG_USB_MON=y
CONFIG_USB_XHCI_HCD=y
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_EHCI_ROOT_HUB_TT=y
CONFIG_USB_OHCI_HCD=y
CONFIG_USB_OHCI_LITTLE_ENDIAN=y
CONFIG_USB_UHCI_HCD=y
CONFIG_USB_ACM=m
CONFIG_USB_PRINTER=m
CONFIG_USB_STORAGE=y
CONFIG_USB_LIBUSUAL=y
CONFIG_USB_SERIAL=m
CONFIG_USB_SERIAL_IPAQ=m
CONFIG_USB_GADGET=m
CONFIG_USB_GADGET_VBUS_DRAW=2
CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2
CONFIG_USB_GOKU=m
CONFIG_USB_ETH=m
CONFIG_USB_ETH_RNDIS=y
CONFIG_USB_ETH_EEM=y
CONFIG_USB_G_NCM=m
CONFIG_USB_G_SERIAL=m
CONFIG_USB_CDC_COMPOSITE=m
CONFIG_USB_G_ACM_MS=m
CONFIG_USB_G_MULTI=m
CONFIG_USB_G_MULTI_RNDIS=y
CONFIG_USB_G_MULTI_CDC=y
CONFIG_USB_G_HID=m
CONFIG_USB_G_WEBCAM=m
CONFIG_MMC=m
CONFIG_MMC_BLOCK=m
CONFIG_MMC_BLOCK_MINORS=8
CONFIG_MMC_BLOCK_BOUNCE=y
CONFIG_MMC_SDHCI=m
CONFIG_MMC_SDHCI_PCI=m
CONFIG_MMC_TIFM_SD=m
CONFIG_MMC_USHC=m
CONFIG_NEW_LEDS=y
CONFIG_LEDS_CLASS=y
CONFIG_LEDS_TRIGGERS=y
CONFIG_LEDS_TRIGGER_TIMER=m
CONFIG_LEDS_TRIGGER_HEARTBEAT=m
CONFIG_LEDS_TRIGGER_BACKLIGHT=m
CONFIG_LEDS_TRIGGER_GPIO=m
CONFIG_LEDS_TRIGGER_DEFAULT_ON=m
CONFIG_EDAC=y
CONFIG_RTC_LIB=y
CONFIG_RTC_CLASS=y
CONFIG_RTC_INTF_SYSFS=y
CONFIG_RTC_INTF_PROC=y
CONFIG_RTC_INTF_DEV=y
CONFIG_RTC_DRV_CMOS=y
CONFIG_DMADEVICES=y
CONFIG_INTEL_MID_DMAC=m
CONFIG_INTEL_IOATDMA=m
CONFIG_DMA_ENGINE=y
CONFIG_NET_DMA=y
CONFIG_DCA=m
CONFIG_STAGING=y
CONFIG_ZRAM=m
CONFIG_ZRAM_DEBUG=y
CONFIG_ZCACHE=y
CONFIG_ZSMALLOC=y
CONFIG_PHONE=m
CONFIG_PHONE_IXJ=m
CONFIG_X86_PLATFORM_DEVICES=y
CONFIG_TOSHIBA_BT_RFKILL=y
CONFIG_INTEL_IPS=y
CONFIG_INTEL_OAKTRAIL=y
CONFIG_CLKEVT_I8253=y
CONFIG_I8253_LOCK=y
CONFIG_CLKBLD_I8253=y
CONFIG_IOMMU_SUPPORT=y
CONFIG_PM_DEVFREQ=y
CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y
CONFIG_DEVFREQ_GOV_PERFORMANCE=y
CONFIG_DEVFREQ_GOV_POWERSAVE=y
CONFIG_DEVFREQ_GOV_USERSPACE=y
CONFIG_FIRMWARE_MEMMAP=y
CONFIG_EFI_VARS=y
CONFIG_DMIID=y
CONFIG_DCACHE_WORD_ACCESS=y
CONFIG_EXT2_FS=y
CONFIG_EXT2_FS_XATTR=y
CONFIG_EXT2_FS_POSIX_ACL=y
CONFIG_EXT2_FS_SECURITY=y
CONFIG_EXT2_FS_XIP=y
CONFIG_EXT3_FS=m
CONFIG_EXT3_DEFAULTS_TO_ORDERED=y
CONFIG_EXT3_FS_XATTR=y
CONFIG_EXT3_FS_POSIX_ACL=y
CONFIG_EXT3_FS_SECURITY=y
CONFIG_EXT4_FS=m
CONFIG_EXT4_FS_XATTR=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_EXT4_FS_SECURITY=y
CONFIG_FS_XIP=y
CONFIG_JBD=m
CONFIG_JBD2=m
CONFIG_FS_MBCACHE=y
CONFIG_REISERFS_FS=m
CONFIG_REISERFS_CHECK=y
CONFIG_REISERFS_PROC_INFO=y
CONFIG_REISERFS_FS_XATTR=y
CONFIG_REISERFS_FS_POSIX_ACL=y
CONFIG_REISERFS_FS_SECURITY=y
CONFIG_JFS_FS=m
CONFIG_JFS_POSIX_ACL=y
CONFIG_JFS_SECURITY=y
CONFIG_JFS_STATISTICS=y
CONFIG_XFS_FS=m
CONFIG_XFS_QUOTA=y
CONFIG_XFS_POSIX_ACL=y
CONFIG_XFS_RT=y
CONFIG_GFS2_FS=m
CONFIG_GFS2_FS_LOCKING_DLM=y
CONFIG_OCFS2_FS=m
CONFIG_OCFS2_FS_O2CB=m
CONFIG_OCFS2_FS_USERSPACE_CLUSTER=m
CONFIG_OCFS2_FS_STATS=y
CONFIG_OCFS2_DEBUG_MASKLOG=y
CONFIG_BTRFS_FS=y
CONFIG_BTRFS_FS_POSIX_ACL=y
CONFIG_NILFS2_FS=m
CONFIG_FS_POSIX_ACL=y
CONFIG_EXPORTFS=m
CONFIG_FILE_LOCKING=y
CONFIG_FSNOTIFY=y
CONFIG_DNOTIFY=y
CONFIG_INOTIFY_USER=y
CONFIG_FANOTIFY=y
CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y
CONFIG_QUOTA=y
CONFIG_QUOTA_NETLINK_INTERFACE=y
CONFIG_QUOTA_DEBUG=y
CONFIG_QUOTA_TREE=y
CONFIG_QFMT_V2=y
CONFIG_QUOTACTL=y
CONFIG_QUOTACTL_COMPAT=y
CONFIG_AUTOFS4_FS=y
CONFIG_FUSE_FS=m
CONFIG_CUSE=m
CONFIG_GENERIC_ACL=y
CONFIG_FSCACHE=m
CONFIG_FSCACHE_STATS=y
CONFIG_FSCACHE_HISTOGRAM=y
CONFIG_CACHEFILES=m
CONFIG_CACHEFILES_HISTOGRAM=y
CONFIG_ISO9660_FS=m
CONFIG_JOLIET=y
CONFIG_ZISOFS=y
CONFIG_UDF_FS=m
CONFIG_UDF_NLS=y
CONFIG_FAT_FS=m
CONFIG_MSDOS_FS=m
CONFIG_VFAT_FS=m
CONFIG_FAT_DEFAULT_CODEPAGE=437
CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
CONFIG_PROC_FS=y
CONFIG_PROC_KCORE=y
CONFIG_PROC_VMCORE=y
CONFIG_PROC_SYSCTL=y
CONFIG_PROC_PAGE_MONITOR=y
CONFIG_SYSFS=y
CONFIG_TMPFS=y
CONFIG_TMPFS_POSIX_ACL=y
CONFIG_TMPFS_XATTR=y
CONFIG_HUGETLBFS=y
CONFIG_HUGETLB_PAGE=y
CONFIG_CONFIGFS_FS=m
CONFIG_MISC_FILESYSTEMS=y
CONFIG_ADFS_FS=m
CONFIG_AFFS_FS=m
CONFIG_ECRYPT_FS=m
CONFIG_HFS_FS=m
CONFIG_HFSPLUS_FS=m
CONFIG_BEFS_FS=m
CONFIG_BFS_FS=m
CONFIG_EFS_FS=m
CONFIG_LOGFS=m
CONFIG_CRAMFS=m
CONFIG_SQUASHFS=m
CONFIG_SQUASHFS_XATTR=y
CONFIG_SQUASHFS_ZLIB=y
CONFIG_SQUASHFS_LZO=y
CONFIG_SQUASHFS_XZ=y
CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
CONFIG_VXFS_FS=m
CONFIG_MINIX_FS=m
CONFIG_OMFS_FS=m
CONFIG_HPFS_FS=m
CONFIG_QNX4FS_FS=m
CONFIG_QNX6FS_FS=m
CONFIG_ROMFS_FS=m
CONFIG_ROMFS_BACKED_BY_BLOCK=y
CONFIG_ROMFS_ON_BLOCK=y
CONFIG_PSTORE=y
CONFIG_SYSV_FS=m
CONFIG_UFS_FS=m
CONFIG_UFS_FS_WRITE=y
CONFIG_NETWORK_FILESYSTEMS=y
CONFIG_NFS_FS=m
CONFIG_NFS_V2=y
CONFIG_NFS_V3=y
CONFIG_NFS_V3_ACL=y
CONFIG_NFS_V4=y
CONFIG_NFS_USE_KERNEL_DNS=y
CONFIG_LOCKD=m
CONFIG_LOCKD_V4=y
CONFIG_NFS_ACL_SUPPORT=m
CONFIG_NFS_COMMON=y
CONFIG_SUNRPC=m
CONFIG_SUNRPC_GSS=m
CONFIG_RPCSEC_GSS_KRB5=m
CONFIG_CEPH_FS=m
CONFIG_CIFS=m
CONFIG_CIFS_STATS=y
CONFIG_CIFS_STATS2=y
CONFIG_CIFS_WEAK_PW_HASH=y
CONFIG_CIFS_UPCALL=y
CONFIG_CIFS_XATTR=y
CONFIG_CIFS_POSIX=y
CONFIG_CIFS_DFS_UPCALL=y
CONFIG_CIFS_ACL=y
CONFIG_CODA_FS=m
CONFIG_AFS_FS=m
CONFIG_NLS=y
CONFIG_NLS_DEFAULT="utf8"
CONFIG_NLS_CODEPAGE_437=y
CONFIG_NLS_ASCII=y
CONFIG_NLS_ISO8859_1=y
CONFIG_NLS_ISO8859_15=y
CONFIG_NLS_UTF8=y
CONFIG_DLM=m
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
CONFIG_PRINTK_TIME=y
CONFIG_DEFAULT_MESSAGE_LOGLEVEL=4
CONFIG_ENABLE_MUST_CHECK=y
CONFIG_FRAME_WARN=2048
CONFIG_MAGIC_SYSRQ=y
CONFIG_DEBUG_FS=y
CONFIG_DEBUG_KERNEL=y
CONFIG_PANIC_ON_OOPS_VALUE=0
CONFIG_SCHEDSTATS=y
CONFIG_TIMER_STATS=y
CONFIG_STACKTRACE=y
CONFIG_DEBUG_STACK_USAGE=y
CONFIG_DEBUG_BUGVERBOSE=y
CONFIG_ARCH_WANT_FRAME_POINTERS=y
CONFIG_FRAME_POINTER=y
CONFIG_RCU_CPU_STALL_TIMEOUT=60
CONFIG_USER_STACKTRACE_SUPPORT=y
CONFIG_NOP_TRACER=y
CONFIG_HAVE_FUNCTION_TRACER=y
CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
CONFIG_HAVE_FUNCTION_GRAPH_FP_TEST=y
CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y
CONFIG_HAVE_DYNAMIC_FTRACE=y
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
CONFIG_HAVE_C_RECORDMCOUNT=y
CONFIG_RING_BUFFER=y
CONFIG_EVENT_TRACING=y
CONFIG_EVENT_POWER_TRACING_DEPRECATED=y
CONFIG_CONTEXT_SWITCH_TRACER=y
CONFIG_TRACING=y
CONFIG_GENERIC_TRACER=y
CONFIG_TRACING_SUPPORT=y
CONFIG_FTRACE=y
CONFIG_BRANCH_PROFILE_NONE=y
CONFIG_BLK_DEV_IO_TRACE=y
CONFIG_KPROBE_EVENT=y
CONFIG_PROBE_EVENTS=y
CONFIG_PROVIDE_OHCI1394_DMA_INIT=y
CONFIG_HAVE_ARCH_KGDB=y
CONFIG_HAVE_ARCH_KMEMCHECK=y
CONFIG_X86_VERBOSE_BOOTUP=y
CONFIG_EARLY_PRINTK=y
CONFIG_EARLY_PRINTK_DBGP=y
CONFIG_DEBUG_STACKOVERFLOW=y
CONFIG_DEBUG_RODATA=y
CONFIG_DEBUG_NX_TEST=m
CONFIG_HAVE_MMIOTRACE_SUPPORT=y
CONFIG_IO_DELAY_TYPE_0X80=0
CONFIG_IO_DELAY_TYPE_0XED=1
CONFIG_IO_DELAY_TYPE_UDELAY=2
CONFIG_IO_DELAY_TYPE_NONE=3
CONFIG_IO_DELAY_0X80=y
CONFIG_DEFAULT_IO_DELAY_TYPE=0
CONFIG_DEBUG_BOOT_PARAMS=y
CONFIG_OPTIMIZE_INLINING=y
CONFIG_KEYS=y
CONFIG_TRUSTED_KEYS=y
CONFIG_ENCRYPTED_KEYS=y
CONFIG_KEYS_DEBUG_PROC_KEYS=y
CONFIG_SECURITY=y
CONFIG_SECURITYFS=y
CONFIG_SECURITY_NETWORK=y
CONFIG_SECURITY_NETWORK_XFRM=y
CONFIG_SECURITY_PATH=y
CONFIG_LSM_MMAP_MIN_ADDR=65536
CONFIG_SECURITY_SELINUX=y
CONFIG_SECURITY_SELINUX_BOOTPARAM=y
CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE=1
CONFIG_SECURITY_SELINUX_DISABLE=y
CONFIG_SECURITY_SELINUX_DEVELOP=y
CONFIG_SECURITY_SELINUX_AVC_STATS=y
CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=1
CONFIG_SECURITY_YAMA=y
CONFIG_INTEGRITY=y
CONFIG_IMA=y
CONFIG_IMA_MEASURE_PCR_IDX=10
CONFIG_IMA_AUDIT=y
CONFIG_IMA_LSM_RULES=y
CONFIG_DEFAULT_SECURITY_SELINUX=y
CONFIG_DEFAULT_SECURITY="selinux"
CONFIG_ASYNC_TX_DISABLE_PQ_VAL_DMA=y
CONFIG_ASYNC_TX_DISABLE_XOR_VAL_DMA=y
CONFIG_CRYPTO=y
CONFIG_CRYPTO_ALGAPI=y
CONFIG_CRYPTO_ALGAPI2=y
CONFIG_CRYPTO_AEAD=y
CONFIG_CRYPTO_AEAD2=y
CONFIG_CRYPTO_BLKCIPHER=y
CONFIG_CRYPTO_BLKCIPHER2=y
CONFIG_CRYPTO_HASH=y
CONFIG_CRYPTO_HASH2=y
CONFIG_CRYPTO_RNG=y
CONFIG_CRYPTO_RNG2=y
CONFIG_CRYPTO_PCOMP=y
CONFIG_CRYPTO_PCOMP2=y
CONFIG_CRYPTO_MANAGER=y
CONFIG_CRYPTO_MANAGER2=y
CONFIG_CRYPTO_USER=m
CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y
CONFIG_CRYPTO_GF128MUL=y
CONFIG_CRYPTO_NULL=m
CONFIG_CRYPTO_PCRYPT=y
CONFIG_CRYPTO_WORKQUEUE=y
CONFIG_CRYPTO_CRYPTD=y
CONFIG_CRYPTO_AUTHENC=y
CONFIG_CRYPTO_CCM=m
CONFIG_CRYPTO_GCM=m
CONFIG_CRYPTO_SEQIV=y
CONFIG_CRYPTO_CBC=y
CONFIG_CRYPTO_CTR=y
CONFIG_CRYPTO_CTS=y
CONFIG_CRYPTO_ECB=y
CONFIG_CRYPTO_LRW=y
CONFIG_CRYPTO_PCBC=y
CONFIG_CRYPTO_XTS=y
CONFIG_CRYPTO_HMAC=y
CONFIG_CRYPTO_XCBC=y
CONFIG_CRYPTO_VMAC=y
CONFIG_CRYPTO_CRC32C=y
CONFIG_CRYPTO_CRC32C_INTEL=y
CONFIG_CRYPTO_GHASH=y
CONFIG_CRYPTO_MD4=y
CONFIG_CRYPTO_MD5=y
CONFIG_CRYPTO_MICHAEL_MIC=m
CONFIG_CRYPTO_RMD128=m
CONFIG_CRYPTO_RMD160=m
CONFIG_CRYPTO_RMD256=m
CONFIG_CRYPTO_RMD320=m
CONFIG_CRYPTO_SHA1=y
CONFIG_CRYPTO_SHA1_SSSE3=y
CONFIG_CRYPTO_SHA256=y
CONFIG_CRYPTO_SHA512=y
CONFIG_CRYPTO_TGR192=m
CONFIG_CRYPTO_WP512=m
CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL=m
CONFIG_CRYPTO_AES=y
CONFIG_CRYPTO_AES_X86_64=y
CONFIG_CRYPTO_AES_NI_INTEL=y
CONFIG_CRYPTO_ANUBIS=m
CONFIG_CRYPTO_ARC4=y
CONFIG_CRYPTO_BLOWFISH_COMMON=y
CONFIG_CRYPTO_BLOWFISH_X86_64=y
CONFIG_CRYPTO_CAMELLIA_X86_64=y
CONFIG_CRYPTO_CAST5=m
CONFIG_CRYPTO_CAST6=m
CONFIG_CRYPTO_DES=y
CONFIG_CRYPTO_FCRYPT=m
CONFIG_CRYPTO_KHAZAD=m
CONFIG_CRYPTO_SALSA20_X86_64=y
CONFIG_CRYPTO_SEED=m
CONFIG_CRYPTO_SERPENT=y
CONFIG_CRYPTO_SERPENT_SSE2_X86_64=y
CONFIG_CRYPTO_TEA=m
CONFIG_CRYPTO_TWOFISH_COMMON=y
CONFIG_CRYPTO_TWOFISH_X86_64=y
CONFIG_CRYPTO_TWOFISH_X86_64_3WAY=y
CONFIG_CRYPTO_DEFLATE=y
CONFIG_CRYPTO_ZLIB=y
CONFIG_CRYPTO_LZO=y
CONFIG_CRYPTO_ANSI_CPRNG=y
CONFIG_CRYPTO_USER_API=y
CONFIG_CRYPTO_USER_API_HASH=y
CONFIG_CRYPTO_USER_API_SKCIPHER=y
CONFIG_CRYPTO_HW=y
CONFIG_HAVE_KVM=y
CONFIG_HAVE_KVM_IRQCHIP=y
CONFIG_HAVE_KVM_EVENTFD=y
CONFIG_KVM_APIC_ARCHITECTURE=y
CONFIG_KVM_MMIO=y
CONFIG_KVM_ASYNC_PF=y
CONFIG_HAVE_KVM_MSI=y
CONFIG_VIRTUALIZATION=y
CONFIG_KVM=m
CONFIG_KVM_INTEL=m
CONFIG_KVM_MMU_AUDIT=y
CONFIG_VHOST_NET=m
CONFIG_BINARY_PRINTF=y
CONFIG_BITREVERSE=y
CONFIG_GENERIC_STRNCPY_FROM_USER=y
CONFIG_GENERIC_STRNLEN_USER=y
CONFIG_GENERIC_FIND_FIRST_BIT=y
CONFIG_GENERIC_PCI_IOMAP=y
CONFIG_GENERIC_IOMAP=y
CONFIG_GENERIC_IO=y
CONFIG_CRC_CCITT=y
CONFIG_CRC16=y
CONFIG_CRC_T10DIF=y
CONFIG_CRC_ITU_T=y
CONFIG_CRC32=y
CONFIG_CRC32_SELFTEST=y
CONFIG_CRC32_SLICEBY8=y
CONFIG_CRC7=y
CONFIG_LIBCRC32C=y
CONFIG_CRC8=y
CONFIG_ZLIB_INFLATE=y
CONFIG_ZLIB_DEFLATE=y
CONFIG_LZO_COMPRESS=y
CONFIG_LZO_DECOMPRESS=y
CONFIG_XZ_DEC=y
CONFIG_XZ_DEC_X86=y
CONFIG_XZ_DEC_POWERPC=y
CONFIG_XZ_DEC_IA64=y
CONFIG_XZ_DEC_ARM=y
CONFIG_XZ_DEC_ARMTHUMB=y
CONFIG_XZ_DEC_SPARC=y
CONFIG_XZ_DEC_BCJ=y
CONFIG_XZ_DEC_TEST=y
CONFIG_DECOMPRESS_GZIP=y
CONFIG_GENERIC_ALLOCATOR=y
CONFIG_TEXTSEARCH=y
CONFIG_TEXTSEARCH_KMP=m
CONFIG_TEXTSEARCH_BM=m
CONFIG_TEXTSEARCH_FSM=m
CONFIG_BTREE=y
CONFIG_HAS_IOMEM=y
CONFIG_HAS_IOPORT=y
CONFIG_HAS_DMA=y
CONFIG_CHECK_SIGNATURE=y
CONFIG_CPU_RMAP=y
CONFIG_DQL=y
CONFIG_NLATTR=y
CONFIG_AVERAGE=y
CONFIG_CORDIC=y
CONFIG_DDR=y

Toshset et toshiba_acpi

Grâce au travail de Charles Schwieters, on peut utiliser certaines fonctions (luminosité de l’écran, etc). Dans un premier temps, il faut patcher les sources du noyau.
Vous réccupérez le patch ici et vous avez un les sources (et même les binaires 32 et 64 bits) de toshset ici.

cd /usr/src/linux
wget http://schwieters.org/toshset/toshiba_acpi-current.patch ~/toshiba_acpi-current.patch
patch -p1 < ~/toshiba_acpi-current.patch

Ensuite s’assurer d’avoir dans le fichier /mnt/work/.config les options suivantes:

CONFIG_ACPI=y
CONFIG_ACPI_WMI=y
CONFIG_BACKLIGHT_CLASS_DEVICE=y
CONFIG_INPUT=y
CONFIG_RFKILL=y # ou pas de CONFIG_RFKILL
CONFIG_LEDS_CLASS=y
CONFIG_NEW_LEDS=y
CONFIG_INPUT_POLLDEV=y
CONFIG_INPUT_SPARSEKMAP=y

Vous pouvez retrouver ces valeurs dans le fichier /usr/src/linux/drivers/platform/x86/Kconfig .

Puis viennent les classiques:

make O=/mnt/work && make O=/mnt/work modules_install
cp /mnt/work/{System.map,arch/x86/boot/bzImage} /boot/

n’oubliez pas de sauvegarder le fichier /mnt/work/.config car comme il est placé sur un système de fichier temporaire, il disparaîtra leur du prochain démontage de /mnt/work.

Le lecteur d’empreintes digitales

On installe la librairie libfprint , le module fprint pour pam:

emerge -D libfprint pam_fprint

On va éditer le fichier /etc/pam.d/system-auth: Vous y rajoutez la ligne 2

auth            required        pam_env.so
auth            sufficient      pam_fprint.so
auth            sufficient      pam_unix.so try_first_pass likeauth nullok
auth            required        pam_deny.so

account         required        pam_unix.so
account         optional        pam_permit.so

password        required        pam_cracklib.so difok=2 minlen=8 dcredit=2 ocredit=2 retry=3
password        required        pam_unix.so try_first_pass use_authtok nullok sha512 shadow
password        optional        pam_permit.so

session         required        pam_limits.so
session         required        pam_env.so
session         required        pam_unix.so
session         optional        pam_permit.so

Enfin, on enregistre au moins une empreinte en tant qu’utilisateur normal:

ulysse pam.d$ pam_fprint_enroll
This program will enroll your finger, unconditionally overwriting any selected print that was enrolled
previously. If you want to continue, press enter, otherwise hit Ctrl+C

Found device claimed by AuthenTec AES1660 driver
Opened device. It's now time to enroll your finger.

You will need to successfully scan your Right Index Finger 1 times to complete the process.

Scan your finger now.
Enroll complete!
Enrollment completed!

Maintenant, à chaque fois que vous vous loguerez, il suffira de taper le login, la touche “Entrée” du clavier et
la machine vous demandera de lui montrez votre index.

Petit bonus supplémentaire que je viens de trouver sur le blog de Peter Senna Tschudin, ici: on devrait pouvoir étendre le système à 16G de mémoire (il cite par expl celle-ci: 2 * Patriot PSD38G13332S (8GB PC3 – 10600 1333MHz CL9 SoDimm)
MAJ: J’ai testé et ça fonctionne du tonnerre

Petits scripts

On a installé l’arborescence portage dans une archive squashfs. On ne pourra donc plus utiliser emerge –sync pour la mettre à jour. On va donc se servir d’un petit script qui va automatiser les tâches nécessaires: ~/update_portage

cat > ~/update_portage << "EOF"
>#!/bin/bash
>
>REPOS=/usr/portage
>ARCHIVE=/var/portage/portage.sqsh
>
>if [ $(cat /proc/mounts | grep $REPOS | wc -l) -eq 1 ]; then umount $REPOS; fi
>mount -t tmpfs -o size=1G tmpfs $REPOS
>sleep 2
>emerge --sync > /dev/null 2>&1
>sleep 2
>mv $ARCHIVE{,.bak}
>mksquashfs $REPOS $ARCHIVE &&
>sleep 2
>rm ${ARCHIVE}.bak
>mount -o remount,ro $ARCHIVE $REPOS
>EOF

chmod o+x ~/update_portage

Sources:

Firmware intel wifi: ici
Toshset: ici

Monday, 31 December 2012

FreeBSD 9.1 sur un MacBook Pro 1,2

Facteur d'entropie | 06:31, Monday, 31 December 2012

DISCLAIMER: Cet article est le bloc note de mon installation d’un freebsd 9.1 sur un MacBook Pro version 1,2. Il va évoluer avec le temps. C’est mon premier contact avec la bête donc, j’adapterai au fur et à mesure certains détails (comme le shéma de partition).
TODO: (sans ordre particulier)
* lecteur de smartcard (couplé à gpg)
* Utilisation de GELI avec la smartcard
* Utilisation de la webcam
* Création d’un dump du disque avec une installation fraîche afin de pouvoir tout réinstaller d’un coup et mise à dispo de l’image

Ayant récupéré un macbook pro version 1,2 je me suis mis en devoir de le libérer de son os initial sale. Le passage aux *BSD me démangeant de plus en plus, c’était donc l’occasion de le faire.
Pour les spécifications de ce mac, on va ici: www.everymac.com
Ici, on a la description du proc: ark.intel.com on y voit que c’est un 32 bits.

L’organisation du système de fichier sera le suivant:
* 10 Go pour / (racine)
* 4 Go pour le swap
* 10 Go pour /var
* 30 Go pour /home
* 30 Go pour /usr
* 10 Go pour /jails
Pour /tmp, on utilisera tmpfs.

Pour info, vous avez cette page: hier(7) qui décrit la hiérarchie standard du système de fichiers sur FreeBSD.

Dans un premier temps, on va sur ftp://ftp.freebsd.org/pub/FreeBSD/releases/i386/i386/ISO-IMAGES/ récupérer une image à graver sur une galette (J’ai pris la version 9.1) et l’on va booter dessus.
Puis on va suivre l’installation classique. On choisit un schéma de clavier Français macbook pro + ISO8859-15.
On lance la partition du disque, là j’ai dû choisir un schéma BSD classique et non le GPT.
J’ai rajouté aussi les sources dans la liste des packages à récupérer.
On demande aussi le démarrage de moused, ntpd, sshd et powerd
Une fois l’install terminée, on va demander un shell et éditer /etc/fstab:
On crypte la swap et on rajoute /tmp et /cdrom.

vi /etc/fstab
Device            Mountpoint  FStype  Options           Dump    Pass
/dev/ada0b.eli    none        swap    sw                0       0
tmpfs             /tmp        tmpfs   rw,mode=777       0       0
/dev/cd0          /cdrom      cd9660  ro,noauto,users   0       0

On en profite aussi pour créer /cdrom et enfin on adapte le paramétrage à une utilisation desktop (l’optimisation par défaut est celle d’un serveur).

echo "kern.sched.preempt_thresh=224" >> /etc/sysctl.conf

on reboot et on va tuner le bouzin.

On change le cryptage des mots de passe:
Dans /etc/login.conf on remplace:

:passwd_format=sha512:

par

:passwd_format=blf:

On en profite aussi pour créer une classe afin de localiser en français le clavier et le mettre en UTF-8:

french|French Users Accounts:\
    :charset=UTF-8:\
    :lang=fr_FR.UTF-8:\
    :tc=default:

puis, on reconstruit la base:

cap_mkdb /etc/login.conf

On lance vipw et on rajoute le nom de la classe ‘french’ sur la ligne de votre utilisateur (entre les :: qui se trouvent après son gid).
enfin on fait

echo "defaultclass = french" >> /etc/adduser.conf

et on change les mots de passe des utilisateurs.
On configure /etc/make.conf:

cp /usr/share/examples/etc/make.conf /etc/

et vous appliquez les options qui vous conviennent.

On va s’occuper des ports:
Pour les récupérer, on a plusieurs solutions possibles. Pour ma part j’ai opté pour subversion.
On va donc l’installer

cd /usr/ports/devel/subversion
make install clean

Puis, on met à jour

cd /usr/ports
svn update

On installe les vérifications de sécurité:

cd ports-mgmt/portaudit
make install clean
portaudit -Fa

Pour portaudit, l’option F récupère la base de données des vulnérabilités et le ‘a’ va tester le tout.

Maintenant, on va s’occuper du pare-feu:
Ici on va utiliser pf (PacketFilter le fieroualle d’OpenBSD) et pflog pour les logs:
on rajoutes donc dans /etc/rc.conf

pf_enable="YES"
pf_rules="/etc/pf.conf"
pflog_enable="YES"

Puis le pf.conf: (Ici je fais dans le grossier, je bloque tout en entrée et n’autorise que les sorties).

ifaces = "{(msk0), (ath0)}"

set skip on lo
scrub in all
block all
pass out inet proto tcp from $ifaces to any flags S/SA keep state
pass out inet proto {udp, icmp} from $ifaces to any keep state

Afin de pouvoir accéder aux différents senseurs et illuminer son clavier, on va utiliser asmc.
On va donc devoir recompiler le noyau afin d’en profiter.

cd /usr/src/sys/i386/conf
mkdir /root/kernels
cp GENERIC /root/kernels/MACKERNEL
ln -s /root/kernels/MACKERNEL
echo "device asmc" >> ./MACKERNEL
cd /usr/src
make buildkernel KERNCONF=MACKERNEL
make installkernel KERNCONF=MACKERNEL
echo "asmc_load=\"YES\"" >> /boot/loader.conf

Puis on reboot.
A partir de ce moment, tout ce qui concerne les senseurs est accessible via:

sysctl dev.asmc.0

Voici le résultat chez moi:

dev.asmc.0.%desc: Apple SMC MacBook Pro Core Duo (17-inch)
dev.asmc.0.%driver: asmc
dev.asmc.0.%location: handle=\_SB_.PCI0.LPCB.SMC_
dev.asmc.0.%pnpinfo: _HID=APP0001 _UID=0
dev.asmc.0.%parent: acpi0
dev.asmc.0.fan.0.speed: 1047
dev.asmc.0.fan.0.safespeed: 1200
dev.asmc.0.fan.0.minspeed: 1000
dev.asmc.0.fan.0.maxspeed: 5500
dev.asmc.0.fan.0.targetspeed: 1045
dev.asmc.0.fan.1.speed: 1047
dev.asmc.0.fan.1.safespeed: 1200
dev.asmc.0.fan.1.minspeed: 1000
dev.asmc.0.fan.1.maxspeed: 5500
dev.asmc.0.fan.1.targetspeed: 1045
dev.asmc.0.temp.enclosure: 34
dev.asmc.0.temp.heatsink1: 51
dev.asmc.0.temp.heatsink2: 45
dev.asmc.0.temp.memory: 52
dev.asmc.0.temp.graphics: 62
dev.asmc.0.temp.graphicssink: 58
dev.asmc.0.temp.unknown: 66
dev.asmc.0.light.left: 10
dev.asmc.0.light.right: 32
dev.asmc.0.light.control: 127
dev.asmc.0.sms.x: -33
dev.asmc.0.sms.y: -11
dev.asmc.0.sms.z: 211

Pour profiter de la mise en pose du disque lors d’un mouvement brusque, on va se servir de ataidle:

cd /usr/ports/sysutils/ataidle
make install clean

puis
On rajoute dans /etc/devd.conf:

notify 0 {
	match "system"	   "ACPI";
	match "subsystem"  "asmc";
	action		   "/usr/local/sbin/ataidle -s /dev/ad5";
};

Le clavier:

Pour le rétro-éclairage du clavier, on fait (vous pouvez mettre n’importe quelle valeur entre 0 et 255):

echo "dev.asmc.0.light.control=127" >> /etc/sysctl.conf

On va aussi activer le bouton d’éjection du lecteur de cd/dvd. Pour ceci, on fait:

echo "Consumer:Consumer_Control.Consumer:Eject        1 0 umount /cdrom && cdcontrol eject" > /etc/usbhidaction.uhid0
echo "/usr/bin/usbhidaction -f /dev/uhid0 -c /etc/usbhidaction.uhid0" >> /etc.rc.local

Le clavier d’office fournit: fr.macbookpro.acc.kbd contient une inversion des touches “@#” et “<>”. Une personne à fait
une rectification qui permet de résoudre le soucis. Le nouveau fichier est sur son site: http://www.lamaiziere.net/mbp_freebsd.html.
On sauvegarde l’ancien au cas où et on le remplace par le nouveau:

wget http://www.lamaiziere.net/fr.macbookpro.acc.kbd
mv /usr/src/share/syscons/keymaps/fr.macbook.acc.kbd /usr/src/share/syscons/keymaps/fr.macbook.acc.kbd.bak
cp ./fr.macbookpro.acc.kbd /usr/src/share/syscons/keymaps/fr.macbook.acc.kbd

Ceci dit je n’ai pas réussit à le faire fonctionner…

On va installer maintenant Xorg:

cd /usr/ports/x11/xorg
make install clean
cd ~
Xorg -configure

Ceci nous donnera une ébauche de fichier de Xorg. On va l’éditer et le compléter:

Section "ServerLayout"
        Identifier     "X.org Configured"
        Screen      0  "Screen0" 0 0
        InputDevice    "Mouse0" "CorePointer"
        InputDevice    "Keyboard0" "CoreKeyboard"
        Option          "AutoAddDevices" "false"
        Option          "AIGLX" "true"
EndSection
Section "Extensions"
        Option          "Composite" "Enable"
EndSection
Section "Files"
        ModulePath   "/usr/local/lib/xorg/modules"
        FontPath     "/usr/local/lib/X11/fonts/misc/"
        FontPath     "/usr/local/lib/X11/fonts/TTF/"
        FontPath     "/usr/local/lib/X11/fonts/OTF"
        FontPath     "/usr/local/lib/X11/fonts/Type1/"
        FontPath     "/usr/local/lib/X11/fonts/100dpi/"
        FontPath     "/usr/local/lib/X11/fonts/75dpi/"
EndSection
Section "Module"
        Load  "extmod"
        Load  "freetype"
        Load  "record"
        Load  "dbe"
        Load  "dri"
        Load  "dri2"
        Load  "glx"
EndSection
Section "InputDevice"
        Identifier  "Keyboard0"
        Option      "XkbRules" "xorg"
        Option      "XkbModel" "macbook79"
        Option      "XkbLayout" "fr"
        Driver      "kbd"
EndSection
Section "InputDevice"
        Identifier  "Mouse0"
        Driver      "mouse"
        Option      "Protocol" "auto"
        Option      "Device" "/dev/sysmouse"
        Option      "ZAxisMapping" "4 5 6 7"
EndSection
Section "Monitor"
        Identifier   "Monitor0"
        VendorName   "APP"
        ModelName    "Color LCD"
EndSection
Section "Device"
        Option     "NoAccel"   "false"
        Option     "AccelMethod"  "EXA"
        Option     "DRI" "true"
        Identifier  "Card0"
        Driver      "radeon"
        VendorName  "Advanced Micro Devices [AMD] nee ATI"
        BoardName   "M56P [Radeon Mobility X1600]"
        BusID       "PCI:1:0:0"
EndSection
Section "Screen"
        Identifier "Screen0"
        Device     "Card0"
        Monitor    "Monitor0"
        SubSection "Display"
                Viewport   0 0
                Depth     1
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     4
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     8
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     15
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     16
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     24
        EndSubSection
EndSection

Pour avoir la bonne configuration de clavier sous Xorg, il va falloir remplacer le fichier de map:

wget http://bersace03.free.fr/pub/Development/Linux/xkb-mac/fr.ancien fr
mv /usr/local/share/X11/xkb/symbols/macintosh_vndr/fr /usr/local/share/X11/xkb/symbols/macintosh_vndr/fr.bak
cp fr /usr/local/share/X11/xkb/symbols/macintosh_vndr/

Pour le trackpad, on va utiliser le driver atp, pour ça on va devoir recompiler notre noyau:

echo "device atp" >> /root/kernels/MACKERNEL
cd /usr/src
make buildkernel KERNCONF=MACKERNEL
make installkernel KERNCONF=MACKERNEL
echo "atp_load=\"YES\"" >> /boot/loader.conf

Puis on reboot.
On modifie /etc/rc.conf

moused_enable="YES"
moused_type="auto"
moused_port="/dev/atp0"
moused_nondefault_enable="YES"
moused_ums0_enable="YES"
moused_ums1_enable="YES"

Pour que le trackpad fonctionne pour tous les utilisateurs, j’ai dû rajouter une ligne dans /etc/devfs.conf

echo "perm    /dev/sysmouse    0666" >> /etc/devfs.conf

Il nous reste le window manager, on va utiliser fluxbox:

cd /usr/ports/x11-wm/fluxbox
make install clean
echo "exec startfluxbox" > ~/.xinitrc

On va avoir besoin d’un fichier “startup” dans ~/.fluxbox/ qui contiendra tout ce que l’on veut lancer directement avec fluxbox

touch ~/.fluxbox/startup

un simple startx devrait maintenant vous montrer une belle interface graphique aussi simple qu’efficace.
Pour fixer un fond d’écran, on va utiliser feh:

cd /usr/ports/graphics/feh
make install clean

On va créer un répertoire dans .fluxbox pour stocker les images de fond:

mkdir ~/.fluxbox/backgrounds

et on y dépose des images
On rajoute conky histoire d’afficher des infos sur le système plus d’autres trucs utils:

cd /usr/ports/sysutil/conky
make install clean

Enfin, on configure conky. Pour ça, on va éditer le fichier .conkyrc et y mettre ce contenu:

use_xft yes
xftfont DejaVu Sans Mono:size=10:style=Bold
xftalpha 0.8
update_interval 2.0
total_run_times 0
own_window no
own_window_type normal
own_window_transparent yes
minimum_size 280 5
draw_shades no
draw_outline no
draw_borders no
draw_graph_borders no
stippled_borders 8
border_inner_margin 4
border_width 1
default_color white
default_shade_color black
default_outline_color black
alignment top_left
gap_x 12
gap_y 12
no_buffers yes
uppercase no
cpu_avg_samples 1
net_avg_samples 1
use_spacer none
override_utf8_locale yes

TEXT
${color green} $nodename - $sysname $kernel on $machine
$time$color
$hr
${color green}Uptime:$color $uptime - Load:$color $loadavg
${color green}Coeur 1:$color ${freq cpu0} Mhz ${color red}${cpu cpu0}% ${cpubar cpu0}
${color green}Coeur 2:$color ${freq cpu1} Mhz ${color red}${cpu cpu1}% ${cpubar cpu1}
${color green}RAM:$color $mem/$memmax - ${color red}$memperc% ${membar 4}
${color green}Pagination:$color $swap/$swapmax - ${color red}$swapperc% ${swapbar 4}
${color green}Batterie: $color$battery_time h ${color blue}${battery_bar 5 0}
${color green}Ventilateurs: 1:$color${exec sysctl dev.asmc.0.fan.0.speed | awk '{FS=":"}{ print $2 }'} TPM${color green} 2:$color${exec sysctl dev.asmc.0.fan.1.speed | awk '{FS=":"}{ print $2 }'} TPM
${color green}Luminosité: gauche:$color${exec sysctl dev.asmc.0.light.left | awk '{FS=":"}{ print $2 }'}${color green} droite:$color${exec sysctl dev.asmc.0.light.right | awk '{FS=":"}{ print $2 }'}
$color$stippled_hr
${color green}Températures:
 Coeur 1:$color${exec sysctl dev.cpu.0.temperature | awk '{FS=":"}{ print $2 }'}${color green} Coeur 2:$color${exec sysctl dev.cpu.1.temperature | awk '{FS=":"}{ print $2 }'}
${color green} GPU:$color${exec sysctl dev.asmc.0.temp.graphics | awk '{FS=":"}{ print $2 }'},0C${color green} Mémoire:$color${exec sysctl dev.asmc.0.temp.memory | awk '{FS=":"}{ print $2 }'},0C
${color green} Rad. 1: $color${exec sysctl dev.asmc.0.temp.heatsink1 | awk '{FS=":"}{ print $2 }'},0C${color green} Rad. 2:$color${exec sysctl dev.asmc.0.temp.heatsink2 | awk '{FS=":"}{ print $2 }'},0C
${color green} Chassis:$color${exec sysctl dev.asmc.0.temp.enclosure | awk '{FS=":"}{ print $2 }'},0C
$color$stippled_hr
${color green}Reseau:
 Passerelle: $color${exec netstat -r | grep default | awk '{print $2}'}
${if_up msk0}
 ${color green}Filaire: $color${addr msk0}
 ${color green}Montee:$color ${upspeed msk0} ${color green}${offset 150}Descente:$color ${downspeed msk0}
 ${upspeedgraph msk0 32,200 ff0000 0000ff -t -l}${downspeedgraph msk0 32,150 ff0000 0000ff -t -l}
$endif
${if_up ath0}
 ${color green}Wifi: $color${addr ath0}
 ${color green}Montee:$color ${upspeed ath0} ${color green} - Descente:$color ${downspeed ath0}
 ${upspeedgraph ath0 32,200 ff0000 0000ff -t -l}${downspeedgraph ath0 32,200 ff0000 0000ff -t -l}
$endif
$color$stippled_hr
${color green}Systeme de fichiers:
$color / ${goto 80}${fs_type /} ${color blue}${fs_used /}/${fs_size /} ${fs_bar 6 /}
$color /usr ${goto 80}${fs_type /usr} ${color blue}${fs_used /usr}/${fs_size /usr} ${fs_bar 6 /usr}
$color /var ${goto 80}${fs_type /var} ${color blue}${fs_used /var}/${fs_size /var} ${fs_bar 6 /var}
$color /tmp ${goto 80}${fs_type /tmp} ${color blue}${fs_used /tmp}/${fs_size /tmp} ${fs_bar 6 /tmp}
$color /home ${goto 80}${fs_type /home} ${color blue}${fs_used /home}/${fs_size /home} ${fs_bar 6 /home}
$color$stippled_hr
${color green}Processes:$color $processes  ${color green}Running:$color $running_processes
${color green}Name              PID   CPU %   MEM %
${color}${top name 1} ${top pid 1} ${top cpu 1} ${top mem 1}
${color}${top name 2} ${top pid 2} ${top cpu 2} ${top mem 2}
${color}${top name 3} ${top pid 3} ${top cpu 3} ${top mem 3}
${color}${top name 4} ${top pid 4} ${top cpu 4} ${top mem 4}

~/.fluxbox/startup devient:

exec conky &
exec feh --bg-center /home/dervishe/.fluxbox/backgrounds/MON_IMAGE_DE_FOND &
exec fluxbox

Finalement, voici ce que ça donne:


Ressources:
Fichier de conf du noyau:

cpu         I686_CPU
ident       MACKERNEL
options     SCHED_ULE       # ULE scheduler
options     PREEMPTION      # Enable kernel thread preemption
options     INET            # InterNETworking
options     INET6           # IPv6 communications protocols
options     SCTP            # Stream Control Transmission Protocol
options     FFS             # Berkeley Fast Filesystem
options     SOFTUPDATES     # Enable FFS soft updates support
options     UFS_ACL         # Support for access control lists
options     UFS_DIRHASH     # Improve performance on big directories
options     UFS_GJOURNAL    # Enable gjournal-based UFS journaling
options     MD_ROOT         # MD is a potential root device
options     NFSCL           # New Network Filesystem Client
options     NFSD            # New Network Filesystem Server
options     NFSLOCKD        # Network Lock Manager
options     NFS_ROOT        # NFS usable as /, requires NFSCL
options     MSDOSFS         # MSDOS Filesystem
options     CD9660          # ISO 9660 Filesystem
options     PROCFS          # Process filesystem (requires PSEUDOFS)
options     PSEUDOFS        # Pseudo-filesystem framework
options     GEOM_PART_GPT       # GUID Partition Tables.
options     GEOM_RAID       # Soft RAID functionality.
options     GEOM_LABEL      # Provides labelization
options     COMPAT_FREEBSD4     # Compatible with FreeBSD4
options     COMPAT_FREEBSD5     # Compatible with FreeBSD5
options     COMPAT_FREEBSD6     # Compatible with FreeBSD6
options     COMPAT_FREEBSD7     # Compatible with FreeBSD7
options     SCSI_DELAY=5000     # Delay (in ms) before probing SCSI
options     KTRACE          # ktrace(1) support
options     STACK           # stack(9) support
options     SYSVSHM         # SYSV-style shared memory
options     SYSVMSG         # SYSV-style message queues
options     SYSVSEM         # SYSV-style semaphores
options     _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions
options     PRINTF_BUFR_SIZE=128    # Prevent printf output being interspersed.
options     KBD_INSTALL_CDEV    # install a CDEV entry in /dev
options     HWPMC_HOOKS         # Necessary kernel hooks for hwpmc(4)
options     AUDIT               # Security event auditing
options     MAC                 # TrustedBSD MAC Framework
options     INCLUDE_CONFIG_FILE # Include this file in kernel
options     KDB                 # Kernel debugger related code
options     KDB_TRACE           # Print a stack trace for a panic
options     SMP                 # Symmetric MultiProcessor Kernel
device      apic                # I/O APIC
device      cpufreq
device      acpi
device      eisa
device      pci
device      ahci            # AHCI-compatible SATA controllers
device      ata             # Legacy ATA/SATA controllers
options     ATA_CAM         # Handle legacy controllers with CAM
options     ATA_STATIC_ID   # Static device numbering
options     AHD_REG_PRETTY_PRINT    # Print register bitfields in debug
device      scbus       # SCSI bus (required for ATA/SCSI)
device      ch          # SCSI media changers
device      da          # Direct Access (disks)
device      sa          # Sequential Access (tape etc)
device      cd          # CD
device      pass        # Passthrough device (direct ATA/SCSI access)
device      ses         # Enclosure Services (SES and SAF-TE)
device      ctl         # CAM Target Layer
device      vga         # VGA video card driver
options     VESA        # Add support for VESA BIOS Extensions (VBE)
device      splash      # Splash screen and screen saver support
device      sc
options     SC_PIXEL_MODE   # add support for the raster text mode
device      agp     # support several AGP chipsets
device      pmtimer
device      cbb         # cardbus (yenta) bridge
device      uart        # Generic UART driver
device      ppc
device      ppbus       # Parallel port bus (required)
device      lpt         # Printer
device      plip        # TCP/IP over parallel
device      ppi         # Parallel port interface device
device      puc         # Multi I/O cards and multi-channel UARTs
device      miibus      # MII bus support
device      msk         # Marvell/SysKonnect Yukon II Gigabit Ethernet
device      wlan                    # 802.11 support
options     IEEE80211_DEBUG         # enable debug msgs
options     IEEE80211_AMPDU_AGE     # age frames in AMPDU reorder q's
options     IEEE80211_SUPPORT_MESH  # enable 802.11s draft support
device      wlan_wep                # 802.11 WEP support
device      wlan_ccmp               # 802.11 CCMP support
device      wlan_tkip               # 802.11 TKIP support
device      wlan_amrr               # AMRR transmit rate control algorithm
device      ath                     # Atheros NIC's
device      ath_pci                 # Atheros pci/cardbus glue
device      ath_hal                 # pci/cardbus chip support
options     AH_SUPPORT_AR5416       # enable AR5416 tx/rx descriptors
device      ath_rate_sample         # SampleRate tx rate control for ath
device      loop                    # Network loopback
device      random                  # Entropy device
device      ether                   # Ethernet support
device      vlan                    # 802.1Q VLAN support
device      tun                     # Packet tunnel.
device      pty                     # BSD-style compatibility pseudo ttys
device      md                      # Memory "disks"
device      gif                     # IPv6 and IPv4 tunneling
device      faith                   # IPv6-to-IPv4 relaying (translation)
device      firmware                # firmware assist module
device      bpf     # Berkeley packet filter
options     USB_DEBUG   # enable debug msgs
device      uhci        # UHCI PCI->USB interface
device      ohci        # OHCI PCI->USB interface
device      ehci        # EHCI PCI->USB interface (USB 2.0)
device      usb         # USB Bus (required)
device      uhid        # "Human Interface Devices"
device      ukbd        # Keyboard
device      ulpt        # Printer
device      umass       # Disks/Mass storage - Requires scbus and da
device      ums         # Mouse
device      firewire    # FireWire bus code
device      fwe         # Ethernet over FireWire (non-standard!)
device      fwip        # IP over FireWire (RFC 2734,3146)
device      dcons       # Dumb console driver
device      dcons_crom  # Configuration ROM for dcons
device      sound       # Generic sound driver (required)
device      snd_hda     # Intel High Definition Audio
device      asmc
device      atp

Les deux sources principales correspondant à l’installation sont: la doc officielle et les pages man des commandes ou autres (on y trouve des indications très précieuses ;) )
== Non classées ==
http://olivier.cochard.me/bidouillage/installation-et-configuration-de-freebsd-comme-poste-de-travail
http://wiki.freebsd.org/AppleMacbook
https://help.ubuntu.com/community/MactelSupportTeam/AppleIntelInstallation (problème du délai avant le boot freebsd)
http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-building.html
http://www.unix.com/man-page/FreeBSD/4/asmc/
http://howtounix.info/man/FreeBSD/man4/atp.4
https://cooltrainer.org/2012/01/02/a-freebsd-9-desktop-how-to/
http://blog.hplogsdon.com/tuning-freebsd-for-apple-hardware/
http://bersace03.free.fr/pub/Development/Linux/xkb-mac/
== Sécurisation ==
http://skreuzer.pbworks.com/w/page/6627216/FreeBSD
http://www.roe.ch/FreeBSD_Contributions
http://www.freebsd.org/cgi/man.cgi?query=geli&sektion=8
http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/disks-encrypting.html
http://www.gooze.eu/howto/smartcard-quickstarter-guide/freebsd-installation
http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/firewalls-pf.html

Thursday, 27 September 2012

Un environnement de développement PHP avec Vim

Facteur d'entropie | 19:19, Thursday, 27 September 2012

Dans cet article, on va mettre en place un environnement de développement pour le web assez léger et complet avec que des bonnes choses libres dedans.
1/ L’édition
On va utiliser vim. Dans un premier temps, on l’installe donc.
Chez moi: emerge -uD vim
On active la numérotation des lignes et les replis en ajoutant ceci à votre ~/.vimrc :

:set number
:set foldmethod=marker

La seconde ligne permet d’activer le replis dans les fichiers. Pour ceci, vous devez ajouter en commentaire au début de votre fichier, l’entrée:

vim: foldmarker MARKER_DEBUT,MARKER_FIN

Remplacez MARKER_DEBUT et MARKER_FIN par ce que vous souhaitez (du genre ‘{{{‘ et ‘}}}’). Il vous suffit après de délimiter vos blocs avec ces deux marqueurs. Un petit z-o pour ouvrir le bloc et z-c pour le fermer.

Puis phpdoc:
Le greffon PDV (PhpDocumentor for Vim) permet d’ajouter rapidement des commentaires et tags phpdoc dans vos scripts.
Une fois celui-ci installé, il vous faudra modifier votre fichier ~/.vimrc en lui ajoutant les lignes suivantes:

source ~/.vim/plugin/php-doc.vim
imap <C-o> <ESC>:set paste<CR>:call PhpDoc()<CR>:set nopaste<CR>

Après ceci, un petit CTRL+o en mode édition ajoutera un bloc commentaire avec des infos à compléter.

Puis l’auto-complétion des commandes:
Téléchargez le greffon ici puis on met fichier dans ~/.vim/plugin/
Téléchargez le second greffon ici puis on met fichier dans ~/.vim/autoload/
Récupérez aussi le fichier contenant la liste des commandes php ici et on le place dans ~/.vim/syntax/
Toujours dans le ~/.vimrc on ajoute:

set complete=.,w,b,u,t,i,k~/.vim/syntax/php.api
autocmd FileType php set omnifunc=phpcomplete#CompletePHP
source ~/.vim/plugin/word_complete.vim
call DoWordComplete()

On va enfin modifier la configuration de ~/.vim/plugin/word_complete.vim pour mettre l’auto-complétion avec une chaîne d’au moins 3 caractères:

" ==================== file word_complete.vimrc ====================
" User Configuration file for word_complete.vim .
" To use this, uncomment and change the defaults. 

" Do not complete words shorter than this length:
let g:WC_min_len = 3
" Use this key to accept the offered completion:
let g:WC_accept_key = "<Tab>"
" ==================== end: word_complete.vimrc ====================

La seconde ligne surlignée vous permet de changer la touche d’acceptation de la complétion.

Puis la coloration syntaxique:
Ajoutez dans votre ~/.vimrc ceci:

syntax on
filetype on

La seconde ligne active la détection des types de fichiers.
Vous pouvez mettre à jour la coloration syntaxique avec la version php 5.3 via ce lien. Dans l’archive, il y a un script php à exécuter en ligne de commande qui vous permettra de mettre à jours vous-même le-dit fichier.

Enfin la vérification de votre code avec php:
Ici, on va redéfinir la commande makeprg (make programme) de vim pour la faire pointer vers la version cli de php avec l’option -l:

set makeprg=/usr/lib64/php5.4/bin/php\ -l\ %
nmap <F9> :make<ENTER>:copen<ENTER><CTRL>L

Maintenant à chaque fois que vous utiliserez la touche F9, cela déclenchera php -l sur votre fichier en cours d’édition

2/ Le Débogage
Pour le débogage sous PHP on a le choix de le faire à grands coups de var_dump() (qui devient vite pénible) ou d’utiliser une extension de PHP xdebug. Celle-ci s’installe donc sur le serveur et se déclenche automatiquement (selon sa configuration) lorsque le serveur reçoit une requête http avec le paramètre XDEBUG_SESSION_START=1.
* PHP
L’installation se fait de la manière la plus simple avec un petit:

pecl install xdebug

Si vous voulez une installation plus spécifique: installation xdebug
Après vous ajoutez cette ligne à votre php.ini:
zend_extension=”/usr/local/php/modules/xdebug.so”
Et vous devez paramétrer le fichier de configuration de xdebug (chez moi: /etc/php/apache2-php5.4/xdebug.ini). Le miens ressemble à ça:

zend_extension=/usr/lib64/php5.4/lib/extensions/no-debug-zts-20100525/xdebug.so
xdebug.auto_trace="1"
xdebug.trace_output_dir="/dir_Traces"
xdebug.trace_output_name="trace.%c"
xdebug.trace_format="0"
xdebug.trace_options="0"
xdebug.collect_includes="1"
xdebug.collect_params="0"
xdebug.collect_return="0"
xdebug.collect_vars="0"
xdebug.default_enable="0"
xdebug.extended_info="1"
xdebug.manual_url="http://www.php.net"
xdebug.max_nesting_level="100"
xdebug.show_exception_trace="0"
xdebug.show_local_vars="0"
xdebug.show_mem_delta="0"
xdebug.dump.COOKIE="NULL"
xdebug.dump.ENV="NULL"
xdebug.dump.FILES="NULL"
xdebug.dump.GET="NULL"
xdebug.dump.POST="NULL"
xdebug.dump.REQUEST="NULL"
xdebug.dump.SERVER="NULL"
xdebug.dump.SESSION="NULL"
xdebug.dump_globals="1"
xdebug.dump_once="1"
xdebug.dump_undefined="0"
xdebug.profiler_enable="0"
xdebug.profiler_output_dir="/dir_Profiles"
xdebug.profiler_output_name="callgrind.out.%p"
xdebug.profiler_enable_trigger="1"
xdebug.profiler_append="1"
xdebug.profiler_aggregate="0"
xdebug.remote_enable="1"
xdebug.remote_handler="dbgp"
xdebug.remote_host="localhost"
xdebug.remote_mode="req"
xdebug.remote_port="9000"
xdebug.remote_autostart="0"
xdebug.remote_log=""
xdebug.idekey=""
xdebug.var_display_max_data="512"
xdebug.var_display_max_depth="2"
xdebug.var_display_max_children="128"

J’ai surligné les lignes importantes. Évidemment, vous devez adapter les paramètres à votre système (du genre dir_Profiles et dir_Traces).

* vim
Pour utiliser xdebug avec vim, vous devez installer le greffon suivant: dbgp remote debugger.
Pour cela vous copiez les fichiers debugger.py et debugger.vim de l’archive dans votre répertoire: ~/.vim/plugin/
Une fois le greffon installé, il vous suffira d’appuyer sur F5 dans vim et vous aurez 10 secondes pour lancer votre requête http dans votre navigateur.
Pour ce faire, vous avez deux possibilités:
Passer un paramètre à la requête: http://adresse_du_site?XDEBUG_SESSION_START=1 ou
si vous utilisez firefox, celui-ci possède une extension bien pratique dans notre cas: easy xdebug. Celle-ci permet de déclencher le débogage à distance et le profilage de vos scripts via l’appuie sur deux boutons.

Une fois le débogueur lancé, F2 vous amène à l’instruction suivante, F3 vous fait sauter au bloc suivant, F12 vous donne le contenu de la variable sur laquelle se trouve votre curseur et F5 vous amène au point d’arrêt suivant ou à la fin du script.
:Bp permet d’ajouter ou d’ôter des points d’arrêt.

3/ Le profilage
* Qcachegrind
Qcachegrind est une partie du projet KCachegrind que vous trouverez ici.
L’installation se fait très facilement.
Dans un premier temps, vous téléchargez les sources de KCachegrind, décompressez l’archive. Puis vous vous rendez dans le sous-répertoire qcachegrind et vous tapez:

qmake
make

Si tout se passe bien vous devriez obtenir un binaire qcachegrind dans le-dit répertoire.
Il suffira ensuite de lancer l’application et d’ouvrir avec les fichier callgrind générés par xdebug (Cf la configuration de xdebug plus haut, ligne 31).

Voici à quoi cela ressemble:
QCacheGrind

4/ Goodies
* pdepend est un petit logiciel qui permet de faire de la métrologie logicielle. Il vous sortira des graphiques exprimant un certain nombre de mesures (comme le nombre total d’appel de méthodes, le nombre de classes ou encore la complexité cyclomatique du code) au format svg.
Pour l’installer il faut passer par PEAR.

pear channel-discover pear.pdepend.org
pear install pdepend/PHP_Depend

Pour générer les graphiques tapez:

pdepend --overview-pyramid=./graphique-pyramide.svg --jdepend-chart=./diagramme-dep.svg ./arborescence-du-code

Ceci vous créera deux images svg.

Voici le type de diagrammes que vous obtiendrez:
Diagramme pyramideDiagramme dépendances

* Dia est un logiciel qui permet de faire des diagrammes et schémas. Il possède notamment une librairie UML permettant de faire tous vos diagrammes de classes, et autres.
Autre intérêt et non des moindres, on peut installer un greffon qui se nomme uml2php5 qui permet d’exporter directement vos schémas de classes sous formes de squelettes php
(et ceci est paramétrable en plus!).
Pour l’installation de dia, reportez-vous à votre distribution.
Voici une image de l’interface:
Interface Dia
Après, on va installer uml2php5: Allez ici et téléchargez le paquet. Les instructions d’installation sont relativement claires.
En rapide, il suffit de décompresser l’archives et de copier 5 fichiers (stylesheet.xml, dia-uml-classes.zx, dia-uml2php5.zx, dia-uml2phpsoap.zx et dia-uml2php5.conf.xsl) dans le répertoire de dia contenant les spécifications des greffons, chez, moi il se trouve ici: /usr/share/dia/xslt
Le fichier de configuration de uml2php5 est: dia-uml2php5.conf.xsl

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        <!--
                Parameter       : INDENT_STR
                Values          : 	 [TAB] or SPACE CHAR(s)
                Comment         : if you want you can replace [TAB] with [SPACE] char(s)
        -->
        <xsl:param name="INDENT_STR"><xsl:text>	</xsl:text></xsl:param>
        <!--
                Parameter       : CLOSE_TAG
                Values          : ON / OFF
                Comment         : if you want source code ended or not by '?>'
        -->
        <xsl:param name="CLOSE_TAG">ON</xsl:param>
        <!--
                Parameter       : CLASS_FILE_EXTENSION
                Values          : .class.php / whatever you want
                Comment         : define file extension for classes
        -->
        <xsl:param name="CLASS_FILE_EXTENSION">.class.php</xsl:param>
        <!--
                Parameter       : INTERFACE_FILE_EXTENSION
                Values          : .interface.php / whatever you want
                Comment         : define file extension for interfaces
        -->
        <xsl:param name="INTERFACE_FILE_EXTENSION">.interface.php</xsl:param>
        <!--
                Parameter       : GENERATE_DOC_TAGS
                Values          : ON / OFF
                Comment         : if you want document your source code or not
        -->
        <xsl:param name="GENERATE_DOC_TAGS">ON</xsl:param>
        <!--
                Parameter       : COMPOSITION_IMPLICIT_NAMING
                Values          : ON / OFF
                Comment         : generate or not composition attribute if role is missing
        -->
        <xsl:param name="COMPOSITION_IMPLICIT_NAMING">ON</xsl:param>
        <!--
                Parameter       : AGGREGATION_IMPLICIT_NAMING
                Values          : ON / OFF
                Comment         : generate or not aggregation attribute and method
        -->
        <xsl:param name="AGGREGATION_IMPLICIT_NAMING">ON</xsl:param>
        <!--
                Parameter       : AUTO_EXPAND_INTERFACES
                Values          : ON / OFF
                Comment         : generate interface methods automaticaly
        -->
        <xsl:param name="AUTO_EXPAND_INTERFACES">ON</xsl:param>
        <!--
                Parameter       : _AUTHOR_
                Values          : Name <email>
                Comment         : define the content of @author tag
        -->
        <xsl:param name="_AUTHOR_">Alexandre Keledjian &lt;dervishe@yahoo.fr&gt;</xsl:param>
        <!--
                Parameter       : _COPYRIGHT_
                Values          : Any
                Comment         : define the content of @copyright tag
        -->
        <xsl:param name="_COPYRIGHT_">AFPD</xsl:param>
        <!--
                Parameter       : _LICENSE_
                Values          : URL Name
                Comment         : define the content of @license tag
        -->
        <xsl:param name="_LICENSE_">http://www.gnu.org/licenses</xsl:param>
        <!--
                Parameter       : TRANSLATE_CONSTRUCTOR
                Values          : ON / OFF
                Comment         : translate the name of the constructor to __construct
        -->
        <xsl:param name="TRANSLATE_CONSTRUCTOR">ON</xsl:param>
        <!--
                Parameter       : TRANSLATE_DESTRUCTOR
                Values          : ON / OFF
                Comment         : translate the name of the ~destructor to __destruct
        -->
        <xsl:param name="TRANSLATE_DESTRUCTOR">ON</xsl:param>
        <!--
                Parameter       : _CR
                Values          : Linux : 
 Windows : 


                Comment         : Define cariage return/Line feed
        -->
        <xsl:param name="_CR"><xsl:text>
</xsl:text></xsl:param>
        <!--
                Parameter       : AUTO_SETTERS_GETTERS
                Values          : ON/OFF (default: OFF)
                Comment         : allows generation of setters/getters for private data
        -->
        <xsl:param name="AUTO_SETTERS_GETTERS"><xsl:text>ON</xsl:text></xsl:param>
        <!--
                Parameter       : SOAP_SERVER_URL
                Values          : Any (default: URL/)
                Comment         : SOAP server url (ie: xxxx.yyyy.zzz/ )
        -->
        <xsl:param name="SOAP_SERVER_URL"><xsl:text>URL/</xsl:text></xsl:param>
</xsl:stylesheet>

Voici ce que ça donne:
Le schéma de dia:

Et son export en php:

<?php
/**
 *
 * Code skeleton generated by dia-uml2php5 plugin
 * written by KDO kdo@zpmag.com
 * @author     Alexandre Keledjian <dervishe@yahoo.fr>
 * @copyright  AFPD
 */
class Utilisateur {
        /**
         *
         * @var int
         * @access private
         */
        private  $id;
        /**
         *
         * @var int
         * @access private
         */
        private  $id_personne;
        /**
         *
         * @var string
         * @access private
         */
        private  $login;
        /**
         *
         * @var string
         * @access private
         */
        private  $nom;
        /**
         *
         * @var string
         * @access private
         */
        private  $prenom;
        /**
         *
         * @var string
         * @access private
         */
        private  $photo;
        /**
         *
         * @var array
         * @access private
         */
        private  $roles = array();
        /**
         *
         * @var string
         * @access private
         */
        private  $dn;
        /**
         *
         * @var string
         * @access private
         */
        private  $courriel_adm;
        const USR = 'U';
        const SAR = 'SAR';
        const ADM = 'A';
        const SA = 'SA';
        /**
         * @access public
         * @param string $login
         */
        public final  function __construct($login = null) {

        }
        /**
         * @access public
         * @return bool
         */
        public final  function isSuperAdmin() {

        }
        /**
         * renvoie: 1 U1 > U2, -1 U1 < U2 et 0 sinon
         * @access public
         * @param Utilisateur $user1
         * @param Utilisateur $user2
         * @param int $region
         * @return int
         */
        public final  function compare(Utilisateur $user1, Utilisateur $user2, $region) {
        }

        // setters / getters

        public function set_id($value) {
                $this->id = $value;
        }
        public function get_id() {
                return $this->id;
        }
        public function set_id_personne($value) {
                $this->id_personne = $value;
        }
        public function get_id_personne() {
                return $this->id_personne;
        }
        public function set_login($value) {
                $this->login = $value;
        }
        public function get_login() {
                return $this->login;
        }
        public function set_nom($value) {
                $this->nom = $value;
        }
        public function get_nom() {
                return $this->nom;
        }
        public function set_prenom($value) {
                $this->prenom = $value;
        }
        public function get_prenom() {
                return $this->prenom;
        }
        public function set_photo($value) {
                $this->photo = $value;
        }
        public function get_photo() {
                return $this->photo;
        }
        public function set_roles($value) {
                $this->roles = $value;
        }
        public function get_roles() {
                return $this->roles;
        }
        public function set_dn($value) {
                $this->dn = $value;
        }
        public function get_dn() {
                return $this->dn;
        }
        public function set_courriel_adm($value) {
                $this->courriel_adm = $value;
        }
        public function get_courriel_adm() {
                return $this->courriel_adm;
        }
}
?>

* better-snipmate-snippet est un greffon vim (évolution du greffon snipmate) qui permet plein de choses comme la création automatique de bloc de codes ou leur édition plus rapide. Une petite vidéo qui montre les possibilités du greffon initial: ici
Pour l’installer, son auteur préconise l’utilisation du greffon pathogen.
On le télécharge ici. Vous le copiez dans ~/.vim/plugin
Il ne vous reste plus qu’à créer le répertoire ~/.vim/bundle et à rajouter en début de ~/.vimrc la ligne:

call pathogen#infect()

Après il ne vous restera qu’à ajouter les greffons dans un répertoire situé dans ~/.vim/bundle.
Donc pour installer better-snipmate-snippet on va mettre ses sources via git dans ~/.vim/bundle :

cd ~/.vim/bundle
git clone git://github.com/bartekd/better-snipmate-snippets.git

* MySQL-Workbench Si vous voulez de belles images de vos bases de données et / ou les manipuler graphiquement, vous pouvez utiliser MySQL WorkBench, téléchargeable ici.
La version “MySQL Workbench Community Edition” est sous license GPL.
Une petite image de l’interface jolie:
MySQL Workbench

Pour finir, voici à quoi ressemble mon ~/.vimrc:

call pathogen#infect()
:set number
:set fileformat=unix
:set encoding=utf-8
syntax on
filetype on

:set foldmethod=marker
source ~/.vim/plugin/php-doc.vim
imap <C-o> <ESC>:set paste<CR>:call PhpDoc()<CR>:set nopaste<CR>

set complete=.,w,b,u,t,i,k~/.vim/syntax/php.api
autocmd FileType php set omnifunc=phpcomplete#CompletePHP

source ~/.vim/plugin/word_complete.vim
call DoWordComplete()

set makeprg=/usr/lib64/php5.4/bin/php\ -l\ %
nmap <F9> :make<ENTER>:copen<ENTER><CTRL>L

Voilà, on arrive au bout du chemin. Si ça ne vous paraît pas clair, incomplet, voire inexact, n’hésitez pas à faire des remarques, je mettrai à jour au fur et à mesure.

Edit:
(28/09/2012)
* Rajout de la partie coloration syntaxique php 5.3
* Rajout de l’auto-complétion
* Check de syntax avec le client php

Monday, 13 August 2012

Des logiciels libres et un petit script vous aident à gagner de la place

Facteur d'entropie | 01:22, Monday, 13 August 2012

Ayant eu un besoin récent de libérer des étagères chez moi, je me suis mis en tête de numériser tous mes cd musicaux. La tâche à réaliser se décomposait en: rippage du cd, récupération des informations cddb (les noms des morceaux, ceux des artistes, le genre, l’année et le numéro des pistes), encodage en flac (Free Lossless Audio Codec: c’est de la compression rapide et sans perte, tous les détails en cliquant sur le lien), ajout des tags id3 aux morceaux et constitution d’une playlist m3u pour l’album.

Dans un premier temps, je me suis frotté aux différents outils que je pourrai utiliser:

  • cdda2wav pour le rippage du cd. Cet utilitaire est inclus dans la suite cdrecord (cdrtools)
  • ffmpeg pour l’encodage
  • eyeD3 pour travailler les tags id3 (j’ai pris celui-ci pour sa gestion des tags id3v2)

La tâche n’est absolument pas compliquée mais vraiment rébarbative. Étant d’un tempérament loutresque, je me suis fait un petit utilitaire sous la forme d’un script shell qui automatise tout ceci.
Pour la plupart des distributions, cdrecord/cdrtools et ffmpeg seront sans doute déjà installés. Il ne reste qu’à trouver le paquet de eyeD3 correspondant à votre distribution.

Une fois avoir constaté la présence de ces 3 outils sur la machine avec un petit whereis des familles:

whereis cdda2wav ffmpeg eyeD3

Si tout se passe bien, vous devriez obtenir 3 lignes avec le chemin vers chacun des utilitaires.
Il ne restait plus qu’à les utiliser avec les bonnes options:

cdda2wav -L 0 -max -paranoia -B
ffmpeg -i monfic.wav monfic.flac
eyeD3 -2 -A "Titre album" -Y annee -G "Genre" -t "Titre" -n "Piste" -a "Interprete" monfichier.flac

Pour la ligne n°1:
cdda2wav va lire le cd, récupérer les données id3 sur le serveur cddb en vous demandant de choisir si plusieurs enregistrements correspondent (drapeaux: -L 0), écrire les fichiers d’information (les futurs .inf qui seront utilisés pour récupérer les tags id3) et ripper le contenu du cd sous la forme de fichiers wav (drapeaux: -B -max -paranoia) en utilisant la bibliothèque cdparanoia (meilleur rip à priori).
La ligne n°2 correspond à l’encodage (ici il n’y a rien à dire).
La ligne n°3 enfin, permet le rajout des tags id3 entre parenthèses au morceau monfichier.flac

Il ne restait plus qu’à mettre tout ceci en musique dans un petit script.
Je vous l’ai mis ici.

#!/bin/bash
# Auteur: dervishe / Alex Keledjian <dervishe@yahoo.fr>
# License: GPL2
# vim: foldmarker{{{,}}}
# Script permettant l'encodage de CD musicaux en flac à la volée
# avec fixation des tags id3 et création d'une liste m3u

#{{{Paramètres
DEVICE='/dev/sr0'
VERSION="0.2"
ARTISTE='Nouvel_artiste'
ALBUM='Nouvel_album'
RIPPER='cdda2wav'
ENCODEUR='ffmpeg'
EDIT_ID3='eyeD3'
EJECTEUR_ALT='eject'
EJECTEUR='cdrecord'
ENCODAGE_FIN='UTF-8'
VERBEUX=1
PARANO=0
EJECT=1
NAME_TRACKS=0
WITH_M3U=1
WITH_ID3=1
JUST_ID3=0
JUST_M3U=0
FORCE_REP=0
KEEP_WFILES=0
FROM_FILES=0
REP_TMP="./tmp_$(date +%s)"
WITH_ITUNES=0
PARSE=0
ASK=0
SEPARATEUR='/'
#}}}
function show_version() { #{{{
    echo "Version: $VERSION - dervishe / Alex Keledjian <dervishe@yahoo.fr> - GPL2"
} #}}}
function show_help() { #{{{
    local NOM_SOFT=$(echo $0 | sed 's/.*\/\([^\/]*\)$/\1/')
    show_version
    echo "Usage:
 $0 [options]

Options:	(Les valeurs par défaut sont mentionnées entre des parenthèses)

    GÉNÉRAL:
	-h --help				Montre l'aide
	-v --version				Montre la version
	-d --dev				Spécifier le lecteur (${DEVICE})
	--quiet					Mode non verbeux
	--parano				Utilise la libparanoia
	--force-rep				Force les répertoires à ceux fixée via les options -a et -A
	--keep-files				Garder les fichiers intermédiaires (.wav, .inf, etc.)

    M3U (Playlistes):
	--just-m3u				Seulement construire la liste m3u
	--no-m3u				Ne pas faire la liste m3u

    ID3 (Tag des morceaux):
	-a <nom de l'artiste>			Spécifier le nom de l'artiste (${ARTISTE})
	-A <nom de l'album>			Spécifier le nom de l'album (${ALBUM})
	--just-id3				Seulement ajouter les infos id3
	--no-id3				Ne pas ajouter les données id3 aux moreaux
	--itunes-compat				Active la compatibilité avec itunes pour les tags id3
	--name-tracks				Nommer les fichiers avec le nom des morceaux correspondants
	-p <separateur>				Analyse la titre de la chanson pour en extraire l'interprète et le titre
	--ask-sep				Demande le séparateur à utiliser pour analyser le titre/artiste.
	--from-local-files			Désactive la récupération des infos sur le serveur cddb et
						force l'utilisation de fichiers locaux afin de construire les tags id3.

Utilisation:

    $NOM_SOFT est assez simple d'utilisation. Mettons que vous ayez un album des 'berniques hurlantes' s'appelant 'Les moules en folie'
    et que vous souhaitiez en immortaliser une copie de sauvegarde. Placez-vous dans le répertoire qui doit contenir vos sauvegardes.
    Plusieurs choix s'offrent à vous:
	* Je suis fainéant, $NOM_SOFT va tout faire tout seul:
		$0
	* Je veux spécifier le titre de l'album et le nom de l'artiste:
		$0 -a 'berniques hurlantes' -A 'Les moules en folie'

    Par défaut, $NOM_SOFT va créer automatiquement les fichiers m3u de l'album et mettre des tags id3 sur tous les morceaux.
    Vous pouvez outrepasser ce comportement en utilisant les drapeaux --no-id3 et/ou --no-m3u.

Notes:

    * L'encodage des donnés id3 se fait en UTF-8
    * L'utilisation conjointe des drapeaux --just-id3 et --just-m3u résultera dans l'exécution du seul dernier drapeau mentionné.
    * Si, lors de la phase de capture des informations, $NOM_SOFT semble bloqué, arrêter-le et relancer-le sans utiliser le drapeau
      --quiet . Cela provient du fait que $RIPPER a besoin de votre aide pour l'identification de l'album.
    * Pour utiliser les tags id3, il faut que votre machine soit connectée à Internet. Le script le vérifiera automatiquement et vous
      proposera des options le cas échéant.
    * Si vous avez déjà les fichiers inf d'une précédente récupération, en les mettant dans le même répertoire que les fichiers flac,
      vous pouvez forcer leur utilisation afin de construire les tags id3. Pour ceci vous devez impérativement donner le nom de l'artiste,
      celui de l'album et utiliser le drapeau --from-local-files.
    * En cas d'utilisation des options: --just-m3u ou --just-id3, si vous avez des soucis liés à la non-localisation des répertoires
      artiste/album, vous pouvez les forcer avec l'utilisation conjointe des options: \"-a artiste -A album --force-rep\".
    * L'éjection automatique du cd nécessite un des programmes $EJECTEUR ou $EJECTEUR_ALT. Ils sont testés dans cet ordre et si aucun
      n'est présent l'éjection est simplement annulée et le fait est signalé.
    * Le mode 'paranoia' (drapeau --parano) demande à $RIPPER d'utiliser la libparanoia. Le rippage est plus long mais permet de
      meilleurs résultats (à utiliser si vous avez un soucis de rippage).
    * Le drapeau -p sert en cas de compilations (disques ayant plusieurs interprètes différents) à fixer les bonnes valeurs aux tags id3
      'artiste' et 'titre'. En paramètre, on doit lui passer le caractère séparant le nom de l'artiste, du titre dans les fichiers cddb.
      Cette fonction n'est effective que dans le cadre d'actions activant la gestion des tags id3.
    "
} #}}}
function check_rip() { #{{{
    echo -n "[*] Recherche du ripper ${RIPPER}:"
    for NUTIL in $(whereis -b $RIPPER | sed 's/^[^:]*: //'); do
	if [ -x "$NUTIL" ]; then
	    RIPPER="$NUTIL"
	    echo "			[OK] (${RIPPER})"
	    return 0
	fi
    done
    echo -e "\n${RIPPER} n'a pas été trouvé, vous pouvez le spécifier avec l'option -r."
    exit -1
} #}}}
function check_enc() { #{{{
    echo -n "[*] Recherche de l'encodeur ${ENCODEUR}:"
    for NUTIL in $(whereis -b $ENCODEUR | sed 's/^[^:]*: //'); do
	if [ -x "$NUTIL" ]; then
	    ENCODEUR="$NUTIL"
	    echo "			[OK] (${ENCODEUR})"
	    return 0
	fi
    done
    echo -e "\n${ENCODEUR} n'a pas été trouvé, vous pouvez le spécifier avec l'option -e."
    exit -1
} #}}}
function check_id3() { #{{{
    echo -n "[*] Recherche de l'éditeur ID3 ${EDIT_ID3}:"
    for NUTIL in $(whereis -b $EDIT_ID3 | sed 's/^[^:]*: //'); do
	if [ -x "$NUTIL" ]; then
	    EDIT_ID3="$NUTIL"
	    echo "			[OK] (${EDIT_ID3})"
	    return 0
	fi
    done
    echo -e "\n${EDIT_ID3} n'a pas été trouvé, vous pouvez le spécifier avec l'option -i."
    exit -1
} #}}}
function check_eject() { #{{{
    echo -n "[*] Recherche de la commande d'éjection:"
    for NUTIL in $(whereis -b $EJECTEUR | sed 's/^[^:]*: //'); do
	if [ -x "$NUTIL" ]; then
	    EJECTEUR="$NUTIL"
	    echo "		[OK] (${EJECTEUR})"
	    EJECTEUR="$EJECTEUR --eject --dev "
	    return 0
	fi
    done
    # Test la solution alternative 'cdrecord'
    for NUTIL in $(whereis -b $EJECTEUR_ALT | sed 's/^[^:]*: //'); do
	if [ -x "$NUTIL" ]; then
	    EJECTEUR="$NUTIL"
	    echo "		[OK] (${EJECTEUR})"
	    return 0
	fi
    done
    EJECT=0
    echo "			[FAIL] $EJECTEUR et $EJECTEUR_ALT n'ont pas été trouvés."
} #}}}
function check_connexion() { #{{{
    echo -n "[*] Test de la connexion internet:"
    ping -c 1 -w 2 www.google.fr > /dev/null 2>&1
    if [ $? -eq 0 ]; then
	echo "			[OK]"
	return 1
    fi
    echo -ne "\n\nVotre connexion internet semble non opérationnelle.
On peut désactiver la génération des tags id3. Vous pourrez alors
la refaire plus tard en exécutant:
	cd $(pwd)
	$0 --just-id3 -a '${ARTISTE}' -A '${ALBUM}'
La génération des tags id3 doit-elle être désactivée (o) ou voulez-vous
continuer avec les valeurs: '${ARTISTE}' et '${ALBUM}' (n) ou bien encore
sortir pour spécifier certaines informations en tapant (s) ? ([o]/n/s) "
    read REPI
    if ! [ "$REPI" == 'n' ]; then WITH_ID3=0; fi
    if [ "$REPI" == 's' ]; then exit 1; fi
    echo -e "\n[*] Désactivation de la génération des tags id3:	[OK]"
} #}}}
function check_tools() { #{{{
    check_rip &&
    check_enc &&
    if [ "$WITH_ID3" -eq 1 ]; then check_id3; fi
    check_eject
} #}}}
function transcode() { #{{{
    if ! [ -f ./audio.cddb ]; then
	echo -n "[*] Lecture des données du disque: "
	local FLAG_ID3=' -L 0'
	if [ "$WITH_ID3" -eq 0 ]; then FLAG_ID3=' -no-infofile'; fi
	local FLAG_PARANO=''
	if [ "$PARANO" -eq 1 ]; then FLAG_PARANO=" -paranoia"; fi
	if [ "$VERBEUX" -eq 1 ]; then
	    echo "${RIPPER}${FLAG_ID3}${FLAG_PARANO} -max -B -D $DEVICE"
	    ${RIPPER}${FLAG_ID3}${FLAG_PARANO} -max -B -D $DEVICE
	else
	    ${RIPPER}${FLAG_ID3}${FLAG_PARANO} -max -B -D $DEVICE > /dev/null 2>&1
	fi
	echo "	[OK]"
    fi
    echo -n "[*] Transcodage des pistes:"
    for i in $(ls ./*.wav); do
	if [ "$VERBEUX" -eq 1 ]; then
	    $ENCODEUR -i $i $i.flac > /dev/null 2>&1
	else
	    $ENCODEUR -i $i $i.flac
	fi
	mv $i.flac $(echo ${i}.flac | sed "s/\.wav//")
	if [ "$KEEP_WFILES" -eq 0 ]; then rm $i; fi
    done
    echo "				[OK]"
} #}}}
function create_rep() { #{{{
    if ! [ -d "$1" ]; then
	echo -n "[*] Création du répertoire:"
	mkdir "$1" > /dev/null 2>&1 || echo -e "\n$1 n'a pût être créé. Vérifiez les permissions.";
	if ! [ -d "$1" ]; then exit -1; fi
	echo "				[OK] ($1)"
    fi
} #}}}
function create_m3u () { #{{{
    echo -n "[*] Création du fichier:";
    ls ./*.flac > ./${ALBUM}.m3u
    echo "				[OK] (${ALBUM}.m3u)";
} #}}}
function add_id3_tag () { #{{{
    if [ "$ASK" -eq 1 ]; then
	echo -ne "\n    Quel séparateur souhaitez-vous utiliser ? "
	read REPONSE
	SEPARATEUR=$REPONSE
    fi
    echo -n "[*] Ajout des tags m3u aux fichiers flac:"
    if [ $(file ./audio.cddb | grep 'UTF' | wc -l) -eq 0 ]; then modif_encodage ./audio.cddb; fi
    DYEAR=$(cat ./audio.cddb | grep "DYEAR" | sed 's/.*=\(.*\)/\1/g')
    if [ "$DYEAR" == '' ]; then DYEAR=0000; fi
    DGENRE=$(cat ./audio.cddb | grep "DGENRE" | sed 's/.*=\(.*\)/\1/g')
    if [ $($EDIT_ID3 -l | grep ": ${DGENRE}" | wc -l) -eq 0 ]; then
	echo -ne "\nLe genre est marqué comme: '$DGENRE' or il ne fait pas partie de la liste autorisée.
Voulez-vous en fixer un ('Aucun' pour non, 'L' pour obtenir les valeurs possibles puis le nom ou le numéro correspondant au genre.) ? "
	read REP
	case $REP in
	    L ) echo -e "\n"
		$EDIT_ID3 -l
		echo -ne "\nGenre: "
		read REPL
		FLAG_GENRE="$REPL" ;;
	    Aucun ) FLAG_GENRE='' ;;
	    * ) FLAG_GENRE="$REP" ;;
	esac
    else
	FLAG_GENRE="$DGENRE"
    fi
    exit;
    for FICHIER in $(ls ./*.inf); do
	if [ $(file $FICHIER | grep 'UTF' | wc -l) -eq 0 ]; then modif_encodage $FICHIER; fi
	TITRE=$(cat $FICHIER | grep "Tracktitle" | sed  "s/.*=\s*'\(.*\)'/\1/g")
	if [ "$PARSE" -eq 1 ] && [ $(echo $TITRE | grep "$SEPARATEUR" | wc -l) -eq 1 ]; then
	    PERF=$(echo $TITRE | awk "BEGIN{ FS=\"${SEPARATEUR}\" }; { print \$1 }")
	    TITRE=$(echo $TITRE | awk "BEGIN{ FS=\"${SEPARATEUR}\" }; { print \$2 }")
	else
	    PERF=$(cat $FICHIER | grep "Performer" | sed  "s/.*=\s*'\(.*\)'/\1/g")
	fi
	DALBUM=$(cat $FICHIER | grep "Albumtitle" | sed  "s/.*=\s*'\(.*\)'/\1/g")
	if [ "$DALBUM" == '' ]; then DALBUM=$ALBUM; fi
	if [ "$PERF" == '' ]; then PERF=$ARTISTE; fi
	TNUM=$(echo $FICHIER | sed 's/.*_\([[:digit:]]*\).*/\1/')
	if [ "$TNUM" == '' ]; then TNUM=00; fi
	NFICHIER=$(echo $FICHIER | sed 's/\.inf/\.flac/')
	if [ "$WITH_ITUNES" -eq 1 ]; then
	    local FLAG_ITUNES=' --itunes'
	else
	    local FLAG_ITUNES=''
	fi
	if [ "$FLAG_GENRE" == '' ]; then
	    if [ "$VERBEUX" -eq 1 ]; then
		$EDIT_ID3 -2$FLAG_ITUNES -A "$DALBUM" -Y "$DYEAR" -t "$TITRE" -n "$TNUM" -a "$PERF" "$NFICHIER"
	    else
		$EDIT_ID3 -2$FLAG_ITUNES -A "$DALBUM" -Y "$DYEAR" -t "$TITRE" -n "$TNUM" -a "$PERF" "$NFICHIER" > /dev/null 2>&1
	    fi
	else
	    if [ $(echo '$FLAG_GENRE' | grep "\s" | wc -l) -gt 0 ]; then
		if [ $VERBEUX -eq 1 ]; then
		    $EDIT_ID3 -2$FLAG_ITUNES -A "$DALBUM" -Y "$DYEAR" -G "$FLAG_GENRE" -t "$TITRE" -n "$TNUM" -a "$PERF" "$NFICHIER"
		else
		    $EDIT_ID3 -2$FLAG_ITUNES -A "$DALBUM" -Y "$DYEAR" -G "$FLAG_GENRE" -t "$TITRE" -n "$TNUM" -a "$PERF" "$NFICHIER" > /dev/null 2>&1
		fi
	    else
		if [ "$VERBEUX" -eq 1 ]; then
		    $EDIT_ID3 -2$FLAG_ITUNES -A "$DALBUM" -Y "$DYEAR" -G "$FLAG_GENRE" -t "$TITRE" -n "$TNUM" -a "$PERF" "$NFICHIER"
		else
		    $EDIT_ID3 -2$FLAG_ITUNES -A "$DALBUM" -Y "$DYEAR" -G "$FLAG_GENRE" -t "$TITRE" -n "$TNUM" -a "$PERF" "$NFICHIER" > /dev/null 2>&1
		fi
	    fi
	fi
	if [ "$NAME_TRACKS" -eq 1 ]; then
	    local NF=$(normalize ${TNUM}_${TITRE}.flac)
	    if ! [ "$NF" == "${TNUM}_.flac" ]; then mv $(echo $FICHIER | sed 's/\.inf/\.flac/') ./${NF}; fi
	fi
    done
    echo "	[OK]"
} #}}}
function modif_encodage() { #{{{
    local ENC="$(file $1 | awk '{ print $2 }')"
    if [ "$ENC" == 'ISO-8859' ]; then ENC='ISO-8859-1'; fi
    iconv -f $ENC -t $ENCODAGE_FIN ./$1 > ./$1.bak
    mv ./$1.bak ./$1
} #}}}
function clean_work_files() { #{{{
    echo -n "[*] Nettoyage des fichiers de travail:"
    if [ -d "../${ALBUM}" ] && [ $(ls ../${ALBUM} | grep -v "flac\|m3u" | wc -l) -gt 0 ]; then rm $(ls ../${ALBUM} | grep -v "flac\|m3u"); fi
    echo "			[OK]"
} #}}}
function guess_who() { #{{{
    echo -n "[*] Lecture des données du disque: "
    if ! [ -d "$REP_TMP" ]; then mkdir $REP_TMP; fi
    cd $REP_TMP
    if [ "$JUST_ID3" -eq 0 ] && [ "$JUST_M3U" -eq 0 ]; then
	local FLAG_BUILD="-max -B"
	if [ "$PARANO" -eq 1 ]; then FLAG_BUILD="-paranoia $FLAG_BUILD"; fi
    else
	local FLAG_BUILD='-J'
    fi
    if [ "$VERBEUX" -eq 1 ]; then
	$RIPPER -L 0 $FLAG_BUILD -D $DEVICE;
    else
	$RIPPER -L 0 $FLAG_BUILD -D $DEVICE > /dev/null 2>&1;
    fi
    echo -e "\n" > ./file.tmp; cat ./audio.cddb >> ./file.tmp; mv ./file.tmp ./audio.cddb		# Nécessaire pour l'assimilation du fichier à un fichier texte pour file
    if [ $(file ./audio.cddb | grep 'UTF' | wc -l) -eq 0 ]; then modif_encodage ./audio.cddb; fi
    TITRE_ALBUM=$(cat ./audio.cddb | grep DTITLE | sed 's/.*=\(.*\)/\1/');
    local TMP1=$(normalize $(echo $TITRE_ALBUM | sed 's/\(.*\)\s*\/.*/\1/'))
    local TMP2=$(normalize $(echo $TITRE_ALBUM | sed 's/.*\/\s*\(.*\)/\1/'))
    if [ "$ARTISTE" == 'Nouvel_artiste' ] && ! [ "$TMP1" == '' ]; then ARTISTE="${TMP1}"; fi
    if [ "$ALBUM" == 'Nouvel_album' ] && ! [ "$TMP2" == '' ]; then ALBUM="${TMP2}"; fi
    cd ..
    echo "			[OK]"
} #}}}
function normalize() { #{{{
    local argument="$@"
    if [[ "$argument" =~ "\s*([^[[:space:]]].*[^[[:space:]]])\s*" ]]; then
	$argument=${BASH_REMATCH[1]}
    fi
    argument=$(echo $argument | sed 's/\s/_/g')
    echo $argument
} #}}}
function check_argument() { #{{{
    if [ -z "$OPTARG" ]; then
    	echo -e "\nIl manque un argument au drapeau: '-$1'\n"
	show_help
	exit -1
    fi
} #}}}
#{{{ Analyse des paramètres
while getopts "hvA:a:d:p:-:" option; do
    case $option in
	h ) show_help
	    exit 0 ;;
	v ) show_version
	    exit 0 ;;
	a ) check_argument 'a'; ARTISTE=$(normalize $(echo $OPTARG)) ;;
	A ) check_argument 'A'; ALBUM=$(normalize $(echo $OPTARG)) ;;
	d ) check_argument 'd'; DEVICE=$OPTARG ;;
	p ) SEPARATEUR=$OPTARG; PARSE=1 ;;
	- ) case $OPTARG in
		help ) show_help
			exit 0 ;;
		version ) show_version
			exit 0 ;;
		quiet ) VERBEUX=0 ;;
		parano ) PARANO=1 ;;
		name-tracks ) NAME_TRACKS=1 ;;
		force-rep ) FORCE_REP=1 ;;
		keep-files ) KEEP_WFILES=1 ;;
		from-local-files ) FROM_FILES=1 ;;
		ask-sep ) ASK=1; PARSE=1 ;;
		just-m3u ) JUST_M3U=1; WITH_ID3=0 ;;
		just-id3 ) JUST_ID3=1; WITH_M3U=0 ;;
		no-m3u ) WITH_M3U=0 ;;
		no-id3 ) WITH_ID3=0 ;;
		itunes-compat ) WITH_ITUNES=1 ;;
		* ) echo "Option non reconnue: ${OPTARG}"
		    show_help
		    exit -1 ;;
	    esac ;;
	? ) echo -e "\nUn des drapeaux que vous avez utilisé nécessite un argument.\n"
	    show_help
	    exit -1 ;;
    esac
done
#}}}

#{{{ Main
if [ "$WITH_ID3" -eq 1 ]; then check_connexion; fi
    check_tools &&
if [ "$FROM_FILES" -eq 0 ] && [ "$ALBUM" == 'Nouvel_album' ] || [ "$FROM_FILES" -eq 0 ] && [ "$ARTISTE" == 'Nouvel_artiste' ] && [ "$WITH_ID3" -eq 1 ] && [ "$FORCE_REP" -eq 0 ]; then
    guess_who
else
    if [ "$ALBUM" == 'Nouvel_album' ] && [ "$ARTISTE" == 'Nouvel_artiste' ] && [ "$FORCE_REP" -eq 0 ]; then
	echo -e "\nVous n'avez pas spécifié d'artiste et d'album.";
	exit -1;
    fi
    ARTISTE=$(normalize "$ARTISTE")
    ALBUM=$(normalize "$ALBUM")
fi
if [ "$JUST_ID3" -eq 0 ] && [ "$JUST_M3U" -eq 0 ]; then
    create_rep ./$ARTISTE &&
    create_rep ./${ARTISTE}/${ALBUM}
    if [ -d "$REP_TMP" ]; then
	mv ${REP_TMP}/* ./${ARTISTE}/${ALBUM}/
	if [ "$KEEP_WFILES" -eq 0 ]; then rmdir $REP_TMP; fi
    fi
    cd ./${ARTISTE}/${ALBUM} &&
    transcode || exit -1
else
     if ! [ -d "./${ARTISTE}/${ALBUM}" ]; then
	echo -e "\nErreur de lecture de répertoire: './${ARTISTE}/${ALBUM}' n'existe pas !";
	exit -1;
    fi
    if [ -d "$REP_TMP" ]; then
	mv ${REP_TMP}/* ./${ARTISTE}/${ALBUM}/
	if [ "$KEEP_WFILES" -eq 0 ]; then rmdir $REP_TMP; fi
    fi
    cd ./${ARTISTE}/${ALBUM}
fi
if [ "$WITH_ID3" -eq 1 ]; then
    if [ "$JUST_ID3" -eq 1 ]; then
	if ! [ -f ./audio.cddb ]  && [ "$FROM_FILES" -eq 1 ]; then
	    if [ "$VERBEUX" -eq 1 ]; then
		$RIPPER -L 0 -J -D $DEVICE;
	    else
		$RIPPER -L 0 -J -D $DEVICE > /dev/null 2>&1;
	    fi
	fi
	if [ "$NAME_TRACKS" -eq 1 ]; then WITH_M3U=1; fi
    fi
    if [ "$EJECT" -eq 1 ] && [ "$FROM_FILES" -eq 0 ]; then ${EJECTEUR} ${DEVICE} > /dev/null 2>&1; fi
    add_id3_tag
else
    if [ "$EJECT" -eq 1 ] && [ "$FROM_FILES" -eq 0 ] && [ "$JUST_M3U" -eq 0 ]; then ${EJECTEUR} ${DEVICE} > /dev/null 2>&1; fi
fi
if [ "$WITH_M3U" -eq 1 ]; then
    create_m3u;
    if [ "$JUST_M3U" -eq 1 ]; then exit 1; fi
fi
if [ "$KEEP_WFILES" -eq 0 ]; then clean_work_files; fi
#}}}

Pour l’utiliser, copiez le contenu ou téléchargez-le dans un fichier (par expl cd2flac), puis:

chmod +x ./cd2flac

Je vous recommande de créer un répertoire temporaire d’où vous pourrez exécuter le script.
Du coups, j’y ai placé une aide accessible via:

./cd2flac --help

Si vous avez des suggestions, ou modif, n’hésitez pas à proposer.
Je pense rajouter la possibilité de lire les fichiers inf non plus seulement à partir du serveur cddb mais aussi via un fichier texte (ce qui permettra de tagguer les disques n’ayant pas de fiches cddb).

Monday, 25 June 2012

ACTA : « une forme douce de terrorisme » / “A kind of soft terrorism”

With/in the FSFE » Français | 11:38, Monday, 25 June 2012

Nous sommes censés représenter les citoyens, mais comme ils sont occupés à autre chose, nous sommes censés réfléchir à leur place !

We are supposed to represent citizens, however since they are busy with other things, we are supposed to think for them!

— Marielle Gallo, députée du parlement européen favorable à ACTA, à propos du vote des commissions du parlement européen contre le texte.
pro-ACTA MEP, about the vote against the treaty from the European Parliament commissions

(source pcINpact)

Friday, 27 January 2012

Quelques notes sur la seconde licence publique Mozilla (MPL 2.0)

With/in the FSFE » Français | 13:27, Friday, 27 January 2012

(A short post in French on the Mozilla Public License 2.0. If you want to know about it, you can read in English Luis Villa, who led the update process. Richard Fontana wrote an article (RedHat); and the FSF has lauded the compatibility with GNU licenses.)

Cette année, une petite nouvelle est arrivée dans le monde des licences de logiciel libre : la seconde version de la licence publique Mozilla (MPL 2.0). Elle n’est pas totalement nouvelle, car elle garde l’esprit général de la première version puisqu’il s’agit d’une licence de faible copyleft. C’est-à-dire que cette licence permet dans une certaine mesure — assez large — de combiner du code régi par la MPL avec du code sous une autre licence (y compris propriétaire). Pour autant, des modifications apportées aux fichiers du code MPL doivent être régies par les mêmes obligations : mise à disposition du code source, notifications des droits des utilisateurs (droits d’utiliser, de partager, d’étudier le fonctionnement et de publier des modifications — la définition d’un logiciel libre).

Ainsi, la MPL est un bon compromis, entre d’un côté les licences “académiques” (BSD, MIT) et de l’autre, les licences copyleft¹ fortes comme la licence publique générale GNU. Mais comme tout compromis, la MPL souffre des inconvénients incombant à chacun des deux modèles de licence.

Il y a cependant des qualités indéniables à la MPL 2.0, que j’ai voulues résumer ici […]

Lire Les qualités de la MPL 2.0.

Friday, 13 January 2012

Débat « Surfons libre », le samedi 4 février après midi !

Antonin MOULART » culture libre | 17:55, Friday, 13 January 2012

 

Réservez votre 4 février après midi pour une convergence maximale des luttes ! Surfons libre. Nous débattrons notamment des alternatives libres aux services de google& co. Ça causera auto-hébergement à n'en pas douter :-)

-------------

Après-midi de débats surfons libre
Le Samedi 4 février de 15 à 18h
Au Moulin à Café, 9 Pl. de la Garenne
Paris 14ème , M° Pernety

Au programme:

Présentation de l’idée du Collectif Surfons Libres – Surfons libres c’est l’idée de faire dialoguer les organisations et citoyens qui défendent un Internet libre ! – 15 minutes

Les services en ligne à la solde des publicitaires ? Surfez couverts ! (Avec l’association Résistance à l’Agression Publicitaire)
15 minutes + 25 minutes débat

Plate-forme de mobilisation citoyenne en ligne pour la protection des données personnelles (Avec Internet Sans Frontières)
15 minutes + 25 minutes débat

Débat citoyen et libre sur les alternatives aux services non respectueux des données personnelles et logiciels propriétaires
40 minutes

La constitution d’un collectif SURFONS LIBRES, collectif d’individus et d’organisations pour la défense d’un Internet libre
30 minutes

Un Internet libre et accessible pour toutes et tous c’est possible !

Tuesday, 03 January 2012

TrueBlock Plus: Qui peut le plus, peut le moins !

Antonin MOULART » culture libre | 19:16, Tuesday, 03 January 2012

Et voilà, il n’aura pas fallu bien longtemps pour voir une fourchette de l’excellent Ad Block Plus se mettre en place après l’horrible mise à jour… True Block Plus est dans la place de Mozilla et les commentaires sur l’initiative de Éric Bishop, le mainteneur, sont plutôt positifs. Son initiateur affirme ne pas vouloir, pour le moment, un développement parallèle mais seulement conserver les acquis sans cette case à cocher étrangement inutile qui laisse passer certaines pubs. Ce dernier appelle aux dons, mais pas pour lui, pour le projet Ad Block Plus. Je ne peux m’empêcher d’y voir une certaine ironie, voire un message caché, qui pourrait être « Si tu veux du fric, on va t’en donner, mais s’il-te-plaît ne prostitue pas cette belle extension aux pubards ! ».

La question est de savoir désormais, combien vont préférer une extension qui bloque la pub à une extension qui bloque la pub si l’utilisateur le veux vraiment. Je me demande si le mainteneur de Ad Block Plus ne s’est pas inspiré de Zuckerberg avec ses tonnes de fonctionnalités intrusives activées par défaut que l’utilisateur peut désactiver s’il le veut vraiment. Ces gens-là, c’est une informatique basée sur l’exploitation de l’inculture numérique qu’ils promeuvent. Et c’est mal. Ce n’est pas parce qu’on a des connaissances qu’il faut chercher à piéger les autres, bien au contraire. Il ne faut rien laisser passer, même si Ad Block Plus n’en est évidemment pas au niveau de facebook qui bat tous les records…

De toute façon, le modèle publicitaire sur internet n’a aucun avenir. Le récent rachat de Rue 89 par le Nouvel obs qui n’a toujours pas trouvé l’équilibre le démontre. À l’inverse, Wikipedia est parvenu à récolter 20 millions d’euros en 50 jours uniquement car son fondateur ne veut pas de publicité et qu’il considère cet espace comme un jardin public. Pour ma part, j’aimerais que tout Internet soit un magnifique jardin public et que la publicité ne soit pas là pour polluer l’information que je partage. True Block plus m’en donne la possibilité mais je trouve injuste que ceux qui n’aient pas les même connaissances que moi ne partagent pas ce bonheur.

Il y a le choix entre deux options, soit un modèle payant semi-public à la Mediapart ou totalement privé à la @si, soit le mécénat qui consisterait à faire vivre des sites par le don. À titre personnel, j’ai un faible pour le principe du mécénat global proposé par Stallman et la Free Software Fondation.

Bon, et bien entendu, le modèle publicitaire est loin d’être entaillé par True Block Plus, il en faudra bien plus. Je pense que la meilleure parade est de démontrer qu’il est possible de faire autrement, car au fond, il n’y a bien que les publicitaires qui aiment la publicité.

Téléchargez True Block Plus et encouragez son initiateur pour que l’extension sorte des abîmes du site de Mozilla !

Sunday, 01 January 2012

Je quitte facebook

Antonin MOULART » culture libre | 21:02, Sunday, 01 January 2012

Après quatre ans d’activité sur Facebook, j’ai décidé de quitter ce service dans moins d’une semaine, de récupérer toutes mes données personnelles et les faire supprimer du serveur de l’entreprise. C’est avec un peu de tristesse et dans un certain esprit de sacrifice que j’ai pris cette décision il y a quelques mois de cela. Depuis quelques années – ceux et celles qui me suivent sur le réseau social ont pu le constater – le nombre d’informations mettant en garde les utilisateurs contre Facebook, à tous les niveaux, va croissant. Le plus inquiétant et le plus palpable est sans doute le problème de la maîtrise des données personnelles de l’utilisateur. Malgré des initiatives dont le but premier est de rassurer les utilisateurs et les marchés financiers en vue d’une entrée en bourse imminente, Facebook reste un espace d’insécurité numérique où l’internaute est à la merci d’une seule logique : récolter toujours plus vos données personnelles et augmenter toujours d'avantage leur caractère publique.

Les usages des données personnelles sont multiples et inquiétants. En premier lieu, la publicité ciblée, que l’on ne présente plus et qui représente plus de 80 % des revenus de Facebook. L’entreprise a fait le choix, ces derniers temps, de lancer une initiative « pédagogique » envers ses utilisateurs dans le but de leur faire avaler toujours plus de publicités intrusives et superflues. Bientôt, l’entreprise en mettra dans votre fil de statuts. En second lieu, Facebook collabore avec des autorités d’États pour la lutte « anti-terroriste », notamment avec les États-Unis. Les relations de Mark avec le président Barack Obama sont au beau fixe. Le problème se trouve dans la définition de ce terme de terroriste et qui cela englobe. Quand les services des états recherchent « des terroristes », ils ont très probablement accès à l’ensemble des données présentes sur Facebook. Les limitations ne sont pas réellement définies. En troisième lieu, bien que Facebook assure ne pas vendre les bases de données à des entreprises commerciales, et qui, pour le prouver, se contente d’asséner que « ce ne serait pas dans son intérêt », nous pouvons légitimement nous poser la question. Puisque Facebook est une entreprise commerciale, le but recherché est le profit. N’y a-t-il pas de profits à tirer dans la vente de bases de données personnelles sous le manteau ?

Les utilisateurs de Facebook sont la seule raison d’être de Facebook. Sans utilisateurs, pas de données personnelles, sans données personnelles, pas de profit. Pourtant, nous ne participons pas aux prises de décisions stratégiques de l’entreprise concernant son développement et nous ne pouvons pas vérifier les fonctionnalités de collecte de données ou de censure dans le code source puisque celui-ci relève strictement du secret industriel.

La récolte frauduleuse des données personnelles et le fichage systématique de plus en plus millimétré sont les premières raisons de mon départ. Comme l’a démontré Internet Sans Frontières dans sa plainte auprès de la CNIL, Facebook utilise des méthodes dangereuses qui mettent en péril les libertés des citoyens. Collecte des données en dehors de Facebook par l’intermédiaire du bouton like, création de profils fantômes à travers la synchronisation des répertoires de courriels et de téléphones, identification systématique et automatique des visages sur les photos avec la technique biométrique…

La publicité croissante et insidieuse, utilisant des méthodes de chantage affectif pour faire cliquer mes ami.e.s, me gêne profondément. Lorsque je livre mes infos persos à la publicité Facebook, je livre mes ami.e.s en pâture aux publicitaires qui ne manqueront pas de faire remarquer que j’aime tel ou tel produit. Si actuellement cela s’arrête à informer mes ami.e.s que moi aussi je suis fan du Coca-Cola (ce qui n’est pas mon cas :-)), il est à craindre des usages encore plus intrusifs qui exploiteraient les photos sur lesquelles vous vous trouvez en train de consommer une marque en particulier. Ils ont la technique, reste à voir pour Facebook les obstacles juridiques et moraux des utilisateurs.

La politique de censure exercée par Facebook est de plus en plus inquiétante. Si l’on sait depuis 2009 que Facebook est le toutou des industries du divertissements, par la censure de The Pirate Bay notamment (essayez de poster un lien The Pirate Bay pour voir ;-)), la dernière censure notable de septembre 2011 atteint des sommets. Les premiers messages sur le réseau appelant à Occupy Wallstreet ont été honteusement censurés, sans justification et par des techniques sournoises. Certains événements ont été supprimés, d’autres statuts ont été rendus visibles uniquement par ceux et celle qui les postaient. Facebook – qui doit rentrer en bourse très prochainement, rappelons-le – a un intérêt direct à censurer un tel mouvement pour éviter toute contestation de cette institution qui sert son expansion. D’autres cas de censures, nombreux, ont été recensés, nous ne les listerons pas ici.

Voici les principales raisons de mon départ sommairement résumées. Certains et certaines se demanderont probablement « Mais pourquoi avoir attendu si longtemps ? ». En réalité, je pense que nous avons vécu ces dernières années une période de révolution informationaliste incroyable et qu’aujourd’hui nous nous réveillons un peu avec la gueule de bois. Comme si nous nous retrouvions en terrain conquis. Le premier volet a été l’émerveillement de ces nouveaux moyens de partage et de débat démocratique qui ont transformé profondément et durablement l’organisation sociale du Monde. L’accès de tout-e citoyen-ne à une masse d’informations toujours plus importante et précieuse participe à rendre la société plus transparente et lui redonner un pouvoir politique. Je ne m’étalerai pas sur cette période car aujourd’hui il faut nous atteler à éviter le second volet : une contre-révolution dangereuse en progression qui consiste en la surveillance constante et systématique du citoyen. Si ce processus est déjà bien avancé, il n’est pas encore complet et total. Nous assistons, trop passivement, à la reprise en mains des États et des grandes entreprises qui ont des intérêts divergents à ceux des citoyennes et des citoyens libres. Si dans ce billet je parle en particulier de Facebook, ce n’est pas le seul enjeu auquel il faut s’intéresser. Mais il faut occuper le terrain, tout le terrain.

La deuxième raison pour laquelle j’ai attendu aussi longtemps avant de me jeter à l’eau est affective. En effet, grâce au réseau social Facebook, je garde contact avec de nombreux/nombreuses ami.e.s à travers la France et le Monde que je ne vois pas tous les jours. Si je quitte Facebook, je perdrais avec certains, très probablement, le contact faible qu’il restait. De plus, j’adore papoter politique et de choses simples de la vie, voir les photos de mariages, de soirées, des nouveaux nés, etc. Également, je vais perdre un relais efficace pour les publications de mon blog. Ou bien encore professionnellement, par l’intermédiaire de Facebook j’ai pu accéder à de nombreuses opportunités. La vie locale de ma cité universitaire me sera moins accessible car les soirées et autres événements sont annoncés d’abord sur Facebook. Ne pas être sur Facebook donc, à l’heure actuelle, je le vois comme un véritable handicap social.

Ceci étant, comme je l’ai écrit précédemment, la raison d’être de Facebook, ce sont ses utilisateurs. Sans utilisateurs, Facebook ne représente aucun intérêt. C’est pourquoi, plus que dans n’importe quel type de situation, l’adéquation entre la pensée et l’acte doit primer. L’architecture du réseau et l’organisation qui maintient et développe le service sont les racines du problèmes. La nature centralisée du service est un problème en soit pour la maîtrise des données personnelles. Le simple fait de permettre à une organisation, quelle que soit sa logique, d’avoir autant de données sur autant de personnes devrait nous pousser à ne pas nous y inscrire. La moindre dérive dans la gestion du droit d’accès à ces données peut avoir des conséquences catastrophiques pour les libertés. De nombreux internautes ont déjà fait ce constat et ont pris le parti de lancer des initiatives d’alternatives. De nombreux projets de logiciels libres de réseaux sociaux sont en cours de développement. Diaspora, Status.net, GNU social, Crabgrass… et de nombreux autres. J’avais notamment participé à Movim pendant un moment. Bref, ce n’est pas ce qui manque.

Dans les jours, semaines et mois qui viennent, en tant que simple citoyen, je vais entreprendre des démarches afin d’obtenir de Facebook deux choses :

  • La récupération de la totalité des données personnelles que j’ai ajoutées ou qui ont été générées.

  • La suppression totale de mes données personnelles des serveurs de Facebook dans un délai convenable et légal.

Je vous tiendrai au courant régulièrement des avancées.

Pour finir, je vous recommande la lecture d’un billet que j’ai écrit en mai 2010 qui reste aujourd’hui plus que jamais d’actualité.

« Des syndicats 2.0 pour défendre les intérêts des contributeurs »

Comme quoi, ma critique de Facebook ne date pas d’il y a deux jours ;-)

Bonne année 2012 !

Pour rester en contact avec moi :

twitter : @antoninmoulart Identi.ca : @antoninmoulart

Diaspora : https://joindiaspora.com/u/antoninus (j’envoie des invitations sur demande)

Mon courriel : antonin@moulart.org

mon jabber : antonin@jappix.com

Mon téléphone : sur demande ;-)

Tuesday, 13 December 2011

Faut-il initier un fork de Ad Block Plus ?

Antonin MOULART » culture libre | 17:59, Tuesday, 13 December 2011

Ad Block Plus annonce qu'il ne bloquera plus toutes les publicités. L'extension phare de firefox vient de remettre en question l'utilité de sa vocation. Il fallait le faire et ils l'ont fait... Serait-ce dus à irrésistible pression de google, principale financeur de mozilla firefox ? La communauté serait-elle arrivé à la conclusion que la publicité présenterait un intéret pour l'internaute ? Queneni !

L'argument avancé est l'argument du pire: "Un peu de publicité c'est bien pour faire vivre les petits sites !". Tout le fatalisme d'une pensée dominante résumé en une seule petite phrase TINA "There Is No Alternative".

Et pourtant ! Parmi les 10 sites les plus consultés au monde, une communauté d'irréductible résiste encore et toujours à l'envahisseur. Il s'agit de wikipedia, qui, sans publicité, fait figure d'exemple en embauchant pas moins de 90 salariés et entretenant une infra-structure serveur des plus impressionnantes.

De plus en plus nombreux sont les sites d'informations en ligne à trouver des modèles économiques alternatifs durable. On peut notamment penser à Mediapart et Arrêts sur image qui depuis quelques années vivent grâce aux abonnements de ses membres. D'autres sites comme reflets.info font le paris ambitieux des dons en ligne. Si les rédacteurs sont loin de vivre de ces recettes, il faut souligner cette volonté d'encourager les internautes à changer leurs comportements de consommation sur internet. Du propre avoeux des auteurs, le site tourne actuellement à 20% de ses capacités, ce qui pourrait donner envie aux internautes de donner s'ils souhaitent d'avantage de productions. Autre exemple, le blog de Paul Jorion tourne très bien sur ce modèle avec des recettes d'un peu plus de 3000 € mensuel, le blog fait figure d'exemple sur l'internet français.

Le modèle économique d'un site d'information n'est pas simplement une question de respect des données personnelles des utilisateurs ou de pollution visuelle sur le site en question. C'est d'abord et surtout la question de l'indépendance qui est soulevé. Souvenez vous il y a quelques semaines de l'affaire de la tribune qui avait publié un article desservant les intérêts de l'industrie du nucléaire... Du jour au lendemain Henry Proglio PDG d'EDF avait supprimé une campagne publicitaire dans la revue qui devait la financer à hauteur de 60 000€. De quoi mettre un journal en faillite... Et puis, on peut s'interroger de l’intérêt d'une firme, ancien monopole d'état, à faire de la publicité... Sur qui cherchent-ils à prendre avantage ? Il n'y a pas de concurrent... Tout le monde sait que les EPR sont sur à 200%, non ? A moins que la population ait besoin d’être rassuré... N'est-il pas inutile de se payer des pages de propagande dans des journaux respectable qui bradent leur crédibilité pour faire vivre leur rédaction ? A moins que ce soit pour contrôler le contenu... ???

Ad Block Plus nous rassure tout de même. Pour ceux qui ne veulent même pas (des furieux probablement) de "pub acceptable", il y a toujours moyen de cocher une case pour s'en débarasser. Ad Block Plus nous colle une option de retrait de la publicité en second degré ! Cela signifie que pour ne pas voir de publicité dans votre navigation web, il faut d'abord installer firefox, ensuite installer Ad Block Plus et après cocher la petite case dans la configuration de l'extension pour dire "Non, je ne veux VRAIMENT pas de publicité !". La prochaine sera peut-être l'ajout d'une seconde case "Non, j'insiste vraiment, vous me faites chier avec vos réclames !!!" ? On peut continuer comme ça à l'infinie...

La publicité sur internet est par définition inacceptable car elle est inintéressante et sans intérêt pour l'internaute. Les flots d'informations qui circulent sur le réseau sont déjà assez laborieux à trier et notre temps de cerveau assez précieux pour qu'en plus nous devions filtrer mentalement le bon grain de l'ivraie. Sans parler des problèmes de la récolte des données personnelles qu'Ad Block plus ne traite pas...

Alors la question est la suivante: Faut-il créer un fork d'ad block plus ?

Il s'agirait d'une extension antipub avec une option de retrait par défaut de la publicité (ben oui, c'est un peu le but d'une telle extension), tout simplement. Elle s'adresserait à tous ceux qui n'ont pas le temps de s'amuser à cocher des cases inutile sur un logiciel précieux.

A cela s'ajouterait une partie de type "ghostery" qui bloquerait l'ensemble des scripts qui traques nos données personnelles sans nous demander la permission préalable et explicite.

La question de bloquer les anti-block devrait également être une piste que ce fameux logiciel explorerait. Également la question de la publicité sur les vidéos ?

Bref, on pourrait appeler cette extension "ad block vraiment" ou "ad block plus plus". Ce serait une super extension appréciable et une belle réponse à ce choix politique de la communauté d'ad block plus des plus absurdes.

Thursday, 21 July 2011

La FSFE aux RMLL

With/in the FSFE » Français | 15:13, Thursday, 21 July 2011

La FSFE était présente aux Rencontres mondiales du logiciel libre, qui se tenaient ce mois de juillet à Strasbourg. Un grand merci aux organisateurs, notamment à Jean-Michel Ramseyer et Nicolas Jean pour le thème Internet du programme, qui se focalisait notamment sur les systèmes distribués libres.

C’est d’ailleurs l’un des nombreux sujets abordés par Karsten Gerloff, interviewé lors des RMLLs. Vous pouvez télécharger l’entretien, doublé en français sur le site des RMLL (streaming, m3u ou téléchargement direct, ogg/vorbis).

Wednesday, 30 March 2011

Célébration du Document Freedom Day à Berlin

Nicolas Jean's FSFE blog » Français | 15:50, Wednesday, 30 March 2011

Aujourd’hui, plusieurs fellows de la FSFE, Matthias Kirschner, Stephan Uhlmann (FFII) et moi-même avons revêtu nos plus beaux habits de cérémonie, et sommes allés à la rencontre de ARD, un des plus grands groupes de diffusion de médias allemands (télévision, radio, site internet).

Nous avons organisé ce rendez-vous, en partenariat avec la FFII, pour les féliciter des moyens de diffusion mis en oeuvre sur leur site, où les utilisateurs peuvent visionner les vidéos au format libre « Ogg Theora ». Ceci permet à tous l’accès aux contenus vidéo de l’entreprise publique, sans imposer un format ou un logiciel en particulier. Sur d’autres sites proposant des vidéos, ceux-ci se révèlent en effet souvent être propriétaires et n’offrent donc pas la liberté de choix aux internautes.

Nous avons donc remis le « prix pour l’utilisation et la promotion des standards ouverts » aux responsables du site, qui d’après leur propos se sont battus en interne contre vents, marées et budgets pour finalement proposer des formats libres. Par les temps qui courent, ou la plupart des sites de contenus se tournent vers l’alternative la plus connue par simplicité, la volonté de promouvoir des formats libres relève d’un certain courage que nos deux associations se devaient de couronner.

Après une part de tarte “rOgg On!” et un petit café, la discussion fut lancée et a été très instructive, dévoilant au fur et à mesure les coulisses techniques de l’architecture informatique de cet immense centre multimédia. Les différents formats dans lesquels les vidéos sont sauvegardés, combien de temps elles le sont et pourquoi, et nombreuses autres anecdotes nous ont tenus en haleine pendant une petite heure et demi.

Les photos de l’événement sont disponibles sur le wiki de la FSFE, enjoy! Que cela vous donne envie de participer l’année prochaine. ;)

Et bien sûr, plus d’info sur le DFD là : http://documentfreedom.org

flattr this!

Wednesday, 16 February 2011

Microsoft interdit les logiciels libres sur son Windows Marketplace

With/in the FSFE » Français | 11:57, Wednesday, 16 February 2011

Jan Wildeboer vient de découvrir dans le contrat gouvernant le Windows Marketplace, l’ “App Store” du Windows Phone et de la XBox, quelques stipulations intéressantes…

Article 5 (traduit par mes soins):

e. L’Application ne doit inclure ni logiciel, ni documentation, ni aucun autre matériel qui, totalement ou en partie, est gouverné par ou sujet à une Licence Exclue, ou qui autrement causerait à l’Application d’être assujettie aux termes d’une Licence Exclue.

Comment le contrat définit-il une Licence Exclue ?

“Licence Exclue” comprend toute licence requérant, comme condition d’utilisation, de modification et/ou de distribution du logiciel assujetti à la licence, que le logiciel ou tout autre logiciel combiné et/ou distribué avec lui soit (i) dévoilé ou distribué sous la forme de code source; (ii) licencié dans le but de produire des œuvres dérivées; ou (iii) redistribuable sans frais*. Les Licences Exclues incluent, mais ne sons pas limitées aux Licences GPLv3. Dans le cadre de cette définition, “Licences GPLv3″ désignent la Licence Générale Publique GNU version 3, la Licence Affero Générale Publique GNU version 3, la Licence Moindre Générale Publique GNU version 3, ainsi que tout équivalent à celles-ci.

Donc, ce n’est pas seulement le copyleft qui semble banni (comme on pourrait en faire l’interprétation concernant les conditions de l’App Store d’Apple) mais bien toute licence équivalant aux licences GPL désignées et surtout, tout logiciel qu’on peut partager librement…

Correction: le contrat exclut toute licence qui requiert la “redistribuabilité” sans frais du logiciel. Peut-on dire qu’une licence BSD/MIT requiert cela? Un logiciel n’est libre que si on a la liberté de redistribuer des copies. On ne peut pas dire que la licence du logiciel libre requiert la redistribution sans frais, mais elle requiert cette possibilité (donc on parle bien de “redistribuabilité”, en anglais “redistributable”).


* “redistribuable sans frais” : ça concerne bien tous les logiciels libres, GPL, BSD, MIT…

Friday, 08 October 2010

Euro 2012 des logiciels libres : nouvelle vague de résultats

Free speech is better than free beer » Français | 22:15, Friday, 08 October 2010

Près d’un mois après les matchs qualificatifs des 3-4 Septembre, 42 pays ont de nouveau joués pour la qualification à l’Euro 2012. De notre côté, la notation des gouvernements suivant leur utilisation et promotion des logiciels libres continue ! Guido a mis les résultats des 21 matchs de ce 8 Octobre en ligne , et comme d’habitude, voilà mon appréciation des grands affrontements de ce 8 Octobre :

  • France – Roumanie : Ces deux pays ne se rencontrent que le 9 Octobre, mais le match promet d’être intéressant : tandis que la France se place parmi les équipes favorites de cette compétition avec un très fort engagement de plusieurs ministères et la migration déjà accomplie de l’Assemblées nationale, de la police et d’autres administrations majeures, la Roumanie se pose en fière opposante avec un premier pas très prometteur fait dans le domaine de l’éducation.

Prochaine grande notation le 12 Octobre, avec 22 matchs à venir ! D’ici là on attend deux match pour demain : Portugal – Danemark et Israel – Croatie…

Comme pour les dernières vagues de qualification, vous pouvez influencer les résultats de votre équipe favorite en ajoutant des informations sur le wiki jusqu’à la veille du match. Si vous n’avez pas encore de droits d’écriture, vous pouvez tout simplement créer un compte invité ou envoyer un message via identi.ca à Guido en mettant le tag “euro4fs”.

Notez également qu’à la suite de la campagne PDF readers, le nombre d’institutions publiques d’un pays qui auront retiré les publicités poru des lecteurs non libres de leurs sites internet sera également un facteur de victoire pour l’Euro 2012. Donc : plus vous reportez d’institutions, plus vous augmentez les chancesde votre gouvernement de gagner des points dans l’Euro 2012 (ceci indépendamment du fait que vous contribuez alors aussi à  diminuer la distorsion de concurrence faite par ce biais par les gouvernements)

Pour voir les scores des matchs qui ont eu lieu jusque à présent, vous pouvez consulter la page de résultats sur le wiki.

Monday, 13 September 2010

Sus aux sites gouvernementaux !!!

Free speech is better than free beer » Français | 10:00, Monday, 13 September 2010

En ce mois de rentrée, la FSFE vous propose une activité aussi atypique qu’utile :

pdfreaders-logo

La campagne PDFreaders reprend du service avec dans un premier temps une traque acharnée des publicités et recommandations d’utilisation de lecteur PDF non libres (Adobe reader, Foxit…) sur les pages gouverementales.

Le principe est simple : en principe, le gouvernement n’a pas à proposer exclusivement un unique programme pour lire les PDF quand des alternatives existent et que recommander ce même programme revient à le privilégier par rapport à ses concurrents sans justification aucune d’une telle préférence.Cela reviendrait à avoir un panneau devant la barre de péage d’une autoroute déclarant :

Que penseriez vous d’un panneau au bord de l’autoroute proclamant “vous avez besoin d’une Mercedes pour rouler sur cette aoutoroute. Contactez la concession Mercedes la plus proche pour un essai gratuit — Votre Gouvernement”.

De deux choses l’une :

- soit le gouvernement n’est pas conscient que ces recommandations sont un problèmes car il ne connait pas les alternatives, au quel cas la campagne ne peut que leur ouvrir les yeux et les amener à corriger cette erreur.

- soit le gouvernment fait délibérément de la publicité pour ces logiciels propriétaires, au quel cas il nous revient de leur expliquer pourquoi ils devraient préférer les logiciels libres et, tenter de les faire changer d’opinion.

Jusqu’au 17 Octobre, aidez nous à répertorier les pages gouvernementales concernées grâce à notre formulaire sur la page de la campagne. Vous pouvez aussi signer la pétition qui sera ensuite envoyée aux institutions répertoriées assortie d’une lettre explicative.

Nous comptons sur vous pour nous aider à établir une liste la plus exhaustive possible ! Les chercheurs les plus actifs se verront remettre un paquet surprise FSFE ainsi qu’une entrée gratuite à FSCONS.

Soyez les plus rapides à chasser sur les pages des sites de votre gouvernement !

Tuesday, 07 September 2010

Euro 2012 : les qualifications continuent !

Free speech is better than free beer » Français | 14:16, Tuesday, 07 September 2010

Les résultats du troisième jour des qualifications de l’Euro 2012 est arrivé ! Guido a publié des résultats très précis pour les 27 matchs du jour.

  • Alors que certains matchs du 3 Septembre ont montré que certains pays réalisent les mêmes performances au football que dans les logiciels libres (notamment les matchs Russie – Andorre et San Marin – Pays-Bas), la France continue à se démarquer comme une bien faible équipe de foot mais une administration très favorable aux logiciels libres. C’est cette fois au tour de la Bosnie-Herzégovine de s’incliner 3-1 face à l’équipe francaise.

Une nouvelle vague de qualification aura lieu le 8 Octobre. Comme pour les matches de Septembre, vous pouvez influencer les résultats de votre équipe favorite en ajoutant des informations sur le wiki jusau’à la veille du match. Si vous n’avez pas encore de droits d’écriture, vous pouvez tout simplement créer un compte invité ou envoyer un message via identi.ca à Guido en mettant le tag “euro4fs”.