Gestion de contexte

Dynacase-control propose des fonctions de gestion des contextes :

  • la création d'une archive de contexte existant
  • l'initialisation d'un nouveau contexte à partir d'un archive

Rappel : le contexte inclut la base freedom (webdav étant construite dynamiquement), le(s) vault(s) et le code installée.

Principes

Archivage d'un contexte

Depuis un contexte (dynacase-control), un menu permet de demander l'archivage. Le nom du contexte (unique) est demandé. Le contexte est archivé dans un sous répertoire de la racine DYNACASE-CONTROL : `archived-contexts'. Ce répertoire contient un fichier `info.xml' décrivant les contextes archivés : pour l'instant, le nom du contexte et la date d'archivage. Dans ce répertoire sont stockées les archives de contexte : une archive = un fichier zip `<idarchive>.fcz' (idarchive est calculé, ce n'est pas le nom saisie pour se démarquer des problèmes d'accents, apostrophe, etc…)

Utilisation des archives de contexte

L'interface DYNACASE-CONTROL liste les archives de contexte : sous la zone 'context list' est affichée la zone 'archive list'.

Dans cette zone sont listés les contextes archivés, en cliquant sur un contexte, la partie de droite propose sa configuration et les menus d'action (interface similaire à celle pour le contexte).

Il est possible de :

  • télécharger (upload / dowload) une archive de contexte
  • supprimer une archive de contexte
  • afficher la configuration du contexte, en particulier modules installés
  • initialiser un nouveau contexte à partir d'un contexte archivé

Création d'un nouveau contexte à partir d'une archive de contexte

Lors d'une ouverture d'archive par dynacase-control, il est alors demandé les accès aux bd comme pour une installation normale. L'administrateur doit alors avoir prévu la création des bases et leur accès. le PUBDIR doit être automatiquement modifié.
Une option permet de créer un nouveau contexte en lecture seule.

Solution

Création de l'archive

Fichiers/formats

$WIFF_ROOT/archived-contexts/info.xml

C'est l'index des contextes archivés :

    <archived-contexts>
      <context id="adc83b19e793491b1c6ea0fd8b46cd9f32e592fc" 
               name="test"
               datetime="2010-04-30T10:28:05.143417000+02:00"
               description="Un commentaire pour l'archive">
      </context>
    </archived-contexts>

Le contexte archivé est référencé par `id' : l'archive est alors trouvé par le chemin `$WIFF_ROOT/archive-contexts/${id}.fcz'.

Attributs :

  • id : l'identifiant de l'archive. Le `id' est le hash SHA1 de l'archive.
  • name : le nom du contexte archivé dans cette archive.
  • datetime : la date à laquelle a été créé l'archive.
  • description : un commentaire rentré par l'utilisateur lors de la création de l'archive.

$WIFF_ROOT/archived-contexts/adc83b19e793491b1c6ea0fd8b46cd9f32e592fc.fcz

L'archive d'un contexte suit la structure décrite ci-dessous.

  • info.xml
  • core_db.pg_dump.gz
  • webdav_db.pg_dump.gz
  • context.tar.gz
  • vault_${id_fs}.tar.gz (une archive par vault)

L'archive est au format tar/gzip.

info.xml

L'archive contient un fichier `info.xml' qui reprend le noeud <context></context> de la configuration de DYNACASE-CONTROL `conf/contexts.xml' tel quel.

  <context name="test" root="/Users/jerome/Sites/dynacase-control/test" url="">
    [...]
  </context>

core_db.pg_dump.gz

On fait un dump de la base référencée par le paramètre `core_db'.

webdav_db.pg_dump.gz

On fait un dump de la base référencée par le paramètre `webdav_db'.

context.tar.gz

On fait une archive tar.gz du contexte relatif à la racine de ce contexte :

  $ tar -C ${CONTEXT_ROOT} -zcf context.tar.gz .

vault_${id_fs}.tar.gz

On fait une archive du vault à partir de la racine du vault :

  $ tar -C ${vault_pathname} -zcf vault_${id_fs}.tar.gz

vaults.xml

Ce fichier recense les vaults présents.

  <vaults>
    <vault id_fs="10" pathname="/var/www/test/vaultfs_1" />
    <vault id_fs="11" pathname="/var/www/test/vaultfs_2" />
  </vaultfs>

