141 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			4.2 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 la valeur par défaut des variables prédéfinies
 | |
|     --write-vars
 | |
|         Forcer l'écriture des valeurs actuelles des variables dans le fichier
 | |
|         .runsconfig, ce qui permet d'éviter de les spécifier à chaque fois avec
 | |
|         l'option -v
 | |
|     -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."
 | |
| }
 | |
| function __templatectl_display_help() { display_help; }
 | |
| 
 | |
| set_defaults runs
 | |
| # 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
 | |
| # 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
 | |
| hostname="${host%%.*}"
 | |
| TEMPLATE_VARS=(
 | |
|     host hostname
 | |
| )
 | |
| function update_template_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"
 | |
|     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
 | |
| )
 | |
| __templatectl_parseopts "$@" && \
 | |
|     set -- "${args[@]}" || die "$args"
 | |
| 
 | |
| # répertoire source
 | |
| setx __templatectl_srcdir=templatesrc runsconfig
 | |
| # répertoire d'hôte
 | |
| [ -n "$__templatectl_destdir" ] || __templatectl_destdir=.
 | |
| 
 | |
| # charger les variables
 | |
| __runsconfig_vars="$__templatectl_destdir/.runsconfig"
 | |
| if [ -f "$__runsconfig_vars" ]; then
 | |
|     source "$__runsconfig_vars"
 | |
|     for __var in "${__runsconfig[@]}"; do
 | |
|         splitvar "$__var" __name __value
 | |
|         update_template_var "$__name" "$__value"
 | |
|     done
 | |
| fi
 | |
| 
 | |
| # mettre à jour les variables
 | |
| __modified=
 | |
| for __var in "${__vars[@]}"; do
 | |
|     splitvar "$__var" __name __value
 | |
|     update_template_var "$__name" "$__value" && __modified=1
 | |
| done
 | |
| 
 | |
| # enregistrer les valeurs des variables
 | |
| if [ -n "$__modified" -o "$__write_vars" ]; then
 | |
|     >"$__runsconfig_vars"
 | |
|     echo "__runsconfig=(" >>"$__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
 | |
|     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 "$@"
 | 
