512 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			512 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| ##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
 | |
| ## Fonction de support pour gérer le déploiement d'artifacts
 | |
| ##@cooked nocomments
 | |
| 
 | |
| ################################################################################
 | |
| # API publique
 | |
| 
 | |
| function deploy_query() {
 | |
|     deploy_query_once "$@" && return 0
 | |
|     if [ -n "$QUERYVARS" ]; then
 | |
|         deploy_query_recursive "$@" && return 0
 | |
|     fi
 | |
|     return 1
 | |
| }
 | |
| 
 | |
| function deploy_query_recursive() {
 | |
|     local DFILE
 | |
|     for DFILE in "${QUERYVARS[@]}"; do
 | |
|         (
 | |
|             deploy_loadconf --no-auto-update
 | |
|             deploy_query_once "$@" && exit 0
 | |
|             if [ -n "$QUERYVARS" ]; then
 | |
|                 deploy_query_recursive "$@" && exit 0
 | |
|             fi
 | |
|             exit 1
 | |
|         ) && return 0
 | |
|     done
 | |
|     return 1
 | |
| }
 | |
| 
 | |
| function deploy_query_once() {
 | |
|     # Afficher le résultat d'une requête
 | |
|     local alv
 | |
|     eval "set -- $(getopt -ov: -lallow-vars: -- "$@")"
 | |
|     while [ -n "$1" ]; do
 | |
|         case "$1" in
 | |
|         -v|--allow-vars)
 | |
|             array_split alv "$2" ,
 | |
|             shift; shift
 | |
|             ;;
 | |
|         --) shift; break;;
 | |
|         *) break;;
 | |
|         esac
 | |
|     done
 | |
| 
 | |
|     local qtype="$1" otype="$2" ltype="$3" profile="$4" format="${5:-shell}" term="$6"
 | |
|     local -a vs; local object type link
 | |
| 
 | |
|     case "$qtype" in
 | |
|     DEST|SOURCE)
 | |
|         if [ -n "$otype" ]; then
 | |
|             deploy_is_type "$otype" || {
 | |
|                 qvals false "$otype: invalid type"
 | |
|                 return 2
 | |
|             }
 | |
|         fi
 | |
|         ;;
 | |
|     *)
 | |
|         if [ -n "$qtype" ]; then
 | |
|             deploy_is_type "$qtype" || {
 | |
|                 qvals false "$qtype: invalid type"
 | |
|                 return 3
 | |
|             }
 | |
|         fi
 | |
|         ;;
 | |
|     esac
 | |
|     if [ -n "$ltype" ]; then
 | |
|         deploy_is_link "$ltype" || {
 | |
|             qvals false "$ltype: invalid link type"
 | |
|             return 4
 | |
|         }
 | |
|     fi
 | |
|     [ -n "$term" ] || {
 | |
|         qvals false "search term required"
 | |
|         return 5
 | |
|     }
 | |
| 
 | |
|     case "$qtype" in
 | |
|     DEST)
 | |
|         edebug "=== search type DEST"
 | |
|         edebug "term=$term, otype=$otype"
 | |
|         deploy_search_artifact object type "$term" "$otype" host || {
 | |
|             qvals false "artifact not found"
 | |
|             return 1
 | |
|         }
 | |
|         edebug "object=$object, type=$type"
 | |
|         deploy_search_link link "$type" "$ltype" || {
 | |
|             qvals false "link not found"
 | |
|             return 1
 | |
|         }
 | |
|         
 | |
|         deploy_show_values object object "$format" shell alv
 | |
|         deploy_show_values type otype "$format" shell alv
 | |
|         deploy_show_values link ltype "$format" shell alv
 | |
|         deploy_show_links "$object" "$link" "$profile" "$format" "" alv
 | |
|         echo true
 | |
|         return 0
 | |
|         ;;
 | |
|     SOURCE)
 | |
|         # XXX implémenter
 | |
|         echo true
 | |
|         return 0
 | |
|         ;;
 | |
|     *)
 | |
|         if deploy_search_artifact object type "$term" "$qtype"; then
 | |
