implémentation initiale de runsmod
This commit is contained in:
parent
42b959010c
commit
f04e862bc0
|
@ -0,0 +1,63 @@
|
|||
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
|
||||
|
||||
# Type d'url à préférer pour le clonage des dépôts récupérés automatiquement.
|
||||
# Cette valeur détermine le mode de fonctionnement: mode production ou mode
|
||||
# développement.
|
||||
# En mode production, les dépôts doivent être accessibles sans authentification
|
||||
# et sont en lecture seule. En mode développement, les dépôts sont typiquement
|
||||
# accédés par ssh et sont à priori modifiables.
|
||||
#RUNSMOD_MODE=prod
|
||||
|
||||
# Mode opératoire pour la récupération des dépôts. Avec la valeur 'offline', ni
|
||||
# clone ni pull ne sont autorisés: le module doit avoir déjà été cloné si on
|
||||
# veut l'utiliser. Avec la valeur 'clone' seul le clonage est autorisé, e.g. le
|
||||
# dépôt est cloné si ce n'est pas déjà le cas. Avec la valeur 'pull', cloner le
|
||||
# dépôt si ce n'est pas déjà le cas, ou le mettre à jour le dépôt avant de
|
||||
# l'utiliser s'il avait déjà été cloné. Avec la valeur 'auto', utiliser 'pull'
|
||||
# en mode production et 'clone' en mode développement.
|
||||
#RUNSMOD_UPDATE=auto
|
||||
|
||||
# Fichier d'identité par défaut pour la connexion par ssh en mode développement
|
||||
#RUNSMOD_IDENTITY="$HOME/.ssh/id_rsa"
|
||||
|
||||
# URL de base par défaut pour les définitions de dépôts. Toutes les définitions
|
||||
# de dépôt sont relatives à cet url de base i.e. si RUNSMOD_BASEURL="git@host"
|
||||
# alors la définition de dépôt "runs" est résolue en "git@host:runs"
|
||||
#RUNSMOD_BASEURL=
|
||||
|
||||
# Définitions par défaut des dépôts pour les scripts génériques. Ces URLs sont
|
||||
# relatifs à RUNSMOD_BASEURL et peuvent contenir %h pour l'hôte, et %m pour le
|
||||
# nom du module. Si aucune de ces variables n'apparait, on considère que c'est
|
||||
# un dépôt unique.
|
||||
#RUNSMOD_SCRIPTS_URLS=(hosts/%h/runs runs-scripts)
|
||||
|
||||
# Définitions par défaut des dépôts pour les modules. Ces URLs sont relatifs à
|
||||
# RUNSMOD_BASEURL et peuvent contenir %h pour l'hôte, et %m pour le nom du
|
||||
# module. Si aucune de ces variables n'apparait, on considère que c'est un
|
||||
# dépôt unique.
|
||||
#RUNSMOD_MODULES_URLS=(hosts/%h/modules/%m modules/%m)
|
||||
|
||||
# Définitions par défaut des dépôts dans lesquels rechercher des répertoires
|
||||
# d'hôtes qui contiennent scripts et modules spécifiques aux hôtes. Ces URLs
|
||||
# sont relatifs à RUNSMOD_BASEURL et ne *doivent pas* contenir de variable comme
|
||||
# %h ou %m.
|
||||
#RUNSMOD_HOSTS_URLS=(runs-hosts)
|
||||
|
||||
# Répertoire de base dans lequel sont clonés les dépôts.
|
||||
#RUNSMOD_BASEDIR="$HOME/runs"
|
||||
|
||||
# Liste de profils à utiliser pour la récupération automatique. Lors de la
|
||||
# recherche d'un module, ces serveurs sont testés dans l'ordre mentionné
|
||||
# ici. Pour chacun de ces serveurs, il est possible de définir des variables qui
|
||||
# remplacent les valeurs par défaut définies ci-dessus.
|
||||
#RUNSMOD_PROFILES=(vcs)
|
||||
|
||||
### Exemples de définitions pour le profil vcs
|
||||
#RUNSMOD_vcs_IDENTITY=...
|
||||
#RUNSMOD_vcs_BASEURL=http://vcs.tld/anongit/
|
||||
#RUNSMOD_vcs_prod_BASEURL=http://vcs.tld/anongit/
|
||||
#RUNSMOD_vcs_devel_BASEURL=git@vcs.tld:
|
||||
#RUNSMOD_vcs_SCRIPTS_URLS=(...)
|
||||
#RUNSMOD_vcs_MODULES_URLS=(...)
|
||||
#RUNSMOD_vcs_HOSTS_URLS=(...)
|
||||
#RUNSMOD_vcs_BASEDIR=...
|
|
@ -0,0 +1,472 @@
|
|||
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
|
||||
## Gestion des modules pour runs
|
||||
##@cooked nocomments
|
||||
##@require base
|
||||
uprovide runsmod
|
||||
urequire base
|
||||
|
||||
function __runsmod_loadconf() {
|
||||
# Charger le fichier de configuration $1. Les paramètres RUNSMOD_MODE et
|
||||
# RUNSMOD_UPDATE peuvent être modifiés par rapport à la configuration
|
||||
# chargée avec les paramètres $2 et $3 respectivement.
|
||||
local config="$1" mode="$2" update="$3"
|
||||
|
||||
urequire runs.defaults
|
||||
set_defaults runs
|
||||
if [ -n "$config" ]; then
|
||||
[ -f "$config" ] || {
|
||||
eerror "$config: fichier introuvable"
|
||||
return 1
|
||||
}
|
||||
source "$config" || {
|
||||
eerror "Erreur de configuration"
|
||||
return 1
|
||||
}
|
||||
fi
|
||||
|
||||
[ -n "$mode" ] || mode="$RUNSMOD_MODE"
|
||||
case "$mode" in
|
||||
production|prod|p) mode=prod;;
|
||||
development|devel|dev|d) mode=devel;;
|
||||
*) die "$mode: mode invalide. Ce doit être prod ou devel";;
|
||||
esac
|
||||
RUNSMOD_MODE="$mode"
|
||||
|
||||
[ -n "$update" ] || update="$RUNSMOD_UPDATE"
|
||||
if [ "$update" == auto ]; then
|
||||
case "$RUNSMOD_MODE" in
|
||||
prod) update=pull;;
|
||||
devel) update=clone;;
|
||||
esac
|
||||
fi
|
||||
RUNSMOD_UPDATE="$update"
|
||||
case "$RUNSMOD_UPDATE" in
|
||||
offline) RUNSMOD_CLONE=; RUNSMOD_PULL=;;
|
||||
clone) RUNSMOD_CLONE=1; RUNSMOD_PULL=;;
|
||||
pull) RUNSMOD_CLONE=1; RUNSMOD_PULL=1;;
|
||||
esac
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
function __runsmod_get() {
|
||||
# obtenir la valeur de la première variable définie dans une liste
|
||||
# construite à partir des arguments de cette fonction.
|
||||
# $1 étant le suffixe, pour chacun des préfixes $2..@, tester l'existence de
|
||||
# la variable "RUNSMOD_${prefix}_${suffix}". Le cas particulier prefix==""
|
||||
# teste l'existence de la variable RUNSMOD_${suffix}
|
||||
# Si la liste des préfixes n'est pas spécifiée, prendre par défaut la liste
|
||||
# suivante: ("${RUNSMOD_PROFILE}_${RUNSMOD_MODE}" "$RUNSMOD_PROFILE" "")
|
||||
|
||||
# Si $1=-a, alors copier un tableau plutôt qu'afficher une valeur
|
||||
# scalaire. dans ce cas, $2 est le nom du tableau destination, et toutes les
|
||||
# autres valeurs indiquées ci-dessus sont décalées de 2 vers la droite
|
||||
local _array
|
||||
if [ "$1" == -a ]; then
|
||||
_array="$2"
|
||||
shift; shift
|
||||
fi
|
||||
local _suffix="$1"; shift
|
||||
[ -n "$_suffix" ] || return 1
|
||||
|
||||
if [ $# -eq 0 ]; then
|
||||
# préfixes par défaut
|
||||
local -a _args
|
||||
if [ -n "$RUNSMOD_PROFILE" ]; then
|
||||
if [ -n "$RUNSMOD_MODE" ]; then
|
||||
_args=("${_args[@]}" "${RUNSMOD_PROFILE}_${RUNSMOD_MODE}")
|
||||
fi
|
||||
_args=("${_args[@]}" "$RUNSMOD_PROFILE")
|
||||
fi
|
||||
_args=("${_args[@]}" "")
|
||||
set -- "${_args[@]}"
|
||||
fi
|
||||
local _prefix _var
|
||||
local -a _values
|
||||
for _prefix in "$@"; do
|
||||
if [ -n "$_prefix" ]; then
|
||||
_var="RUNSMOD_${_prefix}_${_suffix}"
|
||||
else
|
||||
_var="RUNSMOD_${_suffix}"
|
||||
fi
|
||||
if [ -n "$_array" ]; then
|
||||
array_copy _values "$_var"
|
||||
if [ ${#_values[*]} -gt 0 -a -n "${_values[0]}" ]; then
|
||||
array_copy "$_array" "$_var"
|
||||
return 0
|
||||
fi
|
||||
else
|
||||
_var="${!_var}"
|
||||
if [ -n "$_var" ]; then
|
||||
echo "$_var"
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
function __runsmod_fixurl() {
|
||||
# Ajouter la définition de dépôt $1 à l'url de base $2 pour en faire un url
|
||||
# de dépot.
|
||||
local url="$2"
|
||||
case "$url" in
|
||||
http:*|https:*)
|
||||
[ "${url%/}" != "$url" ] || url="$url/"
|
||||
;;
|
||||
*)
|
||||
if [[ "$url" == *: ]]; then
|
||||
:
|
||||
elif [[ "$url" == *:* ]]; then
|
||||
[ "${url%/}" != "$url" ] || url="$url/"
|
||||
else
|
||||
url="$url:"
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
echo "$url$1"
|
||||
}
|
||||
|
||||
function __runsmod_getpath_from_baseurl() {
|
||||
# obtenir le nom correspond à un url de base, utilisable dans un chemin
|
||||
local url="$1" path userhost user host dummy
|
||||
case "$url" in
|
||||
http:*|https:*)
|
||||
path="${url%/}"
|
||||
path="${path/:\/\//_}"
|
||||
path="${path//\//_}"
|
||||
echo "$path"
|
||||
return
|
||||
;;
|
||||
*)
|
||||
splitpair "$url" userhost dummy
|
||||
splituserhost "$userhost" user host
|
||||
echo "ssh_${user}_${host}"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
__RUNSMOD_CONNECT_TIMEOUT=3
|
||||
|
||||
function __runsmod_dumpurl() {
|
||||
if progexists curl; then
|
||||
curl -fs --connect-timeout "$__RUNSMOD_CONNECT_TIMEOUT" "$@"
|
||||
elif progexists wget; then
|
||||
wget -q --connect-timeout "$__RUNSMOD_CONNECT_TIMEOUT" -O - "$@"
|
||||
else
|
||||
eerror "Nécessite curl ou wget"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
function __runsmod_getinfo() {
|
||||
# interroger le serveur gitolite à l'url de base $1 avec la commande info
|
||||
local url="$1"
|
||||
case "$url" in
|
||||
http:*|https:*)
|
||||
__runsmod_dumpurl "${url%/}/info"
|
||||
;;
|
||||
*)
|
||||
local userhost dummy
|
||||
splitpair "$url" userhost dummy
|
||||
local -a options
|
||||
options=(
|
||||
-o StrictHostKeyChecking=no
|
||||
-o BatchMode=yes
|
||||
-o ConnectTimeout="$__RUNSMOD_CONNECT_TIMEOUT"
|
||||
)
|
||||
"${GIT_SSH:-ssh}" -q "${options[@]}" "$userhost" info
|
||||
;;
|
||||
esac
|
||||
}
|
||||
function __runsmod_fixinfo() {
|
||||
# traiter le résultat de __runsmod_getinfo() pour avoir la liste des dépôts
|
||||
sed -n '3,$p' | sed 's/^.*\t//g'
|
||||
}
|
||||
|
||||
function runsmod_checkenv() {
|
||||
# vérifier l'environement. créer les répertoires nécessaires.
|
||||
if [ -z "$RUNSMOD_BASEDIR" ]; then
|
||||
eerror "Vous devez définir RUNSMOD_BASEDIR"
|
||||
return 1
|
||||
fi
|
||||
if [ ! -d "$RUNSMOD_BASEDIR" ]; then
|
||||
estep "Création de $(ppath "$RUNSMOD_BASEDIR")"
|
||||
mkdir -p "$RUNSMOD_BASEDIR" || return 1
|
||||
fi
|
||||
}
|
||||
|
||||
function __runsmod_get_repolistfile() {
|
||||
# obtenir le chemin absolu vers le fichier contenant la liste des dépôts
|
||||
# correspondant à l'url de base $1
|
||||
local repopath
|
||||
setx repopath=__runsmod_getpath_from_baseurl "$1"
|
||||
echo "$RUNSMOD_BASEDIR/$repopath.lst"
|
||||
}
|
||||
|
||||
function runsmod_should_update_repolists() {
|
||||
# tester s'il faut mettre à jour au moins un des fichiers contenant les
|
||||
# listes des dépôts
|
||||
local RUNSMOD_PROFILE
|
||||
local now baseurl repobase repopath repolistfile mtime
|
||||
local -a urls
|
||||
setx now=date +%s
|
||||
for RUNSMOD_PROFILE in "${RUNSMOD_PROFILES[@]}"; do
|
||||
setx baseurl=__runsmod_get BASEURL || continue
|
||||
setx repolistfile=__runsmod_get_repolistfile "$baseurl"
|
||||
|
||||
# si le fichier n'existe pas, il faut mettre à jour
|
||||
[ -f "$repolistfile" ] || return 0
|
||||
# si le fichier a été modifié depuis plus de 24 heures, mettre à jour
|
||||
setx mtime=stat -c %Y "$repolistfile"
|
||||
[ $(($now - $mtime)) -lt 86400 ] || return 0
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
function runsmod_update_repolists() {
|
||||
# mettre à jour si nécessaire les fichiers contenant les listes des dépôts.
|
||||
# Si $1 n'est pas vide, forcer la mise à jour de tous les fichiers
|
||||
local force="$1"; shift
|
||||
local RUNSMOD_PROFILE
|
||||
local now baseurl repobase repopath repo mtime update
|
||||
local -a urls
|
||||
setx now=date +%s
|
||||
for RUNSMOD_PROFILE in "${RUNSMOD_PROFILES[@]}"; do
|
||||
setx baseurl=__runsmod_get BASEURL || continue
|
||||
setx repolistfile=__runsmod_get_repolistfile "$baseurl"
|
||||
|
||||
update="$force"
|
||||
if [ -z "$update" ]; then
|
||||
# si le fichier n'existe pas, il faut mettre à jour
|
||||
[ -f "$repolistfile" ] || update=1
|
||||
fi
|
||||
if [ -z "$update" ]; then
|
||||
# si le fichier a été modifié depuis plus de 24 heures, mettre à jour
|
||||
setx mtime=stat -c %Y "$repolistfile"
|
||||
[ $(($now - $mtime)) -lt 86400 ] || update=1
|
||||
fi
|
||||
if [ -n "$update" ]; then
|
||||
local list
|
||||
ebegin "$baseurl"
|
||||
if setx list=__runsmod_getinfo "$baseurl"; then
|
||||
echo "$list" | __runsmod_fixinfo >"$repolistfile"
|
||||
edot 0
|
||||
else
|
||||
edot 1
|
||||
fi
|
||||
eend
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
function runsmod_setup_vars() {
|
||||
# récupérer configuration statique pour la mettre à jour
|
||||
array_new REPODIRS
|
||||
array_split SCRIPTSDIRS "$RUNSSCRIPTSPATH" :
|
||||
array_split MODULESDIRS "$RUNSMODULESPATH" :
|
||||
array_split HOSTSDIRS "$RUNSHOSTSPATH" :
|
||||
}
|
||||
|
||||
function __runsmod_has_vmodule() {
|
||||
# tester si l'url $1 contient une variable de module %m
|
||||
[ "${1//%m/}" != "$1" ]
|
||||
}
|
||||
function __runsmod_has_vhost() {
|
||||
# tester si l'url $1 contient une variable d'hôte %h
|
||||
[ "${1//%h/}" != "$1" ]
|
||||
}
|
||||
function __runsmod_replace1() {
|
||||
# remplacer dans l'url $1 la variable %h par l'hôte complet $2 et
|
||||
# éventuellement la variable %m par le module $3
|
||||
local url="$1"
|
||||
[ -n "$2" ] && url="${url//%h/$2}"
|
||||
[ -n "$3" ] && url="${url//%m/$3}"
|
||||
echo "$url"
|
||||
}
|
||||
function __runsmod_replace2() {
|
||||
# remplacer dans l'url $1 la variable %h par le nom d'hôte correspondant à
|
||||
# au nom d'hôte complet $2 et éventuellement la variable %m par le module $3
|
||||
local url="$1"
|
||||
local host="${2%%.*}"
|
||||
[ -n "$host" ] && url="${url//%h/$host}"
|
||||
[ -n "$3" ] && url="${url//%m/$3}"
|
||||
echo "$url"
|
||||
}
|
||||
|
||||
function __runsmod_clone_or_pull() {
|
||||
local repourl="$1" repodir="$2"
|
||||
mkdirof "$repodir"
|
||||
if [ -d "$repodir" ]; then
|
||||
if [ -n "$RUNSMOD_PULL" ]; then
|
||||
estepi "pull $(ppath "$repodir") [$repourl]"
|
||||
(cd "$repodir"; git pull)
|
||||
return $?
|
||||
else
|
||||
estep "nopull $(ppath "$repodir")"
|
||||
return 0
|
||||
fi
|
||||
else
|
||||
if [ -n "$RUNSMOD_CLONE" ]; then
|
||||
estepi "clone $(ppath "$repodir") [$repourl]"
|
||||
git clone "$repourl" "$repodir"
|
||||
return $?
|
||||
else
|
||||
estepe "noclone $(ppath "$repodir")"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
function runsmod_clone_or_pull() {
|
||||
# Chercher les modules $3..@, pour l'hôte $1 qui est le mode d'hôte: none,
|
||||
# all, self ou one pour un hôte spécifique $2. Ajouter les chemins dans le
|
||||
# tableau REPO_DIRS. Mettre à jour les tableaux SCRIPTS_DIRS, MODULES_DIRS
|
||||
# et HOSTS_DIRS
|
||||
local all_hosts host_mode="$1" host="$2"; shift; shift
|
||||
case "$host_mode" in
|
||||
none) host=;;
|
||||
all) host=; all_hosts=1;;
|
||||
self) host="${RUNSHOST:-$MYHOST}";;
|
||||
esac
|
||||
if [ -n "$host" -a "${host%%.*}" == "$host" -a -n "$RUNSDOMAIN" ]; then
|
||||
# le nom d'hôte doit être avec un domaine
|
||||
host="$host.$RUNSDOMAIN"
|
||||
enote "Autocorrection du nom d'hôte en $host"
|
||||
fi
|
||||
#XXX implémenter all_hosts=1
|
||||
|
||||
local -a repolist reponames repourls
|
||||
local RUNSMOD_PROFILE baseurl repopath repolistfile
|
||||
local vprefix repospec reponame repourl repodir module moduledir
|
||||
local r=0
|
||||
|
||||
# Tout d'abord, traiter les dépôts sans variable %m
|
||||
edebug "Traitement des dépôts sans vmodule"
|
||||
for RUNSMOD_PROFILE in "${RUNSMOD_PROFILES[@]}"; do
|
||||
setx baseurl=__runsmod_get BASEURL || continue
|
||||
setx repopath=__runsmod_getpath_from_baseurl "$baseurl"
|
||||
setx repolistfile=__runsmod_get_repolistfile "$baseurl"
|
||||
[ -f "$repolistfile" ] || continue
|
||||
array_from_lines repolist "$(<"$repolistfile")"
|
||||
|
||||
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" && continue
|
||||
|
||||
reponames=()
|
||||
if __runsmod_has_vhost "$repospec"; then
|
||||
if [ -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"
|
||||
fi
|
||||
else
|
||||
array_contains repolist "$repospec" && array_add reponames "$repospec"
|
||||
fi
|
||||
|
||||
edebug "...... reponames=(${reponames[*]})"
|
||||
for reponame in "${reponames[@]}"; do
|
||||
repodir="$RUNSMOD_BASEDIR/$repopath/$reponame"
|
||||
|
||||
setx repourl=__runsmod_fixurl "$reponame" "$baseurl"
|
||||
__runsmod_clone_or_pull "$repourl" "$repodir" || r=1
|
||||
|
||||
[ -d "$repodir" ] || continue
|
||||
array_addu REPODIRS "$repodir"
|
||||
case "$vprefix" in
|
||||
SCRIPTS) array_addu SCRIPTSDIRS "$repodir";;
|
||||
#MODULES) ;;
|
||||
HOSTS) array_addu HOSTSDIRS "$repodir";;
|
||||
esac
|
||||
done
|
||||
done
|
||||
done
|
||||
done
|
||||
|
||||
## Ensuite, traiter les dépôts de module
|
||||
|
||||
# modules contient la liste des modules qui ont été trouvés, pour ne pas les
|
||||
# lister en double s'ils existent dans plusieurs sources
|
||||
edebug "Traitement des dépôts de modules"
|
||||
local -a modules foundmodules
|
||||
|
||||
modules=("$@")
|
||||
for RUNSMOD_PROFILE in "${RUNSMOD_PROFILES[@]}"; do
|
||||
setx baseurl=__runsmod_get BASEURL || continue
|
||||
setx repopath=__runsmod_getpath_from_baseurl "$baseurl"
|
||||
setx repolistfile=__runsmod_get_repolistfile "$baseurl"
|
||||
[ -f "$repolistfile" ] || continue
|
||||
array_from_lines repolist "$(<"$repolistfile")"
|
||||
|
||||
edebug ".. baseurl=$baseurl, repopath=$repopath"
|
||||
for module in "${modules[@]}"; do
|
||||
array_contains foundmodules "$module" && continue
|
||||
edebug ".... module=$module"
|
||||
|
||||
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" || continue
|
||||
|
||||
reponames=()
|
||||
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"
|
||||
fi
|
||||
else
|
||||
setx reponame=__runsmod_replace1 "$repospec" "" "$module"
|
||||
array_contains repolist "$reponame" && array_add reponames "$reponame"
|
||||
fi
|
||||
|
||||
edebug "........ reponames=(${reponames[*]})"
|
||||
for reponame in "${reponames[@]}"; do
|
||||
repodir="$RUNSMOD_BASEDIR/$repopath/$reponame"
|
||||
|
||||
setx repourl=__runsmod_fixurl "$reponame" "$baseurl"
|
||||
__runsmod_clone_or_pull "$repourl" "$repodir" || r=1
|
||||
|
||||
[ -d "$repodir" ] || continue
|
||||
array_addu foundmodules "$module"
|
||||
|
||||
array_addu REPODIRS "$repodir"
|
||||
case "$vprefix" in
|
||||
SCRIPTS) array_addu SCRIPTSDIRS "$repodir";;
|
||||
MODULES)
|
||||
setx moduledir=dirname -- "$repodir"
|
||||
array_addu MODULESDIRS "$moduledir"
|
||||
;;
|
||||
HOSTS) array_addu HOSTSDIRS "$repodir";;
|
||||
esac
|
||||
done
|
||||
done
|
||||
done
|
||||
done
|
||||
done
|
||||
|
||||
for module in "${modules[@]}"; do
|
||||
array_contains foundmodules "$module" || ewarn "$module: module non trouvé"
|
||||
done
|
||||
|
||||
return $r
|
||||
}
|
||||
|
||||
function runsmod_teardown_vars() {
|
||||
setx RUNSSCRIPTSPATH=array_join SCRIPTSDIRS :
|
||||
setx RUNSMODULESPATH=array_join MODULESDIRS :
|
||||
setx RUNSHOSTSPATH=array_join HOSTSDIRS :
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
|
||||
## Valeurs par défaut pour runs.modules
|
||||
##@cooked nocomments
|
||||
##@require base
|
||||
uprovide runsmod.defaults
|
||||
|
||||
# Ne pas supprimer la ligne ci-dessous
|
||||
##--runsmod.defaults--
|
||||
RUNSMOD_MODE=prod
|
||||
RUNSMOD_UPDATE=auto
|
||||
RUNSMOD_IDENTITY=
|
||||
RUNSMOD_BASEURL=
|
||||
RUNSMOD_SCRIPTS_URLS=(hosts/%h/runs runss runs-scripts)
|
||||
RUNSMOD_MODULES_URLS=(hosts/%h/modules/%m modules/%m)
|
||||
RUNSMOD_HOSTS_URLS=(runsh runs-hosts)
|
||||
RUNSMOD_BASEDIR="$HOME/runs"
|
||||
RUNSMOD_PROFILES=(vcs pvcs jclain)
|
||||
|
||||
# vcs
|
||||
RUNSMOD_vcs_BASEURL=http://vcs.univ-reunion.fr/anongit
|
||||
RUNSMOD_vcs_devel_BASEURL=git@vcs.univ.run
|
||||
RUNSMOD_vcs_SCRIPTS_URLS=("${RUNSMOD_SCRIPTS_URLS[@]}")
|
||||
RUNSMOD_vcs_MODULES_URLS=("${RUNSMOD_MODULES_URLS[@]}")
|
||||
RUNSMOD_vcs_HOSTS_URLS=("${RUNSMOD_HOSTS_URLS[@]}")
|
||||
|
||||
# pvcs
|
||||
RUNSMOD_pvcs_BASEURL=http://pvcs.univ-reunion.fr/anongit
|
||||
RUNSMOD_pvcs_devel_BASEURL=pgit@vcs.univ.run
|
||||
RUNSMOD_pvcs_SCRIPTS_URLS=("${RUNSMOD_SCRIPTS_URLS[@]}" si/base-runs)
|
||||
RUNSMOD_pvcs_MODULES_URLS=("${RUNSMOD_MODULES_URLS[@]}")
|
||||
RUNSMOD_pvcs_HOSTS_URLS=("${RUNSMOD_HOSTS_URLS[@]}")
|
||||
|
||||
# jclain
|
||||
RUNSMOD_jclain_BASEURL=git@jclain.fr
|
||||
RUNSMOD_jclain_SCRIPTS_URLS=("${RUNSMOD_SCRIPTS_URLS[@]}")
|
||||
RUNSMOD_jclain_MODULES_URLS=("${RUNSMOD_MODULES_URLS[@]}")
|
||||
RUNSMOD_jclain_HOSTS_URLS=("${RUNSMOD_HOSTS_URLS[@]}")
|
|
@ -0,0 +1,141 @@
|
|||
#!/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 runsmod
|
||||
|
||||
function display_help() {
|
||||
uecho "$scriptname: récupérer des dépôts git à usage de runs
|
||||
|
||||
USAGE
|
||||
$scriptname [options] [-h host] [modules...]
|
||||
|
||||
Tous les dépôts spécifiés dans la configuration sont récupérés. Si des modules
|
||||
sont spécifiés, les dépôts correspondants sont récupérés aussi. Avec l'option
|
||||
-h, des dépôts spécifiques à l'hôte peuvent éventuellement être récupérés en
|
||||
plus.
|
||||
|
||||
OPTIONS
|
||||
-c, --config CONFIG
|
||||
Spécifier un fichier de configuration à charger au lieu de la valeur par
|
||||
défaut ~/etc/default/runs
|
||||
--prod
|
||||
--devel
|
||||
Forcer un mode de sélection des urls. En mode production, préférer pour
|
||||
le clonage les urls de production, qui sont en principe accessibles sans
|
||||
authentification et en lecture seule. En mode développement, préférer
|
||||
pour le clonage les urls de développement, qui sont en principe
|
||||
accessibles par clé ssh et en lecture/écriture
|
||||
--no-fetch
|
||||
Ne rien récupérer. Utile avec --update-repolist
|
||||
-N, --no-host
|
||||
-A, --all-hosts
|
||||
-H, -h, --host HOST
|
||||
-T, --this-host
|
||||
Options permettant de spécifier l'hôte pour la récupération de dépôts
|
||||
spécifiques.
|
||||
--no-host demande explicitement à ce qu'aucun hôte ne soit spécifié
|
||||
--all-hosts sélectionne tous les dépôts spécifiques
|
||||
--host récupère uniquement les dépôts pour l'hôte spécifié
|
||||
--this-host équivaut à --host $MYHOST
|
||||
L'option par défaut est --this-host en mode production et --all-hosts en
|
||||
mode développement
|
||||
--update-repolist
|
||||
Forcer la mise à jour de la liste des dépôts. En principe, cette mise à
|
||||
jour n'est pas faite plus d'une fois par période de 24 heures.
|
||||
-0, --offline
|
||||
-n, --no-pull
|
||||
-u, --pull
|
||||
Spécifier le mode opératoire pour la récupération des dépôts.
|
||||
En mode --offline, ni clone ni pull ne sont autorisés. Le module doit
|
||||
avoir déjà été cloné.
|
||||
En mode --no-pull, seul le clonage est autorisé, e.g. le dépôt est
|
||||
cloné si ce n'est pas déjà le cas.
|
||||
En mode --pull, cloner le dépôt si ce n'est pas déjà le cas, ou le
|
||||
mettre à jour le dépôt avant de l'utiliser s'il avait déjà été cloné.
|
||||
Par défaut, utiliser --pull en mode production et --no-pull en mode
|
||||
développement.
|
||||
-i, --identity IDENTITY_FILE
|
||||
Spécifier le fichier depuis lequel lire la clé privée pour les
|
||||
connexions par ssh.
|
||||
-o, --output OUTPUT
|
||||
Spécifier un fichier dans lequel écrire des définitions de variables,
|
||||
notamment REPODIRS qui reçoit la liste des chemins des dépôts qui ont
|
||||
été récupérés. De plus, les variables RUNSSCRIPTSPATH, RUNSMODULESPATH
|
||||
et RUNSHOSTSPATH sont définies.
|
||||
-a, --append-output
|
||||
Ajouter au fichier OUTPUT au lieu de l'écraser"
|
||||
}
|
||||
|
||||
config=
|
||||
mode=
|
||||
fetch=1
|
||||
host_mode=auto
|
||||
host=
|
||||
update_repolist=auto
|
||||
update=auto
|
||||
identity=
|
||||
output=
|
||||
append_output=
|
||||
parse_opts "${PRETTYOPTS[@]}" \
|
||||
--help '$exit_with display_help' \
|
||||
-c:,--config: config= \
|
||||
--prod mode=prod \
|
||||
--devel mode=devel \
|
||||
--no-fetch fetch= \
|
||||
-N,--no-host host_mode=none \
|
||||
-A,--all-hosts host_mode=all \
|
||||
-h:,-H:,--host: '$set@ host; host_mode=one' \
|
||||
-T,--this-host host_mode=self \
|
||||
--update-repolist update_repolist=1 \
|
||||
--no-update-repolist update_repolist= \
|
||||
-0,--offline update=offline \
|
||||
-n,--no-pull update=clone \
|
||||
-u,--pull update=pull \
|
||||
-i:,--identity: identity= \
|
||||
-o:,--output: output= \
|
||||
-a,--append-output append_output=1 \
|
||||
@ args -- "$@" && set -- "${args[@]}" || die "$args"
|
||||
|
||||
__runsmod_loadconf "$config" "$mode" "$update" || die
|
||||
runsmod_checkenv || die
|
||||
estepn "Opération dans le mode $RUNSMOD_MODE"
|
||||
|
||||
if [ "$host_mode" == auto ]; then
|
||||
case "$RUNSMOD_MODE" in
|
||||
prod) host_mode=self;;
|
||||
devel) host_mode=all;;
|
||||
*) host_mode=none;;
|
||||
esac
|
||||
fi
|
||||
|
||||
if [ "$update_repolist" == auto ]; then
|
||||
if runsmod_should_update_repolists; then
|
||||
etitle "Vérification de la liste des dépôts"
|
||||
runsmod_update_repolists
|
||||
eend
|
||||
fi
|
||||
elif [ -n "$update_repolist" ]; then
|
||||
etitle "Mise à jour de la liste des dépôts"
|
||||
runsmod_update_repolists 1
|
||||
eend
|
||||
fi
|
||||
|
||||
r=0
|
||||
if [ -n "$fetch" ]; then
|
||||
etitle "Clonage/mise à jour des dépôts"
|
||||
runsmod_setup_vars
|
||||
runsmod_clone_or_pull "$host_mode" "$host" "$@" || r=1
|
||||
runsmod_teardown_vars
|
||||
eend
|
||||
fi
|
||||
|
||||
if [ -n "$output" ]; then
|
||||
[ "$output" == "-" ] && output=/dev/stdout
|
||||
[ -n "$append_output" ] || >"$output"
|
||||
set_array_cmd REPODIRS >>"$output"
|
||||
echo_setv RUNSSCRIPTSPATH="$RUNSSCRIPTSPATH" >>"$output"
|
||||
echo_setv RUNSMODULESPATH="$RUNSMODULESPATH" >>"$output"
|
||||
echo_setv RUNSHOSTSPATH="$RUNSHOSTSPATH" >>"$output"
|
||||
fi
|
||||
|
||||
exit $r
|
Loading…
Reference in New Issue