169 lines
5.6 KiB
Bash
Executable File
169 lines
5.6 KiB
Bash
Executable File
#!/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
|
|
urequire DEFAULTS runs template
|
|
|
|
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.
|
|
-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
|
|
répertoire d'hôte.
|
|
--list-vars
|
|
Afficher pour information les valeurs par défaut des variables de
|
|
template.
|
|
--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à.
|
|
-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"
|
|
}
|
|
function __templatectl_display_help() { display_help; }
|
|
|
|
## Valeurs par défaut des variables de template
|
|
set_defaults runs
|
|
|
|
# essayer de déterminer l'hôte à partir du répertoire courant
|
|
DEFAULT_HOST=
|
|
array_split __hostsdirs "$RUNSHOSTSPATH" :
|
|
setx __cwd=pwd
|
|
for __hostsdir in "${__hostsdirs[@]}"; do
|
|
setx __hostsdir=abspath "$__hostsdir"
|
|
if [ "${__cwd#$__hostsdir/}" != "$__cwd" ]; then
|
|
DEFAULT_HOST="${__cwd#$__hostsdir/}"
|
|
DEFAULT_HOST="${DEFAULT_HOST%%/*}"
|
|
break
|
|
fi
|
|
done
|
|
|
|
# sinon lire l'environnement
|
|
if [ -z "$DEFAULT_HOST" ]; then
|
|
runs_initdomains
|
|
setx DEFAULT_HOST=myhost
|
|
splithost "$DEFAULT_HOST" __hostname __domain
|
|
if [ -z "$__domain" ]; then
|
|
DEFAULT_HOST="$(runs_find_host "$DEFAULT_HOST")"
|
|
splithost "$DEFAULT_HOST" __hostname __domain
|
|
fi
|
|
[ -n "$__domain" ] || DEFAULT_HOST="$(runs_add_domain "$DEFAULT_HOST")"
|
|
fi
|
|
|
|
DEFAULT_TEMPLATE_VARS=(
|
|
hostname= # mettre cette variables AVANT host
|
|
host=
|
|
)
|
|
|
|
TEMPLATE_VARS=()
|
|
function update_var() {
|
|
# 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"
|
|
|
|
# Valeurs par défaut
|
|
case "$1" in
|
|
host) [ -n "$2" ] || set -- "$1" "$(myhost)";;
|
|
esac
|
|
|
|
# Mettre à jour la variable
|
|
setv "$1" "$2"
|
|
|
|
# Mettre à jour des variables dépendantes
|
|
case "$1" in
|
|
host) update_var 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
|
|
)
|
|
__templatectl_parseopts "$@" && \
|
|
set -- "${args[@]}" || die "$args"
|
|
|
|
# répertoire de template
|
|
setx __templatectl_srcdir=templatesrc runsconfig
|
|
|
|
# répertoire d'hôte
|
|
[ -n "$__templatectl_destdir" ] || __templatectl_destdir=.
|
|
setx __templatectl_destdir=abspath "$__templatectl_destdir"
|
|
|
|
# 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[@]}")
|
|
__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"
|
|
|
|
# mettre à jour les variables
|
|
__modified=
|
|
for __var in "${__vars[@]}"; do
|
|
splitvar "$__var" __name __value
|
|
update_var "$__name" "$__value" && __modified=1
|
|
done
|
|
|
|
# enregistrer les valeurs des variables
|
|
if [ -n "$__write_vars" ]; then
|
|
[ -f "$__runsconfig_vars" ] &&
|
|
die "Refus d'écraser le fichier existant $(ppath "$__runsconfig_vars")"
|
|
|
|
echo "# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8" >"$__runsconfig_vars"
|
|
echo "__template_vars=(" >>"$__runsconfig_vars"
|
|
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"
|
|
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"
|
|
__templatectl_do "$@"
|