(X)dialog: des shells qui parlent

ArticleCategory: [Choose a category, translators: do not translate this, see list below for available categories]

UNIXBasics

AuthorImage:[Here we need a little image from you]

[Photo of the Authors]

TranslationInfo:[Author + translation history. mailto: or http://homepage]

original in en Katja and Guido Socher 

en to fr Georges Tarbouriech 

AboutTheAuthor:[A small biography about the author]

Katja est l'�ditrice Allemande de LinuxFocus. Elle aime Tux, le cin�ma & la photographie et la mer. Sa page personnelle se trouve ici.

Guido est un fan de Linux de longue date et il appr�cie ce syst�me parce qu'il est con�u par des personnes honn�tes et ouvertes. C'est l'une des raisons pour lesquelles on le nomme "source ouverte". Sa page personnelle est � linuxfocus.org/~guido.

Abstract:[Here you write a little summary]

Xdialog et dialog sont deux utilitaires classiques destin�s � am�liorer vos scripts shell par une interface graphique.
Quelques connaissances en programmation shell sont n�cessaires pour comprendre cet article. Pour d�couvrir les bases de la programmation du shell vous pouvez lire l'article 216: "Programmation du Shell".

ArticleIllustration:[One image that will end up at the top of the article]

[Illustration]

ArticleBody:[The main part of the article]

Introduction

Le shell d'UNIX est un environnement tr�s productif par lui-m�me et fonctionne parfaitement sans interface graphique.
Dans certains cas, toutefois, il est bien pratique de proposer un dialogue graphique avec l'utilisateur. Un bon exemple concerne le dialogue d'installation d'un programme. Vous pouvez choisir de nombreuses options sur les fonctionnalit�s � installer et vous pouvez s�lectionner le r�pertoire de destination...

Entamons le (X)dialog...

Avec dialog et Xdialog vous pouvez concevoir une application graphique en �crivant simplement un court script shell. Dialog est un programme bas� sur du pur terminal et Xdialog est un programme X11.
Voici un exemple :
Tapez (ou copiez/collez) les lignes suivantes dans un shell (xterm, konsole,....):
NDT : nous conservons la langue d'origine des exemples pour que les captures d'�cran correspondent. Vous pouvez bien s�r les "franciser"

bash
Xdialog --yesno "Do you want to learn more about Xdialog ?" 0 0;\
case $? in
0)
echo "Result: Yes chosen.";;
1)
echo "Result: No chosen.";;
255)
echo "ESC pressed.";;
esac

La bo�te qui appara�t ressemble � �a :

[yes/no Xdialog]

Si vous utilisez dialog � la place de Xdialog (supprimez le X dans la deuxi�me ligne du script ci-dessus), vous obtenez une application curses qui fonctionne dans le terminal et n'ouvre donc pas une nouvelle fen�tre. Dans certains cas, il est pr�f�rable d'ex�cuter un script shell dans la fen�tre du terminal. Particuli�rement si vous souhaitez l'ex�cuter � distance sur plusieurs h�tes diff�rents avec lesquels il est possible d'utiliser un routage IP direct. Dans ce cas dialog fonctionnera mais ne pourra pas lancer une application X11 comme Xdialog peut le faire.

[yes/no dialog]

L'application dialog/Xdialog ci-dessus �tait plut�t inutile mais elle montre � quel point il est facile de programmer un dialogue graphique. Il existe des bo�tes de dialogue beaucoup plus int�ressantes : des calendriers, des menus, des gestionnaires de fichiers, des jauges, des saisies de texte, des bo�tes de message, des fen�tres d'entr�e de mot de passe... Tapez

dialog --help
or
Xdialog --help

pour obtenir la liste des bo�tes de dialogue disponibles. Xdialog en offre plus que dialog.

Comment �a marche

Les bo�tes de dialogue se configurent par la ligne de commande.

dialog --yesno "text string" <height> <width>

Apr�s avoir tap� dialog ou Xdialog vous devez donner le nom de la bo�te choisie suivi de ses propres param�tres.

