GuiGui2's thoughts

To content | To menu | To search

Thursday, January 21 2010

Mise à jour Lenny -> Sid

Cette après-midi, j'ai passé un moment à lutter pour mettre à jour *proprement* une Debian/s390x de "stable" (Lenny) en "Sid.

En suivant la procédure dont j'avais l'habitude (sudo aptitude dist-upgrade), cette #@#{@{! d'udev n'arrête pas de ouiner, et l'upgrade plante en plein milieu.
Après plusieurs essais infructueux, j'ai demandé aux lutins du jardin de l'admin magique, et c'est PèreNoël qui m'a mis sur la voie.

Je précise que j'ai accès à la console de la machine virtuelle, et que je ne fais pas ça totalement à l'aveugle - c'est du test, quoi.
Au pire, si ça pète, ça pète, je recrée une VM en quelques minutes.

On commence par changer le fichier /etc/apt/sources.list pour qu'il pointe sur les dépôts de Sid:

sed -i 's/lenny/sid/g' /etc/apt/sources.list

On en profite pour faire un peu de ménage dans le fichier (les sources updates et security sont pas nécessaires en Sid).
On met la base de données d'aptitude à jour, puis on installe le kernel de Sid (2.6.32):

debgls:/home/guigui# sudo aptitude update && sudo aptitude install linux-image-2.6-s390x

Une fois le kernel installé et le boot loader mis à jour, on reboote. C'est à ce moment qu'il est rassurant d'avoir accès à la console, et des machines de tests jetables. Comme le disait _mat, si la compatibilité glibc a été pété, à ce moment, on l'a dans le luc.

reboot

Tout va bien, la machine est revenue, on peut donc ensuite passer au dist-upgrade classique que l'on connait:

debgls:/home/guigui# aptitude update && aptitude safe-upgrade
Hit http://ftp.fr.debian.org sid Release.gpg
Hit http://ftp.fr.debian.org sid Release
Get:1 http://ftp.fr.debian.org sid/main Packages/DiffIndex [2038B]
Fetched 2038B in 1s (1185B/s)
Reading package lists... Done
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Reading extended state information       
Initializing package states... Done
Reading task descriptions... Done  
Resolving dependencies...
Resolving dependencies...
Resolving dependencies...
Resolving dependencies...
Resolving dependencies...
Resolving dependencies...
Resolving dependencies...
Resolving dependencies...
Resolving dependencies...
Resolving dependencies...
Resolving dependencies...
The following NEW packages will be installed:
  apt-xapian-index{a} ca-certificates{a} dash{a} diffutils{a} file{a} gcc-4.4-base{a} gnupg-curl{a} insserv{a} install-info{a} iso-codes{a} javascript-common{a} libapr1{a} libaprutil1{a} libboost-iostreams1.40.0{a} libbsd0{a} 
  libc-bin{a} libcurl3-gnutls{a} libdb4.5{a} libdb4.7{a} libdb4.8{a} libexpat1{a} libfile-copy-recursive-perl{a} libgssapi-krb5-2{a} libidn11{a} libjs-jquery{a} libk5crypto3{a} libkrb5-3{a} libkrb5support0{a} libldap-2.4-2{a} 
  liblockfile1{a} liblog4cxx10{a} libmagic1{a} libpci3{a} libreadline6{a} libsasl2-modules{a} libsqlite3-0{a} libudev0{a} lockfile-progs{a} lsb-release{a} make{a} mime-support{a} pciutils{a} perl{a} perl-modules{a} python{a} 
  python-apt{a} python-central{a} python-debian{a} python-minimal{a} python-support{a} python-xapian{a} python2.5{a} python2.5-minimal{a} sensible-utils{a} usbutils{a} wwwconfig-common{a} 
The following packages will be REMOVED:
  libkrb53{u} 
The following packages will be upgraded:
  adduser apt apt-utils aptitude base-files base-passwd bash bsdmainutils bsdutils busybox bzip2 coreutils cpio cron debconf debconf-i18n debianutils dhcp3-client dhcp3-common diff dmsetup dpkg e2fslibs e2fsprogs ed findutils ftp 
  gcc-4.3-base gnupg gpgv grep groff-base gzip hostname ifupdown info initramfs-tools initscripts installation-report iproute iptables iputils-ping klibc-utils libacl1 libattr1 libblkid1 libbz2-1.0 libc6 libcomerr2 libconsole 
  libcwidget3 libdb4.6 libdevmapper1.02.1 libedit2 libept0 libgcc1 libgcrypt11 libgdbm3 libgnutls26 libgpg-error0 libkeyutils1 libklibc liblocale-gettext-perl libncurses5 libncursesw5 libnewt0.52 libpam-modules libpam-runtime libpam0g 
  libpopt0 libreadline5 libsasl2-2 libselinux1 libsepol1 libsigc++-2.0-0c2a libslang2 libss2 libssl0.9.8 libstdc++6 libtasn1-3 libtext-charwidth-perl libtext-iconv-perl libtext-wrapi18n-perl libuuid1 libwrap0 libxapian15 locales login 
  logrotate lsb-base lvm2 makedev man-db manpages mawk mktemp module-init-tools mount nano ncurses-base ncurses-bin net-tools netbase openssh-client openssh-server openssl passwd perl-base procps readline-common rsyslog screen sed 
  sudo sysconfig-hardware sysstat sysv-rc sysvinit sysvinit-utils tar tasksel tasksel-data tcpd traceroute tzdata ucf udev update-inetd util-linux vim-common vim-tiny wget whiptail zlib1g 
The following packages are RECOMMENDED but will NOT be installed:
  aptitude-doc-cs aptitude-doc-en aptitude-doc-es aptitude-doc-fi aptitude-doc-fr aptitude-doc-ja bash-completion bsd-mailx citadel-mta courier-mta dma esmtp-run exim4 exim4-daemon-heavy exim4-daemon-light heirloom-mailx libatm1 
  libfribidi0 libgpm2 libparse-debianchangelog-perl libpng12-0 mailutils masqmail msmtp-mta nullmailer openssh-blacklist-extra postfix psmisc reportbug sendmail-bin ssmtp uuid-runtime xauth xmail 
