Intégration de la branche release-9.9.0

This commit is contained in:
Jephté Clain 2020-09-21 18:08:31 +04:00
commit 246b9473aa
11 changed files with 419 additions and 45 deletions

View File

@ -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 ## Version 9.8.0 du 28/04/2020-16:42
* `e2b2f49` dk: vérifier que le répertoire destination existe avant rsync * `e2b2f49` dk: vérifier que le répertoire destination existe avant rsync

View File

@ -1 +1 @@
9.8.0 9.9.0

View File

@ -19,6 +19,9 @@ OPTIONS
-d, --mysqldump-cmd -d, --mysqldump-cmd
Lancer 'mysqldump --databases --add-drop-database -hSERVICE_IP' avec Lancer 'mysqldump --databases --add-drop-database -hSERVICE_IP' avec
les arguments supplémentaires fournis sur la ligne de commande 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 -u, --user USER
-p, --password PASSWORD -p, --password PASSWORD
Paramètres supplémentaires utilisés uniquement avec les options -c et -d" Paramètres supplémentaires utilisés uniquement avec les options -c et -d"
@ -27,6 +30,7 @@ OPTIONS
service=db service=db
mysql_cmd= mysql_cmd=
mysqldump_cmd= mysqldump_cmd=
klean=
user= user=
password= password=
args=( args=(
@ -34,6 +38,7 @@ args=(
-h:,-s:,--service: service= -h:,-s:,--service: service=
-c,--mysql-cmd mysql_cmd=1 -c,--mysql-cmd mysql_cmd=1
-d,--mysqldump-cmd mysqldump_cmd=1 -d,--mysqldump-cmd mysqldump_cmd=1
-k,--klean klean=1
-u:,--user: user= -u:,--user: user=
-p:,--password: password= -p:,--password: password=
) )
@ -58,8 +63,6 @@ if [ -z "$first" ]; then
enote "Le répertoire du projet est $(ppath . ~)" enote "Le répertoire du projet est $(ppath . ~)"
fi 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"; } function die_not_found() { die "$service: service introuvable. vérifiez que le projet est actuellement up"; }
@ -78,7 +81,17 @@ if [ -n "$mysql_cmd" ]; then
elif [ -n "$mysqldump_cmd" ]; then elif [ -n "$mysqldump_cmd" ]; then
mysqldump --databases --add-drop-database -h"$ip" ${user:+-u"$user"} ${password:+-p"$password"} "$@" 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 else
[ -f bin/conndev.php ] || die "Impossible de trouver le script compagnon conndev.php"
mysql_cmd="$(php bin/conndev.php "$ip" "$@")" mysql_cmd="$(php bin/conndev.php "$ip" "$@")"
edebug "mysql_cmd: $mysql_cmd" edebug "mysql_cmd: $mysql_cmd"

265
dk
View File

@ -55,7 +55,10 @@ COMMANDES
container après utilisation. container après utilisation.
x|exec SERVICE COMMAND x|exec SERVICE COMMAND
Lancer une commande dans le container correspondant au service spécifié, 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...] d|brd [NAME=VALUE...]
Construire les images (comme avec build), démarrer les services et 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 suivre les logs de façon interactive (comme avec up). Dès que l'on
@ -119,6 +122,12 @@ COMMANDES
systemd|systemd-unit systemd|systemd-unit
Générer une unité systemd qui démarre les services. A priori, ce n'est 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. 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] ps [filter|name=value]
Afficher les containers en cours d'exécution Afficher les containers en cours d'exécution
Le filtre est une expression régulière de type awk qui est mise en 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 -m, --set-machine MACHINE
Choisir l'environnement docker-machine spécifié avant de lancer les 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 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 -n, --fake
Ne pas lancer les commandes, simplement les afficher Ne pas lancer les commandes, simplement les afficher
-e, --build-arg, --env VAR=VALUE -e, --build-arg, --env VAR=VALUE
@ -276,6 +300,8 @@ OPTIONS build
app_SRC= # répertoire/fichier source (si URL='') app_SRC= # répertoire/fichier source (si URL='')
app_DEST= # répertoire dans lequel faire le checkout app_DEST= # répertoire dans lequel faire le checkout
# ou destination si synchro avec app_SRC # 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 app_RSYNC_OPTS= # options de rsync si synchro (avec app_SRC
# ou app_DEVEL_SRCDIR) # ou app_DEVEL_SRCDIR)
app_PROFILE_ORIGIN= # origine spécifique au profil 'PROFILE' app_PROFILE_ORIGIN= # origine spécifique au profil 'PROFILE'
@ -285,6 +311,7 @@ OPTIONS build
app_TYPE= # type de projet (composer|none) app_TYPE= # type de projet (composer|none)
app_AFTER_UPDATE=() # liste de commandes à lancer après le checkout app_AFTER_UPDATE=() # liste de commandes à lancer après le checkout
app_COMPOSER_ACTION= # action projet composer (install|update|none) app_COMPOSER_ACTION= # action projet composer (install|update|none)
app_COMPOSER_ARGS=() # arguments de composer install|update
-u, --uu, --update-apps-only -u, --uu, --update-apps-only
Ne faire que la mise à jour depuis les dépôts dépendants. Ne faire que la mise à jour depuis les dépôts dépendants.
-w, --ww, --update-apps-devel -w, --ww, --update-apps-devel
@ -330,6 +357,7 @@ VARIABLES de update-apps.conf
SRC= # répertoire/fichier source (si URL='') SRC= # répertoire/fichier source (si URL='')
DEST= # répertoire dans lequel faire le checkout DEST= # répertoire dans lequel faire le checkout
# ou destination si URL='' # ou destination si URL=''
NAME= # nom du répertoire dest si checkout
RSYNC_OPTS= # options de rsync si synchro avec SRC ou RSYNC_OPTS= # options de rsync si synchro avec SRC ou
# DEVEL_SRCDIR # DEVEL_SRCDIR
ORIGIN= # origine de la branche ORIGIN= # origine de la branche
@ -339,6 +367,12 @@ VARIABLES de update-apps.conf
vaut 'install' par défaut. Indique ce qu'il faut faire pour un projet de 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 type 'composer' après avoir lancé les commandes de AFTER_UPDATE. Les
directives supportées sont 'install', 'update' et 'none' 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 FONCTIONS de update-apps.conf
sqlmig [DESTDIR [SRCDIR [NOFIX]]] sqlmig [DESTDIR [SRCDIR [NOFIX]]]
@ -362,7 +396,9 @@ FONCTIONS de update-apps.conf
PTD est remplacé par prod:prod,test:test,devel:devel PTD est remplacé par prod:prod,test:test,devel:devel
PT " " " prod:prod,test:test PT " " " prod:prod,test:test
'"Si aucun profil de déploiement ne correspond, le comportement par défaut '"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 "$*"; } function echo_lines() { local IFS=$'\n'; echo "$*"; }
@ -665,6 +701,13 @@ function update_apps_func_pff() {
fi fi
} }
function update_apps_func_mvn() {
local cwd="$(pwd)"
cd "$DEST"
mvn "$@" || die
cd "$cwd"
}
function build_update_apps() { function build_update_apps() {
[ -n "$BUILD_UPDATE_APPS" ] || return 0 [ -n "$BUILD_UPDATE_APPS" ] || return 0
[ -f update-apps.conf ] || return 0 [ -f update-apps.conf ] || return 0
@ -690,9 +733,9 @@ function build_update_apps() {
local PRODUCTION DEVELOPMENT local PRODUCTION DEVELOPMENT
case "$PROFILE" in case "$PROFILE" in
prod) PRODUCTION=1; DEVELOPMENT=;; prod) PRODUCTION=1; DEVELOPMENT=; is_defined DEFAULT_COMPOSER_ARGS || DEFAULT_COMPOSER_ARGS=(--no-dev -o);;
test) PRODUCTION=1; DEVELOPMENT=1;; test) PRODUCTION=1; DEVELOPMENT=1; is_defined DEFAULT_COMPOSER_ARGS || DEFAULT_COMPOSER_ARGS=(--no-dev -o);;
devel) PRODUCTION=; DEVELOPMENT=;; devel) PRODUCTION=; DEVELOPMENT=1; is_defined DEFAULT_COMPOSER_ARGS || DEFAULT_COMPOSER_ARGS=();;
esac esac
local clean local clean
@ -705,7 +748,8 @@ function build_update_apps() {
fi fi
etitle "Mise à jour des dépendances" 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
local -a composer_args
for app in "${APPS[@]}"; do for app in "${APPS[@]}"; do
etitle "$app" etitle "$app"
@ -726,6 +770,9 @@ function build_update_apps() {
DEST="${var}_DEST"; DEST="${!DEST}" DEST="${var}_DEST"; DEST="${!DEST}"
[ -n "$DEST" ] || DEST="$app/b" [ -n "$DEST" ] || DEST="$app/b"
NAME="${var}_NAME"; NAME="${!NAME}"
[ -n "$NAME" ] || NAME="$app"
if is_defined "${var}_RSYNC_OPTS"; then if is_defined "${var}_RSYNC_OPTS"; then
have_RSYNC_OPTS=1 have_RSYNC_OPTS=1
RSYNC_OPTS="${var}_RSYNC_OPTS[@]"; RSYNC_OPTS=("${!RSYNC_OPTS}") RSYNC_OPTS="${var}_RSYNC_OPTS[@]"; RSYNC_OPTS=("${!RSYNC_OPTS}")
@ -747,7 +794,7 @@ function build_update_apps() {
if [ -n "$BUILD_UPDATE_DEVEL" ]; then if [ -n "$BUILD_UPDATE_DEVEL" ]; then
mkdir -p "$DEST" || { eend; return 1; } mkdir -p "$DEST" || { eend; return 1; }
DEST="$DEST/$app" DEST="$DEST/$NAME"
# synchronisation en mode devel # synchronisation en mode devel
[ -n "$have_RSYNC_OPTS" ] || RSYNC_OPTS=(--delete --delete-excluded) [ -n "$have_RSYNC_OPTS" ] || RSYNC_OPTS=(--delete --delete-excluded)
@ -776,7 +823,7 @@ function build_update_apps() {
fi fi
elif [ -n "$URL" ]; then elif [ -n "$URL" ]; then
mkdir -p "$DEST" || { eend; return 1; } mkdir -p "$DEST" || { eend; return 1; }
DEST="$DEST/$app" DEST="$DEST/$NAME"
if [ -d "$DEST" -a -d "$DEST/.git" ]; then if [ -d "$DEST" -a -d "$DEST/.git" ]; then
# mise à jour # mise à jour
@ -872,6 +919,11 @@ function build_update_apps() {
[ -n "$composer_action" ] || { composer_action="${var}_COMPOSER_ACTION"; composer_action="${!composer_action}"; } [ -n "$composer_action" ] || { composer_action="${var}_COMPOSER_ACTION"; composer_action="${!composer_action}"; }
[ -n "$composer_action" ] || composer_action="$DEFAULT_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 if [ -z "$BUILD_UPDATE_DEVEL" ]; then
case "${composer_action:-install}" in case "${composer_action:-install}" in
i|install) composer_action=install;; i|install) composer_action=install;;
@ -883,7 +935,7 @@ function build_update_apps() {
setx cwd=pwd setx cwd=pwd
cd "$DEST" cd "$DEST"
estep "Installation des dépendances composer" 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" cd "$cwd"
fi fi
fi fi
@ -1259,13 +1311,28 @@ function auto_exec() {
local project_name container_name local project_name container_name
if [ -f docker-compose.yml ]; then if [ -f docker-compose.yml ]; then
compose_set_env_args 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 elif [ -f Dockerfile ]; then
docker_set_env_args docker_set_env_args
docker_check_name set_container_name docker_check_name set_container_name
docker_exec "$@" exec_args=(-it)
local command="$1"; shift
[ -n "$command" ] || command=bash
docker_exec "$command" "$@"
else 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 fi
} }
@ -1352,6 +1419,7 @@ function __format() {
function __status_query_task() { function __status_query_task() {
setx taskData="$DOCKER" inspect "$taskID" setx taskData="$DOCKER" inspect "$taskID"
setx taskID=json_get 0.ID <<<"$taskData"
setx taskSlot=json_get 0.Slot <<<"$taskData" setx taskSlot=json_get 0.Slot <<<"$taskData"
setx taskStatus=json_get 0.Status.Err <<<"$taskData" setx taskStatus=json_get 0.Status.Err <<<"$taskData"
setx serviceID=json_get 0.ServiceID <<<"$taskData" setx serviceID=json_get 0.ServiceID <<<"$taskData"
@ -1375,11 +1443,11 @@ $serviceName: $serviceUpdateStatus
fi fi
if [ "$num" -eq 0 ]; then if [ "$num" -eq 0 ]; then
# afficher les en-têtes # 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 fi
if [ -z "$fnum" -o "$num" == "$fnum" ]; then if [ -z "$fnum" -o "$num" == "$fnum" ]; then
taskName="$serviceName.$taskSlot" 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 fi
if [ "$num" == "$fnum" ]; then if [ "$num" == "$fnum" ]; then
"$DOCKER" service logs -f "$taskID" "$DOCKER" service logs -f "$taskID"
@ -1567,6 +1635,25 @@ EOF
local_run "$HOST" "$tmpscript" 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() { function default_local_composer() {
# lancement direct # lancement direct
case "$1" in case "$1" in
@ -1762,6 +1849,70 @@ exit((PHP_VERSION_ID < $version)? 0: 1);
################################################################################ ################################################################################
function resolve_dm_alias() {
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%%:*}"
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 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 # support limité docker / podman
if progexists docker; then DOCKER=docker if progexists docker; then DOCKER=docker
elif progexists podman; then DOCKER=podman elif progexists podman; then DOCKER=podman
@ -1770,15 +1921,19 @@ fi
DEFAULT_PROFILE=devel DEFAULT_PROFILE=devel
# pour le moment ne pas lancer composer dans un container par défaut # 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= PROFILE=
DM_ALIASES=()
DM_PROFILES=() DM_PROFILES=()
CLUSTERDIRS=()
set_defaults dk set_defaults dk
export PROFILE export PROFILE
chdir= chdir=
CONFIG= CONFIG=
DM_SET_MACHINE= DM_SET_MACHINE=
SELECT_CONTAINER=
SELECT_MACHINE=
USE_STACK= USE_STACK=
FAKE= FAKE=
VARS=() VARS=()
@ -1798,6 +1953,8 @@ args=(
-P,--prod PROFILE=prod -P,--prod PROFILE=prod
-T,--test PROFILE=test -T,--test PROFILE=test
-m:,--set-machine: DM_SET_MACHINE= -m:,--set-machine: DM_SET_MACHINE=
-s:,--select-service: SELECT_CONTAINER=
-t:,--select-machine: SELECT_MACHINE=
--stack USE_STACK=1 --stack USE_STACK=1
-n,--fake FAKE=1 -n,--fake FAKE=1
-e:,--build-arg:,--env: VARS -e:,--build-arg:,--env: VARS
@ -1816,22 +1973,76 @@ parse_args "$@"; set -- "${args[@]}"
progexists docker-machine && DM_AVAILABLE=1 || DM_AVAILABLE= progexists docker-machine && DM_AVAILABLE=1 || DM_AVAILABLE=
if [ -n "$DM_SET_MACHINE" ]; then if [ -n "$DM_SET_MACHINE" ]; then
[ -n "$DM_AVAILABLE" ] || die "docker-machine n'est pas disponible" [ -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 [ "$DM_SET_MACHINE" == - ] && DM_SET_MACHINE=-u
setx dm_env=docker-machine env "$DM_SET_MACHINE" || die setx dm_env=docker-machine env "$DM_SET_MACHINE" || die
eval "$dm_env" eval "$dm_env"
# pour warning ci-dessous # pour warning ci-dessous
[ "$DM_SET_MACHINE" == -u ] && DM_SET_MACHINE= [ "$DM_SET_MACHINE" == -u ] && DM_SET_MACHINE=
fi fi
if [ -n "$DM_AVAILABLE" ]; then
found= if [ -n "$SELECT_MACHINE" -o -n "$SELECT_CONTAINER" ]; then
for dm_profile in "${DM_PROFILES[@]}"; do function __ss_process_data() {
splitpair "$dm_profile" dm profile [ -n "$found" ] && return
if [ "$dm" == "$DOCKER_MACHINE_NAME" ]; then __status_query_task
DEFAULT_PROFILE="$profile" __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 found=1
break
fi fi
done 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 "$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
eval "$dm_env"
fi
if [ -n "$DM_AVAILABLE" ]; then
setx DEFAULT_PROFILE=resolve_dm_profile "$DOCKER_MACHINE_NAME" && found=1 || found=
if [ -n "$DM_SET_MACHINE" -a -z "$PROFILE" -a -z "$found" ]; then if [ -n "$DM_SET_MACHINE" -a -z "$PROFILE" -a -z "$found" ]; then
ewarn "\ ewarn "\
Aucun profil n'a été défini pour $DM_SET_MACHINE dans ~/etc/default/dk Aucun profil n'a été défini pour $DM_SET_MACHINE dans ~/etc/default/dk
@ -2077,6 +2288,14 @@ while [ $# -gt 0 ]; do
enote "Profil $PROFILE" enote "Profil $PROFILE"
auto_systemd_unit "${args[@]}" || die 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) ps)
pscmd=( pscmd=(
"$DOCKER" container ps -a "$DOCKER" container ps -a

10
foreach
View File

@ -81,6 +81,9 @@ OPTIONS
la commande. Par défaut, l'affichage est effectué. la commande. Par défaut, l'affichage est effectué.
Avec --parent-title, pour chaque correspondance afficher plutôt le Avec --parent-title, pour chaque correspondance afficher plutôt le
répertoire parent (valide uniquement avec l'option -p) 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 -G, --git-projects
Equivalent à '--ptitle -p */.git --' e.g '$scriptname -G git pull' pour Equivalent à '--ptitle -p */.git --' e.g '$scriptname -G git pull' pour
mettre à jour les dépôts situés dans un répertoire mettre à jour les dépôts situés dans un répertoire
@ -96,6 +99,7 @@ changedir=
parentdir= parentdir=
expand=1 expand=1
title=auto title=auto
command=
shortcut= shortcut=
args=(+ args=(+
--help '$exit_with display_help' --help '$exit_with display_help'
@ -111,12 +115,18 @@ args=(+
--title title=1 --title title=1
--pt,--parent-title title=p --pt,--parent-title title=p
--nt,--no-title title= --nt,--no-title title=
-S,--git-status command=git-status-p
-G,--git-projects shortcut=git -G,--git-projects shortcut=git
-C,--composer-projects shortcut=composer -C,--composer-projects shortcut=composer
--cc,--composer-cmd shortcut=composer-cmd --cc,--composer-cmd shortcut=composer-cmd
) )
parse_args "$@"; set -- "${args[@]}" parse_args "$@"; set -- "${args[@]}"
case "$command" in
git-status-p)
set -- git status --p "$@"
;;
esac
case "$shortcut" in case "$shortcut" in
git) git)
set -- */.git -- "$@" set -- */.git -- "$@"

View File

@ -1,11 +1,47 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
if [ -n "$UTOOLS_DOCKER_ALIASES" ]; then if [ -n "$UTOOLS_DOCKER_ALIASES" ]; then
if [ "$DOCKER_MACHINE_WRAPPED" == true ]; then #if [ "$DOCKER_MACHINE_WRAPPED" == true ]; then
alias dm=__docker_machine_wrapper # alias dm=__docker_machine_wrapper
else #else
alias dm=docker-machine # alias dm=docker-machine
fi #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=()
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=()
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 if [ -n "$UTOOLS_BASH_COMPLETION" ]; then
complete -F _docker_machine dm complete -F _docker_machine dm

View File

@ -3,8 +3,16 @@
# Profil par défaut # Profil par défaut
#PROFILE=prod #PROFILE=prod
# Aliases pour docker-machine
#DM_ALIASES=(alias:name)
# Profiles pour docker-machine # Profiles pour docker-machine
#DM_PROFILES=(name:profile...) #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 # Image à utiliser pour lancer composer
#COMPOSER_IMAGE=docker.univ-reunion.fr/image/apache-php-myiccas-utils:d10 #COMPOSER_IMAGE=docker.univ-reunion.fr/image/apache-php-myiccas-utils:d10

View File

@ -16,8 +16,9 @@ rm -rf lib/pyulib/{build,devel,migrate,test}
# compiler les modules python de support # compiler les modules python de support
estep "Compilation des modules python" estep "Compilation des modules python"
python -m compileall lib/ulib/support/python progexists python2 && PYTHON=python2 || PYTHON=python
python -m compileall lib/nulib/python "$PYTHON" -m compileall lib/ulib/support/python
"$PYTHON" -m compileall lib/nulib/python
# liens pour les scripts python # liens pour les scripts python
for i in plver plbck uencdetect urandomize umail uxpath wofixsql; do for i in plver plbck uencdetect urandomize umail uxpath wofixsql; do

View File

@ -934,8 +934,11 @@ function progexists() {
test -n "$1" -a -x "$(which "$1" 2>/dev/null)" test -n "$1" -a -x "$(which "$1" 2>/dev/null)"
} }
function has_python() { function has_python() {
# tester la présence de python # tester la présence de python2
progexists python # tester d'abord python2 pour compatibilité avec les systèmes modernes
progexists python2 && return 0
progexists python && return 0
return 1
} }
function has_gawk() { function has_gawk() {
# tester la présence de gnuawk # tester la présence de gnuawk

View File

@ -508,7 +508,7 @@ Essayez avec 'uinst -C'"
has_gawk || need_gawk=1 has_gawk || need_gawk=1
if check_sysinfos -s linux; then if check_sysinfos -s linux; then
if [ -n "$need_python" -o -n "$need_gawk" ]; 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 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 if ask_yesno "Voulez-vous que ce script essaye d'installer automatiquement ces dépendances (requière les droits root)?" O; then
urequire debian urequire debian
@ -523,7 +523,7 @@ Essayez avec 'uinst -C'"
fi fi
fi fi
if [ -n "$need_python" ]; then 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 return 1
fi fi
if [ -n "$need_gawk" ]; then if [ -n "$need_gawk" ]; then
@ -1616,5 +1616,6 @@ function __uinst2s_root_scripts() {
function __uinst2s_python_setup() { function __uinst2s_python_setup() {
# Installer le package python # Installer le package python
cd "$srcdir" && python setup.py install local PYTHON; progexists python2 && PYTHON=python2 || PYTHON=python
cd "$srcdir" && "$PYTHON" setup.py install
} }

78
repoctl
View File

@ -10,10 +10,17 @@ USAGE
$scriptname ACTION URL [options] $scriptname ACTION URL [options]
ACTIONS ACTIONS
create URL [description] u|update-origin URL
Créer un nouveau dépôt avec la description spécifiée 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 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 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 l'utilisateur (cela inclut les dépôts des organisations auxquelles
@ -21,11 +28,11 @@ ACTIONS
VARs est une liste de variables à afficher pour chaque dépôt, séparés 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 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 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. 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 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 des propriétés pouvant être modifiées. Avec gitea 1.9.3, il y a au moins
celles-là: celles-là:
@ -35,7 +42,7 @@ ACTIONS
private private
default_branch default_branch
delete URL d|delete URL
Supprimer le dépôt spécifié" Supprimer le dépôt spécifié"
} }
@ -123,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() { function create_action() {
case "$rtype" in case "$rtype" in
#gitolite) ;; #gitolite) ;;
@ -134,6 +185,8 @@ function create_action() {
esac esac
} }
function gogs_create_action() { function gogs_create_action() {
local update_origin="$1"; shift
local url repourl desc payload result local url repourl desc payload result
local -a vars local -a vars
if [ -n "$user" -a "$user" != "$gogs_user" ]; then if [ -n "$user" -a "$user" != "$gogs_user" ]; then
@ -159,6 +212,11 @@ payload: $payload
result: $result" result: $result"
isatty && estep "Création du dépôt $repourl" isatty && estep "Création du dépôt $repourl"
echo "$result" | json_get "${vars[@]}" echo "$result" | json_get "${vars[@]}"
if [ -n "$update_origin" ]; then
_update_origin
_update_origin_push
fi
} }
################################################################################ ################################################################################
@ -295,9 +353,11 @@ result: $result"
################################################################################ ################################################################################
action= action=
update_origin=
args=( args=(
--help '$exit_with display_help' --help '$exit_with display_help'
-c,--create action=create -c,--create action=create
-u,--update,--update-origin update_origin=1
-l,--list action=list -l,--list action=list
-g,--get action=get -g,--get action=get
-e,--edit action=edit -e,--edit action=edit
@ -305,6 +365,9 @@ args=(
) )
parse_args "$@"; set -- "${args[@]}" parse_args "$@"; set -- "${args[@]}"
if [ -z "$action" -a -n "$update_origin" ]; then
action=update-origin
fi
if [ -z "$action" ]; then if [ -z "$action" ]; then
action="$1"; shift action="$1"; shift
fi fi
@ -314,7 +377,8 @@ repoctl_init "$1"; shift
[ -n "$repourl" ] || die "Vous devez spécifier l'url du dépôt" [ -n "$repourl" ] || die "Vous devez spécifier l'url du dépôt"
case "$action" in case "$action" in
c|create) create_action "$@";; u|update|update-origin) update_origin_action "$@";;
c|create) create_action "$update_origin" "$@";;
l|list) list_action "$@";; l|list) list_action "$@";;
g|get|s|show) get_action "$@";; g|get|s|show) get_action "$@";;
e|edit) edit_action "$@";; e|edit) edit_action "$@";;