LXC, la solution de virtualisation légère

Si comme moi vous aimez bien tester différents outils ou services GNU/Linux sans encombrer votre machine réelle, la solution de virtualisation par container LXC pourrait grandement vous aider.poupée russe

Voici les quelques avantages de cet outil :

  • Optimisation de l'utilisation de votre machine en hébergeant plusieurs configurations systèmes
  • Sécurisation de vos process en les mettant à l'abris dans un "chroot amélioré".
  • Facilité d'installation car l'outil est intégré au noyau Linux.
  • Avoir sous la main un autre GNU/Linux sans manger toute vos ressources CPU


Cet article n'a pas d'autre prétention que de me servir de bloc-note lors d'une prochaine réinstallation et ajouter une ressource française sur le sujet.

Pour l'installer sous Debian :Logo debian

Si besoin ajouter le système de paramétrage CGROUP à votre liste de points de montage dans votre fichier etc/fstab (vérifiez si la ligne suivante est déjà présente):

cgroup          /sys/fs/cgroup  cgroup  defaults        0       0

Si l'on souhaite mettre nos machines virtuelles directement sur le réseau physique, nous avons besoin de créer un pont sur lequel viendra se brancher notre machine physique ainsi que nos machines virtuelles.

Le paquet bridge-utils va créer un pont/commutateur/switch entre vos machines virtuelles/physique et votre réseau local (LAN).

Schema reseau

aptitude install bridge-utils
Pour mettre en place cette configuration, vous allez devoir remplacer votre eth0 en DHCP par br0 dans /etc/network/interfaces :
auto br0
iface br0 inet dhcp
bridge-ports eth0

Installez le paquet LXC contenant un ensemble de script et de templates :

aptitude install lxc

Si vous souhaitez installer une Debian dans un de vos conteneurs, vous aurez besoin d'installer debootstrap :

aptitude install debootstrap

Maintenant, pour créer votre premier container de type Debian sans limitation :

lxc-create -n le_nom_de_votre_container -t debian

Il faudra configurer votre container avant de le lancer en allant toucher le fichier de configuration dans /var/lib/le_nom_de_votre_container/config. Les lignes importantes à modifier sont :

lxc.network.type = veth
lxc.network.flags = up
#On s'appuie sur l'interface br0 physique
lxc.network.link = br0
#On nomme notre interface virtuel eth0
lxc.network.name = eth0

Par défaut sous Debian, lxc ne vous crée pas de terminal pour vous connecter à votre machine virtuelle.
Avouez que c'est dommage !
Nous allons y remédier en créant nous même le fichier spécial correspondant à un terminal virtuel avec mknod :

mknod -m 666 /var/lib/lxc/le_nom_de_votre_container/roots/dev/tty c 4 1

Si vous souhaitez lancer votre machine avec une console virtuel mais ATTENTION vous ne pourrez pas quitter la console sans éteindre votre container :
lxc-start -n le_nom_de_votre_container

Si vous voulez avoir en tâche de fond votre machine virtuelle ou tout simplement pouvoir quitter votre console quand vous le souhaitez (via Ctrl a +q) :

lxc-start -n le_nom_de_votre_container -d

Maintenant, vous pouvez accéder à votre console :

lxc-console -n le_nom_de_votre_container

Ma difficulté à l'installation venait surtout de la création de la console virtuelle sur une version Testing.

Pour l'installer sous ArchLinux :Logo archlinux

La seule difficulté que j'ai rencontré sous Archlinux est la configuration du bridge.
Je passe brièvement l'installation des paquets vus précédemment :

pacman -S lxc bridge-utils

Si besoin rebooter votre machine pour prendre en compte vos nouveaux modules :

lsmod | grep br
bridge                 85984  0
stp                     1621  1 bridge
llc                     3729  2 stp,bridge

Normalement, l'utilitaire netcfg doit créer votre pont automatiquement avec les paramètres que l'on va spécifier ci-dessous :

pacman -S netcfg
Modifier le fichier/etc/network.d/bridge :
INTERFACE="br0"
CONNECTION="bridge"
DESCRIPTION="Mon pont davignon"
BRIDGE_INTERFACES="enp4s0"
IP="dhcp"

Modifier le fichier /etc/conf.d/netcfg :

# Network profiles are found in /etc/network.d
NETWORKS=(bridge)

Ajouter l'unité à votre démarrage afin de monter le réseau à chaque démarrage :

systemctl enable netcfg@bridge.service

Pour créer manuellement votre pont si cela n'a pas été fait :

brctl addif br0 enp4s0

Au plaisir.

Ps : Pas de bol pour moi, une personne vient de publier un article sur LXC sous Debian à l'instant en Français. J'aurais été en début d'écriture, je n'aurai pas écrit ...

Un dépôt pour ses fichiers de configuration et un Rakefile pour les déployer

J’ai plusieurs articles plutôt conséquents en préparation (un tutoriel sur les Makefile ainsi qu’une explication très détaillée du fonctionnement de l’algorithme RSA avec implémentation en Ruby) mais comme je ne trouve pas vraiment le temps de les finir en ce moment, j’en profite pour publier un petit article.

Un ami m’a demandé aujourd’hui comment je gérais mes fichiers de configuration; ces fameux dotfiles, ou fichiers cachés, présents dans $HOME ou $XDG_CONFIG_HOME. La réponse est simple: via un dépôt git. Oui mais… comment les copier dans $HOME ensuite? Simplement via un script, ou plus exactement un Rakefile qui s’occupe de faire des liens symboliques vers les fichiers de mon dépôt. J’utilisais auparavant un script shell (assez moche d’ailleurs) mais bon, un script shell, même si ça rend parfois bien service, c’est pas beau.

Voici donc la procédure que j’utilise: Lorsque j’ai accès à une nouvelle machine, mon premier réflexe est d’installer mes outils indispensables, comme vim, zsh et git. Une fois ceci fait, je clone mon dépôt de fichiers de configuration, je me déplace dedans via un terminal, je lance un rake install et hop, je me sens comme chez moi. Simple non? Mais comment ça marche? Pour les non-familiers, rake est un outil similaire à make, qui fonctionne donc avec un Rakefile en lieu et place d’un Makefile. C’est un outil écrit en Ruby que l’on peut facilement installer via une gem.

Quel avantage par rapport à make me direz-vous? Et bien simplement le fait que l’on peut profiter de toute la puissance du langage haut-niveau qu’est Ruby pour définir des tâches qui sont les cibles de notre Rakefile et que l’on peut appeler des méthodes (comprenez fonction) définies en Ruby directement depuis ces tâches.

Dans le cas présent, seule une tâche est définie: install. Cette tâche s’occupe donc, comme je l’ai dit, de lier tous mes fichiers de configuration mais aussi de changer mon shell pour zsh, si ce dernier est installé sur le système, via des méthodes définies également dans le Rakefile. Bon assez parlé, le voici donc:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
require 'rake'

