Gu!oN@'s Blog

Recherche et remplacement recursif?

Qui n’a jamais eu besoin de faire une recherche récursive afin de remplacer une occurrence dans plusieurs fichiers?
Pour se faire, nous allons combiner les commandes find, xargs et sed en version GNU obligatoirement sinon les options utilisées ne seront pas reconnues.

Dans l’exemple ci-dessous nous allons remplacer l’occurence « redmine.bilboplanet.com » par « chili.kiwais.com/projects/bilboplanet » dans tout le code source du Bilboplanet:

Nous allons commencer par rechercher tous les fichiers avec l’utilitaire « find », pour cela on va utiliser deux options:

  • L’option « -type f »: permet de ne rechercher que des fichiers.
  • L’option « -print0»: permet de remplacer le caractère espace par le caractère générique null (\0)

Ce qui nous donne la commande suivante:

$ find . -type f -print0

En suivant, nous allons (au travers d’un pipe) utiliser la commande xargs pour gérer la sortie du process find avec l’option suivante:

  • L’option -0 permet la gestion du caractère null

Suivi de « ce que l’on veut faire », nous allons utiliser la commande sed:

  • L’option « -i » permet une modification du fichier courant
  • L’expression suivante indique ce que l’on souhaite faire, elle se découpe en 4 et est encadré par des simples quotes « ‘ »:
    1. le « s » indique substitute: de ce fait on va remplacer toutes les occurences d’une expression par une autre
    2. La chaîne de caractère après le « s/ » indique qu’elle occurence nous recherchons, cela peut être une expression régulière, et elle se termine par un « / »*
    3. La chaîne de caractère suivante (après le deuxième « / ») indique quelle chaîne de caractère remplacera l’occurence trouver et elle se termine par un « / »*
    4. Le « g » indique que l’on procède à un remplacement global

Ce qui nous donne la ligne de commande:

$ xargs -0 sed -i 's/SEARCH/REPLACE/g'

Si nous mettons les deux commandes bout à bout sans oublier le pipe « | » cela nous donne donc:

$ find . -type f -print0 | xargs -0 sed -i 's/SEARCH/REPLACE/g'

* Dans sed (et beaucoup d’autres programmes) le caractère « \ » est le caractère d’échappement pour les caractères spéciaux tel que « / », « @ », « $ », …. De ce fait si vous recherchez une chaîne contenant le caractère « / » il faudra saisir « \/ » pour que celui-ci ne soit pas interprêté.

Voici à présent ce que cela donne lorsqu’on souhaite remplacer la chaîne de caractère « redmine.bilboplanet.com » par « chili.kiwais.com/projects/bilboplanet » (en n’oubliant pas le caractère d’échappement)*:

$ find . -type f -print0 | xargs -0 sed -i 's/redmine.bilboplanet.com/http:\/\/chili.kiwais.com\/projects\/bilboplanet/g'

Comment supprimer le caractère ^M avec vi

Lorsqu’un fichier est édité sur un system Windows/DOS à la fin de chaque ligne le caractère « ^M » apparaît.

Si vous souhaitez supprimer ce caractère sur l’ensemble du fichier avec l’éditeur vi voici la commande a utilisée:

:%s/^M//g

Si vous saisissez directement les caractères cela ne fonctionnera pas, pour pallier à ce problème il faut utiliser les combinaisons de touches suivantes:

:%s/[ctrl+V][ctrl+M]//g

Perl: Couper les lignes d’un fichier a un nombre de caractères définis

Ceci n’est pas un article proprement dit, il est question d’une astuce afin de découper les lignes d’un fichier à un nombre de caractères définis avec une commande Perl et d’une simple expression régulière.

On considère un fichier en entrée dont le marqueur de fin de ligne (LF) n’est pas présent et nous souhaitons le mettre en place chaque 20 caractères par exemple.

Le fichier en entrée se nommant input:

