#!/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 "$@"