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