préparer le calcul automatique des chemins

This commit is contained in:
Jephté Clain 2016-08-30 18:44:20 +04:00
parent 2fbc599113
commit 40f5347656
2 changed files with 139 additions and 29 deletions

View File

@ -140,22 +140,24 @@ function __runsmod_fixurl() {
function __runsmod_mapdir() {
# mapper le répertoire $1, avec $2 est le répertoire de base à partir
# desquels les mappings sont définis
# retourner vrai si un mapping a eu lieu
local dir="$1" basedir="$2"
local -a maps
local map from to
dir="${dir#$basedir/}"
[ -n "$basedir" ] && dir="${dir#$basedir/}"
__runsmod_get -a maps MAP
for map in "${maps[@]}"; do
splitpair "$map" from to
if [ "$dir" == "$from" ]; then
echo "$to"
return
return 0
elif [ "${dir#$from/}" != "$dir" ]; then
echo "$to/${dir#$from/}"
return
return 0
fi
done
echo "$dir"
return 1
}
function __runsmod_getpath_from_baseurl() {
@ -219,11 +221,13 @@ function __runsmod_fixinfo() {
function runsmod_checkenv() {
# vérifier l'environement. créer les répertoires nécessaires.
local check_only
[ "$1" == --check-only ] && check_only=1
if [ -z "$RUNSMOD_BASEDIR" ]; then
eerror "Vous devez définir RUNSMOD_BASEDIR"
[ -z "$check_only" ] && eerror "Vous devez définir RUNSMOD_BASEDIR"
return 1
fi
if [ ! -d "$RUNSMOD_BASEDIR" ]; then
if [ ! -d "$RUNSMOD_BASEDIR" -a -z "$check_only" ]; then
estep "Création de $(ppath "$RUNSMOD_BASEDIR")"
mkdir -p "$RUNSMOD_BASEDIR" || return 1
fi
@ -432,6 +436,7 @@ function runsmod_clone_or_pull() {
edebug "...... repospec=$repospec"
__runsmod_has_vmodule "$repospec" && continue
if [[ "$repospec" == *//* ]]; then
reposuffixes=()
reposuffix="${repospec#*//}"
[ -n "$reposuffix" ] && reposuffix="/$reposuffix"
repospec="${repospec%%//*}"
@ -451,19 +456,19 @@ function runsmod_clone_or_pull() {
reposuffixes=("$reposuffix")
fi
else
reposuffix=
reposuffixes=("")
fi
reponames=()
if __runsmod_has_vhost "$repospec"; then
if [ -n "$all_hosts" ]; then
setx repospec=__runsmod_replace1 "$repospec" "*"
__runsmod_match_repo_add repolist "$repospec" reponames
setx rs1=__runsmod_replace1 "$repospec" "*"
__runsmod_match_repo_add repolist "$rs1" reponames
elif [ -n "$host" ]; then
setx reponame=__runsmod_replace1 "$repospec" "$host"
array_contains repolist "$reponame" && array_add reponames "$reponame"
setx reponame=__runsmod_replace2 "$repospec" "$host"
array_contains repolist "$reponame" && array_add reponames "$reponame"
setx rs1=__runsmod_replace1 "$repospec" "$host"
array_contains repolist "$rs1" && array_add reponames "$rs1"
setx rs2=__runsmod_replace2 "$repospec" "$host"
array_contains repolist "$rs2" && array_add reponames "$rs2"
fi
else
array_contains repolist "$repospec" && array_add reponames "$repospec"
@ -530,6 +535,7 @@ function runsmod_clone_or_pull() {
edebug "........ repospec=$repospec"
__runsmod_has_vmodule "$repospec" || continue
if [[ "$repospec" == *//* ]]; then
reposuffixes=()
reposuffix="${repospec#*//}"
[ -n "$reposuffix" ] && reposuffix="/$reposuffix"
repospec="${repospec%%//*}"
@ -549,36 +555,36 @@ function runsmod_clone_or_pull() {
reposuffixes=("$reposuffix")
fi
else
reposuffix=
reposuffixes=("")
fi
reponames=()
if [ -n "$all_modules" ]; then
if __runsmod_has_vhost "$repospec"; then
if [ -n "$all_hosts" ]; then
setx repospec=__runsmod_replace1 "$repospec" "*" "*"
__runsmod_match_repo_add repolist "$repospec" reponames
setx rs1=__runsmod_replace1 "$repospec" "*" "*"
__runsmod_match_repo_add repolist "$rs1" reponames
elif [ -n "$host" ]; then
setx repospec=__runsmod_replace1 "$repospec" "$host" "*"
__runsmod_match_repo_add repolist "$repospec" reponames
setx repospec=__runsmod_replace2 "$repospec" "$host" "*"
__runsmod_match_repo_add repolist "$repospec" reponames
setx rs1=__runsmod_replace1 "$repospec" "$host" "*"
__runsmod_match_repo_add repolist "$rs1" reponames
setx rs2=__runsmod_replace2 "$repospec" "$host" "*"
__runsmod_match_repo_add repolist "$rs2" reponames
fi
else
setx repospec=__runsmod_replace1 "$repospec" "" "*"
__runsmod_match_repo_add repolist "$repospec" reponames
setx rs1=__runsmod_replace1 "$repospec" "" "*"
__runsmod_match_repo_add repolist "$rs1" reponames
fi
else
if __runsmod_has_vhost "$repospec"; then
if [ -n "$host" ]; then
setx reponame=__runsmod_replace1 "$repospec" "$host" "$module"
array_contains repolist "$reponame" && array_add reponames "$reponame"
setx reponame=__runsmod_replace2 "$repospec" "$host" "$module"
array_contains repolist "$reponame" && array_add reponames "$reponame"
setx rs1=__runsmod_replace1 "$repospec" "$host" "$module"
array_contains repolist "$rs1" && array_add reponames "$rs1"
setx rs2=__runsmod_replace2 "$repospec" "$host" "$module"
array_contains repolist "$rs2" && array_add reponames "$rs2"
fi
else
setx reponame=__runsmod_replace1 "$repospec" "" "$module"
array_contains repolist "$reponame" && array_add reponames "$reponame"
setx rs1=__runsmod_replace1 "$repospec" "" "$module"
array_contains repolist "$rs1" && array_add reponames "$rs1"
fi
fi
@ -620,8 +626,98 @@ function runsmod_clone_or_pull() {
return $r
}
function runsmod_update_vars() {
local all_hosts host_mode="$1" host="$2"
case "$host_mode" in
none) host=;;
all) host=; all_hosts=1;;
self) host="${RUNSHOST:-$MYHOST}";;
esac
# le nom d'hôte doit être avec un domaine
[ -n "$host" -a "${host%%.*}" == "$host" -a -n "$RUNSDOMAIN" ] && host="$host.$RUNSDOMAIN"
for RUNSMOD_PROFILE in "${RUNSMOD_PROFILES[@]}"; do
__runsmod_get -a baseurls BASEURL
for baseurl in "${baseurls[@]}"; do
setx repopath=__runsmod_getpath_from_baseurl "$baseurl"
setx repolistfile=__runsmod_get_repolistfile "$baseurl"
[ -f "$repolistfile" ] || continue
edebug ".. baseurl=$baseurl, repopath=$repopath"
for vprefix in SCRIPTS MODULES HOSTS; do
__runsmod_get -a repourls "${vprefix}_URLS"
edebug ".... vprefix=$vprefix, repourls=(${repourls[*]})"
for repospec in "${repourls[@]}"; do
edebug "...... repospec=$repospec"
__runsmod_has_vmodule "$repospec" && repospec="${repospec%%/%m*}"
reposuffixes=("")
if [[ "$repospec" == *//* ]]; then
reposuffix="${repospec#*//}"
[ -n "$reposuffix" ] && reposuffix="/$reposuffix"
repospec="${repospec%%//*}"
if __runsmod_has_vhost "$reposuffix"; then
if [ -n "$all_hosts" -o -z "$host" ]; then
reposuffix="${reposuffix//%h\//}"
reposuffix="${reposuffix//\/%h/}"
reposuffixes=("$reposuffix")
elif [ -n "$host" ]; then
local rs1 rs2
setx rs1=__runsmod_replace1 "$reposuffix" "$host"
setx rs2=__runsmod_replace2 "$reposuffix" "$host"
reposuffixes=("$rs1")
[ "$rs2" != "$rs1" ] && array_add reposuffixes "$rs2"
fi
else
reposuffixes=("$reposuffix")
fi
fi
repospecs=()
if __runsmod_has_vhost "$repospec"; then
if [ -n "$all_hosts" ]; then
setx rs1=__runsmod_replace1 "$repospec" "*"
array_addu repospecs "$rs1"
elif [ -n "$host" ]; then
setx rs1=__runsmod_replace1 "$repospec" "$host"
array_addu repospecs "$rs1"
setx rs2=__runsmod_replace2 "$repospec" "$host"
array_addu repospecs "$rs2"
fi
else
array_addu repospecs "$repospec"
fi
edebug "...... repospecs=(${repospecs[*]})"
for repospec in "${repospecs[@]}"; do
if setx repospec=__runsmod_mapdir "$repospec"; then
repodirs=("$repospec")
else
array_lsdirs repodirs "$RUNSMOD_BASEDIR/$repopath" "$repospec"
fi
for repodir in "${repodirs[@]}"; do
edebug "........ repodir=$repodir"
[ -d "$repodir" ] || continue
for reposuffix in "${reposuffixes[@]}"; do
case "$vprefix" in
SCRIPTS) array_addu SCRIPTSDIRS "$repodir$reposuffix";;
MODULES) array_addu MODULESDIRS "$repodir$reposuffix";;
HOSTS) array_addu HOSTSDIRS "$repodir$reposuffix";;
esac
done
done
done
done
done
done
done
}
function runsmod_teardown_vars() {
setx RUNSSCRIPTSPATH=array_join SCRIPTSDIRS :
setx RUNSMODULESPATH=array_join MODULESDIRS :
setx RUNSHOSTSPATH=array_join HOSTSDIRS :
[ -n "$RUNSSCRIPTSPATH" ] || RUNSSCRIPTSPATH=:
[ -n "$RUNSMODULESPATH" ] || RUNSMODULESPATH=:
[ -n "$RUNSHOSTSPATH" ] || RUNSHOSTSPATH=:
}

18
runs
View File

@ -1,7 +1,7 @@
#!/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
urequire DEFAULTS runs runsmod
function display_help() {
uecho "$scriptname: Lancer un script avec le protocole runs
@ -81,6 +81,7 @@ function runs_path_undefined() {
ewarn "La variable $1 n'est pas définie dans ~/etc/default/runs"
}
auto_runsmod=1
action=runs
create_verbose=
init_sysinfos=--NOT-SET--
@ -105,6 +106,7 @@ runsvarsfile= # fichier contenant des définitions à charger
runs_init "$scriptdir"
parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \
--no-auto-runsmod auto_runsmod= \
--i '$action=init;create_verbose=false' \
--init '$action=init;create_verbose=true' \
--verify action=verify \
@ -170,9 +172,21 @@ if [ "$action" == runs \
fi
fi
if [ -n "$auto_runsmod" ] && __runsmod_loadconf && runsmod_checkenv --check-only; then
function __runsmod_clone_or_pull() { :; }
runsmod_setup_vars
runsmod_update_vars self "$RUNSHOST"
runsmod_teardown_vars
#XXX
echo === SCRIPTSDIRS ===; array_each SCRIPTSDIRS ppath
echo === MODULESDIRS ===; array_each MODULESDIRS ppath
echo === HOSTSDIRS ===; array_each HOSTSDIRS ppath
#XXX
fi
if ! is_root && [ -n "$run_as_root" ]; then
# reconstruire la ligne de commande
args=()
args=(--no-auto-runsmod)
if [ "$action" == "init" ]; then
args=("${args[@]}" --init)
elif [ "$action" == "verify" ]; then