Planet Archlinux FR

ArchLinux, en Français

Chiffrement de son répertoire personnel

J'ai récupéré un vieux Dell sur lequel j'ai installé ma distribution et mon environnement graphique habituels (Archlinux / Openbox). L'idée est d'en faire un PC à emmener partout. Hum... et à oublier partout ! Donc il faut pour le moins protéger ses données, pour que son éventuelle perte ne permette à quiconque d'explorer nos documents et/ou mots de passe Internet. La solution est évidement le chiffrement, et tout est expliqué sur cette page du wiki d'Archlinux. Mais comme c'est en anglais et que tout ne m'était pas aussi évident que je l'espérais voici un compte rendu de cette opération.

État des lieux :

Archlinux à jour, utilisateur(s) créé(s), mots de passes définis (et solides, il serviront au chiffrement), répertoires personnels créés (et non vides, pour pouvoir tester), suffisamment de place dans la partition dans laquelle est monté /home (environ 2,5 fois plus que la taille du plus gros répertoire à chiffrer). Une bonne sauvegarde ne peut pas nuire. Même si une copie du répertoire sera faite par l'outil de migration (sous la forme /home/USERNAME.xxxxxxx) avant chiffrement, pourquoi ne pas essayer clonezilla ?

Programmes à installer :

# pacman -S ecryptfs-utils rsync lsof pam_mount

Programmes à installer :

# pacman -S ecryptfs-utils rsync lsof pam_mount

Préalable pour pouvoir se relogger facilement :

l'idée est évidement que le répertoire personnel soit monté en clair dès le login. Pour cela nous allons utiliser pam_mount :

1) éditer le fichier /etc/security/pam_mount.conf.xml

rajouter la ligne
<volume user="USERNAME" fstype="ecryptfs" path="/dev/sdXY" mountpoint="/home" options="fsck,noatime" />
un peu avant la fin, juste avant
<mkmountpoint enable="1" remove="true" />
</pam_mount>

2) éditer le fichier etc/pam.d/system-auth

après la ligne contenant 'auth required pam_unix.so' ajouter :
auth    required    pam_ecryptfs.so unwrap

Ensuite, avant la ligne contenant 'password required pam_unix.so' insérer :
password    optional    pam_ecryptfs.so

Et finalement, après la ligne contenant 'session required pam_unix.so' ajouter :
session    optional    pam_ecryptfs.so unwrap

Chiffrement proprement dit :

Démarrer le système sans se logger en tant qu'utilisateur. Depuis le gestionnaire de connexion (lightdm chez moi) passer en console (Alt Ctrl F2) et ouvrir une session root. On peut aussi se logger sur le compte d'un autre utilisateur et passer root dans une console, ce qui permet de profiter de l'environnement graphique et du copier/coller.

Monter le module ecryptfs puis lancer la commande de chiffrement

# modprobe encryptfs
# ecryptfs-migrate-home -u username
INFO: Checking disk space, this may take a few moments. Please be patient.
INFO: Checking for open files in /home/USERNAME
Enter your login passphrase [USERNAME]:

../.. (défilé des fichiers en cours de chiffrement)
Some Important Notes! 1. The file encryption appears to have completed successfully, however, USERNAME MUST LOGIN IMMEDIATELY, _BEFORE_THE_NEXT_REBOOT_ TO COMPLETE THE MIGRATION!!!
2. If USERNAME can log in and read and write their files, then the migration is complete,
and you should remove /home/USERNAME.5ZJvW3ds.
Otherwise, restore /home/USERNAME.5ZJvW3ds back to /home/USERNAME.
3. USERNAME should also run 'ecryptfs-unwrap-passphrase' and record their randomly generated
mount passphrase as soon as possible. 4. To ensure the integrity of all encrypted data on this system, you should also encrypt swap space
with 'ecryptfs-setup-swap'.

Attention :

le  mot de passe (passphrase) à indiquer ici est bien celui utilisé par l'utilisateur pour se logger. Sinon il vous faudra monter le répertoire à la main. Ensuite, comme indiqué ci-dessus, il est essentiel de se logger et de faire des essais de lecture et d'écriture dès que la migration sera terminée, en tous cas avant de redémarrer le système. Enfin lancez la commande
$ ecryptfs-unwrap-passphrase
et notez dans en endroit secret et sûr le nombre de 32 chiffres en hexadécimal qui aura été généré de façon aléatoire et qui vous servira de mot de passe de secours en cas de problème. Le moyen le plus simple est de l'envoyer à vous-même un e-mail chiffré (voir enigmail si vous utilisez Thunderbird) ou, à défaut, de l'enregistrer dans un fichier chiffré (avec GnuPG par exemple)  avant de vous l'envoyer en pièce jointe.

Considérations sur l'ordre de la procédure

Si vous suivez le wiki d'Archlinux vous noterez que contrairement à ce tuto la partie montage automatique au login est traitée dans un second temps. Cela a un avantage didactique évident mais oblige à monter la partition chiffrée "à la main", en ligne de commande. N'essayez donc pas de vous logger en mode graphique, cela ne fonctionnera pas, faites le en console.

En cas de problème

Si rien ne se passe comme prévu, si vous ne retrouvez pas vos données, pas de panique ! Il suffit de vous logger en root sur une console, de supprimer votre répertoire /home/USERNAME ainsi que le répertoire /home/.ecryptfs et enfin de renommer le répertoire de sauvegarde
rm -rf /home/USERNAME 
rm -rf /home/.ecryptfs
mv /home/USERNAME.xxxxxxxx /home/USERNAME

Si tout va bien

au bout de quelques jours (on ne sait jamais) pensez à supprimer la copie non chiffrée de votre répertoire personnel (/home/USERNAME.xxxxxxxx)

Changement de mot de passe

Si pour une raison ou une autre vous souhaitiez changer de mot de passe il faut le faire évidement à la fois pour le login et pour le déchiffrage du dossier.
#changer le mot de passe du login
passwd
#changer le mot de passe de chiffrement
ecryptfs-rewrap-passphrase ~/.ecryptfs/wrapped-passphrase
Dans les 2 cas l'ancien mot de passe sera demandé avant le nouveau.

Autres documentations

wiki.archlinux.fr - doc-ubuntu-fr

[Shaarli] Pacman - Empêcher l'installation de locales

Pacman - Empêcher l'installation de locales

Ce que je trouve bien sur le canal #archlinux-fr, c'est quand un sujet est intérressant, tout le monde s'y met et voilà le résultat. Comment gagner un peu de place quand son système est installer sur la fameuse carte SD de 2Go !

Grâce à l'option NoExtract de Pacman, on peut lui dire de ne pas extraire certains fichiers des paquets et comme des trucs pas forcément utilent, c'est le cas les locales qu'on n'utilise pas et qui prend quand même un peu de place. Exemple du avant / après sur mes systèmes :

Sur ma Banana :

  • Avant :
╭─hs-157@moeKyun  ~  
╰─$ du -hs /usr/share/locale/
93M     /usr/share/locale/
  • Après :
╭─hs-157@moeKyun  ~  
╰─$ du -hs /usr/share/locale/                                                                           
4,9M    /usr/share/locale/

Sur mon ordinateur portable :

  • Avant :
╭─hs-157@V17  ~  
╰─$ du -hs /usr/share/locale/
291M    /usr/share/locale/
  • Après :
╭─hs-157@V17  ~  
╰─$ du -hs /usr/share/locale/
8,8M    /usr/share/locale/

Donc ce qui en ressort de tout ça, c'est de trouver les bons arguments pour NoExtract et la commande pour virer les locales non-utilisé.

ttf-dejavu 2.37 nécessitera de forcer la mise à jour

ttf-dejavu 2.37 va changer la manière dont la configuration de fontconfig est installée. Dans les versions précédentes, la configuration était un lien symbolique décrit dans les scripts post_install/post_upgrade, la nouvelle version placera les fichiers à l’intérieur du paquet, comme cela se fait à présent dans fontconfig.

Pour plus d’informations à propos de ce changement: https://bugs.archlinux.org/task/32312

Pour mettre à niveau ttf-dejavu 2.37 il est recommandé de mettre à jour le paquet à part:

pacman -S --force ttf-dejavu

Article original

Les paquets TeXLive 2016 sont maintenant disponibles

Les paquets TeXLive ont été mis à jour en version 2016.

Le changement le plus notable est que l’utilitaire biber est maintenant fourni en tant que paquet séparé. Vous pouvez l’installer normalement en utilisant pacman.

Les hooks de pacman sont maintenant utilisés dans les paquets TeXLive de sorte que la mise à jour sera moins verbeuse que dans les années passées.

Article original

test-sec-flags: Appel à l’aide

Inspiré par des discussions sur la liste de diffusion arch-general, test-sec-flags a été créé par pid1 (avec l’aide d’anthraxx, strcat, sangy et rgacogne) pour tester l’impact sur les performances des options de lien et de compilation axés sur la sécurité. L’objectif est de déterminer si ces flags peuvent être la nouvelle valeur par défaut pour tous les paquets d’Arch Linux. Les résultats préliminaires suggèrent que l’impact sur les performances est presque inexistant comparé aux flags de compilation que nous utilisons déjà, mais nous aimerions recueillir et comparer plus de résultats avant de poursuivre.

Téléchargez la source ici et consultez le README pour les instructions d’installation et d’utilisation. Le sous-répertoire results contient des instructions sur la façon de dégager les statistiques pertinentes à partir des fichiers de résultats.

