Dynacase-control propose des fonctions de gestion des contextes :
Rappel : le contexte inclut la base freedom (webdav étant construite dynamiquement), le(s) vault(s) et le code installée.
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…)
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 :
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.
$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.L'archive d'un contexte suit la structure décrite ci-dessous.
L'archive est au format tar/gzip.
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>
On fait un dump de la base référencée par le paramètre `core_db'.
On fait un dump de la base référencée par le paramètre `webdav_db'.
On fait une archive tar.gz du contexte relatif à la racine de ce contexte :
$ tar -C ${CONTEXT_ROOT} -zcf context.tar.gz .
On fait une archive du vault à partir de la racine du vault :
$ tar -C ${vault_pathname} -zcf vault_${id_fs}.tar.gz
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>
$ ./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.
$ ./wiff list context archived
L'index `$WIFF_ROOT/archived-contexts/info.xml' est lu et présenté à l'utilisateur.
$ ./wiff create context <contextName> from archive <path/to/archive>
Un nouveau contexte est créé à partir de l'archive.
Les éléments suivants sont demandé à l'utilisateur lors de la création d'un nouveau contexte à partir de l'archive :
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é.
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 :
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.paramvCORE_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.$WIFF_CONTEXT_ROOT/context/default/dbaccess.php$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$pubdir doit pointer vers la nouvelle racine du contexte.$WIFF_CONTEXT_ROOT/admin/.htaccessAuthUserFile doit pointer vers la nouvelle racine du contexte.$WIFF_CONTEXT_ROOT/.htaccessphp_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 :
`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.
[
]
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.
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'.
$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);
}
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 :
$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']);
}
}
}
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);
}
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);
}
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);
}