diff --git a/create-user b/create-user index 997f905..6fdbe69 100755 --- a/create-user +++ b/create-user @@ -161,11 +161,11 @@ $(qvals "./$scriptname" ${pkstring:+-s "$pkstring"} ${luser:+-l} "$user")" >"$wo estep "Exécution du script" "${ssh[@]}" "$remoteuser@$host" "\ -__estack=$(quoted_arg "$__estack") -__tlevel=$(quoted_arg "$__tlevel") +__estack=$(qval "$__estack") +__tlevel=$(qval "$__tlevel") export __estack __tlevel ${UTOOLS_LANG:+UTOOLS_LANG='$UTOOLS_LANG'; export UTOOLS_LANG -}$(quoted_args "./$archivename" ${tmproot:+--tmproot "$tmproot"})" +}$(qvals "./$archivename" ${tmproot:+--tmproot "$tmproot"})" r=$? ac_clean "$workdir" diff --git a/cssh b/cssh index 2a26417..aba5c67 100755 --- a/cssh +++ b/cssh @@ -23,7 +23,7 @@ vars="$("$scriptdir/ussh" --parse "$@")" || die eval "$vars" [ "${#hosts[*]}" -gt 0 ] || die "Vous devez spécifier l'hôte sur lequel se connecter" -cmd="'$(quoted_args "${args[@]}") +cmd="'$(qvals "${args[@]}") "' function __ask() { local r diff --git a/legacy/instinc/womonitor b/legacy/instinc/womonitor index e80c943..4cdc54c 100644 --- a/legacy/instinc/womonitor +++ b/legacy/instinc/womonitor @@ -224,7 +224,7 @@ found_element && $0 ~ /<\/element/ { local instance notfirst= for instance in "$@"; do - script="$script${notfirst:+|| }name == \"$(quote_awk "$instance")\"" + script="$script${notfirst:+|| }name == $(qawk "$instance")" notfirst=1 done script="$script"') { @@ -304,7 +304,7 @@ found_element && $0 ~ /<\/element/ { local instance notfirst= for instance in "$@"; do - script="$script${notfirst:+|| }name == \"$(quote_awk "$instance")\"" + script="$script${notfirst:+|| }name == $(qawk "$instance")" notfirst=1 done script="$script"') { diff --git a/lib/uinst/conf b/lib/uinst/conf index 6d11c96..1aa8868 100644 --- a/lib/uinst/conf +++ b/lib/uinst/conf @@ -63,8 +63,8 @@ fi # identification du système echo "##@before *" >lib/profile.d/0nutools -set_var_cmd UNAME_SYSTEM "$UNAME_SYSTEM" >>lib/profile.d/0nutools -set_var_cmd UNAME_MACHINE "$UNAME_MACHINE" >>lib/profile.d/0nutools +echo_setv UNAME_SYSTEM "$UNAME_SYSTEM" >>lib/profile.d/0nutools +echo_setv UNAME_MACHINE "$UNAME_MACHINE" >>lib/profile.d/0nutools # installer les profils destdir="@@dest@@" diff --git a/lib/ulib/apache.tools b/lib/ulib/apache.tools index eaa8d8e..792b039 100644 --- a/lib/ulib/apache.tools +++ b/lib/ulib/apache.tools @@ -8,8 +8,8 @@ uprovide apache.tools urequire base sysinfos template apache function __apache_rc_destdir() { - [ -z "$3" ] && set_var "${1:-certsdir}" "$(get_APACHESSLCERTSDIR_prefix)" - [ -z "$4" ] && set_var "${2:-keysdir}" "$(get_APACHESSLKEYSDIR_prefix)" + [ -z "$3" ] && setv "${1:-certsdir}" "$(get_APACHESSLCERTSDIR_prefix)" + [ -z "$4" ] && setv "${2:-keysdir}" "$(get_APACHESSLKEYSDIR_prefix)" } function __apache_rc_loadconf() { @@ -134,9 +134,9 @@ function apache_resolvecert() { __apache_rc_loadconf __apache_rc_resolveprefix "$__certsdir" "$__keysdir" __apache_rc_checkvars "$__certsdir" "$__keysdir" || return 1 - set_var "${3:-cert}" "$__rc_cert" - set_var "${4:-key}" "$__rc_key" - set_var "${5:-ca}" "$__rc_ca" + setv "${3:-cert}" "$__rc_cert" + setv "${4:-key}" "$__rc_key" + setv "${5:-ca}" "$__rc_ca" } function apache_addcert() { diff --git a/lib/ulib/base b/lib/ulib/base index 1987ab1..a9e7380 100644 --- a/lib/ulib/base +++ b/lib/ulib/base @@ -58,19 +58,19 @@ fi ## valeurs function setyesval() { # mettre la valeur normalisée de la valeur "oui" de $2 dans la variable $1 - is_yes "$2" && set_var "$1" 1 || set_var "$1" "" + is_yes "$2" && _setv "$1" 1 || _setv "$1" "" } function normyesval() { # remplacer la valeur de la variable $1 par la valeur normalisée de sa valeur "oui" # Si $2 est non vide, prendre cette valeur plutôt que la valeur de la variable $1 - is_yes "${2:-"${!1}"}" && set_var "$1" 1 || set_var "$1" "" + is_yes "${2:-"${!1}"}" && _setv "$1" 1 || _setv "$1" "" } function normyesvals() { # remplacer les valeur des variables $1..* par les valeurs normalisées # respectives de leur valeur "oui" local __nyv_yesvar for __nyv_yesvar in "$@"; do - is_yes "${!__nyv_yesvar}" && set_var "$__nyv_yesvar" 1 || set_var "$__nyv_yesvar" "" + is_yes "${!__nyv_yesvar}" && _setv "$__nyv_yesvar" 1 || _setv "$__nyv_yesvar" "" done } function quote_in() { @@ -102,7 +102,7 @@ function quoted_sargs() { for a in "$@"; do s="${s:+$s }$(quoted_sarg "$a")" done - rawecho "$s" + recho "$s" } ## variables tableaux @@ -122,7 +122,7 @@ function set_array_cmd() { __sac_f=1 for __sac_v in "$@"; do [ -n "$__sac_f" ] && __sac_f= || __sac_s="$__sac_s " - __sac_s="$__sac_s$(quoted_arg "$__sac_v")" + __sac_s="$__sac_s$(qvalm "$__sac_v")" done __sac_s="$__sac_s)" echo "$__sac_s" @@ -151,20 +151,20 @@ function array_add() { # ajouter les valeurs $2..@ au tableau dont le nom est $1 local __aa_a="$1"; shift eval "$__aa_a=(\"\${$__aa_a[@]}\" \"\$@\")" - #eval "$1=(\"\${$1[@]}\" \"$(quote_arg "$2")\")" + #eval "$1=(\"\${$1[@]}\" $(qval "$2"))" } function array_ins() { # insérer les valeurs $2..@ au début du tableau dont le nom est $1 local __aa_a="$1"; shift eval "$__aa_a=(\"\$@\" \"\${$__aa_a[@]}\")" - #eval "$1=(\"$(quote_arg "$2")\" \"\${$1[@]}\")" + #eval "$1=($(qval "$2") \"\${$1[@]}\")" } function array_del() { # supprimer *les* valeurs $2 du tableau dont le nom est $1 local __ad_v local -a __ad_vs eval 'for __ad_v in "${'"$1"'[@]}"; do - if [ "$__ad_v" != '"$(quoted_arg "$2")"' ]; then + if [ "$__ad_v" != '"$(qval "$2")"' ]; then array_add __ad_vs "$__ad_v" fi done' @@ -175,7 +175,7 @@ function array_addu() { # déjà. Retourner vrai si la valeur a été ajoutée local __as_v eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then + if [ "$__as_v" == '"$(qval "$2")"' ]; then return 1 fi done' @@ -190,7 +190,7 @@ function array_insu() { # valeur n'y est pas déjà. Retourner vrai si la valeur a été ajoutée. local __as_v eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then + if [ "$__as_v" == '"$(qval "$2")"' ]; then return 1 fi done' @@ -224,7 +224,7 @@ function array_contains() { # tester si le tableau dont le nom est $1 contient la valeur $2 local __ac_v eval 'for __ac_v in "${'"$1"'[@]}"; do - if [ "$__ac_v" == '"$(quoted_arg "$2")"' ]; then + if [ "$__ac_v" == '"$(qvalm "$2")"' ]; then return 0 fi done' @@ -235,7 +235,7 @@ function array_icontains() { # compte de la casse local __ac_v eval 'for __ac_v in "${'"$1"'[@]}"; do - if [ "$(strlower "$__ac_v")" == '"$(strlower "$(quoted_arg "$2")")"' ]; then + if [ "$(strlower "$__ac_v")" == '"$(strlower "$(qval "$2")")"' ]; then return 0 fi done' @@ -247,7 +247,7 @@ function array_find() { local __af_i __af_v __af_i=0 eval 'for __af_v in "${'"$1"'[@]}"; do - if [ "$__af_v" == '"$(quoted_arg "$2")"' ]; then + if [ "$__af_v" == '"$(qval "$2")"' ]; then if [ -n "$3" ]; then echo "${'"$3"'[$__af_i]}" else @@ -313,11 +313,11 @@ function array_map() { } function first_value() { # retourner la première valeur du tableau $1 - eval "rawecho \"\${$1[@]:0:1}\"" + eval "recho \"\${$1[@]:0:1}\"" } function last_value() { # retourner la dernière valeur du tableau $1 - eval "rawecho \"\${$1[@]:\$((-1)):1}\"" + eval "recho \"\${$1[@]:\$((-1)):1}\"" } function array_copy() { # copier le contenu du tableau $2 dans le tableau $1 @@ -418,9 +418,9 @@ function array_join() { __aj_j="${__aj_j:+$__aj_j'"$__aj_s"'}$__aj_pf$__aj_l$__aj_sf" done' if [ -n "$__aj_j" ]; then - rawecho "$__aj_j" + recho "$__aj_j" elif [ "$__aj_an" != "\$@" -a -n "$3" ]; then - rawecho "$3" + recho "$3" fi } function array_mapjoin() { @@ -482,26 +482,21 @@ function parse_date() { local value="$1" type="${2:-date}" local now="$(awk 'BEGIN { print mktime(strftime("%Y %m %d 00 00 00 +0400")) }')" case "$value" in - +*) - value="$(($now + ${value#+} * 86400))" - ;; - *) - value="$(<<<"$value" awk -F/ '{ - nd = strftime("%d"); nm = strftime("%m"); ny = strftime("%Y") - d = $1 + 0; if (d < 1) d = nd; - m = $2 + 0; if (m < 1) m = nm; - if ($3 == "") y = ny; - else { y = $3 + 0; if (y < 100) y = y + 2000; } - print mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d)); - }')" + +*) value="$(($now + ${value#+} * 86400))";; + *) value="$(<<<"$value" awk -F/ '{ + nd = strftime("%d"); nm = strftime("%m"); ny = strftime("%Y") + d = $1 + 0; if (d < 1) d = nd; + m = $2 + 0; if (m < 1) m = nm; + if ($3 == "") y = ny; + else { y = $3 + 0; if (y < 100) y = y + 2000; } + print mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d)); + }')";; esac case "$type" in d|date) awk '{ print strftime("%d/%m/%Y", $0 + 0) }' <<<"$value";; l|ldap) awk '{ print strftime("%Y%m%d%H%M%S+0400", $0 + 0) }' <<<"$value";; m|mysql) awk '{ print strftime("%Y-%m-%d", $0 + 0) }' <<<"$value";; - *) - rawecho "$value" - ;; + *) recho "$value";; esac } @@ -563,7 +558,7 @@ function normpath() { ap="$ap$part" fi done - rawecho "$ap" + recho "$ap" } function abspath() { # Retourner un chemin absolu vers $1. Si $2 est non nul et si $1 est un chemin @@ -640,7 +635,7 @@ function ppath() { [ "$cwd" != "/" -a "$cwd" != "$HOME" ] && path="${path#$cwd/}" [ "${path#$HOME/}" != "$path" ] && path="~${path#$HOME}" - rawecho "$path" + recho "$path" } function relpath() { # Afficher le chemin relatif de $1 par rapport à $2. Si $2 n'est pas spécifié, @@ -656,7 +651,7 @@ function relpath() { if [ "$p" == "$cwd" ]; then echo "" elif [ "${p#$cwd/}" != "$p" ]; then - rawecho "${p#$cwd/}" + recho "${p#$cwd/}" else local rp while [ -n "$cwd" -a "${p#$cwd/}" == "$p" ]; do @@ -752,8 +747,8 @@ function splitwcs() { fi done [ "${__sw_p#/}" != "$__sw_p" ] && __sw_d="/$__sw_d" - set_var "$__sw_dd" "$__sw_d" - set_var "$__sw_df" "$__sw_f" + _setv "$__sw_dd" "$__sw_d" + _setv "$__sw_df" "$__sw_f" } function deref() { # Retourner un chemin absolu vers le fichier $1, dans lequel toutes les @@ -824,9 +819,9 @@ function path_if_test() { local basedir="$1" if [ $op "$basedir/$file" ]; then if [ -n "$rel" ]; then - rawecho "$reldir$file" + recho "$reldir$file" else - rawecho "$basedir/$file" + recho "$basedir/$file" fi break fi @@ -1338,7 +1333,7 @@ function list_all() { cd "$b" 2>/dev/null || return eval "$(__la_cmd "$@")" | while read f; do [ "$f" == "." -o "$f" == ".." ] && continue - rawecho "$f" + recho "$f" done cd "$curdir" } @@ -1363,7 +1358,7 @@ function list_files() { cd "$b" 2>/dev/null || return eval "$(__la_cmd "$@")" | while read f; do - [ -f "$f" ] && rawecho "$f" + [ -f "$f" ] && recho "$f" done cd "$curdir" } @@ -1379,7 +1374,7 @@ function list_dirs() { cd "$b" 2>/dev/null || return eval "$(__la_cmd "$@")" | while read f; do [ "$f" == "." -o "$f" == ".." ] && continue - [ -d "$f" ] && rawecho "$f" + [ -d "$f" ] && recho "$f" done cd "$curdir" } @@ -1631,10 +1626,10 @@ function runscript_as() { local cmd cmd="\ -__estack=$(quoted_arg "$__estack") -__tlevel=$(quoted_args "$__tlevel") +__estack=$(qval "$__estack") +__tlevel=$(qval "$__tlevel") export __estack __tlevel -exec ${BASH:-/bin/sh} $(quoted_args "$@")" +exec ${BASH:-/bin/sh} $(qvals "$@")" if is_yes "$UTOOLS_USES_SU" || ! progexists sudo; then eecho "Entrez le mot de passe de root" @@ -1818,8 +1813,8 @@ En l'occurence, ce script est accédé par le chemin $script et ce chemin doit e estep "Lancement de la commande sur l'hôte distant $user@$host" local cmd - [ -n "$path" ] && cmd="$(quoted_args cd "$path"); " - cmd="$cmd$(quoted_args "$script" "$@")" + [ -n "$path" ] && cmd="$(qvals cd "$path"); " + cmd="$cmd$(qvals "$script" "$@")" ssh -qt "${UTOOLS_ENSURE_HOSTNAME_SSH_OPTS[@]}" "$user@$host" "$cmd" [ $? -eq 255 ] && return 12 return 1 @@ -2506,15 +2501,15 @@ function awkdef() { __ad_value="${1:$__ad_vpos}" if [ -n "$__ad_int" ]; then # valeur entière - echo "$__ad_name = int($(quoted_awk "$__ad_value") + 0)" + echo "$__ad_name = int($(qawk "$__ad_value") + 0)" elif [ -n "$__ad_str" ]; then # valeur chaine - echo "$__ad_name = $(quoted_awk "$__ad_value")" + echo "$__ad_name = $(qawk "$__ad_value")" elif [ ${#__ad_value} -lt 256 ] && isnum "$__ad_value"; then # considérer qu'une nombre fait moins de 256 chiffres echo "$__ad_name = $__ad_value" else - echo "$__ad_name = $(quoted_awk "$__ad_value")" + echo "$__ad_name = $(qawk "$__ad_value")" fi else # fin de l'analyse des définitions de variable @@ -2530,7 +2525,7 @@ function awkdef() { local __ad_i=1 echo "$__ad_name[0] = 0; delete $__ad_name" for __ad_arg in "${!__ad_value}"; do - echo "$__ad_name[$__ad_i]=$(quoted_awk "$__ad_arg")" + echo "$__ad_name[$__ad_i]=$(qawk "$__ad_arg")" __ad_i=$(($__ad_i + 1)) done eval "echo \"\${__ad_name}_count = \${#$__ad_value}\"" @@ -2539,7 +2534,7 @@ function awkdef() { done echo "}" for __ad_arg in "$@"; do - rawecho "$__ad_arg" + recho "$__ad_arg" done fi @@ -2967,7 +2962,7 @@ function tooenc() { # $3=($UTOOLS_OUTPUT_ENCODING) local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" if [ "$from" == "$to" ]; then - rawecho "$src" + recho "$src" else iconv -f "$from" -t "$to" <<<"$src" fi @@ -2980,9 +2975,9 @@ function tooenc_() { # $3=($UTOOLS_OUTPUT_ENCODING) local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" if [ "$from" == "$to" ]; then - rawecho_ "$src" + recho_ "$src" else - rawecho_ "$src" | iconv -f "$from" -t "$to" + recho_ "$src" | iconv -f "$from" -t "$to" fi } function uecho_() { @@ -2993,7 +2988,7 @@ function toienc() { # $3(=$UTOOLS_INPUT_ENCODING) local __tie_var="$1" __tie_to="${2:-$IENC}" __tie_from="${3:-$UTOOLS_INPUT_ENCODING}" if [ "$__tie_from" != "$__tie_to" ]; then - set_var "$__tie_var" "$(iconv -f "$__tie_from" -t "$__tie_to" <<<"${!__tie_var}")" + _setv "$__tie_var" "$(iconv -f "$__tie_from" -t "$__tie_to" <<<"${!__tie_var}")" fi } function uread() { @@ -3075,7 +3070,7 @@ function __indent() { /}" != "$1" ]; then sed "2,\$s/^/${__tlevel}/g" <<<"$1" else - rawecho "$1" + recho "$1" fi } # fonctions à surcharger pour modifier la façon dont les messages sont affichés @@ -3163,7 +3158,7 @@ function get_interaction_option() { :;} __epending= function eflush() { # Afficher les messages en attente - if [ -n "$__epending" ]; then rawecho "$__epending" 1>&2; __epending=; fi + if [ -n "$__epending" ]; then recho "$__epending" 1>&2; __epending=; fi } function eclearp() { # Supprimer les message en attente @@ -3211,7 +3206,7 @@ function edebug() { function trace() { # Afficher la commande $1..@, la lancer, puis afficher son code d'erreur si une # erreur se produit - local r cmd="$(quoted_args "$@")" + local r cmd="$(qvals "$@")" show_info && { eflush; __eecho "\$ $cmd" 1>&2; } "$@"; r=$? if [ $r -ne 0 ]; then @@ -3230,7 +3225,7 @@ function trace_error() { local r "$@"; r=$? if [ $r -ne 0 ]; then - local cmd="$(quoted_args "$@")" + local cmd="$(qvals "$@")" show_error && { eflush; __eecho "^ $cmd [EC #$r]" 1>&2; } fi return $r @@ -3649,7 +3644,7 @@ function __rv_read() { OENC="$UTF8" eerror "La valeur par défaut de $__rv_v doit être non vide" return 1 fi - set_var "$__rv_v" "$__rv_d" + _setv "$__rv_v" "$__rv_d" return 0 fi @@ -3678,7 +3673,7 @@ function __rv_read() { fi __rv_r="${__rv_r:-$__rv_d}" if [ -n "$__rv_r" ] || ! is_yes "$__rv_re"; then - set_var "$__rv_v" "$__rv_r" + _setv "$__rv_v" "$__rv_r" return 0 fi done @@ -3755,7 +3750,7 @@ function simple_menu() { __sm_c=0 fi done - set_var "$__sm_option_var" "$__sm_option" + _setv "$__sm_option_var" "$__sm_option" } function actions_menu() { @@ -3801,8 +3796,8 @@ function actions_menu() { eerror_unless [ ${#__am_action_descs[*]} -gt 0 ] "Vous devez spécifier le tableau des actions" || return __actions_menu || return 1 - setv "${1:-action}" "$__am_select_action" - setv "${2:-option}" "$__am_select_option" + _setv "${1:-action}" "$__am_select_action" + _setv "${2:-option}" "$__am_select_option" } function __actions_menu() { local title="$__am_title" @@ -4091,12 +4086,12 @@ function ac_set_tmpfile() { fi fi if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" + _setv "$1" "$3" [ -f "$3" -a "$4" == keep ] || >"$3" else local __acst_t="$(mktempf "$2")" autoclean "$__acst_t" - set_var "$1" "$__acst_t" + _setv "$1" "$__acst_t" fi } function ac_set_tmpdir() { @@ -4115,12 +4110,12 @@ function ac_set_tmpdir() { fi fi if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" + _setv "$1" "$3" mkdir -p "$3" else local __acst_t="$(mktempd "$2")" autoclean "$__acst_t" - set_var "$1" "$__acst_t" + _setv "$1" "$__acst_t" fi } function debug_tee() { diff --git a/lib/ulib/compat b/lib/ulib/compat index 32e0c23..89596dc 100644 --- a/lib/ulib/compat +++ b/lib/ulib/compat @@ -270,7 +270,7 @@ if check_sysinfos -s macosx; then done args=("${args[@]}" "$@") fi - quoted_args "${options[@]}" -- "${args[@]}" + qvals "${options[@]}" -- "${args[@]}" return 0 } diff --git a/lib/ulib/conf b/lib/ulib/conf index 1493e07..98c123c 100644 --- a/lib/ulib/conf +++ b/lib/ulib/conf @@ -47,7 +47,7 @@ function conf_enable() { fi if [ "$name" != "$param" ]; then # Ensuite, mettre à jour le fichier avec la valeur spécifiée - to="$(quote_seds "$value")" + to="$(qseds "$value")" sedi "\ /^[ $TAB]*export[ $TAB]*$name[ $TAB]*=/s/^\([ $TAB]*export[ $TAB]*$name[ $TAB]*=[ $TAB]*\).*\$/\\1$to/ /^[ $TAB]*$name[ $TAB]*=/s/^\([ $TAB]*$name[ $TAB]*=[ $TAB]*\).*\$/\\1$to/ @@ -61,14 +61,14 @@ function conf_enable() { } function conf_enableq() { - # Comme conf_enable(), mais s'assure que les valeurs sont quotées dans le - # fichier. Ceci permet de stocker des valeurs avec des espaces ou des - # caractères spéciaux. + # Comme conf_enable(), mais s'assure que les valeurs sont quotées si + # nécessaire dans le fichier. Ceci permet de stocker des valeurs avec des + # espaces ou des caractères spéciaux. local args arg name value args=("$1"); shift for arg in "$@"; do splitvar "$arg" name value - array_add args "$name=$(quoted_arg "$value")" + array_add args "$name=$(qvalm "$value")" done conf_enable "${args[@]}" } @@ -94,8 +94,8 @@ function conf_disable() { from0="^[ $TAB]*export[ $TAB]*$name[ $TAB]*=" from1="^[ $TAB]*$name[ $TAB]*=" if [ "$name" != "$param" ]; then - from0="$from0$(quote_seds "$value")\$" - from1="$from1$(quote_seds "$value")\$" + from0="$from0$(qseds "$value")\$" + from1="$from1$(qseds "$value")\$" fi if quietgrep "$from" "$conf"; then sedi "\ @@ -131,7 +131,7 @@ function conf_append() { local param name value from for param in "$@"; do splitvar "$param" name value - echo "$name=\"\${$name:+\$$name$CONF_APPEND_SEP}$(quote_arg "$value")\"" >>"$conf" + echo "$name=\"\${$name:+\$$name$CONF_APPEND_SEP}$(_qval "$value")\"" >>"$conf" modified=0 done @@ -160,11 +160,11 @@ function conf_array_append() { if quietgrep "^[ $TAB]*\(export[ $TAB]*\)\?$name=(" "$conf"; then # variable déjà existante [ "$name" != "$param" ] || continue - echo "$name=(\"\${$name[@]}\" $(quoted_arg "$value"))" >>"$conf" + echo "$name=(\"\${$name[@]}\" $(qvalm "$value"))" >>"$conf" else # nouvelle variable if [ "$name" != "$param" ]; then - echo "$name=($(quoted_arg "$value"))" >>"$conf" + echo "$name=($(qvalm "$value"))" >>"$conf" else echo "$name=()" >>"$conf" fi @@ -191,7 +191,7 @@ function conf_check() { splitvar "$param" name value from="^[ $TAB]*\(export[ $TAB]*\)\?$name[ $TAB]*=" if [ "$name" != "$param" ]; then - from="$from$(quote_seds "$value")\$" + from="$from$(qseds "$value")\$" fi quietgrep "$from" "$conf" || return 1 done @@ -232,7 +232,7 @@ function aconf_enable() { fi if [ "$name" != "$param" ]; then # Ensuite, mettre à jour le fichier avec la valeur spécifiée - to="$(quote_seds "$value")" + to="$(qseds "$value")" sedi "\ /^[ $TAB]*$name[ $TAB][ $TAB]*/s/^\([ $TAB]*$name[ $TAB]*\).*$/\\1$to/ /^[ $TAB]*$name\$/s/^\([ $TAB]*$name\)\$/\\1 $to/" "$conf" @@ -265,7 +265,7 @@ function aconf_disable() { # Essayer simplement de commenter la valeur dans le fichier from="^[ $TAB]*$name[ $TAB]*" if [ "$name" != "$param" ]; then - from="$from$(quote_seds "$value")\$" + from="$from$(qseds "$value")\$" fi if quietgrep "$from" "$conf"; then sedi "/$from/"'s/^/#/g' "$conf" @@ -317,7 +317,7 @@ function aconf_check() { splitvar "$param" name value from="^[ $TAB]*$name[ $TAB]*" if [ "$name" != "$param" ]; then - from="$from$(quote_seds "$value")\$" + from="$from$(qseds "$value")\$" fi quietgrep "$from" "$conf" || return 1 done @@ -350,17 +350,17 @@ function mconf_enable() { local script i param name value script="BEGIN { modified = 1 - section = $(quoted_awk "$section") + section = $(qawk "$section") in_section = 0" i=0 for param in "$@"; do splitvar "$param" name value script="$script - names[$i] = $(quoted_awk "$name")" + names[$i] = $(qawk "$name")" if [ "$name" != "$param" ]; then script="$script hasvalues[$i] = 1 - values[$i] = $(quoted_awk "$value")" + values[$i] = $(qawk "$value")" else script="$script hasvalues[$i] = 0 @@ -445,7 +445,7 @@ function mconf_disable() { local script match script="BEGIN { modified = 1 - section = $(quoted_awk "$section") + section = $(qawk "$section") in_section = 0 " local param name value @@ -453,7 +453,7 @@ function mconf_disable() { splitvar "$param" name value match="${match:+$match || }\$0 ~ /^[ $TAB]*$name[ $TAB]*=" if [ "$name" != "$param" ]; then - match="$match[ $TAB]*$(quote_seds "$value")\$" + match="$match[ $TAB]*$(qseds "$value")\$" fi match="$match/" done @@ -501,15 +501,15 @@ function mconf_append() { local script match script="BEGIN { modified = 1 - section=$(quoted_awk "$section") + section=$(qawk "$section") in_section=0 " i=0 for param in "$@"; do splitvar "$param" name value script="$script - names[$i] = $(quoted_awk "$name") - values[$i] = $(quoted_awk "$value") + names[$i] = $(qawk "$name") + values[$i] = $(qawk "$value") seen[$i] = 0" let i=$i+1 done @@ -569,14 +569,14 @@ function mconf_check() { local script i param name value script="BEGIN { - section = $(quoted_awk "$section") + section = $(qawk "$section") in_section = 0" i=0 for param in "$@"; do splitvar "$param" name value script="$script - names[$i] = $(quoted_awk "$name") - values[$i] = $(quoted_awk "$value") + names[$i] = $(qawk "$name") + values[$i] = $(qawk "$value") seen[$i] = 0" let i=$i+1 done @@ -593,7 +593,7 @@ function mconf_check() { script="$script in_section && \$0 ~ /^[ $TAB]*$name[ $TAB]*=" if [ "$name" != "$param" ]; then - script="$script$(quote_seds "$value")\$" + script="$script$(qseds "$value")\$" fi script="$script/ { seen[$i] = 1 diff --git a/lib/ulib/ipcalc b/lib/ulib/ipcalc index 2b29c45..6b3748c 100644 --- a/lib/ulib/ipcalc +++ b/lib/ulib/ipcalc @@ -15,11 +15,11 @@ function ipcalc_splitipmask() { # la variable $2(=ip) et le masque, qui est placée dans la variable # $3(=mask) if [[ "$1" == */* ]]; then - set_var "${2:-ip}" "${1%%/*}" - set_var "${3:-mask}" "${1#*/}" + _setv "${2:-ip}" "${1%%/*}" + _setv "${3:-mask}" "${1#*/}" else - set_var "${2:-ip}" "$1" - set_var "${3:-mask}" + _setv "${2:-ip}" "$1" + _setv "${3:-mask}" fi } @@ -241,7 +241,7 @@ function network_parse_confbr() { local __npc_destbr; local -a __npc_destifaces __network_parse_confbr "$1" - set_var "${2:-br}" "$__npc_destbr" + _setv "${2:-br}" "$__npc_destbr" array_copy "${3:-ifaces}" __npc_destifaces } @@ -265,8 +265,8 @@ function network_parse_confip() { local __npc_destiface __npc_destgateway; local -a __npc_destipsuffixes __network_parse_confip "$1" - set_var "${2:-iface}" "$__npc_destiface" - set_var "${3:-gateway}" "$__npc_destgateway" + _setv "${2:-iface}" "$__npc_destiface" + _setv "${3:-gateway}" "$__npc_destgateway" array_copy "${4:-ipsuffixes}" __npc_destipsuffixes } @@ -339,7 +339,7 @@ function __network_fix_confips() { eval "local ${iface}_gateway $network; local -a ${iface}_ipsuffixes" fi if [ -z "${!network}" -a -n "${ipsuffixes[0]}" ]; then - setv "$network" "$(ipcalc_network "${ipsuffixes[0]}")" + _setv "$network" "$(ipcalc_network "${ipsuffixes[0]}")" fi fi done @@ -390,7 +390,7 @@ function __network_fix_confips() { # spécifier la passerelle: elle sera fournie par le serveur DHCP. # Utiliser le marqueur "none" pour que la valeur ne soit pas modifiée. [ "${ipsuffixes[0]}" == "dhcp" ] && gateway=none - set_var "${iface}_gateway" "$gateway" + _setv "${iface}_gateway" "$gateway" done # puis construire le tableau final array_new confips diff --git a/lib/ulib/javaproperties b/lib/ulib/javaproperties index 45f9626..50a654a 100644 --- a/lib/ulib/javaproperties +++ b/lib/ulib/javaproperties @@ -44,9 +44,9 @@ function read_property() { __rp_name="${2//./_}" fi if [ -n "$__rp_found" ]; then - set_var "$__rp_name" "$(tooenc "$__rp_value" "$LATIN1")" + _setv "$__rp_name" "$(tooenc "$__rp_value" "$LATIN1")" else - set_var "$__rp_name" "$4" + _setv "$__rp_name" "$4" fi } diff --git a/lib/ulib/ldap b/lib/ulib/ldap index 86ea11a..b464c9b 100644 --- a/lib/ulib/ldap +++ b/lib/ulib/ldap @@ -77,33 +77,33 @@ function split_ldapuri() { local ldapuri="$1" protoname="${2:-proto}" hostname="${3:-host}" portname="${4:-port}" local tmp if [ -z "$ldapuri" ]; then - set_var "$protoname" "" - set_var "$hostname" "" - set_var "$portname" "" + _setv "$protoname" "" + _setv "$hostname" "" + _setv "$portname" "" return 0 fi tmp="$ldapuri" if [ "${tmp#ldap://}" != "$tmp" ]; then - set_var "$protoname" ldap + _setv "$protoname" ldap tmp="${tmp#ldap://}" elif [ "${tmp#ldaps://}" != "$tmp" ]; then - set_var "$protoname" ldaps + _setv "$protoname" ldaps tmp="${tmp#ldaps://}" elif [ "${tmp#ldapi://}" != "$tmp" ]; then - set_var "$protoname" ldapi + _setv "$protoname" ldapi tmp="${tmp#ldapi://}" else - set_var "$protoname" "" - set_var "$hostname" "" - set_var "$portname" "" + _setv "$protoname" "" + _setv "$hostname" "" + _setv "$portname" "" eerror "invalid ldapuri: $ldapuri" return 1 fi tmp="${tmp%%/*}" local tmphost="${tmp%%:*}" - set_var "$hostname" "$tmphost" + _setv "$hostname" "$tmphost" tmp="${tmp#$tmphost}" - set_var "$portname" "${tmp#:}" + _setv "$portname" "${tmp#:}" return 0 } diff --git a/lib/ulib/ldif b/lib/ulib/ldif index de7e2bf..bf57ad5 100644 --- a/lib/ulib/ldif +++ b/lib/ulib/ldif @@ -422,7 +422,7 @@ BEGIN { let i=0 for value in "$@"; do script="$script -values[$i] = $(quoted_awk "$value")" +values[$i] = $(qawk "$value")" let i=$i+1 done script="$script @@ -450,13 +450,13 @@ function print_values() { } BEGIN { add=0 - attr=fix_attr($(quoted_awk "$attr")) + attr=fix_attr($(qawk "$attr")) count=$#" local i value let i=0 for value in "$@"; do script="$script -values[$i] = $(quoted_awk "$value")" +values[$i] = $(qawk "$value")" let i=$i+1 done script="$script @@ -505,13 +505,13 @@ function print_values() { BEGIN { add = 0 found = 0 - attr = fix_attr($(quoted_awk "$attr")) + attr = fix_attr($(qawk "$attr")) count = $#" local i value let i=0 for value in "$@"; do script="$script -values[$i] = $(quoted_awk "$value")" +values[$i] = $(qawk "$value")" let i=$i+1 done script="$script @@ -539,13 +539,13 @@ function tl_ensureval() { local script="$(def_match_attr "$attr") BEGIN { resetp() - attr = fix_attr($(quoted_awk "$attr")) + attr = fix_attr($(qawk "$attr")) ensure_count = $#" local i value let i=0 for value in "$@"; do script="$script - ensure_values[$i] = $(quoted_awk "$value")" + ensure_values[$i] = $(qawk "$value")" let i=$i+1 done script="$script @@ -1330,7 +1330,7 @@ function get_transform_cmd() { shift continue fi - cmd="${cmd:+"$cmd "}$(quoted_arg "$1")" + cmd="${cmd:+"$cmd "}$(qvalm "$1")" shift done [ -n "$cmd" ] && cmds=("${cmds[@]}" "$cmd") @@ -1427,7 +1427,7 @@ function get_transform_cmd() { ;; esac [ -n "$auto_uncut" ] && dest="${dest:+"$dest | "}"'uncut_lines' - dest="${dest:+"$dest | "}$(quoted_args "${cmdparts[@]}")" + dest="${dest:+"$dest | "}$(qvals "${cmdparts[@]}")" [ -n "$xempty" ] && dest="${dest:+"$dest | "}"'ensure_complete_objects' [ -n "$xdel" ] && dest="${dest:+"$dest | "}"'delete_marked_objects' first= diff --git a/lib/ulib/legacy b/lib/ulib/legacy index a73e28a..7b94d21 100644 --- a/lib/ulib/legacy +++ b/lib/ulib/legacy @@ -45,7 +45,7 @@ function file_get_vars() { while [ -n "$1" ]; do var_="$1"; shift vars_="${vars_:+$vars_ }$var_" - set_var "$var_" "$1"; shift + _setv "$var_" "$1"; shift done # puis parcourir le fichier pour initialiser la valeur définitive des @@ -258,13 +258,13 @@ function file_get_java_properties() { awkre_var_="${var_//./\\.}" # nom de la variable pour une expression régulière awk # initialiser la valeur par défaut - set_var "$sh_var_" "$1"; shift + _setv "$sh_var_" "$1"; shift # et créer le script qui affichera sa valeur script="$script"' -$0 ~ "^[ \t]*'"$(quote_awk "$awkre_var_")"'=" { +$0 ~ "^[ \t]*'"$(_qawk "$awkre_var_")"'=" { # enlever les caractères de début - sub("^[ \t]*'"$(quote_awk "$awkre_var_")"'=", "") + sub("^[ \t]*'"$(_qawk "$awkre_var_")"'=", "") value = $0 # éventuellement ajouter les lignes de continuation while (substr(value, length(value), 1) == "\\") { @@ -439,7 +439,7 @@ function file_get_xml_properties() { awkre_var_="${var_//./\\.}" # nom de la variable pour une expression régulière awk # initialiser la valeur par défaut - set_var "$sh_var_" "$1"; shift + _setv "$sh_var_" "$1"; shift # et créer le script qui affichera sa valeur script="$script"' diff --git a/lib/ulib/runs b/lib/ulib/runs index e019d5b..d9cac80 100644 --- a/lib/ulib/runs +++ b/lib/ulib/runs @@ -910,7 +910,7 @@ function runs_initworkdir() { cp "$RUNSSRCDIR/uinst" "$RUNSEXPORTDIR" # faire les scripts - args_def="args=($(quoted_args ./runs --runsscriptspath "$RUNSSCRIPTSPATH" --runsmodulespath "$RUNSMODULESPATH" --runshostspath "$RUNSHOSTSPATH" --runsexportdir . --runsvarsfile varsfile -h "$RUNSHOST" ${RUNSRESET:+-z}))" + args_def="args=($(qvals ./runs --runsscriptspath "$RUNSSCRIPTSPATH" --runsmodulespath "$RUNSMODULESPATH" --runshostspath "$RUNSHOSTSPATH" --runsexportdir . --runsvarsfile varsfile -h "$RUNSHOST" ${RUNSRESET:+-z}))" echo '#!/bin/bash # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 cd "$(dirname "$0")" @@ -939,7 +939,7 @@ exit 0 array_from_path runsdirs "${!runspath}" array_map runsdirs abspath array_map runsdirs __runs_add_runsroot - set_var "$runspath" "$(array_join runsdirs :)" + _setv "$runspath" "$(array_join runsdirs :)" done # XXX quelles autres variables doivent être corrigées? # XXX ==> il faut rajouter rscripts et recipes @@ -995,11 +995,11 @@ function __runs_check_notref() { } function __runs_splitref() { if [[ "$1" == *=* ]]; then - set_var "${2:-__name}" "${1%%=*}" - set_var "${3:-__value}" "${1#*=}" + _setv "${2:-__name}" "${1%%=*}" + _setv "${3:-__value}" "${1#*=}" else - set_var "${2:-__name}" "$1" - set_var "${3:-__value}" "$1" + _setv "${2:-__name}" "$1" + _setv "${3:-__value}" "$1" fi } @@ -1046,7 +1046,7 @@ function runs_var() { array_set RUNSVARS "$__name" array_del RUNSARRAYS "$__name" array_set RUNSVARSINDIRECT "$__name" - set_var "$__name" "$__value" + _setv "$__name" "$__value" fi elif [[ "$1" == *@=* ]]; then __name="${1%%@=*}" @@ -1055,7 +1055,7 @@ function runs_var() { array_set RUNSVARS "$__name" array_set RUNSARRAYS "$__name" array_set RUNSVARSINDIRECT "$__name" - set_var "$__name" "$__value" + _setv "$__name" "$__value" fi elif [[ "$1" == *=* ]]; then __name="${1%%=*}" @@ -1064,12 +1064,12 @@ function runs_var() { array_set RUNSVARS "$__name" array_del RUNSARRAYS "$__name" array_del RUNSVARSINDIRECT "$__name" - set_var "$__name" "$__value" + _setv "$__name" "$__value" fi else break fi - [ -n "$RUNSVARDESC" ] && set_var "RUNSVARDESC_$__name" "$RUNSVARDESC" + [ -n "$RUNSVARDESC" ] && _setv "RUNSVARDESC_$__name" "$RUNSVARDESC" shift done # variables tableau @@ -1149,12 +1149,12 @@ function runs_set_lang() { if check_sysinfos -d debianlike; then eval "$(LANG= source_ifexists /etc/default/locale - set_var_cmd LANG "$LANG" + echo_setv LANG "$LANG" )" elif check_sysinfos -d redhatlike; then eval "$(LANG= source_ifexists /etc/locale.conf - set_var_cmd LANG "$LANG" + echo_setv LANG "$LANG" )" fi export LANG @@ -1168,9 +1168,9 @@ function runs_set_proxy() { if check_sysinfos -d debianlike; then eval "$(http_proxy=; ftp_proxy=; no_proxy= source_ifexists /etc/environment - set_var_cmd http_proxy "$http_proxy" - set_var_cmd ftp_proxy "$ftp_proxy" - set_var_cmd no_proxy "$no_proxy" + echo_setv http_proxy "$http_proxy" + echo_setv ftp_proxy "$ftp_proxy" + echo_setv no_proxy "$no_proxy" )" fi export http_proxy ftp_proxy no_proxy @@ -1223,7 +1223,7 @@ function runs_after() { if array_contains RUNSARRAYS "$__var"; then eval "array_copy __tmp $__var; local -a $__var; array_copy $__var __tmp" else - eval "set_var __tmp \"\${!__var}\"; local $__var; $__var=\"\$__tmp\"" + eval "_setv __tmp \"\${!__var}\"; local $__var; $__var=\"\$__tmp\"" fi done runs_clvars "${RUNSCLVARS[@]}" @@ -1237,7 +1237,7 @@ function runs_after() { if [[ "$__arg" == *!=* ]]; then __name="${__arg%%!=*}" __value="${__arg#*!=}" - __args=("${__args[@]}" "$__name=$(quoted_arg "${!__value}")") + __args=("${__args[@]}" "$__name=$(qvalm "${!__value}")") elif [[ "$__arg" == *@=* ]]; then __name="${__arg%%@=*}" __value="${__arg#*@=}[@]" @@ -1301,7 +1301,7 @@ function runs_indvars() { else # variable scalaire __ind="${!__var}" - set_var "$__var" "${!__ind}" + _setv "$__var" "${!__ind}" fi done RUNSVARSINDIRECT=() @@ -1314,7 +1314,7 @@ function runs_clvars_cmd() { __vars=() while [ -n "$1" ]; do if [ "$1" == ";" ]; then - echo "$__prefix$(quoted_args "${__vars[@]}")" + echo "$__prefix$(qvals "${__vars[@]}")" __vars=() __prefix=" " else @@ -1322,7 +1322,7 @@ function runs_clvars_cmd() { fi shift done - [ -n "${__vars[*]}" ] && echo "$__prefix$(quoted_args "${__vars[@]}")" + [ -n "${__vars[*]}" ] && echo "$__prefix$(qvals "${__vars[@]}")" } function runs_loadconfs() { @@ -1458,10 +1458,10 @@ function runs_action_dump() { eval "__count=\"\${#$__var[@]}\"" if [ "$__count" -eq 1 ]; then # variable scalaire - eecho "$__var=$(quoted_args "${!__values}")" + eecho "$__var=$(qvals "${!__values}")" else # variable tableau - eecho "$__var=($(quoted_args "${!__values}"))" + eecho "$__var=($(qvals "${!__values}"))" fi done exit 0 @@ -1535,7 +1535,7 @@ function runs_action_run() { # configuration dans le fichier $__shellconf __runs_check_varname "$__refvarname" || die - set_var "$__refvarname" "" + _setv "$__refvarname" "" splitwcs "$__shellconf" __tmpconf __wildconf if [ -n "$__wildconf" ]; then @@ -1638,7 +1638,7 @@ function runs_action_run() { runs_indvars for __name in "${RUNSVARS[@]}"; do __value="$(array_join "$__name" ":")" - __vars=("${__vars[@]}" "$(set_var_cmd "$__name" "$__value")") + __vars=("${__vars[@]}" "$(echo_setv "$__name" "$__value")") done if [ -n "$RUNS_REMOTE_SET_Y" ]; then @@ -1724,7 +1724,7 @@ function runs_action_export() { # configuration dans le fichier $__shellconf __runs_check_varname "$__refvarname" || die - set_var "$__refvarname" "" + _setv "$__refvarname" "" splitwcs "$__shellconf" __tmpconf __wildconf if [ -n "$__wildconf" ]; then @@ -1834,7 +1834,7 @@ function runs_action_export() { for __shellvar in "${__shellvars[@]}"; do # s'assurer que la variables sont vides # avant de sourcer $__shellconf - set_var "$__shellvar" + _setv "$__shellvar" done source "$__shellconf" for __shellvar in "${__shellvars[@]}"; do diff --git a/lib/ulib/support/install-pubkeys.sh b/lib/ulib/support/install-pubkeys.sh index 40fc73c..8eecbcc 100755 --- a/lib/ulib/support/install-pubkeys.sh +++ b/lib/ulib/support/install-pubkeys.sh @@ -76,18 +76,18 @@ function echo_() { } function recho() { if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo "$first$@" + echo -n - + echo "$first" "$@" else echo "$@" fi } function recho_() { if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo -n "$first$@" + echo -n - + echo -n "$first" "$@" else echo -n "$@" fi @@ -101,9 +101,10 @@ function _qval() { recho_ "$s" } function should_quote() { - local l="${#1}" + local s="$*" + local l="${#s}" [ $l -eq 0 -o $l -gt 80 ] && return 0 - local s="${*//[a-zA-Z0-9]/}" + s="${s//[a-zA-Z0-9]/}" s="${s//,/}" s="${s//./}" s="${s//+/}" @@ -438,7 +439,7 @@ function evalcmd() { } ##@inc]base.core ##@inc[base.string -## Fonctions de base: gestion des valeurs scalaires +## Fonctions de base: gestion des valeurs chaines scalaires uprovide base.string urequire base.core @@ -595,6 +596,75 @@ function endswith() { local str="$1" pattern="$2" eval '[ "${str%$pattern}" != "$str" ]' } + +function strsplitf() { + [ $# -gt 0 ] || return 127 + local func count + func="$1"; shift + count=$# + if [ $count -gt 0 ]; then + eval 'set -- "${@:1:$(($count-1))}" '"${!count}" || return 126 + fi + "$func" "$@" +} +function strecho() { recho "$@"; } +function strqvals() { + qvals "$@" +} +function strqlines() { + local -a lines + _setax lines cat "$@" + qvals "${lines[@]}" +} +function strqarray() { + local __a __s="qvals" + for __a in "$@"; do __s="$__s \"\${$__a[@]}\""; done + eval "$__s" +} + +function evals() { + local __e_val __e_arg __e_r=0 + local __e_firstcmd __e_firstarg __e_splitf + local -a __e_cmd + + __e_firstcmd=1 + while [ $# -gt 0 ]; do + __e_cmd=() + __e_firstarg=1 # premier argument + __e_splitf= # premier argument après splitf + while [ $# -gt 0 ]; do + __e_arg="$1"; shift + [ "$__e_arg" == // ] && break + if [ "${__e_arg%//}" != "$__e_arg" ]; then + local __e_tmp="${__e_arg%//}" + if [ -z "${__e_tmp//\\/}" ]; then + __e_arg="${__e_arg#\\}" + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + continue + fi + fi + if [ -n "$__e_firstarg" ]; then + __e_cmd=("str$__e_arg") + __e_firstarg= + [ "$__e_arg" == "splitf" ] && __e_splitf=1 + elif [ -n "$__e_splitf" ]; then + __e_cmd=("${__e_cmd[@]}" "str$__e_arg") + __e_splitf= + else + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + fi + done + + if [ -n "$__e_firstcmd" ]; then + __e_val="$("${__e_cmd[@]}")" || __e_r=$? + else + __e_val="$("${__e_cmd[@]}" "$__e_val")" || __e_r=$? + fi + __e_firstcmd= + done + [ -n "$__e_val" ] && echo "$__e_val" + return $__e_r +} ##@inc]base.string ##@inc[base.num ## Fonctions de base: gestion des valeurs numériques @@ -620,6 +690,10 @@ function isrnum() { v="${v//[0-9]/}" [ -z "$v" ] } + +function evali() { + echo "$(($*))" +} ##@inc]base.num ##@inc[base.bool ## Fonctions de base: valeurs booléennes @@ -647,6 +721,10 @@ function isrnum() { v="${v//[0-9]/}" [ -z "$v" ] } + +function evali() { + echo "$(($*))" +} ##@inc]base.num uprovide base.bool urequire base.num @@ -887,18 +965,18 @@ function echo_() { } function recho() { if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo "$first$@" + echo -n - + echo "$first" "$@" else echo "$@" fi } function recho_() { if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo -n "$first$@" + echo -n - + echo -n "$first" "$@" else echo -n "$@" fi @@ -912,9 +990,10 @@ function _qval() { recho_ "$s" } function should_quote() { - local l="${#1}" + local s="$*" + local l="${#s}" [ $l -eq 0 -o $l -gt 80 ] && return 0 - local s="${*//[a-zA-Z0-9]/}" + s="${s//[a-zA-Z0-9]/}" s="${s//,/}" s="${s//./}" s="${s//+/}" @@ -1249,7 +1328,7 @@ function evalcmd() { } ##@inc]base.core ##@inc[base.string -## Fonctions de base: gestion des valeurs scalaires +## Fonctions de base: gestion des valeurs chaines scalaires uprovide base.string urequire base.core @@ -1406,6 +1485,75 @@ function endswith() { local str="$1" pattern="$2" eval '[ "${str%$pattern}" != "$str" ]' } + +function strsplitf() { + [ $# -gt 0 ] || return 127 + local func count + func="$1"; shift + count=$# + if [ $count -gt 0 ]; then + eval 'set -- "${@:1:$(($count-1))}" '"${!count}" || return 126 + fi + "$func" "$@" +} +function strecho() { recho "$@"; } +function strqvals() { + qvals "$@" +} +function strqlines() { + local -a lines + _setax lines cat "$@" + qvals "${lines[@]}" +} +function strqarray() { + local __a __s="qvals" + for __a in "$@"; do __s="$__s \"\${$__a[@]}\""; done + eval "$__s" +} + +function evals() { + local __e_val __e_arg __e_r=0 + local __e_firstcmd __e_firstarg __e_splitf + local -a __e_cmd + + __e_firstcmd=1 + while [ $# -gt 0 ]; do + __e_cmd=() + __e_firstarg=1 # premier argument + __e_splitf= # premier argument après splitf + while [ $# -gt 0 ]; do + __e_arg="$1"; shift + [ "$__e_arg" == // ] && break + if [ "${__e_arg%//}" != "$__e_arg" ]; then + local __e_tmp="${__e_arg%//}" + if [ -z "${__e_tmp//\\/}" ]; then + __e_arg="${__e_arg#\\}" + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + continue + fi + fi + if [ -n "$__e_firstarg" ]; then + __e_cmd=("str$__e_arg") + __e_firstarg= + [ "$__e_arg" == "splitf" ] && __e_splitf=1 + elif [ -n "$__e_splitf" ]; then + __e_cmd=("${__e_cmd[@]}" "str$__e_arg") + __e_splitf= + else + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + fi + done + + if [ -n "$__e_firstcmd" ]; then + __e_val="$("${__e_cmd[@]}")" || __e_r=$? + else + __e_val="$("${__e_cmd[@]}" "$__e_val")" || __e_r=$? + fi + __e_firstcmd= + done + [ -n "$__e_val" ] && echo "$__e_val" + return $__e_r +} ##@inc]base.string ##@inc[base.array ## Fonctions de base: gestion des tableaux @@ -1726,18 +1874,18 @@ function echo_() { } function recho() { if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo "$first$@" + echo -n - + echo "$first" "$@" else echo "$@" fi } function recho_() { if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo -n "$first$@" + echo -n - + echo -n "$first" "$@" else echo -n "$@" fi @@ -1751,9 +1899,10 @@ function _qval() { recho_ "$s" } function should_quote() { - local l="${#1}" + local s="$*" + local l="${#s}" [ $l -eq 0 -o $l -gt 80 ] && return 0 - local s="${*//[a-zA-Z0-9]/}" + s="${s//[a-zA-Z0-9]/}" s="${s//,/}" s="${s//./}" s="${s//+/}" @@ -2088,7 +2237,7 @@ function evalcmd() { } ##@inc]base.core ##@inc[base.string -## Fonctions de base: gestion des valeurs scalaires +## Fonctions de base: gestion des valeurs chaines scalaires uprovide base.string urequire base.core @@ -2245,6 +2394,75 @@ function endswith() { local str="$1" pattern="$2" eval '[ "${str%$pattern}" != "$str" ]' } + +function strsplitf() { + [ $# -gt 0 ] || return 127 + local func count + func="$1"; shift + count=$# + if [ $count -gt 0 ]; then + eval 'set -- "${@:1:$(($count-1))}" '"${!count}" || return 126 + fi + "$func" "$@" +} +function strecho() { recho "$@"; } +function strqvals() { + qvals "$@" +} +function strqlines() { + local -a lines + _setax lines cat "$@" + qvals "${lines[@]}" +} +function strqarray() { + local __a __s="qvals" + for __a in "$@"; do __s="$__s \"\${$__a[@]}\""; done + eval "$__s" +} + +function evals() { + local __e_val __e_arg __e_r=0 + local __e_firstcmd __e_firstarg __e_splitf + local -a __e_cmd + + __e_firstcmd=1 + while [ $# -gt 0 ]; do + __e_cmd=() + __e_firstarg=1 # premier argument + __e_splitf= # premier argument après splitf + while [ $# -gt 0 ]; do + __e_arg="$1"; shift + [ "$__e_arg" == // ] && break + if [ "${__e_arg%//}" != "$__e_arg" ]; then + local __e_tmp="${__e_arg%//}" + if [ -z "${__e_tmp//\\/}" ]; then + __e_arg="${__e_arg#\\}" + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + continue + fi + fi + if [ -n "$__e_firstarg" ]; then + __e_cmd=("str$__e_arg") + __e_firstarg= + [ "$__e_arg" == "splitf" ] && __e_splitf=1 + elif [ -n "$__e_splitf" ]; then + __e_cmd=("${__e_cmd[@]}" "str$__e_arg") + __e_splitf= + else + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + fi + done + + if [ -n "$__e_firstcmd" ]; then + __e_val="$("${__e_cmd[@]}")" || __e_r=$? + else + __e_val="$("${__e_cmd[@]}" "$__e_val")" || __e_r=$? + fi + __e_firstcmd= + done + [ -n "$__e_val" ] && echo "$__e_val" + return $__e_r +} ##@inc]base.string ##@inc[base.array ## Fonctions de base: gestion des tableaux @@ -2686,18 +2904,18 @@ function echo_() { } function recho() { if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo "$first$@" + echo -n - + echo "$first" "$@" else echo "$@" fi } function recho_() { if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo -n "$first$@" + echo -n - + echo -n "$first" "$@" else echo -n "$@" fi @@ -2711,9 +2929,10 @@ function _qval() { recho_ "$s" } function should_quote() { - local l="${#1}" + local s="$*" + local l="${#s}" [ $l -eq 0 -o $l -gt 80 ] && return 0 - local s="${*//[a-zA-Z0-9]/}" + s="${s//[a-zA-Z0-9]/}" s="${s//,/}" s="${s//./}" s="${s//+/}" @@ -3047,31 +3266,290 @@ function evalcmd() { "${args[@]}" } ##@inc]base.core -##@inc[base.num -## Fonctions de base: gestion des valeurs numériques -uprovide base.num +##@inc[base.quote +## Fonctions de base: protection de valeurs chaine +uprovide base.quote +urequire base.core -function isnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//[0-9]/}" - [ -z "$v" ] +function _qawk() { + local s="$*" + s="${s//\\/\\\\}" + s="${s//\"/\\\"}" + s="${s// +/\\n}" + recho_ "$s" } -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - [ -z "${1//[0-9]/}" ] +function qawk() { + echo -n \" + _qawk "$@" + echo \" } -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//./}" - v="${v//,/}" - v="${v//[0-9]/}" - [ -z "$v" ] +function qseds() { + local s="$*" + s="${s//\\/\\\\}" + s="${s//\//\\/}" + s="${s// +/\\n}" + recho "$s" } -##@inc]base.num +function _qform() { + local s="$*" + s="${s//\%/%25}" + s="${s//+/%2B}" + s="${s//&/%26}" + s="${s//=/%3D}" + s="${s// /+}" + recho_ "$s" +} +function qform() { + local s="$*" + if [[ "$s" == *=* ]]; then + _qform "${s%%=*}" + echo -n = + _qform "${s#*=}" + echo + else + _qform "$s" + echo + fi +} +function _qsql() { + local q="'" qq="''" + echo "${*//$q/$qq}" +} +function qsql() { + local q="'" qq="''" + echo "'${*//$q/$qq}'" +} +##@inc]base.quote +##@inc[base.string +## Fonctions de base: gestion des valeurs chaines scalaires +uprovide base.string +urequire base.core + + +function straddp() { + local p="$1"; shift + echo "$p$*" +} +function strdelp() { + local p="$1"; shift + local str="$*" + echo "${str#$p}" +} +function strdelp2() { + local p="$1"; shift + local str="$*" + echo "${str##$p}" +} +function stradds() { + local s="$1"; shift + echo "$*$s" +} +function strdels() { + local s="$1"; shift + local str="$*" + echo "${str%$s}" +} +function strdels2() { + local s="$1"; shift + local str="$*" + echo "${str%%$s}" +} +function strlower() { + local str="$*" + echo "${str,,}" +} +function strlower1() { + local str="$*" + echo "${str,}" +} +function strlowers() { + local str="$*" + echo "${*,}" +} +function strupper() { + local str="$*" + echo "${str^^}" +} +function strupper1() { + local str="$*" + echo "${str^}" +} +function struppers() { + echo "${*^}" +} +function strmid() { + local range="$1"; shift + local str="$*" + if [[ "$range" == *:-* ]]; then + local max=${#str} + [ $max -eq 0 ] && return + local start="${range%%:*}" + [ -n "$start" ] || start=0 + while [ "$start" -lt 0 ]; do + start=$(($max$start)) + done + max=$(($max-$start)) + local length="${range#*:}" + while [ "$length" -lt 0 ]; do + length=$(($max$length)) + done + range="$start:$length" + fi + eval 'echo "${str:'" $range"'}"' +} +function strrepl() { + local pattern="$1"; shift + local repl="$1"; shift + local str="$*" + local cmd='echo "${str/' + if [ "${pattern#/}" != "$pattern" ]; then + pattern="${pattern#/}" + cmd="$cmd/" + elif [ "${pattern#\#}" != "$pattern" ]; then + pattern="${pattern#\#}" + cmd="$cmd#" + elif [ "${pattern#%}" != "$pattern" ]; then + pattern="${pattern#%}" + cmd="$cmd%" + fi + cmd="$cmd"'$pattern/$repl}"' + eval "$cmd" +} + +function strops() { + local -a __s_tmp + local __s_value="$1"; shift + while [ $# -gt 0 ]; do + case "$1" in + :-*|:=*|:\?*|:+*) eval '__s_value="${'"${__s_value}$1"'}"';; + d|deref) __s_value="${!__s_value}";; + dc|dcount|ds|dsize) + __s_value="${__s_value}[@]" + __s_tmp=("${!__s_value}") + __s_value="${#__s_tmp[@]}" + ;; + \#*|%*|/*|:*|^*|,*) eval '__s_value="${__s_value'"$1"'}"';; + l|length) __s_value="${#__s_value}";; + =|==|!=|\<|\>|-eq|-ne|-lt|-le|-gt|-ge) + __s_tmp=(\[ "$__s_value" "$@" ]); "${__s_tmp[@]}"; return $?;; + -n|-z) __s_tmp=(\[ "$1" "$__s_value" ]); "${__s_tmp[@]}"; return $?;; + +#*) eval '__s_value="'"${1#+#}"'$__s_value"';; + -#*) eval '__s_value="${__s_value'"${1#-}"'}"';; + +%*) eval '__s_value="$__s_value"'"${1#+%}";; + +*) eval '__s_value="$__s_value"'"${1#+}";; + -%*) eval '__s_value="${__s_value'"${1#-}"'}"';; + -*) eval '__s_value="${__s_value%'"${1#-}"'}"';; + mid|strmid) eval '__s_value="$(strmid "$2" "$__s_value")"'; shift;; + repl|strrepl) eval '__s_value="$(strrepl "$2" "$3" "$__s_value")"'; shift; shift;; + *) echo 1>&2 "strops: unknown operator: $1";; + esac + shift + done + echo "$__s_value" +} + +function first_char() { + local str="$*" + echo "${str:0:1}" +} +function last_char() { + local str="$*" + echo "${str: -1:1}" +} +function first_chars() { + local str="$*" + recho "${str:0:$((${#1}-1))}" +} +function last_chars() { + local str="$*" + recho "${str:1}" +} +function first_char_is() { + [ "${1:0:1}" == "$2" ] +} +function last_char_is() { + [ "${1:$((-1)):1}" == "$2" ] +} +function beginswith() { + local str="$1" pattern="$2" + eval '[ "${str#$pattern}" != "$str" ]' +} +function endswith() { + local str="$1" pattern="$2" + eval '[ "${str%$pattern}" != "$str" ]' +} + +function strsplitf() { + [ $# -gt 0 ] || return 127 + local func count + func="$1"; shift + count=$# + if [ $count -gt 0 ]; then + eval 'set -- "${@:1:$(($count-1))}" '"${!count}" || return 126 + fi + "$func" "$@" +} +function strecho() { recho "$@"; } +function strqvals() { + qvals "$@" +} +function strqlines() { + local -a lines + _setax lines cat "$@" + qvals "${lines[@]}" +} +function strqarray() { + local __a __s="qvals" + for __a in "$@"; do __s="$__s \"\${$__a[@]}\""; done + eval "$__s" +} + +function evals() { + local __e_val __e_arg __e_r=0 + local __e_firstcmd __e_firstarg __e_splitf + local -a __e_cmd + + __e_firstcmd=1 + while [ $# -gt 0 ]; do + __e_cmd=() + __e_firstarg=1 # premier argument + __e_splitf= # premier argument après splitf + while [ $# -gt 0 ]; do + __e_arg="$1"; shift + [ "$__e_arg" == // ] && break + if [ "${__e_arg%//}" != "$__e_arg" ]; then + local __e_tmp="${__e_arg%//}" + if [ -z "${__e_tmp//\\/}" ]; then + __e_arg="${__e_arg#\\}" + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + continue + fi + fi + if [ -n "$__e_firstarg" ]; then + __e_cmd=("str$__e_arg") + __e_firstarg= + [ "$__e_arg" == "splitf" ] && __e_splitf=1 + elif [ -n "$__e_splitf" ]; then + __e_cmd=("${__e_cmd[@]}" "str$__e_arg") + __e_splitf= + else + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + fi + done + + if [ -n "$__e_firstcmd" ]; then + __e_val="$("${__e_cmd[@]}")" || __e_r=$? + else + __e_val="$("${__e_cmd[@]}" "$__e_val")" || __e_r=$? + fi + __e_firstcmd= + done + [ -n "$__e_val" ] && echo "$__e_val" + return $__e_r +} +##@inc]base.string ##@inc[base.bool ## Fonctions de base: valeurs booléennes ##@inc[base.num @@ -3098,6 +3576,10 @@ function isrnum() { v="${v//[0-9]/}" [ -z "$v" ] } + +function evali() { + echo "$(($*))" +} ##@inc]base.num uprovide base.bool urequire base.num @@ -3160,66 +3642,10 @@ function setxb() { setx "$__s_var" evalb "$@" } ##@inc]base.bool -##@inc[base.quote -## Fonctions de base: protection de valeurs chaine -uprovide base.quote -urequire base.core - -function _qawk() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s// -/\\n}" - recho_ "$s" -} -function qawk() { - echo -n \" - _qawk "$@" - echo \" -} -function qseds() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\//\\/}" - s="${s// -/\\n}" - recho "$s" -} -function _qform() { - local s="$*" - s="${s//\%/%25}" - s="${s//+/%2B}" - s="${s//&/%26}" - s="${s//=/%3D}" - s="${s// /+}" - recho_ "$s" -} -function qform() { - local s="$*" - if [[ "$s" == *=* ]]; then - _qform "${s%%=*}" - echo -n = - _qform "${s#*=}" - echo - else - _qform "$s" - echo - fi -} -function _qsql() { - local q="'" qq="''" - echo "${*//$q/$qq}" -} -function qsql() { - local q="'" qq="''" - echo "'${*//$q/$qq}'" -} -##@inc]base.quote uprovide base.compat -urequire base.core base.num base.bool base.quote +urequire base.core function setx2() { setxx "$@"; } function rawecho() { recho "$@"; } function rawecho_() { recho_ "$@"; } @@ -3230,6 +3656,7 @@ function set_var() { setv "$@"; } function set_var_cmd() { echo_setv "$@"; } function set_var_literal() { eval "$1=$2"; } +urequire base.quote function quote_awk() { _qawk "$@"; } function quoted_awk() { qawk "$@"; } function quote_seds() { qseds "$@"; } @@ -3238,6 +3665,7 @@ function quoted_form() { qform "$@"; } if [ -n "$BASH_VERSINFO" -a "${BASH_VERSINFO[0]}" -lt 4 ]; then + urequire base.string function strlower() { tr A-Z a-z <<<"$*"; } function strlower1() { local str="$*" @@ -3265,6 +3693,7 @@ if [ -n "$BASH_VERSINFO" -a "${BASH_VERSINFO[0]}" -lt 4 ]; then echo "${vs[*]}" } + urequire base.bool function is_yes() { case "$1" in o|oui|y|yes|v|vrai|t|true|on) return 0;; @@ -3302,15 +3731,15 @@ if [ -n "$UTOOLS_CHROOT" ]; then fi function setyesval() { - is_yes "$2" && set_var "$1" 1 || set_var "$1" "" + is_yes "$2" && _setv "$1" 1 || _setv "$1" "" } function normyesval() { - is_yes "${2:-"${!1}"}" && set_var "$1" 1 || set_var "$1" "" + is_yes "${2:-"${!1}"}" && _setv "$1" 1 || _setv "$1" "" } function normyesvals() { local __nyv_yesvar for __nyv_yesvar in "$@"; do - is_yes "${!__nyv_yesvar}" && set_var "$__nyv_yesvar" 1 || set_var "$__nyv_yesvar" "" + is_yes "${!__nyv_yesvar}" && _setv "$__nyv_yesvar" 1 || _setv "$__nyv_yesvar" "" done } function quote_in() { @@ -3333,7 +3762,7 @@ function quoted_sargs() { for a in "$@"; do s="${s:+$s }$(quoted_sarg "$a")" done - rawecho "$s" + recho "$s" } function set_array_cmd() { @@ -3348,7 +3777,7 @@ function set_array_cmd() { __sac_f=1 for __sac_v in "$@"; do [ -n "$__sac_f" ] && __sac_f= || __sac_s="$__sac_s " - __sac_s="$__sac_s$(quoted_arg "$__sac_v")" + __sac_s="$__sac_s$(qvalm "$__sac_v")" done __sac_s="$__sac_s)" echo "$__sac_s" @@ -3377,7 +3806,7 @@ function array_del() { local __ad_v local -a __ad_vs eval 'for __ad_v in "${'"$1"'[@]}"; do - if [ "$__ad_v" != '"$(quoted_arg "$2")"' ]; then + if [ "$__ad_v" != '"$(qval "$2")"' ]; then array_add __ad_vs "$__ad_v" fi done' @@ -3386,7 +3815,7 @@ done' function array_addu() { local __as_v eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then + if [ "$__as_v" == '"$(qval "$2")"' ]; then return 1 fi done' @@ -3399,7 +3828,7 @@ function array_set() { function array_insu() { local __as_v eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then + if [ "$__as_v" == '"$(qval "$2")"' ]; then return 1 fi done' @@ -3430,7 +3859,7 @@ function array_eq() { function array_contains() { local __ac_v eval 'for __ac_v in "${'"$1"'[@]}"; do - if [ "$__ac_v" == '"$(quoted_arg "$2")"' ]; then + if [ "$__ac_v" == '"$(qvalm "$2")"' ]; then return 0 fi done' @@ -3439,7 +3868,7 @@ done' function array_icontains() { local __ac_v eval 'for __ac_v in "${'"$1"'[@]}"; do - if [ "$(strlower "$__ac_v")" == '"$(strlower "$(quoted_arg "$2")")"' ]; then + if [ "$(strlower "$__ac_v")" == '"$(strlower "$(qval "$2")")"' ]; then return 0 fi done' @@ -3449,7 +3878,7 @@ function array_find() { local __af_i __af_v __af_i=0 eval 'for __af_v in "${'"$1"'[@]}"; do - if [ "$__af_v" == '"$(quoted_arg "$2")"' ]; then + if [ "$__af_v" == '"$(qval "$2")"' ]; then if [ -n "$3" ]; then echo "${'"$3"'[$__af_i]}" else @@ -3508,10 +3937,10 @@ function array_map() { array_copy "$__am_an" __am_vs } function first_value() { - eval "rawecho \"\${$1[@]:0:1}\"" + eval "recho \"\${$1[@]:0:1}\"" } function last_value() { - eval "rawecho \"\${$1[@]:\$((-1)):1}\"" + eval "recho \"\${$1[@]:\$((-1)):1}\"" } function array_copy() { eval "$1=(\"\${$2[@]}\")" @@ -3591,9 +4020,9 @@ function array_join() { __aj_j="${__aj_j:+$__aj_j'"$__aj_s"'}$__aj_pf$__aj_l$__aj_sf" done' if [ -n "$__aj_j" ]; then - rawecho "$__aj_j" + recho "$__aj_j" elif [ "$__aj_an" != "\$@" -a -n "$3" ]; then - rawecho "$3" + recho "$3" fi } function array_mapjoin() { @@ -3643,26 +4072,21 @@ function parse_date() { local value="$1" type="${2:-date}" local now="$(awk 'BEGIN { print mktime(strftime("%Y %m %d 00 00 00 +0400")) }')" case "$value" in - +*) - value="$(($now + ${value#+} * 86400))" - ;; - *) - value="$(<<<"$value" awk -F/ '{ - nd = strftime("%d"); nm = strftime("%m"); ny = strftime("%Y") - d = $1 + 0; if (d < 1) d = nd; - m = $2 + 0; if (m < 1) m = nm; - if ($3 == "") y = ny; - else { y = $3 + 0; if (y < 100) y = y + 2000; } - print mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d)); - }')" + +*) value="$(($now + ${value#+} * 86400))";; + *) value="$(<<<"$value" awk -F/ '{ + nd = strftime("%d"); nm = strftime("%m"); ny = strftime("%Y") + d = $1 + 0; if (d < 1) d = nd; + m = $2 + 0; if (m < 1) m = nm; + if ($3 == "") y = ny; + else { y = $3 + 0; if (y < 100) y = y + 2000; } + print mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d)); + }')";; esac case "$type" in d|date) awk '{ print strftime("%d/%m/%Y", $0 + 0) }' <<<"$value";; l|ldap) awk '{ print strftime("%Y%m%d%H%M%S+0400", $0 + 0) }' <<<"$value";; m|mysql) awk '{ print strftime("%Y-%m-%d", $0 + 0) }' <<<"$value";; - *) - rawecho "$value" - ;; + *) recho "$value";; esac } @@ -3713,7 +4137,7 @@ function normpath() { ap="$ap$part" fi done - rawecho "$ap" + recho "$ap" } function abspath() { local ap="$1" @@ -3771,7 +4195,7 @@ function ppath() { [ "$cwd" != "/" -a "$cwd" != "$HOME" ] && path="${path#$cwd/}" [ "${path#$HOME/}" != "$path" ] && path="~${path#$HOME}" - rawecho "$path" + recho "$path" } function relpath() { local p="$(abspath "$1" "$3")" cwd="$2" @@ -3783,7 +4207,7 @@ function relpath() { if [ "$p" == "$cwd" ]; then echo "" elif [ "${p#$cwd/}" != "$p" ]; then - rawecho "${p#$cwd/}" + recho "${p#$cwd/}" else local rp while [ -n "$cwd" -a "${p#$cwd/}" == "$p" ]; do @@ -3851,8 +4275,8 @@ function splitwcs() { fi done [ "${__sw_p#/}" != "$__sw_p" ] && __sw_d="/$__sw_d" - set_var "$__sw_dd" "$__sw_d" - set_var "$__sw_df" "$__sw_f" + _setv "$__sw_dd" "$__sw_d" + _setv "$__sw_df" "$__sw_f" } function deref() { local OENC="$UTF8" @@ -3907,9 +4331,9 @@ function path_if_test() { local basedir="$1" if [ $op "$basedir/$file" ]; then if [ -n "$rel" ]; then - rawecho "$reldir$file" + recho "$reldir$file" else - rawecho "$basedir/$file" + recho "$basedir/$file" fi break fi @@ -4299,7 +4723,7 @@ function list_all() { cd "$b" 2>/dev/null || return eval "$(__la_cmd "$@")" | while read f; do [ "$f" == "." -o "$f" == ".." ] && continue - rawecho "$f" + recho "$f" done cd "$curdir" } @@ -4321,7 +4745,7 @@ function list_files() { cd "$b" 2>/dev/null || return eval "$(__la_cmd "$@")" | while read f; do - [ -f "$f" ] && rawecho "$f" + [ -f "$f" ] && recho "$f" done cd "$curdir" } @@ -4333,7 +4757,7 @@ function list_dirs() { cd "$b" 2>/dev/null || return eval "$(__la_cmd "$@")" | while read f; do [ "$f" == "." -o "$f" == ".." ] && continue - [ -d "$f" ] && rawecho "$f" + [ -d "$f" ] && recho "$f" done cd "$curdir" } @@ -4519,10 +4943,10 @@ function runscript_as() { local cmd cmd="\ -__estack=$(quoted_arg "$__estack") -__tlevel=$(quoted_args "$__tlevel") +__estack=$(qval "$__estack") +__tlevel=$(qval "$__tlevel") export __estack __tlevel -exec ${BASH:-/bin/sh} $(quoted_args "$@")" +exec ${BASH:-/bin/sh} $(qvals "$@")" if is_yes "$UTOOLS_USES_SU" || ! progexists sudo; then eecho "Entrez le mot de passe de root" @@ -4642,8 +5066,8 @@ En l'occurence, ce script est accédé par le chemin $script et ce chemin doit e estep "Lancement de la commande sur l'hôte distant $user@$host" local cmd - [ -n "$path" ] && cmd="$(quoted_args cd "$path"); " - cmd="$cmd$(quoted_args "$script" "$@")" + [ -n "$path" ] && cmd="$(qvals cd "$path"); " + cmd="$cmd$(qvals "$script" "$@")" ssh -qt "${UTOOLS_ENSURE_HOSTNAME_SSH_OPTS[@]}" "$user@$host" "$cmd" [ $? -eq 255 ] && return 12 return 1 @@ -5274,13 +5698,13 @@ function awkdef() { [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break __ad_value="${1:$__ad_vpos}" if [ -n "$__ad_int" ]; then - echo "$__ad_name = int($(quoted_awk "$__ad_value") + 0)" + echo "$__ad_name = int($(qawk "$__ad_value") + 0)" elif [ -n "$__ad_str" ]; then - echo "$__ad_name = $(quoted_awk "$__ad_value")" + echo "$__ad_name = $(qawk "$__ad_value")" elif [ ${#__ad_value} -lt 256 ] && isnum "$__ad_value"; then echo "$__ad_name = $__ad_value" else - echo "$__ad_name = $(quoted_awk "$__ad_value")" + echo "$__ad_name = $(qawk "$__ad_value")" fi else break @@ -5295,7 +5719,7 @@ function awkdef() { local __ad_i=1 echo "$__ad_name[0] = 0; delete $__ad_name" for __ad_arg in "${!__ad_value}"; do - echo "$__ad_name[$__ad_i]=$(quoted_awk "$__ad_arg")" + echo "$__ad_name[$__ad_i]=$(qawk "$__ad_arg")" __ad_i=$(($__ad_i + 1)) done eval "echo \"\${__ad_name}_count = \${#$__ad_value}\"" @@ -5304,7 +5728,7 @@ function awkdef() { done echo "}" for __ad_arg in "$@"; do - rawecho "$__ad_arg" + recho "$__ad_arg" done fi @@ -5635,7 +6059,7 @@ __init_encoding function tooenc() { local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" if [ "$from" == "$to" ]; then - rawecho "$src" + recho "$src" else iconv -f "$from" -t "$to" <<<"$src" fi @@ -5646,9 +6070,9 @@ function uecho() { function tooenc_() { local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" if [ "$from" == "$to" ]; then - rawecho_ "$src" + recho_ "$src" else - rawecho_ "$src" | iconv -f "$from" -t "$to" + recho_ "$src" | iconv -f "$from" -t "$to" fi } function uecho_() { @@ -5657,7 +6081,7 @@ function uecho_() { function toienc() { local __tie_var="$1" __tie_to="${2:-$IENC}" __tie_from="${3:-$UTOOLS_INPUT_ENCODING}" if [ "$__tie_from" != "$__tie_to" ]; then - set_var "$__tie_var" "$(iconv -f "$__tie_from" -t "$__tie_to" <<<"${!__tie_var}")" + _setv "$__tie_var" "$(iconv -f "$__tie_from" -t "$__tie_to" <<<"${!__tie_var}")" fi } function uread() { @@ -5721,7 +6145,7 @@ function __indent() { /}" != "$1" ]; then sed "2,\$s/^/${__tlevel}/g" <<<"$1" else - rawecho "$1" + recho "$1" fi } function __eerror() { tooenc "$(__edate)${__tlevel}ERROR $(__indent "$1")"; } @@ -5804,7 +6228,7 @@ function is_interaction() { function get_interaction_option() { :;} __epending= function eflush() { - if [ -n "$__epending" ]; then rawecho "$__epending" 1>&2; __epending=; fi + if [ -n "$__epending" ]; then recho "$__epending" 1>&2; __epending=; fi } function eclearp() { __epending= @@ -5840,7 +6264,7 @@ function edebug() { show_debug || return; eflush; __edebug "$*" 1>&2 } function trace() { - local r cmd="$(quoted_args "$@")" + local r cmd="$(qvals "$@")" show_info && { eflush; __eecho "\$ $cmd" 1>&2; } "$@"; r=$? if [ $r -ne 0 ]; then @@ -5856,7 +6280,7 @@ function trace_error() { local r "$@"; r=$? if [ $r -ne 0 ]; then - local cmd="$(quoted_args "$@")" + local cmd="$(qvals "$@")" show_error && { eflush; __eecho "^ $cmd [EC #$r]" 1>&2; } fi return $r @@ -6181,7 +6605,7 @@ function __rv_read() { OENC="$UTF8" eerror "La valeur par défaut de $__rv_v doit être non vide" return 1 fi - set_var "$__rv_v" "$__rv_d" + _setv "$__rv_v" "$__rv_d" return 0 fi @@ -6210,7 +6634,7 @@ function __rv_read() { fi __rv_r="${__rv_r:-$__rv_d}" if [ -n "$__rv_r" ] || ! is_yes "$__rv_re"; then - set_var "$__rv_v" "$__rv_r" + _setv "$__rv_v" "$__rv_r" return 0 fi done @@ -6276,7 +6700,7 @@ function simple_menu() { __sm_c=0 fi done - set_var "$__sm_option_var" "$__sm_option" + _setv "$__sm_option_var" "$__sm_option" } function actions_menu() { @@ -6303,8 +6727,8 @@ function actions_menu() { eerror_unless [ ${#__am_action_descs[*]} -gt 0 ] "Vous devez spécifier le tableau des actions" || return __actions_menu || return 1 - setv "${1:-action}" "$__am_select_action" - setv "${2:-option}" "$__am_select_option" + _setv "${1:-action}" "$__am_select_action" + _setv "${2:-option}" "$__am_select_option" } function __actions_menu() { local title="$__am_title" @@ -6563,12 +6987,12 @@ function ac_set_tmpfile() { fi fi if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" + _setv "$1" "$3" [ -f "$3" -a "$4" == keep ] || >"$3" else local __acst_t="$(mktempf "$2")" autoclean "$__acst_t" - set_var "$1" "$__acst_t" + _setv "$1" "$__acst_t" fi } function ac_set_tmpdir() { @@ -6581,12 +7005,12 @@ function ac_set_tmpdir() { fi fi if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" + _setv "$1" "$3" mkdir -p "$3" else local __acst_t="$(mktempd "$2")" autoclean "$__acst_t" - set_var "$1" "$__acst_t" + _setv "$1" "$__acst_t" fi } function debug_tee() { @@ -6663,9 +7087,9 @@ urequire base SYSNAMES=(linux linux64 linux32 linuxppc64 linuxppc32 linuxarm macosx) -linux_SYSDISTS=(debianlike debian ubuntu redhatlike rhel fedora centos suse gentoo) -linux32_SYSDISTS=(debianlike debian ubuntu redhatlike rhel fedora centos suse gentoo) -linux64_SYSDISTS=(debianlike debian ubuntu redhatlike rhel fedora centos suse gentoo) +linux_SYSDISTS=(debianlike debian ubuntu redhatlike ol rhel fedora centos suse gentoo) +linux32_SYSDISTS=(debianlike debian ubuntu redhatlike ol rhel fedora centos suse gentoo) +linux64_SYSDISTS=(debianlike debian ubuntu redhatlike ol rhel fedora centos suse gentoo) linuxppc32_SYSDISTS=(debianlike debian ubuntu redhatlike fedora) linuxppc64_SYSDISTS=(debianlike debian ubuntu redhatlike fedora) linuxarm_SYSDISTS=(debianlike debian ubuntu) @@ -6677,6 +7101,7 @@ debianlike_SYSVERS=() debian_SYSVERS=(stretch jessie wheezy squeeze lenny etch) ubuntu_SYSVERS=(oneiric natty maverick lucid karmic jaunty intrepid hardy) redhatlike_SYSVERS=() +ol_SYSVERS=(ol7 ol6 redhat7 redhat6) rhel_SYSVERS=(rhel7 rhel6 rhel5 rhel4 redhat7 redhat6 redhat5 redhat4) fedora_SYSVERS=(fedora14 fedora13 fedora12 fedora11) centos_SYSVERS=(centos7 centos6 centos5 centos4 redhat7 redhat6 redhat5 redhat4) @@ -6714,6 +7139,7 @@ function __compute_local_sysinfos_data() { "$UNAME_MACHINE" "$([ -f /etc/debian_version ] && cat /etc/debian_version)" "$([ -f /etc/gentoo-release ] && cat /etc/gentoo-release)" + "$([ -f /etc/oracle-release ] && cat /etc/oracle-release)" "$([ -f /etc/redhat-release ] && cat /etc/redhat-release)" "$([ -f /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Resources/version.plist ] && cat /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Resources/version.plist)" "$([ -f /System/Library/Frameworks/CoreServices.framework/Resources/version.plist ] && cat /System/Library/Frameworks/CoreServices.framework/Resources/version.plist)" @@ -6729,6 +7155,8 @@ echo .----------------. echo .----------------. [ -f /etc/gentoo-release ] && cat /etc/gentoo-release echo .----------------. +[ -f /etc/oracle-release ] && cat /etc/oracle-release +echo .----------------. [ -f /etc/redhat-release ] && cat /etc/redhat-release echo .----------------. [ -f /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Resources/version.plist ] && cat /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Resources/version.plist @@ -6767,10 +7195,14 @@ function __compute_sysinfos() { local machine="${SYSINFOS_DATA[1]}" local debian_version="${SYSINFOS_DATA[2]}" local gentoo_release="${SYSINFOS_DATA[3]}" - local redhat_release="${SYSINFOS_DATA[4]}" - local macosx_plist1="${SYSINFOS_DATA[5]}" - local macosx_plist2="${SYSINFOS_DATA[6]}" + local oracle_release="${SYSINFOS_DATA[4]}" + local redhat_release="${SYSINFOS_DATA[5]}" + local macosx_plist1="${SYSINFOS_DATA[6]}" + local macosx_plist2="${SYSINFOS_DATA[7]}" + MYSYSNAME=(unknown) + MYSYSDIST=(unknown) + MYSYSVER=(unknown) if [ "$system" == "Linux" ]; then case "$machine" in x86_64) MYSYSNAME=(linux64 linux); MYBITS=64;; @@ -6792,6 +7224,12 @@ function __compute_sysinfos() { esac elif [ -n "$gentoo_release" ]; then MYSYSDIST=(gentoo) + elif [ -n "$oracle_release" ]; then + MYSYSDIST=(ol rhel redhatlike) + case "$oracle_release" in + Oracle*Linux*release\ 7*) MYSYSVER=(ol7 rhel7 redhat7);; + Oracle*Linux*release\ 6*) MYSYSVER=(ol6 rhel6 redhat6);; + esac elif [ -n "$redhat_release" ]; then case "$redhat_release" in Fedora*) MYSYSDIST=(fedora redhatlike);; @@ -6825,13 +7263,14 @@ s/<\/string>.*$//g' done } MYSYSNAME=(macosx darwin) - case "$(get_macosx_version)" in + case "$(get_macosx_version "$macosx_plist1" "$macosx_plist2")" in 10.7*) MYSYSDIST=(lion);; 10.6*) MYSYSDIST=(snowleopard);; 10.5*) MYSYSDIST=(leopard);; 10.4*) MYSYSDIST=(tiger);; 10.3*) MYSYSDIST=(panther);; esac + MYSYSVER=() fi } @@ -6900,8 +7339,8 @@ function __fix_sysinfos_upward() { array_copy sysvers_ "${sysdist_}_SYSVERS" for sysver_ in "${sysvers_[@]}"; do if [ "$sysver_" == "${!sysvervar_}" ]; then - set_var "$sysdistvar_" "$sysdist_" - set_var "$sysnamevar_" "$sysname_" + _setv "$sysdistvar_" "$sysdist_" + _setv "$sysnamevar_" "$sysname_" return fi done @@ -6913,7 +7352,7 @@ function __fix_sysinfos_upward() { array_copy sysdists_ "${sysname_}_SYSDISTS" for sysdist_ in "${sysdists_[@]}"; do if [ "$sysdist_" == "${!sysdistvar_}" ]; then - set_var "$sysnamevar_" "$sysname_" + _setv "$sysnamevar_" "$sysname_" return fi done @@ -6928,7 +7367,7 @@ function __fix_sysinfos_downward() { if [ -z "${!sysdistvar_}" ]; then array_copy sysdists_ "${!sysnamevar_}_SYSDISTS" for sysdist_ in "${sysdists_[@]}"; do - set_var "$sysdistvar_" "$sysdist_" + _setv "$sysdistvar_" "$sysdist_" break done fi @@ -6937,7 +7376,7 @@ function __fix_sysinfos_downward() { if [ -z "${!sysvervar_}" ]; then array_copy sysvers_ "${sysdistvar_}_SYSVERS" for sysver_ in "${sysvers_[@]}"; do - set_var "$sysvervar_" "$sysver_" + _setv "$sysvervar_" "$sysver_" break done fi @@ -6946,12 +7385,23 @@ function ensure_sysinfos() { local sysnamevar_="${1:-SYSNAME}" local sysdistvar_="${2:-SYSDIST}" local sysvervar_="${3:-SYSVER}" - [ -n "${!sysdistvar_}" ] && set_var "$sysdistvar_" "$(__get_sysdist_alias "${!sysdistvar_}")" - [ -n "${!sysvervar_}" ] && set_var "$sysvervar_" "$(__get_sysver_alias "${!sysvervar_}")" + [ -n "${!sysdistvar_}" ] && _setv "$sysdistvar_" "$(__get_sysdist_alias "${!sysdistvar_}")" + [ -n "${!sysvervar_}" ] && _setv "$sysvervar_" "$(__get_sysver_alias "${!sysvervar_}")" __fix_sysinfos_upward __fix_sysinfos_downward } +function dump_sysinfos() { + local sysname_="${1:-MYSYSNAME}[*]" + local sysdist_="${2:-MYSYSDIST}[*]" + local sysver_="${3:-MYSYSVER}[*]" + echo "\ +sysname=(${!sysname_}) +sysdist=(${!sysdist_}) +sysver=(${!sysver_}) +bits=$MYBITS" +} + function get_sysinfos_desc() { local sysname_="${1:-MYSYSNAME}"; sysname_="${!sysname_}" local sysdist_="${2:-MYSYSDIST}"; sysdist_="${!sysdist_}" @@ -7087,6 +7537,24 @@ function check_sysinfos() { return $r_ } +function unsupported_system() { + local msg="Ce script n'est pas supporté sur $(get_sysinfos_desc)" + [ -n "$*" ] && msg="$msg +Il faut au moins l'un des systèmes suivants: $*" + die "$msg" +} + +function require_sysinfos() { + check_sysinfos "$@" && return 0 + local -a infos; local info + for info in "$@"; do + if ! [[ "$info" == -* ]]; then + infos=("${infos[@]}" "$info") + fi + done + unsupported_system "${infos[@]}" +} + function on_debian() { NUTOOLS_ON_DEBIAN= if check_sysinfos -d debian; then @@ -7371,7 +7839,7 @@ if check_sysinfos -s macosx; then done args=("${args[@]}" "$@") fi - quoted_args "${options[@]}" -- "${args[@]}" + qvals "${options[@]}" -- "${args[@]}" return 0 } diff --git a/lib/ulib/sysinfos b/lib/ulib/sysinfos index c19c746..1b7c707 100644 --- a/lib/ulib/sysinfos +++ b/lib/ulib/sysinfos @@ -270,8 +270,8 @@ function __fix_sysinfos_upward() { array_copy sysvers_ "${sysdist_}_SYSVERS" for sysver_ in "${sysvers_[@]}"; do if [ "$sysver_" == "${!sysvervar_}" ]; then - set_var "$sysdistvar_" "$sysdist_" - set_var "$sysnamevar_" "$sysname_" + _setv "$sysdistvar_" "$sysdist_" + _setv "$sysnamevar_" "$sysname_" return fi done @@ -284,7 +284,7 @@ function __fix_sysinfos_upward() { array_copy sysdists_ "${sysname_}_SYSDISTS" for sysdist_ in "${sysdists_[@]}"; do if [ "$sysdist_" == "${!sysdistvar_}" ]; then - set_var "$sysnamevar_" "$sysname_" + _setv "$sysnamevar_" "$sysname_" return fi done @@ -301,7 +301,7 @@ function __fix_sysinfos_downward() { # essayer de déterminer !sysdistvar_ à partir de !sysnamevar_ array_copy sysdists_ "${!sysnamevar_}_SYSDISTS" for sysdist_ in "${sysdists_[@]}"; do - set_var "$sysdistvar_" "$sysdist_" + _setv "$sysdistvar_" "$sysdist_" break done fi @@ -311,7 +311,7 @@ function __fix_sysinfos_downward() { # essayer de déterminer !sysvervar_ à partir de !sysdistvar_ array_copy sysvers_ "${sysdistvar_}_SYSVERS" for sysver_ in "${sysvers_[@]}"; do - set_var "$sysvervar_" "$sysver_" + _setv "$sysvervar_" "$sysver_" break done fi @@ -325,8 +325,8 @@ function ensure_sysinfos() { local sysnamevar_="${1:-SYSNAME}" local sysdistvar_="${2:-SYSDIST}" local sysvervar_="${3:-SYSVER}" - [ -n "${!sysdistvar_}" ] && set_var "$sysdistvar_" "$(__get_sysdist_alias "${!sysdistvar_}")" - [ -n "${!sysvervar_}" ] && set_var "$sysvervar_" "$(__get_sysver_alias "${!sysvervar_}")" + [ -n "${!sysdistvar_}" ] && _setv "$sysdistvar_" "$(__get_sysdist_alias "${!sysdistvar_}")" + [ -n "${!sysvervar_}" ] && _setv "$sysvervar_" "$(__get_sysver_alias "${!sysvervar_}")" __fix_sysinfos_upward __fix_sysinfos_downward } diff --git a/lib/ulib/udir b/lib/ulib/udir index a7caa3a..7e57927 100644 --- a/lib/ulib/udir +++ b/lib/ulib/udir @@ -35,8 +35,8 @@ function udir_dump() { local udirf="$(abspath "${1:-.}")" [ -d "$udirf" ] && udirf="$udirf/.udir" if [ -f "$udirf" ]; then - set_var_cmd udir "$(dirname "$udirf")" - set_var_cmd udirf "$udirf" + echo_setv udir "$(dirname "$udirf")" + echo_setv udirf "$udirf" <"$udirf" filter_comment -m fi } @@ -140,11 +140,11 @@ function udir_update() { for param in "$@"; do name="${param%%=*}" script="$script - names[$i] = $(quoted_awk "$name")" + names[$i] = $(qawk "$name")" if [ "$name" != "$param" ]; then value="${param#*=}" script="$script - values[$i] = $(quoted_awk "$value")" + values[$i] = $(qawk "$value")" else script="$script values[$i] = \"\"" diff --git a/lib/ulib/uinst b/lib/ulib/uinst index 26e1027..6ea23f7 100644 --- a/lib/ulib/uinst +++ b/lib/ulib/uinst @@ -290,7 +290,7 @@ Utilisez 'udir -e $(ppath "$srcdir")' pour modifier les paramètres qui ont ét __uinst_migrate_legacy "$srcdir" __uinst_varcmds=() for __uinst_v in "${UDIR_VARS[@]}"; do - __uinst_varcmds=("${__uinst_varcmds[@]}" "$(set_var_cmd "$__uinst_v" "${!__uinst_v}")") + __uinst_varcmds=("${__uinst_varcmds[@]}" "$(echo_setv "$__uinst_v" "${!__uinst_v}")") done for __uinst_a in "${UDIR_ARRAYS[@]}"; do __uinst_varcmds=("${__uinst_varcmds[@]}" "$(set_array_cmd "$__uinst_a")") @@ -310,7 +310,7 @@ Utilisez 'udir -e $(ppath "$srcdir")' pour modifier les paramètres qui ont ét local udir_desc udir_note udir_types local profiles conf rootconf ulibsync copy_files - eval "$(udir_eval "$srcdir" 'set_var_cmd udir_desc "$udir_desc"; set_var_cmd udir_note "$udir_note"')" + eval "$(udir_eval "$srcdir" 'echo_setv udir_desc "$udir_desc"; echo_setv udir_note "$udir_note"')" etitle "Description du projet" check_interaction -c && estepn "La description courte de l'objet de ce projet est affichée avec udir -i" @@ -319,7 +319,7 @@ Utilisez 'udir -e $(ppath "$srcdir")' pour modifier les paramètres qui ont ét Elle peut être utilisée pour diriger le visiteur vers des informations importantes." read_value "Entrez une note associée au répertoire de ce projet" udir_note "$udir_note" N eend - udir_update "$srcdir" "udir_desc=$(quoted_arg "$udir_desc")" "udir_note=$(quoted_arg "$udir_note")" + udir_update "$srcdir" "udir_desc=$(qval "$udir_desc")" "udir_note=$(qval "$udir_note")" estepn "La configuration par défaut permet de créer un projet qui utilise les outils et librairies de nutools. Ce projet pourra ensuite être installé avec uinst" @@ -351,7 +351,7 @@ Ce projet pourra ensuite être installé avec uinst" mkdirof "$genfile" [ -f "$genfile" ] || echo '# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 __uaddpath "@@dest@@" PATH' >"$genfile" - udir_update "$srcdir" "configure_dest_for=($(quoted_arg "${genfile#"$srcdir/"}"))" + udir_update "$srcdir" "configure_dest_for=($(qvalm "${genfile#"$srcdir/"}"))" fi if [ -n "$conf" ]; then genfile="$srcdir/lib/uinst/conf" @@ -525,12 +525,12 @@ function __uinst_addvarnf() { eerror "La variable $1 est protégée" return 1 else - array_add UINST_CONFIG_VARCMDS "$(set_var_cmd "$1" "$2")" - set_var "$1" "$2" + array_add UINST_CONFIG_VARCMDS "$(echo_setv "$1" "$2")" + _setv "$1" "$2" if [ "$1" == "MYHOST" ]; then # cas particulier: initialiser aussi MYHOSTNAME - set_var "MYHOSTNAME" "${2%%.*}" - array_add UINST_CONFIG_VARCMDS "$(set_var_cmd "MYHOSTNAME" "$MYHOSTNAME")" + _setv "MYHOSTNAME" "${2%%.*}" + array_add UINST_CONFIG_VARCMDS "$(echo_setv "MYHOSTNAME" "$MYHOSTNAME")" fi return 0 fi @@ -683,7 +683,7 @@ function __uinst_prepare_conf() { # prepare_name=$srcdir # srcdir est un chemin relatif à $UINST_PREPARE_DIR (si la source était une # archive, il est possible que ce chemin soit en plusieurs parties - set_var_cmd prepare_name "$(relpath "$srcdir" "$UINST_PREPARE_DIR")" >"$UINST_PREPARE_CONF" + echo_setv prepare_name "$(relpath "$srcdir" "$UINST_PREPARE_DIR")" >"$UINST_PREPARE_CONF" } ################################################################################ @@ -796,28 +796,28 @@ function __uinst_udir2s() { __uinst_config="$__uinst_configdir/config" __uinst_abort="$__uinst_configdir/abort" __uinst_updateconfig="$__uinst_configdir/updateconfig" - set_var_cmd ABORT "$__uinst_abort" >>"$__uinst_config" - set_var_cmd CONFIG "$__uinst_updateconfig" >>"$__uinst_config" - set_var_cmd __verbosity "$__verbosity" >>"$__uinst_config" - set_var_cmd __interaction "$__interaction" >>"$__uinst_config" + echo_setv ABORT "$__uinst_abort" >>"$__uinst_config" + echo_setv CONFIG "$__uinst_updateconfig" >>"$__uinst_config" + echo_setv __verbosity "$__verbosity" >>"$__uinst_config" + echo_setv __interaction "$__interaction" >>"$__uinst_config" for __uinst_var in "${__uinst_vars[@]}"; do - set_var_cmd "$__uinst_var" "${!__uinst_var}" >>"$__uinst_config" + echo_setv "$__uinst_var" "${!__uinst_var}" >>"$__uinst_config" done for __uinst_var in "${__uinst_arrays[@]}"; do set_array_cmd "$__uinst_var" >>"$__uinst_config" done - set_var_cmd "UINST_LOCAL_PROFILES" "$UINST_LOCAL_PROFILES" >>"$__uinst_config" - set_var_cmd "UINST_ISTMPDIR" "$UINST_ISTMPDIR" >>"$__uinst_config" - set_var_cmd "UINST_ORIGSRC" "$UINST_ORIGSRC" >>"$__uinst_config" - set_var_cmd "UINST_SRCDIR" "$UINST_SRCDIR" >>"$__uinst_config" - set_var_cmd "ULIBDIR" "$ULIBDIR" >>"$__uinst_config" - set_var_cmd "UINST" "$UINST" >>"$__uinst_config" + echo_setv "UINST_LOCAL_PROFILES" "$UINST_LOCAL_PROFILES" >>"$__uinst_config" + echo_setv "UINST_ISTMPDIR" "$UINST_ISTMPDIR" >>"$__uinst_config" + echo_setv "UINST_ORIGSRC" "$UINST_ORIGSRC" >>"$__uinst_config" + echo_setv "UINST_SRCDIR" "$UINST_SRCDIR" >>"$__uinst_config" + echo_setv "ULIBDIR" "$ULIBDIR" >>"$__uinst_config" + echo_setv "UINST" "$UINST" >>"$__uinst_config" # ulib recalcule systématiquement la valeur de ULIBDIR. Pareil pour # 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" - set_var_cmd "FORCED_PYULIBDIR" "$PYULIBDIR" >>"$__uinst_config" + echo_setv "FORCED_ULIBDIR" "$ULIBDIR" >>"$__uinst_config" + echo_setv "FORCED_PYULIBDIR" "$PYULIBDIR" >>"$__uinst_config" ## Lancer les scripts de préconfiguration function __uinst_preconfig_scripts() { @@ -1241,13 +1241,13 @@ function __uinst_python() { local __uinst_config __uinst_var ac_set_tmpfile __uinst_config for __uinst_var in srcdir; do - set_var_cmd "$__uinst_var" "${!__uinst_var}" >>"$__uinst_config" + echo_setv "$__uinst_var" "${!__uinst_var}" >>"$__uinst_config" done - set_var_cmd "UINST_ISTMPDIR" "$UINST_ISTMPDIR" >>"$__uinst_config" - set_var_cmd "UINST_ORIGSRC" "$UINST_ORIGSRC" >>"$__uinst_config" - set_var_cmd "UINST_SRCDIR" "$UINST_SRCDIR" >>"$__uinst_config" - set_var_cmd "ULIBDIR" "$ULIBDIR" >>"$__uinst_config" - set_var_cmd "UINST" "$UINST" >>"$__uinst_config" + echo_setv "UINST_ISTMPDIR" "$UINST_ISTMPDIR" >>"$__uinst_config" + echo_setv "UINST_ORIGSRC" "$UINST_ORIGSRC" >>"$__uinst_config" + echo_setv "UINST_SRCDIR" "$UINST_SRCDIR" >>"$__uinst_config" + echo_setv "ULIBDIR" "$ULIBDIR" >>"$__uinst_config" + echo_setv "UINST" "$UINST" >>"$__uinst_config" runscript_as_root "$uinst2s" "$__uinst_config" } @@ -1354,16 +1354,16 @@ function __uinst_file() { local __uinst_config __uinst_var ac_set_tmpfile __uinst_config for __uinst_var in copy_files destdir srcdir owner modes; do - set_var_cmd "$__uinst_var" "${!__uinst_var}" >>"$__uinst_config" + echo_setv "$__uinst_var" "${!__uinst_var}" >>"$__uinst_config" done for __uinst_var in files modes; do set_array_cmd "$__uinst_var" >>"$__uinst_config" done - set_var_cmd "UINST_ISTMPDIR" "$UINST_ISTMPDIR" >>"$__uinst_config" - set_var_cmd "UINST_ORIGSRC" "$UINST_ORIGSRC" >>"$__uinst_config" - set_var_cmd "UINST_SRCDIR" "$UINST_SRCDIR" >>"$__uinst_config" - set_var_cmd "ULIBDIR" "$ULIBDIR" >>"$__uinst_config" - set_var_cmd "UINST" "$UINST" >>"$__uinst_config" + echo_setv "UINST_ISTMPDIR" "$UINST_ISTMPDIR" >>"$__uinst_config" + echo_setv "UINST_ORIGSRC" "$UINST_ORIGSRC" >>"$__uinst_config" + echo_setv "UINST_SRCDIR" "$UINST_SRCDIR" >>"$__uinst_config" + echo_setv "ULIBDIR" "$ULIBDIR" >>"$__uinst_config" + echo_setv "UINST" "$UINST" >>"$__uinst_config" runscript_as_root "$uinst2s" "$__uinst_config" } diff --git a/lib/ulib/webobjects b/lib/ulib/webobjects index d887e68..c091162 100644 --- a/lib/ulib/webobjects +++ b/lib/ulib/webobjects @@ -177,8 +177,8 @@ function read_infofile() { # Retourner 1 si un erreur s'est produite, par exemple si le fichier $1 # n'existe pas ou n'est pas accessible en lecture [ -f "$1" -a -r "$1" ] || return 1 - set_var "${2:-version}" "$(grep -A 1 CFBundleShortVersionString "$1" | tail -1 | sed 's/^.*\(.*\)<\/string>.*$/\1/')" - set_var "${3:-release}" "$(grep -A 1 CFBundleVersion "$1" | tail -1 | sed 's/^.*\(.*\)<\/string>.*$/\1/')" + _setv "${2:-version}" "$(grep -A 1 CFBundleShortVersionString "$1" | tail -1 | sed 's/^.*\(.*\)<\/string>.*$/\1/')" + _setv "${3:-release}" "$(grep -A 1 CFBundleVersion "$1" | tail -1 | sed 's/^.*\(.*\)<\/string>.*$/\1/')" } function write_infofile() { @@ -525,7 +525,7 @@ function woraurl() { 5*) _status=3;; *) _status=11;; esac - set_var "${4:-http_code}" "$_http_code" + _setv "${4:-http_code}" "$_http_code" return $_status } function wogeturl() { woraurl GET "$@"; } @@ -540,28 +540,28 @@ function splitins() { # Si $1==App, type=app et name=App # si $1==App-N, type=ins et name=App-N if [ -z "$1" ]; then - set_var "${2:-type}" all - set_var "${3:-name}" + _setv "${2:-type}" all + _setv "${3:-name}" elif [ "${1%.woa}" != "$1" ]; then - set_var "${2:-type}" woa - set_var "${3:-name}" "$1" + _setv "${2:-type}" woa + _setv "${3:-name}" "$1" elif [ "${1%.framework}" != "$1" ]; then - set_var "${2:-type}" fwk - set_var "${3:-name}" "$1" + _setv "${2:-type}" fwk + _setv "${3:-name}" "$1" elif [[ "$1" == *-* ]]; then local __si_name __si_num __si_name="${1%-*}" __si_num="${1##*-}" if [ -z "${__si_num//[0-9]/}" ]; then - set_var "${2:-type}" ins - set_var "${3:-name}" "$1" + _setv "${2:-type}" ins + _setv "${3:-name}" "$1" else - set_var "${2:-type}" app - set_var "${3:-name}" "$1" + _setv "${2:-type}" app + _setv "${3:-name}" "$1" fi elif [ -n "$1" ]; then - set_var "${2:-type}" app - set_var "${3:-name}" "$1" + _setv "${2:-type}" app + _setv "${3:-name}" "$1" fi } diff --git a/lib/ulib/woinst b/lib/ulib/woinst index 95714cc..0d3a7ca 100644 --- a/lib/ulib/woinst +++ b/lib/ulib/woinst @@ -102,7 +102,7 @@ COMMANDES while [ -n "$1" ]; do if [ "$1" == // ]; then if [ -n "${cmd[*]}" ]; then - cmds=("${cmds[@]}" "$(quoted_args "${cmd[@]}")") + cmds=("${cmds[@]}" "$(qvals "${cmd[@]}")") fi cmd=() else @@ -111,7 +111,7 @@ COMMANDES shift done if [ -n "${cmd[*]}" ]; then - cmds=("${cmds[@]}" "$(quoted_args "${cmd[@]}")") + cmds=("${cmds[@]}" "$(qvals "${cmd[@]}")") fi fi @@ -458,7 +458,7 @@ OPTIONS if [[ "$src" == *=* ]]; then splitvar "$src" name value array_add variables "$name" - set_var "$name" "$value" + _setv "$name" "$value" else src="$(abspath "$src")" valid= @@ -543,14 +543,14 @@ dans NEXT_ROOT = ${NEXT_ROOT:-/} local configfile variable ac_set_tmpfile configfile for variable in "${variables[@]}" bounce webinst ULIBDIR __estack __tlevel; do - set_var_cmd "$variable" "${!variable}" >>"$configfile" + echo_setv "$variable" "${!variable}" >>"$configfile" done for array in variables scripts applications frameworks; do set_array_cmd "$array" >>"$configfile" done # pour les serveurs qui ont une vieille version de bash, forcer la valeur de # ULIBDIR - set_var_cmd "FORCED_ULIBDIR" "$ULIBDIR" >>"$configfile" + echo_setv "FORCED_ULIBDIR" "$ULIBDIR" >>"$configfile" runscript_as_root "$ULIBDIR/support/woinst2s" "$configfile" diff --git a/lib/ulib/wosign b/lib/ulib/wosign index cd4f5e7..d812a73 100644 --- a/lib/ulib/wosign +++ b/lib/ulib/wosign @@ -18,9 +18,9 @@ function wosign_setup_maybe() { storepass= keyalias= source "$WOSIGN_CONF" - set_var_cmd WOSIGN_KEYSTORE "$keystore" - set_var_cmd WOSIGN_STOREPASS "$storepass" - set_var_cmd WOSIGN_KEYALIAS "$keyalias" + echo_setv WOSIGN_KEYSTORE "$keystore" + echo_setv WOSIGN_STOREPASS "$storepass" + echo_setv WOSIGN_KEYALIAS "$keyalias" )" [ -n "$WOSIGN_XTMPDIR" ] || ac_set_tmpdir WOSIGN_XTMPDIR diff --git a/mysqlcsv b/mysqlcsv index d139389..095997d 100755 --- a/mysqlcsv +++ b/mysqlcsv @@ -132,7 +132,7 @@ if [ "$password" != "--NOT-SET--" ]; then fi if [ -z "$query" -a -n "$input" -a "$input" != "-" ]; then - mysqlcmd="<$(quoted_arg "$input") $mysqlcmd" + mysqlcmd="<$(qval "$input") $mysqlcmd" fi eval "$mysqlcmd" | diff --git a/mysqlloadcsv b/mysqlloadcsv index 765c51a..c8424e4 100755 --- a/mysqlloadcsv +++ b/mysqlloadcsv @@ -340,7 +340,7 @@ if [ "$method" == load ]; then [ -n "$truncate" ] && echo "$truncate" echo "$loadcsv" echo "-- Commande à lancer pour importer la table dans MySQL:" - echo "-- $(quoted_args "${cmd[@]}")" + echo "-- $(qvals "${cmd[@]}")" else "${cmd[@]}"; r=$? fi diff --git a/pdev b/pdev index 46fda55..efd464b 100755 --- a/pdev +++ b/pdev @@ -298,7 +298,7 @@ if [ "$action" == delete ]; then eimportant "\ La branche $origin/$feature n'a plus lieu d'être, mais la configuration actuelle interdit de la supprimer. Veuillez le faire manuellement avec la commande suivante: - $(quoted_args git push "$origin" ":$feature")" + $(qvals git push "$origin" ":$feature")" fi fi fi diff --git a/rruns b/rruns index cddb3d1..94fdb89 100755 --- a/rruns +++ b/rruns @@ -419,11 +419,11 @@ for userhost in "${hosts[@]}"; do if scp -S "$SSH" "$archive" "$user@$host:"; then estep "Lancement du script de déploiement" "$SSH" -qt "$user@$host" "\ -__estack=$(quoted_arg "$__estack") -__tlevel=$(quoted_arg "$__tlevel") +__estack=$(qval "$__estack") +__tlevel=$(qval "$__tlevel") export __estack __tlevel ${UTOOLS_LANG:+UTOOLS_LANG='$UTOOLS_LANG'; export UTOOLS_LANG -}$(quoted_args "./$archivename" ${tmproot:+--tmproot "$tmproot"})" +}$(qvals "./$archivename" ${tmproot:+--tmproot "$tmproot"})" if [ -n "$init_sysinfos" ]; then estep "Calcul des informations de l'hôte distant" sysinfos_script=' diff --git a/ruinst b/ruinst index b72e0cc..f5a6653 100755 --- a/ruinst +++ b/ruinst @@ -258,11 +258,11 @@ for host in "${hosts[@]}"; do scp -S "$SSH" "$archive" "$user@$host:" || die estep "Lancement du script de déploiement" "$SSH" -qt "$user@$host" "\ -__estack=$(quoted_arg "$__estack") -__tlevel=$(quoted_arg "$__tlevel") +__estack=$(qval "$__estack") +__tlevel=$(qval "$__tlevel") export __estack __tlevel ${UTOOLS_LANG:+UTOOLS_LANG='$UTOOLS_LANG'; export UTOOLS_LANG -}$(quoted_args "./$archivename" ${tmproot:+--tmproot "$tmproot"} -- MYHOST="$host" "$@")" +}$(qvals "./$archivename" ${tmproot:+--tmproot "$tmproot"} -- MYHOST="$host" "$@")" eend fi done diff --git a/rwoinst b/rwoinst index 51c27ec..f1fdbc7 100755 --- a/rwoinst +++ b/rwoinst @@ -164,11 +164,11 @@ for host in "${hosts[@]}"; do scp -S "$SSH" "$archive" "$user@$host:" || die estep "Lancement du script de déploiement" "$SSH" -qt "$user@$host" "\ -__estack=$(quoted_arg "$__estack") -__tlevel=$(quoted_arg "$__tlevel") +__estack=$(qval "$__estack") +__tlevel=$(qval "$__tlevel") export __estack __tlevel ${UTOOLS_LANG:+UTOOLS_LANG='$UTOOLS_LANG'; export UTOOLS_LANG -}$(quoted_args "./$archivename" ${tmproot:+--tmproot "$tmproot"} -- MYHOST="$host" "$@")" +}$(qvals "./$archivename" ${tmproot:+--tmproot "$tmproot"} -- MYHOST="$host" "$@")" eend fi done diff --git a/todo/dokuwiki b/todo/dokuwiki index 2f42164..dbe50ca 100755 --- a/todo/dokuwiki +++ b/todo/dokuwiki @@ -349,7 +349,7 @@ Voulez-vous continuer?" O || return 1 if [ -n "$edit" -a -n "$DWCOMMIT" ]; then __commit "$dwdir" "newpage $title --> $ns$name" newfiles modfiles || return else - estepi "dwci $(quoted_args "dwci newpage $title --> $ns$name")" + estepi "dwci $(qvals "dwci newpage $title --> $ns$name")" fi return 0 } @@ -453,7 +453,7 @@ function edit_cmd() { if [ -n "$DWCOMMIT" ]; then __commit "$dwdir" "edit ${page//\//:}" newfiles modfiles || return else - estepi "dwci $(quoted_args "edit ${page//\//:}")" + estepi "dwci $(qvals "edit ${page//\//:}")" fi return 0 } @@ -780,7 +780,7 @@ print tolower($0) if [ -n "$DWCOMMIT" ]; then __commit "$dwdir" "generate $srcdir" newfiles modfiles else - estepi "dwci $(quoted_args "generate $srcdir")" + estepi "dwci $(qvals "generate $srcdir")" fi ) } diff --git a/todo/mediawiki b/todo/mediawiki index 7ddc0bd..8e61851 100755 --- a/todo/mediawiki +++ b/todo/mediawiki @@ -237,7 +237,7 @@ function init_cmd() { read_value "URL du site MediaWiki" MWSITEURL http://localhost/mediawiki local var for var in MWDBHOST MWDBPORT MWDBUSER MWDBPASS MWDBNAME MWPREFIX MWSITEURL; do - set_var_cmd "$var" "${!var}" >>"$mwdir/.mediawiki" + echo_setv "$var" "${!var}" >>"$mwdir/.mediawiki" done fi @@ -351,7 +351,7 @@ Voulez-vous continuer?" N || return 1 if [ -n "$edit" -a -n "$MWCOMMIT" ]; then __commit "$mwdir" "newpage $title --> $name" newfiles modfiles || return else - estepi "mwci $(quoted_args "mwci newpage $title --> $name")" + estepi "mwci $(qvals "mwci newpage $title --> $name")" fi return 0 } @@ -440,7 +440,7 @@ function edit_cmd() { if [ -n "$MWCOMMIT" ]; then __commit "$mwdir" "edit ${page//\//:}" newfiles modfiles || return else - estepi "mwci $(quoted_args "edit ${page//\//:}")" + estepi "mwci $(qvals "edit ${page//\//:}")" fi return 0 } @@ -926,7 +926,7 @@ print tolower($0) if [ -n "$MWCOMMIT" ]; then __commit "$mwdir" "generate $srcdir" newfiles modfiles else - estepi "mwci $(quoted_args "generate $srcdir")" + estepi "mwci $(qvals "generate $srcdir")" fi ) } diff --git a/ucrontab b/ucrontab index b111c2e..21f2706 100755 --- a/ucrontab +++ b/ucrontab @@ -164,18 +164,18 @@ function echo_() { } function recho() { if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo "$first$@" + echo -n - + echo "$first" "$@" else echo "$@" fi } function recho_() { if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo -n "$first$@" + echo -n - + echo -n "$first" "$@" else echo -n "$@" fi @@ -189,9 +189,10 @@ function _qval() { recho_ "$s" } function should_quote() { - local l="${#1}" + local s="$*" + local l="${#s}" [ $l -eq 0 -o $l -gt 80 ] && return 0 - local s="${*//[a-zA-Z0-9]/}" + s="${s//[a-zA-Z0-9]/}" s="${s//,/}" s="${s//./}" s="${s//+/}" @@ -526,7 +527,7 @@ function evalcmd() { } ##@inc]base.core ##@inc[base.string -## Fonctions de base: gestion des valeurs scalaires +## Fonctions de base: gestion des valeurs chaines scalaires uprovide base.string urequire base.core @@ -683,6 +684,75 @@ function endswith() { local str="$1" pattern="$2" eval '[ "${str%$pattern}" != "$str" ]' } + +function strsplitf() { + [ $# -gt 0 ] || return 127 + local func count + func="$1"; shift + count=$# + if [ $count -gt 0 ]; then + eval 'set -- "${@:1:$(($count-1))}" '"${!count}" || return 126 + fi + "$func" "$@" +} +function strecho() { recho "$@"; } +function strqvals() { + qvals "$@" +} +function strqlines() { + local -a lines + _setax lines cat "$@" + qvals "${lines[@]}" +} +function strqarray() { + local __a __s="qvals" + for __a in "$@"; do __s="$__s \"\${$__a[@]}\""; done + eval "$__s" +} + +function evals() { + local __e_val __e_arg __e_r=0 + local __e_firstcmd __e_firstarg __e_splitf + local -a __e_cmd + + __e_firstcmd=1 + while [ $# -gt 0 ]; do + __e_cmd=() + __e_firstarg=1 # premier argument + __e_splitf= # premier argument après splitf + while [ $# -gt 0 ]; do + __e_arg="$1"; shift + [ "$__e_arg" == // ] && break + if [ "${__e_arg%//}" != "$__e_arg" ]; then + local __e_tmp="${__e_arg%//}" + if [ -z "${__e_tmp//\\/}" ]; then + __e_arg="${__e_arg#\\}" + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + continue + fi + fi + if [ -n "$__e_firstarg" ]; then + __e_cmd=("str$__e_arg") + __e_firstarg= + [ "$__e_arg" == "splitf" ] && __e_splitf=1 + elif [ -n "$__e_splitf" ]; then + __e_cmd=("${__e_cmd[@]}" "str$__e_arg") + __e_splitf= + else + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + fi + done + + if [ -n "$__e_firstcmd" ]; then + __e_val="$("${__e_cmd[@]}")" || __e_r=$? + else + __e_val="$("${__e_cmd[@]}" "$__e_val")" || __e_r=$? + fi + __e_firstcmd= + done + [ -n "$__e_val" ] && echo "$__e_val" + return $__e_r +} ##@inc]base.string ##@inc[base.num ## Fonctions de base: gestion des valeurs numériques @@ -708,6 +778,10 @@ function isrnum() { v="${v//[0-9]/}" [ -z "$v" ] } + +function evali() { + echo "$(($*))" +} ##@inc]base.num ##@inc[base.bool ## Fonctions de base: valeurs booléennes @@ -735,6 +809,10 @@ function isrnum() { v="${v//[0-9]/}" [ -z "$v" ] } + +function evali() { + echo "$(($*))" +} ##@inc]base.num uprovide base.bool urequire base.num @@ -975,18 +1053,18 @@ function echo_() { } function recho() { if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo "$first$@" + echo -n - + echo "$first" "$@" else echo "$@" fi } function recho_() { if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo -n "$first$@" + echo -n - + echo -n "$first" "$@" else echo -n "$@" fi @@ -1000,9 +1078,10 @@ function _qval() { recho_ "$s" } function should_quote() { - local l="${#1}" + local s="$*" + local l="${#s}" [ $l -eq 0 -o $l -gt 80 ] && return 0 - local s="${*//[a-zA-Z0-9]/}" + s="${s//[a-zA-Z0-9]/}" s="${s//,/}" s="${s//./}" s="${s//+/}" @@ -1337,7 +1416,7 @@ function evalcmd() { } ##@inc]base.core ##@inc[base.string -## Fonctions de base: gestion des valeurs scalaires +## Fonctions de base: gestion des valeurs chaines scalaires uprovide base.string urequire base.core @@ -1494,6 +1573,75 @@ function endswith() { local str="$1" pattern="$2" eval '[ "${str%$pattern}" != "$str" ]' } + +function strsplitf() { + [ $# -gt 0 ] || return 127 + local func count + func="$1"; shift + count=$# + if [ $count -gt 0 ]; then + eval 'set -- "${@:1:$(($count-1))}" '"${!count}" || return 126 + fi + "$func" "$@" +} +function strecho() { recho "$@"; } +function strqvals() { + qvals "$@" +} +function strqlines() { + local -a lines + _setax lines cat "$@" + qvals "${lines[@]}" +} +function strqarray() { + local __a __s="qvals" + for __a in "$@"; do __s="$__s \"\${$__a[@]}\""; done + eval "$__s" +} + +function evals() { + local __e_val __e_arg __e_r=0 + local __e_firstcmd __e_firstarg __e_splitf + local -a __e_cmd + + __e_firstcmd=1 + while [ $# -gt 0 ]; do + __e_cmd=() + __e_firstarg=1 # premier argument + __e_splitf= # premier argument après splitf + while [ $# -gt 0 ]; do + __e_arg="$1"; shift + [ "$__e_arg" == // ] && break + if [ "${__e_arg%//}" != "$__e_arg" ]; then + local __e_tmp="${__e_arg%//}" + if [ -z "${__e_tmp//\\/}" ]; then + __e_arg="${__e_arg#\\}" + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + continue + fi + fi + if [ -n "$__e_firstarg" ]; then + __e_cmd=("str$__e_arg") + __e_firstarg= + [ "$__e_arg" == "splitf" ] && __e_splitf=1 + elif [ -n "$__e_splitf" ]; then + __e_cmd=("${__e_cmd[@]}" "str$__e_arg") + __e_splitf= + else + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + fi + done + + if [ -n "$__e_firstcmd" ]; then + __e_val="$("${__e_cmd[@]}")" || __e_r=$? + else + __e_val="$("${__e_cmd[@]}" "$__e_val")" || __e_r=$? + fi + __e_firstcmd= + done + [ -n "$__e_val" ] && echo "$__e_val" + return $__e_r +} ##@inc]base.string ##@inc[base.array ## Fonctions de base: gestion des tableaux @@ -1814,18 +1962,18 @@ function echo_() { } function recho() { if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo "$first$@" + echo -n - + echo "$first" "$@" else echo "$@" fi } function recho_() { if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo -n "$first$@" + echo -n - + echo -n "$first" "$@" else echo -n "$@" fi @@ -1839,9 +1987,10 @@ function _qval() { recho_ "$s" } function should_quote() { - local l="${#1}" + local s="$*" + local l="${#s}" [ $l -eq 0 -o $l -gt 80 ] && return 0 - local s="${*//[a-zA-Z0-9]/}" + s="${s//[a-zA-Z0-9]/}" s="${s//,/}" s="${s//./}" s="${s//+/}" @@ -2176,7 +2325,7 @@ function evalcmd() { } ##@inc]base.core ##@inc[base.string -## Fonctions de base: gestion des valeurs scalaires +## Fonctions de base: gestion des valeurs chaines scalaires uprovide base.string urequire base.core @@ -2333,6 +2482,75 @@ function endswith() { local str="$1" pattern="$2" eval '[ "${str%$pattern}" != "$str" ]' } + +function strsplitf() { + [ $# -gt 0 ] || return 127 + local func count + func="$1"; shift + count=$# + if [ $count -gt 0 ]; then + eval 'set -- "${@:1:$(($count-1))}" '"${!count}" || return 126 + fi + "$func" "$@" +} +function strecho() { recho "$@"; } +function strqvals() { + qvals "$@" +} +function strqlines() { + local -a lines + _setax lines cat "$@" + qvals "${lines[@]}" +} +function strqarray() { + local __a __s="qvals" + for __a in "$@"; do __s="$__s \"\${$__a[@]}\""; done + eval "$__s" +} + +function evals() { + local __e_val __e_arg __e_r=0 + local __e_firstcmd __e_firstarg __e_splitf + local -a __e_cmd + + __e_firstcmd=1 + while [ $# -gt 0 ]; do + __e_cmd=() + __e_firstarg=1 # premier argument + __e_splitf= # premier argument après splitf + while [ $# -gt 0 ]; do + __e_arg="$1"; shift + [ "$__e_arg" == // ] && break + if [ "${__e_arg%//}" != "$__e_arg" ]; then + local __e_tmp="${__e_arg%//}" + if [ -z "${__e_tmp//\\/}" ]; then + __e_arg="${__e_arg#\\}" + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + continue + fi + fi + if [ -n "$__e_firstarg" ]; then + __e_cmd=("str$__e_arg") + __e_firstarg= + [ "$__e_arg" == "splitf" ] && __e_splitf=1 + elif [ -n "$__e_splitf" ]; then + __e_cmd=("${__e_cmd[@]}" "str$__e_arg") + __e_splitf= + else + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + fi + done + + if [ -n "$__e_firstcmd" ]; then + __e_val="$("${__e_cmd[@]}")" || __e_r=$? + else + __e_val="$("${__e_cmd[@]}" "$__e_val")" || __e_r=$? + fi + __e_firstcmd= + done + [ -n "$__e_val" ] && echo "$__e_val" + return $__e_r +} ##@inc]base.string ##@inc[base.array ## Fonctions de base: gestion des tableaux @@ -2774,18 +2992,18 @@ function echo_() { } function recho() { if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo "$first$@" + echo -n - + echo "$first" "$@" else echo "$@" fi } function recho_() { if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo -n "$first$@" + echo -n - + echo -n "$first" "$@" else echo -n "$@" fi @@ -2799,9 +3017,10 @@ function _qval() { recho_ "$s" } function should_quote() { - local l="${#1}" + local s="$*" + local l="${#s}" [ $l -eq 0 -o $l -gt 80 ] && return 0 - local s="${*//[a-zA-Z0-9]/}" + s="${s//[a-zA-Z0-9]/}" s="${s//,/}" s="${s//./}" s="${s//+/}" @@ -3135,31 +3354,290 @@ function evalcmd() { "${args[@]}" } ##@inc]base.core -##@inc[base.num -## Fonctions de base: gestion des valeurs numériques -uprovide base.num +##@inc[base.quote +## Fonctions de base: protection de valeurs chaine +uprovide base.quote +urequire base.core -function isnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//[0-9]/}" - [ -z "$v" ] +function _qawk() { + local s="$*" + s="${s//\\/\\\\}" + s="${s//\"/\\\"}" + s="${s// +/\\n}" + recho_ "$s" } -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - [ -z "${1//[0-9]/}" ] +function qawk() { + echo -n \" + _qawk "$@" + echo \" } -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//./}" - v="${v//,/}" - v="${v//[0-9]/}" - [ -z "$v" ] +function qseds() { + local s="$*" + s="${s//\\/\\\\}" + s="${s//\//\\/}" + s="${s// +/\\n}" + recho "$s" } -##@inc]base.num +function _qform() { + local s="$*" + s="${s//\%/%25}" + s="${s//+/%2B}" + s="${s//&/%26}" + s="${s//=/%3D}" + s="${s// /+}" + recho_ "$s" +} +function qform() { + local s="$*" + if [[ "$s" == *=* ]]; then + _qform "${s%%=*}" + echo -n = + _qform "${s#*=}" + echo + else + _qform "$s" + echo + fi +} +function _qsql() { + local q="'" qq="''" + echo "${*//$q/$qq}" +} +function qsql() { + local q="'" qq="''" + echo "'${*//$q/$qq}'" +} +##@inc]base.quote +##@inc[base.string +## Fonctions de base: gestion des valeurs chaines scalaires +uprovide base.string +urequire base.core + + +function straddp() { + local p="$1"; shift + echo "$p$*" +} +function strdelp() { + local p="$1"; shift + local str="$*" + echo "${str#$p}" +} +function strdelp2() { + local p="$1"; shift + local str="$*" + echo "${str##$p}" +} +function stradds() { + local s="$1"; shift + echo "$*$s" +} +function strdels() { + local s="$1"; shift + local str="$*" + echo "${str%$s}" +} +function strdels2() { + local s="$1"; shift + local str="$*" + echo "${str%%$s}" +} +function strlower() { + local str="$*" + echo "${str,,}" +} +function strlower1() { + local str="$*" + echo "${str,}" +} +function strlowers() { + local str="$*" + echo "${*,}" +} +function strupper() { + local str="$*" + echo "${str^^}" +} +function strupper1() { + local str="$*" + echo "${str^}" +} +function struppers() { + echo "${*^}" +} +function strmid() { + local range="$1"; shift + local str="$*" + if [[ "$range" == *:-* ]]; then + local max=${#str} + [ $max -eq 0 ] && return + local start="${range%%:*}" + [ -n "$start" ] || start=0 + while [ "$start" -lt 0 ]; do + start=$(($max$start)) + done + max=$(($max-$start)) + local length="${range#*:}" + while [ "$length" -lt 0 ]; do + length=$(($max$length)) + done + range="$start:$length" + fi + eval 'echo "${str:'" $range"'}"' +} +function strrepl() { + local pattern="$1"; shift + local repl="$1"; shift + local str="$*" + local cmd='echo "${str/' + if [ "${pattern#/}" != "$pattern" ]; then + pattern="${pattern#/}" + cmd="$cmd/" + elif [ "${pattern#\#}" != "$pattern" ]; then + pattern="${pattern#\#}" + cmd="$cmd#" + elif [ "${pattern#%}" != "$pattern" ]; then + pattern="${pattern#%}" + cmd="$cmd%" + fi + cmd="$cmd"'$pattern/$repl}"' + eval "$cmd" +} + +function strops() { + local -a __s_tmp + local __s_value="$1"; shift + while [ $# -gt 0 ]; do + case "$1" in + :-*|:=*|:\?*|:+*) eval '__s_value="${'"${__s_value}$1"'}"';; + d|deref) __s_value="${!__s_value}";; + dc|dcount|ds|dsize) + __s_value="${__s_value}[@]" + __s_tmp=("${!__s_value}") + __s_value="${#__s_tmp[@]}" + ;; + \#*|%*|/*|:*|^*|,*) eval '__s_value="${__s_value'"$1"'}"';; + l|length) __s_value="${#__s_value}";; + =|==|!=|\<|\>|-eq|-ne|-lt|-le|-gt|-ge) + __s_tmp=(\[ "$__s_value" "$@" ]); "${__s_tmp[@]}"; return $?;; + -n|-z) __s_tmp=(\[ "$1" "$__s_value" ]); "${__s_tmp[@]}"; return $?;; + +#*) eval '__s_value="'"${1#+#}"'$__s_value"';; + -#*) eval '__s_value="${__s_value'"${1#-}"'}"';; + +%*) eval '__s_value="$__s_value"'"${1#+%}";; + +*) eval '__s_value="$__s_value"'"${1#+}";; + -%*) eval '__s_value="${__s_value'"${1#-}"'}"';; + -*) eval '__s_value="${__s_value%'"${1#-}"'}"';; + mid|strmid) eval '__s_value="$(strmid "$2" "$__s_value")"'; shift;; + repl|strrepl) eval '__s_value="$(strrepl "$2" "$3" "$__s_value")"'; shift; shift;; + *) echo 1>&2 "strops: unknown operator: $1";; + esac + shift + done + echo "$__s_value" +} + +function first_char() { + local str="$*" + echo "${str:0:1}" +} +function last_char() { + local str="$*" + echo "${str: -1:1}" +} +function first_chars() { + local str="$*" + recho "${str:0:$((${#1}-1))}" +} +function last_chars() { + local str="$*" + recho "${str:1}" +} +function first_char_is() { + [ "${1:0:1}" == "$2" ] +} +function last_char_is() { + [ "${1:$((-1)):1}" == "$2" ] +} +function beginswith() { + local str="$1" pattern="$2" + eval '[ "${str#$pattern}" != "$str" ]' +} +function endswith() { + local str="$1" pattern="$2" + eval '[ "${str%$pattern}" != "$str" ]' +} + +function strsplitf() { + [ $# -gt 0 ] || return 127 + local func count + func="$1"; shift + count=$# + if [ $count -gt 0 ]; then + eval 'set -- "${@:1:$(($count-1))}" '"${!count}" || return 126 + fi + "$func" "$@" +} +function strecho() { recho "$@"; } +function strqvals() { + qvals "$@" +} +function strqlines() { + local -a lines + _setax lines cat "$@" + qvals "${lines[@]}" +} +function strqarray() { + local __a __s="qvals" + for __a in "$@"; do __s="$__s \"\${$__a[@]}\""; done + eval "$__s" +} + +function evals() { + local __e_val __e_arg __e_r=0 + local __e_firstcmd __e_firstarg __e_splitf + local -a __e_cmd + + __e_firstcmd=1 + while [ $# -gt 0 ]; do + __e_cmd=() + __e_firstarg=1 # premier argument + __e_splitf= # premier argument après splitf + while [ $# -gt 0 ]; do + __e_arg="$1"; shift + [ "$__e_arg" == // ] && break + if [ "${__e_arg%//}" != "$__e_arg" ]; then + local __e_tmp="${__e_arg%//}" + if [ -z "${__e_tmp//\\/}" ]; then + __e_arg="${__e_arg#\\}" + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + continue + fi + fi + if [ -n "$__e_firstarg" ]; then + __e_cmd=("str$__e_arg") + __e_firstarg= + [ "$__e_arg" == "splitf" ] && __e_splitf=1 + elif [ -n "$__e_splitf" ]; then + __e_cmd=("${__e_cmd[@]}" "str$__e_arg") + __e_splitf= + else + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + fi + done + + if [ -n "$__e_firstcmd" ]; then + __e_val="$("${__e_cmd[@]}")" || __e_r=$? + else + __e_val="$("${__e_cmd[@]}" "$__e_val")" || __e_r=$? + fi + __e_firstcmd= + done + [ -n "$__e_val" ] && echo "$__e_val" + return $__e_r +} +##@inc]base.string ##@inc[base.bool ## Fonctions de base: valeurs booléennes ##@inc[base.num @@ -3186,6 +3664,10 @@ function isrnum() { v="${v//[0-9]/}" [ -z "$v" ] } + +function evali() { + echo "$(($*))" +} ##@inc]base.num uprovide base.bool urequire base.num @@ -3248,66 +3730,10 @@ function setxb() { setx "$__s_var" evalb "$@" } ##@inc]base.bool -##@inc[base.quote -## Fonctions de base: protection de valeurs chaine -uprovide base.quote -urequire base.core - -function _qawk() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s// -/\\n}" - recho_ "$s" -} -function qawk() { - echo -n \" - _qawk "$@" - echo \" -} -function qseds() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\//\\/}" - s="${s// -/\\n}" - recho "$s" -} -function _qform() { - local s="$*" - s="${s//\%/%25}" - s="${s//+/%2B}" - s="${s//&/%26}" - s="${s//=/%3D}" - s="${s// /+}" - recho_ "$s" -} -function qform() { - local s="$*" - if [[ "$s" == *=* ]]; then - _qform "${s%%=*}" - echo -n = - _qform "${s#*=}" - echo - else - _qform "$s" - echo - fi -} -function _qsql() { - local q="'" qq="''" - echo "${*//$q/$qq}" -} -function qsql() { - local q="'" qq="''" - echo "'${*//$q/$qq}'" -} -##@inc]base.quote uprovide base.compat -urequire base.core base.num base.bool base.quote +urequire base.core function setx2() { setxx "$@"; } function rawecho() { recho "$@"; } function rawecho_() { recho_ "$@"; } @@ -3318,6 +3744,7 @@ function set_var() { setv "$@"; } function set_var_cmd() { echo_setv "$@"; } function set_var_literal() { eval "$1=$2"; } +urequire base.quote function quote_awk() { _qawk "$@"; } function quoted_awk() { qawk "$@"; } function quote_seds() { qseds "$@"; } @@ -3326,6 +3753,7 @@ function quoted_form() { qform "$@"; } if [ -n "$BASH_VERSINFO" -a "${BASH_VERSINFO[0]}" -lt 4 ]; then + urequire base.string function strlower() { tr A-Z a-z <<<"$*"; } function strlower1() { local str="$*" @@ -3353,6 +3781,7 @@ if [ -n "$BASH_VERSINFO" -a "${BASH_VERSINFO[0]}" -lt 4 ]; then echo "${vs[*]}" } + urequire base.bool function is_yes() { case "$1" in o|oui|y|yes|v|vrai|t|true|on) return 0;; @@ -3390,15 +3819,15 @@ if [ -n "$UTOOLS_CHROOT" ]; then fi function setyesval() { - is_yes "$2" && set_var "$1" 1 || set_var "$1" "" + is_yes "$2" && _setv "$1" 1 || _setv "$1" "" } function normyesval() { - is_yes "${2:-"${!1}"}" && set_var "$1" 1 || set_var "$1" "" + is_yes "${2:-"${!1}"}" && _setv "$1" 1 || _setv "$1" "" } function normyesvals() { local __nyv_yesvar for __nyv_yesvar in "$@"; do - is_yes "${!__nyv_yesvar}" && set_var "$__nyv_yesvar" 1 || set_var "$__nyv_yesvar" "" + is_yes "${!__nyv_yesvar}" && _setv "$__nyv_yesvar" 1 || _setv "$__nyv_yesvar" "" done } function quote_in() { @@ -3421,7 +3850,7 @@ function quoted_sargs() { for a in "$@"; do s="${s:+$s }$(quoted_sarg "$a")" done - rawecho "$s" + recho "$s" } function set_array_cmd() { @@ -3436,7 +3865,7 @@ function set_array_cmd() { __sac_f=1 for __sac_v in "$@"; do [ -n "$__sac_f" ] && __sac_f= || __sac_s="$__sac_s " - __sac_s="$__sac_s$(quoted_arg "$__sac_v")" + __sac_s="$__sac_s$(qvalm "$__sac_v")" done __sac_s="$__sac_s)" echo "$__sac_s" @@ -3465,7 +3894,7 @@ function array_del() { local __ad_v local -a __ad_vs eval 'for __ad_v in "${'"$1"'[@]}"; do - if [ "$__ad_v" != '"$(quoted_arg "$2")"' ]; then + if [ "$__ad_v" != '"$(qval "$2")"' ]; then array_add __ad_vs "$__ad_v" fi done' @@ -3474,7 +3903,7 @@ done' function array_addu() { local __as_v eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then + if [ "$__as_v" == '"$(qval "$2")"' ]; then return 1 fi done' @@ -3487,7 +3916,7 @@ function array_set() { function array_insu() { local __as_v eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then + if [ "$__as_v" == '"$(qval "$2")"' ]; then return 1 fi done' @@ -3518,7 +3947,7 @@ function array_eq() { function array_contains() { local __ac_v eval 'for __ac_v in "${'"$1"'[@]}"; do - if [ "$__ac_v" == '"$(quoted_arg "$2")"' ]; then + if [ "$__ac_v" == '"$(qvalm "$2")"' ]; then return 0 fi done' @@ -3527,7 +3956,7 @@ done' function array_icontains() { local __ac_v eval 'for __ac_v in "${'"$1"'[@]}"; do - if [ "$(strlower "$__ac_v")" == '"$(strlower "$(quoted_arg "$2")")"' ]; then + if [ "$(strlower "$__ac_v")" == '"$(strlower "$(qval "$2")")"' ]; then return 0 fi done' @@ -3537,7 +3966,7 @@ function array_find() { local __af_i __af_v __af_i=0 eval 'for __af_v in "${'"$1"'[@]}"; do - if [ "$__af_v" == '"$(quoted_arg "$2")"' ]; then + if [ "$__af_v" == '"$(qval "$2")"' ]; then if [ -n "$3" ]; then echo "${'"$3"'[$__af_i]}" else @@ -3596,10 +4025,10 @@ function array_map() { array_copy "$__am_an" __am_vs } function first_value() { - eval "rawecho \"\${$1[@]:0:1}\"" + eval "recho \"\${$1[@]:0:1}\"" } function last_value() { - eval "rawecho \"\${$1[@]:\$((-1)):1}\"" + eval "recho \"\${$1[@]:\$((-1)):1}\"" } function array_copy() { eval "$1=(\"\${$2[@]}\")" @@ -3679,9 +4108,9 @@ function array_join() { __aj_j="${__aj_j:+$__aj_j'"$__aj_s"'}$__aj_pf$__aj_l$__aj_sf" done' if [ -n "$__aj_j" ]; then - rawecho "$__aj_j" + recho "$__aj_j" elif [ "$__aj_an" != "\$@" -a -n "$3" ]; then - rawecho "$3" + recho "$3" fi } function array_mapjoin() { @@ -3731,26 +4160,21 @@ function parse_date() { local value="$1" type="${2:-date}" local now="$(awk 'BEGIN { print mktime(strftime("%Y %m %d 00 00 00 +0400")) }')" case "$value" in - +*) - value="$(($now + ${value#+} * 86400))" - ;; - *) - value="$(<<<"$value" awk -F/ '{ - nd = strftime("%d"); nm = strftime("%m"); ny = strftime("%Y") - d = $1 + 0; if (d < 1) d = nd; - m = $2 + 0; if (m < 1) m = nm; - if ($3 == "") y = ny; - else { y = $3 + 0; if (y < 100) y = y + 2000; } - print mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d)); - }')" + +*) value="$(($now + ${value#+} * 86400))";; + *) value="$(<<<"$value" awk -F/ '{ + nd = strftime("%d"); nm = strftime("%m"); ny = strftime("%Y") + d = $1 + 0; if (d < 1) d = nd; + m = $2 + 0; if (m < 1) m = nm; + if ($3 == "") y = ny; + else { y = $3 + 0; if (y < 100) y = y + 2000; } + print mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d)); + }')";; esac case "$type" in d|date) awk '{ print strftime("%d/%m/%Y", $0 + 0) }' <<<"$value";; l|ldap) awk '{ print strftime("%Y%m%d%H%M%S+0400", $0 + 0) }' <<<"$value";; m|mysql) awk '{ print strftime("%Y-%m-%d", $0 + 0) }' <<<"$value";; - *) - rawecho "$value" - ;; + *) recho "$value";; esac } @@ -3801,7 +4225,7 @@ function normpath() { ap="$ap$part" fi done - rawecho "$ap" + recho "$ap" } function abspath() { local ap="$1" @@ -3859,7 +4283,7 @@ function ppath() { [ "$cwd" != "/" -a "$cwd" != "$HOME" ] && path="${path#$cwd/}" [ "${path#$HOME/}" != "$path" ] && path="~${path#$HOME}" - rawecho "$path" + recho "$path" } function relpath() { local p="$(abspath "$1" "$3")" cwd="$2" @@ -3871,7 +4295,7 @@ function relpath() { if [ "$p" == "$cwd" ]; then echo "" elif [ "${p#$cwd/}" != "$p" ]; then - rawecho "${p#$cwd/}" + recho "${p#$cwd/}" else local rp while [ -n "$cwd" -a "${p#$cwd/}" == "$p" ]; do @@ -3939,8 +4363,8 @@ function splitwcs() { fi done [ "${__sw_p#/}" != "$__sw_p" ] && __sw_d="/$__sw_d" - set_var "$__sw_dd" "$__sw_d" - set_var "$__sw_df" "$__sw_f" + _setv "$__sw_dd" "$__sw_d" + _setv "$__sw_df" "$__sw_f" } function deref() { local OENC="$UTF8" @@ -3995,9 +4419,9 @@ function path_if_test() { local basedir="$1" if [ $op "$basedir/$file" ]; then if [ -n "$rel" ]; then - rawecho "$reldir$file" + recho "$reldir$file" else - rawecho "$basedir/$file" + recho "$basedir/$file" fi break fi @@ -4387,7 +4811,7 @@ function list_all() { cd "$b" 2>/dev/null || return eval "$(__la_cmd "$@")" | while read f; do [ "$f" == "." -o "$f" == ".." ] && continue - rawecho "$f" + recho "$f" done cd "$curdir" } @@ -4409,7 +4833,7 @@ function list_files() { cd "$b" 2>/dev/null || return eval "$(__la_cmd "$@")" | while read f; do - [ -f "$f" ] && rawecho "$f" + [ -f "$f" ] && recho "$f" done cd "$curdir" } @@ -4421,7 +4845,7 @@ function list_dirs() { cd "$b" 2>/dev/null || return eval "$(__la_cmd "$@")" | while read f; do [ "$f" == "." -o "$f" == ".." ] && continue - [ -d "$f" ] && rawecho "$f" + [ -d "$f" ] && recho "$f" done cd "$curdir" } @@ -4607,10 +5031,10 @@ function runscript_as() { local cmd cmd="\ -__estack=$(quoted_arg "$__estack") -__tlevel=$(quoted_args "$__tlevel") +__estack=$(qval "$__estack") +__tlevel=$(qval "$__tlevel") export __estack __tlevel -exec ${BASH:-/bin/sh} $(quoted_args "$@")" +exec ${BASH:-/bin/sh} $(qvals "$@")" if is_yes "$UTOOLS_USES_SU" || ! progexists sudo; then eecho "Entrez le mot de passe de root" @@ -4730,8 +5154,8 @@ En l'occurence, ce script est accédé par le chemin $script et ce chemin doit e estep "Lancement de la commande sur l'hôte distant $user@$host" local cmd - [ -n "$path" ] && cmd="$(quoted_args cd "$path"); " - cmd="$cmd$(quoted_args "$script" "$@")" + [ -n "$path" ] && cmd="$(qvals cd "$path"); " + cmd="$cmd$(qvals "$script" "$@")" ssh -qt "${UTOOLS_ENSURE_HOSTNAME_SSH_OPTS[@]}" "$user@$host" "$cmd" [ $? -eq 255 ] && return 12 return 1 @@ -5362,13 +5786,13 @@ function awkdef() { [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break __ad_value="${1:$__ad_vpos}" if [ -n "$__ad_int" ]; then - echo "$__ad_name = int($(quoted_awk "$__ad_value") + 0)" + echo "$__ad_name = int($(qawk "$__ad_value") + 0)" elif [ -n "$__ad_str" ]; then - echo "$__ad_name = $(quoted_awk "$__ad_value")" + echo "$__ad_name = $(qawk "$__ad_value")" elif [ ${#__ad_value} -lt 256 ] && isnum "$__ad_value"; then echo "$__ad_name = $__ad_value" else - echo "$__ad_name = $(quoted_awk "$__ad_value")" + echo "$__ad_name = $(qawk "$__ad_value")" fi else break @@ -5383,7 +5807,7 @@ function awkdef() { local __ad_i=1 echo "$__ad_name[0] = 0; delete $__ad_name" for __ad_arg in "${!__ad_value}"; do - echo "$__ad_name[$__ad_i]=$(quoted_awk "$__ad_arg")" + echo "$__ad_name[$__ad_i]=$(qawk "$__ad_arg")" __ad_i=$(($__ad_i + 1)) done eval "echo \"\${__ad_name}_count = \${#$__ad_value}\"" @@ -5392,7 +5816,7 @@ function awkdef() { done echo "}" for __ad_arg in "$@"; do - rawecho "$__ad_arg" + recho "$__ad_arg" done fi @@ -5723,7 +6147,7 @@ __init_encoding function tooenc() { local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" if [ "$from" == "$to" ]; then - rawecho "$src" + recho "$src" else iconv -f "$from" -t "$to" <<<"$src" fi @@ -5734,9 +6158,9 @@ function uecho() { function tooenc_() { local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" if [ "$from" == "$to" ]; then - rawecho_ "$src" + recho_ "$src" else - rawecho_ "$src" | iconv -f "$from" -t "$to" + recho_ "$src" | iconv -f "$from" -t "$to" fi } function uecho_() { @@ -5745,7 +6169,7 @@ function uecho_() { function toienc() { local __tie_var="$1" __tie_to="${2:-$IENC}" __tie_from="${3:-$UTOOLS_INPUT_ENCODING}" if [ "$__tie_from" != "$__tie_to" ]; then - set_var "$__tie_var" "$(iconv -f "$__tie_from" -t "$__tie_to" <<<"${!__tie_var}")" + _setv "$__tie_var" "$(iconv -f "$__tie_from" -t "$__tie_to" <<<"${!__tie_var}")" fi } function uread() { @@ -5809,7 +6233,7 @@ function __indent() { /}" != "$1" ]; then sed "2,\$s/^/${__tlevel}/g" <<<"$1" else - rawecho "$1" + recho "$1" fi } function __eerror() { tooenc "$(__edate)${__tlevel}ERROR $(__indent "$1")"; } @@ -5892,7 +6316,7 @@ function is_interaction() { function get_interaction_option() { :;} __epending= function eflush() { - if [ -n "$__epending" ]; then rawecho "$__epending" 1>&2; __epending=; fi + if [ -n "$__epending" ]; then recho "$__epending" 1>&2; __epending=; fi } function eclearp() { __epending= @@ -5928,7 +6352,7 @@ function edebug() { show_debug || return; eflush; __edebug "$*" 1>&2 } function trace() { - local r cmd="$(quoted_args "$@")" + local r cmd="$(qvals "$@")" show_info && { eflush; __eecho "\$ $cmd" 1>&2; } "$@"; r=$? if [ $r -ne 0 ]; then @@ -5944,7 +6368,7 @@ function trace_error() { local r "$@"; r=$? if [ $r -ne 0 ]; then - local cmd="$(quoted_args "$@")" + local cmd="$(qvals "$@")" show_error && { eflush; __eecho "^ $cmd [EC #$r]" 1>&2; } fi return $r @@ -6269,7 +6693,7 @@ function __rv_read() { OENC="$UTF8" eerror "La valeur par défaut de $__rv_v doit être non vide" return 1 fi - set_var "$__rv_v" "$__rv_d" + _setv "$__rv_v" "$__rv_d" return 0 fi @@ -6298,7 +6722,7 @@ function __rv_read() { fi __rv_r="${__rv_r:-$__rv_d}" if [ -n "$__rv_r" ] || ! is_yes "$__rv_re"; then - set_var "$__rv_v" "$__rv_r" + _setv "$__rv_v" "$__rv_r" return 0 fi done @@ -6364,7 +6788,7 @@ function simple_menu() { __sm_c=0 fi done - set_var "$__sm_option_var" "$__sm_option" + _setv "$__sm_option_var" "$__sm_option" } function actions_menu() { @@ -6391,8 +6815,8 @@ function actions_menu() { eerror_unless [ ${#__am_action_descs[*]} -gt 0 ] "Vous devez spécifier le tableau des actions" || return __actions_menu || return 1 - setv "${1:-action}" "$__am_select_action" - setv "${2:-option}" "$__am_select_option" + _setv "${1:-action}" "$__am_select_action" + _setv "${2:-option}" "$__am_select_option" } function __actions_menu() { local title="$__am_title" @@ -6651,12 +7075,12 @@ function ac_set_tmpfile() { fi fi if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" + _setv "$1" "$3" [ -f "$3" -a "$4" == keep ] || >"$3" else local __acst_t="$(mktempf "$2")" autoclean "$__acst_t" - set_var "$1" "$__acst_t" + _setv "$1" "$__acst_t" fi } function ac_set_tmpdir() { @@ -6669,12 +7093,12 @@ function ac_set_tmpdir() { fi fi if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" + _setv "$1" "$3" mkdir -p "$3" else local __acst_t="$(mktempd "$2")" autoclean "$__acst_t" - set_var "$1" "$__acst_t" + _setv "$1" "$__acst_t" fi } function debug_tee() { @@ -6732,26263 +7156,6 @@ function set_defaults() { } -: "${MYHOST:=$HOSTNAME}" -: "${MYHOSTNAME:=${MYHOST%%.*}}" -export MYHOST MYHOSTNAME - -function myhost() { - hostname -f 2>/dev/null || echo "$MYHOST" -} -function myhostname() { - hostname -s 2>/dev/null || echo "$MYHOSTNAME" -} -##@inc]base -uprovide base.tools -urequire base - -function base_umove() { - local -a args - local updatedir - args=(-d:,--updatedir: .) - parse_args_check "$@" || return; set -- "${args[@]}" - - eerror_unless [ -z "$updatedir" -o -d "$updatedir" ] "$updatedir: doit être un répertoire" || return - eerror_if [ $# -eq 0 ] "Vous devez spécifier les fichiers à déplacer" || return - eerror_if [ $# -eq 1 ] "Vous devez spécifier la destination" || return - - local -a srcs - local dest - - srcs=("$@") - setx dest=last_value srcs - array_del_last srcs - - if [ $# -eq 2 ]; then - if [ -d "$dest" ]; then - : # ce cas sera traité ci-dessous - elif [ -e "$dest" ]; then - eerror "$dest: refus d'écraser la destination" - return 1 - else - src="${srcs[0]}" - if [ -n "$updatedir" ]; then - if [ -L "$src" ]; then - ldest="$(readlinka "$src")" - array_find_links update_links "$ldest" "$updatedir" - else - array_find_links update_links "$src" "$updatedir" - fi - move_file "$src" "$dest" "${update_links[@]}" - else - move_link "$src" "$dest" - fi - return $? - fi - fi - - [ -d "$dest" ] || { - eerror "$dest: doit être un répertoire" - return 1 - } - for src in "${srcs[@]}"; do - if [ -n "$updatedir" ]; then - if [ -L "$src" ]; then - move_link "$src" "$dest" - else - array_find_links update_links "$src" "$updatedir" - move_file "$src" "$dest" "${update_links[@]}" - fi - else - move_link "$src" "$dest" - fi - done -} -##@inc]base.tools -##@inc[base.compat -## Fonctions de base: support des fonctions obsolètes et des versions de bash < 4.x -##@inc[base.core -## Fonctions de base: fondement -uprovide base.core - -function echo_() { - echo -n "$*" -} -function recho() { - if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - - local first="${1:1}"; shift - echo "$first$@" - else - echo "$@" - fi -} -function recho_() { - if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - - local first="${1:1}"; shift - echo -n "$first$@" - else - echo -n "$@" - fi -} -function _qval() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s//\$/\\\$}" - s="${s//\`/\\\`}" - recho_ "$s" -} -function should_quote() { - local l="${#1}" - [ $l -eq 0 -o $l -gt 80 ] && return 0 - local s="${*//[a-zA-Z0-9]/}" - s="${s//,/}" - s="${s//./}" - s="${s//+/}" - s="${s//\//}" - s="${s//-/}" - s="${s//_/}" - s="${s//=/}" - [ -n "$s" ] -} -function qval() { - echo -n \" - _qval "$@" - echo \" -} -function qvalm() { - if should_quote "$*"; then - echo -n \" - _qval "$@" - echo \" - else - recho "$*" - fi -} -function qvalr() { - if [ -z "$*" ]; then - : - elif should_quote "$*"; then - echo -n \" - _qval "$@" - echo \" - else - recho "$*" - fi -} -function qvals() { - local arg first=1 - for arg in "$@"; do - [ -z "$first" ] && echo -n " " - if should_quote "$arg"; then - echo -n \" - _qval "$arg" - echo -n \" - else - recho_ "$arg" - fi - first= - done - [ -z "$first" ] && echo -} -function qwc() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s//\$/\\\$}" - s="${s//\`/\\\`}" - local r a b - while [ -n "$s" ]; do - if [[ "$s" == *\** ]]; then - if [[ "$s" == *\?* ]]; then - a="${s%%\**}" - b="${s%%\?*}" - if [ ${#a} -lt ${#b} ]; then - s="${s#*\*}" - r="$r\"$a\"*" - else - s="${s#*\?}" - r="$r\"$b\"?" - fi - else - a="${s%%\**}" - s="${s#*\*}" - r="$r\"$a\"*" - fi - elif [[ "$s" == *\?* ]]; then - if [[ "$s" == *\** ]]; then - a="${s%%\**}" - b="${s%%\?*}" - if [ ${#a} -lt ${#b} ]; then - s="${s#*\*}" - r="$r\"$a\"*" - else - s="${s#*\?}" - r="$r\"$b\"?" - fi - else - a="${s%%\?*}" - s="${s#*\?}" - r="$r\"$a\"?" - fi - else - r="$r\"$s\"" - break - fi - done - recho_ "$r" -} -function qlines() { - sed "s/'/'\\\\''/g; s/.*/'&'/g" -} -function setv() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - eval "$__s_var=\"\$*\"" -} -function _setv() { - local __s_var="$1"; shift - eval "$__s_var=\"\$*\"" -} -function echo_setv() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - echo "$__s_var=$(qvalr "$*")" -} -function setx() { - if [ "$1" == -a ]; then - shift - local __s_array="$1"; shift - if [[ "$__s_array" == *=* ]]; then - set -- "${__s_array#*=}" "$@" - __s_array="${__s_array%%=*}" - fi - eval "$__s_array=($("$@" | qlines))" - else - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - eval "$__s_var="'"$("$@")"' - fi -} -function _setvx() { - local __s_var="$1"; shift - eval "$__s_var="'"$("$@")"' -} -function _setax() { - local __s_array="$1"; shift - eval "$__s_array=($("$@" | qlines))" -} -function evalx() { - local __e_val __e_arg __e_r=0 - local -a __e_cmd - - local __e_first=1 - while [ $# -gt 0 ]; do - __e_cmd=() - while [ $# -gt 0 ]; do - __e_arg="$1"; shift - [ "$__e_arg" == // ] && break - if [ "${__e_arg%//}" != "$__e_arg" ]; then - local __e_tmp="${__e_arg%//}" - if [ -z "${__e_tmp//\\/}" ]; then - __e_arg="${__e_arg#\\}" - __e_cmd=("${__e_cmd[@]}" "$__e_arg") - continue - fi - fi - __e_cmd=("${__e_cmd[@]}" "$__e_arg") - done - - if [ -n "$__e_first" ]; then - __e_val="$("${__e_cmd[@]}")" || __e_r=$? - else - __e_val="$("${__e_cmd[@]}" "$__e_val")" || __e_r=$? - fi - __e_first= - done - [ -n "$__e_val" ] && echo "$__e_val" - return $__e_r -} -function setxx() { - local -a __s_args - if [ "$1" == -a ]; then __s_args=(-a); shift; fi - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - __s_args=("${__s_args[@]}" "$__s_var") - setx "${__s_args[@]}" evalx "$@" -} -function evalp() { - local __e_arg __e_cmd - - while [ $# -gt 0 ]; do - __e_arg="$1"; shift - if [ "$__e_arg" == // ]; then - __e_cmd="$__e_cmd |" - continue - elif [ "${__e_arg%//}" != "$__e_arg" ]; then - local __e_tmp="${__e_arg%//}" - if [ -z "${__e_tmp//\\/}" ]; then - __e_arg="${__e_arg#\\}" - fi - fi - __e_cmd="${__e_cmd:+$__e_cmd }\"$(_qval "$__e_arg")\"" - done - eval "$__e_cmd" -} -function setxp() { - local -a __s_args - if [ "$1" == -a ]; then __s_args=(-a); shift; fi - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - __s_args=("${__s_args[@]}" "$__s_var") - setx "${__s_args[@]}" evalp "$@" -} -function testx() { - local __t_op="$1"; shift - local __t_val="$(evalx "$@")" - [ $__t_op "$__t_val" ] -} -function test2x() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalx "$@")" - [ "$__t_val1" $__t_op "$__t_val2" ] -} -function testrx() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalx "$@")" - eval '[[ "$__t_val1" '"$__t_op"' "$__t_val2" ]]' -} -function testp() { - local __t_op="$1"; shift - local __t_val="$(evalp "$@")" - [ $__t_op "$__t_val" ] -} -function test2p() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalp "$@")" - [ "$__t_val1" $__t_op "$__t_val2" ] -} -function testrp() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalp "$@")" - eval '[[ "$__t_val1" '"$__t_op"' "$__t_val2" ]]' -} - -function err2out() { - "$@" 2>&1 -} - -function is_defined() { - [ -n "$(declare -p "$1" 2>/dev/null)" ] -} -function is_array() { - case "$(declare -p "$1" 2>/dev/null)" in declare\ -a*) return 0;; esac - return 1 -} - -function upvar() { - if unset -v "$1"; then - if [ $# -eq 2 ]; then - eval "$1=\"\$2\"" - else - eval "$1=(\"\${@:2}\")" - fi - fi -} -function array_upvar() { - unset -v "$1" && eval "$1=(\"\${@:2}\")" -} -function upvars() { - while [ $# -gt 0 ]; do - case "$1" in - -a) - unset -v "$2" && eval "$2=(\"\${@:3}\")" - break - ;; - -a*) - unset -v "$2" && eval "$2=(\"\${@:3:${1#-a}}\")" - shift $((${1#-a} + 2)) || return 1 - ;; - *) - unset -v "$1" && eval "$1=\"\$2\"" - shift; shift - ;; - esac - done -} - -function __ab_process_pending() { - local -a values - case "$mode" in - cmd) values="$("${pending[@]}")";; - ssplit) eval "values=($("${pending[@]}"))";; - lsplit) eval "values=($("${pending[@]}" | qlines))";; - add) values=("${pending[@]}");; - esac - cmd=("${cmd[@]}" "${values[@]}") - pending=() -} -function array_buildcmd() { - local desta="$1"; shift; local "$desta" - local mode=add - local -a pending cmd - while [ $# -gt 0 ]; do - case "$1" in - ++c|++cmd|++) __ab_process_pending; mode=cmd;; - ++s|++ssplit) __ab_process_pending; mode=ssplit;; - ++l|++lsplit) __ab_process_pending; mode=lsplit;; - ++a|++add) __ab_process_pending; mode=add;; - *) pending=("${pending[@]}" "$1");; - esac - shift - done - __ab_process_pending - array_upvar "$desta" "${cmd[@]}" -} -function buildcmd() { - local -a args - array_buildcmd args "$@" - qvals "${args[@]}" -} -function evalcmd() { - local -a args - array_buildcmd args "$@" - "${args[@]}" -} -##@inc]base.core -##@inc[base.num -## Fonctions de base: gestion des valeurs numériques -uprovide base.num - -function isnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//[0-9]/}" - [ -z "$v" ] -} -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - [ -z "${1//[0-9]/}" ] -} -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//./}" - v="${v//,/}" - v="${v//[0-9]/}" - [ -z "$v" ] -} -##@inc]base.num -##@inc[base.bool -## Fonctions de base: valeurs booléennes -##@inc[base.num -## Fonctions de base: gestion des valeurs numériques -uprovide base.num - -function isnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//[0-9]/}" - [ -z "$v" ] -} -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - [ -z "${1//[0-9]/}" ] -} -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//./}" - v="${v//,/}" - v="${v//[0-9]/}" - [ -z "$v" ] -} -##@inc]base.num -uprovide base.bool -urequire base.num - -function is_yes() { - case "${1,,}" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - esac - isnum "$1" && [ "$1" -ne 0 ] && return 0 - return 1 -} -function is_no() { - case "${1,,}" in - n|non|no|f|faux|false|off) return 0;; - esac - isnum "$1" && [ "$1" -eq 0 ] && return 0 - return 1 -} -function yesval() { - is_yes "$1" && echo 1 -} - -function setb() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - local __s_r - if "$@" >/dev/null; then - eval "$__s_var=1" - else - __s_r=$? - eval "$__s_var=" - return $__s_r - fi -} -function _setb() { - local __s_var="$1"; shift - if "$@" >/dev/null; then - eval "$__s_var=1" - else - eval "$__s_var=" - fi -} - -function evalb() { - if evalx "$@" >/dev/null; then - echo 1 - else - return $? - fi -} -function setxb() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - setx "$__s_var" evalb "$@" -} -##@inc]base.bool -##@inc[base.quote -## Fonctions de base: protection de valeurs chaine -uprovide base.quote -urequire base.core - -function _qawk() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s// -/\\n}" - recho_ "$s" -} -function qawk() { - echo -n \" - _qawk "$@" - echo \" -} -function qseds() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\//\\/}" - s="${s// -/\\n}" - recho "$s" -} -function _qform() { - local s="$*" - s="${s//\%/%25}" - s="${s//+/%2B}" - s="${s//&/%26}" - s="${s//=/%3D}" - s="${s// /+}" - recho_ "$s" -} -function qform() { - local s="$*" - if [[ "$s" == *=* ]]; then - _qform "${s%%=*}" - echo -n = - _qform "${s#*=}" - echo - else - _qform "$s" - echo - fi -} -function _qsql() { - local q="'" qq="''" - echo "${*//$q/$qq}" -} -function qsql() { - local q="'" qq="''" - echo "'${*//$q/$qq}'" -} -##@inc]base.quote -uprovide base.compat -urequire base.core base.num base.bool base.quote - - -function setx2() { setxx "$@"; } -function rawecho() { recho "$@"; } -function rawecho_() { recho_ "$@"; } -function quote_arg() { _qval "$@"; } -function quoted_arg() { qvalm "$@"; } -function quoted_args() { qvals "$@"; } -function set_var() { setv "$@"; } -function set_var_cmd() { echo_setv "$@"; } -function set_var_literal() { eval "$1=$2"; } - -function quote_awk() { _qawk "$@"; } -function quoted_awk() { qawk "$@"; } -function quote_seds() { qseds "$@"; } -function quote_form() { _qform "$@"; } -function quoted_form() { qform "$@"; } - - -if [ -n "$BASH_VERSINFO" -a "${BASH_VERSINFO[0]}" -lt 4 ]; then - function strlower() { tr A-Z a-z <<<"$*"; } - function strlower1() { - local str="$*" - local h="${str:0:1}" r="${str:1}" - echo "$(tr A-Z a-z <<<"$h")$r" - } - function strlowers() { - local -a vs; local v - for v in "$@"; do - vs=("${vs[@]}" "$(strlower1 "$v")") - done - echo "${vs[*]}" - } - function strupper() { tr a-z A-Z <<<"$*"; } - function strupper1() { - local str="$*" - local h="${str:0:1}" r="${str:1}" - echo "$(tr a-z A-Z <<<"$h")$r" - } - function struppers() { - local -a vs; local v - for v in "$@"; do - vs=("${vs[@]}" "$(strupper1 "$v")") - done - echo "${vs[*]}" - } - - function is_yes() { - case "$1" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - O|OUI|Y|YES|V|VRAI|T|TRUE|ON) return 0;; - esac - isnum "$1" && [ "$1" -ne 0 ] && return 0 - case "$(strlower "$1")" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - esac - return 1 - } - function is_no() { - case "$1" in - n|non|no|f|faux|false|off) return 0;; - N|NON|NO|F|FAUX|FALSE|OFF) return 0;; - esac - isnum "$1" && [ "$1" -eq 0 ] && return 0 - case "$(strlower "$1")" in - n|non|no|f|faux|false|off) return 0;; - esac - return 1 - } -fi -##@inc]base.compat -uprovide base -urequire base.init base.core base.string base.num base.bool base.array base.quote base.split base.args base.tools base.compat - -UNAME_SYSTEM=`uname -s` -[ "${UNAME_SYSTEM#CYGWIN}" != "$UNAME_SYSTEM" ] && UNAME_SYSTEM=Cygwin -[ "${UNAME_SYSTEM#MINGW32}" != "$UNAME_SYSTEM" ] && UNAME_SYSTEM=Mingw -UNAME_MACHINE=`uname -m` -if [ -n "$UTOOLS_CHROOT" ]; then - [ -n "$UTOOLS_UNAME_SYSTEM" ] && eval "UNAME_SYSTEM=$UTOOLS_UNAME_SYSTEM" - [ -n "$UTOOLS_UNAME_MACHINE" ] && eval "UNAME_MACHINE=$UTOOLS_UNAME_MACHINE" -fi - -function setyesval() { - is_yes "$2" && set_var "$1" 1 || set_var "$1" "" -} -function normyesval() { - is_yes "${2:-"${!1}"}" && set_var "$1" 1 || set_var "$1" "" -} -function normyesvals() { - local __nyv_yesvar - for __nyv_yesvar in "$@"; do - is_yes "${!__nyv_yesvar}" && set_var "$__nyv_yesvar" 1 || set_var "$__nyv_yesvar" "" - done -} -function quote_in() { - sed 's/\\/\\\\/g -s/"/\\"/g -s/\$/\\$/g -s/`/\\`/g' -} -function quote_sin() { - sed "s/'/'\\\\''/g" -} -function quote_sarg() { - quote_sin <<<"$1" -} -function quoted_sarg() { - echo "'$(quote_sarg "$1")'" -} -function quoted_sargs() { - local a s - for a in "$@"; do - s="${s:+$s }$(quoted_sarg "$a")" - done - rawecho "$s" -} - -function set_array_cmd() { - [ $# -eq 1 ] && set -- "$1" "$1" - local __sac_s __sac_v __sac_f - __sac_s="$1=("; shift - if [ "$1" == "@" ]; then - shift - else - eval "set -- \"\${$1[@]}\"" - fi - __sac_f=1 - for __sac_v in "$@"; do - [ -n "$__sac_f" ] && __sac_f= || __sac_s="$__sac_s " - __sac_s="$__sac_s$(quoted_arg "$__sac_v")" - done - __sac_s="$__sac_s)" - echo "$__sac_s" -} -function set_array() { - eval "$(set_array_cmd "$@")" -} -function array_count() { - eval "echo \${#$1[*]}" -} -function array_isempty() { - [ $(array_count "$1") -eq 0 ] -} -function array_new() { - eval "$1=()" -} -function array_add() { - local __aa_a="$1"; shift - eval "$__aa_a=(\"\${$__aa_a[@]}\" \"\$@\")" -} -function array_ins() { - local __aa_a="$1"; shift - eval "$__aa_a=(\"\$@\" \"\${$__aa_a[@]}\")" -} -function array_del() { - local __ad_v - local -a __ad_vs - eval 'for __ad_v in "${'"$1"'[@]}"; do - if [ "$__ad_v" != '"$(quoted_arg "$2")"' ]; then - array_add __ad_vs "$__ad_v" - fi -done' - array_copy "$1" __ad_vs -} -function array_addu() { - local __as_v - eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then - return 1 - fi -done' - array_add "$1" "$2" - return 0 -} -function array_set() { - array_addu "$@" -} -function array_insu() { - local __as_v - eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then - return 1 - fi -done' - array_ins "$1" "$2" - return 0 -} -function array_fillrange() { - local -a __af_vs - local __af_i="${2:-1}" __af_to="${3:-10}" __af_step="${4:-1}" - while [ "$__af_i" -le "$__af_to" ]; do - __af_vs=("${__af_vs[@]}" "$__af_i") - __af_i=$(($__af_i + $__af_step)) - done - array_copy "$1" __af_vs -} -function array_eq() { - local -a __ae_a1 __ae_a2 - array_copy __ae_a1 "$1" - array_copy __ae_a2 "$2" - [ ${#__ae_a1[*]} -eq ${#__ae_a2[*]} ] || return 1 - local __ae_v __ae_i=0 - for __ae_v in "${__ae_a1[@]}"; do - [ "$__ae_v" == "${__ae_a2[$__ae_i]}" ] || return 1 - __ae_i=$(($__ae_i + 1)) - done - return 0 -} -function array_contains() { - local __ac_v - eval 'for __ac_v in "${'"$1"'[@]}"; do - if [ "$__ac_v" == '"$(quoted_arg "$2")"' ]; then - return 0 - fi -done' - return 1 -} -function array_find() { - local __af_i __af_v - __af_i=0 - eval 'for __af_v in "${'"$1"'[@]}"; do - if [ "$__af_v" == '"$(quoted_arg "$2")"' ]; then - if [ -n "$3" ]; then - echo "${'"$3"'[$__af_i]}" - else - echo "$__af_i" - fi - return 0 - fi - __af_i=$(($__af_i + 1)) -done' - return 1 -} -function array_reverse() { - local -a __ar_vs - local __ar_v - array_copy __ar_vs "$1" - array_new "$1" - for __ar_v in "${__ar_vs[@]}"; do - array_ins "$1" "$__ar_v" - done -} - -function array_replace() { - local __ar_sn="$1"; shift - local __ar_f="$1"; shift - local -a __ar_s __ar_d - local __ar_v - array_copy __ar_s "$__ar_sn" - for __ar_v in "${__ar_s[@]}"; do - if [ "$__ar_v" == "$__ar_f" ]; then - __ar_d=("${__ar_d[@]}" "$@") - else - __ar_d=("${__ar_d[@]}" "$__ar_v") - fi - done - array_copy "$__ar_sn" __ar_d -} -function array_each() { - local __ae_an="$1"; shift - local __ae_f="$1"; shift - local -a __ae_a - local __ae_v - array_copy __ae_a "$__ae_an" - for __ae_v in "${__ae_a[@]}"; do - "$__ae_f" "$__ae_v" "$@" - done -} -function array_map() { - local __am_an="$1"; shift - local __am_f="$1"; shift - local -a __am_a __am_vs - local __am_v - array_copy __am_a "$__am_an" - for __am_v in "${__am_a[@]}"; do - __am_vs=("${__am_vs[@]}" "$("$__am_f" "$__am_v" "$@")") - done - array_copy "$__am_an" __am_vs -} -function first_value() { - eval "rawecho \"\${$1[@]:0:1}\"" -} -function last_value() { - eval "rawecho \"\${$1[@]:\$((-1)):1}\"" -} -function array_copy() { - eval "$1=(\"\${$2[@]}\")" -} -function array_copy_firsts() { - eval "$1=(\"\${${2:-$1}[@]:0:\$((\${#${2:-$1}[@]}-1))}\")" -} -function array_del_last() { - array_copy_firsts "$1" -} -function array_copy_lasts() { - eval "$1=(\"\${${2:-$1}[@]:1}\")" -} -function array_del_first() { - array_copy_lasts "$1" -} -function array_extend() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]}\")" -} -function array_extendu() { - local __ae_v __ae_s=1 - eval 'for __ae_v in "${'"$2"'[@]}"; do - array_addu "$1" "$__ae_v" && __ae_s=0 -done' - return "$__ae_s" -} -function array_extend_firsts() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]:0:\$((\${#$2[@]}-1))}\")" -} -function array_extend_lasts() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]:1}\")" -} -function array_xsplit() { - eval "$1=($(recho_ "$2" | awkrun RS="${3:-:}" ' -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_split() { - eval "$1=($(recho_ "$2" | awkrun RS="${3:-:}" ' -/^$/ { next } -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_from_path() { - array_split "$1" "$2" ":" -} -function array_from_xlines() { - eval "$1=($(recho_ "$2" | _nl2lf | awk ' -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_from_lines() { - eval "$1=($(recho_ "$2" | _nl2lf | awk ' -/^$/ { next } -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_join() { - local __aj_an __aj_l __aj_j __aj_s="${2:-,}" __aj_pf __aj_sf - if [ "$1" == "@" ]; then - __aj_an="\$@" - shift; shift - else - __aj_an="\${$1[@]}" - __aj_pf="$4" - __aj_sf="$5" - fi - eval 'for __aj_l in "'"$__aj_an"'"; do - __aj_j="${__aj_j:+$__aj_j'"$__aj_s"'}$__aj_pf$__aj_l$__aj_sf" -done' - if [ -n "$__aj_j" ]; then - rawecho "$__aj_j" - elif [ "$__aj_an" != "\$@" -a -n "$3" ]; then - rawecho "$3" - fi -} -function array_mapjoin() { - local __amj_src="$1" __amj_func="$2" __amj_sep="$3" - shift; shift; shift - if [ "$__amj_src" == "@" ]; then - local -a __amj_tmpsrc - __amj_tmpsrc=("$@") - __amj_src=__amj_tmpsrc - set -- - fi - local -a __amj_tmp - array_copy __amj_tmp "$__amj_src" - array_map __amj_tmp "$__amj_func" - array_join __amj_tmp "$__amj_sep" "$@" -} -function array_to_lines() { - array_join "$1" " -" "$2" "$3" "$4" -} -function array_to_path() { - array_join "$1" ":" "$2" "$3" "$4" -} -function array_fix_paths() { - local __afp_an="$1" __afp_s="${2:-:}" - local -a __afp_vs - local __afp_v - array_copy __afp_vs "$__afp_an" - array_new "$__afp_an" - for __afp_v in "${__afp_vs[@]}"; do - array_split __afp_v "$__afp_v" "$__afp_s" - array_extend "$__afp_an" __afp_v - done -} - - -function get_date_rfc822() { - LC_TIME=C date +"%a, %d %b %Y %H:%M:%S %Z" -} -function get_date_fr() { - LC_TIME=C date +"%d/%m/%Y" -} -function get_time_fr() { - LC_TIME=C date +"%Hh%M" -} -function parse_date() { - local value="$1" type="${2:-date}" - local now="$(awk 'BEGIN { print mktime(strftime("%Y %m %d 00 00 00 +0400")) }')" - case "$value" in - +*) - value="$(($now + ${value#+} * 86400))" - ;; - *) - value="$(<<<"$value" awk -F/ '{ - nd = strftime("%d"); nm = strftime("%m"); ny = strftime("%Y") - d = $1 + 0; if (d < 1) d = nd; - m = $2 + 0; if (m < 1) m = nm; - if ($3 == "") y = ny; - else { y = $3 + 0; if (y < 100) y = y + 2000; } - print mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d)); - }')" - esac - case "$type" in - d|date) awk '{ print strftime("%d/%m/%Y", $0 + 0) }' <<<"$value";; - l|ldap) awk '{ print strftime("%Y%m%d%H%M%S+0400", $0 + 0) }' <<<"$value";; - m|mysql) awk '{ print strftime("%Y-%m-%d", $0 + 0) }' <<<"$value";; - *) - rawecho "$value" - ;; - esac -} - - -function udelpath() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; ${2:-PATH}"'="${'"${2:-PATH}"'#$1:}"; '"${2:-PATH}"'="${'"${2:-PATH}"'%:$1}"; '"${2:-PATH}"'="${'"${2:-PATH}"'//:$_qdir:/:}"; [ "$'"${2:-PATH}"'" == "$1" ] && '"${2:-PATH}"'=' -} -function uaddpath() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="${'"${2:-PATH}"':+$'"${2:-PATH}"':}$1"' -} -function uinspathm() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="$1${'"${2:-PATH}"':+:$'"${2:-PATH}"'}"' -} -function uinspath() { - udelpath "$@" - uinspathm "$@" -} - -function withpath() { - [ "${1#./}" != "$1" -o "${1#../}" != "$1" -o "${1#/}" != "$1" ] -} -function withext() { - local basename="$(basename -- "$1")" - [ "${basename%.*}" != "$basename" ] -} -function normpath() { - local -a parts - local part ap - array_split parts "$1" / - if [ "${1#/}" != "$1" ]; then - ap=/ - elif [ -n "$2" ]; then - ap="$2" - else - ap="$(pwd)" - fi - for part in "${parts[@]}"; do - if [ "$part" == "." ]; then - continue - elif [ "$part" == ".." ]; then - ap="${ap%/*}" - [ -n "$ap" ] || ap=/ - else - [ "$ap" != "/" ] && ap="$ap/" - ap="$ap$part" - fi - done - rawecho "$ap" -} -function abspath() { - local ap="$1" - if [ "${ap#/}" != "$ap" ]; then - __normpath "$ap" && return - else - local cwd - if [ -n "$2" ]; then - cwd="$(abspath "$2")" - else - cwd="$(pwd)" - fi - ap="$cwd/$ap" - __normpath "$ap" && return - fi - normpath "$ap" -} -function __normpath() { - if [ -d "$1" ]; then - if [ -x "$1" ]; then - (cd "$1"; pwd) - return 0 - fi - elif [ -f "$1" ]; then - local dn="$(dirname -- "$1")" bn="$(basename -- "$1")" - if [ -x "$dn" ]; then - (cd "$dn"; echo "$(pwd)/$bn") - return 0 - fi - fi - return 1 -} -function parentdirs() { - array_new "$1" - local __pd_d="$(abspath "$2")" - if [[ "$3" == r* ]]; then - while [ "$__pd_d" != "/" ]; do - array_ins "$1" "$__pd_d" - __pd_d="$(dirname "$__pd_d")" - done - else - while [ "$__pd_d" != "/" ]; do - array_add "$1" "$__pd_d" - __pd_d="$(dirname "$__pd_d")" - done - fi -} -function ppath() { - local path="$1" cwd="$2" - - path="$(abspath "$path")" # essayer de normaliser le chemin - [ -n "$cwd" ] || cwd="$(pwd)" - - [ "$path" = "$cwd" ] && path="." - [ "$cwd" != "/" -a "$cwd" != "$HOME" ] && path="${path/#$cwd\//}" - path="${path/#$HOME/~}" - - rawecho "$path" -} -function relpath() { - local p="$(abspath "$1" "$3")" cwd="$2" - if [ -z "$cwd" ]; then - cwd="$(pwd)" - else - cwd="$(abspath "$cwd" "$3")" - fi - if [ "$p" == "$cwd" ]; then - echo "" - elif [ "${p#$cwd/}" != "$p" ]; then - rawecho "${p#$cwd/}" - else - local rp - while [ -n "$cwd" -a "${p#$cwd/}" == "$p" ]; do - rp="${rp:+$rp/}.." - cwd="${cwd%/*}" - done - rp="$rp/${p#$cwd/}" - echo "${rp%//}" - fi -} -function relpathx() { - local p="$(relpath "$@")" - if [ -z "$p" ]; then - echo . - elif [ "${p#../}" != "$p" -o "${p#./}" != "$p" ]; then - echo "$p" - else - echo "./$p" - fi -} -function withinpath() { - local b="$1" p="$2" strict="${3:-N}" - b="$(abspath "$b")" - p="$(abspath "$p")" - if is_yes "$strict"; then - [ "${p#$b/}" != "$p" ] - else - [ "$p" == "$b" -o "${p#$b/}" != "$p" ] - fi -} -function safe_abspath() { - local p="$1" ba="$2" br="$3" - if [ -n "$ba" ]; then - ba="$(abspath "$ba")" - else - ba="$(pwd)" - fi - [ -n "$br" ] || br="$ba" - br="$(abspath "$br" "$ba")" - p="$(abspath "$p" "$ba")" - if [ "$p" == "$br" -o "${p#$br/}" != "$p" ]; then - echo "$p" - else - return 1 - fi -} -function safe_relpath() { - local p - if p="$(safe_abspath "$1" "$2" "$3")"; then - relpath "$p" "$2" "$(pwd)" - else - return 1 - fi -} -function splitwcs() { - local __sw_p="$1" - local __sw_dd="${2:-basedir}" __sw_df="${3:-filespec}" __sw_part __sw_d __sw_f - local -a __sw_parts - array_split __sw_parts "$__sw_p" "/" - for __sw_part in "${__sw_parts[@]}"; do - if [[ "$__sw_part" == *\** ]] || [[ "$__sw_part" == *\?* ]] || [ -n "$__sw_f" ]; then - __sw_f="${__sw_f:+$__sw_f/}$__sw_part" - else - __sw_d="${__sw_d:+$__sw_d/}$__sw_part" - fi - done - [ "${__sw_p#/}" != "$__sw_p" ] && __sw_d="/$__sw_d" - set_var "$__sw_dd" "$__sw_d" - set_var "$__sw_df" "$__sw_f" -} -function deref() { - local OENC="$UTF8" - - local max_deref=50 - local file="$1" - local basedir link - while [ -L "$file" ]; do - basedir="$(dirname "$file")" - link="$(readlink "$file")" - if first_char_is "$link" "/"; then - file="$link" - else - file="$basedir/$link" - fi - - max_deref=$(($max_deref - 1)) - [ $max_deref -eq 0 ] && die "Plus de 50 indirection. Le lien $file est-il récursif?" - done - abspath "$file" -} -function readlinka() { - if [ -L "$1" ]; then - local linkdir="$(dirname -- "$1")" - abspath "$(readlink "$1")" "$linkdir" - else - abspath "$1" - fi -} -function readlinkm() { - readlink -m "$1" -} -function path_if_test() { - local op="$1"; shift - local file="$1"; shift - local rel="$1" reldir=; shift - if beginswith "$rel" relative; then - reldir="${rel#relative}" - if beginswith "$reldir" :; then - reldir="${reldir#:}" - if [ -n "$reldir" ]; then - reldir="${reldir}/" - fi - else - reldir= - fi - else - rel= - fi - - while [ -n "$1" ]; do - local basedir="$1" - if [ $op "$basedir/$file" ]; then - if [ -n "$rel" ]; then - rawecho "$reldir$file" - else - rawecho "$basedir/$file" - fi - break - fi - shift - done -} -function update_link() { - [ -L "$2" ] || return 1 - local dest link="$2" - local linkdir="$(dirname "$link")" - local ldest="$(readlink "$link")" - if [ "${ldest#/}" != "$ldest" ]; then - dest="$(abspath "$1")" - else - dest="$(relpath "$1" "$linkdir")" - fi - if [ "$dest" == "$ldest" ]; then - : # pas besoin de mettre à jour - elif [ -d "$link" ]; then - rm -f "$link" && ln -s "$dest" "$link" - else - ln -sf "$dest" "$link" - fi -} -function update_links() { - [ -n "$1" ] || return 1 - local dest="$1"; shift - local r=0 link - for link in "$@"; do - update_link "$dest" "$link" || r=$? - done - return $r -} -function move_link() { - [ -n "$1" -a -n "$2" ] || return 1 - local link="$1" dest="$2" - [ -d "$dest" ] && dest="$dest/$(basename -- "$link")" - dest="$(abspath "$dest")" - if [ -L "$link" ]; then - link="$(abspath "$link")" - [ "$dest" == "$link" ] && return 0 - ldest="$(readlinka "$link")" - mv "$link" "$dest" || return 1 - update_link "$ldest" "$dest" - else - [ "$dest" == "$link" ] && return 0 - mv "$link" "$dest" - fi -} -function array_find_links() { - local -a __afl_links __afl_result - local __afl_dir="${3:-.}" - local __afl_dest __afl_destname __afl_link __afl_linkdir __afl_ldest - __afl_dest="$(abspath "$2")" - __afl_destname="${__afl_dest##*/}" - array_from_lines __afl_links "$(find "$__afl_dir" -type l)" - for __afl_link in "${__afl_links[@]}"; do - __afl_ldest="$(readlink "$__afl_link")" - if [ "$__afl_ldest" != "$__afl_destname" ]; then - [[ "$__afl_ldest" == */"$__afl_destname" ]] || continue - fi - __afl_link="$(abspath "$__afl_link" "$__afl_dir")" - __afl_linkdir="$(dirname -- "$__afl_link")" - __afl_ldest="$(abspath "$__afl_ldest" "$__afl_linkdir")" - if [ "$__afl_ldest" == "$__afl_dest" ]; then - array_add __afl_result "$__afl_link" - fi - done - array_copy "$1" __afl_result -} -function list_links() { - local -a links - array_find_links links "$@" - array_to_lines links -} -function move_file() { - [ -n "$1" -a -n "$2" ] || return 1 - local src="$1" dest="$2" link - shift; shift - [ -d "$dest" ] && dest="$dest/$(basename -- "$src")" - move_link "$src" "$dest" || return 1 - update_links "$dest" "$@" -} - -function get_nblines() { - [ -f "$1" ] && sed -ne '$=' "$1" || echo 0 -} -function mktempf() { - mktemp "${1:-"$TMPDIR/tmp.XXXXXX"}" -} -function mktempd() { - mktemp -d "${1:-"$TMPDIR/tmp.XXXXXX"}" -} -function mkdirof() { - mkdir -p "$(dirname -- "$1")" -} -function cp_a() { - /bin/cp -a "$@" -} -function cp_R() { - /bin/cp -pR "$@" -} -function quietgrep() { - grep -q "$@" 2>/dev/null -} -function quietdiff() { - diff -q "$@" >&/dev/null -} -function testsame() { - quietdiff "$@" -} -function testdiff() { - ! quietdiff "$@" -} -function testupdated() { - if [ -f "$2" ]; then - testdiff "$1" "$2" - else - return 0 - fi -} -function testnewer() { - test ! -e "$2" -o "$1" -nt "$2" -} -function ps_all() { - ps -axww -} -function progexists() { - test -n "$1" -a -x "$(which "$1" 2>/dev/null)" -} -function has_python() { - progexists python -} -function has_gawk() { - progexists gawk -} -function is_root() { - test `id -u` -eq 0 -} -function source_ifexists() { - if [ -f "$1" ]; then source "$1" || die; fi -} -function little_sleep { - LC_NUMERIC=C sleep 0.1 -} -function random_sleep { - sleep $(($RANDOM % ${1:-1800})) -} -function is_running() { - kill -0 "$1" >&/dev/null -} -function sedi() { - sed -i "$@" -} -function csort() { - LANG=C sort "$@" -} -function lsort() { sort "$@"; } -function cgrep() { - LANG=C grep "$@" -} -function lgrep() { grep "$@"; } -function csed() { - LANG=C sed "$@" -} -function lsed() { sed "$@"; } -function cawk() { - LANG=C awk "$@" -} -function lawk() { awk "$@"; } -function cdiff() { - LANG=C diff "$@" -} -function ldiff() { diff "$@"; } - - -function fix_mode() { - local file="$1" - [ -f "$file" ] || touch "$file" || return 1 - if [ ! -w "$file" ]; then - local mode="$(stat -c %a "$file")" - chmod ${mode:0:${#mode}-3}6${mode:${#mode}-2:2} "$file" - echo "$mode" - fi -} -function unfix_mode() { - [ -n "$2" ] && chmod "$2" "$1" -} -function get_mode() { - [ -f "$1" ] || touch "$1" || return 1 - stat -c %a "$1" -} -function rm_maybe() { - local parse_opts=1 arg rm - for arg in "$@"; do - if [ -n "$parse_opts" ]; then - if [ "$arg" == "--" ]; then - parse_opts= - elif [[ "$arg" == "-*" ]]; then - continue - elif [ -n "$arg" ]; then - rm=1 - break - fi - elif [ -n "$arg" ]; then - rm=1 - break - fi - done - [ -n "$rm" ] && /bin/rm "$@" -} -__CPDIR_RSYNC_SLOW=1 # synchro potentiellement plus lente, mais plus fidèle (option -c) -__CPDIR_RSYNC_ARGS=(-q) -function cpdir() { - - if progexists rsync; then - [ -d "$2" ] || mkdir -p "$2" || return 1 - if [ -d "$1" ]; then - rsync -a ${__CPDIR_RSYNC_SLOW:+-c} "${__CPDIR_RSYNC_ARGS[@]}" "$1/" "$2/" - else - rsync -a ${__CPDIR_RSYNC_SLOW:+-c} "${__CPDIR_RSYNC_ARGS[@]}" "$1" "$2/" - fi - else - __cpdir "$@" - fi -} -function __cpdir() { - local src="$1" dest="$2" method="${3:-cp_a}" - - if [ -d "$src" ]; then - [ -d "$dest" ] || mkdir -p "$dest" || return 1 - - local prevdir="$(pwd)" - - dest="$(abspath "$dest")" - cd "$src" - if [ -n "$(/bin/ls -a1)" ]; then - [ -n "$(/bin/ls -1)" ] && "$method" * "$dest" - local i - for i in .*; do - [ "$i" == "." -o "$i" == ".." ] && continue - "$method" "$i" "$dest" - done - fi - cd "$prevdir" - else - if [ -f "$dest" ]; then - "$method" "$src" "$dest" - elif [ -d "$dest" ]; then - "$method" "$src" "$dest" - else - mkdir -p "$dest" - "$method" "$src" "$dest" - fi - fi -} -__CPNOVCS_RSYNC_SLOW=1 # synchro potentiellement plus lente, mais plus fidèle (option -c) -__CPNOVCS_RSYNC_ARGS=(-q) -function cpnovcs() { - local src="$1" destdir="$2" - [ -d "$destdir" ] || mkdir -p "$destdir" || return 1 - if progexists rsync; then - local gitexclude=/.git/ - if [ "${src%/}" == "$src" ]; then - gitexclude="/$(basename -- "$src")$gitexclude" - fi - rsync -a ${__CPNOVCS_RSYNC_SLOW:+-c} --exclude CVS/ --exclude .svn/ --exclude "$gitexclude" "${__CPNOVCS_RSYNC_ARGS[@]}" "$src" "$destdir/" - elif [ "${src%/}" != "$src" ]; then - __cpdir "$src" "$destdir" - else - local srcname="$(basename -- "$src")" - mkdir -p "$destdir/$srcname" - __cpdir "$src" "$destdir/$srcname" - fi -} -function cpdirnovcs() { - if [ -d "$1" ]; then - cpnovcs "$1/" "$2" - else - cpnovcs "$1" "$2" - fi -} -function doinplace() { - if [ -n "$1" -a "$1" != "-" ]; then - local __dip_file="$1"; shift - autoclean "$__dip_file.tmp.$$" - "$@" <"$__dip_file" >"$__dip_file.tmp.$$" - local s=$? - [ "$s" == 0 ] && /bin/cat "$__dip_file.tmp.$$" >"$__dip_file" - /bin/rm -f "$__dip_file.tmp.$$" - return $s - else - shift - "$@" - fi -} -function doinplacef() { - if [ -n "$1" -a "$1" != "-" ]; then - local __dip_file="$1"; shift - autoclean "$__dip_file.tmp.$$" - "$@" <"$__dip_file" >"$__dip_file.tmp.$$" - local s=$? - /bin/cat "$__dip_file.tmp.$$" >"$__dip_file" - /bin/rm -f "$__dip_file.tmp.$$" - return $s - else - shift - "$@" - fi -} -function stripnl() { - tr -d '\r\n' -} -function _nl2lf() { - awk 'BEGIN {RS="\r|\r\n|\n"} {print}' -} -function nl2lf() { - doinplace "$1" _nl2lf -} -function _nl2crlf() { - awk 'BEGIN {RS="\r|\r\n|\n"} {print $0 "\r"}' -} -function nl2crlf() { - doinplace "$1" _nl2crlf -} -function _nl2cr() { - awk 'BEGIN {RS="\r|\r\n|\n"; ORS=""} {print $0 "\r"}' -} -function nl2cr() { - doinplace "$1" _nl2cr -} -function _latin1compat() { - LANG=fr_FR.UTF-8 sed $' -s/[‘’]/\x27/g -s/[«»“”]/"/g -s/[\xC2\xA0\xE2\x80\x87\xE2\x80\xAF\xE2\x81\xA0]/ /g -' -} -function _noaccents() { - LANG=fr_FR.UTF-8 sed ' -s/[à]/a/g -s/[éèêë]/e/g -s/[ïî]/i/g -s/[ôö]/o/g -s/[üû]/u/g -s/[ç]/c/g -s/[À]/A/g -s/[ÉÈÊË]/E/g -s/[ÏÎ]/I/g -s/[ÔÖ]/O/g -s/[ÜÛ]/U/g -s/[Ç]/C/g -' -} -function list_all() { - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ "$f" == "." -o "$f" == ".." ] && continue - rawecho "$f" - done - cd "$curdir" -} -function __la_cmd() { - [ $# -gt 0 ] || set '*' - local arg - local cmd="/bin/ls -1d" - for arg in "$@"; do - arg="$(_rval "$arg")" - cmd="$cmd $arg" - done - cmd="$cmd 2>/dev/null" - echo "$cmd" -} -function list_files() { - local f - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ -f "$f" ] && rawecho "$f" - done - cd "$curdir" -} -function list_dirs() { - local f - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ "$f" == "." -o "$f" == ".." ] && continue - [ -d "$f" ] && rawecho "$f" - done - cd "$curdir" -} -function __array_ls() { - local __al_l="list_${1:-all}"; shift - local __al_an="$1"; shift - local __al_d="${1:-.}"; shift - local -a __al_fs - array_from_lines __al_fs "$("$__al_l" "$__al_d" "$@")" - local __al_f - array_new "$__al_an" - for __al_f in "${__al_fs[@]}"; do - array_add "$__al_an" "$__al_d/$__al_f" - done -} -function array_lsall() { - __array_ls all "$@" -} -function array_lsdirs() { - __array_ls dirs "$@" -} -function array_lsfiles() { - __array_ls files "$@" -} -function filter_empty() { - sed '/^$/d' -} -function filter_vcspath() { - sed ' -/^.git$/d -/^.git\//d -/\/.git$/d -/\/.git\//d -/^.svn$/d -/^.svn\//d -/\/.svn$/d -/\/.svn\//d -' -} -function merge_contlines() { - awk 'substr($0, length($0)) == "\\" { - while (getline nextline) { - $0 = substr($0, 1, length($0) - 1) nextline - if (substr($0, length($0)) != "\\") break - } - print - next -} -{print}' -} -function filter_comment() { - local -a merge - [ "$1" == -m ] && merge=(merge_contlines) || merge=(cat) - awk ' - /^[ \t]*#/ { next } - /^[ \t]*$/ { next } - { print }' | "${merge[@]}" -} -function filter_conf() { - local -a merge - [ "$1" == -m ] && merge=(merge_contlines) || merge=(cat) - grep -v '^#' | grep -v '^$' | "${merge[@]}" -} -function is_archive() { - local name="${1%.zip}" - name="${name%.tgz}" - name="${name%.tbz2}" - name="${name%.tar.gz}" - name="${name%.tar.bz2}" - name="${name%.tar}" - name="${name%.jar}" - name="${name%.war}" - name="${name%.ear}" - [ "$name" != "$1" ] -} -function extract_archive() { - local arch="$1" destdir="${2:-.}" - shift; shift - if endswith "$arch" .zip; then - unzip -q -d "$destdir" "$arch" "$@" || return - elif endswith "$arch" .tgz || endswith "$arch" .tar.gz; then - tar xzf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .tbz2 || endswith "$arch" .tar.bz2; then - tar xjf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .tar; then - tar xf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .jar || endswith "$arch" .war || endswith "$arch" .ear; then - ( - arch="$(abspath "$arch")" - cd "$destdir" - jar xf "$arch" "$@" - ) || return - else - return 1 - fi -} -function get_archive_basename() { - local basename="$(basename -- "$1")" - basename="${basename%.zip}" - basename="${basename%.tgz}" - basename="${basename%.tbz2}" - basename="${basename%.gz}" - basename="${basename%.bz2}" - basename="${basename%.tar}" - basename="${basename%.jar}" - basename="${basename%.war}" - basename="${basename%.ear}" - echo "$basename" -} -function get_archive_appname() { - local appname="$(basename -- "$1")" - appname="${appname%.zip}" - appname="${appname%.tgz}" - appname="${appname%.tbz2}" - appname="${appname%.gz}" - appname="${appname%.bz2}" - appname="${appname%.tar}" - appname="${appname%.jar}" - appname="${appname%.war}" - appname="${appname%.ear}" - echo "$appname" | awk '{ - if (match($0, /[-_.]([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/)) { - print substr($0, 1, RSTART - 1) - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/)) { - print substr($0, 1, RSTART - 1) - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print substr($0, 1, RSTART - 1) - } else { - print $0 - } -}' -} -function get_archive_versionsuffix() { - local basename="$(get_archive_basename "$1")" - echo "$basename" | awk '{ - if (match($0, /([-_.][0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print vs["1"] - } -}' -} -function get_archive_version() { - local basename="$(get_archive_basename "$1")" - echo "$basename" | awk '{ - if (match($0, /[-_.]([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print vs["1"] - } -}' -} -function __dump_usernames() { - = 500 && $6 ~ /^\/home\// { print $1 }' -} -function dump_usernames() { - array_from_lines "${1:-usernames}" "$(__dump_usernames)" -} -function __resolv_ips() { - LANG=C host "$1" 2>/dev/null | awk '/address / { gsub(/^.*address /, ""); print }' -} -function resolv_ips() { - array_from_lines "${1:-ips}" "$(__resolv_ips "$2")" -} -function __resolv_hosts() { - LANG=C host "$1" 2>/dev/null | awk '/domain name pointer / { gsub(/^.*domain name pointer /, ""); gsub(/\.$/, ""); print }' -} -function resolv_hosts() { - array_from_lines "${1:-hosts}" "$(__resolv_hosts "$2")" -} -function runscript_as() { - local OENC="$UTF8" - local user="${1:-root}"; shift - local exec_maybe= - if [ "$1" = "exec" ]; then - exec_maybe=exec - shift - fi - - local cmd - cmd="\ -__estack=$(quoted_arg "$__estack") -__tlevel=$(quoted_args "$__tlevel") -export __estack __tlevel -exec ${BASH:-/bin/sh} $(quoted_args "$@")" - - if is_yes "$UTOOLS_USES_SU" || ! progexists sudo; then - eecho "Entrez le mot de passe de root" - $exec_maybe su "$user" -c "$cmd" - else - if [ "$user" == "root" ]; then - $exec_maybe sudo -p "Entrez le mot de passe de %u: " "${BASH:-/bin/sh}" -c "$cmd" - else - $exec_maybe sudo -p "Entrez le mot de passe de %u: " su "$user" -c "$cmd" - fi - fi -} -function runscript_as_root() { - if is_root; then - local exec_maybe= - if [ "$1" = "exec" ]; then - exec_maybe=exec - shift - fi - $exec_maybe "${BASH:-/bin/sh}" "$@" - else - runscript_as root "$@" - fi -} -function run_as() { - local user="${1:-root}"; shift - local exec_maybe=exec - if [ "$1" = "--noexec" ]; then - exec_maybe= - shift - fi - - runscript_as "$user" $exec_maybe "$0" "$@" -} -function run_as_root() { - is_root || run_as root "$@" -} -function check_user() { - local user - for user in "$@"; do - [ "$USER" == "$user" ] && return 0 - done - return 1 -} -function ensure_user() { - local -a users - while [ $# -gt 0 -a "$1" != "--" ]; do - array_add users "$1" - shift - done - [ "$1" == "--" ] && shift - - if ! check_user "${users[@]}"; then - if [ ${#users[*]} -gt 1 ]; then - ewarn "Cette commande doit être lancée avec l'un des users ${users[*]}" - else - ewarn "Cette commande doit être lancée avec le user ${users[0]}" - fi - if ask_yesno "Voulez-vous tenter de relancer la commande avec le bon user?" O; then - estep "Lancement du script avec le user ${users[0]}" - run_as "${users[0]}" "$@" - return 1 - elif is_root; then - return 11 - else - return 10 - fi - fi - return 0 -} -function check_hostname() { - local userhost user host path - for userhost in "$@"; do - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - [ "$MYHOSTNAME" == "${host%%.*}" ] && return 0 - done - return 1 -} -function check_userhostname() { - local userhost path user host - for userhost in "$@"; do - if check_hostname "$userhost"; then - [[ "$userhost" == *@* ]] || return 0 - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - check_user "$user" && return 0 - fi - done - return 1 -} -UTOOLS_ENSURE_HOSTNAME_SSH_OPTS=() -function ensure_hostname() { - local -a userhosts - while [ $# -gt 0 -a "$1" != "--" ]; do - array_add userhosts "$1" - shift - done - [ "$1" == "--" ] && shift - - local userhost user host path - if ! check_hostname "${userhosts[@]}"; then - if [ ${#userhosts[*]} -gt 1 ]; then - ewarn "Cette commande n'est valide que sur l'un des hôtes ${userhosts[*]}" - else - ewarn "Cette commande n'est valide que sur l'hôte ${userhosts[0]}" - fi - - enote "Vous pouvez tenter de relancer le script sur ${userhosts[0]}, mais cela requière que ce script ET les données dont il a besoin soient installés dans la même version et dans le même répertoire sur l'hôte distant" - if ask_yesno "Voulez-vous tenter de relancer le script sur l'hôte distant?" N; then - splitfsep "${userhosts[0]}" : userhost path - splituserhost "$userhost" user host - [ -n "$user" ] || user=root - - estep "Lancement de la commande sur l'hôte distant $user@$host" - local cmd - [ -n "$path" ] && cmd="$(quoted_args cd "$path"); " - cmd="$cmd$(quoted_args "$script" "$@")" - ssh -qt "${UTOOLS_ENSURE_HOSTNAME_SSH_OPTS[@]}" "$user@$host" "$cmd" - [ $? -eq 255 ] && return 12 - return 1 - else - return 11 - fi - fi - local userhost user host - for userhost in "${userhosts[@]}"; do - [[ "$userhost" == *@* ]] || continue - if check_hostname "$userhost"; then - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - [ -n "$path" ] && cd "$path" - ensure_user "$user" -- "$@" - return $? - fi - done - return 0 -} - -__AWKDEF_FUNCTIONS=' -function quote_html(s) { - gsub(/&/, "\\&", s) - gsub(/"/, "\\"", s) - gsub(/>/, "\\>", s) - gsub(/", s) - gsub(/"/, "\"", s) - gsub(/&/, "\\&", s) - return s -} -function quote_value(s) {'" - gsub(/'/, \"'\\\\''\", s) - return \"'\" s \"'\" -"'} -function quoted_values( i, line) { - line = "" - for (i = 1; i <= NF; i++) { - if (i > 1) line = line " " - line = line quote_value($i) - } - return line -} -function quote_subrepl(s) { - gsub(/\\/, "\\\\", s) - gsub(/&/, "\\\\&", s) - return s -} -function quote_grep(s) { - gsub(/[[\\.^$*]/, "\\\\&", s) - return s -} -function quote_egrep(s) { - gsub(/[[\\.^$*+?()|{]/, "\\\\&", s) - return s -} -function quote_sql(s) {'" - gsub(/'/, \"''\", s) - return \"'\" s \"'\" -"'} -function unquote_mysqlcsv(s) { - gsub(/\\n/, "\n", s) - gsub(/\\t/, "\t", s) - gsub(/\\0/, "\0", s) - gsub(/\\\\/, "\\", s) - return s -} -function array_new(dest) { - dest[0] = 0 # forcer awk à considérer dest comme un tableau - delete dest -} -function array_newsize(dest, size, i) { - dest[0] = 0 # forcer awk à considérer dest comme un tableau - delete dest - size = int(size) - for (i = 1; i <= size; i++) { - dest[i] = "" - } -} -function array_len(values, count, i) { - count = 0 - for (i in values) { - count++ - } - return count -} -function mkindices(values, indices, i, j) { - array_new(indices) - j = 1 - for (i in values) { - indices[j++] = int(i) - } - return asort(indices) -} -function array_copy(dest, src, count, indices, i) { - array_new(dest) - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - dest[indices[i]] = src[indices[i]] - } -} -function array_getlastindex(src, count, indices) { - count = mkindices(src, indices) - if (count == 0) return 0 - return indices[count] -} -function array_add(dest, value, lastindex) { - lastindex = array_getlastindex(dest) - dest[lastindex + 1] = value -} -function array_deli(dest, i, l) { - i = int(i) - if (i == 0) return - l = array_len(dest) - while (i < l) { - dest[i] = dest[i + 1] - i++ - } - delete dest[l] -} -function array_del(dest, value, ignoreCase, i) { - do { - i = key_index(value, dest, ignoreCase) - if (i != 0) array_deli(dest, i) - } while (i != 0) -} -function array_extend(dest, src, count, lastindex, indices, i) { - lastindex = array_getlastindex(dest) - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - dest[lastindex + i] = src[indices[i]] - } -} -function array_fill(dest, i) { - array_new(dest) - for (i = 1; i <= NF; i++) { - dest[i] = $i - } -} -function array_getline(src, count, indices, i, j) { - $0 = "" - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - j = indices[i] - $j = src[j] - } -} -function array_appendline(src, count, indices, i, nf, j) { - count = mkindices(src, indices) - nf = NF - for (i = 1; i <= count; i++) { - j = nf + indices[i] - $j = src[indices[i]] - } -} -function in_array(value, values, ignoreCase, i) { - if (ignoreCase) { - value = tolower(value) - for (i in values) { - if (tolower(values[i]) == value) return 1 - } - } else { - for (i in values) { - if (values[i] == value) return 1 - } - } - return 0 -} -function key_index(value, values, ignoreCase, i) { - if (ignoreCase) { - value = tolower(value) - for (i in values) { - if (tolower(values[i]) == value) return int(i) - } - } else { - for (i in values) { - if (values[i] == value) return int(i) - } - } - return 0 -} -function array2s(values, prefix, sep, suffix, noindices, first, i, s) { - if (!prefix) prefix = "[" - if (!sep) sep = ", " - if (!suffix) suffix = "]" - s = prefix - first = 1 - for (i in values) { - if (first) first = 0 - else s = s sep - if (!noindices) s = s "[" i "]=" - s = s values[i] - } - s = s suffix - return s -} -function array2so(values, prefix, sep, suffix, noindices, count, indices, i, s) { - if (!prefix) prefix = "[" - if (!sep) sep = ", " - if (!suffix) suffix = "]" - s = prefix - count = mkindices(values, indices) - for (i = 1; i <= count; i++) { - if (i > 1) s = s sep - if (!noindices) s = s "[" indices[i] "]=" - s = s values[indices[i]] - } - s = s suffix - return s -} -function array_join(values, sep, prefix, suffix, count, indices, i, s) { - s = prefix - count = mkindices(values, indices) - for (i = 1; i <= count; i++) { - if (i > 1) s = s sep - s = s values[indices[i]] - } - s = s suffix - return s -} -function printto(s, output) { - if (output == "") { - print s - } else if (output ~ /^>>/) { - sub(/^>>/, "", output) - print s >>output - } else if (output ~ /^>/) { - sub(/^>/, "", output) - print s >output - } else { - print s >output - } -} -function find_line(input, field, value, orig, line) { - orig = $0 - line = "" - while ((getline 0) { - if ($field == value) { - line = $0 - break - } - } - close(input) - $0 = orig - return line -} -function merge_line(input, field, key, line) { - line = find_line(input, field, $key) - if (line != "") $0 = $0 FS line -} -function __csv_parse_quoted(line, destl, colsep, qchar, echar, pos, tmpl, nextc, resl) { - line = substr(line, 2) - resl = "" - while (1) { - pos = index(line, qchar) - if (pos == 0) { - resl = resl line - destl[0] = "" - destl[1] = 0 - return resl - } - if (echar != "" && pos > 1) { - prevc = substr(line, pos - 1, 1) - quotec = substr(line, pos, 1) - nextc = substr(line, pos + 1, 1) - if (prevc == echar) { - tmpl = substr(line, 1, pos - 2) - resl = resl tmpl quotec - line = substr(line, pos + 1) - continue - } - tmpl = substr(line, 1, pos - 1) - if (nextc == colsep || nextc == "") { - resl = resl tmpl - destl[0] = substr(line, pos + 2) - destl[1] = nextc == colsep - return resl - } else { - resl = resl tmpl quotec - line = substr(line, pos + 1) - } - } else { - tmpl = substr(line, 1, pos - 1) - quotec = substr(line, pos, 1) - nextc = substr(line, pos + 1, 1) - if (nextc == colsep || nextc == "") { - resl = resl tmpl - destl[0] = substr(line, pos + 2) - destl[1] = nextc == colsep - return resl - } else if (nextc == qchar) { - resl = resl tmpl quotec - line = substr(line, pos + 2) - } else { - resl = resl tmpl quotec - line = substr(line, pos + 1) - } - } - } -} -function __csv_parse_unquoted(line, destl, colsep, qchar, echar, pos) { - pos = index(line, colsep) - if (pos == 0) { - destl[0] = "" - destl[1] = 0 - return line - } else { - destl[0] = substr(line, pos + 1) - destl[1] = 1 - return substr(line, 1, pos - 1) - } -} -function __array_parsecsv(fields, line, nbfields, colsep, qchar, echar, shouldparse, destl, i) { - array_new(fields) - array_new(destl) - i = 1 - shouldparse = 0 - while (shouldparse || line != "") { - if (index(line, qchar) == 1) { - value = __csv_parse_quoted(line, destl, colsep, qchar, echar) - line = destl[0] - shouldparse = destl[1] - } else { - value = __csv_parse_unquoted(line, destl, colsep, qchar, echar) - line = destl[0] - shouldparse = destl[1] - } - fields[i] = value - i = i + 1 - } - if (nbfields) { - nbfields = int(nbfields) - i = array_len(fields) - while (i < nbfields) { - i++ - fields[i] = "" - } - } - return array_len(fields) -} -BEGIN { - DEFAULT_COLSEP = "," - DEFAULT_QCHAR = "\"" - DEFAULT_ECHAR = "" -} -function array_parsecsv2(fields, line, nbfields, colsep, qchar, echar) { - return __array_parsecsv(fields, line, nbfields, colsep, qchar, echar) -} -function array_parsecsv(fields, line, nbfields, colsep, qchar, echar) { - if (colsep == "") colsep = DEFAULT_COLSEP - if (qchar == "") qchar = DEFAULT_QCHAR - if (echar == "") echar = DEFAULT_ECHAR - return __array_parsecsv(fields, line, nbfields, colsep, qchar, echar) -} -function parsecsv(line, fields) { - array_parsecsv(fields, line) - array_getline(fields) - return NF -} -function getlinecsv(file, fields) { - if (file) { - getline 1) line = line colsep - if (qchar != "" && index(value, qchar) != 0) { - if (echar != "") gsub(qchar, quote_subrepl(echar) "&", value); - else gsub(qchar, "&&", value); - } - if (qchar != "" && (index(value, mvsep) != 0 || index(value, colsep) != 0 || index(value, qchar) != 0 || __csv_should_quote(value))) { - line = line qchar value qchar - } else { - line = line value - } - } - return line -} -function array_formatcsv(fields) { - return array_formatcsv2(fields, ",", ";", "\"", "") -} -function array_printcsv(fields, output) { - printto(array_formatcsv(fields), output) -} -function get_formatcsv( fields) { - array_fill(fields) - return array_formatcsv(fields) -} -function formatcsv() { - $0 = get_formatcsv() -} -function printcsv(output, fields) { - array_fill(fields) - array_printcsv(fields, output) -} -function array_findcsv(fields, input, field, value, nbfields, orig, found, i) { - array_new(orig) - array_fill(orig) - array_new(fields) - found = 0 - while ((getline 0) { - array_parsecsv(fields, $0, nbfields) - if (fields[field] == value) { - found = 1 - break - } - } - close(input) - array_getline(orig) - if (!found) { - delete fields - if (nbfields) { - nbfields = int(nbfields) - i = array_len(fields) - while (i < nbfields) { - i++ - fields[i] = "" - } - } - } - return found -} - -function __and(var, x, l_res, l_i) { - l_res=0; - for (l_i=0; l_i < 8; l_i++){ - if (var%2 == 1 && x%2 == 1) l_res=l_res/2 + 128; - else l_res/=2; - var=int(var/2); - x=int(x/2); - } - return l_res; -} -function __lshift(var, x) { - while(x > 0){ - var*=2; - x--; - } - return var; -} -function __rshift(var, x) { - while(x > 0){ - var=int(var/2); - x--; - } - return var; -} -BEGIN { - __BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" -} -function b64decode(src, result, base1, base2, base3, base4) { - result = "" - while (length(src) > 0) { - base1 = substr(src, 1, 1) - base2 = substr(src, 2, 1) - base3 = substr(src, 3, 1); if (base3 == "") base3 = "=" - base4 = substr(src, 4, 1); if (base4 == "") base4 = "=" - byte1 = index(__BASE64, base1) - 1 - if (byte1 < 0) byte1 = 0 - byte2 = index(__BASE64, base2) - 1 - if (byte2 < 0) byte2 = 0 - byte3 = index(__BASE64, base3) - 1 - if (byte3 < 0) byte3 = 0 - byte4 = index(__BASE64, base4) - 1 - if (byte4 < 0) byte4 = 0 - result = result sprintf( "%c", __lshift(__and(byte1, 63), 2) + __rshift(__and(byte2, 48), 4) ) - if (base3 != "=") result = result sprintf( "%c", __lshift(__and(byte2, 15), 4) + __rshift(__and(byte3, 60), 2) ) - if (base4 != "=") result = result sprintf( "%c", __lshift(__and(byte3, 3), 6) + byte4 ) - src = substr(src, 5) - } - return result -} -' -function awkdef() { - - if [ "${1:0:3}" == "-f" ]; then - shift - echo "$__AWKDEF_FUNCTIONS" - fi - if [ $# -gt 0 ]; then - local __ad_arg __ad_vpos __ad_name __ad_value - echo "BEGIN {" - while [ -n "${1:0:1}" ]; do - __ad_arg="${1:0:256}" - local __ad_array= - if [ "${__ad_arg%\[@\]}" != "$__ad_arg" ]; then - __ad_array=1 - __ad_name="${__ad_arg%\[@\]}" - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_value="$__ad_name" - elif [[ "$__ad_arg" == *\[@\]=* ]]; then - __ad_array=1 - __ad_name="${__ad_arg%%\[@\]=*}" - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_vpos=$((${#__ad_name} + 4)) - __ad_value="${1:$__ad_vpos}" - [ ${#__ad_value} -ne 0 ] || __ad_value="$__ad_name" - elif [[ "$__ad_arg" == *=* ]]; then - local __ad_int= __ad_str= - __ad_name="${__ad_arg%%=*}" - __ad_vpos=$((${#__ad_name} + 1)) - if [ "${__ad_name%:int}" != "$__ad_name" ]; then - __ad_int=1 - __ad_name="${__ad_name%:int}" - elif [ "${__ad_name%:str}" != "$__ad_name" ]; then - __ad_str=1 - __ad_name="${__ad_name%:str}" - fi - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_value="${1:$__ad_vpos}" - if [ -n "$__ad_int" ]; then - echo "$__ad_name = int($(quoted_awk "$__ad_value") + 0)" - elif [ -n "$__ad_str" ]; then - echo "$__ad_name = $(quoted_awk "$__ad_value")" - elif [ ${#__ad_value} -lt 256 ] && isnum "$__ad_value"; then - echo "$__ad_name = $__ad_value" - else - echo "$__ad_name = $(quoted_awk "$__ad_value")" - fi - else - break - fi - if [ -n "$__ad_array" ]; then - if [ "${__ad_value:0:2}" == $'<\n' ]; then - local -a __ad_values - array_from_lines __ad_values "${__ad_value:2}" - __ad_value=__ad_values - fi - __ad_value="${__ad_value}[@]" - local __ad_i=1 - echo "$__ad_name[0] = 0; delete $__ad_name" - for __ad_arg in "${!__ad_value}"; do - echo "$__ad_name[$__ad_i]=$(quoted_awk "$__ad_arg")" - __ad_i=$(($__ad_i + 1)) - done - eval "echo \"\${__ad_name}_count = \${#$__ad_value}\"" - fi - shift - done - echo "}" - for __ad_arg in "$@"; do - rawecho "$__ad_arg" - done - fi -} -function lawkrun() { - local -a __ar_defs __ar_args - while [ $# -gt 0 -a "$1" != "--" ]; do - __ar_defs=("${__ar_defs[@]}" "$1") - shift - done - shift - while [ $# -gt 0 ]; do - __ar_args=("${__ar_args[@]}" "$1") - shift - done - local __ar_script="$(awkdef "${__ar_defs[@]}")" - awk "$__ar_script" "${__ar_args[@]}" -} -function cawkrun() { LANG=C lawkrun "$@"; } -function awkrun() { LANG=C lawkrun "$@"; } - -function __lf_get_age() { - local y=$(date "+%Y") - local dy=$(date "+%j"); while [ "${dy#0}" != "$dy" ]; do dy="${dy#0}"; done - [ -n "$dy" ] || dy=0 - local h=$(date "+%H"); while [ "${h#0}" != "$h" ]; do h="${h#0}"; done - [ -n "$h" ] || h=0 - echo $((($y * 365 + $dy) * 24 + $h)) -} -function lf_trylock() { - local eoo lockfile max_hours=4 - while [ -n "$1" ]; do - case "$1" in - -h) shift; max_hours="$1";; - --) shift; eoo=1;; - *) eoo=1;; - esac - [ -n "$eoo" ] && break - shift - done - - lockfile="$1" - [ -n "$lockfile" ] || die "il faut spécifier un fichier pour le verrou" - - local now="$(__lf_get_age)" - if (set -C; echo "$now" >"$lockfile") 2>/dev/null; then - return 0 - fi - local prev diff - if prev="$(<"$lockfile")"; then - diff="$(($now - $prev))" - if [ "$diff" -gt "$max_hours" ]; then - echo stale - else - echo locked - fi - elif [ -f "$lockfile" ]; then - echo retry - fi - return 1 -} -function pidfile_set() { - local eoo pidfile pid=$$ replace= - while [ -n "$1" ]; do - case "$1" in - -p) - shift - pid="$1" - ;; - -r) - replace=1 - ;; - --) - shift - eoo=1 - ;; - *) - eoo=1 - ;; - esac - [ -n "$eoo" ] && break - shift - done - - pidfile="$1" - [ -n "$pidfile" ] || return 10 - - if [ -f "$pidfile" ]; then - local curpid="$(<"$pidfile")" - if is_running "$curpid"; then - return 1 - elif [ -n "$replace" ]; then - /bin/rm -f "$pidfile" || return 10 - else - return 2 - fi - fi - - echo_ "$pid" >"$pidfile" || return 10 - autoclean "$pidfile" - return 0 -} -function pidfile_check() { - local pidfile="$1" - [ -n "$pidfile" ] || return 10 - - if [ -f "$pidfile" ]; then - [ -r "$pidfile" ] || return 10 - local pid="$(<"$pidfile")" - is_running "$pid" && return 0 - fi - return 1 -} -function page_maybe() { - if isatty; then - less -XF "$@" - else - cat - fi -} - - -function utools_local() { - local arg - [ $# -gt 0 ] || set -- opts verbosity interaction - for arg in "$@"; do - case "$arg" in - parse_opts|opts|o|args) echo "local -a args";; - verbosity|v) echo "local __verbosity='$__verbosity'";; - interaction|i) echo "local __interaction='$__interaction'";; - esac - done -} - -function isatty() { - tty -s <&1 -} -function in_isatty() { - tty -s -} -function out_isatty() { - tty -s <&1 -} -function err_isatty() { - tty -s <&2 -} -function die() { [ $# -gt 0 ] && eerror "$@"; exit 1; } -function exit_with { if [ $# -gt 0 ]; then "$@"; fi; exit $?; } -function die_with { [ $# -gt 0 ] && eerror "$1"; shift; [ $# -gt 0 ] && "$@"; exit 1; } -function die_unless() { - local count=$# - if [ $count -eq 0 ]; then - exit 1 - elif [ $count -eq 1 ]; then - "$@" || exit $? - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - : - else - r=$? - eerror "$m" - exit $r - fi - fi -} -function eerror_unless() { - local count=$# - if [ $count -eq 0 ]; then - return 1 - elif [ $count -eq 1 ]; then - "$@" || return $? - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - : - else - r=$? - eerror "$m" - return $r - fi - fi -} -function die_if() { - local count=$# - if [ $count -eq 0 ]; then - : - elif [ $count -eq 1 ]; then - "$@" && exit 1 - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - eerror "$m" - exit 1 - fi - fi -} -function eerror_if() { - local count=$# - if [ $count -eq 0 ]; then - : - elif [ $count -eq 1 ]; then - "$@" && return 1 - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - eerror "$m" - return 1 - fi - fi -} - -TAB=$'\t' -LATIN1=iso-8859-1 -LATIN9=iso-8859-15 -UTF8=utf-8 -OENC="$UTF8" - -if ! progexists iconv; then - function iconv() { cat; } -fi - -function __lang_encoding() { - local lang="$(<<<"$LANG" awk '{ print tolower($0) }')" - case "$lang" in - *@euro) echo "iso-8859-15";; - *.utf-8|*.utf8) echo "utf-8";; - *) echo "iso-8859-1";; - esac -} -function __norm_encoding() { - awk '{ - enc = tolower($0) - gsub(/^latin$/, "latin1", enc) - gsub(/^latin1$/, "iso-8859-1", enc) - gsub(/^latin9$/, "iso-8859-15", enc) - gsub(/[-_]/, "", enc) - if (enc == "iso8859" || enc == "iso88591" || enc == "8859" || enc == "88591") print "iso-8859-1" - else if (enc == "iso885915" || enc == "885915") print "iso-8859-15" - else if (enc == "utf" || enc == "utf8") print "utf-8" - else print $0 - }' <<<"$1" -} -function __init_encoding() { - local DEFAULT_ENCODING="$(__lang_encoding)" - [ -n "$DEFAULT_ENCODING" ] || DEFAULT_ENCODING=utf-8 - [ -n "$UTOOLS_OUTPUT_ENCODING" ] || UTOOLS_OUTPUT_ENCODING="$DEFAULT_ENCODING" - UTOOLS_OUTPUT_ENCODING="$(__norm_encoding "$UTOOLS_OUTPUT_ENCODING")" - [ -n "$UTOOLS_INPUT_ENCODING" ] || UTOOLS_INPUT_ENCODING="$UTOOLS_OUTPUT_ENCODING" - UTOOLS_INPUT_ENCODING="$(__norm_encoding "$UTOOLS_INPUT_ENCODING")" - [ -n "$UTOOLS_EDITOR_ENCODING" ] || UTOOLS_EDITOR_ENCODING="$UTOOLS_INPUT_ENCODING" - UTOOLS_EDITOR_ENCODING="$(__norm_encoding "$UTOOLS_EDITOR_ENCODING")" - - IENC="$UTOOLS_INPUT_ENCODING" - OENC="$UTOOLS_OUTPUT_ENCODING" -} - -if [ -n "$UTOOLS_LANG" -a -z "$LANG" ]; then - export UTOOLS_LANG - export LANG="$UTOOLS_LANG" -fi -__init_encoding - -function tooenc() { - local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - rawecho "$src" - else - iconv -f "$from" -t "$to" <<<"$src" - fi -} -function uecho() { - tooenc "$*" -} -function tooenc_() { - local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - rawecho_ "$src" - else - rawecho_ "$src" | iconv -f "$from" -t "$to" - fi -} -function uecho_() { - tooenc_ "$*" -} -function toienc() { - local __tie_var="$1" __tie_to="${2:-$IENC}" __tie_from="${3:-$UTOOLS_INPUT_ENCODING}" - if [ "$__tie_from" != "$__tie_to" ]; then - set_var "$__tie_var" "$(iconv -f "$__tie_from" -t "$__tie_to" <<<"${!__tie_var}")" - fi -} -function uread() { - [ $# -gt 0 ] || set -- REPLY - local __r_var - read "$@" - for __r_var in "$@"; do - [ -z "$__r_var" -o "${__r_var:0:1}" == "-" ] && continue # ignorer les options - toienc "$__r_var" - done -} - -function stooenc() { - local from="${1:-$OENC}" to="${2:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - cat - else - iconv -f "$from" -t "$to" - fi -} -function stoienc() { - local to="${1:-$IENC}" from="${2:-$UTOOLS_INPUT_ENCODING}" - if [ "$from" == "$to" ]; then - cat - else - iconv -f "$from" -t "$to" - fi -} - -export UTOOLS_EDATE -function __edate() { [ -n "$UTOOLS_EDATE" ] && date +"[%d/%m/%Y-%H:%M:%S] "; } - -export UTOOLS_ELOG_OVERWRITE -function __set_no_colors() { :; } -function elogto() { - UTOOLS_EDATE=1 - if [ -n "$1" -a -n "$2" ]; then - LANG=fr_FR.UTF8 - UTOOLS_OUTPUT_ENCODING="$UTF8" - __set_no_colors 1 - if [ -n "$UTOOLS_ELOG_OVERWRITE" ]; then - exec >"$1" 2>"$2" - else - exec >>"$1" 2>>"$2" - fi - elif [ -n "$1" ]; then - LANG=fr_FR.UTF8 - UTOOLS_OUTPUT_ENCODING="$UTF8" - __set_no_colors 1 - if [ -n "$UTOOLS_ELOG_OVERWRITE" ]; then - exec >"$1" 2>&1 - else - exec >>"$1" 2>&1 - fi - fi -} - -export __estack __tlevel -function __indent() { - if [ "${1/ -/}" != "$1" ]; then - sed "2,\$s/^/${__tlevel}/g" <<<"$1" - else - rawecho "$1" - fi -} -function __eerror() { tooenc "$(__edate)${__tlevel}* error: $(__indent "$1")"; } -function __ewarn() { tooenc "$(__edate)${__tlevel}* warning: $(__indent "$1")"; } -function __enote() { tooenc "$(__edate)${__tlevel}* note: $(__indent "$1")"; } -function __ebanner() { - local maxi="${COLUMNS:-80}" - local -a lines - local psfix line - - psfix="$(__edate)${__tlevel}" - while [ ${#psfix} -lt $maxi ]; do psfix="$psfix="; done - - tooenc "$psfix" - maxi=$(($maxi - 1)) - array_from_xlines lines "$1" - for line in "" "${lines[@]}" ""; do - line="$(__edate)${__tlevel}= $line" - if [ ${#line} -le $maxi ]; then - while [ ${#line} -lt $maxi ]; do line="$line "; done - line="$line=" - fi - tooenc "$line" - done - tooenc "$psfix" -} -function __eimportant() { tooenc "$(__edate)${__tlevel}* important: $(__indent "$1")"; } -function __eattention() { tooenc "$(__edate)${__tlevel}* attention: $(__indent "$1")"; } -function __einfo() { tooenc "$(__edate)${__tlevel}* info: $(__indent "$1")"; } -function __eecho() { tooenc "$(__edate)${__tlevel}$(__indent "$1")"; } -function __eecho_() { tooenc_ "$(__edate)${__tlevel}$(__indent "$1")"; } -function __edebug() { tooenc "$(__edate)${__tlevel}* debug: $(__indent "$1")"; } -function __estep() { tooenc "$(__edate)${__tlevel}* $(__indent "$1")"; } -function __estepe() { __estep "$@"; } -function __estepw() { __estep "$@"; } -function __estepn() { __estep "$@"; } -function __estepi() { __estep "$@"; } -function __estep_() { tooenc_ "$(__edate)${__tlevel}* $(__indent "$1")"; } -function __estepe_() { __estep_ "$@"; } -function __estepw_() { __estep_ "$@"; } -function __estepn_() { __estep_ "$@"; } -function __estepi_() { __estep_ "$@"; } -function __etitle() { tooenc "$(__edate)${__tlevel}+++ $(__indent "$1")"; } -function __ebegin() { tooenc_ "$(__edate)${__tlevel}* $(__indent "$1"): "; } -function __edoto() { echo_ "."; } -function __edotw() { echo_ "w"; } -function __edotx() { echo_ "x"; } -function __edotp() { echo_ "+"; } -function __edotd() { tooenc "($1)"; } -function __eendo() { echo "[ok]"; } -function __eendx() { echo "[error]"; } -PRETTYOPTS=() -function set_verbosity() { :;} -function set_interaction() { :;} -function show_error() { - return 0 -} -function show_warn() { - return 0 -} -function show_info() { - return 0 -} -function show_verbose() { - return 0 -} -function show_debug() { - [ -n "$DEBUG" ] -} -function check_verbosity() { - return 0 -} -function get_verbosity_option() { :;} -function check_interaction() { - return 0 -} -function is_interaction() { - return 1 -} -function get_interaction_option() { :;} -__epending= -function eflush() { - if [ -n "$__epending" ]; then rawecho "$__epending" 1>&2; __epending=; fi -} -function eclearp() { - __epending= -} -function eerror() { - show_error || return; eflush; __eerror "$*" 1>&2 -} -function ewarn() { - show_warn || return; eflush; __ewarn "$*" 1>&2 -} -function enote() { - show_info || return; eflush; __enote "$*" 1>&2 -} -function ebanner() { - show_error || return; eflush; __ebanner "$*" 1>&2; sleep 5 -} -function eimportant() { - show_error || return; eflush; __eimportant "$*" 1>&2 -} -function eattention() { - show_warn || return; eflush; __eattention "$*" 1>&2 -} -function einfo() { - show_info || return; eflush; __einfo "$*" 1>&2 -} -function eecho() { - show_info || return; eflush; __eecho "$*" 1>&2 -} -function eecho_() { - show_info || return; eflush; __eecho_ "$*" 1>&2 -} -function edebug() { - show_debug || return; eflush; __edebug "$*" 1>&2 -} -function trace() { - local r cmd="$(quoted_args "$@")" - show_info && { eflush; __eecho "\$ $cmd" 1>&2; } - "$@"; r=$? - if [ $r -ne 0 ]; then - if show_info; then - eflush; __eecho "^ [EC #$r]" 1>&2 - elif show_error; then - eflush; __eecho "^ $cmd [EC #$r]" 1>&2; - fi - fi - return $r -} -function trace_error() { - local r - "$@"; r=$? - if [ $r -ne 0 ]; then - local cmd="$(quoted_args "$@")" - show_error && { eflush; __eecho "^ $cmd [EC #$r]" 1>&2; } - fi - return $r -} - -function etitle() { - local __t_deferred= - __t_etitle "$@" -} -function etitled() { - local __t_deferred=1 - __t_etitle "$@" -} -function __t_etitle() { - local __t_eend=default - local __t_clearp= - while [ -n "$1" ]; do - if [ "$1" == "--" ]; then - shift - break - elif [ "$1" == "-s" ]; then - __t_eend= - shift - elif [ "$1" == "--eend" ]; then - __t_eend=1 - shift - elif [ "$1" == "-p" ]; then - __t_clearp=1 - shift - else - break - fi - done - local __t_title="$1"; shift - local __t_s=0 - [ -n "$__estack" ] && __tlevel="${__tlevel} " - __estack="$__estack:t" - if show_info; then - if [ -n "$__t_deferred" ]; then - __epending="${__epending:+$__epending -}$(__etitle "$__t_title")" - else - eflush - __etitle "$__t_title" 1>&2 - fi - fi - if [ $# -gt 0 ]; then - "$@" - __t_s=$? - [ "$__t_eend" == "default" ] && __t_eend=1 - fi - [ "$__t_eend" == "default" ] && __t_eend= - if [ -n "$__t_eend" ]; then - eend $__t_s - [ -n "$__t_clearp" ] && eclearp - fi - return $__t_s -} -function estep() { - show_info || return; eflush; __estep "$*" 1>&2 -} -function estepe() { - show_info || return; eflush; __estepe "$*" 1>&2 -} -function estepw() { - show_info || return; eflush; __estepw "$*" 1>&2 -} -function estepn() { - show_info || return; eflush; __estepn "$*" 1>&2 -} -function estepi() { - show_info || return; eflush; __estepi "$*" 1>&2 -} -function estep_() { - show_info || return; eflush; __estep_ "$*" 1>&2 -} -function estepe_() { - show_info || return; eflush; __estepe_ "$*" 1>&2 -} -function estepw_() { - show_info || return; eflush; __estepw_ "$*" 1>&2 -} -function estepn_() { - show_info || return; eflush; __estepn_ "$*" 1>&2 -} -function estepi_() { - show_info || return; eflush; __estepi_ "$*" 1>&2 -} -function ebegin() { - local __b_eend=default - while [ -n "$1" ]; do - if [ "$1" == "--" ]; then - shift - break - elif [ "$1" == "-s" ]; then - __b_eend= - shift - elif [ "$1" == "--eend" ]; then - __b_eend=1 - shift - else - break - fi - done - local __b_msg="$1"; shift - local __b_s=0 - __estack="$__estack:b" - if show_info; then - eflush - __ebegin "$__b_msg" 1>&2 - fi - if [ $# -gt 0 ]; then - "$@" - __b_s=$? - [ "$__b_eend" == "default" ] && __b_eend=1 - fi - [ "$__b_eend" == "default" ] && __b_eend= - [ -n "$__b_eend" ] && eend $__b_s - return $__b_s -} -function edot() { - local s=$? - show_info || return - eflush - [ -n "$1" ] && s="$1" - shift - if [ "$s" == "0" ]; then - __edoto 1>&2 - else - __edotx 1>&2 - fi - show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2 - return $s -} -function edotw() { - local s=$? - show_info || return - eflush - [ -n "$1" ] && s="$1" - shift - __edotw 1>&2 - show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2 - return $s -} -function ewait() { - [ -n "$1" ] || return 1 - if show_info; then - local count=2 - eflush - little_sleep # certains processus retournent tout de suite - while is_running "$1"; do - sleep 1 - if [ $count -gt 0 ]; then - count=$(($count - 1)) - else - __edotp 1>&2 - fi - done - __edoto 1>&2 - else - wait "$1" - fi -} -function eend() { - local s=$? - if [ "$1" == "-c" ]; then - __estack= - __tlevel= - elif [ "${__estack%:b}" != "$__estack" ]; then - __estack="${__estack%:b}" - show_info || return - eflush - [ -n "$1" ] && s="$1" - if [ "$s" == "0" ]; then - __eendo 1>&2 - else - __eendx 1>&2 - fi - elif [ "${__estack%:t}" != "$__estack" ]; then - __estack="${__estack%:t}" - __tlevel="${__tlevel% }" - fi -} -function ask_yesno() { - local interactive=1 - if [[ "$1" == -* ]]; then - if [ "$1" != -- ]; then - check_interaction "$1" || interactive= - fi - shift - else - check_interaction -c || interactive= - fi - local default="${2:-N}" - if [ "$default" == "C" ]; then - [ -n "$interactive" ] && default=N || default=O - elif [ "$default" == "X" ]; then - [ -n "$interactive" ] && default=O || default=N - fi - if [ -n "$interactive" ]; then - eflush - local message="$1" - local prompt="[oN]" - local r - is_yes "$default" && prompt="[On]" - if [ -n "$message" ]; then - tooenc_ "$message" 1>&2 - else - tooenc_ "Voulez-vous continuer?" "$UTF8" 1>&2 - fi - tooenc_ " $prompt " "$UTF8" 1>&2 - uread r - is_yes "${r:-$default}" - else - is_yes "$default" - fi -} -function read_value() { - local -a __rv_opts __rv_readline=1 __rv_showdef=1 __rv_nl= - __rv_opts=() - [ -n "$UTOOLS_NO_READLINE" ] && __rv_readline= - __rv_read "$@" -} -function read_password() { - local -a __rv_opts __rv_readline= __rv_showdef= __rv_nl=1 - __rv_opts=(-s) - __rv_read "$@" -} -function __rv_read() { - local __rv_int=1 - if [[ "$1" == -* ]]; then - if [ "$1" != -- ]; then - check_interaction "$1" || __rv_int= - fi - shift - else - check_interaction -c || __rv_int= - fi - local __rv_msg="$1" __rv_v="${2:-value}" __rv_d="$3" __rv_re="${4:-O}" - if [ -z "$__rv_int" ]; then - if is_yes "$__rv_re" && [ -z "$__rv_d" ]; then - OENC="$UTF8" eerror "La valeur par défaut de $__rv_v doit être non vide" - return 1 - fi - set_var "$__rv_v" "$__rv_d" - return 0 - fi - - eflush - local __rv_r - while true; do - if [ -n "$__rv_msg" ]; then - tooenc_ "$__rv_msg" 1>&2 - else - tooenc_ "Entrez la valeur" "$UTF8" 1>&2 - fi - if [ -n "$__rv_readline" ]; then - tooenc_ ": " "$UTF8" 1>&2 - uread -e ${__rv_d:+-i"$__rv_d"} "${__rv_opts[@]}" __rv_r - else - if [ -n "$__rv_d" ]; then - if [ -n "$__rv_showdef" ]; then - tooenc_ " [$__rv_d]" 1>&2 - else - tooenc_ " [****]" 1>&2 - fi - fi - tooenc_ ": " "$UTF8" 1>&2 - uread "${__rv_opts[@]}" __rv_r - [ -n "$__rv_nl" ] && echo - fi - __rv_r="${__rv_r:-$__rv_d}" - if [ -n "$__rv_r" ] || ! is_yes "$__rv_re"; then - set_var "$__rv_v" "$__rv_r" - return 0 - fi - done -} -function simple_menu() { - local __sm_title= __sm_yourchoice= __sm_default= - local -a __sm_args - parse_opts -t: __sm_title= -m: __sm_yourchoice= -d: __sm_default= @ __sm_args -- "$@" && - set -- "${__sm_args[@]}" || ewarn "$__sm_args" - - local __sm_option_var="${1:-option}" __sm_options_var="${2:-options}" - local __sm_option __sm_options - __sm_options="$__sm_options_var[*]" - if [ -z "${!__sm_options}" ]; then - OENC="$UTF8" eerror "Le tableau $__sm_options_var doit être non vide" - return 1 - fi - [ -z "$__sm_default" ] && __sm_default="${!__sm_option_var}" - - eflush - array_copy __sm_options "$__sm_options_var" - local __sm_c=0 __sm_i __sm_choice - while true; do - if [ "$__sm_c" == "0" ]; then - [ -n "$__sm_title" ] && tooenc "=== $__sm_title ===" 1>&2 - __sm_i=1 - for __sm_option in "${__sm_options[@]}"; do - if [ "$__sm_option" == "$__sm_default" ]; then - tooenc "$__sm_i*- $__sm_option" 1>&2 - else - tooenc "$__sm_i - $__sm_option" 1>&2 - fi - let __sm_i=$__sm_i+1 - done - fi - - if [ -n "$__sm_yourchoice" ]; then - tooenc_ "$__sm_yourchoice" 1>&2 - else - tooenc_ "Entrez le numéro de l'option choisie" "$UTF8" 1>&2 - fi - tooenc_ ": " "$UTF8" 1>&2 - uread __sm_choice - - if [ -z "$__sm_choice" -a -n "$__sm_default" ]; then - __sm_option="$__sm_default" - break - fi - if [ -n "$__sm_choice" -a -z "${__sm_choice//[0-9]/}" ]; then - if [ "$__sm_choice" -gt 0 -a "$__sm_choice" -le "${#__sm_options[*]}" ]; then - __sm_option="${__sm_options[$(($__sm_choice - 1))]}" - break - else - OENC="$UTF8" eerror "Numéro d'option incorrect" - fi - else - OENC="$UTF8" eerror "Vous devez saisir le numéro de l'option choisie" - fi - - let __sm_c=$__sm_c+1 - if [ "$__sm_c" -eq 5 ]; then - tooenc "" "$UTF8" 1>&2 - __sm_c=0 - fi - done - set_var "$__sm_option_var" "$__sm_option" -} - -function actions_menu() { - local -a __am_action_descs __am_options __am_void_actions - local __am_tmp __am_select_action __am_select_option __am_title __am_optyc __am_actyc - local __am_default_action=auto __am_quit_action=auto - local __am_default_option= - local -a __am_args - parse_opts \ - -t: __am_title= \ - -m: __am_optyc= \ - -M: __am_actyc= \ - -e: __am_void_actions \ - -d: __am_default_action= \ - -q: __am_quit_action= \ - -o: __am_default_option= \ - @ __am_args -- "$@" && set -- "${__am_args[@]}" || { eerror "$__am_args"; return 1; } - - __am_tmp="${1:-action}"; __am_select_action="${!__am_tmp}" - __am_tmp="${2:-option}"; __am_select_option="${!__am_tmp}" - [ -n "$__am_default_option" ] && __am_select_option="$__am_default_option" - array_copy __am_action_descs "${3:-actions}" - array_copy __am_options "${4:-options}" - - eerror_unless [ ${#__am_action_descs[*]} -gt 0 ] "Vous devez spécifier le tableau des actions" || return - __actions_menu || return 1 - setv "${1:-action}" "$__am_select_action" - setv "${2:-option}" "$__am_select_option" -} -function __actions_menu() { - local title="$__am_title" - local optyc="$__am_optyc" actyc="$__am_actyc" - local default_action="$__am_default_action" - local quit_action="$__am_quit_action" - local select_action="$__am_select_action" - local select_option="$__am_select_option" - local -a action_descs options void_actions - array_copy action_descs __am_action_descs - array_copy options __am_options - array_copy void_actions __am_void_actions - - local no_options - array_isempty options && no_options=1 - - local -a actions - local tmp action name - for tmp in "${action_descs[@]}"; do - splitfsep2 "$tmp" : action name - [ -n "$action" ] || action="${name:0:1}" - action="$(strlower "$action")" - array_addu actions "$action" - done - - if [ "$default_action" == auto ]; then - default_action="$select_action" - if [ -n "$default_action" ]; then - array_contains actions "$default_action" || default_action= - fi - [ -n "$default_action" ] || default_action="${actions[0]}" - fi - default_action="${default_action:0:1}" - default_action="$(strlower "$default_action")" - - if [ "$quit_action" == auto ]; then - if [ ${#actions[*]} -gt 1 ]; then - quit_action="${actions[@]:$((-1)):1}" - array_addu void_actions "$quit_action" - fi - fi - quit_action="${quit_action:0:1}" - quit_action="$(strlower "$quit_action")" - - local action_title - for tmp in "${action_descs[@]}"; do - splitfsep2 "$tmp" : action name - [ -n "$action" ] || action="${name:0:1}" - [ -n "$name" ] || name="$action" - action="$(strlower "$action")" - if [ -n "$no_options" ]; then - if ! array_contains void_actions "$action"; then - array_del actions "$action" - continue - fi - fi - [ "$action" == "$default_action" ] && name="$name*" - action_title="${action_title:+$action_title/}$name" - done - if [ -n "$default_action" ]; then - array_contains actions "$default_action" || default_action= - fi - if [ -n "$quit_action" ]; then - array_contains actions "$quit_action" || quit_action= - fi - - if [ -n "$no_options" ]; then - if array_isempty void_actions; then - eerror "Aucune option n'est définie. Il faut définir le tableau des actions vides" - return 1 - fi - __void_actions_menu - else - __options_actions_menu - fi -} -function __void_actions_menu() { - eflush - local c=0 choice - while true; do - if [ $c -eq 0 ]; then - [ -n "$title" ] && __etitle "$title" 1>&2 - __eecho_ "=== Actions disponibles: " 1>&2 - tooenc "$action_title" 1>&2 - fi - if [ -n "$actyc" ]; then - __eecho_ "$actyc" 1>&2 - elif [ -n "$optyc" ]; then - __eecho_ "$optyc" 1>&2 - else - __eecho_ "Entrez l'action à effectuer" 1>&2 - fi - tooenc_ ": " 1>&2 - uread choice - if [ -z "$choice" -a -n "$default_action" ]; then - select_action="$default_action" - break - fi - - choice="${choice:0:1}" - choice="$(strlower "$choice")" - if array_contains actions "$choice"; then - select_action="$choice" - break - elif [ -n "$choice" ]; then - eerror "$choice: action incorrecte" - else - eerror "vous devez saisir l'action à effectuer" - fi - let c=$c+1 - if [ $c -eq 5 ]; then - tooenc "" 1>&2 - c=0 - fi - done - __am_select_action="$select_action" - __am_select_option= -} -function __options_actions_menu() { - eflush - local c=0 option choice action option - while true; do - if [ $c -eq 0 ]; then - [ -n "$title" ] && __etitle "$title" 1>&2 - i=1 - for option in "${options[@]}"; do - if [ "$option" == "$select_option" ]; then - tooenc "$i*- $option" 1>&2 - else - tooenc "$i - $option" 1>&2 - fi - let i=$i+1 - done - __estepn_ "Actions disponibles: " 1>&2 - tooenc "$action_title" 1>&2 - fi - if [ -n "$optyc" ]; then - __eecho_ "$optyc" 1>&2 - else - __eecho_ "Entrez l'action et le numéro de l'option choisie" 1>&2 - fi - tooenc_ ": " 1>&2 - uread choice - - if [ -z "$choice" -a -n "$default_action" ]; then - action="$default_action" - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - elif [ -n "$select_option" ]; then - select_action="$action" - break - fi - fi - action="${choice:0:1}" - action="$(strlower "$action")" - if array_contains actions "$action"; then - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - else - option="${choice:1}" - option="${option// /}" - if [ -z "$option" -a -n "$select_option" ]; then - select_action="$action" - break - elif [ -z "$option" ]; then - eerror "vous devez saisir le numéro de l'option" - elif isnum "$option"; then - if [ $option -gt 0 -a $option -le ${#options[*]} ]; then - select_action="$action" - select_option="${options[$(($option - 1))]}" - break - fi - else - eerror "$option: numéro d'option incorrecte" - fi - fi - elif isnum "$choice"; then - action="$default_action" - if [ -n "$action" ]; then - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - else - option="${choice// /}" - if [ -z "$option" ]; then - eerror "vous devez saisir le numéro de l'option" - elif isnum "$option"; then - if [ $option -gt 0 -a $option -le ${#options[*]} ]; then - select_action="$action" - select_option="${options[$(($option - 1))]}" - break - fi - else - eerror "$option: numéro d'option incorrecte" - fi - fi - else - eerror "Vous devez spécifier l'action à effectuer" - fi - elif [ -n "$choice" ]; then - eerror "$choice: action et/ou option incorrecte" - else - eerror "vous devez saisir l'action à effectuer" - fi - let c=$c+1 - if [ $c -eq 5 ]; then - tooenc "" 1>&2 - c=0 - fi - done - __am_select_action="$select_action" - __am_select_option="$select_option" -} - - -function __ac_forgetall() { __ac_files=(); } -__ac_forgetall -function __ac_trap() { - local file - for file in "${__ac_files[@]}"; do - [ -e "$file" ] && rm -rf "$file" 2>/dev/null - done - __ac_forgetall -} -trap __ac_trap 1 3 15 EXIT -function autoclean() { - local file - for file in "$@"; do - [ -n "$file" ] && array_add __ac_files "$file" - done -} -function ac_cleanall() { - __ac_trap -} -function ac_clean() { - local file - for file in "$@"; do - if array_contains __ac_files "$file"; then - [ -e "$file" ] && rm -rf "$file" 2>/dev/null - array_del __ac_files "$file" - fi - done -} -function ac_set_tmpfile() { - local __acst_d - if show_debug; then - if [ -n "$5" ]; then - is_yes "${!5}" && __acst_d=1 - else - __acst_d=1 - fi - fi - if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" - [ -f "$3" -a "$4" == keep ] || >"$3" - else - local __acst_t="$(mktempf "$2")" - autoclean "$__acst_t" - set_var "$1" "$__acst_t" - fi -} -function ac_set_tmpdir() { - local __acst_d - if show_debug; then - if [ -n "$4" ]; then - is_yes "${!4}" && __acst_d=1 - else - __acst_d=1 - fi - fi - if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" - mkdir -p "$3" - else - local __acst_t="$(mktempd "$2")" - autoclean "$__acst_t" - set_var "$1" "$__acst_t" - fi -} -function debug_tee() { - if show_debug; then - tee "$@" - else - cat - fi -} - - -function get_defaults_files() { - local __gd_dest="${1:-defaults}"; shift - local -a __gd_fs - local __gd_f __gd_found - for __gd_f in "$@"; do - __gd_found= - if [ -r "/etc/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "/etc/default/$__gd_f") - __gd_found=1 - fi - if [ -r "$HOME/etc/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "$HOME/etc/default/$__gd_f") - __gd_found=1 - fi - if [ -z "$__gd_found" -a -r "$scriptdir/lib/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "$scriptdir/lib/default/$__gd_f") - fi - done - array_copy "$__gd_dest" __gd_fs -} - -function set_defaults() { - local -a __sd_fs - local __sd_f - get_defaults_files __sd_fs "$@" - for __sd_f in "${__sd_fs[@]}"; do - source "$__sd_f" - done -} - - -: "${MYHOST:=$HOSTNAME}" -: "${MYHOSTNAME:=${MYHOST%%.*}}" -export MYHOST MYHOSTNAME - -function myhost() { - hostname -f 2>/dev/null || echo "$MYHOST" -} -function myhostname() { - hostname -s 2>/dev/null || echo "$MYHOSTNAME" -} -##@inc]base -uprovide base.tools -urequire base - -function base_umove() { - local -a args - local updatedir - args=(-d:,--updatedir: .) - parse_args_check "$@" || return; set -- "${args[@]}" - - eerror_unless [ -z "$updatedir" -o -d "$updatedir" ] "$updatedir: doit être un répertoire" || return - eerror_if [ $# -eq 0 ] "Vous devez spécifier les fichiers à déplacer" || return - eerror_if [ $# -eq 1 ] "Vous devez spécifier la destination" || return - - local -a srcs - local dest - - srcs=("$@") - setx dest=last_value srcs - array_del_last srcs - - if [ $# -eq 2 ]; then - if [ -d "$dest" ]; then - : # ce cas sera traité ci-dessous - elif [ -e "$dest" ]; then - eerror "$dest: refus d'écraser la destination" - return 1 - else - src="${srcs[0]}" - if [ -n "$updatedir" ]; then - if [ -L "$src" ]; then - ldest="$(readlinka "$src")" - array_find_links update_links "$ldest" "$updatedir" - else - array_find_links update_links "$src" "$updatedir" - fi - move_file "$src" "$dest" "${update_links[@]}" - else - move_link "$src" "$dest" - fi - return $? - fi - fi - - [ -d "$dest" ] || { - eerror "$dest: doit être un répertoire" - return 1 - } - for src in "${srcs[@]}"; do - if [ -n "$updatedir" ]; then - if [ -L "$src" ]; then - move_link "$src" "$dest" - else - array_find_links update_links "$src" "$updatedir" - move_file "$src" "$dest" "${update_links[@]}" - fi - else - move_link "$src" "$dest" - fi - done -} -##@inc]base.tools -##@inc[base.compat -## Fonctions de base: support des fonctions obsolètes et des versions de bash < 4.x -##@inc[base.core -## Fonctions de base: fondement -uprovide base.core - -function echo_() { - echo -n "$*" -} -function recho() { - if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - - local first="${1:1}"; shift - echo "$first$@" - else - echo "$@" - fi -} -function recho_() { - if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - - local first="${1:1}"; shift - echo -n "$first$@" - else - echo -n "$@" - fi -} -function _qval() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s//\$/\\\$}" - s="${s//\`/\\\`}" - recho_ "$s" -} -function should_quote() { - local l="${#1}" - [ $l -eq 0 -o $l -gt 80 ] && return 0 - local s="${*//[a-zA-Z0-9]/}" - s="${s//,/}" - s="${s//./}" - s="${s//+/}" - s="${s//\//}" - s="${s//-/}" - s="${s//_/}" - s="${s//=/}" - [ -n "$s" ] -} -function qval() { - echo -n \" - _qval "$@" - echo \" -} -function qvalm() { - if should_quote "$*"; then - echo -n \" - _qval "$@" - echo \" - else - recho "$*" - fi -} -function qvalr() { - if [ -z "$*" ]; then - : - elif should_quote "$*"; then - echo -n \" - _qval "$@" - echo \" - else - recho "$*" - fi -} -function qvals() { - local arg first=1 - for arg in "$@"; do - [ -z "$first" ] && echo -n " " - if should_quote "$arg"; then - echo -n \" - _qval "$arg" - echo -n \" - else - recho_ "$arg" - fi - first= - done - [ -z "$first" ] && echo -} -function qwc() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s//\$/\\\$}" - s="${s//\`/\\\`}" - local r a b - while [ -n "$s" ]; do - if [[ "$s" == *\** ]]; then - if [[ "$s" == *\?* ]]; then - a="${s%%\**}" - b="${s%%\?*}" - if [ ${#a} -lt ${#b} ]; then - s="${s#*\*}" - r="$r\"$a\"*" - else - s="${s#*\?}" - r="$r\"$b\"?" - fi - else - a="${s%%\**}" - s="${s#*\*}" - r="$r\"$a\"*" - fi - elif [[ "$s" == *\?* ]]; then - if [[ "$s" == *\** ]]; then - a="${s%%\**}" - b="${s%%\?*}" - if [ ${#a} -lt ${#b} ]; then - s="${s#*\*}" - r="$r\"$a\"*" - else - s="${s#*\?}" - r="$r\"$b\"?" - fi - else - a="${s%%\?*}" - s="${s#*\?}" - r="$r\"$a\"?" - fi - else - r="$r\"$s\"" - break - fi - done - recho_ "$r" -} -function qlines() { - sed "s/'/'\\\\''/g; s/.*/'&'/g" -} -function setv() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - eval "$__s_var=\"\$*\"" -} -function _setv() { - local __s_var="$1"; shift - eval "$__s_var=\"\$*\"" -} -function echo_setv() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - echo "$__s_var=$(qvalr "$*")" -} -function setx() { - if [ "$1" == -a ]; then - shift - local __s_array="$1"; shift - if [[ "$__s_array" == *=* ]]; then - set -- "${__s_array#*=}" "$@" - __s_array="${__s_array%%=*}" - fi - eval "$__s_array=($("$@" | qlines))" - else - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - eval "$__s_var="'"$("$@")"' - fi -} -function _setvx() { - local __s_var="$1"; shift - eval "$__s_var="'"$("$@")"' -} -function _setax() { - local __s_array="$1"; shift - eval "$__s_array=($("$@" | qlines))" -} -function evalx() { - local __e_val __e_arg __e_r=0 - local -a __e_cmd - - local __e_first=1 - while [ $# -gt 0 ]; do - __e_cmd=() - while [ $# -gt 0 ]; do - __e_arg="$1"; shift - [ "$__e_arg" == // ] && break - if [ "${__e_arg%//}" != "$__e_arg" ]; then - local __e_tmp="${__e_arg%//}" - if [ -z "${__e_tmp//\\/}" ]; then - __e_arg="${__e_arg#\\}" - __e_cmd=("${__e_cmd[@]}" "$__e_arg") - continue - fi - fi - __e_cmd=("${__e_cmd[@]}" "$__e_arg") - done - - if [ -n "$__e_first" ]; then - __e_val="$("${__e_cmd[@]}")" || __e_r=$? - else - __e_val="$("${__e_cmd[@]}" "$__e_val")" || __e_r=$? - fi - __e_first= - done - [ -n "$__e_val" ] && echo "$__e_val" - return $__e_r -} -function setxx() { - local -a __s_args - if [ "$1" == -a ]; then __s_args=(-a); shift; fi - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - __s_args=("${__s_args[@]}" "$__s_var") - setx "${__s_args[@]}" evalx "$@" -} -function evalp() { - local __e_arg __e_cmd - - while [ $# -gt 0 ]; do - __e_arg="$1"; shift - if [ "$__e_arg" == // ]; then - __e_cmd="$__e_cmd |" - continue - elif [ "${__e_arg%//}" != "$__e_arg" ]; then - local __e_tmp="${__e_arg%//}" - if [ -z "${__e_tmp//\\/}" ]; then - __e_arg="${__e_arg#\\}" - fi - fi - __e_cmd="${__e_cmd:+$__e_cmd }\"$(_qval "$__e_arg")\"" - done - eval "$__e_cmd" -} -function setxp() { - local -a __s_args - if [ "$1" == -a ]; then __s_args=(-a); shift; fi - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - __s_args=("${__s_args[@]}" "$__s_var") - setx "${__s_args[@]}" evalp "$@" -} -function testx() { - local __t_op="$1"; shift - local __t_val="$(evalx "$@")" - [ $__t_op "$__t_val" ] -} -function test2x() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalx "$@")" - [ "$__t_val1" $__t_op "$__t_val2" ] -} -function testrx() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalx "$@")" - eval '[[ "$__t_val1" '"$__t_op"' "$__t_val2" ]]' -} -function testp() { - local __t_op="$1"; shift - local __t_val="$(evalp "$@")" - [ $__t_op "$__t_val" ] -} -function test2p() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalp "$@")" - [ "$__t_val1" $__t_op "$__t_val2" ] -} -function testrp() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalp "$@")" - eval '[[ "$__t_val1" '"$__t_op"' "$__t_val2" ]]' -} - -function err2out() { - "$@" 2>&1 -} - -function is_defined() { - [ -n "$(declare -p "$1" 2>/dev/null)" ] -} -function is_array() { - case "$(declare -p "$1" 2>/dev/null)" in declare\ -a*) return 0;; esac - return 1 -} - -function upvar() { - if unset -v "$1"; then - if [ $# -eq 2 ]; then - eval "$1=\"\$2\"" - else - eval "$1=(\"\${@:2}\")" - fi - fi -} -function array_upvar() { - unset -v "$1" && eval "$1=(\"\${@:2}\")" -} -function upvars() { - while [ $# -gt 0 ]; do - case "$1" in - -a) - unset -v "$2" && eval "$2=(\"\${@:3}\")" - break - ;; - -a*) - unset -v "$2" && eval "$2=(\"\${@:3:${1#-a}}\")" - shift $((${1#-a} + 2)) || return 1 - ;; - *) - unset -v "$1" && eval "$1=\"\$2\"" - shift; shift - ;; - esac - done -} - -function __ab_process_pending() { - local -a values - case "$mode" in - cmd) values="$("${pending[@]}")";; - ssplit) eval "values=($("${pending[@]}"))";; - lsplit) eval "values=($("${pending[@]}" | qlines))";; - add) values=("${pending[@]}");; - esac - cmd=("${cmd[@]}" "${values[@]}") - pending=() -} -function array_buildcmd() { - local desta="$1"; shift; local "$desta" - local mode=add - local -a pending cmd - while [ $# -gt 0 ]; do - case "$1" in - ++c|++cmd|++) __ab_process_pending; mode=cmd;; - ++s|++ssplit) __ab_process_pending; mode=ssplit;; - ++l|++lsplit) __ab_process_pending; mode=lsplit;; - ++a|++add) __ab_process_pending; mode=add;; - *) pending=("${pending[@]}" "$1");; - esac - shift - done - __ab_process_pending - array_upvar "$desta" "${cmd[@]}" -} -function buildcmd() { - local -a args - array_buildcmd args "$@" - qvals "${args[@]}" -} -function evalcmd() { - local -a args - array_buildcmd args "$@" - "${args[@]}" -} -##@inc]base.core -##@inc[base.num -## Fonctions de base: gestion des valeurs numériques -uprovide base.num - -function isnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//[0-9]/}" - [ -z "$v" ] -} -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - [ -z "${1//[0-9]/}" ] -} -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//./}" - v="${v//,/}" - v="${v//[0-9]/}" - [ -z "$v" ] -} -##@inc]base.num -##@inc[base.bool -## Fonctions de base: valeurs booléennes -##@inc[base.num -## Fonctions de base: gestion des valeurs numériques -uprovide base.num - -function isnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//[0-9]/}" - [ -z "$v" ] -} -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - [ -z "${1//[0-9]/}" ] -} -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//./}" - v="${v//,/}" - v="${v//[0-9]/}" - [ -z "$v" ] -} -##@inc]base.num -uprovide base.bool -urequire base.num - -function is_yes() { - case "${1,,}" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - esac - isnum "$1" && [ "$1" -ne 0 ] && return 0 - return 1 -} -function is_no() { - case "${1,,}" in - n|non|no|f|faux|false|off) return 0;; - esac - isnum "$1" && [ "$1" -eq 0 ] && return 0 - return 1 -} -function yesval() { - is_yes "$1" && echo 1 -} - -function setb() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - local __s_r - if "$@" >/dev/null; then - eval "$__s_var=1" - else - __s_r=$? - eval "$__s_var=" - return $__s_r - fi -} -function _setb() { - local __s_var="$1"; shift - if "$@" >/dev/null; then - eval "$__s_var=1" - else - eval "$__s_var=" - fi -} - -function evalb() { - if evalx "$@" >/dev/null; then - echo 1 - else - return $? - fi -} -function setxb() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - setx "$__s_var" evalb "$@" -} -##@inc]base.bool -##@inc[base.quote -## Fonctions de base: protection de valeurs chaine -uprovide base.quote -urequire base.core - -function _qawk() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s// -/\\n}" - recho_ "$s" -} -function qawk() { - echo -n \" - _qawk "$@" - echo \" -} -function qseds() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\//\\/}" - s="${s// -/\\n}" - recho "$s" -} -function _qform() { - local s="$*" - s="${s//\%/%25}" - s="${s//+/%2B}" - s="${s//&/%26}" - s="${s//=/%3D}" - s="${s// /+}" - recho_ "$s" -} -function qform() { - local s="$*" - if [[ "$s" == *=* ]]; then - _qform "${s%%=*}" - echo -n = - _qform "${s#*=}" - echo - else - _qform "$s" - echo - fi -} -function _qsql() { - local q="'" qq="''" - echo "${*//$q/$qq}" -} -function qsql() { - local q="'" qq="''" - echo "'${*//$q/$qq}'" -} -##@inc]base.quote -uprovide base.compat -urequire base.core base.num base.bool base.quote - - -function setx2() { setxx "$@"; } -function rawecho() { recho "$@"; } -function rawecho_() { recho_ "$@"; } -function quote_arg() { _qval "$@"; } -function quoted_arg() { qvalm "$@"; } -function quoted_args() { qvals "$@"; } -function set_var() { setv "$@"; } -function set_var_cmd() { echo_setv "$@"; } -function set_var_literal() { eval "$1=$2"; } - -function quote_awk() { _qawk "$@"; } -function quoted_awk() { qawk "$@"; } -function quote_seds() { qseds "$@"; } -function quote_form() { _qform "$@"; } -function quoted_form() { qform "$@"; } - - -if [ -n "$BASH_VERSINFO" -a "${BASH_VERSINFO[0]}" -lt 4 ]; then - function strlower() { tr A-Z a-z <<<"$*"; } - function strlower1() { - local str="$*" - local h="${str:0:1}" r="${str:1}" - echo "$(tr A-Z a-z <<<"$h")$r" - } - function strlowers() { - local -a vs; local v - for v in "$@"; do - vs=("${vs[@]}" "$(strlower1 "$v")") - done - echo "${vs[*]}" - } - function strupper() { tr a-z A-Z <<<"$*"; } - function strupper1() { - local str="$*" - local h="${str:0:1}" r="${str:1}" - echo "$(tr a-z A-Z <<<"$h")$r" - } - function struppers() { - local -a vs; local v - for v in "$@"; do - vs=("${vs[@]}" "$(strupper1 "$v")") - done - echo "${vs[*]}" - } - - function is_yes() { - case "$1" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - O|OUI|Y|YES|V|VRAI|T|TRUE|ON) return 0;; - esac - isnum "$1" && [ "$1" -ne 0 ] && return 0 - case "$(strlower "$1")" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - esac - return 1 - } - function is_no() { - case "$1" in - n|non|no|f|faux|false|off) return 0;; - N|NON|NO|F|FAUX|FALSE|OFF) return 0;; - esac - isnum "$1" && [ "$1" -eq 0 ] && return 0 - case "$(strlower "$1")" in - n|non|no|f|faux|false|off) return 0;; - esac - return 1 - } -fi -##@inc]base.compat -uprovide base -urequire base.init base.core base.string base.num base.bool base.array base.quote base.split base.args base.tools base.compat - -UNAME_SYSTEM=`uname -s` -[ "${UNAME_SYSTEM#CYGWIN}" != "$UNAME_SYSTEM" ] && UNAME_SYSTEM=Cygwin -[ "${UNAME_SYSTEM#MINGW32}" != "$UNAME_SYSTEM" ] && UNAME_SYSTEM=Mingw -UNAME_MACHINE=`uname -m` -if [ -n "$UTOOLS_CHROOT" ]; then - [ -n "$UTOOLS_UNAME_SYSTEM" ] && eval "UNAME_SYSTEM=$UTOOLS_UNAME_SYSTEM" - [ -n "$UTOOLS_UNAME_MACHINE" ] && eval "UNAME_MACHINE=$UTOOLS_UNAME_MACHINE" -fi - -function setyesval() { - is_yes "$2" && set_var "$1" 1 || set_var "$1" "" -} -function normyesval() { - is_yes "${2:-"${!1}"}" && set_var "$1" 1 || set_var "$1" "" -} -function normyesvals() { - local __nyv_yesvar - for __nyv_yesvar in "$@"; do - is_yes "${!__nyv_yesvar}" && set_var "$__nyv_yesvar" 1 || set_var "$__nyv_yesvar" "" - done -} -function quote_in() { - sed 's/\\/\\\\/g -s/"/\\"/g -s/\$/\\$/g -s/`/\\`/g' -} -function quote_sin() { - sed "s/'/'\\\\''/g" -} -function quote_sarg() { - quote_sin <<<"$1" -} -function quoted_sarg() { - echo "'$(quote_sarg "$1")'" -} -function quoted_sargs() { - local a s - for a in "$@"; do - s="${s:+$s }$(quoted_sarg "$a")" - done - rawecho "$s" -} - -function set_array_cmd() { - [ $# -eq 1 ] && set -- "$1" "$1" - local __sac_s __sac_v __sac_f - __sac_s="$1=("; shift - if [ "$1" == "@" ]; then - shift - else - eval "set -- \"\${$1[@]}\"" - fi - __sac_f=1 - for __sac_v in "$@"; do - [ -n "$__sac_f" ] && __sac_f= || __sac_s="$__sac_s " - __sac_s="$__sac_s$(quoted_arg "$__sac_v")" - done - __sac_s="$__sac_s)" - echo "$__sac_s" -} -function set_array() { - eval "$(set_array_cmd "$@")" -} -function array_count() { - eval "echo \${#$1[*]}" -} -function array_isempty() { - [ $(array_count "$1") -eq 0 ] -} -function array_new() { - eval "$1=()" -} -function array_add() { - local __aa_a="$1"; shift - eval "$__aa_a=(\"\${$__aa_a[@]}\" \"\$@\")" -} -function array_ins() { - local __aa_a="$1"; shift - eval "$__aa_a=(\"\$@\" \"\${$__aa_a[@]}\")" -} -function array_del() { - local __ad_v - local -a __ad_vs - eval 'for __ad_v in "${'"$1"'[@]}"; do - if [ "$__ad_v" != '"$(quoted_arg "$2")"' ]; then - array_add __ad_vs "$__ad_v" - fi -done' - array_copy "$1" __ad_vs -} -function array_addu() { - local __as_v - eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then - return 1 - fi -done' - array_add "$1" "$2" - return 0 -} -function array_set() { - array_addu "$@" -} -function array_insu() { - local __as_v - eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then - return 1 - fi -done' - array_ins "$1" "$2" - return 0 -} -function array_fillrange() { - local -a __af_vs - local __af_i="${2:-1}" __af_to="${3:-10}" __af_step="${4:-1}" - while [ "$__af_i" -le "$__af_to" ]; do - __af_vs=("${__af_vs[@]}" "$__af_i") - __af_i=$(($__af_i + $__af_step)) - done - array_copy "$1" __af_vs -} -function array_eq() { - local -a __ae_a1 __ae_a2 - array_copy __ae_a1 "$1" - array_copy __ae_a2 "$2" - [ ${#__ae_a1[*]} -eq ${#__ae_a2[*]} ] || return 1 - local __ae_v __ae_i=0 - for __ae_v in "${__ae_a1[@]}"; do - [ "$__ae_v" == "${__ae_a2[$__ae_i]}" ] || return 1 - __ae_i=$(($__ae_i + 1)) - done - return 0 -} -function array_contains() { - local __ac_v - eval 'for __ac_v in "${'"$1"'[@]}"; do - if [ "$__ac_v" == '"$(quoted_arg "$2")"' ]; then - return 0 - fi -done' - return 1 -} -function array_find() { - local __af_i __af_v - __af_i=0 - eval 'for __af_v in "${'"$1"'[@]}"; do - if [ "$__af_v" == '"$(quoted_arg "$2")"' ]; then - if [ -n "$3" ]; then - echo "${'"$3"'[$__af_i]}" - else - echo "$__af_i" - fi - return 0 - fi - __af_i=$(($__af_i + 1)) -done' - return 1 -} -function array_reverse() { - local -a __ar_vs - local __ar_v - array_copy __ar_vs "$1" - array_new "$1" - for __ar_v in "${__ar_vs[@]}"; do - array_ins "$1" "$__ar_v" - done -} - -function array_replace() { - local __ar_sn="$1"; shift - local __ar_f="$1"; shift - local -a __ar_s __ar_d - local __ar_v - array_copy __ar_s "$__ar_sn" - for __ar_v in "${__ar_s[@]}"; do - if [ "$__ar_v" == "$__ar_f" ]; then - __ar_d=("${__ar_d[@]}" "$@") - else - __ar_d=("${__ar_d[@]}" "$__ar_v") - fi - done - array_copy "$__ar_sn" __ar_d -} -function array_each() { - local __ae_an="$1"; shift - local __ae_f="$1"; shift - local -a __ae_a - local __ae_v - array_copy __ae_a "$__ae_an" - for __ae_v in "${__ae_a[@]}"; do - "$__ae_f" "$__ae_v" "$@" - done -} -function array_map() { - local __am_an="$1"; shift - local __am_f="$1"; shift - local -a __am_a __am_vs - local __am_v - array_copy __am_a "$__am_an" - for __am_v in "${__am_a[@]}"; do - __am_vs=("${__am_vs[@]}" "$("$__am_f" "$__am_v" "$@")") - done - array_copy "$__am_an" __am_vs -} -function first_value() { - eval "rawecho \"\${$1[@]:0:1}\"" -} -function last_value() { - eval "rawecho \"\${$1[@]:\$((-1)):1}\"" -} -function array_copy() { - eval "$1=(\"\${$2[@]}\")" -} -function array_copy_firsts() { - eval "$1=(\"\${${2:-$1}[@]:0:\$((\${#${2:-$1}[@]}-1))}\")" -} -function array_del_last() { - array_copy_firsts "$1" -} -function array_copy_lasts() { - eval "$1=(\"\${${2:-$1}[@]:1}\")" -} -function array_del_first() { - array_copy_lasts "$1" -} -function array_extend() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]}\")" -} -function array_extendu() { - local __ae_v __ae_s=1 - eval 'for __ae_v in "${'"$2"'[@]}"; do - array_addu "$1" "$__ae_v" && __ae_s=0 -done' - return "$__ae_s" -} -function array_extend_firsts() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]:0:\$((\${#$2[@]}-1))}\")" -} -function array_extend_lasts() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]:1}\")" -} -function array_xsplit() { - eval "$1=($(recho_ "$2" | awkrun RS="${3:-:}" ' -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_split() { - eval "$1=($(recho_ "$2" | awkrun RS="${3:-:}" ' -/^$/ { next } -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_from_path() { - array_split "$1" "$2" ":" -} -function array_from_xlines() { - eval "$1=($(recho_ "$2" | _nl2lf | awk ' -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_from_lines() { - eval "$1=($(recho_ "$2" | _nl2lf | awk ' -/^$/ { next } -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_join() { - local __aj_an __aj_l __aj_j __aj_s="${2:-,}" __aj_pf __aj_sf - if [ "$1" == "@" ]; then - __aj_an="\$@" - shift; shift - else - __aj_an="\${$1[@]}" - __aj_pf="$4" - __aj_sf="$5" - fi - eval 'for __aj_l in "'"$__aj_an"'"; do - __aj_j="${__aj_j:+$__aj_j'"$__aj_s"'}$__aj_pf$__aj_l$__aj_sf" -done' - if [ -n "$__aj_j" ]; then - rawecho "$__aj_j" - elif [ "$__aj_an" != "\$@" -a -n "$3" ]; then - rawecho "$3" - fi -} -function array_mapjoin() { - local __amj_src="$1" __amj_func="$2" __amj_sep="$3" - shift; shift; shift - if [ "$__amj_src" == "@" ]; then - local -a __amj_tmpsrc - __amj_tmpsrc=("$@") - __amj_src=__amj_tmpsrc - set -- - fi - local -a __amj_tmp - array_copy __amj_tmp "$__amj_src" - array_map __amj_tmp "$__amj_func" - array_join __amj_tmp "$__amj_sep" "$@" -} -function array_to_lines() { - array_join "$1" " -" "$2" "$3" "$4" -} -function array_to_path() { - array_join "$1" ":" "$2" "$3" "$4" -} -function array_fix_paths() { - local __afp_an="$1" __afp_s="${2:-:}" - local -a __afp_vs - local __afp_v - array_copy __afp_vs "$__afp_an" - array_new "$__afp_an" - for __afp_v in "${__afp_vs[@]}"; do - array_split __afp_v "$__afp_v" "$__afp_s" - array_extend "$__afp_an" __afp_v - done -} - - -function get_date_rfc822() { - LC_TIME=C date +"%a, %d %b %Y %H:%M:%S %Z" -} -function get_date_fr() { - LC_TIME=C date +"%d/%m/%Y" -} -function get_time_fr() { - LC_TIME=C date +"%Hh%M" -} -function parse_date() { - local value="$1" type="${2:-date}" - local now="$(awk 'BEGIN { print mktime(strftime("%Y %m %d 00 00 00 +0400")) }')" - case "$value" in - +*) - value="$(($now + ${value#+} * 86400))" - ;; - *) - value="$(<<<"$value" awk -F/ '{ - nd = strftime("%d"); nm = strftime("%m"); ny = strftime("%Y") - d = $1 + 0; if (d < 1) d = nd; - m = $2 + 0; if (m < 1) m = nm; - if ($3 == "") y = ny; - else { y = $3 + 0; if (y < 100) y = y + 2000; } - print mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d)); - }')" - esac - case "$type" in - d|date) awk '{ print strftime("%d/%m/%Y", $0 + 0) }' <<<"$value";; - l|ldap) awk '{ print strftime("%Y%m%d%H%M%S+0400", $0 + 0) }' <<<"$value";; - m|mysql) awk '{ print strftime("%Y-%m-%d", $0 + 0) }' <<<"$value";; - *) - rawecho "$value" - ;; - esac -} - - -function udelpath() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; ${2:-PATH}"'="${'"${2:-PATH}"'#$1:}"; '"${2:-PATH}"'="${'"${2:-PATH}"'%:$1}"; '"${2:-PATH}"'="${'"${2:-PATH}"'//:$_qdir:/:}"; [ "$'"${2:-PATH}"'" == "$1" ] && '"${2:-PATH}"'=' -} -function uaddpath() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="${'"${2:-PATH}"':+$'"${2:-PATH}"':}$1"' -} -function uinspathm() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="$1${'"${2:-PATH}"':+:$'"${2:-PATH}"'}"' -} -function uinspath() { - udelpath "$@" - uinspathm "$@" -} - -function withpath() { - [ "${1#./}" != "$1" -o "${1#../}" != "$1" -o "${1#/}" != "$1" ] -} -function withext() { - local basename="$(basename -- "$1")" - [ "${basename%.*}" != "$basename" ] -} -function normpath() { - local -a parts - local part ap - array_split parts "$1" / - if [ "${1#/}" != "$1" ]; then - ap=/ - elif [ -n "$2" ]; then - ap="$2" - else - ap="$(pwd)" - fi - for part in "${parts[@]}"; do - if [ "$part" == "." ]; then - continue - elif [ "$part" == ".." ]; then - ap="${ap%/*}" - [ -n "$ap" ] || ap=/ - else - [ "$ap" != "/" ] && ap="$ap/" - ap="$ap$part" - fi - done - rawecho "$ap" -} -function abspath() { - local ap="$1" - if [ "${ap#/}" != "$ap" ]; then - __normpath "$ap" && return - else - local cwd - if [ -n "$2" ]; then - cwd="$(abspath "$2")" - else - cwd="$(pwd)" - fi - ap="$cwd/$ap" - __normpath "$ap" && return - fi - normpath "$ap" -} -function __normpath() { - if [ -d "$1" ]; then - if [ -x "$1" ]; then - (cd "$1"; pwd) - return 0 - fi - elif [ -f "$1" ]; then - local dn="$(dirname -- "$1")" bn="$(basename -- "$1")" - if [ -x "$dn" ]; then - (cd "$dn"; echo "$(pwd)/$bn") - return 0 - fi - fi - return 1 -} -function parentdirs() { - array_new "$1" - local __pd_d="$(abspath "$2")" - if [[ "$3" == r* ]]; then - while [ "$__pd_d" != "/" ]; do - array_ins "$1" "$__pd_d" - __pd_d="$(dirname "$__pd_d")" - done - else - while [ "$__pd_d" != "/" ]; do - array_add "$1" "$__pd_d" - __pd_d="$(dirname "$__pd_d")" - done - fi -} -function ppath() { - local path="$1" cwd="$2" - - path="$(abspath "$path")" # essayer de normaliser le chemin - [ -n "$cwd" ] || cwd="$(pwd)" - - [ "$path" = "$cwd" ] && path="." - [ "$cwd" != "/" -a "$cwd" != "$HOME" ] && path="${path/#$cwd\//}" - path="${path/#$HOME/~}" - - rawecho "$path" -} -function relpath() { - local p="$(abspath "$1" "$3")" cwd="$2" - if [ -z "$cwd" ]; then - cwd="$(pwd)" - else - cwd="$(abspath "$cwd" "$3")" - fi - if [ "$p" == "$cwd" ]; then - echo "" - elif [ "${p#$cwd/}" != "$p" ]; then - rawecho "${p#$cwd/}" - else - local rp - while [ -n "$cwd" -a "${p#$cwd/}" == "$p" ]; do - rp="${rp:+$rp/}.." - cwd="${cwd%/*}" - done - rp="$rp/${p#$cwd/}" - echo "${rp%//}" - fi -} -function relpathx() { - local p="$(relpath "$@")" - if [ -z "$p" ]; then - echo . - elif [ "${p#../}" != "$p" -o "${p#./}" != "$p" ]; then - echo "$p" - else - echo "./$p" - fi -} -function withinpath() { - local b="$1" p="$2" strict="${3:-N}" - b="$(abspath "$b")" - p="$(abspath "$p")" - if is_yes "$strict"; then - [ "${p#$b/}" != "$p" ] - else - [ "$p" == "$b" -o "${p#$b/}" != "$p" ] - fi -} -function safe_abspath() { - local p="$1" ba="$2" br="$3" - if [ -n "$ba" ]; then - ba="$(abspath "$ba")" - else - ba="$(pwd)" - fi - [ -n "$br" ] || br="$ba" - br="$(abspath "$br" "$ba")" - p="$(abspath "$p" "$ba")" - if [ "$p" == "$br" -o "${p#$br/}" != "$p" ]; then - echo "$p" - else - return 1 - fi -} -function safe_relpath() { - local p - if p="$(safe_abspath "$1" "$2" "$3")"; then - relpath "$p" "$2" "$(pwd)" - else - return 1 - fi -} -function splitwcs() { - local __sw_p="$1" - local __sw_dd="${2:-basedir}" __sw_df="${3:-filespec}" __sw_part __sw_d __sw_f - local -a __sw_parts - array_split __sw_parts "$__sw_p" "/" - for __sw_part in "${__sw_parts[@]}"; do - if [[ "$__sw_part" == *\** ]] || [[ "$__sw_part" == *\?* ]] || [ -n "$__sw_f" ]; then - __sw_f="${__sw_f:+$__sw_f/}$__sw_part" - else - __sw_d="${__sw_d:+$__sw_d/}$__sw_part" - fi - done - [ "${__sw_p#/}" != "$__sw_p" ] && __sw_d="/$__sw_d" - set_var "$__sw_dd" "$__sw_d" - set_var "$__sw_df" "$__sw_f" -} -function deref() { - local OENC="$UTF8" - - local max_deref=50 - local file="$1" - local basedir link - while [ -L "$file" ]; do - basedir="$(dirname "$file")" - link="$(readlink "$file")" - if first_char_is "$link" "/"; then - file="$link" - else - file="$basedir/$link" - fi - - max_deref=$(($max_deref - 1)) - [ $max_deref -eq 0 ] && die "Plus de 50 indirection. Le lien $file est-il récursif?" - done - abspath "$file" -} -function readlinka() { - if [ -L "$1" ]; then - local linkdir="$(dirname -- "$1")" - abspath "$(readlink "$1")" "$linkdir" - else - abspath "$1" - fi -} -function readlinkm() { - readlink -m "$1" -} -function path_if_test() { - local op="$1"; shift - local file="$1"; shift - local rel="$1" reldir=; shift - if beginswith "$rel" relative; then - reldir="${rel#relative}" - if beginswith "$reldir" :; then - reldir="${reldir#:}" - if [ -n "$reldir" ]; then - reldir="${reldir}/" - fi - else - reldir= - fi - else - rel= - fi - - while [ -n "$1" ]; do - local basedir="$1" - if [ $op "$basedir/$file" ]; then - if [ -n "$rel" ]; then - rawecho "$reldir$file" - else - rawecho "$basedir/$file" - fi - break - fi - shift - done -} -function update_link() { - [ -L "$2" ] || return 1 - local dest link="$2" - local linkdir="$(dirname "$link")" - local ldest="$(readlink "$link")" - if [ "${ldest#/}" != "$ldest" ]; then - dest="$(abspath "$1")" - else - dest="$(relpath "$1" "$linkdir")" - fi - if [ "$dest" == "$ldest" ]; then - : # pas besoin de mettre à jour - elif [ -d "$link" ]; then - rm -f "$link" && ln -s "$dest" "$link" - else - ln -sf "$dest" "$link" - fi -} -function update_links() { - [ -n "$1" ] || return 1 - local dest="$1"; shift - local r=0 link - for link in "$@"; do - update_link "$dest" "$link" || r=$? - done - return $r -} -function move_link() { - [ -n "$1" -a -n "$2" ] || return 1 - local link="$1" dest="$2" - [ -d "$dest" ] && dest="$dest/$(basename -- "$link")" - dest="$(abspath "$dest")" - if [ -L "$link" ]; then - link="$(abspath "$link")" - [ "$dest" == "$link" ] && return 0 - ldest="$(readlinka "$link")" - mv "$link" "$dest" || return 1 - update_link "$ldest" "$dest" - else - [ "$dest" == "$link" ] && return 0 - mv "$link" "$dest" - fi -} -function array_find_links() { - local -a __afl_links __afl_result - local __afl_dir="${3:-.}" - local __afl_dest __afl_destname __afl_link __afl_linkdir __afl_ldest - __afl_dest="$(abspath "$2")" - __afl_destname="${__afl_dest##*/}" - array_from_lines __afl_links "$(find "$__afl_dir" -type l)" - for __afl_link in "${__afl_links[@]}"; do - __afl_ldest="$(readlink "$__afl_link")" - if [ "$__afl_ldest" != "$__afl_destname" ]; then - [[ "$__afl_ldest" == */"$__afl_destname" ]] || continue - fi - __afl_link="$(abspath "$__afl_link" "$__afl_dir")" - __afl_linkdir="$(dirname -- "$__afl_link")" - __afl_ldest="$(abspath "$__afl_ldest" "$__afl_linkdir")" - if [ "$__afl_ldest" == "$__afl_dest" ]; then - array_add __afl_result "$__afl_link" - fi - done - array_copy "$1" __afl_result -} -function list_links() { - local -a links - array_find_links links "$@" - array_to_lines links -} -function move_file() { - [ -n "$1" -a -n "$2" ] || return 1 - local src="$1" dest="$2" link - shift; shift - [ -d "$dest" ] && dest="$dest/$(basename -- "$src")" - move_link "$src" "$dest" || return 1 - update_links "$dest" "$@" -} - -function get_nblines() { - [ -f "$1" ] && sed -ne '$=' "$1" || echo 0 -} -function mktempf() { - mktemp "${1:-"$TMPDIR/tmp.XXXXXX"}" -} -function mktempd() { - mktemp -d "${1:-"$TMPDIR/tmp.XXXXXX"}" -} -function mkdirof() { - mkdir -p "$(dirname -- "$1")" -} -function cp_a() { - /bin/cp -a "$@" -} -function cp_R() { - /bin/cp -pR "$@" -} -function quietgrep() { - grep -q "$@" 2>/dev/null -} -function quietdiff() { - diff -q "$@" >&/dev/null -} -function testsame() { - quietdiff "$@" -} -function testdiff() { - ! quietdiff "$@" -} -function testupdated() { - if [ -f "$2" ]; then - testdiff "$1" "$2" - else - return 0 - fi -} -function testnewer() { - test ! -e "$2" -o "$1" -nt "$2" -} -function ps_all() { - ps -axww -} -function progexists() { - test -n "$1" -a -x "$(which "$1" 2>/dev/null)" -} -function has_python() { - progexists python -} -function has_gawk() { - progexists gawk -} -function is_root() { - test `id -u` -eq 0 -} -function source_ifexists() { - if [ -f "$1" ]; then source "$1" || die; fi -} -function little_sleep { - LC_NUMERIC=C sleep 0.1 -} -function random_sleep { - sleep $(($RANDOM % ${1:-1800})) -} -function is_running() { - kill -0 "$1" >&/dev/null -} -function sedi() { - sed -i "$@" -} -function csort() { - LANG=C sort "$@" -} -function lsort() { sort "$@"; } -function cgrep() { - LANG=C grep "$@" -} -function lgrep() { grep "$@"; } -function csed() { - LANG=C sed "$@" -} -function lsed() { sed "$@"; } -function cawk() { - LANG=C awk "$@" -} -function lawk() { awk "$@"; } -function cdiff() { - LANG=C diff "$@" -} -function ldiff() { diff "$@"; } - - -function fix_mode() { - local file="$1" - [ -f "$file" ] || touch "$file" || return 1 - if [ ! -w "$file" ]; then - local mode="$(stat -c %a "$file")" - chmod ${mode:0:${#mode}-3}6${mode:${#mode}-2:2} "$file" - echo "$mode" - fi -} -function unfix_mode() { - [ -n "$2" ] && chmod "$2" "$1" -} -function get_mode() { - [ -f "$1" ] || touch "$1" || return 1 - stat -c %a "$1" -} -function rm_maybe() { - local parse_opts=1 arg rm - for arg in "$@"; do - if [ -n "$parse_opts" ]; then - if [ "$arg" == "--" ]; then - parse_opts= - elif [[ "$arg" == "-*" ]]; then - continue - elif [ -n "$arg" ]; then - rm=1 - break - fi - elif [ -n "$arg" ]; then - rm=1 - break - fi - done - [ -n "$rm" ] && /bin/rm "$@" -} -__CPDIR_RSYNC_SLOW=1 # synchro potentiellement plus lente, mais plus fidèle (option -c) -__CPDIR_RSYNC_ARGS=(-q) -function cpdir() { - - if progexists rsync; then - [ -d "$2" ] || mkdir -p "$2" || return 1 - if [ -d "$1" ]; then - rsync -a ${__CPDIR_RSYNC_SLOW:+-c} "${__CPDIR_RSYNC_ARGS[@]}" "$1/" "$2/" - else - rsync -a ${__CPDIR_RSYNC_SLOW:+-c} "${__CPDIR_RSYNC_ARGS[@]}" "$1" "$2/" - fi - else - __cpdir "$@" - fi -} -function __cpdir() { - local src="$1" dest="$2" method="${3:-cp_a}" - - if [ -d "$src" ]; then - [ -d "$dest" ] || mkdir -p "$dest" || return 1 - - local prevdir="$(pwd)" - - dest="$(abspath "$dest")" - cd "$src" - if [ -n "$(/bin/ls -a1)" ]; then - [ -n "$(/bin/ls -1)" ] && "$method" * "$dest" - local i - for i in .*; do - [ "$i" == "." -o "$i" == ".." ] && continue - "$method" "$i" "$dest" - done - fi - cd "$prevdir" - else - if [ -f "$dest" ]; then - "$method" "$src" "$dest" - elif [ -d "$dest" ]; then - "$method" "$src" "$dest" - else - mkdir -p "$dest" - "$method" "$src" "$dest" - fi - fi -} -__CPNOVCS_RSYNC_SLOW=1 # synchro potentiellement plus lente, mais plus fidèle (option -c) -__CPNOVCS_RSYNC_ARGS=(-q) -function cpnovcs() { - local src="$1" destdir="$2" - [ -d "$destdir" ] || mkdir -p "$destdir" || return 1 - if progexists rsync; then - local gitexclude=/.git/ - if [ "${src%/}" == "$src" ]; then - gitexclude="/$(basename -- "$src")$gitexclude" - fi - rsync -a ${__CPNOVCS_RSYNC_SLOW:+-c} --exclude CVS/ --exclude .svn/ --exclude "$gitexclude" "${__CPNOVCS_RSYNC_ARGS[@]}" "$src" "$destdir/" - elif [ "${src%/}" != "$src" ]; then - __cpdir "$src" "$destdir" - else - local srcname="$(basename -- "$src")" - mkdir -p "$destdir/$srcname" - __cpdir "$src" "$destdir/$srcname" - fi -} -function cpdirnovcs() { - if [ -d "$1" ]; then - cpnovcs "$1/" "$2" - else - cpnovcs "$1" "$2" - fi -} -function doinplace() { - if [ -n "$1" -a "$1" != "-" ]; then - local __dip_file="$1"; shift - autoclean "$__dip_file.tmp.$$" - "$@" <"$__dip_file" >"$__dip_file.tmp.$$" - local s=$? - [ "$s" == 0 ] && /bin/cat "$__dip_file.tmp.$$" >"$__dip_file" - /bin/rm -f "$__dip_file.tmp.$$" - return $s - else - shift - "$@" - fi -} -function doinplacef() { - if [ -n "$1" -a "$1" != "-" ]; then - local __dip_file="$1"; shift - autoclean "$__dip_file.tmp.$$" - "$@" <"$__dip_file" >"$__dip_file.tmp.$$" - local s=$? - /bin/cat "$__dip_file.tmp.$$" >"$__dip_file" - /bin/rm -f "$__dip_file.tmp.$$" - return $s - else - shift - "$@" - fi -} -function stripnl() { - tr -d '\r\n' -} -function _nl2lf() { - awk 'BEGIN {RS="\r|\r\n|\n"} {print}' -} -function nl2lf() { - doinplace "$1" _nl2lf -} -function _nl2crlf() { - awk 'BEGIN {RS="\r|\r\n|\n"} {print $0 "\r"}' -} -function nl2crlf() { - doinplace "$1" _nl2crlf -} -function _nl2cr() { - awk 'BEGIN {RS="\r|\r\n|\n"; ORS=""} {print $0 "\r"}' -} -function nl2cr() { - doinplace "$1" _nl2cr -} -function _latin1compat() { - LANG=fr_FR.UTF-8 sed $' -s/[‘’]/\x27/g -s/[«»“”]/"/g -s/[\xC2\xA0\xE2\x80\x87\xE2\x80\xAF\xE2\x81\xA0]/ /g -' -} -function _noaccents() { - LANG=fr_FR.UTF-8 sed ' -s/[à]/a/g -s/[éèêë]/e/g -s/[ïî]/i/g -s/[ôö]/o/g -s/[üû]/u/g -s/[ç]/c/g -s/[À]/A/g -s/[ÉÈÊË]/E/g -s/[ÏÎ]/I/g -s/[ÔÖ]/O/g -s/[ÜÛ]/U/g -s/[Ç]/C/g -' -} -function list_all() { - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ "$f" == "." -o "$f" == ".." ] && continue - rawecho "$f" - done - cd "$curdir" -} -function __la_cmd() { - [ $# -gt 0 ] || set '*' - local arg - local cmd="/bin/ls -1d" - for arg in "$@"; do - arg="$(_rval "$arg")" - cmd="$cmd $arg" - done - cmd="$cmd 2>/dev/null" - echo "$cmd" -} -function list_files() { - local f - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ -f "$f" ] && rawecho "$f" - done - cd "$curdir" -} -function list_dirs() { - local f - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ "$f" == "." -o "$f" == ".." ] && continue - [ -d "$f" ] && rawecho "$f" - done - cd "$curdir" -} -function __array_ls() { - local __al_l="list_${1:-all}"; shift - local __al_an="$1"; shift - local __al_d="${1:-.}"; shift - local -a __al_fs - array_from_lines __al_fs "$("$__al_l" "$__al_d" "$@")" - local __al_f - array_new "$__al_an" - for __al_f in "${__al_fs[@]}"; do - array_add "$__al_an" "$__al_d/$__al_f" - done -} -function array_lsall() { - __array_ls all "$@" -} -function array_lsdirs() { - __array_ls dirs "$@" -} -function array_lsfiles() { - __array_ls files "$@" -} -function filter_empty() { - sed '/^$/d' -} -function filter_vcspath() { - sed ' -/^.git$/d -/^.git\//d -/\/.git$/d -/\/.git\//d -/^.svn$/d -/^.svn\//d -/\/.svn$/d -/\/.svn\//d -' -} -function merge_contlines() { - awk 'substr($0, length($0)) == "\\" { - while (getline nextline) { - $0 = substr($0, 1, length($0) - 1) nextline - if (substr($0, length($0)) != "\\") break - } - print - next -} -{print}' -} -function filter_comment() { - local -a merge - [ "$1" == -m ] && merge=(merge_contlines) || merge=(cat) - awk ' - /^[ \t]*#/ { next } - /^[ \t]*$/ { next } - { print }' | "${merge[@]}" -} -function filter_conf() { - local -a merge - [ "$1" == -m ] && merge=(merge_contlines) || merge=(cat) - grep -v '^#' | grep -v '^$' | "${merge[@]}" -} -function is_archive() { - local name="${1%.zip}" - name="${name%.tgz}" - name="${name%.tbz2}" - name="${name%.tar.gz}" - name="${name%.tar.bz2}" - name="${name%.tar}" - name="${name%.jar}" - name="${name%.war}" - name="${name%.ear}" - [ "$name" != "$1" ] -} -function extract_archive() { - local arch="$1" destdir="${2:-.}" - shift; shift - if endswith "$arch" .zip; then - unzip -q -d "$destdir" "$arch" "$@" || return - elif endswith "$arch" .tgz || endswith "$arch" .tar.gz; then - tar xzf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .tbz2 || endswith "$arch" .tar.bz2; then - tar xjf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .tar; then - tar xf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .jar || endswith "$arch" .war || endswith "$arch" .ear; then - ( - arch="$(abspath "$arch")" - cd "$destdir" - jar xf "$arch" "$@" - ) || return - else - return 1 - fi -} -function get_archive_basename() { - local basename="$(basename -- "$1")" - basename="${basename%.zip}" - basename="${basename%.tgz}" - basename="${basename%.tbz2}" - basename="${basename%.gz}" - basename="${basename%.bz2}" - basename="${basename%.tar}" - basename="${basename%.jar}" - basename="${basename%.war}" - basename="${basename%.ear}" - echo "$basename" -} -function get_archive_appname() { - local appname="$(basename -- "$1")" - appname="${appname%.zip}" - appname="${appname%.tgz}" - appname="${appname%.tbz2}" - appname="${appname%.gz}" - appname="${appname%.bz2}" - appname="${appname%.tar}" - appname="${appname%.jar}" - appname="${appname%.war}" - appname="${appname%.ear}" - echo "$appname" | awk '{ - if (match($0, /[-_.]([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/)) { - print substr($0, 1, RSTART - 1) - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/)) { - print substr($0, 1, RSTART - 1) - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print substr($0, 1, RSTART - 1) - } else { - print $0 - } -}' -} -function get_archive_versionsuffix() { - local basename="$(get_archive_basename "$1")" - echo "$basename" | awk '{ - if (match($0, /([-_.][0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print vs["1"] - } -}' -} -function get_archive_version() { - local basename="$(get_archive_basename "$1")" - echo "$basename" | awk '{ - if (match($0, /[-_.]([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print vs["1"] - } -}' -} -function __dump_usernames() { - = 500 && $6 ~ /^\/home\// { print $1 }' -} -function dump_usernames() { - array_from_lines "${1:-usernames}" "$(__dump_usernames)" -} -function __resolv_ips() { - LANG=C host "$1" 2>/dev/null | awk '/address / { gsub(/^.*address /, ""); print }' -} -function resolv_ips() { - array_from_lines "${1:-ips}" "$(__resolv_ips "$2")" -} -function __resolv_hosts() { - LANG=C host "$1" 2>/dev/null | awk '/domain name pointer / { gsub(/^.*domain name pointer /, ""); gsub(/\.$/, ""); print }' -} -function resolv_hosts() { - array_from_lines "${1:-hosts}" "$(__resolv_hosts "$2")" -} -function runscript_as() { - local OENC="$UTF8" - local user="${1:-root}"; shift - local exec_maybe= - if [ "$1" = "exec" ]; then - exec_maybe=exec - shift - fi - - local cmd - cmd="\ -__estack=$(quoted_arg "$__estack") -__tlevel=$(quoted_args "$__tlevel") -export __estack __tlevel -exec ${BASH:-/bin/sh} $(quoted_args "$@")" - - if is_yes "$UTOOLS_USES_SU" || ! progexists sudo; then - eecho "Entrez le mot de passe de root" - $exec_maybe su "$user" -c "$cmd" - else - if [ "$user" == "root" ]; then - $exec_maybe sudo -p "Entrez le mot de passe de %u: " "${BASH:-/bin/sh}" -c "$cmd" - else - $exec_maybe sudo -p "Entrez le mot de passe de %u: " su "$user" -c "$cmd" - fi - fi -} -function runscript_as_root() { - if is_root; then - local exec_maybe= - if [ "$1" = "exec" ]; then - exec_maybe=exec - shift - fi - $exec_maybe "${BASH:-/bin/sh}" "$@" - else - runscript_as root "$@" - fi -} -function run_as() { - local user="${1:-root}"; shift - local exec_maybe=exec - if [ "$1" = "--noexec" ]; then - exec_maybe= - shift - fi - - runscript_as "$user" $exec_maybe "$0" "$@" -} -function run_as_root() { - is_root || run_as root "$@" -} -function check_user() { - local user - for user in "$@"; do - [ "$USER" == "$user" ] && return 0 - done - return 1 -} -function ensure_user() { - local -a users - while [ $# -gt 0 -a "$1" != "--" ]; do - array_add users "$1" - shift - done - [ "$1" == "--" ] && shift - - if ! check_user "${users[@]}"; then - if [ ${#users[*]} -gt 1 ]; then - ewarn "Cette commande doit être lancée avec l'un des users ${users[*]}" - else - ewarn "Cette commande doit être lancée avec le user ${users[0]}" - fi - if ask_yesno "Voulez-vous tenter de relancer la commande avec le bon user?" O; then - estep "Lancement du script avec le user ${users[0]}" - run_as "${users[0]}" "$@" - return 1 - elif is_root; then - return 11 - else - return 10 - fi - fi - return 0 -} -function check_hostname() { - local userhost user host path - for userhost in "$@"; do - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - [ "$MYHOSTNAME" == "${host%%.*}" ] && return 0 - done - return 1 -} -function check_userhostname() { - local userhost path user host - for userhost in "$@"; do - if check_hostname "$userhost"; then - [[ "$userhost" == *@* ]] || return 0 - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - check_user "$user" && return 0 - fi - done - return 1 -} -UTOOLS_ENSURE_HOSTNAME_SSH_OPTS=() -function ensure_hostname() { - local -a userhosts - while [ $# -gt 0 -a "$1" != "--" ]; do - array_add userhosts "$1" - shift - done - [ "$1" == "--" ] && shift - - local userhost user host path - if ! check_hostname "${userhosts[@]}"; then - if [ ${#userhosts[*]} -gt 1 ]; then - ewarn "Cette commande n'est valide que sur l'un des hôtes ${userhosts[*]}" - else - ewarn "Cette commande n'est valide que sur l'hôte ${userhosts[0]}" - fi - - enote "Vous pouvez tenter de relancer le script sur ${userhosts[0]}, mais cela requière que ce script ET les données dont il a besoin soient installés dans la même version et dans le même répertoire sur l'hôte distant" - if ask_yesno "Voulez-vous tenter de relancer le script sur l'hôte distant?" N; then - splitfsep "${userhosts[0]}" : userhost path - splituserhost "$userhost" user host - [ -n "$user" ] || user=root - - estep "Lancement de la commande sur l'hôte distant $user@$host" - local cmd - [ -n "$path" ] && cmd="$(quoted_args cd "$path"); " - cmd="$cmd$(quoted_args "$script" "$@")" - ssh -qt "${UTOOLS_ENSURE_HOSTNAME_SSH_OPTS[@]}" "$user@$host" "$cmd" - [ $? -eq 255 ] && return 12 - return 1 - else - return 11 - fi - fi - local userhost user host - for userhost in "${userhosts[@]}"; do - [[ "$userhost" == *@* ]] || continue - if check_hostname "$userhost"; then - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - [ -n "$path" ] && cd "$path" - ensure_user "$user" -- "$@" - return $? - fi - done - return 0 -} - -__AWKDEF_FUNCTIONS=' -function quote_html(s) { - gsub(/&/, "\\&", s) - gsub(/"/, "\\"", s) - gsub(/>/, "\\>", s) - gsub(/", s) - gsub(/"/, "\"", s) - gsub(/&/, "\\&", s) - return s -} -function quote_value(s) {'" - gsub(/'/, \"'\\\\''\", s) - return \"'\" s \"'\" -"'} -function quoted_values( i, line) { - line = "" - for (i = 1; i <= NF; i++) { - if (i > 1) line = line " " - line = line quote_value($i) - } - return line -} -function quote_subrepl(s) { - gsub(/\\/, "\\\\", s) - gsub(/&/, "\\\\&", s) - return s -} -function quote_grep(s) { - gsub(/[[\\.^$*]/, "\\\\&", s) - return s -} -function quote_egrep(s) { - gsub(/[[\\.^$*+?()|{]/, "\\\\&", s) - return s -} -function quote_sql(s) {'" - gsub(/'/, \"''\", s) - return \"'\" s \"'\" -"'} -function unquote_mysqlcsv(s) { - gsub(/\\n/, "\n", s) - gsub(/\\t/, "\t", s) - gsub(/\\0/, "\0", s) - gsub(/\\\\/, "\\", s) - return s -} -function array_new(dest) { - dest[0] = 0 # forcer awk à considérer dest comme un tableau - delete dest -} -function array_newsize(dest, size, i) { - dest[0] = 0 # forcer awk à considérer dest comme un tableau - delete dest - size = int(size) - for (i = 1; i <= size; i++) { - dest[i] = "" - } -} -function array_len(values, count, i) { - count = 0 - for (i in values) { - count++ - } - return count -} -function mkindices(values, indices, i, j) { - array_new(indices) - j = 1 - for (i in values) { - indices[j++] = int(i) - } - return asort(indices) -} -function array_copy(dest, src, count, indices, i) { - array_new(dest) - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - dest[indices[i]] = src[indices[i]] - } -} -function array_getlastindex(src, count, indices) { - count = mkindices(src, indices) - if (count == 0) return 0 - return indices[count] -} -function array_add(dest, value, lastindex) { - lastindex = array_getlastindex(dest) - dest[lastindex + 1] = value -} -function array_deli(dest, i, l) { - i = int(i) - if (i == 0) return - l = array_len(dest) - while (i < l) { - dest[i] = dest[i + 1] - i++ - } - delete dest[l] -} -function array_del(dest, value, ignoreCase, i) { - do { - i = key_index(value, dest, ignoreCase) - if (i != 0) array_deli(dest, i) - } while (i != 0) -} -function array_extend(dest, src, count, lastindex, indices, i) { - lastindex = array_getlastindex(dest) - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - dest[lastindex + i] = src[indices[i]] - } -} -function array_fill(dest, i) { - array_new(dest) - for (i = 1; i <= NF; i++) { - dest[i] = $i - } -} -function array_getline(src, count, indices, i, j) { - $0 = "" - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - j = indices[i] - $j = src[j] - } -} -function array_appendline(src, count, indices, i, nf, j) { - count = mkindices(src, indices) - nf = NF - for (i = 1; i <= count; i++) { - j = nf + indices[i] - $j = src[indices[i]] - } -} -function in_array(value, values, ignoreCase, i) { - if (ignoreCase) { - value = tolower(value) - for (i in values) { - if (tolower(values[i]) == value) return 1 - } - } else { - for (i in values) { - if (values[i] == value) return 1 - } - } - return 0 -} -function key_index(value, values, ignoreCase, i) { - if (ignoreCase) { - value = tolower(value) - for (i in values) { - if (tolower(values[i]) == value) return int(i) - } - } else { - for (i in values) { - if (values[i] == value) return int(i) - } - } - return 0 -} -function array2s(values, prefix, sep, suffix, noindices, first, i, s) { - if (!prefix) prefix = "[" - if (!sep) sep = ", " - if (!suffix) suffix = "]" - s = prefix - first = 1 - for (i in values) { - if (first) first = 0 - else s = s sep - if (!noindices) s = s "[" i "]=" - s = s values[i] - } - s = s suffix - return s -} -function array2so(values, prefix, sep, suffix, noindices, count, indices, i, s) { - if (!prefix) prefix = "[" - if (!sep) sep = ", " - if (!suffix) suffix = "]" - s = prefix - count = mkindices(values, indices) - for (i = 1; i <= count; i++) { - if (i > 1) s = s sep - if (!noindices) s = s "[" indices[i] "]=" - s = s values[indices[i]] - } - s = s suffix - return s -} -function array_join(values, sep, prefix, suffix, count, indices, i, s) { - s = prefix - count = mkindices(values, indices) - for (i = 1; i <= count; i++) { - if (i > 1) s = s sep - s = s values[indices[i]] - } - s = s suffix - return s -} -function printto(s, output) { - if (output == "") { - print s - } else if (output ~ /^>>/) { - sub(/^>>/, "", output) - print s >>output - } else if (output ~ /^>/) { - sub(/^>/, "", output) - print s >output - } else { - print s >output - } -} -function find_line(input, field, value, orig, line) { - orig = $0 - line = "" - while ((getline 0) { - if ($field == value) { - line = $0 - break - } - } - close(input) - $0 = orig - return line -} -function merge_line(input, field, key, line) { - line = find_line(input, field, $key) - if (line != "") $0 = $0 FS line -} -function __csv_parse_quoted(line, destl, colsep, qchar, echar, pos, tmpl, nextc, resl) { - line = substr(line, 2) - resl = "" - while (1) { - pos = index(line, qchar) - if (pos == 0) { - resl = resl line - destl[0] = "" - destl[1] = 0 - return resl - } - if (echar != "" && pos > 1) { - prevc = substr(line, pos - 1, 1) - quotec = substr(line, pos, 1) - nextc = substr(line, pos + 1, 1) - if (prevc == echar) { - tmpl = substr(line, 1, pos - 2) - resl = resl tmpl quotec - line = substr(line, pos + 1) - continue - } - tmpl = substr(line, 1, pos - 1) - if (nextc == colsep || nextc == "") { - resl = resl tmpl - destl[0] = substr(line, pos + 2) - destl[1] = nextc == colsep - return resl - } else { - resl = resl tmpl quotec - line = substr(line, pos + 1) - } - } else { - tmpl = substr(line, 1, pos - 1) - quotec = substr(line, pos, 1) - nextc = substr(line, pos + 1, 1) - if (nextc == colsep || nextc == "") { - resl = resl tmpl - destl[0] = substr(line, pos + 2) - destl[1] = nextc == colsep - return resl - } else if (nextc == qchar) { - resl = resl tmpl quotec - line = substr(line, pos + 2) - } else { - resl = resl tmpl quotec - line = substr(line, pos + 1) - } - } - } -} -function __csv_parse_unquoted(line, destl, colsep, qchar, echar, pos) { - pos = index(line, colsep) - if (pos == 0) { - destl[0] = "" - destl[1] = 0 - return line - } else { - destl[0] = substr(line, pos + 1) - destl[1] = 1 - return substr(line, 1, pos - 1) - } -} -function __array_parsecsv(fields, line, nbfields, colsep, qchar, echar, shouldparse, destl, i) { - array_new(fields) - array_new(destl) - i = 1 - shouldparse = 0 - while (shouldparse || line != "") { - if (index(line, qchar) == 1) { - value = __csv_parse_quoted(line, destl, colsep, qchar, echar) - line = destl[0] - shouldparse = destl[1] - } else { - value = __csv_parse_unquoted(line, destl, colsep, qchar, echar) - line = destl[0] - shouldparse = destl[1] - } - fields[i] = value - i = i + 1 - } - if (nbfields) { - nbfields = int(nbfields) - i = array_len(fields) - while (i < nbfields) { - i++ - fields[i] = "" - } - } - return array_len(fields) -} -BEGIN { - DEFAULT_COLSEP = "," - DEFAULT_QCHAR = "\"" - DEFAULT_ECHAR = "" -} -function array_parsecsv2(fields, line, nbfields, colsep, qchar, echar) { - return __array_parsecsv(fields, line, nbfields, colsep, qchar, echar) -} -function array_parsecsv(fields, line, nbfields, colsep, qchar, echar) { - if (colsep == "") colsep = DEFAULT_COLSEP - if (qchar == "") qchar = DEFAULT_QCHAR - if (echar == "") echar = DEFAULT_ECHAR - return __array_parsecsv(fields, line, nbfields, colsep, qchar, echar) -} -function parsecsv(line, fields) { - array_parsecsv(fields, line) - array_getline(fields) - return NF -} -function getlinecsv(file, fields) { - if (file) { - getline 1) line = line colsep - if (qchar != "" && index(value, qchar) != 0) { - if (echar != "") gsub(qchar, quote_subrepl(echar) "&", value); - else gsub(qchar, "&&", value); - } - if (qchar != "" && (index(value, mvsep) != 0 || index(value, colsep) != 0 || index(value, qchar) != 0 || __csv_should_quote(value))) { - line = line qchar value qchar - } else { - line = line value - } - } - return line -} -function array_formatcsv(fields) { - return array_formatcsv2(fields, ",", ";", "\"", "") -} -function array_printcsv(fields, output) { - printto(array_formatcsv(fields), output) -} -function get_formatcsv( fields) { - array_fill(fields) - return array_formatcsv(fields) -} -function formatcsv() { - $0 = get_formatcsv() -} -function printcsv(output, fields) { - array_fill(fields) - array_printcsv(fields, output) -} -function array_findcsv(fields, input, field, value, nbfields, orig, found, i) { - array_new(orig) - array_fill(orig) - array_new(fields) - found = 0 - while ((getline 0) { - array_parsecsv(fields, $0, nbfields) - if (fields[field] == value) { - found = 1 - break - } - } - close(input) - array_getline(orig) - if (!found) { - delete fields - if (nbfields) { - nbfields = int(nbfields) - i = array_len(fields) - while (i < nbfields) { - i++ - fields[i] = "" - } - } - } - return found -} - -function __and(var, x, l_res, l_i) { - l_res=0; - for (l_i=0; l_i < 8; l_i++){ - if (var%2 == 1 && x%2 == 1) l_res=l_res/2 + 128; - else l_res/=2; - var=int(var/2); - x=int(x/2); - } - return l_res; -} -function __lshift(var, x) { - while(x > 0){ - var*=2; - x--; - } - return var; -} -function __rshift(var, x) { - while(x > 0){ - var=int(var/2); - x--; - } - return var; -} -BEGIN { - __BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" -} -function b64decode(src, result, base1, base2, base3, base4) { - result = "" - while (length(src) > 0) { - base1 = substr(src, 1, 1) - base2 = substr(src, 2, 1) - base3 = substr(src, 3, 1); if (base3 == "") base3 = "=" - base4 = substr(src, 4, 1); if (base4 == "") base4 = "=" - byte1 = index(__BASE64, base1) - 1 - if (byte1 < 0) byte1 = 0 - byte2 = index(__BASE64, base2) - 1 - if (byte2 < 0) byte2 = 0 - byte3 = index(__BASE64, base3) - 1 - if (byte3 < 0) byte3 = 0 - byte4 = index(__BASE64, base4) - 1 - if (byte4 < 0) byte4 = 0 - result = result sprintf( "%c", __lshift(__and(byte1, 63), 2) + __rshift(__and(byte2, 48), 4) ) - if (base3 != "=") result = result sprintf( "%c", __lshift(__and(byte2, 15), 4) + __rshift(__and(byte3, 60), 2) ) - if (base4 != "=") result = result sprintf( "%c", __lshift(__and(byte3, 3), 6) + byte4 ) - src = substr(src, 5) - } - return result -} -' -function awkdef() { - - if [ "${1:0:3}" == "-f" ]; then - shift - echo "$__AWKDEF_FUNCTIONS" - fi - if [ $# -gt 0 ]; then - local __ad_arg __ad_vpos __ad_name __ad_value - echo "BEGIN {" - while [ -n "${1:0:1}" ]; do - __ad_arg="${1:0:256}" - local __ad_array= - if [ "${__ad_arg%\[@\]}" != "$__ad_arg" ]; then - __ad_array=1 - __ad_name="${__ad_arg%\[@\]}" - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_value="$__ad_name" - elif [[ "$__ad_arg" == *\[@\]=* ]]; then - __ad_array=1 - __ad_name="${__ad_arg%%\[@\]=*}" - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_vpos=$((${#__ad_name} + 4)) - __ad_value="${1:$__ad_vpos}" - [ ${#__ad_value} -ne 0 ] || __ad_value="$__ad_name" - elif [[ "$__ad_arg" == *=* ]]; then - local __ad_int= __ad_str= - __ad_name="${__ad_arg%%=*}" - __ad_vpos=$((${#__ad_name} + 1)) - if [ "${__ad_name%:int}" != "$__ad_name" ]; then - __ad_int=1 - __ad_name="${__ad_name%:int}" - elif [ "${__ad_name%:str}" != "$__ad_name" ]; then - __ad_str=1 - __ad_name="${__ad_name%:str}" - fi - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_value="${1:$__ad_vpos}" - if [ -n "$__ad_int" ]; then - echo "$__ad_name = int($(quoted_awk "$__ad_value") + 0)" - elif [ -n "$__ad_str" ]; then - echo "$__ad_name = $(quoted_awk "$__ad_value")" - elif [ ${#__ad_value} -lt 256 ] && isnum "$__ad_value"; then - echo "$__ad_name = $__ad_value" - else - echo "$__ad_name = $(quoted_awk "$__ad_value")" - fi - else - break - fi - if [ -n "$__ad_array" ]; then - if [ "${__ad_value:0:2}" == $'<\n' ]; then - local -a __ad_values - array_from_lines __ad_values "${__ad_value:2}" - __ad_value=__ad_values - fi - __ad_value="${__ad_value}[@]" - local __ad_i=1 - echo "$__ad_name[0] = 0; delete $__ad_name" - for __ad_arg in "${!__ad_value}"; do - echo "$__ad_name[$__ad_i]=$(quoted_awk "$__ad_arg")" - __ad_i=$(($__ad_i + 1)) - done - eval "echo \"\${__ad_name}_count = \${#$__ad_value}\"" - fi - shift - done - echo "}" - for __ad_arg in "$@"; do - rawecho "$__ad_arg" - done - fi -} -function lawkrun() { - local -a __ar_defs __ar_args - while [ $# -gt 0 -a "$1" != "--" ]; do - __ar_defs=("${__ar_defs[@]}" "$1") - shift - done - shift - while [ $# -gt 0 ]; do - __ar_args=("${__ar_args[@]}" "$1") - shift - done - local __ar_script="$(awkdef "${__ar_defs[@]}")" - awk "$__ar_script" "${__ar_args[@]}" -} -function cawkrun() { LANG=C lawkrun "$@"; } -function awkrun() { LANG=C lawkrun "$@"; } - -function __lf_get_age() { - local y=$(date "+%Y") - local dy=$(date "+%j"); while [ "${dy#0}" != "$dy" ]; do dy="${dy#0}"; done - [ -n "$dy" ] || dy=0 - local h=$(date "+%H"); while [ "${h#0}" != "$h" ]; do h="${h#0}"; done - [ -n "$h" ] || h=0 - echo $((($y * 365 + $dy) * 24 + $h)) -} -function lf_trylock() { - local eoo lockfile max_hours=4 - while [ -n "$1" ]; do - case "$1" in - -h) shift; max_hours="$1";; - --) shift; eoo=1;; - *) eoo=1;; - esac - [ -n "$eoo" ] && break - shift - done - - lockfile="$1" - [ -n "$lockfile" ] || die "il faut spécifier un fichier pour le verrou" - - local now="$(__lf_get_age)" - if (set -C; echo "$now" >"$lockfile") 2>/dev/null; then - return 0 - fi - local prev diff - if prev="$(<"$lockfile")"; then - diff="$(($now - $prev))" - if [ "$diff" -gt "$max_hours" ]; then - echo stale - else - echo locked - fi - elif [ -f "$lockfile" ]; then - echo retry - fi - return 1 -} -function pidfile_set() { - local eoo pidfile pid=$$ replace= - while [ -n "$1" ]; do - case "$1" in - -p) - shift - pid="$1" - ;; - -r) - replace=1 - ;; - --) - shift - eoo=1 - ;; - *) - eoo=1 - ;; - esac - [ -n "$eoo" ] && break - shift - done - - pidfile="$1" - [ -n "$pidfile" ] || return 10 - - if [ -f "$pidfile" ]; then - local curpid="$(<"$pidfile")" - if is_running "$curpid"; then - return 1 - elif [ -n "$replace" ]; then - /bin/rm -f "$pidfile" || return 10 - else - return 2 - fi - fi - - echo_ "$pid" >"$pidfile" || return 10 - autoclean "$pidfile" - return 0 -} -function pidfile_check() { - local pidfile="$1" - [ -n "$pidfile" ] || return 10 - - if [ -f "$pidfile" ]; then - [ -r "$pidfile" ] || return 10 - local pid="$(<"$pidfile")" - is_running "$pid" && return 0 - fi - return 1 -} -function page_maybe() { - if isatty; then - less -XF "$@" - else - cat - fi -} - - -function utools_local() { - local arg - [ $# -gt 0 ] || set -- opts verbosity interaction - for arg in "$@"; do - case "$arg" in - parse_opts|opts|o|args) echo "local -a args";; - verbosity|v) echo "local __verbosity='$__verbosity'";; - interaction|i) echo "local __interaction='$__interaction'";; - esac - done -} - -function isatty() { - tty -s <&1 -} -function in_isatty() { - tty -s -} -function out_isatty() { - tty -s <&1 -} -function err_isatty() { - tty -s <&2 -} -function die() { [ $# -gt 0 ] && eerror "$@"; exit 1; } -function exit_with { if [ $# -gt 0 ]; then "$@"; fi; exit $?; } -function die_with { [ $# -gt 0 ] && eerror "$1"; shift; [ $# -gt 0 ] && "$@"; exit 1; } -function die_unless() { - local count=$# - if [ $count -eq 0 ]; then - exit 1 - elif [ $count -eq 1 ]; then - "$@" || exit $? - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - : - else - r=$? - eerror "$m" - exit $r - fi - fi -} -function eerror_unless() { - local count=$# - if [ $count -eq 0 ]; then - return 1 - elif [ $count -eq 1 ]; then - "$@" || return $? - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - : - else - r=$? - eerror "$m" - return $r - fi - fi -} -function die_if() { - local count=$# - if [ $count -eq 0 ]; then - : - elif [ $count -eq 1 ]; then - "$@" && exit 1 - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - eerror "$m" - exit 1 - fi - fi -} -function eerror_if() { - local count=$# - if [ $count -eq 0 ]; then - : - elif [ $count -eq 1 ]; then - "$@" && return 1 - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - eerror "$m" - return 1 - fi - fi -} - -TAB=$'\t' -LATIN1=iso-8859-1 -LATIN9=iso-8859-15 -UTF8=utf-8 -OENC="$UTF8" - -if ! progexists iconv; then - function iconv() { cat; } -fi - -function __lang_encoding() { - local lang="$(<<<"$LANG" awk '{ print tolower($0) }')" - case "$lang" in - *@euro) echo "iso-8859-15";; - *.utf-8|*.utf8) echo "utf-8";; - *) echo "iso-8859-1";; - esac -} -function __norm_encoding() { - awk '{ - enc = tolower($0) - gsub(/^latin$/, "latin1", enc) - gsub(/^latin1$/, "iso-8859-1", enc) - gsub(/^latin9$/, "iso-8859-15", enc) - gsub(/[-_]/, "", enc) - if (enc == "iso8859" || enc == "iso88591" || enc == "8859" || enc == "88591") print "iso-8859-1" - else if (enc == "iso885915" || enc == "885915") print "iso-8859-15" - else if (enc == "utf" || enc == "utf8") print "utf-8" - else print $0 - }' <<<"$1" -} -function __init_encoding() { - local DEFAULT_ENCODING="$(__lang_encoding)" - [ -n "$DEFAULT_ENCODING" ] || DEFAULT_ENCODING=utf-8 - [ -n "$UTOOLS_OUTPUT_ENCODING" ] || UTOOLS_OUTPUT_ENCODING="$DEFAULT_ENCODING" - UTOOLS_OUTPUT_ENCODING="$(__norm_encoding "$UTOOLS_OUTPUT_ENCODING")" - [ -n "$UTOOLS_INPUT_ENCODING" ] || UTOOLS_INPUT_ENCODING="$UTOOLS_OUTPUT_ENCODING" - UTOOLS_INPUT_ENCODING="$(__norm_encoding "$UTOOLS_INPUT_ENCODING")" - [ -n "$UTOOLS_EDITOR_ENCODING" ] || UTOOLS_EDITOR_ENCODING="$UTOOLS_INPUT_ENCODING" - UTOOLS_EDITOR_ENCODING="$(__norm_encoding "$UTOOLS_EDITOR_ENCODING")" - - IENC="$UTOOLS_INPUT_ENCODING" - OENC="$UTOOLS_OUTPUT_ENCODING" -} - -if [ -n "$UTOOLS_LANG" -a -z "$LANG" ]; then - export UTOOLS_LANG - export LANG="$UTOOLS_LANG" -fi -__init_encoding - -function tooenc() { - local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - rawecho "$src" - else - iconv -f "$from" -t "$to" <<<"$src" - fi -} -function uecho() { - tooenc "$*" -} -function tooenc_() { - local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - rawecho_ "$src" - else - rawecho_ "$src" | iconv -f "$from" -t "$to" - fi -} -function uecho_() { - tooenc_ "$*" -} -function toienc() { - local __tie_var="$1" __tie_to="${2:-$IENC}" __tie_from="${3:-$UTOOLS_INPUT_ENCODING}" - if [ "$__tie_from" != "$__tie_to" ]; then - set_var "$__tie_var" "$(iconv -f "$__tie_from" -t "$__tie_to" <<<"${!__tie_var}")" - fi -} -function uread() { - [ $# -gt 0 ] || set -- REPLY - local __r_var - read "$@" - for __r_var in "$@"; do - [ -z "$__r_var" -o "${__r_var:0:1}" == "-" ] && continue # ignorer les options - toienc "$__r_var" - done -} - -function stooenc() { - local from="${1:-$OENC}" to="${2:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - cat - else - iconv -f "$from" -t "$to" - fi -} -function stoienc() { - local to="${1:-$IENC}" from="${2:-$UTOOLS_INPUT_ENCODING}" - if [ "$from" == "$to" ]; then - cat - else - iconv -f "$from" -t "$to" - fi -} - -export UTOOLS_EDATE -function __edate() { [ -n "$UTOOLS_EDATE" ] && date +"[%d/%m/%Y-%H:%M:%S] "; } - -export UTOOLS_ELOG_OVERWRITE -function __set_no_colors() { :; } -function elogto() { - UTOOLS_EDATE=1 - if [ -n "$1" -a -n "$2" ]; then - LANG=fr_FR.UTF8 - UTOOLS_OUTPUT_ENCODING="$UTF8" - __set_no_colors 1 - if [ -n "$UTOOLS_ELOG_OVERWRITE" ]; then - exec >"$1" 2>"$2" - else - exec >>"$1" 2>>"$2" - fi - elif [ -n "$1" ]; then - LANG=fr_FR.UTF8 - UTOOLS_OUTPUT_ENCODING="$UTF8" - __set_no_colors 1 - if [ -n "$UTOOLS_ELOG_OVERWRITE" ]; then - exec >"$1" 2>&1 - else - exec >>"$1" 2>&1 - fi - fi -} - -export __estack __tlevel -function __indent() { - if [ "${1/ -/}" != "$1" ]; then - sed "2,\$s/^/${__tlevel}/g" <<<"$1" - else - rawecho "$1" - fi -} -function __eerror() { tooenc "$(__edate)${__tlevel}* error: $(__indent "$1")"; } -function __ewarn() { tooenc "$(__edate)${__tlevel}* warning: $(__indent "$1")"; } -function __enote() { tooenc "$(__edate)${__tlevel}* note: $(__indent "$1")"; } -function __ebanner() { - local maxi="${COLUMNS:-80}" - local -a lines - local psfix line - - psfix="$(__edate)${__tlevel}" - while [ ${#psfix} -lt $maxi ]; do psfix="$psfix="; done - - tooenc "$psfix" - maxi=$(($maxi - 1)) - array_from_xlines lines "$1" - for line in "" "${lines[@]}" ""; do - line="$(__edate)${__tlevel}= $line" - if [ ${#line} -le $maxi ]; then - while [ ${#line} -lt $maxi ]; do line="$line "; done - line="$line=" - fi - tooenc "$line" - done - tooenc "$psfix" -} -function __eimportant() { tooenc "$(__edate)${__tlevel}* important: $(__indent "$1")"; } -function __eattention() { tooenc "$(__edate)${__tlevel}* attention: $(__indent "$1")"; } -function __einfo() { tooenc "$(__edate)${__tlevel}* info: $(__indent "$1")"; } -function __eecho() { tooenc "$(__edate)${__tlevel}$(__indent "$1")"; } -function __eecho_() { tooenc_ "$(__edate)${__tlevel}$(__indent "$1")"; } -function __edebug() { tooenc "$(__edate)${__tlevel}* debug: $(__indent "$1")"; } -function __estep() { tooenc "$(__edate)${__tlevel}* $(__indent "$1")"; } -function __estepe() { __estep "$@"; } -function __estepw() { __estep "$@"; } -function __estepn() { __estep "$@"; } -function __estepi() { __estep "$@"; } -function __estep_() { tooenc_ "$(__edate)${__tlevel}* $(__indent "$1")"; } -function __estepe_() { __estep_ "$@"; } -function __estepw_() { __estep_ "$@"; } -function __estepn_() { __estep_ "$@"; } -function __estepi_() { __estep_ "$@"; } -function __etitle() { tooenc "$(__edate)${__tlevel}+++ $(__indent "$1")"; } -function __ebegin() { tooenc_ "$(__edate)${__tlevel}* $(__indent "$1"): "; } -function __edoto() { echo_ "."; } -function __edotw() { echo_ "w"; } -function __edotx() { echo_ "x"; } -function __edotp() { echo_ "+"; } -function __edotd() { tooenc "($1)"; } -function __eendo() { echo "[ok]"; } -function __eendx() { echo "[error]"; } -PRETTYOPTS=() -function set_verbosity() { :;} -function set_interaction() { :;} -function show_error() { - return 0 -} -function show_warn() { - return 0 -} -function show_info() { - return 0 -} -function show_verbose() { - return 0 -} -function show_debug() { - [ -n "$DEBUG" ] -} -function check_verbosity() { - return 0 -} -function get_verbosity_option() { :;} -function check_interaction() { - return 0 -} -function is_interaction() { - return 1 -} -function get_interaction_option() { :;} -__epending= -function eflush() { - if [ -n "$__epending" ]; then rawecho "$__epending" 1>&2; __epending=; fi -} -function eclearp() { - __epending= -} -function eerror() { - show_error || return; eflush; __eerror "$*" 1>&2 -} -function ewarn() { - show_warn || return; eflush; __ewarn "$*" 1>&2 -} -function enote() { - show_info || return; eflush; __enote "$*" 1>&2 -} -function ebanner() { - show_error || return; eflush; __ebanner "$*" 1>&2; sleep 5 -} -function eimportant() { - show_error || return; eflush; __eimportant "$*" 1>&2 -} -function eattention() { - show_warn || return; eflush; __eattention "$*" 1>&2 -} -function einfo() { - show_info || return; eflush; __einfo "$*" 1>&2 -} -function eecho() { - show_info || return; eflush; __eecho "$*" 1>&2 -} -function eecho_() { - show_info || return; eflush; __eecho_ "$*" 1>&2 -} -function edebug() { - show_debug || return; eflush; __edebug "$*" 1>&2 -} -function trace() { - local r cmd="$(quoted_args "$@")" - show_info && { eflush; __eecho "\$ $cmd" 1>&2; } - "$@"; r=$? - if [ $r -ne 0 ]; then - if show_info; then - eflush; __eecho "^ [EC #$r]" 1>&2 - elif show_error; then - eflush; __eecho "^ $cmd [EC #$r]" 1>&2; - fi - fi - return $r -} -function trace_error() { - local r - "$@"; r=$? - if [ $r -ne 0 ]; then - local cmd="$(quoted_args "$@")" - show_error && { eflush; __eecho "^ $cmd [EC #$r]" 1>&2; } - fi - return $r -} - -function etitle() { - local __t_deferred= - __t_etitle "$@" -} -function etitled() { - local __t_deferred=1 - __t_etitle "$@" -} -function __t_etitle() { - local __t_eend=default - local __t_clearp= - while [ -n "$1" ]; do - if [ "$1" == "--" ]; then - shift - break - elif [ "$1" == "-s" ]; then - __t_eend= - shift - elif [ "$1" == "--eend" ]; then - __t_eend=1 - shift - elif [ "$1" == "-p" ]; then - __t_clearp=1 - shift - else - break - fi - done - local __t_title="$1"; shift - local __t_s=0 - [ -n "$__estack" ] && __tlevel="${__tlevel} " - __estack="$__estack:t" - if show_info; then - if [ -n "$__t_deferred" ]; then - __epending="${__epending:+$__epending -}$(__etitle "$__t_title")" - else - eflush - __etitle "$__t_title" 1>&2 - fi - fi - if [ $# -gt 0 ]; then - "$@" - __t_s=$? - [ "$__t_eend" == "default" ] && __t_eend=1 - fi - [ "$__t_eend" == "default" ] && __t_eend= - if [ -n "$__t_eend" ]; then - eend $__t_s - [ -n "$__t_clearp" ] && eclearp - fi - return $__t_s -} -function estep() { - show_info || return; eflush; __estep "$*" 1>&2 -} -function estepe() { - show_info || return; eflush; __estepe "$*" 1>&2 -} -function estepw() { - show_info || return; eflush; __estepw "$*" 1>&2 -} -function estepn() { - show_info || return; eflush; __estepn "$*" 1>&2 -} -function estepi() { - show_info || return; eflush; __estepi "$*" 1>&2 -} -function estep_() { - show_info || return; eflush; __estep_ "$*" 1>&2 -} -function estepe_() { - show_info || return; eflush; __estepe_ "$*" 1>&2 -} -function estepw_() { - show_info || return; eflush; __estepw_ "$*" 1>&2 -} -function estepn_() { - show_info || return; eflush; __estepn_ "$*" 1>&2 -} -function estepi_() { - show_info || return; eflush; __estepi_ "$*" 1>&2 -} -function ebegin() { - local __b_eend=default - while [ -n "$1" ]; do - if [ "$1" == "--" ]; then - shift - break - elif [ "$1" == "-s" ]; then - __b_eend= - shift - elif [ "$1" == "--eend" ]; then - __b_eend=1 - shift - else - break - fi - done - local __b_msg="$1"; shift - local __b_s=0 - __estack="$__estack:b" - if show_info; then - eflush - __ebegin "$__b_msg" 1>&2 - fi - if [ $# -gt 0 ]; then - "$@" - __b_s=$? - [ "$__b_eend" == "default" ] && __b_eend=1 - fi - [ "$__b_eend" == "default" ] && __b_eend= - [ -n "$__b_eend" ] && eend $__b_s - return $__b_s -} -function edot() { - local s=$? - show_info || return - eflush - [ -n "$1" ] && s="$1" - shift - if [ "$s" == "0" ]; then - __edoto 1>&2 - else - __edotx 1>&2 - fi - show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2 - return $s -} -function edotw() { - local s=$? - show_info || return - eflush - [ -n "$1" ] && s="$1" - shift - __edotw 1>&2 - show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2 - return $s -} -function ewait() { - [ -n "$1" ] || return 1 - if show_info; then - local count=2 - eflush - little_sleep # certains processus retournent tout de suite - while is_running "$1"; do - sleep 1 - if [ $count -gt 0 ]; then - count=$(($count - 1)) - else - __edotp 1>&2 - fi - done - __edoto 1>&2 - else - wait "$1" - fi -} -function eend() { - local s=$? - if [ "$1" == "-c" ]; then - __estack= - __tlevel= - elif [ "${__estack%:b}" != "$__estack" ]; then - __estack="${__estack%:b}" - show_info || return - eflush - [ -n "$1" ] && s="$1" - if [ "$s" == "0" ]; then - __eendo 1>&2 - else - __eendx 1>&2 - fi - elif [ "${__estack%:t}" != "$__estack" ]; then - __estack="${__estack%:t}" - __tlevel="${__tlevel% }" - fi -} -function ask_yesno() { - local interactive=1 - if [[ "$1" == -* ]]; then - if [ "$1" != -- ]; then - check_interaction "$1" || interactive= - fi - shift - else - check_interaction -c || interactive= - fi - local default="${2:-N}" - if [ "$default" == "C" ]; then - [ -n "$interactive" ] && default=N || default=O - elif [ "$default" == "X" ]; then - [ -n "$interactive" ] && default=O || default=N - fi - if [ -n "$interactive" ]; then - eflush - local message="$1" - local prompt="[oN]" - local r - is_yes "$default" && prompt="[On]" - if [ -n "$message" ]; then - tooenc_ "$message" 1>&2 - else - tooenc_ "Voulez-vous continuer?" "$UTF8" 1>&2 - fi - tooenc_ " $prompt " "$UTF8" 1>&2 - uread r - is_yes "${r:-$default}" - else - is_yes "$default" - fi -} -function read_value() { - local -a __rv_opts __rv_readline=1 __rv_showdef=1 __rv_nl= - __rv_opts=() - [ -n "$UTOOLS_NO_READLINE" ] && __rv_readline= - __rv_read "$@" -} -function read_password() { - local -a __rv_opts __rv_readline= __rv_showdef= __rv_nl=1 - __rv_opts=(-s) - __rv_read "$@" -} -function __rv_read() { - local __rv_int=1 - if [[ "$1" == -* ]]; then - if [ "$1" != -- ]; then - check_interaction "$1" || __rv_int= - fi - shift - else - check_interaction -c || __rv_int= - fi - local __rv_msg="$1" __rv_v="${2:-value}" __rv_d="$3" __rv_re="${4:-O}" - if [ -z "$__rv_int" ]; then - if is_yes "$__rv_re" && [ -z "$__rv_d" ]; then - OENC="$UTF8" eerror "La valeur par défaut de $__rv_v doit être non vide" - return 1 - fi - set_var "$__rv_v" "$__rv_d" - return 0 - fi - - eflush - local __rv_r - while true; do - if [ -n "$__rv_msg" ]; then - tooenc_ "$__rv_msg" 1>&2 - else - tooenc_ "Entrez la valeur" "$UTF8" 1>&2 - fi - if [ -n "$__rv_readline" ]; then - tooenc_ ": " "$UTF8" 1>&2 - uread -e ${__rv_d:+-i"$__rv_d"} "${__rv_opts[@]}" __rv_r - else - if [ -n "$__rv_d" ]; then - if [ -n "$__rv_showdef" ]; then - tooenc_ " [$__rv_d]" 1>&2 - else - tooenc_ " [****]" 1>&2 - fi - fi - tooenc_ ": " "$UTF8" 1>&2 - uread "${__rv_opts[@]}" __rv_r - [ -n "$__rv_nl" ] && echo - fi - __rv_r="${__rv_r:-$__rv_d}" - if [ -n "$__rv_r" ] || ! is_yes "$__rv_re"; then - set_var "$__rv_v" "$__rv_r" - return 0 - fi - done -} -function simple_menu() { - local __sm_title= __sm_yourchoice= __sm_default= - local -a __sm_args - parse_opts -t: __sm_title= -m: __sm_yourchoice= -d: __sm_default= @ __sm_args -- "$@" && - set -- "${__sm_args[@]}" || ewarn "$__sm_args" - - local __sm_option_var="${1:-option}" __sm_options_var="${2:-options}" - local __sm_option __sm_options - __sm_options="$__sm_options_var[*]" - if [ -z "${!__sm_options}" ]; then - OENC="$UTF8" eerror "Le tableau $__sm_options_var doit être non vide" - return 1 - fi - [ -z "$__sm_default" ] && __sm_default="${!__sm_option_var}" - - eflush - array_copy __sm_options "$__sm_options_var" - local __sm_c=0 __sm_i __sm_choice - while true; do - if [ "$__sm_c" == "0" ]; then - [ -n "$__sm_title" ] && tooenc "=== $__sm_title ===" 1>&2 - __sm_i=1 - for __sm_option in "${__sm_options[@]}"; do - if [ "$__sm_option" == "$__sm_default" ]; then - tooenc "$__sm_i*- $__sm_option" 1>&2 - else - tooenc "$__sm_i - $__sm_option" 1>&2 - fi - let __sm_i=$__sm_i+1 - done - fi - - if [ -n "$__sm_yourchoice" ]; then - tooenc_ "$__sm_yourchoice" 1>&2 - else - tooenc_ "Entrez le numéro de l'option choisie" "$UTF8" 1>&2 - fi - tooenc_ ": " "$UTF8" 1>&2 - uread __sm_choice - - if [ -z "$__sm_choice" -a -n "$__sm_default" ]; then - __sm_option="$__sm_default" - break - fi - if [ -n "$__sm_choice" -a -z "${__sm_choice//[0-9]/}" ]; then - if [ "$__sm_choice" -gt 0 -a "$__sm_choice" -le "${#__sm_options[*]}" ]; then - __sm_option="${__sm_options[$(($__sm_choice - 1))]}" - break - else - OENC="$UTF8" eerror "Numéro d'option incorrect" - fi - else - OENC="$UTF8" eerror "Vous devez saisir le numéro de l'option choisie" - fi - - let __sm_c=$__sm_c+1 - if [ "$__sm_c" -eq 5 ]; then - tooenc "" "$UTF8" 1>&2 - __sm_c=0 - fi - done - set_var "$__sm_option_var" "$__sm_option" -} - -function actions_menu() { - local -a __am_action_descs __am_options __am_void_actions - local __am_tmp __am_select_action __am_select_option __am_title __am_optyc __am_actyc - local __am_default_action=auto __am_quit_action=auto - local __am_default_option= - local -a __am_args - parse_opts \ - -t: __am_title= \ - -m: __am_optyc= \ - -M: __am_actyc= \ - -e: __am_void_actions \ - -d: __am_default_action= \ - -q: __am_quit_action= \ - -o: __am_default_option= \ - @ __am_args -- "$@" && set -- "${__am_args[@]}" || { eerror "$__am_args"; return 1; } - - __am_tmp="${1:-action}"; __am_select_action="${!__am_tmp}" - __am_tmp="${2:-option}"; __am_select_option="${!__am_tmp}" - [ -n "$__am_default_option" ] && __am_select_option="$__am_default_option" - array_copy __am_action_descs "${3:-actions}" - array_copy __am_options "${4:-options}" - - eerror_unless [ ${#__am_action_descs[*]} -gt 0 ] "Vous devez spécifier le tableau des actions" || return - __actions_menu || return 1 - setv "${1:-action}" "$__am_select_action" - setv "${2:-option}" "$__am_select_option" -} -function __actions_menu() { - local title="$__am_title" - local optyc="$__am_optyc" actyc="$__am_actyc" - local default_action="$__am_default_action" - local quit_action="$__am_quit_action" - local select_action="$__am_select_action" - local select_option="$__am_select_option" - local -a action_descs options void_actions - array_copy action_descs __am_action_descs - array_copy options __am_options - array_copy void_actions __am_void_actions - - local no_options - array_isempty options && no_options=1 - - local -a actions - local tmp action name - for tmp in "${action_descs[@]}"; do - splitfsep2 "$tmp" : action name - [ -n "$action" ] || action="${name:0:1}" - action="$(strlower "$action")" - array_addu actions "$action" - done - - if [ "$default_action" == auto ]; then - default_action="$select_action" - if [ -n "$default_action" ]; then - array_contains actions "$default_action" || default_action= - fi - [ -n "$default_action" ] || default_action="${actions[0]}" - fi - default_action="${default_action:0:1}" - default_action="$(strlower "$default_action")" - - if [ "$quit_action" == auto ]; then - if [ ${#actions[*]} -gt 1 ]; then - quit_action="${actions[@]:$((-1)):1}" - array_addu void_actions "$quit_action" - fi - fi - quit_action="${quit_action:0:1}" - quit_action="$(strlower "$quit_action")" - - local action_title - for tmp in "${action_descs[@]}"; do - splitfsep2 "$tmp" : action name - [ -n "$action" ] || action="${name:0:1}" - [ -n "$name" ] || name="$action" - action="$(strlower "$action")" - if [ -n "$no_options" ]; then - if ! array_contains void_actions "$action"; then - array_del actions "$action" - continue - fi - fi - [ "$action" == "$default_action" ] && name="$name*" - action_title="${action_title:+$action_title/}$name" - done - if [ -n "$default_action" ]; then - array_contains actions "$default_action" || default_action= - fi - if [ -n "$quit_action" ]; then - array_contains actions "$quit_action" || quit_action= - fi - - if [ -n "$no_options" ]; then - if array_isempty void_actions; then - eerror "Aucune option n'est définie. Il faut définir le tableau des actions vides" - return 1 - fi - __void_actions_menu - else - __options_actions_menu - fi -} -function __void_actions_menu() { - eflush - local c=0 choice - while true; do - if [ $c -eq 0 ]; then - [ -n "$title" ] && __etitle "$title" 1>&2 - __eecho_ "=== Actions disponibles: " 1>&2 - tooenc "$action_title" 1>&2 - fi - if [ -n "$actyc" ]; then - __eecho_ "$actyc" 1>&2 - elif [ -n "$optyc" ]; then - __eecho_ "$optyc" 1>&2 - else - __eecho_ "Entrez l'action à effectuer" 1>&2 - fi - tooenc_ ": " 1>&2 - uread choice - if [ -z "$choice" -a -n "$default_action" ]; then - select_action="$default_action" - break - fi - - choice="${choice:0:1}" - choice="$(strlower "$choice")" - if array_contains actions "$choice"; then - select_action="$choice" - break - elif [ -n "$choice" ]; then - eerror "$choice: action incorrecte" - else - eerror "vous devez saisir l'action à effectuer" - fi - let c=$c+1 - if [ $c -eq 5 ]; then - tooenc "" 1>&2 - c=0 - fi - done - __am_select_action="$select_action" - __am_select_option= -} -function __options_actions_menu() { - eflush - local c=0 option choice action option - while true; do - if [ $c -eq 0 ]; then - [ -n "$title" ] && __etitle "$title" 1>&2 - i=1 - for option in "${options[@]}"; do - if [ "$option" == "$select_option" ]; then - tooenc "$i*- $option" 1>&2 - else - tooenc "$i - $option" 1>&2 - fi - let i=$i+1 - done - __estepn_ "Actions disponibles: " 1>&2 - tooenc "$action_title" 1>&2 - fi - if [ -n "$optyc" ]; then - __eecho_ "$optyc" 1>&2 - else - __eecho_ "Entrez l'action et le numéro de l'option choisie" 1>&2 - fi - tooenc_ ": " 1>&2 - uread choice - - if [ -z "$choice" -a -n "$default_action" ]; then - action="$default_action" - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - elif [ -n "$select_option" ]; then - select_action="$action" - break - fi - fi - action="${choice:0:1}" - action="$(strlower "$action")" - if array_contains actions "$action"; then - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - else - option="${choice:1}" - option="${option// /}" - if [ -z "$option" -a -n "$select_option" ]; then - select_action="$action" - break - elif [ -z "$option" ]; then - eerror "vous devez saisir le numéro de l'option" - elif isnum "$option"; then - if [ $option -gt 0 -a $option -le ${#options[*]} ]; then - select_action="$action" - select_option="${options[$(($option - 1))]}" - break - fi - else - eerror "$option: numéro d'option incorrecte" - fi - fi - elif isnum "$choice"; then - action="$default_action" - if [ -n "$action" ]; then - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - else - option="${choice// /}" - if [ -z "$option" ]; then - eerror "vous devez saisir le numéro de l'option" - elif isnum "$option"; then - if [ $option -gt 0 -a $option -le ${#options[*]} ]; then - select_action="$action" - select_option="${options[$(($option - 1))]}" - break - fi - else - eerror "$option: numéro d'option incorrecte" - fi - fi - else - eerror "Vous devez spécifier l'action à effectuer" - fi - elif [ -n "$choice" ]; then - eerror "$choice: action et/ou option incorrecte" - else - eerror "vous devez saisir l'action à effectuer" - fi - let c=$c+1 - if [ $c -eq 5 ]; then - tooenc "" 1>&2 - c=0 - fi - done - __am_select_action="$select_action" - __am_select_option="$select_option" -} - - -function __ac_forgetall() { __ac_files=(); } -__ac_forgetall -function __ac_trap() { - local file - for file in "${__ac_files[@]}"; do - [ -e "$file" ] && rm -rf "$file" 2>/dev/null - done - __ac_forgetall -} -trap __ac_trap 1 3 15 EXIT -function autoclean() { - local file - for file in "$@"; do - [ -n "$file" ] && array_add __ac_files "$file" - done -} -function ac_cleanall() { - __ac_trap -} -function ac_clean() { - local file - for file in "$@"; do - if array_contains __ac_files "$file"; then - [ -e "$file" ] && rm -rf "$file" 2>/dev/null - array_del __ac_files "$file" - fi - done -} -function ac_set_tmpfile() { - local __acst_d - if show_debug; then - if [ -n "$5" ]; then - is_yes "${!5}" && __acst_d=1 - else - __acst_d=1 - fi - fi - if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" - [ -f "$3" -a "$4" == keep ] || >"$3" - else - local __acst_t="$(mktempf "$2")" - autoclean "$__acst_t" - set_var "$1" "$__acst_t" - fi -} -function ac_set_tmpdir() { - local __acst_d - if show_debug; then - if [ -n "$4" ]; then - is_yes "${!4}" && __acst_d=1 - else - __acst_d=1 - fi - fi - if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" - mkdir -p "$3" - else - local __acst_t="$(mktempd "$2")" - autoclean "$__acst_t" - set_var "$1" "$__acst_t" - fi -} -function debug_tee() { - if show_debug; then - tee "$@" - else - cat - fi -} - - -function get_defaults_files() { - local __gd_dest="${1:-defaults}"; shift - local -a __gd_fs - local __gd_f __gd_found - for __gd_f in "$@"; do - __gd_found= - if [ -r "/etc/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "/etc/default/$__gd_f") - __gd_found=1 - fi - if [ -r "$HOME/etc/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "$HOME/etc/default/$__gd_f") - __gd_found=1 - fi - if [ -z "$__gd_found" -a -r "$scriptdir/lib/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "$scriptdir/lib/default/$__gd_f") - fi - done - array_copy "$__gd_dest" __gd_fs -} - -function set_defaults() { - local -a __sd_fs - local __sd_f - get_defaults_files __sd_fs "$@" - for __sd_f in "${__sd_fs[@]}"; do - source "$__sd_f" - done -} - - -: "${MYHOST:=$HOSTNAME}" -: "${MYHOSTNAME:=${MYHOST%%.*}}" -export MYHOST MYHOSTNAME - -function myhost() { - hostname -f 2>/dev/null || echo "$MYHOST" -} -function myhostname() { - hostname -s 2>/dev/null || echo "$MYHOSTNAME" -} -##@inc]base -uprovide base.tools -urequire base - -function base_umove() { - local -a args - local updatedir - args=(-d:,--updatedir: .) - parse_args_check "$@" || return; set -- "${args[@]}" - - eerror_unless [ -z "$updatedir" -o -d "$updatedir" ] "$updatedir: doit être un répertoire" || return - eerror_if [ $# -eq 0 ] "Vous devez spécifier les fichiers à déplacer" || return - eerror_if [ $# -eq 1 ] "Vous devez spécifier la destination" || return - - local -a srcs - local dest - - srcs=("$@") - setx dest=last_value srcs - array_del_last srcs - - if [ $# -eq 2 ]; then - if [ -d "$dest" ]; then - : # ce cas sera traité ci-dessous - elif [ -e "$dest" ]; then - eerror "$dest: refus d'écraser la destination" - return 1 - else - src="${srcs[0]}" - if [ -n "$updatedir" ]; then - if [ -L "$src" ]; then - ldest="$(readlinka "$src")" - array_find_links update_links "$ldest" "$updatedir" - else - array_find_links update_links "$src" "$updatedir" - fi - move_file "$src" "$dest" "${update_links[@]}" - else - move_link "$src" "$dest" - fi - return $? - fi - fi - - [ -d "$dest" ] || { - eerror "$dest: doit être un répertoire" - return 1 - } - for src in "${srcs[@]}"; do - if [ -n "$updatedir" ]; then - if [ -L "$src" ]; then - move_link "$src" "$dest" - else - array_find_links update_links "$src" "$updatedir" - move_file "$src" "$dest" "${update_links[@]}" - fi - else - move_link "$src" "$dest" - fi - done -} -##@inc]base.tools -##@inc[base.compat -## Fonctions de base: support des fonctions obsolètes et des versions de bash < 4.x -##@inc[base.core -## Fonctions de base: fondement -uprovide base.core - -function echo_() { - echo -n "$*" -} -function recho() { - if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - - local first="${1:1}"; shift - echo "$first$@" - else - echo "$@" - fi -} -function recho_() { - if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - - local first="${1:1}"; shift - echo -n "$first$@" - else - echo -n "$@" - fi -} -function _qval() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s//\$/\\\$}" - s="${s//\`/\\\`}" - recho_ "$s" -} -function should_quote() { - local l="${#1}" - [ $l -eq 0 -o $l -gt 80 ] && return 0 - local s="${*//[a-zA-Z0-9]/}" - s="${s//,/}" - s="${s//./}" - s="${s//+/}" - s="${s//\//}" - s="${s//-/}" - s="${s//_/}" - s="${s//=/}" - [ -n "$s" ] -} -function qval() { - echo -n \" - _qval "$@" - echo \" -} -function qvalm() { - if should_quote "$*"; then - echo -n \" - _qval "$@" - echo \" - else - recho "$*" - fi -} -function qvalr() { - if [ -z "$*" ]; then - : - elif should_quote "$*"; then - echo -n \" - _qval "$@" - echo \" - else - recho "$*" - fi -} -function qvals() { - local arg first=1 - for arg in "$@"; do - [ -z "$first" ] && echo -n " " - if should_quote "$arg"; then - echo -n \" - _qval "$arg" - echo -n \" - else - recho_ "$arg" - fi - first= - done - [ -z "$first" ] && echo -} -function qwc() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s//\$/\\\$}" - s="${s//\`/\\\`}" - local r a b - while [ -n "$s" ]; do - if [[ "$s" == *\** ]]; then - if [[ "$s" == *\?* ]]; then - a="${s%%\**}" - b="${s%%\?*}" - if [ ${#a} -lt ${#b} ]; then - s="${s#*\*}" - r="$r\"$a\"*" - else - s="${s#*\?}" - r="$r\"$b\"?" - fi - else - a="${s%%\**}" - s="${s#*\*}" - r="$r\"$a\"*" - fi - elif [[ "$s" == *\?* ]]; then - if [[ "$s" == *\** ]]; then - a="${s%%\**}" - b="${s%%\?*}" - if [ ${#a} -lt ${#b} ]; then - s="${s#*\*}" - r="$r\"$a\"*" - else - s="${s#*\?}" - r="$r\"$b\"?" - fi - else - a="${s%%\?*}" - s="${s#*\?}" - r="$r\"$a\"?" - fi - else - r="$r\"$s\"" - break - fi - done - recho_ "$r" -} -function qlines() { - sed "s/'/'\\\\''/g; s/.*/'&'/g" -} -function setv() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - eval "$__s_var=\"\$*\"" -} -function _setv() { - local __s_var="$1"; shift - eval "$__s_var=\"\$*\"" -} -function echo_setv() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - echo "$__s_var=$(qvalr "$*")" -} -function setx() { - if [ "$1" == -a ]; then - shift - local __s_array="$1"; shift - if [[ "$__s_array" == *=* ]]; then - set -- "${__s_array#*=}" "$@" - __s_array="${__s_array%%=*}" - fi - eval "$__s_array=($("$@" | qlines))" - else - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - eval "$__s_var="'"$("$@")"' - fi -} -function _setvx() { - local __s_var="$1"; shift - eval "$__s_var="'"$("$@")"' -} -function _setax() { - local __s_array="$1"; shift - eval "$__s_array=($("$@" | qlines))" -} -function evalx() { - local __e_val __e_arg __e_r=0 - local -a __e_cmd - - local __e_first=1 - while [ $# -gt 0 ]; do - __e_cmd=() - while [ $# -gt 0 ]; do - __e_arg="$1"; shift - [ "$__e_arg" == // ] && break - if [ "${__e_arg%//}" != "$__e_arg" ]; then - local __e_tmp="${__e_arg%//}" - if [ -z "${__e_tmp//\\/}" ]; then - __e_arg="${__e_arg#\\}" - __e_cmd=("${__e_cmd[@]}" "$__e_arg") - continue - fi - fi - __e_cmd=("${__e_cmd[@]}" "$__e_arg") - done - - if [ -n "$__e_first" ]; then - __e_val="$("${__e_cmd[@]}")" || __e_r=$? - else - __e_val="$("${__e_cmd[@]}" "$__e_val")" || __e_r=$? - fi - __e_first= - done - [ -n "$__e_val" ] && echo "$__e_val" - return $__e_r -} -function setxx() { - local -a __s_args - if [ "$1" == -a ]; then __s_args=(-a); shift; fi - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - __s_args=("${__s_args[@]}" "$__s_var") - setx "${__s_args[@]}" evalx "$@" -} -function evalp() { - local __e_arg __e_cmd - - while [ $# -gt 0 ]; do - __e_arg="$1"; shift - if [ "$__e_arg" == // ]; then - __e_cmd="$__e_cmd |" - continue - elif [ "${__e_arg%//}" != "$__e_arg" ]; then - local __e_tmp="${__e_arg%//}" - if [ -z "${__e_tmp//\\/}" ]; then - __e_arg="${__e_arg#\\}" - fi - fi - __e_cmd="${__e_cmd:+$__e_cmd }\"$(_qval "$__e_arg")\"" - done - eval "$__e_cmd" -} -function setxp() { - local -a __s_args - if [ "$1" == -a ]; then __s_args=(-a); shift; fi - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - __s_args=("${__s_args[@]}" "$__s_var") - setx "${__s_args[@]}" evalp "$@" -} -function testx() { - local __t_op="$1"; shift - local __t_val="$(evalx "$@")" - [ $__t_op "$__t_val" ] -} -function test2x() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalx "$@")" - [ "$__t_val1" $__t_op "$__t_val2" ] -} -function testrx() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalx "$@")" - eval '[[ "$__t_val1" '"$__t_op"' "$__t_val2" ]]' -} -function testp() { - local __t_op="$1"; shift - local __t_val="$(evalp "$@")" - [ $__t_op "$__t_val" ] -} -function test2p() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalp "$@")" - [ "$__t_val1" $__t_op "$__t_val2" ] -} -function testrp() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalp "$@")" - eval '[[ "$__t_val1" '"$__t_op"' "$__t_val2" ]]' -} - -function err2out() { - "$@" 2>&1 -} - -function is_defined() { - [ -n "$(declare -p "$1" 2>/dev/null)" ] -} -function is_array() { - case "$(declare -p "$1" 2>/dev/null)" in declare\ -a*) return 0;; esac - return 1 -} - -function upvar() { - if unset -v "$1"; then - if [ $# -eq 2 ]; then - eval "$1=\"\$2\"" - else - eval "$1=(\"\${@:2}\")" - fi - fi -} -function array_upvar() { - unset -v "$1" && eval "$1=(\"\${@:2}\")" -} -function upvars() { - while [ $# -gt 0 ]; do - case "$1" in - -a) - unset -v "$2" && eval "$2=(\"\${@:3}\")" - break - ;; - -a*) - unset -v "$2" && eval "$2=(\"\${@:3:${1#-a}}\")" - shift $((${1#-a} + 2)) || return 1 - ;; - *) - unset -v "$1" && eval "$1=\"\$2\"" - shift; shift - ;; - esac - done -} - -function __ab_process_pending() { - local -a values - case "$mode" in - cmd) values="$("${pending[@]}")";; - ssplit) eval "values=($("${pending[@]}"))";; - lsplit) eval "values=($("${pending[@]}" | qlines))";; - add) values=("${pending[@]}");; - esac - cmd=("${cmd[@]}" "${values[@]}") - pending=() -} -function array_buildcmd() { - local desta="$1"; shift; local "$desta" - local mode=add - local -a pending cmd - while [ $# -gt 0 ]; do - case "$1" in - ++c|++cmd|++) __ab_process_pending; mode=cmd;; - ++s|++ssplit) __ab_process_pending; mode=ssplit;; - ++l|++lsplit) __ab_process_pending; mode=lsplit;; - ++a|++add) __ab_process_pending; mode=add;; - *) pending=("${pending[@]}" "$1");; - esac - shift - done - __ab_process_pending - array_upvar "$desta" "${cmd[@]}" -} -function buildcmd() { - local -a args - array_buildcmd args "$@" - qvals "${args[@]}" -} -function evalcmd() { - local -a args - array_buildcmd args "$@" - "${args[@]}" -} -##@inc]base.core -##@inc[base.num -## Fonctions de base: gestion des valeurs numériques -uprovide base.num - -function isnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//[0-9]/}" - [ -z "$v" ] -} -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - [ -z "${1//[0-9]/}" ] -} -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//./}" - v="${v//,/}" - v="${v//[0-9]/}" - [ -z "$v" ] -} -##@inc]base.num -##@inc[base.bool -## Fonctions de base: valeurs booléennes -##@inc[base.num -## Fonctions de base: gestion des valeurs numériques -uprovide base.num - -function isnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//[0-9]/}" - [ -z "$v" ] -} -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - [ -z "${1//[0-9]/}" ] -} -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//./}" - v="${v//,/}" - v="${v//[0-9]/}" - [ -z "$v" ] -} -##@inc]base.num -uprovide base.bool -urequire base.num - -function is_yes() { - case "${1,,}" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - esac - isnum "$1" && [ "$1" -ne 0 ] && return 0 - return 1 -} -function is_no() { - case "${1,,}" in - n|non|no|f|faux|false|off) return 0;; - esac - isnum "$1" && [ "$1" -eq 0 ] && return 0 - return 1 -} -function yesval() { - is_yes "$1" && echo 1 -} - -function setb() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - local __s_r - if "$@" >/dev/null; then - eval "$__s_var=1" - else - __s_r=$? - eval "$__s_var=" - return $__s_r - fi -} -function _setb() { - local __s_var="$1"; shift - if "$@" >/dev/null; then - eval "$__s_var=1" - else - eval "$__s_var=" - fi -} - -function evalb() { - if evalx "$@" >/dev/null; then - echo 1 - else - return $? - fi -} -function setxb() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - setx "$__s_var" evalb "$@" -} -##@inc]base.bool -##@inc[base.quote -## Fonctions de base: protection de valeurs chaine -uprovide base.quote -urequire base.core - -function _qawk() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s// -/\\n}" - recho_ "$s" -} -function qawk() { - echo -n \" - _qawk "$@" - echo \" -} -function qseds() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\//\\/}" - s="${s// -/\\n}" - recho "$s" -} -function _qform() { - local s="$*" - s="${s//\%/%25}" - s="${s//+/%2B}" - s="${s//&/%26}" - s="${s//=/%3D}" - s="${s// /+}" - recho_ "$s" -} -function qform() { - local s="$*" - if [[ "$s" == *=* ]]; then - _qform "${s%%=*}" - echo -n = - _qform "${s#*=}" - echo - else - _qform "$s" - echo - fi -} -function _qsql() { - local q="'" qq="''" - echo "${*//$q/$qq}" -} -function qsql() { - local q="'" qq="''" - echo "'${*//$q/$qq}'" -} -##@inc]base.quote -uprovide base.compat -urequire base.core base.num base.bool base.quote - - -function setx2() { setxx "$@"; } -function rawecho() { recho "$@"; } -function rawecho_() { recho_ "$@"; } -function quote_arg() { _qval "$@"; } -function quoted_arg() { qvalm "$@"; } -function quoted_args() { qvals "$@"; } -function set_var() { setv "$@"; } -function set_var_cmd() { echo_setv "$@"; } -function set_var_literal() { eval "$1=$2"; } - -function quote_awk() { _qawk "$@"; } -function quoted_awk() { qawk "$@"; } -function quote_seds() { qseds "$@"; } -function quote_form() { _qform "$@"; } -function quoted_form() { qform "$@"; } - - -if [ -n "$BASH_VERSINFO" -a "${BASH_VERSINFO[0]}" -lt 4 ]; then - function strlower() { tr A-Z a-z <<<"$*"; } - function strlower1() { - local str="$*" - local h="${str:0:1}" r="${str:1}" - echo "$(tr A-Z a-z <<<"$h")$r" - } - function strlowers() { - local -a vs; local v - for v in "$@"; do - vs=("${vs[@]}" "$(strlower1 "$v")") - done - echo "${vs[*]}" - } - function strupper() { tr a-z A-Z <<<"$*"; } - function strupper1() { - local str="$*" - local h="${str:0:1}" r="${str:1}" - echo "$(tr a-z A-Z <<<"$h")$r" - } - function struppers() { - local -a vs; local v - for v in "$@"; do - vs=("${vs[@]}" "$(strupper1 "$v")") - done - echo "${vs[*]}" - } - - function is_yes() { - case "$1" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - O|OUI|Y|YES|V|VRAI|T|TRUE|ON) return 0;; - esac - isnum "$1" && [ "$1" -ne 0 ] && return 0 - case "$(strlower "$1")" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - esac - return 1 - } - function is_no() { - case "$1" in - n|non|no|f|faux|false|off) return 0;; - N|NON|NO|F|FAUX|FALSE|OFF) return 0;; - esac - isnum "$1" && [ "$1" -eq 0 ] && return 0 - case "$(strlower "$1")" in - n|non|no|f|faux|false|off) return 0;; - esac - return 1 - } -fi -##@inc]base.compat -uprovide base -urequire base.init base.core base.string base.num base.bool base.array base.quote base.split base.args base.tools base.compat - -UNAME_SYSTEM=`uname -s` -[ "${UNAME_SYSTEM#CYGWIN}" != "$UNAME_SYSTEM" ] && UNAME_SYSTEM=Cygwin -[ "${UNAME_SYSTEM#MINGW32}" != "$UNAME_SYSTEM" ] && UNAME_SYSTEM=Mingw -UNAME_MACHINE=`uname -m` -if [ -n "$UTOOLS_CHROOT" ]; then - [ -n "$UTOOLS_UNAME_SYSTEM" ] && eval "UNAME_SYSTEM=$UTOOLS_UNAME_SYSTEM" - [ -n "$UTOOLS_UNAME_MACHINE" ] && eval "UNAME_MACHINE=$UTOOLS_UNAME_MACHINE" -fi - -function setyesval() { - is_yes "$2" && set_var "$1" 1 || set_var "$1" "" -} -function normyesval() { - is_yes "${2:-"${!1}"}" && set_var "$1" 1 || set_var "$1" "" -} -function normyesvals() { - local __nyv_yesvar - for __nyv_yesvar in "$@"; do - is_yes "${!__nyv_yesvar}" && set_var "$__nyv_yesvar" 1 || set_var "$__nyv_yesvar" "" - done -} -function quote_in() { - sed 's/\\/\\\\/g -s/"/\\"/g -s/\$/\\$/g -s/`/\\`/g' -} -function quote_sin() { - sed "s/'/'\\\\''/g" -} -function quote_sarg() { - quote_sin <<<"$1" -} -function quoted_sarg() { - echo "'$(quote_sarg "$1")'" -} -function quoted_sargs() { - local a s - for a in "$@"; do - s="${s:+$s }$(quoted_sarg "$a")" - done - rawecho "$s" -} - -function set_array_cmd() { - [ $# -eq 1 ] && set -- "$1" "$1" - local __sac_s __sac_v __sac_f - __sac_s="$1=("; shift - if [ "$1" == "@" ]; then - shift - else - eval "set -- \"\${$1[@]}\"" - fi - __sac_f=1 - for __sac_v in "$@"; do - [ -n "$__sac_f" ] && __sac_f= || __sac_s="$__sac_s " - __sac_s="$__sac_s$(quoted_arg "$__sac_v")" - done - __sac_s="$__sac_s)" - echo "$__sac_s" -} -function set_array() { - eval "$(set_array_cmd "$@")" -} -function array_count() { - eval "echo \${#$1[*]}" -} -function array_isempty() { - [ $(array_count "$1") -eq 0 ] -} -function array_new() { - eval "$1=()" -} -function array_add() { - local __aa_a="$1"; shift - eval "$__aa_a=(\"\${$__aa_a[@]}\" \"\$@\")" -} -function array_ins() { - local __aa_a="$1"; shift - eval "$__aa_a=(\"\$@\" \"\${$__aa_a[@]}\")" -} -function array_del() { - local __ad_v - local -a __ad_vs - eval 'for __ad_v in "${'"$1"'[@]}"; do - if [ "$__ad_v" != '"$(quoted_arg "$2")"' ]; then - array_add __ad_vs "$__ad_v" - fi -done' - array_copy "$1" __ad_vs -} -function array_addu() { - local __as_v - eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then - return 1 - fi -done' - array_add "$1" "$2" - return 0 -} -function array_set() { - array_addu "$@" -} -function array_insu() { - local __as_v - eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then - return 1 - fi -done' - array_ins "$1" "$2" - return 0 -} -function array_fillrange() { - local -a __af_vs - local __af_i="${2:-1}" __af_to="${3:-10}" __af_step="${4:-1}" - while [ "$__af_i" -le "$__af_to" ]; do - __af_vs=("${__af_vs[@]}" "$__af_i") - __af_i=$(($__af_i + $__af_step)) - done - array_copy "$1" __af_vs -} -function array_eq() { - local -a __ae_a1 __ae_a2 - array_copy __ae_a1 "$1" - array_copy __ae_a2 "$2" - [ ${#__ae_a1[*]} -eq ${#__ae_a2[*]} ] || return 1 - local __ae_v __ae_i=0 - for __ae_v in "${__ae_a1[@]}"; do - [ "$__ae_v" == "${__ae_a2[$__ae_i]}" ] || return 1 - __ae_i=$(($__ae_i + 1)) - done - return 0 -} -function array_contains() { - local __ac_v - eval 'for __ac_v in "${'"$1"'[@]}"; do - if [ "$__ac_v" == '"$(quoted_arg "$2")"' ]; then - return 0 - fi -done' - return 1 -} -function array_find() { - local __af_i __af_v - __af_i=0 - eval 'for __af_v in "${'"$1"'[@]}"; do - if [ "$__af_v" == '"$(quoted_arg "$2")"' ]; then - if [ -n "$3" ]; then - echo "${'"$3"'[$__af_i]}" - else - echo "$__af_i" - fi - return 0 - fi - __af_i=$(($__af_i + 1)) -done' - return 1 -} -function array_reverse() { - local -a __ar_vs - local __ar_v - array_copy __ar_vs "$1" - array_new "$1" - for __ar_v in "${__ar_vs[@]}"; do - array_ins "$1" "$__ar_v" - done -} - -function array_replace() { - local __ar_sn="$1"; shift - local __ar_f="$1"; shift - local -a __ar_s __ar_d - local __ar_v - array_copy __ar_s "$__ar_sn" - for __ar_v in "${__ar_s[@]}"; do - if [ "$__ar_v" == "$__ar_f" ]; then - __ar_d=("${__ar_d[@]}" "$@") - else - __ar_d=("${__ar_d[@]}" "$__ar_v") - fi - done - array_copy "$__ar_sn" __ar_d -} -function array_each() { - local __ae_an="$1"; shift - local __ae_f="$1"; shift - local -a __ae_a - local __ae_v - array_copy __ae_a "$__ae_an" - for __ae_v in "${__ae_a[@]}"; do - "$__ae_f" "$__ae_v" "$@" - done -} -function array_map() { - local __am_an="$1"; shift - local __am_f="$1"; shift - local -a __am_a __am_vs - local __am_v - array_copy __am_a "$__am_an" - for __am_v in "${__am_a[@]}"; do - __am_vs=("${__am_vs[@]}" "$("$__am_f" "$__am_v" "$@")") - done - array_copy "$__am_an" __am_vs -} -function first_value() { - eval "rawecho \"\${$1[@]:0:1}\"" -} -function last_value() { - eval "rawecho \"\${$1[@]:\$((-1)):1}\"" -} -function array_copy() { - eval "$1=(\"\${$2[@]}\")" -} -function array_copy_firsts() { - eval "$1=(\"\${${2:-$1}[@]:0:\$((\${#${2:-$1}[@]}-1))}\")" -} -function array_del_last() { - array_copy_firsts "$1" -} -function array_copy_lasts() { - eval "$1=(\"\${${2:-$1}[@]:1}\")" -} -function array_del_first() { - array_copy_lasts "$1" -} -function array_extend() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]}\")" -} -function array_extendu() { - local __ae_v __ae_s=1 - eval 'for __ae_v in "${'"$2"'[@]}"; do - array_addu "$1" "$__ae_v" && __ae_s=0 -done' - return "$__ae_s" -} -function array_extend_firsts() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]:0:\$((\${#$2[@]}-1))}\")" -} -function array_extend_lasts() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]:1}\")" -} -function array_xsplit() { - eval "$1=($(recho_ "$2" | awkrun RS="${3:-:}" ' -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_split() { - eval "$1=($(recho_ "$2" | awkrun RS="${3:-:}" ' -/^$/ { next } -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_from_path() { - array_split "$1" "$2" ":" -} -function array_from_xlines() { - eval "$1=($(recho_ "$2" | _nl2lf | awk ' -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_from_lines() { - eval "$1=($(recho_ "$2" | _nl2lf | awk ' -/^$/ { next } -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_join() { - local __aj_an __aj_l __aj_j __aj_s="${2:-,}" __aj_pf __aj_sf - if [ "$1" == "@" ]; then - __aj_an="\$@" - shift; shift - else - __aj_an="\${$1[@]}" - __aj_pf="$4" - __aj_sf="$5" - fi - eval 'for __aj_l in "'"$__aj_an"'"; do - __aj_j="${__aj_j:+$__aj_j'"$__aj_s"'}$__aj_pf$__aj_l$__aj_sf" -done' - if [ -n "$__aj_j" ]; then - rawecho "$__aj_j" - elif [ "$__aj_an" != "\$@" -a -n "$3" ]; then - rawecho "$3" - fi -} -function array_mapjoin() { - local __amj_src="$1" __amj_func="$2" __amj_sep="$3" - shift; shift; shift - if [ "$__amj_src" == "@" ]; then - local -a __amj_tmpsrc - __amj_tmpsrc=("$@") - __amj_src=__amj_tmpsrc - set -- - fi - local -a __amj_tmp - array_copy __amj_tmp "$__amj_src" - array_map __amj_tmp "$__amj_func" - array_join __amj_tmp "$__amj_sep" "$@" -} -function array_to_lines() { - array_join "$1" " -" "$2" "$3" "$4" -} -function array_to_path() { - array_join "$1" ":" "$2" "$3" "$4" -} -function array_fix_paths() { - local __afp_an="$1" __afp_s="${2:-:}" - local -a __afp_vs - local __afp_v - array_copy __afp_vs "$__afp_an" - array_new "$__afp_an" - for __afp_v in "${__afp_vs[@]}"; do - array_split __afp_v "$__afp_v" "$__afp_s" - array_extend "$__afp_an" __afp_v - done -} - - -function get_date_rfc822() { - LC_TIME=C date +"%a, %d %b %Y %H:%M:%S %Z" -} -function get_date_fr() { - LC_TIME=C date +"%d/%m/%Y" -} -function get_time_fr() { - LC_TIME=C date +"%Hh%M" -} -function parse_date() { - local value="$1" type="${2:-date}" - local now="$(awk 'BEGIN { print mktime(strftime("%Y %m %d 00 00 00 +0400")) }')" - case "$value" in - +*) - value="$(($now + ${value#+} * 86400))" - ;; - *) - value="$(<<<"$value" awk -F/ '{ - nd = strftime("%d"); nm = strftime("%m"); ny = strftime("%Y") - d = $1 + 0; if (d < 1) d = nd; - m = $2 + 0; if (m < 1) m = nm; - if ($3 == "") y = ny; - else { y = $3 + 0; if (y < 100) y = y + 2000; } - print mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d)); - }')" - esac - case "$type" in - d|date) awk '{ print strftime("%d/%m/%Y", $0 + 0) }' <<<"$value";; - l|ldap) awk '{ print strftime("%Y%m%d%H%M%S+0400", $0 + 0) }' <<<"$value";; - m|mysql) awk '{ print strftime("%Y-%m-%d", $0 + 0) }' <<<"$value";; - *) - rawecho "$value" - ;; - esac -} - - -function udelpath() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; ${2:-PATH}"'="${'"${2:-PATH}"'#$1:}"; '"${2:-PATH}"'="${'"${2:-PATH}"'%:$1}"; '"${2:-PATH}"'="${'"${2:-PATH}"'//:$_qdir:/:}"; [ "$'"${2:-PATH}"'" == "$1" ] && '"${2:-PATH}"'=' -} -function uaddpath() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="${'"${2:-PATH}"':+$'"${2:-PATH}"':}$1"' -} -function uinspathm() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="$1${'"${2:-PATH}"':+:$'"${2:-PATH}"'}"' -} -function uinspath() { - udelpath "$@" - uinspathm "$@" -} - -function withpath() { - [ "${1#./}" != "$1" -o "${1#../}" != "$1" -o "${1#/}" != "$1" ] -} -function withext() { - local basename="$(basename -- "$1")" - [ "${basename%.*}" != "$basename" ] -} -function normpath() { - local -a parts - local part ap - array_split parts "$1" / - if [ "${1#/}" != "$1" ]; then - ap=/ - elif [ -n "$2" ]; then - ap="$2" - else - ap="$(pwd)" - fi - for part in "${parts[@]}"; do - if [ "$part" == "." ]; then - continue - elif [ "$part" == ".." ]; then - ap="${ap%/*}" - [ -n "$ap" ] || ap=/ - else - [ "$ap" != "/" ] && ap="$ap/" - ap="$ap$part" - fi - done - rawecho "$ap" -} -function abspath() { - local ap="$1" - if [ "${ap#/}" != "$ap" ]; then - __normpath "$ap" && return - else - local cwd - if [ -n "$2" ]; then - cwd="$(abspath "$2")" - else - cwd="$(pwd)" - fi - ap="$cwd/$ap" - __normpath "$ap" && return - fi - normpath "$ap" -} -function __normpath() { - if [ -d "$1" ]; then - if [ -x "$1" ]; then - (cd "$1"; pwd) - return 0 - fi - elif [ -f "$1" ]; then - local dn="$(dirname -- "$1")" bn="$(basename -- "$1")" - if [ -x "$dn" ]; then - (cd "$dn"; echo "$(pwd)/$bn") - return 0 - fi - fi - return 1 -} -function parentdirs() { - array_new "$1" - local __pd_d="$(abspath "$2")" - if [[ "$3" == r* ]]; then - while [ "$__pd_d" != "/" ]; do - array_ins "$1" "$__pd_d" - __pd_d="$(dirname "$__pd_d")" - done - else - while [ "$__pd_d" != "/" ]; do - array_add "$1" "$__pd_d" - __pd_d="$(dirname "$__pd_d")" - done - fi -} -function ppath() { - local path="$1" cwd="$2" - - path="$(abspath "$path")" # essayer de normaliser le chemin - [ -n "$cwd" ] || cwd="$(pwd)" - - [ "$path" = "$cwd" ] && path="." - [ "$cwd" != "/" -a "$cwd" != "$HOME" ] && path="${path/#$cwd\//}" - path="${path/#$HOME/~}" - - rawecho "$path" -} -function relpath() { - local p="$(abspath "$1" "$3")" cwd="$2" - if [ -z "$cwd" ]; then - cwd="$(pwd)" - else - cwd="$(abspath "$cwd" "$3")" - fi - if [ "$p" == "$cwd" ]; then - echo "" - elif [ "${p#$cwd/}" != "$p" ]; then - rawecho "${p#$cwd/}" - else - local rp - while [ -n "$cwd" -a "${p#$cwd/}" == "$p" ]; do - rp="${rp:+$rp/}.." - cwd="${cwd%/*}" - done - rp="$rp/${p#$cwd/}" - echo "${rp%//}" - fi -} -function relpathx() { - local p="$(relpath "$@")" - if [ -z "$p" ]; then - echo . - elif [ "${p#../}" != "$p" -o "${p#./}" != "$p" ]; then - echo "$p" - else - echo "./$p" - fi -} -function withinpath() { - local b="$1" p="$2" strict="${3:-N}" - b="$(abspath "$b")" - p="$(abspath "$p")" - if is_yes "$strict"; then - [ "${p#$b/}" != "$p" ] - else - [ "$p" == "$b" -o "${p#$b/}" != "$p" ] - fi -} -function safe_abspath() { - local p="$1" ba="$2" br="$3" - if [ -n "$ba" ]; then - ba="$(abspath "$ba")" - else - ba="$(pwd)" - fi - [ -n "$br" ] || br="$ba" - br="$(abspath "$br" "$ba")" - p="$(abspath "$p" "$ba")" - if [ "$p" == "$br" -o "${p#$br/}" != "$p" ]; then - echo "$p" - else - return 1 - fi -} -function safe_relpath() { - local p - if p="$(safe_abspath "$1" "$2" "$3")"; then - relpath "$p" "$2" "$(pwd)" - else - return 1 - fi -} -function splitwcs() { - local __sw_p="$1" - local __sw_dd="${2:-basedir}" __sw_df="${3:-filespec}" __sw_part __sw_d __sw_f - local -a __sw_parts - array_split __sw_parts "$__sw_p" "/" - for __sw_part in "${__sw_parts[@]}"; do - if [[ "$__sw_part" == *\** ]] || [[ "$__sw_part" == *\?* ]] || [ -n "$__sw_f" ]; then - __sw_f="${__sw_f:+$__sw_f/}$__sw_part" - else - __sw_d="${__sw_d:+$__sw_d/}$__sw_part" - fi - done - [ "${__sw_p#/}" != "$__sw_p" ] && __sw_d="/$__sw_d" - set_var "$__sw_dd" "$__sw_d" - set_var "$__sw_df" "$__sw_f" -} -function deref() { - local OENC="$UTF8" - - local max_deref=50 - local file="$1" - local basedir link - while [ -L "$file" ]; do - basedir="$(dirname "$file")" - link="$(readlink "$file")" - if first_char_is "$link" "/"; then - file="$link" - else - file="$basedir/$link" - fi - - max_deref=$(($max_deref - 1)) - [ $max_deref -eq 0 ] && die "Plus de 50 indirection. Le lien $file est-il récursif?" - done - abspath "$file" -} -function readlinka() { - if [ -L "$1" ]; then - local linkdir="$(dirname -- "$1")" - abspath "$(readlink "$1")" "$linkdir" - else - abspath "$1" - fi -} -function readlinkm() { - readlink -m "$1" -} -function path_if_test() { - local op="$1"; shift - local file="$1"; shift - local rel="$1" reldir=; shift - if beginswith "$rel" relative; then - reldir="${rel#relative}" - if beginswith "$reldir" :; then - reldir="${reldir#:}" - if [ -n "$reldir" ]; then - reldir="${reldir}/" - fi - else - reldir= - fi - else - rel= - fi - - while [ -n "$1" ]; do - local basedir="$1" - if [ $op "$basedir/$file" ]; then - if [ -n "$rel" ]; then - rawecho "$reldir$file" - else - rawecho "$basedir/$file" - fi - break - fi - shift - done -} -function update_link() { - [ -L "$2" ] || return 1 - local dest link="$2" - local linkdir="$(dirname "$link")" - local ldest="$(readlink "$link")" - if [ "${ldest#/}" != "$ldest" ]; then - dest="$(abspath "$1")" - else - dest="$(relpath "$1" "$linkdir")" - fi - if [ "$dest" == "$ldest" ]; then - : # pas besoin de mettre à jour - elif [ -d "$link" ]; then - rm -f "$link" && ln -s "$dest" "$link" - else - ln -sf "$dest" "$link" - fi -} -function update_links() { - [ -n "$1" ] || return 1 - local dest="$1"; shift - local r=0 link - for link in "$@"; do - update_link "$dest" "$link" || r=$? - done - return $r -} -function move_link() { - [ -n "$1" -a -n "$2" ] || return 1 - local link="$1" dest="$2" - [ -d "$dest" ] && dest="$dest/$(basename -- "$link")" - dest="$(abspath "$dest")" - if [ -L "$link" ]; then - link="$(abspath "$link")" - [ "$dest" == "$link" ] && return 0 - ldest="$(readlinka "$link")" - mv "$link" "$dest" || return 1 - update_link "$ldest" "$dest" - else - [ "$dest" == "$link" ] && return 0 - mv "$link" "$dest" - fi -} -function array_find_links() { - local -a __afl_links __afl_result - local __afl_dir="${3:-.}" - local __afl_dest __afl_destname __afl_link __afl_linkdir __afl_ldest - __afl_dest="$(abspath "$2")" - __afl_destname="${__afl_dest##*/}" - array_from_lines __afl_links "$(find "$__afl_dir" -type l)" - for __afl_link in "${__afl_links[@]}"; do - __afl_ldest="$(readlink "$__afl_link")" - if [ "$__afl_ldest" != "$__afl_destname" ]; then - [[ "$__afl_ldest" == */"$__afl_destname" ]] || continue - fi - __afl_link="$(abspath "$__afl_link" "$__afl_dir")" - __afl_linkdir="$(dirname -- "$__afl_link")" - __afl_ldest="$(abspath "$__afl_ldest" "$__afl_linkdir")" - if [ "$__afl_ldest" == "$__afl_dest" ]; then - array_add __afl_result "$__afl_link" - fi - done - array_copy "$1" __afl_result -} -function list_links() { - local -a links - array_find_links links "$@" - array_to_lines links -} -function move_file() { - [ -n "$1" -a -n "$2" ] || return 1 - local src="$1" dest="$2" link - shift; shift - [ -d "$dest" ] && dest="$dest/$(basename -- "$src")" - move_link "$src" "$dest" || return 1 - update_links "$dest" "$@" -} - -function get_nblines() { - [ -f "$1" ] && sed -ne '$=' "$1" || echo 0 -} -function mktempf() { - mktemp "${1:-"$TMPDIR/tmp.XXXXXX"}" -} -function mktempd() { - mktemp -d "${1:-"$TMPDIR/tmp.XXXXXX"}" -} -function mkdirof() { - mkdir -p "$(dirname -- "$1")" -} -function cp_a() { - /bin/cp -a "$@" -} -function cp_R() { - /bin/cp -pR "$@" -} -function quietgrep() { - grep -q "$@" 2>/dev/null -} -function quietdiff() { - diff -q "$@" >&/dev/null -} -function testsame() { - quietdiff "$@" -} -function testdiff() { - ! quietdiff "$@" -} -function testupdated() { - if [ -f "$2" ]; then - testdiff "$1" "$2" - else - return 0 - fi -} -function testnewer() { - test ! -e "$2" -o "$1" -nt "$2" -} -function ps_all() { - ps -axww -} -function progexists() { - test -n "$1" -a -x "$(which "$1" 2>/dev/null)" -} -function has_python() { - progexists python -} -function has_gawk() { - progexists gawk -} -function is_root() { - test `id -u` -eq 0 -} -function source_ifexists() { - if [ -f "$1" ]; then source "$1" || die; fi -} -function little_sleep { - LC_NUMERIC=C sleep 0.1 -} -function random_sleep { - sleep $(($RANDOM % ${1:-1800})) -} -function is_running() { - kill -0 "$1" >&/dev/null -} -function sedi() { - sed -i "$@" -} -function csort() { - LANG=C sort "$@" -} -function lsort() { sort "$@"; } -function cgrep() { - LANG=C grep "$@" -} -function lgrep() { grep "$@"; } -function csed() { - LANG=C sed "$@" -} -function lsed() { sed "$@"; } -function cawk() { - LANG=C awk "$@" -} -function lawk() { awk "$@"; } -function cdiff() { - LANG=C diff "$@" -} -function ldiff() { diff "$@"; } - - -function fix_mode() { - local file="$1" - [ -f "$file" ] || touch "$file" || return 1 - if [ ! -w "$file" ]; then - local mode="$(stat -c %a "$file")" - chmod ${mode:0:${#mode}-3}6${mode:${#mode}-2:2} "$file" - echo "$mode" - fi -} -function unfix_mode() { - [ -n "$2" ] && chmod "$2" "$1" -} -function get_mode() { - [ -f "$1" ] || touch "$1" || return 1 - stat -c %a "$1" -} -function rm_maybe() { - local parse_opts=1 arg rm - for arg in "$@"; do - if [ -n "$parse_opts" ]; then - if [ "$arg" == "--" ]; then - parse_opts= - elif [[ "$arg" == "-*" ]]; then - continue - elif [ -n "$arg" ]; then - rm=1 - break - fi - elif [ -n "$arg" ]; then - rm=1 - break - fi - done - [ -n "$rm" ] && /bin/rm "$@" -} -__CPDIR_RSYNC_SLOW=1 # synchro potentiellement plus lente, mais plus fidèle (option -c) -__CPDIR_RSYNC_ARGS=(-q) -function cpdir() { - - if progexists rsync; then - [ -d "$2" ] || mkdir -p "$2" || return 1 - if [ -d "$1" ]; then - rsync -a ${__CPDIR_RSYNC_SLOW:+-c} "${__CPDIR_RSYNC_ARGS[@]}" "$1/" "$2/" - else - rsync -a ${__CPDIR_RSYNC_SLOW:+-c} "${__CPDIR_RSYNC_ARGS[@]}" "$1" "$2/" - fi - else - __cpdir "$@" - fi -} -function __cpdir() { - local src="$1" dest="$2" method="${3:-cp_a}" - - if [ -d "$src" ]; then - [ -d "$dest" ] || mkdir -p "$dest" || return 1 - - local prevdir="$(pwd)" - - dest="$(abspath "$dest")" - cd "$src" - if [ -n "$(/bin/ls -a1)" ]; then - [ -n "$(/bin/ls -1)" ] && "$method" * "$dest" - local i - for i in .*; do - [ "$i" == "." -o "$i" == ".." ] && continue - "$method" "$i" "$dest" - done - fi - cd "$prevdir" - else - if [ -f "$dest" ]; then - "$method" "$src" "$dest" - elif [ -d "$dest" ]; then - "$method" "$src" "$dest" - else - mkdir -p "$dest" - "$method" "$src" "$dest" - fi - fi -} -__CPNOVCS_RSYNC_SLOW=1 # synchro potentiellement plus lente, mais plus fidèle (option -c) -__CPNOVCS_RSYNC_ARGS=(-q) -function cpnovcs() { - local src="$1" destdir="$2" - [ -d "$destdir" ] || mkdir -p "$destdir" || return 1 - if progexists rsync; then - local gitexclude=/.git/ - if [ "${src%/}" == "$src" ]; then - gitexclude="/$(basename -- "$src")$gitexclude" - fi - rsync -a ${__CPNOVCS_RSYNC_SLOW:+-c} --exclude CVS/ --exclude .svn/ --exclude "$gitexclude" "${__CPNOVCS_RSYNC_ARGS[@]}" "$src" "$destdir/" - elif [ "${src%/}" != "$src" ]; then - __cpdir "$src" "$destdir" - else - local srcname="$(basename -- "$src")" - mkdir -p "$destdir/$srcname" - __cpdir "$src" "$destdir/$srcname" - fi -} -function cpdirnovcs() { - if [ -d "$1" ]; then - cpnovcs "$1/" "$2" - else - cpnovcs "$1" "$2" - fi -} -function doinplace() { - if [ -n "$1" -a "$1" != "-" ]; then - local __dip_file="$1"; shift - autoclean "$__dip_file.tmp.$$" - "$@" <"$__dip_file" >"$__dip_file.tmp.$$" - local s=$? - [ "$s" == 0 ] && /bin/cat "$__dip_file.tmp.$$" >"$__dip_file" - /bin/rm -f "$__dip_file.tmp.$$" - return $s - else - shift - "$@" - fi -} -function doinplacef() { - if [ -n "$1" -a "$1" != "-" ]; then - local __dip_file="$1"; shift - autoclean "$__dip_file.tmp.$$" - "$@" <"$__dip_file" >"$__dip_file.tmp.$$" - local s=$? - /bin/cat "$__dip_file.tmp.$$" >"$__dip_file" - /bin/rm -f "$__dip_file.tmp.$$" - return $s - else - shift - "$@" - fi -} -function stripnl() { - tr -d '\r\n' -} -function _nl2lf() { - awk 'BEGIN {RS="\r|\r\n|\n"} {print}' -} -function nl2lf() { - doinplace "$1" _nl2lf -} -function _nl2crlf() { - awk 'BEGIN {RS="\r|\r\n|\n"} {print $0 "\r"}' -} -function nl2crlf() { - doinplace "$1" _nl2crlf -} -function _nl2cr() { - awk 'BEGIN {RS="\r|\r\n|\n"; ORS=""} {print $0 "\r"}' -} -function nl2cr() { - doinplace "$1" _nl2cr -} -function _latin1compat() { - LANG=fr_FR.UTF-8 sed $' -s/[‘’]/\x27/g -s/[«»“”]/"/g -s/[\xC2\xA0\xE2\x80\x87\xE2\x80\xAF\xE2\x81\xA0]/ /g -' -} -function _noaccents() { - LANG=fr_FR.UTF-8 sed ' -s/[à]/a/g -s/[éèêë]/e/g -s/[ïî]/i/g -s/[ôö]/o/g -s/[üû]/u/g -s/[ç]/c/g -s/[À]/A/g -s/[ÉÈÊË]/E/g -s/[ÏÎ]/I/g -s/[ÔÖ]/O/g -s/[ÜÛ]/U/g -s/[Ç]/C/g -' -} -function list_all() { - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ "$f" == "." -o "$f" == ".." ] && continue - rawecho "$f" - done - cd "$curdir" -} -function __la_cmd() { - [ $# -gt 0 ] || set '*' - local arg - local cmd="/bin/ls -1d" - for arg in "$@"; do - arg="$(_rval "$arg")" - cmd="$cmd $arg" - done - cmd="$cmd 2>/dev/null" - echo "$cmd" -} -function list_files() { - local f - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ -f "$f" ] && rawecho "$f" - done - cd "$curdir" -} -function list_dirs() { - local f - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ "$f" == "." -o "$f" == ".." ] && continue - [ -d "$f" ] && rawecho "$f" - done - cd "$curdir" -} -function __array_ls() { - local __al_l="list_${1:-all}"; shift - local __al_an="$1"; shift - local __al_d="${1:-.}"; shift - local -a __al_fs - array_from_lines __al_fs "$("$__al_l" "$__al_d" "$@")" - local __al_f - array_new "$__al_an" - for __al_f in "${__al_fs[@]}"; do - array_add "$__al_an" "$__al_d/$__al_f" - done -} -function array_lsall() { - __array_ls all "$@" -} -function array_lsdirs() { - __array_ls dirs "$@" -} -function array_lsfiles() { - __array_ls files "$@" -} -function filter_empty() { - sed '/^$/d' -} -function filter_vcspath() { - sed ' -/^.git$/d -/^.git\//d -/\/.git$/d -/\/.git\//d -/^.svn$/d -/^.svn\//d -/\/.svn$/d -/\/.svn\//d -' -} -function merge_contlines() { - awk 'substr($0, length($0)) == "\\" { - while (getline nextline) { - $0 = substr($0, 1, length($0) - 1) nextline - if (substr($0, length($0)) != "\\") break - } - print - next -} -{print}' -} -function filter_comment() { - local -a merge - [ "$1" == -m ] && merge=(merge_contlines) || merge=(cat) - awk ' - /^[ \t]*#/ { next } - /^[ \t]*$/ { next } - { print }' | "${merge[@]}" -} -function filter_conf() { - local -a merge - [ "$1" == -m ] && merge=(merge_contlines) || merge=(cat) - grep -v '^#' | grep -v '^$' | "${merge[@]}" -} -function is_archive() { - local name="${1%.zip}" - name="${name%.tgz}" - name="${name%.tbz2}" - name="${name%.tar.gz}" - name="${name%.tar.bz2}" - name="${name%.tar}" - name="${name%.jar}" - name="${name%.war}" - name="${name%.ear}" - [ "$name" != "$1" ] -} -function extract_archive() { - local arch="$1" destdir="${2:-.}" - shift; shift - if endswith "$arch" .zip; then - unzip -q -d "$destdir" "$arch" "$@" || return - elif endswith "$arch" .tgz || endswith "$arch" .tar.gz; then - tar xzf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .tbz2 || endswith "$arch" .tar.bz2; then - tar xjf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .tar; then - tar xf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .jar || endswith "$arch" .war || endswith "$arch" .ear; then - ( - arch="$(abspath "$arch")" - cd "$destdir" - jar xf "$arch" "$@" - ) || return - else - return 1 - fi -} -function get_archive_basename() { - local basename="$(basename -- "$1")" - basename="${basename%.zip}" - basename="${basename%.tgz}" - basename="${basename%.tbz2}" - basename="${basename%.gz}" - basename="${basename%.bz2}" - basename="${basename%.tar}" - basename="${basename%.jar}" - basename="${basename%.war}" - basename="${basename%.ear}" - echo "$basename" -} -function get_archive_appname() { - local appname="$(basename -- "$1")" - appname="${appname%.zip}" - appname="${appname%.tgz}" - appname="${appname%.tbz2}" - appname="${appname%.gz}" - appname="${appname%.bz2}" - appname="${appname%.tar}" - appname="${appname%.jar}" - appname="${appname%.war}" - appname="${appname%.ear}" - echo "$appname" | awk '{ - if (match($0, /[-_.]([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/)) { - print substr($0, 1, RSTART - 1) - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/)) { - print substr($0, 1, RSTART - 1) - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print substr($0, 1, RSTART - 1) - } else { - print $0 - } -}' -} -function get_archive_versionsuffix() { - local basename="$(get_archive_basename "$1")" - echo "$basename" | awk '{ - if (match($0, /([-_.][0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print vs["1"] - } -}' -} -function get_archive_version() { - local basename="$(get_archive_basename "$1")" - echo "$basename" | awk '{ - if (match($0, /[-_.]([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print vs["1"] - } -}' -} -function __dump_usernames() { - = 500 && $6 ~ /^\/home\// { print $1 }' -} -function dump_usernames() { - array_from_lines "${1:-usernames}" "$(__dump_usernames)" -} -function __resolv_ips() { - LANG=C host "$1" 2>/dev/null | awk '/address / { gsub(/^.*address /, ""); print }' -} -function resolv_ips() { - array_from_lines "${1:-ips}" "$(__resolv_ips "$2")" -} -function __resolv_hosts() { - LANG=C host "$1" 2>/dev/null | awk '/domain name pointer / { gsub(/^.*domain name pointer /, ""); gsub(/\.$/, ""); print }' -} -function resolv_hosts() { - array_from_lines "${1:-hosts}" "$(__resolv_hosts "$2")" -} -function runscript_as() { - local OENC="$UTF8" - local user="${1:-root}"; shift - local exec_maybe= - if [ "$1" = "exec" ]; then - exec_maybe=exec - shift - fi - - local cmd - cmd="\ -__estack=$(quoted_arg "$__estack") -__tlevel=$(quoted_args "$__tlevel") -export __estack __tlevel -exec ${BASH:-/bin/sh} $(quoted_args "$@")" - - if is_yes "$UTOOLS_USES_SU" || ! progexists sudo; then - eecho "Entrez le mot de passe de root" - $exec_maybe su "$user" -c "$cmd" - else - if [ "$user" == "root" ]; then - $exec_maybe sudo -p "Entrez le mot de passe de %u: " "${BASH:-/bin/sh}" -c "$cmd" - else - $exec_maybe sudo -p "Entrez le mot de passe de %u: " su "$user" -c "$cmd" - fi - fi -} -function runscript_as_root() { - if is_root; then - local exec_maybe= - if [ "$1" = "exec" ]; then - exec_maybe=exec - shift - fi - $exec_maybe "${BASH:-/bin/sh}" "$@" - else - runscript_as root "$@" - fi -} -function run_as() { - local user="${1:-root}"; shift - local exec_maybe=exec - if [ "$1" = "--noexec" ]; then - exec_maybe= - shift - fi - - runscript_as "$user" $exec_maybe "$0" "$@" -} -function run_as_root() { - is_root || run_as root "$@" -} -function check_user() { - local user - for user in "$@"; do - [ "$USER" == "$user" ] && return 0 - done - return 1 -} -function ensure_user() { - local -a users - while [ $# -gt 0 -a "$1" != "--" ]; do - array_add users "$1" - shift - done - [ "$1" == "--" ] && shift - - if ! check_user "${users[@]}"; then - if [ ${#users[*]} -gt 1 ]; then - ewarn "Cette commande doit être lancée avec l'un des users ${users[*]}" - else - ewarn "Cette commande doit être lancée avec le user ${users[0]}" - fi - if ask_yesno "Voulez-vous tenter de relancer la commande avec le bon user?" O; then - estep "Lancement du script avec le user ${users[0]}" - run_as "${users[0]}" "$@" - return 1 - elif is_root; then - return 11 - else - return 10 - fi - fi - return 0 -} -function check_hostname() { - local userhost user host path - for userhost in "$@"; do - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - [ "$MYHOSTNAME" == "${host%%.*}" ] && return 0 - done - return 1 -} -function check_userhostname() { - local userhost path user host - for userhost in "$@"; do - if check_hostname "$userhost"; then - [[ "$userhost" == *@* ]] || return 0 - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - check_user "$user" && return 0 - fi - done - return 1 -} -UTOOLS_ENSURE_HOSTNAME_SSH_OPTS=() -function ensure_hostname() { - local -a userhosts - while [ $# -gt 0 -a "$1" != "--" ]; do - array_add userhosts "$1" - shift - done - [ "$1" == "--" ] && shift - - local userhost user host path - if ! check_hostname "${userhosts[@]}"; then - if [ ${#userhosts[*]} -gt 1 ]; then - ewarn "Cette commande n'est valide que sur l'un des hôtes ${userhosts[*]}" - else - ewarn "Cette commande n'est valide que sur l'hôte ${userhosts[0]}" - fi - - enote "Vous pouvez tenter de relancer le script sur ${userhosts[0]}, mais cela requière que ce script ET les données dont il a besoin soient installés dans la même version et dans le même répertoire sur l'hôte distant" - if ask_yesno "Voulez-vous tenter de relancer le script sur l'hôte distant?" N; then - splitfsep "${userhosts[0]}" : userhost path - splituserhost "$userhost" user host - [ -n "$user" ] || user=root - - estep "Lancement de la commande sur l'hôte distant $user@$host" - local cmd - [ -n "$path" ] && cmd="$(quoted_args cd "$path"); " - cmd="$cmd$(quoted_args "$script" "$@")" - ssh -qt "${UTOOLS_ENSURE_HOSTNAME_SSH_OPTS[@]}" "$user@$host" "$cmd" - [ $? -eq 255 ] && return 12 - return 1 - else - return 11 - fi - fi - local userhost user host - for userhost in "${userhosts[@]}"; do - [[ "$userhost" == *@* ]] || continue - if check_hostname "$userhost"; then - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - [ -n "$path" ] && cd "$path" - ensure_user "$user" -- "$@" - return $? - fi - done - return 0 -} - -__AWKDEF_FUNCTIONS=' -function quote_html(s) { - gsub(/&/, "\\&", s) - gsub(/"/, "\\"", s) - gsub(/>/, "\\>", s) - gsub(/", s) - gsub(/"/, "\"", s) - gsub(/&/, "\\&", s) - return s -} -function quote_value(s) {'" - gsub(/'/, \"'\\\\''\", s) - return \"'\" s \"'\" -"'} -function quoted_values( i, line) { - line = "" - for (i = 1; i <= NF; i++) { - if (i > 1) line = line " " - line = line quote_value($i) - } - return line -} -function quote_subrepl(s) { - gsub(/\\/, "\\\\", s) - gsub(/&/, "\\\\&", s) - return s -} -function quote_grep(s) { - gsub(/[[\\.^$*]/, "\\\\&", s) - return s -} -function quote_egrep(s) { - gsub(/[[\\.^$*+?()|{]/, "\\\\&", s) - return s -} -function quote_sql(s) {'" - gsub(/'/, \"''\", s) - return \"'\" s \"'\" -"'} -function unquote_mysqlcsv(s) { - gsub(/\\n/, "\n", s) - gsub(/\\t/, "\t", s) - gsub(/\\0/, "\0", s) - gsub(/\\\\/, "\\", s) - return s -} -function array_new(dest) { - dest[0] = 0 # forcer awk à considérer dest comme un tableau - delete dest -} -function array_newsize(dest, size, i) { - dest[0] = 0 # forcer awk à considérer dest comme un tableau - delete dest - size = int(size) - for (i = 1; i <= size; i++) { - dest[i] = "" - } -} -function array_len(values, count, i) { - count = 0 - for (i in values) { - count++ - } - return count -} -function mkindices(values, indices, i, j) { - array_new(indices) - j = 1 - for (i in values) { - indices[j++] = int(i) - } - return asort(indices) -} -function array_copy(dest, src, count, indices, i) { - array_new(dest) - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - dest[indices[i]] = src[indices[i]] - } -} -function array_getlastindex(src, count, indices) { - count = mkindices(src, indices) - if (count == 0) return 0 - return indices[count] -} -function array_add(dest, value, lastindex) { - lastindex = array_getlastindex(dest) - dest[lastindex + 1] = value -} -function array_deli(dest, i, l) { - i = int(i) - if (i == 0) return - l = array_len(dest) - while (i < l) { - dest[i] = dest[i + 1] - i++ - } - delete dest[l] -} -function array_del(dest, value, ignoreCase, i) { - do { - i = key_index(value, dest, ignoreCase) - if (i != 0) array_deli(dest, i) - } while (i != 0) -} -function array_extend(dest, src, count, lastindex, indices, i) { - lastindex = array_getlastindex(dest) - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - dest[lastindex + i] = src[indices[i]] - } -} -function array_fill(dest, i) { - array_new(dest) - for (i = 1; i <= NF; i++) { - dest[i] = $i - } -} -function array_getline(src, count, indices, i, j) { - $0 = "" - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - j = indices[i] - $j = src[j] - } -} -function array_appendline(src, count, indices, i, nf, j) { - count = mkindices(src, indices) - nf = NF - for (i = 1; i <= count; i++) { - j = nf + indices[i] - $j = src[indices[i]] - } -} -function in_array(value, values, ignoreCase, i) { - if (ignoreCase) { - value = tolower(value) - for (i in values) { - if (tolower(values[i]) == value) return 1 - } - } else { - for (i in values) { - if (values[i] == value) return 1 - } - } - return 0 -} -function key_index(value, values, ignoreCase, i) { - if (ignoreCase) { - value = tolower(value) - for (i in values) { - if (tolower(values[i]) == value) return int(i) - } - } else { - for (i in values) { - if (values[i] == value) return int(i) - } - } - return 0 -} -function array2s(values, prefix, sep, suffix, noindices, first, i, s) { - if (!prefix) prefix = "[" - if (!sep) sep = ", " - if (!suffix) suffix = "]" - s = prefix - first = 1 - for (i in values) { - if (first) first = 0 - else s = s sep - if (!noindices) s = s "[" i "]=" - s = s values[i] - } - s = s suffix - return s -} -function array2so(values, prefix, sep, suffix, noindices, count, indices, i, s) { - if (!prefix) prefix = "[" - if (!sep) sep = ", " - if (!suffix) suffix = "]" - s = prefix - count = mkindices(values, indices) - for (i = 1; i <= count; i++) { - if (i > 1) s = s sep - if (!noindices) s = s "[" indices[i] "]=" - s = s values[indices[i]] - } - s = s suffix - return s -} -function array_join(values, sep, prefix, suffix, count, indices, i, s) { - s = prefix - count = mkindices(values, indices) - for (i = 1; i <= count; i++) { - if (i > 1) s = s sep - s = s values[indices[i]] - } - s = s suffix - return s -} -function printto(s, output) { - if (output == "") { - print s - } else if (output ~ /^>>/) { - sub(/^>>/, "", output) - print s >>output - } else if (output ~ /^>/) { - sub(/^>/, "", output) - print s >output - } else { - print s >output - } -} -function find_line(input, field, value, orig, line) { - orig = $0 - line = "" - while ((getline 0) { - if ($field == value) { - line = $0 - break - } - } - close(input) - $0 = orig - return line -} -function merge_line(input, field, key, line) { - line = find_line(input, field, $key) - if (line != "") $0 = $0 FS line -} -function __csv_parse_quoted(line, destl, colsep, qchar, echar, pos, tmpl, nextc, resl) { - line = substr(line, 2) - resl = "" - while (1) { - pos = index(line, qchar) - if (pos == 0) { - resl = resl line - destl[0] = "" - destl[1] = 0 - return resl - } - if (echar != "" && pos > 1) { - prevc = substr(line, pos - 1, 1) - quotec = substr(line, pos, 1) - nextc = substr(line, pos + 1, 1) - if (prevc == echar) { - tmpl = substr(line, 1, pos - 2) - resl = resl tmpl quotec - line = substr(line, pos + 1) - continue - } - tmpl = substr(line, 1, pos - 1) - if (nextc == colsep || nextc == "") { - resl = resl tmpl - destl[0] = substr(line, pos + 2) - destl[1] = nextc == colsep - return resl - } else { - resl = resl tmpl quotec - line = substr(line, pos + 1) - } - } else { - tmpl = substr(line, 1, pos - 1) - quotec = substr(line, pos, 1) - nextc = substr(line, pos + 1, 1) - if (nextc == colsep || nextc == "") { - resl = resl tmpl - destl[0] = substr(line, pos + 2) - destl[1] = nextc == colsep - return resl - } else if (nextc == qchar) { - resl = resl tmpl quotec - line = substr(line, pos + 2) - } else { - resl = resl tmpl quotec - line = substr(line, pos + 1) - } - } - } -} -function __csv_parse_unquoted(line, destl, colsep, qchar, echar, pos) { - pos = index(line, colsep) - if (pos == 0) { - destl[0] = "" - destl[1] = 0 - return line - } else { - destl[0] = substr(line, pos + 1) - destl[1] = 1 - return substr(line, 1, pos - 1) - } -} -function __array_parsecsv(fields, line, nbfields, colsep, qchar, echar, shouldparse, destl, i) { - array_new(fields) - array_new(destl) - i = 1 - shouldparse = 0 - while (shouldparse || line != "") { - if (index(line, qchar) == 1) { - value = __csv_parse_quoted(line, destl, colsep, qchar, echar) - line = destl[0] - shouldparse = destl[1] - } else { - value = __csv_parse_unquoted(line, destl, colsep, qchar, echar) - line = destl[0] - shouldparse = destl[1] - } - fields[i] = value - i = i + 1 - } - if (nbfields) { - nbfields = int(nbfields) - i = array_len(fields) - while (i < nbfields) { - i++ - fields[i] = "" - } - } - return array_len(fields) -} -BEGIN { - DEFAULT_COLSEP = "," - DEFAULT_QCHAR = "\"" - DEFAULT_ECHAR = "" -} -function array_parsecsv2(fields, line, nbfields, colsep, qchar, echar) { - return __array_parsecsv(fields, line, nbfields, colsep, qchar, echar) -} -function array_parsecsv(fields, line, nbfields, colsep, qchar, echar) { - if (colsep == "") colsep = DEFAULT_COLSEP - if (qchar == "") qchar = DEFAULT_QCHAR - if (echar == "") echar = DEFAULT_ECHAR - return __array_parsecsv(fields, line, nbfields, colsep, qchar, echar) -} -function parsecsv(line, fields) { - array_parsecsv(fields, line) - array_getline(fields) - return NF -} -function getlinecsv(file, fields) { - if (file) { - getline 1) line = line colsep - if (qchar != "" && index(value, qchar) != 0) { - if (echar != "") gsub(qchar, quote_subrepl(echar) "&", value); - else gsub(qchar, "&&", value); - } - if (qchar != "" && (index(value, mvsep) != 0 || index(value, colsep) != 0 || index(value, qchar) != 0 || __csv_should_quote(value))) { - line = line qchar value qchar - } else { - line = line value - } - } - return line -} -function array_formatcsv(fields) { - return array_formatcsv2(fields, ",", ";", "\"", "") -} -function array_printcsv(fields, output) { - printto(array_formatcsv(fields), output) -} -function get_formatcsv( fields) { - array_fill(fields) - return array_formatcsv(fields) -} -function formatcsv() { - $0 = get_formatcsv() -} -function printcsv(output, fields) { - array_fill(fields) - array_printcsv(fields, output) -} -function array_findcsv(fields, input, field, value, nbfields, orig, found, i) { - array_new(orig) - array_fill(orig) - array_new(fields) - found = 0 - while ((getline 0) { - array_parsecsv(fields, $0, nbfields) - if (fields[field] == value) { - found = 1 - break - } - } - close(input) - array_getline(orig) - if (!found) { - delete fields - if (nbfields) { - nbfields = int(nbfields) - i = array_len(fields) - while (i < nbfields) { - i++ - fields[i] = "" - } - } - } - return found -} - -function __and(var, x, l_res, l_i) { - l_res=0; - for (l_i=0; l_i < 8; l_i++){ - if (var%2 == 1 && x%2 == 1) l_res=l_res/2 + 128; - else l_res/=2; - var=int(var/2); - x=int(x/2); - } - return l_res; -} -function __lshift(var, x) { - while(x > 0){ - var*=2; - x--; - } - return var; -} -function __rshift(var, x) { - while(x > 0){ - var=int(var/2); - x--; - } - return var; -} -BEGIN { - __BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" -} -function b64decode(src, result, base1, base2, base3, base4) { - result = "" - while (length(src) > 0) { - base1 = substr(src, 1, 1) - base2 = substr(src, 2, 1) - base3 = substr(src, 3, 1); if (base3 == "") base3 = "=" - base4 = substr(src, 4, 1); if (base4 == "") base4 = "=" - byte1 = index(__BASE64, base1) - 1 - if (byte1 < 0) byte1 = 0 - byte2 = index(__BASE64, base2) - 1 - if (byte2 < 0) byte2 = 0 - byte3 = index(__BASE64, base3) - 1 - if (byte3 < 0) byte3 = 0 - byte4 = index(__BASE64, base4) - 1 - if (byte4 < 0) byte4 = 0 - result = result sprintf( "%c", __lshift(__and(byte1, 63), 2) + __rshift(__and(byte2, 48), 4) ) - if (base3 != "=") result = result sprintf( "%c", __lshift(__and(byte2, 15), 4) + __rshift(__and(byte3, 60), 2) ) - if (base4 != "=") result = result sprintf( "%c", __lshift(__and(byte3, 3), 6) + byte4 ) - src = substr(src, 5) - } - return result -} -' -function awkdef() { - - if [ "${1:0:3}" == "-f" ]; then - shift - echo "$__AWKDEF_FUNCTIONS" - fi - if [ $# -gt 0 ]; then - local __ad_arg __ad_vpos __ad_name __ad_value - echo "BEGIN {" - while [ -n "${1:0:1}" ]; do - __ad_arg="${1:0:256}" - local __ad_array= - if [ "${__ad_arg%\[@\]}" != "$__ad_arg" ]; then - __ad_array=1 - __ad_name="${__ad_arg%\[@\]}" - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_value="$__ad_name" - elif [[ "$__ad_arg" == *\[@\]=* ]]; then - __ad_array=1 - __ad_name="${__ad_arg%%\[@\]=*}" - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_vpos=$((${#__ad_name} + 4)) - __ad_value="${1:$__ad_vpos}" - [ ${#__ad_value} -ne 0 ] || __ad_value="$__ad_name" - elif [[ "$__ad_arg" == *=* ]]; then - local __ad_int= __ad_str= - __ad_name="${__ad_arg%%=*}" - __ad_vpos=$((${#__ad_name} + 1)) - if [ "${__ad_name%:int}" != "$__ad_name" ]; then - __ad_int=1 - __ad_name="${__ad_name%:int}" - elif [ "${__ad_name%:str}" != "$__ad_name" ]; then - __ad_str=1 - __ad_name="${__ad_name%:str}" - fi - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_value="${1:$__ad_vpos}" - if [ -n "$__ad_int" ]; then - echo "$__ad_name = int($(quoted_awk "$__ad_value") + 0)" - elif [ -n "$__ad_str" ]; then - echo "$__ad_name = $(quoted_awk "$__ad_value")" - elif [ ${#__ad_value} -lt 256 ] && isnum "$__ad_value"; then - echo "$__ad_name = $__ad_value" - else - echo "$__ad_name = $(quoted_awk "$__ad_value")" - fi - else - break - fi - if [ -n "$__ad_array" ]; then - if [ "${__ad_value:0:2}" == $'<\n' ]; then - local -a __ad_values - array_from_lines __ad_values "${__ad_value:2}" - __ad_value=__ad_values - fi - __ad_value="${__ad_value}[@]" - local __ad_i=1 - echo "$__ad_name[0] = 0; delete $__ad_name" - for __ad_arg in "${!__ad_value}"; do - echo "$__ad_name[$__ad_i]=$(quoted_awk "$__ad_arg")" - __ad_i=$(($__ad_i + 1)) - done - eval "echo \"\${__ad_name}_count = \${#$__ad_value}\"" - fi - shift - done - echo "}" - for __ad_arg in "$@"; do - rawecho "$__ad_arg" - done - fi -} -function lawkrun() { - local -a __ar_defs __ar_args - while [ $# -gt 0 -a "$1" != "--" ]; do - __ar_defs=("${__ar_defs[@]}" "$1") - shift - done - shift - while [ $# -gt 0 ]; do - __ar_args=("${__ar_args[@]}" "$1") - shift - done - local __ar_script="$(awkdef "${__ar_defs[@]}")" - awk "$__ar_script" "${__ar_args[@]}" -} -function cawkrun() { LANG=C lawkrun "$@"; } -function awkrun() { LANG=C lawkrun "$@"; } - -function __lf_get_age() { - local y=$(date "+%Y") - local dy=$(date "+%j"); while [ "${dy#0}" != "$dy" ]; do dy="${dy#0}"; done - [ -n "$dy" ] || dy=0 - local h=$(date "+%H"); while [ "${h#0}" != "$h" ]; do h="${h#0}"; done - [ -n "$h" ] || h=0 - echo $((($y * 365 + $dy) * 24 + $h)) -} -function lf_trylock() { - local eoo lockfile max_hours=4 - while [ -n "$1" ]; do - case "$1" in - -h) shift; max_hours="$1";; - --) shift; eoo=1;; - *) eoo=1;; - esac - [ -n "$eoo" ] && break - shift - done - - lockfile="$1" - [ -n "$lockfile" ] || die "il faut spécifier un fichier pour le verrou" - - local now="$(__lf_get_age)" - if (set -C; echo "$now" >"$lockfile") 2>/dev/null; then - return 0 - fi - local prev diff - if prev="$(<"$lockfile")"; then - diff="$(($now - $prev))" - if [ "$diff" -gt "$max_hours" ]; then - echo stale - else - echo locked - fi - elif [ -f "$lockfile" ]; then - echo retry - fi - return 1 -} -function pidfile_set() { - local eoo pidfile pid=$$ replace= - while [ -n "$1" ]; do - case "$1" in - -p) - shift - pid="$1" - ;; - -r) - replace=1 - ;; - --) - shift - eoo=1 - ;; - *) - eoo=1 - ;; - esac - [ -n "$eoo" ] && break - shift - done - - pidfile="$1" - [ -n "$pidfile" ] || return 10 - - if [ -f "$pidfile" ]; then - local curpid="$(<"$pidfile")" - if is_running "$curpid"; then - return 1 - elif [ -n "$replace" ]; then - /bin/rm -f "$pidfile" || return 10 - else - return 2 - fi - fi - - echo_ "$pid" >"$pidfile" || return 10 - autoclean "$pidfile" - return 0 -} -function pidfile_check() { - local pidfile="$1" - [ -n "$pidfile" ] || return 10 - - if [ -f "$pidfile" ]; then - [ -r "$pidfile" ] || return 10 - local pid="$(<"$pidfile")" - is_running "$pid" && return 0 - fi - return 1 -} -function page_maybe() { - if isatty; then - less -XF "$@" - else - cat - fi -} - - -function utools_local() { - local arg - [ $# -gt 0 ] || set -- opts verbosity interaction - for arg in "$@"; do - case "$arg" in - parse_opts|opts|o|args) echo "local -a args";; - verbosity|v) echo "local __verbosity='$__verbosity'";; - interaction|i) echo "local __interaction='$__interaction'";; - esac - done -} - -function isatty() { - tty -s <&1 -} -function in_isatty() { - tty -s -} -function out_isatty() { - tty -s <&1 -} -function err_isatty() { - tty -s <&2 -} -function die() { [ $# -gt 0 ] && eerror "$@"; exit 1; } -function exit_with { if [ $# -gt 0 ]; then "$@"; fi; exit $?; } -function die_with { [ $# -gt 0 ] && eerror "$1"; shift; [ $# -gt 0 ] && "$@"; exit 1; } -function die_unless() { - local count=$# - if [ $count -eq 0 ]; then - exit 1 - elif [ $count -eq 1 ]; then - "$@" || exit $? - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - : - else - r=$? - eerror "$m" - exit $r - fi - fi -} -function eerror_unless() { - local count=$# - if [ $count -eq 0 ]; then - return 1 - elif [ $count -eq 1 ]; then - "$@" || return $? - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - : - else - r=$? - eerror "$m" - return $r - fi - fi -} -function die_if() { - local count=$# - if [ $count -eq 0 ]; then - : - elif [ $count -eq 1 ]; then - "$@" && exit 1 - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - eerror "$m" - exit 1 - fi - fi -} -function eerror_if() { - local count=$# - if [ $count -eq 0 ]; then - : - elif [ $count -eq 1 ]; then - "$@" && return 1 - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - eerror "$m" - return 1 - fi - fi -} - -TAB=$'\t' -LATIN1=iso-8859-1 -LATIN9=iso-8859-15 -UTF8=utf-8 -OENC="$UTF8" - -if ! progexists iconv; then - function iconv() { cat; } -fi - -function __lang_encoding() { - local lang="$(<<<"$LANG" awk '{ print tolower($0) }')" - case "$lang" in - *@euro) echo "iso-8859-15";; - *.utf-8|*.utf8) echo "utf-8";; - *) echo "iso-8859-1";; - esac -} -function __norm_encoding() { - awk '{ - enc = tolower($0) - gsub(/^latin$/, "latin1", enc) - gsub(/^latin1$/, "iso-8859-1", enc) - gsub(/^latin9$/, "iso-8859-15", enc) - gsub(/[-_]/, "", enc) - if (enc == "iso8859" || enc == "iso88591" || enc == "8859" || enc == "88591") print "iso-8859-1" - else if (enc == "iso885915" || enc == "885915") print "iso-8859-15" - else if (enc == "utf" || enc == "utf8") print "utf-8" - else print $0 - }' <<<"$1" -} -function __init_encoding() { - local DEFAULT_ENCODING="$(__lang_encoding)" - [ -n "$DEFAULT_ENCODING" ] || DEFAULT_ENCODING=utf-8 - [ -n "$UTOOLS_OUTPUT_ENCODING" ] || UTOOLS_OUTPUT_ENCODING="$DEFAULT_ENCODING" - UTOOLS_OUTPUT_ENCODING="$(__norm_encoding "$UTOOLS_OUTPUT_ENCODING")" - [ -n "$UTOOLS_INPUT_ENCODING" ] || UTOOLS_INPUT_ENCODING="$UTOOLS_OUTPUT_ENCODING" - UTOOLS_INPUT_ENCODING="$(__norm_encoding "$UTOOLS_INPUT_ENCODING")" - [ -n "$UTOOLS_EDITOR_ENCODING" ] || UTOOLS_EDITOR_ENCODING="$UTOOLS_INPUT_ENCODING" - UTOOLS_EDITOR_ENCODING="$(__norm_encoding "$UTOOLS_EDITOR_ENCODING")" - - IENC="$UTOOLS_INPUT_ENCODING" - OENC="$UTOOLS_OUTPUT_ENCODING" -} - -if [ -n "$UTOOLS_LANG" -a -z "$LANG" ]; then - export UTOOLS_LANG - export LANG="$UTOOLS_LANG" -fi -__init_encoding - -function tooenc() { - local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - rawecho "$src" - else - iconv -f "$from" -t "$to" <<<"$src" - fi -} -function uecho() { - tooenc "$*" -} -function tooenc_() { - local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - rawecho_ "$src" - else - rawecho_ "$src" | iconv -f "$from" -t "$to" - fi -} -function uecho_() { - tooenc_ "$*" -} -function toienc() { - local __tie_var="$1" __tie_to="${2:-$IENC}" __tie_from="${3:-$UTOOLS_INPUT_ENCODING}" - if [ "$__tie_from" != "$__tie_to" ]; then - set_var "$__tie_var" "$(iconv -f "$__tie_from" -t "$__tie_to" <<<"${!__tie_var}")" - fi -} -function uread() { - [ $# -gt 0 ] || set -- REPLY - local __r_var - read "$@" - for __r_var in "$@"; do - [ -z "$__r_var" -o "${__r_var:0:1}" == "-" ] && continue # ignorer les options - toienc "$__r_var" - done -} - -function stooenc() { - local from="${1:-$OENC}" to="${2:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - cat - else - iconv -f "$from" -t "$to" - fi -} -function stoienc() { - local to="${1:-$IENC}" from="${2:-$UTOOLS_INPUT_ENCODING}" - if [ "$from" == "$to" ]; then - cat - else - iconv -f "$from" -t "$to" - fi -} - -export UTOOLS_EDATE -function __edate() { [ -n "$UTOOLS_EDATE" ] && date +"[%d/%m/%Y-%H:%M:%S] "; } - -export UTOOLS_ELOG_OVERWRITE -function __set_no_colors() { :; } -function elogto() { - UTOOLS_EDATE=1 - if [ -n "$1" -a -n "$2" ]; then - LANG=fr_FR.UTF8 - UTOOLS_OUTPUT_ENCODING="$UTF8" - __set_no_colors 1 - if [ -n "$UTOOLS_ELOG_OVERWRITE" ]; then - exec >"$1" 2>"$2" - else - exec >>"$1" 2>>"$2" - fi - elif [ -n "$1" ]; then - LANG=fr_FR.UTF8 - UTOOLS_OUTPUT_ENCODING="$UTF8" - __set_no_colors 1 - if [ -n "$UTOOLS_ELOG_OVERWRITE" ]; then - exec >"$1" 2>&1 - else - exec >>"$1" 2>&1 - fi - fi -} - -export __estack __tlevel -function __indent() { - if [ "${1/ -/}" != "$1" ]; then - sed "2,\$s/^/${__tlevel}/g" <<<"$1" - else - rawecho "$1" - fi -} -function __eerror() { tooenc "$(__edate)${__tlevel}* error: $(__indent "$1")"; } -function __ewarn() { tooenc "$(__edate)${__tlevel}* warning: $(__indent "$1")"; } -function __enote() { tooenc "$(__edate)${__tlevel}* note: $(__indent "$1")"; } -function __ebanner() { - local maxi="${COLUMNS:-80}" - local -a lines - local psfix line - - psfix="$(__edate)${__tlevel}" - while [ ${#psfix} -lt $maxi ]; do psfix="$psfix="; done - - tooenc "$psfix" - maxi=$(($maxi - 1)) - array_from_xlines lines "$1" - for line in "" "${lines[@]}" ""; do - line="$(__edate)${__tlevel}= $line" - if [ ${#line} -le $maxi ]; then - while [ ${#line} -lt $maxi ]; do line="$line "; done - line="$line=" - fi - tooenc "$line" - done - tooenc "$psfix" -} -function __eimportant() { tooenc "$(__edate)${__tlevel}* important: $(__indent "$1")"; } -function __eattention() { tooenc "$(__edate)${__tlevel}* attention: $(__indent "$1")"; } -function __einfo() { tooenc "$(__edate)${__tlevel}* info: $(__indent "$1")"; } -function __eecho() { tooenc "$(__edate)${__tlevel}$(__indent "$1")"; } -function __eecho_() { tooenc_ "$(__edate)${__tlevel}$(__indent "$1")"; } -function __edebug() { tooenc "$(__edate)${__tlevel}* debug: $(__indent "$1")"; } -function __estep() { tooenc "$(__edate)${__tlevel}* $(__indent "$1")"; } -function __estepe() { __estep "$@"; } -function __estepw() { __estep "$@"; } -function __estepn() { __estep "$@"; } -function __estepi() { __estep "$@"; } -function __estep_() { tooenc_ "$(__edate)${__tlevel}* $(__indent "$1")"; } -function __estepe_() { __estep_ "$@"; } -function __estepw_() { __estep_ "$@"; } -function __estepn_() { __estep_ "$@"; } -function __estepi_() { __estep_ "$@"; } -function __etitle() { tooenc "$(__edate)${__tlevel}+++ $(__indent "$1")"; } -function __ebegin() { tooenc_ "$(__edate)${__tlevel}* $(__indent "$1"): "; } -function __edoto() { echo_ "."; } -function __edotw() { echo_ "w"; } -function __edotx() { echo_ "x"; } -function __edotp() { echo_ "+"; } -function __edotd() { tooenc "($1)"; } -function __eendo() { echo "[ok]"; } -function __eendx() { echo "[error]"; } -PRETTYOPTS=() -function set_verbosity() { :;} -function set_interaction() { :;} -function show_error() { - return 0 -} -function show_warn() { - return 0 -} -function show_info() { - return 0 -} -function show_verbose() { - return 0 -} -function show_debug() { - [ -n "$DEBUG" ] -} -function check_verbosity() { - return 0 -} -function get_verbosity_option() { :;} -function check_interaction() { - return 0 -} -function is_interaction() { - return 1 -} -function get_interaction_option() { :;} -__epending= -function eflush() { - if [ -n "$__epending" ]; then rawecho "$__epending" 1>&2; __epending=; fi -} -function eclearp() { - __epending= -} -function eerror() { - show_error || return; eflush; __eerror "$*" 1>&2 -} -function ewarn() { - show_warn || return; eflush; __ewarn "$*" 1>&2 -} -function enote() { - show_info || return; eflush; __enote "$*" 1>&2 -} -function ebanner() { - show_error || return; eflush; __ebanner "$*" 1>&2; sleep 5 -} -function eimportant() { - show_error || return; eflush; __eimportant "$*" 1>&2 -} -function eattention() { - show_warn || return; eflush; __eattention "$*" 1>&2 -} -function einfo() { - show_info || return; eflush; __einfo "$*" 1>&2 -} -function eecho() { - show_info || return; eflush; __eecho "$*" 1>&2 -} -function eecho_() { - show_info || return; eflush; __eecho_ "$*" 1>&2 -} -function edebug() { - show_debug || return; eflush; __edebug "$*" 1>&2 -} -function trace() { - local r cmd="$(quoted_args "$@")" - show_info && { eflush; __eecho "\$ $cmd" 1>&2; } - "$@"; r=$? - if [ $r -ne 0 ]; then - if show_info; then - eflush; __eecho "^ [EC #$r]" 1>&2 - elif show_error; then - eflush; __eecho "^ $cmd [EC #$r]" 1>&2; - fi - fi - return $r -} -function trace_error() { - local r - "$@"; r=$? - if [ $r -ne 0 ]; then - local cmd="$(quoted_args "$@")" - show_error && { eflush; __eecho "^ $cmd [EC #$r]" 1>&2; } - fi - return $r -} - -function etitle() { - local __t_deferred= - __t_etitle "$@" -} -function etitled() { - local __t_deferred=1 - __t_etitle "$@" -} -function __t_etitle() { - local __t_eend=default - local __t_clearp= - while [ -n "$1" ]; do - if [ "$1" == "--" ]; then - shift - break - elif [ "$1" == "-s" ]; then - __t_eend= - shift - elif [ "$1" == "--eend" ]; then - __t_eend=1 - shift - elif [ "$1" == "-p" ]; then - __t_clearp=1 - shift - else - break - fi - done - local __t_title="$1"; shift - local __t_s=0 - [ -n "$__estack" ] && __tlevel="${__tlevel} " - __estack="$__estack:t" - if show_info; then - if [ -n "$__t_deferred" ]; then - __epending="${__epending:+$__epending -}$(__etitle "$__t_title")" - else - eflush - __etitle "$__t_title" 1>&2 - fi - fi - if [ $# -gt 0 ]; then - "$@" - __t_s=$? - [ "$__t_eend" == "default" ] && __t_eend=1 - fi - [ "$__t_eend" == "default" ] && __t_eend= - if [ -n "$__t_eend" ]; then - eend $__t_s - [ -n "$__t_clearp" ] && eclearp - fi - return $__t_s -} -function estep() { - show_info || return; eflush; __estep "$*" 1>&2 -} -function estepe() { - show_info || return; eflush; __estepe "$*" 1>&2 -} -function estepw() { - show_info || return; eflush; __estepw "$*" 1>&2 -} -function estepn() { - show_info || return; eflush; __estepn "$*" 1>&2 -} -function estepi() { - show_info || return; eflush; __estepi "$*" 1>&2 -} -function estep_() { - show_info || return; eflush; __estep_ "$*" 1>&2 -} -function estepe_() { - show_info || return; eflush; __estepe_ "$*" 1>&2 -} -function estepw_() { - show_info || return; eflush; __estepw_ "$*" 1>&2 -} -function estepn_() { - show_info || return; eflush; __estepn_ "$*" 1>&2 -} -function estepi_() { - show_info || return; eflush; __estepi_ "$*" 1>&2 -} -function ebegin() { - local __b_eend=default - while [ -n "$1" ]; do - if [ "$1" == "--" ]; then - shift - break - elif [ "$1" == "-s" ]; then - __b_eend= - shift - elif [ "$1" == "--eend" ]; then - __b_eend=1 - shift - else - break - fi - done - local __b_msg="$1"; shift - local __b_s=0 - __estack="$__estack:b" - if show_info; then - eflush - __ebegin "$__b_msg" 1>&2 - fi - if [ $# -gt 0 ]; then - "$@" - __b_s=$? - [ "$__b_eend" == "default" ] && __b_eend=1 - fi - [ "$__b_eend" == "default" ] && __b_eend= - [ -n "$__b_eend" ] && eend $__b_s - return $__b_s -} -function edot() { - local s=$? - show_info || return - eflush - [ -n "$1" ] && s="$1" - shift - if [ "$s" == "0" ]; then - __edoto 1>&2 - else - __edotx 1>&2 - fi - show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2 - return $s -} -function edotw() { - local s=$? - show_info || return - eflush - [ -n "$1" ] && s="$1" - shift - __edotw 1>&2 - show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2 - return $s -} -function ewait() { - [ -n "$1" ] || return 1 - if show_info; then - local count=2 - eflush - little_sleep # certains processus retournent tout de suite - while is_running "$1"; do - sleep 1 - if [ $count -gt 0 ]; then - count=$(($count - 1)) - else - __edotp 1>&2 - fi - done - __edoto 1>&2 - else - wait "$1" - fi -} -function eend() { - local s=$? - if [ "$1" == "-c" ]; then - __estack= - __tlevel= - elif [ "${__estack%:b}" != "$__estack" ]; then - __estack="${__estack%:b}" - show_info || return - eflush - [ -n "$1" ] && s="$1" - if [ "$s" == "0" ]; then - __eendo 1>&2 - else - __eendx 1>&2 - fi - elif [ "${__estack%:t}" != "$__estack" ]; then - __estack="${__estack%:t}" - __tlevel="${__tlevel% }" - fi -} -function ask_yesno() { - local interactive=1 - if [[ "$1" == -* ]]; then - if [ "$1" != -- ]; then - check_interaction "$1" || interactive= - fi - shift - else - check_interaction -c || interactive= - fi - local default="${2:-N}" - if [ "$default" == "C" ]; then - [ -n "$interactive" ] && default=N || default=O - elif [ "$default" == "X" ]; then - [ -n "$interactive" ] && default=O || default=N - fi - if [ -n "$interactive" ]; then - eflush - local message="$1" - local prompt="[oN]" - local r - is_yes "$default" && prompt="[On]" - if [ -n "$message" ]; then - tooenc_ "$message" 1>&2 - else - tooenc_ "Voulez-vous continuer?" "$UTF8" 1>&2 - fi - tooenc_ " $prompt " "$UTF8" 1>&2 - uread r - is_yes "${r:-$default}" - else - is_yes "$default" - fi -} -function read_value() { - local -a __rv_opts __rv_readline=1 __rv_showdef=1 __rv_nl= - __rv_opts=() - [ -n "$UTOOLS_NO_READLINE" ] && __rv_readline= - __rv_read "$@" -} -function read_password() { - local -a __rv_opts __rv_readline= __rv_showdef= __rv_nl=1 - __rv_opts=(-s) - __rv_read "$@" -} -function __rv_read() { - local __rv_int=1 - if [[ "$1" == -* ]]; then - if [ "$1" != -- ]; then - check_interaction "$1" || __rv_int= - fi - shift - else - check_interaction -c || __rv_int= - fi - local __rv_msg="$1" __rv_v="${2:-value}" __rv_d="$3" __rv_re="${4:-O}" - if [ -z "$__rv_int" ]; then - if is_yes "$__rv_re" && [ -z "$__rv_d" ]; then - OENC="$UTF8" eerror "La valeur par défaut de $__rv_v doit être non vide" - return 1 - fi - set_var "$__rv_v" "$__rv_d" - return 0 - fi - - eflush - local __rv_r - while true; do - if [ -n "$__rv_msg" ]; then - tooenc_ "$__rv_msg" 1>&2 - else - tooenc_ "Entrez la valeur" "$UTF8" 1>&2 - fi - if [ -n "$__rv_readline" ]; then - tooenc_ ": " "$UTF8" 1>&2 - uread -e ${__rv_d:+-i"$__rv_d"} "${__rv_opts[@]}" __rv_r - else - if [ -n "$__rv_d" ]; then - if [ -n "$__rv_showdef" ]; then - tooenc_ " [$__rv_d]" 1>&2 - else - tooenc_ " [****]" 1>&2 - fi - fi - tooenc_ ": " "$UTF8" 1>&2 - uread "${__rv_opts[@]}" __rv_r - [ -n "$__rv_nl" ] && echo - fi - __rv_r="${__rv_r:-$__rv_d}" - if [ -n "$__rv_r" ] || ! is_yes "$__rv_re"; then - set_var "$__rv_v" "$__rv_r" - return 0 - fi - done -} -function simple_menu() { - local __sm_title= __sm_yourchoice= __sm_default= - local -a __sm_args - parse_opts -t: __sm_title= -m: __sm_yourchoice= -d: __sm_default= @ __sm_args -- "$@" && - set -- "${__sm_args[@]}" || ewarn "$__sm_args" - - local __sm_option_var="${1:-option}" __sm_options_var="${2:-options}" - local __sm_option __sm_options - __sm_options="$__sm_options_var[*]" - if [ -z "${!__sm_options}" ]; then - OENC="$UTF8" eerror "Le tableau $__sm_options_var doit être non vide" - return 1 - fi - [ -z "$__sm_default" ] && __sm_default="${!__sm_option_var}" - - eflush - array_copy __sm_options "$__sm_options_var" - local __sm_c=0 __sm_i __sm_choice - while true; do - if [ "$__sm_c" == "0" ]; then - [ -n "$__sm_title" ] && tooenc "=== $__sm_title ===" 1>&2 - __sm_i=1 - for __sm_option in "${__sm_options[@]}"; do - if [ "$__sm_option" == "$__sm_default" ]; then - tooenc "$__sm_i*- $__sm_option" 1>&2 - else - tooenc "$__sm_i - $__sm_option" 1>&2 - fi - let __sm_i=$__sm_i+1 - done - fi - - if [ -n "$__sm_yourchoice" ]; then - tooenc_ "$__sm_yourchoice" 1>&2 - else - tooenc_ "Entrez le numéro de l'option choisie" "$UTF8" 1>&2 - fi - tooenc_ ": " "$UTF8" 1>&2 - uread __sm_choice - - if [ -z "$__sm_choice" -a -n "$__sm_default" ]; then - __sm_option="$__sm_default" - break - fi - if [ -n "$__sm_choice" -a -z "${__sm_choice//[0-9]/}" ]; then - if [ "$__sm_choice" -gt 0 -a "$__sm_choice" -le "${#__sm_options[*]}" ]; then - __sm_option="${__sm_options[$(($__sm_choice - 1))]}" - break - else - OENC="$UTF8" eerror "Numéro d'option incorrect" - fi - else - OENC="$UTF8" eerror "Vous devez saisir le numéro de l'option choisie" - fi - - let __sm_c=$__sm_c+1 - if [ "$__sm_c" -eq 5 ]; then - tooenc "" "$UTF8" 1>&2 - __sm_c=0 - fi - done - set_var "$__sm_option_var" "$__sm_option" -} - -function actions_menu() { - local -a __am_action_descs __am_options __am_void_actions - local __am_tmp __am_select_action __am_select_option __am_title __am_optyc __am_actyc - local __am_default_action=auto __am_quit_action=auto - local __am_default_option= - local -a __am_args - parse_opts \ - -t: __am_title= \ - -m: __am_optyc= \ - -M: __am_actyc= \ - -e: __am_void_actions \ - -d: __am_default_action= \ - -q: __am_quit_action= \ - -o: __am_default_option= \ - @ __am_args -- "$@" && set -- "${__am_args[@]}" || { eerror "$__am_args"; return 1; } - - __am_tmp="${1:-action}"; __am_select_action="${!__am_tmp}" - __am_tmp="${2:-option}"; __am_select_option="${!__am_tmp}" - [ -n "$__am_default_option" ] && __am_select_option="$__am_default_option" - array_copy __am_action_descs "${3:-actions}" - array_copy __am_options "${4:-options}" - - eerror_unless [ ${#__am_action_descs[*]} -gt 0 ] "Vous devez spécifier le tableau des actions" || return - __actions_menu || return 1 - setv "${1:-action}" "$__am_select_action" - setv "${2:-option}" "$__am_select_option" -} -function __actions_menu() { - local title="$__am_title" - local optyc="$__am_optyc" actyc="$__am_actyc" - local default_action="$__am_default_action" - local quit_action="$__am_quit_action" - local select_action="$__am_select_action" - local select_option="$__am_select_option" - local -a action_descs options void_actions - array_copy action_descs __am_action_descs - array_copy options __am_options - array_copy void_actions __am_void_actions - - local no_options - array_isempty options && no_options=1 - - local -a actions - local tmp action name - for tmp in "${action_descs[@]}"; do - splitfsep2 "$tmp" : action name - [ -n "$action" ] || action="${name:0:1}" - action="$(strlower "$action")" - array_addu actions "$action" - done - - if [ "$default_action" == auto ]; then - default_action="$select_action" - if [ -n "$default_action" ]; then - array_contains actions "$default_action" || default_action= - fi - [ -n "$default_action" ] || default_action="${actions[0]}" - fi - default_action="${default_action:0:1}" - default_action="$(strlower "$default_action")" - - if [ "$quit_action" == auto ]; then - if [ ${#actions[*]} -gt 1 ]; then - quit_action="${actions[@]:$((-1)):1}" - array_addu void_actions "$quit_action" - fi - fi - quit_action="${quit_action:0:1}" - quit_action="$(strlower "$quit_action")" - - local action_title - for tmp in "${action_descs[@]}"; do - splitfsep2 "$tmp" : action name - [ -n "$action" ] || action="${name:0:1}" - [ -n "$name" ] || name="$action" - action="$(strlower "$action")" - if [ -n "$no_options" ]; then - if ! array_contains void_actions "$action"; then - array_del actions "$action" - continue - fi - fi - [ "$action" == "$default_action" ] && name="$name*" - action_title="${action_title:+$action_title/}$name" - done - if [ -n "$default_action" ]; then - array_contains actions "$default_action" || default_action= - fi - if [ -n "$quit_action" ]; then - array_contains actions "$quit_action" || quit_action= - fi - - if [ -n "$no_options" ]; then - if array_isempty void_actions; then - eerror "Aucune option n'est définie. Il faut définir le tableau des actions vides" - return 1 - fi - __void_actions_menu - else - __options_actions_menu - fi -} -function __void_actions_menu() { - eflush - local c=0 choice - while true; do - if [ $c -eq 0 ]; then - [ -n "$title" ] && __etitle "$title" 1>&2 - __eecho_ "=== Actions disponibles: " 1>&2 - tooenc "$action_title" 1>&2 - fi - if [ -n "$actyc" ]; then - __eecho_ "$actyc" 1>&2 - elif [ -n "$optyc" ]; then - __eecho_ "$optyc" 1>&2 - else - __eecho_ "Entrez l'action à effectuer" 1>&2 - fi - tooenc_ ": " 1>&2 - uread choice - if [ -z "$choice" -a -n "$default_action" ]; then - select_action="$default_action" - break - fi - - choice="${choice:0:1}" - choice="$(strlower "$choice")" - if array_contains actions "$choice"; then - select_action="$choice" - break - elif [ -n "$choice" ]; then - eerror "$choice: action incorrecte" - else - eerror "vous devez saisir l'action à effectuer" - fi - let c=$c+1 - if [ $c -eq 5 ]; then - tooenc "" 1>&2 - c=0 - fi - done - __am_select_action="$select_action" - __am_select_option= -} -function __options_actions_menu() { - eflush - local c=0 option choice action option - while true; do - if [ $c -eq 0 ]; then - [ -n "$title" ] && __etitle "$title" 1>&2 - i=1 - for option in "${options[@]}"; do - if [ "$option" == "$select_option" ]; then - tooenc "$i*- $option" 1>&2 - else - tooenc "$i - $option" 1>&2 - fi - let i=$i+1 - done - __estepn_ "Actions disponibles: " 1>&2 - tooenc "$action_title" 1>&2 - fi - if [ -n "$optyc" ]; then - __eecho_ "$optyc" 1>&2 - else - __eecho_ "Entrez l'action et le numéro de l'option choisie" 1>&2 - fi - tooenc_ ": " 1>&2 - uread choice - - if [ -z "$choice" -a -n "$default_action" ]; then - action="$default_action" - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - elif [ -n "$select_option" ]; then - select_action="$action" - break - fi - fi - action="${choice:0:1}" - action="$(strlower "$action")" - if array_contains actions "$action"; then - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - else - option="${choice:1}" - option="${option// /}" - if [ -z "$option" -a -n "$select_option" ]; then - select_action="$action" - break - elif [ -z "$option" ]; then - eerror "vous devez saisir le numéro de l'option" - elif isnum "$option"; then - if [ $option -gt 0 -a $option -le ${#options[*]} ]; then - select_action="$action" - select_option="${options[$(($option - 1))]}" - break - fi - else - eerror "$option: numéro d'option incorrecte" - fi - fi - elif isnum "$choice"; then - action="$default_action" - if [ -n "$action" ]; then - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - else - option="${choice// /}" - if [ -z "$option" ]; then - eerror "vous devez saisir le numéro de l'option" - elif isnum "$option"; then - if [ $option -gt 0 -a $option -le ${#options[*]} ]; then - select_action="$action" - select_option="${options[$(($option - 1))]}" - break - fi - else - eerror "$option: numéro d'option incorrecte" - fi - fi - else - eerror "Vous devez spécifier l'action à effectuer" - fi - elif [ -n "$choice" ]; then - eerror "$choice: action et/ou option incorrecte" - else - eerror "vous devez saisir l'action à effectuer" - fi - let c=$c+1 - if [ $c -eq 5 ]; then - tooenc "" 1>&2 - c=0 - fi - done - __am_select_action="$select_action" - __am_select_option="$select_option" -} - - -function __ac_forgetall() { __ac_files=(); } -__ac_forgetall -function __ac_trap() { - local file - for file in "${__ac_files[@]}"; do - [ -e "$file" ] && rm -rf "$file" 2>/dev/null - done - __ac_forgetall -} -trap __ac_trap 1 3 15 EXIT -function autoclean() { - local file - for file in "$@"; do - [ -n "$file" ] && array_add __ac_files "$file" - done -} -function ac_cleanall() { - __ac_trap -} -function ac_clean() { - local file - for file in "$@"; do - if array_contains __ac_files "$file"; then - [ -e "$file" ] && rm -rf "$file" 2>/dev/null - array_del __ac_files "$file" - fi - done -} -function ac_set_tmpfile() { - local __acst_d - if show_debug; then - if [ -n "$5" ]; then - is_yes "${!5}" && __acst_d=1 - else - __acst_d=1 - fi - fi - if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" - [ -f "$3" -a "$4" == keep ] || >"$3" - else - local __acst_t="$(mktempf "$2")" - autoclean "$__acst_t" - set_var "$1" "$__acst_t" - fi -} -function ac_set_tmpdir() { - local __acst_d - if show_debug; then - if [ -n "$4" ]; then - is_yes "${!4}" && __acst_d=1 - else - __acst_d=1 - fi - fi - if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" - mkdir -p "$3" - else - local __acst_t="$(mktempd "$2")" - autoclean "$__acst_t" - set_var "$1" "$__acst_t" - fi -} -function debug_tee() { - if show_debug; then - tee "$@" - else - cat - fi -} - - -function get_defaults_files() { - local __gd_dest="${1:-defaults}"; shift - local -a __gd_fs - local __gd_f __gd_found - for __gd_f in "$@"; do - __gd_found= - if [ -r "/etc/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "/etc/default/$__gd_f") - __gd_found=1 - fi - if [ -r "$HOME/etc/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "$HOME/etc/default/$__gd_f") - __gd_found=1 - fi - if [ -z "$__gd_found" -a -r "$scriptdir/lib/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "$scriptdir/lib/default/$__gd_f") - fi - done - array_copy "$__gd_dest" __gd_fs -} - -function set_defaults() { - local -a __sd_fs - local __sd_f - get_defaults_files __sd_fs "$@" - for __sd_f in "${__sd_fs[@]}"; do - source "$__sd_f" - done -} - - -: "${MYHOST:=$HOSTNAME}" -: "${MYHOSTNAME:=${MYHOST%%.*}}" -export MYHOST MYHOSTNAME - -function myhost() { - hostname -f 2>/dev/null || echo "$MYHOST" -} -function myhostname() { - hostname -s 2>/dev/null || echo "$MYHOSTNAME" -} -##@inc]base -uprovide base.tools -urequire base - -function base_umove() { - local -a args - local updatedir - args=(-d:,--updatedir: .) - parse_args_check "$@" || return; set -- "${args[@]}" - - eerror_unless [ -z "$updatedir" -o -d "$updatedir" ] "$updatedir: doit être un répertoire" || return - eerror_if [ $# -eq 0 ] "Vous devez spécifier les fichiers à déplacer" || return - eerror_if [ $# -eq 1 ] "Vous devez spécifier la destination" || return - - local -a srcs - local dest - - srcs=("$@") - setx dest=last_value srcs - array_del_last srcs - - if [ $# -eq 2 ]; then - if [ -d "$dest" ]; then - : # ce cas sera traité ci-dessous - elif [ -e "$dest" ]; then - eerror "$dest: refus d'écraser la destination" - return 1 - else - src="${srcs[0]}" - if [ -n "$updatedir" ]; then - if [ -L "$src" ]; then - ldest="$(readlinka "$src")" - array_find_links update_links "$ldest" "$updatedir" - else - array_find_links update_links "$src" "$updatedir" - fi - move_file "$src" "$dest" "${update_links[@]}" - else - move_link "$src" "$dest" - fi - return $? - fi - fi - - [ -d "$dest" ] || { - eerror "$dest: doit être un répertoire" - return 1 - } - for src in "${srcs[@]}"; do - if [ -n "$updatedir" ]; then - if [ -L "$src" ]; then - move_link "$src" "$dest" - else - array_find_links update_links "$src" "$updatedir" - move_file "$src" "$dest" "${update_links[@]}" - fi - else - move_link "$src" "$dest" - fi - done -} -##@inc]base.tools -##@inc[base.compat -## Fonctions de base: support des fonctions obsolètes et des versions de bash < 4.x -##@inc[base.core -## Fonctions de base: fondement -uprovide base.core - -function echo_() { - echo -n "$*" -} -function recho() { - if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - - local first="${1:1}"; shift - echo "$first$@" - else - echo "$@" - fi -} -function recho_() { - if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - - local first="${1:1}"; shift - echo -n "$first$@" - else - echo -n "$@" - fi -} -function _qval() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s//\$/\\\$}" - s="${s//\`/\\\`}" - recho_ "$s" -} -function should_quote() { - local l="${#1}" - [ $l -eq 0 -o $l -gt 80 ] && return 0 - local s="${*//[a-zA-Z0-9]/}" - s="${s//,/}" - s="${s//./}" - s="${s//+/}" - s="${s//\//}" - s="${s//-/}" - s="${s//_/}" - s="${s//=/}" - [ -n "$s" ] -} -function qval() { - echo -n \" - _qval "$@" - echo \" -} -function qvalm() { - if should_quote "$*"; then - echo -n \" - _qval "$@" - echo \" - else - recho "$*" - fi -} -function qvalr() { - if [ -z "$*" ]; then - : - elif should_quote "$*"; then - echo -n \" - _qval "$@" - echo \" - else - recho "$*" - fi -} -function qvals() { - local arg first=1 - for arg in "$@"; do - [ -z "$first" ] && echo -n " " - if should_quote "$arg"; then - echo -n \" - _qval "$arg" - echo -n \" - else - recho_ "$arg" - fi - first= - done - [ -z "$first" ] && echo -} -function qwc() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s//\$/\\\$}" - s="${s//\`/\\\`}" - local r a b - while [ -n "$s" ]; do - if [[ "$s" == *\** ]]; then - if [[ "$s" == *\?* ]]; then - a="${s%%\**}" - b="${s%%\?*}" - if [ ${#a} -lt ${#b} ]; then - s="${s#*\*}" - r="$r\"$a\"*" - else - s="${s#*\?}" - r="$r\"$b\"?" - fi - else - a="${s%%\**}" - s="${s#*\*}" - r="$r\"$a\"*" - fi - elif [[ "$s" == *\?* ]]; then - if [[ "$s" == *\** ]]; then - a="${s%%\**}" - b="${s%%\?*}" - if [ ${#a} -lt ${#b} ]; then - s="${s#*\*}" - r="$r\"$a\"*" - else - s="${s#*\?}" - r="$r\"$b\"?" - fi - else - a="${s%%\?*}" - s="${s#*\?}" - r="$r\"$a\"?" - fi - else - r="$r\"$s\"" - break - fi - done - recho_ "$r" -} -function qlines() { - sed "s/'/'\\\\''/g; s/.*/'&'/g" -} -function setv() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - eval "$__s_var=\"\$*\"" -} -function _setv() { - local __s_var="$1"; shift - eval "$__s_var=\"\$*\"" -} -function echo_setv() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - echo "$__s_var=$(qvalr "$*")" -} -function setx() { - if [ "$1" == -a ]; then - shift - local __s_array="$1"; shift - if [[ "$__s_array" == *=* ]]; then - set -- "${__s_array#*=}" "$@" - __s_array="${__s_array%%=*}" - fi - eval "$__s_array=($("$@" | qlines))" - else - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - eval "$__s_var="'"$("$@")"' - fi -} -function _setvx() { - local __s_var="$1"; shift - eval "$__s_var="'"$("$@")"' -} -function _setax() { - local __s_array="$1"; shift - eval "$__s_array=($("$@" | qlines))" -} -function evalx() { - local __e_val __e_arg __e_r=0 - local -a __e_cmd - - local __e_first=1 - while [ $# -gt 0 ]; do - __e_cmd=() - while [ $# -gt 0 ]; do - __e_arg="$1"; shift - [ "$__e_arg" == // ] && break - if [ "${__e_arg%//}" != "$__e_arg" ]; then - local __e_tmp="${__e_arg%//}" - if [ -z "${__e_tmp//\\/}" ]; then - __e_arg="${__e_arg#\\}" - __e_cmd=("${__e_cmd[@]}" "$__e_arg") - continue - fi - fi - __e_cmd=("${__e_cmd[@]}" "$__e_arg") - done - - if [ -n "$__e_first" ]; then - __e_val="$("${__e_cmd[@]}")" || __e_r=$? - else - __e_val="$("${__e_cmd[@]}" "$__e_val")" || __e_r=$? - fi - __e_first= - done - [ -n "$__e_val" ] && echo "$__e_val" - return $__e_r -} -function setxx() { - local -a __s_args - if [ "$1" == -a ]; then __s_args=(-a); shift; fi - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - __s_args=("${__s_args[@]}" "$__s_var") - setx "${__s_args[@]}" evalx "$@" -} -function evalp() { - local __e_arg __e_cmd - - while [ $# -gt 0 ]; do - __e_arg="$1"; shift - if [ "$__e_arg" == // ]; then - __e_cmd="$__e_cmd |" - continue - elif [ "${__e_arg%//}" != "$__e_arg" ]; then - local __e_tmp="${__e_arg%//}" - if [ -z "${__e_tmp//\\/}" ]; then - __e_arg="${__e_arg#\\}" - fi - fi - __e_cmd="${__e_cmd:+$__e_cmd }\"$(_qval "$__e_arg")\"" - done - eval "$__e_cmd" -} -function setxp() { - local -a __s_args - if [ "$1" == -a ]; then __s_args=(-a); shift; fi - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - __s_args=("${__s_args[@]}" "$__s_var") - setx "${__s_args[@]}" evalp "$@" -} -function testx() { - local __t_op="$1"; shift - local __t_val="$(evalx "$@")" - [ $__t_op "$__t_val" ] -} -function test2x() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalx "$@")" - [ "$__t_val1" $__t_op "$__t_val2" ] -} -function testrx() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalx "$@")" - eval '[[ "$__t_val1" '"$__t_op"' "$__t_val2" ]]' -} -function testp() { - local __t_op="$1"; shift - local __t_val="$(evalp "$@")" - [ $__t_op "$__t_val" ] -} -function test2p() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalp "$@")" - [ "$__t_val1" $__t_op "$__t_val2" ] -} -function testrp() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalp "$@")" - eval '[[ "$__t_val1" '"$__t_op"' "$__t_val2" ]]' -} - -function err2out() { - "$@" 2>&1 -} - -function is_defined() { - [ -n "$(declare -p "$1" 2>/dev/null)" ] -} -function is_array() { - case "$(declare -p "$1" 2>/dev/null)" in declare\ -a*) return 0;; esac - return 1 -} - -function upvar() { - if unset -v "$1"; then - if [ $# -eq 2 ]; then - eval "$1=\"\$2\"" - else - eval "$1=(\"\${@:2}\")" - fi - fi -} -function array_upvar() { - unset -v "$1" && eval "$1=(\"\${@:2}\")" -} -function upvars() { - while [ $# -gt 0 ]; do - case "$1" in - -a) - unset -v "$2" && eval "$2=(\"\${@:3}\")" - break - ;; - -a*) - unset -v "$2" && eval "$2=(\"\${@:3:${1#-a}}\")" - shift $((${1#-a} + 2)) || return 1 - ;; - *) - unset -v "$1" && eval "$1=\"\$2\"" - shift; shift - ;; - esac - done -} - -function __ab_process_pending() { - local -a values - case "$mode" in - cmd) values="$("${pending[@]}")";; - ssplit) eval "values=($("${pending[@]}"))";; - lsplit) eval "values=($("${pending[@]}" | qlines))";; - add) values=("${pending[@]}");; - esac - cmd=("${cmd[@]}" "${values[@]}") - pending=() -} -function array_buildcmd() { - local desta="$1"; shift; local "$desta" - local mode=add - local -a pending cmd - while [ $# -gt 0 ]; do - case "$1" in - ++c|++cmd|++) __ab_process_pending; mode=cmd;; - ++s|++ssplit) __ab_process_pending; mode=ssplit;; - ++l|++lsplit) __ab_process_pending; mode=lsplit;; - ++a|++add) __ab_process_pending; mode=add;; - *) pending=("${pending[@]}" "$1");; - esac - shift - done - __ab_process_pending - array_upvar "$desta" "${cmd[@]}" -} -function buildcmd() { - local -a args - array_buildcmd args "$@" - qvals "${args[@]}" -} -function evalcmd() { - local -a args - array_buildcmd args "$@" - "${args[@]}" -} -##@inc]base.core -##@inc[base.num -## Fonctions de base: gestion des valeurs numériques -uprovide base.num - -function isnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//[0-9]/}" - [ -z "$v" ] -} -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - [ -z "${1//[0-9]/}" ] -} -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//./}" - v="${v//,/}" - v="${v//[0-9]/}" - [ -z "$v" ] -} -##@inc]base.num -##@inc[base.bool -## Fonctions de base: valeurs booléennes -##@inc[base.num -## Fonctions de base: gestion des valeurs numériques -uprovide base.num - -function isnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//[0-9]/}" - [ -z "$v" ] -} -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - [ -z "${1//[0-9]/}" ] -} -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//./}" - v="${v//,/}" - v="${v//[0-9]/}" - [ -z "$v" ] -} -##@inc]base.num -uprovide base.bool -urequire base.num - -function is_yes() { - case "${1,,}" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - esac - isnum "$1" && [ "$1" -ne 0 ] && return 0 - return 1 -} -function is_no() { - case "${1,,}" in - n|non|no|f|faux|false|off) return 0;; - esac - isnum "$1" && [ "$1" -eq 0 ] && return 0 - return 1 -} -function yesval() { - is_yes "$1" && echo 1 -} - -function setb() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - local __s_r - if "$@" >/dev/null; then - eval "$__s_var=1" - else - __s_r=$? - eval "$__s_var=" - return $__s_r - fi -} -function _setb() { - local __s_var="$1"; shift - if "$@" >/dev/null; then - eval "$__s_var=1" - else - eval "$__s_var=" - fi -} - -function evalb() { - if evalx "$@" >/dev/null; then - echo 1 - else - return $? - fi -} -function setxb() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - setx "$__s_var" evalb "$@" -} -##@inc]base.bool -##@inc[base.quote -## Fonctions de base: protection de valeurs chaine -uprovide base.quote -urequire base.core - -function _qawk() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s// -/\\n}" - recho_ "$s" -} -function qawk() { - echo -n \" - _qawk "$@" - echo \" -} -function qseds() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\//\\/}" - s="${s// -/\\n}" - recho "$s" -} -function _qform() { - local s="$*" - s="${s//\%/%25}" - s="${s//+/%2B}" - s="${s//&/%26}" - s="${s//=/%3D}" - s="${s// /+}" - recho_ "$s" -} -function qform() { - local s="$*" - if [[ "$s" == *=* ]]; then - _qform "${s%%=*}" - echo -n = - _qform "${s#*=}" - echo - else - _qform "$s" - echo - fi -} -function _qsql() { - local q="'" qq="''" - echo "${*//$q/$qq}" -} -function qsql() { - local q="'" qq="''" - echo "'${*//$q/$qq}'" -} -##@inc]base.quote -uprovide base.compat -urequire base.core base.num base.bool base.quote - - -function setx2() { setxx "$@"; } -function rawecho() { recho "$@"; } -function rawecho_() { recho_ "$@"; } -function quote_arg() { _qval "$@"; } -function quoted_arg() { qvalm "$@"; } -function quoted_args() { qvals "$@"; } -function set_var() { setv "$@"; } -function set_var_cmd() { echo_setv "$@"; } -function set_var_literal() { eval "$1=$2"; } - -function quote_awk() { _qawk "$@"; } -function quoted_awk() { qawk "$@"; } -function quote_seds() { qseds "$@"; } -function quote_form() { _qform "$@"; } -function quoted_form() { qform "$@"; } - - -if [ -n "$BASH_VERSINFO" -a "${BASH_VERSINFO[0]}" -lt 4 ]; then - function strlower() { tr A-Z a-z <<<"$*"; } - function strlower1() { - local str="$*" - local h="${str:0:1}" r="${str:1}" - echo "$(tr A-Z a-z <<<"$h")$r" - } - function strlowers() { - local -a vs; local v - for v in "$@"; do - vs=("${vs[@]}" "$(strlower1 "$v")") - done - echo "${vs[*]}" - } - function strupper() { tr a-z A-Z <<<"$*"; } - function strupper1() { - local str="$*" - local h="${str:0:1}" r="${str:1}" - echo "$(tr a-z A-Z <<<"$h")$r" - } - function struppers() { - local -a vs; local v - for v in "$@"; do - vs=("${vs[@]}" "$(strupper1 "$v")") - done - echo "${vs[*]}" - } - - function is_yes() { - case "$1" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - O|OUI|Y|YES|V|VRAI|T|TRUE|ON) return 0;; - esac - isnum "$1" && [ "$1" -ne 0 ] && return 0 - case "$(strlower "$1")" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - esac - return 1 - } - function is_no() { - case "$1" in - n|non|no|f|faux|false|off) return 0;; - N|NON|NO|F|FAUX|FALSE|OFF) return 0;; - esac - isnum "$1" && [ "$1" -eq 0 ] && return 0 - case "$(strlower "$1")" in - n|non|no|f|faux|false|off) return 0;; - esac - return 1 - } -fi -##@inc]base.compat -uprovide base -urequire base.init base.core base.string base.num base.bool base.array base.quote base.split base.args base.tools base.compat - -UNAME_SYSTEM=`uname -s` -[ "${UNAME_SYSTEM#CYGWIN}" != "$UNAME_SYSTEM" ] && UNAME_SYSTEM=Cygwin -[ "${UNAME_SYSTEM#MINGW32}" != "$UNAME_SYSTEM" ] && UNAME_SYSTEM=Mingw -UNAME_MACHINE=`uname -m` -if [ -n "$UTOOLS_CHROOT" ]; then - [ -n "$UTOOLS_UNAME_SYSTEM" ] && eval "UNAME_SYSTEM=$UTOOLS_UNAME_SYSTEM" - [ -n "$UTOOLS_UNAME_MACHINE" ] && eval "UNAME_MACHINE=$UTOOLS_UNAME_MACHINE" -fi - -function setyesval() { - is_yes "$2" && set_var "$1" 1 || set_var "$1" "" -} -function normyesval() { - is_yes "${2:-"${!1}"}" && set_var "$1" 1 || set_var "$1" "" -} -function normyesvals() { - local __nyv_yesvar - for __nyv_yesvar in "$@"; do - is_yes "${!__nyv_yesvar}" && set_var "$__nyv_yesvar" 1 || set_var "$__nyv_yesvar" "" - done -} -function quote_in() { - sed 's/\\/\\\\/g -s/"/\\"/g -s/\$/\\$/g -s/`/\\`/g' -} -function quote_sin() { - sed "s/'/'\\\\''/g" -} -function quote_sarg() { - quote_sin <<<"$1" -} -function quoted_sarg() { - echo "'$(quote_sarg "$1")'" -} -function quoted_sargs() { - local a s - for a in "$@"; do - s="${s:+$s }$(quoted_sarg "$a")" - done - rawecho "$s" -} - -function set_array_cmd() { - [ $# -eq 1 ] && set -- "$1" "$1" - local __sac_s __sac_v __sac_f - __sac_s="$1=("; shift - if [ "$1" == "@" ]; then - shift - else - eval "set -- \"\${$1[@]}\"" - fi - __sac_f=1 - for __sac_v in "$@"; do - [ -n "$__sac_f" ] && __sac_f= || __sac_s="$__sac_s " - __sac_s="$__sac_s$(quoted_arg "$__sac_v")" - done - __sac_s="$__sac_s)" - echo "$__sac_s" -} -function set_array() { - eval "$(set_array_cmd "$@")" -} -function array_count() { - eval "echo \${#$1[*]}" -} -function array_isempty() { - [ $(array_count "$1") -eq 0 ] -} -function array_new() { - eval "$1=()" -} -function array_add() { - local __aa_a="$1"; shift - eval "$__aa_a=(\"\${$__aa_a[@]}\" \"\$@\")" -} -function array_ins() { - local __aa_a="$1"; shift - eval "$__aa_a=(\"\$@\" \"\${$__aa_a[@]}\")" -} -function array_del() { - local __ad_v - local -a __ad_vs - eval 'for __ad_v in "${'"$1"'[@]}"; do - if [ "$__ad_v" != '"$(quoted_arg "$2")"' ]; then - array_add __ad_vs "$__ad_v" - fi -done' - array_copy "$1" __ad_vs -} -function array_addu() { - local __as_v - eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then - return 1 - fi -done' - array_add "$1" "$2" - return 0 -} -function array_set() { - array_addu "$@" -} -function array_insu() { - local __as_v - eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then - return 1 - fi -done' - array_ins "$1" "$2" - return 0 -} -function array_fillrange() { - local -a __af_vs - local __af_i="${2:-1}" __af_to="${3:-10}" __af_step="${4:-1}" - while [ "$__af_i" -le "$__af_to" ]; do - __af_vs=("${__af_vs[@]}" "$__af_i") - __af_i=$(($__af_i + $__af_step)) - done - array_copy "$1" __af_vs -} -function array_eq() { - local -a __ae_a1 __ae_a2 - array_copy __ae_a1 "$1" - array_copy __ae_a2 "$2" - [ ${#__ae_a1[*]} -eq ${#__ae_a2[*]} ] || return 1 - local __ae_v __ae_i=0 - for __ae_v in "${__ae_a1[@]}"; do - [ "$__ae_v" == "${__ae_a2[$__ae_i]}" ] || return 1 - __ae_i=$(($__ae_i + 1)) - done - return 0 -} -function array_contains() { - local __ac_v - eval 'for __ac_v in "${'"$1"'[@]}"; do - if [ "$__ac_v" == '"$(quoted_arg "$2")"' ]; then - return 0 - fi -done' - return 1 -} -function array_find() { - local __af_i __af_v - __af_i=0 - eval 'for __af_v in "${'"$1"'[@]}"; do - if [ "$__af_v" == '"$(quoted_arg "$2")"' ]; then - if [ -n "$3" ]; then - echo "${'"$3"'[$__af_i]}" - else - echo "$__af_i" - fi - return 0 - fi - __af_i=$(($__af_i + 1)) -done' - return 1 -} -function array_reverse() { - local -a __ar_vs - local __ar_v - array_copy __ar_vs "$1" - array_new "$1" - for __ar_v in "${__ar_vs[@]}"; do - array_ins "$1" "$__ar_v" - done -} - -function array_replace() { - local __ar_sn="$1"; shift - local __ar_f="$1"; shift - local -a __ar_s __ar_d - local __ar_v - array_copy __ar_s "$__ar_sn" - for __ar_v in "${__ar_s[@]}"; do - if [ "$__ar_v" == "$__ar_f" ]; then - __ar_d=("${__ar_d[@]}" "$@") - else - __ar_d=("${__ar_d[@]}" "$__ar_v") - fi - done - array_copy "$__ar_sn" __ar_d -} -function array_each() { - local __ae_an="$1"; shift - local __ae_f="$1"; shift - local -a __ae_a - local __ae_v - array_copy __ae_a "$__ae_an" - for __ae_v in "${__ae_a[@]}"; do - "$__ae_f" "$__ae_v" "$@" - done -} -function array_map() { - local __am_an="$1"; shift - local __am_f="$1"; shift - local -a __am_a __am_vs - local __am_v - array_copy __am_a "$__am_an" - for __am_v in "${__am_a[@]}"; do - __am_vs=("${__am_vs[@]}" "$("$__am_f" "$__am_v" "$@")") - done - array_copy "$__am_an" __am_vs -} -function first_value() { - eval "rawecho \"\${$1[@]:0:1}\"" -} -function last_value() { - eval "rawecho \"\${$1[@]:\$((-1)):1}\"" -} -function array_copy() { - eval "$1=(\"\${$2[@]}\")" -} -function array_copy_firsts() { - eval "$1=(\"\${${2:-$1}[@]:0:\$((\${#${2:-$1}[@]}-1))}\")" -} -function array_del_last() { - array_copy_firsts "$1" -} -function array_copy_lasts() { - eval "$1=(\"\${${2:-$1}[@]:1}\")" -} -function array_del_first() { - array_copy_lasts "$1" -} -function array_extend() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]}\")" -} -function array_extendu() { - local __ae_v __ae_s=1 - eval 'for __ae_v in "${'"$2"'[@]}"; do - array_addu "$1" "$__ae_v" && __ae_s=0 -done' - return "$__ae_s" -} -function array_extend_firsts() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]:0:\$((\${#$2[@]}-1))}\")" -} -function array_extend_lasts() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]:1}\")" -} -function array_xsplit() { - eval "$1=($(recho_ "$2" | awkrun RS="${3:-:}" ' -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_split() { - eval "$1=($(recho_ "$2" | awkrun RS="${3:-:}" ' -/^$/ { next } -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_from_path() { - array_split "$1" "$2" ":" -} -function array_from_xlines() { - eval "$1=($(recho_ "$2" | _nl2lf | awk ' -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_from_lines() { - eval "$1=($(recho_ "$2" | _nl2lf | awk ' -/^$/ { next } -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_join() { - local __aj_an __aj_l __aj_j __aj_s="${2:-,}" __aj_pf __aj_sf - if [ "$1" == "@" ]; then - __aj_an="\$@" - shift; shift - else - __aj_an="\${$1[@]}" - __aj_pf="$4" - __aj_sf="$5" - fi - eval 'for __aj_l in "'"$__aj_an"'"; do - __aj_j="${__aj_j:+$__aj_j'"$__aj_s"'}$__aj_pf$__aj_l$__aj_sf" -done' - if [ -n "$__aj_j" ]; then - rawecho "$__aj_j" - elif [ "$__aj_an" != "\$@" -a -n "$3" ]; then - rawecho "$3" - fi -} -function array_mapjoin() { - local __amj_src="$1" __amj_func="$2" __amj_sep="$3" - shift; shift; shift - if [ "$__amj_src" == "@" ]; then - local -a __amj_tmpsrc - __amj_tmpsrc=("$@") - __amj_src=__amj_tmpsrc - set -- - fi - local -a __amj_tmp - array_copy __amj_tmp "$__amj_src" - array_map __amj_tmp "$__amj_func" - array_join __amj_tmp "$__amj_sep" "$@" -} -function array_to_lines() { - array_join "$1" " -" "$2" "$3" "$4" -} -function array_to_path() { - array_join "$1" ":" "$2" "$3" "$4" -} -function array_fix_paths() { - local __afp_an="$1" __afp_s="${2:-:}" - local -a __afp_vs - local __afp_v - array_copy __afp_vs "$__afp_an" - array_new "$__afp_an" - for __afp_v in "${__afp_vs[@]}"; do - array_split __afp_v "$__afp_v" "$__afp_s" - array_extend "$__afp_an" __afp_v - done -} - - -function get_date_rfc822() { - LC_TIME=C date +"%a, %d %b %Y %H:%M:%S %Z" -} -function get_date_fr() { - LC_TIME=C date +"%d/%m/%Y" -} -function get_time_fr() { - LC_TIME=C date +"%Hh%M" -} -function parse_date() { - local value="$1" type="${2:-date}" - local now="$(awk 'BEGIN { print mktime(strftime("%Y %m %d 00 00 00 +0400")) }')" - case "$value" in - +*) - value="$(($now + ${value#+} * 86400))" - ;; - *) - value="$(<<<"$value" awk -F/ '{ - nd = strftime("%d"); nm = strftime("%m"); ny = strftime("%Y") - d = $1 + 0; if (d < 1) d = nd; - m = $2 + 0; if (m < 1) m = nm; - if ($3 == "") y = ny; - else { y = $3 + 0; if (y < 100) y = y + 2000; } - print mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d)); - }')" - esac - case "$type" in - d|date) awk '{ print strftime("%d/%m/%Y", $0 + 0) }' <<<"$value";; - l|ldap) awk '{ print strftime("%Y%m%d%H%M%S+0400", $0 + 0) }' <<<"$value";; - m|mysql) awk '{ print strftime("%Y-%m-%d", $0 + 0) }' <<<"$value";; - *) - rawecho "$value" - ;; - esac -} - - -function udelpath() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; ${2:-PATH}"'="${'"${2:-PATH}"'#$1:}"; '"${2:-PATH}"'="${'"${2:-PATH}"'%:$1}"; '"${2:-PATH}"'="${'"${2:-PATH}"'//:$_qdir:/:}"; [ "$'"${2:-PATH}"'" == "$1" ] && '"${2:-PATH}"'=' -} -function uaddpath() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="${'"${2:-PATH}"':+$'"${2:-PATH}"':}$1"' -} -function uinspathm() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="$1${'"${2:-PATH}"':+:$'"${2:-PATH}"'}"' -} -function uinspath() { - udelpath "$@" - uinspathm "$@" -} - -function withpath() { - [ "${1#./}" != "$1" -o "${1#../}" != "$1" -o "${1#/}" != "$1" ] -} -function withext() { - local basename="$(basename -- "$1")" - [ "${basename%.*}" != "$basename" ] -} -function normpath() { - local -a parts - local part ap - array_split parts "$1" / - if [ "${1#/}" != "$1" ]; then - ap=/ - elif [ -n "$2" ]; then - ap="$2" - else - ap="$(pwd)" - fi - for part in "${parts[@]}"; do - if [ "$part" == "." ]; then - continue - elif [ "$part" == ".." ]; then - ap="${ap%/*}" - [ -n "$ap" ] || ap=/ - else - [ "$ap" != "/" ] && ap="$ap/" - ap="$ap$part" - fi - done - rawecho "$ap" -} -function abspath() { - local ap="$1" - if [ "${ap#/}" != "$ap" ]; then - __normpath "$ap" && return - else - local cwd - if [ -n "$2" ]; then - cwd="$(abspath "$2")" - else - cwd="$(pwd)" - fi - ap="$cwd/$ap" - __normpath "$ap" && return - fi - normpath "$ap" -} -function __normpath() { - if [ -d "$1" ]; then - if [ -x "$1" ]; then - (cd "$1"; pwd) - return 0 - fi - elif [ -f "$1" ]; then - local dn="$(dirname -- "$1")" bn="$(basename -- "$1")" - if [ -x "$dn" ]; then - (cd "$dn"; echo "$(pwd)/$bn") - return 0 - fi - fi - return 1 -} -function parentdirs() { - array_new "$1" - local __pd_d="$(abspath "$2")" - if [[ "$3" == r* ]]; then - while [ "$__pd_d" != "/" ]; do - array_ins "$1" "$__pd_d" - __pd_d="$(dirname "$__pd_d")" - done - else - while [ "$__pd_d" != "/" ]; do - array_add "$1" "$__pd_d" - __pd_d="$(dirname "$__pd_d")" - done - fi -} -function ppath() { - local path="$1" cwd="$2" - - path="$(abspath "$path")" # essayer de normaliser le chemin - [ -n "$cwd" ] || cwd="$(pwd)" - - [ "$path" = "$cwd" ] && path="." - [ "$cwd" != "/" -a "$cwd" != "$HOME" ] && path="${path/#$cwd\//}" - path="${path/#$HOME/~}" - - rawecho "$path" -} -function relpath() { - local p="$(abspath "$1" "$3")" cwd="$2" - if [ -z "$cwd" ]; then - cwd="$(pwd)" - else - cwd="$(abspath "$cwd" "$3")" - fi - if [ "$p" == "$cwd" ]; then - echo "" - elif [ "${p#$cwd/}" != "$p" ]; then - rawecho "${p#$cwd/}" - else - local rp - while [ -n "$cwd" -a "${p#$cwd/}" == "$p" ]; do - rp="${rp:+$rp/}.." - cwd="${cwd%/*}" - done - rp="$rp/${p#$cwd/}" - echo "${rp%//}" - fi -} -function relpathx() { - local p="$(relpath "$@")" - if [ -z "$p" ]; then - echo . - elif [ "${p#../}" != "$p" -o "${p#./}" != "$p" ]; then - echo "$p" - else - echo "./$p" - fi -} -function withinpath() { - local b="$1" p="$2" strict="${3:-N}" - b="$(abspath "$b")" - p="$(abspath "$p")" - if is_yes "$strict"; then - [ "${p#$b/}" != "$p" ] - else - [ "$p" == "$b" -o "${p#$b/}" != "$p" ] - fi -} -function safe_abspath() { - local p="$1" ba="$2" br="$3" - if [ -n "$ba" ]; then - ba="$(abspath "$ba")" - else - ba="$(pwd)" - fi - [ -n "$br" ] || br="$ba" - br="$(abspath "$br" "$ba")" - p="$(abspath "$p" "$ba")" - if [ "$p" == "$br" -o "${p#$br/}" != "$p" ]; then - echo "$p" - else - return 1 - fi -} -function safe_relpath() { - local p - if p="$(safe_abspath "$1" "$2" "$3")"; then - relpath "$p" "$2" "$(pwd)" - else - return 1 - fi -} -function splitwcs() { - local __sw_p="$1" - local __sw_dd="${2:-basedir}" __sw_df="${3:-filespec}" __sw_part __sw_d __sw_f - local -a __sw_parts - array_split __sw_parts "$__sw_p" "/" - for __sw_part in "${__sw_parts[@]}"; do - if [[ "$__sw_part" == *\** ]] || [[ "$__sw_part" == *\?* ]] || [ -n "$__sw_f" ]; then - __sw_f="${__sw_f:+$__sw_f/}$__sw_part" - else - __sw_d="${__sw_d:+$__sw_d/}$__sw_part" - fi - done - [ "${__sw_p#/}" != "$__sw_p" ] && __sw_d="/$__sw_d" - set_var "$__sw_dd" "$__sw_d" - set_var "$__sw_df" "$__sw_f" -} -function deref() { - local OENC="$UTF8" - - local max_deref=50 - local file="$1" - local basedir link - while [ -L "$file" ]; do - basedir="$(dirname "$file")" - link="$(readlink "$file")" - if first_char_is "$link" "/"; then - file="$link" - else - file="$basedir/$link" - fi - - max_deref=$(($max_deref - 1)) - [ $max_deref -eq 0 ] && die "Plus de 50 indirection. Le lien $file est-il récursif?" - done - abspath "$file" -} -function readlinka() { - if [ -L "$1" ]; then - local linkdir="$(dirname -- "$1")" - abspath "$(readlink "$1")" "$linkdir" - else - abspath "$1" - fi -} -function readlinkm() { - readlink -m "$1" -} -function path_if_test() { - local op="$1"; shift - local file="$1"; shift - local rel="$1" reldir=; shift - if beginswith "$rel" relative; then - reldir="${rel#relative}" - if beginswith "$reldir" :; then - reldir="${reldir#:}" - if [ -n "$reldir" ]; then - reldir="${reldir}/" - fi - else - reldir= - fi - else - rel= - fi - - while [ -n "$1" ]; do - local basedir="$1" - if [ $op "$basedir/$file" ]; then - if [ -n "$rel" ]; then - rawecho "$reldir$file" - else - rawecho "$basedir/$file" - fi - break - fi - shift - done -} -function update_link() { - [ -L "$2" ] || return 1 - local dest link="$2" - local linkdir="$(dirname "$link")" - local ldest="$(readlink "$link")" - if [ "${ldest#/}" != "$ldest" ]; then - dest="$(abspath "$1")" - else - dest="$(relpath "$1" "$linkdir")" - fi - if [ "$dest" == "$ldest" ]; then - : # pas besoin de mettre à jour - elif [ -d "$link" ]; then - rm -f "$link" && ln -s "$dest" "$link" - else - ln -sf "$dest" "$link" - fi -} -function update_links() { - [ -n "$1" ] || return 1 - local dest="$1"; shift - local r=0 link - for link in "$@"; do - update_link "$dest" "$link" || r=$? - done - return $r -} -function move_link() { - [ -n "$1" -a -n "$2" ] || return 1 - local link="$1" dest="$2" - [ -d "$dest" ] && dest="$dest/$(basename -- "$link")" - dest="$(abspath "$dest")" - if [ -L "$link" ]; then - link="$(abspath "$link")" - [ "$dest" == "$link" ] && return 0 - ldest="$(readlinka "$link")" - mv "$link" "$dest" || return 1 - update_link "$ldest" "$dest" - else - [ "$dest" == "$link" ] && return 0 - mv "$link" "$dest" - fi -} -function array_find_links() { - local -a __afl_links __afl_result - local __afl_dir="${3:-.}" - local __afl_dest __afl_destname __afl_link __afl_linkdir __afl_ldest - __afl_dest="$(abspath "$2")" - __afl_destname="${__afl_dest##*/}" - array_from_lines __afl_links "$(find "$__afl_dir" -type l)" - for __afl_link in "${__afl_links[@]}"; do - __afl_ldest="$(readlink "$__afl_link")" - if [ "$__afl_ldest" != "$__afl_destname" ]; then - [[ "$__afl_ldest" == */"$__afl_destname" ]] || continue - fi - __afl_link="$(abspath "$__afl_link" "$__afl_dir")" - __afl_linkdir="$(dirname -- "$__afl_link")" - __afl_ldest="$(abspath "$__afl_ldest" "$__afl_linkdir")" - if [ "$__afl_ldest" == "$__afl_dest" ]; then - array_add __afl_result "$__afl_link" - fi - done - array_copy "$1" __afl_result -} -function list_links() { - local -a links - array_find_links links "$@" - array_to_lines links -} -function move_file() { - [ -n "$1" -a -n "$2" ] || return 1 - local src="$1" dest="$2" link - shift; shift - [ -d "$dest" ] && dest="$dest/$(basename -- "$src")" - move_link "$src" "$dest" || return 1 - update_links "$dest" "$@" -} - -function get_nblines() { - [ -f "$1" ] && sed -ne '$=' "$1" || echo 0 -} -function mktempf() { - mktemp "${1:-"$TMPDIR/tmp.XXXXXX"}" -} -function mktempd() { - mktemp -d "${1:-"$TMPDIR/tmp.XXXXXX"}" -} -function mkdirof() { - mkdir -p "$(dirname -- "$1")" -} -function cp_a() { - /bin/cp -a "$@" -} -function cp_R() { - /bin/cp -pR "$@" -} -function quietgrep() { - grep -q "$@" 2>/dev/null -} -function quietdiff() { - diff -q "$@" >&/dev/null -} -function testsame() { - quietdiff "$@" -} -function testdiff() { - ! quietdiff "$@" -} -function testupdated() { - if [ -f "$2" ]; then - testdiff "$1" "$2" - else - return 0 - fi -} -function testnewer() { - test ! -e "$2" -o "$1" -nt "$2" -} -function ps_all() { - ps -axww -} -function progexists() { - test -n "$1" -a -x "$(which "$1" 2>/dev/null)" -} -function has_python() { - progexists python -} -function has_gawk() { - progexists gawk -} -function is_root() { - test `id -u` -eq 0 -} -function source_ifexists() { - if [ -f "$1" ]; then source "$1" || die; fi -} -function little_sleep { - LC_NUMERIC=C sleep 0.1 -} -function random_sleep { - sleep $(($RANDOM % ${1:-1800})) -} -function is_running() { - kill -0 "$1" >&/dev/null -} -function sedi() { - sed -i "$@" -} -function csort() { - LANG=C sort "$@" -} -function lsort() { sort "$@"; } -function cgrep() { - LANG=C grep "$@" -} -function lgrep() { grep "$@"; } -function csed() { - LANG=C sed "$@" -} -function lsed() { sed "$@"; } -function cawk() { - LANG=C awk "$@" -} -function lawk() { awk "$@"; } -function cdiff() { - LANG=C diff "$@" -} -function ldiff() { diff "$@"; } - - -function fix_mode() { - local file="$1" - [ -f "$file" ] || touch "$file" || return 1 - if [ ! -w "$file" ]; then - local mode="$(stat -c %a "$file")" - chmod ${mode:0:${#mode}-3}6${mode:${#mode}-2:2} "$file" - echo "$mode" - fi -} -function unfix_mode() { - [ -n "$2" ] && chmod "$2" "$1" -} -function get_mode() { - [ -f "$1" ] || touch "$1" || return 1 - stat -c %a "$1" -} -function rm_maybe() { - local parse_opts=1 arg rm - for arg in "$@"; do - if [ -n "$parse_opts" ]; then - if [ "$arg" == "--" ]; then - parse_opts= - elif [[ "$arg" == "-*" ]]; then - continue - elif [ -n "$arg" ]; then - rm=1 - break - fi - elif [ -n "$arg" ]; then - rm=1 - break - fi - done - [ -n "$rm" ] && /bin/rm "$@" -} -__CPDIR_RSYNC_SLOW=1 # synchro potentiellement plus lente, mais plus fidèle (option -c) -__CPDIR_RSYNC_ARGS=(-q) -function cpdir() { - - if progexists rsync; then - [ -d "$2" ] || mkdir -p "$2" || return 1 - if [ -d "$1" ]; then - rsync -a ${__CPDIR_RSYNC_SLOW:+-c} "${__CPDIR_RSYNC_ARGS[@]}" "$1/" "$2/" - else - rsync -a ${__CPDIR_RSYNC_SLOW:+-c} "${__CPDIR_RSYNC_ARGS[@]}" "$1" "$2/" - fi - else - __cpdir "$@" - fi -} -function __cpdir() { - local src="$1" dest="$2" method="${3:-cp_a}" - - if [ -d "$src" ]; then - [ -d "$dest" ] || mkdir -p "$dest" || return 1 - - local prevdir="$(pwd)" - - dest="$(abspath "$dest")" - cd "$src" - if [ -n "$(/bin/ls -a1)" ]; then - [ -n "$(/bin/ls -1)" ] && "$method" * "$dest" - local i - for i in .*; do - [ "$i" == "." -o "$i" == ".." ] && continue - "$method" "$i" "$dest" - done - fi - cd "$prevdir" - else - if [ -f "$dest" ]; then - "$method" "$src" "$dest" - elif [ -d "$dest" ]; then - "$method" "$src" "$dest" - else - mkdir -p "$dest" - "$method" "$src" "$dest" - fi - fi -} -__CPNOVCS_RSYNC_SLOW=1 # synchro potentiellement plus lente, mais plus fidèle (option -c) -__CPNOVCS_RSYNC_ARGS=(-q) -function cpnovcs() { - local src="$1" destdir="$2" - [ -d "$destdir" ] || mkdir -p "$destdir" || return 1 - if progexists rsync; then - local gitexclude=/.git/ - if [ "${src%/}" == "$src" ]; then - gitexclude="/$(basename -- "$src")$gitexclude" - fi - rsync -a ${__CPNOVCS_RSYNC_SLOW:+-c} --exclude CVS/ --exclude .svn/ --exclude "$gitexclude" "${__CPNOVCS_RSYNC_ARGS[@]}" "$src" "$destdir/" - elif [ "${src%/}" != "$src" ]; then - __cpdir "$src" "$destdir" - else - local srcname="$(basename -- "$src")" - mkdir -p "$destdir/$srcname" - __cpdir "$src" "$destdir/$srcname" - fi -} -function cpdirnovcs() { - if [ -d "$1" ]; then - cpnovcs "$1/" "$2" - else - cpnovcs "$1" "$2" - fi -} -function doinplace() { - if [ -n "$1" -a "$1" != "-" ]; then - local __dip_file="$1"; shift - autoclean "$__dip_file.tmp.$$" - "$@" <"$__dip_file" >"$__dip_file.tmp.$$" - local s=$? - [ "$s" == 0 ] && /bin/cat "$__dip_file.tmp.$$" >"$__dip_file" - /bin/rm -f "$__dip_file.tmp.$$" - return $s - else - shift - "$@" - fi -} -function doinplacef() { - if [ -n "$1" -a "$1" != "-" ]; then - local __dip_file="$1"; shift - autoclean "$__dip_file.tmp.$$" - "$@" <"$__dip_file" >"$__dip_file.tmp.$$" - local s=$? - /bin/cat "$__dip_file.tmp.$$" >"$__dip_file" - /bin/rm -f "$__dip_file.tmp.$$" - return $s - else - shift - "$@" - fi -} -function stripnl() { - tr -d '\r\n' -} -function _nl2lf() { - awk 'BEGIN {RS="\r|\r\n|\n"} {print}' -} -function nl2lf() { - doinplace "$1" _nl2lf -} -function _nl2crlf() { - awk 'BEGIN {RS="\r|\r\n|\n"} {print $0 "\r"}' -} -function nl2crlf() { - doinplace "$1" _nl2crlf -} -function _nl2cr() { - awk 'BEGIN {RS="\r|\r\n|\n"; ORS=""} {print $0 "\r"}' -} -function nl2cr() { - doinplace "$1" _nl2cr -} -function _latin1compat() { - LANG=fr_FR.UTF-8 sed $' -s/[‘’]/\x27/g -s/[«»“”]/"/g -s/[\xC2\xA0\xE2\x80\x87\xE2\x80\xAF\xE2\x81\xA0]/ /g -' -} -function _noaccents() { - LANG=fr_FR.UTF-8 sed ' -s/[à]/a/g -s/[éèêë]/e/g -s/[ïî]/i/g -s/[ôö]/o/g -s/[üû]/u/g -s/[ç]/c/g -s/[À]/A/g -s/[ÉÈÊË]/E/g -s/[ÏÎ]/I/g -s/[ÔÖ]/O/g -s/[ÜÛ]/U/g -s/[Ç]/C/g -' -} -function list_all() { - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ "$f" == "." -o "$f" == ".." ] && continue - rawecho "$f" - done - cd "$curdir" -} -function __la_cmd() { - [ $# -gt 0 ] || set '*' - local arg - local cmd="/bin/ls -1d" - for arg in "$@"; do - arg="$(_rval "$arg")" - cmd="$cmd $arg" - done - cmd="$cmd 2>/dev/null" - echo "$cmd" -} -function list_files() { - local f - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ -f "$f" ] && rawecho "$f" - done - cd "$curdir" -} -function list_dirs() { - local f - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ "$f" == "." -o "$f" == ".." ] && continue - [ -d "$f" ] && rawecho "$f" - done - cd "$curdir" -} -function __array_ls() { - local __al_l="list_${1:-all}"; shift - local __al_an="$1"; shift - local __al_d="${1:-.}"; shift - local -a __al_fs - array_from_lines __al_fs "$("$__al_l" "$__al_d" "$@")" - local __al_f - array_new "$__al_an" - for __al_f in "${__al_fs[@]}"; do - array_add "$__al_an" "$__al_d/$__al_f" - done -} -function array_lsall() { - __array_ls all "$@" -} -function array_lsdirs() { - __array_ls dirs "$@" -} -function array_lsfiles() { - __array_ls files "$@" -} -function filter_empty() { - sed '/^$/d' -} -function filter_vcspath() { - sed ' -/^.git$/d -/^.git\//d -/\/.git$/d -/\/.git\//d -/^.svn$/d -/^.svn\//d -/\/.svn$/d -/\/.svn\//d -' -} -function merge_contlines() { - awk 'substr($0, length($0)) == "\\" { - while (getline nextline) { - $0 = substr($0, 1, length($0) - 1) nextline - if (substr($0, length($0)) != "\\") break - } - print - next -} -{print}' -} -function filter_comment() { - local -a merge - [ "$1" == -m ] && merge=(merge_contlines) || merge=(cat) - awk ' - /^[ \t]*#/ { next } - /^[ \t]*$/ { next } - { print }' | "${merge[@]}" -} -function filter_conf() { - local -a merge - [ "$1" == -m ] && merge=(merge_contlines) || merge=(cat) - grep -v '^#' | grep -v '^$' | "${merge[@]}" -} -function is_archive() { - local name="${1%.zip}" - name="${name%.tgz}" - name="${name%.tbz2}" - name="${name%.tar.gz}" - name="${name%.tar.bz2}" - name="${name%.tar}" - name="${name%.jar}" - name="${name%.war}" - name="${name%.ear}" - [ "$name" != "$1" ] -} -function extract_archive() { - local arch="$1" destdir="${2:-.}" - shift; shift - if endswith "$arch" .zip; then - unzip -q -d "$destdir" "$arch" "$@" || return - elif endswith "$arch" .tgz || endswith "$arch" .tar.gz; then - tar xzf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .tbz2 || endswith "$arch" .tar.bz2; then - tar xjf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .tar; then - tar xf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .jar || endswith "$arch" .war || endswith "$arch" .ear; then - ( - arch="$(abspath "$arch")" - cd "$destdir" - jar xf "$arch" "$@" - ) || return - else - return 1 - fi -} -function get_archive_basename() { - local basename="$(basename -- "$1")" - basename="${basename%.zip}" - basename="${basename%.tgz}" - basename="${basename%.tbz2}" - basename="${basename%.gz}" - basename="${basename%.bz2}" - basename="${basename%.tar}" - basename="${basename%.jar}" - basename="${basename%.war}" - basename="${basename%.ear}" - echo "$basename" -} -function get_archive_appname() { - local appname="$(basename -- "$1")" - appname="${appname%.zip}" - appname="${appname%.tgz}" - appname="${appname%.tbz2}" - appname="${appname%.gz}" - appname="${appname%.bz2}" - appname="${appname%.tar}" - appname="${appname%.jar}" - appname="${appname%.war}" - appname="${appname%.ear}" - echo "$appname" | awk '{ - if (match($0, /[-_.]([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/)) { - print substr($0, 1, RSTART - 1) - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/)) { - print substr($0, 1, RSTART - 1) - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print substr($0, 1, RSTART - 1) - } else { - print $0 - } -}' -} -function get_archive_versionsuffix() { - local basename="$(get_archive_basename "$1")" - echo "$basename" | awk '{ - if (match($0, /([-_.][0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print vs["1"] - } -}' -} -function get_archive_version() { - local basename="$(get_archive_basename "$1")" - echo "$basename" | awk '{ - if (match($0, /[-_.]([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print vs["1"] - } -}' -} -function __dump_usernames() { - = 500 && $6 ~ /^\/home\// { print $1 }' -} -function dump_usernames() { - array_from_lines "${1:-usernames}" "$(__dump_usernames)" -} -function __resolv_ips() { - LANG=C host "$1" 2>/dev/null | awk '/address / { gsub(/^.*address /, ""); print }' -} -function resolv_ips() { - array_from_lines "${1:-ips}" "$(__resolv_ips "$2")" -} -function __resolv_hosts() { - LANG=C host "$1" 2>/dev/null | awk '/domain name pointer / { gsub(/^.*domain name pointer /, ""); gsub(/\.$/, ""); print }' -} -function resolv_hosts() { - array_from_lines "${1:-hosts}" "$(__resolv_hosts "$2")" -} -function runscript_as() { - local OENC="$UTF8" - local user="${1:-root}"; shift - local exec_maybe= - if [ "$1" = "exec" ]; then - exec_maybe=exec - shift - fi - - local cmd - cmd="\ -__estack=$(quoted_arg "$__estack") -__tlevel=$(quoted_args "$__tlevel") -export __estack __tlevel -exec ${BASH:-/bin/sh} $(quoted_args "$@")" - - if is_yes "$UTOOLS_USES_SU" || ! progexists sudo; then - eecho "Entrez le mot de passe de root" - $exec_maybe su "$user" -c "$cmd" - else - if [ "$user" == "root" ]; then - $exec_maybe sudo -p "Entrez le mot de passe de %u: " "${BASH:-/bin/sh}" -c "$cmd" - else - $exec_maybe sudo -p "Entrez le mot de passe de %u: " su "$user" -c "$cmd" - fi - fi -} -function runscript_as_root() { - if is_root; then - local exec_maybe= - if [ "$1" = "exec" ]; then - exec_maybe=exec - shift - fi - $exec_maybe "${BASH:-/bin/sh}" "$@" - else - runscript_as root "$@" - fi -} -function run_as() { - local user="${1:-root}"; shift - local exec_maybe=exec - if [ "$1" = "--noexec" ]; then - exec_maybe= - shift - fi - - runscript_as "$user" $exec_maybe "$0" "$@" -} -function run_as_root() { - is_root || run_as root "$@" -} -function check_user() { - local user - for user in "$@"; do - [ "$USER" == "$user" ] && return 0 - done - return 1 -} -function ensure_user() { - local -a users - while [ $# -gt 0 -a "$1" != "--" ]; do - array_add users "$1" - shift - done - [ "$1" == "--" ] && shift - - if ! check_user "${users[@]}"; then - if [ ${#users[*]} -gt 1 ]; then - ewarn "Cette commande doit être lancée avec l'un des users ${users[*]}" - else - ewarn "Cette commande doit être lancée avec le user ${users[0]}" - fi - if ask_yesno "Voulez-vous tenter de relancer la commande avec le bon user?" O; then - estep "Lancement du script avec le user ${users[0]}" - run_as "${users[0]}" "$@" - return 1 - elif is_root; then - return 11 - else - return 10 - fi - fi - return 0 -} -function check_hostname() { - local userhost user host path - for userhost in "$@"; do - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - [ "$MYHOSTNAME" == "${host%%.*}" ] && return 0 - done - return 1 -} -function check_userhostname() { - local userhost path user host - for userhost in "$@"; do - if check_hostname "$userhost"; then - [[ "$userhost" == *@* ]] || return 0 - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - check_user "$user" && return 0 - fi - done - return 1 -} -UTOOLS_ENSURE_HOSTNAME_SSH_OPTS=() -function ensure_hostname() { - local -a userhosts - while [ $# -gt 0 -a "$1" != "--" ]; do - array_add userhosts "$1" - shift - done - [ "$1" == "--" ] && shift - - local userhost user host path - if ! check_hostname "${userhosts[@]}"; then - if [ ${#userhosts[*]} -gt 1 ]; then - ewarn "Cette commande n'est valide que sur l'un des hôtes ${userhosts[*]}" - else - ewarn "Cette commande n'est valide que sur l'hôte ${userhosts[0]}" - fi - - enote "Vous pouvez tenter de relancer le script sur ${userhosts[0]}, mais cela requière que ce script ET les données dont il a besoin soient installés dans la même version et dans le même répertoire sur l'hôte distant" - if ask_yesno "Voulez-vous tenter de relancer le script sur l'hôte distant?" N; then - splitfsep "${userhosts[0]}" : userhost path - splituserhost "$userhost" user host - [ -n "$user" ] || user=root - - estep "Lancement de la commande sur l'hôte distant $user@$host" - local cmd - [ -n "$path" ] && cmd="$(quoted_args cd "$path"); " - cmd="$cmd$(quoted_args "$script" "$@")" - ssh -qt "${UTOOLS_ENSURE_HOSTNAME_SSH_OPTS[@]}" "$user@$host" "$cmd" - [ $? -eq 255 ] && return 12 - return 1 - else - return 11 - fi - fi - local userhost user host - for userhost in "${userhosts[@]}"; do - [[ "$userhost" == *@* ]] || continue - if check_hostname "$userhost"; then - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - [ -n "$path" ] && cd "$path" - ensure_user "$user" -- "$@" - return $? - fi - done - return 0 -} - -__AWKDEF_FUNCTIONS=' -function quote_html(s) { - gsub(/&/, "\\&", s) - gsub(/"/, "\\"", s) - gsub(/>/, "\\>", s) - gsub(/", s) - gsub(/"/, "\"", s) - gsub(/&/, "\\&", s) - return s -} -function quote_value(s) {'" - gsub(/'/, \"'\\\\''\", s) - return \"'\" s \"'\" -"'} -function quoted_values( i, line) { - line = "" - for (i = 1; i <= NF; i++) { - if (i > 1) line = line " " - line = line quote_value($i) - } - return line -} -function quote_subrepl(s) { - gsub(/\\/, "\\\\", s) - gsub(/&/, "\\\\&", s) - return s -} -function quote_grep(s) { - gsub(/[[\\.^$*]/, "\\\\&", s) - return s -} -function quote_egrep(s) { - gsub(/[[\\.^$*+?()|{]/, "\\\\&", s) - return s -} -function quote_sql(s) {'" - gsub(/'/, \"''\", s) - return \"'\" s \"'\" -"'} -function unquote_mysqlcsv(s) { - gsub(/\\n/, "\n", s) - gsub(/\\t/, "\t", s) - gsub(/\\0/, "\0", s) - gsub(/\\\\/, "\\", s) - return s -} -function array_new(dest) { - dest[0] = 0 # forcer awk à considérer dest comme un tableau - delete dest -} -function array_newsize(dest, size, i) { - dest[0] = 0 # forcer awk à considérer dest comme un tableau - delete dest - size = int(size) - for (i = 1; i <= size; i++) { - dest[i] = "" - } -} -function array_len(values, count, i) { - count = 0 - for (i in values) { - count++ - } - return count -} -function mkindices(values, indices, i, j) { - array_new(indices) - j = 1 - for (i in values) { - indices[j++] = int(i) - } - return asort(indices) -} -function array_copy(dest, src, count, indices, i) { - array_new(dest) - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - dest[indices[i]] = src[indices[i]] - } -} -function array_getlastindex(src, count, indices) { - count = mkindices(src, indices) - if (count == 0) return 0 - return indices[count] -} -function array_add(dest, value, lastindex) { - lastindex = array_getlastindex(dest) - dest[lastindex + 1] = value -} -function array_deli(dest, i, l) { - i = int(i) - if (i == 0) return - l = array_len(dest) - while (i < l) { - dest[i] = dest[i + 1] - i++ - } - delete dest[l] -} -function array_del(dest, value, ignoreCase, i) { - do { - i = key_index(value, dest, ignoreCase) - if (i != 0) array_deli(dest, i) - } while (i != 0) -} -function array_extend(dest, src, count, lastindex, indices, i) { - lastindex = array_getlastindex(dest) - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - dest[lastindex + i] = src[indices[i]] - } -} -function array_fill(dest, i) { - array_new(dest) - for (i = 1; i <= NF; i++) { - dest[i] = $i - } -} -function array_getline(src, count, indices, i, j) { - $0 = "" - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - j = indices[i] - $j = src[j] - } -} -function array_appendline(src, count, indices, i, nf, j) { - count = mkindices(src, indices) - nf = NF - for (i = 1; i <= count; i++) { - j = nf + indices[i] - $j = src[indices[i]] - } -} -function in_array(value, values, ignoreCase, i) { - if (ignoreCase) { - value = tolower(value) - for (i in values) { - if (tolower(values[i]) == value) return 1 - } - } else { - for (i in values) { - if (values[i] == value) return 1 - } - } - return 0 -} -function key_index(value, values, ignoreCase, i) { - if (ignoreCase) { - value = tolower(value) - for (i in values) { - if (tolower(values[i]) == value) return int(i) - } - } else { - for (i in values) { - if (values[i] == value) return int(i) - } - } - return 0 -} -function array2s(values, prefix, sep, suffix, noindices, first, i, s) { - if (!prefix) prefix = "[" - if (!sep) sep = ", " - if (!suffix) suffix = "]" - s = prefix - first = 1 - for (i in values) { - if (first) first = 0 - else s = s sep - if (!noindices) s = s "[" i "]=" - s = s values[i] - } - s = s suffix - return s -} -function array2so(values, prefix, sep, suffix, noindices, count, indices, i, s) { - if (!prefix) prefix = "[" - if (!sep) sep = ", " - if (!suffix) suffix = "]" - s = prefix - count = mkindices(values, indices) - for (i = 1; i <= count; i++) { - if (i > 1) s = s sep - if (!noindices) s = s "[" indices[i] "]=" - s = s values[indices[i]] - } - s = s suffix - return s -} -function array_join(values, sep, prefix, suffix, count, indices, i, s) { - s = prefix - count = mkindices(values, indices) - for (i = 1; i <= count; i++) { - if (i > 1) s = s sep - s = s values[indices[i]] - } - s = s suffix - return s -} -function printto(s, output) { - if (output == "") { - print s - } else if (output ~ /^>>/) { - sub(/^>>/, "", output) - print s >>output - } else if (output ~ /^>/) { - sub(/^>/, "", output) - print s >output - } else { - print s >output - } -} -function find_line(input, field, value, orig, line) { - orig = $0 - line = "" - while ((getline 0) { - if ($field == value) { - line = $0 - break - } - } - close(input) - $0 = orig - return line -} -function merge_line(input, field, key, line) { - line = find_line(input, field, $key) - if (line != "") $0 = $0 FS line -} -function __csv_parse_quoted(line, destl, colsep, qchar, echar, pos, tmpl, nextc, resl) { - line = substr(line, 2) - resl = "" - while (1) { - pos = index(line, qchar) - if (pos == 0) { - resl = resl line - destl[0] = "" - destl[1] = 0 - return resl - } - if (echar != "" && pos > 1) { - prevc = substr(line, pos - 1, 1) - quotec = substr(line, pos, 1) - nextc = substr(line, pos + 1, 1) - if (prevc == echar) { - tmpl = substr(line, 1, pos - 2) - resl = resl tmpl quotec - line = substr(line, pos + 1) - continue - } - tmpl = substr(line, 1, pos - 1) - if (nextc == colsep || nextc == "") { - resl = resl tmpl - destl[0] = substr(line, pos + 2) - destl[1] = nextc == colsep - return resl - } else { - resl = resl tmpl quotec - line = substr(line, pos + 1) - } - } else { - tmpl = substr(line, 1, pos - 1) - quotec = substr(line, pos, 1) - nextc = substr(line, pos + 1, 1) - if (nextc == colsep || nextc == "") { - resl = resl tmpl - destl[0] = substr(line, pos + 2) - destl[1] = nextc == colsep - return resl - } else if (nextc == qchar) { - resl = resl tmpl quotec - line = substr(line, pos + 2) - } else { - resl = resl tmpl quotec - line = substr(line, pos + 1) - } - } - } -} -function __csv_parse_unquoted(line, destl, colsep, qchar, echar, pos) { - pos = index(line, colsep) - if (pos == 0) { - destl[0] = "" - destl[1] = 0 - return line - } else { - destl[0] = substr(line, pos + 1) - destl[1] = 1 - return substr(line, 1, pos - 1) - } -} -function __array_parsecsv(fields, line, nbfields, colsep, qchar, echar, shouldparse, destl, i) { - array_new(fields) - array_new(destl) - i = 1 - shouldparse = 0 - while (shouldparse || line != "") { - if (index(line, qchar) == 1) { - value = __csv_parse_quoted(line, destl, colsep, qchar, echar) - line = destl[0] - shouldparse = destl[1] - } else { - value = __csv_parse_unquoted(line, destl, colsep, qchar, echar) - line = destl[0] - shouldparse = destl[1] - } - fields[i] = value - i = i + 1 - } - if (nbfields) { - nbfields = int(nbfields) - i = array_len(fields) - while (i < nbfields) { - i++ - fields[i] = "" - } - } - return array_len(fields) -} -BEGIN { - DEFAULT_COLSEP = "," - DEFAULT_QCHAR = "\"" - DEFAULT_ECHAR = "" -} -function array_parsecsv2(fields, line, nbfields, colsep, qchar, echar) { - return __array_parsecsv(fields, line, nbfields, colsep, qchar, echar) -} -function array_parsecsv(fields, line, nbfields, colsep, qchar, echar) { - if (colsep == "") colsep = DEFAULT_COLSEP - if (qchar == "") qchar = DEFAULT_QCHAR - if (echar == "") echar = DEFAULT_ECHAR - return __array_parsecsv(fields, line, nbfields, colsep, qchar, echar) -} -function parsecsv(line, fields) { - array_parsecsv(fields, line) - array_getline(fields) - return NF -} -function getlinecsv(file, fields) { - if (file) { - getline 1) line = line colsep - if (qchar != "" && index(value, qchar) != 0) { - if (echar != "") gsub(qchar, quote_subrepl(echar) "&", value); - else gsub(qchar, "&&", value); - } - if (qchar != "" && (index(value, mvsep) != 0 || index(value, colsep) != 0 || index(value, qchar) != 0 || __csv_should_quote(value))) { - line = line qchar value qchar - } else { - line = line value - } - } - return line -} -function array_formatcsv(fields) { - return array_formatcsv2(fields, ",", ";", "\"", "") -} -function array_printcsv(fields, output) { - printto(array_formatcsv(fields), output) -} -function get_formatcsv( fields) { - array_fill(fields) - return array_formatcsv(fields) -} -function formatcsv() { - $0 = get_formatcsv() -} -function printcsv(output, fields) { - array_fill(fields) - array_printcsv(fields, output) -} -function array_findcsv(fields, input, field, value, nbfields, orig, found, i) { - array_new(orig) - array_fill(orig) - array_new(fields) - found = 0 - while ((getline 0) { - array_parsecsv(fields, $0, nbfields) - if (fields[field] == value) { - found = 1 - break - } - } - close(input) - array_getline(orig) - if (!found) { - delete fields - if (nbfields) { - nbfields = int(nbfields) - i = array_len(fields) - while (i < nbfields) { - i++ - fields[i] = "" - } - } - } - return found -} - -function __and(var, x, l_res, l_i) { - l_res=0; - for (l_i=0; l_i < 8; l_i++){ - if (var%2 == 1 && x%2 == 1) l_res=l_res/2 + 128; - else l_res/=2; - var=int(var/2); - x=int(x/2); - } - return l_res; -} -function __lshift(var, x) { - while(x > 0){ - var*=2; - x--; - } - return var; -} -function __rshift(var, x) { - while(x > 0){ - var=int(var/2); - x--; - } - return var; -} -BEGIN { - __BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" -} -function b64decode(src, result, base1, base2, base3, base4) { - result = "" - while (length(src) > 0) { - base1 = substr(src, 1, 1) - base2 = substr(src, 2, 1) - base3 = substr(src, 3, 1); if (base3 == "") base3 = "=" - base4 = substr(src, 4, 1); if (base4 == "") base4 = "=" - byte1 = index(__BASE64, base1) - 1 - if (byte1 < 0) byte1 = 0 - byte2 = index(__BASE64, base2) - 1 - if (byte2 < 0) byte2 = 0 - byte3 = index(__BASE64, base3) - 1 - if (byte3 < 0) byte3 = 0 - byte4 = index(__BASE64, base4) - 1 - if (byte4 < 0) byte4 = 0 - result = result sprintf( "%c", __lshift(__and(byte1, 63), 2) + __rshift(__and(byte2, 48), 4) ) - if (base3 != "=") result = result sprintf( "%c", __lshift(__and(byte2, 15), 4) + __rshift(__and(byte3, 60), 2) ) - if (base4 != "=") result = result sprintf( "%c", __lshift(__and(byte3, 3), 6) + byte4 ) - src = substr(src, 5) - } - return result -} -' -function awkdef() { - - if [ "${1:0:3}" == "-f" ]; then - shift - echo "$__AWKDEF_FUNCTIONS" - fi - if [ $# -gt 0 ]; then - local __ad_arg __ad_vpos __ad_name __ad_value - echo "BEGIN {" - while [ -n "${1:0:1}" ]; do - __ad_arg="${1:0:256}" - local __ad_array= - if [ "${__ad_arg%\[@\]}" != "$__ad_arg" ]; then - __ad_array=1 - __ad_name="${__ad_arg%\[@\]}" - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_value="$__ad_name" - elif [[ "$__ad_arg" == *\[@\]=* ]]; then - __ad_array=1 - __ad_name="${__ad_arg%%\[@\]=*}" - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_vpos=$((${#__ad_name} + 4)) - __ad_value="${1:$__ad_vpos}" - [ ${#__ad_value} -ne 0 ] || __ad_value="$__ad_name" - elif [[ "$__ad_arg" == *=* ]]; then - local __ad_int= __ad_str= - __ad_name="${__ad_arg%%=*}" - __ad_vpos=$((${#__ad_name} + 1)) - if [ "${__ad_name%:int}" != "$__ad_name" ]; then - __ad_int=1 - __ad_name="${__ad_name%:int}" - elif [ "${__ad_name%:str}" != "$__ad_name" ]; then - __ad_str=1 - __ad_name="${__ad_name%:str}" - fi - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_value="${1:$__ad_vpos}" - if [ -n "$__ad_int" ]; then - echo "$__ad_name = int($(quoted_awk "$__ad_value") + 0)" - elif [ -n "$__ad_str" ]; then - echo "$__ad_name = $(quoted_awk "$__ad_value")" - elif [ ${#__ad_value} -lt 256 ] && isnum "$__ad_value"; then - echo "$__ad_name = $__ad_value" - else - echo "$__ad_name = $(quoted_awk "$__ad_value")" - fi - else - break - fi - if [ -n "$__ad_array" ]; then - if [ "${__ad_value:0:2}" == $'<\n' ]; then - local -a __ad_values - array_from_lines __ad_values "${__ad_value:2}" - __ad_value=__ad_values - fi - __ad_value="${__ad_value}[@]" - local __ad_i=1 - echo "$__ad_name[0] = 0; delete $__ad_name" - for __ad_arg in "${!__ad_value}"; do - echo "$__ad_name[$__ad_i]=$(quoted_awk "$__ad_arg")" - __ad_i=$(($__ad_i + 1)) - done - eval "echo \"\${__ad_name}_count = \${#$__ad_value}\"" - fi - shift - done - echo "}" - for __ad_arg in "$@"; do - rawecho "$__ad_arg" - done - fi -} -function lawkrun() { - local -a __ar_defs __ar_args - while [ $# -gt 0 -a "$1" != "--" ]; do - __ar_defs=("${__ar_defs[@]}" "$1") - shift - done - shift - while [ $# -gt 0 ]; do - __ar_args=("${__ar_args[@]}" "$1") - shift - done - local __ar_script="$(awkdef "${__ar_defs[@]}")" - awk "$__ar_script" "${__ar_args[@]}" -} -function cawkrun() { LANG=C lawkrun "$@"; } -function awkrun() { LANG=C lawkrun "$@"; } - -function __lf_get_age() { - local y=$(date "+%Y") - local dy=$(date "+%j"); while [ "${dy#0}" != "$dy" ]; do dy="${dy#0}"; done - [ -n "$dy" ] || dy=0 - local h=$(date "+%H"); while [ "${h#0}" != "$h" ]; do h="${h#0}"; done - [ -n "$h" ] || h=0 - echo $((($y * 365 + $dy) * 24 + $h)) -} -function lf_trylock() { - local eoo lockfile max_hours=4 - while [ -n "$1" ]; do - case "$1" in - -h) shift; max_hours="$1";; - --) shift; eoo=1;; - *) eoo=1;; - esac - [ -n "$eoo" ] && break - shift - done - - lockfile="$1" - [ -n "$lockfile" ] || die "il faut spécifier un fichier pour le verrou" - - local now="$(__lf_get_age)" - if (set -C; echo "$now" >"$lockfile") 2>/dev/null; then - return 0 - fi - local prev diff - if prev="$(<"$lockfile")"; then - diff="$(($now - $prev))" - if [ "$diff" -gt "$max_hours" ]; then - echo stale - else - echo locked - fi - elif [ -f "$lockfile" ]; then - echo retry - fi - return 1 -} -function pidfile_set() { - local eoo pidfile pid=$$ replace= - while [ -n "$1" ]; do - case "$1" in - -p) - shift - pid="$1" - ;; - -r) - replace=1 - ;; - --) - shift - eoo=1 - ;; - *) - eoo=1 - ;; - esac - [ -n "$eoo" ] && break - shift - done - - pidfile="$1" - [ -n "$pidfile" ] || return 10 - - if [ -f "$pidfile" ]; then - local curpid="$(<"$pidfile")" - if is_running "$curpid"; then - return 1 - elif [ -n "$replace" ]; then - /bin/rm -f "$pidfile" || return 10 - else - return 2 - fi - fi - - echo_ "$pid" >"$pidfile" || return 10 - autoclean "$pidfile" - return 0 -} -function pidfile_check() { - local pidfile="$1" - [ -n "$pidfile" ] || return 10 - - if [ -f "$pidfile" ]; then - [ -r "$pidfile" ] || return 10 - local pid="$(<"$pidfile")" - is_running "$pid" && return 0 - fi - return 1 -} -function page_maybe() { - if isatty; then - less -XF "$@" - else - cat - fi -} - - -function utools_local() { - local arg - [ $# -gt 0 ] || set -- opts verbosity interaction - for arg in "$@"; do - case "$arg" in - parse_opts|opts|o|args) echo "local -a args";; - verbosity|v) echo "local __verbosity='$__verbosity'";; - interaction|i) echo "local __interaction='$__interaction'";; - esac - done -} - -function isatty() { - tty -s <&1 -} -function in_isatty() { - tty -s -} -function out_isatty() { - tty -s <&1 -} -function err_isatty() { - tty -s <&2 -} -function die() { [ $# -gt 0 ] && eerror "$@"; exit 1; } -function exit_with { if [ $# -gt 0 ]; then "$@"; fi; exit $?; } -function die_with { [ $# -gt 0 ] && eerror "$1"; shift; [ $# -gt 0 ] && "$@"; exit 1; } -function die_unless() { - local count=$# - if [ $count -eq 0 ]; then - exit 1 - elif [ $count -eq 1 ]; then - "$@" || exit $? - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - : - else - r=$? - eerror "$m" - exit $r - fi - fi -} -function eerror_unless() { - local count=$# - if [ $count -eq 0 ]; then - return 1 - elif [ $count -eq 1 ]; then - "$@" || return $? - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - : - else - r=$? - eerror "$m" - return $r - fi - fi -} -function die_if() { - local count=$# - if [ $count -eq 0 ]; then - : - elif [ $count -eq 1 ]; then - "$@" && exit 1 - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - eerror "$m" - exit 1 - fi - fi -} -function eerror_if() { - local count=$# - if [ $count -eq 0 ]; then - : - elif [ $count -eq 1 ]; then - "$@" && return 1 - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - eerror "$m" - return 1 - fi - fi -} - -TAB=$'\t' -LATIN1=iso-8859-1 -LATIN9=iso-8859-15 -UTF8=utf-8 -OENC="$UTF8" - -if ! progexists iconv; then - function iconv() { cat; } -fi - -function __lang_encoding() { - local lang="$(<<<"$LANG" awk '{ print tolower($0) }')" - case "$lang" in - *@euro) echo "iso-8859-15";; - *.utf-8|*.utf8) echo "utf-8";; - *) echo "iso-8859-1";; - esac -} -function __norm_encoding() { - awk '{ - enc = tolower($0) - gsub(/^latin$/, "latin1", enc) - gsub(/^latin1$/, "iso-8859-1", enc) - gsub(/^latin9$/, "iso-8859-15", enc) - gsub(/[-_]/, "", enc) - if (enc == "iso8859" || enc == "iso88591" || enc == "8859" || enc == "88591") print "iso-8859-1" - else if (enc == "iso885915" || enc == "885915") print "iso-8859-15" - else if (enc == "utf" || enc == "utf8") print "utf-8" - else print $0 - }' <<<"$1" -} -function __init_encoding() { - local DEFAULT_ENCODING="$(__lang_encoding)" - [ -n "$DEFAULT_ENCODING" ] || DEFAULT_ENCODING=utf-8 - [ -n "$UTOOLS_OUTPUT_ENCODING" ] || UTOOLS_OUTPUT_ENCODING="$DEFAULT_ENCODING" - UTOOLS_OUTPUT_ENCODING="$(__norm_encoding "$UTOOLS_OUTPUT_ENCODING")" - [ -n "$UTOOLS_INPUT_ENCODING" ] || UTOOLS_INPUT_ENCODING="$UTOOLS_OUTPUT_ENCODING" - UTOOLS_INPUT_ENCODING="$(__norm_encoding "$UTOOLS_INPUT_ENCODING")" - [ -n "$UTOOLS_EDITOR_ENCODING" ] || UTOOLS_EDITOR_ENCODING="$UTOOLS_INPUT_ENCODING" - UTOOLS_EDITOR_ENCODING="$(__norm_encoding "$UTOOLS_EDITOR_ENCODING")" - - IENC="$UTOOLS_INPUT_ENCODING" - OENC="$UTOOLS_OUTPUT_ENCODING" -} - -if [ -n "$UTOOLS_LANG" -a -z "$LANG" ]; then - export UTOOLS_LANG - export LANG="$UTOOLS_LANG" -fi -__init_encoding - -function tooenc() { - local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - rawecho "$src" - else - iconv -f "$from" -t "$to" <<<"$src" - fi -} -function uecho() { - tooenc "$*" -} -function tooenc_() { - local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - rawecho_ "$src" - else - rawecho_ "$src" | iconv -f "$from" -t "$to" - fi -} -function uecho_() { - tooenc_ "$*" -} -function toienc() { - local __tie_var="$1" __tie_to="${2:-$IENC}" __tie_from="${3:-$UTOOLS_INPUT_ENCODING}" - if [ "$__tie_from" != "$__tie_to" ]; then - set_var "$__tie_var" "$(iconv -f "$__tie_from" -t "$__tie_to" <<<"${!__tie_var}")" - fi -} -function uread() { - [ $# -gt 0 ] || set -- REPLY - local __r_var - read "$@" - for __r_var in "$@"; do - [ -z "$__r_var" -o "${__r_var:0:1}" == "-" ] && continue # ignorer les options - toienc "$__r_var" - done -} - -function stooenc() { - local from="${1:-$OENC}" to="${2:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - cat - else - iconv -f "$from" -t "$to" - fi -} -function stoienc() { - local to="${1:-$IENC}" from="${2:-$UTOOLS_INPUT_ENCODING}" - if [ "$from" == "$to" ]; then - cat - else - iconv -f "$from" -t "$to" - fi -} - -export UTOOLS_EDATE -function __edate() { [ -n "$UTOOLS_EDATE" ] && date +"[%d/%m/%Y-%H:%M:%S] "; } - -export UTOOLS_ELOG_OVERWRITE -function __set_no_colors() { :; } -function elogto() { - UTOOLS_EDATE=1 - if [ -n "$1" -a -n "$2" ]; then - LANG=fr_FR.UTF8 - UTOOLS_OUTPUT_ENCODING="$UTF8" - __set_no_colors 1 - if [ -n "$UTOOLS_ELOG_OVERWRITE" ]; then - exec >"$1" 2>"$2" - else - exec >>"$1" 2>>"$2" - fi - elif [ -n "$1" ]; then - LANG=fr_FR.UTF8 - UTOOLS_OUTPUT_ENCODING="$UTF8" - __set_no_colors 1 - if [ -n "$UTOOLS_ELOG_OVERWRITE" ]; then - exec >"$1" 2>&1 - else - exec >>"$1" 2>&1 - fi - fi -} - -export __estack __tlevel -function __indent() { - if [ "${1/ -/}" != "$1" ]; then - sed "2,\$s/^/${__tlevel}/g" <<<"$1" - else - rawecho "$1" - fi -} -function __eerror() { tooenc "$(__edate)${__tlevel}* error: $(__indent "$1")"; } -function __ewarn() { tooenc "$(__edate)${__tlevel}* warning: $(__indent "$1")"; } -function __enote() { tooenc "$(__edate)${__tlevel}* note: $(__indent "$1")"; } -function __ebanner() { - local maxi="${COLUMNS:-80}" - local -a lines - local psfix line - - psfix="$(__edate)${__tlevel}" - while [ ${#psfix} -lt $maxi ]; do psfix="$psfix="; done - - tooenc "$psfix" - maxi=$(($maxi - 1)) - array_from_xlines lines "$1" - for line in "" "${lines[@]}" ""; do - line="$(__edate)${__tlevel}= $line" - if [ ${#line} -le $maxi ]; then - while [ ${#line} -lt $maxi ]; do line="$line "; done - line="$line=" - fi - tooenc "$line" - done - tooenc "$psfix" -} -function __eimportant() { tooenc "$(__edate)${__tlevel}* important: $(__indent "$1")"; } -function __eattention() { tooenc "$(__edate)${__tlevel}* attention: $(__indent "$1")"; } -function __einfo() { tooenc "$(__edate)${__tlevel}* info: $(__indent "$1")"; } -function __eecho() { tooenc "$(__edate)${__tlevel}$(__indent "$1")"; } -function __eecho_() { tooenc_ "$(__edate)${__tlevel}$(__indent "$1")"; } -function __edebug() { tooenc "$(__edate)${__tlevel}* debug: $(__indent "$1")"; } -function __estep() { tooenc "$(__edate)${__tlevel}* $(__indent "$1")"; } -function __estepe() { __estep "$@"; } -function __estepw() { __estep "$@"; } -function __estepn() { __estep "$@"; } -function __estepi() { __estep "$@"; } -function __estep_() { tooenc_ "$(__edate)${__tlevel}* $(__indent "$1")"; } -function __estepe_() { __estep_ "$@"; } -function __estepw_() { __estep_ "$@"; } -function __estepn_() { __estep_ "$@"; } -function __estepi_() { __estep_ "$@"; } -function __etitle() { tooenc "$(__edate)${__tlevel}+++ $(__indent "$1")"; } -function __ebegin() { tooenc_ "$(__edate)${__tlevel}* $(__indent "$1"): "; } -function __edoto() { echo_ "."; } -function __edotw() { echo_ "w"; } -function __edotx() { echo_ "x"; } -function __edotp() { echo_ "+"; } -function __edotd() { tooenc "($1)"; } -function __eendo() { echo "[ok]"; } -function __eendx() { echo "[error]"; } -PRETTYOPTS=() -function set_verbosity() { :;} -function set_interaction() { :;} -function show_error() { - return 0 -} -function show_warn() { - return 0 -} -function show_info() { - return 0 -} -function show_verbose() { - return 0 -} -function show_debug() { - [ -n "$DEBUG" ] -} -function check_verbosity() { - return 0 -} -function get_verbosity_option() { :;} -function check_interaction() { - return 0 -} -function is_interaction() { - return 1 -} -function get_interaction_option() { :;} -__epending= -function eflush() { - if [ -n "$__epending" ]; then rawecho "$__epending" 1>&2; __epending=; fi -} -function eclearp() { - __epending= -} -function eerror() { - show_error || return; eflush; __eerror "$*" 1>&2 -} -function ewarn() { - show_warn || return; eflush; __ewarn "$*" 1>&2 -} -function enote() { - show_info || return; eflush; __enote "$*" 1>&2 -} -function ebanner() { - show_error || return; eflush; __ebanner "$*" 1>&2; sleep 5 -} -function eimportant() { - show_error || return; eflush; __eimportant "$*" 1>&2 -} -function eattention() { - show_warn || return; eflush; __eattention "$*" 1>&2 -} -function einfo() { - show_info || return; eflush; __einfo "$*" 1>&2 -} -function eecho() { - show_info || return; eflush; __eecho "$*" 1>&2 -} -function eecho_() { - show_info || return; eflush; __eecho_ "$*" 1>&2 -} -function edebug() { - show_debug || return; eflush; __edebug "$*" 1>&2 -} -function trace() { - local r cmd="$(quoted_args "$@")" - show_info && { eflush; __eecho "\$ $cmd" 1>&2; } - "$@"; r=$? - if [ $r -ne 0 ]; then - if show_info; then - eflush; __eecho "^ [EC #$r]" 1>&2 - elif show_error; then - eflush; __eecho "^ $cmd [EC #$r]" 1>&2; - fi - fi - return $r -} -function trace_error() { - local r - "$@"; r=$? - if [ $r -ne 0 ]; then - local cmd="$(quoted_args "$@")" - show_error && { eflush; __eecho "^ $cmd [EC #$r]" 1>&2; } - fi - return $r -} - -function etitle() { - local __t_deferred= - __t_etitle "$@" -} -function etitled() { - local __t_deferred=1 - __t_etitle "$@" -} -function __t_etitle() { - local __t_eend=default - local __t_clearp= - while [ -n "$1" ]; do - if [ "$1" == "--" ]; then - shift - break - elif [ "$1" == "-s" ]; then - __t_eend= - shift - elif [ "$1" == "--eend" ]; then - __t_eend=1 - shift - elif [ "$1" == "-p" ]; then - __t_clearp=1 - shift - else - break - fi - done - local __t_title="$1"; shift - local __t_s=0 - [ -n "$__estack" ] && __tlevel="${__tlevel} " - __estack="$__estack:t" - if show_info; then - if [ -n "$__t_deferred" ]; then - __epending="${__epending:+$__epending -}$(__etitle "$__t_title")" - else - eflush - __etitle "$__t_title" 1>&2 - fi - fi - if [ $# -gt 0 ]; then - "$@" - __t_s=$? - [ "$__t_eend" == "default" ] && __t_eend=1 - fi - [ "$__t_eend" == "default" ] && __t_eend= - if [ -n "$__t_eend" ]; then - eend $__t_s - [ -n "$__t_clearp" ] && eclearp - fi - return $__t_s -} -function estep() { - show_info || return; eflush; __estep "$*" 1>&2 -} -function estepe() { - show_info || return; eflush; __estepe "$*" 1>&2 -} -function estepw() { - show_info || return; eflush; __estepw "$*" 1>&2 -} -function estepn() { - show_info || return; eflush; __estepn "$*" 1>&2 -} -function estepi() { - show_info || return; eflush; __estepi "$*" 1>&2 -} -function estep_() { - show_info || return; eflush; __estep_ "$*" 1>&2 -} -function estepe_() { - show_info || return; eflush; __estepe_ "$*" 1>&2 -} -function estepw_() { - show_info || return; eflush; __estepw_ "$*" 1>&2 -} -function estepn_() { - show_info || return; eflush; __estepn_ "$*" 1>&2 -} -function estepi_() { - show_info || return; eflush; __estepi_ "$*" 1>&2 -} -function ebegin() { - local __b_eend=default - while [ -n "$1" ]; do - if [ "$1" == "--" ]; then - shift - break - elif [ "$1" == "-s" ]; then - __b_eend= - shift - elif [ "$1" == "--eend" ]; then - __b_eend=1 - shift - else - break - fi - done - local __b_msg="$1"; shift - local __b_s=0 - __estack="$__estack:b" - if show_info; then - eflush - __ebegin "$__b_msg" 1>&2 - fi - if [ $# -gt 0 ]; then - "$@" - __b_s=$? - [ "$__b_eend" == "default" ] && __b_eend=1 - fi - [ "$__b_eend" == "default" ] && __b_eend= - [ -n "$__b_eend" ] && eend $__b_s - return $__b_s -} -function edot() { - local s=$? - show_info || return - eflush - [ -n "$1" ] && s="$1" - shift - if [ "$s" == "0" ]; then - __edoto 1>&2 - else - __edotx 1>&2 - fi - show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2 - return $s -} -function edotw() { - local s=$? - show_info || return - eflush - [ -n "$1" ] && s="$1" - shift - __edotw 1>&2 - show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2 - return $s -} -function ewait() { - [ -n "$1" ] || return 1 - if show_info; then - local count=2 - eflush - little_sleep # certains processus retournent tout de suite - while is_running "$1"; do - sleep 1 - if [ $count -gt 0 ]; then - count=$(($count - 1)) - else - __edotp 1>&2 - fi - done - __edoto 1>&2 - else - wait "$1" - fi -} -function eend() { - local s=$? - if [ "$1" == "-c" ]; then - __estack= - __tlevel= - elif [ "${__estack%:b}" != "$__estack" ]; then - __estack="${__estack%:b}" - show_info || return - eflush - [ -n "$1" ] && s="$1" - if [ "$s" == "0" ]; then - __eendo 1>&2 - else - __eendx 1>&2 - fi - elif [ "${__estack%:t}" != "$__estack" ]; then - __estack="${__estack%:t}" - __tlevel="${__tlevel% }" - fi -} -function ask_yesno() { - local interactive=1 - if [[ "$1" == -* ]]; then - if [ "$1" != -- ]; then - check_interaction "$1" || interactive= - fi - shift - else - check_interaction -c || interactive= - fi - local default="${2:-N}" - if [ "$default" == "C" ]; then - [ -n "$interactive" ] && default=N || default=O - elif [ "$default" == "X" ]; then - [ -n "$interactive" ] && default=O || default=N - fi - if [ -n "$interactive" ]; then - eflush - local message="$1" - local prompt="[oN]" - local r - is_yes "$default" && prompt="[On]" - if [ -n "$message" ]; then - tooenc_ "$message" 1>&2 - else - tooenc_ "Voulez-vous continuer?" "$UTF8" 1>&2 - fi - tooenc_ " $prompt " "$UTF8" 1>&2 - uread r - is_yes "${r:-$default}" - else - is_yes "$default" - fi -} -function read_value() { - local -a __rv_opts __rv_readline=1 __rv_showdef=1 __rv_nl= - __rv_opts=() - [ -n "$UTOOLS_NO_READLINE" ] && __rv_readline= - __rv_read "$@" -} -function read_password() { - local -a __rv_opts __rv_readline= __rv_showdef= __rv_nl=1 - __rv_opts=(-s) - __rv_read "$@" -} -function __rv_read() { - local __rv_int=1 - if [[ "$1" == -* ]]; then - if [ "$1" != -- ]; then - check_interaction "$1" || __rv_int= - fi - shift - else - check_interaction -c || __rv_int= - fi - local __rv_msg="$1" __rv_v="${2:-value}" __rv_d="$3" __rv_re="${4:-O}" - if [ -z "$__rv_int" ]; then - if is_yes "$__rv_re" && [ -z "$__rv_d" ]; then - OENC="$UTF8" eerror "La valeur par défaut de $__rv_v doit être non vide" - return 1 - fi - set_var "$__rv_v" "$__rv_d" - return 0 - fi - - eflush - local __rv_r - while true; do - if [ -n "$__rv_msg" ]; then - tooenc_ "$__rv_msg" 1>&2 - else - tooenc_ "Entrez la valeur" "$UTF8" 1>&2 - fi - if [ -n "$__rv_readline" ]; then - tooenc_ ": " "$UTF8" 1>&2 - uread -e ${__rv_d:+-i"$__rv_d"} "${__rv_opts[@]}" __rv_r - else - if [ -n "$__rv_d" ]; then - if [ -n "$__rv_showdef" ]; then - tooenc_ " [$__rv_d]" 1>&2 - else - tooenc_ " [****]" 1>&2 - fi - fi - tooenc_ ": " "$UTF8" 1>&2 - uread "${__rv_opts[@]}" __rv_r - [ -n "$__rv_nl" ] && echo - fi - __rv_r="${__rv_r:-$__rv_d}" - if [ -n "$__rv_r" ] || ! is_yes "$__rv_re"; then - set_var "$__rv_v" "$__rv_r" - return 0 - fi - done -} -function simple_menu() { - local __sm_title= __sm_yourchoice= __sm_default= - local -a __sm_args - parse_opts -t: __sm_title= -m: __sm_yourchoice= -d: __sm_default= @ __sm_args -- "$@" && - set -- "${__sm_args[@]}" || ewarn "$__sm_args" - - local __sm_option_var="${1:-option}" __sm_options_var="${2:-options}" - local __sm_option __sm_options - __sm_options="$__sm_options_var[*]" - if [ -z "${!__sm_options}" ]; then - OENC="$UTF8" eerror "Le tableau $__sm_options_var doit être non vide" - return 1 - fi - [ -z "$__sm_default" ] && __sm_default="${!__sm_option_var}" - - eflush - array_copy __sm_options "$__sm_options_var" - local __sm_c=0 __sm_i __sm_choice - while true; do - if [ "$__sm_c" == "0" ]; then - [ -n "$__sm_title" ] && tooenc "=== $__sm_title ===" 1>&2 - __sm_i=1 - for __sm_option in "${__sm_options[@]}"; do - if [ "$__sm_option" == "$__sm_default" ]; then - tooenc "$__sm_i*- $__sm_option" 1>&2 - else - tooenc "$__sm_i - $__sm_option" 1>&2 - fi - let __sm_i=$__sm_i+1 - done - fi - - if [ -n "$__sm_yourchoice" ]; then - tooenc_ "$__sm_yourchoice" 1>&2 - else - tooenc_ "Entrez le numéro de l'option choisie" "$UTF8" 1>&2 - fi - tooenc_ ": " "$UTF8" 1>&2 - uread __sm_choice - - if [ -z "$__sm_choice" -a -n "$__sm_default" ]; then - __sm_option="$__sm_default" - break - fi - if [ -n "$__sm_choice" -a -z "${__sm_choice//[0-9]/}" ]; then - if [ "$__sm_choice" -gt 0 -a "$__sm_choice" -le "${#__sm_options[*]}" ]; then - __sm_option="${__sm_options[$(($__sm_choice - 1))]}" - break - else - OENC="$UTF8" eerror "Numéro d'option incorrect" - fi - else - OENC="$UTF8" eerror "Vous devez saisir le numéro de l'option choisie" - fi - - let __sm_c=$__sm_c+1 - if [ "$__sm_c" -eq 5 ]; then - tooenc "" "$UTF8" 1>&2 - __sm_c=0 - fi - done - set_var "$__sm_option_var" "$__sm_option" -} - -function actions_menu() { - local -a __am_action_descs __am_options __am_void_actions - local __am_tmp __am_select_action __am_select_option __am_title __am_optyc __am_actyc - local __am_default_action=auto __am_quit_action=auto - local __am_default_option= - local -a __am_args - parse_opts \ - -t: __am_title= \ - -m: __am_optyc= \ - -M: __am_actyc= \ - -e: __am_void_actions \ - -d: __am_default_action= \ - -q: __am_quit_action= \ - -o: __am_default_option= \ - @ __am_args -- "$@" && set -- "${__am_args[@]}" || { eerror "$__am_args"; return 1; } - - __am_tmp="${1:-action}"; __am_select_action="${!__am_tmp}" - __am_tmp="${2:-option}"; __am_select_option="${!__am_tmp}" - [ -n "$__am_default_option" ] && __am_select_option="$__am_default_option" - array_copy __am_action_descs "${3:-actions}" - array_copy __am_options "${4:-options}" - - eerror_unless [ ${#__am_action_descs[*]} -gt 0 ] "Vous devez spécifier le tableau des actions" || return - __actions_menu || return 1 - setv "${1:-action}" "$__am_select_action" - setv "${2:-option}" "$__am_select_option" -} -function __actions_menu() { - local title="$__am_title" - local optyc="$__am_optyc" actyc="$__am_actyc" - local default_action="$__am_default_action" - local quit_action="$__am_quit_action" - local select_action="$__am_select_action" - local select_option="$__am_select_option" - local -a action_descs options void_actions - array_copy action_descs __am_action_descs - array_copy options __am_options - array_copy void_actions __am_void_actions - - local no_options - array_isempty options && no_options=1 - - local -a actions - local tmp action name - for tmp in "${action_descs[@]}"; do - splitfsep2 "$tmp" : action name - [ -n "$action" ] || action="${name:0:1}" - action="$(strlower "$action")" - array_addu actions "$action" - done - - if [ "$default_action" == auto ]; then - default_action="$select_action" - if [ -n "$default_action" ]; then - array_contains actions "$default_action" || default_action= - fi - [ -n "$default_action" ] || default_action="${actions[0]}" - fi - default_action="${default_action:0:1}" - default_action="$(strlower "$default_action")" - - if [ "$quit_action" == auto ]; then - if [ ${#actions[*]} -gt 1 ]; then - quit_action="${actions[@]:$((-1)):1}" - array_addu void_actions "$quit_action" - fi - fi - quit_action="${quit_action:0:1}" - quit_action="$(strlower "$quit_action")" - - local action_title - for tmp in "${action_descs[@]}"; do - splitfsep2 "$tmp" : action name - [ -n "$action" ] || action="${name:0:1}" - [ -n "$name" ] || name="$action" - action="$(strlower "$action")" - if [ -n "$no_options" ]; then - if ! array_contains void_actions "$action"; then - array_del actions "$action" - continue - fi - fi - [ "$action" == "$default_action" ] && name="$name*" - action_title="${action_title:+$action_title/}$name" - done - if [ -n "$default_action" ]; then - array_contains actions "$default_action" || default_action= - fi - if [ -n "$quit_action" ]; then - array_contains actions "$quit_action" || quit_action= - fi - - if [ -n "$no_options" ]; then - if array_isempty void_actions; then - eerror "Aucune option n'est définie. Il faut définir le tableau des actions vides" - return 1 - fi - __void_actions_menu - else - __options_actions_menu - fi -} -function __void_actions_menu() { - eflush - local c=0 choice - while true; do - if [ $c -eq 0 ]; then - [ -n "$title" ] && __etitle "$title" 1>&2 - __eecho_ "=== Actions disponibles: " 1>&2 - tooenc "$action_title" 1>&2 - fi - if [ -n "$actyc" ]; then - __eecho_ "$actyc" 1>&2 - elif [ -n "$optyc" ]; then - __eecho_ "$optyc" 1>&2 - else - __eecho_ "Entrez l'action à effectuer" 1>&2 - fi - tooenc_ ": " 1>&2 - uread choice - if [ -z "$choice" -a -n "$default_action" ]; then - select_action="$default_action" - break - fi - - choice="${choice:0:1}" - choice="$(strlower "$choice")" - if array_contains actions "$choice"; then - select_action="$choice" - break - elif [ -n "$choice" ]; then - eerror "$choice: action incorrecte" - else - eerror "vous devez saisir l'action à effectuer" - fi - let c=$c+1 - if [ $c -eq 5 ]; then - tooenc "" 1>&2 - c=0 - fi - done - __am_select_action="$select_action" - __am_select_option= -} -function __options_actions_menu() { - eflush - local c=0 option choice action option - while true; do - if [ $c -eq 0 ]; then - [ -n "$title" ] && __etitle "$title" 1>&2 - i=1 - for option in "${options[@]}"; do - if [ "$option" == "$select_option" ]; then - tooenc "$i*- $option" 1>&2 - else - tooenc "$i - $option" 1>&2 - fi - let i=$i+1 - done - __estepn_ "Actions disponibles: " 1>&2 - tooenc "$action_title" 1>&2 - fi - if [ -n "$optyc" ]; then - __eecho_ "$optyc" 1>&2 - else - __eecho_ "Entrez l'action et le numéro de l'option choisie" 1>&2 - fi - tooenc_ ": " 1>&2 - uread choice - - if [ -z "$choice" -a -n "$default_action" ]; then - action="$default_action" - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - elif [ -n "$select_option" ]; then - select_action="$action" - break - fi - fi - action="${choice:0:1}" - action="$(strlower "$action")" - if array_contains actions "$action"; then - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - else - option="${choice:1}" - option="${option// /}" - if [ -z "$option" -a -n "$select_option" ]; then - select_action="$action" - break - elif [ -z "$option" ]; then - eerror "vous devez saisir le numéro de l'option" - elif isnum "$option"; then - if [ $option -gt 0 -a $option -le ${#options[*]} ]; then - select_action="$action" - select_option="${options[$(($option - 1))]}" - break - fi - else - eerror "$option: numéro d'option incorrecte" - fi - fi - elif isnum "$choice"; then - action="$default_action" - if [ -n "$action" ]; then - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - else - option="${choice// /}" - if [ -z "$option" ]; then - eerror "vous devez saisir le numéro de l'option" - elif isnum "$option"; then - if [ $option -gt 0 -a $option -le ${#options[*]} ]; then - select_action="$action" - select_option="${options[$(($option - 1))]}" - break - fi - else - eerror "$option: numéro d'option incorrecte" - fi - fi - else - eerror "Vous devez spécifier l'action à effectuer" - fi - elif [ -n "$choice" ]; then - eerror "$choice: action et/ou option incorrecte" - else - eerror "vous devez saisir l'action à effectuer" - fi - let c=$c+1 - if [ $c -eq 5 ]; then - tooenc "" 1>&2 - c=0 - fi - done - __am_select_action="$select_action" - __am_select_option="$select_option" -} - - -function __ac_forgetall() { __ac_files=(); } -__ac_forgetall -function __ac_trap() { - local file - for file in "${__ac_files[@]}"; do - [ -e "$file" ] && rm -rf "$file" 2>/dev/null - done - __ac_forgetall -} -trap __ac_trap 1 3 15 EXIT -function autoclean() { - local file - for file in "$@"; do - [ -n "$file" ] && array_add __ac_files "$file" - done -} -function ac_cleanall() { - __ac_trap -} -function ac_clean() { - local file - for file in "$@"; do - if array_contains __ac_files "$file"; then - [ -e "$file" ] && rm -rf "$file" 2>/dev/null - array_del __ac_files "$file" - fi - done -} -function ac_set_tmpfile() { - local __acst_d - if show_debug; then - if [ -n "$5" ]; then - is_yes "${!5}" && __acst_d=1 - else - __acst_d=1 - fi - fi - if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" - [ -f "$3" -a "$4" == keep ] || >"$3" - else - local __acst_t="$(mktempf "$2")" - autoclean "$__acst_t" - set_var "$1" "$__acst_t" - fi -} -function ac_set_tmpdir() { - local __acst_d - if show_debug; then - if [ -n "$4" ]; then - is_yes "${!4}" && __acst_d=1 - else - __acst_d=1 - fi - fi - if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" - mkdir -p "$3" - else - local __acst_t="$(mktempd "$2")" - autoclean "$__acst_t" - set_var "$1" "$__acst_t" - fi -} -function debug_tee() { - if show_debug; then - tee "$@" - else - cat - fi -} - - -function get_defaults_files() { - local __gd_dest="${1:-defaults}"; shift - local -a __gd_fs - local __gd_f __gd_found - for __gd_f in "$@"; do - __gd_found= - if [ -r "/etc/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "/etc/default/$__gd_f") - __gd_found=1 - fi - if [ -r "$HOME/etc/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "$HOME/etc/default/$__gd_f") - __gd_found=1 - fi - if [ -z "$__gd_found" -a -r "$scriptdir/lib/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "$scriptdir/lib/default/$__gd_f") - fi - done - array_copy "$__gd_dest" __gd_fs -} - -function set_defaults() { - local -a __sd_fs - local __sd_f - get_defaults_files __sd_fs "$@" - for __sd_f in "${__sd_fs[@]}"; do - source "$__sd_f" - done -} - - -: "${MYHOST:=$HOSTNAME}" -: "${MYHOSTNAME:=${MYHOST%%.*}}" -export MYHOST MYHOSTNAME - -function myhost() { - hostname -f 2>/dev/null || echo "$MYHOST" -} -function myhostname() { - hostname -s 2>/dev/null || echo "$MYHOSTNAME" -} -##@inc]base -uprovide base.tools -urequire base - -function base_umove() { - local -a args - local updatedir - args=(-d:,--updatedir: .) - parse_args_check "$@" || return; set -- "${args[@]}" - - eerror_unless [ -z "$updatedir" -o -d "$updatedir" ] "$updatedir: doit être un répertoire" || return - eerror_if [ $# -eq 0 ] "Vous devez spécifier les fichiers à déplacer" || return - eerror_if [ $# -eq 1 ] "Vous devez spécifier la destination" || return - - local -a srcs - local dest - - srcs=("$@") - setx dest=last_value srcs - array_del_last srcs - - if [ $# -eq 2 ]; then - if [ -d "$dest" ]; then - : # ce cas sera traité ci-dessous - elif [ -e "$dest" ]; then - eerror "$dest: refus d'écraser la destination" - return 1 - else - src="${srcs[0]}" - if [ -n "$updatedir" ]; then - if [ -L "$src" ]; then - ldest="$(readlinka "$src")" - array_find_links update_links "$ldest" "$updatedir" - else - array_find_links update_links "$src" "$updatedir" - fi - move_file "$src" "$dest" "${update_links[@]}" - else - move_link "$src" "$dest" - fi - return $? - fi - fi - - [ -d "$dest" ] || { - eerror "$dest: doit être un répertoire" - return 1 - } - for src in "${srcs[@]}"; do - if [ -n "$updatedir" ]; then - if [ -L "$src" ]; then - move_link "$src" "$dest" - else - array_find_links update_links "$src" "$updatedir" - move_file "$src" "$dest" "${update_links[@]}" - fi - else - move_link "$src" "$dest" - fi - done -} -##@inc]base.tools -##@inc[base.compat -## Fonctions de base: support des fonctions obsolètes et des versions de bash < 4.x -##@inc[base.core -## Fonctions de base: fondement -uprovide base.core - -function echo_() { - echo -n "$*" -} -function recho() { - if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - - local first="${1:1}"; shift - echo "$first$@" - else - echo "$@" - fi -} -function recho_() { - if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - - local first="${1:1}"; shift - echo -n "$first$@" - else - echo -n "$@" - fi -} -function _qval() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s//\$/\\\$}" - s="${s//\`/\\\`}" - recho_ "$s" -} -function should_quote() { - local l="${#1}" - [ $l -eq 0 -o $l -gt 80 ] && return 0 - local s="${*//[a-zA-Z0-9]/}" - s="${s//,/}" - s="${s//./}" - s="${s//+/}" - s="${s//\//}" - s="${s//-/}" - s="${s//_/}" - s="${s//=/}" - [ -n "$s" ] -} -function qval() { - echo -n \" - _qval "$@" - echo \" -} -function qvalm() { - if should_quote "$*"; then - echo -n \" - _qval "$@" - echo \" - else - recho "$*" - fi -} -function qvalr() { - if [ -z "$*" ]; then - : - elif should_quote "$*"; then - echo -n \" - _qval "$@" - echo \" - else - recho "$*" - fi -} -function qvals() { - local arg first=1 - for arg in "$@"; do - [ -z "$first" ] && echo -n " " - if should_quote "$arg"; then - echo -n \" - _qval "$arg" - echo -n \" - else - recho_ "$arg" - fi - first= - done - [ -z "$first" ] && echo -} -function qwc() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s//\$/\\\$}" - s="${s//\`/\\\`}" - local r a b - while [ -n "$s" ]; do - if [[ "$s" == *\** ]]; then - if [[ "$s" == *\?* ]]; then - a="${s%%\**}" - b="${s%%\?*}" - if [ ${#a} -lt ${#b} ]; then - s="${s#*\*}" - r="$r\"$a\"*" - else - s="${s#*\?}" - r="$r\"$b\"?" - fi - else - a="${s%%\**}" - s="${s#*\*}" - r="$r\"$a\"*" - fi - elif [[ "$s" == *\?* ]]; then - if [[ "$s" == *\** ]]; then - a="${s%%\**}" - b="${s%%\?*}" - if [ ${#a} -lt ${#b} ]; then - s="${s#*\*}" - r="$r\"$a\"*" - else - s="${s#*\?}" - r="$r\"$b\"?" - fi - else - a="${s%%\?*}" - s="${s#*\?}" - r="$r\"$a\"?" - fi - else - r="$r\"$s\"" - break - fi - done - recho_ "$r" -} -function qlines() { - sed "s/'/'\\\\''/g; s/.*/'&'/g" -} -function setv() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - eval "$__s_var=\"\$*\"" -} -function _setv() { - local __s_var="$1"; shift - eval "$__s_var=\"\$*\"" -} -function echo_setv() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - echo "$__s_var=$(qvalr "$*")" -} -function setx() { - if [ "$1" == -a ]; then - shift - local __s_array="$1"; shift - if [[ "$__s_array" == *=* ]]; then - set -- "${__s_array#*=}" "$@" - __s_array="${__s_array%%=*}" - fi - eval "$__s_array=($("$@" | qlines))" - else - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - eval "$__s_var="'"$("$@")"' - fi -} -function _setvx() { - local __s_var="$1"; shift - eval "$__s_var="'"$("$@")"' -} -function _setax() { - local __s_array="$1"; shift - eval "$__s_array=($("$@" | qlines))" -} -function evalx() { - local __e_val __e_arg __e_r=0 - local -a __e_cmd - - local __e_first=1 - while [ $# -gt 0 ]; do - __e_cmd=() - while [ $# -gt 0 ]; do - __e_arg="$1"; shift - [ "$__e_arg" == // ] && break - if [ "${__e_arg%//}" != "$__e_arg" ]; then - local __e_tmp="${__e_arg%//}" - if [ -z "${__e_tmp//\\/}" ]; then - __e_arg="${__e_arg#\\}" - __e_cmd=("${__e_cmd[@]}" "$__e_arg") - continue - fi - fi - __e_cmd=("${__e_cmd[@]}" "$__e_arg") - done - - if [ -n "$__e_first" ]; then - __e_val="$("${__e_cmd[@]}")" || __e_r=$? - else - __e_val="$("${__e_cmd[@]}" "$__e_val")" || __e_r=$? - fi - __e_first= - done - [ -n "$__e_val" ] && echo "$__e_val" - return $__e_r -} -function setxx() { - local -a __s_args - if [ "$1" == -a ]; then __s_args=(-a); shift; fi - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - __s_args=("${__s_args[@]}" "$__s_var") - setx "${__s_args[@]}" evalx "$@" -} -function evalp() { - local __e_arg __e_cmd - - while [ $# -gt 0 ]; do - __e_arg="$1"; shift - if [ "$__e_arg" == // ]; then - __e_cmd="$__e_cmd |" - continue - elif [ "${__e_arg%//}" != "$__e_arg" ]; then - local __e_tmp="${__e_arg%//}" - if [ -z "${__e_tmp//\\/}" ]; then - __e_arg="${__e_arg#\\}" - fi - fi - __e_cmd="${__e_cmd:+$__e_cmd }\"$(_qval "$__e_arg")\"" - done - eval "$__e_cmd" -} -function setxp() { - local -a __s_args - if [ "$1" == -a ]; then __s_args=(-a); shift; fi - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - __s_args=("${__s_args[@]}" "$__s_var") - setx "${__s_args[@]}" evalp "$@" -} -function testx() { - local __t_op="$1"; shift - local __t_val="$(evalx "$@")" - [ $__t_op "$__t_val" ] -} -function test2x() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalx "$@")" - [ "$__t_val1" $__t_op "$__t_val2" ] -} -function testrx() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalx "$@")" - eval '[[ "$__t_val1" '"$__t_op"' "$__t_val2" ]]' -} -function testp() { - local __t_op="$1"; shift - local __t_val="$(evalp "$@")" - [ $__t_op "$__t_val" ] -} -function test2p() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalp "$@")" - [ "$__t_val1" $__t_op "$__t_val2" ] -} -function testrp() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalp "$@")" - eval '[[ "$__t_val1" '"$__t_op"' "$__t_val2" ]]' -} - -function err2out() { - "$@" 2>&1 -} - -function is_defined() { - [ -n "$(declare -p "$1" 2>/dev/null)" ] -} -function is_array() { - case "$(declare -p "$1" 2>/dev/null)" in declare\ -a*) return 0;; esac - return 1 -} - -function upvar() { - if unset -v "$1"; then - if [ $# -eq 2 ]; then - eval "$1=\"\$2\"" - else - eval "$1=(\"\${@:2}\")" - fi - fi -} -function array_upvar() { - unset -v "$1" && eval "$1=(\"\${@:2}\")" -} -function upvars() { - while [ $# -gt 0 ]; do - case "$1" in - -a) - unset -v "$2" && eval "$2=(\"\${@:3}\")" - break - ;; - -a*) - unset -v "$2" && eval "$2=(\"\${@:3:${1#-a}}\")" - shift $((${1#-a} + 2)) || return 1 - ;; - *) - unset -v "$1" && eval "$1=\"\$2\"" - shift; shift - ;; - esac - done -} - -function __ab_process_pending() { - local -a values - case "$mode" in - cmd) values="$("${pending[@]}")";; - ssplit) eval "values=($("${pending[@]}"))";; - lsplit) eval "values=($("${pending[@]}" | qlines))";; - add) values=("${pending[@]}");; - esac - cmd=("${cmd[@]}" "${values[@]}") - pending=() -} -function array_buildcmd() { - local desta="$1"; shift; local "$desta" - local mode=add - local -a pending cmd - while [ $# -gt 0 ]; do - case "$1" in - ++c|++cmd|++) __ab_process_pending; mode=cmd;; - ++s|++ssplit) __ab_process_pending; mode=ssplit;; - ++l|++lsplit) __ab_process_pending; mode=lsplit;; - ++a|++add) __ab_process_pending; mode=add;; - *) pending=("${pending[@]}" "$1");; - esac - shift - done - __ab_process_pending - array_upvar "$desta" "${cmd[@]}" -} -function buildcmd() { - local -a args - array_buildcmd args "$@" - qvals "${args[@]}" -} -function evalcmd() { - local -a args - array_buildcmd args "$@" - "${args[@]}" -} -##@inc]base.core -##@inc[base.num -## Fonctions de base: gestion des valeurs numériques -uprovide base.num - -function isnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//[0-9]/}" - [ -z "$v" ] -} -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - [ -z "${1//[0-9]/}" ] -} -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//./}" - v="${v//,/}" - v="${v//[0-9]/}" - [ -z "$v" ] -} -##@inc]base.num -##@inc[base.bool -## Fonctions de base: valeurs booléennes -##@inc[base.num -## Fonctions de base: gestion des valeurs numériques -uprovide base.num - -function isnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//[0-9]/}" - [ -z "$v" ] -} -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - [ -z "${1//[0-9]/}" ] -} -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//./}" - v="${v//,/}" - v="${v//[0-9]/}" - [ -z "$v" ] -} -##@inc]base.num -uprovide base.bool -urequire base.num - -function is_yes() { - case "${1,,}" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - esac - isnum "$1" && [ "$1" -ne 0 ] && return 0 - return 1 -} -function is_no() { - case "${1,,}" in - n|non|no|f|faux|false|off) return 0;; - esac - isnum "$1" && [ "$1" -eq 0 ] && return 0 - return 1 -} -function yesval() { - is_yes "$1" && echo 1 -} - -function setb() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - local __s_r - if "$@" >/dev/null; then - eval "$__s_var=1" - else - __s_r=$? - eval "$__s_var=" - return $__s_r - fi -} -function _setb() { - local __s_var="$1"; shift - if "$@" >/dev/null; then - eval "$__s_var=1" - else - eval "$__s_var=" - fi -} - -function evalb() { - if evalx "$@" >/dev/null; then - echo 1 - else - return $? - fi -} -function setxb() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - setx "$__s_var" evalb "$@" -} -##@inc]base.bool -##@inc[base.quote -## Fonctions de base: protection de valeurs chaine -uprovide base.quote -urequire base.core - -function _qawk() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s// -/\\n}" - recho_ "$s" -} -function qawk() { - echo -n \" - _qawk "$@" - echo \" -} -function qseds() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\//\\/}" - s="${s// -/\\n}" - recho "$s" -} -function _qform() { - local s="$*" - s="${s//\%/%25}" - s="${s//+/%2B}" - s="${s//&/%26}" - s="${s//=/%3D}" - s="${s// /+}" - recho_ "$s" -} -function qform() { - local s="$*" - if [[ "$s" == *=* ]]; then - _qform "${s%%=*}" - echo -n = - _qform "${s#*=}" - echo - else - _qform "$s" - echo - fi -} -function _qsql() { - local q="'" qq="''" - echo "${*//$q/$qq}" -} -function qsql() { - local q="'" qq="''" - echo "'${*//$q/$qq}'" -} -##@inc]base.quote -uprovide base.compat -urequire base.core base.num base.bool base.quote - - -function setx2() { setxx "$@"; } -function rawecho() { recho "$@"; } -function rawecho_() { recho_ "$@"; } -function quote_arg() { _qval "$@"; } -function quoted_arg() { qvalm "$@"; } -function quoted_args() { qvals "$@"; } -function set_var() { setv "$@"; } -function set_var_cmd() { echo_setv "$@"; } -function set_var_literal() { eval "$1=$2"; } - -function quote_awk() { _qawk "$@"; } -function quoted_awk() { qawk "$@"; } -function quote_seds() { qseds "$@"; } -function quote_form() { _qform "$@"; } -function quoted_form() { qform "$@"; } - - -if [ -n "$BASH_VERSINFO" -a "${BASH_VERSINFO[0]}" -lt 4 ]; then - function strlower() { tr A-Z a-z <<<"$*"; } - function strlower1() { - local str="$*" - local h="${str:0:1}" r="${str:1}" - echo "$(tr A-Z a-z <<<"$h")$r" - } - function strlowers() { - local -a vs; local v - for v in "$@"; do - vs=("${vs[@]}" "$(strlower1 "$v")") - done - echo "${vs[*]}" - } - function strupper() { tr a-z A-Z <<<"$*"; } - function strupper1() { - local str="$*" - local h="${str:0:1}" r="${str:1}" - echo "$(tr a-z A-Z <<<"$h")$r" - } - function struppers() { - local -a vs; local v - for v in "$@"; do - vs=("${vs[@]}" "$(strupper1 "$v")") - done - echo "${vs[*]}" - } - - function is_yes() { - case "$1" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - O|OUI|Y|YES|V|VRAI|T|TRUE|ON) return 0;; - esac - isnum "$1" && [ "$1" -ne 0 ] && return 0 - case "$(strlower "$1")" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - esac - return 1 - } - function is_no() { - case "$1" in - n|non|no|f|faux|false|off) return 0;; - N|NON|NO|F|FAUX|FALSE|OFF) return 0;; - esac - isnum "$1" && [ "$1" -eq 0 ] && return 0 - case "$(strlower "$1")" in - n|non|no|f|faux|false|off) return 0;; - esac - return 1 - } -fi -##@inc]base.compat -uprovide base -urequire base.init base.core base.string base.num base.bool base.array base.quote base.split base.args base.tools base.compat - -UNAME_SYSTEM=`uname -s` -[ "${UNAME_SYSTEM#CYGWIN}" != "$UNAME_SYSTEM" ] && UNAME_SYSTEM=Cygwin -[ "${UNAME_SYSTEM#MINGW32}" != "$UNAME_SYSTEM" ] && UNAME_SYSTEM=Mingw -UNAME_MACHINE=`uname -m` -if [ -n "$UTOOLS_CHROOT" ]; then - [ -n "$UTOOLS_UNAME_SYSTEM" ] && eval "UNAME_SYSTEM=$UTOOLS_UNAME_SYSTEM" - [ -n "$UTOOLS_UNAME_MACHINE" ] && eval "UNAME_MACHINE=$UTOOLS_UNAME_MACHINE" -fi - -function setyesval() { - is_yes "$2" && set_var "$1" 1 || set_var "$1" "" -} -function normyesval() { - is_yes "${2:-"${!1}"}" && set_var "$1" 1 || set_var "$1" "" -} -function normyesvals() { - local __nyv_yesvar - for __nyv_yesvar in "$@"; do - is_yes "${!__nyv_yesvar}" && set_var "$__nyv_yesvar" 1 || set_var "$__nyv_yesvar" "" - done -} -function quote_in() { - sed 's/\\/\\\\/g -s/"/\\"/g -s/\$/\\$/g -s/`/\\`/g' -} -function quote_sin() { - sed "s/'/'\\\\''/g" -} -function quote_sarg() { - quote_sin <<<"$1" -} -function quoted_sarg() { - echo "'$(quote_sarg "$1")'" -} -function quoted_sargs() { - local a s - for a in "$@"; do - s="${s:+$s }$(quoted_sarg "$a")" - done - rawecho "$s" -} - -function set_array_cmd() { - [ $# -eq 1 ] && set -- "$1" "$1" - local __sac_s __sac_v __sac_f - __sac_s="$1=("; shift - if [ "$1" == "@" ]; then - shift - else - eval "set -- \"\${$1[@]}\"" - fi - __sac_f=1 - for __sac_v in "$@"; do - [ -n "$__sac_f" ] && __sac_f= || __sac_s="$__sac_s " - __sac_s="$__sac_s$(quoted_arg "$__sac_v")" - done - __sac_s="$__sac_s)" - echo "$__sac_s" -} -function set_array() { - eval "$(set_array_cmd "$@")" -} -function array_count() { - eval "echo \${#$1[*]}" -} -function array_isempty() { - [ $(array_count "$1") -eq 0 ] -} -function array_new() { - eval "$1=()" -} -function array_add() { - local __aa_a="$1"; shift - eval "$__aa_a=(\"\${$__aa_a[@]}\" \"\$@\")" -} -function array_ins() { - local __aa_a="$1"; shift - eval "$__aa_a=(\"\$@\" \"\${$__aa_a[@]}\")" -} -function array_del() { - local __ad_v - local -a __ad_vs - eval 'for __ad_v in "${'"$1"'[@]}"; do - if [ "$__ad_v" != '"$(quoted_arg "$2")"' ]; then - array_add __ad_vs "$__ad_v" - fi -done' - array_copy "$1" __ad_vs -} -function array_addu() { - local __as_v - eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then - return 1 - fi -done' - array_add "$1" "$2" - return 0 -} -function array_set() { - array_addu "$@" -} -function array_insu() { - local __as_v - eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then - return 1 - fi -done' - array_ins "$1" "$2" - return 0 -} -function array_fillrange() { - local -a __af_vs - local __af_i="${2:-1}" __af_to="${3:-10}" __af_step="${4:-1}" - while [ "$__af_i" -le "$__af_to" ]; do - __af_vs=("${__af_vs[@]}" "$__af_i") - __af_i=$(($__af_i + $__af_step)) - done - array_copy "$1" __af_vs -} -function array_eq() { - local -a __ae_a1 __ae_a2 - array_copy __ae_a1 "$1" - array_copy __ae_a2 "$2" - [ ${#__ae_a1[*]} -eq ${#__ae_a2[*]} ] || return 1 - local __ae_v __ae_i=0 - for __ae_v in "${__ae_a1[@]}"; do - [ "$__ae_v" == "${__ae_a2[$__ae_i]}" ] || return 1 - __ae_i=$(($__ae_i + 1)) - done - return 0 -} -function array_contains() { - local __ac_v - eval 'for __ac_v in "${'"$1"'[@]}"; do - if [ "$__ac_v" == '"$(quoted_arg "$2")"' ]; then - return 0 - fi -done' - return 1 -} -function array_find() { - local __af_i __af_v - __af_i=0 - eval 'for __af_v in "${'"$1"'[@]}"; do - if [ "$__af_v" == '"$(quoted_arg "$2")"' ]; then - if [ -n "$3" ]; then - echo "${'"$3"'[$__af_i]}" - else - echo "$__af_i" - fi - return 0 - fi - __af_i=$(($__af_i + 1)) -done' - return 1 -} -function array_reverse() { - local -a __ar_vs - local __ar_v - array_copy __ar_vs "$1" - array_new "$1" - for __ar_v in "${__ar_vs[@]}"; do - array_ins "$1" "$__ar_v" - done -} - -function array_replace() { - local __ar_sn="$1"; shift - local __ar_f="$1"; shift - local -a __ar_s __ar_d - local __ar_v - array_copy __ar_s "$__ar_sn" - for __ar_v in "${__ar_s[@]}"; do - if [ "$__ar_v" == "$__ar_f" ]; then - __ar_d=("${__ar_d[@]}" "$@") - else - __ar_d=("${__ar_d[@]}" "$__ar_v") - fi - done - array_copy "$__ar_sn" __ar_d -} -function array_each() { - local __ae_an="$1"; shift - local __ae_f="$1"; shift - local -a __ae_a - local __ae_v - array_copy __ae_a "$__ae_an" - for __ae_v in "${__ae_a[@]}"; do - "$__ae_f" "$__ae_v" "$@" - done -} -function array_map() { - local __am_an="$1"; shift - local __am_f="$1"; shift - local -a __am_a __am_vs - local __am_v - array_copy __am_a "$__am_an" - for __am_v in "${__am_a[@]}"; do - __am_vs=("${__am_vs[@]}" "$("$__am_f" "$__am_v" "$@")") - done - array_copy "$__am_an" __am_vs -} -function first_value() { - eval "rawecho \"\${$1[@]:0:1}\"" -} -function last_value() { - eval "rawecho \"\${$1[@]:\$((-1)):1}\"" -} -function array_copy() { - eval "$1=(\"\${$2[@]}\")" -} -function array_copy_firsts() { - eval "$1=(\"\${${2:-$1}[@]:0:\$((\${#${2:-$1}[@]}-1))}\")" -} -function array_del_last() { - array_copy_firsts "$1" -} -function array_copy_lasts() { - eval "$1=(\"\${${2:-$1}[@]:1}\")" -} -function array_del_first() { - array_copy_lasts "$1" -} -function array_extend() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]}\")" -} -function array_extendu() { - local __ae_v __ae_s=1 - eval 'for __ae_v in "${'"$2"'[@]}"; do - array_addu "$1" "$__ae_v" && __ae_s=0 -done' - return "$__ae_s" -} -function array_extend_firsts() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]:0:\$((\${#$2[@]}-1))}\")" -} -function array_extend_lasts() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]:1}\")" -} -function array_xsplit() { - eval "$1=($(recho_ "$2" | awkrun RS="${3:-:}" ' -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_split() { - eval "$1=($(recho_ "$2" | awkrun RS="${3:-:}" ' -/^$/ { next } -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_from_path() { - array_split "$1" "$2" ":" -} -function array_from_xlines() { - eval "$1=($(recho_ "$2" | _nl2lf | awk ' -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_from_lines() { - eval "$1=($(recho_ "$2" | _nl2lf | awk ' -/^$/ { next } -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_join() { - local __aj_an __aj_l __aj_j __aj_s="${2:-,}" __aj_pf __aj_sf - if [ "$1" == "@" ]; then - __aj_an="\$@" - shift; shift - else - __aj_an="\${$1[@]}" - __aj_pf="$4" - __aj_sf="$5" - fi - eval 'for __aj_l in "'"$__aj_an"'"; do - __aj_j="${__aj_j:+$__aj_j'"$__aj_s"'}$__aj_pf$__aj_l$__aj_sf" -done' - if [ -n "$__aj_j" ]; then - rawecho "$__aj_j" - elif [ "$__aj_an" != "\$@" -a -n "$3" ]; then - rawecho "$3" - fi -} -function array_mapjoin() { - local __amj_src="$1" __amj_func="$2" __amj_sep="$3" - shift; shift; shift - if [ "$__amj_src" == "@" ]; then - local -a __amj_tmpsrc - __amj_tmpsrc=("$@") - __amj_src=__amj_tmpsrc - set -- - fi - local -a __amj_tmp - array_copy __amj_tmp "$__amj_src" - array_map __amj_tmp "$__amj_func" - array_join __amj_tmp "$__amj_sep" "$@" -} -function array_to_lines() { - array_join "$1" " -" "$2" "$3" "$4" -} -function array_to_path() { - array_join "$1" ":" "$2" "$3" "$4" -} -function array_fix_paths() { - local __afp_an="$1" __afp_s="${2:-:}" - local -a __afp_vs - local __afp_v - array_copy __afp_vs "$__afp_an" - array_new "$__afp_an" - for __afp_v in "${__afp_vs[@]}"; do - array_split __afp_v "$__afp_v" "$__afp_s" - array_extend "$__afp_an" __afp_v - done -} - - -function get_date_rfc822() { - LC_TIME=C date +"%a, %d %b %Y %H:%M:%S %Z" -} -function get_date_fr() { - LC_TIME=C date +"%d/%m/%Y" -} -function get_time_fr() { - LC_TIME=C date +"%Hh%M" -} -function parse_date() { - local value="$1" type="${2:-date}" - local now="$(awk 'BEGIN { print mktime(strftime("%Y %m %d 00 00 00 +0400")) }')" - case "$value" in - +*) - value="$(($now + ${value#+} * 86400))" - ;; - *) - value="$(<<<"$value" awk -F/ '{ - nd = strftime("%d"); nm = strftime("%m"); ny = strftime("%Y") - d = $1 + 0; if (d < 1) d = nd; - m = $2 + 0; if (m < 1) m = nm; - if ($3 == "") y = ny; - else { y = $3 + 0; if (y < 100) y = y + 2000; } - print mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d)); - }')" - esac - case "$type" in - d|date) awk '{ print strftime("%d/%m/%Y", $0 + 0) }' <<<"$value";; - l|ldap) awk '{ print strftime("%Y%m%d%H%M%S+0400", $0 + 0) }' <<<"$value";; - m|mysql) awk '{ print strftime("%Y-%m-%d", $0 + 0) }' <<<"$value";; - *) - rawecho "$value" - ;; - esac -} - - -function udelpath() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; ${2:-PATH}"'="${'"${2:-PATH}"'#$1:}"; '"${2:-PATH}"'="${'"${2:-PATH}"'%:$1}"; '"${2:-PATH}"'="${'"${2:-PATH}"'//:$_qdir:/:}"; [ "$'"${2:-PATH}"'" == "$1" ] && '"${2:-PATH}"'=' -} -function uaddpath() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="${'"${2:-PATH}"':+$'"${2:-PATH}"':}$1"' -} -function uinspathm() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="$1${'"${2:-PATH}"':+:$'"${2:-PATH}"'}"' -} -function uinspath() { - udelpath "$@" - uinspathm "$@" -} - -function withpath() { - [ "${1#./}" != "$1" -o "${1#../}" != "$1" -o "${1#/}" != "$1" ] -} -function withext() { - local basename="$(basename -- "$1")" - [ "${basename%.*}" != "$basename" ] -} -function normpath() { - local -a parts - local part ap - array_split parts "$1" / - if [ "${1#/}" != "$1" ]; then - ap=/ - elif [ -n "$2" ]; then - ap="$2" - else - ap="$(pwd)" - fi - for part in "${parts[@]}"; do - if [ "$part" == "." ]; then - continue - elif [ "$part" == ".." ]; then - ap="${ap%/*}" - [ -n "$ap" ] || ap=/ - else - [ "$ap" != "/" ] && ap="$ap/" - ap="$ap$part" - fi - done - rawecho "$ap" -} -function abspath() { - local ap="$1" - if [ "${ap#/}" != "$ap" ]; then - __normpath "$ap" && return - else - local cwd - if [ -n "$2" ]; then - cwd="$(abspath "$2")" - else - cwd="$(pwd)" - fi - ap="$cwd/$ap" - __normpath "$ap" && return - fi - normpath "$ap" -} -function __normpath() { - if [ -d "$1" ]; then - if [ -x "$1" ]; then - (cd "$1"; pwd) - return 0 - fi - elif [ -f "$1" ]; then - local dn="$(dirname -- "$1")" bn="$(basename -- "$1")" - if [ -x "$dn" ]; then - (cd "$dn"; echo "$(pwd)/$bn") - return 0 - fi - fi - return 1 -} -function parentdirs() { - array_new "$1" - local __pd_d="$(abspath "$2")" - if [[ "$3" == r* ]]; then - while [ "$__pd_d" != "/" ]; do - array_ins "$1" "$__pd_d" - __pd_d="$(dirname "$__pd_d")" - done - else - while [ "$__pd_d" != "/" ]; do - array_add "$1" "$__pd_d" - __pd_d="$(dirname "$__pd_d")" - done - fi -} -function ppath() { - local path="$1" cwd="$2" - - path="$(abspath "$path")" # essayer de normaliser le chemin - [ -n "$cwd" ] || cwd="$(pwd)" - - [ "$path" = "$cwd" ] && path="." - [ "$cwd" != "/" -a "$cwd" != "$HOME" ] && path="${path/#$cwd\//}" - path="${path/#$HOME/~}" - - rawecho "$path" -} -function relpath() { - local p="$(abspath "$1" "$3")" cwd="$2" - if [ -z "$cwd" ]; then - cwd="$(pwd)" - else - cwd="$(abspath "$cwd" "$3")" - fi - if [ "$p" == "$cwd" ]; then - echo "" - elif [ "${p#$cwd/}" != "$p" ]; then - rawecho "${p#$cwd/}" - else - local rp - while [ -n "$cwd" -a "${p#$cwd/}" == "$p" ]; do - rp="${rp:+$rp/}.." - cwd="${cwd%/*}" - done - rp="$rp/${p#$cwd/}" - echo "${rp%//}" - fi -} -function relpathx() { - local p="$(relpath "$@")" - if [ -z "$p" ]; then - echo . - elif [ "${p#../}" != "$p" -o "${p#./}" != "$p" ]; then - echo "$p" - else - echo "./$p" - fi -} -function withinpath() { - local b="$1" p="$2" strict="${3:-N}" - b="$(abspath "$b")" - p="$(abspath "$p")" - if is_yes "$strict"; then - [ "${p#$b/}" != "$p" ] - else - [ "$p" == "$b" -o "${p#$b/}" != "$p" ] - fi -} -function safe_abspath() { - local p="$1" ba="$2" br="$3" - if [ -n "$ba" ]; then - ba="$(abspath "$ba")" - else - ba="$(pwd)" - fi - [ -n "$br" ] || br="$ba" - br="$(abspath "$br" "$ba")" - p="$(abspath "$p" "$ba")" - if [ "$p" == "$br" -o "${p#$br/}" != "$p" ]; then - echo "$p" - else - return 1 - fi -} -function safe_relpath() { - local p - if p="$(safe_abspath "$1" "$2" "$3")"; then - relpath "$p" "$2" "$(pwd)" - else - return 1 - fi -} -function splitwcs() { - local __sw_p="$1" - local __sw_dd="${2:-basedir}" __sw_df="${3:-filespec}" __sw_part __sw_d __sw_f - local -a __sw_parts - array_split __sw_parts "$__sw_p" "/" - for __sw_part in "${__sw_parts[@]}"; do - if [[ "$__sw_part" == *\** ]] || [[ "$__sw_part" == *\?* ]] || [ -n "$__sw_f" ]; then - __sw_f="${__sw_f:+$__sw_f/}$__sw_part" - else - __sw_d="${__sw_d:+$__sw_d/}$__sw_part" - fi - done - [ "${__sw_p#/}" != "$__sw_p" ] && __sw_d="/$__sw_d" - set_var "$__sw_dd" "$__sw_d" - set_var "$__sw_df" "$__sw_f" -} -function deref() { - local OENC="$UTF8" - - local max_deref=50 - local file="$1" - local basedir link - while [ -L "$file" ]; do - basedir="$(dirname "$file")" - link="$(readlink "$file")" - if first_char_is "$link" "/"; then - file="$link" - else - file="$basedir/$link" - fi - - max_deref=$(($max_deref - 1)) - [ $max_deref -eq 0 ] && die "Plus de 50 indirection. Le lien $file est-il récursif?" - done - abspath "$file" -} -function readlinka() { - if [ -L "$1" ]; then - local linkdir="$(dirname -- "$1")" - abspath "$(readlink "$1")" "$linkdir" - else - abspath "$1" - fi -} -function readlinkm() { - readlink -m "$1" -} -function path_if_test() { - local op="$1"; shift - local file="$1"; shift - local rel="$1" reldir=; shift - if beginswith "$rel" relative; then - reldir="${rel#relative}" - if beginswith "$reldir" :; then - reldir="${reldir#:}" - if [ -n "$reldir" ]; then - reldir="${reldir}/" - fi - else - reldir= - fi - else - rel= - fi - - while [ -n "$1" ]; do - local basedir="$1" - if [ $op "$basedir/$file" ]; then - if [ -n "$rel" ]; then - rawecho "$reldir$file" - else - rawecho "$basedir/$file" - fi - break - fi - shift - done -} -function update_link() { - [ -L "$2" ] || return 1 - local dest link="$2" - local linkdir="$(dirname "$link")" - local ldest="$(readlink "$link")" - if [ "${ldest#/}" != "$ldest" ]; then - dest="$(abspath "$1")" - else - dest="$(relpath "$1" "$linkdir")" - fi - if [ "$dest" == "$ldest" ]; then - : # pas besoin de mettre à jour - elif [ -d "$link" ]; then - rm -f "$link" && ln -s "$dest" "$link" - else - ln -sf "$dest" "$link" - fi -} -function update_links() { - [ -n "$1" ] || return 1 - local dest="$1"; shift - local r=0 link - for link in "$@"; do - update_link "$dest" "$link" || r=$? - done - return $r -} -function move_link() { - [ -n "$1" -a -n "$2" ] || return 1 - local link="$1" dest="$2" - [ -d "$dest" ] && dest="$dest/$(basename -- "$link")" - dest="$(abspath "$dest")" - if [ -L "$link" ]; then - link="$(abspath "$link")" - [ "$dest" == "$link" ] && return 0 - ldest="$(readlinka "$link")" - mv "$link" "$dest" || return 1 - update_link "$ldest" "$dest" - else - [ "$dest" == "$link" ] && return 0 - mv "$link" "$dest" - fi -} -function array_find_links() { - local -a __afl_links __afl_result - local __afl_dir="${3:-.}" - local __afl_dest __afl_destname __afl_link __afl_linkdir __afl_ldest - __afl_dest="$(abspath "$2")" - __afl_destname="${__afl_dest##*/}" - array_from_lines __afl_links "$(find "$__afl_dir" -type l)" - for __afl_link in "${__afl_links[@]}"; do - __afl_ldest="$(readlink "$__afl_link")" - if [ "$__afl_ldest" != "$__afl_destname" ]; then - [[ "$__afl_ldest" == */"$__afl_destname" ]] || continue - fi - __afl_link="$(abspath "$__afl_link" "$__afl_dir")" - __afl_linkdir="$(dirname -- "$__afl_link")" - __afl_ldest="$(abspath "$__afl_ldest" "$__afl_linkdir")" - if [ "$__afl_ldest" == "$__afl_dest" ]; then - array_add __afl_result "$__afl_link" - fi - done - array_copy "$1" __afl_result -} -function list_links() { - local -a links - array_find_links links "$@" - array_to_lines links -} -function move_file() { - [ -n "$1" -a -n "$2" ] || return 1 - local src="$1" dest="$2" link - shift; shift - [ -d "$dest" ] && dest="$dest/$(basename -- "$src")" - move_link "$src" "$dest" || return 1 - update_links "$dest" "$@" -} - -function get_nblines() { - [ -f "$1" ] && sed -ne '$=' "$1" || echo 0 -} -function mktempf() { - mktemp "${1:-"$TMPDIR/tmp.XXXXXX"}" -} -function mktempd() { - mktemp -d "${1:-"$TMPDIR/tmp.XXXXXX"}" -} -function mkdirof() { - mkdir -p "$(dirname -- "$1")" -} -function cp_a() { - /bin/cp -a "$@" -} -function cp_R() { - /bin/cp -pR "$@" -} -function quietgrep() { - grep -q "$@" 2>/dev/null -} -function quietdiff() { - diff -q "$@" >&/dev/null -} -function testsame() { - quietdiff "$@" -} -function testdiff() { - ! quietdiff "$@" -} -function testupdated() { - if [ -f "$2" ]; then - testdiff "$1" "$2" - else - return 0 - fi -} -function testnewer() { - test ! -e "$2" -o "$1" -nt "$2" -} -function ps_all() { - ps -axww -} -function progexists() { - test -n "$1" -a -x "$(which "$1" 2>/dev/null)" -} -function has_python() { - progexists python -} -function has_gawk() { - progexists gawk -} -function is_root() { - test `id -u` -eq 0 -} -function source_ifexists() { - if [ -f "$1" ]; then source "$1" || die; fi -} -function little_sleep { - LC_NUMERIC=C sleep 0.1 -} -function random_sleep { - sleep $(($RANDOM % ${1:-1800})) -} -function is_running() { - kill -0 "$1" >&/dev/null -} -function sedi() { - sed -i "$@" -} -function csort() { - LANG=C sort "$@" -} -function lsort() { sort "$@"; } -function cgrep() { - LANG=C grep "$@" -} -function lgrep() { grep "$@"; } -function csed() { - LANG=C sed "$@" -} -function lsed() { sed "$@"; } -function cawk() { - LANG=C awk "$@" -} -function lawk() { awk "$@"; } -function cdiff() { - LANG=C diff "$@" -} -function ldiff() { diff "$@"; } - - -function fix_mode() { - local file="$1" - [ -f "$file" ] || touch "$file" || return 1 - if [ ! -w "$file" ]; then - local mode="$(stat -c %a "$file")" - chmod ${mode:0:${#mode}-3}6${mode:${#mode}-2:2} "$file" - echo "$mode" - fi -} -function unfix_mode() { - [ -n "$2" ] && chmod "$2" "$1" -} -function get_mode() { - [ -f "$1" ] || touch "$1" || return 1 - stat -c %a "$1" -} -function rm_maybe() { - local parse_opts=1 arg rm - for arg in "$@"; do - if [ -n "$parse_opts" ]; then - if [ "$arg" == "--" ]; then - parse_opts= - elif [[ "$arg" == "-*" ]]; then - continue - elif [ -n "$arg" ]; then - rm=1 - break - fi - elif [ -n "$arg" ]; then - rm=1 - break - fi - done - [ -n "$rm" ] && /bin/rm "$@" -} -__CPDIR_RSYNC_SLOW=1 # synchro potentiellement plus lente, mais plus fidèle (option -c) -__CPDIR_RSYNC_ARGS=(-q) -function cpdir() { - - if progexists rsync; then - [ -d "$2" ] || mkdir -p "$2" || return 1 - if [ -d "$1" ]; then - rsync -a ${__CPDIR_RSYNC_SLOW:+-c} "${__CPDIR_RSYNC_ARGS[@]}" "$1/" "$2/" - else - rsync -a ${__CPDIR_RSYNC_SLOW:+-c} "${__CPDIR_RSYNC_ARGS[@]}" "$1" "$2/" - fi - else - __cpdir "$@" - fi -} -function __cpdir() { - local src="$1" dest="$2" method="${3:-cp_a}" - - if [ -d "$src" ]; then - [ -d "$dest" ] || mkdir -p "$dest" || return 1 - - local prevdir="$(pwd)" - - dest="$(abspath "$dest")" - cd "$src" - if [ -n "$(/bin/ls -a1)" ]; then - [ -n "$(/bin/ls -1)" ] && "$method" * "$dest" - local i - for i in .*; do - [ "$i" == "." -o "$i" == ".." ] && continue - "$method" "$i" "$dest" - done - fi - cd "$prevdir" - else - if [ -f "$dest" ]; then - "$method" "$src" "$dest" - elif [ -d "$dest" ]; then - "$method" "$src" "$dest" - else - mkdir -p "$dest" - "$method" "$src" "$dest" - fi - fi -} -__CPNOVCS_RSYNC_SLOW=1 # synchro potentiellement plus lente, mais plus fidèle (option -c) -__CPNOVCS_RSYNC_ARGS=(-q) -function cpnovcs() { - local src="$1" destdir="$2" - [ -d "$destdir" ] || mkdir -p "$destdir" || return 1 - if progexists rsync; then - local gitexclude=/.git/ - if [ "${src%/}" == "$src" ]; then - gitexclude="/$(basename -- "$src")$gitexclude" - fi - rsync -a ${__CPNOVCS_RSYNC_SLOW:+-c} --exclude CVS/ --exclude .svn/ --exclude "$gitexclude" "${__CPNOVCS_RSYNC_ARGS[@]}" "$src" "$destdir/" - elif [ "${src%/}" != "$src" ]; then - __cpdir "$src" "$destdir" - else - local srcname="$(basename -- "$src")" - mkdir -p "$destdir/$srcname" - __cpdir "$src" "$destdir/$srcname" - fi -} -function cpdirnovcs() { - if [ -d "$1" ]; then - cpnovcs "$1/" "$2" - else - cpnovcs "$1" "$2" - fi -} -function doinplace() { - if [ -n "$1" -a "$1" != "-" ]; then - local __dip_file="$1"; shift - autoclean "$__dip_file.tmp.$$" - "$@" <"$__dip_file" >"$__dip_file.tmp.$$" - local s=$? - [ "$s" == 0 ] && /bin/cat "$__dip_file.tmp.$$" >"$__dip_file" - /bin/rm -f "$__dip_file.tmp.$$" - return $s - else - shift - "$@" - fi -} -function doinplacef() { - if [ -n "$1" -a "$1" != "-" ]; then - local __dip_file="$1"; shift - autoclean "$__dip_file.tmp.$$" - "$@" <"$__dip_file" >"$__dip_file.tmp.$$" - local s=$? - /bin/cat "$__dip_file.tmp.$$" >"$__dip_file" - /bin/rm -f "$__dip_file.tmp.$$" - return $s - else - shift - "$@" - fi -} -function stripnl() { - tr -d '\r\n' -} -function _nl2lf() { - awk 'BEGIN {RS="\r|\r\n|\n"} {print}' -} -function nl2lf() { - doinplace "$1" _nl2lf -} -function _nl2crlf() { - awk 'BEGIN {RS="\r|\r\n|\n"} {print $0 "\r"}' -} -function nl2crlf() { - doinplace "$1" _nl2crlf -} -function _nl2cr() { - awk 'BEGIN {RS="\r|\r\n|\n"; ORS=""} {print $0 "\r"}' -} -function nl2cr() { - doinplace "$1" _nl2cr -} -function _latin1compat() { - LANG=fr_FR.UTF-8 sed $' -s/[‘’]/\x27/g -s/[«»“”]/"/g -s/[\xC2\xA0\xE2\x80\x87\xE2\x80\xAF\xE2\x81\xA0]/ /g -' -} -function _noaccents() { - LANG=fr_FR.UTF-8 sed ' -s/[à]/a/g -s/[éèêë]/e/g -s/[ïî]/i/g -s/[ôö]/o/g -s/[üû]/u/g -s/[ç]/c/g -s/[À]/A/g -s/[ÉÈÊË]/E/g -s/[ÏÎ]/I/g -s/[ÔÖ]/O/g -s/[ÜÛ]/U/g -s/[Ç]/C/g -' -} -function list_all() { - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ "$f" == "." -o "$f" == ".." ] && continue - rawecho "$f" - done - cd "$curdir" -} -function __la_cmd() { - [ $# -gt 0 ] || set '*' - local arg - local cmd="/bin/ls -1d" - for arg in "$@"; do - arg="$(_rval "$arg")" - cmd="$cmd $arg" - done - cmd="$cmd 2>/dev/null" - echo "$cmd" -} -function list_files() { - local f - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ -f "$f" ] && rawecho "$f" - done - cd "$curdir" -} -function list_dirs() { - local f - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ "$f" == "." -o "$f" == ".." ] && continue - [ -d "$f" ] && rawecho "$f" - done - cd "$curdir" -} -function __array_ls() { - local __al_l="list_${1:-all}"; shift - local __al_an="$1"; shift - local __al_d="${1:-.}"; shift - local -a __al_fs - array_from_lines __al_fs "$("$__al_l" "$__al_d" "$@")" - local __al_f - array_new "$__al_an" - for __al_f in "${__al_fs[@]}"; do - array_add "$__al_an" "$__al_d/$__al_f" - done -} -function array_lsall() { - __array_ls all "$@" -} -function array_lsdirs() { - __array_ls dirs "$@" -} -function array_lsfiles() { - __array_ls files "$@" -} -function filter_empty() { - sed '/^$/d' -} -function filter_vcspath() { - sed ' -/^.git$/d -/^.git\//d -/\/.git$/d -/\/.git\//d -/^.svn$/d -/^.svn\//d -/\/.svn$/d -/\/.svn\//d -' -} -function merge_contlines() { - awk 'substr($0, length($0)) == "\\" { - while (getline nextline) { - $0 = substr($0, 1, length($0) - 1) nextline - if (substr($0, length($0)) != "\\") break - } - print - next -} -{print}' -} -function filter_comment() { - local -a merge - [ "$1" == -m ] && merge=(merge_contlines) || merge=(cat) - awk ' - /^[ \t]*#/ { next } - /^[ \t]*$/ { next } - { print }' | "${merge[@]}" -} -function filter_conf() { - local -a merge - [ "$1" == -m ] && merge=(merge_contlines) || merge=(cat) - grep -v '^#' | grep -v '^$' | "${merge[@]}" -} -function is_archive() { - local name="${1%.zip}" - name="${name%.tgz}" - name="${name%.tbz2}" - name="${name%.tar.gz}" - name="${name%.tar.bz2}" - name="${name%.tar}" - name="${name%.jar}" - name="${name%.war}" - name="${name%.ear}" - [ "$name" != "$1" ] -} -function extract_archive() { - local arch="$1" destdir="${2:-.}" - shift; shift - if endswith "$arch" .zip; then - unzip -q -d "$destdir" "$arch" "$@" || return - elif endswith "$arch" .tgz || endswith "$arch" .tar.gz; then - tar xzf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .tbz2 || endswith "$arch" .tar.bz2; then - tar xjf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .tar; then - tar xf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .jar || endswith "$arch" .war || endswith "$arch" .ear; then - ( - arch="$(abspath "$arch")" - cd "$destdir" - jar xf "$arch" "$@" - ) || return - else - return 1 - fi -} -function get_archive_basename() { - local basename="$(basename -- "$1")" - basename="${basename%.zip}" - basename="${basename%.tgz}" - basename="${basename%.tbz2}" - basename="${basename%.gz}" - basename="${basename%.bz2}" - basename="${basename%.tar}" - basename="${basename%.jar}" - basename="${basename%.war}" - basename="${basename%.ear}" - echo "$basename" -} -function get_archive_appname() { - local appname="$(basename -- "$1")" - appname="${appname%.zip}" - appname="${appname%.tgz}" - appname="${appname%.tbz2}" - appname="${appname%.gz}" - appname="${appname%.bz2}" - appname="${appname%.tar}" - appname="${appname%.jar}" - appname="${appname%.war}" - appname="${appname%.ear}" - echo "$appname" | awk '{ - if (match($0, /[-_.]([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/)) { - print substr($0, 1, RSTART - 1) - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/)) { - print substr($0, 1, RSTART - 1) - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print substr($0, 1, RSTART - 1) - } else { - print $0 - } -}' -} -function get_archive_versionsuffix() { - local basename="$(get_archive_basename "$1")" - echo "$basename" | awk '{ - if (match($0, /([-_.][0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print vs["1"] - } -}' -} -function get_archive_version() { - local basename="$(get_archive_basename "$1")" - echo "$basename" | awk '{ - if (match($0, /[-_.]([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print vs["1"] - } -}' -} -function __dump_usernames() { - = 500 && $6 ~ /^\/home\// { print $1 }' -} -function dump_usernames() { - array_from_lines "${1:-usernames}" "$(__dump_usernames)" -} -function __resolv_ips() { - LANG=C host "$1" 2>/dev/null | awk '/address / { gsub(/^.*address /, ""); print }' -} -function resolv_ips() { - array_from_lines "${1:-ips}" "$(__resolv_ips "$2")" -} -function __resolv_hosts() { - LANG=C host "$1" 2>/dev/null | awk '/domain name pointer / { gsub(/^.*domain name pointer /, ""); gsub(/\.$/, ""); print }' -} -function resolv_hosts() { - array_from_lines "${1:-hosts}" "$(__resolv_hosts "$2")" -} -function runscript_as() { - local OENC="$UTF8" - local user="${1:-root}"; shift - local exec_maybe= - if [ "$1" = "exec" ]; then - exec_maybe=exec - shift - fi - - local cmd - cmd="\ -__estack=$(quoted_arg "$__estack") -__tlevel=$(quoted_args "$__tlevel") -export __estack __tlevel -exec ${BASH:-/bin/sh} $(quoted_args "$@")" - - if is_yes "$UTOOLS_USES_SU" || ! progexists sudo; then - eecho "Entrez le mot de passe de root" - $exec_maybe su "$user" -c "$cmd" - else - if [ "$user" == "root" ]; then - $exec_maybe sudo -p "Entrez le mot de passe de %u: " "${BASH:-/bin/sh}" -c "$cmd" - else - $exec_maybe sudo -p "Entrez le mot de passe de %u: " su "$user" -c "$cmd" - fi - fi -} -function runscript_as_root() { - if is_root; then - local exec_maybe= - if [ "$1" = "exec" ]; then - exec_maybe=exec - shift - fi - $exec_maybe "${BASH:-/bin/sh}" "$@" - else - runscript_as root "$@" - fi -} -function run_as() { - local user="${1:-root}"; shift - local exec_maybe=exec - if [ "$1" = "--noexec" ]; then - exec_maybe= - shift - fi - - runscript_as "$user" $exec_maybe "$0" "$@" -} -function run_as_root() { - is_root || run_as root "$@" -} -function check_user() { - local user - for user in "$@"; do - [ "$USER" == "$user" ] && return 0 - done - return 1 -} -function ensure_user() { - local -a users - while [ $# -gt 0 -a "$1" != "--" ]; do - array_add users "$1" - shift - done - [ "$1" == "--" ] && shift - - if ! check_user "${users[@]}"; then - if [ ${#users[*]} -gt 1 ]; then - ewarn "Cette commande doit être lancée avec l'un des users ${users[*]}" - else - ewarn "Cette commande doit être lancée avec le user ${users[0]}" - fi - if ask_yesno "Voulez-vous tenter de relancer la commande avec le bon user?" O; then - estep "Lancement du script avec le user ${users[0]}" - run_as "${users[0]}" "$@" - return 1 - elif is_root; then - return 11 - else - return 10 - fi - fi - return 0 -} -function check_hostname() { - local userhost user host path - for userhost in "$@"; do - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - [ "$MYHOSTNAME" == "${host%%.*}" ] && return 0 - done - return 1 -} -function check_userhostname() { - local userhost path user host - for userhost in "$@"; do - if check_hostname "$userhost"; then - [[ "$userhost" == *@* ]] || return 0 - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - check_user "$user" && return 0 - fi - done - return 1 -} -UTOOLS_ENSURE_HOSTNAME_SSH_OPTS=() -function ensure_hostname() { - local -a userhosts - while [ $# -gt 0 -a "$1" != "--" ]; do - array_add userhosts "$1" - shift - done - [ "$1" == "--" ] && shift - - local userhost user host path - if ! check_hostname "${userhosts[@]}"; then - if [ ${#userhosts[*]} -gt 1 ]; then - ewarn "Cette commande n'est valide que sur l'un des hôtes ${userhosts[*]}" - else - ewarn "Cette commande n'est valide que sur l'hôte ${userhosts[0]}" - fi - - enote "Vous pouvez tenter de relancer le script sur ${userhosts[0]}, mais cela requière que ce script ET les données dont il a besoin soient installés dans la même version et dans le même répertoire sur l'hôte distant" - if ask_yesno "Voulez-vous tenter de relancer le script sur l'hôte distant?" N; then - splitfsep "${userhosts[0]}" : userhost path - splituserhost "$userhost" user host - [ -n "$user" ] || user=root - - estep "Lancement de la commande sur l'hôte distant $user@$host" - local cmd - [ -n "$path" ] && cmd="$(quoted_args cd "$path"); " - cmd="$cmd$(quoted_args "$script" "$@")" - ssh -qt "${UTOOLS_ENSURE_HOSTNAME_SSH_OPTS[@]}" "$user@$host" "$cmd" - [ $? -eq 255 ] && return 12 - return 1 - else - return 11 - fi - fi - local userhost user host - for userhost in "${userhosts[@]}"; do - [[ "$userhost" == *@* ]] || continue - if check_hostname "$userhost"; then - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - [ -n "$path" ] && cd "$path" - ensure_user "$user" -- "$@" - return $? - fi - done - return 0 -} - -__AWKDEF_FUNCTIONS=' -function quote_html(s) { - gsub(/&/, "\\&", s) - gsub(/"/, "\\"", s) - gsub(/>/, "\\>", s) - gsub(/", s) - gsub(/"/, "\"", s) - gsub(/&/, "\\&", s) - return s -} -function quote_value(s) {'" - gsub(/'/, \"'\\\\''\", s) - return \"'\" s \"'\" -"'} -function quoted_values( i, line) { - line = "" - for (i = 1; i <= NF; i++) { - if (i > 1) line = line " " - line = line quote_value($i) - } - return line -} -function quote_subrepl(s) { - gsub(/\\/, "\\\\", s) - gsub(/&/, "\\\\&", s) - return s -} -function quote_grep(s) { - gsub(/[[\\.^$*]/, "\\\\&", s) - return s -} -function quote_egrep(s) { - gsub(/[[\\.^$*+?()|{]/, "\\\\&", s) - return s -} -function quote_sql(s) {'" - gsub(/'/, \"''\", s) - return \"'\" s \"'\" -"'} -function unquote_mysqlcsv(s) { - gsub(/\\n/, "\n", s) - gsub(/\\t/, "\t", s) - gsub(/\\0/, "\0", s) - gsub(/\\\\/, "\\", s) - return s -} -function array_new(dest) { - dest[0] = 0 # forcer awk à considérer dest comme un tableau - delete dest -} -function array_newsize(dest, size, i) { - dest[0] = 0 # forcer awk à considérer dest comme un tableau - delete dest - size = int(size) - for (i = 1; i <= size; i++) { - dest[i] = "" - } -} -function array_len(values, count, i) { - count = 0 - for (i in values) { - count++ - } - return count -} -function mkindices(values, indices, i, j) { - array_new(indices) - j = 1 - for (i in values) { - indices[j++] = int(i) - } - return asort(indices) -} -function array_copy(dest, src, count, indices, i) { - array_new(dest) - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - dest[indices[i]] = src[indices[i]] - } -} -function array_getlastindex(src, count, indices) { - count = mkindices(src, indices) - if (count == 0) return 0 - return indices[count] -} -function array_add(dest, value, lastindex) { - lastindex = array_getlastindex(dest) - dest[lastindex + 1] = value -} -function array_deli(dest, i, l) { - i = int(i) - if (i == 0) return - l = array_len(dest) - while (i < l) { - dest[i] = dest[i + 1] - i++ - } - delete dest[l] -} -function array_del(dest, value, ignoreCase, i) { - do { - i = key_index(value, dest, ignoreCase) - if (i != 0) array_deli(dest, i) - } while (i != 0) -} -function array_extend(dest, src, count, lastindex, indices, i) { - lastindex = array_getlastindex(dest) - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - dest[lastindex + i] = src[indices[i]] - } -} -function array_fill(dest, i) { - array_new(dest) - for (i = 1; i <= NF; i++) { - dest[i] = $i - } -} -function array_getline(src, count, indices, i, j) { - $0 = "" - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - j = indices[i] - $j = src[j] - } -} -function array_appendline(src, count, indices, i, nf, j) { - count = mkindices(src, indices) - nf = NF - for (i = 1; i <= count; i++) { - j = nf + indices[i] - $j = src[indices[i]] - } -} -function in_array(value, values, ignoreCase, i) { - if (ignoreCase) { - value = tolower(value) - for (i in values) { - if (tolower(values[i]) == value) return 1 - } - } else { - for (i in values) { - if (values[i] == value) return 1 - } - } - return 0 -} -function key_index(value, values, ignoreCase, i) { - if (ignoreCase) { - value = tolower(value) - for (i in values) { - if (tolower(values[i]) == value) return int(i) - } - } else { - for (i in values) { - if (values[i] == value) return int(i) - } - } - return 0 -} -function array2s(values, prefix, sep, suffix, noindices, first, i, s) { - if (!prefix) prefix = "[" - if (!sep) sep = ", " - if (!suffix) suffix = "]" - s = prefix - first = 1 - for (i in values) { - if (first) first = 0 - else s = s sep - if (!noindices) s = s "[" i "]=" - s = s values[i] - } - s = s suffix - return s -} -function array2so(values, prefix, sep, suffix, noindices, count, indices, i, s) { - if (!prefix) prefix = "[" - if (!sep) sep = ", " - if (!suffix) suffix = "]" - s = prefix - count = mkindices(values, indices) - for (i = 1; i <= count; i++) { - if (i > 1) s = s sep - if (!noindices) s = s "[" indices[i] "]=" - s = s values[indices[i]] - } - s = s suffix - return s -} -function array_join(values, sep, prefix, suffix, count, indices, i, s) { - s = prefix - count = mkindices(values, indices) - for (i = 1; i <= count; i++) { - if (i > 1) s = s sep - s = s values[indices[i]] - } - s = s suffix - return s -} -function printto(s, output) { - if (output == "") { - print s - } else if (output ~ /^>>/) { - sub(/^>>/, "", output) - print s >>output - } else if (output ~ /^>/) { - sub(/^>/, "", output) - print s >output - } else { - print s >output - } -} -function find_line(input, field, value, orig, line) { - orig = $0 - line = "" - while ((getline 0) { - if ($field == value) { - line = $0 - break - } - } - close(input) - $0 = orig - return line -} -function merge_line(input, field, key, line) { - line = find_line(input, field, $key) - if (line != "") $0 = $0 FS line -} -function __csv_parse_quoted(line, destl, colsep, qchar, echar, pos, tmpl, nextc, resl) { - line = substr(line, 2) - resl = "" - while (1) { - pos = index(line, qchar) - if (pos == 0) { - resl = resl line - destl[0] = "" - destl[1] = 0 - return resl - } - if (echar != "" && pos > 1) { - prevc = substr(line, pos - 1, 1) - quotec = substr(line, pos, 1) - nextc = substr(line, pos + 1, 1) - if (prevc == echar) { - tmpl = substr(line, 1, pos - 2) - resl = resl tmpl quotec - line = substr(line, pos + 1) - continue - } - tmpl = substr(line, 1, pos - 1) - if (nextc == colsep || nextc == "") { - resl = resl tmpl - destl[0] = substr(line, pos + 2) - destl[1] = nextc == colsep - return resl - } else { - resl = resl tmpl quotec - line = substr(line, pos + 1) - } - } else { - tmpl = substr(line, 1, pos - 1) - quotec = substr(line, pos, 1) - nextc = substr(line, pos + 1, 1) - if (nextc == colsep || nextc == "") { - resl = resl tmpl - destl[0] = substr(line, pos + 2) - destl[1] = nextc == colsep - return resl - } else if (nextc == qchar) { - resl = resl tmpl quotec - line = substr(line, pos + 2) - } else { - resl = resl tmpl quotec - line = substr(line, pos + 1) - } - } - } -} -function __csv_parse_unquoted(line, destl, colsep, qchar, echar, pos) { - pos = index(line, colsep) - if (pos == 0) { - destl[0] = "" - destl[1] = 0 - return line - } else { - destl[0] = substr(line, pos + 1) - destl[1] = 1 - return substr(line, 1, pos - 1) - } -} -function __array_parsecsv(fields, line, nbfields, colsep, qchar, echar, shouldparse, destl, i) { - array_new(fields) - array_new(destl) - i = 1 - shouldparse = 0 - while (shouldparse || line != "") { - if (index(line, qchar) == 1) { - value = __csv_parse_quoted(line, destl, colsep, qchar, echar) - line = destl[0] - shouldparse = destl[1] - } else { - value = __csv_parse_unquoted(line, destl, colsep, qchar, echar) - line = destl[0] - shouldparse = destl[1] - } - fields[i] = value - i = i + 1 - } - if (nbfields) { - nbfields = int(nbfields) - i = array_len(fields) - while (i < nbfields) { - i++ - fields[i] = "" - } - } - return array_len(fields) -} -BEGIN { - DEFAULT_COLSEP = "," - DEFAULT_QCHAR = "\"" - DEFAULT_ECHAR = "" -} -function array_parsecsv2(fields, line, nbfields, colsep, qchar, echar) { - return __array_parsecsv(fields, line, nbfields, colsep, qchar, echar) -} -function array_parsecsv(fields, line, nbfields, colsep, qchar, echar) { - if (colsep == "") colsep = DEFAULT_COLSEP - if (qchar == "") qchar = DEFAULT_QCHAR - if (echar == "") echar = DEFAULT_ECHAR - return __array_parsecsv(fields, line, nbfields, colsep, qchar, echar) -} -function parsecsv(line, fields) { - array_parsecsv(fields, line) - array_getline(fields) - return NF -} -function getlinecsv(file, fields) { - if (file) { - getline 1) line = line colsep - if (qchar != "" && index(value, qchar) != 0) { - if (echar != "") gsub(qchar, quote_subrepl(echar) "&", value); - else gsub(qchar, "&&", value); - } - if (qchar != "" && (index(value, mvsep) != 0 || index(value, colsep) != 0 || index(value, qchar) != 0 || __csv_should_quote(value))) { - line = line qchar value qchar - } else { - line = line value - } - } - return line -} -function array_formatcsv(fields) { - return array_formatcsv2(fields, ",", ";", "\"", "") -} -function array_printcsv(fields, output) { - printto(array_formatcsv(fields), output) -} -function get_formatcsv( fields) { - array_fill(fields) - return array_formatcsv(fields) -} -function formatcsv() { - $0 = get_formatcsv() -} -function printcsv(output, fields) { - array_fill(fields) - array_printcsv(fields, output) -} -function array_findcsv(fields, input, field, value, nbfields, orig, found, i) { - array_new(orig) - array_fill(orig) - array_new(fields) - found = 0 - while ((getline 0) { - array_parsecsv(fields, $0, nbfields) - if (fields[field] == value) { - found = 1 - break - } - } - close(input) - array_getline(orig) - if (!found) { - delete fields - if (nbfields) { - nbfields = int(nbfields) - i = array_len(fields) - while (i < nbfields) { - i++ - fields[i] = "" - } - } - } - return found -} - -function __and(var, x, l_res, l_i) { - l_res=0; - for (l_i=0; l_i < 8; l_i++){ - if (var%2 == 1 && x%2 == 1) l_res=l_res/2 + 128; - else l_res/=2; - var=int(var/2); - x=int(x/2); - } - return l_res; -} -function __lshift(var, x) { - while(x > 0){ - var*=2; - x--; - } - return var; -} -function __rshift(var, x) { - while(x > 0){ - var=int(var/2); - x--; - } - return var; -} -BEGIN { - __BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" -} -function b64decode(src, result, base1, base2, base3, base4) { - result = "" - while (length(src) > 0) { - base1 = substr(src, 1, 1) - base2 = substr(src, 2, 1) - base3 = substr(src, 3, 1); if (base3 == "") base3 = "=" - base4 = substr(src, 4, 1); if (base4 == "") base4 = "=" - byte1 = index(__BASE64, base1) - 1 - if (byte1 < 0) byte1 = 0 - byte2 = index(__BASE64, base2) - 1 - if (byte2 < 0) byte2 = 0 - byte3 = index(__BASE64, base3) - 1 - if (byte3 < 0) byte3 = 0 - byte4 = index(__BASE64, base4) - 1 - if (byte4 < 0) byte4 = 0 - result = result sprintf( "%c", __lshift(__and(byte1, 63), 2) + __rshift(__and(byte2, 48), 4) ) - if (base3 != "=") result = result sprintf( "%c", __lshift(__and(byte2, 15), 4) + __rshift(__and(byte3, 60), 2) ) - if (base4 != "=") result = result sprintf( "%c", __lshift(__and(byte3, 3), 6) + byte4 ) - src = substr(src, 5) - } - return result -} -' -function awkdef() { - - if [ "${1:0:3}" == "-f" ]; then - shift - echo "$__AWKDEF_FUNCTIONS" - fi - if [ $# -gt 0 ]; then - local __ad_arg __ad_vpos __ad_name __ad_value - echo "BEGIN {" - while [ -n "${1:0:1}" ]; do - __ad_arg="${1:0:256}" - local __ad_array= - if [ "${__ad_arg%\[@\]}" != "$__ad_arg" ]; then - __ad_array=1 - __ad_name="${__ad_arg%\[@\]}" - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_value="$__ad_name" - elif [[ "$__ad_arg" == *\[@\]=* ]]; then - __ad_array=1 - __ad_name="${__ad_arg%%\[@\]=*}" - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_vpos=$((${#__ad_name} + 4)) - __ad_value="${1:$__ad_vpos}" - [ ${#__ad_value} -ne 0 ] || __ad_value="$__ad_name" - elif [[ "$__ad_arg" == *=* ]]; then - local __ad_int= __ad_str= - __ad_name="${__ad_arg%%=*}" - __ad_vpos=$((${#__ad_name} + 1)) - if [ "${__ad_name%:int}" != "$__ad_name" ]; then - __ad_int=1 - __ad_name="${__ad_name%:int}" - elif [ "${__ad_name%:str}" != "$__ad_name" ]; then - __ad_str=1 - __ad_name="${__ad_name%:str}" - fi - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_value="${1:$__ad_vpos}" - if [ -n "$__ad_int" ]; then - echo "$__ad_name = int($(quoted_awk "$__ad_value") + 0)" - elif [ -n "$__ad_str" ]; then - echo "$__ad_name = $(quoted_awk "$__ad_value")" - elif [ ${#__ad_value} -lt 256 ] && isnum "$__ad_value"; then - echo "$__ad_name = $__ad_value" - else - echo "$__ad_name = $(quoted_awk "$__ad_value")" - fi - else - break - fi - if [ -n "$__ad_array" ]; then - if [ "${__ad_value:0:2}" == $'<\n' ]; then - local -a __ad_values - array_from_lines __ad_values "${__ad_value:2}" - __ad_value=__ad_values - fi - __ad_value="${__ad_value}[@]" - local __ad_i=1 - echo "$__ad_name[0] = 0; delete $__ad_name" - for __ad_arg in "${!__ad_value}"; do - echo "$__ad_name[$__ad_i]=$(quoted_awk "$__ad_arg")" - __ad_i=$(($__ad_i + 1)) - done - eval "echo \"\${__ad_name}_count = \${#$__ad_value}\"" - fi - shift - done - echo "}" - for __ad_arg in "$@"; do - rawecho "$__ad_arg" - done - fi -} -function lawkrun() { - local -a __ar_defs __ar_args - while [ $# -gt 0 -a "$1" != "--" ]; do - __ar_defs=("${__ar_defs[@]}" "$1") - shift - done - shift - while [ $# -gt 0 ]; do - __ar_args=("${__ar_args[@]}" "$1") - shift - done - local __ar_script="$(awkdef "${__ar_defs[@]}")" - awk "$__ar_script" "${__ar_args[@]}" -} -function cawkrun() { LANG=C lawkrun "$@"; } -function awkrun() { LANG=C lawkrun "$@"; } - -function __lf_get_age() { - local y=$(date "+%Y") - local dy=$(date "+%j"); while [ "${dy#0}" != "$dy" ]; do dy="${dy#0}"; done - [ -n "$dy" ] || dy=0 - local h=$(date "+%H"); while [ "${h#0}" != "$h" ]; do h="${h#0}"; done - [ -n "$h" ] || h=0 - echo $((($y * 365 + $dy) * 24 + $h)) -} -function lf_trylock() { - local eoo lockfile max_hours=4 - while [ -n "$1" ]; do - case "$1" in - -h) shift; max_hours="$1";; - --) shift; eoo=1;; - *) eoo=1;; - esac - [ -n "$eoo" ] && break - shift - done - - lockfile="$1" - [ -n "$lockfile" ] || die "il faut spécifier un fichier pour le verrou" - - local now="$(__lf_get_age)" - if (set -C; echo "$now" >"$lockfile") 2>/dev/null; then - return 0 - fi - local prev diff - if prev="$(<"$lockfile")"; then - diff="$(($now - $prev))" - if [ "$diff" -gt "$max_hours" ]; then - echo stale - else - echo locked - fi - elif [ -f "$lockfile" ]; then - echo retry - fi - return 1 -} -function pidfile_set() { - local eoo pidfile pid=$$ replace= - while [ -n "$1" ]; do - case "$1" in - -p) - shift - pid="$1" - ;; - -r) - replace=1 - ;; - --) - shift - eoo=1 - ;; - *) - eoo=1 - ;; - esac - [ -n "$eoo" ] && break - shift - done - - pidfile="$1" - [ -n "$pidfile" ] || return 10 - - if [ -f "$pidfile" ]; then - local curpid="$(<"$pidfile")" - if is_running "$curpid"; then - return 1 - elif [ -n "$replace" ]; then - /bin/rm -f "$pidfile" || return 10 - else - return 2 - fi - fi - - echo_ "$pid" >"$pidfile" || return 10 - autoclean "$pidfile" - return 0 -} -function pidfile_check() { - local pidfile="$1" - [ -n "$pidfile" ] || return 10 - - if [ -f "$pidfile" ]; then - [ -r "$pidfile" ] || return 10 - local pid="$(<"$pidfile")" - is_running "$pid" && return 0 - fi - return 1 -} -function page_maybe() { - if isatty; then - less -XF "$@" - else - cat - fi -} - - -function utools_local() { - local arg - [ $# -gt 0 ] || set -- opts verbosity interaction - for arg in "$@"; do - case "$arg" in - parse_opts|opts|o|args) echo "local -a args";; - verbosity|v) echo "local __verbosity='$__verbosity'";; - interaction|i) echo "local __interaction='$__interaction'";; - esac - done -} - -function isatty() { - tty -s <&1 -} -function in_isatty() { - tty -s -} -function out_isatty() { - tty -s <&1 -} -function err_isatty() { - tty -s <&2 -} -function die() { [ $# -gt 0 ] && eerror "$@"; exit 1; } -function exit_with { if [ $# -gt 0 ]; then "$@"; fi; exit $?; } -function die_with { [ $# -gt 0 ] && eerror "$1"; shift; [ $# -gt 0 ] && "$@"; exit 1; } -function die_unless() { - local count=$# - if [ $count -eq 0 ]; then - exit 1 - elif [ $count -eq 1 ]; then - "$@" || exit $? - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - : - else - r=$? - eerror "$m" - exit $r - fi - fi -} -function eerror_unless() { - local count=$# - if [ $count -eq 0 ]; then - return 1 - elif [ $count -eq 1 ]; then - "$@" || return $? - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - : - else - r=$? - eerror "$m" - return $r - fi - fi -} -function die_if() { - local count=$# - if [ $count -eq 0 ]; then - : - elif [ $count -eq 1 ]; then - "$@" && exit 1 - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - eerror "$m" - exit 1 - fi - fi -} -function eerror_if() { - local count=$# - if [ $count -eq 0 ]; then - : - elif [ $count -eq 1 ]; then - "$@" && return 1 - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - eerror "$m" - return 1 - fi - fi -} - -TAB=$'\t' -LATIN1=iso-8859-1 -LATIN9=iso-8859-15 -UTF8=utf-8 -OENC="$UTF8" - -if ! progexists iconv; then - function iconv() { cat; } -fi - -function __lang_encoding() { - local lang="$(<<<"$LANG" awk '{ print tolower($0) }')" - case "$lang" in - *@euro) echo "iso-8859-15";; - *.utf-8|*.utf8) echo "utf-8";; - *) echo "iso-8859-1";; - esac -} -function __norm_encoding() { - awk '{ - enc = tolower($0) - gsub(/^latin$/, "latin1", enc) - gsub(/^latin1$/, "iso-8859-1", enc) - gsub(/^latin9$/, "iso-8859-15", enc) - gsub(/[-_]/, "", enc) - if (enc == "iso8859" || enc == "iso88591" || enc == "8859" || enc == "88591") print "iso-8859-1" - else if (enc == "iso885915" || enc == "885915") print "iso-8859-15" - else if (enc == "utf" || enc == "utf8") print "utf-8" - else print $0 - }' <<<"$1" -} -function __init_encoding() { - local DEFAULT_ENCODING="$(__lang_encoding)" - [ -n "$DEFAULT_ENCODING" ] || DEFAULT_ENCODING=utf-8 - [ -n "$UTOOLS_OUTPUT_ENCODING" ] || UTOOLS_OUTPUT_ENCODING="$DEFAULT_ENCODING" - UTOOLS_OUTPUT_ENCODING="$(__norm_encoding "$UTOOLS_OUTPUT_ENCODING")" - [ -n "$UTOOLS_INPUT_ENCODING" ] || UTOOLS_INPUT_ENCODING="$UTOOLS_OUTPUT_ENCODING" - UTOOLS_INPUT_ENCODING="$(__norm_encoding "$UTOOLS_INPUT_ENCODING")" - [ -n "$UTOOLS_EDITOR_ENCODING" ] || UTOOLS_EDITOR_ENCODING="$UTOOLS_INPUT_ENCODING" - UTOOLS_EDITOR_ENCODING="$(__norm_encoding "$UTOOLS_EDITOR_ENCODING")" - - IENC="$UTOOLS_INPUT_ENCODING" - OENC="$UTOOLS_OUTPUT_ENCODING" -} - -if [ -n "$UTOOLS_LANG" -a -z "$LANG" ]; then - export UTOOLS_LANG - export LANG="$UTOOLS_LANG" -fi -__init_encoding - -function tooenc() { - local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - rawecho "$src" - else - iconv -f "$from" -t "$to" <<<"$src" - fi -} -function uecho() { - tooenc "$*" -} -function tooenc_() { - local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - rawecho_ "$src" - else - rawecho_ "$src" | iconv -f "$from" -t "$to" - fi -} -function uecho_() { - tooenc_ "$*" -} -function toienc() { - local __tie_var="$1" __tie_to="${2:-$IENC}" __tie_from="${3:-$UTOOLS_INPUT_ENCODING}" - if [ "$__tie_from" != "$__tie_to" ]; then - set_var "$__tie_var" "$(iconv -f "$__tie_from" -t "$__tie_to" <<<"${!__tie_var}")" - fi -} -function uread() { - [ $# -gt 0 ] || set -- REPLY - local __r_var - read "$@" - for __r_var in "$@"; do - [ -z "$__r_var" -o "${__r_var:0:1}" == "-" ] && continue # ignorer les options - toienc "$__r_var" - done -} - -function stooenc() { - local from="${1:-$OENC}" to="${2:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - cat - else - iconv -f "$from" -t "$to" - fi -} -function stoienc() { - local to="${1:-$IENC}" from="${2:-$UTOOLS_INPUT_ENCODING}" - if [ "$from" == "$to" ]; then - cat - else - iconv -f "$from" -t "$to" - fi -} - -export UTOOLS_EDATE -function __edate() { [ -n "$UTOOLS_EDATE" ] && date +"[%d/%m/%Y-%H:%M:%S] "; } - -export UTOOLS_ELOG_OVERWRITE -function __set_no_colors() { :; } -function elogto() { - UTOOLS_EDATE=1 - if [ -n "$1" -a -n "$2" ]; then - LANG=fr_FR.UTF8 - UTOOLS_OUTPUT_ENCODING="$UTF8" - __set_no_colors 1 - if [ -n "$UTOOLS_ELOG_OVERWRITE" ]; then - exec >"$1" 2>"$2" - else - exec >>"$1" 2>>"$2" - fi - elif [ -n "$1" ]; then - LANG=fr_FR.UTF8 - UTOOLS_OUTPUT_ENCODING="$UTF8" - __set_no_colors 1 - if [ -n "$UTOOLS_ELOG_OVERWRITE" ]; then - exec >"$1" 2>&1 - else - exec >>"$1" 2>&1 - fi - fi -} - -export __estack __tlevel -function __indent() { - if [ "${1/ -/}" != "$1" ]; then - sed "2,\$s/^/${__tlevel}/g" <<<"$1" - else - rawecho "$1" - fi -} -function __eerror() { tooenc "$(__edate)${__tlevel}* error: $(__indent "$1")"; } -function __ewarn() { tooenc "$(__edate)${__tlevel}* warning: $(__indent "$1")"; } -function __enote() { tooenc "$(__edate)${__tlevel}* note: $(__indent "$1")"; } -function __ebanner() { - local maxi="${COLUMNS:-80}" - local -a lines - local psfix line - - psfix="$(__edate)${__tlevel}" - while [ ${#psfix} -lt $maxi ]; do psfix="$psfix="; done - - tooenc "$psfix" - maxi=$(($maxi - 1)) - array_from_xlines lines "$1" - for line in "" "${lines[@]}" ""; do - line="$(__edate)${__tlevel}= $line" - if [ ${#line} -le $maxi ]; then - while [ ${#line} -lt $maxi ]; do line="$line "; done - line="$line=" - fi - tooenc "$line" - done - tooenc "$psfix" -} -function __eimportant() { tooenc "$(__edate)${__tlevel}* important: $(__indent "$1")"; } -function __eattention() { tooenc "$(__edate)${__tlevel}* attention: $(__indent "$1")"; } -function __einfo() { tooenc "$(__edate)${__tlevel}* info: $(__indent "$1")"; } -function __eecho() { tooenc "$(__edate)${__tlevel}$(__indent "$1")"; } -function __eecho_() { tooenc_ "$(__edate)${__tlevel}$(__indent "$1")"; } -function __edebug() { tooenc "$(__edate)${__tlevel}* debug: $(__indent "$1")"; } -function __estep() { tooenc "$(__edate)${__tlevel}* $(__indent "$1")"; } -function __estepe() { __estep "$@"; } -function __estepw() { __estep "$@"; } -function __estepn() { __estep "$@"; } -function __estepi() { __estep "$@"; } -function __estep_() { tooenc_ "$(__edate)${__tlevel}* $(__indent "$1")"; } -function __estepe_() { __estep_ "$@"; } -function __estepw_() { __estep_ "$@"; } -function __estepn_() { __estep_ "$@"; } -function __estepi_() { __estep_ "$@"; } -function __etitle() { tooenc "$(__edate)${__tlevel}+++ $(__indent "$1")"; } -function __ebegin() { tooenc_ "$(__edate)${__tlevel}* $(__indent "$1"): "; } -function __edoto() { echo_ "."; } -function __edotw() { echo_ "w"; } -function __edotx() { echo_ "x"; } -function __edotp() { echo_ "+"; } -function __edotd() { tooenc "($1)"; } -function __eendo() { echo "[ok]"; } -function __eendx() { echo "[error]"; } -PRETTYOPTS=() -function set_verbosity() { :;} -function set_interaction() { :;} -function show_error() { - return 0 -} -function show_warn() { - return 0 -} -function show_info() { - return 0 -} -function show_verbose() { - return 0 -} -function show_debug() { - [ -n "$DEBUG" ] -} -function check_verbosity() { - return 0 -} -function get_verbosity_option() { :;} -function check_interaction() { - return 0 -} -function is_interaction() { - return 1 -} -function get_interaction_option() { :;} -__epending= -function eflush() { - if [ -n "$__epending" ]; then rawecho "$__epending" 1>&2; __epending=; fi -} -function eclearp() { - __epending= -} -function eerror() { - show_error || return; eflush; __eerror "$*" 1>&2 -} -function ewarn() { - show_warn || return; eflush; __ewarn "$*" 1>&2 -} -function enote() { - show_info || return; eflush; __enote "$*" 1>&2 -} -function ebanner() { - show_error || return; eflush; __ebanner "$*" 1>&2; sleep 5 -} -function eimportant() { - show_error || return; eflush; __eimportant "$*" 1>&2 -} -function eattention() { - show_warn || return; eflush; __eattention "$*" 1>&2 -} -function einfo() { - show_info || return; eflush; __einfo "$*" 1>&2 -} -function eecho() { - show_info || return; eflush; __eecho "$*" 1>&2 -} -function eecho_() { - show_info || return; eflush; __eecho_ "$*" 1>&2 -} -function edebug() { - show_debug || return; eflush; __edebug "$*" 1>&2 -} -function trace() { - local r cmd="$(quoted_args "$@")" - show_info && { eflush; __eecho "\$ $cmd" 1>&2; } - "$@"; r=$? - if [ $r -ne 0 ]; then - if show_info; then - eflush; __eecho "^ [EC #$r]" 1>&2 - elif show_error; then - eflush; __eecho "^ $cmd [EC #$r]" 1>&2; - fi - fi - return $r -} -function trace_error() { - local r - "$@"; r=$? - if [ $r -ne 0 ]; then - local cmd="$(quoted_args "$@")" - show_error && { eflush; __eecho "^ $cmd [EC #$r]" 1>&2; } - fi - return $r -} - -function etitle() { - local __t_deferred= - __t_etitle "$@" -} -function etitled() { - local __t_deferred=1 - __t_etitle "$@" -} -function __t_etitle() { - local __t_eend=default - local __t_clearp= - while [ -n "$1" ]; do - if [ "$1" == "--" ]; then - shift - break - elif [ "$1" == "-s" ]; then - __t_eend= - shift - elif [ "$1" == "--eend" ]; then - __t_eend=1 - shift - elif [ "$1" == "-p" ]; then - __t_clearp=1 - shift - else - break - fi - done - local __t_title="$1"; shift - local __t_s=0 - [ -n "$__estack" ] && __tlevel="${__tlevel} " - __estack="$__estack:t" - if show_info; then - if [ -n "$__t_deferred" ]; then - __epending="${__epending:+$__epending -}$(__etitle "$__t_title")" - else - eflush - __etitle "$__t_title" 1>&2 - fi - fi - if [ $# -gt 0 ]; then - "$@" - __t_s=$? - [ "$__t_eend" == "default" ] && __t_eend=1 - fi - [ "$__t_eend" == "default" ] && __t_eend= - if [ -n "$__t_eend" ]; then - eend $__t_s - [ -n "$__t_clearp" ] && eclearp - fi - return $__t_s -} -function estep() { - show_info || return; eflush; __estep "$*" 1>&2 -} -function estepe() { - show_info || return; eflush; __estepe "$*" 1>&2 -} -function estepw() { - show_info || return; eflush; __estepw "$*" 1>&2 -} -function estepn() { - show_info || return; eflush; __estepn "$*" 1>&2 -} -function estepi() { - show_info || return; eflush; __estepi "$*" 1>&2 -} -function estep_() { - show_info || return; eflush; __estep_ "$*" 1>&2 -} -function estepe_() { - show_info || return; eflush; __estepe_ "$*" 1>&2 -} -function estepw_() { - show_info || return; eflush; __estepw_ "$*" 1>&2 -} -function estepn_() { - show_info || return; eflush; __estepn_ "$*" 1>&2 -} -function estepi_() { - show_info || return; eflush; __estepi_ "$*" 1>&2 -} -function ebegin() { - local __b_eend=default - while [ -n "$1" ]; do - if [ "$1" == "--" ]; then - shift - break - elif [ "$1" == "-s" ]; then - __b_eend= - shift - elif [ "$1" == "--eend" ]; then - __b_eend=1 - shift - else - break - fi - done - local __b_msg="$1"; shift - local __b_s=0 - __estack="$__estack:b" - if show_info; then - eflush - __ebegin "$__b_msg" 1>&2 - fi - if [ $# -gt 0 ]; then - "$@" - __b_s=$? - [ "$__b_eend" == "default" ] && __b_eend=1 - fi - [ "$__b_eend" == "default" ] && __b_eend= - [ -n "$__b_eend" ] && eend $__b_s - return $__b_s -} -function edot() { - local s=$? - show_info || return - eflush - [ -n "$1" ] && s="$1" - shift - if [ "$s" == "0" ]; then - __edoto 1>&2 - else - __edotx 1>&2 - fi - show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2 - return $s -} -function edotw() { - local s=$? - show_info || return - eflush - [ -n "$1" ] && s="$1" - shift - __edotw 1>&2 - show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2 - return $s -} -function ewait() { - [ -n "$1" ] || return 1 - if show_info; then - local count=2 - eflush - little_sleep # certains processus retournent tout de suite - while is_running "$1"; do - sleep 1 - if [ $count -gt 0 ]; then - count=$(($count - 1)) - else - __edotp 1>&2 - fi - done - __edoto 1>&2 - else - wait "$1" - fi -} -function eend() { - local s=$? - if [ "$1" == "-c" ]; then - __estack= - __tlevel= - elif [ "${__estack%:b}" != "$__estack" ]; then - __estack="${__estack%:b}" - show_info || return - eflush - [ -n "$1" ] && s="$1" - if [ "$s" == "0" ]; then - __eendo 1>&2 - else - __eendx 1>&2 - fi - elif [ "${__estack%:t}" != "$__estack" ]; then - __estack="${__estack%:t}" - __tlevel="${__tlevel% }" - fi -} -function ask_yesno() { - local interactive=1 - if [[ "$1" == -* ]]; then - if [ "$1" != -- ]; then - check_interaction "$1" || interactive= - fi - shift - else - check_interaction -c || interactive= - fi - local default="${2:-N}" - if [ "$default" == "C" ]; then - [ -n "$interactive" ] && default=N || default=O - elif [ "$default" == "X" ]; then - [ -n "$interactive" ] && default=O || default=N - fi - if [ -n "$interactive" ]; then - eflush - local message="$1" - local prompt="[oN]" - local r - is_yes "$default" && prompt="[On]" - if [ -n "$message" ]; then - tooenc_ "$message" 1>&2 - else - tooenc_ "Voulez-vous continuer?" "$UTF8" 1>&2 - fi - tooenc_ " $prompt " "$UTF8" 1>&2 - uread r - is_yes "${r:-$default}" - else - is_yes "$default" - fi -} -function read_value() { - local -a __rv_opts __rv_readline=1 __rv_showdef=1 __rv_nl= - __rv_opts=() - [ -n "$UTOOLS_NO_READLINE" ] && __rv_readline= - __rv_read "$@" -} -function read_password() { - local -a __rv_opts __rv_readline= __rv_showdef= __rv_nl=1 - __rv_opts=(-s) - __rv_read "$@" -} -function __rv_read() { - local __rv_int=1 - if [[ "$1" == -* ]]; then - if [ "$1" != -- ]; then - check_interaction "$1" || __rv_int= - fi - shift - else - check_interaction -c || __rv_int= - fi - local __rv_msg="$1" __rv_v="${2:-value}" __rv_d="$3" __rv_re="${4:-O}" - if [ -z "$__rv_int" ]; then - if is_yes "$__rv_re" && [ -z "$__rv_d" ]; then - OENC="$UTF8" eerror "La valeur par défaut de $__rv_v doit être non vide" - return 1 - fi - set_var "$__rv_v" "$__rv_d" - return 0 - fi - - eflush - local __rv_r - while true; do - if [ -n "$__rv_msg" ]; then - tooenc_ "$__rv_msg" 1>&2 - else - tooenc_ "Entrez la valeur" "$UTF8" 1>&2 - fi - if [ -n "$__rv_readline" ]; then - tooenc_ ": " "$UTF8" 1>&2 - uread -e ${__rv_d:+-i"$__rv_d"} "${__rv_opts[@]}" __rv_r - else - if [ -n "$__rv_d" ]; then - if [ -n "$__rv_showdef" ]; then - tooenc_ " [$__rv_d]" 1>&2 - else - tooenc_ " [****]" 1>&2 - fi - fi - tooenc_ ": " "$UTF8" 1>&2 - uread "${__rv_opts[@]}" __rv_r - [ -n "$__rv_nl" ] && echo - fi - __rv_r="${__rv_r:-$__rv_d}" - if [ -n "$__rv_r" ] || ! is_yes "$__rv_re"; then - set_var "$__rv_v" "$__rv_r" - return 0 - fi - done -} -function simple_menu() { - local __sm_title= __sm_yourchoice= __sm_default= - local -a __sm_args - parse_opts -t: __sm_title= -m: __sm_yourchoice= -d: __sm_default= @ __sm_args -- "$@" && - set -- "${__sm_args[@]}" || ewarn "$__sm_args" - - local __sm_option_var="${1:-option}" __sm_options_var="${2:-options}" - local __sm_option __sm_options - __sm_options="$__sm_options_var[*]" - if [ -z "${!__sm_options}" ]; then - OENC="$UTF8" eerror "Le tableau $__sm_options_var doit être non vide" - return 1 - fi - [ -z "$__sm_default" ] && __sm_default="${!__sm_option_var}" - - eflush - array_copy __sm_options "$__sm_options_var" - local __sm_c=0 __sm_i __sm_choice - while true; do - if [ "$__sm_c" == "0" ]; then - [ -n "$__sm_title" ] && tooenc "=== $__sm_title ===" 1>&2 - __sm_i=1 - for __sm_option in "${__sm_options[@]}"; do - if [ "$__sm_option" == "$__sm_default" ]; then - tooenc "$__sm_i*- $__sm_option" 1>&2 - else - tooenc "$__sm_i - $__sm_option" 1>&2 - fi - let __sm_i=$__sm_i+1 - done - fi - - if [ -n "$__sm_yourchoice" ]; then - tooenc_ "$__sm_yourchoice" 1>&2 - else - tooenc_ "Entrez le numéro de l'option choisie" "$UTF8" 1>&2 - fi - tooenc_ ": " "$UTF8" 1>&2 - uread __sm_choice - - if [ -z "$__sm_choice" -a -n "$__sm_default" ]; then - __sm_option="$__sm_default" - break - fi - if [ -n "$__sm_choice" -a -z "${__sm_choice//[0-9]/}" ]; then - if [ "$__sm_choice" -gt 0 -a "$__sm_choice" -le "${#__sm_options[*]}" ]; then - __sm_option="${__sm_options[$(($__sm_choice - 1))]}" - break - else - OENC="$UTF8" eerror "Numéro d'option incorrect" - fi - else - OENC="$UTF8" eerror "Vous devez saisir le numéro de l'option choisie" - fi - - let __sm_c=$__sm_c+1 - if [ "$__sm_c" -eq 5 ]; then - tooenc "" "$UTF8" 1>&2 - __sm_c=0 - fi - done - set_var "$__sm_option_var" "$__sm_option" -} - -function actions_menu() { - local -a __am_action_descs __am_options __am_void_actions - local __am_tmp __am_select_action __am_select_option __am_title __am_optyc __am_actyc - local __am_default_action=auto __am_quit_action=auto - local __am_default_option= - local -a __am_args - parse_opts \ - -t: __am_title= \ - -m: __am_optyc= \ - -M: __am_actyc= \ - -e: __am_void_actions \ - -d: __am_default_action= \ - -q: __am_quit_action= \ - -o: __am_default_option= \ - @ __am_args -- "$@" && set -- "${__am_args[@]}" || { eerror "$__am_args"; return 1; } - - __am_tmp="${1:-action}"; __am_select_action="${!__am_tmp}" - __am_tmp="${2:-option}"; __am_select_option="${!__am_tmp}" - [ -n "$__am_default_option" ] && __am_select_option="$__am_default_option" - array_copy __am_action_descs "${3:-actions}" - array_copy __am_options "${4:-options}" - - eerror_unless [ ${#__am_action_descs[*]} -gt 0 ] "Vous devez spécifier le tableau des actions" || return - __actions_menu || return 1 - setv "${1:-action}" "$__am_select_action" - setv "${2:-option}" "$__am_select_option" -} -function __actions_menu() { - local title="$__am_title" - local optyc="$__am_optyc" actyc="$__am_actyc" - local default_action="$__am_default_action" - local quit_action="$__am_quit_action" - local select_action="$__am_select_action" - local select_option="$__am_select_option" - local -a action_descs options void_actions - array_copy action_descs __am_action_descs - array_copy options __am_options - array_copy void_actions __am_void_actions - - local no_options - array_isempty options && no_options=1 - - local -a actions - local tmp action name - for tmp in "${action_descs[@]}"; do - splitfsep2 "$tmp" : action name - [ -n "$action" ] || action="${name:0:1}" - action="$(strlower "$action")" - array_addu actions "$action" - done - - if [ "$default_action" == auto ]; then - default_action="$select_action" - if [ -n "$default_action" ]; then - array_contains actions "$default_action" || default_action= - fi - [ -n "$default_action" ] || default_action="${actions[0]}" - fi - default_action="${default_action:0:1}" - default_action="$(strlower "$default_action")" - - if [ "$quit_action" == auto ]; then - if [ ${#actions[*]} -gt 1 ]; then - quit_action="${actions[@]:$((-1)):1}" - array_addu void_actions "$quit_action" - fi - fi - quit_action="${quit_action:0:1}" - quit_action="$(strlower "$quit_action")" - - local action_title - for tmp in "${action_descs[@]}"; do - splitfsep2 "$tmp" : action name - [ -n "$action" ] || action="${name:0:1}" - [ -n "$name" ] || name="$action" - action="$(strlower "$action")" - if [ -n "$no_options" ]; then - if ! array_contains void_actions "$action"; then - array_del actions "$action" - continue - fi - fi - [ "$action" == "$default_action" ] && name="$name*" - action_title="${action_title:+$action_title/}$name" - done - if [ -n "$default_action" ]; then - array_contains actions "$default_action" || default_action= - fi - if [ -n "$quit_action" ]; then - array_contains actions "$quit_action" || quit_action= - fi - - if [ -n "$no_options" ]; then - if array_isempty void_actions; then - eerror "Aucune option n'est définie. Il faut définir le tableau des actions vides" - return 1 - fi - __void_actions_menu - else - __options_actions_menu - fi -} -function __void_actions_menu() { - eflush - local c=0 choice - while true; do - if [ $c -eq 0 ]; then - [ -n "$title" ] && __etitle "$title" 1>&2 - __eecho_ "=== Actions disponibles: " 1>&2 - tooenc "$action_title" 1>&2 - fi - if [ -n "$actyc" ]; then - __eecho_ "$actyc" 1>&2 - elif [ -n "$optyc" ]; then - __eecho_ "$optyc" 1>&2 - else - __eecho_ "Entrez l'action à effectuer" 1>&2 - fi - tooenc_ ": " 1>&2 - uread choice - if [ -z "$choice" -a -n "$default_action" ]; then - select_action="$default_action" - break - fi - - choice="${choice:0:1}" - choice="$(strlower "$choice")" - if array_contains actions "$choice"; then - select_action="$choice" - break - elif [ -n "$choice" ]; then - eerror "$choice: action incorrecte" - else - eerror "vous devez saisir l'action à effectuer" - fi - let c=$c+1 - if [ $c -eq 5 ]; then - tooenc "" 1>&2 - c=0 - fi - done - __am_select_action="$select_action" - __am_select_option= -} -function __options_actions_menu() { - eflush - local c=0 option choice action option - while true; do - if [ $c -eq 0 ]; then - [ -n "$title" ] && __etitle "$title" 1>&2 - i=1 - for option in "${options[@]}"; do - if [ "$option" == "$select_option" ]; then - tooenc "$i*- $option" 1>&2 - else - tooenc "$i - $option" 1>&2 - fi - let i=$i+1 - done - __estepn_ "Actions disponibles: " 1>&2 - tooenc "$action_title" 1>&2 - fi - if [ -n "$optyc" ]; then - __eecho_ "$optyc" 1>&2 - else - __eecho_ "Entrez l'action et le numéro de l'option choisie" 1>&2 - fi - tooenc_ ": " 1>&2 - uread choice - - if [ -z "$choice" -a -n "$default_action" ]; then - action="$default_action" - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - elif [ -n "$select_option" ]; then - select_action="$action" - break - fi - fi - action="${choice:0:1}" - action="$(strlower "$action")" - if array_contains actions "$action"; then - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - else - option="${choice:1}" - option="${option// /}" - if [ -z "$option" -a -n "$select_option" ]; then - select_action="$action" - break - elif [ -z "$option" ]; then - eerror "vous devez saisir le numéro de l'option" - elif isnum "$option"; then - if [ $option -gt 0 -a $option -le ${#options[*]} ]; then - select_action="$action" - select_option="${options[$(($option - 1))]}" - break - fi - else - eerror "$option: numéro d'option incorrecte" - fi - fi - elif isnum "$choice"; then - action="$default_action" - if [ -n "$action" ]; then - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - else - option="${choice// /}" - if [ -z "$option" ]; then - eerror "vous devez saisir le numéro de l'option" - elif isnum "$option"; then - if [ $option -gt 0 -a $option -le ${#options[*]} ]; then - select_action="$action" - select_option="${options[$(($option - 1))]}" - break - fi - else - eerror "$option: numéro d'option incorrecte" - fi - fi - else - eerror "Vous devez spécifier l'action à effectuer" - fi - elif [ -n "$choice" ]; then - eerror "$choice: action et/ou option incorrecte" - else - eerror "vous devez saisir l'action à effectuer" - fi - let c=$c+1 - if [ $c -eq 5 ]; then - tooenc "" 1>&2 - c=0 - fi - done - __am_select_action="$select_action" - __am_select_option="$select_option" -} - - -function __ac_forgetall() { __ac_files=(); } -__ac_forgetall -function __ac_trap() { - local file - for file in "${__ac_files[@]}"; do - [ -e "$file" ] && rm -rf "$file" 2>/dev/null - done - __ac_forgetall -} -trap __ac_trap 1 3 15 EXIT -function autoclean() { - local file - for file in "$@"; do - [ -n "$file" ] && array_add __ac_files "$file" - done -} -function ac_cleanall() { - __ac_trap -} -function ac_clean() { - local file - for file in "$@"; do - if array_contains __ac_files "$file"; then - [ -e "$file" ] && rm -rf "$file" 2>/dev/null - array_del __ac_files "$file" - fi - done -} -function ac_set_tmpfile() { - local __acst_d - if show_debug; then - if [ -n "$5" ]; then - is_yes "${!5}" && __acst_d=1 - else - __acst_d=1 - fi - fi - if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" - [ -f "$3" -a "$4" == keep ] || >"$3" - else - local __acst_t="$(mktempf "$2")" - autoclean "$__acst_t" - set_var "$1" "$__acst_t" - fi -} -function ac_set_tmpdir() { - local __acst_d - if show_debug; then - if [ -n "$4" ]; then - is_yes "${!4}" && __acst_d=1 - else - __acst_d=1 - fi - fi - if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" - mkdir -p "$3" - else - local __acst_t="$(mktempd "$2")" - autoclean "$__acst_t" - set_var "$1" "$__acst_t" - fi -} -function debug_tee() { - if show_debug; then - tee "$@" - else - cat - fi -} - - -function get_defaults_files() { - local __gd_dest="${1:-defaults}"; shift - local -a __gd_fs - local __gd_f __gd_found - for __gd_f in "$@"; do - __gd_found= - if [ -r "/etc/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "/etc/default/$__gd_f") - __gd_found=1 - fi - if [ -r "$HOME/etc/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "$HOME/etc/default/$__gd_f") - __gd_found=1 - fi - if [ -z "$__gd_found" -a -r "$scriptdir/lib/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "$scriptdir/lib/default/$__gd_f") - fi - done - array_copy "$__gd_dest" __gd_fs -} - -function set_defaults() { - local -a __sd_fs - local __sd_f - get_defaults_files __sd_fs "$@" - for __sd_f in "${__sd_fs[@]}"; do - source "$__sd_f" - done -} - - -: "${MYHOST:=$HOSTNAME}" -: "${MYHOSTNAME:=${MYHOST%%.*}}" -export MYHOST MYHOSTNAME - -function myhost() { - hostname -f 2>/dev/null || echo "$MYHOST" -} -function myhostname() { - hostname -s 2>/dev/null || echo "$MYHOSTNAME" -} -##@inc]base -uprovide base.tools -urequire base - -function base_umove() { - local -a args - local updatedir - args=(-d:,--updatedir: .) - parse_args_check "$@" || return; set -- "${args[@]}" - - eerror_unless [ -z "$updatedir" -o -d "$updatedir" ] "$updatedir: doit être un répertoire" || return - eerror_if [ $# -eq 0 ] "Vous devez spécifier les fichiers à déplacer" || return - eerror_if [ $# -eq 1 ] "Vous devez spécifier la destination" || return - - local -a srcs - local dest - - srcs=("$@") - setx dest=last_value srcs - array_del_last srcs - - if [ $# -eq 2 ]; then - if [ -d "$dest" ]; then - : # ce cas sera traité ci-dessous - elif [ -e "$dest" ]; then - eerror "$dest: refus d'écraser la destination" - return 1 - else - src="${srcs[0]}" - if [ -n "$updatedir" ]; then - if [ -L "$src" ]; then - ldest="$(readlinka "$src")" - array_find_links update_links "$ldest" "$updatedir" - else - array_find_links update_links "$src" "$updatedir" - fi - move_file "$src" "$dest" "${update_links[@]}" - else - move_link "$src" "$dest" - fi - return $? - fi - fi - - [ -d "$dest" ] || { - eerror "$dest: doit être un répertoire" - return 1 - } - for src in "${srcs[@]}"; do - if [ -n "$updatedir" ]; then - if [ -L "$src" ]; then - move_link "$src" "$dest" - else - array_find_links update_links "$src" "$updatedir" - move_file "$src" "$dest" "${update_links[@]}" - fi - else - move_link "$src" "$dest" - fi - done -} -##@inc]base.tools -##@inc[base.compat -## Fonctions de base: support des fonctions obsolètes et des versions de bash < 4.x -##@inc[base.core -## Fonctions de base: fondement -uprovide base.core - -function echo_() { - echo -n "$*" -} -function recho() { - if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - - local first="${1:1}"; shift - echo "$first$@" - else - echo "$@" - fi -} -function recho_() { - if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - - local first="${1:1}"; shift - echo -n "$first$@" - else - echo -n "$@" - fi -} -function _qval() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s//\$/\\\$}" - s="${s//\`/\\\`}" - recho_ "$s" -} -function should_quote() { - local l="${#1}" - [ $l -eq 0 -o $l -gt 80 ] && return 0 - local s="${*//[a-zA-Z0-9]/}" - s="${s//,/}" - s="${s//./}" - s="${s//+/}" - s="${s//\//}" - s="${s//-/}" - s="${s//_/}" - s="${s//=/}" - [ -n "$s" ] -} -function qval() { - echo -n \" - _qval "$@" - echo \" -} -function qvalm() { - if should_quote "$*"; then - echo -n \" - _qval "$@" - echo \" - else - recho "$*" - fi -} -function qvalr() { - if [ -z "$*" ]; then - : - elif should_quote "$*"; then - echo -n \" - _qval "$@" - echo \" - else - recho "$*" - fi -} -function qvals() { - local arg first=1 - for arg in "$@"; do - [ -z "$first" ] && echo -n " " - if should_quote "$arg"; then - echo -n \" - _qval "$arg" - echo -n \" - else - recho_ "$arg" - fi - first= - done - [ -z "$first" ] && echo -} -function qwc() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s//\$/\\\$}" - s="${s//\`/\\\`}" - local r a b - while [ -n "$s" ]; do - if [[ "$s" == *\** ]]; then - if [[ "$s" == *\?* ]]; then - a="${s%%\**}" - b="${s%%\?*}" - if [ ${#a} -lt ${#b} ]; then - s="${s#*\*}" - r="$r\"$a\"*" - else - s="${s#*\?}" - r="$r\"$b\"?" - fi - else - a="${s%%\**}" - s="${s#*\*}" - r="$r\"$a\"*" - fi - elif [[ "$s" == *\?* ]]; then - if [[ "$s" == *\** ]]; then - a="${s%%\**}" - b="${s%%\?*}" - if [ ${#a} -lt ${#b} ]; then - s="${s#*\*}" - r="$r\"$a\"*" - else - s="${s#*\?}" - r="$r\"$b\"?" - fi - else - a="${s%%\?*}" - s="${s#*\?}" - r="$r\"$a\"?" - fi - else - r="$r\"$s\"" - break - fi - done - recho_ "$r" -} -function qlines() { - sed "s/'/'\\\\''/g; s/.*/'&'/g" -} -function setv() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - eval "$__s_var=\"\$*\"" -} -function _setv() { - local __s_var="$1"; shift - eval "$__s_var=\"\$*\"" -} -function echo_setv() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - echo "$__s_var=$(qvalr "$*")" -} -function setx() { - if [ "$1" == -a ]; then - shift - local __s_array="$1"; shift - if [[ "$__s_array" == *=* ]]; then - set -- "${__s_array#*=}" "$@" - __s_array="${__s_array%%=*}" - fi - eval "$__s_array=($("$@" | qlines))" - else - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - eval "$__s_var="'"$("$@")"' - fi -} -function _setvx() { - local __s_var="$1"; shift - eval "$__s_var="'"$("$@")"' -} -function _setax() { - local __s_array="$1"; shift - eval "$__s_array=($("$@" | qlines))" -} -function evalx() { - local __e_val __e_arg __e_r=0 - local -a __e_cmd - - local __e_first=1 - while [ $# -gt 0 ]; do - __e_cmd=() - while [ $# -gt 0 ]; do - __e_arg="$1"; shift - [ "$__e_arg" == // ] && break - if [ "${__e_arg%//}" != "$__e_arg" ]; then - local __e_tmp="${__e_arg%//}" - if [ -z "${__e_tmp//\\/}" ]; then - __e_arg="${__e_arg#\\}" - __e_cmd=("${__e_cmd[@]}" "$__e_arg") - continue - fi - fi - __e_cmd=("${__e_cmd[@]}" "$__e_arg") - done - - if [ -n "$__e_first" ]; then - __e_val="$("${__e_cmd[@]}")" || __e_r=$? - else - __e_val="$("${__e_cmd[@]}" "$__e_val")" || __e_r=$? - fi - __e_first= - done - [ -n "$__e_val" ] && echo "$__e_val" - return $__e_r -} -function setxx() { - local -a __s_args - if [ "$1" == -a ]; then __s_args=(-a); shift; fi - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - __s_args=("${__s_args[@]}" "$__s_var") - setx "${__s_args[@]}" evalx "$@" -} -function evalp() { - local __e_arg __e_cmd - - while [ $# -gt 0 ]; do - __e_arg="$1"; shift - if [ "$__e_arg" == // ]; then - __e_cmd="$__e_cmd |" - continue - elif [ "${__e_arg%//}" != "$__e_arg" ]; then - local __e_tmp="${__e_arg%//}" - if [ -z "${__e_tmp//\\/}" ]; then - __e_arg="${__e_arg#\\}" - fi - fi - __e_cmd="${__e_cmd:+$__e_cmd }\"$(_qval "$__e_arg")\"" - done - eval "$__e_cmd" -} -function setxp() { - local -a __s_args - if [ "$1" == -a ]; then __s_args=(-a); shift; fi - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - __s_args=("${__s_args[@]}" "$__s_var") - setx "${__s_args[@]}" evalp "$@" -} -function testx() { - local __t_op="$1"; shift - local __t_val="$(evalx "$@")" - [ $__t_op "$__t_val" ] -} -function test2x() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalx "$@")" - [ "$__t_val1" $__t_op "$__t_val2" ] -} -function testrx() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalx "$@")" - eval '[[ "$__t_val1" '"$__t_op"' "$__t_val2" ]]' -} -function testp() { - local __t_op="$1"; shift - local __t_val="$(evalp "$@")" - [ $__t_op "$__t_val" ] -} -function test2p() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalp "$@")" - [ "$__t_val1" $__t_op "$__t_val2" ] -} -function testrp() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalp "$@")" - eval '[[ "$__t_val1" '"$__t_op"' "$__t_val2" ]]' -} - -function err2out() { - "$@" 2>&1 -} - -function is_defined() { - [ -n "$(declare -p "$1" 2>/dev/null)" ] -} -function is_array() { - case "$(declare -p "$1" 2>/dev/null)" in declare\ -a*) return 0;; esac - return 1 -} - -function upvar() { - if unset -v "$1"; then - if [ $# -eq 2 ]; then - eval "$1=\"\$2\"" - else - eval "$1=(\"\${@:2}\")" - fi - fi -} -function array_upvar() { - unset -v "$1" && eval "$1=(\"\${@:2}\")" -} -function upvars() { - while [ $# -gt 0 ]; do - case "$1" in - -a) - unset -v "$2" && eval "$2=(\"\${@:3}\")" - break - ;; - -a*) - unset -v "$2" && eval "$2=(\"\${@:3:${1#-a}}\")" - shift $((${1#-a} + 2)) || return 1 - ;; - *) - unset -v "$1" && eval "$1=\"\$2\"" - shift; shift - ;; - esac - done -} - -function __ab_process_pending() { - local -a values - case "$mode" in - cmd) values="$("${pending[@]}")";; - ssplit) eval "values=($("${pending[@]}"))";; - lsplit) eval "values=($("${pending[@]}" | qlines))";; - add) values=("${pending[@]}");; - esac - cmd=("${cmd[@]}" "${values[@]}") - pending=() -} -function array_buildcmd() { - local desta="$1"; shift; local "$desta" - local mode=add - local -a pending cmd - while [ $# -gt 0 ]; do - case "$1" in - ++c|++cmd|++) __ab_process_pending; mode=cmd;; - ++s|++ssplit) __ab_process_pending; mode=ssplit;; - ++l|++lsplit) __ab_process_pending; mode=lsplit;; - ++a|++add) __ab_process_pending; mode=add;; - *) pending=("${pending[@]}" "$1");; - esac - shift - done - __ab_process_pending - array_upvar "$desta" "${cmd[@]}" -} -function buildcmd() { - local -a args - array_buildcmd args "$@" - qvals "${args[@]}" -} -function evalcmd() { - local -a args - array_buildcmd args "$@" - "${args[@]}" -} -##@inc]base.core -##@inc[base.num -## Fonctions de base: gestion des valeurs numériques -uprovide base.num - -function isnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//[0-9]/}" - [ -z "$v" ] -} -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - [ -z "${1//[0-9]/}" ] -} -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//./}" - v="${v//,/}" - v="${v//[0-9]/}" - [ -z "$v" ] -} -##@inc]base.num -##@inc[base.bool -## Fonctions de base: valeurs booléennes -##@inc[base.num -## Fonctions de base: gestion des valeurs numériques -uprovide base.num - -function isnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//[0-9]/}" - [ -z "$v" ] -} -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - [ -z "${1//[0-9]/}" ] -} -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//./}" - v="${v//,/}" - v="${v//[0-9]/}" - [ -z "$v" ] -} -##@inc]base.num -uprovide base.bool -urequire base.num - -function is_yes() { - case "${1,,}" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - esac - isnum "$1" && [ "$1" -ne 0 ] && return 0 - return 1 -} -function is_no() { - case "${1,,}" in - n|non|no|f|faux|false|off) return 0;; - esac - isnum "$1" && [ "$1" -eq 0 ] && return 0 - return 1 -} -function yesval() { - is_yes "$1" && echo 1 -} - -function setb() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - local __s_r - if "$@" >/dev/null; then - eval "$__s_var=1" - else - __s_r=$? - eval "$__s_var=" - return $__s_r - fi -} -function _setb() { - local __s_var="$1"; shift - if "$@" >/dev/null; then - eval "$__s_var=1" - else - eval "$__s_var=" - fi -} - -function evalb() { - if evalx "$@" >/dev/null; then - echo 1 - else - return $? - fi -} -function setxb() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - setx "$__s_var" evalb "$@" -} -##@inc]base.bool -##@inc[base.quote -## Fonctions de base: protection de valeurs chaine -uprovide base.quote -urequire base.core - -function _qawk() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s// -/\\n}" - recho_ "$s" -} -function qawk() { - echo -n \" - _qawk "$@" - echo \" -} -function qseds() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\//\\/}" - s="${s// -/\\n}" - recho "$s" -} -function _qform() { - local s="$*" - s="${s//\%/%25}" - s="${s//+/%2B}" - s="${s//&/%26}" - s="${s//=/%3D}" - s="${s// /+}" - recho_ "$s" -} -function qform() { - local s="$*" - if [[ "$s" == *=* ]]; then - _qform "${s%%=*}" - echo -n = - _qform "${s#*=}" - echo - else - _qform "$s" - echo - fi -} -function _qsql() { - local q="'" qq="''" - echo "${*//$q/$qq}" -} -function qsql() { - local q="'" qq="''" - echo "'${*//$q/$qq}'" -} -##@inc]base.quote -uprovide base.compat -urequire base.core base.num base.bool base.quote - - -function setx2() { setxx "$@"; } -function rawecho() { recho "$@"; } -function rawecho_() { recho_ "$@"; } -function quote_arg() { _qval "$@"; } -function quoted_arg() { qvalm "$@"; } -function quoted_args() { qvals "$@"; } -function set_var() { setv "$@"; } -function set_var_cmd() { echo_setv "$@"; } -function set_var_literal() { eval "$1=$2"; } - -function quote_awk() { _qawk "$@"; } -function quoted_awk() { qawk "$@"; } -function quote_seds() { qseds "$@"; } -function quote_form() { _qform "$@"; } -function quoted_form() { qform "$@"; } - - -if [ -n "$BASH_VERSINFO" -a "${BASH_VERSINFO[0]}" -lt 4 ]; then - function strlower() { tr A-Z a-z <<<"$*"; } - function strlower1() { - local str="$*" - local h="${str:0:1}" r="${str:1}" - echo "$(tr A-Z a-z <<<"$h")$r" - } - function strlowers() { - local -a vs; local v - for v in "$@"; do - vs=("${vs[@]}" "$(strlower1 "$v")") - done - echo "${vs[*]}" - } - function strupper() { tr a-z A-Z <<<"$*"; } - function strupper1() { - local str="$*" - local h="${str:0:1}" r="${str:1}" - echo "$(tr a-z A-Z <<<"$h")$r" - } - function struppers() { - local -a vs; local v - for v in "$@"; do - vs=("${vs[@]}" "$(strupper1 "$v")") - done - echo "${vs[*]}" - } - - function is_yes() { - case "$1" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - O|OUI|Y|YES|V|VRAI|T|TRUE|ON) return 0;; - esac - isnum "$1" && [ "$1" -ne 0 ] && return 0 - case "$(strlower "$1")" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - esac - return 1 - } - function is_no() { - case "$1" in - n|non|no|f|faux|false|off) return 0;; - N|NON|NO|F|FAUX|FALSE|OFF) return 0;; - esac - isnum "$1" && [ "$1" -eq 0 ] && return 0 - case "$(strlower "$1")" in - n|non|no|f|faux|false|off) return 0;; - esac - return 1 - } -fi -##@inc]base.compat -uprovide base -urequire base.init base.core base.string base.num base.bool base.array base.quote base.split base.args base.tools base.compat - -UNAME_SYSTEM=`uname -s` -[ "${UNAME_SYSTEM#CYGWIN}" != "$UNAME_SYSTEM" ] && UNAME_SYSTEM=Cygwin -[ "${UNAME_SYSTEM#MINGW32}" != "$UNAME_SYSTEM" ] && UNAME_SYSTEM=Mingw -UNAME_MACHINE=`uname -m` -if [ -n "$UTOOLS_CHROOT" ]; then - [ -n "$UTOOLS_UNAME_SYSTEM" ] && eval "UNAME_SYSTEM=$UTOOLS_UNAME_SYSTEM" - [ -n "$UTOOLS_UNAME_MACHINE" ] && eval "UNAME_MACHINE=$UTOOLS_UNAME_MACHINE" -fi - -function setyesval() { - is_yes "$2" && set_var "$1" 1 || set_var "$1" "" -} -function normyesval() { - is_yes "${2:-"${!1}"}" && set_var "$1" 1 || set_var "$1" "" -} -function normyesvals() { - local __nyv_yesvar - for __nyv_yesvar in "$@"; do - is_yes "${!__nyv_yesvar}" && set_var "$__nyv_yesvar" 1 || set_var "$__nyv_yesvar" "" - done -} -function quote_in() { - sed 's/\\/\\\\/g -s/"/\\"/g -s/\$/\\$/g -s/`/\\`/g' -} -function quote_sin() { - sed "s/'/'\\\\''/g" -} -function quote_sarg() { - quote_sin <<<"$1" -} -function quoted_sarg() { - echo "'$(quote_sarg "$1")'" -} -function quoted_sargs() { - local a s - for a in "$@"; do - s="${s:+$s }$(quoted_sarg "$a")" - done - rawecho "$s" -} - -function set_array_cmd() { - [ $# -eq 1 ] && set -- "$1" "$1" - local __sac_s __sac_v __sac_f - __sac_s="$1=("; shift - if [ "$1" == "@" ]; then - shift - else - eval "set -- \"\${$1[@]}\"" - fi - __sac_f=1 - for __sac_v in "$@"; do - [ -n "$__sac_f" ] && __sac_f= || __sac_s="$__sac_s " - __sac_s="$__sac_s$(quoted_arg "$__sac_v")" - done - __sac_s="$__sac_s)" - echo "$__sac_s" -} -function set_array() { - eval "$(set_array_cmd "$@")" -} -function array_count() { - eval "echo \${#$1[*]}" -} -function array_isempty() { - [ $(array_count "$1") -eq 0 ] -} -function array_new() { - eval "$1=()" -} -function array_add() { - local __aa_a="$1"; shift - eval "$__aa_a=(\"\${$__aa_a[@]}\" \"\$@\")" -} -function array_ins() { - local __aa_a="$1"; shift - eval "$__aa_a=(\"\$@\" \"\${$__aa_a[@]}\")" -} -function array_del() { - local __ad_v - local -a __ad_vs - eval 'for __ad_v in "${'"$1"'[@]}"; do - if [ "$__ad_v" != '"$(quoted_arg "$2")"' ]; then - array_add __ad_vs "$__ad_v" - fi -done' - array_copy "$1" __ad_vs -} -function array_addu() { - local __as_v - eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then - return 1 - fi -done' - array_add "$1" "$2" - return 0 -} -function array_set() { - array_addu "$@" -} -function array_insu() { - local __as_v - eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then - return 1 - fi -done' - array_ins "$1" "$2" - return 0 -} -function array_fillrange() { - local -a __af_vs - local __af_i="${2:-1}" __af_to="${3:-10}" __af_step="${4:-1}" - while [ "$__af_i" -le "$__af_to" ]; do - __af_vs=("${__af_vs[@]}" "$__af_i") - __af_i=$(($__af_i + $__af_step)) - done - array_copy "$1" __af_vs -} -function array_eq() { - local -a __ae_a1 __ae_a2 - array_copy __ae_a1 "$1" - array_copy __ae_a2 "$2" - [ ${#__ae_a1[*]} -eq ${#__ae_a2[*]} ] || return 1 - local __ae_v __ae_i=0 - for __ae_v in "${__ae_a1[@]}"; do - [ "$__ae_v" == "${__ae_a2[$__ae_i]}" ] || return 1 - __ae_i=$(($__ae_i + 1)) - done - return 0 -} -function array_contains() { - local __ac_v - eval 'for __ac_v in "${'"$1"'[@]}"; do - if [ "$__ac_v" == '"$(quoted_arg "$2")"' ]; then - return 0 - fi -done' - return 1 -} -function array_find() { - local __af_i __af_v - __af_i=0 - eval 'for __af_v in "${'"$1"'[@]}"; do - if [ "$__af_v" == '"$(quoted_arg "$2")"' ]; then - if [ -n "$3" ]; then - echo "${'"$3"'[$__af_i]}" - else - echo "$__af_i" - fi - return 0 - fi - __af_i=$(($__af_i + 1)) -done' - return 1 -} -function array_reverse() { - local -a __ar_vs - local __ar_v - array_copy __ar_vs "$1" - array_new "$1" - for __ar_v in "${__ar_vs[@]}"; do - array_ins "$1" "$__ar_v" - done -} - -function array_replace() { - local __ar_sn="$1"; shift - local __ar_f="$1"; shift - local -a __ar_s __ar_d - local __ar_v - array_copy __ar_s "$__ar_sn" - for __ar_v in "${__ar_s[@]}"; do - if [ "$__ar_v" == "$__ar_f" ]; then - __ar_d=("${__ar_d[@]}" "$@") - else - __ar_d=("${__ar_d[@]}" "$__ar_v") - fi - done - array_copy "$__ar_sn" __ar_d -} -function array_each() { - local __ae_an="$1"; shift - local __ae_f="$1"; shift - local -a __ae_a - local __ae_v - array_copy __ae_a "$__ae_an" - for __ae_v in "${__ae_a[@]}"; do - "$__ae_f" "$__ae_v" "$@" - done -} -function array_map() { - local __am_an="$1"; shift - local __am_f="$1"; shift - local -a __am_a __am_vs - local __am_v - array_copy __am_a "$__am_an" - for __am_v in "${__am_a[@]}"; do - __am_vs=("${__am_vs[@]}" "$("$__am_f" "$__am_v" "$@")") - done - array_copy "$__am_an" __am_vs -} -function first_value() { - eval "rawecho \"\${$1[@]:0:1}\"" -} -function last_value() { - eval "rawecho \"\${$1[@]:\$((-1)):1}\"" -} -function array_copy() { - eval "$1=(\"\${$2[@]}\")" -} -function array_copy_firsts() { - eval "$1=(\"\${${2:-$1}[@]:0:\$((\${#${2:-$1}[@]}-1))}\")" -} -function array_del_last() { - array_copy_firsts "$1" -} -function array_copy_lasts() { - eval "$1=(\"\${${2:-$1}[@]:1}\")" -} -function array_del_first() { - array_copy_lasts "$1" -} -function array_extend() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]}\")" -} -function array_extendu() { - local __ae_v __ae_s=1 - eval 'for __ae_v in "${'"$2"'[@]}"; do - array_addu "$1" "$__ae_v" && __ae_s=0 -done' - return "$__ae_s" -} -function array_extend_firsts() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]:0:\$((\${#$2[@]}-1))}\")" -} -function array_extend_lasts() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]:1}\")" -} -function array_xsplit() { - eval "$1=($(recho_ "$2" | awkrun RS="${3:-:}" ' -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_split() { - eval "$1=($(recho_ "$2" | awkrun RS="${3:-:}" ' -/^$/ { next } -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_from_path() { - array_split "$1" "$2" ":" -} -function array_from_xlines() { - eval "$1=($(recho_ "$2" | _nl2lf | awk ' -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_from_lines() { - eval "$1=($(recho_ "$2" | _nl2lf | awk ' -/^$/ { next } -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_join() { - local __aj_an __aj_l __aj_j __aj_s="${2:-,}" __aj_pf __aj_sf - if [ "$1" == "@" ]; then - __aj_an="\$@" - shift; shift - else - __aj_an="\${$1[@]}" - __aj_pf="$4" - __aj_sf="$5" - fi - eval 'for __aj_l in "'"$__aj_an"'"; do - __aj_j="${__aj_j:+$__aj_j'"$__aj_s"'}$__aj_pf$__aj_l$__aj_sf" -done' - if [ -n "$__aj_j" ]; then - rawecho "$__aj_j" - elif [ "$__aj_an" != "\$@" -a -n "$3" ]; then - rawecho "$3" - fi -} -function array_mapjoin() { - local __amj_src="$1" __amj_func="$2" __amj_sep="$3" - shift; shift; shift - if [ "$__amj_src" == "@" ]; then - local -a __amj_tmpsrc - __amj_tmpsrc=("$@") - __amj_src=__amj_tmpsrc - set -- - fi - local -a __amj_tmp - array_copy __amj_tmp "$__amj_src" - array_map __amj_tmp "$__amj_func" - array_join __amj_tmp "$__amj_sep" "$@" -} -function array_to_lines() { - array_join "$1" " -" "$2" "$3" "$4" -} -function array_to_path() { - array_join "$1" ":" "$2" "$3" "$4" -} -function array_fix_paths() { - local __afp_an="$1" __afp_s="${2:-:}" - local -a __afp_vs - local __afp_v - array_copy __afp_vs "$__afp_an" - array_new "$__afp_an" - for __afp_v in "${__afp_vs[@]}"; do - array_split __afp_v "$__afp_v" "$__afp_s" - array_extend "$__afp_an" __afp_v - done -} - - -function get_date_rfc822() { - LC_TIME=C date +"%a, %d %b %Y %H:%M:%S %Z" -} -function get_date_fr() { - LC_TIME=C date +"%d/%m/%Y" -} -function get_time_fr() { - LC_TIME=C date +"%Hh%M" -} -function parse_date() { - local value="$1" type="${2:-date}" - local now="$(awk 'BEGIN { print mktime(strftime("%Y %m %d 00 00 00 +0400")) }')" - case "$value" in - +*) - value="$(($now + ${value#+} * 86400))" - ;; - *) - value="$(<<<"$value" awk -F/ '{ - nd = strftime("%d"); nm = strftime("%m"); ny = strftime("%Y") - d = $1 + 0; if (d < 1) d = nd; - m = $2 + 0; if (m < 1) m = nm; - if ($3 == "") y = ny; - else { y = $3 + 0; if (y < 100) y = y + 2000; } - print mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d)); - }')" - esac - case "$type" in - d|date) awk '{ print strftime("%d/%m/%Y", $0 + 0) }' <<<"$value";; - l|ldap) awk '{ print strftime("%Y%m%d%H%M%S+0400", $0 + 0) }' <<<"$value";; - m|mysql) awk '{ print strftime("%Y-%m-%d", $0 + 0) }' <<<"$value";; - *) - rawecho "$value" - ;; - esac -} - - -function udelpath() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; ${2:-PATH}"'="${'"${2:-PATH}"'#$1:}"; '"${2:-PATH}"'="${'"${2:-PATH}"'%:$1}"; '"${2:-PATH}"'="${'"${2:-PATH}"'//:$_qdir:/:}"; [ "$'"${2:-PATH}"'" == "$1" ] && '"${2:-PATH}"'=' -} -function uaddpath() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="${'"${2:-PATH}"':+$'"${2:-PATH}"':}$1"' -} -function uinspathm() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="$1${'"${2:-PATH}"':+:$'"${2:-PATH}"'}"' -} -function uinspath() { - udelpath "$@" - uinspathm "$@" -} - -function withpath() { - [ "${1#./}" != "$1" -o "${1#../}" != "$1" -o "${1#/}" != "$1" ] -} -function withext() { - local basename="$(basename -- "$1")" - [ "${basename%.*}" != "$basename" ] -} -function normpath() { - local -a parts - local part ap - array_split parts "$1" / - if [ "${1#/}" != "$1" ]; then - ap=/ - elif [ -n "$2" ]; then - ap="$2" - else - ap="$(pwd)" - fi - for part in "${parts[@]}"; do - if [ "$part" == "." ]; then - continue - elif [ "$part" == ".." ]; then - ap="${ap%/*}" - [ -n "$ap" ] || ap=/ - else - [ "$ap" != "/" ] && ap="$ap/" - ap="$ap$part" - fi - done - rawecho "$ap" -} -function abspath() { - local ap="$1" - if [ "${ap#/}" != "$ap" ]; then - __normpath "$ap" && return - else - local cwd - if [ -n "$2" ]; then - cwd="$(abspath "$2")" - else - cwd="$(pwd)" - fi - ap="$cwd/$ap" - __normpath "$ap" && return - fi - normpath "$ap" -} -function __normpath() { - if [ -d "$1" ]; then - if [ -x "$1" ]; then - (cd "$1"; pwd) - return 0 - fi - elif [ -f "$1" ]; then - local dn="$(dirname -- "$1")" bn="$(basename -- "$1")" - if [ -x "$dn" ]; then - (cd "$dn"; echo "$(pwd)/$bn") - return 0 - fi - fi - return 1 -} -function parentdirs() { - array_new "$1" - local __pd_d="$(abspath "$2")" - if [[ "$3" == r* ]]; then - while [ "$__pd_d" != "/" ]; do - array_ins "$1" "$__pd_d" - __pd_d="$(dirname "$__pd_d")" - done - else - while [ "$__pd_d" != "/" ]; do - array_add "$1" "$__pd_d" - __pd_d="$(dirname "$__pd_d")" - done - fi -} -function ppath() { - local path="$1" cwd="$2" - - path="$(abspath "$path")" # essayer de normaliser le chemin - [ -n "$cwd" ] || cwd="$(pwd)" - - [ "$path" = "$cwd" ] && path="." - [ "$cwd" != "/" -a "$cwd" != "$HOME" ] && path="${path/#$cwd\//}" - path="${path/#$HOME/~}" - - rawecho "$path" -} -function relpath() { - local p="$(abspath "$1" "$3")" cwd="$2" - if [ -z "$cwd" ]; then - cwd="$(pwd)" - else - cwd="$(abspath "$cwd" "$3")" - fi - if [ "$p" == "$cwd" ]; then - echo "" - elif [ "${p#$cwd/}" != "$p" ]; then - rawecho "${p#$cwd/}" - else - local rp - while [ -n "$cwd" -a "${p#$cwd/}" == "$p" ]; do - rp="${rp:+$rp/}.." - cwd="${cwd%/*}" - done - rp="$rp/${p#$cwd/}" - echo "${rp%//}" - fi -} -function relpathx() { - local p="$(relpath "$@")" - if [ -z "$p" ]; then - echo . - elif [ "${p#../}" != "$p" -o "${p#./}" != "$p" ]; then - echo "$p" - else - echo "./$p" - fi -} -function withinpath() { - local b="$1" p="$2" strict="${3:-N}" - b="$(abspath "$b")" - p="$(abspath "$p")" - if is_yes "$strict"; then - [ "${p#$b/}" != "$p" ] - else - [ "$p" == "$b" -o "${p#$b/}" != "$p" ] - fi -} -function safe_abspath() { - local p="$1" ba="$2" br="$3" - if [ -n "$ba" ]; then - ba="$(abspath "$ba")" - else - ba="$(pwd)" - fi - [ -n "$br" ] || br="$ba" - br="$(abspath "$br" "$ba")" - p="$(abspath "$p" "$ba")" - if [ "$p" == "$br" -o "${p#$br/}" != "$p" ]; then - echo "$p" - else - return 1 - fi -} -function safe_relpath() { - local p - if p="$(safe_abspath "$1" "$2" "$3")"; then - relpath "$p" "$2" "$(pwd)" - else - return 1 - fi -} -function splitwcs() { - local __sw_p="$1" - local __sw_dd="${2:-basedir}" __sw_df="${3:-filespec}" __sw_part __sw_d __sw_f - local -a __sw_parts - array_split __sw_parts "$__sw_p" "/" - for __sw_part in "${__sw_parts[@]}"; do - if [[ "$__sw_part" == *\** ]] || [[ "$__sw_part" == *\?* ]] || [ -n "$__sw_f" ]; then - __sw_f="${__sw_f:+$__sw_f/}$__sw_part" - else - __sw_d="${__sw_d:+$__sw_d/}$__sw_part" - fi - done - [ "${__sw_p#/}" != "$__sw_p" ] && __sw_d="/$__sw_d" - set_var "$__sw_dd" "$__sw_d" - set_var "$__sw_df" "$__sw_f" -} -function deref() { - local OENC="$UTF8" - - local max_deref=50 - local file="$1" - local basedir link - while [ -L "$file" ]; do - basedir="$(dirname "$file")" - link="$(readlink "$file")" - if first_char_is "$link" "/"; then - file="$link" - else - file="$basedir/$link" - fi - - max_deref=$(($max_deref - 1)) - [ $max_deref -eq 0 ] && die "Plus de 50 indirection. Le lien $file est-il récursif?" - done - abspath "$file" -} -function readlinka() { - if [ -L "$1" ]; then - local linkdir="$(dirname -- "$1")" - abspath "$(readlink "$1")" "$linkdir" - else - abspath "$1" - fi -} -function readlinkm() { - readlink -m "$1" -} -function path_if_test() { - local op="$1"; shift - local file="$1"; shift - local rel="$1" reldir=; shift - if beginswith "$rel" relative; then - reldir="${rel#relative}" - if beginswith "$reldir" :; then - reldir="${reldir#:}" - if [ -n "$reldir" ]; then - reldir="${reldir}/" - fi - else - reldir= - fi - else - rel= - fi - - while [ -n "$1" ]; do - local basedir="$1" - if [ $op "$basedir/$file" ]; then - if [ -n "$rel" ]; then - rawecho "$reldir$file" - else - rawecho "$basedir/$file" - fi - break - fi - shift - done -} -function update_link() { - [ -L "$2" ] || return 1 - local dest link="$2" - local linkdir="$(dirname "$link")" - local ldest="$(readlink "$link")" - if [ "${ldest#/}" != "$ldest" ]; then - dest="$(abspath "$1")" - else - dest="$(relpath "$1" "$linkdir")" - fi - if [ "$dest" == "$ldest" ]; then - : # pas besoin de mettre à jour - elif [ -d "$link" ]; then - rm -f "$link" && ln -s "$dest" "$link" - else - ln -sf "$dest" "$link" - fi -} -function update_links() { - [ -n "$1" ] || return 1 - local dest="$1"; shift - local r=0 link - for link in "$@"; do - update_link "$dest" "$link" || r=$? - done - return $r -} -function move_link() { - [ -n "$1" -a -n "$2" ] || return 1 - local link="$1" dest="$2" - [ -d "$dest" ] && dest="$dest/$(basename -- "$link")" - dest="$(abspath "$dest")" - if [ -L "$link" ]; then - link="$(abspath "$link")" - [ "$dest" == "$link" ] && return 0 - ldest="$(readlinka "$link")" - mv "$link" "$dest" || return 1 - update_link "$ldest" "$dest" - else - [ "$dest" == "$link" ] && return 0 - mv "$link" "$dest" - fi -} -function array_find_links() { - local -a __afl_links __afl_result - local __afl_dir="${3:-.}" - local __afl_dest __afl_destname __afl_link __afl_linkdir __afl_ldest - __afl_dest="$(abspath "$2")" - __afl_destname="${__afl_dest##*/}" - array_from_lines __afl_links "$(find "$__afl_dir" -type l)" - for __afl_link in "${__afl_links[@]}"; do - __afl_ldest="$(readlink "$__afl_link")" - if [ "$__afl_ldest" != "$__afl_destname" ]; then - [[ "$__afl_ldest" == */"$__afl_destname" ]] || continue - fi - __afl_link="$(abspath "$__afl_link" "$__afl_dir")" - __afl_linkdir="$(dirname -- "$__afl_link")" - __afl_ldest="$(abspath "$__afl_ldest" "$__afl_linkdir")" - if [ "$__afl_ldest" == "$__afl_dest" ]; then - array_add __afl_result "$__afl_link" - fi - done - array_copy "$1" __afl_result -} -function list_links() { - local -a links - array_find_links links "$@" - array_to_lines links -} -function move_file() { - [ -n "$1" -a -n "$2" ] || return 1 - local src="$1" dest="$2" link - shift; shift - [ -d "$dest" ] && dest="$dest/$(basename -- "$src")" - move_link "$src" "$dest" || return 1 - update_links "$dest" "$@" -} - -function get_nblines() { - [ -f "$1" ] && sed -ne '$=' "$1" || echo 0 -} -function mktempf() { - mktemp "${1:-"$TMPDIR/tmp.XXXXXX"}" -} -function mktempd() { - mktemp -d "${1:-"$TMPDIR/tmp.XXXXXX"}" -} -function mkdirof() { - mkdir -p "$(dirname -- "$1")" -} -function cp_a() { - /bin/cp -a "$@" -} -function cp_R() { - /bin/cp -pR "$@" -} -function quietgrep() { - grep -q "$@" 2>/dev/null -} -function quietdiff() { - diff -q "$@" >&/dev/null -} -function testsame() { - quietdiff "$@" -} -function testdiff() { - ! quietdiff "$@" -} -function testupdated() { - if [ -f "$2" ]; then - testdiff "$1" "$2" - else - return 0 - fi -} -function testnewer() { - test ! -e "$2" -o "$1" -nt "$2" -} -function ps_all() { - ps -axww -} -function progexists() { - test -n "$1" -a -x "$(which "$1" 2>/dev/null)" -} -function has_python() { - progexists python -} -function has_gawk() { - progexists gawk -} -function is_root() { - test `id -u` -eq 0 -} -function source_ifexists() { - if [ -f "$1" ]; then source "$1" || die; fi -} -function little_sleep { - LC_NUMERIC=C sleep 0.1 -} -function random_sleep { - sleep $(($RANDOM % ${1:-1800})) -} -function is_running() { - kill -0 "$1" >&/dev/null -} -function sedi() { - sed -i "$@" -} -function csort() { - LANG=C sort "$@" -} -function lsort() { sort "$@"; } -function cgrep() { - LANG=C grep "$@" -} -function lgrep() { grep "$@"; } -function csed() { - LANG=C sed "$@" -} -function lsed() { sed "$@"; } -function cawk() { - LANG=C awk "$@" -} -function lawk() { awk "$@"; } -function cdiff() { - LANG=C diff "$@" -} -function ldiff() { diff "$@"; } - - -function fix_mode() { - local file="$1" - [ -f "$file" ] || touch "$file" || return 1 - if [ ! -w "$file" ]; then - local mode="$(stat -c %a "$file")" - chmod ${mode:0:${#mode}-3}6${mode:${#mode}-2:2} "$file" - echo "$mode" - fi -} -function unfix_mode() { - [ -n "$2" ] && chmod "$2" "$1" -} -function get_mode() { - [ -f "$1" ] || touch "$1" || return 1 - stat -c %a "$1" -} -function rm_maybe() { - local parse_opts=1 arg rm - for arg in "$@"; do - if [ -n "$parse_opts" ]; then - if [ "$arg" == "--" ]; then - parse_opts= - elif [[ "$arg" == "-*" ]]; then - continue - elif [ -n "$arg" ]; then - rm=1 - break - fi - elif [ -n "$arg" ]; then - rm=1 - break - fi - done - [ -n "$rm" ] && /bin/rm "$@" -} -__CPDIR_RSYNC_SLOW=1 # synchro potentiellement plus lente, mais plus fidèle (option -c) -__CPDIR_RSYNC_ARGS=(-q) -function cpdir() { - - if progexists rsync; then - [ -d "$2" ] || mkdir -p "$2" || return 1 - if [ -d "$1" ]; then - rsync -a ${__CPDIR_RSYNC_SLOW:+-c} "${__CPDIR_RSYNC_ARGS[@]}" "$1/" "$2/" - else - rsync -a ${__CPDIR_RSYNC_SLOW:+-c} "${__CPDIR_RSYNC_ARGS[@]}" "$1" "$2/" - fi - else - __cpdir "$@" - fi -} -function __cpdir() { - local src="$1" dest="$2" method="${3:-cp_a}" - - if [ -d "$src" ]; then - [ -d "$dest" ] || mkdir -p "$dest" || return 1 - - local prevdir="$(pwd)" - - dest="$(abspath "$dest")" - cd "$src" - if [ -n "$(/bin/ls -a1)" ]; then - [ -n "$(/bin/ls -1)" ] && "$method" * "$dest" - local i - for i in .*; do - [ "$i" == "." -o "$i" == ".." ] && continue - "$method" "$i" "$dest" - done - fi - cd "$prevdir" - else - if [ -f "$dest" ]; then - "$method" "$src" "$dest" - elif [ -d "$dest" ]; then - "$method" "$src" "$dest" - else - mkdir -p "$dest" - "$method" "$src" "$dest" - fi - fi -} -__CPNOVCS_RSYNC_SLOW=1 # synchro potentiellement plus lente, mais plus fidèle (option -c) -__CPNOVCS_RSYNC_ARGS=(-q) -function cpnovcs() { - local src="$1" destdir="$2" - [ -d "$destdir" ] || mkdir -p "$destdir" || return 1 - if progexists rsync; then - local gitexclude=/.git/ - if [ "${src%/}" == "$src" ]; then - gitexclude="/$(basename -- "$src")$gitexclude" - fi - rsync -a ${__CPNOVCS_RSYNC_SLOW:+-c} --exclude CVS/ --exclude .svn/ --exclude "$gitexclude" "${__CPNOVCS_RSYNC_ARGS[@]}" "$src" "$destdir/" - elif [ "${src%/}" != "$src" ]; then - __cpdir "$src" "$destdir" - else - local srcname="$(basename -- "$src")" - mkdir -p "$destdir/$srcname" - __cpdir "$src" "$destdir/$srcname" - fi -} -function cpdirnovcs() { - if [ -d "$1" ]; then - cpnovcs "$1/" "$2" - else - cpnovcs "$1" "$2" - fi -} -function doinplace() { - if [ -n "$1" -a "$1" != "-" ]; then - local __dip_file="$1"; shift - autoclean "$__dip_file.tmp.$$" - "$@" <"$__dip_file" >"$__dip_file.tmp.$$" - local s=$? - [ "$s" == 0 ] && /bin/cat "$__dip_file.tmp.$$" >"$__dip_file" - /bin/rm -f "$__dip_file.tmp.$$" - return $s - else - shift - "$@" - fi -} -function doinplacef() { - if [ -n "$1" -a "$1" != "-" ]; then - local __dip_file="$1"; shift - autoclean "$__dip_file.tmp.$$" - "$@" <"$__dip_file" >"$__dip_file.tmp.$$" - local s=$? - /bin/cat "$__dip_file.tmp.$$" >"$__dip_file" - /bin/rm -f "$__dip_file.tmp.$$" - return $s - else - shift - "$@" - fi -} -function stripnl() { - tr -d '\r\n' -} -function _nl2lf() { - awk 'BEGIN {RS="\r|\r\n|\n"} {print}' -} -function nl2lf() { - doinplace "$1" _nl2lf -} -function _nl2crlf() { - awk 'BEGIN {RS="\r|\r\n|\n"} {print $0 "\r"}' -} -function nl2crlf() { - doinplace "$1" _nl2crlf -} -function _nl2cr() { - awk 'BEGIN {RS="\r|\r\n|\n"; ORS=""} {print $0 "\r"}' -} -function nl2cr() { - doinplace "$1" _nl2cr -} -function _latin1compat() { - LANG=fr_FR.UTF-8 sed $' -s/[‘’]/\x27/g -s/[«»“”]/"/g -s/[\xC2\xA0\xE2\x80\x87\xE2\x80\xAF\xE2\x81\xA0]/ /g -' -} -function _noaccents() { - LANG=fr_FR.UTF-8 sed ' -s/[à]/a/g -s/[éèêë]/e/g -s/[ïî]/i/g -s/[ôö]/o/g -s/[üû]/u/g -s/[ç]/c/g -s/[À]/A/g -s/[ÉÈÊË]/E/g -s/[ÏÎ]/I/g -s/[ÔÖ]/O/g -s/[ÜÛ]/U/g -s/[Ç]/C/g -' -} -function list_all() { - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ "$f" == "." -o "$f" == ".." ] && continue - rawecho "$f" - done - cd "$curdir" -} -function __la_cmd() { - [ $# -gt 0 ] || set '*' - local arg - local cmd="/bin/ls -1d" - for arg in "$@"; do - arg="$(_rval "$arg")" - cmd="$cmd $arg" - done - cmd="$cmd 2>/dev/null" - echo "$cmd" -} -function list_files() { - local f - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ -f "$f" ] && rawecho "$f" - done - cd "$curdir" -} -function list_dirs() { - local f - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ "$f" == "." -o "$f" == ".." ] && continue - [ -d "$f" ] && rawecho "$f" - done - cd "$curdir" -} -function __array_ls() { - local __al_l="list_${1:-all}"; shift - local __al_an="$1"; shift - local __al_d="${1:-.}"; shift - local -a __al_fs - array_from_lines __al_fs "$("$__al_l" "$__al_d" "$@")" - local __al_f - array_new "$__al_an" - for __al_f in "${__al_fs[@]}"; do - array_add "$__al_an" "$__al_d/$__al_f" - done -} -function array_lsall() { - __array_ls all "$@" -} -function array_lsdirs() { - __array_ls dirs "$@" -} -function array_lsfiles() { - __array_ls files "$@" -} -function filter_empty() { - sed '/^$/d' -} -function filter_vcspath() { - sed ' -/^.git$/d -/^.git\//d -/\/.git$/d -/\/.git\//d -/^.svn$/d -/^.svn\//d -/\/.svn$/d -/\/.svn\//d -' -} -function merge_contlines() { - awk 'substr($0, length($0)) == "\\" { - while (getline nextline) { - $0 = substr($0, 1, length($0) - 1) nextline - if (substr($0, length($0)) != "\\") break - } - print - next -} -{print}' -} -function filter_comment() { - local -a merge - [ "$1" == -m ] && merge=(merge_contlines) || merge=(cat) - awk ' - /^[ \t]*#/ { next } - /^[ \t]*$/ { next } - { print }' | "${merge[@]}" -} -function filter_conf() { - local -a merge - [ "$1" == -m ] && merge=(merge_contlines) || merge=(cat) - grep -v '^#' | grep -v '^$' | "${merge[@]}" -} -function is_archive() { - local name="${1%.zip}" - name="${name%.tgz}" - name="${name%.tbz2}" - name="${name%.tar.gz}" - name="${name%.tar.bz2}" - name="${name%.tar}" - name="${name%.jar}" - name="${name%.war}" - name="${name%.ear}" - [ "$name" != "$1" ] -} -function extract_archive() { - local arch="$1" destdir="${2:-.}" - shift; shift - if endswith "$arch" .zip; then - unzip -q -d "$destdir" "$arch" "$@" || return - elif endswith "$arch" .tgz || endswith "$arch" .tar.gz; then - tar xzf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .tbz2 || endswith "$arch" .tar.bz2; then - tar xjf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .tar; then - tar xf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .jar || endswith "$arch" .war || endswith "$arch" .ear; then - ( - arch="$(abspath "$arch")" - cd "$destdir" - jar xf "$arch" "$@" - ) || return - else - return 1 - fi -} -function get_archive_basename() { - local basename="$(basename -- "$1")" - basename="${basename%.zip}" - basename="${basename%.tgz}" - basename="${basename%.tbz2}" - basename="${basename%.gz}" - basename="${basename%.bz2}" - basename="${basename%.tar}" - basename="${basename%.jar}" - basename="${basename%.war}" - basename="${basename%.ear}" - echo "$basename" -} -function get_archive_appname() { - local appname="$(basename -- "$1")" - appname="${appname%.zip}" - appname="${appname%.tgz}" - appname="${appname%.tbz2}" - appname="${appname%.gz}" - appname="${appname%.bz2}" - appname="${appname%.tar}" - appname="${appname%.jar}" - appname="${appname%.war}" - appname="${appname%.ear}" - echo "$appname" | awk '{ - if (match($0, /[-_.]([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/)) { - print substr($0, 1, RSTART - 1) - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/)) { - print substr($0, 1, RSTART - 1) - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print substr($0, 1, RSTART - 1) - } else { - print $0 - } -}' -} -function get_archive_versionsuffix() { - local basename="$(get_archive_basename "$1")" - echo "$basename" | awk '{ - if (match($0, /([-_.][0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print vs["1"] - } -}' -} -function get_archive_version() { - local basename="$(get_archive_basename "$1")" - echo "$basename" | awk '{ - if (match($0, /[-_.]([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print vs["1"] - } -}' -} -function __dump_usernames() { - = 500 && $6 ~ /^\/home\// { print $1 }' -} -function dump_usernames() { - array_from_lines "${1:-usernames}" "$(__dump_usernames)" -} -function __resolv_ips() { - LANG=C host "$1" 2>/dev/null | awk '/address / { gsub(/^.*address /, ""); print }' -} -function resolv_ips() { - array_from_lines "${1:-ips}" "$(__resolv_ips "$2")" -} -function __resolv_hosts() { - LANG=C host "$1" 2>/dev/null | awk '/domain name pointer / { gsub(/^.*domain name pointer /, ""); gsub(/\.$/, ""); print }' -} -function resolv_hosts() { - array_from_lines "${1:-hosts}" "$(__resolv_hosts "$2")" -} -function runscript_as() { - local OENC="$UTF8" - local user="${1:-root}"; shift - local exec_maybe= - if [ "$1" = "exec" ]; then - exec_maybe=exec - shift - fi - - local cmd - cmd="\ -__estack=$(quoted_arg "$__estack") -__tlevel=$(quoted_args "$__tlevel") -export __estack __tlevel -exec ${BASH:-/bin/sh} $(quoted_args "$@")" - - if is_yes "$UTOOLS_USES_SU" || ! progexists sudo; then - eecho "Entrez le mot de passe de root" - $exec_maybe su "$user" -c "$cmd" - else - if [ "$user" == "root" ]; then - $exec_maybe sudo -p "Entrez le mot de passe de %u: " "${BASH:-/bin/sh}" -c "$cmd" - else - $exec_maybe sudo -p "Entrez le mot de passe de %u: " su "$user" -c "$cmd" - fi - fi -} -function runscript_as_root() { - if is_root; then - local exec_maybe= - if [ "$1" = "exec" ]; then - exec_maybe=exec - shift - fi - $exec_maybe "${BASH:-/bin/sh}" "$@" - else - runscript_as root "$@" - fi -} -function run_as() { - local user="${1:-root}"; shift - local exec_maybe=exec - if [ "$1" = "--noexec" ]; then - exec_maybe= - shift - fi - - runscript_as "$user" $exec_maybe "$0" "$@" -} -function run_as_root() { - is_root || run_as root "$@" -} -function check_user() { - local user - for user in "$@"; do - [ "$USER" == "$user" ] && return 0 - done - return 1 -} -function ensure_user() { - local -a users - while [ $# -gt 0 -a "$1" != "--" ]; do - array_add users "$1" - shift - done - [ "$1" == "--" ] && shift - - if ! check_user "${users[@]}"; then - if [ ${#users[*]} -gt 1 ]; then - ewarn "Cette commande doit être lancée avec l'un des users ${users[*]}" - else - ewarn "Cette commande doit être lancée avec le user ${users[0]}" - fi - if ask_yesno "Voulez-vous tenter de relancer la commande avec le bon user?" O; then - estep "Lancement du script avec le user ${users[0]}" - run_as "${users[0]}" "$@" - return 1 - elif is_root; then - return 11 - else - return 10 - fi - fi - return 0 -} -function check_hostname() { - local userhost user host path - for userhost in "$@"; do - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - [ "$MYHOSTNAME" == "${host%%.*}" ] && return 0 - done - return 1 -} -function check_userhostname() { - local userhost path user host - for userhost in "$@"; do - if check_hostname "$userhost"; then - [[ "$userhost" == *@* ]] || return 0 - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - check_user "$user" && return 0 - fi - done - return 1 -} -UTOOLS_ENSURE_HOSTNAME_SSH_OPTS=() -function ensure_hostname() { - local -a userhosts - while [ $# -gt 0 -a "$1" != "--" ]; do - array_add userhosts "$1" - shift - done - [ "$1" == "--" ] && shift - - local userhost user host path - if ! check_hostname "${userhosts[@]}"; then - if [ ${#userhosts[*]} -gt 1 ]; then - ewarn "Cette commande n'est valide que sur l'un des hôtes ${userhosts[*]}" - else - ewarn "Cette commande n'est valide que sur l'hôte ${userhosts[0]}" - fi - - enote "Vous pouvez tenter de relancer le script sur ${userhosts[0]}, mais cela requière que ce script ET les données dont il a besoin soient installés dans la même version et dans le même répertoire sur l'hôte distant" - if ask_yesno "Voulez-vous tenter de relancer le script sur l'hôte distant?" N; then - splitfsep "${userhosts[0]}" : userhost path - splituserhost "$userhost" user host - [ -n "$user" ] || user=root - - estep "Lancement de la commande sur l'hôte distant $user@$host" - local cmd - [ -n "$path" ] && cmd="$(quoted_args cd "$path"); " - cmd="$cmd$(quoted_args "$script" "$@")" - ssh -qt "${UTOOLS_ENSURE_HOSTNAME_SSH_OPTS[@]}" "$user@$host" "$cmd" - [ $? -eq 255 ] && return 12 - return 1 - else - return 11 - fi - fi - local userhost user host - for userhost in "${userhosts[@]}"; do - [[ "$userhost" == *@* ]] || continue - if check_hostname "$userhost"; then - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - [ -n "$path" ] && cd "$path" - ensure_user "$user" -- "$@" - return $? - fi - done - return 0 -} - -__AWKDEF_FUNCTIONS=' -function quote_html(s) { - gsub(/&/, "\\&", s) - gsub(/"/, "\\"", s) - gsub(/>/, "\\>", s) - gsub(/", s) - gsub(/"/, "\"", s) - gsub(/&/, "\\&", s) - return s -} -function quote_value(s) {'" - gsub(/'/, \"'\\\\''\", s) - return \"'\" s \"'\" -"'} -function quoted_values( i, line) { - line = "" - for (i = 1; i <= NF; i++) { - if (i > 1) line = line " " - line = line quote_value($i) - } - return line -} -function quote_subrepl(s) { - gsub(/\\/, "\\\\", s) - gsub(/&/, "\\\\&", s) - return s -} -function quote_grep(s) { - gsub(/[[\\.^$*]/, "\\\\&", s) - return s -} -function quote_egrep(s) { - gsub(/[[\\.^$*+?()|{]/, "\\\\&", s) - return s -} -function quote_sql(s) {'" - gsub(/'/, \"''\", s) - return \"'\" s \"'\" -"'} -function unquote_mysqlcsv(s) { - gsub(/\\n/, "\n", s) - gsub(/\\t/, "\t", s) - gsub(/\\0/, "\0", s) - gsub(/\\\\/, "\\", s) - return s -} -function array_new(dest) { - dest[0] = 0 # forcer awk à considérer dest comme un tableau - delete dest -} -function array_newsize(dest, size, i) { - dest[0] = 0 # forcer awk à considérer dest comme un tableau - delete dest - size = int(size) - for (i = 1; i <= size; i++) { - dest[i] = "" - } -} -function array_len(values, count, i) { - count = 0 - for (i in values) { - count++ - } - return count -} -function mkindices(values, indices, i, j) { - array_new(indices) - j = 1 - for (i in values) { - indices[j++] = int(i) - } - return asort(indices) -} -function array_copy(dest, src, count, indices, i) { - array_new(dest) - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - dest[indices[i]] = src[indices[i]] - } -} -function array_getlastindex(src, count, indices) { - count = mkindices(src, indices) - if (count == 0) return 0 - return indices[count] -} -function array_add(dest, value, lastindex) { - lastindex = array_getlastindex(dest) - dest[lastindex + 1] = value -} -function array_deli(dest, i, l) { - i = int(i) - if (i == 0) return - l = array_len(dest) - while (i < l) { - dest[i] = dest[i + 1] - i++ - } - delete dest[l] -} -function array_del(dest, value, ignoreCase, i) { - do { - i = key_index(value, dest, ignoreCase) - if (i != 0) array_deli(dest, i) - } while (i != 0) -} -function array_extend(dest, src, count, lastindex, indices, i) { - lastindex = array_getlastindex(dest) - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - dest[lastindex + i] = src[indices[i]] - } -} -function array_fill(dest, i) { - array_new(dest) - for (i = 1; i <= NF; i++) { - dest[i] = $i - } -} -function array_getline(src, count, indices, i, j) { - $0 = "" - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - j = indices[i] - $j = src[j] - } -} -function array_appendline(src, count, indices, i, nf, j) { - count = mkindices(src, indices) - nf = NF - for (i = 1; i <= count; i++) { - j = nf + indices[i] - $j = src[indices[i]] - } -} -function in_array(value, values, ignoreCase, i) { - if (ignoreCase) { - value = tolower(value) - for (i in values) { - if (tolower(values[i]) == value) return 1 - } - } else { - for (i in values) { - if (values[i] == value) return 1 - } - } - return 0 -} -function key_index(value, values, ignoreCase, i) { - if (ignoreCase) { - value = tolower(value) - for (i in values) { - if (tolower(values[i]) == value) return int(i) - } - } else { - for (i in values) { - if (values[i] == value) return int(i) - } - } - return 0 -} -function array2s(values, prefix, sep, suffix, noindices, first, i, s) { - if (!prefix) prefix = "[" - if (!sep) sep = ", " - if (!suffix) suffix = "]" - s = prefix - first = 1 - for (i in values) { - if (first) first = 0 - else s = s sep - if (!noindices) s = s "[" i "]=" - s = s values[i] - } - s = s suffix - return s -} -function array2so(values, prefix, sep, suffix, noindices, count, indices, i, s) { - if (!prefix) prefix = "[" - if (!sep) sep = ", " - if (!suffix) suffix = "]" - s = prefix - count = mkindices(values, indices) - for (i = 1; i <= count; i++) { - if (i > 1) s = s sep - if (!noindices) s = s "[" indices[i] "]=" - s = s values[indices[i]] - } - s = s suffix - return s -} -function array_join(values, sep, prefix, suffix, count, indices, i, s) { - s = prefix - count = mkindices(values, indices) - for (i = 1; i <= count; i++) { - if (i > 1) s = s sep - s = s values[indices[i]] - } - s = s suffix - return s -} -function printto(s, output) { - if (output == "") { - print s - } else if (output ~ /^>>/) { - sub(/^>>/, "", output) - print s >>output - } else if (output ~ /^>/) { - sub(/^>/, "", output) - print s >output - } else { - print s >output - } -} -function find_line(input, field, value, orig, line) { - orig = $0 - line = "" - while ((getline 0) { - if ($field == value) { - line = $0 - break - } - } - close(input) - $0 = orig - return line -} -function merge_line(input, field, key, line) { - line = find_line(input, field, $key) - if (line != "") $0 = $0 FS line -} -function __csv_parse_quoted(line, destl, colsep, qchar, echar, pos, tmpl, nextc, resl) { - line = substr(line, 2) - resl = "" - while (1) { - pos = index(line, qchar) - if (pos == 0) { - resl = resl line - destl[0] = "" - destl[1] = 0 - return resl - } - if (echar != "" && pos > 1) { - prevc = substr(line, pos - 1, 1) - quotec = substr(line, pos, 1) - nextc = substr(line, pos + 1, 1) - if (prevc == echar) { - tmpl = substr(line, 1, pos - 2) - resl = resl tmpl quotec - line = substr(line, pos + 1) - continue - } - tmpl = substr(line, 1, pos - 1) - if (nextc == colsep || nextc == "") { - resl = resl tmpl - destl[0] = substr(line, pos + 2) - destl[1] = nextc == colsep - return resl - } else { - resl = resl tmpl quotec - line = substr(line, pos + 1) - } - } else { - tmpl = substr(line, 1, pos - 1) - quotec = substr(line, pos, 1) - nextc = substr(line, pos + 1, 1) - if (nextc == colsep || nextc == "") { - resl = resl tmpl - destl[0] = substr(line, pos + 2) - destl[1] = nextc == colsep - return resl - } else if (nextc == qchar) { - resl = resl tmpl quotec - line = substr(line, pos + 2) - } else { - resl = resl tmpl quotec - line = substr(line, pos + 1) - } - } - } -} -function __csv_parse_unquoted(line, destl, colsep, qchar, echar, pos) { - pos = index(line, colsep) - if (pos == 0) { - destl[0] = "" - destl[1] = 0 - return line - } else { - destl[0] = substr(line, pos + 1) - destl[1] = 1 - return substr(line, 1, pos - 1) - } -} -function __array_parsecsv(fields, line, nbfields, colsep, qchar, echar, shouldparse, destl, i) { - array_new(fields) - array_new(destl) - i = 1 - shouldparse = 0 - while (shouldparse || line != "") { - if (index(line, qchar) == 1) { - value = __csv_parse_quoted(line, destl, colsep, qchar, echar) - line = destl[0] - shouldparse = destl[1] - } else { - value = __csv_parse_unquoted(line, destl, colsep, qchar, echar) - line = destl[0] - shouldparse = destl[1] - } - fields[i] = value - i = i + 1 - } - if (nbfields) { - nbfields = int(nbfields) - i = array_len(fields) - while (i < nbfields) { - i++ - fields[i] = "" - } - } - return array_len(fields) -} -BEGIN { - DEFAULT_COLSEP = "," - DEFAULT_QCHAR = "\"" - DEFAULT_ECHAR = "" -} -function array_parsecsv2(fields, line, nbfields, colsep, qchar, echar) { - return __array_parsecsv(fields, line, nbfields, colsep, qchar, echar) -} -function array_parsecsv(fields, line, nbfields, colsep, qchar, echar) { - if (colsep == "") colsep = DEFAULT_COLSEP - if (qchar == "") qchar = DEFAULT_QCHAR - if (echar == "") echar = DEFAULT_ECHAR - return __array_parsecsv(fields, line, nbfields, colsep, qchar, echar) -} -function parsecsv(line, fields) { - array_parsecsv(fields, line) - array_getline(fields) - return NF -} -function getlinecsv(file, fields) { - if (file) { - getline 1) line = line colsep - if (qchar != "" && index(value, qchar) != 0) { - if (echar != "") gsub(qchar, quote_subrepl(echar) "&", value); - else gsub(qchar, "&&", value); - } - if (qchar != "" && (index(value, mvsep) != 0 || index(value, colsep) != 0 || index(value, qchar) != 0 || __csv_should_quote(value))) { - line = line qchar value qchar - } else { - line = line value - } - } - return line -} -function array_formatcsv(fields) { - return array_formatcsv2(fields, ",", ";", "\"", "") -} -function array_printcsv(fields, output) { - printto(array_formatcsv(fields), output) -} -function get_formatcsv( fields) { - array_fill(fields) - return array_formatcsv(fields) -} -function formatcsv() { - $0 = get_formatcsv() -} -function printcsv(output, fields) { - array_fill(fields) - array_printcsv(fields, output) -} -function array_findcsv(fields, input, field, value, nbfields, orig, found, i) { - array_new(orig) - array_fill(orig) - array_new(fields) - found = 0 - while ((getline 0) { - array_parsecsv(fields, $0, nbfields) - if (fields[field] == value) { - found = 1 - break - } - } - close(input) - array_getline(orig) - if (!found) { - delete fields - if (nbfields) { - nbfields = int(nbfields) - i = array_len(fields) - while (i < nbfields) { - i++ - fields[i] = "" - } - } - } - return found -} - -function __and(var, x, l_res, l_i) { - l_res=0; - for (l_i=0; l_i < 8; l_i++){ - if (var%2 == 1 && x%2 == 1) l_res=l_res/2 + 128; - else l_res/=2; - var=int(var/2); - x=int(x/2); - } - return l_res; -} -function __lshift(var, x) { - while(x > 0){ - var*=2; - x--; - } - return var; -} -function __rshift(var, x) { - while(x > 0){ - var=int(var/2); - x--; - } - return var; -} -BEGIN { - __BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" -} -function b64decode(src, result, base1, base2, base3, base4) { - result = "" - while (length(src) > 0) { - base1 = substr(src, 1, 1) - base2 = substr(src, 2, 1) - base3 = substr(src, 3, 1); if (base3 == "") base3 = "=" - base4 = substr(src, 4, 1); if (base4 == "") base4 = "=" - byte1 = index(__BASE64, base1) - 1 - if (byte1 < 0) byte1 = 0 - byte2 = index(__BASE64, base2) - 1 - if (byte2 < 0) byte2 = 0 - byte3 = index(__BASE64, base3) - 1 - if (byte3 < 0) byte3 = 0 - byte4 = index(__BASE64, base4) - 1 - if (byte4 < 0) byte4 = 0 - result = result sprintf( "%c", __lshift(__and(byte1, 63), 2) + __rshift(__and(byte2, 48), 4) ) - if (base3 != "=") result = result sprintf( "%c", __lshift(__and(byte2, 15), 4) + __rshift(__and(byte3, 60), 2) ) - if (base4 != "=") result = result sprintf( "%c", __lshift(__and(byte3, 3), 6) + byte4 ) - src = substr(src, 5) - } - return result -} -' -function awkdef() { - - if [ "${1:0:3}" == "-f" ]; then - shift - echo "$__AWKDEF_FUNCTIONS" - fi - if [ $# -gt 0 ]; then - local __ad_arg __ad_vpos __ad_name __ad_value - echo "BEGIN {" - while [ -n "${1:0:1}" ]; do - __ad_arg="${1:0:256}" - local __ad_array= - if [ "${__ad_arg%\[@\]}" != "$__ad_arg" ]; then - __ad_array=1 - __ad_name="${__ad_arg%\[@\]}" - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_value="$__ad_name" - elif [[ "$__ad_arg" == *\[@\]=* ]]; then - __ad_array=1 - __ad_name="${__ad_arg%%\[@\]=*}" - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_vpos=$((${#__ad_name} + 4)) - __ad_value="${1:$__ad_vpos}" - [ ${#__ad_value} -ne 0 ] || __ad_value="$__ad_name" - elif [[ "$__ad_arg" == *=* ]]; then - local __ad_int= __ad_str= - __ad_name="${__ad_arg%%=*}" - __ad_vpos=$((${#__ad_name} + 1)) - if [ "${__ad_name%:int}" != "$__ad_name" ]; then - __ad_int=1 - __ad_name="${__ad_name%:int}" - elif [ "${__ad_name%:str}" != "$__ad_name" ]; then - __ad_str=1 - __ad_name="${__ad_name%:str}" - fi - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_value="${1:$__ad_vpos}" - if [ -n "$__ad_int" ]; then - echo "$__ad_name = int($(quoted_awk "$__ad_value") + 0)" - elif [ -n "$__ad_str" ]; then - echo "$__ad_name = $(quoted_awk "$__ad_value")" - elif [ ${#__ad_value} -lt 256 ] && isnum "$__ad_value"; then - echo "$__ad_name = $__ad_value" - else - echo "$__ad_name = $(quoted_awk "$__ad_value")" - fi - else - break - fi - if [ -n "$__ad_array" ]; then - if [ "${__ad_value:0:2}" == $'<\n' ]; then - local -a __ad_values - array_from_lines __ad_values "${__ad_value:2}" - __ad_value=__ad_values - fi - __ad_value="${__ad_value}[@]" - local __ad_i=1 - echo "$__ad_name[0] = 0; delete $__ad_name" - for __ad_arg in "${!__ad_value}"; do - echo "$__ad_name[$__ad_i]=$(quoted_awk "$__ad_arg")" - __ad_i=$(($__ad_i + 1)) - done - eval "echo \"\${__ad_name}_count = \${#$__ad_value}\"" - fi - shift - done - echo "}" - for __ad_arg in "$@"; do - rawecho "$__ad_arg" - done - fi -} -function lawkrun() { - local -a __ar_defs __ar_args - while [ $# -gt 0 -a "$1" != "--" ]; do - __ar_defs=("${__ar_defs[@]}" "$1") - shift - done - shift - while [ $# -gt 0 ]; do - __ar_args=("${__ar_args[@]}" "$1") - shift - done - local __ar_script="$(awkdef "${__ar_defs[@]}")" - awk "$__ar_script" "${__ar_args[@]}" -} -function cawkrun() { LANG=C lawkrun "$@"; } -function awkrun() { LANG=C lawkrun "$@"; } - -function __lf_get_age() { - local y=$(date "+%Y") - local dy=$(date "+%j"); while [ "${dy#0}" != "$dy" ]; do dy="${dy#0}"; done - [ -n "$dy" ] || dy=0 - local h=$(date "+%H"); while [ "${h#0}" != "$h" ]; do h="${h#0}"; done - [ -n "$h" ] || h=0 - echo $((($y * 365 + $dy) * 24 + $h)) -} -function lf_trylock() { - local eoo lockfile max_hours=4 - while [ -n "$1" ]; do - case "$1" in - -h) shift; max_hours="$1";; - --) shift; eoo=1;; - *) eoo=1;; - esac - [ -n "$eoo" ] && break - shift - done - - lockfile="$1" - [ -n "$lockfile" ] || die "il faut spécifier un fichier pour le verrou" - - local now="$(__lf_get_age)" - if (set -C; echo "$now" >"$lockfile") 2>/dev/null; then - return 0 - fi - local prev diff - if prev="$(<"$lockfile")"; then - diff="$(($now - $prev))" - if [ "$diff" -gt "$max_hours" ]; then - echo stale - else - echo locked - fi - elif [ -f "$lockfile" ]; then - echo retry - fi - return 1 -} -function pidfile_set() { - local eoo pidfile pid=$$ replace= - while [ -n "$1" ]; do - case "$1" in - -p) - shift - pid="$1" - ;; - -r) - replace=1 - ;; - --) - shift - eoo=1 - ;; - *) - eoo=1 - ;; - esac - [ -n "$eoo" ] && break - shift - done - - pidfile="$1" - [ -n "$pidfile" ] || return 10 - - if [ -f "$pidfile" ]; then - local curpid="$(<"$pidfile")" - if is_running "$curpid"; then - return 1 - elif [ -n "$replace" ]; then - /bin/rm -f "$pidfile" || return 10 - else - return 2 - fi - fi - - echo_ "$pid" >"$pidfile" || return 10 - autoclean "$pidfile" - return 0 -} -function pidfile_check() { - local pidfile="$1" - [ -n "$pidfile" ] || return 10 - - if [ -f "$pidfile" ]; then - [ -r "$pidfile" ] || return 10 - local pid="$(<"$pidfile")" - is_running "$pid" && return 0 - fi - return 1 -} -function page_maybe() { - if isatty; then - less -XF "$@" - else - cat - fi -} - - -function utools_local() { - local arg - [ $# -gt 0 ] || set -- opts verbosity interaction - for arg in "$@"; do - case "$arg" in - parse_opts|opts|o|args) echo "local -a args";; - verbosity|v) echo "local __verbosity='$__verbosity'";; - interaction|i) echo "local __interaction='$__interaction'";; - esac - done -} - -function isatty() { - tty -s <&1 -} -function in_isatty() { - tty -s -} -function out_isatty() { - tty -s <&1 -} -function err_isatty() { - tty -s <&2 -} -function die() { [ $# -gt 0 ] && eerror "$@"; exit 1; } -function exit_with { if [ $# -gt 0 ]; then "$@"; fi; exit $?; } -function die_with { [ $# -gt 0 ] && eerror "$1"; shift; [ $# -gt 0 ] && "$@"; exit 1; } -function die_unless() { - local count=$# - if [ $count -eq 0 ]; then - exit 1 - elif [ $count -eq 1 ]; then - "$@" || exit $? - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - : - else - r=$? - eerror "$m" - exit $r - fi - fi -} -function eerror_unless() { - local count=$# - if [ $count -eq 0 ]; then - return 1 - elif [ $count -eq 1 ]; then - "$@" || return $? - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - : - else - r=$? - eerror "$m" - return $r - fi - fi -} -function die_if() { - local count=$# - if [ $count -eq 0 ]; then - : - elif [ $count -eq 1 ]; then - "$@" && exit 1 - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - eerror "$m" - exit 1 - fi - fi -} -function eerror_if() { - local count=$# - if [ $count -eq 0 ]; then - : - elif [ $count -eq 1 ]; then - "$@" && return 1 - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - eerror "$m" - return 1 - fi - fi -} - -TAB=$'\t' -LATIN1=iso-8859-1 -LATIN9=iso-8859-15 -UTF8=utf-8 -OENC="$UTF8" - -if ! progexists iconv; then - function iconv() { cat; } -fi - -function __lang_encoding() { - local lang="$(<<<"$LANG" awk '{ print tolower($0) }')" - case "$lang" in - *@euro) echo "iso-8859-15";; - *.utf-8|*.utf8) echo "utf-8";; - *) echo "iso-8859-1";; - esac -} -function __norm_encoding() { - awk '{ - enc = tolower($0) - gsub(/^latin$/, "latin1", enc) - gsub(/^latin1$/, "iso-8859-1", enc) - gsub(/^latin9$/, "iso-8859-15", enc) - gsub(/[-_]/, "", enc) - if (enc == "iso8859" || enc == "iso88591" || enc == "8859" || enc == "88591") print "iso-8859-1" - else if (enc == "iso885915" || enc == "885915") print "iso-8859-15" - else if (enc == "utf" || enc == "utf8") print "utf-8" - else print $0 - }' <<<"$1" -} -function __init_encoding() { - local DEFAULT_ENCODING="$(__lang_encoding)" - [ -n "$DEFAULT_ENCODING" ] || DEFAULT_ENCODING=utf-8 - [ -n "$UTOOLS_OUTPUT_ENCODING" ] || UTOOLS_OUTPUT_ENCODING="$DEFAULT_ENCODING" - UTOOLS_OUTPUT_ENCODING="$(__norm_encoding "$UTOOLS_OUTPUT_ENCODING")" - [ -n "$UTOOLS_INPUT_ENCODING" ] || UTOOLS_INPUT_ENCODING="$UTOOLS_OUTPUT_ENCODING" - UTOOLS_INPUT_ENCODING="$(__norm_encoding "$UTOOLS_INPUT_ENCODING")" - [ -n "$UTOOLS_EDITOR_ENCODING" ] || UTOOLS_EDITOR_ENCODING="$UTOOLS_INPUT_ENCODING" - UTOOLS_EDITOR_ENCODING="$(__norm_encoding "$UTOOLS_EDITOR_ENCODING")" - - IENC="$UTOOLS_INPUT_ENCODING" - OENC="$UTOOLS_OUTPUT_ENCODING" -} - -if [ -n "$UTOOLS_LANG" -a -z "$LANG" ]; then - export UTOOLS_LANG - export LANG="$UTOOLS_LANG" -fi -__init_encoding - -function tooenc() { - local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - rawecho "$src" - else - iconv -f "$from" -t "$to" <<<"$src" - fi -} -function uecho() { - tooenc "$*" -} -function tooenc_() { - local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - rawecho_ "$src" - else - rawecho_ "$src" | iconv -f "$from" -t "$to" - fi -} -function uecho_() { - tooenc_ "$*" -} -function toienc() { - local __tie_var="$1" __tie_to="${2:-$IENC}" __tie_from="${3:-$UTOOLS_INPUT_ENCODING}" - if [ "$__tie_from" != "$__tie_to" ]; then - set_var "$__tie_var" "$(iconv -f "$__tie_from" -t "$__tie_to" <<<"${!__tie_var}")" - fi -} -function uread() { - [ $# -gt 0 ] || set -- REPLY - local __r_var - read "$@" - for __r_var in "$@"; do - [ -z "$__r_var" -o "${__r_var:0:1}" == "-" ] && continue # ignorer les options - toienc "$__r_var" - done -} - -function stooenc() { - local from="${1:-$OENC}" to="${2:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - cat - else - iconv -f "$from" -t "$to" - fi -} -function stoienc() { - local to="${1:-$IENC}" from="${2:-$UTOOLS_INPUT_ENCODING}" - if [ "$from" == "$to" ]; then - cat - else - iconv -f "$from" -t "$to" - fi -} - -export UTOOLS_EDATE -function __edate() { [ -n "$UTOOLS_EDATE" ] && date +"[%d/%m/%Y-%H:%M:%S] "; } - -export UTOOLS_ELOG_OVERWRITE -function __set_no_colors() { :; } -function elogto() { - UTOOLS_EDATE=1 - if [ -n "$1" -a -n "$2" ]; then - LANG=fr_FR.UTF8 - UTOOLS_OUTPUT_ENCODING="$UTF8" - __set_no_colors 1 - if [ -n "$UTOOLS_ELOG_OVERWRITE" ]; then - exec >"$1" 2>"$2" - else - exec >>"$1" 2>>"$2" - fi - elif [ -n "$1" ]; then - LANG=fr_FR.UTF8 - UTOOLS_OUTPUT_ENCODING="$UTF8" - __set_no_colors 1 - if [ -n "$UTOOLS_ELOG_OVERWRITE" ]; then - exec >"$1" 2>&1 - else - exec >>"$1" 2>&1 - fi - fi -} - -export __estack __tlevel -function __indent() { - if [ "${1/ -/}" != "$1" ]; then - sed "2,\$s/^/${__tlevel}/g" <<<"$1" - else - rawecho "$1" - fi -} -function __eerror() { tooenc "$(__edate)${__tlevel}* error: $(__indent "$1")"; } -function __ewarn() { tooenc "$(__edate)${__tlevel}* warning: $(__indent "$1")"; } -function __enote() { tooenc "$(__edate)${__tlevel}* note: $(__indent "$1")"; } -function __ebanner() { - local maxi="${COLUMNS:-80}" - local -a lines - local psfix line - - psfix="$(__edate)${__tlevel}" - while [ ${#psfix} -lt $maxi ]; do psfix="$psfix="; done - - tooenc "$psfix" - maxi=$(($maxi - 1)) - array_from_xlines lines "$1" - for line in "" "${lines[@]}" ""; do - line="$(__edate)${__tlevel}= $line" - if [ ${#line} -le $maxi ]; then - while [ ${#line} -lt $maxi ]; do line="$line "; done - line="$line=" - fi - tooenc "$line" - done - tooenc "$psfix" -} -function __eimportant() { tooenc "$(__edate)${__tlevel}* important: $(__indent "$1")"; } -function __eattention() { tooenc "$(__edate)${__tlevel}* attention: $(__indent "$1")"; } -function __einfo() { tooenc "$(__edate)${__tlevel}* info: $(__indent "$1")"; } -function __eecho() { tooenc "$(__edate)${__tlevel}$(__indent "$1")"; } -function __eecho_() { tooenc_ "$(__edate)${__tlevel}$(__indent "$1")"; } -function __edebug() { tooenc "$(__edate)${__tlevel}* debug: $(__indent "$1")"; } -function __estep() { tooenc "$(__edate)${__tlevel}* $(__indent "$1")"; } -function __estepe() { __estep "$@"; } -function __estepw() { __estep "$@"; } -function __estepn() { __estep "$@"; } -function __estepi() { __estep "$@"; } -function __estep_() { tooenc_ "$(__edate)${__tlevel}* $(__indent "$1")"; } -function __estepe_() { __estep_ "$@"; } -function __estepw_() { __estep_ "$@"; } -function __estepn_() { __estep_ "$@"; } -function __estepi_() { __estep_ "$@"; } -function __etitle() { tooenc "$(__edate)${__tlevel}+++ $(__indent "$1")"; } -function __ebegin() { tooenc_ "$(__edate)${__tlevel}* $(__indent "$1"): "; } -function __edoto() { echo_ "."; } -function __edotw() { echo_ "w"; } -function __edotx() { echo_ "x"; } -function __edotp() { echo_ "+"; } -function __edotd() { tooenc "($1)"; } -function __eendo() { echo "[ok]"; } -function __eendx() { echo "[error]"; } -PRETTYOPTS=() -function set_verbosity() { :;} -function set_interaction() { :;} -function show_error() { - return 0 -} -function show_warn() { - return 0 -} -function show_info() { - return 0 -} -function show_verbose() { - return 0 -} -function show_debug() { - [ -n "$DEBUG" ] -} -function check_verbosity() { - return 0 -} -function get_verbosity_option() { :;} -function check_interaction() { - return 0 -} -function is_interaction() { - return 1 -} -function get_interaction_option() { :;} -__epending= -function eflush() { - if [ -n "$__epending" ]; then rawecho "$__epending" 1>&2; __epending=; fi -} -function eclearp() { - __epending= -} -function eerror() { - show_error || return; eflush; __eerror "$*" 1>&2 -} -function ewarn() { - show_warn || return; eflush; __ewarn "$*" 1>&2 -} -function enote() { - show_info || return; eflush; __enote "$*" 1>&2 -} -function ebanner() { - show_error || return; eflush; __ebanner "$*" 1>&2; sleep 5 -} -function eimportant() { - show_error || return; eflush; __eimportant "$*" 1>&2 -} -function eattention() { - show_warn || return; eflush; __eattention "$*" 1>&2 -} -function einfo() { - show_info || return; eflush; __einfo "$*" 1>&2 -} -function eecho() { - show_info || return; eflush; __eecho "$*" 1>&2 -} -function eecho_() { - show_info || return; eflush; __eecho_ "$*" 1>&2 -} -function edebug() { - show_debug || return; eflush; __edebug "$*" 1>&2 -} -function trace() { - local r cmd="$(quoted_args "$@")" - show_info && { eflush; __eecho "\$ $cmd" 1>&2; } - "$@"; r=$? - if [ $r -ne 0 ]; then - if show_info; then - eflush; __eecho "^ [EC #$r]" 1>&2 - elif show_error; then - eflush; __eecho "^ $cmd [EC #$r]" 1>&2; - fi - fi - return $r -} -function trace_error() { - local r - "$@"; r=$? - if [ $r -ne 0 ]; then - local cmd="$(quoted_args "$@")" - show_error && { eflush; __eecho "^ $cmd [EC #$r]" 1>&2; } - fi - return $r -} - -function etitle() { - local __t_deferred= - __t_etitle "$@" -} -function etitled() { - local __t_deferred=1 - __t_etitle "$@" -} -function __t_etitle() { - local __t_eend=default - local __t_clearp= - while [ -n "$1" ]; do - if [ "$1" == "--" ]; then - shift - break - elif [ "$1" == "-s" ]; then - __t_eend= - shift - elif [ "$1" == "--eend" ]; then - __t_eend=1 - shift - elif [ "$1" == "-p" ]; then - __t_clearp=1 - shift - else - break - fi - done - local __t_title="$1"; shift - local __t_s=0 - [ -n "$__estack" ] && __tlevel="${__tlevel} " - __estack="$__estack:t" - if show_info; then - if [ -n "$__t_deferred" ]; then - __epending="${__epending:+$__epending -}$(__etitle "$__t_title")" - else - eflush - __etitle "$__t_title" 1>&2 - fi - fi - if [ $# -gt 0 ]; then - "$@" - __t_s=$? - [ "$__t_eend" == "default" ] && __t_eend=1 - fi - [ "$__t_eend" == "default" ] && __t_eend= - if [ -n "$__t_eend" ]; then - eend $__t_s - [ -n "$__t_clearp" ] && eclearp - fi - return $__t_s -} -function estep() { - show_info || return; eflush; __estep "$*" 1>&2 -} -function estepe() { - show_info || return; eflush; __estepe "$*" 1>&2 -} -function estepw() { - show_info || return; eflush; __estepw "$*" 1>&2 -} -function estepn() { - show_info || return; eflush; __estepn "$*" 1>&2 -} -function estepi() { - show_info || return; eflush; __estepi "$*" 1>&2 -} -function estep_() { - show_info || return; eflush; __estep_ "$*" 1>&2 -} -function estepe_() { - show_info || return; eflush; __estepe_ "$*" 1>&2 -} -function estepw_() { - show_info || return; eflush; __estepw_ "$*" 1>&2 -} -function estepn_() { - show_info || return; eflush; __estepn_ "$*" 1>&2 -} -function estepi_() { - show_info || return; eflush; __estepi_ "$*" 1>&2 -} -function ebegin() { - local __b_eend=default - while [ -n "$1" ]; do - if [ "$1" == "--" ]; then - shift - break - elif [ "$1" == "-s" ]; then - __b_eend= - shift - elif [ "$1" == "--eend" ]; then - __b_eend=1 - shift - else - break - fi - done - local __b_msg="$1"; shift - local __b_s=0 - __estack="$__estack:b" - if show_info; then - eflush - __ebegin "$__b_msg" 1>&2 - fi - if [ $# -gt 0 ]; then - "$@" - __b_s=$? - [ "$__b_eend" == "default" ] && __b_eend=1 - fi - [ "$__b_eend" == "default" ] && __b_eend= - [ -n "$__b_eend" ] && eend $__b_s - return $__b_s -} -function edot() { - local s=$? - show_info || return - eflush - [ -n "$1" ] && s="$1" - shift - if [ "$s" == "0" ]; then - __edoto 1>&2 - else - __edotx 1>&2 - fi - show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2 - return $s -} -function edotw() { - local s=$? - show_info || return - eflush - [ -n "$1" ] && s="$1" - shift - __edotw 1>&2 - show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2 - return $s -} -function ewait() { - [ -n "$1" ] || return 1 - if show_info; then - local count=2 - eflush - little_sleep # certains processus retournent tout de suite - while is_running "$1"; do - sleep 1 - if [ $count -gt 0 ]; then - count=$(($count - 1)) - else - __edotp 1>&2 - fi - done - __edoto 1>&2 - else - wait "$1" - fi -} -function eend() { - local s=$? - if [ "$1" == "-c" ]; then - __estack= - __tlevel= - elif [ "${__estack%:b}" != "$__estack" ]; then - __estack="${__estack%:b}" - show_info || return - eflush - [ -n "$1" ] && s="$1" - if [ "$s" == "0" ]; then - __eendo 1>&2 - else - __eendx 1>&2 - fi - elif [ "${__estack%:t}" != "$__estack" ]; then - __estack="${__estack%:t}" - __tlevel="${__tlevel% }" - fi -} -function ask_yesno() { - local interactive=1 - if [[ "$1" == -* ]]; then - if [ "$1" != -- ]; then - check_interaction "$1" || interactive= - fi - shift - else - check_interaction -c || interactive= - fi - local default="${2:-N}" - if [ "$default" == "C" ]; then - [ -n "$interactive" ] && default=N || default=O - elif [ "$default" == "X" ]; then - [ -n "$interactive" ] && default=O || default=N - fi - if [ -n "$interactive" ]; then - eflush - local message="$1" - local prompt="[oN]" - local r - is_yes "$default" && prompt="[On]" - if [ -n "$message" ]; then - tooenc_ "$message" 1>&2 - else - tooenc_ "Voulez-vous continuer?" "$UTF8" 1>&2 - fi - tooenc_ " $prompt " "$UTF8" 1>&2 - uread r - is_yes "${r:-$default}" - else - is_yes "$default" - fi -} -function read_value() { - local -a __rv_opts __rv_readline=1 __rv_showdef=1 __rv_nl= - __rv_opts=() - [ -n "$UTOOLS_NO_READLINE" ] && __rv_readline= - __rv_read "$@" -} -function read_password() { - local -a __rv_opts __rv_readline= __rv_showdef= __rv_nl=1 - __rv_opts=(-s) - __rv_read "$@" -} -function __rv_read() { - local __rv_int=1 - if [[ "$1" == -* ]]; then - if [ "$1" != -- ]; then - check_interaction "$1" || __rv_int= - fi - shift - else - check_interaction -c || __rv_int= - fi - local __rv_msg="$1" __rv_v="${2:-value}" __rv_d="$3" __rv_re="${4:-O}" - if [ -z "$__rv_int" ]; then - if is_yes "$__rv_re" && [ -z "$__rv_d" ]; then - OENC="$UTF8" eerror "La valeur par défaut de $__rv_v doit être non vide" - return 1 - fi - set_var "$__rv_v" "$__rv_d" - return 0 - fi - - eflush - local __rv_r - while true; do - if [ -n "$__rv_msg" ]; then - tooenc_ "$__rv_msg" 1>&2 - else - tooenc_ "Entrez la valeur" "$UTF8" 1>&2 - fi - if [ -n "$__rv_readline" ]; then - tooenc_ ": " "$UTF8" 1>&2 - uread -e ${__rv_d:+-i"$__rv_d"} "${__rv_opts[@]}" __rv_r - else - if [ -n "$__rv_d" ]; then - if [ -n "$__rv_showdef" ]; then - tooenc_ " [$__rv_d]" 1>&2 - else - tooenc_ " [****]" 1>&2 - fi - fi - tooenc_ ": " "$UTF8" 1>&2 - uread "${__rv_opts[@]}" __rv_r - [ -n "$__rv_nl" ] && echo - fi - __rv_r="${__rv_r:-$__rv_d}" - if [ -n "$__rv_r" ] || ! is_yes "$__rv_re"; then - set_var "$__rv_v" "$__rv_r" - return 0 - fi - done -} -function simple_menu() { - local __sm_title= __sm_yourchoice= __sm_default= - local -a __sm_args - parse_opts -t: __sm_title= -m: __sm_yourchoice= -d: __sm_default= @ __sm_args -- "$@" && - set -- "${__sm_args[@]}" || ewarn "$__sm_args" - - local __sm_option_var="${1:-option}" __sm_options_var="${2:-options}" - local __sm_option __sm_options - __sm_options="$__sm_options_var[*]" - if [ -z "${!__sm_options}" ]; then - OENC="$UTF8" eerror "Le tableau $__sm_options_var doit être non vide" - return 1 - fi - [ -z "$__sm_default" ] && __sm_default="${!__sm_option_var}" - - eflush - array_copy __sm_options "$__sm_options_var" - local __sm_c=0 __sm_i __sm_choice - while true; do - if [ "$__sm_c" == "0" ]; then - [ -n "$__sm_title" ] && tooenc "=== $__sm_title ===" 1>&2 - __sm_i=1 - for __sm_option in "${__sm_options[@]}"; do - if [ "$__sm_option" == "$__sm_default" ]; then - tooenc "$__sm_i*- $__sm_option" 1>&2 - else - tooenc "$__sm_i - $__sm_option" 1>&2 - fi - let __sm_i=$__sm_i+1 - done - fi - - if [ -n "$__sm_yourchoice" ]; then - tooenc_ "$__sm_yourchoice" 1>&2 - else - tooenc_ "Entrez le numéro de l'option choisie" "$UTF8" 1>&2 - fi - tooenc_ ": " "$UTF8" 1>&2 - uread __sm_choice - - if [ -z "$__sm_choice" -a -n "$__sm_default" ]; then - __sm_option="$__sm_default" - break - fi - if [ -n "$__sm_choice" -a -z "${__sm_choice//[0-9]/}" ]; then - if [ "$__sm_choice" -gt 0 -a "$__sm_choice" -le "${#__sm_options[*]}" ]; then - __sm_option="${__sm_options[$(($__sm_choice - 1))]}" - break - else - OENC="$UTF8" eerror "Numéro d'option incorrect" - fi - else - OENC="$UTF8" eerror "Vous devez saisir le numéro de l'option choisie" - fi - - let __sm_c=$__sm_c+1 - if [ "$__sm_c" -eq 5 ]; then - tooenc "" "$UTF8" 1>&2 - __sm_c=0 - fi - done - set_var "$__sm_option_var" "$__sm_option" -} - -function actions_menu() { - local -a __am_action_descs __am_options __am_void_actions - local __am_tmp __am_select_action __am_select_option __am_title __am_optyc __am_actyc - local __am_default_action=auto __am_quit_action=auto - local __am_default_option= - local -a __am_args - parse_opts \ - -t: __am_title= \ - -m: __am_optyc= \ - -M: __am_actyc= \ - -e: __am_void_actions \ - -d: __am_default_action= \ - -q: __am_quit_action= \ - -o: __am_default_option= \ - @ __am_args -- "$@" && set -- "${__am_args[@]}" || { eerror "$__am_args"; return 1; } - - __am_tmp="${1:-action}"; __am_select_action="${!__am_tmp}" - __am_tmp="${2:-option}"; __am_select_option="${!__am_tmp}" - [ -n "$__am_default_option" ] && __am_select_option="$__am_default_option" - array_copy __am_action_descs "${3:-actions}" - array_copy __am_options "${4:-options}" - - eerror_unless [ ${#__am_action_descs[*]} -gt 0 ] "Vous devez spécifier le tableau des actions" || return - __actions_menu || return 1 - setv "${1:-action}" "$__am_select_action" - setv "${2:-option}" "$__am_select_option" -} -function __actions_menu() { - local title="$__am_title" - local optyc="$__am_optyc" actyc="$__am_actyc" - local default_action="$__am_default_action" - local quit_action="$__am_quit_action" - local select_action="$__am_select_action" - local select_option="$__am_select_option" - local -a action_descs options void_actions - array_copy action_descs __am_action_descs - array_copy options __am_options - array_copy void_actions __am_void_actions - - local no_options - array_isempty options && no_options=1 - - local -a actions - local tmp action name - for tmp in "${action_descs[@]}"; do - splitfsep2 "$tmp" : action name - [ -n "$action" ] || action="${name:0:1}" - action="$(strlower "$action")" - array_addu actions "$action" - done - - if [ "$default_action" == auto ]; then - default_action="$select_action" - if [ -n "$default_action" ]; then - array_contains actions "$default_action" || default_action= - fi - [ -n "$default_action" ] || default_action="${actions[0]}" - fi - default_action="${default_action:0:1}" - default_action="$(strlower "$default_action")" - - if [ "$quit_action" == auto ]; then - if [ ${#actions[*]} -gt 1 ]; then - quit_action="${actions[@]:$((-1)):1}" - array_addu void_actions "$quit_action" - fi - fi - quit_action="${quit_action:0:1}" - quit_action="$(strlower "$quit_action")" - - local action_title - for tmp in "${action_descs[@]}"; do - splitfsep2 "$tmp" : action name - [ -n "$action" ] || action="${name:0:1}" - [ -n "$name" ] || name="$action" - action="$(strlower "$action")" - if [ -n "$no_options" ]; then - if ! array_contains void_actions "$action"; then - array_del actions "$action" - continue - fi - fi - [ "$action" == "$default_action" ] && name="$name*" - action_title="${action_title:+$action_title/}$name" - done - if [ -n "$default_action" ]; then - array_contains actions "$default_action" || default_action= - fi - if [ -n "$quit_action" ]; then - array_contains actions "$quit_action" || quit_action= - fi - - if [ -n "$no_options" ]; then - if array_isempty void_actions; then - eerror "Aucune option n'est définie. Il faut définir le tableau des actions vides" - return 1 - fi - __void_actions_menu - else - __options_actions_menu - fi -} -function __void_actions_menu() { - eflush - local c=0 choice - while true; do - if [ $c -eq 0 ]; then - [ -n "$title" ] && __etitle "$title" 1>&2 - __eecho_ "=== Actions disponibles: " 1>&2 - tooenc "$action_title" 1>&2 - fi - if [ -n "$actyc" ]; then - __eecho_ "$actyc" 1>&2 - elif [ -n "$optyc" ]; then - __eecho_ "$optyc" 1>&2 - else - __eecho_ "Entrez l'action à effectuer" 1>&2 - fi - tooenc_ ": " 1>&2 - uread choice - if [ -z "$choice" -a -n "$default_action" ]; then - select_action="$default_action" - break - fi - - choice="${choice:0:1}" - choice="$(strlower "$choice")" - if array_contains actions "$choice"; then - select_action="$choice" - break - elif [ -n "$choice" ]; then - eerror "$choice: action incorrecte" - else - eerror "vous devez saisir l'action à effectuer" - fi - let c=$c+1 - if [ $c -eq 5 ]; then - tooenc "" 1>&2 - c=0 - fi - done - __am_select_action="$select_action" - __am_select_option= -} -function __options_actions_menu() { - eflush - local c=0 option choice action option - while true; do - if [ $c -eq 0 ]; then - [ -n "$title" ] && __etitle "$title" 1>&2 - i=1 - for option in "${options[@]}"; do - if [ "$option" == "$select_option" ]; then - tooenc "$i*- $option" 1>&2 - else - tooenc "$i - $option" 1>&2 - fi - let i=$i+1 - done - __estepn_ "Actions disponibles: " 1>&2 - tooenc "$action_title" 1>&2 - fi - if [ -n "$optyc" ]; then - __eecho_ "$optyc" 1>&2 - else - __eecho_ "Entrez l'action et le numéro de l'option choisie" 1>&2 - fi - tooenc_ ": " 1>&2 - uread choice - - if [ -z "$choice" -a -n "$default_action" ]; then - action="$default_action" - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - elif [ -n "$select_option" ]; then - select_action="$action" - break - fi - fi - action="${choice:0:1}" - action="$(strlower "$action")" - if array_contains actions "$action"; then - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - else - option="${choice:1}" - option="${option// /}" - if [ -z "$option" -a -n "$select_option" ]; then - select_action="$action" - break - elif [ -z "$option" ]; then - eerror "vous devez saisir le numéro de l'option" - elif isnum "$option"; then - if [ $option -gt 0 -a $option -le ${#options[*]} ]; then - select_action="$action" - select_option="${options[$(($option - 1))]}" - break - fi - else - eerror "$option: numéro d'option incorrecte" - fi - fi - elif isnum "$choice"; then - action="$default_action" - if [ -n "$action" ]; then - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - else - option="${choice// /}" - if [ -z "$option" ]; then - eerror "vous devez saisir le numéro de l'option" - elif isnum "$option"; then - if [ $option -gt 0 -a $option -le ${#options[*]} ]; then - select_action="$action" - select_option="${options[$(($option - 1))]}" - break - fi - else - eerror "$option: numéro d'option incorrecte" - fi - fi - else - eerror "Vous devez spécifier l'action à effectuer" - fi - elif [ -n "$choice" ]; then - eerror "$choice: action et/ou option incorrecte" - else - eerror "vous devez saisir l'action à effectuer" - fi - let c=$c+1 - if [ $c -eq 5 ]; then - tooenc "" 1>&2 - c=0 - fi - done - __am_select_action="$select_action" - __am_select_option="$select_option" -} - - -function __ac_forgetall() { __ac_files=(); } -__ac_forgetall -function __ac_trap() { - local file - for file in "${__ac_files[@]}"; do - [ -e "$file" ] && rm -rf "$file" 2>/dev/null - done - __ac_forgetall -} -trap __ac_trap 1 3 15 EXIT -function autoclean() { - local file - for file in "$@"; do - [ -n "$file" ] && array_add __ac_files "$file" - done -} -function ac_cleanall() { - __ac_trap -} -function ac_clean() { - local file - for file in "$@"; do - if array_contains __ac_files "$file"; then - [ -e "$file" ] && rm -rf "$file" 2>/dev/null - array_del __ac_files "$file" - fi - done -} -function ac_set_tmpfile() { - local __acst_d - if show_debug; then - if [ -n "$5" ]; then - is_yes "${!5}" && __acst_d=1 - else - __acst_d=1 - fi - fi - if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" - [ -f "$3" -a "$4" == keep ] || >"$3" - else - local __acst_t="$(mktempf "$2")" - autoclean "$__acst_t" - set_var "$1" "$__acst_t" - fi -} -function ac_set_tmpdir() { - local __acst_d - if show_debug; then - if [ -n "$4" ]; then - is_yes "${!4}" && __acst_d=1 - else - __acst_d=1 - fi - fi - if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" - mkdir -p "$3" - else - local __acst_t="$(mktempd "$2")" - autoclean "$__acst_t" - set_var "$1" "$__acst_t" - fi -} -function debug_tee() { - if show_debug; then - tee "$@" - else - cat - fi -} - - -function get_defaults_files() { - local __gd_dest="${1:-defaults}"; shift - local -a __gd_fs - local __gd_f __gd_found - for __gd_f in "$@"; do - __gd_found= - if [ -r "/etc/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "/etc/default/$__gd_f") - __gd_found=1 - fi - if [ -r "$HOME/etc/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "$HOME/etc/default/$__gd_f") - __gd_found=1 - fi - if [ -z "$__gd_found" -a -r "$scriptdir/lib/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "$scriptdir/lib/default/$__gd_f") - fi - done - array_copy "$__gd_dest" __gd_fs -} - -function set_defaults() { - local -a __sd_fs - local __sd_f - get_defaults_files __sd_fs "$@" - for __sd_f in "${__sd_fs[@]}"; do - source "$__sd_f" - done -} - - -: "${MYHOST:=$HOSTNAME}" -: "${MYHOSTNAME:=${MYHOST%%.*}}" -export MYHOST MYHOSTNAME - -function myhost() { - hostname -f 2>/dev/null || echo "$MYHOST" -} -function myhostname() { - hostname -s 2>/dev/null || echo "$MYHOSTNAME" -} -##@inc]base -uprovide base.tools -urequire base - -function base_umove() { - local -a args - local updatedir - args=(-d:,--updatedir: .) - parse_args_check "$@" || return; set -- "${args[@]}" - - eerror_unless [ -z "$updatedir" -o -d "$updatedir" ] "$updatedir: doit être un répertoire" || return - eerror_if [ $# -eq 0 ] "Vous devez spécifier les fichiers à déplacer" || return - eerror_if [ $# -eq 1 ] "Vous devez spécifier la destination" || return - - local -a srcs - local dest - - srcs=("$@") - setx dest=last_value srcs - array_del_last srcs - - if [ $# -eq 2 ]; then - if [ -d "$dest" ]; then - : # ce cas sera traité ci-dessous - elif [ -e "$dest" ]; then - eerror "$dest: refus d'écraser la destination" - return 1 - else - src="${srcs[0]}" - if [ -n "$updatedir" ]; then - if [ -L "$src" ]; then - ldest="$(readlinka "$src")" - array_find_links update_links "$ldest" "$updatedir" - else - array_find_links update_links "$src" "$updatedir" - fi - move_file "$src" "$dest" "${update_links[@]}" - else - move_link "$src" "$dest" - fi - return $? - fi - fi - - [ -d "$dest" ] || { - eerror "$dest: doit être un répertoire" - return 1 - } - for src in "${srcs[@]}"; do - if [ -n "$updatedir" ]; then - if [ -L "$src" ]; then - move_link "$src" "$dest" - else - array_find_links update_links "$src" "$updatedir" - move_file "$src" "$dest" "${update_links[@]}" - fi - else - move_link "$src" "$dest" - fi - done -} -##@inc]base.tools -##@inc[base.compat -## Fonctions de base: support des fonctions obsolètes et des versions de bash < 4.x -##@inc[base.core -## Fonctions de base: fondement -uprovide base.core - -function echo_() { - echo -n "$*" -} -function recho() { - if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - - local first="${1:1}"; shift - echo "$first$@" - else - echo "$@" - fi -} -function recho_() { - if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - - local first="${1:1}"; shift - echo -n "$first$@" - else - echo -n "$@" - fi -} -function _qval() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s//\$/\\\$}" - s="${s//\`/\\\`}" - recho_ "$s" -} -function should_quote() { - local l="${#1}" - [ $l -eq 0 -o $l -gt 80 ] && return 0 - local s="${*//[a-zA-Z0-9]/}" - s="${s//,/}" - s="${s//./}" - s="${s//+/}" - s="${s//\//}" - s="${s//-/}" - s="${s//_/}" - s="${s//=/}" - [ -n "$s" ] -} -function qval() { - echo -n \" - _qval "$@" - echo \" -} -function qvalm() { - if should_quote "$*"; then - echo -n \" - _qval "$@" - echo \" - else - recho "$*" - fi -} -function qvalr() { - if [ -z "$*" ]; then - : - elif should_quote "$*"; then - echo -n \" - _qval "$@" - echo \" - else - recho "$*" - fi -} -function qvals() { - local arg first=1 - for arg in "$@"; do - [ -z "$first" ] && echo -n " " - if should_quote "$arg"; then - echo -n \" - _qval "$arg" - echo -n \" - else - recho_ "$arg" - fi - first= - done - [ -z "$first" ] && echo -} -function qwc() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s//\$/\\\$}" - s="${s//\`/\\\`}" - local r a b - while [ -n "$s" ]; do - if [[ "$s" == *\** ]]; then - if [[ "$s" == *\?* ]]; then - a="${s%%\**}" - b="${s%%\?*}" - if [ ${#a} -lt ${#b} ]; then - s="${s#*\*}" - r="$r\"$a\"*" - else - s="${s#*\?}" - r="$r\"$b\"?" - fi - else - a="${s%%\**}" - s="${s#*\*}" - r="$r\"$a\"*" - fi - elif [[ "$s" == *\?* ]]; then - if [[ "$s" == *\** ]]; then - a="${s%%\**}" - b="${s%%\?*}" - if [ ${#a} -lt ${#b} ]; then - s="${s#*\*}" - r="$r\"$a\"*" - else - s="${s#*\?}" - r="$r\"$b\"?" - fi - else - a="${s%%\?*}" - s="${s#*\?}" - r="$r\"$a\"?" - fi - else - r="$r\"$s\"" - break - fi - done - recho_ "$r" -} -function qlines() { - sed "s/'/'\\\\''/g; s/.*/'&'/g" -} -function setv() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - eval "$__s_var=\"\$*\"" -} -function _setv() { - local __s_var="$1"; shift - eval "$__s_var=\"\$*\"" -} -function echo_setv() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - echo "$__s_var=$(qvalr "$*")" -} -function setx() { - if [ "$1" == -a ]; then - shift - local __s_array="$1"; shift - if [[ "$__s_array" == *=* ]]; then - set -- "${__s_array#*=}" "$@" - __s_array="${__s_array%%=*}" - fi - eval "$__s_array=($("$@" | qlines))" - else - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - eval "$__s_var="'"$("$@")"' - fi -} -function _setvx() { - local __s_var="$1"; shift - eval "$__s_var="'"$("$@")"' -} -function _setax() { - local __s_array="$1"; shift - eval "$__s_array=($("$@" | qlines))" -} -function evalx() { - local __e_val __e_arg __e_r=0 - local -a __e_cmd - - local __e_first=1 - while [ $# -gt 0 ]; do - __e_cmd=() - while [ $# -gt 0 ]; do - __e_arg="$1"; shift - [ "$__e_arg" == // ] && break - if [ "${__e_arg%//}" != "$__e_arg" ]; then - local __e_tmp="${__e_arg%//}" - if [ -z "${__e_tmp//\\/}" ]; then - __e_arg="${__e_arg#\\}" - __e_cmd=("${__e_cmd[@]}" "$__e_arg") - continue - fi - fi - __e_cmd=("${__e_cmd[@]}" "$__e_arg") - done - - if [ -n "$__e_first" ]; then - __e_val="$("${__e_cmd[@]}")" || __e_r=$? - else - __e_val="$("${__e_cmd[@]}" "$__e_val")" || __e_r=$? - fi - __e_first= - done - [ -n "$__e_val" ] && echo "$__e_val" - return $__e_r -} -function setxx() { - local -a __s_args - if [ "$1" == -a ]; then __s_args=(-a); shift; fi - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - __s_args=("${__s_args[@]}" "$__s_var") - setx "${__s_args[@]}" evalx "$@" -} -function evalp() { - local __e_arg __e_cmd - - while [ $# -gt 0 ]; do - __e_arg="$1"; shift - if [ "$__e_arg" == // ]; then - __e_cmd="$__e_cmd |" - continue - elif [ "${__e_arg%//}" != "$__e_arg" ]; then - local __e_tmp="${__e_arg%//}" - if [ -z "${__e_tmp//\\/}" ]; then - __e_arg="${__e_arg#\\}" - fi - fi - __e_cmd="${__e_cmd:+$__e_cmd }\"$(_qval "$__e_arg")\"" - done - eval "$__e_cmd" -} -function setxp() { - local -a __s_args - if [ "$1" == -a ]; then __s_args=(-a); shift; fi - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - __s_args=("${__s_args[@]}" "$__s_var") - setx "${__s_args[@]}" evalp "$@" -} -function testx() { - local __t_op="$1"; shift - local __t_val="$(evalx "$@")" - [ $__t_op "$__t_val" ] -} -function test2x() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalx "$@")" - [ "$__t_val1" $__t_op "$__t_val2" ] -} -function testrx() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalx "$@")" - eval '[[ "$__t_val1" '"$__t_op"' "$__t_val2" ]]' -} -function testp() { - local __t_op="$1"; shift - local __t_val="$(evalp "$@")" - [ $__t_op "$__t_val" ] -} -function test2p() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalp "$@")" - [ "$__t_val1" $__t_op "$__t_val2" ] -} -function testrp() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalp "$@")" - eval '[[ "$__t_val1" '"$__t_op"' "$__t_val2" ]]' -} - -function err2out() { - "$@" 2>&1 -} - -function is_defined() { - [ -n "$(declare -p "$1" 2>/dev/null)" ] -} -function is_array() { - case "$(declare -p "$1" 2>/dev/null)" in declare\ -a*) return 0;; esac - return 1 -} - -function upvar() { - if unset -v "$1"; then - if [ $# -eq 2 ]; then - eval "$1=\"\$2\"" - else - eval "$1=(\"\${@:2}\")" - fi - fi -} -function array_upvar() { - unset -v "$1" && eval "$1=(\"\${@:2}\")" -} -function upvars() { - while [ $# -gt 0 ]; do - case "$1" in - -a) - unset -v "$2" && eval "$2=(\"\${@:3}\")" - break - ;; - -a*) - unset -v "$2" && eval "$2=(\"\${@:3:${1#-a}}\")" - shift $((${1#-a} + 2)) || return 1 - ;; - *) - unset -v "$1" && eval "$1=\"\$2\"" - shift; shift - ;; - esac - done -} - -function __ab_process_pending() { - local -a values - case "$mode" in - cmd) values="$("${pending[@]}")";; - ssplit) eval "values=($("${pending[@]}"))";; - lsplit) eval "values=($("${pending[@]}" | qlines))";; - add) values=("${pending[@]}");; - esac - cmd=("${cmd[@]}" "${values[@]}") - pending=() -} -function array_buildcmd() { - local desta="$1"; shift; local "$desta" - local mode=add - local -a pending cmd - while [ $# -gt 0 ]; do - case "$1" in - ++c|++cmd|++) __ab_process_pending; mode=cmd;; - ++s|++ssplit) __ab_process_pending; mode=ssplit;; - ++l|++lsplit) __ab_process_pending; mode=lsplit;; - ++a|++add) __ab_process_pending; mode=add;; - *) pending=("${pending[@]}" "$1");; - esac - shift - done - __ab_process_pending - array_upvar "$desta" "${cmd[@]}" -} -function buildcmd() { - local -a args - array_buildcmd args "$@" - qvals "${args[@]}" -} -function evalcmd() { - local -a args - array_buildcmd args "$@" - "${args[@]}" -} -##@inc]base.core -##@inc[base.num -## Fonctions de base: gestion des valeurs numériques -uprovide base.num - -function isnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//[0-9]/}" - [ -z "$v" ] -} -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - [ -z "${1//[0-9]/}" ] -} -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//./}" - v="${v//,/}" - v="${v//[0-9]/}" - [ -z "$v" ] -} -##@inc]base.num -##@inc[base.bool -## Fonctions de base: valeurs booléennes -##@inc[base.num -## Fonctions de base: gestion des valeurs numériques -uprovide base.num - -function isnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//[0-9]/}" - [ -z "$v" ] -} -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - [ -z "${1//[0-9]/}" ] -} -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//./}" - v="${v//,/}" - v="${v//[0-9]/}" - [ -z "$v" ] -} -##@inc]base.num -uprovide base.bool -urequire base.num - -function is_yes() { - case "${1,,}" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - esac - isnum "$1" && [ "$1" -ne 0 ] && return 0 - return 1 -} -function is_no() { - case "${1,,}" in - n|non|no|f|faux|false|off) return 0;; - esac - isnum "$1" && [ "$1" -eq 0 ] && return 0 - return 1 -} -function yesval() { - is_yes "$1" && echo 1 -} - -function setb() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - local __s_r - if "$@" >/dev/null; then - eval "$__s_var=1" - else - __s_r=$? - eval "$__s_var=" - return $__s_r - fi -} -function _setb() { - local __s_var="$1"; shift - if "$@" >/dev/null; then - eval "$__s_var=1" - else - eval "$__s_var=" - fi -} - -function evalb() { - if evalx "$@" >/dev/null; then - echo 1 - else - return $? - fi -} -function setxb() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - setx "$__s_var" evalb "$@" -} -##@inc]base.bool -##@inc[base.quote -## Fonctions de base: protection de valeurs chaine -uprovide base.quote -urequire base.core - -function _qawk() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s// -/\\n}" - recho_ "$s" -} -function qawk() { - echo -n \" - _qawk "$@" - echo \" -} -function qseds() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\//\\/}" - s="${s// -/\\n}" - recho "$s" -} -function _qform() { - local s="$*" - s="${s//\%/%25}" - s="${s//+/%2B}" - s="${s//&/%26}" - s="${s//=/%3D}" - s="${s// /+}" - recho_ "$s" -} -function qform() { - local s="$*" - if [[ "$s" == *=* ]]; then - _qform "${s%%=*}" - echo -n = - _qform "${s#*=}" - echo - else - _qform "$s" - echo - fi -} -function _qsql() { - local q="'" qq="''" - echo "${*//$q/$qq}" -} -function qsql() { - local q="'" qq="''" - echo "'${*//$q/$qq}'" -} -##@inc]base.quote -uprovide base.compat -urequire base.core base.num base.bool base.quote - - -function setx2() { setxx "$@"; } -function rawecho() { recho "$@"; } -function rawecho_() { recho_ "$@"; } -function quote_arg() { _qval "$@"; } -function quoted_arg() { qvalm "$@"; } -function quoted_args() { qvals "$@"; } -function set_var() { setv "$@"; } -function set_var_cmd() { echo_setv "$@"; } -function set_var_literal() { eval "$1=$2"; } - -function quote_awk() { _qawk "$@"; } -function quoted_awk() { qawk "$@"; } -function quote_seds() { qseds "$@"; } -function quote_form() { _qform "$@"; } -function quoted_form() { qform "$@"; } - - -if [ -n "$BASH_VERSINFO" -a "${BASH_VERSINFO[0]}" -lt 4 ]; then - function strlower() { tr A-Z a-z <<<"$*"; } - function strlower1() { - local str="$*" - local h="${str:0:1}" r="${str:1}" - echo "$(tr A-Z a-z <<<"$h")$r" - } - function strlowers() { - local -a vs; local v - for v in "$@"; do - vs=("${vs[@]}" "$(strlower1 "$v")") - done - echo "${vs[*]}" - } - function strupper() { tr a-z A-Z <<<"$*"; } - function strupper1() { - local str="$*" - local h="${str:0:1}" r="${str:1}" - echo "$(tr a-z A-Z <<<"$h")$r" - } - function struppers() { - local -a vs; local v - for v in "$@"; do - vs=("${vs[@]}" "$(strupper1 "$v")") - done - echo "${vs[*]}" - } - - function is_yes() { - case "$1" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - O|OUI|Y|YES|V|VRAI|T|TRUE|ON) return 0;; - esac - isnum "$1" && [ "$1" -ne 0 ] && return 0 - case "$(strlower "$1")" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - esac - return 1 - } - function is_no() { - case "$1" in - n|non|no|f|faux|false|off) return 0;; - N|NON|NO|F|FAUX|FALSE|OFF) return 0;; - esac - isnum "$1" && [ "$1" -eq 0 ] && return 0 - case "$(strlower "$1")" in - n|non|no|f|faux|false|off) return 0;; - esac - return 1 - } -fi -##@inc]base.compat -uprovide base -urequire base.init base.core base.string base.num base.bool base.array base.quote base.split base.args base.tools base.compat - -UNAME_SYSTEM=`uname -s` -[ "${UNAME_SYSTEM#CYGWIN}" != "$UNAME_SYSTEM" ] && UNAME_SYSTEM=Cygwin -[ "${UNAME_SYSTEM#MINGW32}" != "$UNAME_SYSTEM" ] && UNAME_SYSTEM=Mingw -UNAME_MACHINE=`uname -m` -if [ -n "$UTOOLS_CHROOT" ]; then - [ -n "$UTOOLS_UNAME_SYSTEM" ] && eval "UNAME_SYSTEM=$UTOOLS_UNAME_SYSTEM" - [ -n "$UTOOLS_UNAME_MACHINE" ] && eval "UNAME_MACHINE=$UTOOLS_UNAME_MACHINE" -fi - -function setyesval() { - is_yes "$2" && set_var "$1" 1 || set_var "$1" "" -} -function normyesval() { - is_yes "${2:-"${!1}"}" && set_var "$1" 1 || set_var "$1" "" -} -function normyesvals() { - local __nyv_yesvar - for __nyv_yesvar in "$@"; do - is_yes "${!__nyv_yesvar}" && set_var "$__nyv_yesvar" 1 || set_var "$__nyv_yesvar" "" - done -} -function quote_in() { - sed 's/\\/\\\\/g -s/"/\\"/g -s/\$/\\$/g -s/`/\\`/g' -} -function quote_sin() { - sed "s/'/'\\\\''/g" -} -function quote_sarg() { - quote_sin <<<"$1" -} -function quoted_sarg() { - echo "'$(quote_sarg "$1")'" -} -function quoted_sargs() { - local a s - for a in "$@"; do - s="${s:+$s }$(quoted_sarg "$a")" - done - rawecho "$s" -} - -function set_array_cmd() { - [ $# -eq 1 ] && set -- "$1" "$1" - local __sac_s __sac_v __sac_f - __sac_s="$1=("; shift - if [ "$1" == "@" ]; then - shift - else - eval "set -- \"\${$1[@]}\"" - fi - __sac_f=1 - for __sac_v in "$@"; do - [ -n "$__sac_f" ] && __sac_f= || __sac_s="$__sac_s " - __sac_s="$__sac_s$(quoted_arg "$__sac_v")" - done - __sac_s="$__sac_s)" - echo "$__sac_s" -} -function set_array() { - eval "$(set_array_cmd "$@")" -} -function array_count() { - eval "echo \${#$1[*]}" -} -function array_isempty() { - [ $(array_count "$1") -eq 0 ] -} -function array_new() { - eval "$1=()" -} -function array_add() { - local __aa_a="$1"; shift - eval "$__aa_a=(\"\${$__aa_a[@]}\" \"\$@\")" -} -function array_ins() { - local __aa_a="$1"; shift - eval "$__aa_a=(\"\$@\" \"\${$__aa_a[@]}\")" -} -function array_del() { - local __ad_v - local -a __ad_vs - eval 'for __ad_v in "${'"$1"'[@]}"; do - if [ "$__ad_v" != '"$(quoted_arg "$2")"' ]; then - array_add __ad_vs "$__ad_v" - fi -done' - array_copy "$1" __ad_vs -} -function array_addu() { - local __as_v - eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then - return 1 - fi -done' - array_add "$1" "$2" - return 0 -} -function array_set() { - array_addu "$@" -} -function array_insu() { - local __as_v - eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then - return 1 - fi -done' - array_ins "$1" "$2" - return 0 -} -function array_fillrange() { - local -a __af_vs - local __af_i="${2:-1}" __af_to="${3:-10}" __af_step="${4:-1}" - while [ "$__af_i" -le "$__af_to" ]; do - __af_vs=("${__af_vs[@]}" "$__af_i") - __af_i=$(($__af_i + $__af_step)) - done - array_copy "$1" __af_vs -} -function array_eq() { - local -a __ae_a1 __ae_a2 - array_copy __ae_a1 "$1" - array_copy __ae_a2 "$2" - [ ${#__ae_a1[*]} -eq ${#__ae_a2[*]} ] || return 1 - local __ae_v __ae_i=0 - for __ae_v in "${__ae_a1[@]}"; do - [ "$__ae_v" == "${__ae_a2[$__ae_i]}" ] || return 1 - __ae_i=$(($__ae_i + 1)) - done - return 0 -} -function array_contains() { - local __ac_v - eval 'for __ac_v in "${'"$1"'[@]}"; do - if [ "$__ac_v" == '"$(quoted_arg "$2")"' ]; then - return 0 - fi -done' - return 1 -} -function array_find() { - local __af_i __af_v - __af_i=0 - eval 'for __af_v in "${'"$1"'[@]}"; do - if [ "$__af_v" == '"$(quoted_arg "$2")"' ]; then - if [ -n "$3" ]; then - echo "${'"$3"'[$__af_i]}" - else - echo "$__af_i" - fi - return 0 - fi - __af_i=$(($__af_i + 1)) -done' - return 1 -} -function array_reverse() { - local -a __ar_vs - local __ar_v - array_copy __ar_vs "$1" - array_new "$1" - for __ar_v in "${__ar_vs[@]}"; do - array_ins "$1" "$__ar_v" - done -} - -function array_replace() { - local __ar_sn="$1"; shift - local __ar_f="$1"; shift - local -a __ar_s __ar_d - local __ar_v - array_copy __ar_s "$__ar_sn" - for __ar_v in "${__ar_s[@]}"; do - if [ "$__ar_v" == "$__ar_f" ]; then - __ar_d=("${__ar_d[@]}" "$@") - else - __ar_d=("${__ar_d[@]}" "$__ar_v") - fi - done - array_copy "$__ar_sn" __ar_d -} -function array_each() { - local __ae_an="$1"; shift - local __ae_f="$1"; shift - local -a __ae_a - local __ae_v - array_copy __ae_a "$__ae_an" - for __ae_v in "${__ae_a[@]}"; do - "$__ae_f" "$__ae_v" "$@" - done -} -function array_map() { - local __am_an="$1"; shift - local __am_f="$1"; shift - local -a __am_a __am_vs - local __am_v - array_copy __am_a "$__am_an" - for __am_v in "${__am_a[@]}"; do - __am_vs=("${__am_vs[@]}" "$("$__am_f" "$__am_v" "$@")") - done - array_copy "$__am_an" __am_vs -} -function first_value() { - eval "rawecho \"\${$1[@]:0:1}\"" -} -function last_value() { - eval "rawecho \"\${$1[@]:\$((-1)):1}\"" -} -function array_copy() { - eval "$1=(\"\${$2[@]}\")" -} -function array_copy_firsts() { - eval "$1=(\"\${${2:-$1}[@]:0:\$((\${#${2:-$1}[@]}-1))}\")" -} -function array_del_last() { - array_copy_firsts "$1" -} -function array_copy_lasts() { - eval "$1=(\"\${${2:-$1}[@]:1}\")" -} -function array_del_first() { - array_copy_lasts "$1" -} -function array_extend() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]}\")" -} -function array_extendu() { - local __ae_v __ae_s=1 - eval 'for __ae_v in "${'"$2"'[@]}"; do - array_addu "$1" "$__ae_v" && __ae_s=0 -done' - return "$__ae_s" -} -function array_extend_firsts() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]:0:\$((\${#$2[@]}-1))}\")" -} -function array_extend_lasts() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]:1}\")" -} -function array_xsplit() { - eval "$1=($(recho_ "$2" | awkrun RS="${3:-:}" ' -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_split() { - eval "$1=($(recho_ "$2" | awkrun RS="${3:-:}" ' -/^$/ { next } -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_from_path() { - array_split "$1" "$2" ":" -} -function array_from_xlines() { - eval "$1=($(recho_ "$2" | _nl2lf | awk ' -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_from_lines() { - eval "$1=($(recho_ "$2" | _nl2lf | awk ' -/^$/ { next } -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_join() { - local __aj_an __aj_l __aj_j __aj_s="${2:-,}" __aj_pf __aj_sf - if [ "$1" == "@" ]; then - __aj_an="\$@" - shift; shift - else - __aj_an="\${$1[@]}" - __aj_pf="$4" - __aj_sf="$5" - fi - eval 'for __aj_l in "'"$__aj_an"'"; do - __aj_j="${__aj_j:+$__aj_j'"$__aj_s"'}$__aj_pf$__aj_l$__aj_sf" -done' - if [ -n "$__aj_j" ]; then - rawecho "$__aj_j" - elif [ "$__aj_an" != "\$@" -a -n "$3" ]; then - rawecho "$3" - fi -} -function array_mapjoin() { - local __amj_src="$1" __amj_func="$2" __amj_sep="$3" - shift; shift; shift - if [ "$__amj_src" == "@" ]; then - local -a __amj_tmpsrc - __amj_tmpsrc=("$@") - __amj_src=__amj_tmpsrc - set -- - fi - local -a __amj_tmp - array_copy __amj_tmp "$__amj_src" - array_map __amj_tmp "$__amj_func" - array_join __amj_tmp "$__amj_sep" "$@" -} -function array_to_lines() { - array_join "$1" " -" "$2" "$3" "$4" -} -function array_to_path() { - array_join "$1" ":" "$2" "$3" "$4" -} -function array_fix_paths() { - local __afp_an="$1" __afp_s="${2:-:}" - local -a __afp_vs - local __afp_v - array_copy __afp_vs "$__afp_an" - array_new "$__afp_an" - for __afp_v in "${__afp_vs[@]}"; do - array_split __afp_v "$__afp_v" "$__afp_s" - array_extend "$__afp_an" __afp_v - done -} - - -function get_date_rfc822() { - LC_TIME=C date +"%a, %d %b %Y %H:%M:%S %Z" -} -function get_date_fr() { - LC_TIME=C date +"%d/%m/%Y" -} -function get_time_fr() { - LC_TIME=C date +"%Hh%M" -} -function parse_date() { - local value="$1" type="${2:-date}" - local now="$(awk 'BEGIN { print mktime(strftime("%Y %m %d 00 00 00 +0400")) }')" - case "$value" in - +*) - value="$(($now + ${value#+} * 86400))" - ;; - *) - value="$(<<<"$value" awk -F/ '{ - nd = strftime("%d"); nm = strftime("%m"); ny = strftime("%Y") - d = $1 + 0; if (d < 1) d = nd; - m = $2 + 0; if (m < 1) m = nm; - if ($3 == "") y = ny; - else { y = $3 + 0; if (y < 100) y = y + 2000; } - print mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d)); - }')" - esac - case "$type" in - d|date) awk '{ print strftime("%d/%m/%Y", $0 + 0) }' <<<"$value";; - l|ldap) awk '{ print strftime("%Y%m%d%H%M%S+0400", $0 + 0) }' <<<"$value";; - m|mysql) awk '{ print strftime("%Y-%m-%d", $0 + 0) }' <<<"$value";; - *) - rawecho "$value" - ;; - esac -} - - -function udelpath() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; ${2:-PATH}"'="${'"${2:-PATH}"'#$1:}"; '"${2:-PATH}"'="${'"${2:-PATH}"'%:$1}"; '"${2:-PATH}"'="${'"${2:-PATH}"'//:$_qdir:/:}"; [ "$'"${2:-PATH}"'" == "$1" ] && '"${2:-PATH}"'=' -} -function uaddpath() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="${'"${2:-PATH}"':+$'"${2:-PATH}"':}$1"' -} -function uinspathm() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="$1${'"${2:-PATH}"':+:$'"${2:-PATH}"'}"' -} -function uinspath() { - udelpath "$@" - uinspathm "$@" -} - -function withpath() { - [ "${1#./}" != "$1" -o "${1#../}" != "$1" -o "${1#/}" != "$1" ] -} -function withext() { - local basename="$(basename -- "$1")" - [ "${basename%.*}" != "$basename" ] -} -function normpath() { - local -a parts - local part ap - array_split parts "$1" / - if [ "${1#/}" != "$1" ]; then - ap=/ - elif [ -n "$2" ]; then - ap="$2" - else - ap="$(pwd)" - fi - for part in "${parts[@]}"; do - if [ "$part" == "." ]; then - continue - elif [ "$part" == ".." ]; then - ap="${ap%/*}" - [ -n "$ap" ] || ap=/ - else - [ "$ap" != "/" ] && ap="$ap/" - ap="$ap$part" - fi - done - rawecho "$ap" -} -function abspath() { - local ap="$1" - if [ "${ap#/}" != "$ap" ]; then - __normpath "$ap" && return - else - local cwd - if [ -n "$2" ]; then - cwd="$(abspath "$2")" - else - cwd="$(pwd)" - fi - ap="$cwd/$ap" - __normpath "$ap" && return - fi - normpath "$ap" -} -function __normpath() { - if [ -d "$1" ]; then - if [ -x "$1" ]; then - (cd "$1"; pwd) - return 0 - fi - elif [ -f "$1" ]; then - local dn="$(dirname -- "$1")" bn="$(basename -- "$1")" - if [ -x "$dn" ]; then - (cd "$dn"; echo "$(pwd)/$bn") - return 0 - fi - fi - return 1 -} -function parentdirs() { - array_new "$1" - local __pd_d="$(abspath "$2")" - if [[ "$3" == r* ]]; then - while [ "$__pd_d" != "/" ]; do - array_ins "$1" "$__pd_d" - __pd_d="$(dirname "$__pd_d")" - done - else - while [ "$__pd_d" != "/" ]; do - array_add "$1" "$__pd_d" - __pd_d="$(dirname "$__pd_d")" - done - fi -} -function ppath() { - local path="$1" cwd="$2" - - path="$(abspath "$path")" # essayer de normaliser le chemin - [ -n "$cwd" ] || cwd="$(pwd)" - - [ "$path" = "$cwd" ] && path="." - [ "$cwd" != "/" -a "$cwd" != "$HOME" ] && path="${path/#$cwd\//}" - path="${path/#$HOME/~}" - - rawecho "$path" -} -function relpath() { - local p="$(abspath "$1" "$3")" cwd="$2" - if [ -z "$cwd" ]; then - cwd="$(pwd)" - else - cwd="$(abspath "$cwd" "$3")" - fi - if [ "$p" == "$cwd" ]; then - echo "" - elif [ "${p#$cwd/}" != "$p" ]; then - rawecho "${p#$cwd/}" - else - local rp - while [ -n "$cwd" -a "${p#$cwd/}" == "$p" ]; do - rp="${rp:+$rp/}.." - cwd="${cwd%/*}" - done - rp="$rp/${p#$cwd/}" - echo "${rp%//}" - fi -} -function relpathx() { - local p="$(relpath "$@")" - if [ -z "$p" ]; then - echo . - elif [ "${p#../}" != "$p" -o "${p#./}" != "$p" ]; then - echo "$p" - else - echo "./$p" - fi -} -function withinpath() { - local b="$1" p="$2" strict="${3:-N}" - b="$(abspath "$b")" - p="$(abspath "$p")" - if is_yes "$strict"; then - [ "${p#$b/}" != "$p" ] - else - [ "$p" == "$b" -o "${p#$b/}" != "$p" ] - fi -} -function safe_abspath() { - local p="$1" ba="$2" br="$3" - if [ -n "$ba" ]; then - ba="$(abspath "$ba")" - else - ba="$(pwd)" - fi - [ -n "$br" ] || br="$ba" - br="$(abspath "$br" "$ba")" - p="$(abspath "$p" "$ba")" - if [ "$p" == "$br" -o "${p#$br/}" != "$p" ]; then - echo "$p" - else - return 1 - fi -} -function safe_relpath() { - local p - if p="$(safe_abspath "$1" "$2" "$3")"; then - relpath "$p" "$2" "$(pwd)" - else - return 1 - fi -} -function splitwcs() { - local __sw_p="$1" - local __sw_dd="${2:-basedir}" __sw_df="${3:-filespec}" __sw_part __sw_d __sw_f - local -a __sw_parts - array_split __sw_parts "$__sw_p" "/" - for __sw_part in "${__sw_parts[@]}"; do - if [[ "$__sw_part" == *\** ]] || [[ "$__sw_part" == *\?* ]] || [ -n "$__sw_f" ]; then - __sw_f="${__sw_f:+$__sw_f/}$__sw_part" - else - __sw_d="${__sw_d:+$__sw_d/}$__sw_part" - fi - done - [ "${__sw_p#/}" != "$__sw_p" ] && __sw_d="/$__sw_d" - set_var "$__sw_dd" "$__sw_d" - set_var "$__sw_df" "$__sw_f" -} -function deref() { - local OENC="$UTF8" - - local max_deref=50 - local file="$1" - local basedir link - while [ -L "$file" ]; do - basedir="$(dirname "$file")" - link="$(readlink "$file")" - if first_char_is "$link" "/"; then - file="$link" - else - file="$basedir/$link" - fi - - max_deref=$(($max_deref - 1)) - [ $max_deref -eq 0 ] && die "Plus de 50 indirection. Le lien $file est-il récursif?" - done - abspath "$file" -} -function readlinka() { - if [ -L "$1" ]; then - local linkdir="$(dirname -- "$1")" - abspath "$(readlink "$1")" "$linkdir" - else - abspath "$1" - fi -} -function readlinkm() { - readlink -m "$1" -} -function path_if_test() { - local op="$1"; shift - local file="$1"; shift - local rel="$1" reldir=; shift - if beginswith "$rel" relative; then - reldir="${rel#relative}" - if beginswith "$reldir" :; then - reldir="${reldir#:}" - if [ -n "$reldir" ]; then - reldir="${reldir}/" - fi - else - reldir= - fi - else - rel= - fi - - while [ -n "$1" ]; do - local basedir="$1" - if [ $op "$basedir/$file" ]; then - if [ -n "$rel" ]; then - rawecho "$reldir$file" - else - rawecho "$basedir/$file" - fi - break - fi - shift - done -} -function update_link() { - [ -L "$2" ] || return 1 - local dest link="$2" - local linkdir="$(dirname "$link")" - local ldest="$(readlink "$link")" - if [ "${ldest#/}" != "$ldest" ]; then - dest="$(abspath "$1")" - else - dest="$(relpath "$1" "$linkdir")" - fi - if [ "$dest" == "$ldest" ]; then - : # pas besoin de mettre à jour - elif [ -d "$link" ]; then - rm -f "$link" && ln -s "$dest" "$link" - else - ln -sf "$dest" "$link" - fi -} -function update_links() { - [ -n "$1" ] || return 1 - local dest="$1"; shift - local r=0 link - for link in "$@"; do - update_link "$dest" "$link" || r=$? - done - return $r -} -function move_link() { - [ -n "$1" -a -n "$2" ] || return 1 - local link="$1" dest="$2" - [ -d "$dest" ] && dest="$dest/$(basename -- "$link")" - dest="$(abspath "$dest")" - if [ -L "$link" ]; then - link="$(abspath "$link")" - [ "$dest" == "$link" ] && return 0 - ldest="$(readlinka "$link")" - mv "$link" "$dest" || return 1 - update_link "$ldest" "$dest" - else - [ "$dest" == "$link" ] && return 0 - mv "$link" "$dest" - fi -} -function array_find_links() { - local -a __afl_links __afl_result - local __afl_dir="${3:-.}" - local __afl_dest __afl_destname __afl_link __afl_linkdir __afl_ldest - __afl_dest="$(abspath "$2")" - __afl_destname="${__afl_dest##*/}" - array_from_lines __afl_links "$(find "$__afl_dir" -type l)" - for __afl_link in "${__afl_links[@]}"; do - __afl_ldest="$(readlink "$__afl_link")" - if [ "$__afl_ldest" != "$__afl_destname" ]; then - [[ "$__afl_ldest" == */"$__afl_destname" ]] || continue - fi - __afl_link="$(abspath "$__afl_link" "$__afl_dir")" - __afl_linkdir="$(dirname -- "$__afl_link")" - __afl_ldest="$(abspath "$__afl_ldest" "$__afl_linkdir")" - if [ "$__afl_ldest" == "$__afl_dest" ]; then - array_add __afl_result "$__afl_link" - fi - done - array_copy "$1" __afl_result -} -function list_links() { - local -a links - array_find_links links "$@" - array_to_lines links -} -function move_file() { - [ -n "$1" -a -n "$2" ] || return 1 - local src="$1" dest="$2" link - shift; shift - [ -d "$dest" ] && dest="$dest/$(basename -- "$src")" - move_link "$src" "$dest" || return 1 - update_links "$dest" "$@" -} - -function get_nblines() { - [ -f "$1" ] && sed -ne '$=' "$1" || echo 0 -} -function mktempf() { - mktemp "${1:-"$TMPDIR/tmp.XXXXXX"}" -} -function mktempd() { - mktemp -d "${1:-"$TMPDIR/tmp.XXXXXX"}" -} -function mkdirof() { - mkdir -p "$(dirname -- "$1")" -} -function cp_a() { - /bin/cp -a "$@" -} -function cp_R() { - /bin/cp -pR "$@" -} -function quietgrep() { - grep -q "$@" 2>/dev/null -} -function quietdiff() { - diff -q "$@" >&/dev/null -} -function testsame() { - quietdiff "$@" -} -function testdiff() { - ! quietdiff "$@" -} -function testupdated() { - if [ -f "$2" ]; then - testdiff "$1" "$2" - else - return 0 - fi -} -function testnewer() { - test ! -e "$2" -o "$1" -nt "$2" -} -function ps_all() { - ps -axww -} -function progexists() { - test -n "$1" -a -x "$(which "$1" 2>/dev/null)" -} -function has_python() { - progexists python -} -function has_gawk() { - progexists gawk -} -function is_root() { - test `id -u` -eq 0 -} -function source_ifexists() { - if [ -f "$1" ]; then source "$1" || die; fi -} -function little_sleep { - LC_NUMERIC=C sleep 0.1 -} -function random_sleep { - sleep $(($RANDOM % ${1:-1800})) -} -function is_running() { - kill -0 "$1" >&/dev/null -} -function sedi() { - sed -i "$@" -} -function csort() { - LANG=C sort "$@" -} -function lsort() { sort "$@"; } -function cgrep() { - LANG=C grep "$@" -} -function lgrep() { grep "$@"; } -function csed() { - LANG=C sed "$@" -} -function lsed() { sed "$@"; } -function cawk() { - LANG=C awk "$@" -} -function lawk() { awk "$@"; } -function cdiff() { - LANG=C diff "$@" -} -function ldiff() { diff "$@"; } - - -function fix_mode() { - local file="$1" - [ -f "$file" ] || touch "$file" || return 1 - if [ ! -w "$file" ]; then - local mode="$(stat -c %a "$file")" - chmod ${mode:0:${#mode}-3}6${mode:${#mode}-2:2} "$file" - echo "$mode" - fi -} -function unfix_mode() { - [ -n "$2" ] && chmod "$2" "$1" -} -function get_mode() { - [ -f "$1" ] || touch "$1" || return 1 - stat -c %a "$1" -} -function rm_maybe() { - local parse_opts=1 arg rm - for arg in "$@"; do - if [ -n "$parse_opts" ]; then - if [ "$arg" == "--" ]; then - parse_opts= - elif [[ "$arg" == "-*" ]]; then - continue - elif [ -n "$arg" ]; then - rm=1 - break - fi - elif [ -n "$arg" ]; then - rm=1 - break - fi - done - [ -n "$rm" ] && /bin/rm "$@" -} -__CPDIR_RSYNC_SLOW=1 # synchro potentiellement plus lente, mais plus fidèle (option -c) -__CPDIR_RSYNC_ARGS=(-q) -function cpdir() { - - if progexists rsync; then - [ -d "$2" ] || mkdir -p "$2" || return 1 - if [ -d "$1" ]; then - rsync -a ${__CPDIR_RSYNC_SLOW:+-c} "${__CPDIR_RSYNC_ARGS[@]}" "$1/" "$2/" - else - rsync -a ${__CPDIR_RSYNC_SLOW:+-c} "${__CPDIR_RSYNC_ARGS[@]}" "$1" "$2/" - fi - else - __cpdir "$@" - fi -} -function __cpdir() { - local src="$1" dest="$2" method="${3:-cp_a}" - - if [ -d "$src" ]; then - [ -d "$dest" ] || mkdir -p "$dest" || return 1 - - local prevdir="$(pwd)" - - dest="$(abspath "$dest")" - cd "$src" - if [ -n "$(/bin/ls -a1)" ]; then - [ -n "$(/bin/ls -1)" ] && "$method" * "$dest" - local i - for i in .*; do - [ "$i" == "." -o "$i" == ".." ] && continue - "$method" "$i" "$dest" - done - fi - cd "$prevdir" - else - if [ -f "$dest" ]; then - "$method" "$src" "$dest" - elif [ -d "$dest" ]; then - "$method" "$src" "$dest" - else - mkdir -p "$dest" - "$method" "$src" "$dest" - fi - fi -} -__CPNOVCS_RSYNC_SLOW=1 # synchro potentiellement plus lente, mais plus fidèle (option -c) -__CPNOVCS_RSYNC_ARGS=(-q) -function cpnovcs() { - local src="$1" destdir="$2" - [ -d "$destdir" ] || mkdir -p "$destdir" || return 1 - if progexists rsync; then - local gitexclude=/.git/ - if [ "${src%/}" == "$src" ]; then - gitexclude="/$(basename -- "$src")$gitexclude" - fi - rsync -a ${__CPNOVCS_RSYNC_SLOW:+-c} --exclude CVS/ --exclude .svn/ --exclude "$gitexclude" "${__CPNOVCS_RSYNC_ARGS[@]}" "$src" "$destdir/" - elif [ "${src%/}" != "$src" ]; then - __cpdir "$src" "$destdir" - else - local srcname="$(basename -- "$src")" - mkdir -p "$destdir/$srcname" - __cpdir "$src" "$destdir/$srcname" - fi -} -function cpdirnovcs() { - if [ -d "$1" ]; then - cpnovcs "$1/" "$2" - else - cpnovcs "$1" "$2" - fi -} -function doinplace() { - if [ -n "$1" -a "$1" != "-" ]; then - local __dip_file="$1"; shift - autoclean "$__dip_file.tmp.$$" - "$@" <"$__dip_file" >"$__dip_file.tmp.$$" - local s=$? - [ "$s" == 0 ] && /bin/cat "$__dip_file.tmp.$$" >"$__dip_file" - /bin/rm -f "$__dip_file.tmp.$$" - return $s - else - shift - "$@" - fi -} -function doinplacef() { - if [ -n "$1" -a "$1" != "-" ]; then - local __dip_file="$1"; shift - autoclean "$__dip_file.tmp.$$" - "$@" <"$__dip_file" >"$__dip_file.tmp.$$" - local s=$? - /bin/cat "$__dip_file.tmp.$$" >"$__dip_file" - /bin/rm -f "$__dip_file.tmp.$$" - return $s - else - shift - "$@" - fi -} -function stripnl() { - tr -d '\r\n' -} -function _nl2lf() { - awk 'BEGIN {RS="\r|\r\n|\n"} {print}' -} -function nl2lf() { - doinplace "$1" _nl2lf -} -function _nl2crlf() { - awk 'BEGIN {RS="\r|\r\n|\n"} {print $0 "\r"}' -} -function nl2crlf() { - doinplace "$1" _nl2crlf -} -function _nl2cr() { - awk 'BEGIN {RS="\r|\r\n|\n"; ORS=""} {print $0 "\r"}' -} -function nl2cr() { - doinplace "$1" _nl2cr -} -function _latin1compat() { - LANG=fr_FR.UTF-8 sed $' -s/[‘’]/\x27/g -s/[«»“”]/"/g -s/[\xC2\xA0\xE2\x80\x87\xE2\x80\xAF\xE2\x81\xA0]/ /g -' -} -function _noaccents() { - LANG=fr_FR.UTF-8 sed ' -s/[à]/a/g -s/[éèêë]/e/g -s/[ïî]/i/g -s/[ôö]/o/g -s/[üû]/u/g -s/[ç]/c/g -s/[À]/A/g -s/[ÉÈÊË]/E/g -s/[ÏÎ]/I/g -s/[ÔÖ]/O/g -s/[ÜÛ]/U/g -s/[Ç]/C/g -' -} -function list_all() { - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ "$f" == "." -o "$f" == ".." ] && continue - rawecho "$f" - done - cd "$curdir" -} -function __la_cmd() { - [ $# -gt 0 ] || set '*' - local arg - local cmd="/bin/ls -1d" - for arg in "$@"; do - arg="$(_rval "$arg")" - cmd="$cmd $arg" - done - cmd="$cmd 2>/dev/null" - echo "$cmd" -} -function list_files() { - local f - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ -f "$f" ] && rawecho "$f" - done - cd "$curdir" -} -function list_dirs() { - local f - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ "$f" == "." -o "$f" == ".." ] && continue - [ -d "$f" ] && rawecho "$f" - done - cd "$curdir" -} -function __array_ls() { - local __al_l="list_${1:-all}"; shift - local __al_an="$1"; shift - local __al_d="${1:-.}"; shift - local -a __al_fs - array_from_lines __al_fs "$("$__al_l" "$__al_d" "$@")" - local __al_f - array_new "$__al_an" - for __al_f in "${__al_fs[@]}"; do - array_add "$__al_an" "$__al_d/$__al_f" - done -} -function array_lsall() { - __array_ls all "$@" -} -function array_lsdirs() { - __array_ls dirs "$@" -} -function array_lsfiles() { - __array_ls files "$@" -} -function filter_empty() { - sed '/^$/d' -} -function filter_vcspath() { - sed ' -/^.git$/d -/^.git\//d -/\/.git$/d -/\/.git\//d -/^.svn$/d -/^.svn\//d -/\/.svn$/d -/\/.svn\//d -' -} -function merge_contlines() { - awk 'substr($0, length($0)) == "\\" { - while (getline nextline) { - $0 = substr($0, 1, length($0) - 1) nextline - if (substr($0, length($0)) != "\\") break - } - print - next -} -{print}' -} -function filter_comment() { - local -a merge - [ "$1" == -m ] && merge=(merge_contlines) || merge=(cat) - awk ' - /^[ \t]*#/ { next } - /^[ \t]*$/ { next } - { print }' | "${merge[@]}" -} -function filter_conf() { - local -a merge - [ "$1" == -m ] && merge=(merge_contlines) || merge=(cat) - grep -v '^#' | grep -v '^$' | "${merge[@]}" -} -function is_archive() { - local name="${1%.zip}" - name="${name%.tgz}" - name="${name%.tbz2}" - name="${name%.tar.gz}" - name="${name%.tar.bz2}" - name="${name%.tar}" - name="${name%.jar}" - name="${name%.war}" - name="${name%.ear}" - [ "$name" != "$1" ] -} -function extract_archive() { - local arch="$1" destdir="${2:-.}" - shift; shift - if endswith "$arch" .zip; then - unzip -q -d "$destdir" "$arch" "$@" || return - elif endswith "$arch" .tgz || endswith "$arch" .tar.gz; then - tar xzf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .tbz2 || endswith "$arch" .tar.bz2; then - tar xjf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .tar; then - tar xf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .jar || endswith "$arch" .war || endswith "$arch" .ear; then - ( - arch="$(abspath "$arch")" - cd "$destdir" - jar xf "$arch" "$@" - ) || return - else - return 1 - fi -} -function get_archive_basename() { - local basename="$(basename -- "$1")" - basename="${basename%.zip}" - basename="${basename%.tgz}" - basename="${basename%.tbz2}" - basename="${basename%.gz}" - basename="${basename%.bz2}" - basename="${basename%.tar}" - basename="${basename%.jar}" - basename="${basename%.war}" - basename="${basename%.ear}" - echo "$basename" -} -function get_archive_appname() { - local appname="$(basename -- "$1")" - appname="${appname%.zip}" - appname="${appname%.tgz}" - appname="${appname%.tbz2}" - appname="${appname%.gz}" - appname="${appname%.bz2}" - appname="${appname%.tar}" - appname="${appname%.jar}" - appname="${appname%.war}" - appname="${appname%.ear}" - echo "$appname" | awk '{ - if (match($0, /[-_.]([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/)) { - print substr($0, 1, RSTART - 1) - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/)) { - print substr($0, 1, RSTART - 1) - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print substr($0, 1, RSTART - 1) - } else { - print $0 - } -}' -} -function get_archive_versionsuffix() { - local basename="$(get_archive_basename "$1")" - echo "$basename" | awk '{ - if (match($0, /([-_.][0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print vs["1"] - } -}' -} -function get_archive_version() { - local basename="$(get_archive_basename "$1")" - echo "$basename" | awk '{ - if (match($0, /[-_.]([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print vs["1"] - } -}' -} -function __dump_usernames() { - = 500 && $6 ~ /^\/home\// { print $1 }' -} -function dump_usernames() { - array_from_lines "${1:-usernames}" "$(__dump_usernames)" -} -function __resolv_ips() { - LANG=C host "$1" 2>/dev/null | awk '/address / { gsub(/^.*address /, ""); print }' -} -function resolv_ips() { - array_from_lines "${1:-ips}" "$(__resolv_ips "$2")" -} -function __resolv_hosts() { - LANG=C host "$1" 2>/dev/null | awk '/domain name pointer / { gsub(/^.*domain name pointer /, ""); gsub(/\.$/, ""); print }' -} -function resolv_hosts() { - array_from_lines "${1:-hosts}" "$(__resolv_hosts "$2")" -} -function runscript_as() { - local OENC="$UTF8" - local user="${1:-root}"; shift - local exec_maybe= - if [ "$1" = "exec" ]; then - exec_maybe=exec - shift - fi - - local cmd - cmd="\ -__estack=$(quoted_arg "$__estack") -__tlevel=$(quoted_args "$__tlevel") -export __estack __tlevel -exec ${BASH:-/bin/sh} $(quoted_args "$@")" - - if is_yes "$UTOOLS_USES_SU" || ! progexists sudo; then - eecho "Entrez le mot de passe de root" - $exec_maybe su "$user" -c "$cmd" - else - if [ "$user" == "root" ]; then - $exec_maybe sudo -p "Entrez le mot de passe de %u: " "${BASH:-/bin/sh}" -c "$cmd" - else - $exec_maybe sudo -p "Entrez le mot de passe de %u: " su "$user" -c "$cmd" - fi - fi -} -function runscript_as_root() { - if is_root; then - local exec_maybe= - if [ "$1" = "exec" ]; then - exec_maybe=exec - shift - fi - $exec_maybe "${BASH:-/bin/sh}" "$@" - else - runscript_as root "$@" - fi -} -function run_as() { - local user="${1:-root}"; shift - local exec_maybe=exec - if [ "$1" = "--noexec" ]; then - exec_maybe= - shift - fi - - runscript_as "$user" $exec_maybe "$0" "$@" -} -function run_as_root() { - is_root || run_as root "$@" -} -function check_user() { - local user - for user in "$@"; do - [ "$USER" == "$user" ] && return 0 - done - return 1 -} -function ensure_user() { - local -a users - while [ $# -gt 0 -a "$1" != "--" ]; do - array_add users "$1" - shift - done - [ "$1" == "--" ] && shift - - if ! check_user "${users[@]}"; then - if [ ${#users[*]} -gt 1 ]; then - ewarn "Cette commande doit être lancée avec l'un des users ${users[*]}" - else - ewarn "Cette commande doit être lancée avec le user ${users[0]}" - fi - if ask_yesno "Voulez-vous tenter de relancer la commande avec le bon user?" O; then - estep "Lancement du script avec le user ${users[0]}" - run_as "${users[0]}" "$@" - return 1 - elif is_root; then - return 11 - else - return 10 - fi - fi - return 0 -} -function check_hostname() { - local userhost user host path - for userhost in "$@"; do - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - [ "$MYHOSTNAME" == "${host%%.*}" ] && return 0 - done - return 1 -} -function check_userhostname() { - local userhost path user host - for userhost in "$@"; do - if check_hostname "$userhost"; then - [[ "$userhost" == *@* ]] || return 0 - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - check_user "$user" && return 0 - fi - done - return 1 -} -UTOOLS_ENSURE_HOSTNAME_SSH_OPTS=() -function ensure_hostname() { - local -a userhosts - while [ $# -gt 0 -a "$1" != "--" ]; do - array_add userhosts "$1" - shift - done - [ "$1" == "--" ] && shift - - local userhost user host path - if ! check_hostname "${userhosts[@]}"; then - if [ ${#userhosts[*]} -gt 1 ]; then - ewarn "Cette commande n'est valide que sur l'un des hôtes ${userhosts[*]}" - else - ewarn "Cette commande n'est valide que sur l'hôte ${userhosts[0]}" - fi - - enote "Vous pouvez tenter de relancer le script sur ${userhosts[0]}, mais cela requière que ce script ET les données dont il a besoin soient installés dans la même version et dans le même répertoire sur l'hôte distant" - if ask_yesno "Voulez-vous tenter de relancer le script sur l'hôte distant?" N; then - splitfsep "${userhosts[0]}" : userhost path - splituserhost "$userhost" user host - [ -n "$user" ] || user=root - - estep "Lancement de la commande sur l'hôte distant $user@$host" - local cmd - [ -n "$path" ] && cmd="$(quoted_args cd "$path"); " - cmd="$cmd$(quoted_args "$script" "$@")" - ssh -qt "${UTOOLS_ENSURE_HOSTNAME_SSH_OPTS[@]}" "$user@$host" "$cmd" - [ $? -eq 255 ] && return 12 - return 1 - else - return 11 - fi - fi - local userhost user host - for userhost in "${userhosts[@]}"; do - [[ "$userhost" == *@* ]] || continue - if check_hostname "$userhost"; then - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - [ -n "$path" ] && cd "$path" - ensure_user "$user" -- "$@" - return $? - fi - done - return 0 -} - -__AWKDEF_FUNCTIONS=' -function quote_html(s) { - gsub(/&/, "\\&", s) - gsub(/"/, "\\"", s) - gsub(/>/, "\\>", s) - gsub(/", s) - gsub(/"/, "\"", s) - gsub(/&/, "\\&", s) - return s -} -function quote_value(s) {'" - gsub(/'/, \"'\\\\''\", s) - return \"'\" s \"'\" -"'} -function quoted_values( i, line) { - line = "" - for (i = 1; i <= NF; i++) { - if (i > 1) line = line " " - line = line quote_value($i) - } - return line -} -function quote_subrepl(s) { - gsub(/\\/, "\\\\", s) - gsub(/&/, "\\\\&", s) - return s -} -function quote_grep(s) { - gsub(/[[\\.^$*]/, "\\\\&", s) - return s -} -function quote_egrep(s) { - gsub(/[[\\.^$*+?()|{]/, "\\\\&", s) - return s -} -function quote_sql(s) {'" - gsub(/'/, \"''\", s) - return \"'\" s \"'\" -"'} -function unquote_mysqlcsv(s) { - gsub(/\\n/, "\n", s) - gsub(/\\t/, "\t", s) - gsub(/\\0/, "\0", s) - gsub(/\\\\/, "\\", s) - return s -} -function array_new(dest) { - dest[0] = 0 # forcer awk à considérer dest comme un tableau - delete dest -} -function array_newsize(dest, size, i) { - dest[0] = 0 # forcer awk à considérer dest comme un tableau - delete dest - size = int(size) - for (i = 1; i <= size; i++) { - dest[i] = "" - } -} -function array_len(values, count, i) { - count = 0 - for (i in values) { - count++ - } - return count -} -function mkindices(values, indices, i, j) { - array_new(indices) - j = 1 - for (i in values) { - indices[j++] = int(i) - } - return asort(indices) -} -function array_copy(dest, src, count, indices, i) { - array_new(dest) - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - dest[indices[i]] = src[indices[i]] - } -} -function array_getlastindex(src, count, indices) { - count = mkindices(src, indices) - if (count == 0) return 0 - return indices[count] -} -function array_add(dest, value, lastindex) { - lastindex = array_getlastindex(dest) - dest[lastindex + 1] = value -} -function array_deli(dest, i, l) { - i = int(i) - if (i == 0) return - l = array_len(dest) - while (i < l) { - dest[i] = dest[i + 1] - i++ - } - delete dest[l] -} -function array_del(dest, value, ignoreCase, i) { - do { - i = key_index(value, dest, ignoreCase) - if (i != 0) array_deli(dest, i) - } while (i != 0) -} -function array_extend(dest, src, count, lastindex, indices, i) { - lastindex = array_getlastindex(dest) - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - dest[lastindex + i] = src[indices[i]] - } -} -function array_fill(dest, i) { - array_new(dest) - for (i = 1; i <= NF; i++) { - dest[i] = $i - } -} -function array_getline(src, count, indices, i, j) { - $0 = "" - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - j = indices[i] - $j = src[j] - } -} -function array_appendline(src, count, indices, i, nf, j) { - count = mkindices(src, indices) - nf = NF - for (i = 1; i <= count; i++) { - j = nf + indices[i] - $j = src[indices[i]] - } -} -function in_array(value, values, ignoreCase, i) { - if (ignoreCase) { - value = tolower(value) - for (i in values) { - if (tolower(values[i]) == value) return 1 - } - } else { - for (i in values) { - if (values[i] == value) return 1 - } - } - return 0 -} -function key_index(value, values, ignoreCase, i) { - if (ignoreCase) { - value = tolower(value) - for (i in values) { - if (tolower(values[i]) == value) return int(i) - } - } else { - for (i in values) { - if (values[i] == value) return int(i) - } - } - return 0 -} -function array2s(values, prefix, sep, suffix, noindices, first, i, s) { - if (!prefix) prefix = "[" - if (!sep) sep = ", " - if (!suffix) suffix = "]" - s = prefix - first = 1 - for (i in values) { - if (first) first = 0 - else s = s sep - if (!noindices) s = s "[" i "]=" - s = s values[i] - } - s = s suffix - return s -} -function array2so(values, prefix, sep, suffix, noindices, count, indices, i, s) { - if (!prefix) prefix = "[" - if (!sep) sep = ", " - if (!suffix) suffix = "]" - s = prefix - count = mkindices(values, indices) - for (i = 1; i <= count; i++) { - if (i > 1) s = s sep - if (!noindices) s = s "[" indices[i] "]=" - s = s values[indices[i]] - } - s = s suffix - return s -} -function array_join(values, sep, prefix, suffix, count, indices, i, s) { - s = prefix - count = mkindices(values, indices) - for (i = 1; i <= count; i++) { - if (i > 1) s = s sep - s = s values[indices[i]] - } - s = s suffix - return s -} -function printto(s, output) { - if (output == "") { - print s - } else if (output ~ /^>>/) { - sub(/^>>/, "", output) - print s >>output - } else if (output ~ /^>/) { - sub(/^>/, "", output) - print s >output - } else { - print s >output - } -} -function find_line(input, field, value, orig, line) { - orig = $0 - line = "" - while ((getline 0) { - if ($field == value) { - line = $0 - break - } - } - close(input) - $0 = orig - return line -} -function merge_line(input, field, key, line) { - line = find_line(input, field, $key) - if (line != "") $0 = $0 FS line -} -function __csv_parse_quoted(line, destl, colsep, qchar, echar, pos, tmpl, nextc, resl) { - line = substr(line, 2) - resl = "" - while (1) { - pos = index(line, qchar) - if (pos == 0) { - resl = resl line - destl[0] = "" - destl[1] = 0 - return resl - } - if (echar != "" && pos > 1) { - prevc = substr(line, pos - 1, 1) - quotec = substr(line, pos, 1) - nextc = substr(line, pos + 1, 1) - if (prevc == echar) { - tmpl = substr(line, 1, pos - 2) - resl = resl tmpl quotec - line = substr(line, pos + 1) - continue - } - tmpl = substr(line, 1, pos - 1) - if (nextc == colsep || nextc == "") { - resl = resl tmpl - destl[0] = substr(line, pos + 2) - destl[1] = nextc == colsep - return resl - } else { - resl = resl tmpl quotec - line = substr(line, pos + 1) - } - } else { - tmpl = substr(line, 1, pos - 1) - quotec = substr(line, pos, 1) - nextc = substr(line, pos + 1, 1) - if (nextc == colsep || nextc == "") { - resl = resl tmpl - destl[0] = substr(line, pos + 2) - destl[1] = nextc == colsep - return resl - } else if (nextc == qchar) { - resl = resl tmpl quotec - line = substr(line, pos + 2) - } else { - resl = resl tmpl quotec - line = substr(line, pos + 1) - } - } - } -} -function __csv_parse_unquoted(line, destl, colsep, qchar, echar, pos) { - pos = index(line, colsep) - if (pos == 0) { - destl[0] = "" - destl[1] = 0 - return line - } else { - destl[0] = substr(line, pos + 1) - destl[1] = 1 - return substr(line, 1, pos - 1) - } -} -function __array_parsecsv(fields, line, nbfields, colsep, qchar, echar, shouldparse, destl, i) { - array_new(fields) - array_new(destl) - i = 1 - shouldparse = 0 - while (shouldparse || line != "") { - if (index(line, qchar) == 1) { - value = __csv_parse_quoted(line, destl, colsep, qchar, echar) - line = destl[0] - shouldparse = destl[1] - } else { - value = __csv_parse_unquoted(line, destl, colsep, qchar, echar) - line = destl[0] - shouldparse = destl[1] - } - fields[i] = value - i = i + 1 - } - if (nbfields) { - nbfields = int(nbfields) - i = array_len(fields) - while (i < nbfields) { - i++ - fields[i] = "" - } - } - return array_len(fields) -} -BEGIN { - DEFAULT_COLSEP = "," - DEFAULT_QCHAR = "\"" - DEFAULT_ECHAR = "" -} -function array_parsecsv2(fields, line, nbfields, colsep, qchar, echar) { - return __array_parsecsv(fields, line, nbfields, colsep, qchar, echar) -} -function array_parsecsv(fields, line, nbfields, colsep, qchar, echar) { - if (colsep == "") colsep = DEFAULT_COLSEP - if (qchar == "") qchar = DEFAULT_QCHAR - if (echar == "") echar = DEFAULT_ECHAR - return __array_parsecsv(fields, line, nbfields, colsep, qchar, echar) -} -function parsecsv(line, fields) { - array_parsecsv(fields, line) - array_getline(fields) - return NF -} -function getlinecsv(file, fields) { - if (file) { - getline 1) line = line colsep - if (qchar != "" && index(value, qchar) != 0) { - if (echar != "") gsub(qchar, quote_subrepl(echar) "&", value); - else gsub(qchar, "&&", value); - } - if (qchar != "" && (index(value, mvsep) != 0 || index(value, colsep) != 0 || index(value, qchar) != 0 || __csv_should_quote(value))) { - line = line qchar value qchar - } else { - line = line value - } - } - return line -} -function array_formatcsv(fields) { - return array_formatcsv2(fields, ",", ";", "\"", "") -} -function array_printcsv(fields, output) { - printto(array_formatcsv(fields), output) -} -function get_formatcsv( fields) { - array_fill(fields) - return array_formatcsv(fields) -} -function formatcsv() { - $0 = get_formatcsv() -} -function printcsv(output, fields) { - array_fill(fields) - array_printcsv(fields, output) -} -function array_findcsv(fields, input, field, value, nbfields, orig, found, i) { - array_new(orig) - array_fill(orig) - array_new(fields) - found = 0 - while ((getline 0) { - array_parsecsv(fields, $0, nbfields) - if (fields[field] == value) { - found = 1 - break - } - } - close(input) - array_getline(orig) - if (!found) { - delete fields - if (nbfields) { - nbfields = int(nbfields) - i = array_len(fields) - while (i < nbfields) { - i++ - fields[i] = "" - } - } - } - return found -} - -function __and(var, x, l_res, l_i) { - l_res=0; - for (l_i=0; l_i < 8; l_i++){ - if (var%2 == 1 && x%2 == 1) l_res=l_res/2 + 128; - else l_res/=2; - var=int(var/2); - x=int(x/2); - } - return l_res; -} -function __lshift(var, x) { - while(x > 0){ - var*=2; - x--; - } - return var; -} -function __rshift(var, x) { - while(x > 0){ - var=int(var/2); - x--; - } - return var; -} -BEGIN { - __BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" -} -function b64decode(src, result, base1, base2, base3, base4) { - result = "" - while (length(src) > 0) { - base1 = substr(src, 1, 1) - base2 = substr(src, 2, 1) - base3 = substr(src, 3, 1); if (base3 == "") base3 = "=" - base4 = substr(src, 4, 1); if (base4 == "") base4 = "=" - byte1 = index(__BASE64, base1) - 1 - if (byte1 < 0) byte1 = 0 - byte2 = index(__BASE64, base2) - 1 - if (byte2 < 0) byte2 = 0 - byte3 = index(__BASE64, base3) - 1 - if (byte3 < 0) byte3 = 0 - byte4 = index(__BASE64, base4) - 1 - if (byte4 < 0) byte4 = 0 - result = result sprintf( "%c", __lshift(__and(byte1, 63), 2) + __rshift(__and(byte2, 48), 4) ) - if (base3 != "=") result = result sprintf( "%c", __lshift(__and(byte2, 15), 4) + __rshift(__and(byte3, 60), 2) ) - if (base4 != "=") result = result sprintf( "%c", __lshift(__and(byte3, 3), 6) + byte4 ) - src = substr(src, 5) - } - return result -} -' -function awkdef() { - - if [ "${1:0:3}" == "-f" ]; then - shift - echo "$__AWKDEF_FUNCTIONS" - fi - if [ $# -gt 0 ]; then - local __ad_arg __ad_vpos __ad_name __ad_value - echo "BEGIN {" - while [ -n "${1:0:1}" ]; do - __ad_arg="${1:0:256}" - local __ad_array= - if [ "${__ad_arg%\[@\]}" != "$__ad_arg" ]; then - __ad_array=1 - __ad_name="${__ad_arg%\[@\]}" - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_value="$__ad_name" - elif [[ "$__ad_arg" == *\[@\]=* ]]; then - __ad_array=1 - __ad_name="${__ad_arg%%\[@\]=*}" - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_vpos=$((${#__ad_name} + 4)) - __ad_value="${1:$__ad_vpos}" - [ ${#__ad_value} -ne 0 ] || __ad_value="$__ad_name" - elif [[ "$__ad_arg" == *=* ]]; then - local __ad_int= __ad_str= - __ad_name="${__ad_arg%%=*}" - __ad_vpos=$((${#__ad_name} + 1)) - if [ "${__ad_name%:int}" != "$__ad_name" ]; then - __ad_int=1 - __ad_name="${__ad_name%:int}" - elif [ "${__ad_name%:str}" != "$__ad_name" ]; then - __ad_str=1 - __ad_name="${__ad_name%:str}" - fi - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_value="${1:$__ad_vpos}" - if [ -n "$__ad_int" ]; then - echo "$__ad_name = int($(quoted_awk "$__ad_value") + 0)" - elif [ -n "$__ad_str" ]; then - echo "$__ad_name = $(quoted_awk "$__ad_value")" - elif [ ${#__ad_value} -lt 256 ] && isnum "$__ad_value"; then - echo "$__ad_name = $__ad_value" - else - echo "$__ad_name = $(quoted_awk "$__ad_value")" - fi - else - break - fi - if [ -n "$__ad_array" ]; then - if [ "${__ad_value:0:2}" == $'<\n' ]; then - local -a __ad_values - array_from_lines __ad_values "${__ad_value:2}" - __ad_value=__ad_values - fi - __ad_value="${__ad_value}[@]" - local __ad_i=1 - echo "$__ad_name[0] = 0; delete $__ad_name" - for __ad_arg in "${!__ad_value}"; do - echo "$__ad_name[$__ad_i]=$(quoted_awk "$__ad_arg")" - __ad_i=$(($__ad_i + 1)) - done - eval "echo \"\${__ad_name}_count = \${#$__ad_value}\"" - fi - shift - done - echo "}" - for __ad_arg in "$@"; do - rawecho "$__ad_arg" - done - fi -} -function lawkrun() { - local -a __ar_defs __ar_args - while [ $# -gt 0 -a "$1" != "--" ]; do - __ar_defs=("${__ar_defs[@]}" "$1") - shift - done - shift - while [ $# -gt 0 ]; do - __ar_args=("${__ar_args[@]}" "$1") - shift - done - local __ar_script="$(awkdef "${__ar_defs[@]}")" - awk "$__ar_script" "${__ar_args[@]}" -} -function cawkrun() { LANG=C lawkrun "$@"; } -function awkrun() { LANG=C lawkrun "$@"; } - -function __lf_get_age() { - local y=$(date "+%Y") - local dy=$(date "+%j"); while [ "${dy#0}" != "$dy" ]; do dy="${dy#0}"; done - [ -n "$dy" ] || dy=0 - local h=$(date "+%H"); while [ "${h#0}" != "$h" ]; do h="${h#0}"; done - [ -n "$h" ] || h=0 - echo $((($y * 365 + $dy) * 24 + $h)) -} -function lf_trylock() { - local eoo lockfile max_hours=4 - while [ -n "$1" ]; do - case "$1" in - -h) shift; max_hours="$1";; - --) shift; eoo=1;; - *) eoo=1;; - esac - [ -n "$eoo" ] && break - shift - done - - lockfile="$1" - [ -n "$lockfile" ] || die "il faut spécifier un fichier pour le verrou" - - local now="$(__lf_get_age)" - if (set -C; echo "$now" >"$lockfile") 2>/dev/null; then - return 0 - fi - local prev diff - if prev="$(<"$lockfile")"; then - diff="$(($now - $prev))" - if [ "$diff" -gt "$max_hours" ]; then - echo stale - else - echo locked - fi - elif [ -f "$lockfile" ]; then - echo retry - fi - return 1 -} -function pidfile_set() { - local eoo pidfile pid=$$ replace= - while [ -n "$1" ]; do - case "$1" in - -p) - shift - pid="$1" - ;; - -r) - replace=1 - ;; - --) - shift - eoo=1 - ;; - *) - eoo=1 - ;; - esac - [ -n "$eoo" ] && break - shift - done - - pidfile="$1" - [ -n "$pidfile" ] || return 10 - - if [ -f "$pidfile" ]; then - local curpid="$(<"$pidfile")" - if is_running "$curpid"; then - return 1 - elif [ -n "$replace" ]; then - /bin/rm -f "$pidfile" || return 10 - else - return 2 - fi - fi - - echo_ "$pid" >"$pidfile" || return 10 - autoclean "$pidfile" - return 0 -} -function pidfile_check() { - local pidfile="$1" - [ -n "$pidfile" ] || return 10 - - if [ -f "$pidfile" ]; then - [ -r "$pidfile" ] || return 10 - local pid="$(<"$pidfile")" - is_running "$pid" && return 0 - fi - return 1 -} -function page_maybe() { - if isatty; then - less -XF "$@" - else - cat - fi -} - - -function utools_local() { - local arg - [ $# -gt 0 ] || set -- opts verbosity interaction - for arg in "$@"; do - case "$arg" in - parse_opts|opts|o|args) echo "local -a args";; - verbosity|v) echo "local __verbosity='$__verbosity'";; - interaction|i) echo "local __interaction='$__interaction'";; - esac - done -} - -function isatty() { - tty -s <&1 -} -function in_isatty() { - tty -s -} -function out_isatty() { - tty -s <&1 -} -function err_isatty() { - tty -s <&2 -} -function die() { [ $# -gt 0 ] && eerror "$@"; exit 1; } -function exit_with { if [ $# -gt 0 ]; then "$@"; fi; exit $?; } -function die_with { [ $# -gt 0 ] && eerror "$1"; shift; [ $# -gt 0 ] && "$@"; exit 1; } -function die_unless() { - local count=$# - if [ $count -eq 0 ]; then - exit 1 - elif [ $count -eq 1 ]; then - "$@" || exit $? - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - : - else - r=$? - eerror "$m" - exit $r - fi - fi -} -function eerror_unless() { - local count=$# - if [ $count -eq 0 ]; then - return 1 - elif [ $count -eq 1 ]; then - "$@" || return $? - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - : - else - r=$? - eerror "$m" - return $r - fi - fi -} -function die_if() { - local count=$# - if [ $count -eq 0 ]; then - : - elif [ $count -eq 1 ]; then - "$@" && exit 1 - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - eerror "$m" - exit 1 - fi - fi -} -function eerror_if() { - local count=$# - if [ $count -eq 0 ]; then - : - elif [ $count -eq 1 ]; then - "$@" && return 1 - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - eerror "$m" - return 1 - fi - fi -} - -TAB=$'\t' -LATIN1=iso-8859-1 -LATIN9=iso-8859-15 -UTF8=utf-8 -OENC="$UTF8" - -if ! progexists iconv; then - function iconv() { cat; } -fi - -function __lang_encoding() { - local lang="$(<<<"$LANG" awk '{ print tolower($0) }')" - case "$lang" in - *@euro) echo "iso-8859-15";; - *.utf-8|*.utf8) echo "utf-8";; - *) echo "iso-8859-1";; - esac -} -function __norm_encoding() { - awk '{ - enc = tolower($0) - gsub(/^latin$/, "latin1", enc) - gsub(/^latin1$/, "iso-8859-1", enc) - gsub(/^latin9$/, "iso-8859-15", enc) - gsub(/[-_]/, "", enc) - if (enc == "iso8859" || enc == "iso88591" || enc == "8859" || enc == "88591") print "iso-8859-1" - else if (enc == "iso885915" || enc == "885915") print "iso-8859-15" - else if (enc == "utf" || enc == "utf8") print "utf-8" - else print $0 - }' <<<"$1" -} -function __init_encoding() { - local DEFAULT_ENCODING="$(__lang_encoding)" - [ -n "$DEFAULT_ENCODING" ] || DEFAULT_ENCODING=utf-8 - [ -n "$UTOOLS_OUTPUT_ENCODING" ] || UTOOLS_OUTPUT_ENCODING="$DEFAULT_ENCODING" - UTOOLS_OUTPUT_ENCODING="$(__norm_encoding "$UTOOLS_OUTPUT_ENCODING")" - [ -n "$UTOOLS_INPUT_ENCODING" ] || UTOOLS_INPUT_ENCODING="$UTOOLS_OUTPUT_ENCODING" - UTOOLS_INPUT_ENCODING="$(__norm_encoding "$UTOOLS_INPUT_ENCODING")" - [ -n "$UTOOLS_EDITOR_ENCODING" ] || UTOOLS_EDITOR_ENCODING="$UTOOLS_INPUT_ENCODING" - UTOOLS_EDITOR_ENCODING="$(__norm_encoding "$UTOOLS_EDITOR_ENCODING")" - - IENC="$UTOOLS_INPUT_ENCODING" - OENC="$UTOOLS_OUTPUT_ENCODING" -} - -if [ -n "$UTOOLS_LANG" -a -z "$LANG" ]; then - export UTOOLS_LANG - export LANG="$UTOOLS_LANG" -fi -__init_encoding - -function tooenc() { - local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - rawecho "$src" - else - iconv -f "$from" -t "$to" <<<"$src" - fi -} -function uecho() { - tooenc "$*" -} -function tooenc_() { - local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - rawecho_ "$src" - else - rawecho_ "$src" | iconv -f "$from" -t "$to" - fi -} -function uecho_() { - tooenc_ "$*" -} -function toienc() { - local __tie_var="$1" __tie_to="${2:-$IENC}" __tie_from="${3:-$UTOOLS_INPUT_ENCODING}" - if [ "$__tie_from" != "$__tie_to" ]; then - set_var "$__tie_var" "$(iconv -f "$__tie_from" -t "$__tie_to" <<<"${!__tie_var}")" - fi -} -function uread() { - [ $# -gt 0 ] || set -- REPLY - local __r_var - read "$@" - for __r_var in "$@"; do - [ -z "$__r_var" -o "${__r_var:0:1}" == "-" ] && continue # ignorer les options - toienc "$__r_var" - done -} - -function stooenc() { - local from="${1:-$OENC}" to="${2:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - cat - else - iconv -f "$from" -t "$to" - fi -} -function stoienc() { - local to="${1:-$IENC}" from="${2:-$UTOOLS_INPUT_ENCODING}" - if [ "$from" == "$to" ]; then - cat - else - iconv -f "$from" -t "$to" - fi -} - -export UTOOLS_EDATE -function __edate() { [ -n "$UTOOLS_EDATE" ] && date +"[%d/%m/%Y-%H:%M:%S] "; } - -export UTOOLS_ELOG_OVERWRITE -function __set_no_colors() { :; } -function elogto() { - UTOOLS_EDATE=1 - if [ -n "$1" -a -n "$2" ]; then - LANG=fr_FR.UTF8 - UTOOLS_OUTPUT_ENCODING="$UTF8" - __set_no_colors 1 - if [ -n "$UTOOLS_ELOG_OVERWRITE" ]; then - exec >"$1" 2>"$2" - else - exec >>"$1" 2>>"$2" - fi - elif [ -n "$1" ]; then - LANG=fr_FR.UTF8 - UTOOLS_OUTPUT_ENCODING="$UTF8" - __set_no_colors 1 - if [ -n "$UTOOLS_ELOG_OVERWRITE" ]; then - exec >"$1" 2>&1 - else - exec >>"$1" 2>&1 - fi - fi -} - -export __estack __tlevel -function __indent() { - if [ "${1/ -/}" != "$1" ]; then - sed "2,\$s/^/${__tlevel}/g" <<<"$1" - else - rawecho "$1" - fi -} -function __eerror() { tooenc "$(__edate)${__tlevel}* error: $(__indent "$1")"; } -function __ewarn() { tooenc "$(__edate)${__tlevel}* warning: $(__indent "$1")"; } -function __enote() { tooenc "$(__edate)${__tlevel}* note: $(__indent "$1")"; } -function __ebanner() { - local maxi="${COLUMNS:-80}" - local -a lines - local psfix line - - psfix="$(__edate)${__tlevel}" - while [ ${#psfix} -lt $maxi ]; do psfix="$psfix="; done - - tooenc "$psfix" - maxi=$(($maxi - 1)) - array_from_xlines lines "$1" - for line in "" "${lines[@]}" ""; do - line="$(__edate)${__tlevel}= $line" - if [ ${#line} -le $maxi ]; then - while [ ${#line} -lt $maxi ]; do line="$line "; done - line="$line=" - fi - tooenc "$line" - done - tooenc "$psfix" -} -function __eimportant() { tooenc "$(__edate)${__tlevel}* important: $(__indent "$1")"; } -function __eattention() { tooenc "$(__edate)${__tlevel}* attention: $(__indent "$1")"; } -function __einfo() { tooenc "$(__edate)${__tlevel}* info: $(__indent "$1")"; } -function __eecho() { tooenc "$(__edate)${__tlevel}$(__indent "$1")"; } -function __eecho_() { tooenc_ "$(__edate)${__tlevel}$(__indent "$1")"; } -function __edebug() { tooenc "$(__edate)${__tlevel}* debug: $(__indent "$1")"; } -function __estep() { tooenc "$(__edate)${__tlevel}* $(__indent "$1")"; } -function __estepe() { __estep "$@"; } -function __estepw() { __estep "$@"; } -function __estepn() { __estep "$@"; } -function __estepi() { __estep "$@"; } -function __estep_() { tooenc_ "$(__edate)${__tlevel}* $(__indent "$1")"; } -function __estepe_() { __estep_ "$@"; } -function __estepw_() { __estep_ "$@"; } -function __estepn_() { __estep_ "$@"; } -function __estepi_() { __estep_ "$@"; } -function __etitle() { tooenc "$(__edate)${__tlevel}+++ $(__indent "$1")"; } -function __ebegin() { tooenc_ "$(__edate)${__tlevel}* $(__indent "$1"): "; } -function __edoto() { echo_ "."; } -function __edotw() { echo_ "w"; } -function __edotx() { echo_ "x"; } -function __edotp() { echo_ "+"; } -function __edotd() { tooenc "($1)"; } -function __eendo() { echo "[ok]"; } -function __eendx() { echo "[error]"; } -PRETTYOPTS=() -function set_verbosity() { :;} -function set_interaction() { :;} -function show_error() { - return 0 -} -function show_warn() { - return 0 -} -function show_info() { - return 0 -} -function show_verbose() { - return 0 -} -function show_debug() { - [ -n "$DEBUG" ] -} -function check_verbosity() { - return 0 -} -function get_verbosity_option() { :;} -function check_interaction() { - return 0 -} -function is_interaction() { - return 1 -} -function get_interaction_option() { :;} -__epending= -function eflush() { - if [ -n "$__epending" ]; then rawecho "$__epending" 1>&2; __epending=; fi -} -function eclearp() { - __epending= -} -function eerror() { - show_error || return; eflush; __eerror "$*" 1>&2 -} -function ewarn() { - show_warn || return; eflush; __ewarn "$*" 1>&2 -} -function enote() { - show_info || return; eflush; __enote "$*" 1>&2 -} -function ebanner() { - show_error || return; eflush; __ebanner "$*" 1>&2; sleep 5 -} -function eimportant() { - show_error || return; eflush; __eimportant "$*" 1>&2 -} -function eattention() { - show_warn || return; eflush; __eattention "$*" 1>&2 -} -function einfo() { - show_info || return; eflush; __einfo "$*" 1>&2 -} -function eecho() { - show_info || return; eflush; __eecho "$*" 1>&2 -} -function eecho_() { - show_info || return; eflush; __eecho_ "$*" 1>&2 -} -function edebug() { - show_debug || return; eflush; __edebug "$*" 1>&2 -} -function trace() { - local r cmd="$(quoted_args "$@")" - show_info && { eflush; __eecho "\$ $cmd" 1>&2; } - "$@"; r=$? - if [ $r -ne 0 ]; then - if show_info; then - eflush; __eecho "^ [EC #$r]" 1>&2 - elif show_error; then - eflush; __eecho "^ $cmd [EC #$r]" 1>&2; - fi - fi - return $r -} -function trace_error() { - local r - "$@"; r=$? - if [ $r -ne 0 ]; then - local cmd="$(quoted_args "$@")" - show_error && { eflush; __eecho "^ $cmd [EC #$r]" 1>&2; } - fi - return $r -} - -function etitle() { - local __t_deferred= - __t_etitle "$@" -} -function etitled() { - local __t_deferred=1 - __t_etitle "$@" -} -function __t_etitle() { - local __t_eend=default - local __t_clearp= - while [ -n "$1" ]; do - if [ "$1" == "--" ]; then - shift - break - elif [ "$1" == "-s" ]; then - __t_eend= - shift - elif [ "$1" == "--eend" ]; then - __t_eend=1 - shift - elif [ "$1" == "-p" ]; then - __t_clearp=1 - shift - else - break - fi - done - local __t_title="$1"; shift - local __t_s=0 - [ -n "$__estack" ] && __tlevel="${__tlevel} " - __estack="$__estack:t" - if show_info; then - if [ -n "$__t_deferred" ]; then - __epending="${__epending:+$__epending -}$(__etitle "$__t_title")" - else - eflush - __etitle "$__t_title" 1>&2 - fi - fi - if [ $# -gt 0 ]; then - "$@" - __t_s=$? - [ "$__t_eend" == "default" ] && __t_eend=1 - fi - [ "$__t_eend" == "default" ] && __t_eend= - if [ -n "$__t_eend" ]; then - eend $__t_s - [ -n "$__t_clearp" ] && eclearp - fi - return $__t_s -} -function estep() { - show_info || return; eflush; __estep "$*" 1>&2 -} -function estepe() { - show_info || return; eflush; __estepe "$*" 1>&2 -} -function estepw() { - show_info || return; eflush; __estepw "$*" 1>&2 -} -function estepn() { - show_info || return; eflush; __estepn "$*" 1>&2 -} -function estepi() { - show_info || return; eflush; __estepi "$*" 1>&2 -} -function estep_() { - show_info || return; eflush; __estep_ "$*" 1>&2 -} -function estepe_() { - show_info || return; eflush; __estepe_ "$*" 1>&2 -} -function estepw_() { - show_info || return; eflush; __estepw_ "$*" 1>&2 -} -function estepn_() { - show_info || return; eflush; __estepn_ "$*" 1>&2 -} -function estepi_() { - show_info || return; eflush; __estepi_ "$*" 1>&2 -} -function ebegin() { - local __b_eend=default - while [ -n "$1" ]; do - if [ "$1" == "--" ]; then - shift - break - elif [ "$1" == "-s" ]; then - __b_eend= - shift - elif [ "$1" == "--eend" ]; then - __b_eend=1 - shift - else - break - fi - done - local __b_msg="$1"; shift - local __b_s=0 - __estack="$__estack:b" - if show_info; then - eflush - __ebegin "$__b_msg" 1>&2 - fi - if [ $# -gt 0 ]; then - "$@" - __b_s=$? - [ "$__b_eend" == "default" ] && __b_eend=1 - fi - [ "$__b_eend" == "default" ] && __b_eend= - [ -n "$__b_eend" ] && eend $__b_s - return $__b_s -} -function edot() { - local s=$? - show_info || return - eflush - [ -n "$1" ] && s="$1" - shift - if [ "$s" == "0" ]; then - __edoto 1>&2 - else - __edotx 1>&2 - fi - show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2 - return $s -} -function edotw() { - local s=$? - show_info || return - eflush - [ -n "$1" ] && s="$1" - shift - __edotw 1>&2 - show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2 - return $s -} -function ewait() { - [ -n "$1" ] || return 1 - if show_info; then - local count=2 - eflush - little_sleep # certains processus retournent tout de suite - while is_running "$1"; do - sleep 1 - if [ $count -gt 0 ]; then - count=$(($count - 1)) - else - __edotp 1>&2 - fi - done - __edoto 1>&2 - else - wait "$1" - fi -} -function eend() { - local s=$? - if [ "$1" == "-c" ]; then - __estack= - __tlevel= - elif [ "${__estack%:b}" != "$__estack" ]; then - __estack="${__estack%:b}" - show_info || return - eflush - [ -n "$1" ] && s="$1" - if [ "$s" == "0" ]; then - __eendo 1>&2 - else - __eendx 1>&2 - fi - elif [ "${__estack%:t}" != "$__estack" ]; then - __estack="${__estack%:t}" - __tlevel="${__tlevel% }" - fi -} -function ask_yesno() { - local interactive=1 - if [[ "$1" == -* ]]; then - if [ "$1" != -- ]; then - check_interaction "$1" || interactive= - fi - shift - else - check_interaction -c || interactive= - fi - local default="${2:-N}" - if [ "$default" == "C" ]; then - [ -n "$interactive" ] && default=N || default=O - elif [ "$default" == "X" ]; then - [ -n "$interactive" ] && default=O || default=N - fi - if [ -n "$interactive" ]; then - eflush - local message="$1" - local prompt="[oN]" - local r - is_yes "$default" && prompt="[On]" - if [ -n "$message" ]; then - tooenc_ "$message" 1>&2 - else - tooenc_ "Voulez-vous continuer?" "$UTF8" 1>&2 - fi - tooenc_ " $prompt " "$UTF8" 1>&2 - uread r - is_yes "${r:-$default}" - else - is_yes "$default" - fi -} -function read_value() { - local -a __rv_opts __rv_readline=1 __rv_showdef=1 __rv_nl= - __rv_opts=() - [ -n "$UTOOLS_NO_READLINE" ] && __rv_readline= - __rv_read "$@" -} -function read_password() { - local -a __rv_opts __rv_readline= __rv_showdef= __rv_nl=1 - __rv_opts=(-s) - __rv_read "$@" -} -function __rv_read() { - local __rv_int=1 - if [[ "$1" == -* ]]; then - if [ "$1" != -- ]; then - check_interaction "$1" || __rv_int= - fi - shift - else - check_interaction -c || __rv_int= - fi - local __rv_msg="$1" __rv_v="${2:-value}" __rv_d="$3" __rv_re="${4:-O}" - if [ -z "$__rv_int" ]; then - if is_yes "$__rv_re" && [ -z "$__rv_d" ]; then - OENC="$UTF8" eerror "La valeur par défaut de $__rv_v doit être non vide" - return 1 - fi - set_var "$__rv_v" "$__rv_d" - return 0 - fi - - eflush - local __rv_r - while true; do - if [ -n "$__rv_msg" ]; then - tooenc_ "$__rv_msg" 1>&2 - else - tooenc_ "Entrez la valeur" "$UTF8" 1>&2 - fi - if [ -n "$__rv_readline" ]; then - tooenc_ ": " "$UTF8" 1>&2 - uread -e ${__rv_d:+-i"$__rv_d"} "${__rv_opts[@]}" __rv_r - else - if [ -n "$__rv_d" ]; then - if [ -n "$__rv_showdef" ]; then - tooenc_ " [$__rv_d]" 1>&2 - else - tooenc_ " [****]" 1>&2 - fi - fi - tooenc_ ": " "$UTF8" 1>&2 - uread "${__rv_opts[@]}" __rv_r - [ -n "$__rv_nl" ] && echo - fi - __rv_r="${__rv_r:-$__rv_d}" - if [ -n "$__rv_r" ] || ! is_yes "$__rv_re"; then - set_var "$__rv_v" "$__rv_r" - return 0 - fi - done -} -function simple_menu() { - local __sm_title= __sm_yourchoice= __sm_default= - local -a __sm_args - parse_opts -t: __sm_title= -m: __sm_yourchoice= -d: __sm_default= @ __sm_args -- "$@" && - set -- "${__sm_args[@]}" || ewarn "$__sm_args" - - local __sm_option_var="${1:-option}" __sm_options_var="${2:-options}" - local __sm_option __sm_options - __sm_options="$__sm_options_var[*]" - if [ -z "${!__sm_options}" ]; then - OENC="$UTF8" eerror "Le tableau $__sm_options_var doit être non vide" - return 1 - fi - [ -z "$__sm_default" ] && __sm_default="${!__sm_option_var}" - - eflush - array_copy __sm_options "$__sm_options_var" - local __sm_c=0 __sm_i __sm_choice - while true; do - if [ "$__sm_c" == "0" ]; then - [ -n "$__sm_title" ] && tooenc "=== $__sm_title ===" 1>&2 - __sm_i=1 - for __sm_option in "${__sm_options[@]}"; do - if [ "$__sm_option" == "$__sm_default" ]; then - tooenc "$__sm_i*- $__sm_option" 1>&2 - else - tooenc "$__sm_i - $__sm_option" 1>&2 - fi - let __sm_i=$__sm_i+1 - done - fi - - if [ -n "$__sm_yourchoice" ]; then - tooenc_ "$__sm_yourchoice" 1>&2 - else - tooenc_ "Entrez le numéro de l'option choisie" "$UTF8" 1>&2 - fi - tooenc_ ": " "$UTF8" 1>&2 - uread __sm_choice - - if [ -z "$__sm_choice" -a -n "$__sm_default" ]; then - __sm_option="$__sm_default" - break - fi - if [ -n "$__sm_choice" -a -z "${__sm_choice//[0-9]/}" ]; then - if [ "$__sm_choice" -gt 0 -a "$__sm_choice" -le "${#__sm_options[*]}" ]; then - __sm_option="${__sm_options[$(($__sm_choice - 1))]}" - break - else - OENC="$UTF8" eerror "Numéro d'option incorrect" - fi - else - OENC="$UTF8" eerror "Vous devez saisir le numéro de l'option choisie" - fi - - let __sm_c=$__sm_c+1 - if [ "$__sm_c" -eq 5 ]; then - tooenc "" "$UTF8" 1>&2 - __sm_c=0 - fi - done - set_var "$__sm_option_var" "$__sm_option" -} - -function actions_menu() { - local -a __am_action_descs __am_options __am_void_actions - local __am_tmp __am_select_action __am_select_option __am_title __am_optyc __am_actyc - local __am_default_action=auto __am_quit_action=auto - local __am_default_option= - local -a __am_args - parse_opts \ - -t: __am_title= \ - -m: __am_optyc= \ - -M: __am_actyc= \ - -e: __am_void_actions \ - -d: __am_default_action= \ - -q: __am_quit_action= \ - -o: __am_default_option= \ - @ __am_args -- "$@" && set -- "${__am_args[@]}" || { eerror "$__am_args"; return 1; } - - __am_tmp="${1:-action}"; __am_select_action="${!__am_tmp}" - __am_tmp="${2:-option}"; __am_select_option="${!__am_tmp}" - [ -n "$__am_default_option" ] && __am_select_option="$__am_default_option" - array_copy __am_action_descs "${3:-actions}" - array_copy __am_options "${4:-options}" - - eerror_unless [ ${#__am_action_descs[*]} -gt 0 ] "Vous devez spécifier le tableau des actions" || return - __actions_menu || return 1 - setv "${1:-action}" "$__am_select_action" - setv "${2:-option}" "$__am_select_option" -} -function __actions_menu() { - local title="$__am_title" - local optyc="$__am_optyc" actyc="$__am_actyc" - local default_action="$__am_default_action" - local quit_action="$__am_quit_action" - local select_action="$__am_select_action" - local select_option="$__am_select_option" - local -a action_descs options void_actions - array_copy action_descs __am_action_descs - array_copy options __am_options - array_copy void_actions __am_void_actions - - local no_options - array_isempty options && no_options=1 - - local -a actions - local tmp action name - for tmp in "${action_descs[@]}"; do - splitfsep2 "$tmp" : action name - [ -n "$action" ] || action="${name:0:1}" - action="$(strlower "$action")" - array_addu actions "$action" - done - - if [ "$default_action" == auto ]; then - default_action="$select_action" - if [ -n "$default_action" ]; then - array_contains actions "$default_action" || default_action= - fi - [ -n "$default_action" ] || default_action="${actions[0]}" - fi - default_action="${default_action:0:1}" - default_action="$(strlower "$default_action")" - - if [ "$quit_action" == auto ]; then - if [ ${#actions[*]} -gt 1 ]; then - quit_action="${actions[@]:$((-1)):1}" - array_addu void_actions "$quit_action" - fi - fi - quit_action="${quit_action:0:1}" - quit_action="$(strlower "$quit_action")" - - local action_title - for tmp in "${action_descs[@]}"; do - splitfsep2 "$tmp" : action name - [ -n "$action" ] || action="${name:0:1}" - [ -n "$name" ] || name="$action" - action="$(strlower "$action")" - if [ -n "$no_options" ]; then - if ! array_contains void_actions "$action"; then - array_del actions "$action" - continue - fi - fi - [ "$action" == "$default_action" ] && name="$name*" - action_title="${action_title:+$action_title/}$name" - done - if [ -n "$default_action" ]; then - array_contains actions "$default_action" || default_action= - fi - if [ -n "$quit_action" ]; then - array_contains actions "$quit_action" || quit_action= - fi - - if [ -n "$no_options" ]; then - if array_isempty void_actions; then - eerror "Aucune option n'est définie. Il faut définir le tableau des actions vides" - return 1 - fi - __void_actions_menu - else - __options_actions_menu - fi -} -function __void_actions_menu() { - eflush - local c=0 choice - while true; do - if [ $c -eq 0 ]; then - [ -n "$title" ] && __etitle "$title" 1>&2 - __eecho_ "=== Actions disponibles: " 1>&2 - tooenc "$action_title" 1>&2 - fi - if [ -n "$actyc" ]; then - __eecho_ "$actyc" 1>&2 - elif [ -n "$optyc" ]; then - __eecho_ "$optyc" 1>&2 - else - __eecho_ "Entrez l'action à effectuer" 1>&2 - fi - tooenc_ ": " 1>&2 - uread choice - if [ -z "$choice" -a -n "$default_action" ]; then - select_action="$default_action" - break - fi - - choice="${choice:0:1}" - choice="$(strlower "$choice")" - if array_contains actions "$choice"; then - select_action="$choice" - break - elif [ -n "$choice" ]; then - eerror "$choice: action incorrecte" - else - eerror "vous devez saisir l'action à effectuer" - fi - let c=$c+1 - if [ $c -eq 5 ]; then - tooenc "" 1>&2 - c=0 - fi - done - __am_select_action="$select_action" - __am_select_option= -} -function __options_actions_menu() { - eflush - local c=0 option choice action option - while true; do - if [ $c -eq 0 ]; then - [ -n "$title" ] && __etitle "$title" 1>&2 - i=1 - for option in "${options[@]}"; do - if [ "$option" == "$select_option" ]; then - tooenc "$i*- $option" 1>&2 - else - tooenc "$i - $option" 1>&2 - fi - let i=$i+1 - done - __estepn_ "Actions disponibles: " 1>&2 - tooenc "$action_title" 1>&2 - fi - if [ -n "$optyc" ]; then - __eecho_ "$optyc" 1>&2 - else - __eecho_ "Entrez l'action et le numéro de l'option choisie" 1>&2 - fi - tooenc_ ": " 1>&2 - uread choice - - if [ -z "$choice" -a -n "$default_action" ]; then - action="$default_action" - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - elif [ -n "$select_option" ]; then - select_action="$action" - break - fi - fi - action="${choice:0:1}" - action="$(strlower "$action")" - if array_contains actions "$action"; then - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - else - option="${choice:1}" - option="${option// /}" - if [ -z "$option" -a -n "$select_option" ]; then - select_action="$action" - break - elif [ -z "$option" ]; then - eerror "vous devez saisir le numéro de l'option" - elif isnum "$option"; then - if [ $option -gt 0 -a $option -le ${#options[*]} ]; then - select_action="$action" - select_option="${options[$(($option - 1))]}" - break - fi - else - eerror "$option: numéro d'option incorrecte" - fi - fi - elif isnum "$choice"; then - action="$default_action" - if [ -n "$action" ]; then - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - else - option="${choice// /}" - if [ -z "$option" ]; then - eerror "vous devez saisir le numéro de l'option" - elif isnum "$option"; then - if [ $option -gt 0 -a $option -le ${#options[*]} ]; then - select_action="$action" - select_option="${options[$(($option - 1))]}" - break - fi - else - eerror "$option: numéro d'option incorrecte" - fi - fi - else - eerror "Vous devez spécifier l'action à effectuer" - fi - elif [ -n "$choice" ]; then - eerror "$choice: action et/ou option incorrecte" - else - eerror "vous devez saisir l'action à effectuer" - fi - let c=$c+1 - if [ $c -eq 5 ]; then - tooenc "" 1>&2 - c=0 - fi - done - __am_select_action="$select_action" - __am_select_option="$select_option" -} - - -function __ac_forgetall() { __ac_files=(); } -__ac_forgetall -function __ac_trap() { - local file - for file in "${__ac_files[@]}"; do - [ -e "$file" ] && rm -rf "$file" 2>/dev/null - done - __ac_forgetall -} -trap __ac_trap 1 3 15 EXIT -function autoclean() { - local file - for file in "$@"; do - [ -n "$file" ] && array_add __ac_files "$file" - done -} -function ac_cleanall() { - __ac_trap -} -function ac_clean() { - local file - for file in "$@"; do - if array_contains __ac_files "$file"; then - [ -e "$file" ] && rm -rf "$file" 2>/dev/null - array_del __ac_files "$file" - fi - done -} -function ac_set_tmpfile() { - local __acst_d - if show_debug; then - if [ -n "$5" ]; then - is_yes "${!5}" && __acst_d=1 - else - __acst_d=1 - fi - fi - if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" - [ -f "$3" -a "$4" == keep ] || >"$3" - else - local __acst_t="$(mktempf "$2")" - autoclean "$__acst_t" - set_var "$1" "$__acst_t" - fi -} -function ac_set_tmpdir() { - local __acst_d - if show_debug; then - if [ -n "$4" ]; then - is_yes "${!4}" && __acst_d=1 - else - __acst_d=1 - fi - fi - if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" - mkdir -p "$3" - else - local __acst_t="$(mktempd "$2")" - autoclean "$__acst_t" - set_var "$1" "$__acst_t" - fi -} -function debug_tee() { - if show_debug; then - tee "$@" - else - cat - fi -} - - -function get_defaults_files() { - local __gd_dest="${1:-defaults}"; shift - local -a __gd_fs - local __gd_f __gd_found - for __gd_f in "$@"; do - __gd_found= - if [ -r "/etc/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "/etc/default/$__gd_f") - __gd_found=1 - fi - if [ -r "$HOME/etc/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "$HOME/etc/default/$__gd_f") - __gd_found=1 - fi - if [ -z "$__gd_found" -a -r "$scriptdir/lib/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "$scriptdir/lib/default/$__gd_f") - fi - done - array_copy "$__gd_dest" __gd_fs -} - -function set_defaults() { - local -a __sd_fs - local __sd_f - get_defaults_files __sd_fs "$@" - for __sd_f in "${__sd_fs[@]}"; do - source "$__sd_f" - done -} - - : "${MYHOST:=$HOSTNAME}" : "${MYHOSTNAME:=${MYHOST%%.*}}" export MYHOST MYHOSTNAME @@ -33208,9 +7375,9 @@ urequire base SYSNAMES=(linux linux64 linux32 linuxppc64 linuxppc32 linuxarm macosx) -linux_SYSDISTS=(debianlike debian ubuntu redhatlike rhel fedora centos suse gentoo) -linux32_SYSDISTS=(debianlike debian ubuntu redhatlike rhel fedora centos suse gentoo) -linux64_SYSDISTS=(debianlike debian ubuntu redhatlike rhel fedora centos suse gentoo) +linux_SYSDISTS=(debianlike debian ubuntu redhatlike ol rhel fedora centos suse gentoo) +linux32_SYSDISTS=(debianlike debian ubuntu redhatlike ol rhel fedora centos suse gentoo) +linux64_SYSDISTS=(debianlike debian ubuntu redhatlike ol rhel fedora centos suse gentoo) linuxppc32_SYSDISTS=(debianlike debian ubuntu redhatlike fedora) linuxppc64_SYSDISTS=(debianlike debian ubuntu redhatlike fedora) linuxarm_SYSDISTS=(debianlike debian ubuntu) @@ -33222,6 +7389,7 @@ debianlike_SYSVERS=() debian_SYSVERS=(stretch jessie wheezy squeeze lenny etch) ubuntu_SYSVERS=(oneiric natty maverick lucid karmic jaunty intrepid hardy) redhatlike_SYSVERS=() +ol_SYSVERS=(ol7 ol6 redhat7 redhat6) rhel_SYSVERS=(rhel7 rhel6 rhel5 rhel4 redhat7 redhat6 redhat5 redhat4) fedora_SYSVERS=(fedora14 fedora13 fedora12 fedora11) centos_SYSVERS=(centos7 centos6 centos5 centos4 redhat7 redhat6 redhat5 redhat4) @@ -33259,6 +7427,7 @@ function __compute_local_sysinfos_data() { "$UNAME_MACHINE" "$([ -f /etc/debian_version ] && cat /etc/debian_version)" "$([ -f /etc/gentoo-release ] && cat /etc/gentoo-release)" + "$([ -f /etc/oracle-release ] && cat /etc/oracle-release)" "$([ -f /etc/redhat-release ] && cat /etc/redhat-release)" "$([ -f /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Resources/version.plist ] && cat /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Resources/version.plist)" "$([ -f /System/Library/Frameworks/CoreServices.framework/Resources/version.plist ] && cat /System/Library/Frameworks/CoreServices.framework/Resources/version.plist)" @@ -33274,6 +7443,8 @@ echo .----------------. echo .----------------. [ -f /etc/gentoo-release ] && cat /etc/gentoo-release echo .----------------. +[ -f /etc/oracle-release ] && cat /etc/oracle-release +echo .----------------. [ -f /etc/redhat-release ] && cat /etc/redhat-release echo .----------------. [ -f /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Resources/version.plist ] && cat /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Resources/version.plist @@ -33312,10 +7483,14 @@ function __compute_sysinfos() { local machine="${SYSINFOS_DATA[1]}" local debian_version="${SYSINFOS_DATA[2]}" local gentoo_release="${SYSINFOS_DATA[3]}" - local redhat_release="${SYSINFOS_DATA[4]}" - local macosx_plist1="${SYSINFOS_DATA[5]}" - local macosx_plist2="${SYSINFOS_DATA[6]}" + local oracle_release="${SYSINFOS_DATA[4]}" + local redhat_release="${SYSINFOS_DATA[5]}" + local macosx_plist1="${SYSINFOS_DATA[6]}" + local macosx_plist2="${SYSINFOS_DATA[7]}" + MYSYSNAME=(unknown) + MYSYSDIST=(unknown) + MYSYSVER=(unknown) if [ "$system" == "Linux" ]; then case "$machine" in x86_64) MYSYSNAME=(linux64 linux); MYBITS=64;; @@ -33337,6 +7512,12 @@ function __compute_sysinfos() { esac elif [ -n "$gentoo_release" ]; then MYSYSDIST=(gentoo) + elif [ -n "$oracle_release" ]; then + MYSYSDIST=(ol rhel redhatlike) + case "$oracle_release" in + Oracle*Linux*release\ 7*) MYSYSVER=(ol7 rhel7 redhat7);; + Oracle*Linux*release\ 6*) MYSYSVER=(ol6 rhel6 redhat6);; + esac elif [ -n "$redhat_release" ]; then case "$redhat_release" in Fedora*) MYSYSDIST=(fedora redhatlike);; @@ -33370,13 +7551,14 @@ s/<\/string>.*$//g' done } MYSYSNAME=(macosx darwin) - case "$(get_macosx_version)" in + case "$(get_macosx_version "$macosx_plist1" "$macosx_plist2")" in 10.7*) MYSYSDIST=(lion);; 10.6*) MYSYSDIST=(snowleopard);; 10.5*) MYSYSDIST=(leopard);; 10.4*) MYSYSDIST=(tiger);; 10.3*) MYSYSDIST=(panther);; esac + MYSYSVER=() fi } @@ -33445,8 +7627,8 @@ function __fix_sysinfos_upward() { array_copy sysvers_ "${sysdist_}_SYSVERS" for sysver_ in "${sysvers_[@]}"; do if [ "$sysver_" == "${!sysvervar_}" ]; then - set_var "$sysdistvar_" "$sysdist_" - set_var "$sysnamevar_" "$sysname_" + _setv "$sysdistvar_" "$sysdist_" + _setv "$sysnamevar_" "$sysname_" return fi done @@ -33458,7 +7640,7 @@ function __fix_sysinfos_upward() { array_copy sysdists_ "${sysname_}_SYSDISTS" for sysdist_ in "${sysdists_[@]}"; do if [ "$sysdist_" == "${!sysdistvar_}" ]; then - set_var "$sysnamevar_" "$sysname_" + _setv "$sysnamevar_" "$sysname_" return fi done @@ -33473,7 +7655,7 @@ function __fix_sysinfos_downward() { if [ -z "${!sysdistvar_}" ]; then array_copy sysdists_ "${!sysnamevar_}_SYSDISTS" for sysdist_ in "${sysdists_[@]}"; do - set_var "$sysdistvar_" "$sysdist_" + _setv "$sysdistvar_" "$sysdist_" break done fi @@ -33482,7 +7664,7 @@ function __fix_sysinfos_downward() { if [ -z "${!sysvervar_}" ]; then array_copy sysvers_ "${sysdistvar_}_SYSVERS" for sysver_ in "${sysvers_[@]}"; do - set_var "$sysvervar_" "$sysver_" + _setv "$sysvervar_" "$sysver_" break done fi @@ -33491,12 +7673,23 @@ function ensure_sysinfos() { local sysnamevar_="${1:-SYSNAME}" local sysdistvar_="${2:-SYSDIST}" local sysvervar_="${3:-SYSVER}" - [ -n "${!sysdistvar_}" ] && set_var "$sysdistvar_" "$(__get_sysdist_alias "${!sysdistvar_}")" - [ -n "${!sysvervar_}" ] && set_var "$sysvervar_" "$(__get_sysver_alias "${!sysvervar_}")" + [ -n "${!sysdistvar_}" ] && _setv "$sysdistvar_" "$(__get_sysdist_alias "${!sysdistvar_}")" + [ -n "${!sysvervar_}" ] && _setv "$sysvervar_" "$(__get_sysver_alias "${!sysvervar_}")" __fix_sysinfos_upward __fix_sysinfos_downward } +function dump_sysinfos() { + local sysname_="${1:-MYSYSNAME}[*]" + local sysdist_="${2:-MYSYSDIST}[*]" + local sysver_="${3:-MYSYSVER}[*]" + echo "\ +sysname=(${!sysname_}) +sysdist=(${!sysdist_}) +sysver=(${!sysver_}) +bits=$MYBITS" +} + function get_sysinfos_desc() { local sysname_="${1:-MYSYSNAME}"; sysname_="${!sysname_}" local sysdist_="${2:-MYSYSDIST}"; sysdist_="${!sysdist_}" @@ -33632,6 +7825,24 @@ function check_sysinfos() { return $r_ } +function unsupported_system() { + local msg="Ce script n'est pas supporté sur $(get_sysinfos_desc)" + [ -n "$*" ] && msg="$msg +Il faut au moins l'un des systèmes suivants: $*" + die "$msg" +} + +function require_sysinfos() { + check_sysinfos "$@" && return 0 + local -a infos; local info + for info in "$@"; do + if ! [[ "$info" == -* ]]; then + infos=("${infos[@]}" "$info") + fi + done + unsupported_system "${infos[@]}" +} + function on_debian() { NUTOOLS_ON_DEBIAN= if check_sysinfos -d debian; then @@ -33916,7 +8127,7 @@ if check_sysinfos -s macosx; then done args=("${args[@]}" "$@") fi - quoted_args "${options[@]}" -- "${args[@]}" + qvals "${options[@]}" -- "${args[@]}" return 0 } @@ -34093,7 +8304,9 @@ function ctnow() { __CTRESOLVE_CTNOW="" function ctresolve() { local -a ctnow - if [ -n "$__CTRESOLVE_CTNOW" ]; then + if [ "$__CTRESOLVE_CTNOW" == "**ANY**" ]; then + ctnow=("$__CTRESOLVE_CTNOW") + elif [ -n "$__CTRESOLVE_CTNOW" ]; then eval "ctnow=($__CTRESOLVE_CTNOW)" else eval "ctnow=($(ctnow))" @@ -34129,6 +8342,8 @@ function ctmatch_one(ctval, ref, parts, part, i, j, start, end, ste return ok } function ctmatch_all(M, H, dom, mon, dow, refM, refH, refdom, refmon, refdow, Mok, Hok, domok, monok, dowok) { + if (refM == "**ANY**") return 1 + gsub(/\*/, "0-59", M) Mok = ctmatch_one(M, refM) @@ -34376,7 +8591,7 @@ EOF } [ -n "$host" ] && undocmd=("${undocmd[@]}" -H "$host") undocmd=("${undocmd[@]}" "$ctline") - echo "$(quoted_args "${undocmd[@]}") || allok=" >>"$undoscript" + echo "$(qvals "${undocmd[@]}") || allok=" >>"$undoscript" } function get_time() { @@ -34442,10 +8657,10 @@ $cmd"' if [ -n "$fake" ]; then if [ -n "$cmd" ]; then - eecho "$action $(quoted_args "$(update_cmd "$ctline" "$tmpcmd:")") + eecho "$action $(qvals "$(update_cmd "$ctline" "$tmpcmd:")") $(sed 's/^/ /g' <<<"$cmd")" else - eecho "$action $(quoted_args "$ctline")" + eecho "$action $(qvals "$ctline")" fi elif "$action" "$ctline" "$user"; then estep "$action $ctline" @@ -34490,16 +8705,16 @@ function do_remote() { else ssh_user="$user" fi - ssh_cmd="$(quoted_args chmod +x "$remotename"); $(quoted_args "./$remotename" --autoclean "$remotename" "$actionopt" -u "$user" --dom "$dom" --month "$month" ${cmd:+-s "$cmdfile" -S "$cmd"} "$ctline"); true" + ssh_cmd="$(qvals chmod +x "$remotename"); $(qvals "./$remotename" --autoclean "$remotename" "$actionopt" -u "$user" --dom "$dom" --month "$month" ${cmd:+-s "$cmdfile" -S "$cmd"} "$ctline"); true" [ -z "$fake" ] && etitle -s "$host" ok= if [ -n "$fake" ]; then if [ -n "$cmd" ]; then - eecho "[$host] $action $(quoted_arg "$(update_cmd "$ctline" "$cmdfile:")") + eecho "[$host] $action $(qvalm "$(update_cmd "$ctline" "$cmdfile:")") $(sed 's/^/ /g' <<<"$cmd")" else - eecho "[$host] $action $(quoted_arg "$ctline")" + eecho "[$host] $action $(qvalm "$ctline")" fi ok=1 elif scp -o ConnectTimeout=5 -q "$script" "$ssh_user@$host:$remotename"; then diff --git a/udist b/udist index 5ec2755..01eae77 100755 --- a/udist +++ b/udist @@ -237,10 +237,10 @@ function __load_udist_nolocal() { ( [ -d "$udistf" ] && udistf="$udistf/.udist" source "$udistf" - set_var_cmd "${2}VERSION" "$VERSION" + echo_setv "${2}VERSION" "$VERSION" set_array_cmd "${2}VERSIONS" VERSIONS set_array_cmd "${2}TAGS" TAGS - set_var_cmd "${2}ORIGIN" "$ORIGIN" + echo_setv "${2}ORIGIN" "$ORIGIN" set_array_cmd "${2}LOCALS" LOCALS ); } @@ -264,10 +264,10 @@ function __save_udist() { splitpair "$__su_dest" __su_dest __su_varname [ -n "$__su_varname" ] || __su_varname="$__su_dest" case "$__su_dest" in - VERSION) array_add __su_cmd "$(set_var_cmd VERSION "${!__su_varname}")";; + VERSION) array_add __su_cmd "$(echo_setv VERSION "${!__su_varname}")";; VERSIONS) array_add __su_cmd "$(set_array_cmd VERSIONS "${__su_varname}")";; TAGS) array_add __su_cmd "$(set_array_cmd TAGS "${__su_varname}")";; - ORIGIN) array_add __su_cmd "$(set_var_cmd ORIGIN "${!__su_varname}")";; + ORIGIN) array_add __su_cmd "$(echo_setv ORIGIN "${!__su_varname}")";; LOCALS) array_add __su_cmd "$(set_array_cmd LOCALS "${__su_varname}")";; esac done @@ -1306,7 +1306,7 @@ function local_put_cmd() { local script= for localfile in "${localfiles[@]}"; do [ -n "$script" ] && script="$script; " - script="$script$(quoted_args chown "$owner" "$destdir/$localfile")" + script="$script$(qvals chown "$owner" "$destdir/$localfile")" done "${ssh:-ssh}" -qt "$userhost:$destdir" "$script" fi diff --git a/uldap b/uldap index befeb1d..6d5cdef 100755 --- a/uldap +++ b/uldap @@ -41,7 +41,7 @@ function split_cmds() { fi done if [ -n "$__sc_addtocmd" ]; then - __sc_cmd="${__sc_cmd:+$__sc_cmd }$(quoted_arg "$__sc_arg")" + __sc_cmd="${__sc_cmd:+$__sc_cmd }$(qvalm "$__sc_arg")" __sc_arg= fi if [ -n "$__sc_foundsep" ]; then @@ -150,7 +150,7 @@ function set_values() { if array_contains VARIABLES "$uname" || array_contains SPECIAL_VARIABLES "$uname"; then "set_$lname" "$value" || s=1 elif ! array_contains PROTECTED_VARIABLES "$name"; then - set_var "$name" "$value" + _setv "$name" "$value" else s=1 fi @@ -321,7 +321,7 @@ function __push() { local __varcmd __name for __name in "$@"; do __varcmd="${__varcmd:+$__varcmd -}$(set_var_cmd "$__name" "${!__name}")" +}$(echo_setv "$__name" "${!__name}")" done WSSTACK=("${WSSTACK[@]}" "$__varcmd") } @@ -1349,7 +1349,7 @@ function uldap_undo() { function uldap_ifok() { if [ "$EXITCODE" -eq 0 ]; then - eval_cmdline "$(quoted_args "$@")" + eval_cmdline "$(qvals "$@")" else return 0 fi @@ -1357,7 +1357,7 @@ function uldap_ifok() { function uldap_iferror() { if [ "$EXITCODE" -ne 0 ]; then - eval_cmdline "$(quoted_args "$@")" + eval_cmdline "$(qvals "$@")" else return 0 fi @@ -1464,7 +1464,7 @@ if [ -n "$*" ]; then INTERACTIVE= [ "$EXIT_ON_ERROR" == auto ] && set_values exit_on_error=true # splitter sur les lignes - array_from_lines lcmds "$(quoted_args "$@")" + array_from_lines lcmds "$(qvals "$@")" [ -n "$AUTOPRINT" ] && array_add lcmds print elif [ -n "$lscriptfile" ]; then [ -f "$lscriptfile" ] || die "$lscriptfile: fichier introuvable" diff --git a/ulib b/ulib index 1a91c35..4e7b311 100755 --- a/ulib +++ b/ulib @@ -343,18 +343,18 @@ if ! grep -q '$scriptdir/profile' ~/.bash_profile; then fi # Modifier le PATH. Ajouter aussi le chemin vers les uapps python -PATH=$(quoted_args "$scriptdir:$scriptdir/lib/pyulib/src/uapps:$PATH") +PATH=$(qval "$scriptdir:$scriptdir/lib/pyulib/src/uapps:$PATH") if [ -n '$DEFAULT_PS1' ]; then - DEFAULT_PS1=$(quoted_args "[ulibshell] $DEFAULT_PS1") + DEFAULT_PS1=$(qval "[ulibshell] $DEFAULT_PS1") else if [ -z '$PS1' ]; then PS1='\\u@\\h \\w \\$ ' fi PS1=\"[ulibshell] \$PS1\" fi -$(quoted_args source "$scriptdir/lib/ulib/ulib") -__ULIB_FORCE_RELOAD=$(quoted_args "$__ULIB_FORCE_RELOAD") +$(qvals source "$scriptdir/lib/ulib/ulib") +__ULIB_FORCE_RELOAD=$(qval "$__ULIB_FORCE_RELOAD") urequire DEFAULTS" >"$bashrc" array_fix_paths modules @@ -362,7 +362,7 @@ urequire DEFAULTS" >"$bashrc" etitle "Chargement des modules" for module in "${modules[@]}"; do estep "$module" - quoted_args urequire "$module" >>"$bashrc" + qvals urequire "$module" >>"$bashrc" done eend fi diff --git a/umatch b/umatch index af3b7ae..212971d 100755 --- a/umatch +++ b/umatch @@ -120,14 +120,14 @@ case "$regexp" in ip) regexp='[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+';; esac -cmd="$(quoted_args match "$regexp" "$sep")" +cmd="$(qvals match "$regexp" "$sep")" [ -n "$sort" ] && cmd="$cmd | sort" -[ -n "$count" ] && cmd="$cmd | $(quoted_args count "$count" "$sep" "$all_lines")" +[ -n "$count" ] && cmd="$cmd | $(qvals count "$count" "$sep" "$all_lines")" if [ -n "$multiple" ]; then if [ -n "$all_lines" ]; then - cmd="$cmd | $(quoted_args grep -v -B 1 "^1$sep")" + cmd="$cmd | $(qvals grep -v -B 1 "^1$sep")" else - cmd="$cmd | $(quoted_args grep -v "^1$sep")" + cmd="$cmd | $(qvals grep -v "^1$sep")" fi fi diff --git a/uscrontab b/uscrontab index 16dea35..e0ca551 100755 --- a/uscrontab +++ b/uscrontab @@ -484,12 +484,12 @@ fi if [ "$action" == "install" ]; then ctline="$USCRONTAB_CTLINE" - [ -n "$uscrontab" ] && ctline="$ctline $(quoted_arg "$uscrontab")" + [ -n "$uscrontab" ] && ctline="$ctline $(qvalm "$uscrontab")" enable_in_crontab "$ctline" && estep "add_to_crontab $ctline" elif [ "$action" == "uninstall" ]; then ctline="$USCRONTAB_CTLINE" - [ -n "$uscrontab" ] && ctline="$ctline $(quoted_arg "$uscrontab")" + [ -n "$uscrontab" ] && ctline="$ctline $(qvalm "$uscrontab")" if [ -n "$disable_only" ]; then disable_in_crontab "$ctline" && estep "disable_in_crontab $ctline" else @@ -655,7 +655,7 @@ puis supprimez le cas échéant le fichier $pidfile" for __var in "$@"; do splitvar "$__var" __name __value edebug "$__name=$__value" - set_var "$__name" "$__value" + _setv "$__name" "$__value" done eval "$__ctscript" ac_cleanall diff --git a/ussh b/ussh index 0079fc3..104706f 100755 --- a/ussh +++ b/ussh @@ -369,13 +369,13 @@ function show_vars() { local -a sshopts [ "${#hosts[*]}" -gt 1 ] && exec= set_array_cmd hosts - set_var_cmd ssh "$SSH" - set_var_cmd exec "$exec" + echo_setv ssh "$SSH" + echo_setv exec "$exec" set_array_cmd args @ "$@" for host in "${hosts[@]}"; do array_copy sshopts SSHOPTS __update_sshopts "$host" "$@" - set_var_cmd host "$host" + echo_setv host "$host" set_array_cmd options sshopts done }