From fb285e031932181dd9b68dc95af9c14c2f15845b Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Fri, 5 Jun 2020 16:39:44 +0400 Subject: [PATCH 01/17] =?UTF-8?q?ne=20v=C3=A9rifier=20conndev.php=20que=20?= =?UTF-8?q?si=20c'est=20n=C3=A9cessaire?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cx-conndev | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cx-conndev b/cx-conndev index ce9f83e..b6d2f04 100755 --- a/cx-conndev +++ b/cx-conndev @@ -58,8 +58,6 @@ if [ -z "$first" ]; then enote "Le répertoire du projet est $(ppath . ~)" fi -[ -f bin/conndev.php ] || die "Impossible de trouver le script compagnon conndev.php" - ### function die_not_found() { die "$service: service introuvable. vérifiez que le projet est actuellement up"; } @@ -79,6 +77,8 @@ elif [ -n "$mysqldump_cmd" ]; then mysqldump --databases --add-drop-database -h"$ip" ${user:+-u"$user"} ${password:+-p"$password"} "$@" else + [ -f bin/conndev.php ] || die "Impossible de trouver le script compagnon conndev.php" + mysql_cmd="$(php bin/conndev.php "$ip" "$@")" edebug "mysql_cmd: $mysql_cmd" From 7254661f4558729ae119fc61f664717cf47c6abf Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Tue, 9 Jun 2020 14:04:37 +0400 Subject: [PATCH 02/17] =?UTF-8?q?dk:=20support=20du=20nommage=20du=20r?= =?UTF-8?q?=C3=A9pertoire=20pour=20le=20checkout?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dk | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/dk b/dk index 1bd7046..a8b41bd 100755 --- a/dk +++ b/dk @@ -276,6 +276,8 @@ OPTIONS build app_SRC= # répertoire/fichier source (si URL='') app_DEST= # répertoire dans lequel faire le checkout # ou destination si synchro avec app_SRC + app_NAME= # nom du répertoire dest si checkout; par + # défaut prendre la valeur 'app' app_RSYNC_OPTS= # options de rsync si synchro (avec app_SRC # ou app_DEVEL_SRCDIR) app_PROFILE_ORIGIN= # origine spécifique au profil 'PROFILE' @@ -330,6 +332,7 @@ VARIABLES de update-apps.conf SRC= # répertoire/fichier source (si URL='') DEST= # répertoire dans lequel faire le checkout # ou destination si URL='' + NAME= # nom du répertoire dest si checkout RSYNC_OPTS= # options de rsync si synchro avec SRC ou # DEVEL_SRCDIR ORIGIN= # origine de la branche @@ -705,7 +708,7 @@ function build_update_apps() { fi etitle "Mise à jour des dépendances" - local app var URL SRC DEVEL_SRCDIR DEST have_RSYNC_OPTS RSYNC_OPTS ORIGIN BRANCH TYPE after_update after_updates composer_action + local app var URL SRC DEVEL_SRCDIR DEST NAME have_RSYNC_OPTS RSYNC_OPTS ORIGIN BRANCH TYPE after_update after_updates composer_action for app in "${APPS[@]}"; do etitle "$app" @@ -726,6 +729,9 @@ function build_update_apps() { DEST="${var}_DEST"; DEST="${!DEST}" [ -n "$DEST" ] || DEST="$app/b" + NAME="${var}_NAME"; NAME="${!NAME}" + [ -n "$NAME" ] || NAME="$app" + if is_defined "${var}_RSYNC_OPTS"; then have_RSYNC_OPTS=1 RSYNC_OPTS="${var}_RSYNC_OPTS[@]"; RSYNC_OPTS=("${!RSYNC_OPTS}") @@ -747,7 +753,7 @@ function build_update_apps() { if [ -n "$BUILD_UPDATE_DEVEL" ]; then mkdir -p "$DEST" || { eend; return 1; } - DEST="$DEST/$app" + DEST="$DEST/$NAME" # synchronisation en mode devel [ -n "$have_RSYNC_OPTS" ] || RSYNC_OPTS=(--delete --delete-excluded) @@ -776,7 +782,7 @@ function build_update_apps() { fi elif [ -n "$URL" ]; then mkdir -p "$DEST" || { eend; return 1; } - DEST="$DEST/$app" + DEST="$DEST/$NAME" if [ -d "$DEST" -a -d "$DEST/.git" ]; then # mise à jour From 07bea2c84246ac7d3454af239e2cfe33903ae581 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Tue, 9 Jun 2020 18:01:13 +0400 Subject: [PATCH 03/17] cx-conndev: support klean --- cx-conndev | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/cx-conndev b/cx-conndev index b6d2f04..07d6abe 100755 --- a/cx-conndev +++ b/cx-conndev @@ -19,6 +19,9 @@ OPTIONS -d, --mysqldump-cmd Lancer 'mysqldump --databases --add-drop-database -hSERVICE_IP' avec les arguments supplémentaires fournis sur la ligne de commande + -k, --klean + Lancer la commande 'klean' dans le container spécifié (supprime toutes + les données et relance le container) -u, --user USER -p, --password PASSWORD Paramètres supplémentaires utilisés uniquement avec les options -c et -d" @@ -27,6 +30,7 @@ OPTIONS service=db mysql_cmd= mysqldump_cmd= +klean= user= password= args=( @@ -34,6 +38,7 @@ args=( -h:,-s:,--service: service= -c,--mysql-cmd mysql_cmd=1 -d,--mysqldump-cmd mysqldump_cmd=1 + -k,--klean klean=1 -u:,--user: user= -p:,--password: password= ) @@ -76,6 +81,14 @@ if [ -n "$mysql_cmd" ]; then elif [ -n "$mysqldump_cmd" ]; then mysqldump --databases --add-drop-database -h"$ip" ${user:+-u"$user"} ${password:+-p"$password"} "$@" +elif [ -n "$klean" ]; then + estep "klean" + docker exec "$cid" klean + estep "wait 10sec..." + sleep 10 + estep "start" + docker-compose start "$service" + else [ -f bin/conndev.php ] || die "Impossible de trouver le script compagnon conndev.php" From e0e6178aa57804ee2c08d47f20119d24d3fa2ca9 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Wed, 17 Jun 2020 21:42:45 +0400 Subject: [PATCH 04/17] =?UTF-8?q?dk:=20support=20de=20la=20s=C3=A9lection?= =?UTF-8?q?=20d'un=20service=20et=20de=20la=20machine=20sur=20laquelle=20t?= =?UTF-8?q?ourne=20un=20service?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dk | 143 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 137 insertions(+), 6 deletions(-) diff --git a/dk b/dk index a8b41bd..051af86 100755 --- a/dk +++ b/dk @@ -55,7 +55,10 @@ COMMANDES container après utilisation. x|exec SERVICE COMMAND Lancer une commande dans le container correspondant au service spécifié, - qui doit être en fonctionnement + qui doit être en fonctionnement. Si la commande n'est pas spécifiée, la + valeur par défaut est bash. Avec les options --select-service et + --select-machine, l'argument SERVICE vaut par défaut 'SS' + Un pseudo-tty est alloué pour la commande et STDIN est ouvert. d|brd [NAME=VALUE...] Construire les images (comme avec build), démarrer les services et suivre les logs de façon interactive (comme avec up). Dès que l'on @@ -119,6 +122,12 @@ COMMANDES systemd|systemd-unit Générer une unité systemd qui démarre les services. A priori, ce n'est nécessaire que si aucune politique de redémarrage n'a été définie. + cp|copy CONTAINER:SRC DEST + cp|copy SRC CONTAINER:DEST + Copier un fichier ou un répertoire depuis/vers un container. Avec les + options --select-service et --select-machine, il est possible d'utiliser + 'SS' pour signifier le container sélectionné e.g + $scriptname -s X_Y -- cp file SS:path/to/dir ps [filter|name=value] Afficher les containers en cours d'exécution Le filtre est une expression régulière de type awk qui est mise en @@ -239,6 +248,21 @@ OPTIONS générales -m, --set-machine MACHINE Choisir l'environnement docker-machine spécifié avant de lancer les commandes. Utiliser -u pour desélectionner la machine en cours, e.g -m-u + -s, --select-service SERVICE[.N] + Sélectionner le service spécifié. Si le service a plusieurs instances, + il est possible de sélectionner une instance en particulier avec le + suffixe '.N' (par défaut, la première instance est sélectionnée) + Quand un service est sélectionné, dans les commandes 'cp' et 'exec', la + chaine 'SS' est remplacée par le nom du container correspondant e.g + $scriptname -s X_Y exec SS bash + $scriptname -s X_Y -- cp -L SS:path/to/file destdir + -t, --select-machine SERVICE[.N] + Sélectionner le service spécifié, puis choisir l'environnement + docker-machine correspondant. Cette option a la priorité sur l'option + --select-service + Cette option est traitée après l'option --set-machine, ce qui permet de + se connecter sur le manager d'un cluster puis de sélectionner le worker + sur lequel tourne un service -n, --fake Ne pas lancer les commandes, simplement les afficher -e, --build-arg, --env VAR=VALUE @@ -1265,13 +1289,28 @@ function auto_exec() { local project_name container_name if [ -f docker-compose.yml ]; then compose_set_env_args - compose_exec "$@" + local container="$1"; shift + if [ -n "$SELECT_CONTAINER" ]; then + [ -z "$container" -o "$container" == SS ] && container="$SELECT_CONTAINER" + fi + local command="$1"; shift + [ -n "$command" ] || command=bash + compose_exec "$container" "$command" "$@" elif [ -f Dockerfile ]; then docker_set_env_args docker_check_name set_container_name - docker_exec "$@" + exec_args=(-it) + local command="$1"; shift + [ -n "$command" ] || command=bash + docker_exec "$command" "$@" else - ${FAKE:+qvals} "$DOCKER" exec "$@" + local container="$1"; shift + if [ -n "$SELECT_CONTAINER" ]; then + [ -z "$container" -o "$container" == SS ] && container="$SELECT_CONTAINER" + fi + local command="$1"; shift + [ -n "$command" ] || command=bash + ${FAKE:+qvals} "$DOCKER" exec -it "$container" "$command" "$@" fi } @@ -1358,6 +1397,7 @@ function __format() { function __status_query_task() { setx taskData="$DOCKER" inspect "$taskID" + setx taskID=json_get 0.ID <<<"$taskData" setx taskSlot=json_get 0.Slot <<<"$taskData" setx taskStatus=json_get 0.Status.Err <<<"$taskData" setx serviceID=json_get 0.ServiceID <<<"$taskData" @@ -1381,11 +1421,11 @@ $serviceName: $serviceUpdateStatus fi if [ "$num" -eq 0 ]; then # afficher les en-têtes - __format 3:num 32:taskName 32:node 8:dState 20:cState :error + __format 3:num 48:taskName 32:node 8:dState 20:cState :error fi if [ -z "$fnum" -o "$num" == "$fnum" ]; then taskName="$serviceName.$taskSlot" - __format 3:"$num" 32:"$taskName.$taskID" 32:"$node" 8:"$desiredState" 20:"$currentState" :"$taskStatus" + __format 3:"$num" 48:"$taskName.$taskID" 32:"$node" 8:"$desiredState" 20:"$currentState" :"$taskStatus" fi if [ "$num" == "$fnum" ]; then "$DOCKER" service logs -f "$taskID" @@ -1573,6 +1613,25 @@ EOF local_run "$HOST" "$tmpscript" } +function auto_copy() { + local src="$1"; shift + local dest="$1"; shift + if [ -n "$SELECT_CONTAINER" ]; then + if [ "${src#SS:}" != "$src" ]; then + src="$SELECT_CONTAINER${src#SS}" + elif [ "${src#:}" != "$src" ]; then + src="$SELECT_CONTAINER$src" + fi + if [ "${dest#SS:}" != "$dest" ]; then + dest="$SELECT_CONTAINER${dest#SS}" + elif [ "${dest#:}" != "$dest" ]; then + dest="$SELECT_CONTAINER$dest" + fi + fi + + "$DOCKER" cp "$src" "$dest" "$@" +} + function default_local_composer() { # lancement direct case "$1" in @@ -1785,6 +1844,8 @@ export PROFILE chdir= CONFIG= DM_SET_MACHINE= +SELECT_CONTAINER= +SELECT_MACHINE= USE_STACK= FAKE= VARS=() @@ -1804,6 +1865,8 @@ args=( -P,--prod PROFILE=prod -T,--test PROFILE=test -m:,--set-machine: DM_SET_MACHINE= + -s:,--select-service: SELECT_CONTAINER= + -t:,--select-machine: SELECT_MACHINE= --stack USE_STACK=1 -n,--fake FAKE=1 -e:,--build-arg:,--env: VARS @@ -1828,6 +1891,66 @@ if [ -n "$DM_SET_MACHINE" ]; then # pour warning ci-dessous [ "$DM_SET_MACHINE" == -u ] && DM_SET_MACHINE= fi + +if [ -n "$SELECT_MACHINE" -o -n "$SELECT_CONTAINER" ]; then + function __ss_process_data() { + [ -n "$found" ] && return + __status_query_task + __status_query_service + if [ -n "$slot" ]; then + if [ "$taskSlot" == "$slot" ]; then + # ne prendre que le slot qui correspond + found=1 + fi + else + # prendre le premier + found=1 + fi + taskName="$serviceName.$taskSlot" + } + + if [ -n "$SELECT_MACHINE" ]; then service="$SELECT_MACHINE" + elif [ -n "$SELECT_CONTAINER" ]; then service="$SELECT_CONTAINER" + fi + if [ -f docker-compose.yml -o -f docker-stack.yml ]; then + # si on est dans répertoire de projet, il est possible de spécifier + # le service sans préfixe + docker_set_deploy_args set_container_name + service="${container_name}_${service#${container_name}_}" + fi + if [[ "$service" == *.* ]]; then + slot="${service##*.}" + service="${service%.*}" + else + slot= + fi + + psargs=( + --filter desired-state=running + --format "taskID={{.ID}};node={{.Node}};__ss_process_data" + ) + found= + eval "$("$DOCKER" service ps "$service" "${psargs[@]}" 2>/dev/null)" + + if [ -n "$found" ]; then + SELECT_CONTAINER="$serviceName.$taskSlot.$taskID" + if [ -n "$SELECT_MACHINE" ]; then + DM_SET_MACHINE="$node" + else + enote "Sélection du container $SELECT_CONTAINER" + fi + else + die "$service${slot:+.$slot}: service introuvable" + fi +fi +if [ -n "$SELECT_MACHINE" ]; then + enote "Sélection de la machine $DM_SET_MACHINE" + + [ -n "$DM_AVAILABLE" ] || die "docker-machine n'est pas disponible" + setx dm_env=docker-machine env "$DM_SET_MACHINE" || die + eval "$dm_env" +fi + if [ -n "$DM_AVAILABLE" ]; then found= for dm_profile in "${DM_PROFILES[@]}"; do @@ -2083,6 +2206,14 @@ while [ $# -gt 0 ]; do enote "Profil $PROFILE" auto_systemd_unit "${args[@]}" || die ;; + cp|copy) + args=() + while [ $# -gt 0 -a "$1" != -- ]; do + args+=("$1"); shift + done + enote "Profil $PROFILE" + auto_copy "${args[@]}" || die + ;; ps) pscmd=( "$DOCKER" container ps -a From bb7a4fc84c96aa5411721117d19ba3111e3e1b32 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Sun, 21 Jun 2020 22:49:17 +0400 Subject: [PATCH 05/17] foreach: ajout de l'option -S --- foreach | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/foreach b/foreach index 1fc0de4..445c008 100755 --- a/foreach +++ b/foreach @@ -81,6 +81,9 @@ OPTIONS la commande. Par défaut, l'affichage est effectué. Avec --parent-title, pour chaque correspondance afficher plutôt le répertoire parent (valide uniquement avec l'option -p) + -S, --git-status + Equivalent à spécifier la commande 'git status --p' + Utiliser avec -G ou -C -G, --git-projects Equivalent à '--ptitle -p */.git --' e.g '$scriptname -G git pull' pour mettre à jour les dépôts situés dans un répertoire @@ -96,6 +99,7 @@ changedir= parentdir= expand=1 title=auto +command= shortcut= args=(+ --help '$exit_with display_help' @@ -111,12 +115,18 @@ args=(+ --title title=1 --pt,--parent-title title=p --nt,--no-title title= + -S,--git-status command=git-status-p -G,--git-projects shortcut=git -C,--composer-projects shortcut=composer --cc,--composer-cmd shortcut=composer-cmd ) parse_args "$@"; set -- "${args[@]}" +case "$command" in +git-status-p) + set -- git status --p "$@" + ;; +esac case "$shortcut" in git) set -- */.git -- "$@" From 109797502a7bf38c52f788a936b285888eb95b79 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Mon, 22 Jun 2020 16:32:32 +0400 Subject: [PATCH 06/17] cosmetic --- dk | 1 + 1 file changed, 1 insertion(+) diff --git a/dk b/dk index 051af86..f057acb 100755 --- a/dk +++ b/dk @@ -1945,6 +1945,7 @@ if [ -n "$SELECT_MACHINE" -o -n "$SELECT_CONTAINER" ]; then fi if [ -n "$SELECT_MACHINE" ]; then enote "Sélection de la machine $DM_SET_MACHINE" + [ -n "$SELECT_CONTAINER" ] && enote "Sélection du container $SELECT_CONTAINER" [ -n "$DM_AVAILABLE" ] || die "docker-machine n'est pas disponible" setx dm_env=docker-machine env "$DM_SET_MACHINE" || die From f474657be6ca717c306878337c23abc19e1e9415 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Tue, 7 Jul 2020 10:35:55 +0400 Subject: [PATCH 07/17] dk: ajout de COMPOSER_ARGS --- dk | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/dk b/dk index f057acb..3baf2b2 100755 --- a/dk +++ b/dk @@ -311,6 +311,7 @@ OPTIONS build app_TYPE= # type de projet (composer|none) app_AFTER_UPDATE=() # liste de commandes à lancer après le checkout app_COMPOSER_ACTION= # action projet composer (install|update|none) + app_COMPOSER_ARGS=() # arguments de composer install|update -u, --uu, --update-apps-only Ne faire que la mise à jour depuis les dépôts dépendants. -w, --ww, --update-apps-devel @@ -366,6 +367,12 @@ VARIABLES de update-apps.conf vaut 'install' par défaut. Indique ce qu'il faut faire pour un projet de type 'composer' après avoir lancé les commandes de AFTER_UPDATE. Les directives supportées sont 'install', 'update' et 'none' + COMPOSER_ARGS + options à utiliser avec composer install|update. La valeur par défaut + dépend du profil: + prod: --no-dev -o + test: --no-dev -o + autres: (pas d'options) FONCTIONS de update-apps.conf sqlmig [DESTDIR [SRCDIR [NOFIX]]] @@ -717,9 +724,9 @@ function build_update_apps() { local PRODUCTION DEVELOPMENT case "$PROFILE" in - prod) PRODUCTION=1; DEVELOPMENT=;; - test) PRODUCTION=1; DEVELOPMENT=1;; - devel) PRODUCTION=; DEVELOPMENT=;; + prod) PRODUCTION=1; DEVELOPMENT=; is_defined DEFAULT_COMPOSER_ARGS || DEFAULT_COMPOSER_ARGS=(--no-dev -o);; + test) PRODUCTION=1; DEVELOPMENT=1; is_defined DEFAULT_COMPOSER_ARGS || DEFAULT_COMPOSER_ARGS=(--no-dev -o);; + devel) PRODUCTION=; DEVELOPMENT=1; is_defined DEFAULT_COMPOSER_ARGS || DEFAULT_COMPOSER_ARGS=();; esac local clean @@ -733,6 +740,7 @@ function build_update_apps() { etitle "Mise à jour des dépendances" local app var URL SRC DEVEL_SRCDIR DEST NAME have_RSYNC_OPTS RSYNC_OPTS ORIGIN BRANCH TYPE after_update after_updates composer_action + local -a composer_args for app in "${APPS[@]}"; do etitle "$app" @@ -902,6 +910,11 @@ function build_update_apps() { [ -n "$composer_action" ] || { composer_action="${var}_COMPOSER_ACTION"; composer_action="${!composer_action}"; } [ -n "$composer_action" ] || composer_action="$DEFAULT_COMPOSER_ACTION" + composer_args="${var}_${PROFILE}_COMPOSER_ARGS" + is_defined "$composer_args" || composer_args="${var}_COMPOSER_ARGS" + is_defined "$composer_args" || composer_args="DEFAULT_COMPOSER_ARGS" + composer_args="${composer_args}[@]"; composer_args=("${!composer_args}") + if [ -z "$BUILD_UPDATE_DEVEL" ]; then case "${composer_action:-install}" in i|install) composer_action=install;; @@ -913,7 +926,7 @@ function build_update_apps() { setx cwd=pwd cd "$DEST" estep "Installation des dépendances composer" - auto_composer "$composer_action" ${PRODUCTION:+--no-dev -o} || { eend; return 1; } + auto_composer "$composer_action" "${composer_args[@]}" || { eend; return 1; } cd "$cwd" fi fi From 14beb13b7cdffd41fa921e43b5b0578c866fd2d8 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Sun, 12 Jul 2020 20:17:19 +0400 Subject: [PATCH 08/17] dk: support minimal maven --- dk | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/dk b/dk index 3baf2b2..ccf830b 100755 --- a/dk +++ b/dk @@ -396,7 +396,9 @@ FONCTIONS de update-apps.conf PTD est remplacé par prod:prod,test:test,devel:devel PT " " " prod:prod,test:test '"Si aucun profil de déploiement ne correspond, le comportement par défaut - est de forcer le premier profil défini dans le projet pff" + est de forcer le premier profil défini dans le projet pff + mvn [ARGS] + Lancer maven dans le répertoire destination avec les arguments spécifiés" } function echo_lines() { local IFS=$'\n'; echo "$*"; } @@ -699,6 +701,13 @@ function update_apps_func_pff() { fi } +function update_apps_func_mvn() { + local cwd="$(pwd)" + cd "$DEST" + mvn "$@" || die + cd "$cwd" +} + function build_update_apps() { [ -n "$BUILD_UPDATE_APPS" ] || return 0 [ -f update-apps.conf ] || return 0 From c5e15368a182cd2a379850789f724cf22f82a623 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Mon, 31 Aug 2020 15:12:03 +0400 Subject: [PATCH 09/17] =?UTF-8?q?support=20de=20la=20d=C3=A9finition=20des?= =?UTF-8?q?=20aliases=20et=20des=20profils=20dans=20les=20r=C3=A9pertoires?= =?UTF-8?q?=20de=20cluster?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dk | 77 ++++++++++++++++++++++++++++++++++++++++++++------ lib/default/dk | 8 ++++++ 2 files changed, 76 insertions(+), 9 deletions(-) diff --git a/dk b/dk index ccf830b..f6d11a6 100755 --- a/dk +++ b/dk @@ -1849,6 +1849,70 @@ exit((PHP_VERSION_ID < $version)? 0: 1); ################################################################################ +function resolve_dm_alias() { + local alias dm + # chercher d'abord dans les définitions par défaut + for alias_dm in "${DM_ALIASES[@]}"; do + alias="${alias_dm%%:*}" + dm="${alias_dm#*:}" + if [ "$1" == "$alias" ]; then + echo "$dm" + return 0 + fi + done + # puis chercher dans les répertoires de cluster + local clusterdir DM_ALIASES + for clusterdir in "${CLUSTERDIRS[@]}"; do + DM_ALIASES=() + [ -f "$clusterdir/0config/configure.conf" ] || continue + source "$clusterdir/0config/configure.conf" + for alias_dm in "${DM_ALIASES[@]}"; do + alias="${alias_dm%%:*}" + dm="${alias_dm#*:}" + if [ "$1" == "$alias" ]; then + echo "$dm" + return 0 + fi + done + done + # sinon, laisser en l'état + echo "$1" + return 1 +} + +function resolve_dm_profile() { + local dm profile + # chercher d'abord dans les définitions par défaut + for dm_profile in "${DM_PROFILES[@]}"; do + dm="${dm_profile%%*:}" + profile="${dm_profile#:*}" + if [ "$1" == "$dm" ]; then + echo "$profile" + return 0 + fi + done + # puis chercher dans les répertoires de cluster + local clusterdir DM_PROFILES + for clusterdir in "${CLUSTERDIRS[@]}"; do + DM_PROFILES=() + [ -f "$clusterdir/0config/configure.conf" ] || continue + source "$clusterdir/0config/configure.conf" + for dm_profile in "${DM_PROFILES[@]}"; do + dm="${dm_profile%%*:}" + profile="${dm_profile#:*}" + if [ "$1" == "$dm" ]; then + echo "$profile" + return 0 + fi + done + done + # sinon, afficher le profil par défaut + echo "$DEFAULT_PROFILE" + return 1 +} + +################################################################################ + # support limité docker / podman if progexists docker; then DOCKER=docker elif progexists podman; then DOCKER=podman @@ -1859,7 +1923,9 @@ DEFAULT_PROFILE=devel # pour le moment ne pas lancer composer dans un container par défaut DEFAULT_COMPOSER_IMAGE=none #docker.univ-reunion.fr/image/apache-php-myiccas-utils:d9 PROFILE= +DM_ALIASES=() DM_PROFILES=() +CLUSTERDIRS=() set_defaults dk export PROFILE @@ -1907,6 +1973,7 @@ parse_args "$@"; set -- "${args[@]}" progexists docker-machine && DM_AVAILABLE=1 || DM_AVAILABLE= if [ -n "$DM_SET_MACHINE" ]; then [ -n "$DM_AVAILABLE" ] || die "docker-machine n'est pas disponible" + setx DM_SET_MACHINE=resolve_dm_alias "$DM_SET_MACHINE" [ "$DM_SET_MACHINE" == - ] && DM_SET_MACHINE=-u setx dm_env=docker-machine env "$DM_SET_MACHINE" || die eval "$dm_env" @@ -1975,15 +2042,7 @@ if [ -n "$SELECT_MACHINE" ]; then fi if [ -n "$DM_AVAILABLE" ]; then - found= - for dm_profile in "${DM_PROFILES[@]}"; do - splitpair "$dm_profile" dm profile - if [ "$dm" == "$DOCKER_MACHINE_NAME" ]; then - DEFAULT_PROFILE="$profile" - found=1 - break - fi - done + setx DEFAULT_PROFILE=resolve_dm_profile "$DOCKER_MACHINE_NAME" && found=1 || found= if [ -n "$DM_SET_MACHINE" -a -z "$PROFILE" -a -z "$found" ]; then ewarn "\ Aucun profil n'a été défini pour $DM_SET_MACHINE dans ~/etc/default/dk diff --git a/lib/default/dk b/lib/default/dk index 375b22f..3bdacea 100644 --- a/lib/default/dk +++ b/lib/default/dk @@ -3,8 +3,16 @@ # Profil par défaut #PROFILE=prod +# Aliases pour docker-machine +#DM_ALIASES=(alias:name) + # Profiles pour docker-machine #DM_PROFILES=(name:profile...) +# Répertoires de gestion de cluster. Dans chacun de ces répertoires, le fichier +# 0config/configure.conf est sourcé à la recherche de définitions de profils et +# d'aliases +#CLUSTERDIRS=(~/wop/containers/*.univ.run) + # Image à utiliser pour lancer composer #COMPOSER_IMAGE=docker.univ-reunion.fr/image/apache-php-myiccas-utils:d10 From 751e372bfd0c41c6e334cac31606a96b5ec7939f Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Mon, 31 Aug 2020 15:35:14 +0400 Subject: [PATCH 10/17] bug --- dk | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/dk b/dk index f6d11a6..27925a0 100755 --- a/dk +++ b/dk @@ -1850,7 +1850,7 @@ exit((PHP_VERSION_ID < $version)? 0: 1); ################################################################################ function resolve_dm_alias() { - local alias dm + local alias_dm alias dm # chercher d'abord dans les définitions par défaut for alias_dm in "${DM_ALIASES[@]}"; do alias="${alias_dm%%:*}" @@ -1881,11 +1881,11 @@ function resolve_dm_alias() { } function resolve_dm_profile() { - local dm profile + local dm_profile dm profile # chercher d'abord dans les définitions par défaut for dm_profile in "${DM_PROFILES[@]}"; do - dm="${dm_profile%%*:}" - profile="${dm_profile#:*}" + dm="${dm_profile%%:*}" + profile="${dm_profile#*:}" if [ "$1" == "$dm" ]; then echo "$profile" return 0 @@ -1898,8 +1898,8 @@ function resolve_dm_profile() { [ -f "$clusterdir/0config/configure.conf" ] || continue source "$clusterdir/0config/configure.conf" for dm_profile in "${DM_PROFILES[@]}"; do - dm="${dm_profile%%*:}" - profile="${dm_profile#:*}" + dm="${dm_profile%%:*}" + profile="${dm_profile#*:}" if [ "$1" == "$dm" ]; then echo "$profile" return 0 From 28ceb74b4438dc04f585e5956195dcbcaf384756 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Mon, 31 Aug 2020 15:41:46 +0400 Subject: [PATCH 11/17] cosmetic --- dk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dk b/dk index 27925a0..be3198f 100755 --- a/dk +++ b/dk @@ -1921,7 +1921,7 @@ fi DEFAULT_PROFILE=devel # pour le moment ne pas lancer composer dans un container par défaut -DEFAULT_COMPOSER_IMAGE=none #docker.univ-reunion.fr/image/apache-php-myiccas-utils:d9 +DEFAULT_COMPOSER_IMAGE=none #docker.univ-reunion.fr/image/apache-php-myiccas-utils:d10 PROFILE= DM_ALIASES=() DM_PROFILES=() From cc1b45d0fc5129c9261ae8f126ea78276587b0af Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Tue, 8 Sep 2020 11:51:40 +0400 Subject: [PATCH 12/17] support de l'option -u --- repoctl | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/repoctl b/repoctl index ac4e43d..5adc36f 100755 --- a/repoctl +++ b/repoctl @@ -12,6 +12,8 @@ USAGE ACTIONS create URL [description] Créer un nouveau dépôt avec la description spécifiée + Utiliser l'option -u pour mettre à jour origin dans le dépôt courant + avec l'url du dépôt nouvellement créé list URL [VARs...] Lister les dépôts dans l'organisation spécifiée. Si aucune organisation @@ -134,6 +136,8 @@ function create_action() { esac } function gogs_create_action() { + local update_origin="$1"; shift + local url repourl desc payload result local -a vars if [ -n "$user" -a "$user" != "$gogs_user" ]; then @@ -159,6 +163,13 @@ payload: $payload result: $result" isatty && estep "Création du dépôt $repourl" echo "$result" | json_get "${vars[@]}" + + if [ -n "$update_origin" ]; then + isatty && estep "Mise à jour de l'origine" + git remote set-url origin "$repourl" + + isatty && enote "Ne pas oublier de faire 'git push --all'" + fi } ################################################################################ @@ -295,9 +306,11 @@ result: $result" ################################################################################ action= +update_origin= args=( --help '$exit_with display_help' -c,--create action=create + -u,--update-origin update_origin=1 -l,--list action=list -g,--get action=get -e,--edit action=edit @@ -314,7 +327,7 @@ repoctl_init "$1"; shift [ -n "$repourl" ] || die "Vous devez spécifier l'url du dépôt" case "$action" in -c|create) create_action "$@";; +c|create) create_action "$update_origin" "$@";; l|list) list_action "$@";; g|get|s|show) get_action "$@";; e|edit) edit_action "$@";; From 856c948eebd51ae486c9ad5f57c0eefe89e8c9c7 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Thu, 10 Sep 2020 11:15:40 +0400 Subject: [PATCH 13/17] repoctl: ajout de update-origin --- repoctl | 77 +++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 64 insertions(+), 13 deletions(-) diff --git a/repoctl b/repoctl index 5adc36f..cc64151 100755 --- a/repoctl +++ b/repoctl @@ -10,12 +10,17 @@ USAGE $scriptname ACTION URL [options] ACTIONS - create URL [description] - Créer un nouveau dépôt avec la description spécifiée - Utiliser l'option -u pour mettre à jour origin dans le dépôt courant - avec l'url du dépôt nouvellement créé + u|update-origin URL + Mettre à jour origin dans le dépôt courant avec l'url spécifié - list URL [VARs...] + c|create URL [description] + Créer un nouveau dépôt avec la description spécifiée + OPTIONS + -u, --update-origin + mettre à jour origin dans le dépôt courant avec l'url du dépôt + nouvellement créé, comme avec l'action update-origin + + l|list URL [VARs...] Lister les dépôts dans l'organisation spécifiée. Si aucune organisation n'est spécifiée dans l'url, lister les dépôts *accessibles* par l'utilisateur (cela inclut les dépôts des organisations auxquelles @@ -23,11 +28,11 @@ ACTIONS VARs est une liste de variables à afficher pour chaque dépôt, séparés par le caractère tabulation. La valeur par défaut est full_name - get URL [VARs...] + g|get URL [VARs...] Afficher les propriétés du dépôt spécifié. VARs est une liste de variables à afficher pour le dépôt, séparés par le caractère tabulation. - edit URL var=value... + e|edit URL var=value... Modifier les propriétés du dépôt. Consulter l'API pour la liste exacte des propriétés pouvant être modifiées. Avec gitea 1.9.3, il y a au moins celles-là: @@ -37,7 +42,7 @@ ACTIONS private default_branch - delete URL + d|delete URL Supprimer le dépôt spécifié" } @@ -125,6 +130,50 @@ function gogs_setvars() { ################################################################################ +function _update_origin() { + estep "Mise à jour de l'origine" + git remote set-url origin "$repourl" +} +function _update_origin_push() { + if ask_yesno "Faut-il faire git push?" O; then + git push --all && git push --tags + else + enote "Ne pas oublier de faire 'git push --all && git push --tags'" + fi +} +function _update_origin_pull() { + if ask_yesno "Faut-il faire git pull?" O; then + git pull + else + enote "Ne pas oublier de faire 'git pull'" + fi +} + +function update_origin_action() { + case "$rtype" in + #gitolite) ;; + gogs|gitea) + gogs_setvars + gogs_update_origin_action "$@" + ;; + *) die "$rtype: type de dépôt non supporté";; + esac +} +function gogs_update_origin_action() { + local repourl + if [ -n "$user" -a "$user" != "$gogs_user" ]; then + # dépôt d'une organisation + repourl="$gogs_url/$user/$path" + else + # dépôt d'un utilisateur + repourl="$gogs_url/$gogs_user/$path" + fi + _update_origin + _update_origin_pull +} + +################################################################################ + function create_action() { case "$rtype" in #gitolite) ;; @@ -165,10 +214,8 @@ result: $result" echo "$result" | json_get "${vars[@]}" if [ -n "$update_origin" ]; then - isatty && estep "Mise à jour de l'origine" - git remote set-url origin "$repourl" - - isatty && enote "Ne pas oublier de faire 'git push --all'" + _update_origin + _update_origin_push fi } @@ -310,7 +357,7 @@ update_origin= args=( --help '$exit_with display_help' -c,--create action=create - -u,--update-origin update_origin=1 + -u,--update,--update-origin update_origin=1 -l,--list action=list -g,--get action=get -e,--edit action=edit @@ -318,6 +365,9 @@ args=( ) parse_args "$@"; set -- "${args[@]}" +if [ -z "$action" -a -n "$update_origin" ]; then + action=update-origin +fi if [ -z "$action" ]; then action="$1"; shift fi @@ -327,6 +377,7 @@ repoctl_init "$1"; shift [ -n "$repourl" ] || die "Vous devez spécifier l'url du dépôt" case "$action" in +u|update|update-origin) update_origin_action "$@";; c|create) create_action "$update_origin" "$@";; l|list) list_action "$@";; g|get|s|show) get_action "$@";; From ada594a30b77c9f4b733b48044a5e6dcb5b412a5 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Thu, 17 Sep 2020 05:59:36 +0400 Subject: [PATCH 14/17] dm: support des aliases --- lib/bashrc.d/docker_aliases.shared | 39 ++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/lib/bashrc.d/docker_aliases.shared b/lib/bashrc.d/docker_aliases.shared index 6bab1fc..c6369fb 100644 --- a/lib/bashrc.d/docker_aliases.shared +++ b/lib/bashrc.d/docker_aliases.shared @@ -1,11 +1,40 @@ # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 if [ -n "$UTOOLS_DOCKER_ALIASES" ]; then - if [ "$DOCKER_MACHINE_WRAPPED" == true ]; then - alias dm=__docker_machine_wrapper - else - alias dm=docker-machine - fi + #if [ "$DOCKER_MACHINE_WRAPPED" == true ]; then + # alias dm=__docker_machine_wrapper + #else + # alias dm=docker-machine + #fi + function dm() { + if [ "$1" == use -a -n "$2" -a -f ~/etc/default/dk ]; then + # chercher les aliases éventuels + local machine="$2"; shift; shift + machine="$( + CLUSTERDIRS=() + source ~/etc/default/dk + for clusterdir in "${CLUSTERDIRS[@]}"; do + if [ -f "$clusterdir/0config/configure.conf" ]; then + DM_ALIASES=() + source "$clusterdir/0config/configure.conf" + for alias_machine in "${DM_ALIASES[@]}"; do + if [ "${alias_machine%%:*}" == "$machine" ]; then + echo "${alias_machine#*:}" + exit + fi + done + fi + done + echo "$machine" + )" + set -- use "$machine" "$@" + fi + if [ "$DOCKER_MACHINE_WRAPPED" == true ]; then + __docker_machine_wrapper "$@" + else + docker-machine "$@" + fi + } if [ -n "$UTOOLS_BASH_COMPLETION" ]; then complete -F _docker_machine dm From bc1a740f35ed117ab0d54f8136278f23528a1229 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Thu, 17 Sep 2020 06:02:05 +0400 Subject: [PATCH 15/17] bug --- lib/bashrc.d/docker_aliases.shared | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/bashrc.d/docker_aliases.shared b/lib/bashrc.d/docker_aliases.shared index c6369fb..7da3cbf 100644 --- a/lib/bashrc.d/docker_aliases.shared +++ b/lib/bashrc.d/docker_aliases.shared @@ -12,7 +12,14 @@ if [ -n "$UTOOLS_DOCKER_ALIASES" ]; then local machine="$2"; shift; shift machine="$( CLUSTERDIRS=() + DM_ALIASES=() source ~/etc/default/dk + for alias_machine in "${DM_ALIASES[@]}"; do + if [ "${alias_machine%%:*}" == "$machine" ]; then + echo "${alias_machine#*:}" + exit + fi + done for clusterdir in "${CLUSTERDIRS[@]}"; do if [ -f "$clusterdir/0config/configure.conf" ]; then DM_ALIASES=() From 2ec6c21ec866d54e6ea6d214c4e30ce7e2480ebc Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Mon, 21 Sep 2020 18:06:05 +0400 Subject: [PATCH 16/17] =?UTF-8?q?support=20gros=20doigt=20de=20python2=20s?= =?UTF-8?q?ur=20les=20syst=C3=A8mes=20modernes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/uinst/conf | 5 +++-- lib/ulib/base | 7 +++++-- lib/ulib/uinst | 7 ++++--- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/lib/uinst/conf b/lib/uinst/conf index 4dd12ce..df2a31b 100644 --- a/lib/uinst/conf +++ b/lib/uinst/conf @@ -16,8 +16,9 @@ rm -rf lib/pyulib/{build,devel,migrate,test} # compiler les modules python de support estep "Compilation des modules python" -python -m compileall lib/ulib/support/python -python -m compileall lib/nulib/python +progexists python2 && PYTHON=python2 || PYTHON=python +"$PYTHON" -m compileall lib/ulib/support/python +"$PYTHON" -m compileall lib/nulib/python # liens pour les scripts python for i in plver plbck uencdetect urandomize umail uxpath wofixsql; do diff --git a/lib/ulib/base b/lib/ulib/base index c4299bc..99914f8 100644 --- a/lib/ulib/base +++ b/lib/ulib/base @@ -934,8 +934,11 @@ function progexists() { test -n "$1" -a -x "$(which "$1" 2>/dev/null)" } function has_python() { -# tester la présence de python - progexists python +# tester la présence de python2 + # tester d'abord python2 pour compatibilité avec les systèmes modernes + progexists python2 && return 0 + progexists python && return 0 + return 1 } function has_gawk() { # tester la présence de gnuawk diff --git a/lib/ulib/uinst b/lib/ulib/uinst index e41ba6d..4fd137b 100644 --- a/lib/ulib/uinst +++ b/lib/ulib/uinst @@ -508,7 +508,7 @@ Essayez avec 'uinst -C'" has_gawk || need_gawk=1 if check_sysinfos -s linux; then if [ -n "$need_python" -o -n "$need_gawk" ]; then - eimportant "Il FAUT installer Python et $(get_color y)*GNU*$(get_color z)awk pour que nutools fonctionne correctement." + eimportant "Il FAUT installer Python 2 et $(get_color y)*GNU*$(get_color z)awk pour que nutools fonctionne correctement." if check_sysinfos -d debian; then if ask_yesno "Voulez-vous que ce script essaye d'installer automatiquement ces dépendances (requière les droits root)?" O; then urequire debian @@ -523,7 +523,7 @@ Essayez avec 'uinst -C'" fi fi if [ -n "$need_python" ]; then - eerror "Python est requis. Veuillez faire l'installation avant de relancer ce script." + eerror "Python 2 est requis. Veuillez faire l'installation avant de relancer ce script." return 1 fi if [ -n "$need_gawk" ]; then @@ -1616,5 +1616,6 @@ function __uinst2s_root_scripts() { function __uinst2s_python_setup() { # Installer le package python - cd "$srcdir" && python setup.py install + local PYTHON; progexists python2 && PYTHON=python2 || PYTHON=python + cd "$srcdir" && "$PYTHON" setup.py install } From e2e6b76e4a0a987ecfa37cab0a67704ccab0e0d5 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Mon, 21 Sep 2020 18:08:30 +0400 Subject: [PATCH 17/17] Init changelog & version 9.9.0 --- CHANGES.md | 19 +++++++++++++++++++ VERSION.txt | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index cf97883..fd3d58b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,22 @@ +## Version 9.9.0 du 21/09/2020-18:08 + +* `2ec6c21` support gros doigt de python2 sur les systèmes modernes +* `bc1a740` bug +* `ada594a` dm: support des aliases +* `856c948` repoctl: ajout de update-origin +* `cc1b45d` support de l'option -u +* `28ceb74` cosmetic +* `751e372` bug +* `c5e1536` support de la définition des aliases et des profils dans les répertoires de cluster +* `14beb13` dk: support minimal maven +* `f474657` dk: ajout de COMPOSER_ARGS +* `1097975` cosmetic +* `bb7a4fc` foreach: ajout de l'option -S +* `e0e6178` dk: support de la sélection d'un service et de la machine sur laquelle tourne un service +* `07bea2c` cx-conndev: support klean +* `7254661` dk: support du nommage du répertoire pour le checkout +* `fb285e0` ne vérifier conndev.php que si c'est nécessaire + ## Version 9.8.0 du 28/04/2020-16:42 * `e2b2f49` dk: vérifier que le répertoire destination existe avant rsync diff --git a/VERSION.txt b/VERSION.txt index 834eb3f..5ffe92d 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -9.8.0 +9.9.0