Carnet Mutualisation

Gestion des dossiers /plugins (ou utiliser _DIR_PLUGINS_SUPPL)

SPIP-Contrib :: Carnet SPIP :: Carnet Mutualisation :: Recherche :

Gestion des dossiers /plugins (ou utiliser _DIR_PLUGINS_SUPPL)

Dans le cas d’une mutualisation pour différents domaines, la bidouille suivante permet de disposer à la fois d’un répertoire de plugin « centralisé » (comme c’est le cas général dans la mutualisation) mais également d’un répertoire /plugins pour certaines des instance de mutualisation (i.e. les sites mutualisés pour lesquels on estime pouvoir faire confiance au webmestre...).

Testé pour le plugin Mutualisation installé pour avoir des sites avec domaines différents avec la configuration suivante :

En SPIP 2.0.* : il faut ajouter le plugin Multiplug

Ce plugin (disponible uniquement via SVN : http://zone.spip.org/trac/spip-zone...), permet de déclarer dans le fichier mes_options.php du SPIP central un ensemble de sites autorisés à utiliser leur propre dossier /plugins en plus du dossier /plugins « central » du SPIP central.

La syntaxe est la suivante :

En SPIP 2.1 : utilisation de la constante _DIR_PLUGINS_SUPPL

A partir de cette version, chaque SPIP peut déclarer un ensemble de dossiers supplémentaires dans lesquels peuvent êtres placés des plugins.

Pour cela il faut définir _DIR_PLUGINS_SUPPL dans le mes_options.php du site : par exemple pour utiliser le dossier /plugins dans le site mon-site.tld cela donnerait :
(dans les 2 exemples suivants on suppose le site mutualisé installé dans le sous-dossier /sites du SPIP « central »)

Il est possible d’utiliser plusieurs dossiers avec «  : » comme séparateur : Par exemple si on veut utiliser le dossier /plugins du site mon-site.tld et le dossier /le_depot situé à la racine de la mutu cela donnerait :

Important ! : les chemins utilisés dans _DIR_PLUGINS_SUPPL :

  • sont définis relativement à partir de la racine du SPIP
  • doivent se terminer par un / (ainsi que tous les chemins définis dans des constantes SPIP)

NB : la suite est obsolète mais conservée à titre d’historique

Pour chaque instance de site mutualisé pour laquelle on veut laisser au webmestre la possibilité d’installer des plugins supplémentaires, on crée un sous-dossier /plugins (= « spécifique » pour la suite) dans le sous-dossier de site correspondant : /var/www/toto/sites/mon-site.tld/plugins. On va alors créer un lien symbolique dans le dossier plugins central qui pointe vers ce sous-dossier, ce lien sera nommé avec le nom de domaine du site :
/var/www/toto/plugins/mon-site.tld(=symlink)—>/var/www/toto/sites/mon-site.tld/plugins
Tel quel on se retrouve donc avec tous les plugins de tous les répertoire « spécifiques » mélangés avec ceux du répertoire « central » donc visibles et disponibles pour tous les sites mutualisés, ce qui n’est pas exactement le but recherché...

Il reste donc à « filtrer » les liens symboliques qui seront suivis en fonction du site : le lien portant le nom de domaine du site, on à donc un moyen simple de « faire le tri ». Ce tri sera fait au niveau de la fonction de SPIP qui scanne le répertoire des plugins : liste_plugin_files() dans le fichier /inc/plugin.php

La seule difficulté pour réaliser cette opération est que cette fonction du core n’est pas surchargeable puisqu’elle n’est pas de la forme nom_de_la_fonction_dist()... Du coup on doit procéder via la surcharge de l’ensemble du fichier /inc/plugin.php ce qui revient à « forker » celui-ci (c’est très mal !).

Pour minimiser la chose et essayer de gérer au mieux les éventuels changements du fichier lors des prochaines versions de SPIP, on peut procéder en faisant une bidouille à base de copie « à la volée » du fichier /inc/plugin.php de la dist et ne modifiant que le strict nécéssaire dans la fonction liste_plugin_files(). Ce qui peut être obtenu de la façon suivante :

Comme on peut le voir en lisant le code, le principe est de créer un fichier inc_plugin_mutu_XXX.php dans le répertoire /tmp du site mutualisé dans lequel on recopie le fichier /inc/plugin.php de la dist en ajoutant le système de filtrage par remplacement d’une ligne de la fonction liste_plugin_files(). Ce fichier est intégré par un include() dans le fichier en cours (i.e. le fichier qui forke l’original). Une fois ce fichier créé il sera réutilisé tel quel les fois suivantes : chaque site mutualisé dispose donc de son fichier « personnalisé » mis en « cache ».

Le XXX correspond à la version du code de SPIP de façon à ce qu’à chaque modification de la version de SPIP le fichier soit régénéré pour être à jour d’une éventuelle modification du fichier original.

[1en vérité c’est un peu plus complexe puisque ces sous-répertoires ne contiennent que des liens symboliques pour IMG,local, tmp et config) qui pointent vers les sous-dossiers correspondants du répertoire spécifique du domaine : l’utilisateur qui gère le site possède donc un accès FTP dans ce répertoire et peut le gérer comme un spip « normal »