April 16, 2014

hackergotchi for

Tanguy Ortolo

Signing party au salon Solutions Linux le 20 mai 2014

En ces temps troublés, il est important de sécuriser nos échanges d'information — en chiffrant — ainsi que la distribution de logiciels — en signant les publications.

À cette fin, le salon Solutions Linux, Libres et Open Source sera l'occasion d'une signing party PGP, le 20 mai 2014 à 18h près du stand Debian France. Cette signing party est ouverte à tous les visiteurs et exposants du salon.

Pour faciliter les échanges d'empreintes de clefs en cas d'affluence, il est possible que nous utilisions une liste officielle de participants selon le protocole de Zimmermann-Sassaman. Pour préparer cela, il est demandé aux participants de me contacter en m'envoyant leur clef publique. Selon la méthode de signing party retenue, je publierai ultérieurement des instructions plus précises.

16 April, 2014 06:45PM by Tanguy

April 15, 2014

Florent Gallaire

Lucas 2.0

Lucas Nussbaum vient d’être réélu Debian Project Leader.

Comme on peut le constater sur ce graphe, il a obtenu 47 voix de plus que Neil McGovern :

Une analyse plus précise des votes permet d’en calculer une représentation plus “classique” du point de vue des habitudes électorales, et donc plus compréhensible pour la majorité des gens :

Lucas Nussbaum : 56,5%
Neil McGovern : 43,5%

C’est bien une large victoire de Lucas, mais aussi une défaite très honorable pour Neil, qui se positionne donc comme un prétendant sérieux à la victoire l’année prochaine.

flattr this!

15 April, 2014 04:36PM by fgallaire

April 11, 2014

hackergotchi for Roland Mas

Roland Mas

Une page de publicité

Allez, c'est vendredi, c'est permis, je vais m'autoriser deux petites annonces.

Premièrement : rappelez-vous Minami Taiko, ce groupe de tambours japonais du sud de la France. Bon, nous on est des amateurs, mais il se trouve qu'on fait venir, pour le festival Escale à Sète, un vrai groupe de taikos du Japon et tout. Ils s'appellent SEN, et ils vont faire quelques animations musicales dans Sète du 18 au 21 avril. Et avant de repartir dans leur lointain Cipango, ils feront un vrai concert à Montpellier, le mardi 22 avril au soir, sur le campus de l'INRA/Supagro. Et devinez qui fait la première partie ? Minami Taiko, voilà qui ! Donc si vous voulez découvrir le taiko ou voir quelques amateurs suivis d'un vrai groupe, faites donc un tour sur le site de Minami Taiko. À noter qu'il y a aussi un atelier d'initiation le même jour si ça vous intéresse.

Deuxièmement : je suis fier de vous présenter un petit site web que c'est moi qui l'ai fait avec mes petits doigts délicats. Ça s'appelle Chacun sa part, et ça sert à faire des comptes entre amis, genre quand on part en vacances ensemble, ou qu'on fait régulièrement des dépenses partagées dans un groupe de gens. Pour éviter des comptes d'apothicaire à chaque restau, chaque tournée au bar, chaque passage en caisse, on saisit la dépense sur le site, on dit qui a payé et qui a participé, et le site calcule automatiquement les soldes de chacun et propose des suggestions de remboursements pour rééquilibrer les comptes. Y'a un système d'invitations pour que chacun puisse consulter l'état du groupe et saisir des dépenses, des QR-codes pour faciliter la vie aux utilisateurs de smartphone, et même si ça n'a pas encore été testé à grande échelle ça a été validé par une poignée de testeurs dans différentes configurations. Allez-y, c'est cadeau. Chacun sa part. Point com.

11 April, 2014 08:06AM

37

C'est l'heure d'un marronnier de ce blog : la petite chronique numérologique du 11 avril. Celle-ci sera consacrée au nombre 37.

Nombre premier, premier irrégulier, premier cubain, cousin avec 41, hexagonal centré et étoilé, c'est aussi le numéro atomique du rubidium et ça nous fait une belle jambe.

Et c'est un nombre qui colle particulièrement bien à la journée d'aujourd'hui (qui, si jamais les générations futures s'y intéressent, s'annonce pour être belle et douce, avec peut-être un petit voile nuageux).

11 April, 2014 08:06AM

April 04, 2014

Florent Gallaire

Quel DPL pour 2014 ?

Le temps passe vite, et cela fait déjà presque un an que Lucas Nussbaum a été élu Debian Project Leader (DPL). Chaque développeur Debian pouvait donc se porter candidat entre le 3 et le 9 mars à la suite du traditionnel appel à candidatures.

Dès le 13 février, anticipant quelque peu sur le calendrier, Lucas avait exprimé le souhait de se représenter :

As it has been done by other DPLs in the past, I think that it makes sense for the DPL to announce his/her plans way before the next DPL election.

So, let’s do that now: I will run for reelection.

Après ses précédentes tentatives infructueuses de 2004, 2012 et 2013, Gergely Nagy s’était représenté, mais il a finalement dû se résoudre à retirer sa candidature :

Due to unexpected events, my plans and life got turned upside down (for the better) in the past few days, and because of that, I have to scale down a number of things. Unfortunately, running for DPL is one such thing.[...] Therefore, after a lot of thought, I’m withdrawing from the Debian Project Leader elections of 2014.

Le seul concurrent de Lucas est donc finalement Neil McGovern. Le plus important est bien sûr de lire les programmes de chacun des candidats :

Les presque mille développeurs Debian sont libres de faire leur choix depuis le 31 mars et jusqu’au 13 avril lors d’un vote utilisant la méthode Condorcet.

Vous pouvez retrouver tous les débats de la campagne sur la mailing list debian-vote.

flattr this!

04 April, 2014 12:21AM by fgallaire

March 28, 2014

hackergotchi for

Tanguy Ortolo

Payez en liquide (et autres mesures de protection de la vie privée)

TL;DR¹ : les banques cherchent à exploiter les données de paiement par carte bancaire, il est donc temps de revenir au bon vieux liquide, intraçable et anonyme.

Développement d'une possibilité de surveillance généralisée

Notre vie privée s'érode petit à petit, tandis que s'instaure une possibilité de surveillance généralisée. C'est particulièrement visible avec le développement des systèmes de traitement automatique ces dernières décennies, mais ce mouvement est en réalité plus ancien :

Développement d'une possibilité de surveillance généralisée

Notre vie privée s'érode petit à petit, tandis que s'instaure une possibilité de surveillance généralisée. C'est particulièrement visible avec le développement des systèmes de traitement automatique ces dernières décennies, mais ce mouvement est en réalité plus ancien :

  • Dans l'Antiquité, puis au Moyen-Âge, l'État ne connaissait pas d'une façon générale l'identité de ses ressortissants ni de ses habitants, à moins d'effectuer de coûteux recensements.
  • Puis, je ne sais quand, un premier fichage systématique a eu lieu, de sorte que nous sommes connus par l'État dès notre naissance.
  • Un jour, il est devenu indispensable en pratique d'utiliser les services de banques, qui connaissent et disposent des pleins pouvoirs sur l'essentiel de notre patrimoine financier.
  • Depuis l'introduction de la carte bancaire, les banquiers savent pour la plupart de leurs clients où ils se déplacent et où et quand ils effectuent leurs achats.
  • Depuis l'introduction de la vente à distance, notamment par Internet, ces fournisseurs savent exactement ce que chacun de leurs clients leur achètent. Il en est de même pour le commerce local avec les cartes de fidélités, qui ont été créées pour cela.
  • Avec les téléphones portables, les opérateurs connaissent, à la cellule GSM près, les déplacements de tous leurs clients.
  • Avec l'introduction des titres de transport nominatifs tels que les cartes Navigo ou Vélib' à Paris, les régies de transport en commun connaissent avec une précision de l'ordre de la centaine de mètres tous les déplacements d'une grande partie des habitants de ces villes.

En quelques siècles, nous sommes donc passés d'une situation où, sorti du cercle des voisins, des amis et de la famille, chacun était inconnu et ses actions anonymes, à une situation où nous sommes connus et fichés dès notre naissance, et où des entreprises privées connaissent très précisément nos déplacements et nos achats, sans parler de nos communications. Chose plus inquiétante, on s'habitue peu à peu à ce qui paraissait scandaleux il y a quelques dizaines d'années et qui l'est pourtant toujours autant.

Dernières nouvelles : l'exploitation des données d'utilisation des cartes bancaires

Il est souvent objecté que ces entreprises n'exploitent pas ces données. C'est parfois vrai, mais l'expérience montre que lorsqu'il y a une possibilité qu'un abus soit commis, cela arrive tôt ou tard². Face au risque d'exploitation des données d'utilisation des cartes bancaires, on suppose ainsi que ces données n'intéressent pas les banquiers. Sauf que : en fait si.

Limiter l'exploitation de nos données personnelles

Au niveau personnel, il est possible de limiter l'exploitation de données nous concernant, simplement en évitant de les fournir au départ. Comme souvent, il s'agit d'un compromis entre la vie privée parfaite et la fonctionnalité complète. Ainsi, voici une liste de propositions qui permettent de limiter la casse en restant à un niveau de contrainte raisonnable :

  • Payer en liquide : cela implique d'effectuer des retraits de montants plus élevés au distributeur le plus proche de chez soi, d'avoir sur soi un peu plus de liquide et d'en stocker une petite réserve de liquide chez soi. À la rigueur, payer par chèque, les banques enregistrant bien moins d'informations qu'avec les cartes bancaires.
  • Préférer les magasins locaux à la vente à distance. En plus ça coûte moins cher en transport, et par conséquent ça pollue moins.
  • Se déplacer de façon anonyme : si on doit utiliser une carte de transport, prendre la version anonyme, qui existe grâce à la contrainte de la CNIL sur les régies de transport.
  • Éteindre son téléphone mobile pendant les déplacements : il n'est certainement pas pratique de l'éteindre tout le temps, mais puisqu'il est de toute façon interdit de téléphoner en voiture ou à vélo, et que c'est très peu pratique en bus ou en métro, autant ne pas révéler notre position pendant les transports. Même chose pendant les promenades, randonnées ou sorties en général : si on ne s'attend pas à être appelé ou à devoir appeler quelqu'un, autant éteindre le téléphone, en plus ça économise de l'énergie.

Notes

  1. Too long; didn't read, soit trop long, pas lu. C'est un résumé pour décideurs pressés.
  2. Voyez par exemple le cas des verrous numériques sur les livres, qui permettent aux vendeurs de désactiver à distance la lecture d'un livre acheté par un lecteur. Bah, de toute façon ils ne le feront jamais, tu t'inquiètes pour rien. Ah, ben en fait si, Amazon l'a fait. 743.

28 March, 2014 01:36PM by Tanguy

March 19, 2014

hackergotchi for Debian France

Debian France

Gagnez un cahier de l'admin Debian en contribuant à Debian

Gagnez un cahier de l'admin Debian en contribuant à Debian

Vous voulez contribuer au projet Debian mais vous ne savez pas comment ?

Debian France a pensé à vous et monte une opération pour vous encourager à faire vos premiers pas au travers de plusieurs projets, tous encadrés par des développeurs Debian.

Parcourez la liste des projets proposés à la recherche d'un thème qui vous attire et prenez contact par email avec le (ou les) « mentor(s) » indiqué(s) en expliquant que vous êtes intéressé par le projet en question. Debian étant un projet international, merci d'utiliser l'anglais sauf si vous savez que le mentor en question est francophone.

Couverture du Cahier de l'Admin Debian Wheezy Si vous êtes retenu, et que vous menez le projet à son terme dans les deux mois (ce qui ne devrait pas vous prendre plus de 16 à 32 heures en théorie, même si l'on espère tous que vous allez y prendre goût et contribuerez plus...), les auteurs du Cahier de l'Admin Debian Wheezy et Debian France vous offrent un exemplaire dédicacé de ce livre de référence.

Faites circuler la nouvelle, il y a une quinzaine de projets à attribuer!

19 March, 2014 10:38AM

March 18, 2014

hackergotchi for

Vincent Bernat

EDNS client subnet & BIND

Afin de fournir des des réponses tenant compte de la localisation du client, un patch ajoutant le support GeoIP est couramment mis en œuvre pour BIND. Il permet de diriger un client vers le serveur le plus proche :

view "FRANCE" {
     match-clients { geoip_cityDB_country_FR; };
     zone "example.com" in {
         type master;
         file "france.example.com.dns";
     };
};
view "GERMANY" {
     match-clients { geoip_cityDB_country_DE; };
     zone "example.com" in {
         type master;
         file "germany.example.com.dns";
     };
};
/* [...] */
view "DEFAULT" {
    zone "example.com" in {
        type master;
        file "example.com.dns";
    };
};

Toutefois, l’utilisateur final ne parle généralement pas directement aux serveurs autoritaires. Il délègue cette tâche à un serveur récursif tierce. Ce dernier maintient également un cache des réponses afin de pouvoir les servir directement à d’autres clients.

Dans la plupart des cas, il est toujours possible de se baser sur la localisation géographique du serveur récursif car il se situe lui-même dans le réseau du FAI de l’utilisateur, comme le montre le schéma suivant :

Requête pour www.example.com à travers le serveur récursif d'un FAI

  1. Juan habite en Chine et désire connaître l’IP de www.example.com. Elle interroge le résolveur mis à disposition par son FAI.
  2. Le résolveur relaie la requête au serveur autoritaire.
  3. Comme l’adresse IP du résolveur est également localisée en Chine, le serveur autoritaire décide de répondre avec l’adresse IP du serveur web le plus proche, situé au Japon.
  4. Juan bénéficie alors d’une connexion rapide avec le serveur web.

Toutefois, ce n’est plus le cas en utilisant un serveur récursif public tel que ceux fournis par Google ou OpenDNS. L’adresse IP du client et l’adresse IP utilisée par le serveur récursif peuvent ne pas partager la même localisation. Ainsi, dans le schéma suivant, le serveur autoritaire pense avoir affaire avec un client en Europe et redirige Juan sur un serveur Européen :

Requête pour www.example.com à travers un serveur récursif public

De plus, la mise en cache empire la situation.

Afin de résoudre ce problème, une extension EDNS pour exposer le sous-réseau du client a été proposée. Le serveur récursif va utiliser cette extension pour fournir le sous-réseau du client au serveur autoritaire qui va en tenir compte pour donner une réponse optimisée. Le sous-réseau est suffisamment vague pour préserver la vie privée de l’utilisateur mais suffisamment précis pour pouvoir le localiser. Une version modifiée de dig permet de construire de telles requêtes :

$ geoiplookup 138.231.136.0
GeoIP Country Edition: FR, France
$ ./bin/dig/dig @dns-02.dailymotion.com www.dailymotion.com \
>     +client=138.231.136.0/24

; <<>> DiG 9.8.1-P1-geoip-1.3 <<>> @dns-02.dailymotion.com www.dailymotion.com +client=138.231.136.0/24
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23312
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; CLIENT-SUBNET: 138.231.136.0/24/24
;; QUESTION SECTION:
;www.dailymotion.com.           IN      A

;; ANSWER SECTION:
www.dailymotion.com.    600     IN      A       195.8.215.136
www.dailymotion.com.    600     IN      A       195.8.215.137

;; Query time: 20 msec
;; SERVER: 188.65.127.2#53(188.65.127.2)
;; WHEN: Sun Oct 20 15:44:47 2013
;; MSG SIZE  rcvd: 91

$ geoiplookup 195.8.215.136
GeoIP Country Edition: FR, France

Dans l’exemple ci-dessus, un client en France obtient en réponse deux adresses IP situées en France. Par contre, ci-dessous, un client aux États-Unis obtient des IP américaines.

$ geoiplookup 170.149.100.0
GeoIP Country Edition: US, United States
$ ./bin/dig/dig @dns-02.dailymotion.com www.dailymotion.com \
>     +client=170.149.100.0/24

; <<>> DiG 9.8.1-P1-geoip-1.3 <<>> @dns-02.dailymotion.com www.dailymotion.com +client=170.149.100.0/24
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23187
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; CLIENT-SUBNET: 170.149.100.0/24/24
;; QUESTION SECTION:
;www.dailymotion.com.           IN      A

;; ANSWER SECTION:
www.dailymotion.com.    600     IN      A       188.65.120.135
www.dailymotion.com.    600     IN      A       188.65.120.136

;; Query time: 18 msec
;; SERVER: 188.65.127.2#53(188.65.127.2)
;; WHEN: Sun Oct 20 15:47:22 2013
;; MSG SIZE  rcvd: 91

$ geoiplookup 188.65.120.135
GeoIP Country Edition: US, United States

Le serveur récursif indique dans son cache les sous-réseaux contenus dans la réponse du serveur afin de n’utiliser le cache que pour les clients du même sous-réseau. Avec cette nouvelle extension, le serveur autoritaire sait désormais que Juan est située en Chine et répond avec une IP appropriée :

Requête pour www.example.com à travers un serveur récursif public utilisant l'extension

Peu de serveurs autoritaires supportent cette extension (à ma connaissance, uniquement PowerDNS et gdnsd). À Dailymotion, nous avons mis au point un patch pour BIND. Il ne fonctionne que lorsque BIND est utilisé en tant que serveur autoritaire et n’expose aucune directive de configuration. Une fois installé, il convient de se faire connaître auprès de OpenDNS et Google pour recevoir des requêtes utilisant l’extension.

18 March, 2014 08:18AM by Vincent Bernat

February 28, 2014

hackergotchi for Debian France

Debian France

1ère rencontre Debian à Nantes

1ère rencontre Debian à Nantes

Une rencontre des utilisateurs et contributeurs nantais de Debian aura lieu le 12 mars à 19 h.

Elle se déroulera au 1er étage du bar Le Flesselles, situé au 3 allée Flesselles, au centre-ville de Nantes. Il est facilement accessible depuis l’arrêt de tram Commerce (moins de 2 minutes à pied). Ce rendez-vous sera l’occasion de se rencontrer entre nantais (et au delà) autour du système d’exploitation universel qu’est Debian GNU/Linux.

Si vous souhaitez présenter un sujet durant cette soirée, n’hésitez pas à contacter Damien Raude-Morvan <drazzib@debian.org> ou Thomas Vincent <thomas@vinc-net.fr> Nous sommes preneurs d’idées pour cette 1ère session mais également pour de prochaines rencontres !

Inscriptions et programme

28 February, 2014 08:02AM

February 26, 2014

Florent Gallaire

[MàJ] XWiki Rendering et Doxia

Il y a un moins d’un mois, au cours du FOSDEM 2014, j’ai assisté à la présentation de Vincent Massol intitulée XWiki Rendering: A content rendering engine. Comme l’architecture est propre, avec une bonne séparation des syntaxes d’entrée et des formats de sortie, une implémentation de la syntaxe de txt2tags serait bien sûr la bienvenue !

J’ai donc ajouté XWiki Rendering et Doxia (oui j’avais précédemment un peu oublié le monde Java)  dans le tableau comparatif des logiciels de balisage léger de Comparaison des langages de balisage (markup) léger (lightweight) : Txt2tags, Pandoc, Docutils, AsciiDoc, Deplate, Stx2any, AFT, Markdown et Textile.

flattr this!

26 February, 2014 03:43PM by fgallaire

February 24, 2014

hackergotchi for

Vincent Bernat

TCP TIME-WAIT &amp; les serveurs Linux à fort trafic

En bref : n’activez pas net.ipv4.tcp_tw_recycle !

La documentation du noyau Linux n’est pas très prolixe sur les effets de net.ipv4.tcp_tw_recycle :

Active le reyclage rapide des connexions dans l’état TIME-WAIT. La valeur par défaut est 0. Elle ne doit pas être changé sans en aviser vos experts techniques.

Son petit frère, net.ipv4.tcp_tw_reuse, est à peine mieux documenté :

Autoriser la réutilisation des connexions dans l’état TIME-WAIT pour les nouvelles connexions quand cela ne pose pas de problème du point de vue du protocole. La valeur par défaut est 0. Elle ne doit pas être changé sans en aviser vos experts techniques.

Le manque de documentation à ce sujet a conduit à l’apparition de très nombreux guides conseillant d’activer ces deux paramètres afin de se débarasser des entrées dans l’état TIME-WAIT. Toutefois, comme indiqué dans la page de manuel tcp(7), l’option net.ipv4.tcp_tw_recycle peut s’avérer problématique car elle présente des difficultés à gérer correctement des clients derrière une même IP. Ce problème est particulièrement difficile à diagnostiquer quand il survient :

Active le recyclage rapide des connexions dans l’état TIME-WAIT. Activer cette option n’est pas recommandé car elle cause des problèmes avec la translation d’adresses (NAT).

Dans l’espoir de renverser la tendance, je fournis ici une explication plus détaillée sur le fonctionnement de l’état TIME-WAIT dans Linux.

xkcd illustration

À noter que malgré la présence de ipv4 dans le nom des options, celles-ci s’appliquent également à IPv6. Gardez de plus à l’esprit que nous nous intéressons à la pile TCP de Linux qui n’a quasiment aucun lien avec le suivi de connexions de Netfilter1.

À propos de l’état TIME-WAIT

Commençons d’abord par comprendre comment fonctionne l’état TIME-WAIT et les problèmes qu’il peut poser. Regardons le diagramme d’état TCP ci-dessous2 :

Diagramme d'état TCP

Seul l’hôte fermant la connexion en premier se retrouve dans l’état TIME-WAIT. L’autre pair suit un chemin qui conduit généralement à la libération complète et rapide de la connexion.

La commande ss -tan permet d’observer l’état de toutes les connexions sur le système :

$ ss -tan | head -5
LISTEN     0  511             *:80              *:*     
SYN-RECV   0  0     192.0.2.145:80    203.0.113.5:35449
SYN-RECV   0  0     192.0.2.145:80   203.0.113.27:53599
ESTAB      0  0     192.0.2.145:80   203.0.113.27:33605
TIME-WAIT  0  0     192.0.2.145:80   203.0.113.47:50685

Mission

L’état TIME-WAIT a deux buts :

  • Le premier est d’empêcher les segments en retard d’être acceptés dans une connexion utilisant le même quadruplet (adresse source, port source, adresse cible, port cible). La RFC 1337 explique en détail ce qui peut arriver si l’état TIME-WAIT ne joue pas son rôle. Voici un exemple de ce qui peut être évité si l’état TIME-WAIT n’est pas raccourci :

