175 lines
5.6 KiB
Bash
Executable File
175 lines
5.6 KiB
Bash
Executable File
#!/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 woinst
|
|
|
|
function display_help() {
|
|
uecho "$scriptname: Déploiement distant avec woinst
|
|
|
|
USAGE
|
|
$scriptname [-H host] [-T tmproot] <file|archive|dir>... [-- options de woinst]
|
|
|
|
OPTIONS
|
|
-C Ne pas faire le déploiement. Configurer uniquement la connexion par clé
|
|
sur les hôtes distants spécifiés pour le user spécifié. Il faut pouvoir
|
|
se connecter par mot de passe pour configurer la connexion par clé.
|
|
Si l'on veut configurer la connexion par clé pour le user root, mais que
|
|
ce n'est pas possible de se connecter par mot de passe avec le user root
|
|
sur l'hôte distant, et qu'il existe un user sudoer sur l'hôte distant,
|
|
il est possible de faire la configuration avec '--configure root'. La
|
|
commande serait alors
|
|
$scriptname -H user@host --configure root
|
|
-T tmproot
|
|
Spécifier le répertoire temporaire sur l'hôte distant, comme par exemple
|
|
/var/tmp. Cette option est utile pour les vservers, qui ont par défaut
|
|
un /tmp minuscule de 16 Mo.
|
|
-S ssh
|
|
Spécifier le programme à utiliser pour la connection par ssh.
|
|
-H host
|
|
Spécifier un hôte distant sur lequel faire le déploiement. Plusieurs
|
|
options -H peuvent être spécifiées, ou alors on peut séparer plusieurs
|
|
hôtes par ':', e.g. -H host1:host2
|
|
Par défaut, la connexion sur l'hôte distant se fait avec l'utilisateur
|
|
root. Il est possible de spécifier un autre utilisateur avec la syntaxe
|
|
user@host, e.g -H user@host"
|
|
}
|
|
|
|
set_defaults pubkeys
|
|
|
|
action=deploy
|
|
confuser=
|
|
tmproot=
|
|
hosts=()
|
|
SSH=
|
|
parse_opts "${PRETTYOPTS[@]}" \
|
|
--help '$exit_with display_help' \
|
|
-C action=configure \
|
|
--configure: '$set@ confuser;action=configure' \
|
|
-T:,--tmproot: tmproot= \
|
|
-S: SSH= \
|
|
-h:,-H:,--host: hosts \
|
|
@ args -- "$@" && set -- "${args[@]}" || die "$args"
|
|
|
|
function _dot_is_localhost() {
|
|
[ "$1" == "." ] && echo "localhost" || echo "$1"
|
|
}
|
|
function fix_hosts() {
|
|
# Si hosts contient des éléments multiple, comme a:b, séparés ces
|
|
# éléments. i.e (a b:c) --> (a b c)
|
|
# remplacer aussi les '.' par 'localhost'
|
|
array_fix_paths hosts
|
|
array_map hosts _dot_is_localhost
|
|
}
|
|
|
|
################################################################################
|
|
# Configuration de l'accès par clé aux hôtes
|
|
|
|
if [ "$action" == "configure" ]; then
|
|
args=(${confuser:+--configure "$confuser"})
|
|
for host in "${hosts[@]}"; do
|
|
args=("${args[@]}" -H "$host")
|
|
done
|
|
exec "$scriptdir/ruinst" -C "${args[@]}"
|
|
fi
|
|
|
|
################################################################################
|
|
# Déploiement
|
|
|
|
SSH="${SSH:-ssh}"
|
|
|
|
## Bundle à déployer
|
|
if [ -z "$1" ] || [[ "$1" == -* ]] || [[ "$1" == *=* ]]; then
|
|
# pas d'argument, ou c'est une option (qui fait donc partie des arguments de
|
|
# woinst)
|
|
die "Vous devez spécifier le bundle à déployer"
|
|
fi
|
|
|
|
## Hôtes sur lesquels faire le déploiement
|
|
array_isempty hosts && read_value "Entrez une liste d'hôtes séparés par ':'" hosts "localhost"
|
|
fix_hosts
|
|
|
|
## Création de l'archive
|
|
etitle -s "Création du répertoire de travail"
|
|
ac_set_tmpdir workdir
|
|
bundles=()
|
|
while [ -n "$1" ]; do
|
|
if [ "$1" == "--" ]; then
|
|
# début des options de woinst
|
|
shift
|
|
break
|
|
elif [[ "$1" == -* ]] || [[ "$1" == *=* ]]; then
|
|
# début des options de woinst
|
|
break
|
|
fi
|
|
|
|
src="$1"; shift
|
|
if [ -f "$src" ] && is_archive "$src"; then
|
|
estep "$(ppath "$src")"
|
|
cp_R "$src" "$workdir" || die
|
|
elif [ -d "$src" ]; then
|
|
src="$(abspath "$src")"
|
|
if endswith "$src" .framework; then
|
|
is_wofwkdir "$src" || die "Framework invalide: $(ppath "$src")"
|
|
elif endswith "$src" .woa; then
|
|
is_woappdir "$src" || die "Application invalide: $(ppath "$src")"
|
|
else
|
|
die "N'est pas un bundle valide: $(ppath "$src")"
|
|
fi
|
|
estep "$(ppath "$src")"
|
|
cp_R "$src" "$workdir" || die
|
|
else
|
|
die "Fichier ou répertoire introuvable: $src"
|
|
fi
|
|
|
|
src="$(abspath "$src")"
|
|
array_add bundles "$(basename "$src")"
|
|
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"
|
|
|
|
eend
|
|
|
|
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
|
|
|
|
## Déploiement
|
|
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 -s "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" "\
|
|
__estack=$(quoted_arg "$__estack")
|
|
__tlevel=$(quoted_arg "$__tlevel")
|
|
export __estack __tlevel
|
|
${UTOOLS_LANG:+UTOOLS_LANG='$UTOOLS_LANG'; export UTOOLS_LANG
|
|
}$(quoted_args "./$archivename" ${tmproot:+--tmproot "$tmproot"} -- MYHOST="$host" "$@")"
|
|
eend
|
|
fi
|
|
done
|