desc "links configuration files from this repository to $HOME"
task :install do
  dest = ENV['HOME']
  puts "Linking to ~"
  link_folder_content(dest)

  dest = dest + "/.config"
  puts "Linking to ~/.config"
  Dir.chdir("config")
  link_folder_content(dest)

  check_shell("/bin/zsh")
end

def link_folder_content(dest)
  replace_all = false

  Dir['*'].each do |file|
      next if %w[config Rakefile README linkconfig.sh].include? file

      file = "." + file if dest = ENV['HOME']

      if File.exist?(File.join(dest, "#{file}"))
          if replace_all
              replace_file(dest, file)
          else
              print "overwrite #{dest}/#{file}? [ynaq] "
              case $stdin.gets.chomp
              when 'a'
                  replace_all = true
                  replace_file(dest, file)
              when 'y'
                  replace_file(dest, file)
              when 'q'
                  exit
              else
                  puts "skipping #{dest}/#{file}"
              end
          end
      else
          link_file(dest, file)
      end
  end
end

def replace_file(dest, file)
  system %Q{rm -v "#{dest}/#{file}"}
  link_file(dest, file)
end

def link_file(dest, file)
  system %Q{ln -sv "$PWD/#{file.sub(/^(.?)/, "")}" "#{dest}/#{file}"}
end

def check_shell(shell)
  if ENV['SHELL'] != shell
      if command?(shell)
          system "chsh -s #{shell}"
      else
          puts "#{shell} not installed. Skipping."
      end
  else
      puts "#{shell} is already set as default shell."
  end
end

def command?(cmd)
  system %Q{which "#{cmd}" > /dev/null 2>&1}
end

Le script est certainement très facilement adaptable à votre besoin. Il est à noter que, dans mon dépôt, mes fichiers et dossiers ne sont pas précédés d’un “.”. La ligne 21 permet d’éviter de créer des liens vers des fichiers où dossiers pour lesquels ce n’est pas nécessaire. À vous donc de l’adapter au même titre que la tâche install.

Ah, et si mes fichiers de configuration vous intéressent, vous pouvez toujours accéder mon dépôt git ici

Chrome et polices: un cauchemar!

Bonjour,

Comme vous l’avez certainement remarqué (pour les lecteurs fidèles), j’ai fait une grosse “mise à jour” de mon design. J’ai décidé de le rendre encore plus simple, épuré et intuitif. J’ai aussi changé les polices, pour quelque chose de plus harmonieux. On se rapproche donc du design d’une page de livre.
Les choses se sont corsées quand j’ai du choisir ces polices. Je n’ai pas choisi de polices trop lourdes (n’incluant pas une large gamme de symboles), afin de ne pas ralentir le chargement des pages.

police
Police, qui a dit police?

Cependant, il a quelque chose qui m’énerve au plus haut point et j’en avais déjà parlé sur Twitter, il y a quelques mois. Cette chose, c’est le rendu “MADE IN CHROME” de certaines polices TTF, utiles pour les sites web.
En effet, certaines polices sont extrêmement mal affichées avec Chrome (j’ai essayé sous Vista et Seven). On se retrouve donc avec des polices aliasées et “craquelées”. J’avais réussi plus ou moins à contourner ce problème, avec la version précédente de mon design, en utilisant une police “grasse”. Comble de l’ironie, certaines de ces polices proviennent de Google Font.

chromecrap
Bravo à Chrome, qui n'affiche pas mon site correctement

Bref, je pousse un coup de gueule parce que j’en ai marre. Afin que vous puissiez voir de quoi je parle, voici des images (pas d’aperçus, car les images sont trop nombreuses). Je vous laisse comparer:

Windows Vista

* IE9 + Vista
* Chrome + Vista

Windows Seven

* Firefox + 7
* IE9 + 7
* Chrome + 7

Mea culpa, car je pensais que ce phénomène était lié à Webkit, mais ce n’est pas le cas. J’ai testé le rendu sur plusieurs navigateurs Webkit et le problème est moins présent. Par conséquent, si vous utilisez encore Chrome, malgré le fait que ce soit un pur produit Google, avec les abus que cela engendrent et que vous notez un mauvais rendu, sachez que ce n’est pas par ma faute.
Je me suis appliqué à écrire un code propre et conforme aux normes, ce n’est pas mon problème si Chrome à décidé, de ne pas faire son travail correctement.

breakit
Voilà ce que j'éprouve, quand je vois un résultat pareil

Ce “bug” est plus que récurrent (il existe depuis un moment déjà) et personne ne semble disposé à s’en occuper. Si vous êtes curieux, je vous laisse chercher de votre côté. Mais si vous lancez une recherche sur Google (tiens donc!) avec des termes tels que “chrome font bug” ou “chrome font rendering”, vous vous apercevrez de la situation.
Aussi dingue que cela puisse paraître, je m’y attendais après les soucis que j’avais rencontré auparavant (même si j’avais un mince espoir).

J’ai une idée pour “contourner” ce problème, mais cela va me prendre du temps supplémentaire, alors que j’aurais pu m’en passer.

Alors, par pitié, les gars de chez Google, pensez aux webmasters / designers et affichez CORRECTEMENT les polices web!! Tout le monde sera heureux et on gagnera du temps.

Gestion d'un disque dur externe en ext4

Si votre disque dur externe n'est utilisé qu'à partir d'un système Linux vous avez tout intérêt à le formater en ext4 pour bénéficier du système d'extents limitant le phénomène de fragmentation. Il est également possible d'utiliser reiser4 (en mode extents) ou btrfs mais ces solutions sont encore expérimentales.

On notera toutefois qu'un mot de passe root vous sera demandé au montage, ce qui peut paraître fastidieux dans le cadre d'un usage domestique. Voici trois solutions pour éviter cela.

Montage sans mot de passe pour un utilisateur donné

Éditer ou créer /etc/polkit-1/rules.d/10-mount-system.rules

polkit.addRule (function (a,s) {
if (a.id == 'org.freedesktop.udisks2.filesystem-mount-system' && s.user == 'UserName')
return polkit.Result.YES;
});

