PyGitWeb – news :)

Suite au précédent article sur PyGitWeb, j’ai continué de travailler dessus… Et ça commence à ressembler à quelque chose! :)

Dorénavant, PyGitWeb génère une page au format xHTML. Elle est générée à partir d’un template. Elle supporte les thèmes via une feuille CSS.

Sur la vue principale PyGitWeb affiche juste le dernier commit de tous les dépôts. Si des modifications non commitées existent, un lien vers le diff apparait.

PyGitWeb (diff masked)

PyGitWeb (diff masked)

Lorsque l’on clique sur le lien vers le diff, on affiche uniquement le dépôt concerné et en dessous le diff :

PyGitWeb (displaying diff)

PyGitWeb (displaying diff)

Il me reste quelques petites fonctionalités à ajouter et le code à nettoyer puis je poste la version 0.1… Ah j’oubliai il me faut aussi un logo!

Stay tuned! :)

Manual upgrade of lighttpd on Debian Lenny

Debian c’est bien parce que c’est stable (encore que mon serveur s’est vautré ce weekend à cause de grub!) mais si vous utilisez Lighttpd, vous n’avez pas les mises à jour de sécurité! Même la version dans Sid est obsolète!!!

Cependant, comment installer une nouvelle version de Lighttpd sans chambouler votre Lenny et en gardant les scripts de démarrage et fichiers de configuration?

La solution propre :

On télécharge le tarball de Lighttpd :

> jpec@server:~$ wget http://download.lighttpd.net/lighttpd/releases-1.4.x/lighttpd-1.4.26.tar.gz

On le décompresse :

> jpec@server:~$ tar xzvf lighttpd-1.4.26.tar.gz
> jpec@server:~$ cd lighttpd-1.4.26/

On installe les dépendances :

> jpec@server:~$ sudo apt-get install libpcre3-dev  libbz2-dev

On compile et installe l’éxécutable :

> jpec@server:~$ ./configure
> jpec@server:~$ make
> jpec@server:~$ sudo make install

On modifie le fichier /etc/init.d/lighttpd pour mettre à jour le lien vers l’éxécutable :

PATH=/sbin:/bin:/usr/sbin:/usr/bin
#DAEMON=/usr/sbin/lighttpd      # JPEC -- Suppression version debian
DAEMON=/usr/local/sbin/lighttpd # JPEC ++ Utilisation version compilée
NAME=lighttpd

Et on relance le serveur web !

PyGitWeb – a python web git browser

Contexte

J’aime bien Git.

C’est le système de versionning/gestion de sources décentralisé créé par Linus Torvalds (le créateur de Linux pour les incultes!). Cependant, à l’inverse de Mercurial, il ne propose pas par défaut un serveur web pour naviguer dans les sources et les versions. Il y a bien des CGIs (gitweb et autres) pour combler ce manque mais ils sont tous trop lourds et complexes à mettre en oeuvre à mon goût.

Comme je désire avoir un moyen simple de naviguer (en lecture seule) dans plusieurs dépôts git sur mon serveur, j’ai décidé de coder mon propre outil : PyGitWeb.

Technologie

J’avais le choix de coder mon outil en PHP, Perl, Ruby ou Python et c’est ce dernier que j’ai choisit. Le serveur http est Lighttpd qui appelle l’interpréteur Python.

Fonctionnalités désirées