Segments dupliqués acceptés dans une autre connexion

  • Le second but est d’assurer que l’hôte distant a bien fermé la connexion. Lorsque que le dernier ACK est perdu, l’hôte distant reste dans l’état LAST-ACK3. Si l’état TIME-WAIT n’existait pas, une connexion vers cet hôte pourrait être tentée. Le segment SYN peut alors être accueilli avec un RST. La nouvelle connexion se termine alors avec une erreur :

Dernier ACK perdu

La RFC 793 demande à ce que l’état TIME-WAIT dure au moins deux fois le MSL. Sur Linux, cette durée n’est pas configurable. Elle est définie dans include/net/tcp.h et vaut une minute :

#define TCP_TIMEWAIT_LEN (60*HZ) /* how long to wait to destroy TIME-WAIT
                                  * state, about 60 seconds     */

Il y a eu des propositions pour rendre ce paramètre configurable mais celles-ci ont été rejetées en raison de la nécessité de conserver le bon fonctionnement de l’état TIME-WAIT.

Problèmes

Voyons maintenant pourquoi cet état peut devenir ennuyeux sur un serveur gérant de nombreuses connexions. Il y a trois aspects à considérer :

  • l’entrée prise dans la table des connexions et empêchant de nouvelles connexions,
  • la mémoire occupée par la socket dans le noyau,
  • l’usage CPU additionnel.

Le résultat de la commande ss -tan state time-wait | wc -l n’est pas un problème en soi !

Table des connexions

Une connexion dans l’état TIME-WAIT est gardée pendant une minute dans la table des connexions. Cela signifie qu’une connexion avec le même quadruplet (adresse source, port source, adresse destination, port destination) ne peut pas exister.

Pour un serveur web, l’adresse destination et le port destination sont constants. Si ce serveur se situe en plus derrière un répartiteur de charge L7, l’adresse IP source est également constante. Linux alloue par défaut les ports pour les connexions sortantes dans un intervalle d’environ 30 000 ports (cela se règle en modifiant net.ipv4.ip_local_port_range). Chaque minute, au plus 30 000 connexions peuvent donc être établies vers le serveur web, soit environ 500 connexions par seconde.

Si l’état TIME-WAIT se situe côté client, une telle situation se détecte facilement. L’appel à connect() retourne EADDRNOTAVAIL et l’application va journaliser l’erreur. Côté serveur, la situation est plus complexe à décéler. Dans le doute, il convient de savoir mesurer s’il y a saturation des quadruplets disponibles :

$ ss -tan 'sport = :80' | awk '{print $(NF)" "$(NF-1)}' | \
>     sed 's/:[^ ]*//g' | sort | uniq -c
    696 10.24.2.30 10.33.1.64
   1881 10.24.2.30 10.33.1.65
   5314 10.24.2.30 10.33.1.66
   5293 10.24.2.30 10.33.1.67
   3387 10.24.2.30 10.33.1.68
   2663 10.24.2.30 10.33.1.69
   1129 10.24.2.30 10.33.1.70
  10536 10.24.2.30 10.33.1.73

La solution à ces problèmes est d’utiliser plus de quadruplets4. Il y a plusieurs solutions (par ordre de difficulté) :

  • utiliser plus de ports clients en modifiant net.ipv4.ip_local_port_range,
  • utiliser plus de ports serveurs en configurant le serveur web pour écouter sur des ports supplémentaires (81, 82, 83, …),
  • utiliser plus d’IP clients en configurant des IP supplémentaires sur le répartiteur de charge et en les utilisant l’une après l’autre,
  • utiliser plus d’IP serveurs en configurant des IP supplémentaires sur le serveur web5.

Une dernière solution est de modifier net.ipv4.tcp_tw_reuse et net.ipv4.tcp_tw_recycle. Patientez encore un peu, nous y arriverons plus tard.

Mémoire

Avec beaucoup de connexions à gérer, garder des entrées inactives pendant une minute occupe de la mémoire. Par exemple, si un serveur gère 10 000 connexions par seconde, il peut y avoir en permanence 600 000 entrées TIME-WAIT. Quelle quantité de mémoire cela représente-t’il ? Pas tant que ça.

Tout d’abord, côté applicatif, une connexion en TIME-WAIT n’existe plus. Elle a été fermée. Dans le noyau, une connexion dans l’état TIME-WAIT est matérialisée à trois endroits pour trois usages différents :

  1. La table de hachage des connexions, appelée la « table des connexions TCP établies » (bien qu’elle contienne des connexions dans un autre état), permet de localiser une connexion existante lors, par exemple, de la réception d’un nouveau segment.

    Chaque entrée de cette table pointe sur deux listes : une liste des connexions dans l’état TIME-WAIT et une liste des connexions dans un autre état. La taille de cette table dépend de la quantité de mémoire sur le système et est indiquée lors du démarrage :

    $ dmesg | grep "TCP established hash table"
    [    0.169348] TCP established hash table entries: 65536 (order: 8, 1048576 bytes)
    

    Il est possible de spécifier soi-même la taille avec le paramètre thash_entries.

    Chaque élément de la liste des connexions dans l’état TIME-WAIT est de type struct tcp_timewait_sock, tandis que les élements de l’autre liste sont de type struct tcp_sock6 :

    struct tcp_timewait_sock {
        struct inet_timewait_sock tw_sk;
        u32    tw_rcv_nxt;
        u32    tw_snd_nxt;
        u32    tw_rcv_wnd;
        u32    tw_ts_offset;
        u32    tw_ts_recent;
        long   tw_ts_recent_stamp;
    };
    
    struct inet_timewait_sock {
        struct sock_common  __tw_common;
    
        int                     tw_timeout;
        volatile unsigned char  tw_substate;
        unsigned char           tw_rcv_wscale;
        __be16 tw_sport;
        unsigned int tw_ipv6only     : 1,
                     tw_transparent  : 1,
                     tw_pad          : 6,
                     tw_tos          : 8,
                     tw_ipv6_offset  : 16;
        unsigned long            tw_ttd;
        struct inet_bind_bucket *tw_tb;
        struct hlist_node        tw_death_node;
    };
    
  2. Un ensemble de listes de connexions appelé le « couloir de la mort ». Il est utilisé pour expirer les connexions dans l’état TIME-WAIT. Les connexions sont ordonnées suivant la date d’expiration.

    Ces connexions utilisent le même espace mémoire que pour les entrées dans la table de hachage décrite au point précédent. Il s’agit du membre struct hlist_node tw_death_node.

  3. Une table de hachage des ports locaux utilisés permet de déterminer ou de trouver rapidement un port local pour une nouvelle connexion. La taille de cette table est la même que la table de hachage des connexions :

    $ dmesg | grep "TCP bind hash table"
    [    0.169962] TCP bind hash table entries: 65536 (order: 8, 1048576 bytes)
    

    Chaque élément est de type struct inet_bind_socket qui correspond à un port local. Une connexion dans l’état TIME-WAIT vers un serveur web correspond au port local 80 et partage donc son entrée avec les autres connexions du même type. D’un autre côté, chaque connexion sortante utilise un port local aléatoire et ne partage donc généralement pas son entrée.

Chaque connexion (entrante ou sortante) a donc besoin d’un struct tcp_timewait_sock De plus, chaque connexion sortante est attachée à un struct inet_bind_socket dédié.

La taille d’un struct tcp_timewait_sock est de 168 octets tandis qu’un struct inet_bind_socket occupe 48 octets :

$ sudo apt-get install linux-image-$(uname -r)-dbg
[...]
$ gdb /usr/lib/debug/boot/vmlinux-$(uname -r)
(gdb) print sizeof(struct tcp_timewait_sock)
 $1 = 168
(gdb) print sizeof(struct tcp_sock)
 $2 = 1776
(gdb) print sizeof(struct inet_bind_bucket)
 $3 = 48

Ainsi, 40 000 connexions entrantes dans l’état TIME-WAIT occupent environ 10 Mo alors que 40 000 connexions sortantes occupent en plus 2,5 Mo. L’utilitaire slabtop permet de confirmer ce calcul. Voyez ce qui est indiqué pour un serveur avec 50 000 connexions dans l’état TIME-WAIT dont 45 000 connexions sortantes :

$ sudo slabtop -o | grep -E '(^  OBJS|tw_sock_TCP|tcp_bind_bucket)'
  OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME                   
 50955  49725  97%    0.25K   3397       15     13588K tw_sock_TCP            
 44840  36556  81%    0.06K    760       59      3040K tcp_bind_bucket

Il n’y a rien à modifier ici : la mémoire occupée par les connexions dans l’état TIME-WAIT est très faible. Si votre serveur doit gérer des milliers de nouvelles connexions par seconde, la mémoire nécessaire pour pouvoir pousser efficacement les données rend la présence des connexions dans l’état TIME-WAIT négligeable.

CPU

Coté CPU, la recherche d’un port local de libre est effectué par la fonction inet_csk_get_port() qui emploie un verrou et utilise la table de hachage des ports locaux jusqu’à trouver un port libre. Un très grand nombre d’entrées dans cette table n’impacte généralement pas les performances car si les connexions sont relativement homogènes, cette fonction parcourt les ports locaux de manière séquentielle et retourne donc rapidement un résultat.

Autres solutions

Arrivé à ce point, si vous pensez toujours avoir un problème avec l’état TIME-WAIT, il existe trois autres solutions :

  • désactiver le socket lingering,
  • net.ipv4.tcp_tw_reuse,
  • net.ipv4.tcp_tw_recycle.

Socket lingering

Lorsque close() est appelé, les octets restants dans le noyau seront envoyées en tâche de fond et la connexion terminera dans l’état TIME-WAIT. L’application récupère immédiatement la main avec la certitude que les données finiront par être livrées.

Toutefois, une application peut désactiver ce comportement (connu sous le nom socket lingering). Il y a deux possibilités :

  1. La première est de désactiver entièrement le mécanisme. Les données restantes seront perdues et la connexion est terminée par l’envoi d’un segment RST. L’hôte distant détectera alors une erreur. La connexion ne passera pas par l’état TIME-WAIT.

  2. La seconde est d’attendre un certain temps que les données soient livrées et seulement ensuite de casser la connexion comme dans le point précédent. L’appel à close() est alors bloquant jusqu’à ce que les données soient livrées ou que le délai défini soit écoulé. Il est possible d’éviter ce bloquage en passant la connexion en mode non bloquant. Le processus s’effectue alors en tâche de fond. Si les données sont livrées avec succès, la connexion passera dans l’état TIME-WAIT. Dans le cas contraire, un segment RST sera envoyé et les données seront perdues.

Dans les deux cas, désactiver le socket lingering n’est pas une solution universelle. Certaines applications telles que HAProxy ou Nginx peuvent employer sous certaines conditions une telle technique mais cela n’est pas systématique.

net.ipv4.tcp_tw_reuse

L’état TIME-WAIT permet d’éviter que des segments en retard ne soient acceptés dans une connexion différente. Toutefois, sous certaines conditions, il est possible de différencier de manière certaine les segments d’une connexion précédente des segments d’une connexion actuelle.

La RFC 1323 introduit un ensemble d’extensions pour améliorer les performances de TCP. Parmi celles-ci, on trouve l’horodatage sous forme de deux marqueurs : l’un correspond à l’horloge de l’expéditeur et l’autre au marqueur le plus récent reçu par ce dernier.

En activant net.ipv4.tcp_tw_reuse, Linux va réutiliser une connexion dans l’état TIME-WAIT pour une nouvelle connexion sortante à condition que la date soit strictement plus grande que la dernière date utilisée pour l’ancienne connexion (ce qui correspond le plus souvent à une seconde de différence).

Est-ce sûr ? Le premier but de l’état TIME-WAIT est d’éviter que des segments dupliqués soient acceptés dans une connexion différente. L’usage de l’horodatage permet d’éviter ce problème car les segments en question arriveront avec un marqueur trop vieux et seront ignorés.

Le second but est de s’assurer que l’hôte distant ne se trouve pas dans l’état LAST-ACK suite à la perte du dernier segment ACK. L’hôte distant retransmet le segment FIN jusqu’à ce qu’une des conditions suivantes se réalise :

  1. expiration de l’état
  2. réception du segment ACK attendu
  3. réception d’un segment RST

Dans tous les cas, la connexion est ensuite détruite. Si les segments FIN ainsi envoyés sont reçus alors que l’état TIME-WAIT existe toujours, le ACK attendu sera retransmis.

Lorsque l’état TIME-WAIT est remplacé par une nouvelle connexion, l’horodatage garantit que le segment SYN de la nouvelle connexion sera ignoré et qu’un nouveau segment FIN sera renvoyé. Ce segment FIN arrivant pour une connexion désormais dans l’état SYN-SENT, il recevra en réponse un segment RST qui permettra de sortir de l’état LAST-ACK. Le segment SYN initialement ignoré sera retransmis au bout d’une seconde (car il n’a pas eu de réponse) et la connexion sera alors établie sans erreur apparente en dehors du délai d’une seconde :

Dernier ACK perdu et réutilisation du TIME-WAIT

À noter que chaque connexion ainsi réutilisée implique l’incrément du compteur TWRecycled (malgré son nom).

net.ipv4.tcp_tw_recycle

Ce mécanisme s’appuie également sur l’horodatage des segments mais influence à la fois les connexions entrantes et les connexions sortantes ce qui est utile quand les états TIME-WAIT s’accumulent côté serveur7.

L’état TIME-WAIT va expirer plus tôt : il sera supprimé après écoulement du délai de retransmission (RTO) qui est calculé à partir du RTT et de sa variance. Les valeurs en question peuvent être obtenues pour les connexions en cours avec la commande ss :

$ ss --info  sport = :2112 dport = :4057
State      Recv-Q Send-Q    Local Address:Port        Peer Address:Port   
ESTAB      0      1831936   10.47.0.113:2112          10.65.1.42:4057    
         cubic wscale:7,7 rto:564 rtt:352.5/4 ato:40 cwnd:386 ssthresh:200 send 4.5Mbps rcv_space:5792

Afin de garantir les mêmes propriétés fournies par l’état TIME-WAIT tout en gardant cet état moins longtemps, quand une connexion atteint l’état TIME-WAIT, le dernier horodatage observé est enregistré dans une structure dédiée avec l’IP de l’hôte distant concerné. Linux ignorera alors pendant une minute tout segment provenant d’un hôte connu mais dont l’horodatage est en contradiction avec la valeur mémorisée :

if (tmp_opt.saw_tstamp &&
    tcp_death_row.sysctl_tw_recycle &&
    (dst = inet_csk_route_req(sk, &fl4, req, want_cookie)) != NULL &&
    fl4.daddr == saddr &&
    (peer = rt_get_peer((struct rtable *)dst, fl4.daddr)) != NULL) {
        inet_peer_refcheck(peer);
        if ((u32)get_seconds() - peer->tcp_ts_stamp < TCP_PAWS_MSL &&
            (s32)(peer->tcp_ts - req->ts_recent) >
                                        TCP_PAWS_WINDOW) {
                NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_PAWSPASSIVEREJECTED);
                goto drop_and_release;
        }
}

Lorsque plusieurs hôtes partagent une même IP (courant avec du NAT), cette condition les empêchent de pouvoir se connecter car ils n’utilisent pas la même horloge pour l’horodatage. Dans le doute, il est donc préférable de ne pas activer cette option car elle conduit à des problèmes difficiles à détecter et difficile à diagnostiquer.

L’état LAST-ACK est géré de la même façon que dans le cas de net.ipv4.tcp_tw_recycle.

Résumé

La solution universelle est d’augmenter le nombre de combinaisons possibles pour les quadruplets en utilisant, par exemple, plusieurs ports côté serveur.

Côté serveur, ne pas activer net.ipv4.tcp_tw_recycle à moins d’être sûr de ne jamais avoir à interagir avec des machines se partageant la même IP. Activer net.ipv4.tcp_tw_reuse est sans effet sur les connexions entrantes.

Côté client, activer net.ipv4.tcp_tw_reuse est une solution quasiment fiable. Activer en plus net.ipv4.tcp_tw_recycle est alors quasi-inutile.

Pour terminer, voici une citation de W. Richard Stevens issue de Unix Network Programming:

L’état TIME_WAIT est notre ami et est là pour nous aider (i.e., permettre aux segments dupliqués d’expirer en transit). Plutôt que de tenter de supprimer cet état, nous devons le comprendre.


  1. Notamment, les paramètres tels que net.netfilter.nf_conntrack_tcp_timeout_time_wait n’ont absolument aucune infuence sur la gestion des connexions dans l’état TIME-WAIT

  2. Ce diagramme est disponible sous la licence LaTeX Project Public License 1.3. Le fichier original est disponible sur cette page

  3. Dans l’état LAST-ACK, une connexion retransmet régulièrement le dernier segment FIN jusqu’à recevoir le segment ACK attendu. Il est donc normalement peu probable de rester très longtemps dans cet état. 

  4. Côté client, les noyaux plus anciens doivent également trouver un tuple local disponible (adresse source, port source) pour chaque connexion sortante. Augmenter les paramètres côté serveur n’a donc pas d’effet. Un noyau Linux 3.2 est toutefois assez récent pour partager un même tuple local vers différentes destinations. Merci à Willy Tarreau pour son point de vue sur la question. 

  5. La dernière solution peut sembler un peu stupide par rapport à l’utilisation de ports supplémentaires mais certains serveurs ne permettent pas d’écouter sur plusieurs ports. L’avant-dernière solution est plus économique en nombre d’IP consommées. 

  6. L’utilisation d’une structure dédiée pour les connexions dans l’état TIME-WAIT remonte au noyau Linux 2.6.14. 

  7. Quand un serveur ferme la connexion en premier, la connexion atteint l’état TIME-WAIT de son côté alors que le client considère que le quadruplet en question est disponible pour une nouvelle connexion. 

24 February, 2014 07:28PM by Vincent Bernat

February 16, 2014

hackergotchi for

Aurélien Jarno

On configure systems

I will never understand the point of using autotools, cmake or whatever configure system, when later the code uses an hardcoded list of architectures to determine the size of a pointer… Unfortunately for porters this pattern is quite common.

Update: As people keep asking, the way to check for the size of a given type is explained in the autoconf manual. To check for the size of the pointer, the following entry has to be added to configure.ac:

AC_CHECK_SIZEOF(void *)

On a 64-bit system, this will lead to the following entry in config.h:

/* The size of `void *', as computed by sizeof. */
#define SIZEOF_VOID_P 8

16 February, 2014 01:52PM by aurel32

February 14, 2014

hackergotchi for

Raphaël Hertzog

Mise en orbite du Cahier de l’Admin Debian Wheezy

Il était temps vous allez me dire! Et vous aurez raison, la mise à jour du livre anglais puis la mise à jour de la traduction français a pris bien plus de temps que je ne l’aurai voulu (mais l’année qui s’est écoulée était pleine de challenge entre l’arrivée d’un deuxième fils et la construction d’une maison qui n’est toujours pas terminée d’ailleurs…).

Toujours est-il que c’est désormais chose faite. On peut commander la sixième édition (et oui 6 déjà!) du livre sur Amazon où il a pris la première place dans la section Linux avant même ma première annonce officielle. :-)

N°1 dans la section Linux

Bien entendu on peut aussi le consulter en ligne et le télécharger. Faites circuler la nouvelle!

Au menu de cette édition : un rafraîchissement complet pour tenir comptes des changements apportés par Debian 7, une nouvelle section sur le support multi-architectures de dpkg, et de nombreux bogues corrigés.

Aucun commentaire pour le moment | Vous avez aimé ? Cliquez ici. | Ce blog utilise Flattr.

14 February, 2014 10:50AM by Raphaël Hertzog

February 01, 2014

hackergotchi for Charles Plessy

Charles Plessy

Consultation européenne sur les copyrights.

Ça y est, j'ai répondu à la Consultation publique sur la révision des règles de l’Union européenne en matière de droit d’auteur. Coïncidence, la radio diffusait European Super State de Killing Joke.

On peut voir en filigrane dans la consultation un Internet taillé sur mesure pour contrôler la diffusion et la copie des œuvres non-Libres, et surveiller les possibles infractions. Il est donc important de répondre pour rappeler la primauté de la présomption d'innocence et l'importance du respect de la vie privée.

J'ai néanmoins recommandé la minimisation des exceptions au copyright, car donner un accès gratuit temporaire aux documents non-libres, c'est aussi décourager la création d'alternatives que l'on peut copier, modifier et redistribuer librement.

01 February, 2014 01:41PM

January 12, 2014

hackergotchi for

Raphaël Hertzog

Mes activités libres en décembre 2013

Voici le récapitulatif mensuel de toutes mes activités gravitant autour du logiciel libre. Si vous faites partie des personnes ayant fait un don pour soutenir mon travail (147,56 €, merci à tous !), c’est l’occasion de constater ce que je fais de votre argent. Sinon, c’est toujours quelques nouvelles intéressantes sur l’avancement de mes différents projets.

Cahiers de l’Admin Debian

Cover of the Debian Administrator's Handbook (Wheezy edition)J’ai passé une bonne partie du mois de décembre sur le livre. Dans un premier temps à finaliser la version anglaise et la rendre disponible. Puis à travailler à la mise à jour de la version française. Eyrolles va en publier une nouvelle édition basée sur cette traduction. Plus de détails à venir à ce sujet courant janvier !

Debian France

J’ai participé à de nombreuses discussions au sein de Debian France.

À commencer par le reproche que la majorité des évènements sont organisés à Paris. J’ai donc proposé de cartographier la position de chaque membre de Debian France. Nous avons ajouté de nouveaux champs dans la page de gestion des membres de telle sorte que les adhérents peuvent maintenant y ajouter leurs coordonnées GPS, et Frédéric Decou a procédé à quelques essais avec OpenStreetMap. Quelqu’un d’autre (Kiriarat) s’est proposé d’écrire le code intermédiaire nécessaire. Une carte manuelle est actuellement maintenue sur le site Web.

Sample logo receivedAu cours des discussions sur la mise en place de la boutique Debian France, j’ai suggéré de mettre à jour notre logo vers quelque chose de plus joli. Nous avons eu quelques suggestions et, après de nouvelles discussions avec Alexandre Delanoë et Sylvestre Ledru, nous avons organisé un petit concours pour inciter les graphistes à nous soumettre des propositions (le gagnant reçoit un ensemble de goodies Debian). Nous avons reçu 46 propositions (mon préféré est sur la droite !) Le bureau est en train de présélectionner les logos qui seront soumis au vote final des adhérents. Le vainqueur sera désigné à l’issue de la mini-debconf à venir sur Paris.

