From 668eec149782ea60b9ece209170020ef828f7920 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Wed, 11 Mar 2020 15:23:47 +0400 Subject: [PATCH 01/18] =?UTF-8?q?dmctl:=20possibilit=C3=A9=20d'importer=20?= =?UTF-8?q?toutes=20les=20machines=20d'un=20r=C3=A9pertoire?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dmctl | 82 ++++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 56 insertions(+), 26 deletions(-) diff --git a/dmctl b/dmctl index 056d188..6395a06 100755 --- a/dmctl +++ b/dmctl @@ -13,28 +13,14 @@ OPTIONS -d, --dump Exporter la machine -l, --load - Import la machine" + Import la machine + -a, --load-all + Importer toutes les machines" } -action= -args=( - --help '$exit_with display_help' - -d,--dump,-x,--export,-s,--save action=dump - -l,--load,-i,--import action=load -) -parse_args "$@"; set -- "${args[@]}" +function dump_machine() { + local name srcdir workdir destdir archive i -if [ -z "$action" ]; then - case "$1" in - d|dump|x|export|s|save) action=dump; shift;; - l|load|i|import) action=load; shift;; - *) die "Vous devez spécifier l'action à effectuer";; - esac -fi - -case "$action" in -dump) - ############################################################################ name="$1" [ -n "$name" ] || die "Vous devez spécifier le nom de la machine" @@ -64,10 +50,11 @@ s|DOCKER_MACHINE_HOME/certs/|DOCKER_MACHINE_HOME/machines/$name/|g tar czf "$archive" -C "$workdir" "$name" || die ac_clean "$workdir" - ;; +} + +function load_machine() { + local archive archivename destdir machinedir origdir workdir srcdir -load) - ############################################################################ archive="$1" [ -n "$archive" ] || die "Vous devez spécifier l'archive à importer" @@ -82,11 +69,16 @@ load) machinedir="$destdir/$name" origdir="$HOME/${name}-machine.orig" if [ -d "$machinedir" ]; then - ewarn "$name: une machine du même nom existe déjà" - ask_yesno "Voulez-vous l'écraser?" N || die + if [ -n "$NOCLOBBER" ]; then + ewarn "$name: cette machine existe déjà" + return + else + ewarn "$name: une machine du même nom existe déjà" + ask_yesno "Voulez-vous l'écraser?" N || die - [ -d "$origdir" ] && rm -rf "$origdir" - mv "$machinedir" "$origdir" + [ -d "$origdir" ] && rm -rf "$origdir" + mv "$machinedir" "$origdir" + fi fi ac_set_tmpdir workdir @@ -112,5 +104,43 @@ s|DOCKER_MACHINE_HOME|$HOME/.docker/machine|g fi ac_clean "$workdir" +} + +# faut-il ignorer les machines existantes +NOCLOBBER= + +action= +args=( + --help '$exit_with display_help' + -d,--dump,-x,--export,-s,--save action=dump + -l,--load,-i,--import action=load + -a,--all,--load-all,--import-all action=loadall +) +parse_args "$@"; set -- "${args[@]}" + +if [ -z "$action" ]; then + case "$1" in + d|dump|x|export|s|save) action=dump; shift;; + l|load|i|import) action=load; shift;; + a|all|loadall|importall) action=loadall; shift;; + *) die "Vous devez spécifier l'action à effectuer";; + esac +fi + +case "$action" in +dump) dump_machine "$1";; +load) load_machine "$1";; +loadall) + if [ $# -gt 0 ]; then + archives=("$@") + else + NOCLOBBER=1 + array_lsfiles archives . "*-machine.tar.gz" + fi + for archive in "${archives[@]}"; do + etitle "$archive" + load_machine "$archive" + eend + done ;; esac From c9796b2562294290c0ecef1bc3365638e3de45d0 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Thu, 12 Mar 2020 21:36:39 +0400 Subject: [PATCH 02/18] ipaddr: frontend pour ip addr --- ipaddr | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100755 ipaddr diff --git a/ipaddr b/ipaddr new file mode 100755 index 0000000..316ff4d --- /dev/null +++ b/ipaddr @@ -0,0 +1,21 @@ +#!/bin/bash +# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +# frontend pour 'ip addr' qui formatte l'affichage pour prendre moins de place + +tty -s <&1 && isatty=1 || isatty= + +/usr/bin/ip addr "$@" | awk -v isatty="$isatty" ' +isatty && $0 ~ /^[0-9]/ { + $0 = gensub(/: ([^:]+):/, ": \x1B[32m\\1\x1B[0m:", 1) +} +isatty && $1 == "inet" { + $0 = gensub(/inet ([^ ]+) /, "inet \x1B[34m\\1\x1B[0m ", 1) +} +{ + if ($1 == "inet" || $1 == "inet6") { + printf "%s -- ", $0 + getline + sub(/^ +/, "") + } +} +{ print }' From 4ee346b521d3897ba765d17b8ce2a955e838c504 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Fri, 13 Mar 2020 10:46:54 +0400 Subject: [PATCH 03/18] maj chemin ip --- ipaddr | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ipaddr b/ipaddr index 316ff4d..811a16b 100755 --- a/ipaddr +++ b/ipaddr @@ -2,9 +2,14 @@ # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 # frontend pour 'ip addr' qui formatte l'affichage pour prendre moins de place +if [ -x /usr/bin/ip ]; then IP=/usr/bin/ip +elif [ -x /bin/ip ]; then IP=/bin/ip +else IP=ip +fi + tty -s <&1 && isatty=1 || isatty= -/usr/bin/ip addr "$@" | awk -v isatty="$isatty" ' +"$IP" addr "$@" | awk -v isatty="$isatty" ' isatty && $0 ~ /^[0-9]/ { $0 = gensub(/: ([^:]+):/, ": \x1B[32m\\1\x1B[0m:", 1) } From d666859b83165bf58a4bdc40b68ff8e9029c4bc7 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Wed, 18 Mar 2020 05:25:05 +0400 Subject: [PATCH 04/18] dk: supprimer avec image:tag si possible --- dk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dk b/dk index b634627..bd7ce0e 100755 --- a/dk +++ b/dk @@ -1916,7 +1916,7 @@ NR == 1 { print; next } shift fi all="$("${lscmd[@]}" | "${filtercmd[@]}")" - setx -a images awk 'NR == 1 { next } { print $3 }' <<<"$all" + setx -a images awk 'NR == 1 { next } { if ($1 == "" || $2 == "") { print $3 } else { print $1 ":" $2 } }' <<<"$all" if [ ${#images[*]} -gt 0 ]; then echo "$all" ask_yesno "Etes-vous sûr de vouloir supprimer ces images?" || die From 4f206d732c6466f5197b02090133c72a432edc95 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Fri, 20 Mar 2020 22:51:05 +0400 Subject: [PATCH 05/18] dk: frontend plus 'transparent' --- dk | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 54 insertions(+), 13 deletions(-) diff --git a/dk b/dk index bd7ce0e..08bd9dc 100755 --- a/dk +++ b/dk @@ -9,6 +9,17 @@ function display_help() { USAGE $scriptname CMDs... +Si une commande commence ou se termine par un underscore, e.g '_ls', elle est +passée telle quelle à docker (en enlevant l'underscore d'abord, bien sûr). Si +une commande ne figure pas dans la liste ci-dessous, elle est passée telle +quelle à docker. + +Certaines commandes ci-dessous ont le même nom que des commandes docker, et +nécessitent un projet docker ou docker-compose. Si ces commandes sont lancées +alors qu'on n'est pas dans un projet docker, alors elles sont passées telle +quelles à docker. ATTENTION: comme la commande est exécutée par docker, cela +veut dire qu'elle n'aura pas la même sématique. + COMMANDES get-profile Afficher le profil courant @@ -70,7 +81,7 @@ COMMANDES Equivalent à --stack -- build -- push args... bpy|bpd [args...] Equivalent à --stack -- build -- push -- deploy args... - service COMMAND SERVICE [args...] + ser|service COMMAND SERVICE [args...] Frontend pour 'docker service COMMAND args... SERVICE' Cette commande ne fonctionne qu'en mode swarm. Il n'est pas nécessaire de préfixer le nom du service avec le nom du stack, pour être cohérent @@ -854,13 +865,15 @@ function auto_build() { update_build_env build_update_apps || return 1 compose_build "$@" - else + elif [ -f Dockerfile ]; then docker_parse_env_args docker_check_name docker_add_build_arg build_date "$(date +%y%m%d)" update_build_env build_update_apps || return 1 docker_build "$@" + else + ${FAKE:+qvals} "$DOCKER" build ${NO_CACHE:+--no-cache} "$@" fi } @@ -892,11 +905,13 @@ function auto_push() { compose_set_env_args update_build_env compose_push "$@" - else + elif [ -f Dockerfile ]; then docker_parse_env_args docker_check_name update_build_env docker_push "$@" + else + ${FAKE:+qvals} "$DOCKER" push "$@" fi } @@ -924,11 +939,13 @@ function auto_up() { compose_set_env_args replace_run_args=(-d) compose_up "$@" - else + elif [ -f Dockerfile ]; then docker_set_env_args docker_check_name set_container_name replace_run_args=(-d --name "$container_name") docker_up "$@" + else + ${FAKE:+qvals} "$DOCKER" run "$@" fi } @@ -952,10 +969,12 @@ function auto_stop() { if [ -f docker-compose.yml ]; then compose_set_env_args compose_stop "$@" - else + elif [ -f Dockerfile ]; then docker_set_env_args docker_check_name set_container_name docker_stop "$@" + else + ${FAKE:+qvals} "$DOCKER" stop "$@" fi } @@ -980,11 +999,13 @@ function auto_logs() { compose_set_env_args replace_logs_args=(-f) compose_logs "$@" - else + elif [ -f Dockerfile ]; then docker_set_env_args docker_check_name set_container_name replace_logs_args=(-f) docker_logs "$@" + else + ${FAKE:+qvals} "$DOCKER" logs "$@" fi } @@ -1014,10 +1035,12 @@ function auto_down() { if [ -f docker-compose.yml ]; then compose_set_env_args compose_down "$@" - else + elif [ -f Dockerfile ]; then docker_set_env_args docker_check_name set_container_name docker_down "$@" + else + ${FAKE:+qvals} "$DOCKER" stop "$@" fi } @@ -1076,7 +1099,7 @@ function auto_run() { ${volume:+-v "$volume"} ) compose_run "$@" - else + elif [ -f Dockerfile ]; then docker_set_env_args docker_check_name set_container_name replace_run_args=( @@ -1085,6 +1108,8 @@ function auto_run() { ${volume:+-v "$volume"} ) docker_run "$@" + else + ${FAKE:+qvals} "$DOCKER" run ${rm:+--rm} ${volume:+-v "$volume"} "$@" fi } @@ -1108,10 +1133,12 @@ function auto_exec() { if [ -f docker-compose.yml ]; then compose_set_env_args compose_exec "$@" - else + elif [ -f Dockerfile ]; then docker_set_env_args docker_check_name set_container_name docker_exec "$@" + else + ${FAKE:+qvals} "$DOCKER" exec "$@" fi } @@ -1167,7 +1194,7 @@ function auto_service() { ;; esac else - die "Impossible de trouver ni docker-compose.yml ni docker-stack.yml" + ${FAKE:+qvals} "$DOCKER" service "$@" fi } @@ -1748,7 +1775,7 @@ while [ $# -gt 0 ]; do enote "Profil $PROFILE" auto_build && auto_push && auto_deploy "${args[@]}" ;; - service) + ser|service) args=() while [ $# -gt 0 -a "$1" != -- ]; do args+=("$1"); shift @@ -1942,8 +1969,22 @@ NR == 1 { print; next } done auto_composer "${args[@]}" ;; + _*|*_) + # transmettre directement à docker + cmd="${cmd#_}" + cmd="${cmd%_}" + args=() + while [ $# -gt 0 -a "$1" != -- ]; do + args+=("$1"); shift + done + "$DOCKER" "$cmd" "${args[@]}" + ;; *) - # transmettre directement à docker pour les autres commandes - exec "$DOCKER" "$cmd" "$@" + # transmettre directement à docker + args=() + while [ $# -gt 0 -a "$1" != -- ]; do + args+=("$1"); shift + done + "$DOCKER" "$cmd" "${args[@]}" esac done From 1960c0c94e3654ae670587639038e15f16012ac4 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Thu, 26 Mar 2020 16:40:37 +0400 Subject: [PATCH 06/18] =?UTF-8?q?dk:=20impl=C3=A9menter=20status?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TODO.md | 14 --- dk | 118 +++++++++++++++++- lib/ulib/json | 14 +++ .../support/php}/json_build.php | 0 .../support/php}/json_each.php | 2 +- .../support/php}/json_get.php | 17 ++- repoctl | 12 +- 7 files changed, 146 insertions(+), 31 deletions(-) rename lib/{repoctl => ulib/support/php}/json_build.php (100%) rename lib/{repoctl => ulib/support/php}/json_each.php (95%) rename lib/{repoctl => ulib/support/php}/json_get.php (67%) diff --git a/TODO.md b/TODO.md index bff2333..32dea67 100644 --- a/TODO.md +++ b/TODO.md @@ -1,17 +1,3 @@ # TODO -## dk - -Ajouter le support du déploiement de services dans un swarm - -Les nouvelles actions suivantes sont disponibles: -* deploy -- déployer un service -* bpd -- équivalent à build, push, deploy -* update -- mettre à jour un service déployé -* bpu -- équivalent à build, push, update -* rollback -- annuler la mise à jour d'un service - -Pour toutes ces actions, utiliser par défaut docker-stack.yml s'il existe, -sinon utiliser docker-compose.yml (en tenant compte des paramètres des profils) - -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary \ No newline at end of file diff --git a/dk b/dk index 08bd9dc..36221eb 100755 --- a/dk +++ b/dk @@ -1,7 +1,7 @@ #!/bin/bash # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 source "$(dirname "$0")/lib/ulib/auto" || exit 1 -urequire pff +urequire pff json function display_help() { uecho "$scriptname: outil pour faciliter l'utilisation de docker @@ -92,6 +92,19 @@ COMMANDES $scriptname -- service logs web -f Pour des cas d'utilisation plus complexe, il faut lancer directement docker service + sta|status SERVICE [num] + Afficher le status du service spécifié: pour chaque occurence, sur quel + noeud il tourne (ou tournait), quel est le statut actuel ainsi que le + message associé. + 'num' est le numéro de l'instance de service. Si ce numéro est précisé, + afficher les informations uniquement pour cette instance là, ainsi que + les logs + Il est possible de spécifier un filtre docker name=value avant 'num'. Ce + filtre est utilisé pour sélectionner certaines instances du service. + - id= a task's ID ou prefix + - name= a task's name or prefix + - node= a node's name or ID + - desired-state=(running|shutdown|accepted) u|update SERVICE [args...] Mettre à jour un service, équivalent à 'service update SERVICE' scale SERVICE=REPLICAS [args...] @@ -105,7 +118,7 @@ COMMANDES 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 - correspondace avec les noms de l'image et de la tâche. + correspondance avec les noms de l'image et de la tâche. Il est aussi possible d'utiliser un filtre docker de la forme name=value - ancestor=([:tag]|| ) containers created from an image or a descendant. @@ -1198,6 +1211,99 @@ function auto_service() { fi } +function __format() { + # formatter une liste de valeur. chaque argument est de la forme [SIZE:]VALUE + # il ne faudrait utiliser la forme VALUE que pour le dernier argument + local size value + for value in "$@"; do + if [[ "$value" == *:* ]]; then + size="${value%%:*}" + value="${value#*:}" + else + size= + fi + if [ -n "$size" ]; then + while [ "${#value}" -lt "$size" ]; do + value="$value " + done + if [ "${#value}" -gt "$size" ]; then + [ "$size" -gt 1 ] && value="${value:0:$(($size - 1))}" + value="$value"$'\xe2\x80\xa6' + fi + fi + echo -n "${value} " + done + echo +} + +function __status_query_task() { + setx taskData="$DOCKER" inspect "$taskID" + setx taskSlot=json_get 0.Slot <<<"$taskData" + setx taskStatus=json_get 0.Status.Err <<<"$taskData" + setx serviceID=json_get 0.ServiceID <<<"$taskData" +} +function __status_query_service() { + [ -n "$serviceData" ] && return + setx serviceID=json_get 0.ServiceID <<<"$taskData" + setx serviceData="$DOCKER" inspect "$serviceID" + setx serviceName=json_get 0.Spec.Name <<<"$serviceData" + setx serviceUpdateStatus=json_get 0.UpdateStatus.Message <<<"$serviceData" +} +function __status_process_data() { + __status_query_task + __status_query_service + if [ -n "$serviceUpdateStatus" ]; then + echo "\ +================ +$serviceName: $serviceUpdateStatus +================" + serviceUpdateStatus= + fi + if [ "$num" -eq 0 ]; then + # afficher les en-têtes + __format 3:num 32:taskName 20:node 8:dState 20:cState :error + fi + if [ -z "$fnum" -o "$num" == "$fnum" ]; then + taskName="$serviceName.$taskSlot" + __format 3:"$num" 32:"$taskName.$taskID" 20:"$node" 8:"$desiredState" 20:"$currentState" :"$taskStatus" + fi + if [ "$num" == "$fnum" ]; then + "$DOCKER" service logs -f "$taskID" + fi + let num=num+1 +} +function auto_status() { + local service="$1"; shift + [ -n "$service" ] || { + eerror "Vous devez spécifier le nom du service" + return 1 + } + 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 + local -a replace_env_args env_args + local -a replace_deploy_args deploy_args + local project_name container_name + docker_set_deploy_args set_container_name + service="${container_name}_${service#${container_name}_}" + fi + + local -a pscmd + local fnum + pscmd=( + "$DOCKER" service ps "$service" + --format "taskID={{.ID}};node={{.Node}};desiredState='{{.DesiredState}}';currentState='{{.CurrentState}}';__status_process_data" + ) + while [[ "$1" == *=* ]]; do + pscmd+=(--filter "$1") + shift + done + fnum="$1"; shift + + local num=0 taskData taskStatus taskSlot serviceID serviceData serviceName serviceUpdateStatus + eval "$("${pscmd[@]}")" +} + function default_compose_show_ip() { local -a cmd cids; local cid cmd=( @@ -1783,6 +1889,14 @@ while [ $# -gt 0 ]; do enote "Profil $PROFILE" auto_service "${args[@]}" || die ;; + sta|status) + args=() + while [ $# -gt 0 -a "$1" != -- ]; do + args+=("$1"); shift + done + enote "Profil $PROFILE" + auto_status "${args[@]}" || die + ;; u|update) args=() while [ $# -gt 0 -a "$1" != -- ]; do diff --git a/lib/ulib/json b/lib/ulib/json index b1d6772..058a452 100644 --- a/lib/ulib/json +++ b/lib/ulib/json @@ -29,3 +29,17 @@ function json_get(line) { function awkjson() { json_filter | awkrun -f "$JSONFUNCS" "$@" } + +function json_get() { php_json_get "$@"; } +function json_each() { php_json_each "$@"; } +function json_build() { php_json_build "$@"; } + +function php_json_get() { + "$ULIBDIR/support/php/json_get.php" "$@" +} +function php_json_each() { + "$ULIBDIR/support/php/json_each.php" "$@" +} +function php_json_build() { + "$ULIBDIR/support/php/json_build.php" "$@" +} diff --git a/lib/repoctl/json_build.php b/lib/ulib/support/php/json_build.php similarity index 100% rename from lib/repoctl/json_build.php rename to lib/ulib/support/php/json_build.php diff --git a/lib/repoctl/json_each.php b/lib/ulib/support/php/json_each.php similarity index 95% rename from lib/repoctl/json_each.php rename to lib/ulib/support/php/json_each.php index 3e6e981..ab6a9e0 100755 --- a/lib/repoctl/json_each.php +++ b/lib/ulib/support/php/json_each.php @@ -11,7 +11,7 @@ foreach ($data as $datum) { $keys = explode(".", trim($argv[$i])); foreach ($keys as $key) { if ($result === null) break; - if (!$key) continue; + if ($key === "") continue; if (isset($result[$key])) { $result = $result[$key]; } else { diff --git a/lib/repoctl/json_get.php b/lib/ulib/support/php/json_get.php similarity index 67% rename from lib/repoctl/json_get.php rename to lib/ulib/support/php/json_get.php index 0e0c6ed..3fffe77 100755 --- a/lib/repoctl/json_get.php +++ b/lib/ulib/support/php/json_get.php @@ -3,15 +3,26 @@ if ($argc <= 1) die("ERROR: Vous devez spécifier le nom de la clé\n"); +$argindex = 1; +$arg = $argv[1]; +$sep = "\t"; +if ($arg == "-s") { + $sep = $argv[2]; + $argindex += 2; +} elseif (substr($arg, 0, 2) == "-s") { + $sep = substr($arg, 2); + $argindex++; +} + $datum = json_decode(stream_get_contents(STDIN), true); $first = true; -for ($i = 1; $i < $argc; $i++) { +for ($i = $argindex; $i < $argc; $i++) { $result = $datum; $keys = explode(".", trim($argv[$i])); foreach ($keys as $key) { if ($result === null) break; - if (!$key) continue; + if ($key === "") continue; if (isset($result[$key])) { $result = $result[$key]; } else { @@ -20,7 +31,7 @@ for ($i = 1; $i < $argc; $i++) { } if ($first) $first = false; - else echo "\t"; + else echo $sep; if (is_array($result)) var_export($result); else echo $result; } diff --git a/repoctl b/repoctl index f8c7cb6..ac4e43d 100755 --- a/repoctl +++ b/repoctl @@ -1,7 +1,7 @@ #!/bin/bash # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 source "$(dirname "$0")/lib/ulib/ulib" || exit 1 -urequire DEFAULTS +urequire DEFAULTS json function display_help() { uecho "$scriptname: piloter un serveur git (gitolite, gogs, gitea, etc.) @@ -39,16 +39,6 @@ ACTIONS Supprimer le dépôt spécifié" } -function json_build() { - "$scriptdir/lib/repoctl/json_build.php" "$@" -} -function json_get() { - "$scriptdir/lib/repoctl/json_get.php" "$@" -} -function json_each() { - "$scriptdir/lib/repoctl/json_each.php" "$@" -} - function repoctl_init() { repourl="${1%.git}" [ -n "$repourl" ] || return From 45976f45c2c97dfe432eeb5262ef0f67f82606da Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Thu, 26 Mar 2020 22:33:25 +0400 Subject: [PATCH 07/18] dk: sta affiche le statut pour tous les services --- dk | 59 ++++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 36 insertions(+), 23 deletions(-) diff --git a/dk b/dk index 36221eb..5a0e321 100755 --- a/dk +++ b/dk @@ -92,10 +92,11 @@ COMMANDES $scriptname -- service logs web -f Pour des cas d'utilisation plus complexe, il faut lancer directement docker service - sta|status SERVICE [num] + sta|status [SERVICE] [num] Afficher le status du service spécifié: pour chaque occurence, sur quel noeud il tourne (ou tournait), quel est le statut actuel ainsi que le - message associé. + message associé. Si le service n'est pas spécifié, prendre la liste des + services affichée par docker service ls 'num' est le numéro de l'instance de service. Si ce numéro est précisé, afficher les informations uniquement pour cette instance là, ainsi que les logs @@ -1243,11 +1244,11 @@ function __status_query_task() { setx serviceID=json_get 0.ServiceID <<<"$taskData" } function __status_query_service() { - [ -n "$serviceData" ] && return - setx serviceID=json_get 0.ServiceID <<<"$taskData" + [ "$serviceID" == "$pServiceID" ] && return setx serviceData="$DOCKER" inspect "$serviceID" setx serviceName=json_get 0.Spec.Name <<<"$serviceData" setx serviceUpdateStatus=json_get 0.UpdateStatus.Message <<<"$serviceData" + pServiceID="$serviceID" } function __status_process_data() { __status_query_task @@ -1273,35 +1274,47 @@ $serviceName: $serviceUpdateStatus let num=num+1 } function auto_status() { - local service="$1"; shift - [ -n "$service" ] || { - eerror "Vous devez spécifier le nom du service" - return 1 - } - 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 - local -a replace_env_args env_args - local -a replace_deploy_args deploy_args - local project_name container_name - docker_set_deploy_args set_container_name - service="${container_name}_${service#${container_name}_}" + local -a services + local service + if [[ "$1" == *=* ]]; then + : # le premier argument est un filtre + elif [ -n "$1" -a -z "${1//[0-9]/}" ]; then + : # le premier argument est un numéro d'instance + else + # le premier argument est un nom de service + service="$1"; shift + fi + if [ -n "$service" ]; then + 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 + local -a replace_env_args env_args + local -a replace_deploy_args deploy_args + local project_name container_name + docker_set_deploy_args set_container_name + service="${container_name}_${service#${container_name}_}" + fi + services=("$service") + else + # lister les services qui tournent actuellement + setx -a services=docker service ls --format "{{.Name}}" fi - local -a pscmd + local -a psargs local fnum - pscmd=( - "$DOCKER" service ps "$service" + psargs=( --format "taskID={{.ID}};node={{.Node}};desiredState='{{.DesiredState}}';currentState='{{.CurrentState}}';__status_process_data" ) while [[ "$1" == *=* ]]; do - pscmd+=(--filter "$1") + psargs+=(--filter "$1") shift done fnum="$1"; shift - local num=0 taskData taskStatus taskSlot serviceID serviceData serviceName serviceUpdateStatus - eval "$("${pscmd[@]}")" + local num=0 taskData taskStatus taskSlot pServiceID serviceID serviceData serviceName serviceUpdateStatus + for service in "${services[@]}"; do + eval "$("$DOCKER" service ps "$service" "${psargs[@]}")" + done } function default_compose_show_ip() { From 1b12cee1fb36ae2fb8d182ab600893c0097300c8 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Thu, 26 Mar 2020 22:57:04 +0400 Subject: [PATCH 08/18] =?UTF-8?q?dk:=20afficher=20un=20warning=20si=20le?= =?UTF-8?q?=20profil=20n'est=20pas=20d=C3=A9fini=20pour=20une=20machine?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dk | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/dk b/dk index 5a0e321..55d8209 100755 --- a/dk +++ b/dk @@ -1700,15 +1700,25 @@ if [ -n "$DM_SET_MACHINE" ]; then [ "$DM_SET_MACHINE" == - ] && DM_SET_MACHINE=-u setx dm_env=docker-machine env "$DM_SET_MACHINE" || die eval "$dm_env" + # pour warning ci-dessous + [ "$DM_SET_MACHINE" == -u ] && DM_SET_MACHINE= 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 + 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 +== Le profil $DEFAULT_PROFILE sera utilisé ==" + sleep 3 + fi fi # construire par défaut From ccf3c67278794b37944367c0d09c71055fa78d52 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Fri, 27 Mar 2020 18:58:23 +0400 Subject: [PATCH 09/18] dk: aliases de filtres --- dk | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/dk b/dk index 55d8209..7eedc28 100755 --- a/dk +++ b/dk @@ -106,6 +106,9 @@ COMMANDES - name= a task's name or prefix - node= a node's name or ID - desired-state=(running|shutdown|accepted) + Pour faciliter l'utilisation des filtres, certains aliases sont définis. + '=r', '=k' et '=a' sont des aliases pour desired-state=running, + desired-state=shutdown et desired-state=accepted respectivement u|update SERVICE [args...] Mettre à jour un service, équivalent à 'service update SERVICE' scale SERVICE=REPLICAS [args...] @@ -1301,12 +1304,18 @@ function auto_status() { fi local -a psargs - local fnum + local filter fnum psargs=( --format "taskID={{.ID}};node={{.Node}};desiredState='{{.DesiredState}}';currentState='{{.CurrentState}}';__status_process_data" ) while [[ "$1" == *=* ]]; do - psargs+=(--filter "$1") + filter="$1" + case "$filter" in + =r) filter="desired-state=running";; + =k) filter="desired-state=shutdown";; + =a) filter="desired-state=accepted";; + esac + psargs+=(--filter "$filter") shift done fnum="$1"; shift From 1c4c1c3faf8ba1240cd779d13be1d30ce32650b1 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Sun, 29 Mar 2020 21:04:44 +0400 Subject: [PATCH 10/18] =?UTF-8?q?dmctl:=20l'option=20-a=20supporte=20les?= =?UTF-8?q?=20r=C3=A9pertoires?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dmctl | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/dmctl b/dmctl index 6395a06..059fb39 100755 --- a/dmctl +++ b/dmctl @@ -8,6 +8,7 @@ function display_help() { USAGE $scriptname -d NAME $scriptname -l ARCHIVE + $scriptname -a ARCHIVEs... OPTIONS -d, --dump @@ -131,12 +132,17 @@ case "$action" in dump) dump_machine "$1";; load) load_machine "$1";; loadall) - if [ $# -gt 0 ]; then - archives=("$@") - else - NOCLOBBER=1 - array_lsfiles archives . "*-machine.tar.gz" - fi + [ $# -gt 0 ] || set -- . + archives=() + for file in "$@"; do + if [ -d "$file" ]; then + NOCLOBBER=1 + array_lsfiles files "$file" "*-machine.tar.gz" + array_extend archives files + else + archives+=("$file") + fi + done for archive in "${archives[@]}"; do etitle "$archive" load_machine "$archive" From f7b3f90ba079a64243e0db11faf25573ae88269b Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Sun, 29 Mar 2020 21:27:21 +0400 Subject: [PATCH 11/18] dk: augmenter la largeur de la colonne node --- dk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dk b/dk index 7eedc28..77e7389 100755 --- a/dk +++ b/dk @@ -1265,11 +1265,11 @@ $serviceName: $serviceUpdateStatus fi if [ "$num" -eq 0 ]; then # afficher les en-têtes - __format 3:num 32:taskName 20:node 8:dState 20:cState :error + __format 3:num 32: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" 20:"$node" 8:"$desiredState" 20:"$currentState" :"$taskStatus" + __format 3:"$num" 32:"$taskName.$taskID" 32:"$node" 8:"$desiredState" 20:"$currentState" :"$taskStatus" fi if [ "$num" == "$fnum" ]; then "$DOCKER" service logs -f "$taskID" From aa269661cbb3ffbccf78a812613c134029a842c4 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Tue, 31 Mar 2020 23:38:53 +0400 Subject: [PATCH 12/18] dk: support build args avec la syntaxe NAME=VALUE --- dk | 74 ++++++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 50 insertions(+), 24 deletions(-) diff --git a/dk b/dk index 77e7389..410aff5 100755 --- a/dk +++ b/dk @@ -23,8 +23,8 @@ veut dire qu'elle n'aura pas la même sématique. COMMANDES get-profile Afficher le profil courant - b|build [SERVICE] - Construire les images + b|build [NAME=VALUE...] [SERVICE] + Construire les images. Les variables NAME=VALUE sont des 'build args' p|push p|push [SERVICES...] La première syntaxe est utilisable avec un projet docker. Elle permet de @@ -56,31 +56,31 @@ COMMANDES x|exec SERVICE COMMAND Lancer une commande dans le container correspondant au service spécifié, qui doit être en fonctionnement - d|brd + 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 arrête l'affichage des logs avec Ctrl+C, arrêter les services et supprimer l'environnement (comme avec down) Vaguement équivalent à -- build -- start [args] -- logs suivi de -- down - bs + bs [NAME=VALUE...] Construire les images (comme avec build) puis démarrer les services (comme avec start) Equivalent à -- build -- start [args] - br SERVICE [COMMAND] + br [NAME=VALUE...] SERVICE [COMMAND] Construire les images (comme avec build) puis démarrer le service avec la commande spécifiée (comme avec run) - Equivalent à -- build -- run [args] + Equivalent à -- build [NAME=VALUE...] -- run [args] y|deploy [args...] (Re)déployer un stack. Cette commande ne fonctionne qu'en mode swarm. Implique --stack - by|bd [args...] - Equivalent à --stack -- build -- deploy args... + by|bd [NAME=VALUE...] [args...] + Equivalent à --stack -- build [NAME=VALUE...] -- deploy args... Utilisable notamment en développement - bp [args...] - Equivalent à --stack -- build -- push args... - bpy|bpd [args...] - Equivalent à --stack -- build -- push -- deploy args... + bp [NAME=VALUE...] [args...] + Equivalent à --stack -- build [NAME=VALUE...] -- push args... + bpy|bpd [NAME=VALUE...] [args...] + Equivalent à --stack -- build [NAME=VALUE...] -- push -- deploy args... ser|service COMMAND SERVICE [args...] Frontend pour 'docker service COMMAND args... SERVICE' Cette commande ne fonctionne qu'en mode swarm. Il n'est pas nécessaire @@ -840,11 +840,11 @@ function default_update_build_env() { [ -n "$VERSION" ] || docker_add_build_arg VERSION "$(get_version)" [ -n "$VERSION" ] && TAGS+=("$VERSION") # Variables en ligne de commande - for var in "${VARS[@]}"; do + for var in "${VARS[@]}" "$@"; do docker_add_build_arg "${var%%=*}" "${var#*=}" done } -function update_build_env() { default_update_build_env; } +function update_build_env() { default_update_build_env "$@"; } function default_compose_build() { ${FAKE:+qvals} docker-compose \ @@ -873,24 +873,42 @@ function docker_build() { [ -n "$BUILD_BUILD" ] || return 0 default_docker_build "$@" } +function __parse_bargs() { + bargs=() + args=() + while [ $# -gt 0 ]; do + [[ "$1" == *=* ]] && bargs+=("$1") || args+=("$1") + shift + done +} function auto_build() { local -a replace_env_args env_args local -a replace_build_args build_args initialize_build_env + + local -a args bargs; local barg + __parse_bargs "$@" + set -- "${args[@]}" + if [ -f docker-compose.yml ]; then compose_set_env_args - update_build_env + update_build_env "${bargs[@]}" build_update_apps || return 1 compose_build "$@" elif [ -f Dockerfile ]; then docker_parse_env_args docker_check_name docker_add_build_arg build_date "$(date +%y%m%d)" - update_build_env + update_build_env "${bargs[@]}" build_update_apps || return 1 docker_build "$@" else - ${FAKE:+qvals} "$DOCKER" build ${NO_CACHE:+--no-cache} "$@" + for barg in "${bargs[@]}"; do + replace_build_args+=(--build-arg "$barg") + done + ${FAKE:+qvals} "$DOCKER" build \ + ${NO_CACHE:+--no-cache} \ + "${replace_build_args[@]}" "$@" fi } @@ -1078,7 +1096,7 @@ function compose_run() { default_compose_run "$@"; } function docker_run() { default_docker_run "$@"; } function auto_run() { eval "$(utools_local parse_opts)" - local detach no_deps rm=1 service_ports use_aliases volume + local detach no_deps rm=1 service_ports use_aliases volume disable_tty local -a envs labels local var for var in "${VARS[@]}"; do @@ -1096,6 +1114,7 @@ function auto_run() { --service-ports service_ports=1 --use-aliases use_aliases=1 -v:,--volume: volume= + -T disable_tty=1 @ args -- "$@" ) parse_opts "${args[@]}" && set -- "${args[@]}" || { eerror "$args"; return 1; } @@ -1114,6 +1133,7 @@ function auto_run() { ${service_ports:+--service-ports} ${use_aliases:+--use-aliases} ${volume:+-v "$volume"} + ${disable_tty:+-T} ) compose_run "$@" elif [ -f Dockerfile ]; then @@ -1840,7 +1860,8 @@ while [ $# -gt 0 ]; do args+=("$1"); shift done enote "Profil $PROFILE" - if auto_build; then + __parse_bargs "${args[@]}" + if auto_build "${bargs[@]}"; then auto_up "${args[@]}" && auto_logs || die else do_auto_down= @@ -1856,7 +1877,8 @@ while [ $# -gt 0 ]; do args+=("$1"); shift done enote "Profil $PROFILE" - auto_build && auto_up "${args[@]}" + __parse_bargs "${args[@]}" + auto_build "${bargs[@]}" && auto_up "${args[@]}" || die ;; br) build_set_options "$update_apps_mode" "$update_apps_origin" "$update_apps_branch" @@ -1868,7 +1890,8 @@ while [ $# -gt 0 ]; do args+=("$1"); shift done enote "Profil $PROFILE" - auto_build && auto_run "${args[@]}" + __parse_bargs "${args[@]}" + auto_build "${bargs[@]}" && auto_run "${args[@]}" || die ;; y|deploy) USE_STACK=1 @@ -1889,7 +1912,8 @@ while [ $# -gt 0 ]; do args+=("$1"); shift done enote "Profil $PROFILE" - auto_build && auto_deploy "${args[@]}" + __parse_bargs "${args[@]}" + auto_build "${bargs[@]}" && auto_deploy "${args[@]}" || die ;; bp) build_set_options "$update_apps_mode" "$update_apps_origin" "$update_apps_branch" @@ -1900,7 +1924,8 @@ while [ $# -gt 0 ]; do args+=("$1"); shift done enote "Profil $PROFILE" - auto_build && auto_push "${args[@]}" + __parse_bargs "${args[@]}" + auto_build "${bargs[@]}" && auto_push "${args[@]}" || die ;; bpy|bpd) build_set_options "$update_apps_mode" "$update_apps_origin" "$update_apps_branch" @@ -1911,7 +1936,8 @@ while [ $# -gt 0 ]; do args+=("$1"); shift done enote "Profil $PROFILE" - auto_build && auto_push && auto_deploy "${args[@]}" + __parse_bargs "${args[@]}" + auto_build "${bargs[@]}" && auto_push && auto_deploy "${args[@]}" || die ;; ser|service) args=() From 7268cecce659eb8dddf69ee72566393b6bc78656 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Fri, 10 Apr 2020 17:04:41 +0400 Subject: [PATCH 13/18] pff: workaround pour certaines erreurs de packaging --- pff | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/pff b/pff index 57931e7..ac0112e 100755 --- a/pff +++ b/pff @@ -777,7 +777,19 @@ function new__prepare_archive() { # nom de l'archive sans la version local ban="${banv%$(get_archive_versionsuffix "$archive")}" local filename="$(basename "$file")" - [ "$filename" == "$banv" -o "$filename" == "$ban" ] || unwrap= + # nom du répertoire sans la version + local filenv="${filename%-$version}" + if [ "$filename" == "$banv" -o "$filename" == "$ban" ]; then + # le nom du répertoire correspond au nom de l'archive. cool! + unwrap=1 + elif [ "$filenv" == "$banv" ]; then + # le nom du répertoire n'est pas contruit correctement + # mais ce n'est pas grave (e.g ban-VERSION au lieu de + # banVERSION comme l'archive) + unwrap=1 + else + unwrap= + fi fi [ -n "$unwrap" -a -d "$file" ] && srcdir="$file" fi From 1d7e2d094985bda773c666b3a947ce84d158fef5 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Fri, 10 Apr 2020 17:09:32 +0400 Subject: [PATCH 14/18] bug --- pff | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pff b/pff index ac0112e..d3c39a3 100755 --- a/pff +++ b/pff @@ -777,12 +777,10 @@ function new__prepare_archive() { # nom de l'archive sans la version local ban="${banv%$(get_archive_versionsuffix "$archive")}" local filename="$(basename "$file")" - # nom du répertoire sans la version - local filenv="${filename%-$version}" if [ "$filename" == "$banv" -o "$filename" == "$ban" ]; then # le nom du répertoire correspond au nom de l'archive. cool! unwrap=1 - elif [ "$filenv" == "$banv" ]; then + elif [ "${filename%-$version}" == "$ban" ]; then # le nom du répertoire n'est pas contruit correctement # mais ce n'est pas grave (e.g ban-VERSION au lieu de # banVERSION comme l'archive) From 9fad9924ef0885e1c8867014f003705acc848224 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Tue, 14 Apr 2020 12:24:16 +0400 Subject: [PATCH 15/18] =?UTF-8?q?dk:=20support=20r=C3=A9pertoire/fichier?= =?UTF-8?q?=20source?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dk | 59 +++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 49 insertions(+), 10 deletions(-) diff --git a/dk b/dk index 410aff5..07faa86 100755 --- a/dk +++ b/dk @@ -272,7 +272,8 @@ OPTIONS build APPS=() # applications à mettre à jour par défaut PROFILE_APPS=() # ou... spécifique au profil 'PROFILE' app_URL= # url du dépôt - app_DEVEL_SRCDIR= # répertoire source en mode devel + app_DEVEL_SRCDIR= # répertoire source du dépôt en mode devel + app_SRC= # répertoire/fichier source (si URL pas renseigné) app_DEST= # répertoire dans lequel faire le checkout app_PROFILE_ORIGIN= # origine spécifique au profil 'PROFILE' app_ORIGIN= # ou... origine par défaut de la branche @@ -298,6 +299,11 @@ OPTIONS deploy (c'est à dire ne pas utiliser l'option --with-registry-auth) VARIABLES de update-apps.conf + SRC + répertoire/fichier source, si URL n'est pas défini. si ce chemin est + relatif, il doit être exprimé par rapport au répertoire du projet. + IMPORTANT: dans ce cas, DEST n'est pas le répertoire de base du + checkout, mais le répertoire destination pour la synchro DEVEL_SRCDIR répertoire source pour le mode devel. attention, il s'agit du répertoire du projet, alors que DEFAULT_DEVEL_SRCDIR est le répertoire de base par @@ -318,6 +324,7 @@ VARIABLES de update-apps.conf projet. Les variables suivantes sont disponibles: URL= # url du dépôt DEVEL_SRCDIR= # répertoire source en mode devel + SRC= # répertoire/fichier source (si URL pas renseigné) DEST= # répertoire dans lequel faire le checkout ORIGIN= # origine de la branche BRANCH= # branche sélectionnée dans le dépôt @@ -654,8 +661,8 @@ function build_update_apps() { DEFAULT_ORIGIN="$UPDATE_APPS_ORIGIN" [ -z "$DEFAULT_ORIGIN" ] && DEFAULT_ORIGIN=origin DEFAULT_BRANCH="$UPDATE_APPS_BRANCH" - #XXX à terme, on déploiera la branche master en prod - [ -z "$DEFAULT_BRANCH" -a "$PROFILE" == prod ] && DEFAULT_BRANCH=develop #master + #XXX à terme, ne déployer en prod que la branche master + [ -z "$DEFAULT_BRANCH" -a "$PROFILE" == prod ] && DEFAULT_BRANCH=develop #XXX master [ -z "$DEFAULT_BRANCH" ] && DEFAULT_BRANCH=develop DEFAULT_DEVEL_SRCDIR="$HOME/wop/php" DEFAULT_COMPOSER_ACTION=install @@ -685,17 +692,20 @@ function build_update_apps() { fi etitle "Mise à jour des dépendances" - local app var URL DEVEL_SRCDIR DEST ORIGIN BRANCH TYPE after_update after_updates composer_action + local app var URL SRC DEVEL_SRCDIR DEST ORIGIN BRANCH TYPE after_update after_updates composer_action for app in "${APPS[@]}"; do etitle "$app" var="${app//-/_}" URL="${var}_URL"; URL="${!URL}" - [ -n "$URL" ] || { - ewarn "$app: vous devez définir l'url" - eend; return 1 - } + if [ -z "$URL" ]; then + SRC="${var}_SRC"; SRC="${!SRC}" + if [ -z "$SRC" ]; then + ewarn "$app: vous devez définir ${var}_URL ou ${var}_SRC" + eend; return 1 + fi + fi DEVEL_SRCDIR="${var}_DEVEL_SRCDIR"; DEVEL_SRCDIR="${!DEVEL_SRCDIR}" [ -n "$DEVEL_SRCDIR" ] || DEVEL_SRCDIR="$DEFAULT_DEVEL_SRCDIR/${URL##*/}" @@ -715,8 +725,9 @@ function build_update_apps() { # calculer le type maintenant, on en a besoin pour le mode devel TYPE="${var}_TYPE"; TYPE="${!TYPE}" - DEST="$DEST/$app" if [ -n "$BUILD_UPDATE_DEVEL" ]; then + DEST="$DEST/$app" + # synchronisation en mode devel local -a rsync_opts; rsync_opts=(-a --delete --exclude .git/ --delete-excluded) estep "Synchro $DEVEL_SRCDIR --> $DEST" @@ -741,7 +752,9 @@ function build_update_apps() { rsync "${rsync_opts[@]}" --exclude /vendor/ "$DEFAULT_DEVEL_SRCDIR/$pname/" "$depdir" done fi - else + elif [ -n "$URL" ]; then + DEST="$DEST/$app" + if [ -d "$DEST" -a -d "$DEST/.git" ]; then # mise à jour estep "Maj dépôt $URL:$BRANCH --> $DEST" @@ -758,6 +771,28 @@ function build_update_apps() { git clone -o "$ORIGIN" -b "$BRANCH" "$URL" "$DEST" || { eend; return 1; } fi + if [ -z "$TYPE" ]; then + # possible de détecter le type quand on a le projet + # en cas de maj ici, mettre à jour aussi le code ci-dessus et ci-dessous + if [ -f "$DEST/composer.json" ]; then TYPE=composer + else TYPE=none + fi + fi + + elif [ -n "$SRC" ]; then + if [ -d "$SRC" ]; then + local -a rsync_opts; rsync_opts=(-a --delete --exclude .git/ --delete-excluded) + estep "Synchro $SRC/ --> $DEST" + rsync "${rsync_opts[@]}" "$SRC/" "$DEST/" || { eend; return 1; } + elif [ -f "$SRC" ]; then + local -a rsync_opts; rsync_opts=(-a) + estep "Synchro $SRC --> $DEST" + rsync "${rsync_opts[@]}" "$SRC" "$DEST/" || { eend; return 1; } + else + eerror "$app: $SRC: répertoire/fichier introuvable" + eend; return 1 + fi + if [ -z "$TYPE" ]; then # possible de détecter le type quand on a le projet # en cas de maj ici, mettre à jour aussi le code ci-dessus @@ -765,6 +800,10 @@ function build_update_apps() { else TYPE=none fi fi + + else + # ne devrait pas se produire + die "ni URL ni SRC ne sont définis" fi after_updates="${var}_AFTER_UPDATE" From 74190f726459d36bbd56be80a177e98654f993be Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Wed, 15 Apr 2020 04:31:29 +0400 Subject: [PATCH 16/18] =?UTF-8?q?dk:=20par=20d=C3=A9faut,=20les=20suffixes?= =?UTF-8?q?=20courants=20sont=20supprim=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dk | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/dk b/dk index 07faa86..4dde61f 100755 --- a/dk +++ b/dk @@ -420,11 +420,18 @@ function docker_check_name() { } function compose_set_project_name() { - local PROJECT_NAME= PROJECT_NAME_REMOVE_SUFFIX=.service PROJECT_NAME_ADD_PROFILE= + local PROJECT_NAME= PROJECT_NAME_REMOVE_SUFFIX=--defaults-- PROJECT_NAME_ADD_PROFILE= [ -f .compose.env ] && source ./.compose.env [ -n "$PROJECT_NAME" ] || PROJECT_NAME="$(basename -- "$(pwd)")" - PROJECT_NAME="${PROJECT_NAME%$PROJECT_NAME_REMOVE_SUFFIX}" + if [ "$PROJECT_NAME_REMOVE_SUFFIX" == --defaults-- ]; then + if [ "${PROJECT_NAME%.service}" != "$PROJECT_NAME" ]; then PROJECT_NAME="${PROJECT_NAME%.service}" + elif [ "${PROJECT_NAME%.stack}" != "$PROJECT_NAME" ]; then PROJECT_NAME="${PROJECT_NAME%.stack}" + elif [ "${PROJECT_NAME%.network}" != "$PROJECT_NAME" ]; then PROJECT_NAME="${PROJECT_NAME%.network}" + fi + else + PROJECT_NAME="${PROJECT_NAME%$PROJECT_NAME_REMOVE_SUFFIX}" + fi if [ -n "$PROFILE" ]; then [ -n "$COMPOSE_PROJECT_NAME" ] || COMPOSE_PROJECT_NAME="$PROJECT_NAME${PROJECT_NAME_ADD_PROFILE:+_${PROFILE}}" From f4f9b69257c50ca894b5a5dccede48e28c82224f Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Thu, 16 Apr 2020 22:44:38 +0400 Subject: [PATCH 17/18] dk: bug avec la synchro d'un fichier --- dk | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/dk b/dk index 4dde61f..43e7a17 100755 --- a/dk +++ b/dk @@ -719,7 +719,6 @@ function build_update_apps() { DEST="${var}_DEST"; DEST="${!DEST}" [ -n "$DEST" ] || DEST="$app/b" - mkdir -p "$DEST" || { eend; return 1; } ORIGIN="${var}_${PROFILE}_ORIGIN"; ORIGIN="${!ORIGIN}" [ -n "$ORIGIN" ] || { ORIGIN="${var}_ORIGIN"; ORIGIN="${!ORIGIN}"; } @@ -733,6 +732,7 @@ function build_update_apps() { TYPE="${var}_TYPE"; TYPE="${!TYPE}" if [ -n "$BUILD_UPDATE_DEVEL" ]; then + mkdir -p "$DEST" || { eend; return 1; } DEST="$DEST/$app" # synchronisation en mode devel @@ -760,6 +760,7 @@ function build_update_apps() { done fi elif [ -n "$URL" ]; then + mkdir -p "$DEST" || { eend; return 1; } DEST="$DEST/$app" if [ -d "$DEST" -a -d "$DEST/.git" ]; then @@ -789,12 +790,20 @@ function build_update_apps() { elif [ -n "$SRC" ]; then if [ -d "$SRC" ]; then local -a rsync_opts; rsync_opts=(-a --delete --exclude .git/ --delete-excluded) - estep "Synchro $SRC/ --> $DEST" - rsync "${rsync_opts[@]}" "$SRC/" "$DEST/" || { eend; return 1; } + SRC="${SRC%/}/" + DEST="${DEST%/}/" + estep "Synchro $SRC --> $DEST" + rsync "${rsync_opts[@]}" "$SRC" "$DEST" || { eend; return 1; } elif [ -f "$SRC" ]; then local -a rsync_opts; rsync_opts=(-a) - estep "Synchro $SRC --> $DEST" - rsync "${rsync_opts[@]}" "$SRC" "$DEST/" || { eend; return 1; } + if [ "${DEST%/}" != "$DEST" -o -d "$DEST" ]; then + DEST="${DEST%/}/" + estep "Synchro $SRC --> $DEST" + rsync "${rsync_opts[@]}" "$SRC" "$DEST" || { eend; return 1; } + else + estep "Synchro $SRC --> $DEST" + rsync "${rsync_opts[@]}" "$SRC" "$DEST" || { eend; return 1; } + fi else eerror "$app: $SRC: répertoire/fichier introuvable" eend; return 1 From b18b24c22d6eec0c7d8d74c799c39c61e1624d67 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Fri, 17 Apr 2020 10:20:37 +0400 Subject: [PATCH 18/18] Init changelog & version 9.7.0 --- CHANGES.md | 20 ++++++++++++++++++++ VERSION.txt | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 16f92d5..233cc0d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,23 @@ +## Version 9.7.0 du 17/04/2020-10:20 + +* `f4f9b69` dk: bug avec la synchro d'un fichier +* `74190f7` dk: par défaut, les suffixes courants sont supprimés +* `9fad992` dk: support répertoire/fichier source +* `1d7e2d0` bug +* `7268cec` pff: workaround pour certaines erreurs de packaging +* `aa26966` dk: support build args avec la syntaxe NAME=VALUE +* `f7b3f90` dk: augmenter la largeur de la colonne node +* `1c4c1c3` dmctl: l'option -a supporte les répertoires +* `ccf3c67` dk: aliases de filtres +* `1b12cee` dk: afficher un warning si le profil n'est pas défini pour une machine +* `45976f4` dk: sta affiche le statut pour tous les services +* `1960c0c` dk: implémenter status +* `4f206d7` dk: frontend plus 'transparent' +* `d666859` dk: supprimer avec image:tag si possible +* `4ee346b` maj chemin ip +* `c9796b2` ipaddr: frontend pour ip addr +* `668eec1` dmctl: possibilité d'importer toutes les machines d'un répertoire + ## Version 9.6.0 du 24/02/2020-09:13 * `b7492fc` dk: ajout de l'option -e diff --git a/VERSION.txt b/VERSION.txt index 7b0680f..a458a24 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -9.6.0 +9.7.0