À l'ombre du tigre à rayures

Aller au contenu | Aller au menu | Aller à la recherche

lundi 28 juillet 2014

Conversion des fins de lignes entre Unix et Windows

C'est la méthode la plus simple que j'aie trouvée. Elle nécessite de disposer d'un awk autorisant l'emploi d'expressions rationnelles comme séparateur d'enregistrements (RS). De plus, elle marche sur des fichiers comportant à la fois des fins de lignes Unix et DOS, sans ajouter de lignes blanches parasites.

L'utilisation de la variable BINMODE[1] est optionnelle. Sur les awk compatibles, elle désactive les conversions implicites des fins de lignes.

Cette procédure a été testée avec gawk, mawk et busybox awk[2]. Elle ne marche pas avec le awk original.

Convertir des fins de lignes Unix (LF) en fins de lignes DOS (CR-LF)

Utiliser la commande awk suivante :

gawk -v BINMODE=3 -v RS='(\r\n|\n)' -v ORS='\r\n' '{ print }'

Par exemple :

gawk -v BINMODE=3 -v RS='(\r\n|\n)' -v ORS='\r\n' '{ print }' fichier.unix.txt > fichier.dos.txt

Pour vérifier le résultat (en remplaçant u8 par le code du codage utilisé si vous n'êtes pas en UTF-8[3]) :

# Sans conversion
echo -e 'essai\nessai\r\nessai' | recode u8..dump-with-names

# Avec conversion
echo -e 'essai\nessai\r\nessai' | gawk -v BINMODE=3 -v RS='(\r\n|\n)' -v ORS='\r\n' '{ print }' | recode u8..dump-with-names

Convertir des fins de lignes DOS (CR-LF) en fins de lignes Unix (LF)

Utiliser la commande awk suivante :

gawk -v BINMODE=3 -v RS='(\r\n|\n)' -v ORS='\n' '{ print }'

Par exemple :

gawk -v BINMODE=3 -v RS='(\r\n|\n)' -v ORS='\n' '{ print }' fichier.dos.txt > fichier.unix.txt

Pour vérifier le résultat (en remplaçant u8 par le code du codage utilisé si vous n'êtes pas en UTF-8) :

# Sans conversion
echo -e 'essai\nessai\r\nessai' | recode u8..dump-with-names

# Avec conversion
echo -e 'essai\nessai\r\nessai' | gawk -v BINMODE=3 -v RS='(\r\n|\n)' -v ORS='\n' '{ print }' | recode u8..dump-with-names

Notes

[1] Cf. la documentation de gawk et la documentation de mawk.

[2] L'option -v BINMODE=3 est inutile avec busybox awk.

[3] Par exemple l1 pour Latin 1 (ISO-8859-1) et l9 pour Latin 9 (ISO-8859-15), lancez recode -l pour obtenir la liste complète des codages.

Modifier le navigateur par défaut sous Xubuntu (et tous les dérivés de Debian)

Sous Xubuntu, lorsque plusieurs choix existent pour la même commande, le logiciel utilisé par défaut sur la machine sera défini au travers du mécanisme des alternatives.

Il s'agit d'un mécanisme système de bas niveau. Les environnements de bureau comme XFCE ont leur propre mécanisme de sélection, mais qui ne couvre pas tous les cas.

Le mécanisme des alternatives fonctionne de la façon suivante : par défaut, une note est attribuée à chaque alternative pour une commande donnée. L'application ayant la meilleure note sera sélectionnée par défaut. Il est ensuite possible à un administrateur de sélectionner manuellement une autre commande moins bien noté (mais mieux adapté à ses besoins).

Il pourra s'agir de commandes réelles (quelle version de java doit-on utiliser lorsque l'utilisateur utilise la commande java) ou de commandes virtuelles (par exemple, une application appellera la commande x-www-browser pour invoquer le navigateur par défaut).

Pour définir manuellement le navigateur par défaut sous Xubuntu, suivez la procédure suivante :

  • Lancez le « Configurateur d'alternatives » (dans « Tous les paramètres » sous Xubuntu).
  • La fenêtre de paramétrage des alternatives apparaît :

galternatives.png

  • Dans la liste de gauche (« Alternatives »), sélectionnez « x-www-browser », qui définit la commande servant à appeler le navigateur par défaut.
  • À droite (dans « Options »), apparaît la liste des navigateurs disponibles. Sélectionnez la navigateur voulu dans cette liste.
  • Fermez le « Configurateur d'alternatives ».

lundi 10 mars 2014

Xubuntu peut-il parler français ?

Si vous avez essayé d'utiliser la synthèse vocale sous Xubuntu, vous aurez constaté que le résultat n'est pas terrible, voire pas terrible du tout :

spd-say "Essai de la synthèse vocale"

Ce n'est pas difficile à expliquer, la synthèse vocale sous Ubuntu est paramétrée pour l'anglais. Donc les textes français sont prononcés avec un affreux accent anglais...

Il est possible d'utiliser Pico-TTS (https://github.com/rhdunn/svox), qui offre une bien meilleure prononciation du français :

  • Installez pico TTS et Speech-dispatcher :
sudo apt-get install libttspico-utils speech-dispatcher
  • Ouvrez le fichier « /etc/speech-dispatcher/speechd.conf » :
sudo nano /etc/speech-dispatcher/speechd.conf
  • Dans ce fichier, modifiez les lignes définissant le type de voix et la langue :
DefaultVoiceType  "MALE1"
DefaultLanguage "fr"
  • Puis, décommentez la ligne activant le module « pico-generic », en supprimant le « # » en début de ligne :
AddModule "pico-generic" "sd_generic" "pico-generic.conf"
  • Enfin, modifiez le module par défaut, afin d'utiliser « pico-generic » :
DefaultModule pico-generic
  • Sauvegardez le fichier « /etc/speech-dispatcher/speechd.conf » modifié.
  • Pour terminer, arrêtez le service de gestion de la synthèse vocale (il se relancera automatiquement) :
killall speech-dispatcher
  • Puis testez le paramétrage que vous venez de réaliser :
spd-say "Essai de la synthèse vocale"

Attention, ne lancez pas la synthèse vocale avec une commande sudo, cela l'empêcherait de fonctionner par la suite :

https://bugs.launchpad.net/ubuntu/+...

lundi 8 août 2011

De l'art de reconstruire les mirroirs...

Ça y est, c'est fait, l'un des disques qui composait votre belle partition en RAID 1 vient de tomber.

Bon, ça devait bien arriver un jour, mais maintenant, on fait quoi ?

Pour l'exemple, je supposerai que vous disposez de deux partitions RAID 1 (md0 et md1), construite à partir des partitions 1 et 2 des deux premiers disques (sda1 et sdb1 pour md0, sda2 et sdb2 pour md1).

Identifier le disque

Pour commencer, il faut identifier le disque à l'origine de tout ça :

# cat /proc/mdstat
Personalities : [raid1] 
md0 : active raid1 sda1[0]
      31246272 blocks [2/1] [U_]

md1 : active raid1 sda2[0] sdb2[0]
      31246272 blocks [2/2] [UU]
   
unused devices: <none>

Le mirroir sda1 de md0 est toujours là, mais il est tout seul.

Jetons maintenant un œil au journal système :

# grep md0 /var/log/syslog
kernel: [  954.420430] md/raid1:md0: Disk failure on sdb1, disabling device.
kernel: [  954.420432] md/raid1:md0: Operation continuing on 1 devices.
mdadm[1948]: Fail event detected on md device /dev/md0, component device /dev/sdb1
mdadm[1948]: SpareActive event detected on md device /dev/md0, component device /dev/sdb1

Là, pas de doute, suite à un problème sur la partition sdb1, le système l'a enlevé de l'ensemble RAID.

Avant de continuer, récupérons le numéro de série du disque sdb :

# smartctl -i /dev/sdb
smartctl 5.39b 2010-05-11 r3120 [x86_64-unknown-linux-gnu] (local build)
Copyright (C) 2002-10 by Bruce Allen, http://smartmontools.sourceforge.net

=== START OF INFORMATION SECTION ===
Model Family:     SAMSUNG SpinPoint T166 series
Device Model:     SAMSUNG HD501LJ
Serial Number:    S0MUJ1MPC07654
Firmware Version: CR100-12
User Capacity:    500 107 862 016 bytes
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   8
ATA Standard is:  ATA-8-ACS revision 3b
Local Time is:    Mon Aug 15 17:10:36 2011 CEST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

Connaître le numéro de série permettra d'être sûr de retirer le bon disque (au lieu de retirer le disque qui marche).

Retirer les partitions toujours actives

Le second ensemble RAID est toujours là. Il utilise une partition de notre disque défectueux.

Pour éviter les problèmes, nous allons la retirer :

# mdadm /dev/md1 --fail /dev/sdb2
# mdadm /dev/md1 --remove /dev/sdb2

Nous avons donc maintenant :

# cat /proc/mdstat
Personalities : [raid1] 
md0 : active raid1 sda1[0]
      31246272 blocks [2/1] [U_]

md1 : active raid1 sda2[0]
      31246272 blocks [2/1] [U_]
   
unused devices: <none>

Plus aucune partition n'utilise le disque sdb.

Démonter l'ancien disque et installer le nouveau

Là, à vous de jouer. Surtout, vérifiez avec le numéro de série que vous retirez bien le bon disque :-)