La bo�te yesno accepte trois param�tres. La <hauteur> et la <largeur> peuvent �tre d�finis � z�ro auquel cas la g�om�trie de la bo�te sera automatiquement ajust�e � la taille du texte. Le r�sultat est renvoy� au script sous forme de statut de sortie dans la variable "$?". Si d'autres r�sultats doivent �tre renvoy�s, par exemple, les noms des options s�lectionn�es, ils le sont vers l'erreur standard. L'erreur standard est habituellement affich�e � l'�cran mais peut �tre redirig�e par "2>".

Une solution simple mais efficace.

De v�ritables applications

Voici maintenant une application dans laquelle Xdialog/dialog offrent un r�el avantage sur les scripts shell conventionnels : un menu dans lequel vous pouvez choisir entre diff�rents Fournisseurs d'Acc�s � Internet et lancer la connexion. Le programme r�clame les scripts ppp-on/ppp-off de l'article 192 de Mars 2001 Utiliser diff�rents FAI pour votre acc�s � Internet. Le script se nomme pppdialout et affiche un menu diff�rent selon que vous �tes connect�s ou non.
#!/bin/sh
#
#DIALOG=Xdialog
DIALOG=dialog
#
# name of your default isp:
defaultisp=maxnet
#
error()
{
    echo "$1"
    exit 2
}
help()
{
  cat <<HELP
pppdialout -- select an ISP and dial out.
All available ISPs must have a config file in /etc/ppp/peers

pppdialout executes the ppp-on/ppp-off scripts as described
in http://linuxfocus.org/English/March2001/article192.shtml

pppdialout, copyright gpl, http://linuxfocus.org/English/November2002
HELP
  exit 0
}

# parse command line:
while [ -n "$1" ]; do
case $1 in
    -h) help;shift 1;; # function help is called
    --) shift;break;; # end of options
    -*) echo "error: no such option $1. -h for help";exit 1;;
    *)  break;;
esac
done

tempfile=/tmp/pppdialout.$$
trap "rm -f $tempfile" 1 2 5 15

# check if we have a ppp network interface
if /sbin/ifconfig | grep '^ppp' > /dev/null; then
    # we are already online
    $DIALOG --title "go offline" --yesno "Click YES to \
                     terminate the ppp connection" 0 0
    rval="$?"
    clear 
    if [ "$rval" = "0" ]; then
        echo "running /etc/ppp/scripts/ppp-off ..."
        /etc/ppp/scripts/ppp-off
    fi
else
    # no ppp connection found, go online
    # get the names of all available ISP by listing /etc/ppp/peers
    for f in `ls /etc/ppp/peers`; do
        if [ -f "/etc/ppp/peers/$f" ]; then
            isplist="$isplist $f =="
        fi
    done
    [ -z "$isplist" ]&&error "No isp def found in /etc/ppp/peers"
    #
    $DIALOG --default-item "$defaultisp" --title "pppdialout"  \
         --menu "Please select one of\
    the following ISPs for dialout" 0 0 0 $isplist 2> $tempfile
    rval="$?" # return status, isp name will be in $tempfile
    clear
    if [ "$rval" = "0" ]; then
        isp=`cat $tempfile`
        echo "running /etc/ppp/scripts/ppp-on $isp..."  
        /etc/ppp/scripts/ppp-on "$isp"
    else
        echo "Cancel..."    
    fi
    rm -f $tempfile
fi
# end of pppdialout
Comment fonctionne le script :
Au d�but nous d�finissons quelques fonctions, erreurs et aide, et ensuite nous v�rifions les arguments de la ligne de commande et le nom d'un fichier temporaire est attribu� (/tmp/pppdialout.$$). $$ est le nom du processus courant et il poss�de un num�ro unique pour chaque ordinateur. "Trap" est ex�cut� si le programme se termine anormalement (si l'utilisateur presse Ctrl-C, par exemple) et supprime le fichier temporaire. Ensuite, nous v�rifions si nous sommes d�j� en ligne (commande: /sbin/ifconfig | grep '^ppp'). Si nous sommes en ligne, nous ouvrons une bo�te yesno (ouinon), celle que nous avons d�j� vu plus haut, et demandons � l'utilisateur s'il souhaite se d�connecter. Si nous ne sommes pas en ligne une bo�te menu est ouverte. Nous y obtenons tous les FAI disponibles en listant les fichiers contenus dans /etc/ppp/peers (ls /etc/ppp/peers). La syntaxe de la bo�te menu :

