rwoinst: ajouter l'option -w qui peut être spécifiée en parallèle de -h pour déployer les resources web vers un serveur différent

This commit is contained in:
Jephté Clain 2017-04-28 14:43:12 +04:00
parent 9e4ccaef00
commit f20cc48176
1 changed files with 76 additions and 45 deletions

117
rwoinst
View File

@ -16,9 +16,8 @@ OPTIONS
un /tmp minuscule de 16 Mo.
-S, --ssh SSH
Spécifier le programme à utiliser pour la connection par ssh.
-h, --host hosts
-h, --host @hostsfile
-H host
-h, -H, --host hosts
-h, -H, --host @hostsfile
Spécifier un ou plusieurs hôtes sur lequels faire le déploiement. Pour
spécifier plusieurs hôtes, il est possible d'utiliser plusieurs fois
l'option -h, ou spécifier en une seule fois plusieurs hôtes en les
@ -31,6 +30,17 @@ OPTIONS
user@host, e.g -h user@host
La forme @hostsfile permet de lire la liste des hôtes depuis le fichier
hostsfile, à raison d'un hôte par ligne.
-w, -W, --whost host[:htdocs]
Comme --host, mais pour le déploiement des resources web. Contrairement
à --host, un seul hôte peut être spécifié par occurence de l'option,
pour permettre de spécifier éventuellement le répertoire vers lequel
copier les resources web. Ainsi, les deux commandes suivantes sont
équivalentes:
rwoinst -h host.tld -- -W HTDOCSDIR=HTDOCSBASE/wo
rwoinst -w host.tld:HTDOCSBASE/wo
Il est possible de spécifier en une seule invocation --host et --whost
pour déployer l'application sur un hôte et les resources web sur un
autre.
--deploy
--no-deploy
Autoriser (respectivement interdire) l'utilisation de la configuration
@ -106,10 +116,49 @@ function fix_hosts() {
array_map hosts __dot_is_localhost
}
function deploy_to() {
local archive="$1" host="$2" tmproot="$3"
shift; shift; shift
local r=
if [ "$host" == "localhost" ]; then
etitle "Sur l'hôte local"
"$archive" ${tmproot:+--tmproot "$tmproot"} -- "$@" || r=1
eend
else
local user
local archivename="$(basename "$archive")"
splituserhost "$host" user host
[ -n "$user" ] || user=root
# sur l'hôte distant, ne rendre non interactif qu'à partir de -yy
rinteraction=$__interaction
[ $rinteraction -lt 2 ] && rinteraction=$(($rinteraction + 1))
etitle "Vers $user@$host"
estep "Copie de l'archive"
scp -S "$SSH" "$archive" "$user@$host:" || r=1
if [ -z "$r" ]; then
estep "Lancement du script de déploiement"
"$SSH" -qt "$user@$host" "\
__interaction=$rinteraction
__estack=$(qval "$__estack")
__tlevel=$(qval "$__tlevel")
export __interaction __estack __tlevel
${UTOOLS_LANG:+UTOOLS_LANG='$UTOOLS_LANG'; export UTOOLS_LANG
}$(qvals "./$archivename" ${tmproot:+--tmproot "$tmproot"} -- MYHOST="$host" "$@")" || r=1
fi
eend
fi
return ${r:-0}
}
action=deploy
tmproot=
SSH=
hosts=()
whosts=()
deploy_enable=1
deploy_confname=rwoinst
parse_opts "${PRETTYOPTS[@]}" \
@ -117,6 +166,7 @@ parse_opts "${PRETTYOPTS[@]}" \
-T:,--tmproot: tmproot= \
-S:,--ssh: SSH= \
-h:,-H:,--host: hosts \
-w:,-W:,--whost: whosts \
--deploy deploy_enable=1 \
--no-deploy deploy_enable= \
-c:,--deploy-config deploy_confname= \
@ -165,8 +215,10 @@ array_isempty hosts && read_value "Entrez une liste d'hôtes séparés par ':'"
fix_hosts
## Création de l'archive
etitle "Création du répertoire de travail"
ac_set_tmpdir workdir
bundles=()
while [ -n "$1" ]; do
if [ "$1" == "--" ]; then
@ -202,55 +254,34 @@ while [ -n "$1" ]; do
done
estep "Copie de l'environnement de déploiement"
ulibsync "$workdir"
echo '#!/bin/sh
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
if . `dirname "$0"`/ulib/ulibsh; then
urequire DEFAULTS woinst
else
exit 1
fi
OENC="$UTF8"
woinst "$@"' >"$workdir/woinst"
chmod +x "$workdir/woinst"
mkdir -p "$workdir/lib"
ulibsync "$workdir/lib"
cp "$scriptdir/woinst.sh" "$workdir"
chmod +x "$workdir/woinst.sh"
eend
etitle "Création de l'archive pour le déploiement"
ac_set_tmpfile archive
archivename="$(basename "$archive")"
etitle "Création de l'archive pour le déploiement" \
"$scriptdir/mkusfx" --bare --tmp-archive -o "$archive" "$workdir" -- ./woinst --is-tmpdir "${bundles[@]}" || die
"$scriptdir/mkusfx" --bare --tmp-archive -o "$archive" "$workdir" -- ./woinst.sh --is-tmpdir "${bundles[@]}" || die
eend
## Déploiement
# sur l'hôte distant, ne rendre interactif qu'à partir de -yy
rinteraction=$__interaction
[ $rinteraction -lt 2 ] && rinteraction=$(($rinteraction + 1))
etitle "Déploiement des bundles"
for host in "${hosts[@]}"; do
if [ "$host" == "localhost" ]; then
etitle "Déploiement sur l'hôte local" \
"$archive" ${tmproot:+--tmproot "$tmproot"} -- "$@"
else
if [[ "$host" == *@* ]]; then
user="${host%%@*}"
host="${host#*@}"
else
user=root
fi
deploy_to "$archive" "$host" "$tmproot" "$@" || die
done
eend
etitle "Déploiement sur $user@$host"
estep "Copie de l'archive"
scp -S "$SSH" "$archive" "$user@$host:" || die
estep "Lancement du script de déploiement"
"$SSH" -qt "$user@$host" "\
__interaction=$rinteraction
__estack=$(qval "$__estack")
__tlevel=$(qval "$__tlevel")
export __interaction __estack __tlevel
${UTOOLS_LANG:+UTOOLS_LANG='$UTOOLS_LANG'; export UTOOLS_LANG
}$(qvals "./$archivename" ${tmproot:+--tmproot "$tmproot"} -- MYHOST="$host" "$@")"
if [ ${#whosts[*]} -gt 0 ]; then
etitle "Déploiement des resources web"
for hostdest in "${whosts[@]}"; do
splitpair "$hostdest" host destdir
deploy_to "$archive" "$host" "$tmproot" \
-y -W ${destdir:+HTDOCSDIR="$destdir"} "$@" || die
done
eend
fi
done