134 packages upgraded, 56 newly installed, 1 to remove and 0 not upgraded.
Need to get 80.8MB of archives. After unpacking 95.8MB will be used.
Do you want to continue? [Y/n/?] 
Need to get 80.8MB of archives. After unpacking 95.8MB will be used.
Do you want to continue? [Y/n/?] 
Writing extended state information... Done
Get:1 http://ftp.fr.debian.org sid/main locales 2.10.2-5 [4752kB]
Get:2 http://ftp.fr.debian.org sid/main libc-bin 2.10.2-5 [736kB]
Get:3 http://ftp.fr.debian.org sid/main libc6 2.10.2-5 [4317kB]
Get:4 http://ftp.fr.debian.org sid/main perl-base 5.10.1-9 [1086kB]
Get:5 http://ftp.fr.debian.org sid/main liblocale-gettext-perl 1.05-6 [20.6kB]
Get:6 http://ftp.fr.debian.org sid/main libtext-iconv-perl 1.7-2 [17.8kB]                                                                                                                                                                      
Get:7 http://ftp.fr.debian.org sid/main libtext-charwidth-perl 0.04-6 [11.8kB]                                                                                                                                                                 
Get:8 http://ftp.fr.debian.org sid/main libtext-wrapi18n-perl 0.06-7 [9004B]                                                                                                                                                                   
Get:9 http://ftp.fr.debian.org sid/main debconf-i18n 1.5.28 [178kB]                                                                                                                                                                            
Get:10 http://ftp.fr.debian.org sid/main debconf 1.5.28 [149kB]                                                                                                                                                                                
Get:11 http://ftp.fr.debian.org sid/main gcc-4.4-base 4.4.2-9 [115kB]                                                                                                                                                                          
Get:12 http://ftp.fr.debian.org sid/main libgcc1 1:4.4.2-9 [31.2kB]                                                                                                                                                                            
Get:13 http://ftp.fr.debian.org sid/main libcomerr2 1.41.9-1 [46.7kB]                                                                                                                                                                          
Get:14 http://ftp.fr.debian.org sid/main libkeyutils1 1.2-12 [6606B]                                                                                                                                                                           
Get:15 http://ftp.fr.debian.org sid/main libkrb5support0 1.8+dfsg~alpha1-4 [42.9kB]                                                                                                                                                            
Get:16 http://ftp.fr.debian.org sid/main libk5crypto3 1.8+dfsg~alpha1-4 [115kB]                                                                                                                                                                
Get:17 http://ftp.fr.debian.org sid/main libkrb5-3 1.8+dfsg~alpha1-4 [391kB]                                                                                                                                                                   
Get:18 http://ftp.fr.debian.org sid/main libgssapi-krb5-2 1.8+dfsg~alpha1-4 [129kB]                                                                                                                                                            
Get:19 http://ftp.fr.debian.org sid/main libpam0g 1.1.0-4 [115kB]                                                                                                                                                                              
Get:20 http://ftp.fr.debian.org sid/main libselinux1 2.0.89-4 [87.0kB]                                                                                                                                                                         
Get:21 http://ftp.fr.debian.org sid/main zlib1g 1:1.2.3.4.dfsg-3 [82.0kB]                                                                                                                                                                      
Get:22 http://ftp.fr.debian.org sid/main libssl0.9.8 0.9.8k-8 [1042kB]                                                                                                                                                                         
Get:23 http://ftp.fr.debian.org sid/main libwrap0 7.6.q-18 [32.7kB]                                                                                                                                                                            
Get:24 http://ftp.fr.debian.org sid/main libdb4.7 4.7.25-9 [670kB]                                                                                                                                                                             
Get:25 http://ftp.fr.debian.org sid/main libpam-modules 1.1.0-4 [346kB]                                                                                                                                                                        
Get:26 http://ftp.fr.debian.org sid/main libpam-runtime 1.1.0-4 [219kB]                                                                                                                                                                        
Get:27 http://ftp.fr.debian.org sid/main sensible-utils 0.0.2 [4566B]                                                                                                                                                                          
Get:28 http://ftp.fr.debian.org sid/main debianutils 3.2.2 [49.9kB]                                                                                                                                                                            
Get:29 http://ftp.fr.debian.org sid/main passwd 1:4.1.4.2-1 [1037kB]                                                                                                                                                                           
Get:30 http://ftp.fr.debian.org sid/main adduser 3.112 [157kB]                                                                                                                                                                                 
Get:31 http://ftp.fr.debian.org sid/main dpkg 1.15.5.6 [2251kB]                                                                                                                                                                                
Get:32 http://ftp.fr.debian.org sid/main install-info 4.13a.dfsg.1-5 [146kB]                                                                                                                                                                   
Get:33 http://ftp.fr.debian.org sid/main sed 4.2.1-6 [250kB]                                                                                                                                                                                   
Get:34 http://ftp.fr.debian.org sid/main ncurses-bin 5.7+20090803-2 [315kB]                                                                                                                                                                    
Get:35 http://ftp.fr.debian.org sid/main lsb-base 3.2-23 [20.0kB]                                                                                                                                                                              
Get:36 http://ftp.fr.debian.org sid/main libncurses5 5.7+20090803-2 [363kB]                                            
[...]
Replacing config file /etc/default/sysstat with new version
insserv: warning: current stop runlevel(s) (0 6) of script `sysstat' overwrites defaults (empty).
Setting up usbutils (0.86-3) ...
Setting up makedev (2.3.1-89) ...
.udevdb or .udev presence implies active udev.  Aborting MAKEDEV invocation.
.udevdb or .udev presence implies active udev.  Aborting MAKEDEV invocation.
.udevdb or .udev presence implies active udev.  Aborting MAKEDEV invocation.
.udevdb or .udev presence implies active udev.  Aborting MAKEDEV invocation.
.udevdb or .udev presence implies active udev.  Aborting MAKEDEV invocation.
.udevdb or .udev presence implies active udev.  Aborting MAKEDEV invocation.
.udevdb or .udev presence implies active udev.  Aborting MAKEDEV invocation.
.udevdb or .udev presence implies active udev.  Aborting MAKEDEV invocation.
.udevdb or .udev presence implies active udev.  Aborting MAKEDEV invocation.
.udevdb or .udev presence implies active udev.  Aborting MAKEDEV invocation.
.udevdb or .udev presence implies active udev.  Aborting MAKEDEV invocation.
chmod: cannot access `/dev/tty[0-9]*': No such file or directory
.udevdb or .udev presence implies active udev.  Aborting MAKEDEV invocation.
.udevdb or .udev presence implies active udev.  Aborting MAKEDEV invocation.
.udevdb or .udev presence implies active udev.  Aborting MAKEDEV invocation.
Setting up tasksel-data (2.81) ...
Setting up perl-modules (5.10.1-9) ...
Setting up tasksel (2.81) ...
Setting up perl (5.10.1-9) ...
update-alternatives: using /usr/bin/prename to provide /usr/bin/rename (rename) in auto mode.
Setting up libfile-copy-recursive-perl (0.38-1) ...
Setting up update-inetd (4.35) ...
Processing triggers for python-support ...
Processing triggers for initramfs-tools ...
update-initramfs: Generating /boot/initrd.img-2.6.32-trunk-s390x
Using config file '/etc/zipl.conf'
Building bootmap in '/boot'
Building menu 'menu'
Adding #1: IPL section 'debian' (default)
Adding #2: IPL section 'old'
Preparing boot device: dasda (0100).
Done.
Reading package lists... Done             
Building dependency tree       
Reading state information... Done
Reading extended state information       
Initializing package states... Done
Writing extended state information... Done
Reading task descriptions... Done         