Nous recueillons des résultats dans le wiki test-sec-flags sur Github. Ajoutez-y les vôtres si vous voulez. Nous aimerions en particulier des bilans i686, compte tenu que tous les contributeurs précédents possédaient des appareils x86_64.

Patchs bienvenus.

Article original (en)

screen-4.4.0-1 incapable d’attacher d’anciennes sessions

Avec la mise à jour de screen-4.4.0-1 vous serez dans l’incapacité de rattacher des sessions ayant démarré sur des versions antérieures de screen. Veillez à vous assurer que toutes vos sessions sont fermées avant la mise à jour.

Article original (en)

Compte rendu du Meetup ArchLinux France du 10 Nov. 2015

Ce 10 Novembre 2015 a eu lieu le second meetup ArchLinux France, chez BlaBlaCar à Paris ! Pour rappel le premier Meetup avait eu lieu en Octobre 2014. Pour cette nouvelle édition, il y avait 5 présentations, et près de 70 personnes ! (vous pouvez retrouver le programme sur meetup).

Voici la liste des présentations et leurs slides (update: elles sont maintenant toutes disponibles !) :

J’ai pour ma part parlé de Yaourt, son histoire, son développement, ses features. Si vous souhaitez participer, n’hésitez pas à vous rendre sur le github du projet :)

Mes slides ci dessous :

Et quelques photos, tirées du ‘Live Tweet’ de @archlinuxfr :

Encore merci aux talkers, à tous ceux présents, et à BlaBlaCar (et Puckel_) pour le sponsoring de la salle et la collation !

Faisons de l'internet, Transmission-nous

Faisons de l'internet et non du Minitel 2.0, car aujourd'hui c'est Transmission, c'est un nœud BitTorrent Libre ! (Def de Wikipédia) Oui le Libre c'est bien ! ! !
Donc ça permet de faire du torrent en Libre ! Et partager tout bien de fichier Libre de droit !

Donc pour l'installer, c'est comme d'habitude, vous sortez votre gestionnaire de paquet préféré, ouais, mais c'est pas en installant le premier Transmission qui passe que ça va marcher.
Il existe plusieurs versions de Transmission, le démon, le contrôle à distance en ncurses, la version GTK et QT, qui eux marche en autonome, mais qui ont normalement le contrôle à distance pour le démon.
Donc, je vais parler aujourd'hui du démon et du contrôle à distance en ncurses, donc pour installer le daemon, le paquet ça doit être transmission-cli ou quelque chose comme ça, et oui, on peut communiquer avec le démon en ligne de commande, pour plus d'info, regarde ton putain de manuel !, et pour le contrôle à distance, c'est transmission-remote-cli, ou une connerie de ce genre, et oui c'est en ncurses, pour ce qui sont sous Archlinux, vous avez la liste des paquets sur le wiki d'Archlinux.

Comme tout bon service, il faut bien le lancer, avec SystemD, donc un p'tit coup de sudo systemctl start transmission.
Ouais mais il est lancé avec l'utilisateur transmission par défaut, si vous avez envie de changer d'utilisateur, vous pouvez en modifiant le fichier /etc/systemd/system/multi-user.target.wants/transmission.service, il existe si vous avez activé le service avec un petit coup de sudo systemctl enable transmission, donc il suffit juste de modifier le User.
Voilà, il est tout beau, tout mignon, il tourne.

Après, après ? Il faut le configurer, il a une configuration de base, mais c'est plus sympa avec une petite configuration personnel. Donc si vous avez garder comme utilisateur transmission, le fichier de configuration se situe dans /var/lib/transmission-daemon ou dans /var/run/transmission, ceci dépend de la distribution, tel que Debian ou Ubuntu, pour ne citer personne (Quel idée de ne pas suivre la norme de hiéarchie...), et si vous avez décidé d'utiliser votre utilisateur, ceci se situe dans $HOME/.config/transmission-daemon, tout les infos sur les chemins des fichiers de configuration se situe ici pour GNU/Linux.

La liste des paramètres est disponible sur le wiki de Transmission, vous faites votre configuration personnel.

Par defaut, Transmission-deamon a une interface web, et le contrôle à distance ce fait par là, donc si vous voulez pas avoir l'interface web qui traine sur internet ou votre réseau local, mettez en liste blanche votre localhost, soit 127.0.0.1 (Essayez pas de la hacker !).
Après, il suffit de lancer transmission-remote-cli sur la même machine que le démon pour avoir le contrôle.

Pour d'autre info, l'internet, sinon les wiki fr et en de Archlinux sont assez complète avec celui de Transmission et pour le remote-cli, je ferais peut-être un autre article s'il y a des trucs sympa à faire avec.

"Ranger : Et merde, on se les gèle ici... Tiens, voilà quelqu'un."

Ranger c'est quoi ? C'est pas ranger sa chambre (il faudrait que je le fasse...). Ranger, c'est un gestionnaire de fichier dans le terminal, donc pas besoin d'interface graphique !

Pour l'installer, utiliser votre gestionnaire de paquets préféré, et voilà, vous avez votre ranger !
Pour avoir le fichier de configuration de base lancer la commande :

ranger --copy-config=all

Pour modifier les options, c'est le fichier rc.conf, cherchez-le, sinon c'est pas marrant.

Il y a quoi comme option sympa ?

  • set column_ratios Pour gérer le ratio des différentes colonnes
  • set draw_borders Pour mettre des bordures sur les colonnes

Sinon, tout les options sont dans le man.

Pour avoir le pré-affichage des archives, pages html, images, pdf, torrent...
Il faut installer les dépendances optionelles, la liste est sur la page d'accueil du projet, ou pour Archlinux sur la page du paquet.

Pour plus d'info, les pages du wiki d'Archlinux fr ou en ou sinon la vache Libre.

Transférer et géolocaliser mes photos : un petit script

En matière de classement des photos, comme dans bien d'autres domaines, j'ai le sentiment de ramer à contre courant. L'heure est à l'utilisation de logiciels graphiques sophistiqués, prenant en charge depuis l'insertion de la carte SD (ou la connexion de l'APN) jusqu'au téléversement sur l'album en ligne. Digikam fait, paraît-il, cela très bien, mais je le trouve trop lourd et d'un emploi mal aisé. Je fondais quelques espoir sur oqapy, malheureusement je ne le trouve plus sur les dépôts Archlinux, même pas dans AUR... J'aime assez gthumb mais il ne sait pas faire tout ça.

Bref, je continue à travailler à la mimine selon un processus bien établi :

  • Créer un répertoire au nom significatif tant du point de vue chronologique que géographique (aaaammjj_Localisation)
  • Y copier les fichiers JPG et les renommer selon un shéma analogue (aaaammjj_hhmmss_Localisation_NomOriginel.JPG)
  • Y copier le ou les éventuel(s) fichiers gpx associés et géolocaliser les images
  • Sélectionner, recadrer et éventuellement retoucher les meilleurs clichés avant de les transférer vers notre album Piwigo

Pour renommer les photos j'utilise exiv2 de la manière suivante :

exiv2 -r %Y%m%d_%H%M%S_Localisation_:basename: mv *.JPG

Pour géolocaliser j’utilise Gpscorrelate, que j'ai présenté ici, qui est malheureusement abandonné par son créateur mais a l'avantage de disposer à la fois d'une version graphique et d'une version en ligne de commande.

gpscorrelate -g monFichierTrace.gpx -z [valeur] *.JPG

La valeur à associer à l'option -z est le décalage du fuseau horaire, par exemple +1:00 pour l’heure normale d’Europe centrale (CET : Paris, Bruxelles, Genève…) et +2:00 pour l’heure d’été d’Europe centrale (CEST). Ceci dans la mesure ou l’horodatage des photos est faite en heure locale et celle du GPS en UTC, ce qui est en principe le cas. Il y a d'autres options possible, voir la  documentation.

Bon, ce n'est pas trop compliqué, mais il faut se souvenir des options, tout ça.... Pourquoi ne pas automatiser le processus dans un petit script ?

#! /bin/bash 

#######################
##     photoman      ##
## interface à exiv2 ##
## et à gpscorrelate ##
#######################


declare -i nbRep=0
declare -i nbPhotos=0
declare -A DateTab

# chemin du répertoire photo
photoRep="/media/NAS/Public/Photos/"
# chemin du GPS
GPS="/run/media/vincent/GARMIN/Garmin/GPX"

IFS=$'\n'
shopt -s nullglob

# détection du GPS
if [ -d $GPS ]; then
    find $GPS -iname "*.gpx" > /tmp/tracesGPS
    if [ $(wc -l /tmp/tracesGPS | cut -d " " -f 1) != 0 ]; then        
        echo
        read -n 1 -s -p "un ou plusieurs fichiers gpx ont été trouvé dans le GPS. Les copier dans le(s) répertoire(s) photos [O/n] ? " copieTrace
        copieTrace="${copieTrace:=o}"
        case $copieTrace in
            o|O|y|Y ) Geolocalisation=true;;
            * ) Geolocalisation=false;;
        esac
    fi
else
    read -n 1 -s -p "Le GPS n'a pas été détecté : continuer quand même [o/N] ? " question
    question="${question:=n}"
    case $question in
            o|O|y|Y ) Geolocalisation=false ;;
            * ) exit;;
    esac