Vérification (les modifications dans polkit s'appliquent immédiatement, pas besoin de relancer quoique ce soit) :

pkcheck --action-id org.freedesktop.udisks2.filesystem-mount-system --process $$ && echo Succès

Montage pour tous les utilisateurs du groupe storage

Éditer ou créer /etc/polkit-1/rules.d/10-mount-system.rules

polkit.addRule(function(action, subject) {
if ((action.id == "org.freedesktop.udisks2.filesystem-mount-system" ||
action.id == "org.freedesktop.udisks2.filesystem-mount") &&
subject.isInGroup("storage")) {
return polkit.Result.YES;
}
});
polkit.addRule(function(action, subject) {
if ((action.id == "org.freedesktop.udisks.filesystem-mount-system-internal") &&
subject.isInGroup("storage")) {
return polkit.Result.YES;
}
});

Pour vérifier les groupes auxquels vous appartenez :

groups

Pour ajouter l'utilisateur lapin au groupe storage :

usermod -G storage -a lapin

Ajout dans le /etc/fstab

Il est tout à fait possible de monter automatiquement un disque dur externe dans le fstab à condition d'utiliser l'option nofail pour ne pas subir de blocage au démarrage si le disque est absent. Pour éviter tout soucis de changement de désignation dans /dev il est conseillé de désigner la partition par son UUID

Pour connaitre l'UUID d'une partition :

ls -l /dev/disk/by-uuid/

La ligne dans mon fstab :

UUID=f4cd4d67-b9fc-4f44-a07a-1c0199520c3f  /media/E500  ext4  rw,nosuid,nodev,user,relatime,data=ordered,nofail  0 2

Notez l'option 2 dans la dernière colonne qui permet le contrôle automatique par fsck. Mettez 0 si vous préférez le faire manuellement. Pour modifier la fréquence des contrôles voir tune2fs

Petits réglages divers

Je me suis attelé cette semaine à régler quelques petits problèmes résiduels dans mon environnement Openbox sous Archlinux. Cela tient au fait qu'un certain nombre de services, lancé ordinairement par les environnements de bureau complets (Gnome, KDE, XFCE, LXDE...) sont ici à gérer "à la pogne". Voici un petit mémo des solutions trouvées.

1 - Enigmail et pgp-agent

J'utilise Enigmail avec Thunderbird pour signer mon courrier. Cela me demandait de saisir ma passphrase à chaque envoi, et comme celle-ci est assez longue cela pouvait devenir fastidieux en cas de grosse activité épistolaire.

Tout d'abord vérifier que la ligne

use-agent

est activée (décommentée) dans ~/.gnupg/gpg.conf. Ceci indique à GnuPG d' utiliser gpg-agent quand il aura besoin du mot de passe.

Encore faut-il que celui-ci soit actif. Pour cela créez le fichier /etc/profile.d/gpg-agent.sh et rendez-le exécutable

#!/bin/sh
envfile="${HOME}/.gnupg/gpg-agent.env"
if test -f "$envfile" && kill -0 $(grep GPG_AGENT_INFO "$envfile" | cut -d: -f 2) 2>/dev/null; then
eval "$(cat "$envfile")"
else
eval "$(gpg-agent --daemon --write-env-file "$envfile")"
fi
export GPG_AGENT_INFO 

Enfin ajouter la ligne suivante à votre .xinitrc :

eval $(gpg-agent --daemon) &

puis redémarrez votre session et vérifiez que gpg-agent est lancé :

$ ps aux | grep agent

2 - nm-applet et Gnome-keyring

Pour gérer les connexions wifi ou 3g une applet ça peut-être pratique. Surtout cela permet de reconnaître les réseaux déjà utilisés et d'automatiser les connexions, ce qui serait un poil plus rébarbatif en ligne de commande. La dernière application à la mode est Wicd, paraît-il plus performante en matière de WiFi, malheureusement elle ne permet pas la gestion des VPN. J'ai donc choisi NetworkManager et nm-applet, ce qui suppose l'utilisation de Gnome-keyring.

Tout d'abord installer gnome-keyring si ce n'est déjà fait

# pacman -S gnome-keyring

ensuite copier ceci dans votre .xinitrc

# Démarrer une session D-Bus
source /etc/X11/xinit/xinitrc.d/30-dbus
# Démarrer GNOME Keyring
eval $(/usr/bin/gnome-keyring-daemon --start --components=gpg,pkcs11,secrets,ssh)
export SSH_AUTH_SOCK
export GPG_AGENT_INFO
export GNOME_KEYRING_CONTROL
export GNOME_KEYRING_PID

3 - gestion du double écran avec xrandr

Quand j'utilise mon PC portable à la maison je lui connecte un écran 22" sur le port VGA ainsi qu'un clavier et une souris USB pour plus de confort. Voici la commande figurant dans mon .config/openbox/autostart pour le configurer

xrandr --output LVDS1 --auto --output VGA1 --auto --primary --left-of LVDS1 &

J'obtiens ainsi un bureau étendu sur les 2 écrans, l'option --primary indiquant aux applications où ouvrir les fenêtres par défaut. Quand j'utilise mon PC en mode portable (sans le deuxième écran) la partie traitant de VGA1 n'est tout simplement pas exécutée et je reviens à un écran normal.

netctl est désormais dans [core]

Rencontrez netctl: une CLI (NdT: interface en ligne de commandes) réseau basée sur profil et utilisant systemd. Dans un futur proche, l’ancien netcfg sera supprimé de [core]. Toute personne l’utilisant est invité à passer à netctl. La migration est un processus manuel au cours de laquelle vous pourriez ne pas avoir accès à l’Internet, donc faites attention et lisez les pages de manuel (netctl (1), netctl.profile (5) et netctl.special (7)).

La conception de netctl est telle que les amateurs de systemd apprécieront son utilisation et les utilisateurs de netcfg seront familiarisés avec ses fichiers de profil. Livré avec netctl, vient un assistant de connexion wifi basé sur ncurses appelé wifi-menu.

Lorsque vous installez netctl, netcfg sera supprimé, mais les services systemd activés le resteront jusqu’à désactivation manuelle. Le wiki netctl (NdlR: en cours de rédaction pour le wiki fr) contient des informations supplémentaires sur la migration depuis netcfg.

Article original

pacman 4.1 dans [core]

pacman a été mis à jour en version 4.1
Vous pouvez voir l’ensemble des modifications ici : pacman.git / NEWS / 4.1

Pensez à vérifier votre /etc/pacman.conf, l’option SyncFirst notamment, n’existe plus, vous pourrez y activer la gestion des couleurs et l’option UseDelta prend dorénavant comme argument le ratio des deltas.

Pour les utilisateurs de pacman-color, ce dernier n’existe plus, pensez à le supprimer avant la mise à jour.

Pour les utilisateurs de yaourt, si vous avez le dépôt [archlinuxfr], il n’y a rien à faire. Pour les adeptes de la compilation depuis AUR, il faut supprimer package-query et le réinstaller après la mise à jour.

MariaDB remplace MySQL dans les dépôts

MariaDB est maintenant officiellement notre implémentation par défaut de MySQL. MariaDB n’est presque rien comme remplacement, aussi une mise à jour devrait être possible avec un minimum de problèmes. Toutefois, en raison de préoccupations de compatibilité restantes, un remplacement automatique n’est pas fait.

Il est recommandé à tous les utilisateurs de mettre à niveau. MySQL passera des dépôts à AUR dans un mois.

Les utilisateurs qui veulent basculer auront besoin d’installer mariadb, libmariadbclient ou mariadb-clients et d’exécuter mysql_upgrade pour migrer leurs systèmes.

Exemple de migration:

# systemctl stop mysqld
# pacman -S mariadb libmariadbclient mariadb-clients
# systemctl start mysqld
# mysql_upgrade -p

percona-server est un autre fork de MySQL disponible dans [community]. Il devrait être plus proche de MySQL Enterprise d’Oracle, mais il est dépourvu des nouvelles fonctionnalités incluses dans MariaDB.

Avec mysql 5.5.30-7 dans [extra], tous les paquets qui en dépendent ont été reconstruits par rapport à leurs homologues MariaDB. Les autres mainteneurs de paquets doivent modifier leurs dépendances pour les paquets MariaDB.

Plus d’informations peuvent être trouvées sur notre liste de diffusion.

Article original

Monitorer son espace disque avec dfc

Lorsque l’on doit gérer des serveurs, une des choses à prendre en compte est l’évolution du besoin en terme d’espace de stockage. En effet, ceux-ci évoluent au cours du temps et, afin de ne pas être pris de court, un bon administrateur systèmes se doit de mettre en place une solution lui permettant d’être informé de cette évolution. Cela lui permet de pouvoir planifier des mesures en conséquence, telles que l’achat de nouveaux disques durs ou d’un SAN.

Il existe de nombreuses solutions pour effectuer cette tâche mais si vous ne souhaitez pas prendre un bazooka pour tuer une mouche, alors dfc combiné à une tâche cron peut tout à fait faire l’affaire. En effet, depuis sa version 3.0.0, dfc permet l’export vers CSV et HTML, ce qui se révèle bien pratique pour cette tâche.

Dans cet article, je vais vous présenter les bases d’un script capable de relever le taux d’utilisation des disques d’une machine fonctionnant sous Linux, BSD ou OSX et d’envoyer le rapport par e-mail avec les versions en HTML et CSV en pièce jointe.

Il est d’abord nécessaire de définir quelques variables:

1
2
3
4
MAILADDRESS=john.doe@domain.tld
TMPFSREPORTHTML=/tmp/dfc-report.html
TMPFSREPORTCSV=/tmp/dfc-report.csv
BOUNDARY="========== BOUNDARY =========="

Il est également nécessaire de définir la fonction qui s’occupera effectivement de générer les données pour le rapport. À noter que si dfc n’est pas disponible sur le serveur pour une raison ou un autre, la commande df est appelée en remplacement:

1
2
3
4
5
6
7
8
9
10
fsusage() {
    echo "FILESYSTEM SPACE USAGE REPORT"
    if command -v dfc &>/dev/null; then
        echo "$(dfc -t -tmpfs,rootfs,devtmpfs -c never -disTW)"
        dfc -t -tmpfs,rootfs,devtmpfs -c always -disTWo -e html > $TMPFSREPORTHTML
        dfc -t -tmpfs,rootfs,devtmpfs -c never -disTWo -e csv > $TMPFSREPORTCSV
    else
        echo "$(df -Th)"
    fi
}

Étant donné que l’on souhaite envoyer le tout par email, une fonction qui génère son entête s’avère bien utile:

1
2
3
4
5
6
7
8
9
10
11
12
wheader() {
    echo "From: $(hostname -s)@$(hostname --domain)"
    echo "To: $MAILADDRESS"
    echo "Subject: Disk usage report for $(hostname)"
    if command -v dfc &>/dev/null; then
        echo "Mime-Version: 1.0"
        echo -e "Content-Type: Multipart/Mixed; boundary=\"$BOUNDARY\"\n"
        echo "--${BOUNDARY}"
    fi
    echo -e "Content-Type: text/plain\n"
    echo -e "Disk usage report for $(hostname) on $(date)\n"
}

Et puis une autre qui attache les pièces jointes (les fichiers CSV et HTML):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mailattach() {
    if [ -f $TMPFSREPORTHTML ]; then
        echo "--${BOUNDARY}"
        echo "Content-Type: text/html; name="${TMPFSREPORTHTML}
        echo "Content-Disposition: attachment; filename="`basename ${TMPFSREPORTHTML}`
        echo
        cat $TMPFSREPORTHTML
        echo
    fi
    if [ -f $TMPFSREPORTCSV ]; then
        echo "--${BOUNDARY}"
        echo "Content-Type: text/csv; name="${TMPFSREPORTCSV}
        echo "Content-Disposition: attachment; filename="`basename ${TMPFSREPORTCSV}`
        echo
        cat $TMPFSREPORTCSV
        echo
    fi
    echo -e "--${BOUNDARY}--\n"
}

On a désormais tout ce qu’il faut. Il suffit donc simplement d’appeler ces fonctions et d’envoyer le tout par email. Bien évidemment, je considère ici que sendmail ou autre serveur d’envoi est installé et fonctionnel:

1
2
3
4
5
{
    wheader
    fsusage
    mailattach
} | sendmail -i -t

Pour bien faire, il faudrait générer un fichier de log mais je n’estime pas que des explications soient nécessaires pour cela.

EDIT: dfc se trouve sur ici s’il n’est pas déjà disponible en version >= 3.0.0 dans les dépôts de votre distribution.

Un script pour mettre à jour ses dépôt git

Si vous êtes un peu comme moi, vous jonglez avec des dizaines de dépôts git. Ceux auxquels je participe se limitent à une vingtaine environ mais j’ai des dizaines de clones que je consulte à titre d’intérêt, comme ceux du noyau Linux, NetBSD ou autre Awesome WM. Bref, à ce jour, j’ai environ 21G de code source provenant de différents dépôts git sur mon laptop…

Évidemment, j’aime bien les tenir à jour. Donc, afin de me faciliter la tâche, j’ai écrit un simple script shell que j’ai placé à la racine du dossier contenant tous les clones de dépôt git. Il se charge de trouver tous les dossiers de dépôt git et d’y effectuer un git pull.

Le script est tout simple mais bon, comme ça peut éventuellement en arranger d’autres, je partage. ;–)