Current status: 0 updates [-134].


Et on vérifie:

guigui@debgls:~$ cat /etc/issue
Debian GNU/Linux squeeze/sid \n \l

Impecc. M'enfin, il m'aura fallu 3 essais pour en arriver là.

Reste un dernier point.
Entre le kernel 2.6.26 de Lenny et le kernel 2.6.32 de Sid, le driver qeth, qui gère les connexions réseaux sur System z, a été découpé en 3 morceaux: qeth, qeth_l2 et qeth_l3. Qeth est la partie commune, qeth_l2 assure la gestion du Layer 2, et qeth_l3 la gestion du .... Layer 3, bravo!

Les sripts d'init sont toujours dans l'ancien modèle, donc après un reboot, les connexions réseaux sont pétées - encore une bonne raison d'avoir une console 3270 pas trop loin.
Pour rétablir les connexions, on va gruiker salement les scripts d'init réseau:

cd /etc/sysconfig/hardware/scripts

et on édite le fichier hwup-ccw-group:

    error "no kernel module for ctc devices available!"
  fi
elif [ "$name" == qeth ]; then
  __modprobe qeth_l3 2> /dev/null || :__

  if [ -d $SYSFS/module/qeth ]; then
    DRIVER=qeth

Sunday, January 17 2010

Rationalisation

Donc, voilà, maintenant j'ai du boulot pour le projet.

Non pas que je n'en avais pas avant, mais là, faut que je fasse les choses proprement. Pas de conneries dans le repo à mon premier commit.. Interdit.
J'ai donc passé une partie de mon week-end à remettre mon filer au carré.

1) Bien beau de faire des backups, mais si on les met sur le _seul_ disque de la machine qui n'est pas en RAID, c'est un peu stupide, isn't it ?
Corrigé, le ~ du user bkp est maintenant sur le second array.

2) Sur le même array, j'ai fait une arborescence dans lequel je checkout les différents dépôts de code dont j'ai besoin: principalement pkgsrc, current et release (2009Q4 à ce jour).
Ces répertoires seront exportées en NFS vers les différentes machines sur lesquelles je teste mes patches (Sun et Alpha, essentiellement). Le répertoire de distfiles sera également partagé par NFS. Je reviendrai en détails sur ce setup quand il sera finalisé.

3) Arrêt des pkg_comp dans mon ~; création d'un user "build" dédié à cette tâche, comme sur superdrapo et nbbuild.

Friday, January 8 2010

gls@

Si vous suivez les mêmes blogs qui moi, ce titre vous rappelera forcément quelquechose.

Depuis un peu plus de 2ans, j'anime le site NetBSDfr, site de nouvelles en français sur le système d'exploitation NetBSD. J'utilise ce système depuis bien plus longtemps, 4 ans au moins maintenant - la première évocation de NetBSD sur mon wiki remonte à Avril 2006. Mon activité autour de ce système est toutefois plus importante depuis la renaissance de NetBSDfr: nouvelles, stands sur des salons, conférences, pkgsrc.

Fin Novembre dernier, iMil@, en concertation 2 autres développeurs du projet, m'a fait une proposition que je ne pouvais pas refuser: devenir développeur officiel du projet NetBSD à mon tour. Après plusieurs semaines d'attente angoissée, la réponse est arrivée le 05 Janvier. J'ai dorénavant mon nom dans LA liste.

Je kiffe, là, et pas qu'un peu!
iMil, stacktic, sarah, j'vous kiffe aussi :)

Saturday, September 26 2009

Don't do Evil

Edité.... Toujours te méfier des jugements hâtifs tu devras....Edité


Google.

"Ne pas faire de mauvaises choses".

Je suis d'une réticence complète vis-à-vis des services de Google. Comme tout le monde, j'utilise le moteur de recherche, mais je l'ai paramétré pour qu'il n'enregistre aucunes des requêtes que je fais. J'ai aussi une extension dans mon Firefox, Customize Google, pour limiter au maximum les infos que Google stocke, dans le cookie de mon navigateur ou sur leurs serveurs.

J'avoue, j'étais également hyper réticent aux services de mails, calendrier, RSS, etc. Et je le suis toujours. Mais voilà.

Je suis un geek. Quand Google s'est lancé dans le développement d'un OS, libre de surcroît, pour téléphone mobile, j'ai suivi avec intérêt. Forcément, un OS libre, à base de Linux, dans l'univers hyper fermé de la téléphonie, on y regarde de près. Et évidemment, j'ai craqué pour un Dream, chez Orange.
Après avoir râlé, comme tout le monde, contre la déplorable qualité de la ROM de base du Dream Orange, j'ai commencé à découvrir les travaux de Cyanogen, fan inconditionnel de l'appareil, qui passait son temps (de travail ?) à compiler des ROMs customs, aux petits oignons.
Joie, bonheur, renaissance. Une ROM à jour, des fonctionnalités toujours plus nombreuses, des mises à jour tous les jours ou presque.
Ca marche au poil.