fi
echo

#traitement des photos
for fichier in *
do
    if [ ! -f $fichier ]; then continue; fi
    MimeType=$(file --mime-type $fichier)
    if [[ ${MimeType:(-10)} != "image/jpeg" ]]; then continue; fi
    datePhoto=$(exiv2 -g Exif.Photo.DateTimeOriginal $fichier | sed -r 's/^ *//;s/ {1,}/ /g'| cut -d " " -f 4 | sed 's/://g')
    repertoire=$photoRep${datePhoto:0:4}"/"
    if [ -z ${DateTab[$datePhoto]} ]; then 
        echo
        read -p "Veuillez indiquer une localisation correspondant à la journée du $datePhoto puis appuyez sur [Entrée] : " localisation
        echo
        DateTab[$datePhoto]="_"$(echo $localisation | sed 's/ /-/g')
        mkdir $repertoire$datePhoto${DateTab[$datePhoto]} 2> /dev/null
        ((nbRep++))
        # copier les fichiers gpx        
        if $Geolocalisation; then
            while read line  
                do   
                cp $line $repertoire$datePhoto${DateTab[$datePhoto]}
            done < /tmp/tracesGPS
        fi
    fi 
    fichierRenomme=$repertoire$datePhoto${DateTab[$datePhoto]}"/"$(echo $fichier | sed 's/ /-/g')
    cp $fichier $fichierRenomme
    ((nbPhotos++))
    exiv2 "-r%Y%m%d_%H%M%S"${DateTab[$datePhoto]}"_:basename:" mv $fichierRenomme
done

#Bilan
if [ $nbPhotos -eq 0 ]; then 
    echo
    echo "Il n'y a aucune photo à transférer dans ce répertoire"
    echo "+++++++++++++++++++++++++++++++++++++++++++++++++++++"
    echo
    exit
fi
echo "$nbPhotos photos ont été transférées dans $nbRep répertoire(s)."
printf '\033[7m'
read -n 1 -s -p "===> Supprimer toutes les photos dans le répertoire d'origine [o/N] ? " question
question="${question:=n}"
printf '\033[0m'echo
case $question in
        o|O|y|Y ) rm -rf *.[jJ][pP][gG] ;;
        * ) : ;;
esac

#Géolocalisation
if ! $Geolocalisation; then exit; fi
read -n 1 -s -p "Géolocaliser les photos transférées [O/n] ? " question
question="${question:=o}"
case $question in
        o|O|y|Y ) : ;;
        * ) exit;;
esac
for i in "${!DateTab[@]}"
    do 
    cd $photoRep${i:0:4}"/"$i${DateTab[$i]}
    for f in "*.[gG][pP][xX]"
        do
        gpxFileDate=$(xml_grep 'trkpt' $f --nb_results 1 | xml_grep 'time' --text_only)
        UTCHour=$(date -d $(echo $gpxFileDate | sed "s/T/ /g" | sed "s/Z//g") +%k | sed "s/ //g")
        LocalHour=$(date -d $gpxFileDate +%k)
        TimeZone=$(( $LocalHour  - $UTCHour ))
        gpscorrelate -g $f -z $TimeZone *.[jJ][pP][gG]
    done
done

Quelques explications :

Les premières lignes servent de fichier ini : emplacement du répertoire photo et point de montage du GPS

Ensuite je détecte si le GPS est connecté et je vérifie (find -iname *.gpx) et s'il y a une (ou plusieurs) traces. On y reviendra plus tard

Puis pour chaque fichier du répertoire en cours
  • je teste s'il est de type image jpg,
  • j'extrais la date de prise de vue grace à exiv2
  • s'il n'existe pas je crée un répertoire correspondant à cette date (localisation demandée), j'y copie les éventuelles traces du GPS et j'incrémente un compteur (les noms des répertoires sont stockés dans un tableau associatif date => _localisation )
  • J'y copie le fichier photo, le renomme (aaaammjj_hhmmss_localisation_nomOririnel.JPG) et incrémenter un compteur
Une fois le transfert terminé je vide éventuellement le répertoire d'origine et je commence la géolocalisation proprement dite. Une seule difficulté, déterminer automatiquement la zone horaire qui s'applique ce jour (en supposant que l'APN est correctement réglé à l'heure locale).

Les trace gpx sont des fichiers XML. On peut évidement les exploiter à la hussarde à grand coup de sed ou de awk, mais un bon parseur vous facilitera la tache. J'utilise ici xml_grep fourni par le paquet perl-xml-twig (Archlinux) ou xml-twig-tools (Debian/Ubuntu). Il me permet ici d'extraire l'horodatage (UTC) du premier trackpoint, que j'exprime en heure locale pour calculer la différence.

J'appelle enfin gpscorrelate pour chaque fichier gpx, avec le décalage horaire calculé, et je l'applique à toutes les photos. En principe une photo n'est concernée que par une seule trace mais s'il arrivait que le fichier JPG contienne déjà des données exif gps elles ne seraient pas écrasées et un message d'erreur serait affiché.

Naturellement ce script ne répond précisément qu'à mes besoins personnels et probablement pas aux vôtres mais il démontre, je l'espère, qu'il n'est pas si difficile de réaliser soi-même l'application correspondant à ses desiderata.

Urxvt, ou comment avoir du Unicode dans Rxvt

Urxvt c'est Rxvt-unicode (Ouais c'est cool !), mais plus précisément c'est un clone de rxvt, avec le support d'Unicode en plus. Urxvt est un émulateur de terminal pour X, donc il ne dépend d'aucun d'environnement graphique, en plus il est léger, facilement configurable et la possibilité de le lancer comme démon.

Alors pourquoi l'avoir choisi Urxvt? Car quand j'ai débarqué sur Archlinux, des collègues m'ont dit de l'utiliser et m'ont donnés une configuration de base. Et là j'ai fini de bien configurer mon terminal.

Donc il y a quoi de bien à configurer dans Urxvt? D'abord, Urxvt utilise les ressources X11 pour la configuration qui utilise le fichier $HOME/.Xressources.
La liste de tout les options est diponible dans le man de urxvt ou ici sur le site officiel de Urxvt.

Pour la police :

URxvt.font: xft:DejaVu Sans Mono:size=10

C'est le nom de la police et ensuite la taille.

Pour la police en Gras :

URxvt.boldFont: xft:DejaVu Sans Mono:bold:size=10

Il est possible aussi de définir la police en Italique.

Après il faut jouer sur l'espacement entre les lettres pour rendre bien la police.

URxvt*letterSpace: -1

Pour la transparence, il y a deux façon, la vraie et la fausse. Pour la vrai, Urvxt utilise la composition, pour ce faite il faut un gestionnaire de compositing ou un gestionnaire de fenêtre qui gère le composite.

Donc pour la vraie :

URxvt*depth: 32
URxvt*background: [60]#161616

URxvt*depth permet de dire sur combien de bit on gère la transparence et ce qui est entre crochets pour URxvt*background correspond à la transparence en pourcentage.

Pour la fausse transparence, Urxvt prend le fond d'écran et l'applique comme fond.

URxvt*.transparent: true
URxvt*.shading: 110

Pour URxvt*.shading, le chiffre entre 0 et 99 rend un fond pour foncé et entre 101 et 200, un fond plus clair. Mais cela ne rend pas la même couleur défini par URxvt*background

Pour utiliser Urxvt comme démon, il faut lancer la commande :

urxvtd -q -o -f

Et après lancer les terminaux avec :

urxvtc

Pour plus d'information, il y a le wiki fr ou en d'Archlinux qui sont de bonne références.

Sinon, voici mon fichier de configuration pour Urxvt.