Ceci est un fichier de tests dont le caractère de fin de ligne est manquant et nous souhaitons decouper le fichier chaque 20 caractères. Pour cela nous allons utiliser Perl.

La commande Perl:
$ perl -0777 -pe 's/(.{20})/\1\n/sg' input

Le résultat:

Ceci est un fichier
de tests dont le car
actère de fin de lig
ne est manquant et n
ous souhaitons decou
per le fichier chaqu
e 20 caractères. Pou
r cela nous allons u
tiliser Perl.

Si l’on souhaite mettre en place les marqueurs CR et LF la commande devient:

$ perl -0777 -pe 's/(.{20})/\1\r\n/sg' input

Comment renommer une carte ethernet sous Linux?

Le but de cet article est de décrire la marche à suivre pour renommer une interface ethernet sur un système Linux disposant de Udev.

Toutes les actions réalisées dans cet article sont faites dans le contexte « root » ou travers de « sudo » et en connexion console directe.

Description:

Lorsqu’on rajoute une nouvelle interface réseau sur un serveur celle-ci est nommée ethN où N correspond à un chiffre incrémental.
Il en est de même lorsqu’on remplace la carte réseau existante car le système connaît eth0 avec son adresse MAC personnelle (et unique) de ce fait s’il détecte une nouvelle adresse MAC il va créer une nouvelle interface même si la première n’existe plus.

NB: Cela s’applique également lors d’un clone VMWare

Mais pourquoi cela?

Tout simplement car le gestionnaire de périphérique Udev garde la configuration des périphériques dans des fichiers de configurations.
Pour les cartes réseaux il s’agit du fichier « /etc/udev/rules.d/70-persistent-net.rules »:

# This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.
 
 
# PCI device 0x8086:0x100f (e1000) (custom name provided by external tool)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:50:56:96:00:13", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:50:56:96:01:19", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

Ici on voit que le système connaît deux interfaces réseaux:

  1. eth0 avec l’adresse MAC 00:50:56:96:00:13
  2. eth1 avec l’adresse MAC 00:50:56:96:01:19

Mode opératoire

Si l’on souhaite que la carte réseau avec l’adresse MAC 00:50:56:96:01:19 se nomme eth0 il faut modifier le champs « NAME » et modifier également le champs « NAME » de l’interface se nommant, à l’instant T, eth0 ou carrément supprimer la ligne correspondante:

# This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.
 
 
# PCI device 0x8086:0x100f (e1000) (custom name provided by external tool)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:50:56:96:01:19", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

Une fois notre fichier de configuration modifier il faut redémarrer le daemon « udevd »:

  • Sur un système Debian:
  • $ service udev restart
    Stopping the hotplug events dispatcher: udevd.
    Starting the hotplug events dispatcher: udevd.
  • Sous Rhel:
  • $ start_udev
    Starting udev:                                             [  OK  ]

A cet instant notre configuration des périphériques est bonne mais la machine n’est pas sur le réseau!!!
Pour cela il faut modifier le fichier de configuration de l’interface réseau « /etc/sysconfig/network-scripts/ifcfg-eth0″ en mettant à jour l’adresse MAC (champs HWADDR) avec celle ce la nouvelle interface:

DEVICE=eth0
NM_CONTROLLED=yes
ONBOOT=yes
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth0"
IPADDR=192.168.1.10
NETMASK=255.255.255.0
DNS2=192.168.1.2
GATEWAY=192.168.1.254
DNS1=192.168.1.1
USERCTL=no
HWADDR=00:50:56:96:00:13

Devient:

DEVICE=eth0
NM_CONTROLLED=yes
ONBOOT=yes
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth0"
IPADDR=192.168.1.10
NETMASK=255.255.255.0
DNS2=192.168.1.2
GATEWAY=192.168.1.254
DNS1=192.168.1.1
USERCTL=no
HWADDR=00:50:56:96:01:19