J’ai également continué à travailler sur les statuts et le règlement intérieur, qui devraient être adoptés lors de la prochaine assemblée qui se tiendra pendant la mini-debconf.

Travaux Debian divers

Maintenance de WordPress. J’ai parrainé Pablo Vasquez pour sa toute première petite contribution à l’empaquetage de WordPress. C’est quelque chose que j’ai vraiment apprécié, mais il n’est pas encore prêt à assumer tout seul la maintenance d’un paquet important tel que WordPress. J’ai eu de multiples autres propositions d’aide et j’ai répondu à toutes, tandis que je créais le rapport n°733726 afin de coordonner le travail pour la nouvelle version amont. Mais je n’ai eu aucun retour :-( Le passage de témoin de la maintenance d’un paquet est quelque chose de difficile…

Discussion autour du système d’init. Le comité technique a la lourde tâche de choisir le futur système de démarrage qui remplacera le vénérable System V init (cf. n°727708). J’ai suivi de près cette longue discussion, et y ai participé là où j’avais quelque chose d’intéressant à dire. La décision finale est attendue courant janvier. Pour ce que ça vaut, je partage entièrement, pour ma part, le point de vue de Russ Allbery dans cette discussion. Je fais tourner systemd sur certains de mes ordinateurs depuis maintenant quelques mois déjà.

Correction de lxc dans stable. Le paquet lxc dans stable a un modèle « debian » non-fonctionnel. Je n’aime vraiment pas mentionner que des choses ne fonctionnent pas dans une documentation, donc plutôt que d’écrire cela dans les Cahiers de l’Admin, j’ai fait quelque chose pour y remédier. J’ai préparé une mise à jour — ne provenant pas du mainteneur officiel (NMU) — pour le dépôt stable (cf. n°680469 pour le problème et n°732358 pour la demande de mise à jour dans stable).

Divers. J’ai parrainé une mise à jour de tcpdf. J’ai soumis une demande d’évolution concernant Publican, afin qu’il continue à traiter les instructions présentes dans les traductions. J’ai envoyé les nouvelles version de publican-librement et debian-handbook. J’ai soumis le bogue n°732678 concernant git-buildpackage, car ce dernier n’arrivait pas à appeler proprement lintian lorsque l’option -A était passée.

Merci

Rendez-vous au mois prochain pour un nouveau résumé de mes activités !

Ceci est une traduction de mon article My Free Software Activities in December 2013 contribuée par Weierstrass01.

Aucun commentaire pour le moment | Vous avez aimé ? Cliquez ici. | Ce blog utilise Flattr.

12 January, 2014 08:06PM by Raphaël Hertzog

January 06, 2014

hackergotchi for

Aurélien Jarno

Debian QEMU images updated

Following the release of Debian Wheezy, I have (finally) updated my set of Debian QEMU images for both Squeeze (6.0.8) and Wheezy (7.3). The following images are now available:

Each of these directories contains a GPG signed README.txt file with the md5sums all files, detailed instructions how to run these images and especially the minimum QEMU version to use.

The requirements to run the default desktop environment have increased a lot between Squeeze and Wheezy. An accelerated graphics card is now needed to be able to use Gnome (unless you use the fallback mode), which is not something provided by QEMU (actually there is now a QXL para-virtualized video card, but the driver is only in unstable). In addition GDM now needs more than 128MiB to start, while this is the default amount of memory provided for virtual machines. I have therefore decided to switch the default desktop environment on the Wheezy images to Xfce and the display manager to LightDM. Both Gnome and GDM are still installed on the images, and the original default can easily be restored using the following commands:

  • update-alternatives --auto x-session-manager
  • echo /usr/sbin/gdm3 > /etc/X11/default-display-manager

Beside this the new images only contain minor changes. The filesystems have been tweaked to not run fsck after a certain amount of days, and locales-all and openssh-server are now installed in all images. For MIPS and MIPSEL, 64-bit kernels are now also installed and provided, so that it is possible to choose between a 32-bit or a 64-bit kernel (see the README.txt for more details).

There is no Debian Wheezy SPARC image available, as QEMU does not fully support SPARC64 yet (it is actually possible to run it, but then the VM crashes often), and Debian Wheezy now only supports 64-bit kernels. I will also invest time to build an S390X image, but so far I haven’t been successful on that.

The following images are still available at the same location, though they haven’t been updated:

  • sparc (Etch)
  • SH4 (Sid from a few years ago)

06 January, 2014 06:46PM by aurel32

hackergotchi for

Tanguy Ortolo

Avertissement erroné : réponse de l'Hadopi

Un avertissement erroné

Suite à la réception d'un avertissement manifestement erroné de la part de l'Hadopi, j'ai contacté ces derniers pour contester cet avertissement, qui concernait un acte de téléchargement ou de partage effectué avec une adresse IPv4 qui ne correspondait pas du tout à celle associée à ma connexion à Internet.

Réponse de l'Hadopi

J'ai très rapidement reçu une réponse, dont je vous livre ici l'essentiel.

La Commission de protection des droits accuse réception de vos observations, qui en application de l'article R 331-39 du code de la propriété intellectuelle, ont été enregistrées et seront prises en compte, en cas de réitération, lors de l'examen de votre dossier par la Commission de protection des droits.

Et corriger directement l'erreur, ce n'est pas possible ?

Les faits dont la Commission de protection des droits a été saisie concernent la mise en partage d'une œuvre culturelle protégée effectuée par le biais du logiciel : « eMule ».

Ah, intéressant, cette fois-ci c'est bien le logiciel eMule qui est mentionné. Mon second argument redevient donc pertinent, puisqu'il s'agit d'un logiciel que je n'utilise pas, et qu'il me serait difficile d'utiliser puisqu'il est destiné au système d'exploitation Windows, que je n'utilise pas.

En l’espèce, les faits ont été relevés lors d’une connexion via votre accès internet effectuée au moyen de votre service « FreeWifi ».

Service que je n'utilise pas, merci pour cet argument supplémentaire.

Afin de sécuriser l’utilisation de la fonctionnalité « Hot spot » de votre connexion à internet, nous vous recommandons de modifier votre mot de passe. Vous pouvez joindre votre fournisseur d'accès afin qu'il vous donne davantage d'informations sur ce point.

Sécuriser la fonctionnalité de point d'accès sans fil de mon modem-routeur ? C'est déjà fait, depuis quatre ou cinq ans, de la façon la plus simple et la plus sûre qui soit : cette fonctionnalité est entièrement désactivé. Merci pour cette recommandation utile.

Conclusion

Infraction commise depuis une adresse IP différente de la mienne, par un service que je n'utilise pas, lié à une fonctionnalité que j'ai désactivée depuis longtemps, avec un logiciel que je n'utilise pas : les fondations de cet avertissement sont de plus en plus faibles ! Il semble qu'il ne soit pas possible de faire annuler un avertissement avant d'en être arrivé à l'étape de la convocation devant un tribunal pour l'amende ultime de 1.500 euros, mais cela me semble contradictoire avec le droit de rectification que l'Hadopi rappelle à la fin de cet avertissement.

Bien évidemment, je continue à contester cet avertissement, avec les nouveaux éléments que l'Hadopi vient de me fournir. Cette réponse ne refusant pas formellement ma contestation, je viens d'y apporter une nouvelle réponse : affaire à suivre.

Question aux lecteurs : à votre avis, quel serait le meilleur moyen d’authentifier la date d'un document ? Je compte effectuer une capture de l'écran de configuration de mon modem-routeur qui montre que ses fonctionnalités wifi sont complètement désactivées, et la dater, ainsi que les divers éléments dont je dispose aujourd'hui, d'une façon qui soit difficilement contestable. Me l'envoyer moi-même par la Poste, en comptant sur le cachet d'oblitération ? Me l'envoyer en LRAR ?

06 January, 2014 01:01PM by Tanguy

January 03, 2014

Premier avertissement, erroné, de l'Hadopi

Problème théorique de la riposte graduée

Vous vous en souvenez sans doute, la loi Internet et création, qui introduisait une « riposte graduée » à la contrefaçon sur Internet, en instaurant une autorité nationale appelée Hadopi, posait plusieurs problèmes, notamment le reversement de la charge de la preuve. Combinée au recours à une milice privée, Trident Media Guard, pour constater les contrefaçon, cela s'exprime très simplement : inutile d'être coupable pour être condamné.

Mise en pratique : un avertissement erroné

Eh bien, je viens de recevoir mon premier avertissement de l'Hadopi. Et devinez quoi ? Il est erroné, je suis averti et menacé d'une amende de 1.500 euros en cas de récidive d'un acte que je n'ai pas commis. Voici l'avertissement en question, commenté par mes soins.

Madame, Monsieur,

Il a été constaté le mercredi 04 décembre 2013 à 10 heures 48, qu’une ou plusieurs œuvres ont été téléchargées ou partagées depuis votre accès à internet, en violation des droits d’auteur. Ces faits peuvent constituer une infraction pénale.

Alors déjà, le mercredi à onze heures du matin, je suis au travail, et j'ai autre chose à faire que de me connecter chez moi pour y lancer à distance des téléchargements illicites. Mais ce n'est là qu'un faible indice pour suspecter une erreur de leur part, le meilleur reste à venir.

Les faits constatés ont été commis avec le(s) logiciel(s)/protocole(s) eMule, depuis l'adresse IP 78.251.224.134, attribuée à votre connexion par votre fournisseur d’accès à internet Free SAS / ProXad.

Ah, nous y voilà. Ce téléchargement aurait donc été effectué avec eMule, logiciel de partage de fichiers de pair à pair utilisant les protocoles eDonkey et Kad, pour le système d'exploitation Microsoft Windows. Système que je n'utilise pas chez moi, ni au travail d'ailleurs, et dont je ne dispose d'aucune copie. Certes, il n'est pas impossible de faire fonctionner eMule sur le système que j'utilise, Debian, mais c'est là une opération remarquablement inutile, puisqu'il existe déjà des clients eDonkey et Kad fonctionnant nativement sur ce système.

Édition : Ils mentionnent le logiciel ou protocole eMule, cet argument n'a donc pas lieu d'être.

Enfin, ce téléchargement aurait été effectué depuis l'adresse IPv4 78.251.224.134. Problème : ce n'est pas moi, ça. J'ignore qui utilise cette adresse, qui est décrite dans la base de données WHOIS du RIPE NCC comme appartenant à Free qui l'utilise comme « Wifi Address Pool », mais mon adresse IPv4, fixe, que vous pourrez déterminer en résolvant le nom du serveur de ce blog, n'a rien à voir avec celle-ci. Quand au réseau Free Wifi, je crois l'avoir utilisé en tout et pour tout pendant quelques jours avant de recevoir mon modem-routeur Freebox. Depuis, je dispose d'un accès fixe, et j'ai même désactivé toutes les fonctionnalités micro-ondes de ce modem-routeur. Pas de wifi chez moi, et quand je suis en voyage, j'utilise le réseau de mon hôte, pas celui de Free.

Il vous est recommandé de prendre sans délai toutes mesures utiles pour éviter une nouvelle atteinte au droit d’auteur. A cette fin, vous pouvez consulter les fiches pratiques « usage et internet », disponibles sur le site internet de l’Hadopi : www.hadopi.fr/r essources/fiches-pratiques qui vous apporteront notamment des informations pour sécuriser votre ligne. Vous pouvez également vous rapprocher de votre fournisseur d’accès à internet.

« Prendre toutes mesures utiles » pour éviter que quelqu'un d'autre ne récidive avec une connexion à Internet qui n'est pas la mienne, quelque chose me dit que je risque d'avoir du mal à le faire, même en faisant tous les efforts du monde pour sécuriser mon réseau filaire — qui l'est déjà par nature puisqu'il faut s'introduire chez moi pour l'utiliser — et mon réseau micro-ondes — qui n'existe pas et n'a donc pas besoin d'être sécurisé. Superflu, au secours !

Le message formule ensuite une menace d'amende de 1.500 euros en cas de récidive :

Si, malgré les avertissements de l’Hadopi, votre accès à internet était à nouveau utilisé pour des mises en partage ou des téléchargements illégaux, vous pourriez, à l’issue de la procédure suivie devant l’Hadopi, être poursuivi(e) devant le tribunal de police pour contravention de négligence caractérisée. Vous risquez alors une amende d’un montant maximum de 1500 € (article R. 335-5 du code de la propriété intellectuelle). Retrouvez toute information utile sur www.hadopi.fr/acces-au-formulaire-reponse-graduee-jai-recu-un-mail.

Je vous épargne le blabla légaliste qui parsème ce message, ainsi que les explications qui indiquent que le piratage c'est mal et que ça tue des bébés phoques.

Conclusion

Bref, voilà, comme souvent, je suis à la fois satisfait de constater la réalité des problèmes que je dénonçais lors de la mise en place d'un système dangereux, et déçu par le fait que ce système ait été mis en place en dépit des critiques dont la pertinence vient d'être démontrée.

03 January, 2014 12:17PM by Tanguy

January 01, 2014

hackergotchi for

Vincent Bernat

Tester son infrastructure avec serverspec

La configuration d’une ferme de serveurs peut être vérifiée par des outils de déploiement tels que Puppet, Chef, Ansible ou Salt. Ils permettent à un administrateur de décrire la configuration cible et de s’assurer que celle-ci est correctement appliquée. Il est également possible d’obtenir des rapports sur les serveurs dont la configuration n’est pas conforme.

serverspec exploite quant à lui le très connu RSpec, un outil de test pour le langage Ruby fréquemment utilisé dans le développement piloté par les tests. Il permet de tester l’état des serveurs à travers une connexion SSH.

Pourquoi utiliser un tel outil supplémentaire ? Certaines choses sont plus faciles à tester qu’à décrire via un changement de configuration, comme par exemple le bon fonctionnement d’un applicatif que l’on teste en vérifiant qu’il écoute sur un port donné.

Premiers pas

Une bonne connaissance de Ruby peut aider mais n’est pas essentielle pour utiliser serverspec. L’écriture des tests se fait généralement dans un langage presque naturel. Toutefois, voici deux ressources intéressantes pour apprendre rapidement l’essentiel de Ruby :

Le site web de serverspec contient une courte introduction présentant l’essentiel. je vous invite à la parcourir rapidement. À titre d’exemple, voici un test qui vérifie qu’un service est bien en écoute sur le port 80 :

describe port(80) do
  it { should be_listening }
end

Si vous voulez repérer les serveurs qui n’ont pas été mis à jour en Debian Wheezy, le test suivant fera l’affaire :

describe command("lsb_release -d") do
  it { should return_stdout /wheezy/ }
end

Le test suivant permet de vérifier la bonne valeur du paramètre miimon de l’interface bond0, uniquement si cette dernière existe :

has_bond0 = file('/sys/class/net/bond0').directory?

# miimon should be set to something other than 0, otherwise, no checks
# are performed.
describe file("/sys/class/net/bond0/bonding/miimon"), :if => has_bond0 do
  it { should be_file }
  its(:content) { should_not eq "0\n" }
end

serverspec dispose d’une documentation complète des resources disponibles (telles que port et command) qui peuvent être utilisées après le mot-clef describe.

Si un test est trop complexe pour s’exprimer de cette manière, il est possible d’utiliser des commandes arbitraires. Dans l’exemple ci-dessous, nous vérifions que memcached est configuré pour utiliser quasiment toute la mémoire disponible sur le système :

# We want memcached to use almost all memory. With a 2GB margin.
describe "memcached" do
  it "should use almost all memory" do
    total = command("vmstat -s | head -1").stdout # ➊
    total = /\d+/.match(total)[0].to_i
    total /= 1024
    args = process("memcached").args # ➋
    memcached = /-m (\d+)/.match(args)[1].to_i
    (total - memcached).should be > 0
    (total - memcached).should be < 2000
  end
end

Bien que plus complexe, ce test est toujours assez simple à comprendre. En ➊, le résultat de la commande vmstat est récupérée pour être comparé avec une valeur obtenue en ➋ via une autre ressource fournie par serverspec.

Utilisation avancée

La documentation de serverspec fournit quelques exemples d’utilisation plus avancée, comme la possibilité de partager des tests dans une ferme de serveurs ou d’exécuter plusieurs tests en parallèle.

J’ai mis en place un dépôt GitHub destiné à être utilisé comme base pour obtenir les fonctionnalités suivantes :

  • assigner des rôles à chaque serveur et des tests à chaque rôle,
  • exécution parallèle,
  • génération et visualisation de rapports de test.

Taxinomie des serveurs

Par défaut, serverspec-init fournit une base où chaque serveur dispose de son répertoire avec son propre ensemble de tests. Toutefois, rien ne nous empêche de grouper les tests selon des rôles. serverspec se concentrant sur l’exécution des tests sur un serveur donné, la décision des serveurs et des tests à exécuter sur ceux-ci est déléguée à un Rakefile1. Ainsi, au lieu de se baser sur le contenu d’un répertoire, la liste des serveurs peut être extraite depuis un fichier (ou un serveur LDAP ou toute autre source). Pour chacun d’eux, la liste des rôles associés est calculée via une fonction :

hosts = File.foreach("hosts")
  .map { |line| line.strip }
  .map do |host|
  {
    :name => host.strip,
    :roles => roles(host.strip),
  }
end

La fonction roles() est chargée de fournir les rôles assignés à un serveur. Elle peut par exemple se baser sur le nom du serveur :

def roles(host)
  roles = [ "all" ]
  case host
  when /^web-/
    roles << "web"
  when /^memc-/
    roles << "memcache"
  when /^lb-/
    roles << "lb"
  when /^proxy-/
    roles << "proxy"
  end
  roles
end

Le code ci-dessous crée ensuite une tâche pour chaque serveur. Voyez, en ➋, comment les rôles associés au serveurs vont influencer les tests exécutés. De plus, en ➊, une tâche server:all va permettre de lancer les tests sur tous les serveurs.

namespace :server do
  desc "Run serverspec to all hosts"
  task :all => hosts.map { |h| h[:name] } # ➊

  hosts.each do |host|
    desc "Run serverspec to host #{host[:name]}"
    ServerspecTask.new(host[:name].to_sym) do |t|
      t.target = host[:name]
      # ➋: Build the list of tests to execute from server roles
      t.pattern = './spec/{' + host[:roles].join(",") + '}/*_spec.rb'
    end
  end
end

La commande rake -T permet de lister les tâches ainsi créées :

$ rake -T
rake check:server:all      # Run serverspec to all hosts
rake check:server:web-10   # Run serverspec to host web-10
rake check:server:web-11   # Run serverspec to host web-11
rake check:server:web-12   # Run serverspec to host web-12

Enfin, il convient de modifier spec/spec_helper.rb pour expliquer à serverspec que le serveur à tester se trouve dans la variable d’environnement TARGET_HOST.

Exécution parallèle

Par défaut, chaque tâche est exécutée une fois la précédente terminée. Avec de nombreux serveurs à tester, cela peut prendre un certain temps. rake permet d’exécuter des tests en parallèle en combinant l’option -j et l’option -m :

$ rake -j 10 -m check:server:all

Rapports de test

Pour chaque serveur, rspec est exécuté. Par défaut, la sortie produite ressemble à cela :

$ rake spec
env TARGET_HOST=web-10 /usr/bin/ruby -S rspec spec/web/apache2_spec.rb spec/all/debian_spec.rb
......

Finished in 0.99715 seconds
6 examples, 0 failures

env TARGET_HOST=web-11 /usr/bin/ruby -S rspec spec/web/apache2_spec.rb spec/all/debian_spec.rb
......

Finished in 1.45411 seconds
6 examples, 0 failures

Avec plusieurs dizaines ou centaines de serveurs, la lisibilité est plutôt médiocre, d’autant qu’en cas d’exécution en parallèle des tests, les lignes se retrouvent mélangées. Heureusement, rspec permet de sauvegarder le résultat au format JSON. Il est ensuite possible de consolider ces résultats en un unique fichier. Tout ceci peut se faire dans le Rakefile :

  1. Pour chaque tâche, on assigne la valeur --format json --out ./reports/current/#{target}.json à rspec_opts. La sous-classe ServerspecTask se charge de cette partie ainsi que de la transmission du nom du serveur et de la production d’une sortie plus compacte en en couleurs sur la console lors du déroulement du test.

  2. On ajoute une tâche pour consolider les fichiers JSON en un seul rapport. Le code source de tous les tests est également ajouté à ce rapport afin de le rendre indépendant des changements qui peuvent survenir par la suite. Cette tâche est exécutée automatiquement après la dernière tâche liée à serverspec.

N’hésitez pas à jeter un œil au fichier Rakefile complet pour obtenir plus de détails.

Enfin, une interface web minimaliste permet d’afficher le rapport ainsi généré2. Elle montre le résultat des tests sous la forme d’une matrice où les tests qui ont échoué sont représentés par une pastille rouge.

Exemple de rapport

En cliquant sur un test, les informations détaillées s’affichent : description du test, code, message d’erreur et trace d’exécution.

Visualistion d'une erreur

J’espère que ces quelques ajouts au-dessus de serverspec permettent d’en faire une corde supplémentaire à l’arc des outils IT. Elle se situerait à mi-chemin entre l’outil de déploiement et l’outil de supervision.


  1. Un Rakefile est l’équivalent d’un Makefile. Les tâches et leurs dépendances sont décrites en Ruby et seront exécutées dans l’ordre par l’utilitaire rake

  2. Cette interface est disponible sur le dépôt GitHub dans le répertoire viewer/

01 January, 2014 12:05PM by Vincent Bernat

December 30, 2013

Florent Gallaire

Arrêtez d’écrire des classes !

En créant les nouvelles fonctionnalités ASCII art de txt2tags, j’ai été amené à développer un certain nombre de fonctions spécifiques que j’ai donc logiquement fini par extraire dans une librairie autonome nommée aa.py. Pour des raisons historiques, d’habitude des utilisateurs et de facilité de diffusion, Aurélio Jargas – le BDFL de txt2tags – m’a demandé de réintégrer ces fonctions dans le fichier principal, ce à quoi il a ajouté :

Aurélio: move them back to global functions or creating a aa class in txt2tags?
option 2 would be cool

J’ai réfléchi, puis j’ai réintégré mes fonctions, telles quelles, sans créer de classe aa. Créer une classe dans ce cas ne me semblait pas adapté, complexifiant le code sans raison théorique valable ni contrepartie pratique positive.

Peu de temps après, je suis tombé sur une présentation intitulée Stop Writing Classes faite par le core developer Python Jack Diederich lors du PyCon 2012. J’y ai retrouvé beaucoup de choses que je pensais et d’autres que je n’avais pas encore clairement formalisées. Elle est particulièrement intéressante car elle utilise de vrais exemples de code, dont une horreur produite par des ingénieurs de chez Google !

On pourrait résumer cette réflexion avec les deux principes les plus importants de la programmation selon moi : KISS (Keep It Simple, Stupid) et DRY (Don’t Repeat Yourself). On peut remarquer que ce qui est pertinemment décrit comme une mauvaise utilisation des classes, correspond globalement à un style de programmation à la Java. Pour ceux qui ne comprendraient pas l’anglais et pour les gens pressés, voici donc les principales recommandations à retenir :

  • Diminuer le nombre de classes en refactorisant le code ;
  • Ne pas écrire de classes vides, qui pourraient être utiles plus tard, en utilisant pass, les écrire plus tard si besoin ;
  • Si une classe n’a que deux méthodes, et que l’une d’elle est __init__, c’est que ce ne devrait pas être une classe ;
  • Quand un dictionnaire suffit, ne pas le camoufler dans une classe ;
  • Ne pas créer de nouvelles exceptions, utiliser celles de la librairie standard, qui sont connues et comprises de tous ;
  • Les espaces de noms existent pour éviter les collisions, pas pour faire de la taxinomie, il faut donc qu’ils restent le plus plat possible.

Je finis en donnant la parole à la défense, avec cet article technique d’Armin Ronacher intitulé Start Writing More Classes.

flattr this!

30 December, 2013 04:45AM by fgallaire

December 26, 2013

Post-PC, le nouveau sens de multiplateforme

Un développeur de logiciels propriétaires se pose rarement la question des plateformes supportées par son logiciel. Il développe souvent exclusivement pour un système d’exploitation, avec les outils propriétaires fournis avec son système et ne fonctionnant que sur ce dernier.

Un développeur de logiciels libres est lui naturellement obligé de se poser la question, car il a le choix de ses technologies, et que son système d’exploitation est peut-être minoritaire et donc peu supporté. De plus, il souhaite logiquement toucher le plus large public possible, car ce serait dommage de s’en priver quand on produit du code libre d’être diffusé !

Concernant le poste client, la problématique du multiplatforme s’est posée pendant des années en ces termes :

Est-ce que mon programme fonctionne sous Windows, Mac OS X et GNU/Linux ?

Les parts de marché étaient réparties selon un classique et très stable :

95% Windows
4% OS X
1% Linux

Qui après une décennie de numéros marketing de Steve Jobs autour de l’iPod et du côté hype d’être équipé d’ordinateurs Apple avait abouti à un finalement presque équivalent :

90% Windows
9% OS X
1% Linux

Mais les choses ont vraiment changé sous l’impulsion d’Apple rapidement suivi par Google, avec l’arrivé de l’iPhone en 2007 :

smartphone

Celle de l’iPad en 2010 :

tablet

Et la déferlante de smartphones et tablettes Android qui s’en est suivie. Un changement radical et extrêmement rapide :

multiplateforme

Apple et Google nous ont fait rentrer dans l’ère post-PC des smartphones et des tablettes. Ces trois slides, extraits de la présentation faite par Lars Knoll au cours des Qt Developer Days 2012, ont déjà plus d’un an, et la situation s’est encore accentuée depuis.

Bien sûr, on peut légitimement se réjouir de voir Android, un système d’exploitation libre basé sur Linux, dominer aussi outrageusement les systèmes d’exploitation propriétaires, donnant ainsi au libre l’éclatante victoire qu’il n’avait jamais obtenue sur le poste utilisateur classique.

Cependant, c’est bien un cri d’alarme que je souhaite lancer, car j’ai l’impression que pendant que des milliers (millions ?) d’applications propriétaires sans intérêt sont produites pour ces nouvelles plateformes, les logiciels libres de type applicatif n’y sont que très peu représentés, pour ne pas dire totalement absents.

Cette situation n’est pas complètement absurde, car un développeur de logiciels libres est un utilisateur productif. Un ordinateur dépourvu de clavier ne lui permettant pas de programmer, il n’en fera jamais sa machine principale, et il aura une vision des usages informatiques construite sur cette réalité, qui est la sienne.

À titre personnel, j’ai une utilisation assez limitée de mon smartphone, qui n’est qu’un téléphone me permettant de lire mes mails et m’indiquant ma position sur une carte, et je ne suis pas près d’avoir une tablette.

Mais il faut prendre conscience que certaines personnes ont rangé leur ordinateur portable dans une armoire, et qu’elles n’utilisent plus que leur tablette et leur smartphone, et ce de manière intensive.

On peut aussi voir cela comme une opportunité à saisir, car s’intéresser à ces nouvelles plateformes mobiles c’est aussi penser à de nouvelles fonctionnalités ou à de nouveaux types d’utilisation qui n’avaient pas lieu d’être jusqu’à présent.

Pour que la situation des applications libres évolue dans le bon sens, il faut d’urgence repenser la problématique du multiplatforme ainsi :

Est-ce que mon programme fonctionne sous Windows, Mac OS X, GNU/Linux, iOS et Android ?

flattr this!

26 December, 2013 08:52PM by fgallaire

December 25, 2013

Carl Chenet

Cadeau de Noël : Publication de Brebis 0.9, le vérificateur automatisé de sauvegarde

Suivez-moi aussi sur Identi.ca ou sur Twitter 

Peu de temps avant ce Noël, l’équipe du projet Brebis a publié la version "Bouddhinette" 0.9 du vérificateur automatisé de sauvegardes. Pour rappel, Brebis est un programme en ligne de commande codé en Python permettant le contrôle automatisé de l’intégrité d’archives (tar, gz, bzip2, lzma, zip) et de la cohérence des fichiers à l’intérieur des archives. Au menu de cette version :

  • Support des archives apk
  • Nouvelles options de la ligne de commandes pour écrire le fichier de configuration (-C), la liste des fichiers dans l’archive (-L) ou les deux (-O) dans un répertoire défini par l’utilisateur (où précédemment ces fichiers étaient écrits par défaut dans le même répertoire que l’archive elle-même).
brebis-brown-big-logo

Anisette, la fière nouvelle mascotte et nouveau logo du projet Brebis généreusement contribué par Antoine Millet

Comme annoncé aux JM2L, Brebis continue d’intégrer des nouveaux types d’archives , mais aussi rend sa manipulation plus flexible afin d’être intégré plus simplement pour répondre aux besoins de ses utilisateurs en s’adaptant plus simplement aux différentes situations existantes..

Feedback sur Brebis

Et vous ? Que pensez-vous de Brebis ? N’hésitez pas à vous abonner à la liste de diffusion de Brebis,  à laisser un commentaire ici ou  un message sur le forum ou à me contacter directement, tous les retours seront appréciés.


25 December, 2013 10:01PM by Carl Chenet

December 14, 2013

hackergotchi for Charles Plessy

Charles Plessy

Fatigué

En voulant préparer la mise à jour d'un paquet, j'ai vu une image au format PNG, et avant même de l'ouvrir je me suis senti vieux, usé, abattu, et incapable de faire face. Après inspection, c'est évident image n'a pas été faite à la main, il manque le ficher source. Une autre image dans le même répertoire a le même style et a une source au format SVG, c'est la preuve. Il manque quand même les instructions pour convertir le SVG en PNG. De plus en plus dans ces situations-là, je baisse les bras et je laisse tomber le paquet. J'ai perdu le temps et l'énergie pour exiger des auteurs des changements pour lesquels je n'ai personnellement aucun intérêt concret. Le SVG en plus du PNG, c'est mieux, mais le PNG sans SVG, pour la documentation d'un programme, c'est suffisamment libre à mon goût. Mais les points de vue exprimés sur debian-devel me donnent l'impression que ce n'est pas assez bon pour Debian, alors je laisse tomber…

14 December, 2013 02:19AM

December 13, 2013

hackergotchi for Debian France

Debian France

Ouverture de la boutique Debian France

Ouverture de la boutique Debian France

La boutique Debian France est maintenant ouverte. Hébergée et gérée par l'association En Vente Libre, la boutique Debian est accessible sur:

http://enventelibre.org/debian

Sur cette boutique, sont proposés :

Les t-shirts devraient arriver bientôt.

13 December, 2013 01:45PM

hackergotchi for

Tanguy Ortolo

Associations, acceptez les p....ns de virements

Avertissement : ceci est un coup de gueule du vendredi. Vous avez le droit de cesser de lire.

Je reçois régulièrement des appels au don pour soutenir des associations. Pourquoi pas, et je suis prêt à donner si la cause et la méthode sont bonnes. Dans la plupart des cas, ces associations acceptent les dons sous forme de débit mensuel automatique, ou par chèque.

Problème : en ce qui me concerne, le débit mensuel, qui est la grande mode pour les associations depuis quelques années, est tout simplement hors de question, dans la mesure où il implique de donner à l’association en question un mandat de prélèvement discrétionnaire. Je veux bien faire un don, pas donner les clefs de mon compte en banque.

Reste donc le chèque, qui a l'inconvénient de nécessiter un envoi postal, et un traitement manuel. Alors qu'il existe pourtant un moyen de paiement utilisable à peu de frais dans toute l'Europe, sans contraintes matérielles : le virement bancaire. Associations, si vous voulez que je vous aide, donnez-moi votre IBAN. Je pourrais même envisager de donner de façon mensuelle, si vous en tenez tant, parce que voyez-vous, ma banque permet de définir des virements périodiques automatiques. C'est moderne !

D'une façon générale, et cela vaut pour les associations, pour les commerçants et pour les particuliers, si vous voulez de l'argent, refuser un moyen de paiement qui n'a pas d'inconvénient majeur est tout simplement insensé. Mais bon, si vous ne voulez pas de mon argent, qui suis-je pour m'en offusquer ?

13 December, 2013 12:33PM by Tanguy

December 09, 2013

hackergotchi for

Raphaël Hertzog

Mes activités libres en novembre 2013

Voici le récapitulatif mensuel de toutes mes activités gravitant autour du logiciel libre. Si vous faites partie des personnes ayant fait un don pour soutenir mon travail (44,52 €, merci à tous !), c’est l’occasion de constater ce que je fais de votre argent. Sinon, c’est toujours quelques nouvelles intéressantes sur l’avancement de mes différents projets.

Cahiers de l’Admin Debian

Mise à jour vers Wheezy terminée. Roland et moi avons fini la mise à jour de la version anglaise du Cahier de l’Admin Debian suite à l’arrivée de Wheezy. Nous avons encore un peu de relecture à faire, mais vous pouvez déjà apprécier le résultat ici: http://debian-handbook.info/browse/wheezy/

N’hésitez pas à nous faire part de toute erreur que vous rencontreriez. Vous pouvez également nous soumettre des patchs prêts à l’emploi si vous souhaitez aller un peu plus loin.

Contributions à publican Le livre est généré avec publican et je maintiens son paquet Debian. Ce mois-ci on m’a signalé un bogue critique pour la publication car publican a tout simplement cessé de fonctionner… il s’est avéré que le problème résidait dans libxml-treebuilder-perl. J’ai donc réassigné le bogue n°728885 tandis que je proposais un patch à l’auteur amont. Après quelques jours sans réaction de l’équipe pkg-perl, et après avoir reçu un rapport de bogue inapproprié sur debian-handbook (évidemment publican était cassé dans unstable !), j’ai préparé un paquet corrigé par moi-même et l’ai envoyé (je fais toujours partie de l’équipe pkg-perl, même si j’y suis inactif).

Dans la mesure où j’ai fortement utilisé publican ce mois-ci, j’ai créé deux tickets dans son bugzilla. J’ai demandé l’ajout d’une nouvelle fonctionnalité dans le n°1034836, et remonté un problème de gestion du caractère « \n » dans les fichiers PO (n°1036150).

Debian France

Mise à jour de Galette. J’ai mis à jour le paquet galette et son plugin PayPal, et les ai déployés sur france.debian.net. Il contenait quelques corrections pour les emails de rappel envoyés aux membres.

Mise à jour des statuts. J’ai également repris mon travail de préparation de nouveaux statuts pour Debian France. Sylvestre Ledru a apporté un brouillon (élaboré avec l’aide d’un avocat) quelques mois plus tôt et je suis maintenant en train de le revoir/améliorer. Le but principal étant de clarifier le fait que Debian France devienne une organisation de confiance pour le projet Debian.

Boutique Debian France. Voilà déjà quelques mois que nous en avons eu l’idée, et c’est Sylvestre qui a fait le travail nécessaire pour ouvrir la boutique Debian France, avec l’aide d’EnVenteLibre. J’ai demandé à nos membres de préparer quelques CSS qui correspondent mieux aux couleurs de Debian, ce qui devrait être fait d’ici quelques jours. Les premiers goodies vont également commencer à apparaître bientôt, juste à temps pour Noël !

Travaux divers autour de Debian

Distro Tracker. Dans la droite ligne du Google Summer of Code, j’ai demandé à l’équipe DSA de mettre en place une nouvelle machine virtuelle afin d’héberger tracker.debian.org, une instance de Distro Tracker, la réécriture du Système de Suivi des Paquets. Ils ont fait leur part du travail (à l’exception du paramétrage des emails), et c’est maintenant à moi de trouver un peu de temps pour faire du nettoyage et déployer le tout.

WordPress. J’ai empaqueté WordPress 3.7.1 et envoyé une demande d’aide sur debian-mentors. J’ai obtenu trois réponses, leur ai donné une première direction de travail mais je n’ai eu aucun retour depuis. WordPress 3.8 est attendu pour dans quelques jours, et j’espère que l’un des nouveaux volontaires va s’occuper de préparer la nouvelle mise à jour.

Régressions de dpkg. Je n’ai rien fait depuis plusieurs mois maintenant mais je laisse au moins tourner la version Git de dpkg et j’ai détecté deux régressions. C’est une bonne chose de les avoir éradiquées avant le prochain envoi de la version 1.17.2 vers unstable.

Correction du Système de Suivi des Paquets (PTS). J’ai corrigé quelques avertissements que le code du PTS commençait à générer depuis la mise à jour de son hôte vers Wheezy. Ces avertissements généraient des emails ennuyeux aux utilisateurs du bot pts@qa.debian.org.

Mise à jour de sécurité de Ruby. J’ai aidé l’équipe Ruby à préparer les mises à jour de sécurité requises de Ruby 1.8 et 1.9.1 (cf. n°730178 et n°730189). Ce travail a été sponsorisé par Kali/Offensive Security.

Mise en place de SmartCard. J’ai acheté deux smartcards OpenPGP ainsi qu’un lecteur et j’ai déplacé toutes mes clés privées vers ces périphériques (une carte avec la clé primaire pour les signature/certification qui reste à la maison, une carte pour les utilisations mobiles/quotidiennes avec les clés secondaires pour le chiffrement/signature/authentification). Le disque dur de mon portable ne contient plus aucune clé privée. J’ai conservé les sauvegardes requises dans un endroit sûr mais, in fine, mes clés privées sont bien plus difficiles à voler. Je devrais faire part de mes conclusions dans un autre article…

Merci

Rendez-vous au mois prochain pour un nouveau résumé de mes activités !

Ceci est une traduction de mon article My Free Software Activities in November 2013 contribuée par Weierstrass01.

2 commentaires | Vous avez aimé ? Cliquez ici. | Ce blog utilise Flattr.

09 December, 2013 07:09AM by Raphaël Hertzog

December 08, 2013

Carl Chenet

Retour sur Brebis, le vérificateur automatisé de sauvegarde, aux JM2L

Suivez-moi aussi sur Identi.ca ou sur Twitter 

Comme chaque année avait lieu à Sophia Antipolis les Journées Méditerrannéennes du Logiciel Libre, organisées par l’association Linux Azur. J’avais proposé pour cette année une présentation du projet  Brebis, le vérificateur automatisé de sauvegarde. C’était pour moi l’occasion de réaliser quelques slides parlant du projet (désormais disponible en ligne – CC by SA) et de recueillir les réactions du public.

jm2l

L’accueil est chaleureux, comma d’habitude et le public est présent. On m’avait accordé un créneau d’une bonne heure. j’ai donc essayé de captiver mon public pendant 50 minutes avant la séance de questions. La présentation se découpe en deux phases, une introduction au domaine de la sauvegarde et à la nécessité de vérifier les sauvegardes régulièrement, puis une seconde partie plus technique sur les fonctionnalités du logiciel Brebis lui-même.

brebis-brown-big-logo

Anisette, la fière nouvelle mascotte et nouveau logo du projet Brebis généreusement contribué par Antoine Millet

La conférence a été filmée, je pourrai donc vérifier ce qu’il en est une fois que les vidéos seront en ligne.

Niveau stand, les exposants sont accueillants et disponibles et je suis content de voir cet événement du Logiciel Libre toujours aussi fréquenté. Trois fois que je fais le déplacement et je repasse sans faute l’année prochaine !

Étiez-vous aux JM2L aussi ? Qu’en avez-vous pensé ? N’hésitez pas à réagir dans les commentaires de ce billet.


08 December, 2013 09:54AM by Carl Chenet

December 05, 2013

hackergotchi for Debian France

Debian France

En route pour le nouveau logo Debian France

Debian France choisit son nouveau logo

Le CA de Debian France est heureux de vous annoncer l'ouverture de l'événement "Logo Debian France".

Son objectif est de déterminer le nouveau logo officiel de Debian France. Cet événement est encadré par les règles suivantes:

Règles encadrant les propositions pour le nouveau logo:

  • Toute personne peut proposer un nouveau logo en format svg (Scalable Vector Graphics) exclusivement ;
  • Les propositions doivent être soumises à asso@france.debian.net avant le 31/12/2013, 00H00 +1GMT ;
  • Le CA se réserve le droit de refuser les logos ne correspondant pas à l'image de Debian.

Règles encadrant le vote:

  • L'annonce d'ouverture des votes sera faite sur la liste asso@france.debian.net au moins 15 jours avant la clôture du vote ;
  • Les membres de l'association Debian France (à jour de leur cotisation) pourront voter ;
  • Clôture des votes: samedi 18/01/2014, 20H +1GMT.

Règles encadrant les droits d'auteur du logo lauréat:

  • La licence du logo Debian France est identique à celle des logos Debian, c'est à-dire LGPL 3+ et CC-BY-SA 3.0 ;
  • Le nom (ou pseudo) de l'auteur sera indiqué sur le site de l'association ;
  • Pour fêter symboliquement l'ouverture de la boutique Debian France, l'artiste lauréat remportera un lot Debian France (1 polo + 1 casquette + 5 autocollants).

Annonce du résultat des votes:

  • L'annonce du résultat du vote sera réalisée à la clôture de la mini DebConf 2014 le 19 janvier 2014 par le président de Debian France.
  • L'annonce sera immédiatement retransmise sur la mailing-list asso@france.debian.net.

A vous de jouer et n'hésitez pas à diffuser cette annonce.

Nous restons à votre disposition pour toute information complémentaire.

05 December, 2013 10:34PM

December 02, 2013

Deuxième meetup à Paris

Deuxième meetup à Paris

Le second Meetup organisé par l'association Debian France aura lieu le mardi 10 décembre prochain à partir de 18h30.

Il sera hébergé par IRILL (proche de place d'italie à Paris): http://www.irill.org/about/access

Le programme, si il y en a un, sera annoncé plus tard. Si vous voulez proposer une présentation (rapide ou longue), n'hésitez pas à contacter Sylvestre Ledru - <sylvestre@debian.org>.

L'évènement est sponsorisé par Logilab.

Inscriptions:

02 December, 2013 07:43PM

November 19, 2013

Carl Chenet

Yarn : Scénarios d’exécutions de programmes en ligne de commandes

Suivez-moi aussi sur Identi.ca ou sur Twitter 

Ceux qui me suivent sur Twitter auront peut-être vu passer un tweet au sujet de Yarn, logiciel fort sympathique que j’ai vraiment découvert le week-end dernier à la Mini-Debconf UK à Cambridge.

Yarn permet de définir des scénarios d’exécutions de programmes en ligne de commande. Le scénario ainsi écrit sera ensuite joué et le résultat de l’exécution présenté de manière synthétique.

1. Syntaxe d’un scénario à travers un exemple

Petit exemple avec un scénario permettant de vérifier la bonne exécution de Brebis, le logiciel de vérification de sauvegarde. Le but est de :

  1. mettre en place un environnement de test
  2. exécuter le test
  3. vérifier l’exécution du test

Voici comment se présente le fichier de scénario de Brebis, ce dernier suit la syntaxe Markdown :

    SCENARIO basic brebis execution
    GIVEN setting up brebis
    AND generating with brebis
    WHEN brebis is ready
    THEN verify brebis job

    IMPLEMENTS GIVEN setting up brebis
    hg clone http://hg.brebisproject.org $DATADIR/brebis
    mkdir -p $DATADIR/brebis/yarn-test
    cp $DATADIR/brebis/functional-tests/expected-generated-list-for-tar-archive/expected-generated-list-for-tar-archive.tar.gz $DATADIR/brebis/yarn-test

    IMPLEMENTS GIVEN generating with brebis
    $DATADIR/brebis/brebis.py -G $DATADIR/brebis/yarn-test/expected-generated-list-for-tar-archive.tar.gz

    IMPLEMENTS WHEN brebis is ready
    $DATADIR/brebis/brebis.py -c $DATADIR/brebis/yarn-test -l $DATADIR/brebis/yarn-test/brebis.log

    IMPLEMENTS THEN verify brebis job
    if [ -s $DATADIR/brebis/yarn-test/brebis.log ]; then return 1; else return 0; fi

2. Résultat de l’exécution du scénario

Le résultat de l’exécution du scénario est synthétique et précise les conditions d’exécution du scénario :

$ yarn brebis-scenario
Scenario test suite PASS, with 1 scenarios (4 total steps), in 16.4 seconds

3. Détails de l’implémentation du scénario

Les 5 premières lignes représentent votre scénario. Il porte avant tout un nom défini par le mot-clé SCENARIO, l’étape suivante GIVEN est en général à consacrer à la mise en place de votre environnement de test. Il est possible d’enchaîner ici plusieurs groupes d’instructions à l’aide de AND.
Une fois notre environnement de test mis en place, nous lançons le test à l’aide de WHEN. Enfin nous vérifions le résultat de notre exécution lors de l’étape THEN.Il est à noter que si des opérations sont à réaliser après le test, vous pouvez utiliser le mot-clé FINALLY.

On remarque également l’utilisation de la variable $DATADIR, initialisé par Yarn qui fournit le chemin vers un répertoire temporaire qui par défaut sera supprimé à la fin de votre scénario.

À chaque étape précédemment citée, nous associons des commandes shell à l’aide du mot-clé IMPLEMENTS. Nous faisons ainsi la correspondance entre les titres de nos étapes et les commandes exécutées. Il s’agit dans l’exemple des lignes qui commencent juste après la ligne contenant le THEN.

On voit que la première partie du fichier définie des étapes, avec une syntaxe qui permet d’obtenir des ordres proches du langage naturel. La seconde partie du fichier fournit la correspondance entre ces ordres et leur implémentation concrète en commandes shell. C’est simple et efficace.

4. Encore quelques mots sur un projet prometteur

Yarn est codé en Python et déjà disponible dans Debian dans le paquet cmdtest. Les sources sont facilement accessibles. Je pense que si vous êtes à la recherche de ce type d’outil, Yarn a pris d’emblée les bonnes directions. Le projet est encore jeune (documentation à améliorer, de nombreus points à faire évoluer) mais la base est là et son upstream est à l’écoute des suggestions (et des patchs) :)

Quelques liens pour la route :

Et vous ? Que pensez-vous de Yarn ? N’hésitez pas à réagir comme d’habitude dans les commentaires.


19 November, 2013 07:04AM by Carl Chenet

November 17, 2013

hackergotchi for Charles Plessy

Charles Plessy

La source d'un paquet développé dans un dépôt Git est ce dépôt.

Dans son blog, Lars met les mots justes sur toutes ces situations où je ressens une grande lassitude, en particulier sur tous les efforts qu'on nous demande pour que nos paquets soient modifiables par nos contributeurs qui ne peuvent, ne savent, ou ne veulent pas utiliser Git.

La plupart de nous outils de base, dpkg, debhelper, lintian ou debian-installer pour ne citer qu'eux, sont développés dans des dépôts Git. Une personne voulant contribuer au cœur de Debian peut difficilement éviter Git.

Il est temps d'adapter nos méthodes et nos outils pour prendre le meilleur parti de Git. Cela demande de dire « non merci » aux contributions qui se basent sur le paquet source dans notre archive FTP plutôt que sur le dépôt dans lequel le paquet est préparé, ce qui pose la question de quelle est la véritable source des paquets binaires, mais c'est une question que l'on peut difficilement éviter.

17 November, 2013 10:43AM

November 15, 2013

hackergotchi for Roland Mas

Roland Mas

10 ans !

Eh ben dites-donc mes aïeux, le temps passe. Le 15 novembre 2003, j'émettais ma première facture en tant que consultant indépendant.

Eh ben dix ans plus tard, y'a eu des hauts et des bas, mais globalement tout va bien, et je continue à faire des factures de temps en temps, et ça me plaît toujours autant.

Touchons du bois pour que ça continue, et on en reparle dans dix ans !

15 November, 2013 02:45PM

November 11, 2013

hackergotchi for

Vincent Bernat

Snimpy: SNMP &amp; Python

Souvent considéré comme désuet, SNMP est toujours omniprésent pour interagir avec des équipements réseau. Pour la supervision, il permet d’exposer diverses métriques telles que les compteurs liés aux interfaces réseau. Il permet également d’interagir sur la configuration des équipements.

Les variables exposées par les agents SNMP (serveurs) sont contenues dans une base hiérarchique appelée Management Information Base (ou MIB1). Chaque entrée est identifiée par un OID. En interrogeant un OID spécifique, un manager (client) obtient la valeur associée à la variable.

Par exemple, IF-MIB est une MIB présentée dans la RFC 2863. Elle contient les objets utilisés pour gérer les interfaces réseau. L’un d’eux est ifTable dont chaque ligne représente une interface réseau logique : son nom, ses caractéristiques et divers compteurs.

ifIndex ifDescr ifPhysAddress ifOperStatus ifOutOctets
1 lo up 545721741
2 eth0 0:18:f3:3:4e:4 up 78875421
3 eth1 0:18:f3:3:4e:5 down 0

ifTable est indexée par sa première colonne, ifIndex. Pour obtenir le statut opérationnel de la seconde interface, il suffit d’interroger IF-MIB::ifOperStatus.2 que l’on peut traduire vers l’OID .1.3.6.1.2.1.2.2.1.8.2 à l’aide des informations contenues dans la définition de la MIB.

Automatiser SNMP

Un agent SNMP peut fournir de nombreuses informations intéressantes :

Des outils tels que snmpget et snmpwalk permettent de collecter manuellement ces informations :

$ snmpwalk -v 2c -c public localhost IF-MIB::ifDescr      
IF-MIB::ifDescr.1 = STRING: lo
IF-MIB::ifDescr.2 = STRING: eth0
IF-MIB::ifDescr.3 = STRING: eth1

Toutefois, il est assez fastidieux de construire des scripts robustes à l’aide de ceux-ci. Par exemple, voici un script pour obtenir les descriptions de toutes les interfaces réseau actives ainsi que le nombre total d’octets transmis :

#!/bin/sh

set -e

host="${1:-localhost}"
community="${2:-public}"
args="-v2c -c $community $host"

for idx in $(snmpwalk -Ov -OQ $args IF-MIB::ifIndex); do
    descr=$(snmpget -Ov -OQ $args IF-MIB::ifDescr.$idx)
    oper=$(snmpget -Ov -OQ $args IF-MIB::ifOperStatus.$idx)
    in=$(snmpget -Ov -OQ $args IF-MIB::ifInOctets.$idx)
    out=$(snmpget -Ov -OQ $args IF-MIB::ifOutOctets.$idx)
    [ x"$descr" != x"lo" ] || continue
    [ x"$oper" = x"up" ] || continue
    echo $descr $in $out
done

Heureusement, il existe des extensions SNMP pour la plupart des langages. À titre d’exemple, voici comment pourrait être réécrit le script ci-dessus en exploitant l’extension SNMP pour Python livrée avec Net-SNMP :

import argparse
import netsnmp

parser = argparse.ArgumentParser()
parser.add_argument("host", default="localhost", nargs="?",
                    help="Agent to retrieve variables from")
parser.add_argument("community", default="public", nargs="?",
                    help="Community to query the agent")
options = parser.parse_args()
args = {
    "Version": 2,
    "DestHost": options.host,
    "Community": options.community
}

for idx in netsnmp.snmpwalk(netsnmp.Varbind("IF-MIB::ifIndex"),
                            **args):
    descr, oper, cin, cout = netsnmp.snmpget(
        netsnmp.Varbind("IF-MIB::ifDescr", idx),
        netsnmp.Varbind("IF-MIB::ifOperStatus", idx),
        netsnmp.Varbind("IF-MIB::ifInOctets", idx),
        netsnmp.Varbind("IF-MIB::ifOutOctets", idx),
        **args)
    assert(descr is not None and
           cin is not None and
           cout is not None) # ➊
    if descr == "lo":
        continue
    if oper != "1": # ➋
        continue
    print("{} {} {}".format(descr, cin, cout))

Cette extension a plusieurs défauts importants :

  1. Tout est présenté sous forme de chaînes de caractères comme on peut le voir en ➋.
  2. La gestion des erreurs est inexistante. En cas d’erreur sur le nom d’une variable, le message snmp_build: unknown failure s’affiche mais aucune exception n’est levée. Si une variable n’existe pas, les fonctions retournent None. Voir en ➊.

L’impossibilité de gérer les erreurs rend cette extension dangereuse. On ne peut imaginer effectuer des modifications importantes sur la base des réponses retournées. Une vérification oubliée et un script peut enchaîner des actions inappropriées !

Snimpy

N’ayant pas trouvé d’extension fiable pour Python, j’ai donc décidé d’écrire Snimpy avec deux principaux objectifs :

  1. S’appuyer sur les informations contenues dans les MIB pour fournir une interface pythonique.
  2. Toute erreur doit se traduire en une exception.

Voici comment le précédent script pourrait être réécrit :

#!/usr/bin/env snimpy

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("host", default="localhost", nargs="?",
                    help="Agent to retrieve variables from")
parser.add_argument("community", default="public", nargs="?",
                    help="Community to query the agent")
options = parser.parse_args()

m = M(options.host, options.community, 2)

load("IF-MIB")
for idx in m.ifDescr:
    if m.ifDescr[idx] == "lo":
        continue
    if m.ifOperStatus[idx] != "up":
        continue
    print("{} {} {}".format(m.ifDescr[idx],
                            m.ifInOctets[idx],
                            m.ifOutOctets[idx]))

Une alternative est d’utiliser les listes en compréhension :

load("IF-MIB")
print("\n".join([ "{} {} {}".format(m.ifDescr[idx],
                                    m.ifInOctets[idx],
                                    m.ifOutOctets[idx])
                  for idx in m.ifDescr
                  if m.ifDescr[idx] != "lo"
                  and m.ifOperStatus[idx] == "up" ]))

Voici un autre exemple pour obtenir la table de routage de l’agent :

load("IP-FORWARD-MIB")
m=M("localhost", "public", 2)
routes = m.ipCidrRouteNextHop
for x in routes:
    net, netmask, tos, src = x
    print("{:>15s}/{:<15s} via {:<15s} src {:<15s}".format(
        net, netmask, routes[x], src))

IP-FORWARD-MIB::ipCidrRouteNextHop est issue d’une table utilisant un index composé. Cependant, son utilisation semble toujours naturelle.

Techniquement, les requêtes SNMP sont gérées par PySNMP et les MIB sont interprétées à l’aide de libsmi2. Snimpy fonctionne à la fois avec Python 2 et Python 3. Pour plus d’informations, jetez un œil à la documentation de Snimpy.


  1. Une MIB est définie à l’aide de SMI, un sous-ensemble de ASN.1. Toutefois, il n’est pas rare d’appeler également « MIB » cette définition. 

  2. À l’heure actuelle, il n’existe malheureusement pas d’analyseur robuste pour SMI écrit en Python. Par exemple, PySNMP s’appuie sur l’outil smidump livré avec libsmi. Snimpy exploite libsmi via CFFI

11 November, 2013 01:15PM by Vincent Bernat

November 07, 2013

hackergotchi for

Raphaël Hertzog

Le revenu de base, un rêve de développeur de logiciel libre ?

En tombant par hasard sur l’article L’aliénation du plein emploi de Lionel Dricot — un autre développeur de logiciel libre — j’ai décidé de bloguer à mon tour pour casser le mythe du plein emploi et promouvoir le concept du revenu de base.

Le travail n’est plus une nécessité vitale

Le film de Daniel Häni et Enno Schmidt nous rappelle de manière fort à propos que nous travaillons dur depuis longtemps à rendre le travail obsolète en l’automatisant autant que possible. Force est de constater que subvenir aux besoins de base de l’humanité ne nécessite plus que tout le monde travaille. Produire la nourriture que l’on mange, construire les logements qui nous abritent, cela occupe 15% de notre population tout au plus.

Pourtant le travail est imposé à tous

Trouver un travail rémunéré pour les 85% restant de la population est le challenge que toute notre classe politique veut relever car c’est le seul moyen officiel de gagner de l’argent pour subvenir à ses besoins.

Travailler pour de l'argent pour subsister

Même si le plein emploi n’est plus possible

Notre « société de consommation » ne crée effectivement des emplois que lorsque la société dans son ensemble consomme plus d’année en année. Cette course a la croissance est problématique sur une planète aux ressources limitées (on ne peut pas produire et polluer à l’infini), elle est pourtant nécessaire pour l’équilibre économique dans un système d’argent-dette (en simplifiant: l’argent est crée par les banques qui accordent des prêts, l’argent nécessaire pour rembourser les intérêts doit être récupéré sur de l’argent emprunté par d’autres, donc il faut une masse monétaire croissante pour éviter un effondrement du système).

En outre nous constatons que l’argent se concentre dans les mains des plus riches, et dans le milieu financier de manière plus générale. Si l’argent ne revient plus correctement aux mains de l’ensemble de la population, la croissance n’est pas possible. Le système est dans l’impasse.

En réalité le travail ne manque pas

Nous manquons de crèches pour nos enfants, d’entraîneurs dans nos clubs de sport, de policiers pour assurer notre sécurité, de chercheurs pour trouver un remède contre les cancers, d’enseignants pour nos enfants, de temps pour s’occuper de nos enfants, etc.

À titre plus personnel, je manque de temps pour développer les logiciels libres qui me tiennent à cœur… tout simplement parce que je dois me concentrer sur les tâches des clients qui me paient, afin que je puisse rembourser les emprunts que j’ai fait pour le bien être de ma famille.

Mais il n’est pas rentable

Toutes les tâches que j’ai listé sont utiles à la société mais ne sont pas développées sous forme d’activités économiques parce qu’elle ne sont pas rentables dans notre système capitaliste.

Le revenu de base est la solution

L’idée du revenu de base est de donner à tout être humain un revenu minimal inconditionnel. Ainsi, que l’on travaille ou pas, chacun devrait percevoir un revenu suffisant pour se loger et se nourrir. Il se cumule aux revenus du travail.

Ce matelas de sécurité change la donne à tous les niveaux et libère le potentiel humain :

  1. fini l’obligation d’accepter un poste, le travail sera choisi et les condition de travail mieux négociées ;
  2. les tâches ingrates seront mieux rémunérées (ou alors automatisées) ;
  3. créer l’emploi de ses rêves deviendra naturel (car le facteur risque est limité) ;
  4. licencier et embaucher sera plus simple car les conséquences seront moins problématiques pour la société ;
  5. ceux qui ne veulent pas travailler ne travailleront pas au lieu de traîner des pieds à des postes qu’ils n’apprécient pas ;
  6. chacun sera libre de choisir ce qu’il fait, activité rémunérée ou non, à temps plein ou temps partiel, selon ses envies.

La liste des conséquences est bien plus longue et de nombreux ajustements seront nécessaires, mais je suis convaincu que cela sera grandement bénéfique à la société dans son ensemble.

Et vous que feriez-vous si votre revenu était garanti ?

Cela vous semble utopique ? De nombreux économistes ont défendu le concept. Et maintenant c’est au tour du grand public de s’accaparer l’idée. « Rien n’est plus puissant qu’une idée dont l’heure est venue! » dit la citation. Alors…

Agissez maintenant !

Cliquez-ici et allez signer l’initiative européenne qui invite notre classe politique à étudier le concept et sa faisabilité. C’est un peu complexe (il faut donner le numéro de sa carte d’identité pour les Français) mais c’est parfaitement sécurisé et les données ne sortent pas des serveurs de la commission européenne. C’est important, prenez les cinq minutes nécessaires.

Ensuite, partagez cet article sur les différents réseaux sociaux que vous utilisez, voire allez-y de votre propre article de blog !

Enfin, donnez de l’argent pour aider à la promotion de cette initiative en participant à cette campagne sur KissKissBankBank. Je viens de donner pour rattraper le temps perdu… j’aurai du faire cet article il y a plusieurs mois déjà.

Retrouvez d’autres idées de promotion sur le site français du revenu de base : http://revenudebase.info/agir/

revenu-base-ice-logo

21 commentaires | Vous avez aimé ? Cliquez ici. | Ce blog utilise Flattr.

07 November, 2013 11:19PM by Raphaël Hertzog

November 06, 2013

Carl Chenet

Publication de Brebis 0.8, le vérificateur automatisé de sauvegarde

Suivez-moi aussi sur Identi.ca ou sur Twitter 

Brebis, le vérificateur automatisé de sauvegarde, est désormais disponible en version 0.8. Les principaux apports de cette version sont un renforcement de la sécurité du processus de vérification avec :

  • un nouveau paramètre "sha512" dans le fichier de configuration de Brebis, indiquant la somme de hachage du fichier qui contient la liste des fichiers de l’archive à vérifier. Cela permet de détecter tout changement survenu sur cette liste.
  • le fichier principal de configuration de Brebis peut désormais être signé à l’aide de GPG, afin de garantir qu’un éventuelle modification dudit fichier puisse être détectée.

=> BREAKING NEWS: Brebis est aujourd’hui sur Hackernews, n’hésitez pas à voter pour !

Petits points sur les fonctionnalités de Brebis

Brebis propose aujourd’hui un nombre important de fonctionnalités. En voici un petit résumé.

Les formats supportés de sauvegarde :

  • archive Tar .
  • archive Tar avec compression Gzip .
  • archive Tar avec compression Bzip2 .
  • archive Tar avec compression Lzma.
  • archive Gzip .
  • archive Bzip2 .
  • archive Zip .
  • archive Lzma.
  • arborescence de fichiers.

Contrôle sur l’archive elle-même :

  • détection des archives corrompues.
  • détection des tailles inattendues (égale à, plus petite que, plus grande qu’une taille enregistrée au préalable).
  • contrôle la somme de hachage de l’archive (md5, sha1, sha224, sha256, sha384, sha512).
  • vérifie l’uid/gid de l’archive
  • vérifie le mode de l’archive (états des droits de lecture, écriture et exécution)
  • signature GPG du fichier de configuration principal

Contrôle sur les fichiers à l’intérieur de l’archive :

  • identifie d’éventuels fichiers manquants
  • détection des tailles inattendues des fichiers dans l’archive (égale à, plus petite que, plus grande que)
  • détecte le type des fichiers dans l’archive (fichier, répertoire, lien)
  • vérifie le mode des fichiers dans l’archive (états des droits de lecture, écriture et exécution)
  • contrôle la somme de hachage des fichiers dans l’archive (support du md5, sha1, sha224, sha256, sha384, sha512)
  • identifie un fichier qui n’est pas censé se trouver dans l’archive
  • contrôle la cible des liens dans l’archive

Feedback sur Brebis

Et vous ? Que pensez-vous de Brebis ? N’hésitez pas à vous abonner à la liste de diffusion de Brebis,  à laisser un commentaire ici ou  un message sur le forum ou à me contacter directement, tous les retours seront appréciés.


06 November, 2013 10:01PM by Carl Chenet

November 04, 2013

Stéphane Blondon

Évolution comparée du nombre de bogues entre distribution Linux

Il est difficile de connaitre la vitalité d’une distribution Linux. Il est possible de s’en faire une idée en fonction du nombre de posts sur des forums, de recherche sur un moteur de recherche, du nombre de téléchargement ou la visibilité sur Distrowatch, etc. Regarder le nombre de bogues en est une autre. Après tout, […]

04 November, 2013 10:47PM by ascendances

October 29, 2013

hackergotchi for

Aurélien Jarno

Detecting code issues using multiple architectures

Sometimes building the same code on multiple architectures is useful to detect horrors like:

ExEnv::err0() < < sprintf("AtomInfo: invalid name: %s\n",name.c_str());

This code builds using -Werror=format-security with only a few warnings on most architectures, while GCC is correctly detects the issue on some others.

This has been reported as bug#728249.

29 October, 2013 10:37PM by aurel32

October 27, 2013

hackergotchi for Charles Plessy

Charles Plessy

L'installeur Debian dans le nuage Amazon.

J'ai préparé des images machines de l'installeur Debian sur chaque région du nuage élastique Amazon, en suivant la méthode que j'avais décrite auparavant, et que j'ai mise à jour et documentée sur le wiki de Debian.

Démarrés avec un fichier de pré-configuration, ces images installent Debian à la carte sur un volume de stockage qui peut ensuite être enregistré comme une nouvelle image machine. Cette partie n'est pas encore automatique, mais j'y travaille. En attendant, il est possible d'installer Debian interactivement en utilisant la console réseau.

27 October, 2013 01:37PM

October 15, 2013

Carl Chenet

Brebis 0.7 : contrôle automatisé de vos sauvegardes

Suivez-moi aussi sur Identi.ca ou sur Twitter 

La version "Chevillette" 0.7 de Brebis, le vérificateur de sauvegarde, a été publiée le 15 octobre. Pour rappel le projet Brebis est un logiciel libre (GPLv3) de contrôle automatisé de vos sauvegardes (archives et arborescences de fichiers plats). Il contrôle l’intégrité de vos sauvegardes ainsi que leur contenu.

Quoi de neuf dans Brebis ?

La version 0.7 offre les fonctionnalités suivantes :

  • une nouvelle option -G ou –gen-full génère pour une archive ou une arborescence donnée à la fois le fichier de configuration et la liste des fichiers contenus dans l’archive. Faire contrôler une archive par Brebis n’aura jamais été aussi facile.
  • le nouveau paramètre target permet de vérifier la cible d’un lien.
  • sous le capot, de nombreuses corrections de bugs et optimisations

Quelques liens vers des exemples d’utilisation de brebis

  • Exemple de création d’une sauvegarde. La création de des fichiers de configuration et de liste des fichier dans l’archive ne se fera plus avec l’option -g qui ne génèrait que la liste de fichiers dans l’archive mais plutôt avec la nouvelle option -G qui créé à la fois le fichier de configuration de l’archive et la liste des fichiers dans cette archive
  • Documentation officielle du projet : la ressource essentielle, tout doit y être. Si vous observez quelque chose de manquant,n’hésitez pas à vous manifester.

Feedback sur Brebis

N’hésitez pas à laisser un message sur le forum, à vous abonner à la liste de diffusion de Brebis ou à me contacter directement, tous les retours  seront appréciés.

Et vous ? Que pensez-vous de Brebis ? N’hésitez pas à me laisser votre avis dans les commentaires.


15 October, 2013 10:01PM by Carl Chenet

October 14, 2013

hackergotchi for Charles Plessy

Charles Plessy

Mise à jour de EMBOSS explorer dans Wheezy.

EMBOSS explorer était cassé dans Debian 7 (Wheezy) pour cause d'incompatiblité avec EMBOSS 6.4. Le paquet a été réparé avec la deuxième mise à jour (7.2). Le dévelopment et la maintenance d'EMBOSS explorer sont au point mort depuis plusieurs années. Si un nouveau bug sérieux apparaît, nous risquons de devoir retirer le paquet plutôt que de le réparer. En conséquence, n'hésitez pas à nous suggerer une alternative, ou si vous êtes programmeur et que vous avez-besoin d'EMBOSS explorer, à voir comment revigorer ce projet (actuellement sur SourceForge).

14 October, 2013 04:19AM

October 10, 2013

hackergotchi for Roland Mas

Roland Mas

Les rumeurs de la mort de ce blog…

…sont un peu exagérées. Mais c'est sûr, c'est calme, et apparemment une partie de mon lectorat s'en inquiète. Donc voici un lot de nouvelles pour ceux que ma vie passionne et qui n'ont plus accès au 3615 Roland.

Alors bon, suite à ce que je vous disais sur Eleven en mai, je me suis mis en quête d'un autre groupe de rock. J'avais cru en trouver un, mais j'ai l'impression que la motivation n'était pas universellement partagée, à tel point qu'on a dû faire moins d'une répétition par mois en moyenne. C'est pas des bonnes conditions, donc je suis de nouveau en recherche. Si vous cherchez un batteur pour jouer du rock aux environs de Montpellier, faites-moi signe.

Cela dit, je ne suis pas resté oisif pour autant : le taiko continue, l'association a été reprise en main, on répète, et hop hop hop on est même invités à jouer en public pas plus tard que ce week-end ! Ça va se passer au parc Borély à Marseille, à l'occasion du festival d'automne organisé par le consulat général du Japon. Plus de détails sur le site de Minami Taiko, vu que c'est comme ça qu'on s'appelle. Le site est neuf aussi, mais on y mettra des photos et peut-être des vidéos.

Sur les autres fronts : côté FusionForge c'est calme, mais la prochaine édition du Debian Administrator's Handbook / Cahier de l'Admin Debian avance petit à petit. On commence non pas à en voir le bout, mais à voir ce qu'il reste à faire avant d'en voir le bout. Mes autres récents petits bricolages de geek feront peut-être l'objet d'un billet dédié si je suis motivé.

Voilà voilà.

10 October, 2013 03:15PM

October 07, 2013

hackergotchi for

Raphaël Hertzog

Mes activités libres en septembre 2013

Voici le récapitulatif mensuel de toutes mes activités gravitant autour du logiciel libre. Si vous faites partie des personnes ayant fait un don pour soutenir mon travail (86,18 €, merci à tous !), c’est l’occasion de constater ce que je fais de votre argent. Sinon, c’est toujours quelques nouvelles intéressantes sur l’avancement de mes différents projets.

Système de suivi des paquets^U Traqueur de distribution

Marko Lalic a implémenté pas mal de fonctionnalités intéressantes dans les dernières semaines du Google Summer of Code (notamment le support des équipes). Malheureusement il n’a pas (encore) déployé les derniers changements sur pts.debian.net.

Étant donné le bon boulot qu’il a abattu durant l’été, j’ai noté son GSoC comme « réussi ». J’espère qu’il continuera à œuvrer dans les parages et à contribuer; il va essayer de prendre en charge des renommages en masse dont nous avons convenus ensemble. En effet, après pas mal de tergiversations, j’ai décidé que ce logiciel s’appellerait « Distro Tracker ».

Une fois ces changements de dernière minute réalisés, j’ai pour projet de réclamer « tracker.debian.org » auprès des administrateurs système Debian. Ce qui signifie qu’il sera déployé en parallèle du système de suivi des paquets actuellement utilisé, et ce au moins jusqu’à ce qu’il dispose de toutes les fonctionnalités de l’ancien.

Il devrait être beaucoup plus facile de se plonger dans la nouvelle base de code, je devrais donc faire sa promotion et inviter les gens à y contribuer… une manière d’y arriver pourrait être d’écrire de courts éléments de documentation sur « comment bien démarrer ».

Ce que j’ai commencé à faire en créant une page de wiki dédiée: http://wiki.debian.org/qa.debian.org/distro-tracker

Empaquetage divers

J’ai reçu deux REJECT de la part des ftpmasters ce mois-ci (un pour galette, l’autre pour dolibarr). J’ai pris soin de corriger les divers problèmes liés à galette, et le paquet a été rapidement accepté après coup. En ce qui concerne dolibarr, j’ai assisté le mainteneur amont sur divers problèmes, et obtenu qu’il les corrige. Cela a pris un peu plus de temps et le paquet est toujours dans NEW.

J’ai empaqueté WordPress 3.6, puis WordPress 3.6.1 (mise à jour de sécurité). python-django a également reçu de multiples mises à jour de sécurité ce mois-ci: je me suis occupé d’une ou deux de celles-ci, mais c’est Luke Faraone qui s’est occupé de la majorité de ces mises à jour (ainsi que des rétroportages vers Squeeze !).

J’ai empaqueté Publican 3.6.1 et poussé dh-linktree 0.4, afin de corriger une erreur de compilation depuis les sources introduite avec Perl 5.18.

Sur un plan plus anecdotique, j’ai également créé un rapport de bogue (n°721849) après avoir constaté toute l’énergie dépensée afin d’assurer que debian/rules ne contienne aucune mention de copyright incorrecte.

Merci

Rendez-vous au mois prochain pour un nouveau résumé de mes activités !

Ceci est une traduction de mon article My Free Software Activities in September 2013 contribuée par Weierstrass01.

Aucun commentaire pour le moment | Vous avez aimé ? Cliquez ici. | Ce blog utilise Flattr.

07 October, 2013 07:39AM by Raphaël Hertzog

September 26, 2013

Olivier Berger (pro)

Qu’est-ce que le Linked Data

Voici une traduction en français d’un court document introductif au Linked Data, originellement écrit par Luca Matteis :

http://www-public.telecom-sudparis.eu/~berger_o/linkeddatawhat/whatislinkeddata.html

Bonne lecture.

26 September, 2013 02:20PM by Olivier Berger

September 06, 2013

hackergotchi for

Vincent Bernat

Redondance avec ExaBGP

Plusieurs options sont disponibles pour redonder un service :

  • Le service est placé derrière un couple de répartiteurs de charge qui vont détecter toute défaillance. Il est alors nécessaire d’assurer la disponibilité de cette nouvelle couche.
  • Les nœuds fournissant le service peuvent reprendre l’IP d’un autre nœud s’il est considéré comme défaillant (IP failover) à l’aide de protocoles tels que VRRP1 ou CARP. Tous les nœuds doivent cependant se trouver dans le même sous-réseau IP.
  • Les clients peuvent demander à un tiers quels sont les nœuds disponibles. Ce tiers est le plus souvent le DNS : seuls les nœuds fonctionnels sont annoncés dans l’enregistrement DNS. Le délai de mise à jour peut être particulièrement long en raison du mécanisme de cache.

Le plus souvent, ces trois techniques sont utilisées ensemble : les serveurs sont placés derrière un couple de répartiteurs de charge assurant ainsi la redondance et la répartition des requêtes. Pour assurer leur redondance, ces répartiteurs utilisent VRRP. L’ensemble est répliqué dans un autre datacentre et un DNS « round-robin » est utilisé pour assurer redondance et répartition des datacentres.

Il existe une quatrième option similaire à l’utilisation de VRRP mais qui se base sur le routage dynamique et n’implique pas de réunir les services dans un même sous-réseau :

  • Les nœuds indiquent leur disponibilité à l’aide de BGP en annonçant les adresses IP qu’ils peuvent servir. Chaque adresse est pondérée de façon à répartir les IP parmi les serveurs.

Nous allons voir comment implémenter cette option à l’aide de ExaBGP, le couteau-suisse BGP, dans un labo basé sur KVM. Les sources de celui-ci sont disponibles sur GitHub. ExaBGP 3.2.5 est nécessaire à son bon fonctionnement.

Environnement

Voici l’environnement de départ :

Labo avec 3 nœuds web

Configuration de BGP

BGP est activé sur ER2 et ER3 afin d’échanger des routes avec des partenaires et des transitaires (R1 dans notre cas). L’implémentation utilisée est BIRD. Voici un fragment de sa configuration :

router id 1.1.1.2;

protocol static NETS { # ➊
  import all;
  export none;
  route 2001:db8::/40 reject;
}
protocol bgp R1 { # ➋
  import all;
  export where proto = "NETS";
  local as 64496;
  neighbor 2001:db8:1000::1 as 64511;
}
protocol bgp ER3 { # ➌
  import all;
  export all;
  next hop self;
  local as 64496;
  neighbor 2001:db8:1::3 as 64496;
}

En ➊, nous déclarons les routes que nous voulons exporter vers Internet. Celles-ci seront inconditionnellement annoncées. Ensuite, en ➋, R1 est déclaré comme voisin et nous lui envoyons la route définie précédemment. De plus, nous acceptons toutes les routes soumises par R1. En ➌, nous partageons toutes les informations de routage avec le routeur jumeau ER3, via iBGP.

Configuration d’OSPF

OSPF va permettre de distribuer les routes à l’intérieur de l’AS. Ce protocole est activé sur ER2, ER3, DR6, DR7 et DR8. À titre d’exemple, voici les fragments pertinents de la configuration de DR6 :

router id 1.1.1.6;
protocol kernel {
   persist;
   import none;
   export all;
}
protocol ospf INTERNAL {
  import all;
  export none;
  area 0.0.0.0 {
    networks {
      2001:db8:1::/64;
      2001:db8:6::/64;
    };
    interface "eth0";
    interface "eth1" { stub yes; };
  };
}

ER2 et ER3 injectent une route par défaut dans OSPF :

protocol static DEFAULT {
  import all;
  export none;
  route ::/0 via 2001:db8:1000::1;
}
filter default_route {
  if proto = "DEFAULT" then accept;
  reject;
}
protocol ospf INTERNAL {
  import all;
  export filter default_route;
  area 0.0.0.0 {
    networks {
      2001:db8:1::/64;
    };
    interface "eth1";
  };
}

Serveurs web

Les serveurs web disposent simplement d’une route par défaut statique vers le routeur le plus proche. À noter qu’ils sont chacuns dans un réseau IP distinct : il n’est alors pas possible de partager une IP avec VRRP2.

Pourquoi a-t’on placé ces serveurs sur des réseaux différents ? Ils peuvent être situés dans des datacentres différents ou le réseau peut être complétement routé jusqu’à la couche d’accès.

Voyons comment mettre en œuvre BGP pour redonder ces serveurs.

Redondance avec ExaBGP

ExaBGP est un outil pratique pour interfacer des scripts avec BGP. Ils peuvent alors recevoir et annoncer des routes. ExaBGP s’occupe de communiquer avec les routeurs. Les scripts lisent les routes reçues sur l’entrée standard et en envoient sur la sortie standard.

Vue d’ensemble

Voici ce que nous allons construire :

Utilisation d'ExaBGP pour publier des services web

  1. Trois adresses IP sont allouées : 2001:db8:30::1, 2001:db8:30::2 et 2001:db8:30::3. Elles sont distinctes des IP réelles des serveurs.

  2. Chaque nœud va annoncer toutes les IP aux serveurs de routes. Je reviens par la suite sur ces derniers.

  3. Chaque route annoncée contient une métrique qui permet d’aider les serveurs de routes à choisir le serveur destination. Les métriques sont choisies de façon à ce qu’en situation nominale, chaque IP est routée vers un serveur différent.

  4. Les serveurs de routes (qui ne sont pas des routeurs) annoncent ensuite les meilleures routes qu’ils ont apprises vers tous les routeurs du réseau, via BGP.

  5. Pour chaque adresse IP, chaque routeur a appris la destination à utiliser. Les routes appropriées sont installées dans les tables de routage.

Voici les métriques respectives pour les routes annoncées par W1, W2 et W3 quand le fonctionnement est nominal :

Route W1 W2 W3 Best Backup
2001:db8:30::1 102 101 100 W3 W2
2001:db8:30::2 101 100 102 W2 W1
2001:db8:30::3 100 102 101 W1 W3

Configuration d’ExaBGP

La configuration d’ExaBGP est très simple :

group rs {
  neighbor 2001:db8:1::4 {
    router-id 1.1.1.11;
    local-address 2001:db8:6::11;
    local-as 65001;
    peer-as 65002;
  }
  neighbor 2001:db8:8::5 {
    router-id 1.1.1.11;
    local-address 2001:db8:6::11;
    local-as 65001;
    peer-as 65002;
  }

  process watch-nginx {
      run /usr/bin/python /lab/healthcheck.py -s --config /lab/healthcheck-nginx.conf --start-ip 0;
  }
}

Le script a comme responsabilité de vérifier le bon fonctionnement du service et de publier les adresses IP vers les deux serveurs de routes. Il peut être lancé manuellement de façon à observer son fonctionnement :

$ python /lab/healthcheck.py --config /lab/healthcheck-nginx.conf --start-ip 0
INFO[healthcheck] send announces for UP state to ExaBGP
announce route 2001:db8:30::3/128 next-hop self med 100
announce route 2001:db8:30::2/128 next-hop self med 101
announce route 2001:db8:30::1/128 next-hop self med 102
[...]
WARNING[healthcheck] Check command was unsuccessful: 7
INFO[healthcheck] Output of check command:  curl: (7) Failed connect to ip6-localhost:80; Connection refused
WARNING[healthcheck] Check command was unsuccessful: 7
INFO[healthcheck] Output of check command:  curl: (7) Failed connect to ip6-localhost:80; Connection refused
WARNING[healthcheck] Check command was unsuccessful: 7
INFO[healthcheck] Output of check command:  curl: (7) Failed connect to ip6-localhost:80; Connection refused
INFO[healthcheck] send announces for DOWN state to ExaBGP
announce route 2001:db8:30::3/128 next-hop self med 1000
announce route 2001:db8:30::2/128 next-hop self med 1001
announce route 2001:db8:30::1/128 next-hop self med 1002

Lorsque le service devient indisponible, la situation est détectée par le script qui va réessayer plusieurs fois avant d’abandonner. Les adresses IP sont alors annoncées avec une métrique plus élevée et le service sera alors routé vers un autre nœud (celui qui publie 2001:db8:30::3/128 avec une métrique de 101).

Ce script fait désormais partie de ExaBGP.

Les serveurs de routes

Nous aurions pu connecter ExaBGP directement aux routeurs. Toutefois, si nous avions une vingtaine de routeurs et une dizaine de serveurs web, il faudrait maintenir environ 200 sessions. Les serveurs de routes ont trois rôles :

  1. Réduire le nombre de sessions BGP entre les équipements. Moins de configuration, moins d’erreurs.

  2. Éviter de modifier la configuration des routeurs à chaque ajout de service.

  3. Séparer les décisions de routage (prises par les serveurs de routes) du processus de routage (effectué par les routeurs).

Une question que l’on peut légitemement se poser est : « pourquoi ne pas utiliser OSPF ? ».

  • OSPF pourrait être activé sur chaque serveur web et les adresses publiées via ce protocole. Cependant, OSPF a plusieurs limitations : on ne peut pas ajouter des participants à l’infini, toutes les topologies ne sont pas possibles, il est difficile de filtrer les routes et une erreur de configuration peut facilement affecter l’ensemble du réseau. Ainsi, il est considéré comme souhaitable de limiter OSPF à des routeurs.

  • Les routes apprises par les serveurs de routes pourraient être injectées directement dans OSPF. Ce serait pratique au niveau de la configuration puisqu’il ne serait plus nécessaire de configurer les adjacences. Sur le papier, OSPF sait utiliser un champ « next-hop ». Toutefois, je n’ai trouvé aucun moyen d’injecter le champ correspondant de BGP dans celui-ci. Le BGP next-hop est résolu localement en utilisant les informations issues d’OSPF. Si le résultat est injecté dans OSPF, les routeurs envoient le trafic à destination des IP de service vers RS4.

Voyons comment configurer les serveurs de routes. RS4 utilise BIRD tandis que RS5 utilise Quagga. L’utilisation de deux implémentations différentes permet d’être résilient aux bugs qui peuvent affecter une implémentation.

Configuration de BIRD

Il y a deux parties dans la configuration de BGP : les sessions BGP avec les nœuds ExaBGP et celles avec les routeurs. Voici la configuration concernant cette dernière :

template bgp INFRABGP {
  export all;
  import none;
  local as 65002;
  rs client;
}
protocol bgp ER2 from INFRABGP {
  neighbor 2001:db8:1::2 as 65003;
}
protocol bgp ER3 from INFRABGP {
  neighbor 2001:db8:1::3 as 65003;
}
protocol bgp DR6 from INFRABGP {
  neighbor 2001:db8:1::6 as 65003;
}
protocol bgp DR7 from INFRABGP {
  neighbor 2001:db8:1::7 as 65003;
}
protocol bgp DR8 from INFRABGP {
  neighbor 2001:db8:1::8 as 65003;
}

Le numéro d’AS utilisé pour les serveurs de routes est 65002 tandis que 65003 est utilisé pour les routeurs (et 65001 pour les serveurs). Ces AS sont pris dans le lot des numéros réservés pour un usage privé par la RFC 6996.

Toutes les routes connues du serveur de routes sont exportées vers les routeurs mais aucune route n’est acceptée de ceux-ci.

Voyons la deuxième partie :

# Only import loopback IPs
filter only_loopbacks { # ➊
  if net ~ [ 2001:db8:30::/64{128,128} ] then accept;
  reject;
}

# General template for an EXABGP node
template bgp EXABGP {
  local as 65002;
  import filter only_loopbacks; # ➋
  export none;
  route limit 10; # ➌
  rs client;
  hold time 6; # ➍
  multihop 10;
}

protocol bgp W1 from EXABGP {
  neighbor 2001:db8:6::11 as 65001;
}
protocol bgp W2 from EXABGP {
  neighbor 2001:db8:7::12 as 65001;
}
protocol bgp W3 from EXABGP {
  neighbor 2001:db8:8::13 as 65001;
}

Pour assurer une bonne séparation des responsabilités, nous sommes un peu plus pointilleux. En combinant ➊ et ➋, seules les adresses IP de loopback incluses dans le bon sous-réseau sont acceptées. Aucun serveur ne doit pouvoir injecter des routes arbitraires dans notre réseau. Grâce à ➌, le nombre de routes qu’un même serveur peut annoncer est limité.

Avec ➍, nous réduisons le temps de détection d’indisponibilité (hold time) de 240 à 6 secondes. C’est particulièrement important pour être capable de réagir rapidement si un serveur devient indisponible.

Configuration de Quagga

La configuration de Quagga est un peu plus verbeuse mais strictement équivalente :

router bgp 65002 view EXABGP
 bgp router-id 1.1.1.5
 bgp log-neighbor-changes
 no bgp default ipv4-unicast

 neighbor R peer-group
 neighbor R remote-as 65003
 neighbor R ebgp-multihop 10

 neighbor EXABGP peer-group
 neighbor EXABGP remote-as 65001
 neighbor EXABGP ebgp-multihop 10
 neighbor EXABGP timers 2 6
!
 address-family ipv6

 neighbor R activate
 neighbor R soft-reconfiguration inbound
 neighbor R route-server-client
 neighbor R route-map R-IMPORT import
 neighbor R route-map R-EXPORT export
 neighbor 2001:db8:1::2 peer-group R
 neighbor 2001:db8:1::3 peer-group R
 neighbor 2001:db8:1::6 peer-group R
 neighbor 2001:db8:1::7 peer-group R
 neighbor 2001:db8:1::8 peer-group R

 neighbor EXABGP activate
 neighbor EXABGP soft-reconfiguration inbound
 neighbor EXABGP maximum-prefix 10
 neighbor EXABGP route-server-client
 neighbor EXABGP route-map RSCLIENT-IMPORT import
 neighbor EXABGP route-map RSCLIENT-EXPORT export
 neighbor 2001:db8:6::11 peer-group EXABGP
 neighbor 2001:db8:7::12 peer-group EXABGP
 neighbor 2001:db8:8::13 peer-group EXABGP

 exit-address-family
!
ipv6 prefix-list LOOPBACKS seq 5 permit 2001:db8:30::/64 ge 128 le 128
ipv6 prefix-list LOOPBACKS seq 10 deny any
!
route-map RSCLIENT-IMPORT deny 10
!
route-map RSCLIENT-EXPORT permit 10
  match ipv6 address prefix-list LOOPBACKS
!
route-map R-IMPORT permit 10
!
route-map R-EXPORT deny 10
!

L’utilisation d’une vue permet d’éviter d’installer les routes dans le noyau3.

Les routeurs

La configuration de BIRD sur les routeurs est assez simple :

# BGP with route servers
protocol bgp RS4 {
  import all;
  export none;
  local as 65003;
  neighbor 2001:db8:1::4 as 65002;
  gateway recursive;
}
protocol bgp RS5 {
  import all;
  export none;
  local as 65003;
  neighbor 2001:db8:8::5 as 65002;
  multihop 4;
  gateway recursive;
}

Il est important d’utiliser gateway recursive car la plupart du temps, le routeur ne peut pas atteindre la destination directement. Dans ce cas, par défaut, BIRD utilise l’adresse IP du routeur à l’origine de l’annonce (le serveur de routes).

Tests

Vérifions que tout fonctionne comme attendu. Voici ce que voit RS5 :

# show ipv6  bgp  
BGP table version is 0, local router ID is 1.1.1.5
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale, R Removed
Origin codes: i - IGP, e - EGP, ? - incomplete

   Network          Next Hop            Metric LocPrf Weight Path
*  2001:db8:30::1/128
                    2001:db8:6::11         102             0 65001 i
*>                  2001:db8:8::13         100             0 65001 i
*                   2001:db8:7::12         101             0 65001 i
*  2001:db8:30::2/128
                    2001:db8:6::11         101             0 65001 i
*                   2001:db8:8::13         102             0 65001 i
*>                  2001:db8:7::12         100             0 65001 i
*> 2001:db8:30::3/128
                    2001:db8:6::11         100             0 65001 i
*                   2001:db8:8::13         101             0 65001 i
*                   2001:db8:7::12         102             0 65001 i

Total number of prefixes 3

Par exemple, le trafic vers 2001:db8:30::2 doit être routé via 2001:db8:7::12 (qui est W2). Les autres IP sont affectées à W1 et W3.

RS4 voit exactement la même chose4 :

$ birdc6 show route 
BIRD 1.3.11 ready.
2001:db8:30::1/128 [W3 22:07 from 2001:db8:8::13] * (100/20) [AS65001i]
                   [W1 23:34 from 2001:db8:6::11] (100/20) [AS65001i]
                   [W2 22:07 from 2001:db8:7::12] (100/20) [AS65001i]
2001:db8:30::2/128 [W2 22:07 from 2001:db8:7::12] * (100/20) [AS65001i]
                   [W1 23:34 from 2001:db8:6::11] (100/20) [AS65001i]
                   [W3 22:07 from 2001:db8:8::13] (100/20) [AS65001i]
2001:db8:30::3/128 [W1 23:34 from 2001:db8:6::11] * (100/20) [AS65001i]
                   [W3 22:07 from 2001:db8:8::13] (100/20) [AS65001i]
                   [W2 22:07 from 2001:db8:7::12] (100/20) [AS65001i]

Voyons DR6 :

$ birdc6 show route
2001:db8:30::1/128 via fe80::5054:56ff:fe6e:98a6 on eth0 * (100/20) [AS65001i]
                   via fe80::5054:56ff:fe6e:98a6 on eth0 (100/20) [AS65001i]
2001:db8:30::2/128 via fe80::5054:60ff:fe02:3681 on eth0 * (100/20) [AS65001i]
                   via fe80::5054:60ff:fe02:3681 on eth0 (100/20) [AS65001i]
2001:db8:30::3/128 via 2001:db8:6::11 on eth1 * (100/10) [AS65001i]
                   via 2001:db8:6::11 on eth1 (100/10) [AS65001i]

Ainsi, 2001:db8:30::3 est bien routé vers W1 qui se trouve directement derrière DR6. Les deux autres IP sont envoyées vers une autre partie du réseau via les adresses apprises par OSPF.

Stoppons nginx sur W1. Quelques secondes plus tard, DR6 apprend de nouvelles routes :

$ birdc6 show route
2001:db8:30::1/128 via fe80::5054:56ff:fe6e:98a6 on eth0 * (100/20) [AS65001i]
                   via fe80::5054:56ff:fe6e:98a6 on eth0 (100/20) [AS65001i]
2001:db8:30::2/128 via fe80::5054:60ff:fe02:3681 on eth0 * (100/20) [AS65001i]
                   via fe80::5054:60ff:fe02:3681 on eth0 (100/20) [AS65001i]
2001:db8:30::3/128 via fe80::5054:56ff:fe6e:98a6 on eth0 * (100/20) [AS65001i]
                   via fe80::5054:56ff:fe6e:98a6 on eth0 (100/20) [AS65001i]

Démo

Voici une vidéo montrant un aperçu du lab en fonctionnement. Elle est également disponible au format Ogg Theora video).


  1. L’usage premier de VRRP est de fournir une passerelle hautement disponible pour un sous-réseau. Cette passerelle est assurée par un routeur virtuel qui est la représentation abstraite de plusieurs routeurs physiques. L’adresse IP virtuelle est détenue par le routeur maître. Un routeur esclave peut être promu maître en cas de défaillance de celui-ci. En pratique, VRRP peut aussi être utilisé pour redonder des services classiques. 

  2. Toutefois, il serait possible de déployer un couche L2 par dessus ce réseau en utilisant, par exemple, VXLAN

  3. Il m’a été indiqué sur les listes de diffusion de Quagga qu’une telle configuration était peu commune et qu’il était préférable de remplacer la vue par l’utilisation du paramètre --no_kernel pour invoquer bgpd

  4. La sortie de birdc6 peut parfois prêter à confusion. Je donne ici une version simplifiée. 