Xcursor.theme: Vanilla-DMZ
! ===============================================
! URXVT
! ===============================================
! URxvt*termName: string
URxvt*geometry: 240x84
! URxvt*chdir: string
! URxvt*reverseVideo: boolean
URxvt*loginShell: false
! URxvt*jumpScroll: boolean
! URxvt*skipScroll: boolean
! URxvt*pastableTabs: boolean
! URxvt*scrollstyle: mode
URxvt*scrollBar: false
! URxvt*scrollBar_right: boolean
! URxvt*scrollBar_floating: boolean
! URxvt*scrollBar_align: mode
! URxvt*thickness: number
! URxvt*scrollTtyOutput: boolean
! URxvt*scrollTtyKeypress: boolean
! URxvt*scrollWithBuffer: boolean
! URxvt*inheritPixmap: boolean
! URxvt*transparent: boolean
! URxvt*tintColor: color
! URxvt*shading: number
! URxvt*blurRadius: HxV
URxvt*fading: 40
URxvt*fadeColor: black
! URxvt*utmpInhibit: boolean
! URxvt*urgentOnBell: boolean
! URxvt*visualBell: boolean
! URxvt*mapAlert: boolean
! URxvt*meta8: boolean
! URxvt*mouseWheelScrollPage: boolean
! URxvt*tripleclickwords: boolean
! URxvt*insecure: boolean
! URxvt*cursorUnderline: boolean
! URxvt*cursorBlink: boolean
! URxvt*pointerBlank: boolean
URxvt*background: #161616
URxvt*foreground: #839496
!URxvt*color0: #000000
!URxvt*color1: #F35555
!URxvt*color2: #70CC78
!URxvt*color3: #F39166
!URxvt*color4: #6EADEF
!URxvt*color5: #B77BB7
!URxvt*color6: #54ABA7
!URxvt*color7: #909090
!URxvt*color8: #202020
!URxvt*color9: #F35555
!URxvt*color10: #70CC78
!URxvt*color11: #D2D265
!URxvt*color12: #75A8F0
!URxvt*color13: #BC71BC
!URxvt*color14: #72B5BE
!URxvt*color15: #FFFFFF
! URxvt*colorBD: color
! URxvt*colorIT: color
URxvt*colorUL: #75A8F0
! URxvt*colorRV: color
! URxvt*underlineColor: color
! URxvt*scrollColor: color
! URxvt*troughColor: color
! URxvt*highlightColor: color
! URxvt*highlightTextColor: color
URxvt*cursorColor: #626262
URxvt*cursorColor2: #FFFFFF
! URxvt*pointerColor: color
! URxvt*pointerColor2: color
! URxvt*borderColor: color
! URxvt*iconFile: file
URxvt.font: xft:DejaVu Sans Mono:size=10
URxvt.boldFont: xft:DejaVu Sans Mono:bold:size=10
! URxvt*italicFont: fontname
! URxvt*boldItalicFont: fontname
! URxvt*intensityStyles: boolean
! URxvt*inputMethod: name
! URxvt*preeditType: style
! URxvt*imLocale: string
! URxvt*imFont: fontname
! URxvt*title: string
! URxvt*iconName: string
URxvt*saveLines: 100000
! URxvt*buffered: boolean
! URxvt*depth: number
! URxvt*visual: number
! URxvt*transient-for: windowid
! URxvt*override-redirect: boolean
! URxvt*hold: boolean
! URxvt*externalBorder: number
! URxvt*internalBorder: number
! URxvt*borderLess: boolean
! URxvt*lineSpace: number
URxvt*letterSpace: -1
! URxvt*skipBuiltinGlyphs: boolean
! URxvt*pointerBlankDelay: number
! URxvt*backspacekey: string
! URxvt*deletekey: string
! URxvt*print-pipe: string
! URxvt*modifier: modifier
! URxvt*cutchars: string
! URxvt*answerbackString: string
! URxvt*secondaryScreen: boolean
! URxvt*secondaryScroll: boolean
! URxvt*perl-lib: string
! URxvt*perl-eval: perl-eval
URxvt*perl-ext-common: default,matcher
! URxvt*perl-ext: string
! URxvt*iso14755: boolean
! URxvt*iso14755_52: boolean
! URxvt*xrm: string
! URxvt*keysym.sym: keysym
! URxvt*background.border: boolean
! URxvt*background.expr: string
! URxvt*background.interval: seconds
! URxvt*bell-command: string
URxvt*matcher.button: 1
! URxvt*matcher.launcher: string
! URxvt*matcher.launcher.*: string
! URxvt*matcher.pattern.*: string
! URxvt*matcher.rend.*: string
! URxvt*remote-clipboard.fetch: string
! URxvt*remote-clipboard.store: string
! URxvt*searchable-scrollback: string
! URxvt*selection-autotransform.*: string
! URxvt*selection-pastebin.cmd: string
! URxvt*selection-pastebin.url: string
! URxvt*selection.pattern-0: string
! URxvt*tab-bg: colour
! URxvt*tab-fg: colour
! URxvt*tabbar-bg: colour
! URxvt*tabbar-fg: colour
URxvt*url-launcher: /usr/bin/xdg-open

Tout Youtube en HTML5 sous GNU/Linux avec Firefox et les site de Pr0n ! ! !

En discutant sur IRC, sur le canal #Archlinx-fr, notre cher Moviuro nous envoie ce sujet et nous demande si on a le même problème.
Je lui répond, que bien sûr, j'ai Youtube en 360p, car il doit me manquer des trucs à la con.

Et là je me suis dit, tien, il me doit manquer des dépendances optionnelles à Firefox.

Donc pour commencer, pour savoir ce qui vous manque comme fonctionnalités dans votre Firefox pour lire vos vidéos en 1080p sur Youtube, alle sur ce lien.

Pour moi, j'avais déjà les fonctionnalités "HTMLVideoElement" et "WebM VP8" déjà activé. Si vous avez pas ça, chercher sur l'Internet comment les activer.

Après il me manquait la fonctionnalités "H.264", et comme je me suis dit avant, il me manque des dépendances optionnelles et sous Archlinux, il faut les paquets gst-libav et gst-plugins-good (Si vous êtes sur une autre distribution, chercher plus ou moins ça comme nom de paquet pour les rechercher).

Nous y voilà avec la moitié des fonctionnalités activées.

Pour la suite il faut trifouiller dans about:config de votre Firefox pour activer quelques clefs.

Pour avoir "Media Source Extensions" et "MSE & WebM VP9", il faut mettre à Vrai media.mediasource.enabled et media.mediasource.webm.enabled.
Après, il reste plus à activer "MSE & H.264", pour cela, il faut mettre à Vrai, les clefs media.fragmented-mp4.exposed et media.fragmented-mp4.ffmpeg.enabled.

Et voilà, normalement après ça, vous pouvez lire les vidéos Youtube en 1080p avec du HTML5 ! Et si c'est pas le cas, vous avez dû vous foirez quelque part.

Note : D'après des discutions sur IRC, l'activation de ces clefs serai des "trucs" expérimentals et peuvent provoquer l'élévation anormal du processeur.
Et merci à Nheir, Spider-cochon, Moviuro et d'autre que j'oublie pour leur aide.

Re-Note : Pas obliger d'avoir les dépendances optionnelles pour activer "H.264", car en modifiant les clefs media.mediasource.webm.enabled et media.fragmented-mp4.ffmpeg.enabled, cette fonctionnalité s'active.

Re-Re-Note : Quand on a fait tout ça, il est possible de regarder des vidéos de Pr0n sans flash sur certain site \o/

Pélican sur orbite

Ça y est, Pélican est sur orbite ! Ou plutôt envoyé sur l'internet.

Nous y voilà, ici, je vais parler de choses qui m'intérresse et vous le faire partager.
Mais je vais surtout m'en servir comme calepin.

Comment est quoi, comment le bouzin?
Ce site est généré est le générateur de site statique Pelican, avec le serveur web Nginx, le tout sur un Archlinux Arm tournant sur une Banana Pi, et auto-hébergé chez moi.

Imprimer ses cartes IGN

Comme nous l'évoquons quelques fois ici, nous sommes amateurs de courses en montagnes de tout genres. Et en tous lieux, ce qui suppose un fond de cartes important. Certes il est possible d'en emprunter à la bibliothèque de notre section du CAF mais comme nous disposons d'une imprimante laser couleur nous nous contentons parfois de capturer la zone qui va bien sur Internet pour l'imprimer en A4.

Tout d'abord pour une course en montagne il est exclu d'utiliser autre chose qu'une carte IGN (pour la France) ou SwissTopo (pour la Suisse). Si vous aviez la moindre tentation d'utiliser autre chose nous vous invitons à lire l'avertissement situé sur le site (par ailleurs excellent) de FranceTopo.fr. Les sites qui reproduisent des itinéraires sur googlemap et autres simulacres de cartes topographiques devraient être mis en examen pour mise en danger de la vie d'autrui.

Mais revenons donc à nos impressions : il y a tout d'abord un site qui fait tout ça très bien, ou presque : JGN (notez le J à la plage du I). On sélectionne une échelle, un format, on centre la carte et roule ma poule. Le seul défaut est qu'il n'intègre pas le carroyage UTM et que son développeur a, selon ses propres dires, d'autres chats à fouetter. On n'en a pas forcement besoin mais c'est bien pratique si l'on dispose d'un GPS. Et comme on est là pour s'amuser  apprendre on va utiliser une autre solution.

À ma connaissance le seul site qui permette de rajouter une couche carroyage UTM est openrunner. Il faut créer un compte mais comme les adresses  type yopmail ou jetable.org sont acceptées ça ne pose pas trop de problème. Détail important : il faut l'ouvrir avec Firefox, nous verrons pourquoi plus loin.

Une fois connecté sur le site cliquez sur le bouton "Planifier un parcours". La seule chose qui nous intéresse pour le moment est la carte. Positionnez-vous où bon vous semble, choisissez "Topo IGN France" dans le menu des cartes (en haut à droite), amenez à l'échelle qui va bien (indicateur 200m en bas à droite) et activez le carroyage UTM 1km (barre d'outil de gauche.

Bon c'est pas mal mais la fenêtre est ridiculement petite. Il y a certes un bouton plein écran mais sauf avoir une résolution de malade ça restera insuffisant. Jusqu'à présent je me faisais patiemment mon petit montage de captures d'écran avec GIMP, façon puzzle, mais Antistress m'a appris ici une fonction très intéressante de Firefox : la possibilité de faire des screenshots via la barre de développement. Et des screenshots de la page entière, plus exactement de la fenêtre entière, et pas simplement de la partie visible à l'écran ce qui serait le cas avec les outils de capture ordinaires. Nous y reviendrons tout à l'heure.

Edit du 14/07 : lire les commentaires de Mathieu et de Viale ci-dessous pour une solution beaucoup plus simple et indépendante de l'OS pour la capture de la fenêtre.