L’objectif d’avoir une page web (http://server/git/ par exemple) qui permet d’afficher tous les dépôts présents sur le serveur. On doit ensuite pouvoir aller consulter les commits, les versions, et les diffs/patchs. Pour finir, j’ajouterai une génération des tarballs pour chaque version.

Après 2 heures de réflexion, voici une ébauche (cliquez sur l’image pour agrandir) :

PyGitWeb

PyGitWeb

Sur cette ébauche, le programme va créer des instances Git pour chaque dépôts paramétrés. Il affiche une liste des dépôts et leur dernier commit. Je dois maintenant ajouter la gestion des liens et de la méthode GET pour le programme (pour passer les paramètres via l’URL). Aussi, la page est actuellement au format texte et il faut que je bascule au format xhtml.

QRQVB : Protocole TCP (1/2)

Nouvelle QRQVB et pas des moindres, le protocole TCP (Transmission Control Protocol, Protocole de Contrôle de Transmission).  Comme son petit frère UDP, TCP se situe en couche 4 du modèle OSI.

Caractéristique de TCP

TCP est bien plus compliqué qu’UDP examiné au chapitre précédent. Il apporte en contrepartie des services beaucoup plus élaborés.

  • TCP contient un mécanisme pour assurer le bon acheminement des données. Cette possibilité est absolument indispensable dès lors que les applications doivent transmettre de gros volumes de données de façon fiable. Cette fonction est assurée par un mécanisme d’acquittement (ou accusé de réception). Les paquets de données sont acquittés de bout en bout et non de point à point. C’est à dire que ce sont les machines sources et machines de destinations qui s’occupent de cela et non les routeurs qui se situent entre les 2.
  • Le protocole TCP permet l’établissement d’un circuit virtuel entre les 2 machines qui échangent de l’information (Voir a ce propos le commentaire de Guizmo.7). On dit aussi que TCP  fonctionne en mode connecté (par opposition à UDP qui est en mode non connecté). En pratique, l’une des 2 machine doit effectuer un appel que l’autre doit accepter. S’en suit une discutions afin d’établir certains paramètres de communication. Une fois les préliminaires terminés, les protocoles informent les applications respectives que la connexion est établie et que le transfert peut débuter. Durant le transfert, le dialogue entre les protocoles continue, pour vérifier le bon acheminement des données.
  • TCP a la capacité de mémoriser les données. Les paquets pouvant prendre chacun un chemin différent pour arriver à destination, il arrive que ceux ci n’arrivent pas dans le bon ordre. Grâce à cette capacité de mémorisation, TCP garde les paquets un certains temps et les reconstitue lorsqu’ils sont tous arrivés afin de présenter les données à l’application.
  • TCP simule une connexion en « full duplex ». Pour chacune des 2 machines en connexion, l’opération qui consiste à lire des données peut s’effectuer indépendamment de celle qui consiste à en écrire.

Entête TCP

L’entête TCP est codé sur 20 octets hors options.

  • Port Source (16 bits): Port utilisé par l’application sur la machine source.
  • Port Destination (16 bits): Port de destination.
  • Numéro d’ordre (32 bits): Correspond au numéro du paquet. Cette valeur permet de situer à quel endroit du flux de données le paquet, qui est arrivé, doit se situer par rapport aux autres paquets.
  • Numéro d’accusé de réception (32 bits): Acquittement pour les paquets reçus. Cette valeur signale le prochain numéro de paquet attendu. Par exemple, si il vaut 1500, cela signifie que tous les datagrammes <1500 ont été reçus
  • Offset (4 bits): Le champ Offset est codé sur 4 bits et définit le nombre de mots de 32 bits dans l’entête TCP. Ce champ indique donc où les données commencent.
  • Réservé (6 bits): Champ inutilisé actuellement. Il était à l’origine prévu pour l’avenir. On peut dire aujourd’hui que ce champ restera vide.
  • Drapeaux (flags) (6×1 bit): Les drapeaux représentent des informations supplémentaires :
    URG: si ce drapeau est à 1 le paquet doit être traité de façon urgente.
    ACK: si ce drapeau est à 1 le paquet est un accusé de réception.
    PSH (PUSH): si ce drapeau est à 1, le paquet fonctionne suivant la méthode PUSH.
    RST: si ce drapeau est à 1, la connexion est réinitialisée.
    SYN: Le Flag TCP SYN indique une demande d’établissement de connexion.
    FIN: si ce drapeau est à 1 la connexion s’interrompt.
  • Fenêtre (16 bits): Champ permettant de connaître le nombre d’octets que le récepteur souhaite recevoir sans envoyer d’accusé de réception.
  • Somme de contrôle (Checksum ou CRC): La somme de contrôle est réalisée en faisant la somme des champs de données de l’en-tête, afin de pouvoir vérifier l’intégrité de l’en-tête
  • Pointeur d’urgence (16 bits): Indique le numéro d’ordre à partir duquel l’information devient urgente.

Établissement d’une connexion


Une ouverture de connexion TCP s’effectue en 3 temps.

L’émetteur du premier paquet doit avoir connaissance du couple IP : Port de l’application de la machine réceptrice (par exemple, on contact un serveur HTTP sur le port 80 qui lui est dédié). L’émetteur de ce premier paquet est à l’origine de l’établissement du circuit virtuel. C’est une attitude qualifiée de « cliente« .

Le récepteur du premier paquet accepte l’établissement de la connexion, ce qui suppose qu’il était prêt à le faire avant que le client en prenne l’initiative. C’est une attitude de « serveur« .

Le client envoie un segment comportant le drapeau SYN à 1. Le serveur répond avec sa propre séquence (SYN = 1) mais il doit aussi acquitter le paquet précédent, ce qu’il fait avec ACK. Le client répond alors avec un acquittement de la séquence du serveur (ACK = 1).

Une fois achevée cette phase appelée « Three-way handshake », les 2 applications sont en mesure d’échanger des données.

Conclusion

Voilà pour une première partie sur TCP. La seconde partie permettra de voir comment fonctionne la clôture d’une connexion ainsi que l’acquittement des paquets durant les transferts de données.  TCP est bien plus compliquer à aborder qu’UDP et c’est pourquoi je préfère le faire en 2 parties. J’essaierai d’ajouter dans la seconde partie quelques captures de trames afin d’illustrer ceci plus clairement. N’hésitez pas à laisser des commentaires si certaines notions vous paraissent mal expliquées ou trop survolées dans ce billet.

Au fait, bonne année 2010 !

Il ne me reste que quelques heures pour vous souhaiter une très bonne année 2010 avant de passer pour un idiot ensuite… Comment ça, je passe déjà pour un idiot ? Tant pis. Autrement, je pense que le rythme de publication des billets ne va pas augmenter cette année. Entre ma thèse, l’enseignement et le blog [...]

Sonata : Recherche sur Wikipédia en français

Utilisant depuis peu Sonata ( qui pour rappel est une interface graphique à MPD ), j’ai eu une désagréable surprise. Rien de bien grave mais la fonction de recherche d’informations sur les artistes pointe automatiquement vers le site anglophone de Wikipédia. Vous avez sûrement compris : Une recherche sur http://fr.wikipedia.org/ est bien plus adéquate !

Ayant un peu de temps à perdre, je me suis mis en tête de résoudre ce petit désagrément. Cette article n’a rien d’exceptionnel, il indique juste pas à pas la démarche effectuée par mes soins… Rien de bien difficile à vrai dire, mais cela prouve que les systèmes GNU/Linux possèdent bien des avantages :) .

How to :

Premièrement, il faut rechercher la location des fichiers concernant Sonata :

$ locate sonata
/home/gnu/.config/sonata
/home/gnu/.config/sonata/art_cache
/home/gnu/.config/sonata/sonatarc
/usr/bin/sonata
/usr/lib/python2.6/site-packages/sonata
/usr/lib/python2.6/site-packages/sonata/__init__.py
/usr/lib/python2.6/site-packages/sonata/__init__.pyc
/usr/lib/python2.6/site-packages/sonata/about.py
...

À priori, une recherche du terme “wikipédia” dans le répertoire /usr/lib/python2.6/site-packages/sonata doit suffire…

$ grep -r "wikipedia" /usr/lib/python2.6/site-packages/sonata
/usr/lib/python2.6/site-packages/sonata/main.py:            browser_not_loaded = not misc.browser_load("http://www.fr.wikipedia.org/wiki/Special:Search/" + urllib.quote(mpdh.get(self.songinfo, 'artist')), self.config.url_browser, self.window)
/usr/lib/python2.6/site-packages/sonata/main.py:            browser_not_loaded = not misc.browser_load("http://www.fr.wikipedia.org/wiki/Special:Search/" + urllib.quote(mpdh.get(self.songinfo, 'album')), self.config.url_browser, self.window)
...

