Le Samedi 14 Mai 2005 09:18, Laville Guillaume a écrit :
> Je suis tout à fait de ton avis: plus je regarde les *dialog, plus je
> me rend compte des limites q'uils imposent par rapport aux
> possibilitées offertes par gtk2, qt...
> Mon idée de "frontaux" n'an effectivement que epu d'interet dans le
> contecte d'utilsation des *dialog, comme tu l'as si bien souligné. Et
> je dois reconnaitre que j'ai un effectivement peur que bash ne suffise
> plus pour Nsetup.
>
> Je prosose donc également de réfléchir à un autre langage pour Nsetup.
> Personnellement, je souhaiterait rester dans de l'interpreté, pour sa
> souplesse. Je ne vois pas l'utilité de sortir le C/C++ avec des dll etc...
> bref la grosse artillerie:
> la rapidité des langages interprétes est largement sufsante pour notre
> utilisation dans Nsetup
>
> Personellement, je me fait l'avocat de python: il est à mon avis la
> meileure solution à l'heure actuelle pour notre Nsetup:
> - il est pratique et répandu
> - il ressemble beaucoup au C avec lequel il supporte une collaboration
> poussée (modules écrits en C pour optimiser la vitesse, etc...)
> - il s'interface au moins avec ncurses (texte) et gtk2 (graphique).
> Cela ne m'étonnerait pas que ce soit également le cas pour qt, mais je
> n'ai pas encore regardé ça ;-)
> - il est surtout extremement modulaire; quoi de meiux pour notre
> architecture de Nsetup ? chaque module pourrait representer un module
> python :-D

Content de voir que tu le prends bien :-)

Utiliser un langage interprêté me semble être un bon choix également, et je 
n'ai rien contre Python :-) Il s'interface sans problème avec Ncurses, Gtk+ 
et Qt. Et son orientation objet est un plus pour mettre en place une 
architecture modulaire.


Indépendamment du langage de programmation retenu, voici une proposition pour 
l'interaction d'un module avec les outils en ligne de commande d'un coté et 
l'interface graphique de l'autre.

Je vais prendre à nouveau comme exemple l'ajout d'un utilisateur sur le 
système.
Les informations dont on a besoin sont les nom et prénom du nouvel 
utilisateur, son identifiant de connexion, son mot de passe, le groupe auquel 
il faut le rattacher et l'interprêteur de commandes qu'il veut utiliser (ce 
n'est qu'un exemple, il peut y avoir plus d'infos).

Du point de vue « graphique », certaines informations vont être récupérées par 
l'intermédiaire de champs texte (nom, prénom, identifiant, groupe, mot de 
passe), d'autres peuvent être récupérées par un choix dans une liste 
déroulante (groupe (s'il est choisi dans une liste de groupes existantS) et 
interprêteur de commandes). Pour les champs texte, il n'y a rien à faire, 
mais pour les listes déroulantes, il faut d'abord récupérer les informations 
qu'elles vont contenir. Une fois récupérée, les listes déroulantes doivent 
être remplies avec, puis la totalité du l'interface graphique peut être 
affichée. L'utilisateur remplit alors les champs et fait ses choix, puis 
valide. Les informations sont vérifiées. Si elles sont incorrectes, il faut 
le signaler à l'utilisateur pour qu'il corrige. Si elles sont bonnes, 
l'utilisateur peut être ajouté en utilisant la commande système « adduser ».

L'ensemble de ces interactions peut être schématisé comme ceci (utilisez une 
police à espacement fixe, c'est mieux ;-) ):

  Fichiers système et                                    Interface graphique
  outils en ligne de          Module Nsetup             pour le module adduser
       commande                  adduser              (en Ncurses, Gtk+ ou Qt,
                                                             peu importe )

                            ----------------
                            |              |
 ------------  <---------------            |
 |/etc/group|        1      |              |
 ------------  --------------->            |
                            |              |
 -------------  <--------------            |
 |/etc/shells|      2       |              |
 -------------  -------------->            |
                            |      3 - initModuleIHM() ->  -----------------
                            |              |               |               |
                            |      4 --- setGroupsList() ---->             |
                            |              |               |               |
                            |      5 --- setShellsList() ---->             |
                            |              |               |               |
                            |      6 --- setCallBack() ------>             |
                            |              |               |               |
                            |      7 --- displayIHM() ------->             |
                            |              |               |               |
                            | ------------ |               |               |
                            | |Fontion de| |               | ------------- |
                            | | callback | |               | |  le user  | |
                            | |          | |               | |  valide   | |
                            | |          | |       8       | |           | |
                            | |          |<--- Appel du --------         | |
                            | |          | |   callback    | |           | |
                            | |          | |               | ------------- |
                            | |          | |               |               |
                            | |    9 ------- getUserName() ------>         |
                            | |          | |               |               |
                            | |   10 ------- getUserForname() --->         |
                            | |          | |               |               |
                            | |   11 ------- getUserLogin() ----->         |
                            | |          | |               |               |
                            | |   12 ------- getUserPassword() -->         |
                            | |          | |               |               |
                            | |   13 ------- getUserGroup() ----->         |
                            | |          | |               |               |
                            | |   14 ------- getUserShell() ----->         |
                            | |          | |               |               |
       adduser  <---------------- 15     | |               -----------------
                            | |          | |
                            | ------------ |
                            ----------------

Lorsque le module Nsetup adduser est lancé, il récupère la liste des groupes 
(1) et des shells (2) existants. Si c'est bon, il initialise l'interface 
graphique qui correspond à adduser (3). La méthode initModuleIHM() pourrait 
être fournie par le script Nsetup lui-même. Elle se débrouillerait pour 
instancier l'interface graphique correspondant au module appelant, et dans le 
style choisi par l'utilisateur (ncurses, gtk, qt ...). Avant d'afficher 
l'interface (7), le module va fournir à l'interface les informations 
récupérées en 1 et 2 pour remplir les listes déroulantes (4 et 5). Puis il 
fournit une méthode de callback (6) qui sera appelée lorsque l'utilisateur 
validera la saisie de ses informations. À partir de là, l'interface peut être 
affichée (7). Après avoir rempli tous les champs, l'utilisateur valide, ce 
qui provoque l'appel de la fonction de callback (8). Celle-ci va récupérer 
les informations saisies (le nom (9), prénom (10), l'identifiant de connexion 
(11), le mot de passe (12), le groupe (13) et le shell (14)), puis faire 
appel à l'outil en ligne de commande adduser du système (15).

Cet exemple n'a pas la prétention d'être complet. Il manque tout ce qui se 
rapporte à la gestion d'erreur dans les saisies de l'utilisateur entre 
autres. Mais il montre une manière de faire pour séparer le traitement des 
informations de leur saisie. On voit que l'interface graphique doit fournir 
un certain nombre de méthodes permettant de l'initialiser et de lui fournir 
les informations de base, puis d'autres méthodes pour récupérer les 
informations saisies. L'idée est que chacune des interfaces pour adduser (en 
ncurses, en Gtk+ et en Qt) fournisse exactement les mêmes méthodes set* et 
get* pour que le module Nsetup adduser puisse les utiliser indifféremment 
l'une de l'autre.

À débattre :-)

++
Gontran

Répondre à