|             deploy_copy_object_values vs "$object" "$type"
 | |
|             deploy_show_values object object "$format" shell alv
 | |
|             deploy_show_values type otype "$format" shell alv
 | |
|             deploy_show_values vs "$type" "$format" ""  alv
 | |
|             deploy_show_attrs "$object" "$type" "$format" alv
 | |
|             echo true
 | |
|             return 0
 | |
|         fi
 | |
|         qvals false "artifact not found"
 | |
|         return 1
 | |
|         ;;
 | |
|     esac
 | |
| }
 | |
| 
 | |
| function deploy_setconf() {
 | |
|     local confname="$1" confdir="$2"
 | |
|     if [ -n "$confdir" ]; then
 | |
|         confdir="$(abspath "$confdir")"
 | |
|         if [[ "$confname" == */* ]] || [[ "$confname" == *.* ]]; then
 | |
|             local d="$(abspath "$(dirname -- "$confname")")"
 | |
|             if [ "$d" != "$confdir" ]; then
 | |
|                 CONFNAME="$confname"
 | |
|                 SFILE="$CONFNAME"
 | |
|                 DFILE="${CONFNAME%.conf}.vars"
 | |
|                 return
 | |
|             fi
 | |
|             confname="$(basename -- "$confname" .conf)"
 | |
|         fi
 | |
|         CONFNAME="${confname:-deploy}"
 | |
|         IFILE="$confdir/init.conf"
 | |
|         SFILE="$confdir/$CONFNAME.conf"
 | |
|     else
 | |
|         CONFNAME="${confname:-deploy}"
 | |
|         IFILE=
 | |
|         SFILE=
 | |
|     fi
 | |
|     if is_root; then
 | |
|         DFILE="/var/local/deploy/$CONFNAME.vars"
 | |
|     else
 | |
|         DFILE="$HOME/etc/deploy/$CONFNAME.vars"
 | |
|     fi
 | |
| }
 | |
| 
 | |
| function deploy_loadconf() {
 | |
|     # charger la configuration. deploy_setconf() DOIT être appelé avant
 | |
|     if [ "$1" != --no-auto-update ]; then (
 | |
|         # mettre à jour le cas échéant le fichier des variables
 | |
|         DEPLOY_SRCDIR=; set_defaults deploy
 | |
|         [ -n "$DEPLOY_SRCDIR" ] || DEPLOY_SRCDIR=~/wop/deploy
 | |
|         [ -x "$DEPLOY_SRCDIR/query" ] && "$DEPLOY_SRCDIR/query" --nop -c "$CONFNAME"
 | |
|     ); fi
 | |
|     [ -f "$DFILE" ] && source "$DFILE" || return 1
 | |
| }
 | |
| 
 | |
| function deploy_search_artifact() {
 | |
|     local do="$1" dt="$2" term="$3" type="$4" nottype="$5"
 | |
|     local -a ts os vs; local t o v object
 | |
| 
 | |
|     deploy_copy_types ts
 | |
|     for t in "${ts[@]}"; do
 | |
|         [ -n "$type" -a "$t" != "$type" ] && continue
 | |
|         [ -n "$nottype" -a "$t" == "$nottype" ] && continue
 | |
| 
 | |
|         object=
 | |
|         if deploy_is_object "$term" "$t"; then
 | |
|             # on a déjà le bon identifiant
 | |
|             object="$term"
 | |
|         else
 | |
|             # chercher un identifiant correspondant à la valeur
 | |
|             deploy_copy_objects os "$t"
 | |
|             for o in "${os[@]}"; do
 | |
|                 deploy_copy_object_values vs "$o" "$t"
 | |
|                 if array_contains vs "$term"; then
 | |
|                     object="$o"
 | |
|                     break
 | |
|                 fi
 | |
|                 if [[ "$term" != *.* ]]; then
 | |
|                     for v in "${vs[@]}"; do
 | |
|                         if [ "${v%%.*}" == "$term" ]; then
 | |
|                             object="$o"
 | |
|                             break
 | |
|                         fi
 | |
|                     done
 | |
|                 fi
 | |
|             done
 | |
|             if [ -z "$object" ]; then
 | |
|                 # essayer sans tenir compte de la casse
 | |
|                 for o in "${os[@]}"; do
 | |
|                     if [ "${o,,}" == "${term,,}" ]; then
 | |
|                         object="$o"
 | |
|                         break
 | |
|                     fi
 | |
|                     deploy_copy_object_values vs "$o" "$t"
 | |
|                     for v in "${vs[@]}"; do
 | |
|                         if [ "${v,,}" == "${term,,}" ]; then
 | |
|                             object="$o"
 | |
|                             break
 | |
|                         fi
 | |
|                     done
 | |
|                     if [[ "$term" != *.* ]]; then
 | |
|                         for v in "${vs[@]}"; do
 | |
|                             v="${v%%.*}"
 | |
|                             if [ "${v,,}" == "${term,,}" ]; then
 | |
|                                 object="$o"
 | |
|                                 break
 | |
|                             fi
 | |
|                         done
 | |
|                     fi
 | |
|                 done
 | |
|             fi
 | |
|         fi
 | |
|         if [ -n "$object" ]; then
 | |
|             upvars "$do" "$object" "$dt" "$t"
 | |
|             return 0
 | |
|         fi
 | |
|     done
 | |
|     return 1
 | |
| }
 | |
| 
 | |
| function deploy_search_link() {
 | |
|     local dl="$1" type="$2" link="$3"
 | |
|     local -a ls ts; local l
 | |
|     deploy_copy_links ls
 | |
|     for l in "${ls[@]}"; do
 | |
|         [ -n "$link" -a "$l" != "$link" ] && continue
 | |
| 
 | |
|         deploy_copy_link_types ts "$l"
 | |
|         if array_contains ts "$type"; then
 | |
|             upvar "$dl" "$l"
 | |
|             return 0
 | |
|         fi
 | |
|     done
 | |
|     return 1
 | |
| }
 | |
| 
 | |
| function deploy_show_values() {
 | |
|     if [ -n "$5" ]; then
 | |
|         if ! array_isempty "$5"; then
 | |
|             array_contains "$5" "$2" || return
 | |
|         fi
 | |
|     fi
 | |
|     local -a __sv_vs; array_copy __sv_vs "$1"
 | |
|     local -a vs; array_copy vs __sv_vs
 | |
|     local t="$2" f="${3:-shell}" ff="$4"
 | |
|     [ -n "$ff" -a "$f" != "$ff" ] && return
 | |
| 
 | |
|     case "$f" in
 | |
|     shell)
 | |
|         [ -n "$5" ] && echo "$t=()"
 | |
|         deploy_dump_values "$t" vs
 | |
|         ;;
 | |
|     line) array_to_lines vs;;
 | |
|     *) array_join vs "$f";;
 | |
|     esac
 | |
| }
 | |
| 
 | |
| function deploy_show_attrs() {
 | |
|     if [ -n "$4" ]; then
 | |
|         local -a __dsa_alv; array_copy __dsa_alv "$4"
 | |
|         local -a alv; array_copy alv __dsa_alv
 | |
|     fi
 | |
|     local o="$1" t="$2" f="${3:-shell}" ff=shell
 | |
|     [ -n "$ff" -a "$f" != "$ff" ] && return
 | |
| 
 | |
|     local -a ons gns ans vs; local an
 | |
|     deploy_prepare_copy_attrs ons gns "$o" "$t"
 | |
|     deploy_copy_attr_names ans "$o" "$t" ons gns
 | |
|     for an in "${ans[@]}"; do
 | |
|         if [ -n "$4" ]; then
 | |
|             if ! array_isempty "$4"; then
 | |
|                 array_contains alv "$an" || continue
 | |
|             fi
 | |
|             [ "$f" == shell ] && echo "$an=()"
 | |
|         fi
 | |
|         deploy_copy_attr_values vs "$an" "$o" "$t" ons
 | |
|         deploy_dump_values "$an" vs
 | |
|     done
 | |
| }
 | |
| 
 | |
| function deploy_show_links() {
 | |
|     if [ -n "$6" ]; then
 | |
|         local -a __dsl_alv; array_copy __dsl_alv "$6"
 | |
|         local -a alv; array_copy alv __dsl_alv
 | |
|     fi
 | |
|     local o="$1" l="$2" profile="$3" f="${4:-shell}" ff="$5"
 | |
|     local -a ps pons pgns ons gns ans ovs os; local p an av o
 | |
|     [ -n "$ff" -a "$f" != "$ff" ] && return
 | |
| 
 | |
|     deploy_copy_profiles ps 1
 | |
|     for p in "${ps[@]}"; do
 | |
|         [ -n "$profile" -a "$p" != "$profile" ] && continue
 | |
|         deploy_show_values p profile "$format" shell alv
 | |
| 
 | |
|         deploy_prepare_copy_link_attrs pons pgns ons gns "$o" "$l" "$p"
 | |
|         deploy_copy_link_attr_names ans "$o" "$l" "$p" pons pgns ons gns
 | |
|         for an in "${ans[@]}"; do
 | |
|             deploy_copy_link_attr_values avs "$an" "$o" "$l" "$p" pons pgns ons gns
 | |
|             if [ "$an" == host ]; then
 | |
|                 # toujours montrer host
 | |
|                 #deploy_show_values avs "$an" "$f" "$ff"
 | |
|                 ovs=()
 | |
|                 for av in "${avs[@]}"; do
 | |
|                     deploy_copy_object_values os "$av" host
 | |
|                     array_extendu ovs os
 | |
|                 done
 | |
|                 deploy_show_values ovs host "$f" "$ff" alv
 | |
|             else
 | |
|                 deploy_show_values avs "$an" "$f" shell alv
 | |
|             fi
 | |
|         done
 | |
|     done
 | |
| }
 | |
| 
 | |
| ################################################################################
 | |
| # Fonctions bas niveau
 | |
| 
 | |
| function deploy_is_profile() {
 | |
|     # tester si $1 est un profil valide
 | |
|     [ -z "$1" ] && return 0 # pas de profil == profil valide
 | |
|     array_contains LISTOF_PROFILES "$1"
 | |
| }
 | |
| function deploy_copy_profiles() {
 | |
|     # copier la liste des profils valides dans le tableau $1
 | |
|     # si LISTOF_PROFILES est vide et que $2!="", alors mettre une chaine vide
 | |
|     # dans le tableau $1
 | |
|     array_upvar "$1" "${LISTOF_PROFILES[@]}"
 | |
|     if array_isempty "$1" && [ -n "$2" ]; then
 | |
|         array_add "$1" ""
 | |
|     fi
 | |
| }
 | |
| function deploy_is_type() {
 | |
|     # tester si $1 est un type valide
 | |
|     array_contains LISTOF_TYPES "$1"
 | |
| }
 | |
| function deploy_copy_types() {
 | |
|     # copier la liste des types valides dans le tableau $1
 | |
|     array_upvar "$1" "${LISTOF_TYPES[@]}"
 | |
| }
 | |
| function deploy_is_object() {
 | |
|     # tester si $1 est un objet valide de type $2
 | |
|     local o="$1" t="${2:-host}"
 | |
|     array_contains "LISTOF_${t}s" "$o"
 | |
| }
 | |
| function deploy_copy_objects() {
 | |
|     # copier la liste des objets valides de type $2 dans le tableau $1
 | |
|     local d="$1" t="${2:-host}"
 | |
|     local -a os
 | |
|     array_copy os "LISTOF_${t}s"
 | |
|     array_upvar "$d" "${os[@]}"
 | |
| }
 | |
| function deploy_copy_object_values() {
 | |
|     local d="$1" o="$2" t="${3:-host}"
 | |
|     local -a vs
 | |
|     array_copy vs "${o}_${t}"
 | |
|     array_upvar "$d" "${vs[@]}"
 | |
| }
 | |
| function deploy_prepare_copy_attrs() {
 | |
|     local dons="$1" dgns="$2" o="$3" t="${4:-host}"
 | |
|     local -a ons gns
 | |
|     array_copy ons "LISTOF_${o}_${t}_vars"
 | |
|     array_copy gns "LISTOF_${t}_vars"
 | |
|     upvars \
 | |
|         -a${#ons[*]} "$dons" "${ons[@]}" \
 | |
|         -a${#gns[*]} "$dgns" "${gns[@]}"
 | |
| }
 | |
| function deploy_copy_attr_names() {
 | |
|     local d="$1" o="$2" t="${3:-host}" __pca_ons="$4" __pca_gns="$5"
 | |
|     local -a ns
 | |
|     if [ -n "$__pca_ons" -a -n "$__pca_gns" ]; then
 | |
|         # variables ons et gns déjà préparées par deploy_prepare_copy_attrs()
 | |
|         array_copy ns "$__pca_ons"
 | |
|         array_extendu ns "$__pca_gns"
 | |
|     else
 | |
|         local -a ons gns
 | |
|         array_copy ons "LISTOF_${o}_${t}_vars"
 | |
|         array_copy gns "LISTOF_${t}_vars"
 | |
|         array_copy ns ons
 | |
|         array_extendu ns gns
 | |
|     fi
 | |
|     array_upvar "$d" "${ns[@]}"
 | |
| }
 | |
| function deploy_copy_attr_values() {
 | |
|     local d="$1" n="$2" o="$3" t="${4:-host}" __pca_ons="$5"
 | |
|     local -a vs ns
 | |
|     local n
 | |
|     if [ -n "$__pca_ons" ]; then
 | |
|         # variables ons déjà préparée par deploy_prepare_copy_attrs()
 | |
|         if array_contains "$__pca_ons" "$n"; then
 | |
|             array_copy vs "${o}_${t}_${n}"
 | |
|         else
 | |
|             array_copy vs "${t}_${n}"
 | |
|         fi
 | |
|     else
 | |
|         local -a ons gns
 | |
|         array_copy ons "LISTOF_${o}_${t}_vars"
 | |
|         array_copy gns "LISTOF_${t}_vars"
 | |
|         if array_contains ons "$n"; then
 | |
|             array_copy vs "${o}_${t}_${n}"
 | |
|         else
 | |
|             array_copy vs "${t}_${n}"
 | |
|         fi
 | |
|     fi
 | |
|     array_upvar "$d" "${vs[@]}"
 | |
| }
 | |
| 
 | |
| function deploy_is_link() {
 | |
|     # tester si $1 est un type de lien valide
 | |
|     array_contains LISTOF_LINKS "$1"
 | |
| }
 | |
| function deploy_copy_links() {
 | |
|     array_upvar "$1" "${LISTOF_LINKS[@]}"
 | |
| }
 | |
| function deploy_copy_link_types() {
 | |
|     local d="$1" l="${2:-deploy}"
 | |
|     local -a ts
 | |
|     array_copy ts "LISTOF_${l}_LINKTO"
 | |
|     array_upvar "$d" "${ts[@]}"
 | |
| }
 | |
| function deploy_prepare_copy_link_attrs() {
 | |
|     local dpons="$1" dpgns="$2" dons="$3" dgns="$4" o="$5" l="${6:-deploy}" p="$7"
 | |
|     local -a pons pgns ons gns
 | |
|     if [ -n "$p" ]; then
 | |
|         array_copy pons "LISTOF_${p}__${o}_${l}_vars"
 | |
|         array_copy pgns "LISTOF_${p}__${l}_vars"
 | |
|     fi
 | |
|     array_copy ons "LISTOF_${o}_${l}_vars"
 | |
|     array_copy gns "LISTOF_${l}_vars"
 | |
|     upvars \
 | |
|         -a${#pons[*]} "$dpons" "${pons[@]}" \
 | |
|         -a${#pgns[*]} "$dpgns" "${pgns[@]}" \
 | |
|         -a${#ons[*]} "$dons" "${ons[@]}" \
 | |
|         -a${#gns[*]} "$dgns" "${gns[@]}"
 | |
| }
 | |
| function deploy_copy_link_attr_names() {
 | |
|     local d="$1" o="$2" l="${3:-deploy}" p="$4"
 | |
|     local __pca_pons="$5" __pca_pgns="$6" __pca_ons="$7" __pca_gns="$8"
 | |
|     local -a ns
 | |
|     if [ -n "$__pca_pons" -a -n "$__pca_pgns" -a -n "$__pca_ons" -a -n "$__pca_gns" ]; then
 | |
|         # variables pons, pgns, ons et gns déjà préparées par la fonction
 | |
|         # deploy_prepare_copy_link_attrs()
 | |
|         array_copy ns "$__pca_pons"
 | |
|         array_extendu ns "$__pca_pgns"
 | |
|         array_extendu ns "$__pca_ons"
 | |
|         array_extendu ns "$__pca_gns"
 | |
|     else
 | |
|         local -a pons pgns ons gns
 | |
|         if [ -n "$p" ]; then
 | |
|             array_copy pons "LISTOF_${p}__${o}_${l}_vars"
 | |
|             array_copy pgns "LISTOF_${p}__${l}_vars"
 | |
|         fi
 | |
|         array_copy ons "LISTOF_${o}_${l}_vars"
 | |
|         array_copy gns "LISTOF_${l}_vars"
 | |
|         array_copy ns pons
 | |
|         array_extendu ns pgns
 | |
|         array_extendu ns ons
 | |
|         array_extendu ns gns
 | |
|     fi
 | |
|     array_upvar "$d" "${ns[@]}"
 | |
| }
 | |
| function deploy_copy_link_attr_values() {
 | |
|     local d="$1" n="$2" o="$3" l="${4:-deploy}" p="$5"
 | |
|     local __pca_pons="$6" __pca_pgns="$7" __pca_ons="$8" __pca_gns="$9"
 | |
|     local -a vs ns
 | |
|     local n
 | |
|     if [ -n "$__pca_pons" -a -n "$__pca_pgns" -a -n "$__pca_ons" -a -n "$__pca_gns" ]; then
 | |
|         # variables pons et ons déjà préparées par la fonction
 | |
|         # deploy_prepare_copy_link_attrs()
 | |
|         if array_contains "$__pca_pons" "$n"; then
 | |
|             array_copy vs "${p}__${o}_${l}_${n}"
 | |
|         elif array_contains "$__pca_pgns" "$n"; then
 | |
|             array_copy vs "${p}__${l}_${n}"
 | |
|         elif array_contains "$__pca_ons" "$n"; then
 | |
|             array_copy vs "${o}_${l}_${n}"
 | |
|         else
 | |
|             array_copy vs "${l}_${n}"
 | |
|         fi
 | |
|     else
 | |
|         local -a pons pgns ons gns
 | |
|         if [ -n "$p" ]; then
 | |
|             array_copy pons "LISTOF_${p}__${o}_${l}_vars"
 | |
|             array_copy pgns "LISTOF_${p}__${l}_vars"
 | |
|         fi
 | |
|         array_copy ons "LISTOF_${o}_${l}_vars"
 | |
|         array_copy gns "LISTOF_${l}_vars"
 | |
|         if array_contains pons "$n"; then
 | |
|             array_copy vs "${p}__${o}_${l}_${n}"
 | |
|         elif array_contains pgns "$n"; then
 | |
|             array_copy vs "${p}__${l}_${n}"
 | |
|         elif array_contains ons "$n"; then
 | |
|             array_copy vs "${o}_${l}_${n}"
 | |
|         else
 | |
|             array_copy vs "${l}_${n}"
 | |
|         fi
 | |
|     fi
 | |
|     array_upvar "$d" "${vs[@]}"
 | |
| }
 | |
| 
 | |
| function deploy_dump_values() {
 | |
|     local -a __dv_vs; array_copy __dv_vs "$2"; local -a vs; array_copy vs __dv_vs
 | |
|     local n="$1" indent="$3"
 | |
|     case ${#vs[*]} in
 | |
|     0) echo "$indent$n=";;
 | |
|     1) echo "$indent$n=$(qvalr "$vs")";;
 | |
|     *) echo "$indent$n=($(qvals "${vs[@]}"))";;
 | |
|     esac
 | |
| }
 |