1
2
3
4
5
6
#!/bin/sh

for d in $(find . -type d -name ".git" | sed 's/\/.git\+$//' ); do
    echo "Current repository: $d";
    cd $d && git pull && cd - || exit 1
done

Si vous savez que vos clones ne se trouvent pas trop loin dans votre arborescence, vous pouvez limiter la recherche en profondeur du find via l’option maxdepth. Par exemple, pour limiter la recherche de dépôts git à une profondeur de 2, il faut modifier le script ainsi:

1
2
3
4
5
6
#!/bin/sh

for d in $(find . -maxdepth 2 -type d -name ".git" | sed 's/\/.git\+$//' ); do
    echo "Current repository: $d";
    cd $d && git pull && cd - || exit 1
done

Bien évidemment, ce script s’arrête s’il rencontre une erreur lors d’un pull sur un dépôt donc vous pouvez l’utiliser sans craintes.

Il va sans dire qu’une légère modification permet de l’utiliser pour d’autres types de dépôts. Par exemple, il suffit de remplacer “.git” par “.hg” et le git pull par un hg pull -u pour qu’il fonctionne avec les dépôts mercurial.

EDIT: Un lecteur m’a très justement fait remarquer qu’il existait la variable d’environnement $OLDPWD, accessible par l’alias -. J’ai donc simplifié le script en conséquence. Merci à lui.

