Porneia delights

[Attention, ce qui suit n'est pas une opération anodine et n'est pas n00b friendly. Nous allons faire quelque chose qui peut mettre en rade (un peu) votre système si vous faîtes n'importe quoi. Si vous ne vous sentez pas sûr de vous, passez votre chemin.]

— J'avais déjà fait un article sur le sujet concernant Gentoo. Nous allons voir comment faire cela sur tout autre distribution que Gentoo (si vous êtes sous Gentoo, la combine est beaucoup plus simple que ce qui suit, il vous suffit d'éditer l'ebuilds de votre version de coreutils et de décommenter les lignes qui concerne le patch ???_all_coreutils-gen-progress-bar.patch et d'émerger les coreutils ; je n'ai plus de Gentoo sous la main, mais c'est pas dur, donc je vous laisse faire ;)).

Nous allons implémenter à notre cp et à notre mv une option -g qui va nous donner une barre de progression de ce style :

$ cp mongrosfichier.file ~/dossier
mongrosfichier.file   |  40% |   703 MiB |    17 MiB/s | ETA 00:00.25

Et pour faire cela, nous allons récupérer les sources de la dernière version stable des coreutils (qui vous permet d'avoir cp, mv, touch, ls et j'en passe) de lui appliquer un patch, de compiler et de l'installer. À noter que vous allez avoir plusieurs choix : on peut installer dans les répertoires des binaires systèmes ce qui aura pour effet d'écraser votre version des coreutils présentes sur votre système. De plus, lors d'une mise a jour des coreutils par votre distribution, il y a de fortes chances pour qu'elle écrase votre installation des coreutils à vous donc il faudra réinstaller votre version. Mais ici nous allons agir autrement.

Ce que nous allons faire est plus sûr en cas de bêtise et vous évitera des désagrément au cas où ça foire à cause d'une erreur d'inattention de votre part ;) On va faire en sorte d'installer tout ca dans /usr/local/ et de rajouter un préfixe aux binaires, comme ça pas de problèmes, si vous avez un soucis, votre système de base sera préservé (vous aurez donc un /bin/cp et un /usr/local/bin/patch-cp par exemple et il suffira de faire un alias pour que ça vous soit transparent, on verra ça à la fin). Mais si vous avez envie de faire autrement, libre à vous, il suffit de jouer avec ./configure.

Question dépendances, vous avez besoin de bash, glibc et de pam si vous en activez l'option (les *-dev compris, car oui nous compilons).

Allons d'abord récupérer les sources de coreutils de la derniere version stable, soit la 6.9 (si vous préférez une version antérieure, il y a un patch correspondant pour chaque version mais nous allons ici travailler avec la version 6.9). Je vous laisse donc extraire l'archive où bon vous semble.

Dans un second temps nous allons récupérer le patch pour notre version sur le site de développement de Gentoo. Prenez bien le patch correspondant à la version de vos sources. Pour la 6.9 le dernier est : coreutils-6.9-patches-1.3.tar.bz2 ; de même décompressez ça où bon vous semble. Un répertoire patch va être extrait, dedans récupérer le patch du nom de 001_all_coreutils-gen-progress-bar.patch dans le dossier generic/. Déplacez ce patch à la racine du dossier de coreutils (dans le dossier coreutils-6.9/ donc).

Nous allons devoir maintenant modifier un peu ce patch en enlevant la définition du répertoire coreutils/ dans les entrées (en effet on est déjà dans le dossier de coreutils) :

$ sed 's/ coreutils\// /g' 001_all_coreutils-gen-progress-bar.patch > acgpb.patch

Il ne nous reste plus qu'à appliquer notre version de patch (je rappelle que vous devez être dans le dossier coreutils-6.9/) et voir le résultat suivant :

$ patch -p0 < acgpb.patch
patching file src/copy.c
Hunk #3 succeeded at 59 (offset 3 lines).
Hunk #4 succeeded at 93 (offset 1 line).
Hunk #5 succeeded at 253 with fuzz 1 (offset 53 lines).
Hunk #6 succeeded at 335 (offset 48 lines).
Hunk #7 succeeded at 485 (offset 81 lines).
Hunk #8 succeeded at 568 (offset 97 lines).
Hunk #9 succeeded at 771 (offset 95 lines).
patching file src/copy.h
Hunk #1 succeeded at 172 (offset -3 lines).
patching file src/cp.c
Hunk #1 succeeded at 82 (offset 1 line).
Hunk #2 succeeded at 129 (offset 1 line).
Hunk #3 succeeded at 186 (offset 1 line).
Hunk #4 succeeded at 773 (offset 57 lines).
Hunk #5 succeeded at 884 (offset 57 lines).
Hunk #6 succeeded at 944 (offset 57 lines).
patching file src/mv.c
Hunk #1 succeeded at 44 (offset -1 lines).
Hunk #2 succeeded at 82 (offset -1 lines).
Hunk #3 succeeded at 112 (offset -1 lines).
Hunk #4 succeeded at 146 with fuzz 2 (offset -12 lines).
Hunk #5 succeeded at 311 (offset -14 lines).
Hunk #6 succeeded at 379 (offset -14 lines).
Hunk #7 succeeded at 392 (offset -14 lines).
patching file src/remove.h
Hunk #1 succeeded at 60 (offset 12 lines).

Par défaut, cela va s'installer dans /usr/local donc on a juste à spécifier un préfixe de cette façon (notez que vous pouvez aussi rajouter un suffixe avec --program-suffix=) :

$ ./configure --program-prefix=patch-

Puis vient le temps de compiler tout ça :

$ make

Ça prend un peu de temps et pour finir (en root/avec sudo) :

# make install

Cette dernière opération vous donnera donc l'occasion de voir tout ce que contient comme binaire les coreutils ;) À noter que si vous avez pas envie d'installer toutes les binaires, vous pouvez simplement déplacer à la main nos deux binaires mv et cp qui sont dans le dossier src/ vers /usr/local/bin (pensez cependant à rajouter un préfixe histoire d'éviter les conflits)). Je vous conseille de garder tel quel votre dossier de sources, le jour où vous voulez désinstaller cette version patchée des coreutils, il suffira de vous mettre dedans et de faire un simple (en root/avec sudo) :

# make uninstall

Histoire de rendre les choses transparentes, dans votre .profile, .bashrc, .zshrc, .whatever_rc, créer des alias du genre :

alias cp='/usr/local/bin/patch-cp -g'
alias mv='/usr/local/bin/patch-mv -g'

Pour que ça prenne effet immédiatement faîtes un source ~/.bashrc (ou ~/.zshrc ou autre) ou alors redémarrer votre shell. Ainsi, quand vous ferez un cp ou un mv, vous utiliserez naturellement l'option -g sans avoir à le spécifier à chaque fois.

Have fun !


Vous pouvez envoyer par mail vos commentaires et vos remarques à illovae[at]bk[dot]ru.

Progress bar pour cp et mv : l'option -g (1083 mots) de illovæ est diffusé sous la licence WTFPLv2 et Beer-ware (Révision 42).

Vulnerant omnes, ultima necat. Sic transit hominis regnum.
Copyleft © 2008 — illovæ