diff --git a/CHANGES.md b/CHANGES.md index dfabbcd..16f92d5 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,10 @@ +## Version 9.6.0 du 24/02/2020-09:13 + +* `b7492fc` dk: ajout de l'option -e +* `08c081a` modification pour support des valeurs spéciales (ne sont pas synchronisées) dans LDAP +* `98129cd` passer par un script annexe pour cssh +* `99c0ccd` dk: support de PHP_VERSION_MAX + ## Version 9.5.0 du 28/01/2020-14:06 * `640a2b1` maj doc diff --git a/VERSION.txt b/VERSION.txt index d223b45..7b0680f 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -9.5.0 +9.6.0 diff --git a/cssh b/cssh index e2c5c12..ae29366 100755 --- a/cssh +++ b/cssh @@ -23,68 +23,18 @@ vars="$("$scriptdir/ussh" --parse "$@")" || die eval "$vars" [ "${#hosts[*]}" -gt 0 ] || die "Vous devez spécifier l'hôte sur lequel se connecter" -cmd="'$(qvals "${args[@]}") -"' -function __ask() { - local r - read -p "$1" -t 2 r - [ $? -gt 128 -o -z "$r" -o "$r" == "o" -o "$r" == "O" -o "$r" == "y" -o "$r" == "Y" ] -} - -function __auto_screen() { - # Si screen pas installé, ne rien faire - if [ -z "$(which screen 2>/dev/null)" ]; then - echo "'"$COULEUR_JAUNE"'WARNING'"$COULEUR_NORMALE"' screen introuvable. une session bash classique sera lancée" - exec /bin/bash -l - fi - - # Si on est déjà dans screen, ne rien faire - [ -z "$STY" ] || return - - # corriger TERM pour les vieilles versions de Linux - case "$TERM" in - xterm*) TERM=xterm;; - screen*) TERM=screen;; - esac - export TERM - - local msgprefix - local screens count - - screens="$(LANG=C screen -ls | grep -Ei "attached|detached")" - if [ -n "$screens" ]; then - count="$(echo "$screens" | wc -l)" - else - count=0 - fi - if [ $count -gt 0 ]; then - if [ $count -eq 1 ]; then - msgprefix="Il y a '"$COULEUR_BLEUE"'1 session screen en cours'"$COULEUR_NORMALE"' -Cette session" - else - msgprefix="Il y a '"$COULEUR_ROUGE"'$count sessions screen en cours'"$COULEUR_NORMALE"': -$screens -La première session" - fi - if __ask " -$msgprefix sera reconnectée automatiquent dans 2 secondes -Voulez-vous reconnecter la session screen? [On] "; then - exec screen -q -s -/bin/bash -xRR - else - exec /bin/bash -l - fi - elif __ask " -Une '"$COULEUR_VERTE"'nouvelle session screen'"$COULEUR_NORMALE"' sera lancée automatiquement dans 2 secondes -Voulez-vous lancer une session screen? [On] "; then - exec screen -q -s -/bin/bash -RR - else - exec /bin/bash -l - fi -} - -__auto_screen -'\' +[ ${#args[*]} -gt 0 ] && cmd="$(qvals "${args[@]}"); " || cmd= +cmd="$cmd$(<"$scriptdir/start-screen")" +cmd="'${cmd//\'/\'\\\'\'}'" for host in "${hosts[@]}"; do - ${exec:+exec} "$ssh" "${options[@]}" -t "$host" -- /bin/bash -c "$cmd" + "$ssh" \ + "${options[@]}" -qt "$host" -- \ + "[ -x /usr/local/nutools/start-screen ] && exec /usr/local/nutools/start-screen $(qvals "${args[@]}") || exit 123" + if [ $? -eq 123 ]; then + # pas de start-screen en face, le faire à la main + ${exec:+exec} \ + "$ssh" "${options[@]}" -t "$host" -- \ + /bin/bash -c "$cmd" + fi done diff --git a/dk b/dk index 374017a..b634627 100755 --- a/dk +++ b/dk @@ -154,6 +154,14 @@ COMMANDES Cette valeur doit être spécifiée avec le format de PHP_VERSION_ID i.e 70300 pour PHP 7.3 Spécifier 'any' ou 'force' pour forcer l'utilisation de l'image docker + * COMPOSER_PHP_MAX -- Version de PHP à partir de laquelle COMPOSER_IMAGE + est utilisée. En d'autres termes, c'est la version maximum de PHP, à + partir de laquelle il faut passer par une image docker. L'idée est que + si la version de PHP installée est trop récente, ça peut poser + problème avec le calcul des dépendances. + Cette valeur doit être spécifiée avec le format de PHP_VERSION_ID i.e + 70300 pour PHP 7.3 + Si la valeur n'est pas spécifiée ou vaut 'none', elle est ignorée. * COMPOSER_IMAGE -- Image utilisée pour lancer composer. La valeur par défaut est: $DEFAULT_COMPOSER_IMAGE @@ -205,6 +213,8 @@ OPTIONS générales commandes. Utiliser -u pour desélectionner la machine en cours, e.g -m-u -n, --fake Ne pas lancer les commandes, simplement les afficher + -e, --build-arg, --env VAR=VALUE + (Re)définir un argument pour le build ou une variable d'environnement -f, --force Forcer l'opération (là où cela a du sens) -h, --host HOST @@ -352,11 +362,13 @@ function docker_parse_env_args() { [ -f .build.env ] && eval "$(docker_parse_build_args .build.env)" [ -f build.env ] && eval "$(docker_parse_build_args build.env)" [ -n "$PROFILE" -a -f ".build.$PROFILE.env" ] && eval "$(docker_parse_build_args ".build.$PROFILE.env")" + [ -n "$PROFILE" -a -f "build.$PROFILE.env" ] && eval "$(docker_parse_build_args "build.$PROFILE.env")" } function docker_set_env_args() { [ -f .build.env ] && source ./.build.env [ -f build.env ] && source ./build.env [ -n "$PROFILE" -a -f ".build.$PROFILE.env" ] && source "./.build.$PROFILE.env" + [ -n "$PROFILE" -a -f "build.$PROFILE.env" ] && source "./build.$PROFILE.env" } function docker_set_run_args() { replace_run_args+=(--env-file "$1") @@ -791,6 +803,7 @@ function initialize_build_env() { DIST= } function default_update_build_env() { + local var if [ -n "$DIST" ]; then [ -n "$VERSION" ] && VERSION="$VERSION-" VERSION="$VERSION$DIST" @@ -798,6 +811,10 @@ function default_update_build_env() { fi [ -n "$VERSION" ] || docker_add_build_arg VERSION "$(get_version)" [ -n "$VERSION" ] && TAGS+=("$VERSION") + # Variables en ligne de commande + for var in "${VARS[@]}"; do + docker_add_build_arg "${var%%=*}" "${var#*=}" + done } function update_build_env() { default_update_build_env; } @@ -1023,6 +1040,11 @@ function auto_run() { eval "$(utools_local parse_opts)" local detach no_deps rm=1 service_ports use_aliases volume local -a envs labels + local var + for var in "${VARS[@]}"; do + envs+=(-e "$var") + done + args=( + -d,--detach detach=1 @@ -1401,6 +1423,7 @@ function local_composer() { default_local_composer "$@"; } function docker_composer() { default_docker_composer "$@"; } function auto_composer() { local COMPOSER_PHP= + local COMPOSER_PHP_MAX= local COMPOSER_IMAGE="$DEFAULT_COMPOSER_IMAGE" local COMPOSER_MACHINE=-u local COMPOSER_CMD= @@ -1410,6 +1433,7 @@ function auto_composer() { while [ $# -gt 0 ]; do case "$1" in COMPOSER_PHP=*) setv "$1"; shift;; + COMPOSER_PHP_MAX=*) setv "$1"; shift;; COMPOSER_IMAGE=*) setv "$1"; shift;; COMPOSER_MACHINE=*) setv "$1"; shift;; COMPOSER_CMD=*) setv "$1"; shift;; @@ -1419,7 +1443,20 @@ function auto_composer() { done local use_image - if [ -z "$COMPOSER_PHP" ]; then + if [ -n "$COMPOSER_PHP_MAX" -a "$COMPOSER_PHP_MAX" != none ]; then + # Vérifier la version de PHP + php -r ' +$version = $argv[1]; +if (strpos($version, ".") !== false) { + $version = explode(".", $version); + $version = $version[0] * 10000 + $version[1] * 100 + (isset($version[2])? $version[2]: 0); +} +exit((PHP_VERSION_ID > $version)? 0: 1); +' -- "$COMPOSER_PHP_MAX" && use_image=1 + fi + if [ -n "$use_image" ]; then + : # ok, on a déjà décidé qu'il faut utiliser une image + elif [ -z "$COMPOSER_PHP" ]; then # pas de version minimum, tester simplement la valeur de COMPOSER_IMAGE [ "$COMPOSER_IMAGE" != none ] && use_image=1 elif [ "$COMPOSER_PHP" == force -o "$COMPOSER_PHP" == any ]; then @@ -1479,6 +1516,7 @@ CONFIG= DM_SET_MACHINE= USE_STACK= FAKE= +VARS=() FORCE= NO_CACHE= HOST= @@ -1497,6 +1535,7 @@ args=( -m:,--set-machine: DM_SET_MACHINE= --stack USE_STACK=1 -n,--fake FAKE=1 + -e:,--build-arg:,--env: VARS -f,--force FORCE=1 -j,--no-cache NO_CACHE=1 -h:,--host: HOST= diff --git a/lib/ulib/awk b/lib/ulib/awk index 1de1465..4395b73 100644 --- a/lib/ulib/awk +++ b/lib/ulib/awk @@ -582,19 +582,63 @@ function deli(num, i, j) { } function del(field) { deli(geth(field)) } -function comparevic(field1, value1, field2, value2, icfields, array) { +function __starts_with(prefix, string) { + return substr(string, 1, length(prefix)) == prefix +} +function __comparevic_truth(retval) { + return substr(retval, 1, 1) == "1" +} +function __comparevic_suffix(retval) { + return substr(retval, 2) +} +function comparevic(field1, value1, field2, value2, icfields, spfields, array, i, vs, f, prefix, suffix) { + # tester si on est un champ spécial. + prefix = "" + split(spfields, array, /,/) + for (i in array) { + split(array[i], vs, /=/) + f = tolower(vs[1]) + if (f == tolower(field1) || f == tolower(field2)) { + prefix = vs[2] + break + } + } + suffix = "" + if (prefix != "") { + # les valeurs ayant le préfixe spécifié sont ignorées + split(value1, array, /;/) + array_new(vs) + for (i in array) { + if (!__starts_with(prefix, array[i])) { + array_add(vs, array[i]) + } else { + if (suffix != "") suffix = suffix ";" + suffix = suffix array[i] + } + } + value1 = array_join(vs, ";") + split(value2, array, /;/) + array_new(vs) + for (i in array) { + if (!__starts_with(prefix, array[i])) { + array_add(vs, array[i]) + } + } + value2 = array_join(vs, ";") + } split(icfields, array, /,/) if (in_array(field1, array, 1) || in_array(field2, array, 1)) { - return tolower(value1) == tolower(value2) + i = tolower(value1) == tolower(value2)? "1": "0" } else { - return value1 == value2 + i = value1 == value2? "1": "0" } + return i suffix } -function ocompareic(field1, field2, icfields, v1, v2, array) { - return comparevic(field1, oget(field1), field2, oget(field2), icfields) +function ocompareic(field1, field2, icfields, spfields, v1, v2, array) { + return comparevic(field1, oget(field1), field2, oget(field2), icfields, spfields) } -function compareic(field1, field2, icfields, v1, v2, array) { - return comparevic(field1, get(field1), field2, get(field2), icfields) +function compareic(field1, field2, icfields, spfields, v1, v2, array) { + return comparevic(field1, get(field1), field2, get(field2), icfields, spfields) } function infields(field, fields, array) { split(fields, array, /,/) diff --git a/start-screen b/start-screen new file mode 100755 index 0000000..f449e34 --- /dev/null +++ b/start-screen @@ -0,0 +1,72 @@ +#!/bin/bash +# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 + +COULEUR_NORMALE=$'\e[0m' +COULEUR_ROUGE=$'\e[31;1m' +COULEUR_VERTE=$'\e[32;1m' +COULEUR_JAUNE=$'\e[33;1m' +COULEUR_BLEUE=$'\e[34;1m' +COULEUR_BLANCHE=$'\e[37;1m' + +function __ask() { + local r + read -p "$1" -t 2 r + [ $? -gt 128 -o -z "$r" -o "$r" == "o" -o "$r" == "O" -o "$r" == "y" -o "$r" == "Y" ] +} + +function __auto_screen() { + # Si screen pas installé, ne rien faire + if [ -z "$(which screen 2>/dev/null)" ]; then + echo "${COULEUR_JAUNE}WARNING${COULEUR_NORMALE} screen introuvable. une session bash classique sera lancée" + exec /bin/bash -l + fi + + # Si on est déjà dans screen, ne rien faire + [ -z "$STY" ] || return + + # corriger TERM pour les vieilles versions de Linux + case "$TERM" in + xterm*) TERM=xterm;; + screen*) TERM=screen;; + esac + export TERM + + local msgprefix + local screens count + + screens="$(LANG=C screen -ls | grep -Ei "attached|detached")" + if [ -n "$screens" ]; then + count="$(echo "$screens" | wc -l)" + else + count=0 + fi + if [ $count -gt 0 ]; then + if [ $count -eq 1 ]; then + msgprefix="Il y a ${COULEUR_BLEUE}1 session screen en cours${COULEUR_NORMALE} +Cette session" + else + msgprefix="Il y a ${COULEUR_ROUGE}$count sessions screen en cours${COULEUR_NORMALE}: +$screens +La première session" + fi + if __ask " +$msgprefix sera reconnectée automatiquent dans 2 secondes +Voulez-vous reconnecter la session screen? [On] "; then + exec screen -q -s -/bin/bash -xRR + else + exec /bin/bash -l + fi + elif __ask " +Une ${COULEUR_VERTE}nouvelle session screen${COULEUR_NORMALE} sera lancée automatiquement dans 2 secondes +Voulez-vous lancer une session screen? [On] "; then + exec screen -q -s -/bin/bash -RR + else + exec /bin/bash -l + fi +} + +if [ $# -gt 0 ]; then + # lancer les commandes fournies avant de lancer SCREEN + "$@" +fi +__auto_screen