Bingo ! Le terme “wikipedia” est bien présent dans le fichier main.py, il ne reste plus qu’à le modifier :

# nano /usr/lib/python2.6/site-packages/sonata/main.py
def on_link_click(self, type):
browser_not_loaded = False
if type == 'artist':
browser_not_loaded = not misc.browser_load("http://www.fr.wikipedia.org/wiki/Special:Search/" + urllib.quote(mpdh.get(self.songinfo, 'artist')), self.config.url_browser, self.window)
elif type == 'album':
browser_not_loaded = not misc.browser_load("http://www.fr.wikipedia.org/wiki/Special:Search/" + urllib.quote(mpdh.get(self.songinfo, 'album')), self.config.url_browser, self.window)

Astuce : Pour effectuer une recherche avec nano appuyez sur les touches Ctrl + H

Sauvegarde du fichier et un petit test : Ça fonctionne :) .

Pour finir, voici la version utilisée de Sonata sur mon Archlinux :

$ yaourt -Si sonata
Dépôt                 : extra
Nom                   : sonata
Version               : 1.6.2.1-1
URL                   : http://sonata.berlios.de/
Licences              : GPL3
Groupes               : --
Fournit               : --
Dépend de             : pygtk  python-mpd
Dépendances opt.      : gnome-python-extras: Enhanced system tray support
                        tagpy: Metadata editing support
                        zsi: Lyrics fetching support
                        dbus-python: Various extra functionality (e.g.
                        multimedia keys support)
Est en conflit avec   : --
Remplace              : --
A télécharger         : 503,11 K
Taille (installé)     : 1976,00 K
Paqueteur             : Andrea Scarpino
Architecture          : i686
Compilé le            : dim. 04 oct. 2009 15:24:15 CEST
somme MD5             : 3540c1c796a3457028fbe672c2e9f623
Description           : Elegant GTK+ music client for MPD

Liens :

Linuxmint-fr fait peau neuve

Après une semaine de travaux, le site de la communauté francophone de LinuxMint réouvre avec une toute nouvelle interface. Dorénavant propulsé par Joomla, le site met en avant l’esprit communautaire et social avec notamment la possibilité d’ajouter des utilisateurs en tant qu’amis, ou encore de rejoindre des groupes d’utilisateurs comme les groupes KDE, Gnome, France, Belgique etc…

S’ajoute à ça un système permettant de donner des points aux utilisateurs sur le forum.

Je vous invite donc tous à vous y rendre, ne serait-ce que pour tester toutes ces nouvelles fonctionnalités peu communes sur les sites des communautés des différentes distributions.

www.linuxmint-fr.org

Screenshots de la semaine

DWM clean

DWM mutt in tmux

DWM mutt in tmux

DWM chromium

DWM chromium

Mon dépot mercurial pour DWM : http://server.julienpecqueur.com:10000/.

Moins de 10% des adresses IPv4 non allouées. Et après?

Hier, le NRO (Number Resolution Organization), représentant officiel des 5 Registres Internet Régional (Regional Internet Registries – RIR) qui sont en charge de l’allocation des plages d’adresses IP, a annoncé que moins de 10% des adresses IPv4 sont encore disponibles. Ce stock devrait s’épuiser d’ici 2011 ou 2012. Le problème est connu depuis longtemps et les FAI comme les entreprises mettent du temps à passer à IPv6. Pour rappel, la norme IPv6 a été créée en 1994. Les FAI ont donc largement eu le temps de le prendre en compte et de s’y préparer.

La solution pour pallier au manque d’adresses IPv4 semble donc clair pour tout le monde : switcher vers IPv6. Cette solution inéluctable a pour l’instant pu être retardée grâce à 2 technologies : DHCP et NAT. DHCP pour qu’un appareil éteint de conserve pas une adresse IPv4 inutilisée, permettant de réatribuer cette adresse à un autre appareil. Le NAT quant à lui permet à des machines possédant une adresse privée d’accéder à internet par un système de transformation d’adresse IP. Je reviendrai plus en détail sur cette technologie dans un prochain article.

Pour ne pas s’embêter avec IPv6, les FAI nous sortent donc un nouveau lapin de leur chapeau : le NAT « globalisé ». L’idée est la suivante : partager une adresse publique IPv4 entre plusieurs abonnés. Les box des abonnés recevraient chacune une adresse privée et le FAI s’occuperait du NAT. Ça n’a l’air de rien comme ça, mais ça signifie l’arrêt des serveurs perso hébergés à la maison et du peer to peer car l’abonné serait alors incapable de mettre en place une redirection de port vers sa machine comme on le fait actuellement lorsqu’on configure sa box.

Les sources :

L’annonce du NRO

Le NAT élargie

Archlinux, un live CD/USB non figé.

Il faut avoir lu le wiki pour créer un live d’Archlinux (ou savoir comment faire) pour suivre cet article.

AUFS est un système de fichier permettant d’unifier plusieurs répertoires en un seul, c’est une réécriture d’unionfs 1.x

Certains projets propres à Archlinux l’utilisent comme par exemple devtools (makechrootpkg qui permet de construire un paquet dans un chroot) ou encore archiso (création d’un live).

AUFS permet donc de fusionner plusieurs répertoires en un seul, la priorité étant donnée au premier dans la liste si deux fichiers portent le même nom; par défaut, le premier répertoire de la liste est en lecture/écriture et le reste est en lecture seule, tout ajout ou modification sont répercutés sur le premier répertoire.
Voyons voir un exemple en prenant l’arborescence suivante:

# tree
.
|-- a
|   |-- fichier_1
|   `-- fichier_2
|-- b
|   |-- fichier_1
|   `-- fichier_3
|-- c
`-- result
 
4 directories, 4 files
# more a/fichier_1 b/fichier_1 
::::::::::::::
a/fichier_1
::::::::::::::
1
::::::::::::::
b/fichier_1
::::::::::::::
2

Montons a/ et b/ dans result/:

mount -t aufs -o br:a=ro:b none result/

On le monte en lecture seule, ça nous donne comme résultat:

# tree result
result
|-- fichier_1
|-- fichier_2
`-- fichier_3
 