Création d'un contexte à partir de l'archive

CLI DYNACASE-CONTROL

Créer une archive d'un contexte

$ ./wiff context <contextName> archive

Une archive est produite dans le répertoire `$WIFF_ROOT/archived-contexts' et l'index `$WIFF_ROOT/archived-contexts/info.xml' est mis à jour.

Lister les archives de contextes

$ ./wiff list context archived

L'index `$WIFF_ROOT/archived-contexts/info.xml' est lu et présenté à l'utilisateur.

Restaurer un contexte

$ ./wiff create context <contextName> from archive <path/to/archive>

Un nouveau contexte est créé à partir de l'archive.

Paramétrage de l'installation du contexte

Les éléments suivants sont demandé à l'utilisateur lors de la création d'un nouveau contexte à partir de l'archive :

  1. nom du contexte
  2. accès base de données : le nom du service Postgresql est demandé pour chacune des bases à restaurer.
  3. PUBDIR : la racine sous laquelle sera restauré le contexte.
  4. racine des vault : la racine du vault est demandé pour chacun des vault à restaurer.

Lors de la création, les paramètres sont identiques à la création d'un nouveau contexte. Par défaut il n'y a pas de dépôt de sélectionné.

traitements & construction

  • Reprendre les paramètres d'installation du DYNACASE-CONTROL et les utiliser pour modifier celle par défaut pour des paramètres applicatifs :
    • nom de la base freedom à partir du nom du contexte;
    • racines d'installation du VAULT (une par FS) 1) et mettre en cohérence le table `vaultdiskfsstorage'. Les archives des vaults étant ensuite construits à partir du `id_fs' : vault_${id_fs}.tar.gz.
  • lancer les post-upgrade avec les paramètres d'installation (si l'application le nécessite).

Eléments à reconstruire

Lors la création d'un nouveau contexte à partir de l'archive, certains éléments devront être ajustés afin de référencer les paramètres de ce nouveau contexte.

Les éléments à modifier sont les suivants :

  • Dans `conf/contexts.xml' :
    • Les valeurs des paramètres dans <parameters-value/>
      • core_db doit référencer le nouveau service de la base de donnée du contexte.
      • webdav_db doit référencer le nouveau service de la base de donnée du contexte.
  • Dans la base de données core_db :
    • Dans la table paramv
      • CORE_DB et FREEDOM_DB doivent pointer vers le nouveau service de la base de donnée du contexte.
      • CORE_PUBDIR doit pointer vers la nouvelle racine du contexte.
  • Dans les fichiers du contexte :
    • $WIFF_CONTEXT_ROOT/context/default/dbaccess.php
      • Les variables $pgservice_core et $pgservice_freedom doivent pointer vers le nouveau service de la base de donnée du contexte.
    • $WIFF_CONTEXT_ROOT/WHAT/Lib.Prefix.php
      • La variable $pubdir doit pointer vers la nouvelle racine du contexte.
    • $WIFF_CONTEXT_ROOT/admin/.htaccess
      • La directive AuthUserFile doit pointer vers la nouvelle racine du contexte.
    • $WIFF_CONTEXT_ROOT/.htaccess
      • La directive php_value session.save_path doit pointer vers la nouvelle racine du contexte.

Avoir une procédure qui les référencent en dur ?

Ou bien avoir une section <configure/> pour chacun des modules qui décrit comment reconfigurer les éléments du module ? Cela permettrait de rejouer la configuration des éléments sans avoir de connaissance de ce qu'il faut faire : c'est le module qui est responsable de déclarer les éléments à configurer et les outils pour faire cela.

$ vi core/info.xml
<module name="freedom-core" […]>
  […]
  <post-install>
    […]
  </post-install>
  […]
  <configure>
    <process command="programs/core_configure" />
    <process command="programs/set_param CORE_CLIENT core_client" />
  </configure>
  […]
</module>
$ vi freedom/info.xml
<module name="freedom" […]>
  […]
  <configure>
    <process command="programs/freedom_configure" />
  </configure>
  […]
</module>

Les éléments déclarés en <configure/> sont exécutés :

  • après l'exécution de <post-install/> lors de l'installation d'un module
  • lorsqu'on modifie un paramètre d'un module installé
  • après avoir restauré un contexte à partir d'une archive

