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 "$@"
 |