0 directories, 3 files
# cat result/fichier_1 
1

Ainsi, on se retrouve avec l’ensemble des fichiers et comme fichier_1 était en double, le premier répertoire (a/) a la priorité.

Maintenant, disons, qu’on veut modifier un élément, comme le répertoire est monté en lecture seule, on ne peut pas, il suffit pour y remédier de changer ou rajouter une branche en lecture/écriture:

# mount -t aufs -o remount,prepend:c none result/
# echo 4 > result/fichier_1
# umount result/
# cat c/fichier_1 
4
# cat a/fichier_1 
1
# cat b/fichier_1 
2

On a modifié le contenu de result/fichier_1, ce qui a laissé intact les fichiers du même nom sur a/ et b/ mais a créé un nouveau fichier dans la branche avec possibilité d’écriture : c/.

C’est exactement le même principe qui est appliqué au liveCD servant à l’installation d’Archlinux ou tout autre live construit avec archiso (en tout cas, jusqu’à cet instant), une partition tmpfs est monté en premier, ainsi, on peut écrire, les différentes couches composant le live sont montées par la suite.

Au cas où, on peut avoir des informations sur un répertoire monté avec AUFS dans /sys/fs/aufs/si_X:

# mount -l -t aufs
none on /tmp/aufs_test/result type aufs (rw,relatime,si=f55ed40b26bb76b5)
# cat /sys/fs/aufs/si_f55ed40b26bb76b5/br*
/tmp/aufs_test/c=rw
/tmp/aufs_test/a=ro
/tmp/aufs_test/b=ro

Partant de là et en supposant que vous avez lu le wiki pour créer un live d’Archlinux, créons un live qui ne sera pas figé et qu’on peut un minimum personnaliser.

Le principe est simple, il nous faut une partition indépendante qui fera office de couche lecture/écriture pour notre live, pour la détecter et l’utiliser, on va se baser sur la méthode de détection du support par le hook archiso, lors de la création du live, une étiquette est donnée à l’image iso créée et cette étiquette est fournie comme paramètre du noyau dans la configuration de isolinux:

append initrd=/boot/archiso.img  lang=fr locale=fr_FR.UTF-8 ramdisk_size=75% archisolabel=ARCH_201001

(par défaut, l’étiquette est ARCH_ + année + mois)

On choisit par exemple rootrw comme étiquette à donner à notre partition et le paramètre rootlabel pour le noyau.
Prenons le cas le plus simple, une clé usb reconnue en tant que /dev/sdb dont on va utiliser la première partition préalablement créée:

mkfs.ext2 -L rootrw /dev/sdb1

C’est censé être du live, ext2 est largement suffisant.

La détection et le montage de la racine se fait dans les hooks archiso-early et archiso, modifions un peu ces hooks pour détecter notre partition, le patch (par rapport à ce commit): archiso_rootrw.patch
Le patch peut sûrement être meilleur, mais là, en pleins dans les phases de tests, il fonctionne, c’est le principal.

Pour tester:

wget http://tuxce.selfip.org/wp-content/uploads/2010/01/archiso-git-20100111-1.src.tar.gz
tar zxvf archiso-git-20100111-1.src.tar.gz
cd archiso-git
makepkg --skipinteg -i

Le PKGBUILD télécharge un snapshot d’archiso et ce dernier change le md5sum (une subtilité de cgit sûrement ou une histoire de timestamp, j’ai pas cherché), d’où le skipinteg.

Une fois cette version d’archiso installée, il nous faut modifier isolinux.cfg, recréer l’initrd et le .iso. En se basant sur le wiki, on rajoute les lignes suivantes à isolinux.cfg:

label perso
kernel /boot/vmlinuz26
append initrd=/boot/archiso.img  lang=fr locale=fr_FR.UTF-8 ramdisk_size=75% archisolabel=ARCH_201001 rootlabel=rootrw

On refait l’étape mkinitcpio puis on recrée l’image:

rm exemple.iso
mkarchiso iso traitement exemple.iso

On s’assure que la clé usb est insérée et on lance un qemu en démarrant sur l’entrée perso pour tester:

qemu-kvm -k fr -m 512 -hda exemple.iso -hdb /dev/sdb

Il n’y a plus qu’à faire des modifications et redémarrer l’image.

En théorie, le test devrait être concluant (en tout cas chez moi :) ), mais ce qui serait mieux, c’est d’avoir le live et la partition de modification sur le même périphérique, en supposant que votre clé usb est reconnue en tant que /dev/sdb:

dd if=exemple.iso of=/dev/sdb
fdisk /dev/sdb << EOF
n
p
2
 
 
p
w
EOF
mkfs.ext2 -L rootrw /dev/sdb2

Ceci devrait être suffisant pour avoir un live pouvant être modifié.

Pour plus de détails n’hésitez pas à jeter un coup d’oeil aux scripts composant archiso, à mkarchroot (pour par exemple mettre à jour le live) ainsi qu’à man aufs

vœux

On pourrais croire que le blog est mort, on pourrais le croire … mais non !

Bonne année à tous.

Rapport de stage sur la mise en place de Squid et Egroupware

J’ai longuement hésité à mettre ce rapport de stage en ligne pour plusieurs raisons. Tout d’abord, ce rapport n’est pas vraiment représentatif du travail fournit. La majorité des solutions expliquées m’ont demandées beaucoup de temps de recherche et d’arrachage de cheveux (notamment pour la migration des comptes sous Lotus Notes). Ensuite, la qualité rédactionnel est loin d’être au rendez-vous. On m’a beaucoup reproché que ce rapport était trop technique et c’est plutôt vrai. Enfin, ce document ne décrit pas vraiment l’installation de Squid et d’Egroupware. Ces parties sont survolées et je m’attarde plus sur la résolution des problèmes rencontrés (résoudre un conflit de schéma LDAP quand on a jamais vu OpenLDAP de sa vie n’est pas chose aisée).