Sous Linux rien ne s'oppose à ce que la fenêtre soit beaucoup plus grande que l'écran, par exemple 3000x2000 dans un écran de 1440x900 (avant cela la fenêtre ne doit pas être maximisée). Pour la manœuvrer il suffit de maintenir la touche alt de gauche enfoncée et de de déplacer la souris avec le bouton gauche. Par acquit de conscience j'ai essayé de faire la même chose sous Windows mais je n'y suis pas parvenu (il faut dire que mes connaissances de cet OS sont franchement limitées).

Bien sûr il est possible d'obtenir ce résultat à la main, en tirant sur les coins de la fenêtre, mais c'est long et fastidieux. Et comme souvent il y a un petit outils qui va bien pour automatiser tout ça, c'est wmctrl (dans community sous Archlinux, universe sous Ubuntu).

  • pour agrandir ⇒ wmctrl -r Firefox -e "0,0,0,3500,2500"
  • pour revenir à une taille"normale" ⇒ wmctrl -r Firefox -e "0,0,35,1500,800"

man wmctrl pour plus de précision. Le "35" pour revenir en taille normale c'est pour tenir compte de ma barre des tâches (tint2) qui est positionnée en haut de l'écran. À adapter en fonction de votre configuration.

Pour un confort optimal il suffit d'affecter un raccourci clavier à chacune de ces commandes (selon votre gestionnaire de bureau).

Retournons maintenant à la capture de la fenêtre : l'astuce consiste à lancer la console réservée aux développeurs, appelée « barre de développement » dans Firefox, qui est accessible soit par le menu, soit par le raccourci clavier Maj+F2. La console est positionnée au bas de la fenêtre, elle bénéficie de l'auto-complétion avec la touche tab et du rappel des dernières commandes avec la flèche du haut.

Saisissez alors la commande « screenshot votreFichier.png --fullpage » puis validez : la capture est alors sauvegardée directement dans le dossier des téléchargements.

Pour obtenir une carte au 1/25.000 il suffit maintenant de redimensionner l'image (par ex. avec gimp) et de l'imprimer en 180 DPI (points par pouce en français). La taille maximale dépendra des marges de votre imprimante. Pour ma HP CP1515 les dimensions maximales sont 2014 x 1412 pixels. Vérifiez le résultat : le carroyage UTM de 1km doit être de 4cm pour respecter l’échelle. Jouez sur la résolution d'impression si ce n'est pas le cas.

N.B. J'ai testé ceci sous Archlinux et Openbox mais je ne vois aucune raison pour que cela ne fonctionne pas dans tout autre environnement.

Vers la fin du RTFM ?

Les lecteurs de linuxfr l'auront noté au détours d'un commentaire de Xinfe : eg est, pour les cas les plus simples, une alternative séduisante à man. Si comme moi vous ne connaissez rien de plus ennuyeux que de devoir consulter des pages entières de manuel regorgeant d'options que vous n'utiliserez jamais alors qu'un simple exemple suffirait à votre bonheur alors eg est fait pour vous. 

Pour l'installer pas de souci sous Archlinux, le paquet est dans AUR, mais je n'en ai pas trouvé pour Ubuntu et dérivés

Les fichiers exemples sont stockés au format Markdown dans deux répertoires : celui par défaut, fourni par le paquet (/usr/lib/python3.4/site-packages/eg/examples/ sur mon ordi) et un éventuel répertoire personnalisé. Pour indiquer l'emplacement de ce dernier (et modifier éventuellement le chemin de celui par défaut) il faut créer un fichier ~/.egrc sous la forme suivante :

[eg-config]
examples-dir = /un_autre/répertoire/
custom-dir = ~/mon/répertoire/personnalisé

Pour créer un nouveau fichier d'exemple le plus simple est évidement de s'inspirer d'un fichier fourni avec le programme. Son nom sera composé du nom de la commande suivi de l’extension .md

On obtient la liste des fichiers exemples disponibles par l'option --list : eg --list

Ce qui donne initialement ifconfig whereis ls less cut which more ps whatis rm locate chmod find touch grep sudo xargs cat ln mv cd mkdir tr scp pwd kill od hexdump du cp chown sort curl awk su top tar wc gcc

Ironie de l'histoire il n'existe ni page man ni page eg consacrées à eg. Mais la documentation sur le site est assez claire (mais en anglais).

Pour ma part je me promets de contribuer prochainement en rédigeant une page sur la gestion des meta-données des photos avec exiv2. Y'a du boulot....

LockKeys 0.2

J'ai évoqué récemment mon besoin d'avoir une applet indicateur d'état du clavier (capslock et numlock) indépendante de l'environnement de bureau. Ne trouvant rien qui me satisfasse j'ai alors bidouillé un script en bash, mais avec dans un coin de ma tête l'idée que l'occasion était bien belle de me mettre enfin à Python. D'autant plus que j'utilise Battery Monitor (aka batterymon-clone) écrit en python2 et dont je me suis bien entendu largement inspiré.

Fonctionnement : une simple icône dans le systray avec un menu accessible par un clic droit

En option il est possible de jouer un son et/ou d'afficher une notification. Le jeux d'icônes et le fichier son doivent être installés pour l'instant dans /usr/local/share/lockkeys. Ils sont réunis dans cette archive.

Voici le code

#!/usr/bin/python2
# -*- coding: utf-8 -*-

#Todo mettre les messages sous forme de variable dans fichier à inclure <- internationalisation

import gtk
import glib
import os
import sys
import ConfigParser
import ctypes
try:
    import pynotify
    if not pynotify.init("LockKeys"):
        print("Il y a eu une erreur pendant l'initialisation du système de notification. Les notifications ne fonctionnerons pas.")
        pynotify = None
except:
    print("Il semble que python-notify ne soit pas installé. Les notifications ne fonctionnerons pas.")
    pynotify = None
NotifyAvailable = pynotify
 
class XKeyboardState(ctypes.Structure):
    _fields_ = [("key_click_percent", ctypes.c_int),
                ("bell_percent", ctypes.c_int),
                ("bell_pitch", ctypes.c_uint),
                ("bell_duration", ctypes.c_uint),
                ("led_mask", ctypes.c_ulong),
                ("global_auto_repeat", ctypes.c_int),
                ("auto_repeats", ctypes.c_char * 32)]
 
def initXGetKeyboardControl():
    global dpy, keyboardState, XGetKeyboardControl
   
    libX11 = ctypes.CDLL("libX11.so.6")
    XOpenDisplay = libX11.XOpenDisplay
    XOpenDisplay.restype = ctypes.c_void_p
    XOpenDisplay.argtypes = [ctypes.c_char_p]
    XGetKeyboardControl = libX11.XGetKeyboardControl
    XGetKeyboardControl.restype = ctypes.c_int
    XGetKeyboardControl.argtypes = [ctypes.c_void_p, ctypes.POINTER(XKeyboardState)]
   
    dpy = XOpenDisplay(None)
    keyboardState = XKeyboardState()
 
def runXGetKeyboardControl():
    global dpy, keyboardState, XGetKeyboardControl
    XGetKeyboardControl(dpy, ctypes.byref(keyboardState))
    return keyboardState.led_mask
 
#écrit dans le fichier de config    
def WriteConfig (Section, Key, Value):
    Config.set(Section,Key,Value)
    with open(ConfigFile, 'w') as myfile:
        Config.write(myfile)
 
#Notification (état du clavier) si pynotify != None
def notify(message,duration):
    if pynotify:
        n = pynotify.Notification('LockKeys', message)
        n.set_timeout(duration)
        n.set_icon_from_pixbuf(gtk.Label().render_icon(gtk.STOCK_DIALOG_INFO, gtk.ICON_SIZE_LARGE_TOOLBAR))
        n.show()
 
 
class Systray():
    def __init__(self):
        self.tray_object= gtk.StatusIcon()
        self.tray_object.connect("popup_menu", self.rightclick_menu)
        self.show_trayicon(1) ## fixed to one for now
        self._oldMask = -1 #int(runXGetKeyboardControl()) & 3
 
    def show_trayicon(self,value):
       self.tray_object.set_visible(True)
       return
 
    def property_modified(self):
        # utilse runXGetKeyboardControl() pour connaître l'état des touches capslock et numlock
        # 0 -> aucun, 1 -> capslock, 2-> numlock, 3 -> les 2
        mask=int(runXGetKeyboardControl()) & 3
        if mask != self._oldMask:
            if sound_status == True and self._oldMask != -1:
                os.system(Sound)
            notify(msg[mask],2000)
            self._oldMask = mask
            # Todo : essayer d'abord usr/share/lockkeys/ voire ~/.local/lockkeys
            icon_path = '/usr/local/share/lockkeys/' + str(mask) + '.png'
            self.tray_object.set_from_file(icon_path)
 
    # défini le menu clic droit sur l'icône
    def rightclick_menu(self, button, widget, event):
        menu = gtk.Menu()
        about_menu = gtk.ImageMenuItem(gtk.STOCK_ABOUT)
        about_menu.connect('activate', self.about)
        exit_menu = gtk.ImageMenuItem(gtk.STOCK_CLOSE)
        exit_menu.connect('activate', self.close)
        menu.append(about_menu)
        menu.append(exit_menu)
        sep = gtk.SeparatorMenuItem()
        menu.append(sep)
        sound_menu = gtk.CheckMenuItem("Activer le son")
        sound_menu.set_active(sound_status)
        sound_menu.connect("activate", self.sound_toggle)
        menu.append(sound_menu)
        notify_menu = gtk.CheckMenuItem("Activer les notifications")
        notify_menu.set_active(notify_status)
        notify_menu.connect("activate", self.notify_toggle)
        menu.append(notify_menu)
        menu.show_all()
        menu.popup(None, None, None, 2, event)
       
    # activation / désactivation du son et enregistrement dans le fichier config
    def sound_toggle(self, widget):
        global sound_status
        if widget.active:
            sound_status=True
        else:
            sound_status=False
        WriteConfig ('helpers','sound',sound_status)
 
    # activation / désactivation des notifications et enregistrement dans le fichier config
    def notify_toggle(self, widget):
        global notify_status
        global pynotify
        if widget.active:
            notify_status=True
            pynotify=NotifyAvailable
        else:
            notify_status=False
            pynotify=None
        WriteConfig ('helpers','notification',notify_status)
 
    def close(self,button):
        sys.exit(0)
 
    def about(self, button):
        about_dg = gtk.AboutDialog()
        about_dg.set_name('Lockkeys')
        about_dg.set_version('0.2')
        about_dg.set_copyright('(C) 2014 Vincent Gay <vgay@vintherine.org>')
        about_dg.set_comments(("Simple icône dans la zone de notification pour indiquer l'état de CapsLock et NumLock"))
        about_dg.set_license('Ce script est distribuable sous licence gpl version 3 ou supérieure\nhttp://www.gnu.org/licenses/gpl-3.0.fr.html')
        about_dg.set_website('http://blog.vintherine.org')
        about_dg.run()
        about_dg.destroy()
 
