support deploydb et pffprofile

This commit is contained in:
Jephté Clain 2018-04-26 23:21:38 +04:00
parent 7356c1da73
commit 4535b67045
8 changed files with 483 additions and 182 deletions

View File

@ -36,7 +36,7 @@ if [ -z "$webinst" ]; then
etitle "Calcul des instances à relancer" \
compute_apps apps_to_restart appinfos "${apps_to_restart[@]}"
if [ -z "$bounce" ]; then
if [ "$restart" == yes ]; then
# Arrêter les instances
disable_autorecover=1
stop_apps -a apps_to_start "" "" "${apps_to_restart[@]}"
@ -216,11 +216,11 @@ fi
################################################################################
if [ -z "$webinst" ]; then
if [ -z "$bounce" ]; then
if [ "$restart" == yes ]; then
# Démarrer les instances
enable_autorecover=1
start_apps "" "" "${apps_to_start[@]}"
else
elif [ "$restart" == bounce ]; then
# Relancer les applications en mode bounce
bounce_apps "" "" "${apps_to_restart[@]}"
fi

View File

@ -55,6 +55,7 @@ function uinst() {
local -a modes
local -a root_scripts
local uinst2s
local ddb_enable ddb_profile ddb_conf
uinst_nolocal "$@"
}
@ -94,6 +95,28 @@ OPTIONS
la valeur de destdir, forcer le déploiement distant avec ssh+rsync, même
si l'hôte et l'utilisateur correspondent aux valeurs courantes. Cette
option initialise la valeur destdir_force_remote
--deploydb
--nd, --no-deploydb
Autoriser (respectivement interdire) l'utilisation de la configuration
locale de déploiement pour identifier la source et/ou la destination
s'ils ne sont pas spécifiés. Par défaut, la configuration locale de
déploiement est utilisée.
Cette option et toutes celles associées n'est utilisée que pour la
méthode de déploiement uinst:rsync
-p, --dp, --deploydb-profile PROFILENAME
Spécifier un ou plusieurs profils séparés par des virgules pour le
déploiement avec la configuration locale de déploiement. NONE est la
valeur par défaut et signifie de ne sélectionner que les définitions
sans profil. ALL signifie de ne pas tenir compte des profils dans les
définitions.
-A, --all-profiles
-P, --prod
-T, --test
Raccourcis respectivement pour -pALL, -pprod et -ptest
-c, --dc, --deploydb-config CONFNAME
Cette option permet de spécifier un fichier de configuration ou le nom
de la configuration locale de déploiement à utiliser pour effectuer la
requête. Par défaut, utiliser le nom 'uinst.conf'
-a, --auto
Si la source n'est pas spécifiée, déterminer le répertoire à déployer
automatiquement (c'est la valeur par défaut)
@ -143,6 +166,9 @@ OPTIONS
__uinst_init
UINST_ACTION=
UINST_AUTOSRCDIR=1
ddb_enable='1'
ddb_profile='NONE'
ddb_conf='uinst.conf'
parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with __uinst_display_help' \
--is-tmpdir UINST_ISTMPDIR \
@ -152,6 +178,13 @@ OPTIONS
-h:,-H:,--host: '$__uinst_addvar destdir_override_userhost "$value_"' \
-S:,--ssh: '$__uinst_addvar destdir_ssh "$value_"' \
--force-remote '$__uinst_addvar destdir_force_remote 1' \
--deploydb ddb_enable=1 \
--nd,--no-deploydb ddb_enable= \
-p:,--dp:,--deploydb-profile ddb_profile= \
-A,--all-profiles ddb_profile=ALL \
-P,--prod ddb_profile=prod \
-T,--test ddb_profile=test \
-c:,--dc:,--deploydb-config ddb_conf= \
-a,--auto UINST_AUTOSRCDIR=1 \
--no-auto UINST_AUTOSRCDIR= \
--prefix UINST_AUTOPREFIX=1 \
@ -229,7 +262,7 @@ function __uinst_init() {
UINST_CONFIG_VARS=()
UINST_CONFIG_VARCMDS=()
UINST_PROTECTED_VARS=(UINST_PROTECTED_VARS UINST_CONFIG_VARS UINST_CONFIG_VARCMDS)
UINST_PROTECTED_VARS=(UINST_PROTECTED_VARS UINST_CONFIG_VARS UINST_CONFIG_VARCMDS UINST_STANDALONE)
__uinst_protectvars configure_variables \
UINST_ORIGSRC UINST_SRCDIR \
@ -921,6 +954,52 @@ function __uinst_check_rsync() {
function __uinst_rsync() {
# Déployer les fichiers de $srcdir avec rsync
# configuration locale de déploiement
if [ -n "$ddb_enable" -a -n "$UINST_STANDALONE" ]; then
local -a deploydb cmds tmpcmds
deploydb=(
"$scriptdir/lib/nulib/deploydb"
--missing-ok
${ddb_conf:+-c "$ddb_conf"}
-m uinst
--run -r uinst.query_xuinst "$script"
)
cmds=()
array_from_lines tmpcmds "$("${deploydb[@]}" "$srcdir" "" "$ddb_profile" "$@")"
array_extend cmds tmpcmds
if [ ${#cmds[*]} -gt 0 ]; then
if check_interaction -c; then
if [ ${#cmds[*]} -eq 1 ]; then
einfo "La commande suivante va être lancée:"
eecho "\$ $script --no-deploydb \\"
for cmd in "${cmds[0]}"; do
eecho " ${cmd#$script --no-deploydb }"
done
else
einfo "Les commandes suivantes seront lancées:"
eecho "\$ $script --no-deploydb \\"
for cmd in "${cmds[@]}"; do
eecho " ... ${cmd#$script --no-deploydb }"
done
fi
read -p "Confirmez ou attendez 4 secondes [On] " -t 4 r
if [ $? -gt 128 ]; then
echo # cosmetic
elif [ $? -le 128 -a -n "$r" ]; then
is_yes "$r" || die
fi
fi
r=0
for cmd in "${cmds[@]}"; do
einfo "$cmd"
eval "$cmd" || r=1
done
exit $r
elif [ "$ddb_profile" != "ALL" ]; then
ewarn "Aucune configuration locale de déploiement n'a été trouvée pour le profil $ddb_profile"
fi
fi
# initialiser les valeurs par défaut, mais penser à restaurer srcdir
force_rsync_options=(-av --exclude CVS --exclude .svn --exclude /.git/)
rsync_options=()

View File

@ -416,13 +416,17 @@ OPTIONS
une liste de préfixes valides
--no-prefix
Ne jamais corriger un chemin.
--bundle
Déployer le bundle entier. C'est l'option par défaut.
-W, --webres
Ne déployer que les resources web. Implique -n
Ne déployer que les resources web. Implique --no-tag
--tag
Tagger les bundles déployés avec un numéro de version. L'utilisateur est
invité à compléter des informations telles que n° de version et date de
release si ces informations ne sont pas disponible. C'est l'option par
défaut.
-n, --no-tag
Ne pas tagger les bundles déployés avec un numéro de version. En temps
normal, l'utilisateur est invité à compléter des informations telles que
n° de version et date de release si ces informations ne sont pas
disponible.
Ne pas tagger les bundles déployés avec un numéro de version.
-d, --active-dbconfig DBCONFIG
Spécifier le profil de connexion à utiliser par défaut pour tous les
eomodels du bundle. S'il faut un profil différent en fonction de l'eomodel, utiliser l'option -m
@ -437,24 +441,28 @@ OPTIONS
défaut.
-b, --bounce
Redémarrer les instances en mode bounce.
--no-restart
Ne pas redémarrer les instances
-x, --exec CMD
Exécuter la commande CMD après avoir effectué le déploiement"
}
local istmpdir tmpdir autoprefix=1 bounce webinst notag default_dbconfig
local istmpdir tmpdir autoprefix=1 restart=yes webinst notag default_dbconfig
local -a dbconfigs scripts
parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with __woinst_display_help' \
--is-tmpdir '$istmpdir=1; tmpdir=.' \
--prefix autoprefix=1 \
--no-prefix autoprefix= \
--bundle webinst= \
-W,--webres webinst=1 \
--tag notag= \
-n,--no-tag notag=1 \
-d:,--active-dbconfig: default_dbconfig= \
-m:,--active-dbconfig-map: dbconfigs \
--stop-start bounce= \
-b,--bounce bounce=1 \
--stop-start restart=yes \
-b,--bounce restart=bounce \
-no-restart restart=no \
-x:,--exec: scripts \
@ args -- "$@" &&
set -- "${args[@]}" || {
@ -643,7 +651,7 @@ dans NEXT_ROOT = ${NEXT_ROOT:-/}
# Faire le déploiement
local configfile variable
ac_set_tmpfile configfile
for variable in "${variables[@]}" bounce webinst ULIBDIR __estack __tlevel; do
for variable in "${variables[@]}" restart webinst ULIBDIR __estack __tlevel; do
echo_setv "$variable" "${!variable}" >>"$configfile"
done
for array in variables scripts applications frameworks; do

185
rtoinst
View File

@ -7,14 +7,14 @@ function display_help() {
uecho "$scriptname: Déploiement distant avec toinst
USAGE
$scriptname [-h host] [-T tmproot] <archive|dir> [-- options de toinst]
$scriptname [-h host] [-G tmproot] <archive|dir> [-- options de toinst]
note: à cause d'une limitation de makeself, les options de toinst ne devraient
pas contenir d'espaces ni de caractères spéciaux. L'échappement de ces
caractères n'est pas garanti.
OPTIONS
-T, --tmproot TMPROOT
-G, --tmproot 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.
@ -34,20 +34,45 @@ 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.
--deploy
--no-deploy
--deploydb
--nd, --no-deploydb
Autoriser (respectivement interdire) l'utilisation de la configuration
locale de déploiement pour identifier la destination si aucun hôte n'est
spécifié.
Par défaut, si aucun hôte n'est spécifié, la configuration locale de
déploiement est interrogée pour avoir cette information.
-c, --deploy-config CONFNAME
Spécifier le nom de la configuration à utiliser pour l'interrogation de
la configuration locale de déploiement. Par défaut, utiliser le nom
'rtoinst'
-p, --deploy-profile PROFILE
Spécifier le profil à utiliser pour l'interrogation de la configuration
locale de déploiement. Par défaut, aucun profil n'est sélectionné."
locale de déploiement pour identifier la source et/ou la destination
s'ils ne sont pas spécifiés. Par défaut, la configuration locale de
déploiement est utilisée.
-p, --dp, --deploydb-profile PROFILENAME
Spécifier un ou plusieurs profils séparés par des virgules pour le
déploiement avec la configuration locale de déploiement. NONE est la
valeur par défaut et signifie de ne sélectionner que les définitions
sans profil. ALL signifie de ne pas tenir compte des profils dans les
définitions.
-A, --all-profiles
-P, --prod
-T, --test
Raccourcis respectivement pour -pALL, -pprod et -ptest
-l, --select-pffprofile PFFPROFILE
Spécifier un ou plusieurs profils pff séparés par des virgules pour le
déploiement avec la configuration locale de déploiement. NONE signifie
de ne sélectionner que les définitions sans profil pff. ALL est la
valeur par défaut et signifie de ne pas tenir compte des profils pff
dans les définitions.
Cette option est indépendante des options --pffprofile / --no-pffprofile
--pffprofile-support
--no-pffprofile-support
Activer le support du profil pff (resp. le désactiver). Par défaut, le
support est activé.
-j, --ensure-pffprofile
Si le support du profil pff est activé, s'assurer que la webapp est dans
le profil pff spécifié dans la configuration locale de déploiement avant
le déploiement. C'est la valeur par défaut.
-e, --set-pffprofile
Si le support du profil pff est activé, forcer le basculement vers le
profil spécifié dans la configuration locale de déploiement avant le
déploiement.
-c, --dc, --deploydb-config CONFNAME
Cette option permet de spécifier un fichier de configuration ou le nom
de la configuration locale de déploiement à utiliser pour effectuer la
requête. Par défaut, utiliser le nom 'toinst.conf'"
}
__PARSED_HOSTS=()
@ -117,67 +142,120 @@ action=deploy
tmproot=
SSH=
hosts=()
deploy_enable=1
deploy_confname=rtoinst
deploy_profile=
ddb_enable=1
ddb_profile=NONE
ddb_conf=toinst.conf
ddb_pffprofile=ALL
pff_enable=1
pff_support=ensure
parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \
-T:,--tmproot: tmproot= \
-G:,--tmproot: tmproot= \
-S:,--ssh: SSH= \
-h:,-H:,--host: hosts \
--deploy deploy_enable=1 \
--no-deploy deploy_enable= \
-c:,--deploy-config: deploy_confname= \
-p:,--deploy-profile: deploy_profile= \
--deploydb ddb_enable=1 \
--nd,--no-deploydb ddb_enable= \
-p:,--dp:,--deploydb-profile ddb_profile= \
-A,--all-profiles ddb_profile=ALL \
-P,--prod ddb_profile=prod \
-T,--test ddb_profile=test \
-l:,--select-pffprofile: ddb_pffprofile= \
--pffprofile-support pff_enable=1 \
--no-pffprofile-support pff_enable= \
-j,--ensure-pffprofile pff_support=ensure \
-e,--set-pffprofile pff_support=set \
-c:,--dc:,--deploydb-config ddb_conf= \
@ args -- "$@" && set -- "${args[@]}" || die "$args"
: "${SSH:=ssh}"
## webapp à déployer et hôtes sur lesquels faire le déploiement
confirm_webapp=
# quels informations avons-nous?
array_isempty hosts && has_hosts= || has_hosts=1
if [ $# -eq 0 ] || [[ "$1" == -* ]]; then
# pas d'argument, ou c'est une option (qui fait donc partie des arguments de toinst)
[ -d WEB-INF ] && webapp=. || webapp=
confirm_webapp=1
has_webapp=
else
webapp="$1"
has_webapp=1
shift
fi
toinst_options=()
if array_isempty hosts && [ -n "$deploy_enable" -a -n "$webapp" ]; then
urequire deploy
deploy_setconf "$deploy_confname"
if deploy_loadconf; then
setxx waname=abspath "$webapp" // basename --
if eval "$(deploy_query -v host,wamap,protect DEST webapp rtoinst_deploy "$deploy_profile" shell "$waname")"; then
msg="$waname: cette webapp sera déployée vers les hôtes suivants:
$(array_to_lines host "" " ")"
if [ -n "$wamap" -o -n "$protect" ]; then
msg="$msg
avec le(s) paramètre(s) suivant(s):"
[ -n "$wamap" ] && msg="$msg
--wamap $(qval "$wamap")"
[ -n "$protect" ] && msg="$msg
--protect $(qval "$protect")"
# configuration locale de déploiement
if [ -n "$ddb_enable" ]; then
args=()
if [ -n "$pff_enable" ]; then
array_add args "pffprofile_support%=$pff_support"
else
array_add args "pffprofile_support%=false"
fi
check_interaction -c && einfo "$msg"
ask_any "Voulez-vous continuer?" Oq || die
array_copy hosts host
[ -n "$wamap" ] && array_add toinst_options --wamap "$wamap"
[ -n "$protect" ] && array_add toinst_options --protect "$protect"
if [ -n "$confirm_webapp" ]; then
confirm_webapp=
set -- "$webapp" "$@"
deploydb=(
"$scriptdir/lib/nulib/deploydb"
--missing-ok
${ddb_conf:+-c "$ddb_conf"}
-m toinst
--run -r toinst.query_rtoinst "$script"
)
cmds=()
if [ -n "$has_hosts" ]; then
fix_hosts
for host in "${hosts[@]}"; do
array_from_lines tmpcmds "$("${deploydb[@]}" "$webapp" "$host" "$ddb_profile" "$ddb_pffprofile" "${args[@]}")"
array_extend cmds tmpcmds
done
elif [ -n "$has_webapp" ]; then
array_from_lines tmpcmds "$("${deploydb[@]}" "$webapp" "" "$ddb_profile" "$ddb_pffprofile" "${args[@]}")"
array_extend cmds tmpcmds
elif [ -d WEB-INF ]; then
read_value "Veuillez entrer le chemin de la webapp à déployer" webapp . O
has_webapp=1
array_from_lines tmpcmds "$("${deploydb[@]}" "$webapp" "" "$ddb_profile" "$ddb_pffprofile" "${args[@]}")"
array_extend cmds tmpcmds
fi
if [ ${#cmds[*]} -gt 0 ]; then
[ $# -gt 0 ] && ewarn "Les arguments supplémentaires '$*' seront ignorés"
if check_interaction -c; then
if [ ${#cmds[*]} -eq 1 ]; then
einfo "La commande suivante va être lancée:"
eecho "\$ $script --no-deploydb \\"
for cmd in "${cmds[0]}"; do
eecho " ${cmd#$script --no-deploydb }"
done
else
einfo "Les commandes suivantes seront lancées:"
eecho "\$ $script --no-deploydb \\"
for cmd in "${cmds[@]}"; do
eecho " ... ${cmd#$script --no-deploydb }"
done
fi
read -p "Confirmez ou attendez 4 secondes [On] " -t 4 r
if [ $? -gt 128 ]; then
echo # cosmetic
elif [ $? -le 128 -a -n "$r" ]; then
is_yes "$r" || die
fi
fi
r=0
for cmd in "${cmds[@]}"; do
einfo "$cmd"
eval "$cmd" || r=1
done
exit $r
elif [ "$ddb_profile" != "ALL" ]; then
ewarn "Aucune configuration locale de déploiement n'a été trouvée pour le profil $ddb_profile"
fi
fi
if [ -n "$confirm_webapp" ]; then
if [ -z "$has_webapp" ]; then
# pas d'argument, ou c'est une option (qui fait donc partie des arguments de toinst)
read_value "Veuillez entrer la webapp à déployer" webapp "$webapp" O
set -- "$webapp" "$@"
[ -d WEB-INF ] && webapp=.
read_value "Veuillez entrer le chemin de la webapp à déployer" webapp "$webapp" O
has_webapp=1
fi
[ -n "$has_webapp" ] && set -- "$webapp" "$@"
array_isempty hosts && read_value "Entrez une liste d'hôtes séparés par ':'" hosts "localhost"
fix_hosts
@ -222,6 +300,7 @@ estep "Copie de l'environnement de déploiement"
mkdir "$workdir/lib"
ulibsync "$workdir/lib"
cp "$scriptdir/toinst" "$workdir"
cp "$scriptdir/pff" "$workdir"
chmod +x "$workdir/toinst"
eend

150
ruinst
View File

@ -7,7 +7,7 @@ function display_help() {
uecho "$scriptname: Déploiement distant avec uinst
USAGE
$scriptname [-h host] [-T tmproot] <file|archive|dir> [-- options de uinst]
$scriptname [-h host] [-G tmproot] <file|archive|dir> [-- options de uinst]
note: à cause d'une limitation de makeself, les options de uinst ne devraient
pas contenir d'espaces ni de caractères spéciaux. L'échappement de ces
@ -28,7 +28,7 @@ OPTIONS
Si l'hôte distant n'a pas sudo ou si sudo n'est pas configuré, il faut
rajouter l'option --uses-su, e.g:
$scriptname -h user@host --configure root --uses-su
-T, --tmproot TMPROOT
-G, --tmproot 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.
@ -48,17 +48,26 @@ 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.
--deploy
--no-deploy
--deploydb
--nd, --no-deploydb
Autoriser (respectivement interdire) l'utilisation de la configuration
locale de déploiement pour identifier la destination si aucun hôte n'est
spécifié.
Par défaut, si aucun hôte n'est spécifié, la configuration locale de
déploiement est interrogée pour avoir cette information.
-c, --deploy-config CONFNAME
Cette option permet de spécifier le nom de la configuration locale de
déploiement à utiliser pour effectuer la requête. Par défaut, utiliser
le nom 'ruinst'"
locale de déploiement pour identifier la source et/ou la destination
s'ils ne sont pas spécifiés. Par défaut, la configuration locale de
déploiement est utilisée.
-p, --dp, --deploydb-profile PROFILENAME
Spécifier un ou plusieurs profils séparés par des virgules pour le
déploiement avec la configuration locale de déploiement. NONE est la
valeur par défaut et signifie de ne sélectionner que les définitions
sans profil. ALL signifie de ne pas tenir compte des profils dans les
définitions.
-A, --all-profiles
-P, --prod
-T, --test
Raccourcis respectivement pour -pALL, -pprod et -ptest
-c, --dc, --deploydb-config CONFNAME
Cette option permet de spécifier un fichier de configuration ou le nom
de la configuration locale de déploiement à utiliser pour effectuer la
requête. Par défaut, utiliser le nom 'uinst.conf'"
}
__PARSED_HOSTS=()
@ -133,20 +142,25 @@ tmproot=
SSH=
force_make_archive=
hosts=()
deploy_enable=1
deploy_confname=ruinst
ddb_enable=1
ddb_profile=NONE
ddb_conf=uinst.conf
parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \
-C,--configure-user action=configure \
--configure: '$set@ confuser;action=configure' \
--uses-su uses_su=1 \
-T:,--tmproot: tmproot= \
-G:,--tmproot: tmproot= \
-S:,--ssh: SSH= \
--force-make-archive force_make_archive=1 \
-h:,-H:,--host: hosts \
--deploy deploy_enable=1 \
--no-deploy deploy_enable= \
-c:,--deploy-config deploy_confname= \
--deploydb ddb_enable=1 \
--nd,--no-deploydb ddb_enable= \
-p:,--dp:,--deploydb-profile ddb_profile= \
-A,--all-profiles ddb_profile=ALL \
-P,--prod ddb_profile=prod \
-T,--test ddb_profile=test \
-c:,--dc:,--deploydb-config ddb_conf= \
@ args -- "$@" && set -- "${args[@]}" || die "$args"
: "${SSH:=ssh}"
@ -208,7 +222,7 @@ if [ "$action" == "configure" ]; then
IPKS=
[ -n "$confuser" ] && prepare_pubkey_access
etitle -s "Configuration de l'accès par clé ssh"
etitle "Configuration de l'accès par clé ssh"
for host in "${hosts[@]}"; do
etitle "$host" check_pubkey_access "$host" "$confuser" "$IPKS" "$uses_su"
done
@ -219,36 +233,96 @@ fi
################################################################################
# Déploiement
## Répertoires à déployer et hôtes sur lesquels faire le déploiement
confirm_src=
# quels informations avons-nous?
array_isempty hosts && has_hosts= || has_hosts=1
if [ $# -eq 0 ] || [[ "$1" == -* ]] || [[ "$1" == *=* ]]; then
# pas d'argument, ou c'est une option (qui fait donc partie des arguments de uinst)
src=.
confirm_src=1
has_src=
else
# Enlever le répertoire à déployer. Le reste est pour uinst
src="$1"
has_src=1
shift
fi
if array_isempty hosts && [ -n "$deploy_enable" -a -n "$src" ]; then
urequire deploy
deploy_setconf "$deploy_confname"
if deploy_loadconf; then
setxx srcname=abspath "$src" // basename --
if eval "$(deploy_query -v host DEST module ruinst_deploy "" shell "$srcname")"; then
check_interaction -c && einfo "$srcname: ce module sera déployé vers les hôtes suivants:
$(array_to_lines host "" " ")"
ask_any "Voulez-vous continuer?" Oq || die
array_copy hosts host
confirm_src=
# configuration locale de déploiement
if [ -n "$ddb_enable" ]; then
# filtrer les options... elles seront ignorées si on passe finalement par
# deploydb
vars=()
options=()
for arg in "$@"; do
if [[ "$arg" == *=* ]]; then
array_add vars "$arg"
else
array_add options "$arg"
fi
done
deploydb=(
"$scriptdir/lib/nulib/deploydb"
--missing-ok
${ddb_conf:+-c "$ddb_conf"}
-m uinst
--run -r uinst.query_xuinst "$script"
)
cmds=()
if [ -n "$has_hosts" ]; then
fix_hosts
for host in "${hosts[@]}"; do
array_from_lines tmpcmds "$("${deploydb[@]}" "$src" "$host" "$ddb_profile" "${vars[@]}")"
array_extend cmds tmpcmds
done
elif [ -n "$has_src" ]; then
array_from_lines tmpcmds "$("${deploydb[@]}" "$src" "" "$ddb_profile" "${vars[@]}")"
array_extend cmds tmpcmds
else
read_value "Entrez le répertoire à déployer" src . O
has_src=1
array_from_lines tmpcmds "$("${deploydb[@]}" "$src" "" "$ddb_profile" "${vars[@]}")"
array_extend cmds tmpcmds
fi
if [ ${#cmds[*]} -gt 0 ]; then
[ ${#options[*]} -gt 0 ] && ewarn "Les options supplémentaires '${options[*]}' seront ignorées"
if check_interaction -c; then
if [ ${#cmds[*]} -eq 1 ]; then
einfo "La commande suivante va être lancée:"
eecho "\$ $script --no-deploydb \\"
for cmd in "${cmds[0]}"; do
eecho " ${cmd#$script --no-deploydb }"
done
else
einfo "Les commandes suivantes seront lancées:"
eecho "\$ $script --no-deploydb \\"
for cmd in "${cmds[@]}"; do
eecho " ... ${cmd#$script --no-deploydb }"
done
fi
read -p "Confirmez ou attendez 4 secondes [On] " -t 4 r
if [ $? -gt 128 ]; then
echo # cosmetic
elif [ $? -le 128 -a -n "$r" ]; then
is_yes "$r" || die
fi
fi
r=0
for cmd in "${cmds[@]}"; do
einfo "$cmd"
eval "$cmd" || r=1
done
exit $r
elif [ "$ddb_profile" != "ALL" ]; then
ewarn "Aucune configuration locale de déploiement n'a été trouvée pour le profil $ddb_profile"
fi
fi
if [ -n "$confirm_src" ]; then
## Répertoires à déployer et hôtes sur lesquels faire le déploiement
if [ -z "$has_src" ]; then
# pas d'argument, ou c'est une option (qui fait donc partie des arguments de uinst)
read_value "Entrez le répertoire à déployer" src "$src" O
read_value "Entrez le répertoire à déployer" src . O
has_src=1
fi
array_isempty hosts && read_value "Entrez une liste d'hôtes séparés par ':'" hosts "localhost"
@ -286,7 +360,7 @@ rinteraction=$__interaction
for host in "${hosts[@]}"; do
if [ "$host" == "localhost" ]; then
etitle -s "Déploiement sur l'hôte local"
etitle "Déploiement sur l'hôte local"
if [ -n "$force_make_archive" ]; then
"$archive" ${tmproot:+--tmproot "$tmproot"} -- "$@"
else
@ -297,7 +371,7 @@ for host in "${hosts[@]}"; do
splituserhost "$host" user host
[ -n "$user" ] || user=root
etitle -s "Déploiement sur $user@$host"
etitle "Déploiement sur $user@$host"
estep "Copie de l'archive"
scp -S "$SSH" "$archive" "$user@$host:" || die

189
rwoinst
View File

@ -1,20 +1,20 @@
#!/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
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]
$scriptname [-H host] [-G tmproot] <archive|dir>... [-- options de woinst]
note: à cause d'une limitation de makeself, les options de toinst ne devraient
pas contenir d'espaces ni de caractères spéciaux. L'échappement de ces
caractères n'est pas garanti.
OPTIONS
-T, --tmproot TMPROOT
-G, --tmproot 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.
@ -45,19 +45,26 @@ OPTIONS
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
--deploydb
--nd, --no-deploydb
Autoriser (respectivement interdire) l'utilisation de la configuration
locale de déploiement pour identifier la destination si aucun hôte n'est
spécifié.
Par défaut, si aucun hôte n'est spécifié, la configuration locale de
déploiement est interrogée pour avoir cette information.
-c, --deploy-config CONFNAME
Cette option permet de spécifier le nom de la configuration à utiliser
pour effectuer la requête. Par défaut, utiliser le nom 'rwoinst'
-p, --deploy-profile PROFILE
Spécifier le profil à utiliser pour l'interrogation de la configuration
locale de déploiement. Par défaut, aucun profil n'est sélectionné."
locale de déploiement pour identifier la source et/ou la destination
s'ils ne sont pas spécifiés. Par défaut, la configuration locale de
déploiement est utilisée.
-p, --dp, --deploydb-profile PROFILENAME
Spécifier un ou plusieurs profils séparés par des virgules pour le
déploiement avec la configuration locale de déploiement. NONE est la
valeur par défaut et signifie de ne sélectionner que les définitions
sans profil. ALL signifie de ne pas tenir compte des profils dans les
définitions.
-A, --all-profiles
-P, --prod
-T, --test
Raccourcis respectivement pour -pALL, -pprod et -ptest
-c, --dc, --deploydb-config CONFNAME
Cette option permet de spécifier un fichier de configuration ou le nom
de la configuration locale de déploiement à utiliser pour effectuer la
requête. Par défaut, utiliser le nom 'woinst.conf'"
}
__PARSED_HOSTS=()
@ -169,94 +176,118 @@ tmproot=
SSH=
hosts=()
whosts=()
deploy_enable=1
deploy_confname=rwoinst
deploy_profile=
ddb_enable=1
ddb_profile=NONE
ddb_conf=woinst.conf
parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \
-T:,--tmproot: tmproot= \
-G:,--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= \
-p:,--deploy-profile: deploy_profile= \
--deploydb ddb_enable=1 \
--nd,--no-deploydb ddb_enable= \
-p:,--dp:,--deploydb-profile ddb_profile= \
-A,--all-profiles ddb_profile=ALL \
-P,--prod ddb_profile=prod \
-T,--test ddb_profile=test \
-c:,--dc:,--deploydb-config ddb_conf= \
@ args -- "$@" && set -- "${args[@]}" || die "$args"
: "${SSH:=ssh}"
## Bundle à déployer et hôtes sur lesquels faire le déploiement
confirm_bundle=
# quels informations avons-nous?
array_isempty hosts && has_hosts= || has_hosts=1
if [ $# -eq 0 ] || [[ "$1" == -* ]] || [[ "$1" == *=* ]]; then
# pas d'argument, ou c'est une option (qui fait donc partie des arguments de woinst)
case "$(basename -- "$(pwd)")" in
*.woa|*.framework) bundle=.;;
*) bundle=;;
esac
confirm_bundle=1
has_bundle=
else
bundle="$1"
has_bundle=1
shift
fi
woinst_options=()
if array_isempty hosts && [ -n "$deploy_enable" -a -n "$bundle" ]; then
urequire deploy
deploy_setconf "$deploy_confname"
if deploy_loadconf; then
setxx bundlename=abspath "$bundle" // basename --
host=(); bounce=; notag=; exec=; dbconfig=; dbconfigmap=
if eval "$(deploy_query -v host,bounce,notag,exec,dbconfig,dbconfigmap DEST wobundle rwoinst_bundle "$deploy_profile" shell "$bundlename")"; then
array_copy deploy_hosts host
deploy_options=()
[ -n "$bounce" ] && array_add deploy_options -b
[ -n "$notag" ] && array_add deploy_options -n
if [ -n "$exec" ]; then
for x in "${exec[@]}"; do
array_add deploy_options -x "$x"
# configuration locale de déploiement
if [ -n "$ddb_enable" ]; then
# filtrer les options... elles seront ignorées si on passe finalement par
# deploydb
vars=()
options=()
for arg in "$@"; do
if [[ "$arg" == *=* ]]; then
array_add vars "$arg"
else
array_add options "$arg"
fi
done
deploydb=(
"$scriptdir/lib/nulib/deploydb"
--missing-ok
${ddb_conf:+-c "$ddb_conf"}
-m woinst
--run -r woinst.query_rwoinst "$script"
)
cmds=()
myname="$(basename "$(pwd)")"
if [ -n "$has_hosts" ]; then
fix_hosts
for host in "${hosts[@]}"; do
array_from_lines tmpcmds "$("${deploydb[@]}" "$bundle" "$host" "$ddb_profile" "${vars[@]}")"
array_extend cmds tmpcmds
done
elif [ -n "$has_bundle" ]; then
array_from_lines tmpcmds "$("${deploydb[@]}" "$bundle" "" "$ddb_profile" "${vars[@]}")"
array_extend cmds tmpcmds
elif [[ "$myname" == *.woa ]] || [[ "$myname" == *.framework ]]; then
read_value "Veuillez entrer le chemin du bundle à déployer" bundle . O
has_bundle=1
array_from_lines tmpcmds "$("${deploydb[@]}" "$bundle" "" "$ddb_profile" "${vars[@]}")"
array_extend cmds tmpcmds
fi
if [ ${#cmds[*]} -gt 0 ]; then
[ ${#options[*]} -gt 0 ] && ewarn "Les options supplémentaires '${options[*]}' seront ignorées"
if check_interaction -c; then
if [ ${#cmds[*]} -eq 1 ]; then
einfo "La commande suivante va être lancée:"
eecho "\$ $script --no-deploydb \\"
for cmd in "${cmds[0]}"; do
eecho " ${cmd#$script --no-deploydb }"
done
else
einfo "Les commandes suivantes seront lancées:"
eecho "\$ $script --no-deploydb \\"
for cmd in "${cmds[@]}"; do
eecho " ... ${cmd#$script --no-deploydb }"
done
fi
[ -n "$dbconfig" ] && array_add deploy_options -d "$dbconfig"
if [ -n "$dbconfigmap" ]; then
for m in "${dbconfigmap[@]}"; do
array_add deploy_options -m "$m"
read -p "Confirmez ou attendez 4 secondes [On] " -t 4 r
if [ $? -gt 128 ]; then
echo # cosmetic
elif [ $? -le 128 -a -n "$r" ]; then
is_yes "$r" || die
fi
fi
r=0
for cmd in "${cmds[@]}"; do
einfo "$cmd"
eval "$cmd" || r=1
done
fi
deploy_whosts=()
host=(); destdir=
if eval "$(deploy_query -v host,destdir DEST wobundle rwoinst_webres "$deploy_profile" shell "$bundlename")"; then
for wh in "${host[@]}"; do
array_add deploy_whosts "$wh:$destdir"
done
fi
msg="$bundlename: ce bundle sera déployé vers les hôtes suivants:
$(array_to_lines deploy_hosts "" " ")"
if [ ${#deploy_whosts[*]} -gt 0 -o ${#deploy_options[*]} -gt 0 ]; then
msg="$msg
avec le(s) paramètre(s) suivant(s):"
[ ${#deploy_whosts[*]} -gt 0 ] && msg="$msg
$(array_to_lines deploy_whosts "" " --whost ")"
[ ${#deploy_options[*]} -gt 0 ] && msg="$msg
$(qvals "${deploy_options[@]}")"
fi
check_interaction -c && einfo "$msg"
ask_any "Voulez-vous continuer?" Oq || die
array_extend hosts deploy_hosts
array_extend woinst_options deploy_options
array_extend whosts deploy_whosts
if [ -n "$confirm_bundle" ]; then
confirm_bundle=
set -- "$bundle" "$@"
fi
fi
exit $r
elif [ "$ddb_profile" != "ALL" ]; then
ewarn "Aucune configuration locale de déploiement n'a été trouvée pour le profil $ddb_profile"
fi
fi
if [ -n "$confirm_bundle" ]; then
if [ -z "$has_bundle" ]; then
# pas d'argument, ou c'est une option (qui fait donc partie des arguments de woinst)
read_value "Veuillez entrer la bundle à déployer" bundle "$bundle" O
set -- "$bundle" "$@"
read_value "Veuillez entrer le chemin du bundle à déployer" bundle "$bundle" O
has_bundle=1
fi
[ -n "$has_bundle" ] && set -- "$bundle" "$@"
array_isempty hosts && read_value "Entrez une liste d'hôtes séparés par ':'" hosts "localhost"
fix_hosts

29
toinst
View File

@ -60,6 +60,12 @@ OPTIONS
déployée. Ce compte doit avoir le rôle manager-script à partir de Tomcat
6.0.30, et le rôle manager-gui dans les version antérieurs. Par défaut,
le fichier tomcat-users.xml est consulté pour avoir cette information.
-j, --ensure-pffprofile PFFPROFILE
Vérifier que les webapps sont dans le profil pff spécifié. Arrêter le
déploiement si ce n'est pas le cas.
Si la webapp n'est pas gérée par pff, cette option est ignorée.
-e, --set-pffprofile PFFPROFILE
Forcer le basculement vers le profil pff spécifié avant le déploiement.
-m, --wamap WAMAPS
Ajouter un ou plusieurs mappings de la forme src:dest. Avec ce mapping,
la webapp src est déployée avec le nom dest. Plusieurs mappings peuvent
@ -251,6 +257,8 @@ args=(%
-g:,--manager-url: manager_url=
-u:,--user: manager_user=
-p:,--password: manager_password=
-j:,--ensure-pffprofile: ensure_pffprofile=
-e:,--set-pffprofile: set_pffprofile=
-m:,--wamap: wamaps
--exclude: excludes
--replace-excludes: replace_excludes
@ -483,6 +491,27 @@ for src in "${srcs[@]}"; do
fi
done
if [ -n "$will_deploy" ]; then
ko=
for src in "${srcs[@]}"; do
if [ -f "$src/.pff.conf" -a -d "$src/pff" ]; then
# géré par pff
if [ -n "$set_pffprofile" ]; then
"$scriptdir/pff" -s "$set_pffprofile" "$src" || die
fi
if [ -L "$src/pff/.Current" -a -n "$ensure_pffprofile" ]; then
actual_pffprofile="$(readlink "$src/pff/.Current")"
if [ "$actual_pffprofile" != "$ensure_pffprofile" ]; then
[ -z "$ko" ] && eimportant "Ce déploiement requière le profil pff '$ensure_pffprofile'"
eerror "$(basename "$src"): le profil pff actuel est '$actual_pffprofile'"
ko=1
fi
fi
fi
done
[ -n "$ko" ] && die
fi
################################################################################
# Maintenant, nous pouvons faire les actions

1
uinst
View File

@ -3,4 +3,5 @@
source "$(dirname -- "$0")/lib/ulib/ulib" || exit 1
urequire DEFAULTS uinst
UINST_STANDALONE=1
uinst_nolocal "$@"