06 September, 2013 09:32AM by Vincent Bernat

August 26, 2013

Olivier Berger (perso)

Synchroniser la musique entre ordinateur (Gnu/Linux) et NAS de la Freebox Revolution

J'utilise git-annex pour synchroniser le partage sur le NAS de la FreeBox Revolution, de mes fichiers de musique numérisée (MP3, Ogg), de façon à pouvoir gérer la musique sur mon ordinateur, tout en permettant de la jouer sur la télévision du salon, via l'interface de la freebox. La même procédure doit marcher pour d'autres NAS/set top boxes.

Données du problème :

  • mettre à jour les fichiers depuis le PC (ligne de commande, interfaces graphiques, numérisation de nouveaux CDs, etc.)
  • avoir un backup sur un disque de sauvegarde (sur une machine différente de cd PC, en cas de fausse manip, ou du NAS, au cas où la freebox plante).
  • avoir les fichiers en clair dans l'arborescence du NAS, sous son répertoire prédéfini par la freebox
  • automatiser la synchronisation et les backups, autant que faire se peut

La procédure est la suivante :

  1. monter sur mon ordi, via CIFS, le disque de la freebox, qu'elle exporte via samba : c'est donc un montage ne supportant pas les liens symboliques : git-annex supporte heuresement le mode "direct" pour les remotes. Ce n'est donc pas une remote réseau, mais une remote locale, dans un répertoire de l'ordi. Appelons-le /mnt/freebox-server dans ce qui suit.
  2. initialiser un dossier de bibliothèque musicale comme étant un repo git-annex :

