GASP : Ganesha Addons, aStuces et Patches

Transcription

GASP : Ganesha Addons, aStuces et Patches
GASP : Ganesha Addons, aStuces et Patches
version du document : 1.0
[en partie repris d'un mail envoyé à Eric Villard décrivant le fonctionnement de GASP, désolé
pour l'aspect "brouillon technique fait sur un coin de table au resto"]
Problematique
Chacun apporte sa pierre à Ganesha, dont certains sous forme de développements ajoutant de
nouvelles fonctions a la plate-forme. Mais tous le monde n'a pas besoin des "pierres" des autres.
Cela risque d'alourdir la plate-forme, la rendre plus instable (débuggage plus difficile), plus
complexe (alors que qu'un des points forts de Ganesha est sa simplicité).
Objectif
pouvoir gérer de façon souple, mais centralisée, des greffons/addons pour Ganesha.
Formulé autrement, cela signifie donner à l'admin Ganesha la possibilité d'ajouter, supprimer,
(dés)activer des addons. De la façon la plus simple, via une interface commune.
Par addons, j'entend : portion de code ajouté à Ganesha de façon à y ajouter des fonctionnalités.
La solution que je propose (mais je reste ouvert à toute autre proposition) se nomme GASP
("Ganesha Addons, aStuces et Patchs", même si j'ai laissé tomber le côté "Astuces et patchs").
Son fonctionnement est relativement simple.
Fonctionnement
A ma demande et grâce à Georges, la version 2 comporte maintenant un dossier et un include
supplémentaire.
A chaque fois que l'on inclus /anema.inc.php (ce qui devrait être fait en début de chaque script, au
moins pour des raisons de sécurité), Ganesha inclus un fichier /addons/gasp/gasp.inc.php.
Ce fichier est vide (pour le moment).
Le principe est le suivant : on a d'un côté Ganesha, de l'autre des addons. La première chose est
donc de trouver comment "lier" ces deux entités.
Pour cela, GASP utilise un procédé extrêmement simple, voire basique : la création de constantes
sous conditions avec includes éventuels.
Pour cela, imaginons 2 fichiers :
- /addons/gad.inc.php qui contient un tableaux des addons et leurs caractéristiques
- /addons/gasp.inc.php qui contient la fonction de création de constantes
GASP - Pierre-Yves Gosset - 26/03/04 - 1/7
Soit le fichier /addons/gad.inc.php
<?php
/**
* Définition des addons
*
* @author
Pierre-Yves GOSSET ([email protected])
* @package
AddonGasp
*/
// [debut Addon gasp]
$GAD['gasp']['statut'] = 1;
$GAD['gasp']['config'] = "gasp.inc.php";
$GAD['gasp']['loadconfig'] = 0;
$GAD['gasp']['RP'] = RP_ADDONS ."gasp/";
$GAD['gasp']['HTTP'] = HTTP_ADDONS . "gasp/";
// [fin Addon gasp]
// [debut Addon moolinex]
$GAD['moolinex']['statut'] = 1;
$GAD['moolinex']['config'] = "config.inc.php";
$GAD['moolinex']['loadconfig'] = 0;
$GAD['moolinex']['RP'] = RP_ADDONS ."moolinex/";
$GAD['moolinex']['HTTP'] = HTTP_ADDONS . "moolinex/";
// [fin Addon moolinex]
// [debut Addon lanceur]
$GAD['lanceur']['statut'] = 1;
$GAD['lanceur']['config'] = "lanceur.inc.php";
$GAD['lanceur']['loadconfig'] = 1;
$GAD['lanceur']['RP'] = RP_ADDONS ."lanceur/";
$GAD['lanceur']['HTTP'] = HTTP_ADDONS . "lanceur/";
// [fin Addon lanceur]
?>
Soit le fichier /addons/gasp.inc.php
<?php
/**
* Inclusion des addons
*
* @author
Pierre-Yves GOSSET ([email protected])
* @package
AddonGasp
*/
include('gad.inc.php');
$prefix = "GAD_";
if (is_array($GAD)) {
foreach ($GAD as $addon => $val) {
if ($GAD[$addon]['statut'] == 1) {
$def = $prefix.strtoupper($addon);
define($def, 1);
if ($GAD[$addon]['loadconfig']==1) {
include_once($GAD[$addon]['RP'].$GAD[$addon]['config']);
}
} else {
$def = $prefix.strtoupper($addon);
define($def, 0);
}
}
}
?>
GASP - Pierre-Yves Gosset - 26/03/04 - 2/7
Exemple d'arborescence (phase 1) :
/addons/gasp/
/addons/gasp/gasp.inc.php
/addons/gasp/gad.inc.php
/addons/monaddon/....
/formation/
/ganesha/
/.../
Déroulement
Voyons le déroulement des évènements :
En préalable, je le rapelle, anema.inc.php va inclure define.inc.php définira RP_ADDONS et
include.inc.php qui incluera /addons/gasp.inc.php
1- gasp.inc.php inclue gad.inc.php (cf code gasp.inc.php ci dessus)
2- gad.inc.php déclare un tableau ($GAD). Ce tableau déclare 3 addons, eux même sous-tableaux
du tableau $GAD ("gasp", "moolinex" et "lanceur").
Enfin, chaque tableau d'addons contient les caractéristiques de l'addon
On a donc, pour chaque addon,
- "statut" : son statut = 0/1 (désactivé/activé)
- "config" : son fichier de configuration (optionnel)
- "loadconfig" : doit-on inclure systematiquement son fichier de configuration ? = 0/1 (non/oui)
- "RP" : son chemin absolu sur le serveur
- "HTTP" : son url (http) absolue
3- la déclaration du tableau faite, on revient à gasp.inc.php
4- on parcours le tableau $GAD
Pour chaque sous tableau d'addons, on regarde si "statut" est égal à 1.
5- Si c'est le cas, on définit une constante basée sur la concaténation d'un préfixe et du nom de
l'addon. Cette constante prendra alors la valeur "1".
Ainsi, comme les 3 addons ont un statut égal à 1 ( "$GAD['moolinex']['statut']==1", par
exemple), on se retrouve avec 3 nouvelles constantes déclarées : GAD_GASP, GAD_MOOLINEX
et GAD_LANCEUR. Toutes trois valent 1.
6- Subtilité pour l'addon Lanceur (dans l'exemple) :
$GAD['lanceur']['config'] = "lanceur.inc.php";
$GAD['lanceur']['loadconfig'] = 1;
$GAD['lanceur']['RP'] = RP_ADDONS ."lanceur/";
On indique ainsi à GASP qu'on veut systématiquement inclure le fichier
RP_ADDONS."lanceur/".lanceur.inc.php
Ainsi, grâce aux includes successifs découlant de l'appel à anema.inc.php, on se retrouve avec
l'inclusion systématique du fichier /addons/lanceur/lanceur.inc.php
GASP - Pierre-Yves Gosset - 26/03/04 - 3/7
Et l'interfaçage dans Ganesha ?
Il devient alors très simple de "faire intervenir l'addon" en ne modifiant que quelques lignes de
Ganesha.
Des exemples ?
Exemple 1 :
Pour l'addon Moolinex, on veut le faire apparaître dans le menu tuteur.Apres avoir identifié où se
trouve ce menu (dans /ganesha/inc/tuteur.inc.php), il suffit d'ajouter :
// modif moolinex
if ( GAD_MOOLINEX ) {
global $GAD;
put (' <tr '.$action.'><td align="middle" valign="middle" width="5%"
bgcolor="'.$color2.'">*</td>');
$url = $GAD['moolinex']['HTTP'].'index.php?connexion='.$connexion ;
$link = '<a class="HEADER1" href="'.$url.'" '.status().'> Moolinex </a>';
put (' <td align="left" valign="middle" width="95%"
bgcolor="'.$color2.'">'.$link.' </td></tr>');
}
// fin modif moolinex
Cela aura pour conséquence d'afficher une ligne de tableau sur 2 colonnes, dont l'une contiendra
un lien vers l'addon moolinex.
Si on désactive l'addon, en éditant gad.inc.php et en mettant
$GAD['moolinex']['statut'] = 0; // au lieu de 1
alors, GAD_MOOLINEX vaudra 0 et la modification côté tuteur ne sera pas affichée.
NB: dans l'idéal, plutot que :
if ( GAD_MOOLINEX ) { (...) }
il serait plus sécurisé d'avoir :
if ( GAD_MOOLINEX===1 ) { (...) }
Le triple "=" vérifiant que GAD_MOOLINEX vaut exactement 1 (et non "true" par exemple). En
effet, mes tests semblent indiquer que tester une constante non définie renvoie true :
if ( CONSTANTE_INDEFINIE) { echo "Pourtant, elle s'affiche..." }
Exemple 2 : Chatouille
On peut aussi utiliser cette technique pour remplacer complètement un outil de Ganesha.
Ainsi,on pourrait déclarer l'addon Chatouille (remplacement du chat de Ganesha) :
// [debut Addon chatouille]
$GAD['chatouille']['statut'] = 1;
$GAD['chatouille']['config'] = "config.inc.php";
$GAD['chatouille']['loadconfig'] = 0;
$GAD['chatouille']['RP'] = RP_ADDONS ."chatouille/";
$GAD['chatouille']['HTTP'] = HTTP_ADDONS . "chatouille/";
// [fin Addon lanceur]
et placer placer dans le fichier d'index du chat "officiel" de Ganesha :
// Debut modif [chatouille]
if ( GAD_CHATOUILLE ) {
Header("Location: ".$GAD['moolinex']['HTTP'].'index.".$ext."?connexion=".$_GET
GASP - Pierre-Yves Gosset - 26/03/04 - 4/7
['connexion'] );
exit;
}
// Fin modif [chatouille]
Chaque fois qu'un membre fera appel au chat, il se verra redirigé vers chatouille. Si l'addon est
désactivé, on repasse sur le chat officiel de façon transparente.
Voilà, fin de la démonstration, on a maintenant un outil facilement manipulable permettant
d'activerou non des addons.
Comment créer un addon compatible GASP ?
Si votre addon rajoute une fonctionnalité spécifique, comme c'est le cas d'un chat, d'un calendrier,
d'un programme auteur, etc., c'est relativement simple :
1- créez un sous dossier /addons/monaddon et faites-y votre sauce
2- déclarez un nouvel addon dans gad.inc.php en ajoutant une entrée au tableau $GAD
3- faites la liaison aux endroits nécéssaires dans le code de Ganesha en ajoutant une condition if (
GAD_MONADDON) { .... }
Evidemment, si votre addon est plus une "surcouche" de Ganesha qu'un addon (le terme français
de "greffon" convient bien), alors GASP ne conviendra probablement pas.
C'est très loin d'être parfait, et je prends toute proposition d'amélioration.
Je précise que je travaille (en production) avec plusieurs addons sans problemes de
ralentissements car les inclusions de fichiers sont limitées.
GASP - Pierre-Yves Gosset - 26/03/04 - 5/7
Pour aller plus loin
Evidemment, j'entends déjà les critiques "c'est bien beau, mais ç'est pas trés ergonomique !"
C'est vrai, mais il ne s'agit là que de la première couche de GASP.
La seconde couche porte sur l'interface utilisateur.
J'avais déjà commencé à mettre en place une interface, mais j'ai dû ralentir le développement (1)
faute de temps et (2) pour cause "d'incertitudes" quant à la direction prise par GASP.
Vous trouverez quelques captures animées du travail effectué sur ganesha.keonox.com
Voilà ce que je souhaitais faire dans une phase 2 :
Chaque addon contiendrait un dossier /gasp/ (exemple : /addons/moolinex/gasp/) contenant un
ensemble de fichiers concernant l'addon :
- gasp.xml : fichier de description de l'addon
- xxxx.sql : fichiers sql éventuels (optionnel)
- installxx.html: fichier(s) de procédure d'installation de l'addon (optionnel)
- etc.
Exemple d'arborescence (phase 2) :
/addons/gasp/
/addons/gasp/gasp.inc.php
/addons/gasp/gad.inc.php
/addons/gasp/index.php <= interface de GASP accessible depuis partie admin
/addons/gasp/gasp/
/addons/gasp/gasp/gasp.xml
/addons/monaddon/...
/addons/monaddon/gasp/
/addons/monaddon/gasp/gasp.xml <= description de l'addon
/addons/monaddon/gasp/install.htm
/addons/monaddon/gasp/tables.sql
/formation/
/ganesha/
/.../
Le plus important étant le fichier gasp.xml, fichier xml contenant notamment toutes les
informations décrivant l'addon (nom, version, compatibilité, développeur, résumé,
fonctionnalités/détails, etc.)
Il aurait été alors possible d'avoir une interface dans /addons/gasp/index.php (inexistant pour
l'instant)
Liste des addons
1234-
GASP
Moolinex
Lanceur
Chatouille
- Désactiver | Description | Désinstaller | Configurer | Supprimer
- Désactiver | Description | Désinstaller | Configurer | Supprimer
- Désactiver | Description | Désinstaller | Configurer | Supprimer
- Désactiver | Description | Désinstaller | Configurer | Supprimer
Addons potentiels
1- INSC
- Description | Installer | Supprimer
Rechercher d'autres addons
Créer/décrire un addon.
GASP - Pierre-Yves Gosset - 26/03/04 - 6/7
Fonctionnalités :
- La liste des addons est obtenu via gad.inc.php
- Désactiver/Activer : change la valeur du statut dans gad.inc.php (0/1)
- Description : lit, parse et formatte le fichier /gasp/gasp.xml de l'addon et affiche sa description
- Installer/désinstaller : supprime l'entrée de l'addon en question dans gad.inc.php (*)
- Configurer (?) : édite le fichier de configuration (si renseigné) de l'addon dans gad.inc.php
- Supprimer : = Désinstaller + suppression du dossier
- La liste des addons potentiels est obtenu en repérant les sous-dossiers de /addons qui
comprennent un fichier /gasp/gasp.xml mais dont l'entrée ne figure pas dans gad.inc.php
- Rechercher d'autres addons : se connecte sur un site défini (anemalab.org) et recherche/ parse
des fichiers gasp.xml décrivant les addons
- Créer/décrire un addon : page html avec des champs (input/textarea) à remplir pour décrire son
addon. La validation entraînant alors la création d'un fichier gasp.xml à enregistrer dans l'addon
créé (/addons/monaddon/gasp/gasp.xml)
(*) Attention : les plus attentifs (s'ils ne se sont pas endormis) auront remarqués que l'installation
("Installer") ne modifie pas le code de Ganesha, mais se contente de renseigner gad.inc.php.
Si quelqu'un trouve un moyen de le faire, tant mieux, mais la "dangerosité" d'une telle action me
pousse à laisser la main à l'administrateur (un peu de copier/coller de code n'a jamais tué
personne).
Et maintenant ?
D'abord il convient de savoir si ce fonctionnement est valable à grande échelle ou non (c'est la
principale raison pour laquelle j'ai mis en veille GASP : si je suis le seul à utiliser ce systeme ou s'il
n'est pas bon, c'est du temps perdu).
Donc, il faut y réfléchir/réagir. Je suis peut être complètement à côté de la plaque, et je suis sans
doute passé à côté de quelque chose...
Ensuite (si ça convient), il faut alors réfléchir aux items du fichier gasp.xml ("qu'est ce qu'on met
dedans ? = qu'est-ce qu'un addon ?")
On pourra alors envisager une répartition des taches sur la dizaines de fonctionnalités citées plus
haut. J'ai déjà eu l'occasion d'utiliser un certain nombre des fonctions nécéssaires (manipulation
de fichiers, rechercher/remplacer une valeur dans un fichier, génération de fichier xml à partir
d'une saisie HTML, etc.) mais sans avoir pu me heurter concrètement à la mise en place
simultanée de ces fonctions dans GASP
Désolé pour l'aspect "brouillon" de ce documents, les fautes qu'il contient, etc. Mais il s'agit d'un
premier jet (et je tenais à l'envoyer ce vendredi au plus tard pour une lecture reposée ce WE ;)).
Il s'agit aussi d'une proposition très subjective (qui a dit simpliste ?) d'une modularisation possible
de Ganesha.
Je sais aussi que certains (Eric ?, Georges ?) ont des visions beaucoup plus poussées de la
chose (j'ai entendu parler de webservice, d'API java, etc.), auxquelles je suis prêt à adhérer
suivant les ressources nécéssaires.
Pierre-Yves
GASP - Pierre-Yves Gosset - 26/03/04 - 7/7

Documents pareils