Un mois après la fin de la formation, je me décide tout de même à le mettre en ligne. Je pense que ce rapport décrit plutôt bien ce que peut être le métier de technicien réseau dans une administration ou une PME. Le problème lors de la mise en place d’un nouveau service n’est pas l’installation et la configuration de ce service mais la migration des anciens services utilisés vers les nouveaux. Surtout lorsque l’ancien service est un système propriétaire vieillissant (Je veux parler ici de Lotus Notes 5).

Squid est un proxy http très utilisé, dont j’ai pu découvrir une partie des possibilités. Egroupware est un groupware fournissant un agenda, un client mail, un carnet d’adresses, un système de réservations des ressources et plusieurs autres choses, le tout dans une interface web. Je vous invite à tester la demo sur le site du projet.

Ce rapport fait 38 pages et voici son sommaire :

  1. Remerciements
  2. Objectif du stage
  3. L’entreprise
    1. Historique
    2. La structure actuelle
    3. Le service informatique
  4. Spécifications
    1. Environnement de travail
    2. L’existant
    3. Besoins et contraintes
      1. Squid
      2. Egroupware
  5. Mise en œuvre
    1. Proxy
      1. Planning prévisionnel
      2. Mise en œuvre
        1. Squid
        2. Sarg
        3. Squidguard
      3. Problèmes rencontrés
      4. Annexes
    2. eGroupware
      1. Schéma fonctionnel
      2. Planning previsionnel
      3. Mise en œuvre
        1. Configuration de openldap
      4. Problèmes rencontrés
        1. Conflit de schéma openldap
        2. Configuration de felamimail
      5. Préparation de la migration des utilisateurs
        1. Création du carnet d’adresses principal
        2. Importation des agendas Lotus Notes
        3. Importation des carnet d’adresse Lotus Notes
        4. Exportation des mails depuis LotusNotes dans eGroupware
        5. Importation mail depuis roundcube
      6. Annexes
  6. Procédure de migration serveur
    1. Sur Revy
    2. Sur Revnew

Lien de téléchargement (pdf)

urxvt: modifier le fond pendant l’exécution

J’aime assez avoir de la vrai transparence sur un terminal, urxvt le permet, j’en profite. Par contre, quand des fenêtres s’entassent comme ça m’arrive trop souvent à mon goût, et que j’ouvre un fichier de configuration ou les sources d’un programmes, avec la colorisation, c’est tout simplement illisible…

Donc, là commence la recherche, il faut trouver comment modifier la configuration d’urxvt en cours de fonctionnement, je connaissais comment changer la police mais ça s’arrêtait là… Une recherche sur le net n’a pas donné grand chose, mais c’est sans compter sur les pages man :)

urxvt propose une page à la section 7:

man 7 urxvt

Cette dernière couplée avec celle par défaut répond à toute les questions sur la configuration, on y découvre (si ce n’est pas déjà connu), qu’il suffit d’utiliser les caractères d’échappement pour modifier certaines ressources.
La syntaxe est simple:

echo -e '\033]Ps;Pt\007'

Ps étant le code de la ressource à modifier et Pt la valeur, ainsi pour changer de fond d’écran:

# Fond noir opaque:
echo -e '\033]11;#000\007'
# Fond noir transparent à 80%:
echo -e '\033]11;[80]#000\007'

Reste plus qu’à mettre un raccourci, il suffit de rajouter deux ressources URxvt.keysym dans le ~/.Xdefaults:

URxvt.keysym.Control-t: command:\033]11;[80]#000\007
URxvt.keysym.Control-M-t: command:\033]11;#000\007

Ctrl-Alt-t enlève la transparence.
Ctrl-t la remet.

Il est bien ce urxvt quand même.

Avoir un sys-tray dans DWM !

J’ai enfin trouvé une solution pour avoir un sys-tray (la zone qui contient toutes les icônes des applications en arrière plan dans la statusbar)!

fbpanel-dwm dans DWM :)

fbpanel-dwm dans DWM :)

Suite à la discussion que j’ai lancé hier sur la mailing list de suckless, j’ai essayé plein de solutions sans succès jusqu’à ce que Anders envoie sa propre solution que je vais vous présenter ici.

Installer fbpanel-dwm

Anders m’a expliqué comment modifier fbpanel pour l’adapter à notre utilisation. J’ai donc créé ma propre version de fbpanel nommée fbpanel-dwm qui est disponible ici : archive tar.gz.

Si vous avez déjà une version de fbpanel installée, il faut la désinstaller avant!

Décompressez l’archive et installez fbpanel-dwm suivant la méthode classique :

cd fbpanel-dwm
./configure
sudo make install

Ensuite, créez le répertoire .fbpanel dans votre répertoire utilisateur :

mkdir ~/.fbpanel

Et copiez ce fichier dedans :

Fichier de configuration de fbpanel-dwm.

Modification du fichier ~/.xinitrc

Vous pouvez télécharger mon fichier .xinitrc ou alors modifier le votre de cette façon (lancement de fbpanel-dwm en vert et les clients du tray en rouge) :

while true
do
xsetroot -name "`date +'%d/%m/%Y %k:%M'`"
sleep 1
done &
xcompmgr -c -C &
conky &
sleep 5 && fbpanel &
gmixer -d &
batterymon &
wicd-client &
sonata --hidden &
feh --bg-scale ~/.background.png &
exec ck-launch-session /usr/local/bin/dwm

DWM – Simplicité & élégance…

DWM rocks!

DWM rocks!

Malgrès la découverte de 2 excellents WMs : PekWM et OpenBox, je n’ai pas oublié mon DWM adoré… Pour tous ceux qui trouvent que DWM est un WM de geek moche, voici un screenshot pour les contredire! ^^ transparence, ombres sur les clients, conky… MIAM!

DWM & MPD Client

DWM & MPD Client

Actuellement j’utilise les 2 en parallèle : quand je me login sur tty1, ça lance OpenBox sur le display :0 et quand je me connecte sur le tty2, ça me lance DWM sur le display :1… Ensuite je switch entre les displays via CTRL + ALT + [F8 - F9]. C’est le meilleur moyen pour combiner les avantages des 2 WMs :)