C'est fini.
Cyanogen a été sommé aujourd'hui d'arrêter la diffusion sa ROM custom, la célèbre CyanogenMod, au motif qu'elle embarque des applications sous licences, les GoogleApps, GMail, GMaps, Youtube et Market, et ce de manière illégale. Argument discutable à première vue, puisque de toute façon, les ROMs de Cyanogen qui embarquent ces applis s'adressent à des gens qui ont _déjà_ acquis la licence, puisqu'il ont acheté un téléphone sous Androïd. Une autre analyse explique que Google n'est pas vraiment apprécié de trouver dans les ROMs de Cyanogen les nouvelles versions des applis (le Market de Donut, Androïd 1.6, par exemple), avant leur sortie officielle. Cet argument se justifie mieux, et je comprend mieux.

Bref, le gars est dégoûté. Et moi aussi. Google, malgré les apparences, ne vaut pas mieux que Microsoft, Apple et consorts. Dégouté d'avoir acheté cet appareil un mois trop tôt.

Le Dream est à vendre. Oui, mais en fait non.
Edit: billet écrit sur un coup de tête à la lecture de la nouvelle. Et manifestement pas objectif, et certainement précipité. Attendons de voir si Cyanogen trouve un accord quelconque avec Google.

Edit 2: Billet effectivement écrit sous le coup de la colère. On ne parle bien _que_ de la distribution des applis Google (GMail, Maps, Youtube, etc) dans les ROMs custom. La distribution des ROMs homegrown est toujours possible, mais elle ne peuvent inclure les dites applis.
Cyanogen a dire indiqué qu'il fournirait en plus de sa ROM les outils qui vont bien pour faire les backups des applis déjà installées sur son téléphone, pour les réinstaller sur sa ROM. Mais la CyanogenMod en tant que telle n'incluera plus les applis incriminées.

Reste à voir comment ça fonctionne. Certains disent que sans ces applis, les téléphones ne fonctionnent plus convenablement, ce que j'ai du mal à concevoir, à moins que ce ne soit très intégré dans le coeur du système ?
Edit 3: CyanogenMod est reparti. Mise à jour un peu plus compliquée qu'avant, forcément. Mais la ROM continue d'exister. Tout va bien!

Wednesday, September 23 2009

Kiffage