les pointeurs sur fonction en C

Cela fait longtemps que je n’avais pas publié d’article sur mon blog. J’ai toutefois décidé de me remettre à l’écriture par le biais d’une brève explication sur les pointeurs sur fonction en C.

L’idée d’en parler m’est venue car, dans le cadre d’un projet en entreprise, j’ai été amené à mettre en place un protocole permettant de contrôler une application à distance via le réseau. Pour situer le contexte: l’application contrôlée est écrite en C, embarqué oblige, et elle tourne sur une carte comprenant un processeur ARM et un DSP. Pour les besoins du protocole, un daemon écoute sur une socket dédiée et reçoit de la part de clients des commandes sous la forme NOM_DE_LA COMMANDE [OPTIONS].

Le protocole en question doit pouvoir évoluer afin de prendre en charge des nouvelles commandes. Par conséquent, la contrainte que je me suis fixée est qu’il faut que l’ajout d’une nouvelle commande au protocole implique un minimum de changements au niveau du code. C’est afin de répondre à ce problème que j’ai eu recours aux pointeurs sur fonction.

Pour l’illustration, je vais donc donner un exemple, volontairement simplifié, en m’imaginant que je dois pouvoir traiter les commandes du protocole et appeler des fonctions internes à mon programme à cette fin.

En m’inspirant du design pattern “chaîne de responsabilité”, je vais écrire une fonction prenant en argument une commande du protocole avec ses options et qui se se charge d’appeler une fonction de traitement spécifique à ladite commande.

Avant de pouvoir faire cela, il est nécessaire de définir une structure contenant le nom d’une commande du protocole ainsi que sa fonction de traitement associée:

1
2
3
4
struct proto_cmd {
    const char *name;
    int (*process) (char *);
};

Si le premier élément de ma structure est un type très courant, les lecteurs non familier avec les pointeurs sur fonction sont certainement intrigués par le deuxième. Pour ceux-là, pas de panique, l’explication arrive.

Un protocole n’étant, en principe, pas constitué que d’une seule commande, il est également nécessaire d’avoir un moyen de stocker la liste des commandes. Cela peut se faire de plusieurs façons comme en utilisant le principe d’une liste chainée ou encore d’une table de hashage (bon, dans ce cas là le protocole devrait comporter un grand nombre de commandes pour que ça se justifie). Pour rester simple, je vais simplement stocker la liste des commandes dans un tableau:

1
2
3
4
5
struct proto_cmd cmd_table[NBCMD] = {
    {"quit", process_quit},
    {"start", process_start},
    {"stop", process_stop}
};

NBCMD correspond évidemment au nombre de commandes du protocole (seulement trois pour l’exemple ici).

A partir du moment où je possède une table avec la liste des commandes du protocole, il est facile d’écrire la fonction dont je vous parlais tout à l’heure:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int
select_cmd(char *cmd, char *args)
{
  int i;

  for (i = 0; i < NBCMD; i++)
      if (strcmp(cmd, cmd_table[i].name) == 0)
          return cmd_table[i].process(args);

    /*
     * Si on arrive la, alors cela veut dire que la commande ne fait pas partie
     * du protocole...
     */
     (void)fprintf(stderr, "Unknown command: %s\n", cmd);
     return 1;
}

La ligne 9 est celle qui revêt ici le plus d’intérêt. C’est en effet là que se fait l’appel à la fonction associée à la commande, ceci grâce au pointeur sur fonction. Il est à noter que le traitement des commandes se fait dans l’ordre des éléments du tableau. Si le protocole comporte de nombreuses commandes, il faudrait voir pour envisager une solution plus efficace.

Bien évidemment, il reste une chose à écrire: toutes les fonctions de traitement associées aux commandes. Dans ma table je les ai nommées process_quit, process_start et process_stop.

1
2
3
4
5
6
int
process_quit(char *args)
{
    /* on fait notre traitement de la commande "quit" ... */
    return 0;
}

Et ainsi de suite pour les autres commandes. Par conséquent, si l’on souhaite ajouter une commande au protocole, il suffit d’ajouter la commande en question dans la table et d’implémenter sa fonction process. Et c’est tout! Aucun autre changement n’est donc nécessaire dans le code. Sympa non?

Pour la dernière explication, je vais revenir sur la structure proto_cmd. On peut maintenant se rendre compte que, pour le deuxième élément, int correspond au type de retour de la fonction process, que (*process) correspond au pointeur sur la fonction et que (char *) s’associe à l’argument de la fonction process.

J’espère que cette brève explication illustrée était clair. Si ce n’est pas le cas, n’hésitez pas à me contacter par e-mail afin que je puisse modifier cet article en conséquence.

Partage d'une imprimante et d'un scanner (Archlinux - sytemd)

SANE (Scanner Access Now Easy), l'interface de gestion de scanner sous Linux, tout comme CUPS (Common Unix Printing System), le système d'impression, permettent le partage des périphériques sur un réseau. Ceci ce fait assez facilement à condition de faire les choses dans l'ordre. Et sous Archlinux, à contrario des distributions dites "grand public", vous devrez le faire vous-même. Voici à titre d'exemple la mise en la mise en œuvre d'une imprimante multifonction HP phostomart 3100.

Installation de l'imprimante

Il faut d'abord installer les paquets cups, ghostscript et le pilote pour votre imprimante (ici hplip). 

$ yaourt -S cups ghostscript hplip 

Pour connaître le driver pour votre imprimante vous pouvez consulter la base de donnée d'OpenPrinting.

Il vous faut maintenant démarrer le serveur

$ sudo systemctl start cups.service

et pour qu'il se lance automatiquement au démarrage de l'ordinateur

$ sudo systemctl enable cups.service