$ cd ~/Musique
$ git init
$ git annex init "mon ordi"

# ajout des fichiers musicaux

$ git annex add . $ git commit -m "initial"

$ cd /mnt/freebox-server/Musiques # on clone dans un sous-répertoire pour permettre de gérer des fichiers en dehors ce schéma sur la freebox $ git clone ~/Musique all $ cd all $ git annex init "freebox server"

$ cd ~/Musique $ git remote add freebox-server /mnt/freebox-server/Musiques/all # copie des fichiers : long $ git annex copy --to freebox-server $ git annex sync
$ cd /mnt/freebox-server/Musiques/all #$ git remote add laptop $ git annex sync

Normalement, à l'issue de tout cela, le contenu sur la freebox est synchronisé.

Ensuite, il ne reste qu'à ajouter une remote spéciale rsync pour les backups vers une autre machine, mais ça je vous laisse jouer avec git-annex pour voir comment faire ;)

26 August, 2013 09:12AM by obergix

August 10, 2013

Stéphane Blondon

DebConf sur la planète

Le terme DebConf est une abréviation pour Debian Conference. Ce sont des conférences annuelles qui se déroulent à chaque fois dans une ville différente. La DebConf13, conférence ayant le numéro 13 mais qui est la quatorzième parce qu’il y a eu une conférence numéro 0, commence bientôt (le matin du dimanche 11 août 2013) et […]