`programs/core_configure' serait alors responsable de configurer les éléments CORE_DB et CORE_PUBDIR en db, et de modifier les fichiers `context/default/dbaccess.php', `admin/.htaccess' et `.htaccess'. `programs/freedom_configure' serait quand à lui responsable de configurer FREEDOM_DB en db.

Lorsqu'un paramètre est modifié, on rejoue le <configure/> de tous les modules installés.

Interface Web dynacase-control

[FIXME]

Upload/download L'upload d'une archive risque d'être long et sujet aux restrictions d'upload de PHP/Apache/etc.

Pour les grosses archives, il faudrait proposer une variante pour aller chercher l'archive sur le système de fichier local. Pour cela il faut un « navigateur » de fichiers qui permettrait à l'utilisateur de parcourir son système de fichier pour aller chercher l'archive à traiter.

API

API serveur PHP

Context->archiveContext

L'archivage d'un contexte est lancé par l'appel de la méthode `archiveContext()' sur le l'object `Context'.

La méthode retourne l'identifiant de l'archive créée.

En cas d'erreur, la méthode retourne `false' en cas d'erreur. Le message d'erreur est consultable dans la propriété `errorMessage'.

Exemple

$wiff = WIFF::getInstance();
$context = $wiff->getContext($contextToArchive);
$archiveId = $context->archiveContext();
if( $archiveId === false ) {
  print sprintf("Error: %s", $context->errorMessage);
} else {
  print sprintf("Archive id = %s", $archiveId);
}

WIFF->getArchivedContextList

La liste des archives de contextes est obtenus par l'appel de la méthode `listArchivedContext' sur l'objet `wiff.

La méthode retourne la liste des contextes archives sous la forme de hash avec les clefs suivantes :

  • id : l'identifiant de l'archive du contexte
  • path : le chemin d'accès à l'archive
  • modules : la liste des modules installés dans ce contexte
    • name : le nom du module

Exemple

$wiff = WIFF::getInstance();
$archiveList = $wiff->getArchivedContextList();
if( count($archiveList) <= 0 ) {
  print sprintf("No archives available");
} else {
  foreach( $archiveList as $archive ) {
    print sprintf("archiveId = %s / archivePath = %s", $archive['id'], $archive['path']);
    foreach( $archive['modules'] as $module ) {
      print sprintf("  module name = %s", $module['name']);
    }
  }
}

WIFF->createContextFromArchive($archiveId)

La méthode `createContextFromArchive($archiveId)' permet de créer un nouveau contexte avec les éléments contenus dans l'archive référencée par l'identifiant d'archive fournit.

La méthode retourne le contexte créé.

En cas d'erreur, la méthode retourne `false'. Le message d'erreur est consultable dans `errorMessage'.

$wiff = WIFF::getInstance();
$context = $wiff->createContextFromArchive($archiveId, $contextName, $contextRootPath, $contextDesc, $contextUrl);
if( $context === false ) {
  print sprintf("Error creating context from archive %s", $archiveId);
} else {
  print sprintf("Context %s is now online!", $context->name);
}

WIFF->downloadArchive($archiveId)

La méthode `downloadArchive($archiveId)' permet d'effectuer le téléchargement de l'archive.

La méthode retourne true si elle s'est déroulée sans erreur.

En cas d'erreur, la méthode retourne `false'. Le message d'erreur est consultable dans `errorMessage'.

$wiff = WIFF::getInstance();
if( !$wiff->downloadArchive($archiveId){
  print sprintf("Error downloading archive %s", $archiveId);
} else {
  print sprintf("Downloading archive %s", $archiveId);
}

WIFF->deleteArchive($archiveId)

La méthode `deleteArchive($archiveId)' permet de supprimer l'archive.

La méthode retourne true si elle s'est déroulée sans erreur.

En cas d'erreur, la méthode retourne `false'. Le message d'erreur est consultable dans `errorMessage'.

$wiff = WIFF::getInstance();
if( !$wiff->deleteArchive($archiveId){
  print sprintf("Error deleting archive %s", $archiveId);
} else {
  print sprintf("Archive %s deleted", $archiveId);
}
1) évolution du VAULT pour demander la racine des FS -par défaut lors d'un installation sous le contexte comme aujourd'hui
freedom_3/workinprogress/duplicatecontext.txt · Dernière modification: 27/09/2010 15:15 par nicolas.thing