Depuis un certain temps déjà (mi-2007, d'après les archives du site), je suis derrière NetBSDfr.org, le site de la communauté NetBSD francophone.
Petit à petit, ça prend. Les utilisateurs fidèles nous rejoignent - grosso modo, à chaque fois qu'on est présent sur un salon, on gagne 2 à 3 utilisateurs - et remplissent le wiki, le site et les logs du canal IRC #netbsdfr@freenode.

Depuis 6 mois environs, l'équipe derrière NetBSDfr a lancé une série d'interviews de développeurs NetBSD, "Discutons avec un développeur".

Ce billet fait suite à la publication en fin de semaine dernière de la 4ème interview de la série, celle d'Alistair G Crooks, aka Dieu, actuel président de la Fondation NetBSD, et membre de core@, l'équipe qui dirige le projet.
Cette interview a bien évidemment été publiée sur le site NetBSDfr. Mais jusqu'à maintenant, les 2 versions été publiées sur le site. Dorénavant, la version anglaise sera publiée en même temps (ou quasiment) que la version française sur le blog officiel du projet NetBSD, b.n.o.
Premier signe de reconnaissance de notre travail de promotion du projet NetBSD. C'est à la demande de Sarah, marketing@, que les interviews sont postés de cette manière, la VF sur NetBSDfr, la VO sur b.n.o.

Deuxième signe de reconnaissance, un mail d'agc@ que j'ai reçu suite à la publication des interviews, nous remerciant de notre boulot. Et venant de lui, ça m'a fait _très_ plaisir.

Enfin, l'apothéose: iMil a publié l'article sur OSNews, qui est un site à trafic bien plus important que b.n.o ou même DLFP, sur lequel on était posté les interviews jusqu'à maintenant.

Petit à petit, ça paye. Et j'avoue, je caresse doucement le rêve d'un @. Un jour ptête.

Monday, September 7 2009

Inglourious Basterds / Up

Oué.
Donc, du coup, je suis allé au ciné cet aprèm. Ca tombe bien, j'aime bien les films en VO. Et j'aime bien Taratino aussi.
J'ai passé 2h32 devant Inglourious Basterds, le dernier opus du réalisateur américain.
Et c'est juste vraiment très bien. J'avoue, je suis assez bon public, et en particulier quand il s'agit de Tarantino.
Je vais pas raconter l'histoire ici, je sais pas faire. Mais je conseille, vraiment.
Du très bon Tarantino.

Le lendemain, je suis été voir Up ("Là Haut", en VF), le dernier Pixar. Sur les conseils de Stef.
Déjà, le court avant le dessin animé est, comme tous les courts Pixar, vraiment très sympa.
Ensuite, ben, j'ai pas été déçu non plus par Up. Histoire sympa, graphismes super bien, la magie a pris.

Bref, 2 films à conseiller!

Electric Zoo Festival - Epic FAIL

J'avais prévu, pour mon premier week-end aux US, de me rendre à Randall's Park Island, entre Brooklyn et Manhattan, au niveau de la 125ème rue, pour assister aux sets des DJs de l'ElectricZoo Festival.

Auparavant, j'étais passé chez Stef - la copine d'un pote qui vit à New-York, et qui avait proposé de m'héberger la nuit de Samedi à Dimanche, entre les 2 jours de concert - à Brooklyn, pour poser mes affaires.

Brooklyn -> Randall's Island, au bas mot, c'est 1h30 de métro, à un poil prêt.
Je suis arrivé à Grand Central vers 13h30, j'étais chez Stef à 14h30 environ. Je pose mes affaires, je discute un moment avec mon hôtesse, et je reprend le métro pour Randall's Park vers 15h30. Léger, juste mon téléphone, des sous, et mon appareil photo.

Vers 17h00, j'arrive enfin en vue en du site. La musique (enfin, surtout les basses) se fait entendre depuis un moment, m'accompagnant dans ma traversée du pont qui enjambe l'East River depuis Manhattan.
Je me pointe dans la queue pour présenter mon ticket. Le vigile à l'entrée me fait ouvrir le sac qui contient mon appareil, et me dit que je ne peux pas rentrer avec une "Professional Camera"....
Je vais causer avec le superviseur, je lui propose de balancer la carte SD, les batteries que j'avais dans le sac, histoire que je puis pas faire de photos "professionnelles". Rien à faire. Pas moyen de rentrer.

Dégouté, je reprend le métro dans l'autre sens et rentre à Brooklyn.
Dé-gou-té.
Du coup, après avoir discuté une paire d'heures avec Stef, je suis rentré direct à Poughkeepsie, étant certain de ne pas pouvoir rentrer Dimanche non plus avec ma maison sur mon dos.

Ou comment balancer 120$ par la fenêtre.
Tout ça parce que j'avais avec moi un appareil photo un peu trop gros pour les organisateurs, alors que même le plus con des téléphones portables (iPhone et co) font des photos d'aussi loin, avec un aussi gros zoom....
Bref.
Ca commence pas bien :/

Wednesday, September 2 2009

Electric Zoo Festival

Je suis un auditeur fidèle de Digitally Imported, radio spécialisée dans la musique électronique qui émet sur le Web.

Un jour,entre 2 mixes, durant un des spots de pub (oué, y'a de la pub dans le stream gratuit de DI.fm), j'entend un "commercial" pour ça. Je vérifie les dates, pile quand j'arrive!

Ni une ni deux, j'ai commandé un pass 2 jours, je serai donc à Randall's Island Park Samedi 5 et Dimanche 6 Septembre, à l'ElectricZoo Festival.

Evidemment, je ne raterai pas les sets des 2 têtes de gondole, Armin Van Buuren (le DJ derrière les A State of Trance, "number one DJ in the world") et David Guetta (on a encore besoin de le présenter, celui-là ? ), mais il y en a d'autres: Ferry Corsten, Menno de Jong, ATB, Steve Angello (de la Swedish House Mafia), Ben Watt (DJ Londonien, qui a notamment commis les compils Lazy Dog), Roger Sanchez, Robbie Rivera, dans ceux que je connais.

Parce que bon, j'ai pas la prétention d'avoir déjà écouté tout les DJs qui jouent. Donc je vais me ballader de scène en scène, j'écouterai ce qui me plaira :)

Edit: Finalement, mon seul regret, c'est que Aly & Fila fassent pas partie du line-up...

Sunday, August 30 2009

Serveur IMAP, et filtrage des mails côté serveur

Je suis abonné à un nombre croissant de liste de diffusion, notamment celles liées au projet NetBSD. Jusqu'à maintenant, j'effectuais le tri des mails côté client, grâce aux fonctionnalités de Thunderbird. Sauf que je ne relève pas mes mails toujours du même ordinateur, ce qui m'oblige à maintenir plusieurs séries de filtres dans des endroits différents. Du coup, fatalement, les filtres ne sont pas synchronisés.

Depuis un moment déjà, je voulais mettre en oeuvre les filtres côté serveur. Je m'y suis attaqué cette semaine, ce post me servira de pense-bête.

Pour filtrer des mails côté serveur, on a 2 solutions essentiellement:

  • procmail
  • sieve

J'ai personnellement opté pour sieve, et en particulier l'implémentation de dovecot, parce que c'est une solution plus "standardisée" que procmail. Mais jusqu'à présent, j'utilisais les serveurs de mail courier-*. Il a donc fallu commencé par migrer de courier à dovecot.

1- Installer le serveur Dovecot et le plugin pour Sieve

sudo pkg_add dovecot-1.0.15p1-postgresql dovecot-sieve-1.0.3-postgresql

2- On commence par configurer les serveurs Dovecot de telle manière qu'on puisse remplacer courier-* pour la consultation des mails. Ci dessous, le fichier dovecot.conf qui correspond à mon setup:

base_dir = /var/dovecot/
protocols = imap imaps pop3 pop3s
disable_plaintext_auth = yes
ssl_cert_file = /etc/ssl/dovecotcert.pem
ssl_key_file = /etc/ssl/private/dovecot.pem
login_dir = /var/dovecot/login
login_user = _dovecot
mail_location = maildir:/var/spool/postfix/virtual/%d/%n
mail_privileged_group = _vmail
mmap_no_write = yes
mbox_write_locks = fcntl
protocol imap {
imap_client_workarounds = delay-newmail outlook-idle netscape-eoh tb-extra-mailbox-sep
}
protocol pop3 {
pop3_uidl_format = %08Xu%08Xv
pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
}
auth default {
mechanisms = digest-md5 cram-md5 login plain
passdb sql {
args = /etc/dovecot-postgresql.conf
userdb static {
args = uid=1005 gid=1004 home=/var/spool/postfix/virtual/%d/%n allow_all_users=yes
}
user = root
socket listen {
master {
# Master socket provides access to userdb information. It's typically
# used to give Dovecot's local delivery agent access to userdb so it
# can find mailbox locations.
path = /var/run/dovecot/auth-master
mode = 0600
# Default user/group is the one who started dovecot-auth (root)
user = _vmail
#group =
}
client {
# The client socket is generally safe to export to everyone. Typical use
# is to export it to your SMTP server so it can do SMTP AUTH lookups
# using it.
path = /var/spool/postfix/private/auth
mode = 0660
user = _postfix
group = _postfix
}
}
}
dict {
}

A noter que Dovecot a besoin de 3 utilisateurs différents: root, pour le lancement du process, _dovecot, pour toutes les opérations internes au serveur, _vmail, pour l'accès au système de fichiers. Pas la peine d'essayer de ne faire qu'avec 2 utilisateurs, ça juste pamarche.

Ici, donc:

  • on configure les protocoles pop3(s) et imap(s).
  • on utilise des certificats x509, signés par CACert.
  • l'utilisateur interne de Dovecot est _dovecot
  • les mails sont stockés dans un maildir dans le répertoire /var/spool/postfix/virtual/nomdedoma.ine/user.
  • on précise quelques options pour les clients IMAP ou PO3 mal gaulés
  • on précise enfin comment se fait l'authentification de nos utilisateurs. En l'occurence ici, les mots de passe sont récupérés par un lookup dans une base PostgreSQL, les utilisateurs sont eux mappés sur le user _vmail:_vmail. Le allow_all_users = yes est nécessaire pour deliver.
  • Enfin, on précise les emplacements des sockets client (utilisée par Postfix pour se connecter au serveur d'authentification) et "master" (utilisée plus tard par le local delivery agent de Dovecot).

3- On teste que les serveurs IMAP et POP3 fonctionnent correctement, en testant la connection au serveur en local.

4- On rajoute la configuration du Local Delivery Agent à la configuration de dovecot:

protocol lda {
  postmaster_address = postmaster@whateveryoudomainis.net
  mail_plugins = cmusieve
  mail_plugin_dir = /usr/local/lib/dovecot/lda
  auth_socket_path = /var/run/dovecot/auth-master
  log_path = /var/log/dovecot-deliver.log
  info_log_path = /var/log/dovecot-deliver.log
 }
  • On précise l'adresse du postmaster
  • On indique à quel endroit se trouve le binaire du plugin, puis le path vers la socket.
  • Enfin, on renseigne les fichiers de logs de deliver, le lda.

5- Avant de tester le lda, il faut modifier la configuration de Postfix pour lui indiquer qu'on utilise un delivery agent externe en lieu et place du sien, avec les bons paramètres. Pour se faire, on édite le fichier /etc/postfix/master.cf, dans lequel on rajoute la ligne suivante:

dovecot   unix  -       n       n       -       -       pipe
    flags=DRhu user=_vmail:_vmail argv=/usr/local/libexec/dovecot/deliver -d ${recipient}

Là encore, inutile d'essayer de faire marcher deliver avec autre chose que le user _vmail, ça ne marche pas. deliver a besoin d'accéder au file system pour livrer les messages, il faut le lancer avec l'identité _vmail.

6- On relance postfix et Dovecot:

$ sudo postfix reload
$ sudo kill -HUP pidofdovecot

7- On surveille les logs pour vérifier que c'est bien deliver, le lda de dovecot, qui prend en charge les mails:

Sep  2 14:58:25 bsdedibox postfix/qmgr[18852]: 1CE2F5ACC4B: from=<tagadatsointsoin@fraisetaga.da>, size=2987, nrcpt=1 (queue active)
Sep  2 14:58:25 bsdedibox postfix/pipe[7446]: 1CE2F5ACC4B: to=<moi@moimeme>, relay=dovecot, delay=0.45, delays=0.4/0.01/0/0.03, dsn=2.0.0, status=sent (delivered via dovecot service)

8- Reste à mettre en place le filtre sieve, le plus simple étant de le poser dans le maildir de chacun des users. Pour se faire, on crée un fichier .dovecot.sieve dans le maildir de chacun de nos utilisateurs, contenant les règles de filtrage voulues:

% sudo cat /var/spool/postfix/virtual/guigui2.net/guigui2/.dovecot.sieve
require ["fileinto"];
if header :contains ["to", "cc"] "source-changes@NetBSD.org" {
  fileinto "NetBSD.source-changes"; stop;
}
[...]
if header :contains ["to", "cc"] "april@april.org" {
  fileinto "\[April\ -\ April\]"; stop;
}

9- Et donc, si on a rien oublié, les mails sont rangés tous seuls comme des grands dans leurs boîtes aux lettres respectives:

 deliver(moi@moimeme): Sep 02 15:00:53 Info: msgid= <20090902130039.D1736175D0@cvs.netbsd.org>: saved mail to NetBSD.source- changes 
 deliver(moi@moimeme): Sep 02 15:02:56 Info: msgid=<4A9E6CE2.2010200@valcom.com>: saved mail to NetBSD.netbsd-users
 deliver(moi@moimeme): Sep 02 15:08:57 Info: msgid=<9efd46e20909020607i74c2c490i411668fbb98371ed@mail.gmail.com>: saved mail to [VaRouler]
 deliver(moi@moimeme): Sep 02 15:24:35 Info: msgid=<JBSQ02D00048V020000D8Y0I081133@ev001.net>: saved mail to INBOX

Wednesday, August 19 2009

Et maintenant, on committe!

Tiré d'une conversation sur IRC avec iMil cette après-midi:

(14:42)   GuiGui2 - Je vais prendre un pari ici, pour que ça me motive à bosser dessus quand je serai de l'autre côté de l'Atlantique: en revenant, après mon 
                    déménagement, je te montre un bout de code fonctionnel que j'aurai écrit de mes blanches mains.
(14:42)   GuiGui2 - C'est dit :)
(14:43)      iMil - _oh_
(14:43)      iMil - !!!!!!!!!
(14:43)      iMil - TOPE LA
(14:43)      iMil - :)
(14:43)     GuiGui2 tope iMil
(14:44)       iMil  tope GuiGui2 
(14:44)   GuiGui2 - \o/
(14:44)   GuiGui2 - Bon, ça me laisse 7 semaines pour le K&R....
(14:44)   GuiGui2 - :)
(14:44)   GuiGui2 - Mais allez
(14:44)      iMil - trankal :)
(14:44)   GuiGui2 - Au moins, ça va me mettre le pied à l'étrier
(14:44)   GuiGui2 - J'ai plein d'idées en plus :)
(14:44)   GuiGui2 - Ah ? :)
(14:45)      iMil - aaah
(14:45)      iMil - excellent :)
(14:45)      iMil - si t'as les idées
(14:45)   GuiGui2 - Je les ai
(14:45)   GuiGui2 - Plein
(14:45)      iMil - le code est simplement un moyen
(14:45)   GuiGui2 - trop 
(14:45)   GuiGui2 - :)
(14:45)      iMil - heh :)