10 August, 2013 06:22AM by ascendances

June 24, 2013

Olivier Berger (pro)

Formation Algorithmique et Python pour les profs d’info en prépas scientifiques

Nous avons effectué deux sessions de formation sur l’algorithmique, Python et les bibliothèques Python scientifiques (pylab), la semaine dernière, à destination de futurs professeurs d’informatique de Classes Préparatoires aux Grandes Écoles (CPGE) scientifiques, dans le cadre du dispositif des formations LIESSE.

Cette formation s’inscrit dans l’objectif de former les nouveaux professeurs d’informatique, souvent issus d’autres matières, qui devront enseigner à la rentrée de septembre 2013 l’informatique auprès de tous les étudiants en Sup (nouveau programme).

Cette formation sur deux journées a été montée conjointement entre Télécom SudParis et l’ENSIIE.

Vous trouverez ci-dessous les transparents d’une partie de la formation (essentiellement le premier jour). Le reste correspond au contenu de Notebooks IPython portant sur l’informatique scientifique en Python avec Numpy, Scipy et Matplotlib, et est disponible en ligne (cf. les liens dans ce document PDF, vers des versions des notebooks à télécharger en ligne).

Télécharger : transparents (PDF – 1.6 Mo)

Une archive plus détaillée (avec exemples, codes source Org-Mode et Python, etc.) est également disponible : nous contacter si intéressés.

