211 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			211 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash
 | |
| # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
 | |
| 
 | |
| function display_help() {
 | |
|     uecho "$scriptname: gérer les variables de répertoire
 | |
| 
 | |
| USAGE
 | |
|     $scriptname [options] [dir [name=value...]]
 | |
| 
 | |
| Par défaut, mettre à jour les variables du répertoire avec les définitions
 | |
| données. Attention! Les définitions sont insérées ${COULEUR_JAUNE}*telles quelles*${COULEUR_NORMALE} dans le
 | |
| fichier. Par exemple, pour définir une variable qui contient des espaces,
 | |
| on pourra faire:
 | |
|     $scriptname /path/to/dir 'var=\"value with spaces\"'
 | |
| pour définir un tableau:
 | |
|     $scriptname /path/to/dir 'array=(first second)'
 | |
| 
 | |
| OPTIONS
 | |
|     -i
 | |
|         Afficher la description du répertoire. C'est l'action par défaut si ce
 | |
|         script est lancé *sans argument*
 | |
|     -d
 | |
|         Afficher toutes les variables définies pour le répertoire 'dir'.
 | |
|     -x 'cmds;...'
 | |
|         Exécuter les commandes dans le contexte des variables définies pour le
 | |
|         répertoire.
 | |
|     -e
 | |
|         Editer les variables du répertoire
 | |
|     --local-vars
 | |
|         Avec -d, ajouter des directives 'local' aux définitions de variables
 | |
|     -A
 | |
|         Avec -d et -x, considérer les variables de tous les répertoires parents
 | |
|         jusqu'à la racine. Pour ne considérer que les variables du répertoire
 | |
|         spécifié (par défaut), utiliser --local-only
 | |
|     --help-vars
 | |
|         Afficher une descriptions des variables spécifiques aux outils de nutools"
 | |
| }
 | |
