diff --git a/rwoinst b/rwoinst index e93484c..5f5881b 100755 --- a/rwoinst +++ b/rwoinst @@ -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 - - 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" "$@")" - eend - fi + deploy_to "$archive" "$host" "$tmproot" "$@" || die done +eend + +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