24 June, 2013 11:13AM by Olivier Berger

May 29, 2013

hackergotchi for Roland Mas

Roland Mas

Le joli mois de mai

Comme d'habitude quand je n'ai rien de vraiment fracassant à annoncer au monde ébahi, ce billet mensuel sera sous forme de trucs-en-vrac.

Premièrement : Raphaël et moi avons obtenu l'accord des éditions Eyrolles pour une libération (conditionnelle) du Cahier de l'Admin Debian dans sa version française. La version anglaise a déjà été libérée l'an dernier, mais le texte original reste pour l'instant sous copyright d'Eyrolles. Mais suite à d'âpres négociations, nous avons obtenu une rétrocession des droits, sous condition de l'assurance d'un certain nombre de ventes du livre. Donc nous avons lancé une campagne de financement, qui nous permettra de fournir cette assurance à Eyrolles, qui pourra en toute confiance lancer une nouvelle édition. Le livre sera bien entendu en librairies, mais les « préventes » par Ulule proposent des contreparties supplémentaires, et surtout elles contribuent à la libération du livre, ce qui permettra son évolution et sa maintenance collaborative. Nous vous encourageons donc chaleureusement à participer à cette campagne.

Deuxièmement : je note une fois de plus que la fin du monde-tel-qu'on-le-connaît, qui était annoncée pour hier, n'a pas eu lieu : au moins dans mon village, ce matin, les rues n'étaient pas à feu et à sang, ni envahies d'ogres mangeurs d'enfants. Ça fait deux fins du monde annoncées puis ratées en moins de six mois. Nous sommes tous des survivors.

Troisièmement : ça n'a rien à voir, mais il y a quand même quelque chose qui s'est fini. C'était il y a quelques semaines et je n'ai pas eu l'occasion d'en parler, mais des divergences sur l'orientation du groupe ont fait que les chemins d'Eleven et de votre serviteur se séparent. Donc je me retrouve en recherche d'un groupe de rock, et Eleven se trouve en recherche d'un batteur. Comme on n'est pas des stars capricieuses, les « divergences » ne sont pas un euphémisme pour des portes qui claquent et des rancunes inextinguibles, désolé de vous décevoir, on s'est juste arrêtés de jouer ensemble. Je vous tiens au courant si (et quand) je trouve un nouveau groupe.

Je crois que c'est tout pour ce mois-ci. La suite… un autre jour.

29 May, 2013 10:00PM

May 02, 2013

Stéphane Blondon

Évolution du nombre de messages sur debian-l10n-fr et debian-users-fr avec pychart

Pychart est une bibliothèque Python permettant des graphiques directement en python. Un paquet Debian est disponible (nommé python-pychart) avec la dernière version 1.39 (qui date de 2006). Debian utilise massivement des listes de diffusion pour la collaboration de ses membres. Parmi les nombreuses listes existantes, trois sont francophones : debian-users-fr, dédiée aux questions des utilisateurs ; debian-l10n-fr, […]

02 May, 2013 08:34AM by ascendances

March 29, 2013

Olivier Berger (pro)

Managing Python code with UTF-8 (french chars) in org-mode + babel + minted for LaTeX export

The goal of this article is to illustrate how to manage Python code which includes comments in UTF-8 characters inside a latin-1 source org-mode for LaTeX export.

Note that I’ve pasted in wordpress the HTML generated by org-mode, so I hope it isn’t broken too much.

My typical use case is a french lecture on Python where the text is written in french, as well as some of the code comments and examples

We’ll use org-mode’s babel module to include and manage the Python
examples. The goal is to write the source of the Python programs
directly in the same org source as the class book’s text, and to extract them into a subdir (with the “tangle” feature), so that they can be shipped to the students to experiment with.

The minted LaTeX environment is used, for babel, to make the Python syntax highlighting.

1.1 Issues

  • The source org-mode is in latin-1 so that it compiles with pdflatex
  • The examples source-code will be in UTF-8 so that Python 2.7 executes them well on a modern Linux desktop
  • Minted relies on pygmentize wich doesn’t seem to handle UTF-8 so well

1.2 Solution

We’ll show how to “patch” minted’s use of pygmentize to take advantage
of its conversion capacity to convert the Python sources from UTF-8 to
latin-1 at document rendering time (LaTeX compilation).

It’s a hack, but works.

The current document’s source shows how this works

1.2.1 Customization

The org document should contain the following headers :

#+LANGUAGE:  fr
#+LaTeX_HEADER: \usepackage[latin1]{inputenc}
#+LaTeX_HEADER: \usepackage[french]{babel}
#+LaTeX_HEADER: \usepackage{color}\usepackage{minted}

and the footers :

# Local Variables:
# coding: latin-1
# org-src-preserve-indentation: true
# tab-width: 4
# End:

Also note that pdflatex should use the -shell-escape option necessary for minted

Now, the document should also include the following “patch” for minted :

#+LATEX_HEADER: \makeatletter
#+LATEX_HEADER: \renewcommand\minted@pygmentize[2][\jobname.pyg]{
#+LATEX_HEADER:   \def\minted@cmd{pygmentize -l #2 -f latex -F tokenmerge
#+LATEX_HEADER:     \minted@opt{gobble} \minted@opt{texcl} \minted@opt{mathescape}
#+LATEX_HEADER:     \minted@opt{startinline} \minted@opt{funcnamehighlighting}
#+LATEX_HEADER:     \minted@opt{linenos} -P "verboptions=\minted@opt{extra}"
#+LATEX_HEADER:     -O encoding=UTF-8,outencoding=iso-8859-1 -o \jobname.out.pyg #1}
#+LATEX_HEADER:   \immediate\write18{\minted@cmd}
#+LATEX_HEADER:   % For debugging, uncomment:
#+LATEX_HEADER:   %\immediate\typeout{\minted@cmd}
#+LATEX_HEADER:   \ifthenelse{\equal{\minted@opt@bgcolor}{}}
#+LATEX_HEADER:    {}
#+LATEX_HEADER:    {\begin{minted@colorbg}{\minted@opt@bgcolor}}
#+LATEX_HEADER:   \input{\jobname.out.pyg}
#+LATEX_HEADER:   \ifthenelse{\equal{\minted@opt@bgcolor}{}}
#+LATEX_HEADER:    {}
#+LATEX_HEADER:    {\end{minted@colorbg}}
#+LATEX_HEADER:   \DeleteFile{\jobname.out.pyg}}
#+LATEX_HEADER: \makeatother

The important change is the addition of the -O encoding=UTF-8,outencoding=iso-8859-1 option of pygmentize, that will convert the UTF-8 source code to latin-1.

Hopefully most of the characters will convert fine, for a document written in french.

2 Examples

2.1 Basic Python

This is a generic verbatim example, which doesn’t use babel / minted.

$ python
Python 2.7.3 (default, Jan  2 2013, 16:53:07) 
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print "Hello, world!"
Hello, world!
>>>

2.2 Python source code for french speakers

Here, we first include the source code, so that it can be exported to
an examples/ subdir, with the following (note that the #+ BEGIN_src / #+ END_src should be changed to get rid of the space
character between + and BEGIN / END, and that the :shebang and following text should be on the BEGIN_SRC line… I seem to have not quoted
these properly in this document):

#+name: helloworld
#+ BEGIN_src python :tangle examples/helloworld.py :noweb yes \\
:shebang #!/usr/bin/python :padline no :exports none
# -*- coding: utf-8 -*-

# Ceci est un exemple d'affichage d'une chaîne accentuée

name = raw_input("Quel est vôtre nom ? ")

print "J'espère que ça va bien aujourd'hui", name
#+ END_src

Editing it with “C-c ‘” will open an UTF-8 buffer, so hopefully, this will be consistent with the utf-8 coding system declared on the second line.

The regeneration of the examples/helloworld.py file is made with C-c C-v t (babel “tangling”).

Note that we don’t add the #!/usr/bin/python first line in the source, as we want it to be added by the tangling process (which will also make the script executable).

Once this is done, the script may be run :

$ python examples/helloworld.py 
Quel est vôtre nom ? François
J'espère que ça va bien aujourd'hui, cher François

Now, to add the colorized rendering in the lecture book, we do (here again, remove the spaces):

# +BEGIN_latex
\inputminted{python}{examples/helloworld.py}
# +END_latex

And here it is, rendered by minted:

# -*- coding: utf-8 -*-

# Ceci est un exemple d'affichage d'une chaîne accentuée

name = raw_input("Quel est vôtre nom ? ")

print "J'espère que ça va bien aujourd'hui, cher", name

Here are links to : the source, the PDF result, and the generated Python program.

29 March, 2013 10:44AM by Olivier Berger

March 18, 2013

Conférence “L’économie du logiciel libre et la percée d’OpenStack dans le cloud” le 27/03 à Évry

L’association Minet organise une conférence le 27/03 dans les locaux de Télécom SudParis et Télécom École de Management à Évry, qui promet d’être intéressante.

Elle portera à la fois sur l’économie du logiciel libre et sur l’essort d’OpenStack dans le cloud.

N’hésitez pas à venir nombreux sur le campus pour écouter les interventions de Jonathan Le Lous, Julien Brichard et Raphaël Ferreira, et rencontrer votre serviteur ;-)

Plus de détails sur le site de Minet.

18 March, 2013 12:49PM by Olivier Berger

January 12, 2013

Stéphane Blondon

Déterminer quelle est la meilleure distribution grâce à Python et PIL

N’avez-vous jamais discuté des mérites de telle ou telle distribution Linux (ou BSD) avec d’autres personnes (chacun essayant de démontrer que celle qu’il utilise au quotidien est la meilleure) ? Grâce à cet article, vous n’aurez toujours pas La réponse mais vous aurez une réponse indiscutable : il s’agit de la jouer aux cartes. Les cartes sont […]

12 January, 2013 09:39AM by ascendances

October 25, 2012

Processus de traduction au sein de debian-l10n-fr

L’équipe debian-l0n-fr est l’équipe de francisation des fichiers spécifiques à Debian. Il en existe pour de nombreuses autres langues (de l’afrikaan au zoulou en passant par le népalais), certaines étant bien plus complètes que d’autres. Les équipes de traduction Debian ne s’occupent pas des projets qui ont déjà leur propre équipe de traduction comme GNOME, […]

25 October, 2012 08:56PM by ascendances

August 01, 2012

hackergotchi for

Grégory Colpart

Astuces pour gérer un répertoire ext3 bien rempli

Disclaimer : Valable pour de l’ext3 sous Linux (utilisable sur d’autres filesystems ou Unix à vos disques et péril)

Vous avez un répertoire rempli à rabord de nombreux fichiers, et il est impossible de connaître sa taille, le lister ou l’effacer sans impact sur la production ?

Voici quelques astuces :

- Avec un “ls -ld” sur le répertoire, vous pouvez estimer grossièrement le nombre de fichiers présents dans un répertoire. En effet, un répertoire vide fait 4 Ko (je simplifie). Et plus il contient de fichiers, plus sa taille va augmenter. Par exemple, un répertoire contenant 2 millions de fichiers pourra faire une taille de 100 Mo (je parle bien de la taille du répertoire et non pas de la taille du contenu). Attention, c’est variable selon la longueur des noms des fichiers. Et prendre garde aussi que ce n’est pas dynamique : si vous videz complètement un répertoire bien rempli, il gardera sa taille volumineuse (d’où l’intérêt de recréer un répertoire qui s’est rempli “par erreur”).

- Pour lister les fichiers du répertoire, utiliser la commande “ls” n’est pas une bonne idée car elle accède à toute la liste avant de l’afficher. Voici comment lister 10 fichiers sans attendre :

perl -le 'opendir DIR, "." or die; $i=0; while ($i<10) { my $f = readdir DIR; print $f; $i++; }; closedir DIR'

Grâce à leurs noms, vous pouvez désormais examiner (ouvrir, connaître sa taille) un échantillon de fichiers contenus dans votre fameux répertoire.

Pour lister l’ensemble des fichiers sans attendre comme “ls” :

perl -le 'opendir DIR, "." or die; print while $_ = readdir DIR; closedir DIR'

- Pour effacer le contenu du répertoire en limitant l’impact sur la production, oubliez “rm -rf” qui va saturer vos I/O disque mais préférez le faire par blocs de N fichiers avec des pauses de quelques secondes ! Voici une commande “conviviale” qui va faire cela par blocs de 300 fichiers avec des pauses de 5 secondes :

perl -le 'use POSIX qw/strftime/; opendir DIR, "." or die; $i=0; printf "DELETING IN PROGRESS...";
 while (my $f = readdir DIR) {unlink $f;  $i++;
 if ($i % 300 == 0) {printf "...$i files deleted\n".strftime("%Y-%m-%d %H:%M:%S",localtime)." : PAUSE...";
 $| = 1; sleep 5 ; printf "...DONE. "; printf "DELETING IN PROGRESS..."}}; printf "...DONE"; closedir DIR'

EDIT : en complément, on n’oubliera pas que l’on peut aussi gérer la priorité d’ordonnancement des I/O avec la commande ionice
(merci à Sylvain B. de l’avoir souligné)

01 August, 2012 02:24AM by Gregory Colpart

June 03, 2012

hackergotchi for

Aurélien Jarno

How multiarch adds new RC bugs…


# dpkg --add-architecture kfreebsd-amd64
# dpkg -i libc0.1-dev_2.13-32_kfreebsd-amd64.deb
Selecting previously unselected package libc0.1-dev.
(Reading database ... 446113 files and directories currently installed.)
Unpacking libc0.1-dev (from libc0.1-dev_2.13-32_kfreebsd-amd64.deb) ...
dpkg: error processing libc0.1-dev_2.13-32_kfreebsd-amd64.deb (--install):
trying to overwrite '/usr/include/_G_config.h', which is also in package libc6-dev 2.13-32
dpkg-deb: error: subprocess paste was killed by signal (Broken pipe)
Errors were encountered while processing:
libc0.1-dev_2.13-32_kfreebsd-amd64.deb

Before multiarch the bug was not existing, and of course none of libc6-dev and libc0.1-dev are marked as Multi-Arch: something. People wanting to delay the release of Wheezy, I am sure you can find much more RC bugs like that.

03 June, 2012 11:13AM by aurel32

May 10, 2012

Olivier Berger (pro)

Appel à commentaires sur ADMS.F/OSS 0.3 : vocabulaire pour les méta-données décrivant les logiciels dans les forges

Je reprends ici une news que je viens de publier sur : Un vocabulaire pour les méta-données décrivant les logiciels paru pour appel à commentaires

La période de appel à commentaires du vocabulaire de méta-données ADMS.F/OSS v0.3 vient de commencer.

ADMS.F/OSS est un vocabulaire de méta-données permettant de décrire des logiciels libres ou open-source (F/OSS), qui doit permettre d’explorer, trouver et tirer des liens facilement vers des logiciels sur le Web. Les spécifications visent à réutiliser au maximum des spécifications existantes telles que DOAP, ADMS, et le Trove software map. La version actuelle de ADMS.F/OSS (version 0.3) a été élaborée entre janvier et avril par un groupe de travail qui comptait 45 personnes issuesde 14 pays différents et est proposée aux commentaires du public jusqu’au 2 juin.

Pour plus de détails, merci de vous référer à l’annonce complète en anglais : Vocabulary for software metadata released for public review

Si vous développez ou administrez des forges ou des catalogues de logiciels, alors, ceci vous concerne peut-être.

Merci d’avance.

P.S.: en ce qui me concerne, mes commentaires sur ce draft sont sur : https://joinup.ec.europa.eu/asset/adms_foss/topic/public-comments-admsf/oss-v03#comment-11982

10 May, 2012 03:45PM by Olivier Berger

March 18, 2012

hackergotchi for

Aurélien Jarno

10 years ago…