Une fois fait, on redémarre le service réseau:

  • Sur un système Debian:
  • $ /etc/init.d/networking restart
  • Sous Rhel:
  • $ service network restart

    Notre serveur est à présent à nouveau sur le réseau avec la nouvelle interface réseau:

    $ ifconfig eth0
    eth0      Link encap:Ethernet  HWaddr 00:50:56:96:01:19
              inet addr:192.168.1.10  Bcast:192.168.1.255  Mask:255.255.255.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:617 errors:0 dropped:0 overruns:0 frame:0
              TX packets:518 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:55550 (54.2 KiB)  TX bytes:90797 (88.6 KiB)

Au revoir Dennis Ritchie aka dmr

Aujourd’hui un homme emblématique du monde Unix nous a quitté Denis Ritchie, il n’en était pas moins que le créateur tout comme le langage C.

Je ne vais pas faire de long discours car suis très mauvais dans cet exercice, je tenais juste à lui rendre hommage et à le remercier pour le travail effectué tout au long de sa carrière.

Paix à son âme.

Ubuntu Unity: Purger l’historique des fichiers et dossiers

Sous Unity, la purge de l’historique des fichiers consultés n’est pas aussi facile que sous Gnome avec son simple clic sur « Clear Recents Documents ».

Alors comment faire?

Tout se passe dans un terminal en deux lignes de commandes:

  1. Supprimer le fichier « .local/share/zeitgeist/activity.sqlite » de votre home directory:
  2. $ rm -f ~/.local/share/zeitgeist/activity.sqlite
  3. Réinitialiser le daemon zeitgeist*:
  4. $ zeitgeist-daemon --replace

* zeitgeist est un framework de journalisation livré par défaut avec Natty pour plus de détails je vous renvois sur la page Wikipedia

Shell script : Comment connaître le nombre de jour dans un mois?

Ceci est une astuce plus qu’un article mais elle peut être utile dans le cadre d’un shell script.

On va utiliser le binaire « cal » qui, lorsqu’on l’utilise tout seul, génère dans un terminal un calendrier du mois courant:

$ cal
       février 2011
dim lun mar mer jeu ven sam
         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

Une fois que l’on a le calendrier il nous suffit de l’exploiter en commençant par retirer les caractères alphabétiques:

$ cal | grep -v '[a-zA-Z]'
         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

L’étape suivante consiste maintenant à compter le nombre de mots:

$ cal | grep -v '[a-zA-Z]' | wc -w
      28

Maintenant, si vous souhaitez rendre exploitable cette valeur dans un script il suffit de définir une variable de type entier (integer) dans laquelle vous stockez le résultat de la commande:

$ typeset -i NB_DAYS=$(cal | grep -v '[a-zA-Z]' | wc -w)
$ echo ${NB_DAYS}
28

Nous venons de voir comment faire pour le mois courant maintenant pour un mois spécifique il suffit de spécifier quel mois on désire (en numérique) et quelle année:

$ typeset -i NB_DAYS=$(cal 6 2011| grep -v '[a-zA-Z]' | wc -w)
$ echo ${NB_DAYS}
30

ou

$ typeset -i NB_DAYS=$(cal 6 $(date +%Y) | grep -v '[a-zA-Z]' | wc -w)
$ echo ${NB_DAYS}
30

Si vous souhaitez pousser un peu plus le vice on peut imaginer travailler avec une fonction dans un script se nommant « test.sh »:

#!/usr/bin/sh
function day_in_month {
        if [[ -n ${1} && -n ${2} ]] ; then
                month=${1}
                year=${2}
        else
                eval $(date "+month=%m year=%Y")
        fi
 
        echo $(cal ${month} ${year} | grep -v '[a-zA-Z]' | wc -w)
}
 
 
echo "Mois?"
read check_month
echo "Annee?"
read check_year
 
day_in_month ${check_month} ${check_year}
 
exit 0