class Manager:
    def __init__(self):
        self.listener = Systray()
       
    def __property_modified_handler(self):
        self.listener.property_modified()
 
    def update(self):
        self.__property_modified_handler()
        return True
 
def main():
    initXGetKeyboardControl()
    m = Manager()
    glib.timeout_add(200, m.update)
    gtk.main()
 
ConfigFile=os.path.expanduser('~/.config/lockkeys.cfg')
# aplay appartient au paquet alsa, est-ce la peine de vérifier ?
Sound = 'aplay /usr/local/share/lockkeys/ding.wav > /dev/null 2>1&'
sound_status=True
pynotify = None
Config = ConfigParser.ConfigParser()
msg=[]
msg.append('Capslock = off, Numlock = off')
msg.append('Capslock = on, Numlock = off')
msg.append('Capslock = off, Numlock = on')
msg.append('Capslock = on, Numlock = on')
 
#créer le fichier de config s'il n'existe pas
if os.path.isfile(ConfigFile) == False:
    ini = open(ConfigFile,'w')
    Config.add_section('helpers')
    Config.set('helpers','sound',True)
    Config.set('helpers','notification',False)
    Config.write(ini)
    ini.close()
 
# lire le fichier de configuration    
Config.read(ConfigFile)
try:
    sound_status = Config.getboolean("helpers", "sound")
except:
    WriteConfig ('helpers','sound',True)
try:
    notify_status = Config.getboolean("helpers", "notification")
except:
    WriteConfig ('helpers','notification',False)
    notify_status=False
if notify_status:
    pynotify=NotifyAvailable
   
main()

Si l'indentation n'est pas propre suite au copié collé merci de prendre le code sur pastebin

Dépendances :

  • python2
  • gtk2
  • pygtk
  • python2-notify (optionnel)
  • aplay (installé par alsa donc en principe présent)

Il me reste toutefois un point me chiffonne avec cette solution : le timeout qui gère l'appel à gtk. S'il est trop haut il y a un décalage entre l'appui sur les touches et le changement d'icône. S'il est trop bas la charge cpu, quoique supportable, excède 1%. Ce qui me paraît beaucoup pour une simple applet. Avec un compromis à 400 ms la charge ressort à 0,7% (Intel Pentium 2020M 2.4Ghz double cœur).

edit : problème résolu grâce aux conseils de Benjarobin. Le code ci-dessus a été modifié en conséquence.

Voilou, Il reste encore du boulot pour rendre l'application présentable mais c'est mon premier script python : ça s'arrose :-)

Chez moi ça fonctionne correctement mais si quelqu'un d'autre voulait bien tester ça serait sympa.

yaourt paginé et en couleur

extrait du wiki de archlinux.fr :

Yaourt est un programme en ligne de commande qui interface les fonctions de pacman et makepkg pour la gestion des paquets sous Arch Linux.

Cet outil bien connu des archers est particulièrement utile dans son mode interactif combinant recherche et installation (qui est du reste le mode par défaut). Pour les débianeux essayez d'imaginer un apt-cache search en couleur vous permettant de sélectionner dans le résultat le ou les paquet(s) à installer (peut-être cela existe-t-il).

Toutefois la recherche s'effectuant tant sur le nom du paquet que sur sa description, et intégrant d'office tous les paquets du dépôt des utilisateurs AUR, le nombre de lignes résultant peut vite devenir important. Et même gênant car le plus souvent ce qui nous intéresse est au sommet de la liste, provenant des dépôts officiels (core, extra, community, multilib) quand les dernières lignes que nous voyons, au moment de saisir le numéro des paquets à installer, ne contiennent que des paquets AUR. Dans un émulateur de terminal en mode graphique c'est le recours assuré à l'ascenseur ou à la molette !

Une solution est la pagination en utilisant une commande comme more, less ou most. Il existe pour cela l'option --pager. Extrait de la page man :

--pager
           Use $PAGER to show search results.

Il faut donc préalablement définir $PAGER :

export PAGER=less

ainsi la commande yaourt --pager monpaquet vous permettra de naviguer dans la liste avec les touches de paginations. Il suffira d'appuyer sur la touche q pour sortir de less et de se voir demander de saisir sa sélection.

Parfait.... mais il y a encore un petit quelque-chose à régler : la sortie n'est plus en couleur, l'option --pager désactivant cette caractéristique. Elle peut se rétablir avec l'option --color mais il faut alors demander à less d'autoriser les caractères spéciaux, ce qui se fait par l'option -r ⇒ export PAGER="less -r"

Et comme la commande finale (yaourt --color --pager) est un peu longue je me suis fait un alias et j'ai mis tout ça dans mon .bashrc :

export PAGER="less -r"
alias fromage="yaourt --color --pager"

Slides du Premier Meetup Archlinux France

Ce 21 Octobre a eu lieu le premier meetup Archlinux France, dans les locaux d’Arkena à Paris.

Deux sujets étaient à l’ordre du jour :

  • Présentation de la communauté Archlinux.fr ( par moi même )
  • Gestion de serveurs sous Archlinux ( par seblu )

35 personnes étaient présentes, ce qui est pas mal pour une première sans trop de communication (on commence doucement !)

Les discussions ont été très intéressantes, avec la présence de plusieurs developpeurs Archlinux, entre autres Guillaume , Remy , et bien sur Seblu (qui a organisé tout ça !)

Voici mes slides, présentant Archlinux.fr, son histoire, ses projets, ses besoins. Vous pouvez d’ailleurs aussi relire ce post d’il y a quelques mois).
Seblu devrait partager les siens prochainement :) :

Merci à tous les présents, et à bientôt pour la prochaine session !

Remplacer Dropbox par ownCloud

J'ai évoqué dans un précédent billet les raisons incitant au passage de Dropbox à ownCloud. Je n'y reviendrai pas, une simple recherche « Dropbox polémique » dans votre moteur de recherche habituel vous permettra de vous faire votre propre idée.

OwnCloud étant un produit libre vous pouvez évidement l'installer sur votre propre serveur, si possible auto-hébergé. Ceci est hautement recommandable d'un point de vue libriste mais pas toujours réalisable (qualité de la connexion, disponibilité matérielle et humaine....) et n'est pas l'objet de cet article. Pour le besoin de ce test j'ai utilisé les services d'un hébergeur spécialisé à savoir la mère Zaclys. Vous pouvez naturellement en choisir un autre, par exemple sur cette liste publiée sur le site de ownCloud.

Description de l'offre