Mon souhait pour 2010 : l’intégration d’une zone de notification dans la status-bar de DWM!

QRQVB : Les paquets UDP

Suite de la Question Réseau Qui Va Bien, nouveau billet purement réseau donc. Je comptais me lancer dans la description des paquets TCP, mais je pense qu’il est plus intéressant de se pencher d’abord sur UDP avant d’appréhender TCP.

UDP (Pour User Datagram Protocol) se situe dans la couche 4 du modèle OSI (couche transport). Pour rappel, au niveau de la couche 3 (IP), les datagrammes sont routés d’une machine à une autre en fonction des adresses IP (en fait, le routage se fait en fonction de l’adresse réseau, voir QRQVB : L’adresse IP). Lors de cette opération de routage, aucune distinction n’est faite entre les différents services pour lesquels ces paquets peuvent être destinés. Que ce soit pour une connexion SSH (port 22) ou HTTP (port 80) ou autre, les datagrammes IP sont tous indifféremment mélangés.

La couche 4 du modèle OSI ajoute un mécanisme qui permet l’identification du service  concerné. Plusieurs programmes de plusieurs utilisateurs pouvant simultanément circuler sur le réseau, il est indispensable de faire un tri entre les applications. Ici, l’idée est d’associer la destination du paquet à une fonction. L’identification de cette fonction ce fait à l’aide d’un chiffre nommé Port.

En tête UDP

Lors de l’étude des datagramme IP, nous avions vu le contenu de l’entête du paquet (partie verte). Ici,  nous allons observer le contenu de l’entête du message (partie jaune) lorsque l’on traite un paquet UDP.

Le paquet UDP est composé de 8 octets.

Les 2 premiers octets contiennent le port source. Codé sur 16 bits donc. C’est le numéro de port de l’émetteur du paquet. C’est aussi le numéro de port sur lequel le destinataire doit envoyer sa réponse.

Les octets 3 et 4 stockent le port de destination. C’est sur ce port que sera remis le paquet lors de sa livraison à la machine ciblée.

Le port étant un entier positif de 16 bits, on en déduit que les bornes sont 0 – 65535 (2^16). Cependant, le port 0 n’est pas exploitable.

Les octets 5 et 6 contiennent la longueur de l’entête UDP et du message. Sa longueur minimal est 8 (entête UDP avec 0 données à transporter) et sa longueur maximal 2^16 = 65535 (64ko).

Les 2 derniers octets contiennent le cheksum. C’est la somme de contrôle de l’entête UDP et des données qui suivent.

Ports réservés

Toute machine qui utilise la pile TCP/IP se doit de connaitre un certains nombre de services bien connus, aussi appelé « well known port number » pour pouvoir dialoguer avec les autres machines sur internet. Sur une machines Unix, cette liste est placée dans le fichier /etc/services et se doit d’être lisible par tous les utilisateurs et toutes les applications. Voici un extrait du contenu de ce fichier :

Nom             Port/Protocol     Commentaire
netstat		15/tcp
 qotd		17/tcp		quote
 msp		18/tcp		# message send protocol
 msp		18/udp
 chargen	19/tcp		ttytst source
 chargen	19/udp		ttytst source
 ftp-data	20/tcp
 ftp		21/tcp
 fsp		21/udp		fspd
 ssh		22/tcp		# SSH Remote Login Protocol
 ssh		22/udp
 telnet		23/tcp
 smtp		25/tcp		mail
 time		37/tcp		timserver
 time		37/udp		timserver
 rlp		39/udp		resource	# resource location
 nameserver	42/tcp		name		# IEN 116
 whois		43/tcp		nicname
 tacacs		49/tcp				# Login Host Protocol (TACACS)
 tacacs		49/udp
 re-mail-ck	50/tcp				# Remote Mail Checking Protocol
 re-mail-ck	50/udp
 domain		53/tcp				# name-domain server
 domain		53/udp
 mtp		57/tcp				# deprecated
 tacacs-ds	65/tcp				# TACACS-Database Service
 tacacs-ds	65/udp
 bootps		67/tcp				# BOOTP server
 bootps		67/udp
 bootpc		68/tcp				# BOOTP client
 bootpc		68/udp
 tftp		69/udp
 gopher		70/tcp				# Internet Gopher
 gopher		70/udp
 rje		77/tcp		netrjs
 finger		79/tcp
 www		80/tcp		http		# WorldWideWeb HTTP
 www		80/udp				# HyperText Transfer Protocol

Les ports 1 à 1023 sont réservés aux « well known ports ». Ils ne peuvent être utilisés que par des applications qui s’exécutent avec des droits privilégiés (root). Les autres ports peuvent être utilisés librement sans privilège particulier et sont en général employés par les applications clientes. Par exemple, sur ma machine, en ce moment, mon client IRC utilise le port 59175 pour communiquer avec le serveur irc holmes.freenode.net.

Mode non connecté

Contrairement à TCP, UDP est conçu pour permettre un échange de données entre 2 applications sans échange préliminaire. UDP est utilisé si les données à transmettre n’ont pas besoin d’être fragmentées en plusieurs paquet. La paquet est ainsi envoyé sans s’assurer qu’il arrive bien à destination. UDP est appelé mode de transport non connecté par opposition à TCP. Plus particulièrement, les paquets a destination d’une application UDP sont conservés dans une pile de type FIFO. Si l’application destinatrice ne les “consomme” pas assez rapidement, les plus anciens paquets risquent d’être écrasés par les plus récents… Un risque supplémentaire de perte de données.

Nous verrons comment TCP peut palier à ce problème dans la prochaine QRQVB

Barre d’information conky

Je me suis concocté un petit ~/.conkyrc plus light et plus lisible pour mon netbook. Toutes les informations sont disposées sur une seule ligne en bas de l’écran (mes fenêtres maximisées ont une marge de 15px pour ne pas recouvrir cette bande).

Aperçu (cliquez sur l’image pour zoomer) :

Barre Conky

Barre Conky

Code :