Date: Mon, 18 Mar 2002 18:22:10 +0000
From: James Troup <troup@samosa.debian.org>
To: “Aurelien Jarno” <aurelien@aurel32.net>
Cc: da-manager@debian.org
Subject: New Debian maintainer Aurelien Jarno

[ This is a long (automatically-generated) mail, but it contains
important information, please read it all carefully. ]

Dear Aurelien Jarno!

An account has been created for you on developer-accessible machines with username ‘aurel32′. The password for this account can be found encrypted with your PGP or GPG key and appended to this message. A list of machines available to Debian developers can be found at <URL:http://db.debian.org/machines.cgi>. Please take a minute now to familiarize yourself with the Debian Machine Usage Policy, available at <URL:http://www.debian.org/devel/dmup>

You have been subscribed to the debian-private mailing list as <aurel32@debian.org>. Please respect the privacy of that list and don’t forward mail from it elsewhere. E-mail to <aurel32@debian.org> will be forwarded to <aurelien@aurel32.net>. To change this, please see <URL:http://db.debian.org/forward.html> Also, please subscribe to debian-devel-announce, if you haven’t done so already.

We strongly suggest that you use your aurel32@debian.org address for the maintainer field in your packages, because that one will be valid as long as you are a Debian developer, even if you change jobs, leave university or change Internet Service providers. If you do so, please add that address to your PGP/GPG key(s) (using `gpg –edit-key “YOUR USER ID”‘) and send it to the keyring server at keyring.debian.org with `gpg –keyserver keyring.debian.org –send-keys “YOUR USER ID”‘.

You can find more information useful to developers at <URL:http://www.debian.org/devel/> (in particular, see the subsection titled “Debian Developer’s reference”).

We suggest that you subscribe to debian-mentors@lists.debian.org. This list is for new maintainers who seek help with initial packaging and other developer-related issues. Those who prefer one-on-one help can also post to the list, and an experienced developer may volunteer to help you. You can get online help on IRC, too, if you join the channel #debian-devel on irc.debian.org. Take a look at the support section on www.debian.org in order to find out more information.

You should have read these documents before working on your packages.

o The Debian Social Contract
<URL:http://www.debian.org/social_contract.html>

o The Debian Policy Manual
<URL:http://www.debian.org/doc/debian-policy/>

If you have some spare time and want to contribute it to Debian you may wish to take a look at the “Work-Needing and Prospective Packages for Debian GNU/Linux” also known as WNPP that can be found at <URL:http://www.debian.org/devel/wnpp/>

If you plan to make a Debian package from a not yet packaged piece of software you *must* announce your intention on the debian-devel mailing list to make sure nobody else is working on them.

The machine ftp-master.debian.org is our main archive server. Every uploaded package finds it’s way there (except for Packages covered by US crypto laws which go to non-us.debian.org) eventually. master.debian.org is the home of our bug tracking system. Project web pages and CVS archives are hosted on klecker.debian.org (aka cvs/www.debian.org), klecker is also our general shell server. Web pages should be placed in public_html on klecker and refered to by http://people.debian.org/~aurel32

You should use ssh to log into the machines instead of regular telnet or rlogin. Our LDAP directory is able to share ssh RSA keys among machines, please see <URL:http://db.debian.org/doc-mail.html> Otherwise when you first login a ~/.ssh directory will be created with the appropriate permissions. Please be aware of the security implications of using RSA authentication and ssh agents.

Finally, please take a minute to visit <URL:http://db.debian.org/>.
Login using the password information appended to this email, and update your personal information. The information is used to maintain your accounts on various Debian machines, and also to allow other developers and general users to find out more about you. Many of the fields are only visible to other registered Debian developers. This is also the only way to change your password. The passwd program does not yet work.

Welcome to the project!


The Debian New Maintainer Team

18 March, 2012 07:52PM by aurel32

August 18, 2010

hackergotchi for

Grégory Colpart

Mon compte-rendu de DebConf 10 à New York

DebConf est la conférence annuelle des développeurs du projet Debian. Cela permet aux développeurs et contributeurs de Debian d’assister à des présentations techniques, sociales et politiques, mais aussi de se rencontrer et travailler ensemble. Cette année, la 11e DebConf s’est tenue à New York du 1er au 7 août. Evolix a sponsorisé cette conférence et j’étais donc sur place, voici mon résumé de cette semaine.

Premiers pas plutôt festifs le vendredi soir avec le SysAdmin Day dans un bar à Manhattan puis direction Brooklyn pour une Debian Party organisée par NYC Resistor, un collectif local de hackers en électronique à l’origine de MakerBot, une imprimante 3D Open Source. Samedi c’est l’arrivée à Columbia University, l’université américaine qui accueille la DebConf 10. Une bonne partie des participants est hébergée sur le campus universitaire, dans des chambres avec accès haut-débit et une cafétéria à volonté.

C’est donc le dimanche 1er août que commence la DebConf avec des présentations orientées grand public pour cette première journée appelée le “Debian Day”. Un grand message de bienvenue pour un public plus large en ce premier jour, puis enchaînement des présentations. J’ai tout d’abord assisté à une présentation sur le sysadmin par François Marier qui a livré toutes ses astuces et une série de packages intéressants (unattended-upgrades, safe-rm, etckeeper, fcheck, fwknop, etc.). J’ai d’ailleurs pu échanger par la suite avec lui d’autres informations, sachant qu’il travaille dans une boîte similaire à Evolix : Catalyst située en Nouvelle-Zélande ! J’ai ensuite assisté à la présentation de Stefano Zacchiroli, l’actuel leader Debian, qui encourage fortement les développeurs à réaliser des NMU (Non Maintainer Upload), c’est-à-dire la publication d’un package par un autre développeur que celui responsable officiellement. J’ai ensuite poursuivi avec la présentation du Google Summer of Code 2010 de Debian : une présentation générale puis plusieurs “étudiants” expliquent leur projet en cours : Debian-Installer pour OpenMoko, GUI pour aptitude en QT, etc. D’autres présentations ont ensuite suivies, mais j’ai plutôt été découvrir le “hacklab” : une pièce pourvue de multiprises, switches et points d’accès afin de permettre à plusieurs dizaines de personnes de travailler/hacker. Le “Debian Day” a été un franc succès avec plusieurs centaines de participants. En soirée, c’est l’heure du coup d’envoi “officiel” de la DebConf par Gabriella Coleman, l’une des organisatrices de la DebConf 10, qui présente avec humour la semaine à venir, avec un petit retour en images sur les éditions précédentes.

Deuxième jour, on a le droit à un Bits from DPL en direct de la part de Stefano Zacchiroli (au lieu du traditionnel mail). Ensuite, il y a de nombreuses présentations. Durant DebConf, il y en aura plus de 100 au total, réparties dans 3 salles : Davis (avec vidéo), 414 Schapiro et Interschool (avec vidéo). Le choix est parfois difficile ! Pour ma part, j’ai assisté en fin de matinée à la présentation de la structure américaine à but non lucractif SPI : c’est elle qui gère les droits de la marque Debian, mais pas seulement : OpenOffice.org, Drupal, PostgreSQL, Alfresco, etc. de nombreux projets de logiciels libres utilisent cette structure légale ! Dans l’après-midi, c’est Mark Shuttleworth, fondateur d’Ubuntu et CEO de Canonical, qui nous présente le travail réalisé pour améliorer l’interface graphique des netbooks, notamment par l’intermédiaire du projet Ayatana. Puis, Jorge Castro, responsable chez Canonical des relations avec les développeurs extérieurs, parle de la collaboration entre Ubuntu et Debian. On notera que toute une équipe de Canonical est venue à DebConf et que les relations avec Debian semblent devenir plus sereines. Le soir venu, c’est l’heure de Wine&Cheese, un évènement devenu incontournable pour une DebConf : imaginez des centaines de fromages et alcools venus du monde entier (Italie, Allemagne, France, Mexique, Brésil, USA, Taïwan, Pologne, Kazhastan, Espagne, Nouvelle-Zélande, Corse, Vénézuela, Hollande, Marseille, Irlande, Angleterre, Japon, etc. etc.) et plus d’une centaine de développeurs Debian lâchés dessus pendant des heures… le résultat est… indescriptible ! Pour ma part, j’avais apporté un rosé Bandol, des bières La Cagole, du Banon et de la Tapenade… qui n’ont pas fait long feu.

Troisième jour et l’on débute par un talk d’Eben Moglen, avocat de la FSF, qui rappelle les dangers du Cloud Computing comme la gestion des données privées. Sa réponse : “Chacun devrait avoir un serveur chez soi” et il évoque la FreedomBox, une boi-boîte que tout le monde aurait chez soi pour faire office de petit serveur avec les fonctionnalités classiques (web, messagerie, VoIP). Cette idée rencontre un certain enthousiasme et plusieurs réfléchissent déjà à la réalisation de cette idée ! J’ai ensuite suivi une succession de présentations sur le thème de l’entreprise. On a parlé du déploiement de machines avec le logiciel Puppet, de l’installation automatisée de Debian avec FAI et Gosa, notamment présentée par Mickaël Bank, un développeur allemand très actif dans Debian. On a également des témoignages très intéressants : Russ Allbery, administrateur système et réseau à l’université de Standford en Californie, explique quels sont les arguments en faveur de Debian en entreprise et en profite pour présenter la gestion de Debian à Standford ; Faidon Liambotis, sysadmin chez GRNET (un opérateur public grec), présente leur utilisation de Debian mais aussi leurs choix en terme de déploiement (Puppet/FAI) ou de virtualisation (KVM/Ganeti). Pour terminer la journée, Guido Trotter de chez Google, nous parle des fonctionnalités réseau intéressantes sous Linux (VLAN, tunnels, routing, etc.). Une journée riche en idées et en informations ! En soirée, nous avons visualisé le film Open Source Sita Sings the Blues et Nina Paley nous a expliqué son choix d’une licence libre pour son film.

Le quatrième jour, c’est le Day Trip. Il s’agit classiquement d’une journée consacrée à des activités touristiques extérieures. Nous avons été visiter l’église Trinity Church à Manhattan où le drame du 11 septembre 2001 a mis un superbe orgue hors d’usage, remplacé temporairement par un orgue électronique “Powered by Linux”… qui a finalement été conservé en raison de sa qualité. Keith Packard, l’un des gourous de X.org employé chez Intel, a joué quelques minutes sur cet orgue. Ensuite, direction la plage de Coney Island. Puis un match de baseball où Stefano Zacchiroli lancera la première balle du match.

Cinquième jour, on reprend avec un BoF (un BoF=Birds of a Feather est une discussion informelle de groupe) sur la virtualisation où plusieurs personnes témoignent de leurs expériences et connaissances sur le sujet. Pas mal d’informations intéressantes, notamment sur le couple Ganeti/KVM pas mal mis en avant par Iustin Pop, l’un des développeurs de Ganeti employé chez Google. J’y apprends notamment que KVM gère une notion de mémoire partagée et ainsi démarrer une 2e machine virtuelle avec un même OS ne consommerait pas de mémoire supplémentaire sur le système hôte ! Suite des présentations, notamment une portant sur DebConf 12 qui pourrait peut-être se dérouler au Brésil. Et fin de la matinée avec François Marier qui présente le projet Libravatar permettant d’offrir une alternative à Gravatar, l’outil centralisé de gestion des avatars. Ses idées sont de se baser sur les DNS pour répartir les avatars pour chaque noms de domaine. Il a déjà commencé à développer une application en Django pour gérer cela. Suite de la journée avec un BoF sur Lintian (outil de vérification de la conformité des packages Debian) géré par Russ Allbery. Puis j’ai assisté à une présentation de Guido Günther qui a expliqué comment gérer son packaging avec Git et notamment git-buildpackage (très intéressant pour moi car je gère déjà mes packages Debian comme ça). Ensuite, petite pause sportive, car une dizaine de développeurs Debian a été participé à un cross de 5 kms dans le Bronx, avec des résultats honorables !

Sixième jour, on débute par Bits from Release Team qui déclare en direct que Squeeze, la prochaine version stable, est désormais freezée ! Un scoop à DebConf ! C’est ensuite Stefano Zacchiroli qui nous présente son travail en cours sur une amélioration de la gestion des dépendances, non seulement pour Debian mais aussi pour les autres distributions : plus de détails sur le site du projet Mancoosi. C’est ensuite la traditionnelle photo de groupe. En début d’après-midi, Margarita Manterola dresse un constat très lucide de l’état de Debian avec son talk Making Debian Rule, again. Puis en fin d’après-midi, c’est un BoF très apprécié mené par Joey Hess sur CUT (Constantly Usable Testing) qui explore les possibilités d’avoir une distribution Testing utilisable en permanence ! Le soir venu, c’est un BoF sur l’utilisation d’OpenPGP et la classique Keysigning Party qui a regroupé plusieurs dizaines de participants.

Septième et dernier jour, encore de nombreuses présentations. J’ai notamment assisté à celle de Philippe Kern, membre de la Release Team, qui a parlé du management de la version stable et de volatile. On notera par exemple qu’on peut désormais corriger des bugs en priorité “Important” dans les points de Release. La suite ce sont des fameux Lightnings Talks, une dizaine de présentations très courtes : une qui suggère d’arrêter complètement d’utiliser les mots de passe, une autre sur le logiciel runit, une autre sur les éclairs (lightnings !) ou encore l’historique en photos des Wine&Cheese Party ! Fun et instructif. Puis c’est l’heure de la conférence de clôture, où l’on remet des prix à ceux qui ont corrigé le plus de bugs mais surtout tous les volontaires sont vivement remerciés et j’en profite pour adresser une nouvelle fois mes remerciements à :
- L’équipe qui a organisé cette DebConf 10 : un travail impressionnant pour un résultat professionnel et communautaire à la fois : on frôle la perfection !
- L’équipe vidéo qui a fait un travail génial et vous pouvez ainsi retrouver l’ensemble des talks en vidéo,
- Les centaines de personnes sympas et passionnées qui contribuent à faire de Debian une distribution de grande qualité… et qui sait évoluer, la preuve avec les sujets abordés lors de cette DebConf !

Petite conclusion de cette semaine intensive, comme vous avez pu le lire : j’ai pu acquérir de nombreuses informations et faire le plein de nouvelles idées, mais aussi avoir des contacts réels avec d’autres développeurs et comprendre encore mieux le fonctionnement “social” de Debian. C’est donc très positif et cela va me permettre d’améliorer mon travail quotidien au sein d’Evolix, mais aussi réfléchir à d’autres projets et me motiver pour contribuer davantage à Debian. Debian rules !

18 August, 2010 11:52AM by Gregory Colpart

January 24, 2010

Autres exemples de migration Etch-&gt;Lenny [1]

La fin du support officiel de Debian Etch approchant, il est grand temps de migrer vers Lenny pour les machines pas encore à jour. Après un premier exemple de migration Debian Etch->Lenny, je poursuis la série avec des informations tirées de plusieurs migrations récentes sur des serveurs en production.

Je ne rappellerais pas toutes les précautions nécessaires (tests préalables, sauvegardes, désactivations des services, etc.) ni la classique question  sur  “quand faut-il migrer ?”, vous trouverez tout cela dans mes exemples précédents. Je rappelle simplement l’idée de base : prendre les précieuses Release Notes, mettre à jour le fichier sources.list, puis exécuter les commandes aptitude update && aptitude upgradex, puis mettre-à-jour les services les plus critiques via aptitude install <PACKAGE>, et enfin aptitude dist-upgrade && aptitude dist-upgrade (répéter dist-upgrade est souvent nécessaire).

Passons désormais aux différentes remarques sur ces migrations :

- PostgreSQL : on passe de la version 8.1 à 8.3. Notez qu’il s’agit de paquets différents, il est donc possible de garder la version 8.1 en Etch, et d’installer en parallèle la version 8.3, afin de faciliter encore plus la migration. Pour migrer les données, on réalisera un dump avec pg_dumpall qui sera réinjecté dans la nouvelle base. On pourra ensuite adapter le port dans postgresql.conf pour passer la version 8.3 en production.

- phpPgAdmin : avec PostgreSQL 8.3, on ne peut plus se connecter à la table template1 : c’est le comportement par défaut de phpPgAdmin, qu’on devra donc modifier en mettant postgres à la place (pour la variable $conf['servers'][0]['defaultdb'] dans le fichier config.inc.php)

- Apache : la configuration de l’alias /icons/ est déplacé dans le fichier mods-available/alias.conf, il peut donc faire doublon avec la déclaration dans apache2.conf, ce qui sera signalé via le warning suivant : [warn] The Alias directive in /etc/apache2/apache2.conf at line 240 will probably never match because it overlaps an earlier Alias. Commenter les directives dans le fichier apache2.conf résoudra ce petit soucis.

- OpenLDAP : on passe d’une version 2.3 à 2.4, mais le plus marquant pour la migration est que cela force le processus à tourner avec un utilisateur/groupe dédié. Pour diverses raisons (dist-upgrade interrompu par exemple), on pourra rencontrer des soucis plus ou moins alarmants. Ainsi, j’ai pu rencontrer cette erreur :
bdb(dc=example,dc=com): PANIC: fatal region error detected; run recovery
bdb_db_open: database “dc=example,dc=com” cannot be opened, err -30978. Restore from backup!
backend_startup_one: bi_db_open failed! (-30978)
slap_startup failed
On veillera donc sur l’utilisateur/groupe propriétaire des fichiers dans le répertoire /var/lib/ldap et, au besoin, on ajustera : chown -R openldap:openldap /var/lib/ldap/
Mon conseil : mettre-à-jour le paquet slapd de façon spécifique avant le dist-upgrade

- Postfix : on passe de 2.3 à 2.5. On notera simplement la valeur par défaut de $smtp_line_length_limit characters qui passe à 990, ce qui coupe les lignes trop longues pour se conformer au standard SMTP. Si cela posait problème, on pourrait revenir à l’ancien comportement en positionnant smtp_line_length_limit=0

- SpamAssassin : l’utilisant en stockant la configuration des utilisateurs dans un annuaire LDAP, le daemon spamd s’est mis à râler : cannot use –ldap-config without -u
Le problème sera résolu en ajoutant l’option -u nobody, ce qui fera tourner spamd en tant que nobody (ce qui n’est pas une mauvaise chose, au contraire).

- Amavis : apparemment, lors de la détection d’un virus, le code retourné n’est plus 2.7.1 mais 2.7.0 : 2.7.0 Ok, discarded, id=13735-07 – VIRUS: Eicar-Test-Signature
Rien de bien grave, mais cela a nécessité d’adapter un plugin Nagios pour qu’il attende le bon code de retour.

- Courier-imapd-ssl : après une mise-à-jour gardant mon fichier /etc/courier/imapd-ssl actuel, j’obtenai des erreurs avec certains clients IMAP :
couriertls: accept: error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number
En regardant de plus près, certaines directives changent dans ce fichier de configuration, et il est donc conseillé de repartir du fichier proposé par Lenny, et d’y apporter ses modifications (souvent, cela se limite à préciser le certificat).

- Horde : si vous utilisez une base de données pour stocker les paramètres ou autres, la paquet php-db (déjà en Recommends: en Etch) est d’autant plus nécessaire, sous peine d’obtenir l’erreur : PHP Fatal error:  _init() [<a href='function.require'>function.require</a>]: Failed opening required ‘DB.php’ (include_path=’/usr/share/horde3/lib:.:/usr/share/php:/usr/share/pear’) in /usr/share/horde3/lib/Horde/DataTree/sql.php on line 1877

- Sympa : on attaque là le cauchemard de mes migrations. À chaque fois, tellement de soucis majeurs et mineurs, que j’ai l’impression d’être le seul à utiliser ce paquet. Voici en vrac tous les soucis rencontrés : les accents dans les descriptions ont sautés (une sorte de double encodage) et cela a nécessité des corrections manuelles, la table logs_table doit être créée à la main (j’utilise Sympa avec PostgreSQL), et enfin une typo surprenante un “GROUP BY” à la place d’un “ORDER BY” (j’ai ouvert le bug #566252 à ce sujet).

- Asterisk : on passe de la version 1.2 à la version 1.4. Lors de la migration, j’ai constaté un bug étrange, le fichier modules.conf qui charge les modules additionnels a disparu. Du coup, sans lui, Asterisk ne charge pas les modules nécessaires (SIP, etc.). Il a donc fallu le restaurer.

- udev : le meilleur ami des sysadmins (ou pas). Si les migrations douloureuses Sarge->Etch sont loin derrière nous, il reste néanmoins quelques blagues. La dernière en date a été un renommage des interfaces réseau : eth0->eth1 et eth1->eth2. Classique mais étonnant, ce genre d’humour est sensé être dépassé grâce aux “persistent rules” qui nomment les interfaces en fonction de l’adresse MAC. À rester vigilant sur ce point avant le redémarrage donc.

Voilà pour les remarques. Vous noterez que je n’ai pas abordé le noyau Linux. C’est parce que pour la majorité de nos serveurs, ils sont gérés de façons spécifiques (au lieu d’utiliser les noyaux officiels Debian). Ainsi, ils restent dans leur version actuelle (2.6.31 à cette heure) pendant la migration. Bien sûr, cela n’empêche pas d’effectuer un redémarrage de la machine suite à la mise-à-jour : cela permet de s’assurer que tout est bien en place et le sera toujours après un éventuel redémarrage d’urgence.

Rendez-vous pour de prochaines migrations !

24 January, 2010 06:05PM by Gregory Colpart

July 02, 2009

JCE non limitées sous Debian

Les packages Debian de Java n’intègrent pas de mécanisme pour faciliter l’utilisation des versions non limitées des JCE (Java Cryptography Extension), utiles pour avoir des fonctions de chiffrement dites « fortes » (#466675). L’idée est de créer des diversions locales pour conserver les versions non limitées, même en cas de mise-à-jour :

# dpkg-divert --divert /usr/share/doc/sun-java6-jre/US_export_policy.jar.ori \
 --rename /usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/security/US_export_policy.jar
Adding `local diversion of /usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/security/US_export_policy.jar
 to /usr/share/doc/sun-java6-jre/US_export_policy.jar.ori'
# dpkg-divert --divert /usr/share/doc/sun-java6-jre/local_policy.jar.ori \
--rename /usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/security/local_policy.jar 
Adding `local diversion of /usr/lib/jvm/java-6-sun-1.6.0.12/jre/lib/security/local_policy.jar
to /usr/share/doc/sun-java6-jre/local_policy.jar.ori'

Attention, bien garder à l’esprit que si une faille de sécurité survient, il faudra mettre à jour manuellement ces fichiers.

02 July, 2009 09:45PM by Gregory Colpart