Pari stupide, évidemment, mais voilà. J'ai parié. Donc, je tiendrai mon pari.
Maintenant, me reste à mettre une structure en place pour développer correctement, à commencer par un gestionnaire de code source.J'ai jeté mon dévolu sur git, de manière totalement arbitraire. Enfin non, pas tout à fait. J'avais besoin d'un SCM décentralisé, pour pouvoir bosser loin du serveur git, tout en continuer à pouvoir gérer les modifications localement. Et faire un mass commit en rentrant à la maison.

Première chose à faire, avant tout le reste: lire la doc, voir imprimer le pdf pour le lire sur la plage.
Ensuite, on met le truc en oeuvre. C'est finalement assez simple.

  • Sur le _serveur_ qui va héberger le code, on crée un répertoire (destiné à recevoir le code, donc), et on initialise un repo git vierge:


$ mkdir /home/guigui/work/devel/repositories/scanrdrd.git
$ cd /home/guigui/work/devel/repositories/scanrdrd.git
$ git --bare init


  • Ne pas oublier de renseigner .git/description, sinon, git roumègue.
  • Côté client, sur lequel on va développer, on crée le répertoire de nos sources, qu'on initialise comme un repo git:


$ mkdir /home/guigui/work/devel/repositories/scanrdrd
$ git init


On pose un ou deux fichiers bidons dans le répertoire pour tester:

$ touch README
$ git add README


On committe dans le repository local:

$ git commit -m 'Initial commit'


Enfin, on synchronise le repository local avec le repository distant sur le serveur:

