nutools/lib/ulib/deploy

528 lines
17 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 sov slv sdv
eval "set -- $(getopt -ov:old -lallow-vars:,object-vars,link-vars,dest-vars -- "$@")"
while [ -n "$1" ]; do
case "$1" in
-v|--allow-vars)
array_split alv "$2" ,
shift; shift
;;
-o|--object-vars) sov=1; shift;;
-l|--link-vars) slv=1; shift;;
-d|--dest-vars) sdv=1; 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" || {
[ "$format" == shell ] && qvals false "$otype: invalid type"
return 2
}
fi
;;
*)
if [ -n "$qtype" ]; then
deploy_is_type "$qtype" || {
[ "$format" == shell ] && qvals false "$qtype: invalid type"
return 3
}
fi
;;
esac
if [ -n "$ltype" ]; then
deploy_is_link "$ltype" || {
[ "$format" == shell ] && qvals false "$ltype: invalid link type"
return 4
}
fi
[ -n "$term" ] || {
[ "$format" == shell ] && 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 || {
[ "$format" == shell ] && qvals false "artifact not found"
return 1
}
edebug "object=$object, type=$type"
deploy_search_link link "$type" "$ltype" || {
[ "$format" == shell ] && 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
if [ -n "$sov" ]; then
deploy_copy_object_values vs "$object" "$type"
deploy_show_values vs "$type" "$format" shell alv
deploy_show_attrs "$object" "$type" "$format" alv vars
fi
if [ -n "$sdv" ]; then
local -a pons pgns ons gns ans ovs os; local an av o
deploy_prepare_copy_link_attrs pons pgns ons gns "$object" "$link" "$profile"
deploy_copy_link_attr_values hvs host "$object" "$link" "$profile" pons pgns ons gns
for hv in "${hvs[@]}"; do
deploy_copy_object_values hs "$hv" host
deploy_show_values hs host "$format" shell alv
deploy_show_attrs "$hn" host "$format" alv vars
done
fi
deploy_show_links "$object" "$link" "$profile" "$format" "" alv vars
[ "$format" == shell ] && echo true
return 0
;;
SOURCE)
# XXX implémenter
[ "$format" == shell ] && 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
[ "$format" == shell ] && echo true
return 0
fi
[ "$format" == shell ] && 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) 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
[ -n "$5" ] && echo_seta "${t}_vars" "${ans[@]}"
for an in "${ans[@]}"; do
if [ -n "$4" ]; then
if ! array_isempty "$4"; then
array_contains alv "$an" || continue
fi
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
[ -n "$7" -a "$f" == shell ] && echo_seta "${l}_vars" "${ans[@]}"
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
}