Partitionner le nouveau disque

Votre nouveau disque est en place.

Si vous aviez utilisé un partitionnement identique pour vos deux disques (ce que je vous recommande), il vous suffit maintenant de recopier la table de partition du disque sda sur le nouveau disque (sdb) :

# sfdisk -d /dev/sda | sfdisk /dev/sdb

Hum... Ne vous trompez pas de disque... Surtout pas...

Reconstruire le RAID

C'est presque fini. Pour terminer, il suffit d'insérer les nouvelles partitions dans l'ensemble RAID :

# mdadm /dev/md0 --add /dev/sdb1
# mdadm /dev/md1 --add /dev/sdb2

Jetons un œil au résultat :

# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sda1[0] sdb1[2]
      31246272 blocks [2/1] [U_]
      [>....................]  recovery =  0.0% (1024/31246272) finish=857.8min speed=8618K/sec

md1 : active raid1 sda2[0] sdb2[2]
      31246272 blocks [2/1] [U_]
              resync=DELAYED

unused devices: <none>

Il ne reste plus qu'à surveiller la reconstruction avec un petit :

# watch cat /proc/mdstat

Et voilà. C'est fini !

Enfin, quand même, si vous avez besoin de redémarrer, attendez la fin de reconstruction du RAID :-)

vendredi 15 juillet 2011