Si on l’execute:

$ ./test.sh
Mois?
2
Annee?
2012
Le mois 2/2012 compte 29 jours.

Petite astuce en suivant: Comment récupérer le dernier Samedi du mois:

$ cal 02 2012 | awk '{ print $6 }' | grep -v '^$' | tail -1
25

ou

$ cal 02 2012 | awk '{ print $6 }' | grep -v '^$' | sed '$!d'
25

ou encore

$ cal 02 2012 | awk '{ print $6 }' | awk 'NF{ s=$0 } END { print s }'
25

En espérant que cette petite astuce pourra vous aider.

Grub Customizer – Un outil graphique pour configurer grub2

Aujourd’hui nous partons à la découverte d’un utilitaire fort sympathique pour tout ceux qui ont peur de jouer avec la configuration de Grub.

 

Présentation

Cet utilitaire se nomme « Grub Customizer », il est écrit en C++ sous licence GNU GPL v3 par Daniel Richter.
Il vous permettra au travers d’une simple interface graphique de configurer votre chargeur de démarrage (boot loader) en toute sérénité.

 

Installation

Installation depuis les sources

A l’instant où j’écris cet article, la version publiée est 2.1.2.
Celle-ci est disponible en téléchargement sur la page launchpad du projet: https://launchpad.net/grub-customizer (lien direct).
Pour pouvoir installer depuis les sources, il vous faudra disposer des près-requis suivants:

  • libgtkmm-2.4-dev
  • cmake
  • make
  • gcc

Généralement ces paquets sont disponibles dans les dépôts de vos distributions.
Une fois les près-requis installés et l’archive téléchargée nous pouvons passer à l’installation:

  • Extraire les sources:
  • $ mkdir /tmp/grub-customizer_2.1.2
    $ cd /tmp/grub-customizer_2.1.2
    $ wget http://launchpad.net/grub-customizer/2.1/2.1.2/+download/grub-customizer_2.1.2.tar.gz
    $ tar -xzf grub-customizer_2.1.2.tar.gz
  • Compilation:
  • $ cmake .
    $ make
  • Installation:
  • $ sudo make install

Installation Ubuntu

Il est possible d’installer le paquet directement sous Ubuntu:

$ sudo add-apt-repository ppa:danielrichter2007/grub-customizer
$ sudo apt-get update
$ sudo apt-get install grub-customizer

 

Lancement

$ sudo grub-customizer

A partir de cette interface vous allez pouvoir activer et/ou désactiver des entrées dans le menu Grub:

Si vous cliquez sur « Preferences » vous allez pouvoir personnaliser votre menu:

  • Doit-on le voir ou pas?
  • Si on le voit alors pendant combien de temps?
  • Modifier les paramètres d’affichages (couleur, résolution, …)
  • etc…

Une fois que vous avez ajusté votre configuration, il suffit de cliquer sur « Save » et tout sera automatiquement fait.
Il n’est plus nécessaire de lancer « update-grub2″.

Nous constatons que l’utilisation de cet outil est relativement simple, mais il faut de même faire attention à ce que l’on fait!

Pour de plus amples informations je vous invite à lire la FAQ (anglais).

 

Conclusion

Je trouve cet utilitaire fort intéressant pour tout ceux qui ont peur de modifier directement les fichiers de configurations (petit rappel: il faut toujours faire une copie de sauvegarde avant toute modification d’un fichier).
Il permet de présenter simplement les possibilités que peut offrir Grub2 en termes de configuration et de personnalisation.

Ubuntu Natty: Unity ne se lance pas?

Récement lors de l’installation d’une Ubuntu NattyNarwhal 64 bits afin de tester la nouvelle interface Unity j’ai rencontré un problème bloquant: impossible de démarrer Unity. Un peu génant vous en conviendrez… A l’ouverture de session j’obtenais le message d’erreur suivant:
unity-error
Un petit coup d’oeil sur la page des près-requis matériel: ça semble convenir!