La mère Zaclys est une association loi de 1901 proposant un certain nombre de services dont un lecteur de flux, un album photo, un envois de gros fichiers (pièces jointes d'e-mail)... et un cloud. L'offre de ce dernier est très modulaire et évolutive allant de 0€ pour 1Go au serveur dédié. J'ai choisi pour ma part d’adhérer à l'association pour une cotisation de 9,60€/an, ce qui me donne droit à 10Go de cloud. À ce prix là faut pas se gêner. En fait si, il faut se souvenir que c'est une association et pas un supermarché, et que chacun à sa manière peut tenter de se rendre utile.

Pour en savoir plus ça ce passe sur cette page. N'oubliez pas d'activer votre cloud après votre adhésion : c'est deux processus différents.

Interface web

Vous pouvez vous loguer sur le web à l'adresse https://webcloud6.zaclys.com/. Cela permet d’accéder à ses données depuis n'importe quel appareil connecté, même si ce n'est pas le vôtre (amis, cybercafé, boulot...). La page par défaut est votre espace de stockage mais un menu en haut à gauche vous permettra d'accéder aux différentes ressources disponibles.

À la racine de votre espace de stockage vous trouverez une documentation au format pdf de 80 pages, malheureusement en anglais. Pour les anglophobes il y a une documentation plus restreinte sur le site de Zaclys.

Dans la partie fichiers on notera la possibilité de récupérer des fichiers effacés ou revenir à une version antérieure. Il est également et évidemment possible de partager des fichiers, soit en envoyant un lien (avec ou sans mot de passe) soit en spécifiant les utilisateurs. J'aurai aimé trouver ces possibilités de partage directement intégrés dans les navigateurs de fichiers, à l'instar de dolphin-dropbox-plugin, mais mes recherches sont pour l'instant restées vaines. OwnCloud étant l'œuvre d'un développeur KDE on peut espérer que cela viendra vite.

À partir de la version 7 de ownCloud server produit une page web "responsive design", c'est à dire qui s'adapte à tous types d'écran. Ceci est particulièrement intéressant pour les utilisateurs de Firefox OS, système d'exploitation basé sur les technologies web et qui ne dispose pas (encore) d'un client spécifique.

Synchronisation des données (mise en place du client)

Vous trouverez certainement dans votre distribution un paquet owncloud-client qu'il suffira d'installer. Pour Archlinux il est dans AUR. Pour Windows, MacOS, Android et Ios (ainsi que Debian, CentOS, Fedora, Suze et Ubuntu) vous trouverez votre bonheur sur cette page.

Une fois l'installation terminée initialisez la connexion en lançant l'application soit en ligne de commande (owncloud) soit par l’icône dans le menu qui va bien (chez moi c'est dans accessoire et non pas dans réseau comme on aurait pu s'y attendre). Vous aurez à renseigner le serveur (ici https://webcloud6.zaclys.com), votre identifiant et votre mot de passe, ainsi que le dossier local que vous voulez synchroniser.

Serveur Identifiant Local Connexion

L'icône de owncloud apparaît alors dans la zone de notification (systray). Un clic gauche vous permettra d'afficher l'état de votre compte et de régler quelques paramètres

Compte Activité Généraux Réseau

Le premier panneau (compte) vous permettra notamment de connaître votre taux d'occupation. Dans le troisième (généraux) j'ai coché les cases "lancer au démarrage" et "afficher les notifications".

Un clic du bouton droit permet, notamment, d'ouvrir sa page owncloud dans le navigateur web et son dossier de fichier. Attention : les navigateurs utilisés sont définis par les propriétés de xdg-settings. Si vous utilisez un environnement de travail reconnu, comme Gnome, KDE, XFCE ou LXDE, pas de problème. Mais si, comme moi, vous n'utilisez qu'un simple gestionnaire fenêtre (openbox par exemple) il faudra les définir dans votre .xinitrc. Par exemple :

 

export DESKTOP_SESSION=LXDE
export BROWSER=firefox

Synchronisation avec un carnet d'adresse

Avec Thunderbird

Le carnet d'adresse de Thunderbird ne fonctionne pas nativement avec Carddav, il faut donc passer par une extension, SOGo Connector. Une fois celui-ci téléchargé et installé (et Thunderbird redémarré) il vous faut récupérer l'URL du carnet d'adresse de ownCloud sur la page web consacrée aux contacts. Tout en bas à gauche cliquez sur l'icône en forme de roue dentée puis ,sur la ligne correspondant au carnet d'adresse de votre choix, cliquez sur l'icône en forme de maillons et copiez l'adresse qui apparaît. Il ne reste plus qu'à afficher le carnet d'adresses de Thunderbird et appeler le menu Fichier → Nouveau → Carnet d'adresse distant. Choisissez un nom, collez l'adresse préalablement copiée sur la ligne URL et réglez les autres paramètres à votre convenance.

Si vous souhaitez profiter pleinement des propriétés des contacts carddav, et notamment des catégories, il vous faudra une extension supplémentaire : CategoryManager. Ce sera particulièrement utile pour vous retrouvez dans un carnet de plusieurs centaines d'adresses

Avec Evolution

Pas de souci, Evolution utilise nativement carddav, l'adresse à coller dans la zone URL est celle récupérée comme indiqué ci-dessus pour Thunderbird. Il vous faudra juste ajuster manuellement les catégories de contact que vous utilisez car si elle sont bien reconnues leur liste n'est pas importée (menu Édition → Catégories disponibles). Pensez à cocher l'option qui va bien ("copier localement le contenu du carnet...") si vous pensez avoir à consulter des adresses sans connexion internet. Par ailleurs Gnome-Keyring doit être installé pour gérer les mots de passe.

Avec Kaddressbook (KDE)

Comme Evolution kaddressbook utilise nativement carddav, par contre je n'ai vu nulle part comment gérer les catégories. Peut-être ai-je mal regardé ? D'une manière générale tout ce qui me paraît simple ailleurs me paraît long et compliqué avec la suite kmail. Voilà la suite d'écran par laquelle je suis passé.

Sur le 3ème écran il y a la possibilité de choisir owncloud mais je suis passé par une configuration manuelle. Voir ce tuto sur le web de Zaclys.

Avec un webmail (RoundCube)

J'utilise RoundCube lorsque je ne suis pas chez moi pour me connecter sur mon adresse sur le serveur de Gandi. Dans cette situation aussi une synchronisation du carnet d'adresse s'avérerait très utile. Malheureusement il s'avère qu'un plugin soit nécessaire et qu'en l’occurrence il n'est pas installé. Le sujet a été déjà évoqué sur Gandi Groupes mais est resté sans réponse.

J'ai donc été très intéressé de voir que Zaclys proposait une adresse mail (en beta test). Ici encore le plugin n'était pas installé mais il m'a été répondu ok on ajouteà la liste des plugin roundcube à activer

Affaire à suivre donc.

Synchronisation avec un calendrier

Avec Thunderbird (Lightning)

Il n'y a pas de calendrier nativement avec Thunderbird, mais ici encore une extension : lightning. Celle-ci accepte les connexions caldav et la procédure est très simple. Tout d'abord récupérer l'URL du calendrier à synchroniser sur l'interface web (même principe que pour le carnet d'adresse, voir plus haut), puis un clic droit dans la zone d'agendas de lightning → Nouvel agenda → suivre les instructions. Une page de tuto est consacrée à ce sujet sur le site de zaclys.

Avec Evolution

Même principe que pour le carnet d'adresse, caldav fonctionne nativement avec Evolution.

Avec korganizer (KDE)

Même principe que pour le carnet d'adresse, caldav fonctionne nativement avec korganizer.

Synchronisation avec les smartphones

Je n'ai pas (encore) de smartphone mais d'après ce que j'ai lu il y a des solutions webdav, carddav et caldav pour Android et pour Ios. Cela semble un poil plus complexe pour Firefox OS, notamment en ce qui concerne les contacts, mais faisons confiance à la communauté pour que ce besoin soit vite pris en compte.

TouchpadToggle : Gestion du touchpad

Le touchpad, je ne m'en sers que quand je ne peux pas faire autrement, c'est-à-dire quand je n'ai pas de souris. Par contre quand il est actif il me gène plus qu'autre chose et l'activité des mains sur le clavier provoque bien des erreurs. Il y a bien une touche de fonction prévue à cet usage sur mon ordinateur mais elle ne fonctionne pas nativement dans mon environnement de travail (Archlinux Openbox). Aussi je l'avais tout simplement (et paresseusement) désactivé en mettant dans mon autostart la première commande trouvée sur le web :
$ /usr/bin/synclient TouchpadOff=1 &

Curieusement cela n'affecte que le déplacement du pointeur, mais pas l'activité des boutons. ClickPad=0 résolvait partiellement le problème (le simple clic, mais pas le double) mais la recherche commençait à devenir pénible et je sentais bien que si je voulais une solution pérenne il me fallait reprendre le problème à la base. En l’occurrence la base c'est xorg (tant que Wayland n'aura pas définitivement remplacé xorg), et ça tombe bien, chez xorg ils ont commis un petit outil en ligne de commande pour gérer les périphériques d'entrée : xinput (que vous trouverez dans le paquet xorg-xinput de toutes les bonnes distributions).

Voici donc ma démarche et le petit script qui en résulte (voir à la fin de l'article). À adapter en fonction des besoins et du matériel.

Les objectifs :
  • fonctionner en bascule pour être intégré avec la susdite touche de fonction
  • détecter la présence ou non d'une souris au démarrage de ma session et désactiver le touchpad en fonction
  • afficher le résultat sous forme de notification
  • tout ceci indépendamment de l'environnement graphique

Vérifier les dépendances

avant toute chose vérifier que xinput est disponible, sinon ce n'est pas la peine d'aller plus loin.

if ! command -v xinput >/dev/null; then
    notify-send
--icon=dialog-error -t 7000 $Titre "Dépendance xorg-xinput non trouvée" 2>/tmp/touchpadError
     exit 1
fi

Pour bénéficier des notifications il faut que libnotify soit installé (voir ci-dessous) mais le message d'erreur éventuel sera enregistré dans /tmp

Prise en main de xinput

la commande xinput sans paramètre liste les périphériques détectés. Voici ce que cela donne chez moi :

[vincent@Astor ~]$ xinput
⎡ Virtual core pointer                            id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                  id=4    [slave  pointer  (2)]
⎜   ↳ Logitech USB Receiver                       id=10    [slave  pointer  (2)]
⎜   ↳ Logitech USB Receiver                       id=11    [slave  pointer  (2)]
⎜   ↳ ETPS/2 Elantech Touchpad                    id=15    [slave  pointer  (2)]
⎣ Virtual core keyboard                           id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard                 id=5    [slave  keyboard (3)]
    ↳ Power Button                                id=6    [slave  keyboard (3)]
    ↳ Video Bus                                   id=7    [slave  keyboard (3)]
    ↳ Video Bus                                   id=8    [slave  keyboard (3)]
    ↳ Sleep Button                                id=9    [slave  keyboard (3)]
    ↳ USB2.0 HD UVC WebCam                        id=12    [slave  keyboard (3)]
    ↳ Asus WMI hotkeys                            id=13    [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard                id=14    [slave  keyboard (3)]

Les renseignements qui nous intéressent sont le nom et l'identifiant. Ici on peut voir mon touchpad (ETPS/2 Elantech Touchpad, id=15) et ma souris (Logitech USB Receiver, id=10 et 11).

Pour aller plus loin une lecture de man s'impose. Les commande pour activer et désactiver un périphérique sont :

$ xinput enable identifiant
$ xinput disable identifiant

Arf... et évidement l'identifiant peut changer d'un boot à l'autre. Il faudra donc le lire. Quelque chose comme

DevID=$(xinput | grep "$NomTouchpad" | cut -d"=" -f2 | cut -d $'\x09' -f1)

ou $NomTouchpad contient le nom du périphérique (ici ETPS/2 Elantech Touchpad)

Évidement si l'on ne trouve pas de touchpad (désactivé dans le BIOS ?) on s’arrêtera là :

if [[ -z $DevID ]]; then
    notify-send
--icon=dialog-info -t 5000 $Titre "Touchpad non trouvé"
    exit
0
fi

Pour savoir l'état d'un périphérique (actif ou nom) la commande est

$ xinput list-props identifiant

Le résultat donne ceci (c'est la 2ème ligne qui nous intéresse) :

$ xinput list-props 15
Device 'ETPS/2 Elantech Touchpad':
    Device Enabled (135):    0
    Coordinate Transformation Matrix (137):    1.000000, 0.000000...etc.

ici la ligne "Device Enabled (135) : 0" nous indique que le touchpad n'est pas actif. Pour isoler la variable on peut faire quelque chose comme ça :

Enabled=$(xinput list-props $DevID | grep Enabled | tail -c2)

Il suffit donc de tester cette variable pour connaître la commande à lancer. Voilà pour le fonctionnement en bascule.

Automatiser la désactivation au démarrage si une souris est détectée

Autant pour la détection du touchpad on peut estimer que le matériel n'évoluera pas pendant la durée de vie de l'ordinateur, autant on peut considérer que changer de souris, ne serait-ce qu’occasionnellement, ça doit pouvoir s'envisager. Donc repérer le périphérique par son nom ne semble pas une bonne idée.

En revanche si l'on observe la liste issue de la commande xinput ci-dessus on voit que la rubrique Virtual Core Pointer ne contient d'autre matériel que le touchpad et la souris. Donc si l'on ne retient que les lignes contenant le mot "pointeur" et ne contenant pas le mot "Virtual", et qu'il y en a au moins 2, ce serait bien le diable s'il n'y avait pas une souris la dedans. Il y a d'autres solutions possibles, notamment lsusb ou lshw, mais outre que cela créerait une dépendance supplémentaire, je n'ai pas trouvé de formulation aussi simple.

Pour savoir si le script est appelé au démarrage on recherchera un paramètre d'appel que l'on aura placé sur la ligne de commande. Et si oui on ne le poursuivra que dans la mesure ou on supposera l'existence d'une souris.

if [[ $1 == "autostart" ]]; then
     if (( $(xinput | grep pointer | grep -vc Virtual) < 2 )); then exit 0; fi
fi

Si le touchpad a été désactivé par erreur un simple appel de la touche de fonction associé le rétablira.

En matière d'autostart la solution la plus standard me semble la création d'un fichier desktop dans $XDG_CONFIG_HOME/autostart/ (généralement ~/.config/autostart). Ça devrait ressembler à ça  :

[Desktop Entry]
Name=TouchpadToggle
GenericName=Touchpad Toggle
Comment=Activation désactivation du touchpad
Exec=touchpadtoggle autostart
Terminal=false
Type=Application
Categories=System;
StartupNotify=false

À noter le paramètre autostart passé sur la ligne de commande et évoqué plus haut pour distinguer l'appel initial d'un appel par la touche de fonction.

Gestion des notifications

Bon, ce n'est pas essentiel, mais tant qu'à faire... La dépendance à installer est libnotify, qui est également dans toutes les distributions. La commande est

$ notify-send [-i icon] [-t millisecondes] [titre] message

Les icônes seront nommées selon les spécification de la freedesktop organisation. Le rendu pourra être différent d'un environnement à l'autre et je ne l'ai testé que sous OpenBox et KDE, j'espère que ça marche partout.

Association à une touche de fonction

Bien sûr il est aisé d'utiliser les raccourcis clavier de l'environnement de bureau que l'on utilise, mais puisque l'on recherche une solution qui marche partout on préférera Xbindkeys. Ça marche avec toutes les touches de fonction et c'est indépendant des environnement de bureau. Après installation (paquet disponible dans toutes les distributions) pensez immédiatement à créer un fichier de configuration vide à la racine de votre répertoire personnel sans quoi vous auriez un message d'erreur à la première utilisation.

$ touch ~/.xbindkeysrc

Ensuite il faut définir la touche à utiliser. Dans mon cas fn→F9

$ xbindkeys -k

Cela provoque l'ouverture d'une petite fenêtre blanche et l'invite à choisir une clef ou une action souris. À la suite de quoi le résultat s'affichera dans le terminal sous cette forme :

You can use one of the two lines after "NoCommand"
in $HOME/.xbindkeysrc to bind a key.
"(Scheme function)"
m:0x10 + c:199
Mod2 + XF86TouchpadToggle

Plus clairement cela nous convie à éditer le fichier de config (~/.xbindkeysrc) et à saisir successivement la commande à exécuter et la clef associée, soit sous forme de couple modificateur / N° de clef (ici m:0x10 + c:199), soit sous forme de nom symbolique (Mod2 + XF86TouchpadToggle). Dans mon cas l'une des deux formules suivante :

# Activation / désactivation du touchpad
"touchpadtoggle"
m:0x10 + c:199

ou encore

# Activation / désactivation du touchpad
"touchpadtoggle"
Mod2 + XF86TouchpadToggle

enfin n'oubliez pas de rajouter xbindkeys avant la ligne qui démarre votre gestionnaire de fenêtre dans votre ~/.xinitrc

Récapitulatif

Si la solution vous intéresse :
  1. Installez si ce n'est déjà fait xorg-xinput, xbindkey et libnotyfy.
  2. Copiez le script ci-dessous dans un répertoire figurant dans votre $PATH (/usr/local/bin semble approprié), nommez le touchpadtoggle et rendez le exécutable (chmod +x /usr/local/bin/touchpadtoggle)
  3. Exécutez xinput et repérez la ligne correspondant à votre touchpad. Personnalisez le script en modifiant le contenu de la variable NomTouchpad
  4. Créez un touchpadtoggle.desktop dans votre répertoire ~/.config.autostart avec les données ci-dessus si vous souhaitez une désactivation automatique à l'ouverture de votre session.
  5. Créez un .xbindkeysrc vide dans votre Home et rajoutez xbindkeys dans votre ~/.xinitrc
  6. Lancez la commande $ xbindkeys -k et récupérer le code de la touche que vous voulez associer au script puis éditez votre .xbindkeysrc en conséquence.

Voilà, j'espère que je n'ai rien oublié, chez moi ça marche impeccablement. Dans tous les cas je serais heureux d'avoir votre retour.

Le script

#! /bin/bash 
######################################################
## TouchpadToggle                                   ##
## Gestion du touchpad avec xinput                  ##
##                                                  ##
## copyleft vgay at vintherine dot org              ##
## version 0.2 du 20140918                          ##
##                                                  ##
## dépendance obligatoire : xorg-xinput             ##
## dépendance optionelle libnotify                  ##
## et xbindkey pour associer ce script à une touche ##
######################################################

### Personnalisation -> mettez ici le nom de votre touchpad tel que trouvé avec la commande xinput.
NomTouchpad="ETPS/2 Elantech Touchpad"
### Début du script

IFS=
$'\n'
if
! command -v xinput >/dev/null; then notify-send --icon=dialog-error -t 7000 $Titre "Dépendance xorg-xinput non trouvée" 2>/tmp/touchpadError exit 1 fi
Cde[0]=
"xinput enable " Cde[1]="xinput disable " Msg[0]="Touchpad désactivé" Msg[1]="Touchpad activé" Titre="Gestion du touchpad :"
DevID=$(
xinput | grep "$NomTouchpad" | cut -d"=" -f2 | cut -d $'\x09' -f1) if [[ -z $DevID ]]; then notify-send --icon=dialog-information -t 5000 $Titre "Touchpad non trouvé" exit 0 fi
Enabled=$(
xinput list-props $DevID | grep Enabled | tail -c2)
if [[
$1 == "autostart" ]]; then if (( $(xinput | grep pointer | grep -vc Virtual) < 2 )); then exit 0; fi fi
Message=$(
eval ${Cde[$Enabled]}$DevID 2>&1) Enabled=$(xinput list-props $DevID | grep Enabled | tail -c2) if [[ -z $Message ]]; then notify-send --icon=dialog-information -t 5000 $Titre ${Msg[$Enabled]} else notify-send --icon=dialog-error -t 7000 $Titre $Message fi