Vous pouvez maintenant utiliser plusieurs outils graphiques pour paramétrer votre imprimante :

  • l'interface web de cups accessible par l'URL http://localhost:631 Il vous faut être root ou au moins être dans le groupe sys. Allez sur la page Administration pour ajouter votre imprimante.
  • system-config-printer, en principe conçu pour Gnome mais qui s'installe avec très peu de dépendances.
  • Le centre de contrôle de KDE pour les utilisateurs de cet environnement.
  • gtklp (présent dans AUR)
  • hp-setup du paquet hplip (pour les possesseur d'une HP)

Il est tout aussi possible d'installer son imprimante en ligne de commande :

$ sudo lpadmin -p <le_nom-que_vous-voulez> -E -v <device> -P <ppd>

pour connaître device et ppd vous pouvez utiliser lpinfo. Exemple chez moi :

$ lpinfo -v | grep usb:
direct usb://HP/Photosmart%20C3100%20series?serial=MY67QC62HX04P9&interface=1
$ lpinfo -m | grep hp-photosmart_3100
drv:///hp/hpijs.drv/hp-photosmart_3100_series-hpijs.ppd HP Photosmart 3100 Series hpijs, 3.13.3
lsb/usr/HP/hp-photosmart_3100_series-hpijs.ppd.gz HP Photosmart 3100 Series hpijs, 3.13.3
drv:///hp/hpcups.drv/hp-photosmart_3100_series.ppd HP Photosmart 3100 Series, hpcups 3.13.3
lsb/usr/HP/hp-photosmart_3100_series.ppd.gz HP Photosmart 3100 Series, hpcups 3.13.3

Ce qui nous donnera donc :

$ sudo lpadmin -p <PhotoSmart> -E -v <usb://HP/Photosmart%20C3100%20series?serial=MY67QC62HX04P9&interface=1> -P </usr/HP/hp-photosmart_3100_series.ppd.gz>

Voir aussi les commandes : lpoptions, lpstat, cupsenable, cupsdisable, cupsreject, lpr, lpq, lprm...

Installation du scanner

La partie matériel est déjà installée avec hplip. Pour d'autre matériels regarder du coté de hpoj (autres HP), iscan (Epson) brscan (Brother)... 

Coté logiciel il vous faudra sane et son interface graphique xsane, ainsi qu'éventuellement xsane-gimp le plugin pour gimp.

$ yaourt -S sane xsane xsane-gimp 

Vérifiez la présence d'une ligne hpaio dans le fichier etc/sane.d/dll.conf Décommentez-la ou ajoutez-la si nécessaire. Certains scanners nécessitent un firmware : téléversez-le dans /usr/share/sane (par exemple) puis indiquez-le à sane dans /etc/sane.d/<backend-name>.conf

Partage de l'imprimante

Au préalable il faut installer avahi et démarrer le démon (si ce n'est déjà fait). Si vous oubliez ce point le serveur cups refusera de redémarrer après les modifications permettant le partage.

$ yaourt -S avahi
$ sudo systemctl enable avahi-daemon.service # pour un démarrage automatique
$ sudo systemctl start avahi-daemon.service # pour tout de suite
  • Sur l'interface web de cups (http://localhost:631) -> Administration, dans la rubrique Server, cochez Share printers connected to this system puis cliquez sur le bouton Change Settings. Dans l'onglet Printers sélectionnez l'imprimante concernée -> dans la liste Administration sélectionnez Modify Printer. Sur la page suivante cliquez sur Continue puis cochez Share This Printer et validez sur la page suivante (bouton Modify Printer).
  • Avec system-config-printer cliquez dans le menu Serveur -> Paramètres et cochez Publiez les imprimantes partagées connectées à ce système. Cliquez ensuite bouton droit sur l'imprimante concernée et cochez la ligne Partagée.
  • En ligne de commande :
    $ sudo cupsctl --share-printers
    $ sudo lpadmin -p mon-imprimante -o printer-is-shared=true
  • À la pogne : éditez (en tant que root) le fichier /etc/cups/cupsd.conf, remplacez la ligne Listen localhost:631 par Port 631, vérifier la présence d'une ligne Browsing On, puis entre les balises <Location /> et </Location>, après la ligne Order allow,deny, ajoutez une ligne Allow @LOCAL. Éditez également le fichier /etc/cups/printers.conf et pour la ou les imprimante(s) concernée(s) passez la ligne Shared à Yes. Enfin relancez le serveur (sudo systemctl restart cupsd.service)

Installation sur le client

S'il n'y a pas d'imprimante directement attachée au poste client le paquet libcups est le seul qui ait besoin d'être installé. Il suffit ensuite d'indiquer l'adresse IP ou le nom du serveur dans /etc/cups/client.conf ou d'utiliser rechercher une imprimante réseau avec votre interface graphique (system-config-printer ou le centre de contrôle de KDE...).

Partage du scanner

Èditez le fichier /etc/sane.d/saned.conf et ajoutez 192.168.0.0/24 sous localhost (ou [2001:db8:185e::42:12]/64 si vous êtes en ipv6).

Installez xinetd .

$ yaourt -S xinetd

Èditez /etc/xinetd.d/sane et vérifiez que disabled = no.

service sane-port
{
port = 6566
socket_type = stream
wait = no
user = root
group = scanner
server = /usr/sbin/saned
disable = no
}

Ajoutez si besoin sane-port 6566/tcp à /etc/services puis lancez le démon :

$ sudo systemctl start xinetd.service
$ sudo systemctl enable xinetd.service

Installation sur le client

Spécifiez l'adresse IP du serveur dans /etc/sane.d/net.conf ou son nom si vous utilisez nss-mdns

# static IP address
192.168.0.50
# host name
vincent-u400

ta ta for now

qt4 remplace qt

Un nouveau paquet qt4 est dans [extra]. Il remplace le paquet qt actuel.

Tous les paquets dépendants de qt ont besoin d’être reconstruits pour dépendre de qt4. Nous (NdT: dévs et TUs d’Arch) l’avons fait pour tous les paquets officiels, mais vous aurez besoin de reconstruire les paquets installés depuis AUR qui dépendent de qt.

Qt 5.x est maintenant également disponible dans [extra]. Lorsque vous installez à la fois qt5-base et qt4, n’importe quel outil Qt fera référence à la version 5.x. Nous fournissons des liens symboliques *-qt4, vous pouvez ainsi forcer la version 4.x au besoin.

Article original

Fermeture du miroir mir1.archlinux.fr

Le mainteneur du miroir mir1 (à ne pas confondre avec mir) a décidé d’arrêter le serveur : annonce sur arch-mirrors

Veuillez à le supprimer de votre mirrorlist si vous l’utilisiez.

Merci à tapi pour la mise à disposition de ce miroir pendant ces 7 dernières années.

Réparer un système LUKS après la dernière mise à jour de LVM

Si vous possédez un système archlinux chiffré avec LUKS/LVM (comme expliqué ici, tuto que je dois encore mettre à jour), vous avez sans doute eu une mauvaise surprise récemment. En effet, suite à une mise à jour du paquet LVM2 vers la version 2.02.98-3, LVM utilise lvmetad pour l’activation automatique. La mise à jour a été annoncée sur le blog d’Archlinux mais si vous avez loupé la nouvelle ou comme moi que vous avez Manjaro qui n’a pas prévenu (grmlml), vous avez du avoir une mauvaise surprise au dernier boot : plus rien qui fonctionne. Voici la marche à suivre pour réparer un système dont le boot est cassé :

crash-avion

Le système peut voler gaiement pendant des mois, au premier problème de boot, on fait moins le fier…

1. Démarrez sur un live cd. On va utiliser celui d’Achlinux ici mais ça devrait convenir avec d’autres. Faites les bidouilles habituelles comme changer la disposition de clavier (loadkeys be-latin1).

2. Déchiffrez et détectez les partitions nécessaires. Attention les noms et numéros peuvent changer, à adapter.

% cryptsetup luksOpen /dev/sda3 sda3_crypt # si sda3 est la partition chiffrée
% pvscan # detecte le volume LVM
% vgscan # le bon VG est détecté ?
% vgscan -a y # on « monte » tous les LV

3. On monte les partitions nécessaires (encore une fois, noms à adapter).

% mount /dev/mapper/cryptVG-lvroot /mnt # système principal
% mount /dev/sda2 /mnt/boot # idem si vous aviez séparé /home, /var…
% arch-chroot /mnt /bin/bash # a adapter si pas archlinux

4. On modifie le fichier /etc/lvm/lvm.conf (en utilisant éventuellement /etc/lvm/lvm.conf.pacnew) pour changer la ligne use_lvmetad à use_lvmetad = 1.

5. On régénère les fichiers de boot

% mkinicpio -p linux

En changeant linux par un autre si vous n’utilisez pas un preset de base (linux34 sous Manjaro par exemple).

Redémarrez et tout devrait être rentré dans l’ordre.

Potato or not potato?

Salut,

Bon OK, le titre peut vous sembler étrange, voire inadapté avec ce qui est fait d’habitude, mais cela fait du bien de se renouveler un peu. Sachant que Neros m’a taggué au jeu de la patate chaude via son Twitter, je me suis dit que cela pouvait être amusant et intéressant.
En toute franchise, je n’ai pas compris de suite quel était l’objectif et pourquoi on m’avait mentionné sur Twitter.

La Patate
La Patate a froid, malgré son écharpe !

Bref, voici les règles:

* Poster les règles sur le blog

* Répondre aux 11 questions

* Inventer 11 nouvelles questions

* Partager le tag avec 11 personnes en mettant un lien vers leurs blogs et leur annoncer la nouvelle !

Let’s GO!!

1 > T’es plutôt bœuf ou cheval ?

Plutôt bœuf. Je ne me souviens pas avoir déjà mangé du cheval. Et puis un manger du cheval, je trouve ça assez dingue (comme manger du chat ou du chien d’ailleurs).

2 > Quel est ton écrivain préféré ?

Dure question. Je ne lis pas très souvent. Mais si j’avais plus de temps pour le faire, je serais certainement tenté par George R. R. Martin, car je suis un grand fan de la série “Game of Thrones”.

3 > Tu penses quoi des consoles de maintenant ?

C’est une machine à fric. Quand on voit le prix des jeux et des accessoires, je trouve que c’est un gros business…
Sinon au niveau des jeux, je n’ai plus de coups de cœur comme avant. Personnellement, j’ai eu une N64 et quand on voit des jeux comme GoldenEye, Perfect Dark, Super Mario 64 ou encore Turok qui sont encore aujourd’hui des références, je trouve ça incroyable. Et ces jeux avaient un réel challenge, ce qui semble moins courant maintenant.
Pour finir, je suis plus Retrogaming en fait.

N64 Pad
Un des meilleurs pad à ce jour

4 > Est-ce qu’il y a une cause pour laquelle tu te bats ?

Je ne sais pas si on peut vraiment appeler ça une cause, mais je suis un fervent défenseur des OS libres. Après, je ne me bats pas non plus. Je préfère éveiller un sentiment de curiosité chez les utilisateurs.

5 > Les poils aux jambes, un problème ou pas ?

Non, ce n’est pas un problème. Du moins, pas pour l’instant…

6 > Ton alcool préféré (si tu en bois) ?

Je ne suis pas un gros consommateur d’alcool. Mais de temps en temps, une petite 1664, un Porto ou un Muscat ambré, je ne dis pas non.

1664
Une excellente bière à (re)decouvrir

7 > Des météorites tombent du ciel, quelle est ta première réaction ?

Au début, on m’a dit qu’une météorite était tombée et je n’ai pas vraiment réagi. Mais après avoir regardé toutes les vidéos sur la Toile, j’ai été extrêmement impressionné. Ce n’est pas tout les jours que ça se passe. J’essaie aussi d’imaginer la distance que ces corps célestes ont parcouru dans l’espace, mais c’est encore assez abstrait.

8 > Windows, Linux ou MacOS et pourquoi ?

This is THE question! Linux sans hésiter parce que ça me permets de faire tout ce dont j’ai besoin et aussi parce que j’ai un contrôle total, sur ce que j’utilise. Un logiciel est compilé avec une dépendance que je juge inutile; rien de plus simple, je prends les sources et je les modifie selon mes besoins. Linux me fait aussi penser que je découvre l’informatique tel qu’il est, c’est-à-dire que je comprends comment un OS est développé et comment il fonctionne.
Windows ne me sert que pour mes jeux (comme une console en fait) et MacOS, késako?

9 > Les films avec lunettes 3D, tu en penses quoi ?

J’ai juste vu Avatar en 3D. Mis à part une scène où l’on voit une fougère qui nous frôle, je ne peux pas dire ce qu’il y a en plus. Par contre, les places sont onéreuses et les yeux se fatiguent 3 fois plus vite. MALUS > BONUS.

10 > On vient de te voler ton pain au chocolat, que fais-tu ?

Tout dépend de la personne. Si c’est une jolie femme, qu’elle me vole mon pain et qu’il y a un coup de foudre, pourquoi pas… Mais si c’est quelqu’un qui cherche les ennuis, je ne pense pas me laisser faire.

painchoco
Qui a osé voler mon pain au chocolat ?

11 > Le Tardis vient d’apparaître devant toi et le Doctor te propose de devenir son nouveau compagnon. Où et quand sera ta première destination ?

J’avoue humblement que je n’ai pas saisi instantanément la question (je ne regarde pas Doctor Who). Après recherche, je suis en mesure de fournir une réponse.
Je pense que reviendrais au temps de l’époque gallo-romaine avec les batailles épiques et des glaives affûtés comme des rasoirs. Cependant, je pense qu’il faudrait avoir des tripes et je ne sais pas si j’en serai capable.

Voilà voilou!

Voici maintenant l’heure de mes 11 questions:

1 > Saucisson ou rillettes?
2 > Quel est ton style de musique?
3 > Batman ou Joker?
4 > Qu’est-ce-qu’un geek pour toi?
5 > Tu viens de gagner 1 million d’euros, qu’en fais-tu?
6 > Es-tu un séducteur ou tu es plutôt timide?
7 > Quel est ton OS principal? Pourquoi?
8 > L’écologie pour toi, c’est quoi?
9 > Tu préfères te coucher tôt ou tard?
10 > PS3, Xbox360 ou PC?
11 > Morpheus te dit que tu te trouves dans la Matrice, quelle est ta réaction?

Et pour finir, les personnes que j’invite à “jouer”:

Schoewilliam, Postblue, Dempiller, Rolinh, mart-e, Tux-planet, blogiGor, Influence PC

Bon, je sais, cela ne fait pas 11 personnes mais vous ne m’en voudrez pas, si je n’ai pas d’amis. :(

Changement pour LVM

Avec lvm2 2.02.98-3, lvmetad est utilisé pour activer automatiquement les volumes LVM, ce qui implique :

  • Le hook udev est dorénavant requis.
  • use_lvmetad =1 doit être défini dans /etc/lvm/lvm.conf. C’est le cas par défaut pour une nouvelle installation. Pour une mise à jour, pensez à fusionner avec lvm.conf.pacnew
  • Vous pouvez restreindre les volumes à activer en définissant la variable auto_activation_volume_list dans /etc/lvm/lvm.conf. (Dans le doute, laissez décommenté)
  • Si vous avez besoin de monitoring (pour les snapshots), activez lvm-monitoring.service.
  • L’option lvmwait passé dans la ligne du noyau n’est plus nécessaire et n’a plus de fonction.

Article original

obpwa - pipemenu pour openbox

Openbox, à l'origine simple gestionnaire de fenêtres, supporte de nombreuses fonctionnalités comme des menus dynamiques accessibles d'un simple clic droit sur le bureau. Il suffit ainsi d'y ajouter une barre des tâches comme tint2 et un gestionnaire de fond d'écran comme nitrogen pour en faire un environnement de bureau tout à fait présentable, tout en alliant légèreté et rapidité.

Openbox n'utilise que 3 fichiers de configuration, situés dans ~/.config/openbox : autostart.sh, rc.xml et menu.xml. C'est dans ce dernier que l'on peut insérer ces menus dynamiques, appelés aussi pipemenus car ils fournissent sur la sortie standard un résultat (au format xml) récupéré par OpenBox tout comme la sortie d'un pipe dans une commande shell.

L'intérêt, vous l'aurez compris, est qu'il est très facile de réaliser un petit script (bash, perl, python....) qui créera un menu personnalisé tout en étant dynamique (c.a.d. régénéré en permanence pour tenir compte des modifications de son environnement). De plus il est aisé d'étudier et de modifier un script existant pour l'adapter à son besoin.

C'est donc ce que j'ai fait récemment, en reprenant dirlist.pl, un script en perl de Dave Foster, pour en faire un menu pemettant de naviguer dans son arborescence et jouer avec Audacious (ou ajouter à la liste de lecture en cours), un répertoire ou un fichier audio.

Sans plus tarder la traditionnelle capture d'écran :

obpwa

J'ai mis dans une archive le script et 3 icônes. Pour l'utiliser il vous faut Perl bien entendu, mais aussi le module MIME::Types (extra/perl-mime-types pour les archers). Le script est en GPLv3. Les instructions d'usage et d'installation sont dans les commentaires du script.

Todo :

  • faire un README et un LISEZMOI si ça intéresse quelqu'un
  • Il est possible d'utiliser le module Linux::DesktopFiles pour récupérer les icônes en accord avec le thème utilisateur, mais je ne sais pas si cela en vaut la peine et dans quelle mesure cela alourdirait le script.
  • J'en ferai bien une version gtk ce qui me permettrait d'enrichir ma collection d'applets pour tint2

Suppression d’initscripts et sysvinit

Comme annoncé précédemment, initscripts n’est plus supporté. Les utilisateurs l’utilisant encore sont invités à passer à systemd.
initscripts, sysvinit et les différents scripts rc seront supprimés des dépôts pour éviter toute confusion sur leur statut.

Article original

En 2013 : Gnu/Linux est-il abordable par tous ?

Que de chemin parcouru depuis notamment le début des années 2000 par Gnu/Linux.
Je me souviens très bien de mes débuts d’apprenti geek. Première distrib ? Une Mandrake 6.2 … Après avoir mis quelques jours à saisir le « concept » et la philosophie de Gnu/Linux et avoir mis en rade mon PC 5 ou 6 fois, j’ai “tourné” sous cette distribution pendant plusieurs mois. Puis, sur conseils d’amis, je me suis orienté vers Debian. Puis vint Ubuntu qui révolutionna le côté “user-friendly” des distributions Gnu/Linux. Mais autant les choix techniques, esthétiques que la philosophie générale et actuelle d’Ubuntu/Canonical me dérangent, et c’est pour cette raison que j’ai migré vers d’autres cieux (ArchLinux). J’attends d’ailleurs des nouvelles précises de cette idée de “rolling-release” pour Ubuntu.

Mais où en est Gnu/Linux en 2013 ?
Après avoir parcouru les sites habituels tels que Distriwatch ou QuebecOS, une remarque s’impose d’emblée : les grandes distribution « mainstream » ne sont plus seules et ne sont plus hégémoniques.

On constate une multiplication des “forks”, surtout issus d’Ubuntu ou d’ArchLinux. On peut trouver également beaucoup de distributions spécifiques pour serveur, pour systèmes « from scratch » à monter soit-même (Arch), etc. Certes cela permet d’avoir un choix important, d’être libre dans le choix des paquets et du système complet à installer, mais … qui veut de ces distributions ?
Les geeks barbus passionnés d’informatique libre, engagés ça et là dans des associations militantes, dans des partis politiques, … des étudiants, des chercheurs ?!?
Combien de ces utilisateurs d’Archlinux ou de Debian Sid sont des citoyens “lambda”, à l’aise avec l’informatique, sans plus …
Gnu/Linux ne serait-il redevenu abordable que pour les initiés, les amateurs passionnés, peu avares de séances d’installation et de configurations chronophages où le maniement de la console zsh, de Python et la maîtrise des options de xorg.conf est grandement recommandée ?

A l’époque de ma Mandrake 6.2, il en fallait du temps pour apprendre, rechercher, installer, configurer la carte son, le réseau, le premier modem ADSL avec sa connexion pppoe récalcitrante, etc. ! Entre les distributions livrées sur un plateau, pâles copies de Windows et celles qui sont destinées aux super-héros du Libre, comment communiquer, comment choisir ?

Des heures à passer à configurer le PC : Est-ce le prix à payer pour être vraiment Libre ?

Cet article En 2013 : Gnu/Linux est-il abordable par tous ? est apparu en premier sur mumbly58.fr.