Pour vérifier un peu plus précisément ce qui bloque quant à l’utilisation de Unity, il exite un petit utilitaire: « /usr/lib/nux/unity_support_test ».

Pour obtenir le verdict il suffit de l’exécuter avec l’option « -p »:

$ /usr/lib/nux/unity_support_test -p

Et le résultat me donnait:

Cela veut dire que mon pilote graphique est blacklisté!!!
Lors de mon test j’ai utilisé le pilote propriétaire Nvidia qui est « Testé par les développeur Ubuntu et requis pour l’utilisation de Unity »:

J’utilse donc le driver « nvidia-173″, pour m’assurer qu’il est bien blacklisté on jette un petit coup d’oeil dans le fichier « nvidia-graphics-drivers.conf »:

$ cat /etc/modprobe.d/nvidia-graphics-drivers.conf
blacklist nouveau
blacklist lbm-nouveau
blacklist nvidia-current
blacklist nvidia-96

NB: vous constaterez que le pilote open source « nouveau » est blacklisté…..

Le pilote que j’utilse n’est pas blacklisté… donc comment faire pour lancer cette nouvelle interface?
Simplement en rajoutant une entrée dans le fichier « /etc/environment » afin de forcer Unity à démarrer:

$ sudo vi /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
UNITY_FORCE_START=1

Lorsque le fichier est mis à jour, on redémarre, on se connecte à l’invite gdm et miracle Unity se lance:

Attention tout de même à l’utilsation de cette variable car il est possible d’obtenir quelques effets négatifs.

RHEL : X11 Forwarding sans serveur X

Si comme moi il vous arrive d’installer des machines sous Red Hat Entreprise Linux sur lesquelles vous n’installez par d’interface graphique et que pour exploiter un logiciel vous devez faire du forward X11 (au travers de votre connexion ssh) alors cet article est fait pour vous.

Configuration de ssh

Rien de bien compliquer, il faut tout simplement positionner la directive « X11Forwarding » à « yes » dans le fichier « /etc/ssh/sshd_config »:

root@rhel.guiona.com# vi /etc/ssh/sshd_config
[....]
X11Forwarding yes
[...]
root@rhel.guiona.com# cat /etc/ssh/sshd_config | grep '^X11'
X11Forwarding yes

Une fois que cela est fait, il faut redémarrer le service ssh afin que la modification soit prise en compte:

root@rhel.guiona.com# service sshd restart
service sshd restart
Stopping sshd: [ OK ]
Starting sshd: [ OK ]

Installation des paquets requis

Afin que le Forward X11 fonctionne il faut disposer du paquet « xorg-x11-xauth » mais celui-ci dépend du paquet « libXmu » qui dépend à son tour de « libXt ».

Pour installer ces paquets, deux solutions s’offrent à nous:

  • La machine a un accès internet donc on peut utiliser « yum »
  • La machine n’a pas d’accès internet donc il faut faire une installation manuelle

NB: Il y a également l’éventualité de disposer de son propre mirroir pour les paquets dans ce cas on peut également utiliser « yum ».

Installation automatique

root@rhel.guiona.com# yum -y install xorg-x11-xauth

Intallation manuelle

Après avoir télécharger les rpm adéquat:


root@rhel.guiona.com# rpm-i xorg-x11-xauth-1.0.2-7.1.el6.x86_64.rpm
root@rhel.guiona.com# libXmu-1.0.5-1.el6.x86_64.rpm
root@rhel.guiona.com# libXt-1.0.7-1.el6.x86_64.rpm

Validation

Maintenant que nous avons tout le nécessaire requis, il faut définir la variable d’environnement « DISPLAY »:

root@rhel.guiona.com# export DISPLAY=X.X.X.X:Y.0

Où X.X.X.X correspond à l'adresse IP de votre client X et Y correspond au numéro d'écran.