From 4535b67045570f34c2ae7b8f033f875514d19831 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Thu, 26 Apr 2018 23:21:38 +0400 Subject: [PATCH] support deploydb et pffprofile --- lib/ulib/support/woinst2s | 6 +- lib/ulib/uinst | 81 ++++++++++++++++- lib/ulib/woinst | 26 ++++-- rtoinst | 185 ++++++++++++++++++++++++++----------- ruinst | 150 ++++++++++++++++++++++-------- rwoinst | 187 ++++++++++++++++++++++---------------- toinst | 29 ++++++ uinst | 1 + 8 files changed, 483 insertions(+), 182 deletions(-) diff --git a/lib/ulib/support/woinst2s b/lib/ulib/support/woinst2s index 083ece9..96faf61 100755 --- a/lib/ulib/support/woinst2s +++ b/lib/ulib/support/woinst2s @@ -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 diff --git a/lib/ulib/uinst b/lib/ulib/uinst index 563ed69..e41ba6d 100644 --- a/lib/ulib/uinst +++ b/lib/ulib/uinst @@ -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=() diff --git a/lib/ulib/woinst b/lib/ulib/woinst index 3e2a9fd..eaa6296 100644 --- a/lib/ulib/woinst +++ b/lib/ulib/woinst @@ -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 diff --git a/rtoinst b/rtoinst index e6f0d28..d0d21a8 100755 --- a/rtoinst +++ b/rtoinst @@ -7,14 +7,14 @@ function display_help() { uecho "$scriptname: Déploiement distant avec toinst USAGE - $scriptname [-h host] [-T tmproot] [-- options de toinst] + $scriptname [-h host] [-G tmproot] [-- 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 + + 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 - 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" "$@" + 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 diff --git a/ruinst b/ruinst index 4aa8dcd..84d7d05 100755 --- a/ruinst +++ b/ruinst @@ -7,7 +7,7 @@ function display_help() { uecho "$scriptname: Déploiement distant avec uinst USAGE - $scriptname [-h host] [-T tmproot] [-- options de uinst] + $scriptname [-h host] [-G tmproot] [-- 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 diff --git a/rwoinst b/rwoinst index 615adaa..dd0efaf 100755 --- a/rwoinst +++ b/rwoinst @@ -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] ... [-- options de woinst] + $scriptname [-H host] [-G tmproot] ... [-- 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" - 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" "$@" + 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_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 diff --git a/toinst b/toinst index 7020e17..1cdd1b4 100755 --- a/toinst +++ b/toinst @@ -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 diff --git a/uinst b/uinst index 8f4fdde..733ef64 100755 --- a/uinst +++ b/uinst @@ -3,4 +3,5 @@ source "$(dirname -- "$0")/lib/ulib/ulib" || exit 1 urequire DEFAULTS uinst +UINST_STANDALONE=1 uinst_nolocal "$@"