Intégrer Squirrelmail à votre bureau Linux

Voici un petit script très simple qui permet d'utiliser Squirrelmail comme un logiciel de messagerie classique avec Firefox, XFCE, et cætera :

https://github.com/fevrier/squirrel...

mardi 5 juillet 2011

De l'art de surveiller les scripts...

Écrire un script, c'est bien, mais, si le script est lancé automatiquement, il est judicieux de disposer d'un journal permettant de s'assurer de son bon fonctionnement[1]...

J'ai mis en place il y a peu un script chargé d'apprendre à spamassassin à reconnaître des messages indésirables. Ce script lance la commande sa-learn, et pour savoir s'il fonctionne bien, je veux savoir ce qu'a affiché sa-learn.

La commande logger

Pour enregistrer un message dans le journal système (/var/log/syslog[2] sur une distribution Débian), on peut utiliser une commande très pratique : logger.

Par exemple :

logger -p user.info -t mon_script "Mon message"

fera apparaître le message suivant dans le journal système :

Jun 21 22:12:24 mon_serveur mon_script: Mon message
Un premier essai

Il suffit donc de prendre les messages affichés par sa-learn et de les envoyer à logger :

MA_SORTIE="$( sa-learn --spam "${FICHIER}" 2>&1 )"
logger -p user.info -t mon_script "Resultat : ${MA_SORTIE}"

