Chapitre 9 Dynacase Control en mode CLI
Le mode CLI de dynacase-control permet d'administrer les contextes Dynacase en ligne de commande.
9.1 Utilisation
La commande wiff
permet de manipuler et administrer les contextes Dynacase.
Les opérations actuellement accessibles à travers l'UI Web, seront accessibles
en ligne de commande à l'aide de cette commande wiff
. Cette commande doit
être lancée sous root
. Pour cela, vous pouvez soit vous logger sous le compte
root
, soit utiliser sudo
pour l'exécuter (Dans ce cas, vous pouvez
également autoriser la commande wiff sans mot de passe en éditant le fichier
sudoers).
Si vous n'êtes pas root
sur le serveur, et que les opérations
d'administrations s'effectuent avec sudo
:
$ sudo /var/www/dynacase-control/wiff help Password: ****** [message d'aide]
Si vous avez accès au compte root
sur le serveur :
# /var/www/dynacase-control/wiff help [message d'aide]
Le CLI utilise un verrou afin de se prémunir contre l'exécution concurrente de plusieurs opérations de modification (voir détails Opérations verrouillées ci-dessous).
9.2 Commandes
9.2.1 Lister les contextes existants
Cette opération permet d'afficher les contextes installés.
Syntaxe :
list context [--pretty]
Exemple :
# /var/www/dynacase-control/wiff list context developpement test production
# /var/www/dynacase-control/wiff list context --pretty Name Description ----------------------------------------------------------------------------------- developpement Développement test Test production Production
9.2.2 Créer un nouveau contexte
control 1.5
Cette opération permet de créer un nouveau contexte.
Syntaxe :
create context <context-name> <context-root>
Exemple :
# /var/www/dynacase-control/wiff create context test /var/www/test
9.2.3 Manipuler les propriétés d'un contexte
control 1.5
Les propriétés d'un contexte sont :
url
- L'URL affichée sur le contexte.
description
- La description affichée sur le contexte.
9.2.3.1 Voir la liste des propriétés d'un contexte
control 1.5
Cette opération permet de voir la liste des propriétés avec leur valeur.
Syntaxe :
context <context-name> property show
Exemple :
# /var/www/dynacase-control/wiff context test property show url = /test/admin.php description = Contexte de test.
9.2.3.2 Récupérer la valeur d'une propriété d'un contexte
control 1.5
Cette opération permet de voir la valeur d'un propriété.
Syntaxe :
context <context-name> property get <property-name>
Exemple :
# /var/www/dynacase-control/wiff test property get url url = /test/admin.php
9.2.3.3 Modifier les propriétés d'un contexte
control 1.5
Cette opération permet de modifier les propriétés d'un contexte.
Syntaxe :
context <context-name> property set <property-name> <property-value>
Exemple :
# /var/www/dynacase-control/wiff context test property set url http://www.example.net/test/ # /var/www/dynacase-control/wiff context test property set description "Ceci n'est pas un contexte de test."
9.2.4 Modifier les dépôts de paquets utilisés par un contexte
control 1.5
Cette opération permet de voir/modifier la liste des dépôts de paquets utilisés par un contexte.
Les dépôts de paquets utilisables par un contexte doivent être déclarés au préalable dans dynacase-control (voir Gérer la liste des dépôts de paquets de dynacase-control ci-dessous).
9.2.4.1 Voir les dépôts actifs sur un contexte
control 1.5
Syntaxe :
context <context-name> repository list
Exemple :
# /var/www/dynacase-control/wiff context test repository list dynacase acme
9.2.4.2 Activer un dépôt sur un contexte
control 1.5
Syntaxe :
context <context-name> repository enable <repo-name>
Exemple :
# /var/www/dynacase-control/wiff context test repository enable foo
9.2.4.3 Désactiver un dépôt sur un contexte
control 1.5
Syntaxe :
context <context-name> repository disable <repo-name>
Exemple :
# /var/www/dynacase-control/wiff context test repository disable foo
9.2.4.4 Désactiver tous les dépôts sur un contexte
control 1.5
Syntaxe :
context <context-name> repository disable --all
Exemple :
# /var/www/dynacase-control/wiff context test repository disable --all
9.2.5 Supprimer un contexte
control 1.5
Syntaxe :
delete context [options] <context-name>
Les options disponibles sont :
-
--nopre
permet de ne pas exécuter les processus de 'pre-delete' déclarés par les paquets. -
--force
permet de ne pas tenir compte des statuts d'échec des processus de 'pre-delete'.
Exemple :
# /var/www/dynacase-control/wiff delete context --force test
9.2.6 Manipuler les modules du contexte
9.2.6.1 Lister les modules installés
Cette opération affiche les modules installés dans le contexte sélectionné.
Syntaxe :
context <context-name> module list installed [--pretty]
Exemple :
# var/www/dynacase-control/wiff context test module list installed dynacase-fckeditor (2.6.3-7) dynacase-webdesk (1.2.2-1) dynacase-extjs (3.1.1-8) dynacase-core (3.2.5-1) dynacase-extui (0.6.4-1) dynacase-workspace (0.6.1-1) dynacase-ecm (0.3.0-1)
9.2.6.2 Lister les modules disponibles
Cette opération affiche la liste des modules disponibles sur les dépôt de paquets accessibles par HTTP ou FTP.
Syntaxe :
context <context-name> module list available [--pretty]`
Exemple :
# /var/www/dynacase-control/wiff context test module list available dynacase-extjs (3.1.1-8) dynacase-core (3.2.5-1) dynacase-fckeditor (2.6.3-7) dynacase-freeevent (2.6.0-0) dynacase-webdesk (1.2.2-1) [...] dynacase-apisamples (0.1.3-1) dynacase-familysamples (0.1.0-2) dynacase-cas (0.0.2-1) dynacase-theme (0.0.1-4) dynacase-url (0.0.0-3)
9.2.6.3 Lister les modules avec mise à jour proposée
Cette opération permet d'afficher la liste des modules installés dont une mise-à-jour est disponible sur les dépôts de paquets.
Syntaxe :
context <context-name> module list upgrade [--pretty]
Exemple :
# /var/www/dynacase-control/wiff context test module list upgrade dynacase-core (3.2.6-1)
9.2.6.4 Installer un module
Cette opération permet d'installer un module contenu dans un paquet local (archive .webinst stocké en local sur le serveur) ou à partir d'un paquet disponible sur un dépôt de paquets distant accessible par HTTP ou FTP.
Syntaxe :
context <context-name> module install [options] <localPackagePath> context <context-name> module install [options] <moduleName>
Les options disponibles sont :
-
--nopre
permet de ne pas exécuter les processus de 'pre-install' déclarés par le paquet. -
--nopost
permet de ne pas exécuter les processus de 'post-install' déclarés par le paquet. -
--nothing
permet de ne pas exécuter les processus de 'pre-install' et de 'post-install' déclarés par le paquet. -
--force
permet de forcer l'installation du paquet même si celui-ci est déjà installé.
Exemple :
Installation d'un paquet distant :
# /var/www/dynacase-control/wiff context test module install dynacase-core Will (i)nstall, (u)pgrade, or (r)eplace the following modules: - dynacase-core-3.2.5-1.20130221.090413 (i) - dynacase-jquery-installer-1.7.2-1.20120730.134605 (i) - dynacase-jquery-ui-installer-1.8.21-2.20120817.154930 (i) - dynacase-json2-1.0.0-0.20130214.114647 (i) - dynacase-datajs-3.2.5-0.20130220.144720 (i) - dynacase-jquery-dataTables-installer-1.9.1-0.20120622.121419 (i) - dynacase-ckeditor-installer-4.0.1-0.20130213.174659 (i) Proceed with installation ? [Y/n] Processing module 'dynacase-core' (3.2.5-1.20130221.090413) for install. Downloading module 'dynacase-core-3.2.5-1.20130221.090413'... [OK] [...] Done.
Installation d'un paquet local :
# /var/www/dynacase-control/wiff context test module install /tmp/foo-1.2.3-4.webinst Processing required module 'foo' (1.2.3-4) for install. [...] Done.
Notes :
-
control 1.5 À partir de la
version
1.5
de dynacase-control, le format XML des modules est vérifié et un avertissement est affiché si le format n'est pas conforme. Voir Format des modules webinst et Changements par rapport à l'ancien format pour les changements à apporter à vos fichierinfo.xml
de description de module.
9.2.6.5 Upgrader un module
Cette opération permet d'upgrader un module à partir d'un paquet local (archive .webinst stocké en local sur le serveur) ou à partir d'un paquet disponible sur un dépôt de paquets distant accessible par HTTP ou FTP.
Syntaxe :
context <context-name> module upgrade [options] <localPackagePath> context <context-name> module upgrade [options] <moduleName>
Les options disponibles sont :
-
--nopre
permet de ne pas exécuter les processus de 'pre-upgrade' déclarés par le paquet. -
--nopost
permet de ne pas exécuter les processus de 'post-upgrade' déclarés par le paquet. -
--nothing
permet de ne pas exécuter les processus de 'pre-upgrade' et de 'post-install' déclarés par le paquet. -
--force
permet de forcer l'upgrade du paquet même si une version supérieure ou égale est déjà installée.
Exemple :
# /var/www/dynacase-control/wiff context test module upgrade /tmp/foo-2.0.0-1.webinst Processing required module 'foo' (2.0.0-1) for upgrade. [...] Done.
Notes :
-
control 1.5 À partir de la
version
1.5
de dynacase-control, le format XML des modules est vérifié et un avertissement est affiché si le format n'est pas conforme. Voir Format des modules webinst et Changements par rapport à l'ancien format pour les changements à apporter à vos fichierinfo.xml
de description de module.
9.2.7 Archives de contextes
9.2.7.1 Archiver un contexte
control 1.5
Syntaxe :
context <context-name> archive <archive-name> [--without-vault] [--description=<description>]
Les options disponibles sont :
-
--without-vault
permet de ne pas inclure l'archivage du vault dans l'archive du contexte. -
--description=<description>
permet de saisir le champ de description de l'archive.
Exemple :
# /var/www/dynacase-control/wiff context dev archive test test-1f84e69f127a5fb3f2d920c35beb12f2f2a6c4d5
Note :
-
L'archivage d'un contexte peut nécessiter jusqu'à deux fois la taille des éléments à archiver. Une estimation de l'espace disque minimal nécessaire peut être obtenue avec la formule suivante :
s1 := taille( dump de la base de données ) s2 := taille( contenu du répertoire racine du contexte ) s3 := taille( contenu des vaults ) espace_libre_necessaire := ( s1 + s2 + s3 ) * 2
9.2.7.2 Lister les archives
control 1.5
Syntaxe :
list archive
Exemple :
# /var/www/dynacase-control/wiff list archive test-1f84e69f127a5fb3f2d920c35beb12f2f2a6c4d5 pre-prod-838ac13e91d439d5c3a8bed86ea8adfee800c949
9.2.7.3 Voir les informations d'une archive
control 1.5
Syntaxe :
archive <archive-id> info
Exemple :
# /var/www/dynacase-control/wiff archive test-1f84e69f127a5fb3f2d920c35beb12f2f2a6c4d5 info Archive 'test-1f84e69f127a5fb3f2d920c35beb12f2f2a6c4d5' ------------------------------------------------------- id = test-1f84e69f127a5fb3f2d920c35beb12f2f2a6c4d5 date = 2014-12-15 09:03:04 name = test size = 42.121 Mo vault = Yes description = dev@2014-12-15T09:03:04 Installed modules: - dynacase-core (3.2.17-1) [...]
9.2.7.4 Restaurer l'archive d'un contexte
control 1.5
Syntaxe :
archive <archive-id> restore <context-name> <context-root> <pg-service-name> <vault-root> [--remove-profiles --user-login=<login> --user-password=<password>] [--clean-tmp-directory=<'yes'|'no'>]
Les options disponibles sont :
-
--remove-profiles
permet de donner tous les privilèges sur tous les documents à un nouvel utilisateur lors de la restauration du contexte (à utiliser en conjonction avec--user-login
et--user-password
). -
--user-login
et--user-password
permet de spécifier le login et le mot de passe du nouvel utilisateur auquel sont donnés tous les privilèges sur tous les documents. -
--clean-tmp-directory=<'yes'|'no'>
permet de supprimer si les fichiers temporaires de la restauration sont effacés (yes
ou comportement par défaut) ou s'il sont conservés (no
).
Exemple :
# /var/www/dynacase-control/wiff archive test-1f84e69f127a5fb3f2d920c35beb12f2f2a6c4d5 restore test2 /var/www/test2 db-test-2 /var/www/test2/vaultfs Context 'test2' successfully created from archive 'test-1f84e69f127a5fb3f2d920c35beb12f2f2a6c4d5'.
9.2.8 Supprimer une archive de contexte
Syntaxe :
delete <archive-id>
Exemple :
# /var/www/dynacase-control/wiff delete archive test-1f84e69f127a5fb3f2d920c35beb12f2f2a6c4d5
9.2.9 Manipuler les paramètres des modules
9.2.9.1 Afficher la liste des paramètres d'un module
Cette opération permet d'afficher la liste des paramètres des modules installés.
Syntaxe :
context <context-name> param show [<moduleName>]
Exemple :
# /var/www/dynacase-control/wiff context test param show dynacase-core:client_name = Test dynacase-core:core_db = test dynacase-core:authtype = html dynacase-core:lcdate = iso : standard format 8601 dynacase-core:core_tmpdir = ./var/tmp dynacase-core:core_admin_passwd = dynacase-core:mod_deflate = yes foo:bar = baz foo:bir = biz # /var/www/dynacase-control/wiff context test param show foo foo:bar = baz foo:bir = biz
9.2.9.2 Afficher la valeur d'un paramètre d'un module
Cette opération permet d'afficher la valeur d'un paramètre d'un module donné.
Syntaxe :
context <context-name> param get <module-name>:<param-name>
Exemple :
# /var/www/dynacase-control/wiff context test param get foo:bar foo:bar = baz
9.2.9.3 Positionner la valeur d'un paramètre d'un module
Cette opération permet de positionner la valeur d'un paramètre d'un module donné.
Syntaxe :
context <context-name> param set <module-name>:<param-name> <param-value>
Exemple :
# /var/www/dynacase-control/wiff context <context-name> param set foo:bar buzz foo:bar = buzz
9.2.10 Gérer la liste des dépôts de paquets de dynacase-control
control 1.5
Cette opération permet de gérer la liste de dépôts de paquets connus par dynacase-control.
9.2.10.1 Afficher la liste des dépôts de paquets
control 1.5
Syntaxe :
repository list
Exemple :
# /var/www/dynacase-control/wiff repository list dynacase http://dynacase.anakeen.com/3.2/webinst/ local http://localhost/repo/
9.2.10.2 Ajouter un dépôt de paquets
control 1.5
Syntaxe :
repository add <repo-name> <repo-url> [<repo-username> [<repo-password>]]
Exemple :
# /var/www/dynacase-control/wiff repository add foo "http://example.net/foo/" # /var/www/dynacase-control/wiff repository add acme "http://example.net/acme/" "john.doe" "s3cr3t"
Notes :
- Le nom du dépôt ne peut contenir que des caractères alpha-numériques non
accentués et le symbole
_
(underscore). REGEX pour la validation du nom du dépôt :/^[a-zA-Z0-9_]+$/
.
9.2.10.3 Supprimer un dépôt de paquets
control 1.5
Syntaxe :
repository delete <repo-name>
Exemple :
# /var/www/dynacase-control/wiff repository delete foo
Notes :
- La suppression d'un dépôt de dynacase-control ne désactive pas son
utilisation par un contexte. Voir
Désactiver un dépôt sur un contexte
.
9.2.10.4 Supprimer tous les dépôts de paquets
control 1.5
Syntaxe :
repository delete --all
Exemple :
# /var/www/dynacase-control/wiff repository delete --all
Notes :
- La suppression d'un dépôt de dynacase-control ne désactive pas son
utilisation par un contexte. Voir
Désactiver un dépôt sur un contexte
.
9.2.11 Gérer les paramètres de dynacase-control
control 1.5
Cette opération permet de voir/modifier les paramètres de dynacase-control.
9.2.11.1 Liste des paramètres de dynacase-control
wiff-update-host
- Base de l'URL de recherche des mises à jour de dynacase-control.
wiff-update-path
- Chemin pour la recherche des mises à jour de dynacase-control.
wiff-update-file
- Nom du fichier de la dernière version de dynacase-control.
-
wiff-update-login
(optionnel) - Nom d'utilisateur pour la recherche des mises à jour (si authentification HTTP Basic requise).
-
wiff-update-password
(optionnel) - Mot de passe pour la recherche des mises à jour (si authentification HTTP Basic requise).
-
use-proxy
(optionnel) -
Active l'utilisation d'un proxy HTTP pour les requêtes HTTP/FTP émises par dynacase-control.
Valeurs :
yes
ouno
. -
proxy-host
(optionnel) -
Nom d'hôte du proxy HTTP à utiliser si
use-proxy
est activé.Ex.
proxy.example.net
-
proxy-port
(optionnel) -
Port du proxy HTTP à utiliser si
use-proxy
est activé.Ex. :
3128
-
proxy-username
(optionnel) - Nom d'utilisateur pour la connexion au proxy HTTP
proxy-host
. -
proxy-password
(optionnel) - Mot de passe pour la connexion au proxy HTTP
proxy-host
. auto-configuration-sender-interval
-
Intervalle (en nombre de jours) pour la soumission des information des contextes avec
send_configuration
lorsque ceux-ci sont enregistrés avec le compte EEC.Valeurs : entier de
1
à31
. -
local-log
control 1.5 -
Active la journalisation des messages d'erreurs dans le fichier
log/wiff.log
.Valeurs :
yes
ouno
. -
syslog-facility
control 1.5 -
Facility syslog utilisée par les messages d'erreurs émis par dynacase-control.
Voir
Paramétrage syslog
.
9.2.11.2 Voir les paramètres de dynacase-control
control 1.5
Syntaxe :
param show
Exemple :
# /var/www/dynacase-control/wiff param show wiff-update-host = http://dynacase.anakeen.com/ (visible) wiff-update-path = /control/ (visible) wiff-update-file = dynacase-control-current.tar.gz (visible) wiff-update-login = (visible) wiff-update-password = (visible) use-proxy = no (visible) proxy-host = (visible) proxy-port = (visible) proxy-username = (visible) proxy-password = (visible) auto-configuration-sender-interval = 30 (visible) local-log = yes (hidden) syslog-facility = LOG_USER (hidden)
9.2.11.3 Récupérer la valeur d'un paramètre de dynacase-control
control 1.5
Syntaxe :
param get <param-name>
Exemple :
# /var/www/dynacase-control/wiff param get local-log local-log = yes
9.2.11.4 Modifier la valeur d'un paramètre de dynacase-control
control 1.5
Syntaxe :
param set <param-name> <param-value> ['hidden']
Exemple :
# /var/www/dynacase-control/wiff param set local-log no
Notes :
- La visibilité
hidden
permet de masquer la présentation du paramètre dans l'interface Web.
9.2.12 Enregistrer dynacase-control avec son compte EEC
control 1.5
Cette opération permet d'enregistrer dynacase-control avec son compte EEC.
9.2.12.1 Voir le status d'enregistrement
Syntaxe :
register
Exemple :
# /var/www/dynacase-control/wiff register Not registered.
9.2.12.2 Enregistrer dynacase-control avec son compte EEC
control 1.5
Syntaxe :
register <eec-username> <eec-password>
Exemple :
# /var/www/dynacase-control/wiff register "john.doe" "s3cr3t" Successfully registered dynacase-control. # /var/www/dynacase-control/wiff register Registered with EEC username 'john.doe'.
9.2.13 Enregistrer un contexte avec son compte EEC
control 1.5
Cette opération permet d'enregistrer un contexte avec son compte EEC.
Syntaxe :
context <context-name> register
Exemple :
# /var/www/dynacase-control/wiff context test register
Notes :
- L'enregistrement d'un contexte avec son compte EEC nécessite au préalable
que dynacase-control ait été enregistré avec un compte EEC.
Voir
Enregistrer dynacase-control avec son compte EEC
.
9.2.14 Envoi de la configuration au compte EEC
Cette opération permet d'envoyer la configuration de tous les contextes enregistrés avec le compte EEC.
Syntaxe :
send_configuration
Exemple :
# /var/www/dynacase-control/wiff send_configuration
9.2.15 Passer un contexte en mode maintenance
Le mode maintenance d'un contexte permet de bloquer l'accès des utilisateurs au contexte, et de désactiver l'exécution des crons, afin d'effectuer des opérations pour lesquelles il est nécessaire que les données ne soient pas modifiés.
dynacase-control 1.5.2
Cette opération permet d'exécuter le script historique 'wstop' sur un contexte. Dans ce mode, seul l'utilisateur master default a accès au contexte.
Syntaxe :
wstop <context-name>
Exemple :
# /var/www/dynacase-control/wiff wstop test
dynacase-control 1.5.3
Cette opération est dépréciée et doit être remplacée par le lancement de la
commande ./wstop
dans le contexte à l'aide de l'opération
WIFF exec
.
Exemple :
# /var/www/dynacase-control/wiff context test exec ./wstop
Voir :
9.2.16 Sortir un contexte du mode maintenance
La sortie du mode maintenance d'un contexte permet de rétablir l'accès des utilisateurs, et l'exécution des crons, lorsque l'opération de maintenance est terminée.
dynacase-control 1.5.2
Cette opération permet d'exécuter le script historique 'wstart' sur un contexte.
Syntaxe :
wstart <context-name>
Exemple :
# /var/www/dynacase-control/wiff wstart test
dynacase-control 1.5.3
Cette opération est dépréciée et doit être remplacée par le lancement de la
commande ./wstart -m
dans le contexte à l'aide de
l'opération WIFF exec
.
Exemple :
# /var/www/dynacase-control/wiff context test exec ./wstart -m
Voir :
9.2.17 Réinitialiser les catalogues de langue
Cette opération permet d'exécuter le script historique 'whattext' sur un contexte.
Syntaxe :
whattext <context-name>
Exemple :
# /var/www/dynacase-control/wiff whattext test
9.2.18 Ouvrir un shell sous l'uid Apache
Cette opération permet d'ouvrir un shell, ou d'exécuter une commande, sous l'uid de l'utilisateur exécutant le serveur Apache afin d'effectuer manuellement des opérations d'administration spécifiques.
Syntaxe :
context <context-name> shell
context <context-name> exec <command> [<command-options>]
Par défaut, si aucune commande n'est spécifiée, le shell par défaut définit pour l'utilisateur du serveur Apache est lancé. Si l'utilisateur n'a pas de shell associé, il faudra alors spécifier le chemin du shell qu'on souhaite exécuter avec la variante 'exec'. Lors de l'ouverture du shell, ou de l'exécution de la commande, les variables d'environnement suivantes sont pré-positionnés :
-
HOME
: le répertoire racine du contexte. -
wpub
: le répertoire racine du contexte (pour compatibilité scripts post/migr de Dynacase). -
pgservice_core
: le service Postgresql de la base 'core' (pour compatibilité scripts post/migr de Dynacase). -
pgservice_freedom
: le service Postgresql de la base 'freedom' (pour compatibilité scripts post/migr de Dynacase). -
freedom_context
: vaut toujours ”default” (pour compatibilité scripts post/migr de Dynacase).
Exemple :
# /var/www/dynacase-control/wiff context test shell /bin/bash $ id uid=70(_www) gid=70(_www) egid=20(staff) groups=70(_www) $ pwd /var/www/test $ ./FOO/FOO_post U [...] # /var/www/dynacase-control/wiff context test exec /usr/bin/tar -zcf /tmp/archive.tar.gz .
9.3 Opérations verrouillées
control 1.5
Les opérations suivantes sont soumises à l'obtention du verrou exclusif :
- Créer un nouveau contexte
- Installer un module
- Upgrader un module
- Activer un dépôt sur un contexte
- Désactiver un dépôt sur un contexte
- Désactiver tous les dépôts sur un contexte
- Positionner la valeur d'un paramètre d'un module
- Modifier la valeur d'un paramètre de dynacase-control
- Ajouter un dépôt de paquets
- Supprimer un dépôt de paquets
- Supprimer tous les dépôts de paquets
- Voir le status d'enregistrement
- Enregistrer dynacase-control avec son compte EEC
- Enregistrer un contexte avec son compte EEC
- Restaurer l'archive d'un contexte
- Archiver un contexte
- Supprimer une archive de contexte
Le verrou est implémenté avec un appel système flock
sur le fichier
conf/contexts.xml.lock
.
Si le CLI ne peut obtenir un verrou exclusif, alors il se termine avec un exit
code 100
et affiche le message Error locking Dynacase-Control: Already
locked by process with pid 'xxx'
si le verrou est pris par un autre CLI, ou
Error locking Dynacase-Control: xxx
pour une erreur générale (e.g. problème
dans l'accès au fichier conf/contexts.xml.lock
).