diff --git a/lib/pywrapper b/lib/pywrapper index 43b4c2e..fd15fb6 100755 --- a/lib/pywrapper +++ b/lib/pywrapper @@ -17,5 +17,5 @@ else nutoolsdir="$(cd "$(dirname "$0")"; pwd)" fi -source "$nutoolsdir/lib/ulib/nutools/pyulib" +source "$nutoolsdir/lib/ulib/pyulib/pyulib" exec "$nutoolsdir/lib/pyulib/src/uapps/$scriptname.py" "$@" diff --git a/lib/uinst/rootconf b/lib/uinst/rootconf index 5620d3b..3f4858c 100644 --- a/lib/uinst/rootconf +++ b/lib/uinst/rootconf @@ -19,7 +19,7 @@ dest="@@dest@@" for i in ulib ulibsh; do sed "s|@@""dest""@@|$dest|g" "lib/ulib/$i" >"/etc/$i" done -cp lib/ulib/.ulib_version /etc/.ulib_version +cp lib/ulib/.ulibver /etc/.ulibver echo >/etc/ulibauto '# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 if [ x"$BASH" != x -a -f /etc/ulib ]; then . /etc/ulib diff --git a/lib/ulib/.ulib_version b/lib/ulib/.ulib_version deleted file mode 100644 index d81cc07..0000000 --- a/lib/ulib/.ulib_version +++ /dev/null @@ -1 +0,0 @@ -42 diff --git a/lib/ulib/.ulibver b/lib/ulib/.ulibver new file mode 100644 index 0000000..595d3c1 --- /dev/null +++ b/lib/ulib/.ulibver @@ -0,0 +1 @@ +000000042 diff --git a/lib/ulib/auto b/lib/ulib/auto index 6a9415a..8b11aea 100644 --- a/lib/ulib/auto +++ b/lib/ulib/auto @@ -13,23 +13,52 @@ if [ -n "$ULIBDIR" -a -f "$ULIBDIR" ]; then ULIBDIR="$(dirname "$ULIBDIR")" else # Fichier non sourcé. Tout exprimer par rapport au script courant - ULIBDIR="$(dirname "$0")/ulib" + ULIBDIR="$(dirname "$0")" + if [ -d "$ULIBDIR/ulib" ]; then + ULIBDIR="$ULIBDIR/ulib" + elif [ -d "$ULIBDIR/lib/ulib" ]; then + ULIBDIR="$ULIBDIR/lib/ulib" + fi fi +ULIBDIR="$(cd "$ULIBDIR" 2>/dev/null; pwd)" -function __check_ulib_version() { +function __ulibver_parse() { # copie verbatim de la fonction parseversion() dans ulib + if [ -n "$2" ]; then + local version="${1:-${version:-000000000}}" + local major minor patch pversion + else + version="${1:-${version:-000000000}}" + fi + while [ ${#version} -lt 9 ]; do version="0$version"; done + major="${version:0:3}"; while [ ${#major} -gt 1 -a "${major#0}" != "$major" ]; do major="${major#0}"; done + minor="${version:3:3}"; while [ ${#minor} -gt 1 -a "${minor#0}" != "$minor" ]; do minor="${minor#0}"; done + patch="${version:6:3}"; while [ ${#patch} -gt 1 -a "${patch#0}" != "$patch" ]; do patch="${patch#0}"; done + pversion="$major.$minor.$patch" + [ -n "$2" ] && eval "${2}version=\$version; ${2}major=\$major; ${2}minor=\$minor; ${2}patch=\$patch; ${2}pversion=\$pversion" +} +function __ulibver_check() { # tester si la version ulib du système est plus récente que la version ulib # du répertoire courant - local thisver=0 sysver=0 - [ -f "$ULIBDIR/.ulib_version" ] && thisver="$(<"$ULIBDIR/.ulib_version")" - [ -f "/etc/.ulib_version" ] && sysver="$(<"/etc/.ulib_version")" - [ $sysver -gt $thisver ] + local version=000000000 major minor patch pversion + local sversion=000000000 smajor sminor spatch spversion + [ -f "$ULIBDIR/.ulibver" ] && __ulibver_parse "$(<"$ULIBDIR/.ulibver")" + [ -f "/etc/.ulibver" ] && __ulibver_parse "$(<"/etc/.ulibver")" s + # la version majeure doit correspondre + [ "$smajor" -eq "$major" ] || return 1 + # puis tester si version mineure plus récente + [ "$sminor" -gt "$minor" ] && return 0 + [ "$sminor" -lt "$minor" ] && return 1 + # puis tester patchlevel + [ "$spatch" -ge "$patch" ] } -if [ -f /etc/ulib ] && __check_ulib_version; then - unset -f __check_ulib_version +if [ -f /etc/ulib ] && __ulibver_check; then + unset -f __ulibver_parse + unset -f __ulibver_check . /etc/ulib elif [ -f "$ULIBDIR/ulib" ]; then - unset -f __check_ulib_version + unset -f __ulibver_parse + unset -f __ulibver_check . "$ULIBDIR/ulib" else echo "error: Unable to find neither $ULIBDIR/ulib nor /etc/ulib" 1>&2 diff --git a/lib/ulib/base b/lib/ulib/base index a29851b..3e303d2 100644 --- a/lib/ulib/base +++ b/lib/ulib/base @@ -2536,7 +2536,7 @@ function awkdef() { # $'values[@]=<\nvalue1\nvalue2' # pour un tableau values qui contiendra deux valeurs: value1 et value2 # Avec l'option -f, des fonctions supplémentaires sont définies. Elles sont -# décrites dans ulib/awk. +# décrites dans le module awk. if [ "${1:0:3}" == "-f" ]; then shift @@ -4159,7 +4159,7 @@ if [ -z "$ULIBDIR" -o "$ULIBDIR" != "$ULIBINIT" ]; then # l'utilisateur pour charger manuellement les librairies nécessaires. local ulib_ for ulib_ in "$@"; do - uprovided "$ulib_" || ewarn "$ulib_: this ulib is required" + uprovided "$ulib_" || ewarn "$ulib_: this module is required" done } uprovide base diff --git a/lib/ulib/install b/lib/ulib/install index 2162c31..fb24686 100644 --- a/lib/ulib/install +++ b/lib/ulib/install @@ -5,17 +5,20 @@ uprovide install urequire base -# Faut-il afficher le nom des fichiers copié/créés? -INSTALL_VERBOSE=1 -# Faut-il afficher les destinations avec ppath? -INSTALL_USES_PPATH= +if [ -z "$ULIB_INSTALL_CONFIGURED" ]; then + # Faut-il afficher le nom des fichiers copié/créés? + export ULIB_INSTALL_VERBOSE=1 + # Faut-il afficher les destinations avec ppath? + export ULIB_INSTALL_USES_PPATH= +fi +export ULIB_INSTALL_CONFIGURED=1 function ensure_exists() { # créer le fichier vide "$1" s'il n'existe pas déjà. retourner vrai si le # fichier a été créé sans erreur [ -f "$1" ] || { - if [ -n "$INSTALL_VERBOSE" ]; then - if [ -n "$INSTALL_USES_PPATH" ]; then + if [ -n "$ULIB_INSTALL_VERBOSE" ]; then + if [ -n "$ULIB_INSTALL_USES_PPATH" ]; then estep "$(ppath "$1")" else estep "$1" @@ -28,24 +31,34 @@ function ensure_exists() { return 1 } +function __ulib_install_show_args() { + if [ -z "$ULIB_INSTALL_VERBOSE" ]; then + : + elif [ -n "$ULIB_INSTALL_USES_PPATH" ]; then + estep "$1 --> $(ppath "$2")${3:+/}" + else + estep "$1 --> $2${3:+/}" + fi +} + function copy_replace() { # Copier de façon inconditionnelle le fichier $1 vers le fichier $2 local src="$1" dest="$2" - local srcname="$(basename "$src")" + local srcname="$(basename -- "$src")" [ -d "$dest" ] && dest="$dest/$srcname" mkdirof "$dest" || return 1 - if [ -n "$INSTALL_VERBOSE" ]; then - local msg destname - if [ -n "$INSTALL_USES_PPATH" ]; then - msg="$srcname --> $(ppath "$(dirname "$dest")")/" + if [ -n "$ULIB_INSTALL_VERBOSE" ]; then + local destarg destname slash + destarg="$(dirname -- "$dest")" + destname="$(basename -- "$dest")" + if [ "$srcname" == "$destname" ]; then + slash=1 else - msg="$srcname --> $(dirname "$dest")/" + destarg="$destarg/$destname" fi - destname="$(basename "$dest")" - [ "$srcname" == "$destname" ] || msg="$msg$destname" - estep "$msg" + __ulib_install_show_args "$srcname" "$destarg" "$slash" fi cp "$src" "$dest" } @@ -56,7 +69,7 @@ function copy_new() { # Retourner vrai si le fichier a été copié sans erreur local src="$1" dest="$2" - [ -d "$dest" ] && dest="$dest/$(basename "$src")" + [ -d "$dest" ] && dest="$dest/$(basename -- "$src")" mkdirof "$dest" || return 1 if [ ! -e "$dest" ]; then @@ -72,7 +85,7 @@ function copy_update() { # Retourner vrai si le fichier a été copié sans erreur. local src="$1" dest="$2" - [ -d "$dest" ] && dest="$dest/$(basename "$src")" + [ -d "$dest" ] && dest="$dest/$(basename -- "$src")" mkdirof "$dest" || return 1 if [ ! -e "$dest" ]; then @@ -92,7 +105,7 @@ function copy_update_ask() { # Retourner vrai si le fichier a été copié sans erreur. local src="$1" dest="$2" - [ -d "$dest" ] && dest="$dest/$(basename "$src")" + [ -d "$dest" ] && dest="$dest/$(basename -- "$src")" mkdirof "$dest" || return 1 [ -f "$dest" ] || copy_replace "$src" "$dest" @@ -116,12 +129,7 @@ function copy_tree() { function link_new() { # Si $2 n'existe pas, créer le lien symbolique $2 pointant vers $1 [ -e "$2" ] && return 0 - if [ -n "$INSTALL_VERBOSE" ]; then - if [ -n "$INSTALL_USES_PPATH" ]; then - estep "$(basename "$2") --> $(ppath "$(dirname "$1")")" - else - estep "$(basename "$2") --> $(dirname "$1")" - fi - fi + + __ulib_install_show_args "$(basename -- "$2")" "$(dirname -- "$1")" ln -s "$1" "$2" } diff --git a/lib/ulib/mkcrypt b/lib/ulib/mkcrypt index 2876a4e..333e947 100644 --- a/lib/ulib/mkcrypt +++ b/lib/ulib/mkcrypt @@ -2,8 +2,8 @@ ## Fonction de support pour mkcrypt: cryptage de mots de passe ##@cooked nocomments ##@require ulib -##@require nutools/pyulib +##@require pyulib/pyulib uprovide mkcrypt -urequire ulib nutools/pyulib +urequire ulib pyulib/pyulib function mkcrypt() { "$ULIBDIR/support/mkcrypt.py" "$@"; } diff --git a/lib/ulib/nutools/.udir b/lib/ulib/pyulib/.udir similarity index 100% rename from lib/ulib/nutools/.udir rename to lib/ulib/pyulib/.udir diff --git a/lib/ulib/nutools/plbck b/lib/ulib/pyulib/plbck similarity index 90% rename from lib/ulib/nutools/plbck rename to lib/ulib/pyulib/plbck index 5b4219f..43a5832 100644 --- a/lib/ulib/nutools/plbck +++ b/lib/ulib/pyulib/plbck @@ -1,6 +1,6 @@ ##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ## Donner accès à l'outil plbck.py ##@cooked nocomments -urequire nutools/pyulib +urequire pyulib/pyulib function plbck() { python "$PYULIBDIR/src/uapps/plbck.py" "$@"; } diff --git a/lib/ulib/nutools/plver b/lib/ulib/pyulib/plver similarity index 90% rename from lib/ulib/nutools/plver rename to lib/ulib/pyulib/plver index bed3f9f..61e5c62 100644 --- a/lib/ulib/nutools/plver +++ b/lib/ulib/pyulib/plver @@ -1,6 +1,6 @@ ##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ## Donner accès à l'outil plver.py ##@cooked nocomments -urequire nutools/pyulib +urequire pyulib/pyulib function plver() { python "$PYULIBDIR/src/uapps/plver.py" "$@"; } diff --git a/lib/ulib/nutools/pyulib b/lib/ulib/pyulib/pyulib similarity index 75% rename from lib/ulib/nutools/pyulib rename to lib/ulib/pyulib/pyulib index 94cca14..cbc0ba7 100644 --- a/lib/ulib/nutools/pyulib +++ b/lib/ulib/pyulib/pyulib @@ -1,5 +1,5 @@ ##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 -## Accéder aux librairies python *locales* de pyulib +## Configurer l'accès aux librairies python *locales* de pyulib ##@cooked nocomments # Modifier PYTHONPATH de façon que les librairies de pyulib *locales* soient @@ -23,15 +23,20 @@ if [ -z "$PYULIBDIR" ]; then PYULIBDIR="$(dirname "$PYULIBDIR")/../../pyulib" else # Fichier non sourcé. Tout exprimer par rapport au script courant - PYULIBDIR="$(dirname "$0")/pyulib" + PYULIBDIR="$(dirname "$0")" + if [ -d "$PYULIBDIR/pyulib" ]; then + PYULIBDIR="$PYULIBDIR/pyulib" + elif [ -d "$PYULIBDIR/lib/pyulib" ]; then + PYULIBDIR="$PYULIBDIR/lib/pyulib" + fi fi fi -PYULIBDIR="$(cd "$PYULIBDIR"; pwd)" +PYULIBDIR="$(cd "$PYULIBDIR" 2>/dev/null; pwd)" export PYTHONPATH="$PYULIBDIR/src${PYTHONPATH:+:$PYTHONPATH}" -function pyulib_sync() { +function pyulibsync() { # Synchroniser les librairies pyulib dans le répertoire $1 - destdir="$(abspath "${1:-.}")" + local destdir="$(abspath "${1:-.}")" [ "$destdir/pyulib" != "$PYULIBDIR" ] && cpdirnovcs "$PYULIBDIR" "$destdir/pyulib" } diff --git a/lib/ulib/nutools/uencdetect b/lib/ulib/pyulib/uencdetect similarity index 90% rename from lib/ulib/nutools/uencdetect rename to lib/ulib/pyulib/uencdetect index 2758b3c..bfca3a8 100644 --- a/lib/ulib/nutools/uencdetect +++ b/lib/ulib/pyulib/uencdetect @@ -1,6 +1,6 @@ ##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ## Donner accès à l'outil uencdetect.py ##@cooked nocomments -urequire nutools/pyulib +urequire pyulib/pyulib function uencdetect() { python "$PYULIBDIR/src/uapps/uencdetect.py" "$@"; } diff --git a/lib/ulib/nutools/umail b/lib/ulib/pyulib/umail similarity index 90% rename from lib/ulib/nutools/umail rename to lib/ulib/pyulib/umail index 7b705e1..881538c 100644 --- a/lib/ulib/nutools/umail +++ b/lib/ulib/pyulib/umail @@ -1,6 +1,6 @@ ##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ## Donner accès à l'outil umail.py ##@cooked nocomments -urequire nutools/pyulib +urequire pyulib/pyulib function umail() { python "$PYULIBDIR/src/uapps/umail.py" "$@"; } diff --git a/lib/ulib/runs b/lib/ulib/runs index 08cca31..b5228c1 100644 --- a/lib/ulib/runs +++ b/lib/ulib/runs @@ -834,9 +834,9 @@ function runs_initworkdir() { >"$RUNSEXPORTDIR/remoteroot" # synchronisation ulib - urequire ulib nutools/pyulib - ulib_sync "$RUNSEXPORTDIR" - pyulib_sync "$RUNSEXPORTDIR" + urequire ulib pyulib/pyulib + ulibsync "$RUNSEXPORTDIR" + pyulibsync "$RUNSEXPORTDIR" # copie runs, uinst cp "$RUNSSRCDIR/runs" "$RUNSEXPORTDIR" diff --git a/lib/ulib/support/install-pubkeys.sh b/lib/ulib/support/install-pubkeys.sh index 66e74f8..97b16de 100755 --- a/lib/ulib/support/install-pubkeys.sh +++ b/lib/ulib/support/install-pubkeys.sh @@ -13,6 +13,11 @@ elif [ "$0" == "-bash" ]; then scriptname= scriptdir= script= +elif [ ! -f "$0" -a -f "${0#-}" ]; then + scriptname="$(basename -- "${0#-}")" + scriptdir="$(dirname -- "${0#-}")" + scriptdir="$(cd "$scriptdir"; pwd)" + script="$scriptdir/$scriptname" else scriptname="$(basename -- "$0")" scriptdir="$(dirname -- "$0")" @@ -3222,7 +3227,7 @@ if [ -z "$ULIBDIR" -o "$ULIBDIR" != "$ULIBINIT" ]; then function urequire() { local ulib_ for ulib_ in "$@"; do - uprovided "$ulib_" || ewarn "$ulib_: this ulib is required" + uprovided "$ulib_" || ewarn "$ulib_: this module is required" done } uprovide base diff --git a/lib/ulib/uinc b/lib/ulib/uinc index af6d5a7..7576d58 100644 --- a/lib/ulib/uinc +++ b/lib/ulib/uinc @@ -2,8 +2,8 @@ ## Fonction de support pour uinc: pliage/dépliage d'inclusions ##@cooked nocomments ##@require ulib -##@require nutools/pyulib +##@require pyulib/pyulib uprovide uinc -urequire ulib nutools/pyulib +urequire ulib pyulib/pyulib function uinc() { "$ULIBDIR/support/uinc.py" "$@"; } diff --git a/lib/ulib/uinst b/lib/ulib/uinst index 5276886..0ebbe65 100644 --- a/lib/ulib/uinst +++ b/lib/ulib/uinst @@ -7,10 +7,10 @@ ##@require compat ##@require udir ##@require prefixes -##@require nutools/pyulib +##@require pyulib/pyulib ##@require uinc uprovide uinst -urequire ulib base sysinfos compat udir prefixes nutools/pyulib uinc +urequire ulib base sysinfos compat udir prefixes pyulib/pyulib uinc function uinst() { # lancer uinst en déclarant les variables locales, de façon à ne pas polluer @@ -93,8 +93,24 @@ OPTIONS # Définir ULIBDIR, PYULIBDIR et UINST si ce n'est pas le cas. # Ces variables sont utilisées par les scripts - ULIBDIR="${ULIBDIR:-$scriptdir/ulib}" - PYULIBDIR="${PYULIBDIR:-$scriptdir/pyulib}" + if [ -z "$ULIBDIR" ]; then + if [ -d "$scriptdir/ulib" ]; then + ULIBDIR="$scriptdir/ulib" + elif [ -d "$scriptdir/lib/ulib" ]; then + ULIBDIR="$scriptdir/lib/ulib" + else + ULIBDIR="$scriptdir/ulib" + fi + fi + if [ -z "$PYULIBDIR" ]; then + if [ -d "$scriptdir/pyulib" ]; then + PYULIBDIR="$scriptdir/pyulib" + elif [ -d "$scriptdir/lib/pyulib" ]; then + PYULIBDIR="$scriptdir/lib/pyulib" + else + PYULIBDIR="$scriptdir/pyulib" + fi + fi UINST="${UINST:-$script}" eval "$(utools_local)" @@ -280,7 +296,8 @@ Ce projet pourra ensuite être installé avec uinst" ask_yesno "Faut-il déployer le projet dans /usr/local?" O && copy_files=1 eend - [ -n "$ulibsync" ] && ulib_sync "$srcdir" + mkdir -p "$srcdir/lib" + [ -n "$ulibsync" ] && ulibsync "$srcdir/lib" udir_update "$srcdir" "udir_types=$udir_types" "${UINST_DEFAULTS[@]}" [ -n "$copy_files" ] && copy_files=true || copy_files=false @@ -304,7 +321,8 @@ __uaddpath "@@dest@@" PATH' >"$genfile" [ -f "$genfile" ] || echo '# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 source "$@" || exit 1 -source "$ULIBDIR/ulib" && urequire DEFAULTS || exit 1' >"$genfile" +source "$ULIBDIR/ulib" || exit 1 +urequire DEFAULTS' >"$genfile" fi if [ -n "$rootconf" ]; then genfile="$srcdir/lib/uinst/rootconf" @@ -312,7 +330,8 @@ source "$ULIBDIR/ulib" && urequire DEFAULTS || exit 1' >"$genfile" [ -f "$genfile" ] || echo '# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 source "$@" || exit 1 -source "$ULIBDIR/ulib" && urequire DEFAULTS || exit 1' >"$genfile" +source "$ULIBDIR/ulib" || exit 1 +urequire DEFAULTS' >"$genfile" fi else @@ -440,7 +459,7 @@ Essayez avec 'uinst -C'" ewarn "$(get_color y)*GNU*$(get_color z)awk est requis mais n'est pas installé. Ce script va continuer, mais les résultats ne sont pas garantis." fi # s'assurer que les libraries *locales* sont dans PYTHONPATH - source "$ULIBDIR/nutools/pyulib" + source "$ULIBDIR/pyulib/pyulib" fi if [ -n "$UINST_AUTOPREFIX" ]; then @@ -587,8 +606,8 @@ function __uinst_prepare_workdir() { function __uinst_prepare_ulib() { # Copie l'environnement de déploiement dans $UINST_PREPARE_DIR estep "Copie de l'environnement de déploiement" - ulib_sync "$UINST_PREPARE_DIR" - pyulib_sync "$UINST_PREPARE_DIR" + ulibsync "$UINST_PREPARE_DIR" + pyulibsync "$UINST_PREPARE_DIR" echo '#!/bin/sh # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 if . `dirname "$0"`/ulib/ulibsh; then @@ -735,7 +754,7 @@ function __uinst_udir2s() { set_var_cmd "ULIBDIR" "$ULIBDIR" >>"$__uinst_config" set_var_cmd "UINST" "$UINST" >>"$__uinst_config" # ulib recalcule systématiquement la valeur de ULIBDIR. Pareil pour - # nutools/pyulib. Mais cela ne fonctionne pas si nous déployons sur une + # pyulib/pyulib. Mais cela ne fonctionne pas si nous déployons sur une # machine avec bash 2.x. Il faut donc forcer l'utilisation de la valeur # calculée. set_var_cmd "FORCED_ULIBDIR" "$ULIBDIR" >>"$__uinst_config" diff --git a/lib/ulib/ulib b/lib/ulib/ulib index c1c200e..1c71654 100644 --- a/lib/ulib/ulib +++ b/lib/ulib/ulib @@ -1,5 +1,5 @@ ##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 -## Charger les librairies de ulib. Nécessite bash. +## Charger ulib. Nécessite bash. ##@cooked nocomments # Ce fichier doit être *sourcé*. Si ce fichier n'est pas sourcé, alors le @@ -32,20 +32,25 @@ if [ "$ULIBDIR" = "@@""dest""@@/lib/ulib" ]; then ULIBDIR="$(dirname "$ULIBDIR")" else # Fichier non sourcé. Tout exprimer par rapport au script courant - ULIBDIR="$(dirname "$0")/ulib" + ULIBDIR="$(dirname "$0")" + if [ -d "$ULIBDIR/ulib" ]; then + ULIBDIR="$ULIBDIR/ulib" + elif [ -d "$ULIBDIR/lib/ulib" ]; then + ULIBDIR="$ULIBDIR/lib/ulib" + fi fi fi -ULIBDIR="$(cd "$ULIBDIR"; pwd)" +ULIBDIR="$(cd "$ULIBDIR" 2>/dev/null; pwd)" ULIBDIRS=("$ULIBDIR") -# marqueur pour tester si ulib a été chargé. Il faut avoir $ULIBINIT==$ULIBDIR +# marqueur pour tester si ulib a été réellement chargé. Il faut avoir $ULIBINIT==$ULIBDIR ULIBINIT="$ULIBDIR" # liste des fichiers sourcés par urequire [ -n "$ULIBPROVIDED" ] || ULIBPROVIDED=(ulib) function uprovided() { - # Tester si la ulibrairie $1 a déjà été chargé par urequire + # Tester si le module $1 a déjà été chargé par urequire local ulib_ for ulib_ in "${ULIBPROVIDED[@]}"; do [ "$ulib_" == "$1" ] && return 0 @@ -54,8 +59,7 @@ function uprovided() { } function uprovide() { - # Spécifier que la ulibrairie $1 a été sourcée, ou prétendre que c'est le - # cas. + # Spécifier que le module $1 a été sourcée, ou prétendre que c'est le cas. uprovided "$1" && return 0 ULIBPROVIDED=("${ULIBPROVIDED[@]}" "$1") } @@ -91,13 +95,13 @@ function urequire() { done } -function ulib_add() { +function ulibadd() { # Ajouter $1 au chemin de recherche de urequire [ -d "$1" ] && ULIBDIRS=("${ULIBDIRS[@]}" "$(cd "$1"; pwd)") } -function ulib_sync() { - # Synchroniser les librairies ulib dans le répertoire $1 - destdir="$(abspath "${1:-.}")" +function ulibsync() { + # Synchroniser les modules de ulib dans le répertoire $1 + local destdir="$(abspath "${1:-.}")" [ "$destdir/ulib" != "$ULIBDIR" ] && cpdirnovcs "$ULIBDIR" "$destdir/ulib" } diff --git a/lib/ulib/ulibsh b/lib/ulib/ulibsh index 74d0914..f757835 100644 --- a/lib/ulib/ulibsh +++ b/lib/ulib/ulibsh @@ -31,10 +31,15 @@ if [ "$ULIBDIR" = "@@""dest""@@/lib/ulib" ]; then if [ -n "$ULIBDIR" -a -f "$ULIBDIR" ]; then ULIBDIR="$(dirname "$ULIBDIR")" else - ULIBDIR="$(dirname "$0")/ulib" + ULIBDIR="$(dirname "$0")" + if [ -d "$ULIBDIR/ulib" ]; then + ULIBDIR="$ULIBDIR/ulib" + elif [ -d "$ULIBDIR/lib/ulib" ]; then + ULIBDIR="$ULIBDIR/lib/ulib" + fi fi fi -ULIBDIR="$(cd "$ULIBDIR"; pwd)" +ULIBDIR="$(cd "$ULIBDIR" 2>/dev/null; pwd)" ULIBDIRS=("$ULIBDIR") ULIBINIT="$ULIBDIR" @@ -82,12 +87,12 @@ function urequire() { done } -function ulib_add() { +function ulibadd() { [ -d "$1" ] && ULIBDIRS=("${ULIBDIRS[@]}" "$(cd "$1"; pwd)") } -function ulib_sync() { - destdir="$(abspath "${1:-.}")" +function ulibsync() { + local destdir="$(abspath "${1:-.}")" [ "$destdir/ulib" != "$ULIBDIR" ] && cpdirnovcs "$ULIBDIR" "$destdir/ulib" } ##@inc]ulib diff --git a/ruinst b/ruinst index 492e9e3..05cc0c0 100755 --- a/ruinst +++ b/ruinst @@ -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 nutools/pyulib +urequire DEFAULTS pyulib/pyulib function display_help() { uecho "$scriptname: Déploiement distant avec uinst diff --git a/ucrontab b/ucrontab index 4fd29d9..bffcf10 100755 --- a/ucrontab +++ b/ucrontab @@ -101,6 +101,11 @@ elif [ "$0" == "-bash" ]; then scriptname= scriptdir= script= +elif [ ! -f "$0" -a -f "${0#-}" ]; then + scriptname="$(basename -- "${0#-}")" + scriptdir="$(dirname -- "${0#-}")" + scriptdir="$(cd "$scriptdir"; pwd)" + script="$scriptdir/$scriptname" else scriptname="$(basename -- "$0")" scriptdir="$(dirname -- "$0")" @@ -3310,7 +3315,7 @@ if [ -z "$ULIBDIR" -o "$ULIBDIR" != "$ULIBINIT" ]; then function urequire() { local ulib_ for ulib_ in "$@"; do - uprovided "$ulib_" || ewarn "$ulib_: this ulib is required" + uprovided "$ulib_" || ewarn "$ulib_: this module is required" done } uprovide base diff --git a/ulib b/ulib new file mode 100755 index 0000000..fa75f76 --- /dev/null +++ b/ulib @@ -0,0 +1,355 @@ +#!/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 + +function display_help() { + uecho "$scriptname: Gestion des librairies ulib et pyulib + +USAGE + $scriptname [options] --destdir DESTDIR [options] + $scriptname [options] --version [options] + $scriptname [options] --shell [options] + +SYNCHRONISER ULIB/PYULIB + -S, --sync + Synchroniser ulib, pyulib et les scripts de support + -d, --destdir DESTDIR + Synchroniser ulib et/ou pyulib dans le répertoire destdir. + Les options -u et -p permettent de choisir ce qui est synchronisé + -u, --ulib + Copier/mettre à jour ulib (par défaut) + -p, --pyulib + Copier/mettre à jour pyulib + -s, --support + Copier/mettre à jour les scripts de support + +GERER LA VERSION DE ULIB + -v, --version + Gérer la version de ulib + -l, --show + Afficher la version de la librairie (par défaut) + -s, --system + Afficher aussi la version de la librairie système + -c, --check MIN_VERSION + Vérifier que la version de la librairie est au minimum MIN_VERSION, et + afficher un message d'information. Utiliser l'option -q si l'on veut + juste tester la version et ne pas afficher le message d'information. + -V, --set-version VERSION + Forcer la version de ulib + -u, --update + Incrémenter la version de ulib. Les options -x, -z, -p permettent de + choisir le numéro qui est incrémenté. + -x, --major + Augmenter le numéro de version majeure + -z, --minor + Augmenter le numéro de version mineure. C'est l'option par défaut + -p, --patchlevel + Augementer le numéro de patch + +LANCER UN SHELL (par défaut) + -s, --shell + Lancer un shell dans lequel les modules de ulib spécifiés sont chargés. + De plus, PATH est modifié pour que $scriptdir soit ajouté en premier. + Les arguments restants sont passés inchangés au shell. + -r, --require module + Spécifier un module à charger avec urequire. Plusieurs modules peuvent + être spécifiés en les séparant par ':' + Par défaut, seul le module DEFAULTS est chargé." +} + +function formatversion() { + local major="${1:-${major:-0}}" minor="${2:-${minor:-0}}" patch="${3:-${patch:-0}}" + while [ ${#major} -lt 3 ]; do major="0$major"; done + while [ ${#minor} -lt 3 ]; do minor="0$minor"; done + while [ ${#patch} -lt 3 ]; do patch="0$patch"; done + echo "$major$minor$patch" +} + +function parsepversion() { + local v M m p + if [[ "$1" == *.* ]]; then + local v="$1"; shift + local M=0 m=0 p=0 + if [[ "$v" == *.* ]]; then + p="${v##*.}"; v="${v%.*}" + if [[ "$v" == *.* ]]; then + m="${v##*.}"; v="${v%.*}" + if [[ "$v" == *.* ]]; then + M="${v##*.}"; v="${v%.*}" + else + M="$v" + fi + else + m="$v" + fi + else + p="$v" + fi + parseversion "$(formatversion "$M" "$m" "$p")" "$@" + else + parseversion "$@" + fi +} + +function parseversion() { + if [ -n "$2" ]; then + local version="${1:-${version:-000000000}}" + local major minor patch pversion + else + version="${1:-${version:-000000000}}" + fi + while [ ${#version} -lt 9 ]; do version="0$version"; done + major="${version:0:3}"; while [ ${#major} -gt 1 -a "${major#0}" != "$major" ]; do major="${major#0}"; done + minor="${version:3:3}"; while [ ${#minor} -gt 1 -a "${minor#0}" != "$minor" ]; do minor="${minor#0}"; done + patch="${version:6:3}"; while [ ${#patch} -gt 1 -a "${patch#0}" != "$patch" ]; do patch="${patch#0}"; done + pversion="$major.$minor.$patch" + [ -n "$2" ] && eval "${2}version=\$version; ${2}major=\$major; ${2}minor=\$minor; ${2}patch=\$patch; ${2}pversion=\$pversion" +} + +# mode de fonctionnement +case "$scriptname" in +ulibsync) mode=sync;; +ulibversion) mode=version;; +ulibshell) mode=shell;; +*) mode=auto;; +esac + +# mode sync +destdir= +syncwhat=auto +synculib= +syncpyulib= +syncsupport= +# mode version +action=show +system= +min_version= +set_version= +inc_version=minor +# mode shell +modules=() +# options courtes partagées +u_opt=; p_opt=; s_opt= +parse_opts + "${PRETTYOPTS[@]}" \ + --help '$exit_with display_help' \ + -S,--sync mode=sync \ + -d:,--destdir: '$mode=sync; set@ destdir' \ + --ulib '$mode=sync; syncwhat=; synculib=1' \ + --pyulib '$mode=sync; syncwhat=; syncpyulib=1' \ + --support '$mode=sync; syncwhat=; syncsupport=1' \ + -v,--version mode=version \ + -l,--show '$mode=version; action=show' \ + --system '$mode=version; action=show; system=1' \ + -c:,--check: '$mode=version; action=check; set@ min_version' \ + -V:,--set-version: '$mode=version; action=set; set@ set_version' \ + --update '$mode=version; action=inc' \ + -x,--major '$mode=version; action=inc; inc_version=major' \ + -z,--minor '$mode=version; action=inc; inc_version=minor' \ + --patchlevel '$mode=version; action=inc; inc_version=patch' \ + --shell mode=shell \ + -r:,--require: '$mode=shell; add@ modules' \ + -u u_opt=1 \ + -p p_opt=1 \ + -s s_opt=1 \ + @ args -- "$@" && set -- "${args[@]}" || die "$args" + +case "$mode" in +auto) + mode= + if [ -n "$u_opt" ]; then + mode=version; action=inc + fi + if [ -n "$p_opt" -a -n "$u_opt" ]; then + # support de -up + mode=version; action=inc; inc_version=patch + elif [ -n "$p_opt" ]; then + die "getopt: invalid option 'p'" + fi + if [ -n "$s_opt" ]; then + mode=shell + fi + ;; +esac +[ -n "$mode" ] || mode=shell + +case "$mode" in +sync) + [ -n "$u_opt" ] && { syncwhat=; synculib=1; } + [ -n "$p_opt" ] && { syncwhat=; syncpyulib=1; } + [ -n "$s_opt" ] && { syncwhat=; syncsupport=1; } + [ "$syncwhat" == auto ] && { + synculib=1 + #syncpyulib= + #syncsupport= + } + + [ -n "$destdir" ] || destdir="${1:-.}" + ask_yesno "Voulez-vous copier ${synculib:+ +- la librairie ulib}${syncpyulib:+ +- la librairie pyulib}${syncsupport:+ +- scripts de support} +dans $(ppath "$destdir")?" O || die + + urequire install + + if [ -n "$synculib" ]; then + __ulib_install_show_args ulib "$destdir" 1 + ulibsync "$destdir" + fi + if [ -n "$syncpyulib" ]; then + urequire pyulib/pyulib + __ulib_install_show_args pyulib "$destdir" 1 + pyulibsync "$destdir" + fi + if [ -n "$syncsupport" ]; then + for i in .nutools-bootstrap; do + adestdir="$(abspath "$destdir")" + if [ "${adestdir%/lib}" != "$adestdir" ]; then + # cas particulier: synchro vers un répertoire lib/ + # dans ce cas, copier le fichier .nutools-bootstrap dans le + # répertoire parent. + copy_update "$scriptdir/$i" "$(dirname -- "$destdir")" + else + copy_update "$scriptdir/$i" "$destdir" + fi + done + for i in lib/local-uinst lib/local-uinst.sh; do + copy_update "$scriptdir/$i" "$destdir" + done + fi + exit 0 + ;; + +version) + [ -n "$u_opt" ] && { action=inc; } + [ -n "$p_opt" ] && { action=inc; inc_version=patch; } + [ -n "$s_opt" ] && { action=show; system=1; } + + setx version formatversion 0 0 0 + versionfile="$scriptdir/lib/ulib/.ulibver" + [ -f "$versionfile" ] || echo "$version" >"$versionfile" + [ -f "$versionfile" ] && version="$(<"$versionfile")" + parseversion "$(<"$versionfile")" + + if [ "$action" == set -o "$action" == inc ]; then + [ -f "$scriptdir/.nutools-devel" ] || + die "Cette installation de ulib est déjà déployé en version $pversion: impossible de la mettre à jour." + fi + + if [ "$action" == show ]; then + echo "ulib est en version $pversion" + if [ -n "$system" ]; then + setx sversion formatversion 0 0 0 + sversionfile="/etc/.ulibver" + [ -f "$sversionfile" ] && sversion="$(<"$sversionfile")" + parseversion "$(<"$versionfile")" s + echo "/etc/ulib est en version $spversion" + fi + + elif [ "$action" == set ]; then + parsepversion "$set_version" + formatversion >"$versionfile" + echo "ulib est maintenant en version $pversion" + + elif [ "$action" == inc ]; then + case "$inc_version" in + major) major=$(($major + 1)); minor=0; patch=0;; + minor) minor=$(($minor + 1)); patch=0;; + patch) patch=$(($patch + 1));; + esac + formatversion >"$versionfile" + parseversion "$(<"$versionfile")" + echo "ulib est maintenant en version $pversion" + + elif [ "$action" == check ]; then + r=1 + parsepversion "$min_version" m + [ "$version" -ge "$mversion" ] && r=0 + if [ $r -eq 0 ]; then + eecho "ulib est en version $pversion >= $mpversion ${COULEUR_VERTE}[OK]${COULEUR_NORMALE}" + else + eecho "ulib est en version $pversion < $mpversion ${COULEUR_ROUGE}[KO]${COULEUR_NORMALE}" + fi + exit $r + + else + die "BUG: action inconnue $action" + fi + ;; +shell) + [ -n "$u_opt" ] && die "getopt: invalid option 'u'" + [ -n "$p_opt" ] && die "getopt: invalid option 'p'" + [ -n "$s_opt" ] && { mode=shell; } # FYI, ici $mode vaut déjà shell + + ac_set_tmpfile bashrc + echo "\ +if ! grep -q '/etc/bash.bashrc' /etc/profile; then + [ -f /etc/bash.bashrc ] && source /etc/bash.bashrc +fi +if ! grep -q '~/.bashrc' ~/.bash_profile; then + [ -f ~/.bashrc ] && source ~/.bashrc +fi +[ -f /etc/profile ] && source /etc/profile +[ -f ~/.bash_profile ] && source ~/.bash_profile +if ! grep -q '$scriptdir/bashrc' ~/.bashrc; then + if [ -f '$scriptdir/bashrc' ]; then + if ! grep -q @@dest@@ '$scriptdir/bashrc'; then + # ne lire que si le répertoire est déployé + source '$scriptdir/bashrc' + fi + fi + function uprovide() { :; } + source '$scriptdir/lib/ulib/uenv' + __uenv_source_dirs '$scriptdir/lib/bashrc.d' + __uenv_cleanup +fi +if ! grep -q '$scriptdir/profile' ~/.bash_profile; then + if [ -f '$scriptdir/profile' ]; then + if grep -q @@dest@@ '$scriptdir/profile'; then + # répertoire non déployé + # la ligne suivante est copiée du fichier profile + [ -z '$USER' -a -n '$LOGNAME' ] && export USER='$LOGNAME' + else + # ne lire que si le répertoire est déployé + source '$scriptdir/profile' + fi + fi + function uprovide() { :; } + source '$scriptdir/lib/ulib/uenv' + __uenv_source_dirs '$scriptdir/lib/profile.d' + __uenv_cleanup +fi + +# Modifier le PATH. Ajouter aussi le chemin vers les uapps python +PATH=$(quoted_args "$scriptdir:$scriptdir/lib/pyulib/src/uapps:$PATH") + +if [ -n '$DEFAULT_PS1' ]; then + DEFAULT_PS1=$(quoted_args "[ulibshell] $DEFAULT_PS1") +else + if [ -z '$PS1' ]; then + PS1='\\u@\\h \\w \\$ ' + fi + PS1=\"[ulibshell] \$PS1\" +fi +$(quoted_args source "$scriptdir/lib/ulib/auto")" >"$bashrc" + + array_fix_paths modules + if [ -n "${modules[*]}" ]; then + etitle "Chargement des modules" + for module in "${modules[@]}"; do + estep "$module" + quoted_args urequire "$module" >>"$bashrc" + done + eend + fi + + estep "Lancement du sous-shell" + "$SHELL" --rcfile "$bashrc" -i -- "$@" + # note: ne pas faire exec "$SHELL", parce que sinon le fichier temporaire bashrc + # n'est pas supprimé + + ac_clean "$bashrc" + ;; +esac + diff --git a/ulibshell b/ulibshell deleted file mode 100755 index bf8ac66..0000000 --- a/ulibshell +++ /dev/null @@ -1,95 +0,0 @@ -#!/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 - -function display_help() { - uecho "$scriptname: Lancer un shell après avoir chargé des modules de ulib - -USAGE - $scriptname [options] [args...] - -OPTIONS - -r module - Spécifier un module à charger avec urequire. Plusieurs modules peuvent - être spécifiés en les séparant par ':' - Par défaut, seul le module DEFAULTS est chargé. - -Un shell est lancé dans lequel les modules spécifiés sont chargés. De plus, PATH -est modifié pour que $scriptdir soit ajouté en premier. -Les arguments sont passés inchangés au shell." -} - -parse_opts + "${PRETTYOPTS[@]}" \ - --help '$exit_with display_help' \ - -r: modules \ - @ args -- "$@" && set -- "${args[@]}" || die "$args" - -ac_set_tmpfile bashrc -echo "\ -if ! grep -q '/etc/bash.bashrc' /etc/profile; then - [ -f /etc/bash.bashrc ] && source /etc/bash.bashrc -fi -if ! grep -q '~/.bashrc' ~/.bash_profile; then - [ -f ~/.bashrc ] && source ~/.bashrc -fi -[ -f /etc/profile ] && source /etc/profile -[ -f ~/.bash_profile ] && source ~/.bash_profile -if ! grep -q '$scriptdir/bashrc' ~/.bashrc; then - if [ -f '$scriptdir/bashrc' ]; then - if ! grep -q @@dest@@ '$scriptdir/bashrc'; then - # ne lire que si le répertoire est déployé - source '$scriptdir/bashrc' - fi - fi - function uprovide() { :; } - source '$scriptdir/ulib/uenv' - __uenv_source_dirs '$scriptdir/lib/bashrc.d' - __uenv_cleanup -fi -if ! grep -q '$scriptdir/profile' ~/.bash_profile; then - if [ -f '$scriptdir/profile' ]; then - if grep -q @@dest@@ '$scriptdir/profile'; then - # répertoire non déployé - # la ligne suivante est copiée du fichier profile - [ -z '$USER' -a -n '$LOGNAME' ] && export USER='$LOGNAME' - else - # ne lire que si le répertoire est déployé - source '$scriptdir/profile' - fi - fi - function uprovide() { :; } - source '$scriptdir/ulib/uenv' - __uenv_source_dirs '$scriptdir/lib/profile.d' - __uenv_cleanup -fi - -# Modifier le PATH. Ajouter aussi le chemin vers les uapps python -PATH=$(quoted_args "$scriptdir:$scriptdir/pyulib/src/uapps:$PATH") - -if [ -n '$DEFAULT_PS1' ]; then - DEFAULT_PS1=$(quoted_args "[ulibshell] $DEFAULT_PS1") -else - if [ -z '$PS1' ]; then - PS1='\\u@\\h \\w \\$ ' - fi - PS1=\"[ulibshell] \$PS1\" -fi -$(quoted_args source "$scriptdir/ulib/auto")" >"$bashrc" - -array_fix_paths modules -if [ -n "${modules[*]}" ]; then - etitle "Chargement des modules" - for module in "${modules[@]}"; do - estep "$module" - quoted_args urequire "$module" >>"$bashrc" - done - eend -fi - -estep "Lancement du sous-shell" -"$SHELL" --rcfile "$bashrc" -i -- "$@" - -ac_clean "$bashrc" -# note: ne pas faire exec "$SHELL", parce que sinon le fichier temporaire bashrc -# n'est pas supprimé diff --git a/ulibsync b/ulibsync deleted file mode 100755 index a1de515..0000000 --- a/ulibsync +++ /dev/null @@ -1,38 +0,0 @@ -#!/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 - -function display_help() { - uecho "$scriptname: Copier les librairies ulib et/ou pyulib - -USAGE - $scriptname [options] destdir - -OPTIONS - -u - Copier ulib - -p - Copier pyulib" -} - -parse_opts "${PRETTYOPTS[@]}" \ - --help '$exit_with display_help' \ - -u,--ulib ulib \ - -p,--pyulib pyulib \ - @ args -- "$@" && set -- "${args[@]}" || die "$args" - -[ -z "$ulib" -a -z "$pyulib" ] && ulib=1 - -destdir="${1:-.}" -if [ -n "$ulib" ]; then - if ask_yesno "Voulez-vous copier les librairies ulib dans $(ppath "$destdir")?" O; then - ulib_sync "$destdir" - fi -fi -if [ -n "$pyulib" ]; then - if ask_yesno "Voulez-vous copier les librairies pyulib dans $(ppath "$destdir")?" O; then - urequire nutools/pyulib - pyulib_sync "$destdir" - fi -fi diff --git a/ulibversion b/ulibversion deleted file mode 100755 index fe48f80..0000000 --- a/ulibversion +++ /dev/null @@ -1,54 +0,0 @@ -#!/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 - -function display_help() { - uecho "$scriptname: Gestion de la version de ulib - -USAGE - $scriptname [options] - -OPTIONS - -l, --show - Afficher la version de la librairie (par défaut) - -s, --system - Afficher aussi la version de la librairie système - -c, --check MIN_VERSION - Vérifier que la version de la librairie est au minimum MIN_VERSION, et - afficher un message d'information. Utiliser l'option -q si l'on veut - juste tester la version et ne pas afficher le message d'information." -} - -action=show -system= -min_version= -parse_opts "${PRETTYOPTS[@]}" \ - --help '$exit_with display_help' \ - -l,--show action=show \ - -s,--system system=1 \ - -c:,--check: '$set@ min_version; action=check' \ - @ args -- "$@" && set -- "${args[@]}" || die "$args" - -version=0 -versionfile="$scriptdir/ulib/.ulib_version" -[ -f "$versionfile" ] && version="$(<"$versionfile")" - -if [ "$action" == show ]; then - echo "ulib est en version $version" - if [ -n "$system" ]; then - version=0 - versionfile="/etc/.ulib_version" - [ -f "$versionfile" ] && version="$(<"$versionfile")" - echo "/etc/ulib est en version $version" - fi -elif [ "$action" == check ]; then - r=1 - [ $version -ge $min_version ] && r=0 - if [ $r -eq 0 ]; then - einfo "ulib est en version $version >= $min_version ${COULEUR_VERTE}[OK]${COULEUR_NORMALE}" - else - einfo "ulib est en version $version < $min_version ${COULEUR_ROUGE}[KO]${COULEUR_NORMALE}" - fi - exit $r -fi