Cependant, nous ne pouvons pas être sûr que sa-learn renverra une seule ligne[3].

La même chose... En mieux

Le plus simple serait de fusionner les lignes affichées par sa-learn avant de les enregistrer dans le journal[4].

Ce que l'on peut faire simplement une ligne de awk :

sa-learn --spam "${FICHIER}" 2>&1 | gawk -v ORS="" 'NR > 1 { print " -/- " } ; { print }'

Donc, au bout du compte, c'est tout simple :

RESULTAT_COMMANDE="$( sa-learn --spam "${FICHIER}" 2>&1 | gawk -v ORS="" 'NR > 1 { print " -/- " } ; { print }' )"
logger -p user.info -t mon_script "sa-learn => ${RESULTAT_COMMANDE}"

En deux lignes, on lance sa-learn et on renvoie son résultat dans le journal système.

Notes

[1] Les programmes informatiques sont comme ça, si personne ne les surveille, ils font n'importe quoi.

[2] Le fichier journal utilisé dépendra du paramétrage du démon syslogd, de la priorité choisie (ici, info) et de la catégorie du message (ici, user)

[3] En général, les messages des journaux systèmes sont sur une seule ligne, ce qui permet de les exploiter simplement avec des outils Unix comme grep et logcheck.

[4] Attention ! On parle ici de fusionner une ou deux lignes, pas plus.

dimanche 22 mai 2011

Un écureuil, un éléphant et un peu de sel

Le module change_sqlpass de Squirrelmail permet de modifier un mot de passe conservé dans une base PostgreSQL.

Lors du paramétrage de ce module, il faut avoir la réponse à une question très technique, qui risque de vous laisser pantois : comment déterminer de grain de sel (salt en anglais) utilisé dans vos mots de passe.

Un grain de sel ?

Un peu d'histoire. Sous les systèmes de type Unix, les mots de passe sont chiffrés avec un chiffrement non réversible (autrement dit, on ne peut pas retrouver votre mot de passe à partir de sa version chiffrée).

Lorsque vous vous connectez, on chiffre le mot de passe que vous entrez et on le compare au mot de passe officiel (déjà chiffré). Pas besoin donc de savoir le déchiffrer.

Cependant, cette méthode simple présente plusieurs inconvénients. Si deux utilisateurs ont le même mot de passe, cela sera immédiatement visible en regardant la table des mots de passe. De même, il est très simple d'effectuer une recherche systématique de mots de passe, en chiffrant un à un tous les mots d'un dictionnaire et en les comparant aux mots de passe de tous les utilisateurs.

Pour mitiger ces problèmes, on s'est résolu à ajouter un grain de sel aux mots de passe. Chaque utilisateur se voit attribuer un code différent (le grain de sel) qui modifie le mot de passe chiffré obtenu et est conservé avec le mot de passe.

Pour vérifier le mot de passe, on prend donc le mot de passe de l'utilisateur, le grain de sel lu sur le mot de passe enregistré, on les utilise pour recréer un mot de passe chiffré et on les compare au mot de passe chiffré enregistré.