dialog --menu "text" <height> <width> <menu height> <tag1> <description> ...

La <hauteur>, la <largeur> et la <hauteur du menu> sont de nouveau d�finis � z�ro (taille automatique, voir plus haut) et le programme attend des couples de cha�nes de caract�res (<tag1> <description>). Nous n'avons pas vraiment de description, nous d�finissons donc quelque chose sans signification (== dans ce cas). Les donn�es dans la variable iplist ressembleront � ce qui suit :

isp1 == isp2 == isp3 ==

Le r�sultat du choix de l'utilisateur est affich� par (X)dialog sur l'erreur standard. La commande shell "2> $tmpfile" l'�crit dans notre fichier temporaire (tempfile). La bo�te menu offre �galement la possibilit� de presser le bouton cancel (Annuler). Nous devons donc v�rifier $? (le statut de sortie) pour savoir quel bouton a �t� press�.

Bon, assez de th�orie. Voil� � quoi �a ressemble.

... en tant qu'interface GTK avec Xdialog:

[pppdialout with xdialog]
[pppdialout with xdialog]

... avec le dialogue curses dans le terminal:

[pppdialout with dialog]
[pppdialout with dialog]

D'autres applications

Nous avons une autre application � vous proposer. Elle se nomme mktgz et utilise la bo�te "checklist" de Xdialog. Dialog (bas� sur le terminal) ne poss�de pas de "checklist", par cons�quent cela ne fonctionnera qu'avec Xdialog. Pour construire vos paquetages tar.gz vous pouvez utiliser mktgz.

mktgz votrepaquetage .

Cette commande affiche tous les fichiers du r�pertoire courant (".") et vous pouvez choisir lesquels inclure dans votre paquetage tar.gz. Vous pouvez le t�l�charger ici (mktgz.txt) Nous n'analyserons pas le code ligne � ligne puisque vous en savez d�j� assez pour comprendre le script.

Conclusion

Xdialog et dialog offrent de nombreuses bo�tes de dialogue diff�rentes. Elles ne sont pas toujours appropri�es � tous les types de script shell. Le shell proprement dit est d�j� un environnement tr�s puissant. Compl�ter un chemin par la touche de tabulation est beaucoup plus rapide que de rechercher les diff�rents r�pertoires dans une application graphique en cliquant sur chacun. La possibilit� d'imbriquer et de combiner les commandes en fait un outil d'une puissance �tonnante. Par exemple :
grep -i "somestring" file.txt | sort | uniq | wc -l
(pour ceux qui manquent d'exp�rience avec le shell UNIX : cette commande compte les lignes du fichier file.txt contenant la cha�ne de caract�res "somestring")
De telles constructions imbriqu�es sont rendues possibles parce que toutes les commandes sont contr�l�es par des arguments. En d'autres termes : elles ne s'arr�tent pas pour demander � l'utilisateur s'il veut continuer.
Toutefois les dialogues graphiques peuvent �tre tr�s utiles dans certaines applications. Xdialog et dialog sont tr�s faciles � utiliser sans, bien �videmment, b�n�ficier de la puissance d'une v�ritable application graphique. Elles comblent le vide entre le script shell en ASCII pur et l'application graphique.

Xdialog et dialog contiennent un r�pertoire "samples" dans lequel vous trouverez d'autres exemples (Redhat 7.3 les stocke dans /usr/share/doc/Xdialog-2.0.5/samples). Soyez prudents parce que certains sont vraiment fonctionnels et ne doivent plus �tre assimil�s � des "demos".

O� se procurer Xdialog et dialog?

Les CD de votre distribution Linux sont le premier endroit o� chercher dialog et Xdialog. Ils sont peut-�tre d�j� install�s sur votre ordinateur (demandez-le lui : rpm -qil Xdialog, dpkg -L Xdialog). Le site de Xdialog se trouve � :
http://www.chez.com/godefroy/
et dialog �
http://hightek.org/dialog/
Vous pouvez y t�l�charger dialog/Xdialog.

R�f�rences