update_interval 0.5
background yes
own_window yes
own_window_type override
own_window_transparent yes
own_window_hints undecorated,below,sticky,skip_taskbar,skip_pager
draw_shades no
draw_outline no
draw_borders no
border_inner_margin 2
border_width 1
minimum_size 1024x10
draw_graph_borders yes
default_color white
default_shade_color black
default_outline_color black
alignment bm
gap_x 0
gap_y 0
no_buffers yes
uppercase no
double_buffer yes
override_utf8_locale yes
use_xft yes
xftfont Clean:size=8
mpd_host localhost
mpd_password pass
mpd_port 6600
TEXT
${alignc}${kernel} | \
CPU ${freq_g} ${cpubar cpu0 8,10} | \
RAM ${membar 8,10} | \
Swap ${swapbar 8,10} | \
Root ${fs_bar 8,10 /} | \
Data ${fs_bar 8,10 /mnt/documents} \
${if_up eth0}\
| LAN ${addr eth0} ${downspeedf eth0}Ko/s - ${upspeedf eth0}Ko/s \
${endif}\
${if_up wlan0}\
| WIFI ${addr wlan0} ${downspeedf wlan0}Ko/s - ${upspeedf wlan0} Ko/s \
${endif}\
${if_mpd_playing}\
| MPD ${mpd_artist} - ${mpd_title} \
${endif}\

GNU/Linux : Résolution de problèmes

Une grande partie du travail sur les forums concernant les logiciels libres est d’obtenir plus d’informations sur les problèmes des novices. Il est très agréable d’aider les autres comme il peut être assez agaçant d’essayer d’aider quelqu’un qui ne montre aucun effort pour s’aider lui-même. Je ne pense pas que cela soit dû à de la fainéantise de la part de celui qui pose la question. C’est simplement parce que les novices ne connaissent pas les premières étapes de résolution des problèmes sur GNU/Linux et ne savent pas quels types d’informations rechercher ni comment les obtenir. J’espère que ce petit guide sera utile pour ceux qui font leurs premiers pas sur linux.

I -  Diagnostiquer soi-même

1 – La première étape est la collecte d’informations.

Si un programme plante ou ne fait pas ce qu’il est censé faire, il faut se poser et réfléchir calmement. Ouvrez un nouveau fichier dans votre éditeur de texte favori et écrivez-y ce que vous faisiez quand le problème est apparu ainsi que tous les messages d’erreurs reçus. Ces messages d’erreurs doivent être recopiés exactement tel qu’ils sont apparus. Utilisez le copier/coller si cela est possible.

Ouvrez un terminal et tapez tail /var/log/messages. Cette commande affichera les 10 dernières lignes des logs du système. Si celui ci contient un ou des messages qui sont clairement en rapport avec votre problème, recopiez les également. Les erreurs des applications graphiques sont en général dans le fichier .Xsession-errors ou .xsession-errors dans votre dossier /home. La commande pour visualiser les 10 dernières lignes est donc tail ~/.xsession-errors. Comme pour le fichier /var/log/messages, ajoutez les lignes en rapport avec votre problème dans votre fichier de départ.
Si vous n’avez trouvé aucune information dans ces fichiers, essayez de lancer l’application concernée depuis votre terminal. Lors de l’apparition du bug, des messages devraient s’afficher.

Si votre système ne démarre plus suite à un problème, démarrez alors sur une autre distribution (soit en dual-boot si vous en avez soit depuis un live-cd). Il est toujours bon d’avoir un live-cd sous la main pour ce genre d’opération. Une fois que vous avez démarré sur le live-cd, montez votre partition root et récupérez les informations dans les fichiers cités plus haut.

2 – Le problème est-il reproductible?

S’il est possible de reproduire le problème facilement, faites-le. N’oubliez pas de le faire sur des fichiers peu important ou sur une copie du fichier concerné afin de ne pas endommager vos données.

3 – Est-ce un problème matériel ?

Les problèmes non reproductibles sont souvent dus au matériel. Si vous pensez que c’est le cas, regardez alors dans le fichier /var/log/boot ainsi que /var/log/kern.log ou /var/log/kernel.log suivant votre distribution pour voir si le kernel reconnait bien votre matériel. Ce fichier étant très long, la commande tail ne vous sera pas d’un grand secours. Utilisez plutôt less /var/log/boot et parcourez les pages à la recherche d’un message en rapport avec votre problème. Recopiez également ce message dans votre fichier de départ.

4 – Lisez la documentation du programme.

Ceci est à faire en particulier si le programme ne réagit pas de la manière souhaitée. Lisez l’aide en ligne du programme et utilisez également le manuel universel (dans un terminal : man nom_du_programme).

5 – Recherchez votre message d’erreur sur internet

Copiez/collez le message d’erreur dans un moteur de recherche ou un meta-moteur tel que ixquick et ajoutez-y le nom du programme. Vous trouverez certainement des messages sur des forums d’utilisateurs qui ont le même problème que vous. Lisez le thread complet, vous y trouverez peut-être une solution.

6 – Réfléchissez avec logique

Si, arrivé ici, vous commencez à avoir une idée sur la cause du problème, vous pouvez peut être tester cette idée. Il y a beaucoup de petites commandes simples qui peuvent vous aider à recueillir plus d’informations sur votre problème et votre système, qui vont seront d’un grand secours. lspci pour lister votre matériel, lsusb pour lister les périphériques usb, cat /proc/cpuinfo pour avoir les caractéristiques de votre CPU, free -m pour connaitre le taux de charge de votre RAM

7 – Maintenant, vous pouvez penser à demander de l’aide.

Si après tout ça, vous n’avez toujours pas résolu votre problème, il est temps de demander de l’aide sur un forum d’utilisateurs. Avant de passer à cette étape, rappelez vous que les utilisateurs des forums ne sont pas payés pour répondre à vos questions. Ce sont seulement des utilisateurs ayant une certaine expérience et qui font cela bénévolement.

II – Obtenir de l’aide

1 – D’abord, observer