git remote add origin git@zezette:/home/guigui/work/devel/repositories/scanrdrd.git
git push origin master


NB: Le git remote add origin n'est à faire qu'un seule fois. Par la suite, pour propager les modifications vers le serveur distant, il suffira de

git push;

Monday, August 17 2009

I can haz backup ?

C'est pas du boulot! Ca fait .... pfiouuu... oui, au moins. Voire ptet même plus.... que j'administre une petite machine dédiée dans un Datacenter parisien. Celle sur laquelle tourne ce blog, entre autres. Et pendant tout ce temps, jamais j'ai fait un backup. Ja-mais. Oué, je sais, c'est pas du boulot.
Maintenant, sur cette boîte, tourne également un site bien plus critique à mes yeux que le bête site où je raconte ma vie: NetBSDfr. Et celui-là, quand il plante, je le sais rapidement, vu qu'il commence à avoir une audience respectable.
Donc voilà, je me suis mis en tête de mettre (enfin!) en place une politique de backup présentable.

iMil m'a envoyé un lien vers le script qu'il a mis en oeuvre pour le backup de ces environnements, que je n'ai eu qu'à adapter à mes besoins.
Ce script met en oeuvre rsync.

La machine à backuper est un OpenBSD, sur laquelle on installe donc rsync par les ports:


# pkg_add -v rsync


Le script d'iMil s'appuie sur /etc/hosts.allow et /ec/hosts.deny pour s'assurer que les IPs qui se connectent au serveur rsync sont bien autorisées à le faire. Oui mais voilà, chez SFR, j'ai une IP pas tout à fait fixe... Elle change de temps en temps, au renouvellement du bail (je suis pas certain d'avoir 2 fois de suite la même IP). Et comme j'ai pas envie de m'ennuyer avec un DynDNS, j'ai adapté le script pour faire du rsync over ssh.
Sur la box d'où on va faire le backup, on crée un user qui va être dédié au backup, et on lui crée une clé ssh qui va bien:


# useradd -m -g bkp -G users bkp
# su - bkp
~ ssh-keygen -t rsa -b 4096


La clé de notre user bkp est sauvegardée dans /home/bkp/.ssh/id_rsa.pub.

On recopie cette clé publique sur le host à backuper, dans le fichier authorized_keys, par le moyen qu'on veut. On s'assure que depuis la machine qui exécutera le script de backup, on peut se logguer en ssh (en tant que user bkp) sans password sur la box à backuper:


~ sudo su - bkp
# ssh bkp@www.icanhazback.up
$ bkp@icanhazback.up:


OK, c'est tout bon.
Le setup côté box à backuper est fini, reste le script qu'on va utiliser pour le backup, que voilà:


 zezette$ cat ./bkp.sh 
 #!/bin/sh
 # Simple rsync client script
 # if "console" is specified, verbose output and --delete are implied
 # iMil 
 # Modified GuiGui2 Aug. 18, 2009.
 RSYNC="/usr/pkg/bin/rsync"
 usage()
 {
       echo "usage: $0    "
        exit 1
 }
 if [ $# != 4 ]
 then
        usage
 fi                       
 HOST=$2
 FROM=$3
 TO=$4
 ROOT_TO="/home/bkp/backups"
 EXCLUDE="/home/bkp/rsync.exclude"
 #SECRET="/home/bkp/rsync.secret"
 USER="bkp"
 OPTIONS="--compress -a --recursive --times --perms --links"
 if [ -f ${EXCLUDE} ]; then
        OPTIONS="${OPTIONS} --exclude-from=${EXCLUDE}"
 fi
 #if [ -f ${SECRET} ]; then
 #        OPTIONS="${OPTIONS} --password-file=${SECRET}"
 #fi
 case $1 in
        console)
               CONSOLE="--verbose --progress --stats --delete"
               ;;
        cron)
               CONSOLE=""
               ;;
        *)
               usage
               ;;
 esac

 CMD="${RSYNC} ${CONSOLE} ${OPTIONS} -e ssh ${USER}@${HOST}:${FROM}  ${ROOT_TO}/${TO}"

 echo running: ${CMD}

 eval ${CMD}


On teste que tout fonctionne:

$ ./bkp.sh console www.icanhazback.up /home/bkp/manyfilestobackup files
running: /usr/pkg/bin/rsync --verbose --progress --stats --delete --compress -a --recursive --times --perms --links --exclude-from=/home/bkp/rsync.exclude -e ssh bkp@www.icanhazback.up:/home/bkp/manyfilestobackup /home/bkp/backups/files
receiving incremental file list

Number of files: 3
Number of files transferred: 0
Total file size: 19690257 bytes
Total transferred file size: 0 bytes
Literal data: 0 bytes
Matched data: 0 bytes
File list size: 106
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 36
Total bytes received: 127

sent 36 bytes  received 127 bytes  65.20 bytes/sec
total size is 19690257  speedup is 120799.12


Et quand tout est au poil, on cron:

0 3 * * * /home/bkp/bkp.sh cron www.icanhazback.up /var/www/htdocs/icanhazback.up www/back.up


Et voilà. Plus d'excuses :)
Cette méthode présente aussi un autre avantage.

On a possibilité de faire les backups depuis plusieurs machines. Typiquement, je pars en déplacement loin de chez moi pendant 5 semaines, je laisse pas mon serveur à la maison allumé.

Je ferai donc les backups avec mon lappy depuis mon lieu de déplacement, moyennant un peu de préparation auparavant (création du user, de la clé, et une première synchro tant qu'on est à la maison).

Sunday, August 16 2009

Monstre

J'en causais .

J'ai donc maintenant un monstre à la maison.

  • Carte mère: MSI GA770-DS3
  • Processeur: AMD II Phenom X4 810 (Quad Core à 2.6GHz)
  • Mémoire: 2 fois G.Skill Kit Extreme2 2 x 2 Go PC6400 MQ (oué, ça fait 8Go)
  • Carte Raid: Adaptec 2410SA.
  • Disques dur: 250 Go SATA II pour le système, 4 x 1To en 2 array Raid 1 (soit 2To utiles).
  • Système d'exploitation: NetBSD-current


Ben y'a pas à dire, pour compiler des paquets, c'est juste ha-llu-ci-nant tellement ça va vite!
Cette machine, qui vient se rajouter à ma collection qui commence à être impressionnante, sert de Domaine0 Xen pour héberger des machines virtuelles, ainsi que de filer. Promis, je ferai des photos de mon data center quand j'aurai emmenagé dans mon nouvel appartement.

Oué, ben non

Oué, ben non! Vous ne trouverez finalement pas le récit de ma Grande Traversée du Massif Central. Pas le temps, plus l'envie maintenant que j'ai réalisé un album chez Photoways pour raconter mes aventures. Donc non. Pas de photos, pas de récit. J'ai les souvenirs dans ma tête :-) Désolé pour ceux qui attendait ça ici (il y en avait, d'ailleurs ? )