| function display_help_vars() {
 | |
|     local OENC="$UTF8"
 | |
|     uecho "\
 | |
| udir_desc   Description du projet contenu dans ce répertoire, affichée avec
 | |
|             'udir -i'
 | |
| udir_note   Note importante concernant le contenu de ce répertoire.
 | |
|             Cette note doit être affichée automatiquement quand on entre dans
 | |
|             le répertoire.
 | |
| udir_types  Liste de types pour ce répertoire. Les valeurs valides sont:
 | |
|               uinst        -- un répertoire installable avec uinst.
 | |
|               uinst:legacy -- un répertoire installable avec uinst en utilisant
 | |
|                               l'ancien fichier de configuration .uinst.conf
 | |
|               uinst:python -- un répertoire de projet python à installer avec
 | |
|                               'python setup.py'
 | |
| uinc        Mode de dépliage des fichiers avant le déploiement. Les valeurs
 | |
|             valides sont:
 | |
|               false   -- ne jamais faire dépliage/repliage automatique
 | |
|               release -- ne faire le dépliage que lors de 'release -u'
 | |
|               true    -- faire systématiquement le dépliage/repliage pour
 | |
|                          chaque opération
 | |
| uinc_options
 | |
|             Options à passer automatiquement à uinc quand il traite ce
 | |
|             répertoire
 | |
| uinc_args   Liste des fichiers à traiter par uinc en mode automatique
 | |
| config_scripts
 | |
|             Liste de scripts de configuration à lancer avant déploiement,
 | |
|             avec les droits de l'utilisateur qui lance uinst.
 | |
|             Chacun de ces script est exécuté avec en unique argument un fichier
 | |
|             de configuration, qui représente la somme de tous les paramètres
 | |
|             qui ont été spécifiés.
 | |
|             Les script peuvent augmenter ce fichier de configuration avec
 | |
|             d'autres valeurs s'ils le désirent. Ces nouvelles valeurs pourront
 | |
|             être utilisées par les scripts suivants, ou les scripts root.
 | |
|             Pour annuler le déploiement, les scripts de configuration peuvent
 | |
|             créer un fichier nommé 'abort' dans le répertoire qui contient le
 | |
|             fichier de configuration. Par défaut, la variable ABORT contient le
 | |
|             chemin vers ce fichier, sauf si cette variable a été surchargée par
 | |
|             des paramètres du fichier de configuration.
 | |
| configure_variables
 | |
|             Liste de variables configurables. Pour chacune des variables de
 | |
|             ce tableau, un tableau nommé configure_\${name}_for contient la
 | |
|             liste des fichiers qui doivent être mis à jour. Dans ce fichiers,
 | |
|             toutes les occurences de @@name@@ sont remplacées par la valeur
 | |
|             de la variable \$name.
 | |
| install_profiles
 | |
|             Faut-il installer les profils pour l'utilisateur courant dans
 | |
|             ~/etc
 | |
| profiledir  Répertoire source pour les fichiers à copier dans ~/etc/profile.d
 | |
| bashrcdir   Répertoire source pour les fichiers à copier dans ~/etc/bashrc.d
 | |
| defaultdir  Répertoire source pour les fichiers à copier dans ~/etc/default.d
 | |
| copy_files  Faut-il copier les fichiers sources dans le répertoire de
 | |
|             destination? Les fichiers sources et le répertoire de
 | |
|             destination sont calculés à partir des valeurs des variables
 | |
|             \$srcdir, \$files, \$destdir
 | |
| srcdir      Si \$copy_files==true, répertoire source pour la copie des fichiers.
 | |
| files       Liste de fichiers à copier, exprimés par rapport à srcdir.
 | |
|             Si ce tableau est vide, tout le répertoire courant est déployé
 | |
|             et écrase la destination. Sinon, le répertoire de destination
 | |
|             n'est pas écrasé et seuls les fichiers mentionnés sont copiés.
 | |
| destdir     Répertoire de base pour la copie des fichiers. Le répertoire de
 | |
|             destination proprement dit est \$destdir/\$dirname où \$dirname est
 | |
|             le nom de base de ce répertoire si \$files est un tableau
 | |
|             vide. Sinon, la destination est \$destdir.  \$dest contient le
 | |
|             répertoire de destination effectif.
 | |
| owner       Propriétaire et groupe des fichiers après le déploiement. Le
 | |
|             propriétaire et le groupe sont appliqués de façon récursive à tous
 | |
|             les fichiers déployés.
 | |
| modes       Liste de modes pour les fichiers après le déploiement. Le
 | |
|             premier élément de ce tableau contient les modes à appliquer de
 | |
|             façon récursive à tous les fichiers déployés. Les éléments suivants
 | |
|             doivent être de la forme path:mode, où path est un chemin relatif à
 | |
|             \$dest. Par contre, dans ce cas la modification du mode ne se fait
 | |
|             pas de manière récursive, et il faut spécifier chaque fichier
 | |
|             concerné séparément.
 | |
| root_scripts
 | |
|             Liste de scripts de configuration à lancer après le déploiement,
 | |
|             avec les droits de root. Si des fichiers sont copiés pendant le
 | |
|             déploiement, les scripts sont lancés dans le répertoire de
 | |
|             destination."
 | |
| }
 | |
| 
 | |
| source "$(dirname "$0")/ulib/ulib" &&
 | |
| urequire DEFAULTS udir ||
 | |
| exit 1
 | |
| 
 | |
| action=auto
 | |
| parse_opts "${PRETTYOPTS[@]}" \
 | |
|     --help '$exit_with display_help' \
 | |
|     --help-vars '$exit_with display_help_vars' \
 | |
|     -u,--update action=update \
 | |
|     -i,--show-desc action=desc \
 | |
|     --show-note action=desc:note \
 | |
|     -d,--dump action=dump \
 | |
|     -x,--eval action=eval \
 | |
|     -e,--edit action=edit \
 | |
|     --local-vars local_vars \
 | |