Avantage, 2 utilisateurs avec les même mots de passe auront des mots de passe chiffrés différents. Et une recherche exhaustive de mots de passe devra maintenant se faire utilisateur par utilisateur, ce qui sera significativement plus long (enfin, en théorie. l’existence d'immenses tables de mots de passes pré-calculées relativisant un peu cet avantage).

Bon, concrètement, on fait quoi ?

Revenons à change_sqlpass. Dans le cas d'un mot de passe chiffré avec PHPCRYPT, le grain de sel se trouve dans les 2 premiers caractères du mot de passe. Il faut donc utiliser une requête comme celle-ci pour récupérer le grain de sel :

$csp_salt_static = '';
$csp_salt_query = "SELECT substr( mot_de_passe_chiffre, 1, 2 ) FROM table_utilisateur WHERE nom = '%2'";

Dans le cas d'un mot de passe condensé avec MD5, aucun grain de sel n'est utilisé :

$csp_salt_static = '';
$csp_salt_query = '';

Enfin, dans le cas d'un mot de passe chiffré avec MD5CRYPT, le format du mot de passe chiffré est : $1$gain_de_sel$mot_de_passe_chiffré. On peut dont récupérer le grain de sel avec une requête du type :

$csp_salt_static = '';
$csp_salt_query = "SELECT split_part( mot_de_passe_chiffre, '$', 3 ) FROM table_utilisateur WHERE nom = '%2'";

(Un petit correctif de documentation a été remonté à l'équipe Squirrelmail.)

vendredi 20 mai 2011

Des noisettes pour Squirrelmail

J'utilise pour gérer mon courrier un client de messagerie web, Squirrelmail. Celui-ci dispose d'un module d'extension, change_sqlpass qui permet de changer en ligne son mot de passe, si celui-ci est enregistré dans une base de données.

Le module annonce fièrement que ça dernière version est compatible avec PostgreSQL, qui est la base de données que j'utilise.

Génial, exactement ce que je cherchais !

Aussitôt dit, aussitôt fait, je vais chercher le module et je l'installe...

Installation... Relance... Essai...

Et là, déception, ça ne marche pas.

Petit tour du code, et là quelques surprises :

  • Les guillemets utilisé dans les requêtes SQL sont des guillemets doubles (ce qui marche avec MySQL, mais pas avec PostgreSQL).
  • Le mot de passe est passé à la moulinette escapeSimple[1] avant d'être chiffré. Avec MySQL, ça marchait bien, car le mot de passe était chiffré dans une requête SQL. Avec PostgreSQL, il faut utiliser une fonction externe de chiffrement avant de mettre le mot de passe en base. Là, c'est la cata., si le mot de passe contient, par exemple, un guillemet simple, celui-ci sera transformé, et le mot de passe enregistré ne sera pas celui que l'utilisateur a entré... Mauvaise surprise garantie à la reconnexion ^^
  • Petite cerise sur le gâteau (ce n'est pas forcément la faute du module), les caractères accentués ne passe pas. Par sécurité, il vaudrait mieux refuser ces mots de passe

Là, un léger doute m'étreint... Ce module a-t-il déjà été testé avec PostgreSQL... Peut-être pas ^^

Qu'à cela ne tienne, vous trouverez en annexe un petit correctif corrigeant ces problèmes (ce correctif, coupé en morceaux, a été dûment remonté au projet, avec un petit rapport d'anomalie en prime 1 2 3 4).

Ce correctif effectue les modifications suivantes :

  • Utilisation de guillemets simples dans le requêtes (attention, mettez à jour votre fichier config.php à partir de config.php.sample, faute de quoi ça ne marchera plus).
  • Utilisation de escapeSimple uniquement lorsque le mot de passe est envoyé tel quel dans une requête.
  • Ajout d'une option pour refuser les mots de passe contenant des caractères accentués (enfin, non ASCII).

Note

[1] Une fonction servant à modifier une chaîne de texte pour éviter qu'elle soit mal interprétée par une base de données

jeudi 5 mai 2011

Survivre à Unity... sur grand écran

Natty Narwhal, le nouvel Ubuntu, est arrivé avec son lot de nouveautés. La plus visible étant Unity, la nouvelle interface conçue (notamment) pour les écrans tactiles.

Globalement, j'aime bien cette nouvelle interface, mais sur un écran LCD de 61 cm, certains détails se révèlent particulièrement agaçants.

La nouvelle barre d'icônes

Elle se cache dès que l'on approche une souris. On finit par perdre beaucoup de temps à essayer de caler une fenêtre contre celle-ci.

Vous pouvez la rendre fixe de la façon suivante :

  • Installez le paquet « compizconfig-settings-manager », qui permet de paramétrer le comportement de la barre d'icône et des fenêtres.
  • Dans le centre de contrôle (Réglages du système), lancez le « Gestionnaire de configuration CompizConfig ».
  • Ouvrez les réglages « Ubuntu Unity Plugin » et allez dans l'onglet « Behavior ».
  • Paramétrez « Hide Launcher » à « Never ».

On peut maintenant un peu peaufiner, en réglant la façon dont les fenêtre collent au bord de l'écran :

  • Cliquez sur « Précédent ».
  • Ouvrez les réglages « Snapping Windows » et allez dans l'onglet « Behavior »,
  • Pour « Snap Type », cochez « Edge attraction » et « Edge resistance ».
  • Réglez « Edge Resistance Distance » à 20.
  • Réglez « Edge Attraction Distance » à 10.
Les ascenseurs ultra-fins

Les ascenseurs sont remplacés par une ligne très fine, sur laquelle apparaît un curseur. Cela doit être impeccable sur un écran tactile. Avec une souris, c'est un cauchemar. Il faut trouver le bon placement de la souris pour faire apparaître le curseur, puis cliquer dessus et le faire glisser. Là aussi, que de temps perdu par rapport à un ascenseur classique. Et le gain de place est sans intérêt sur un grand écran.

Pour désactiver les ascenseur fins, supprimez les paquets « overlay-scrollbar » et « liboverlay-scrollbar-0.1-0 ».

Les fenêtres qui se maximisent automatiquement

Lorsque l'on déplace une fenêtre en haut de l'écran, elle se maximise automatiquement, ce qui oblige à monter la souris, puis la redescendre un poil pour éviter l'effet d'agrandissement. Sur un petit écran, l'agrandissement est presque toujours adapté, mais sur un grand écran, cela ne convient pas à toutes les applications.

  • Ouvrez le « Gestionnaire de configuration CompizConfig ».
  • Ouvrez les réglages « Grid » et allez dans l'onglet « Edges »,
  • Dans « Resize Actions », paramétrez « Top Edge » à « Aucun ».

dimanche 17 avril 2011

Linux : convertir un document HTML en texte pour le Cybook Gen3

Le Cybook Gen3 est un lecteur de livres électroniques assez agréable à utiliser, mais qui, parfois, s'étouffe sur certains documents HTML (ou les affiche d'une manière peu satisfaisante).

Le mieux est alors de les convertir en texte pur.

Les fichiers textes du Cybook Gen3 doivent respecter le format suivant :

  • Le texte doit être codé en ASCII, latin 1 ou latin 9.
  • Les paragraphes ne doivent comporter aucun saut de ligne.

Conversion du HTML en texte (en évitant au maximum de couper les paragraphes) :

elinks --dump -dump-width 65535 -no-references -no-numbering document.html > document.txt

Éventuellement, conversion en latin 9 (pour une page Unicode codée en UTF-8) :

recode u8..l9 document.txt

mardi 12 avril 2011

Jamais content

postfix/smtpd: sql_select option missing
postfix/smtpd: auxpropfunc error no mechanism available
postfix/smtpd: _sasl_plugin_load failed on sasl_auxprop_plug_init for plugin: sql
postfix/smtpd: sql_select option missing
postfix/smtpd: auxpropfunc error no mechanism available
postfix/smtpd: _sasl_plugin_load failed on sasl_auxprop_plug_init for plugin: sql

Depuis peu, un message intriguant vient polluer les journaux systèmes de mon mini-serveur.

Après quelques recherches, son origine est simple : j'avais installé le paquet libsasl2-modules-sql pour postfix. Il s'agit d'un module permettant d'authentifier les utilisateurs via une base SQL.

Récemment, j'ai arrêté de m'en servir.

Et, naïvement, j'avais pensé que supprimer le paramétrage servant à l'activer aurait suffit à s'en débarrasser.

Que nenni ! Tant qu'il est là, il reste actif, et s'il n'est pas paramétré, il se plaint.