nutools/runsconfig

162 lines
5.2 KiB
Plaintext
Raw Normal View History

2014-10-23 17:08:06 +04:00
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
2014-10-24 01:04:17 +04:00
urequire DEFAULTS runs template
2014-10-23 17:08:06 +04:00
function display_help() {
uecho "$scriptname: Gérer un répertoire d'hôte de runs
USAGE
$scriptname [options]
OPTIONS
-d, --destdir DESTDIR
Spécifier le répertoire d'hôte dans lequel copier les fichiers.
-l, --list
Lister les templates disponibles.
-m, --merge
Copier les templates spécifiés dans le répertoire d'hôte s'il n'y
existent pas déjà. Les templates ayant l'extension '.template' doivent
être demandés explicitement. Sinon, ils sont ignorés.
2014-10-23 17:08:06 +04:00
-z, --unmerge
Supprimer les fichiers du répertoire d'hôte s'ils n'ont pas été modifiés
par rapport aux templates.
-C, --clean
Supprimer les répertoires vides dans le répertoire de référence. Peut
être utile après -z
-g, --diff
Afficher les différences entre les templates et les fichiers du
2014-10-24 01:04:17 +04:00
répertoire d'hôte.
--list-vars
Afficher pour information les valeurs par défaut des variables de
template.
2014-10-24 01:04:17 +04:00
--write-vars
Ecrire dans le fichier .runsconfig les valeurs par défaut des variables,
ce qui permet d'éviter de les spécifier à chaque fois avec l'option -v
Le fichier n'est pas écrasé s'il existe déjà.
2014-10-24 01:04:17 +04:00
-v, --var NAME=VALUE
Spécifier la valeur d'une variable. Il est possible de spécifier des
valeurs qui ne sont pas dans la liste prédéfinie. Par défaut, il s'agit
d'une variable de template, utilisée pour mettre à jour la copie locale
d'un template avec l'option --merge
Dans le fichier .runsconfig, les valeurs des variables de template n'est
pas censée changer. Lors de la copie des templates avec --merge, chaque
occurence de @@VAR@@ dans un template est remplacée dans la copie locale
par la valeur de la variable de template VAR"
2014-10-23 17:08:06 +04:00
}
function __templatectl_display_help() { display_help; }
## Valeurs par défaut des variables de template
2014-10-24 01:04:17 +04:00
set_defaults runs
2014-10-24 01:04:17 +04:00
# essayer de déterminer l'hôte à partir du répertoire courant
host=
array_split __hostsdirs "$RUNSHOSTSPATH" :
setx __cwd=pwd
for __hostsdir in "${__hostsdirs[@]}"; do
setx __hostsdir=abspath "$__hostsdir"
if [ "${__cwd#$__hostsdir/}" != "$__cwd" ]; then
host="${__cwd#$__hostsdir/}"
host="${host%%/*}"
break
fi
done
2014-10-24 01:04:17 +04:00
# sinon lire l'environnement
if [ -z "$host" ]; then
runs_initdomains
setx host=myhost
splithost "$host" hostname domain
if [ -z "$domain" ]; then
host="$(runs_find_host "$host")"
splithost "$host" hostname domain
fi
[ -n "$domain" ] || host="$(runs_add_domain "$host")"
fi
2014-10-24 01:04:17 +04:00
hostname="${host%%.*}"
DEFAULT_TEMPLATE_VARS=(
host="$host"
hostname="$hostname"
2014-10-24 01:04:17 +04:00
)
TEMPLATE_VARS=()
function update_var() {
2014-10-24 01:04:17 +04:00
# mettre à jour la valeur d'une variable en tenant compte de certaines
# dépendances. par exemple, si on modifie host, il faut mettre à jour
# hostname.
local __orig_value="${!1}"
array_addu TEMPLATE_VARS "$1"
setv "$1" "$2"
case "$1" in
host) hostname="${host%%.*}";;
esac
[ "$2" != "$__orig_value" ]
}
__vars=()
__list_vars=
__write_vars=
__TEMPLATECTL_SUPPLOPTS=(
-v:,--var: __vars
--list-vars __list_vars=1
--write-vars __write_vars=1
)
2014-10-23 17:08:06 +04:00
__templatectl_parseopts "$@" && \
set -- "${args[@]}" || die "$args"
# répertoire de template
setx __templatectl_srcdir=templatesrc runsconfig
2014-10-23 22:46:39 +04:00
# répertoire d'hôte
[ -n "$__templatectl_destdir" ] || __templatectl_destdir=.
setx __templatectl_destdir=abspath "$__templatectl_destdir"
2014-10-23 17:08:06 +04:00
# charger les variables. important: la liste des variables définie dans le
# fichier .runsconfig prend la précédence sur la liste définie par défaut
__template_vars=("${DEFAULT_TEMPLATE_VARS[@]}")
2014-10-24 01:04:17 +04:00
__runsconfig_vars="$__templatectl_destdir/.runsconfig"
[ -f "$__runsconfig_vars" ] && source "$__runsconfig_vars"
for __var in "${__template_vars[@]}"; do
splitvar "$__var" __name __value
update_var "$__name" "$__value"
done
array_contains TEMPLATE_VARS configdir || update_var configdir "$__templatectl_destdir"
2014-10-24 01:04:17 +04:00
# mettre à jour les variables
__modified=
for __var in "${__vars[@]}"; do
splitvar "$__var" __name __value
update_var "$__name" "$__value" && __modified=1
2014-10-24 01:04:17 +04:00
done
# enregistrer les valeurs des variables
if [ -n "$__write_vars" ]; then
[ -f "$__runsconfig_vars" ] &&
die "Refus d'écraser le fichier existant $(ppath "$__runsconfig_vars")"
2014-10-24 01:04:17 +04:00
>"$__runsconfig_vars"
echo "__template_vars=(" >>"$__runsconfig_vars"
2014-10-24 01:04:17 +04:00
for __var in "${TEMPLATE_VARS[@]}"; do
echo_setv "$__var=${!__var}" >>"$__runsconfig_vars"
done
echo ")" >>"$__runsconfig_vars"
fi
# afficher les variables
if [ -n "$__list_vars" ]; then
echo "# template vars"
2014-10-24 01:04:17 +04:00
for __var in "${TEMPLATE_VARS[@]}"; do
echo_setv "$__var=${!__var}"
done
fi
# gérer les fichiers template et locaux
if [ -z "$__templatectl_opt" -a -z "$__list_vars" -a -z "$__write_vars" ]; then
__templatectl_auto=1
fi
[ -d "$__templatectl_destdir" ] || die "$__templatectl_destdir: répertoire introuvable"
2014-10-23 17:08:06 +04:00
__templatectl_do "$@"