Sunday, May 17 2009

Grande Traversée du Massif Central en VTT - Billets en Français et en Anglais

Dans les billets qui suivent, je raconterai, photos à l'appui, les 09 jours passés à effectuer la grande traversée du Massif Central en VTT.
Départ du Lac Servières le 01er Mai, arrivée à St-Jean de Fos le 09 Mai.
Les billets seront doublés, en Français et en Anglais, dès fois que nos collègues d'outre Manche ou d'outre Atlantique veuillent se lancer dans l'aventure (salut Sarah ;-) !)


In the following posts, I will describe, with many photos, our "Grande Traversée du Massif Central in Mountain Bike".
We started from "Lac de Servières", 45min from Clermont-Ferrand on May 1st, and finished in St-Jean de Fos, 40km from Montpellier, on May 09th 2009.
Posts will be posted two times, once in French, once in English, in case our friens from England, the US or Australia are tempted by the adventure. (Hi Sarah ;-) !).

Sunday, May 10 2009

Grande Traversée du Massif Central en VTT

J'en parlais il y a longtemps sur ce blog, mais c'est maintenant une réalité. Nous sommes partis du 01er au 09 Mai pour la Grande Traversée du Massif Central, aussi connue sous le nom de GTMC.
Le programme était le suivant:

  • 01 Mai: Lac de Servières -> Brion
  • 02 Mai: Brion -> Neussargues
  • 03 Mai: Neussargues -> Paulhac en Margeride
  • 04 Mai: Paulhac en margeride -> Laubert
  • 05 Mai: Laubert -> Pont de Montvert
  • 06 Mai: Pont de Montvert -> Mas St-Chely
  • 07 Mai: Mas St-Chely -> L'Esperou
  • 08 Mai: L'Esperou -> Sauclières
  • 09 Mai: Sauclières -> St Jean de Fos


Au programme, une 60aine de kms par jour, avec du dénivellé le plus souvent: on a quand même escaladé le Mont Mouchet, le Mont Lozère, l'Aigoual et le Pic Baudille durant la semaine :-)
En tout, environ 570km, pour pas loin de 10km de D+.

En tout cas, une magnifique aventure!

Sunday, March 1 2009

Besoin (envie ?) d'un nouveau monstre.

Ben oui.
J'ai plus assez de machines. J'ai plus assez de place.
Résultats des coures, je vais m'offrir une nouvelle bécane \o/. Pour le moment, je pars sur un truc de ce genre là:

  • Boîtier Cooler Master Elite RC-334 ou Antec Three Hundred
  • Carte mère Gigabyte GA-MA78G-DS3H
  • Processeur AMD Phenom™ X4 9950 Black Edition 125 Watts
  • 4Gb de RAM DDRIIPC6400.


Pour les disques, je vais réutiliser mes IDEs existants pour le système, plus mes 2*250GB SATAII. Plus tard, je rajouterai 2*1TB de disques pour le filer.
Enfin, niveau système, mon coeur balance. Pour le filer, je pense que ZFS s'impose. Mais j'ai aussi besoin de pouvoir lancer plusieurs VMs, notamment une NetBSD-4, une NetBSD-5 et une -current. Du coup, j'hésite.
OpenSolaris me paraît une bonne option, même si je connais moins que Debian ou netBSD par exemple.
A suivre.

Thursday, February 26 2009

Hadopi, le Net en danger!

HADOPI - Le Net en France : black-out

Saturday, January 31 2009

Migration de données MySQL -> PostgreSQL

Je suis en train de me refaire une box toute propre.
Un OpenBSD 4.4, avec un gros /var de 130Gb en RAID 1 pour un minimum de sécurité.
Je suis en train de recopier les configs de Bind, Postfix, Courier, à l'identique.
Ce changement de box aura surtout été l'occasion de me séparer de MySQL, et sans regrets.
Alors, pour mémoire, voici la bonne solution pour migrer des donneés (je parle pas des structures) de MySQL vers PostgreSQL sans trop de soucis:

  • Depuis PHPMyAdmin, sélectionner la table que vous voulez exportez, puis choisir Export
  • Le format à sélectionner est "CSV for Microsoft Excel" ;'( Ne pas oublier pas de cocher "Put fields names in the first row" pour avoir le nom des colonnes dans le fichier. Sans çà, postgres râle à l'import
  • Sauvegarder tout çà dans un fichier pour ensuite l'importer à la bonne place dans Postgres.

Monday, January 19 2009

Résolutions 2009

Oué, bon, je sais.

Ca fait des lustres que j'ai rien publié sur ce site, mais y'avait une bonne raison; j'avais rien à raconter.
Nouvelle année, çà veut dire nouvelles résolutions.
Pour moi, 2009, çà devrait être une grosse année vélo, avec, au programme:

  • la Grande Traversée du Massif Central du 01er au 09 Mai, avec Jacques, Stan et Pascale.
  • la semaine de la Méga à l'Alpe d'Huez, enchaînée avec la semaine de la Mountain of Hell aux 2 Alpes avec mes potes de Toulouse, en Juillet.
  • la Maxi de Val Tho un peu plus tard - en Août - toujours avec les mêmes.
  • la ronde des Lacs à Aydat début Septembre
  • le Roch des Monts d'Arrée en Bretagne fin Septembre
  • et pour finir, le Roc d'Azur début Octobre.


Plus de détails à venir, en particulier sur la GTMC.

Tuesday, November 18 2008

Je soutiens le logiciel libre, j'adhère à l'April!

Par l'intermédiaire de ce billet, je me fais le relais de la campagne d'adhésion de l'April, Association pour la Recherche en Informatique Libre. L'April est une association française qui milite pour la démocratisation et la diffusion des logiciels libres auprès du grand public, des professionnels ets des institutions.

Promouvoir et soutenir le logiciel libre

- page 1 of 13