|     -A,--all-parents all_parents \
 | |
|     --local-only local_only \
 | |
|     @ args -- "$@" && set -- "${args[@]}" || die "$args"
 | |
| 
 | |
| function check_dir() { [ -d "$1" ] || die "$1: Répertoire non trouvé"; }
 | |
| 
 | |
| [ -z "$all_parents" -a -z "$local_only" ] && local_only=1
 | |
| [ -z "$*" -a "$action" == "auto" ] && action=desc
 | |
| [ "$action" == "auto" ] && action=update
 | |
| udir="${1:-.}"; shift
 | |
| 
 | |
| if [ "$action" == "update" ]; then
 | |
|     check_dir "$udir"
 | |
|     if [ -z "$*" ]; then
 | |
|         # pas de variable à mettre à jour, afficher simplement la note si elle existe
 | |
|         udir_check "$udir" && 
 | |
|         udir_eval "$udir" '[ -n "$udir_note" ] && eecho "$(ppath "$udir"): $udir_note"'
 | |
|     else
 | |
|         # mettre à jour les variables
 | |
|         udir_create_maybe "$udir"
 | |
|         udir_update "$udir" "$@"
 | |
|         check_verbosity -c && udir_dump "$udir" 1>&2
 | |
|     fi
 | |
| 
 | |
| elif [ "$action" == "desc" ]; then
 | |
|     check_dir "$udir"
 | |
|     udir_desc=
 | |
|     udir_note=
 | |
|     udir_ppath="$(ppath "$udir")"
 | |
|     if [ "$udir_ppath" == "." ]; then
 | |
|         udir_ppath="$(abspath "$udir_ppath")"
 | |
|         udir_ppath="$(basename "$udir_ppath")"
 | |
|     fi
 | |
|     udir_eval "$udir" '
 | |
| if [ -n "$udir_desc" -o -n "$udir_note" ]; then
 | |
|     eecho "$udir_ppath: $udir_desc"
 | |
|     [ -n "$udir_note" ] && estepe "$udir_note"
 | |
| fi
 | |
| '
 | |
| 
 | |
| elif [ "$action" == "desc:note" ]; then
 | |
|     check_dir "$udir"
 | |
|     udir_note=
 | |
|     udir_eval "$udir" '
 | |
| maxi="${COLUMNS:-80}"
 | |
| line0="== $(basename "$PWD") "
 | |
| line1=
 | |
| while [ ${#line0} -lt $maxi ]; do line0="$line0="; done
 | |
| while [ ${#line1} -lt $maxi ]; do line1="$line1="; done
 | |
| if [ -n "$udir_note" ]; then
 | |
|     eecho "$COULEUR_ROUGE$line0$COULEUR_NORMALE
 | |
| $udir_note
 | |
| $COULEUR_ROUGE$line1$COULEUR_NORMALE"
 | |
| fi
 | |
| '
 | |
| 
 | |
| elif [ "$action" == "dump" ]; then
 | |
|     [ -n "$local_vars" ] && opts=(-l) || opts=()
 | |
|     check_dir "$udir"
 | |
|     if [ -n "$all_parents" ]; then
 | |
|         udir_dump_all "${opts[@]}" "$udir"
 | |
|     elif [ -n "$local_only" ]; then
 | |
|         udir_dump "${opts[@]}" "$udir"
 | |
|     fi
 | |
| 
 | |
| elif [ "$action" == "eval" ]; then
 | |
|     check_dir "$udir"
 | |
|     if [ -n "$all_parents" ]; then
 | |
|         udir_eval_all "$udir" "$@"
 | |
|     elif [ -n "$local_only" ]; then
 | |
|         udir_eval "$udir" "$@"
 | |
|     fi
 | |
| 
 | |
| elif [ "$action" == "edit" ]; then
 | |
|     check_dir "$udir"
 | |
|     udir_edit "$udir"
 | |
| fi
 |