Intégration de la branche release-9.9.0
This commit is contained in:
commit
246b9473aa
19
CHANGES.md
19
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
|
||||
|
|
|
@ -1 +1 @@
|
|||
9.8.0
|
||||
9.9.0
|
||||
|
|
17
cx-conndev
17
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=
|
||||
)
|
||||
|
@ -58,8 +63,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"; }
|
||||
|
@ -78,7 +81,17 @@ 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"
|
||||
|
||||
mysql_cmd="$(php bin/conndev.php "$ip" "$@")"
|
||||
edebug "mysql_cmd: $mysql_cmd"
|
||||
|
||||
|
|
265
dk
265
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
|
||||
|
@ -276,6 +300,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'
|
||||
|
@ -285,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
|
||||
|
@ -330,6 +357,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
|
||||
|
@ -339,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]]]
|
||||
|
@ -362,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 "$*"; }
|
||||
|
@ -665,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
|
||||
|
@ -690,9 +733,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
|
||||
|
@ -705,7 +748,8 @@ 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
|
||||
local -a composer_args
|
||||
for app in "${APPS[@]}"; do
|
||||
etitle "$app"
|
||||
|
||||
|
@ -726,6 +770,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 +794,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 +823,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
|
||||
|
@ -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="$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;;
|
||||
|
@ -883,7 +935,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
|
||||
|
@ -1259,13 +1311,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
|
||||
}
|
||||
|
||||
|
@ -1352,6 +1419,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"
|
||||
|
@ -1375,11 +1443,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"
|
||||
|
@ -1567,6 +1635,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
|
||||
|
@ -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
|
||||
if progexists docker; then DOCKER=docker
|
||||
elif progexists podman; then DOCKER=podman
|
||||
|
@ -1770,15 +1921,19 @@ 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=()
|
||||
CLUSTERDIRS=()
|
||||
set_defaults dk
|
||||
export PROFILE
|
||||
|
||||
chdir=
|
||||
CONFIG=
|
||||
DM_SET_MACHINE=
|
||||
SELECT_CONTAINER=
|
||||
SELECT_MACHINE=
|
||||
USE_STACK=
|
||||
FAKE=
|
||||
VARS=()
|
||||
|
@ -1798,6 +1953,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
|
||||
|
@ -1816,22 +1973,76 @@ 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"
|
||||
# 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"
|
||||
|
||||
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
|
||||
break
|
||||
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
|
||||
ewarn "\
|
||||
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"
|
||||
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
|
||||
|
|
10
foreach
10
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 -- "$@"
|
||||
|
|
|
@ -1,11 +1,47 @@
|
|||
# -*- 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=()
|
||||
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
|
||||
complete -F _docker_machine dm
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
78
repoctl
78
repoctl
|
@ -10,10 +10,17 @@ USAGE
|
|||
$scriptname ACTION URL [options]
|
||||
|
||||
ACTIONS
|
||||
create URL [description]
|
||||
Créer un nouveau dépôt avec la description spécifiée
|
||||
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
|
||||
|
@ -21,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à:
|
||||
|
@ -35,7 +42,7 @@ ACTIONS
|
|||
private
|
||||
default_branch
|
||||
|
||||
delete URL
|
||||
d|delete URL
|
||||
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() {
|
||||
case "$rtype" in
|
||||
#gitolite) ;;
|
||||
|
@ -134,6 +185,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 +212,11 @@ payload: $payload
|
|||
result: $result"
|
||||
isatty && estep "Création du dépôt $repourl"
|
||||
echo "$result" | json_get "${vars[@]}"
|
||||
|
||||
if [ -n "$update_origin" ]; then
|
||||
_update_origin
|
||||
_update_origin_push
|
||||
fi
|
||||
}
|
||||
|
||||
################################################################################
|
||||
|
@ -295,9 +353,11 @@ result: $result"
|
|||
################################################################################
|
||||
|
||||
action=
|
||||
update_origin=
|
||||
args=(
|
||||
--help '$exit_with display_help'
|
||||
-c,--create action=create
|
||||
-u,--update,--update-origin update_origin=1
|
||||
-l,--list action=list
|
||||
-g,--get action=get
|
||||
-e,--edit action=edit
|
||||
|
@ -305,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
|
||||
|
@ -314,7 +377,8 @@ repoctl_init "$1"; shift
|
|||
[ -n "$repourl" ] || die "Vous devez spécifier l'url du dépôt"
|
||||
|
||||
case "$action" in
|
||||
c|create) create_action "$@";;
|
||||
u|update|update-origin) update_origin_action "$@";;
|
||||
c|create) create_action "$update_origin" "$@";;
|
||||
l|list) list_action "$@";;
|
||||
g|get|s|show) get_action "$@";;
|
||||
e|edit) edit_action "$@";;
|
||||
|
|
Loading…
Reference in New Issue