Commencez par choisir votre forum. Il est préférable dans un premier temps de choisir le forum de votre distribution, puis le forum du programme concerné. Si ce forum possède une FAQ, lisez-la. Lisez aussi les règles du forum. Si votre question ne respecte pas les règles, il y a de grandes chances pour que vous n’obteniez pas de réponse.

2 – Ne soyez pas hors-sujet

Trouvez le sous-forum qui correspond à votre problème. Ne postez pas votre message dans plusieurs sous-forums, ceci est très mal vu.

3 – Choisissez bien le titre de votre topic.

N’utilisez pas de sujet tel que « Besoin d’aide » ou « J’ai un problème ». Ceci a tendance à irriter les gens. Votre titre doit indiquer le plus clairement quel problème vous avez. Ainsi, une personne qui pense pouvoir vous aider sera plus encline à lire votre sujet et poster une réponse. Soyez aussi précis que possible. Par exemple « Impossible d’obtenir une adresse IP » sera plus utile que « Je n’arrive pas à aller sur internet ».

4 – Donnez des informations

Dans le corps de votre message, donnez le nom et la version de votre distribution, le nom et la version du programme utilisé et les informations sur votre matériel si cela est nécessaire. Recopiez-y aussi les messages d’erreurs (c’est là que le fichier que vous avez créé au devient utile). Indiquez ce que vous avez fait pour tenter de résoudre le problème. En faisant cela, vous montrerez aux autres que vous ne vous êtes pas jeté sur le forum dès que le problème est apparu.

5 – Pas de langage SMS

Ça saoule! Ça n’aide pas à vous faire comprendre et on vous répondra d’autant moins.

6 – Ne perdez pas une opportunité d’apprendre

Ne suivez pas les conseils aveuglément. Vous êtes ici pour apprendre quelque chose. Si on vous demande d’utiliser un outil en ligne de commande, utilisez les pages man pour savoir à quoi sert cet outil. Vous pourrez ensuite réutiliser cet outil si vous rencontrez un problème similaire. Si on vous demande de poster un fichier pour plus d’informations, recherchez l’utilité de ce fichier. Les fichiers systèmes importants possèdent souvent une page man dédiée.

7 – Dites merci

Les logiciels libres reposent sur la communauté. Personne n’est payé pour vous aider. Les personnes qui vous aident le font car elles ont elles-mêmes reçu de l’aide dans le passé et veulent rendre la pareille. En plus de dire merci, vous pouvez également aider les autres qui ne savent peut-être pas quelque chose que vous savez. Vous ressentirez alors une certaine satisfaction que les logiciels propriétaires ne peuvent vous apporter.

identica-mode for emacs

J’ai découvert hier un mode pour emacs incontournable : identica-mode!

Sur mon téléphone j ‘ai une super application pour consulter ou ajouter des notices sur identi.ca, mais sur mes ordinateurs je passais toujours par le site… Or j’ai découvert en lisant une notice sur identi.ca un mode pour emacs (l’incontournable éditeur de texte, euh plutôt “operating system” libre ! ^^).

J’ai installer le pkg via AUR mais il y avait une erreur de MD5SUM. J’ai donc téléchargé directement le script via le dépôt GIT.

Ensuite il suffit d’enregistrer le fichier identica-mode.el dans le répertoire /usr/share/emacs/site-lisp/ pour qu’emacs le lise au démarrage.

Dans le fichier ~/.emacs, un petit paramétrage est nécessaire :

;;; Identi.ca mode :
(require 'identica-mode)
(setq identica-username "VOTRE USER IDENTICA")
(setq identica-password "VOTRE MOT DE PASSE")
;;; Raccourci clavier pour poster sans avoir le mode identica-mode actif :
(global-set-key "\C-cip" 'identica-update-status-interactive)
;;; Envoyer des messages directs :
(global-set-key "\C-cid" 'identica-direct-message-interactive)

Le résultat (Alt-x identica-mode pour passer dans le mode identica) :

identica-mode on emacs

identica-mode on emacs

Les meilleurs et les pires systèmes d’exploitation de la décennie

ITWorld a publié sa liste des meilleurs systèmes d’exploitation de la décennie ainsi que les plus décevants. Je vous retranscris donc ici cette liste avec un léger résumé.

Décevant

  • Windows Millennium Edition
  • La dernière version de Windows qui tournait encore avec DOS. Tout ceux qui s’en sont approché ont pu voir l’ampleur de la catastrophe…

  • Windows Vista
  • Annoncé comme le système d’exploitation le plus cher en terme de développement, les résultats furent catastrophiques. Manque de pilotes, problème de compatibilité des logiciels, consommation de ressources excessive.

  • Netware 6.5
  • Avec e-Directory, le rêve inassouvi d’un concurrent direct à Active Directory de Microsoft.

  • Windows Mobile
  • Lorsque les PDA ont fusionné avec les téléphones portables, PALM, Symbian ont été dépassé par l’iPhone d’Apple. Dorénavant, l’iPhone est la cible à éliminer et Windows Mobile est loin derrière.

  • GNU Hurd
  • Le nec plus ultra du vaporware open source.

Les meilleurs

  • Windows Server 2008 R2
  • Avouons ici que c’est quand même un bon OS (si on met de coté le fait que le code soit fermé et malgré l’hilarante faille SMB2) et les entreprises lui font confiance.

  • Mac OS X
  • Ça juste marche! Les cotés positifs sont les graphismes et l’intégration. Les utilisateurs le trouvent intuitif et c’est ce qui fait son succès malgré le prix.

  • Solaris/OpenSolaris 10
  • Un autre cas d’excellence. Sun (bientôt Oracle) a construit un des dérivés Unix les plus fiable. De plus Solaris est devenue ouverte et relativement libre.

  • GNU/Linux (> 2.6.18)
  • Un noyau et des utilitaires libres, rapides et efficaces. Les distributions les plus populaires : Ubuntu, Novell / Suse, Mandriva, Fedora pour le desktop et Red Hat qui dominent le marchés des serveurs d’entreprises.

  • Google Android
  • Un système d’exploitation ouvert pour les téléphones ne fut pas facile à imposer. Google l’a fait.

Article original sur ITWorld