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