diff --git a/lib/ulib/support/install-pubkeys.sh b/lib/ulib/support/install-pubkeys.sh index db83b7e..e69de29 100755 --- a/lib/ulib/support/install-pubkeys.sh +++ b/lib/ulib/support/install-pubkeys.sh @@ -1,5202 +0,0 @@ -#!/bin/bash -# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 - -PUBKEYS="@@PUBKEYS@@" -[ "$PUBKEYS" != "@@""PUBKEYS""@@" ] || exit 1 - -##@inc[../base -## Fonctions de base -##@*inc[base.ulib -## Support des fonctions uprovided(), uprovide() et urequire() de ulib dans le -## cas où cette librairie n'est pas chargée -if [ -z "$ULIBDIR" -o "$ULIBDIR" != "$ULIBINIT" ]; then - ULIBPROVIDED=() - function uprovided() { - local module - for module in "${ULIBPROVIDED[@]}"; do - [ "$module" == "$1" ] && return 0 - done - return 1 - } - function uprovide() { - uprovided "$1" && return 1 - ULIBPROVIDED=("${ULIBPROVIDED[@]}" "$1") - } - function urequire() { - local module r=0 - for module in "$@"; do - uprovided "$module" && continue - echo "error: $module: this module is required but cannot be automatically loaded" 1>&2 - r=1 - done - return $r - } - uprovide base.ulib -fi -##@*inc]base.ulib -##@inc[base.init -## Fonctions de base: initialisation de l'environnement -uprovide base.init - -if [ -n "$UTOOLS_HAVE_SCRIPTVARS" ]; then - : -elif [ "$0" == "-bash" ]; then - scriptname= - scriptdir= - script= -elif [ ! -f "$0" -a -f "${0#-}" ]; then - scriptname="$(basename -- "${0#-}")" - scriptdir="$(dirname -- "${0#-}")" - scriptdir="$(cd "$scriptdir"; pwd)" - script="$scriptdir/$scriptname" -else - scriptname="$(basename -- "$0")" - scriptdir="$(dirname -- "$0")" - scriptdir="$(cd "$scriptdir"; pwd)" - script="$scriptdir/$scriptname" -fi -: "${ULIBDIR:=$scriptdir}" - -[ -z "$TMPDIR" -a -d "$HOME/tmp" ] && TMPDIR="$HOME/tmp" -export TMPDIR="${TMPDIR:-${TMP:-${TEMP:-/tmp}}}" - -[ -z "$USER" -a -n "$LOGNAME" ] && export USER="$LOGNAME" - -[ -f /etc/nutoolsrc ] && . /etc/nutoolsrc -[ -f ~/.nutoolsrc ] && . ~/.nutoolsrc -true -##@inc]base.init -##@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() { - [ -z "$1" ] && 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 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=\"$(_qval "$*")\"" -} -function _setv() { - local __s_var="$1"; shift - eval "$__s_var=\"$(_qval "$*")\"" -} -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 -} -##@inc]base.core -##@inc[base.string -## Fonctions de base: gestion des valeurs 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 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" ]' -} -##@inc]base.string -##@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="${v#-}" - v="${v//[0-9]/}" - [ -z "$v" ] -} -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - local v="$1" - v="${v//[0-9]/}" - [ -z "$v" ] -} -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="$1" - v="${v#-}" - 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="${v#-}" - v="${v//[0-9]/}" - [ -z "$v" ] -} -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - local v="$1" - v="${v//[0-9]/}" - [ -z "$v" ] -} -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="$1" - v="${v#-}" - 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.array -## Fonctions de base: gestion des tableaux -uprovide base.array -urequire base.core -##@inc]base.array -##@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//\//\\/}" - 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 -} -##@inc]base.quote -##@inc[base.split -## Fonctions de base: analyse et découpage de valeurs -uprovide base.split -urequire base.core - -function splitfsep() { - if [[ "$1" == *"$2"* ]]; then - setv "${3:-first}" "${1%%$2*}" - setv "${4:-second}" "${1#*$2}" - else - setv "${3:-first}" "$1" - setv "${4:-second}" - fi -} -function splitfsep2() { - if [[ "$1" == *"$2"* ]]; then - setv "${3:-first}" "${1%%$2*}" - setv "${4:-second}" "${1#*$2}" - else - setv "${3:-first}" - setv "${4:-second}" "$1" - fi -} -function splitlsep() { - if [[ "$1" == *"$2"* ]]; then - setv "${3:-first}" "${1%$2*}" - setv "${4:-second}" "${1##*$2}" - else - setv "${3:-first}" "$1" - setv "${4:-second}" - fi -} -function splitlsep2() { - if [[ "$1" == *"$2"* ]]; then - setv "${3:-first}" "${1%$2*}" - setv "${4:-second}" "${1##*$2}" - else - setv "${3:-first}" - setv "${4:-second}" "$1" - fi -} -function splitvar() { - splitfsep "$1" = "${2:-name}" "${3:-value}" -} -function splitname() { - splitlsep "$1" . "${2:-basename}" "${3:-ext}" -} -function splithost() { - splitfsep "$1" . "${2:-hostname}" "${3:-domain}" -} -function splituserhost() { - splitfsep2 "$1" @ "${2:-user}" "${3:-host}" -} -function splitpair() { - splitfsep "$1" : "${2:-src}" "${3:-dest}" -} -function splitproxy() { - local __sp_tmp __sp_host __sp_port __sp_creds __sp_user __sp_password - - __sp_tmp="${1#http://}" - if [[ "$__sp_tmp" == *@* ]]; then - __sp_creds="${__sp_tmp%%@*}" - __sp_tmp="${__sp_tmp#${__sp_creds}@}" - splitpair "$__sp_creds" __sp_user __sp_password - fi - __sp_tmp="${__sp_tmp%%/*}" - splitpair "$__sp_tmp" __sp_host __sp_port - [ -n "$__sp_port" ] || __sp_port=3128 - - setv "${2:-host}" "$__sp_host" - setv "${3:-port}" "$__sp_port" - setv "${4:-user}" "$__sp_user" - setv "${5:-password}" "$__sp_password" -} -function spliturl() { - local __su_tmp __su_scheme __su_creds __su_user __su_password __su_host __su_port __su_path - - __su_scheme="${1%%:*}" - __su_tmp="${1#${__su_scheme}://}" - if [[ "$__su_tmp" == */* ]]; then - __su_path="${__su_tmp#*/}" - __su_tmp="${__su_tmp%%/*}" - fi - if [[ "$__su_tmp" == *@* ]]; then - __su_creds="${__su_tmp%%@*}" - __su_tmp="${__su_tmp#${__su_creds}@}" - splitpair "$__su_creds" __su_user __su_password - fi - splitpair "$__su_tmp" __su_host __su_port - if [ -z "$__su_port" ]; then - [ "$__su_scheme" == "http" ] && __su_port=80 - [ "$__su_scheme" == "https" ] && __su_port=443 - [ "$__su_scheme" == "ftp" ] && __su_port=21 - fi - - setv "${2:-scheme}" "$__su_scheme" - setv "${3:-user}" "$__su_user" - setv "${4:-password}" "$__su_password" - setv "${5:-host}" "$__su_host" - setv "${6:-port}" "$__su_port" - setv "${7:-path}" "$__su_path" -} -##@inc]base.split -##@inc[base.args -## Analyse des arguments de la ligne de commande -##@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() { - [ -z "$1" ] && 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 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=\"$(_qval "$*")\"" -} -function _setv() { - local __s_var="$1"; shift - eval "$__s_var=\"$(_qval "$*")\"" -} -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 -} -##@inc]base.core -##@inc[base.string -## Fonctions de base: gestion des valeurs 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 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" ]' -} -##@inc]base.string -##@inc[base.array -## Fonctions de base: gestion des tableaux -uprovide base.array -urequire base.core -##@inc]base.array -uprovide base.args -urequire base.core base.string base.array #XXX maj de cette liste - -function __po_parse_optdescs() { - local -a optdescs_ - local optdesc_ option_ name_ flag_ value_ - local reset_ - local shift_ - local i_ count_ - - let shift_=0 - while [ -n "$1" ]; do - if [ "$1" == -- ]; then - shift - let shift_=$shift_+1 - break - elif [ "$1" == "%" ]; then - reset_=1 - shift - let shift_=$shift_+1 - elif [ "$1" == "-" -o "$1" == "+" ]; then - if [ "${opts_#+}" != "$opts_" ]; then - opts_="${opts_#+}" - elif [ "${opts_#-}" != "$opts_" ]; then - opts_="${opts_#-}" - fi - opts_="$1$opts_" - shift - let shift_=$shift_+1 - elif [ "$1" == "@" ]; then - destargs_="$2" - shift; shift - let shift_=$shift_+2 - elif [[ "$1" == --* ]] || [[ "$1" == -* ]]; then - array_split optdescs_ "$1" "," - if [ "$2" == . ]; then - local autoname_= - for optdesc_ in "${optdescs_[@]}"; do - if [ ${#optdesc_} -gt ${#autoname_} ]; then - autoname_="$optdesc_" - fi - done - while [ -n "$autoname_" -a "${autoname_#-}" != "$autoname_" ]; do autoname_="${autoname_#-}"; done - while [ -n "$autoname_" -a "${autoname_%:}" != "$autoname_" ]; do autoname_="${autoname_%:}"; done - autoname_="${autoname_//-/_}" - shift; shift - set -- dummy "$autoname_" "$@" - fi - for optdesc_ in "${optdescs_[@]}"; do - if [[ "$2" == \$* ]]; then - name_="$2" - if [[ "$optdesc_" == *:: ]]; then - option_="${optdesc_%::}" - flag_='::$' - elif [[ "$optdesc_" == *: ]]; then - option_="${optdesc_%:}" - flag_=':$' - else - option_="$optdesc_" - flag_='$' - fi - elif [[ "$optdesc_" == *:: ]]; then - option_="${optdesc_%::}" - if [[ "$2" == *=* ]]; then - name_="${2%%=*}=" - [ -n "$reset_" ] && eval "$name_=" - else - name_="$2" - [ -n "$reset_" ] && eval "$name_=()" - fi - flag_=:: - elif [[ "$optdesc_" == *: ]]; then - option_="${optdesc_%:}" - if [[ "$2" == *=* ]]; then - name_="${2%%=*}=" - [ -n "$reset_" ] && eval "$name_=" - else - name_="$2" - [ -n "$reset_" ] && eval "$name_=()" - fi - flag_=: - else - option_="$optdesc_" - name_="$2" - [ -n "$reset_" ] && eval "$name_=" - flag_= - fi - - if i_="$(array_find options_ "$option_")"; then - options_=("${options_[@]:0:$i_}" "${options_[@]:$(($i_ + 1))}") - names_=("${names_[@]:0:$i_}" "${names_[@]:$(($i_ + 1))}") - flags_=("${flags_[@]:0:$i_}" "${flags_[@]:$(($i_ + 1))}") - fi - options_=("${options_[@]}" "$option_") - names_=("${names_[@]}" "$name_") - flags_=("${flags_[@]}" "$flag_") - done - shift; shift - let shift_=$shift_+2 - else - break - fi - done - - i_=0 - count_=${#options_[*]} - while [ $i_ -lt $count_ ]; do - option_="${options_[$i_]}" - flag_="${flags_[$i_]}" - i_=$(($i_ + 1)) - - flag_="${flag_%$}" - if [[ "$option_" == --* ]]; then - longopts_="${longopts_:+$longopts_,}${option_#--}$flag_" - elif [[ "$option_" == -* ]]; then - opts_="$opts_${option_#-}$flag_" - fi - done - - return $shift_ -} -function __po_check_options() { - local -a getopt_args_ - getopt_args_=(-o "$opts_" ${longopts_:+-l "$longopts_"} -- "$@") - local args_ - if args_="$(getopt -q "${getopt_args_[@]}")"; then - recho "$args_" - return 0 - else - LANG=C getopt "${getopt_args_[@]}" 2>&1 1>/dev/null - return 1 - fi -} -function __po_process_options() { - while [ -n "$1" ]; do - if [ "$1" == -- ]; then - shift - break - elif [[ "$1" == -* ]]; then - local i_ - let i_=0 - for option_ in "${options_[@]}"; do - [ "$1" == "${options_[$i_]}" ] && break - let i_=$i_+1 - done - name_="names_[$i_]"; name_="${!name_}" - flag_="flags_[$i_]"; flag_="${!flag_}" - function inc@ { eval "let $1=\$$1+1"; } - function res@ { set_var "$1" "${value_:-$2}"; } - function add@ { array_add "$1" "${value_:-$2}"; } - if [ -z "$name_" ]; then - ewarn "$1: option non reconnue, elle sera ignorée" - elif [[ "$flag_" == *\$ ]]; then - if [[ "$flag_" == :* ]]; then - value_="$2"; shift - function set@ { res@ "$@"; } - else - value_= - function set@ { inc@ "$@"; } - fi - eval "${name_#\$}" - elif [ "$flag_" == "" ]; then - if [[ "$name_" == *=* ]]; then - set_var "${name_%%=*}" "${name_#*=}" - else - inc@ "$name_" - fi - elif [ "$flag_" == ":" -o "$flag_" == "::" ]; then - value_="$2"; shift - if [ "${name_%=}" != "$name_" ]; then - set_var "${name_%=}" "$value_" - elif [[ "$name_" == *=* ]]; then - set_var "${name_%%=*}" "${name_#*=}" - else - array_add "$name_" "$value_" - fi - fi - else - break - fi - shift - done - unset -f inc@ res@ add@ set@ - [ -n "$destargs_" ] && - set_array "$destargs_" @ "$@" - return 0 -} -function parse_opts() { - - - - local -a options_ names_ flags_ destargs_ - local opts_ longopts_ - __po_parse_optdescs "$@" || shift $? - local args_ - if args_="$(__po_check_options "$@")"; then - eval "set -- $args_" - __po_process_options "$@" - else - [ -n "$destargs_" ] && set_var "$destargs_" "$args_" - return 1 - fi -} - -function parse_args_check() { - parse_opts "${PRETTYOPTS[@]}" "${args[@]}" @ args -- "$@" && return 0 - eerror "$args" - return 1 -} -function parse_args() { - parse_opts "${PRETTYOPTS[@]}" "${args[@]}" @ args -- "$@" || die "$args" -} - -HELP_DESC= -HELP_USAGE= -HELP_OPTIONS= -function __genparse_shortopt() { - local LC_COLLATE=C - local shortopt="${1//[^A-Z]}" - shortopt="$(strlower "${shortopt:0:1}")" - [ -n "$shortopt" ] && echo "$shortopt" -} -function genparse() { - - local -a names descs vars options - local i desc var option name uname value shortopt - - for var in "$@"; do - if [[ "$var" == *=* ]]; then - splitvar "$var" name value - shortopt="$(__genparse_shortopt "$name")" - option="$(strlower "$name")" - name="${option//-/_}" - array_add names "$name" - array_add descs "${shortopt:+-$shortopt, }--$option VALUE" - array_add vars "$(set_var_cmd "$name" "$value")" - array_add options "${shortopt:+-$shortopt:,}--$option: $name=" - else - name="$var" - shortopt="$(__genparse_shortopt "$name")" - option="$(strlower "$name")" - name="${option//-/_}" - array_add names "$name" - array_add descs "${shortopt:+-$shortopt, }--$option" - array_add vars "$name=" - array_add options "${shortopt:+-$shortopt,}--$option $name=1" - fi - done - - echo -n 'function display_help() { - [ -n "$HELP_USAGE" ] || HELP_USAGE="USAGE - $scriptname' - [ -n "$descs" ] && echo -n ' [options]' - echo '"' - if [ -n "$descs" ]; then - echo -n ' [ -n "$HELP_OPTIONS" ] || HELP_OPTIONS="OPTIONS' - i=0 - while [ $i -lt ${#descs[*]} ]; do - name="${names[$i]}" - uname="$(strupper "$name")" - desc="${descs[$i]}" - echo -n " -\${HELP_${uname}_OPTION:- $desc\${HELP_${uname}_DESC:+ - \${HELP_${uname}_DESC// -/ - }}}" - i=$(($i + 1)) - done - echo '"' - fi - echo ' uecho "${HELP_DESC:+$HELP_DESC - -}$HELP_USAGE${HELP_OPTIONS:+ - -$HELP_OPTIONS}" -} -' - for var in "${vars[@]}"; do - echo "$var" - done - echo 'parse_opts "${PRETTYOPTS[@]}" \' - echo ' --help '\''$exit_with display_help'\'' \' - for option in "${options[@]}"; do - echo " $option \\" - done - echo ' @ args -- "$@" && set -- "${args[@]}" || die "$args"' -} -##@inc]base.args -##@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() { - [ -z "$1" ] && 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 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=\"$(_qval "$*")\"" -} -function _setv() { - local __s_var="$1"; shift - eval "$__s_var=\"$(_qval "$*")\"" -} -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 -} -##@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="${v#-}" - v="${v//[0-9]/}" - [ -z "$v" ] -} -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - local v="$1" - v="${v//[0-9]/}" - [ -z "$v" ] -} -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="$1" - v="${v#-}" - 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="${v#-}" - v="${v//[0-9]/}" - [ -z "$v" ] -} -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - local v="$1" - v="${v//[0-9]/}" - [ -z "$v" ] -} -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="$1" - v="${v#-}" - 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//\//\\/}" - 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 -} -##@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.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 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 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() { - [ -n "$*" ] || set '*' - local arg - local cmd="/bin/ls -1d" - for arg in "$@"; do - cmd="$cmd $(quote_arg "$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 - [ -n "$*" ] || 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() { - [ -n "$*" ] && eerror "$@"; exit 1 -} -function exit_with { - [ -n "$*" ] && "$@"; exit $? -} -function die_with { - [ -n "$1" ] && eerror "$1"; shift; [ -n "$*" ] && "$@"; exit 1 -} - -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() { - [ -n "$*" ] || 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 [ -n "$*" ]; 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 [ -n "$*" ]; 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 && [ -n "$*" ] && __edotd "$*" 1>&2 - return $s -} -function edotw() { - local s=$? - show_info || return - eflush - [ -n "$1" ] && s="$1" - shift - __edotw 1>&2 - show_verbose && [ -n "$*" ] && __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_opts=() - __rv_read "$@" -} -function read_password() { - local -a __rv_opts - __rv_opts=(-s) - __rv_read "$@" - echo "" -} -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 - [ -n "$__rv_d" ] && tooenc_ " [$__rv_d]" 1>&2 - tooenc_ ": " "$UTF8" 1>&2 - uread "${__rv_opts[@]}" __rv_r - __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 __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 -##@inc[../sysinfos -## Gestion des informations sur l'hôte local -##@require base -uprovide sysinfos -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) -linuxppc32_SYSDISTS=(debianlike debian ubuntu redhatlike fedora) -linuxppc64_SYSDISTS=(debianlike debian ubuntu redhatlike fedora) -linuxarm_SYSDISTS=(debianlike debian ubuntu) -macosx_SYSDISTS=(lion snowleopard leopard tiger panther) -SYSDIST_ALIASES=( - 10.7=lion 10.6=snowleopard 10.5=leopard 10.4=tiger 10.3=panther -) -debianlike_SYSVERS=() -debian_SYSVERS=(wheezy squeeze lenny etch) -ubuntu_SYSVERS=(oneiric natty maverick lucid karmic jaunty intrepid hardy) -redhatlike_SYSVERS=() -rhel_SYSVERS=(rhel6 rhel5 rhel4 redhat6 redhat5 redhat4) -fedora_SYSVERS=(fedora14 fedora13 fedora12 fedora11) -centos_SYSVERS=(centos6 centos5 centos4 redhat6 redhat5 redhat4) -suse_SYSVERS=() -gentoo_SYSVERS=() -SYSVER_ALIASES=( - 7=wheezy 6=squeeze 5=lenny 4=etch - 11.10=oneiric 11.04=natty 10.10=maverick 10.04=lucid 9.10=karmic 9.04=jaunty 8.10=intrepid 8.04=hardy -) - -function __setup_ALL_SYSvars() { - local s ds d fs f - ALL_SYSDISTS=() - for s in "${SYSNAMES[@]}"; do - array_copy ds "${s}_SYSDISTS" - for d in "${ds[@]}"; do - array_set ALL_SYSDISTS "$d" - done - done - ALL_SYSVERS=() - for d in "${ALL_SYSDISTS[@]}"; do - array_copy fs "${d}_SYSVERS" - for f in "${fs[@]}"; do - array_contains ALL_SYSVERS "$f" && array_del ALL_SYSVERS "$f" - array_add ALL_SYSVERS "$f" - done - done -} -__setup_ALL_SYSvars -unset -f __setup_ALL_SYSvars - -MYSYSNAME=() -MYBITS= -MYSYSDIST=() -MYSYSVER=() -if [ "$UNAME_SYSTEM" == "Linux" ]; then - case "$UNAME_MACHINE" in - x86_64) - MYSYSNAME=(linux64 linux) - MYBITS=64 - ;; - i386|i586|i686) - MYSYSNAME=(linux32 linux) - MYBITS=32 - ;; - ppc) - MYSYSNAME=(linuxppc32 linuxppc linux) - MYBITS=32 - ;; - ppc64) - MYSYSNAME=(linuxppc64 linuxppc linux) - MYBITS=64 - ;; - arm*) - MYSYSNAME=(linuxarm linux) - ;; - *) - MYSYSNAME=(linux) - ;; - esac - - if [ -f /etc/debian_version ]; then - case "$(//g -s/<\/string>.*$//g' - break - fi - done - } - MYSYSNAME=(macosx darwin) - case "$(get_macosx_version)" in - 10.7*) MYSYSDIST=(lion);; - 10.6*) MYSYSDIST=(snowleopard);; - 10.5*) MYSYSDIST=(leopard);; - 10.4*) MYSYSDIST=(tiger);; - 10.3*) MYSYSDIST=(panther);; - esac -fi -if [ -n "$UTOOLS_CHROOT" ]; then - [ -n "$UTOOLS_SYSNAME" ] && eval "MYSYSNAME=($UTOOLS_SYSNAME)" - [ -n "$UTOOLS_BITS" ] && eval "MYBITS=$UTOOLS_BITS" - [ -n "$UTOOLS_SYSDIST" ] && eval "MYSYSDIST=($UTOOLS_SYSDIST)" - [ -n "$UTOOLS_SYSVER" ] && eval "MYSYSVER=($UTOOLS_SYSVER)" -fi - -function __get_sysdist_alias() { - if ! array_contains ALL_SYSDISTS "$1"; then - local nd n d - for nd in "${SYSDIST_ALIASES[@]}"; do - splitvar "$nd" n d - if [ "$n" == "$1" ]; then - echo "$d" - return - fi - done - fi - echo "$1" -} - -function __get_sysver_alias() { - if ! array_contains ALL_SYSVERS "$1"; then - local nv n v - for nv in "${SYSVER_ALIASES[@]}"; do - splitvar "$nv" n v - if [ "$n" == "$1" ]; then - echo "$v" - return - fi - done - fi - echo "$1" -} - -function __fix_sysinfos_upward() { - local sysname_ sysdists_ sysdist_ sysvers_ sysver_ - if [ -z "${!sysnamevar_}" ]; then - if [ -z "${!sysdistvar_}" ]; then - [ -z "${!sysvervar_}" ] && return - for sysname_ in "${SYSNAMES[@]}"; do - array_copy sysdists_ "${sysname_}_SYSDISTS" - for sysdist_ in "${sysdists_[@]}"; do - array_copy sysvers_ "${sysdist_}_SYSVERS" - for sysver_ in "${sysvers_[@]}"; do - if [ "$sysver_" == "${!sysvervar_}" ]; then - set_var "$sysdistvar_" "$sysdist_" - set_var "$sysnamevar_" "$sysname_" - return - fi - done - done - done - fi - [ -z "${!sysdistvar_}" ] && return 0 - for sysname_ in "${SYSNAMES[@]}"; do - array_copy sysdists_ "${sysname_}_SYSDISTS" - for sysdist_ in "${sysdists_[@]}"; do - if [ "$sysdist_" == "${!sysdistvar_}" ]; then - set_var "$sysnamevar_" "$sysname_" - return - fi - done - done - fi -} -function __fix_sysinfos_downward() { - local sysname_ sysdist_ sysver_ - - [ -z "${!sysnamevar_}" ] && return - - if [ -z "${!sysdistvar_}" ]; then - array_copy sysdists_ "${!sysnamevar_}_SYSDISTS" - for sysdist_ in "${sysdists_[@]}"; do - set_var "$sysdistvar_" "$sysdist_" - break - done - fi - [ -z "${!sysdistvar_}" ] && return - - if [ -z "${!sysvervar_}" ]; then - array_copy sysvers_ "${sysdistvar_}_SYSVERS" - for sysver_ in "${sysvers_[@]}"; do - set_var "$sysvervar_" "$sysver_" - break - done - fi -} -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_}")" - __fix_sysinfos_upward - __fix_sysinfos_downward -} - -function check_sysinfos() { - local sysnamevar_="MYSYSNAME" - local sysdistvar_="MYSYSDIST" - local sysvervar_="MYSYSVER" - local bitsvar_="MYBITS" - local check_=sysname r_=0 - while [ -n "$1" ]; do - if [[ "$1" == -* ]]; then - [ "$1" == "-S" ] && { sysnamevar_="$2"; shift 2; continue; } - [ "$1" == "-D" ] && { sysdistvar_="$2"; shift 2; continue; } - [ "$1" == "-V" ] && { sysvervar_="$2"; shift 2; continue; } - [ "$1" == "-B" ] && { bitsvar_="$2"; shift 2; continue; } - [ "$r_" == "1" ] && break - [ "$1" == "-s" ] && check_=sysname - [ "$1" == "-d" ] && check_=sysdist - [ "$1" == "-v" ] && check_=sysver - [ "$1" == "-b" ] && check_=bits - r_=1 - shift - continue - fi - if [ "$check_" == "sysname" ]; then - if array_contains "$sysnamevar_" "$1"; then - r_=0 - check_=skip - fi - - elif [ "$check_" == "sysdist" ]; then - local mode_=exact value_="$1" - if [ "${value_%+}" != "$value_" ]; then - mode_=after - value_="${value_%+}" - elif [ "${value_%-}" != "$value_" ]; then - mode_=before - value_="${value_%-}" - fi - value_="$(__get_sysdist_alias "$value_")" - if [ "$mode_" == "exact" ]; then - if array_contains "$sysdistvar_" "$value_"; then - r_=0 - check_=skip - fi - elif [ "$mode_" == "after" ]; then - local sysdist_ - for sysdist_ in "${ALL_SYSDISTS[@]}"; do - if array_contains "$sysdistvar_" "$sysdist_"; then - r_=0 - check_=skip - elif [ "$sysdist_" == "$value_" ]; then - break - fi - done - elif [ "$mode_" == "before" ]; then - local sysdist_ found_ - for sysdist_ in "${ALL_SYSDISTS[@]}"; do - [ "$sysdist_" == "$value_" ] && found_=1 - if [ -n "$found_" ]; then - if array_contains "$sysdistvar_" "$sysdist_"; then - r_=0 - check_=skip - break - fi - fi - done - fi - - elif [ "$check_" == "sysver" ]; then - local mode_=exact value_="$1" - if [ "${value_%+}" != "$value_" ]; then - mode_=after - value_="${value_%+}" - elif [ "${value_%-}" != "$value_" ]; then - mode_=before - value_="${value_%-}" - fi - value_="$(__get_sysver_alias "$value_")" - if [ "$mode_" == "exact" ]; then - if array_contains "$sysvervar_" "$value_"; then - r_=0 - check_=skip - fi - elif [ "$mode_" == "after" ]; then - local sysver_ - for sysver_ in "${ALL_SYSVERS[@]}"; do - if array_contains "$sysvervar_" "$sysver_"; then - r_=0 - check_=skip - elif [ "$sysver_" == "$value_" ]; then - break - fi - done - elif [ "$mode_" == "before" ]; then - local sysver_ found_ - for sysver_ in "${ALL_SYSVERS[@]}"; do - [ "$sysver_" == "$value_" ] && found_=1 - if [ -n "$found_" ]; then - if array_contains "$sysvervar_" "$sysver_"; then - r_=0 - check_=skip - break - fi - fi - done - fi - - elif [ "$check_" == "bits" ]; then - if [ "$1" == "${!bitsvar_}" ]; then - r_=0 - check_=skip - fi - fi - shift - done - return $r_ -} -##@inc]../sysinfos -##@inc[../compat -# Code de support pour les architectures autre que Linux -##@require base -##@require sysinfos -uprovide compat -urequire base sysinfos - -if check_sysinfos -s macosx; then - function __rlnp() { local p="$1" np f; [ "${p#/}" == "$p" ] && p="$(pwd)/$p"; while [[ "$p" == *//* ]]; do p="${p//\/\///}"; done; p="${p%/}"; p="${p#/}"; np=; while [ -n "$p" ]; do if [[ "$p" == */* ]]; then f="${p%%/*}"; p="${p#*/}"; else f="$p"; p=; fi; if [ "$f" == . ]; then :; elif [ "$f" == .. ]; then if [[ "$np" == */* ]]; then np="${np%/*}"; else np=; fi; else [ -n "$np" ] && np="$np/"; np="$np$f"; fi; done; echo "/$np"; } - function readlinkm() { local p="$(__rlnp "$1")" np n; while [ -n "$p" ]; do local max=50; while [ -L "$p" -a $max -gt 0 ]; do n="$(readlink "$p")"; if [ "${n#/}" != "$n" ]; then p="$n"; else p="${p%/*}/$n"; fi; p="$(__rlnp "$p")"; max=$(($max-1)); done; [ -n "$np" ] && np="/$np"; if [[ "$p" == */* ]]; then np="${p##*/}$np"; p="${p%/*}"; else np="$p$np"; p=; fi; done; echo "/$np"; } - function _nl2lf() { awk '{ sub(/\r$/, ""); gsub(/\r/, "\n"); print }'; } - function _nl2crlf() { _nl2lf | awk '{ print $0 "\r" }'; } - function _nl2cr() { _nl2lf | awk 'BEGIN { ORS="" } { print $0 "\r" }'; } - function sedi() { sed -i '' "$@"; } - - function __po_check_options() { - local -a options args - local option value flag - if [ "${opts_#+}" != "$opts_" ]; then - while [ -n "$*" ]; do - if [ "$1" == "--" ]; then - shift - break - elif [[ "$1" == --* ]]; then - option="${1%%=*}" - if flag="$(array_find options_ "$option" flags_)"; then - if [[ "$flag" == ::* ]]; then - if [[ "$1" == *=* ]]; then - value="${1#--*=}" - else - value= - fi - shift - options=("${options[@]}" "$option" "$value") - elif [[ "$flag" == :* ]]; then - if [[ "$1" == *=* ]]; then - value="${1#--*=}" - shift - elif [ $# -gt 1 ]; then - value="$2" - shift 2 - else - echo "option requires an argument: $option" - return 1 - fi - options=("${options[@]}" "$option" "$value") - else - shift - options=("${options[@]}" "$option") - fi - else - echo "invalid option: $1" - return 1 - fi - - elif [[ "$1" == -* ]]; then - option="${1:0:2}" - if flag="$(array_find options_ "$option" flags_)"; then - if [[ "$flag" == ::* ]]; then - value="${1:2}" - shift - options=("${options[@]}" "$option" "$value") - elif [[ "$flag" == :* ]]; then - if [[ -n "${1:2}" ]]; then - value="${1:2}" - shift - elif [ $# -gt 1 ]; then - value="$2" - shift 2 - else - echo "option requires an argument: $option" - return 1 - fi - options=("${options[@]}" "$option" "$value") - else - shift - options=("${options[@]}" "$option") - fi - else - echo "invalid option: $1" - return 1 - fi - - else - break - fi - done - args=("$@") - elif [ "${opts_#-}" != "$opts_" ]; then - while [ -n "$*" ]; do - if [ "$1" == "--" ]; then - shift - break - elif [[ "$1" == --* ]]; then - option="${1%%=*}" - if flag="$(array_find options_ "$option" flags_)"; then - if [[ "$flag" == ::* ]]; then - if [[ "$1" == *=* ]]; then - value="${1#--*=}" - else - value= - fi - shift - options=("${options[@]}" "$option" "$value") - elif [[ "$flag" == :* ]]; then - if [[ "$1" == *=* ]]; then - value="${1#--*=}" - shift - elif [ $# -gt 1 ]; then - value="$2" - shift 2 - else - echo "option requires an argument: $option" - return 1 - fi - options=("${options[@]}" "$option" "$value") - else - shift - options=("${options[@]}" "$option") - fi - else - echo "invalid option: $1" - return 1 - fi - - elif [[ "$1" == -* ]]; then - option="${1:0:2}" - if flag="$(array_find options_ "$option" flags_)"; then - if [[ "$flag" == ::* ]]; then - value="${1:2}" - shift - options=("${options[@]}" "$option" "$value") - elif [[ "$flag" == :* ]]; then - if [[ -n "${1:2}" ]]; then - value="${1:2}" - shift - elif [ $# -gt 1 ]; then - value="$2" - shift 2 - else - echo "option requires an argument: $option" - return 1 - fi - options=("${options[@]}" "$option" "$value") - else - shift - options=("${options[@]}" "$option") - fi - else - echo "invalid option: $1" - return 1 - fi - - else - options=("${options[@]}" "$1") - shift - fi - done - args=("$@") - else - while [ -n "$*" ]; do - if [ "$1" == "--" ]; then - shift - break - elif [[ "$1" == --* ]]; then - option="${1%%=*}" - if flag="$(array_find options_ "$option" flags_)"; then - if [[ "$flag" == ::* ]]; then - if [[ "$1" == *=* ]]; then - value="${1#--*=}" - else - value= - fi - shift - options=("${options[@]}" "$option" "$value") - elif [[ "$flag" == :* ]]; then - if [[ "$1" == *=* ]]; then - value="${1#--*=}" - shift - elif [ $# -gt 1 ]; then - value="$2" - shift 2 - else - echo "option requires an argument: $option" - return 1 - fi - options=("${options[@]}" "$option" "$value") - else - shift - options=("${options[@]}" "$option") - fi - else - echo "invalid option: $1" - return 1 - fi - - elif [[ "$1" == -* ]]; then - option="${1:0:2}" - if flag="$(array_find options_ "$option" flags_)"; then - if [[ "$flag" == ::* ]]; then - value="${1:2}" - shift - options=("${options[@]}" "$option" "$value") - elif [[ "$flag" == :* ]]; then - if [[ -n "${1:2}" ]]; then - value="${1:2}" - shift - elif [ $# -gt 1 ]; then - value="$2" - shift 2 - else - echo "option requires an argument: $option" - return 1 - fi - options=("${options[@]}" "$option" "$value") - else - shift - options=("${options[@]}" "$option") - fi - else - echo "invalid option: $1" - return 1 - fi - - else - args=("${args[@]}" "$1") - shift - fi - done - args=("${args[@]}" "$@") - fi - quoted_args "${options[@]}" -- "${args[@]}" - return 0 - } - - function __pd_isleap() { - [ $(($1 % 4)) -eq 0 -a \( $(($1 % 100)) -ne 0 -o $(($1 % 400)) -eq 0 \) ] - } - function __pd_fix_month() { - local __pdfm_y="${!1}" __pdfm_m="${!2}" - let __pdfm_m=$__pdfm_m-1 - while [ $__pdfm_m -gt 11 ]; do - let __pdfm_m=$__pdfm_m-12 - let __pdfm_y=$__pdfm_y+1 - done - while [ $__pdfm_m -lt 0 ]; do - let __pdfm_m=$__pdfm_m+12 - let __pdfm_y=$__pdfm_y-1 - done - let __pdfm_m=$__pdfm_m+1 - eval "$1=$__pdfm_y; $2=$__pdfm_m" - } - __PD_MONTHDAYS=(0 31 28 31 30 31 30 31 31 30 31 30 31) - function __pd_monthdays() { - local y="$1" m="$2" mds - __pd_fix_month y m - mds="${__PD_MONTHDAYS[$m]}" - [ "$m" -eq 2 ] && __pd_isleap "$y" && let mds=$mds+1 - echo $mds - } - function __pd_fix_day() { - local __pdfd_y="${!1}" __pdfd_m="${!2}" __pdfd_d="${!3}" __pdfd_mds - let __pdfd_d=$__pdfd_d-1 - let __pdfd_mds=$(__pd_monthdays $__pdfd_y $__pdfd_m) - while [ $__pdfd_d -gt $(($__pdfd_mds-1)) ]; do - let __pdfd_d=$__pdfd_d-$__pdfd_mds - let __pdfd_m=$__pdfd_m+1 - __pd_fix_month __pdfd_y __pdfd_m - let __pdfd_mds=$(__pd_monthdays $__pdfd_y $__pdfd_m) - done - while [ $__pdfd_d -lt 0 ]; do - let __pdfd_m=$__pdfd_m-1 - __pd_fix_month __pdfd_y __pdfd_m - let __pdfd_d=$__pdfd_d-$(__pd_monthdays $__pdfd_y $__pdfd_m) - done - let __pdfd_d=$__pdfd_d+1 - eval "$1=$__pdfd_y; $2=$__pdfd_m; $3=$__pdfd_d" - } - function __pd_fix_date() { - local __pdf_y="${!1}" __pdf_m="${!2}" __pdf_d="${!3}" - } - function parse_date() { - local value="$1" type="${2:-date}" - local d m y - eval "$(date +%d/%m/%Y | awk -F/ '{ - print "d=" $1 "; m=" $2 "; y=" $3 - }')" - if [ "${value#+}" != "$value" ]; then - d="$(($d+${value#+}))" - else - eval "$(<<<"$value" awkrun FS=/ dn="$dn" mn="$mn" yn="$yn" type="$type" '{ - d = $1 + 0; if (d < 1) d = dn + 0; - m = $2 + 0; if (m < 1) m = mn + 0; - if ($3 == "") y = yn + 0; - else { y = $3 + 0; if (y < 100) y = y + 2000; } - print "d=" d "; m=" m "; y=" y - }')" - fi - __pd_fix_month y m - __pd_fix_day y m d - case "$type" in - d|date) - awkrun d="$d" m="$m" y="$y" 'BEGIN { printf "%02i/%02i/%04i\n", d, m, y }' - ;; - l|ldap) - awkrun d="$d" m="$m" y="$y" 'BEGIN { printf "%04i%02i%02i000000+0400\n", y, m, d }' - ;; - esac - } - function myhost() { - hostname - } - function myhostname() { - hostname -s - } -fi -##@inc]../compat - -user="${1:-$USER}" -if [ "$user" != "$USER" ]; then - is_root || run_as_root "$@" - if [ "$user" != "root" ]; then - run_as "$user" "$@" - fi -fi - -autoclean "$script" - -eval "cd ~$user"; mkdir -p .ssh; chmod 700 .ssh -cd .ssh; touch authorized_keys; chmod 600 authorized_keys -echo "$PUBKEYS" | while read pubkey; do - quietgrep "$pubkey" authorized_keys || - echo "$pubkey" >>authorized_keys -done diff --git a/lib/ulib/ulibsh b/lib/ulib/ulibsh index a21fe32..c7a6f55 100644 --- a/lib/ulib/ulibsh +++ b/lib/ulib/ulibsh @@ -64,12 +64,16 @@ __ULIB_FORCE_RELOAD= function urequire() { local __u_module __u_ulibdir __u_found [ -n "$*" ] || set DEFAULTS + + local __ulib_force_reload="$__ULIB_FORCE_RELOAD" + local __ULIB_FORCE_RELOAD + for __u_module in "$@"; do __u_found= for __u_ulibdir in "${ULIBDIRS[@]}"; do if [ -f "$__u_ulibdir/$__u_module" ]; then __u_found=1 - if [ -n "$__ULIB_FORCE_RELOAD" ] || ! uprovided "$__u_module"; then + if [ -n "$__ulib_force_reload" ] || ! uprovided "$__u_module"; then uprovide "$__u_module" source "$__u_ulibdir/$__u_module" || die fi @@ -79,7 +83,7 @@ function urequire() { if [ -z "$__u_found" -a "$__u_module" == DEFAULTS ]; then __u_found=1 for __u_module in base pretty sysinfos compat; do - if [ -n "$__ULIB_FORCE_RELOAD" ] || ! uprovided "$__u_module"; then + if [ -n "$__ulib_force_reload" ] || ! uprovided "$__u_module"; then uprovide "$__u_module" source "$__u_ulibdir/$__u_module" || die fi diff --git a/ucrontab b/ucrontab index 0ba215c..c229713 100755 --- a/ucrontab +++ b/ucrontab @@ -179,6 +179,16 @@ function recho_() { echo -n "$@" fi } +function _rval() { + local s="$*" + s="${s//\\/\\\\}" + s="${s//\"/\\\"}" + s="${s//\'/\'}" + s="${s//\$/\\\$}" + s="${s//\`/\\\`}" + s="${s// /\\ }" + recho_ "$s" +} function _qval() { local s="$*" s="${s//\\/\\\\}" @@ -188,7 +198,8 @@ function _qval() { recho_ "$s" } function should_quote() { - [ -z "$1" ] && return 0 + local l="${#1}" + [ $l -eq 0 -o $l -gt 80 ] && return 0 local s="${*//[a-zA-Z0-9]/}" s="${s//,/}" s="${s//./}" @@ -248,11 +259,11 @@ function setv() { set -- "${__s_var#*=}" "$@" __s_var="${__s_var%%=*}" fi - eval "$__s_var=\"$(_qval "$*")\"" + eval "$__s_var=\"\$*\"" } function _setv() { local __s_var="$1"; shift - eval "$__s_var=\"$(_qval "$*")\"" + eval "$__s_var=\"\$*\"" } function echo_setv() { local __s_var="$1"; shift @@ -736,6 +747,9 @@ function splitlsep2() { function splitvar() { splitfsep "$1" = "${2:-name}" "${3:-value}" } +function splitpath() { + splitlsep2 "$1" / "${2:-dir}" "${3:-name}" +} function splitname() { splitlsep "$1" . "${2:-basename}" "${3:-ext}" } @@ -822,6 +836,16 @@ function recho_() { echo -n "$@" fi } +function _rval() { + local s="$*" + s="${s//\\/\\\\}" + s="${s//\"/\\\"}" + s="${s//\'/\'}" + s="${s//\$/\\\$}" + s="${s//\`/\\\`}" + s="${s// /\\ }" + recho_ "$s" +} function _qval() { local s="$*" s="${s//\\/\\\\}" @@ -831,7 +855,8 @@ function _qval() { recho_ "$s" } function should_quote() { - [ -z "$1" ] && return 0 + local l="${#1}" + [ $l -eq 0 -o $l -gt 80 ] && return 0 local s="${*//[a-zA-Z0-9]/}" s="${s//,/}" s="${s//./}" @@ -891,11 +916,11 @@ function setv() { set -- "${__s_var#*=}" "$@" __s_var="${__s_var%%=*}" fi - eval "$__s_var=\"$(_qval "$*")\"" + eval "$__s_var=\"\$*\"" } function _setv() { local __s_var="$1"; shift - eval "$__s_var=\"$(_qval "$*")\"" + eval "$__s_var=\"\$*\"" } function echo_setv() { local __s_var="$1"; shift @@ -1320,7 +1345,7 @@ function __po_process_options() { name_="names_[$i_]"; name_="${!name_}" flag_="flags_[$i_]"; flag_="${!flag_}" function inc@ { eval "let $1=\$$1+1"; } - function res@ { set_var "$1" "${value_:-$2}"; } + function res@ { setv "$1" "${value_:-$2}"; } function add@ { array_add "$1" "${value_:-$2}"; } if [ -z "$name_" ]; then ewarn "$1: option non reconnue, elle sera ignorée" @@ -1335,16 +1360,16 @@ function __po_process_options() { eval "${name_#\$}" elif [ "$flag_" == "" ]; then if [[ "$name_" == *=* ]]; then - set_var "${name_%%=*}" "${name_#*=}" + setv "${name_%%=*}" "${name_#*=}" else inc@ "$name_" fi elif [ "$flag_" == ":" -o "$flag_" == "::" ]; then value_="$2"; shift if [ "${name_%=}" != "$name_" ]; then - set_var "${name_%=}" "$value_" + setv "${name_%=}" "$value_" elif [[ "$name_" == *=* ]]; then - set_var "${name_%%=*}" "${name_#*=}" + setv "${name_%%=*}" "${name_#*=}" else array_add "$name_" "$value_" fi @@ -1371,7 +1396,7 @@ function parse_opts() { eval "set -- $args_" __po_process_options "$@" else - [ -n "$destargs_" ] && set_var "$destargs_" "$args_" + [ -n "$destargs_" ] && setv "$destargs_" "$args_" return 1 fi } @@ -1407,7 +1432,7 @@ function genparse() { name="${option//-/_}" array_add names "$name" array_add descs "${shortopt:+-$shortopt, }--$option VALUE" - array_add vars "$(set_var_cmd "$name" "$value")" + array_add vars "$(echo_setv "$name" "$value")" array_add options "${shortopt:+-$shortopt:,}--$option: $name=" else name="$var" @@ -1460,8 +1485,10 @@ $HELP_OPTIONS}" echo ' @ args -- "$@" && set -- "${args[@]}" || die "$args"' } ##@inc]base.args -##@inc[base.compat -## Fonctions de base: support des fonctions obsolètes et des versions de bash < 4.x +##@inc[base.tools +## Fonctions de base: outils divers +##@inc[base.args +## Analyse des arguments de la ligne de commande ##@inc[base.core ## Fonctions de base: fondement uprovide base.core @@ -1487,6 +1514,16 @@ function recho_() { echo -n "$@" fi } +function _rval() { + local s="$*" + s="${s//\\/\\\\}" + s="${s//\"/\\\"}" + s="${s//\'/\'}" + s="${s//\$/\\\$}" + s="${s//\`/\\\`}" + s="${s// /\\ }" + recho_ "$s" +} function _qval() { local s="$*" s="${s//\\/\\\\}" @@ -1496,7 +1533,8 @@ function _qval() { recho_ "$s" } function should_quote() { - [ -z "$1" ] && return 0 + local l="${#1}" + [ $l -eq 0 -o $l -gt 80 ] && return 0 local s="${*//[a-zA-Z0-9]/}" s="${s//,/}" s="${s//./}" @@ -1556,11 +1594,748 @@ function setv() { set -- "${__s_var#*=}" "$@" __s_var="${__s_var%%=*}" fi - eval "$__s_var=\"$(_qval "$*")\"" + eval "$__s_var=\"\$*\"" } function _setv() { local __s_var="$1"; shift - eval "$__s_var=\"$(_qval "$*")\"" + 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 +} +##@inc]base.core +##@inc[base.string +## Fonctions de base: gestion des valeurs 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 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" ]' +} +##@inc]base.string +##@inc[base.array +## Fonctions de base: gestion des tableaux +uprovide base.array +urequire base.core +##@inc]base.array +uprovide base.args +urequire base.core base.string base.array #XXX maj de cette liste + +function __po_parse_optdescs() { + local -a optdescs_ + local optdesc_ option_ name_ flag_ value_ + local reset_ + local shift_ + local i_ count_ + + let shift_=0 + while [ -n "$1" ]; do + if [ "$1" == -- ]; then + shift + let shift_=$shift_+1 + break + elif [ "$1" == "%" ]; then + reset_=1 + shift + let shift_=$shift_+1 + elif [ "$1" == "-" -o "$1" == "+" ]; then + if [ "${opts_#+}" != "$opts_" ]; then + opts_="${opts_#+}" + elif [ "${opts_#-}" != "$opts_" ]; then + opts_="${opts_#-}" + fi + opts_="$1$opts_" + shift + let shift_=$shift_+1 + elif [ "$1" == "@" ]; then + destargs_="$2" + shift; shift + let shift_=$shift_+2 + elif [[ "$1" == --* ]] || [[ "$1" == -* ]]; then + array_split optdescs_ "$1" "," + if [ "$2" == . ]; then + local autoname_= + for optdesc_ in "${optdescs_[@]}"; do + if [ ${#optdesc_} -gt ${#autoname_} ]; then + autoname_="$optdesc_" + fi + done + while [ -n "$autoname_" -a "${autoname_#-}" != "$autoname_" ]; do autoname_="${autoname_#-}"; done + while [ -n "$autoname_" -a "${autoname_%:}" != "$autoname_" ]; do autoname_="${autoname_%:}"; done + autoname_="${autoname_//-/_}" + shift; shift + set -- dummy "$autoname_" "$@" + fi + for optdesc_ in "${optdescs_[@]}"; do + if [[ "$2" == \$* ]]; then + name_="$2" + if [[ "$optdesc_" == *:: ]]; then + option_="${optdesc_%::}" + flag_='::$' + elif [[ "$optdesc_" == *: ]]; then + option_="${optdesc_%:}" + flag_=':$' + else + option_="$optdesc_" + flag_='$' + fi + elif [[ "$optdesc_" == *:: ]]; then + option_="${optdesc_%::}" + if [[ "$2" == *=* ]]; then + name_="${2%%=*}=" + [ -n "$reset_" ] && eval "$name_=" + else + name_="$2" + [ -n "$reset_" ] && eval "$name_=()" + fi + flag_=:: + elif [[ "$optdesc_" == *: ]]; then + option_="${optdesc_%:}" + if [[ "$2" == *=* ]]; then + name_="${2%%=*}=" + [ -n "$reset_" ] && eval "$name_=" + else + name_="$2" + [ -n "$reset_" ] && eval "$name_=()" + fi + flag_=: + else + option_="$optdesc_" + name_="$2" + [ -n "$reset_" ] && eval "$name_=" + flag_= + fi + + if i_="$(array_find options_ "$option_")"; then + options_=("${options_[@]:0:$i_}" "${options_[@]:$(($i_ + 1))}") + names_=("${names_[@]:0:$i_}" "${names_[@]:$(($i_ + 1))}") + flags_=("${flags_[@]:0:$i_}" "${flags_[@]:$(($i_ + 1))}") + fi + options_=("${options_[@]}" "$option_") + names_=("${names_[@]}" "$name_") + flags_=("${flags_[@]}" "$flag_") + done + shift; shift + let shift_=$shift_+2 + else + break + fi + done + + i_=0 + count_=${#options_[*]} + while [ $i_ -lt $count_ ]; do + option_="${options_[$i_]}" + flag_="${flags_[$i_]}" + i_=$(($i_ + 1)) + + flag_="${flag_%$}" + if [[ "$option_" == --* ]]; then + longopts_="${longopts_:+$longopts_,}${option_#--}$flag_" + elif [[ "$option_" == -* ]]; then + opts_="$opts_${option_#-}$flag_" + fi + done + + return $shift_ +} +function __po_check_options() { + local -a getopt_args_ + getopt_args_=(-o "$opts_" ${longopts_:+-l "$longopts_"} -- "$@") + local args_ + if args_="$(getopt -q "${getopt_args_[@]}")"; then + recho "$args_" + return 0 + else + LANG=C getopt "${getopt_args_[@]}" 2>&1 1>/dev/null + return 1 + fi +} +function __po_process_options() { + while [ -n "$1" ]; do + if [ "$1" == -- ]; then + shift + break + elif [[ "$1" == -* ]]; then + local i_ + let i_=0 + for option_ in "${options_[@]}"; do + [ "$1" == "${options_[$i_]}" ] && break + let i_=$i_+1 + done + name_="names_[$i_]"; name_="${!name_}" + flag_="flags_[$i_]"; flag_="${!flag_}" + function inc@ { eval "let $1=\$$1+1"; } + function res@ { setv "$1" "${value_:-$2}"; } + function add@ { array_add "$1" "${value_:-$2}"; } + if [ -z "$name_" ]; then + ewarn "$1: option non reconnue, elle sera ignorée" + elif [[ "$flag_" == *\$ ]]; then + if [[ "$flag_" == :* ]]; then + value_="$2"; shift + function set@ { res@ "$@"; } + else + value_= + function set@ { inc@ "$@"; } + fi + eval "${name_#\$}" + elif [ "$flag_" == "" ]; then + if [[ "$name_" == *=* ]]; then + setv "${name_%%=*}" "${name_#*=}" + else + inc@ "$name_" + fi + elif [ "$flag_" == ":" -o "$flag_" == "::" ]; then + value_="$2"; shift + if [ "${name_%=}" != "$name_" ]; then + setv "${name_%=}" "$value_" + elif [[ "$name_" == *=* ]]; then + setv "${name_%%=*}" "${name_#*=}" + else + array_add "$name_" "$value_" + fi + fi + else + break + fi + shift + done + unset -f inc@ res@ add@ set@ + [ -n "$destargs_" ] && + set_array "$destargs_" @ "$@" + return 0 +} +function parse_opts() { + + + + local -a options_ names_ flags_ destargs_ + local opts_ longopts_ + __po_parse_optdescs "$@" || shift $? + local args_ + if args_="$(__po_check_options "$@")"; then + eval "set -- $args_" + __po_process_options "$@" + else + [ -n "$destargs_" ] && setv "$destargs_" "$args_" + return 1 + fi +} + +function parse_args_check() { + parse_opts "${PRETTYOPTS[@]}" "${args[@]}" @ args -- "$@" && return 0 + eerror "$args" + return 1 +} +function parse_args() { + parse_opts "${PRETTYOPTS[@]}" "${args[@]}" @ args -- "$@" || die "$args" +} + +HELP_DESC= +HELP_USAGE= +HELP_OPTIONS= +function __genparse_shortopt() { + local LC_COLLATE=C + local shortopt="${1//[^A-Z]}" + shortopt="$(strlower "${shortopt:0:1}")" + [ -n "$shortopt" ] && echo "$shortopt" +} +function genparse() { + + local -a names descs vars options + local i desc var option name uname value shortopt + + for var in "$@"; do + if [[ "$var" == *=* ]]; then + splitvar "$var" name value + shortopt="$(__genparse_shortopt "$name")" + option="$(strlower "$name")" + name="${option//-/_}" + array_add names "$name" + array_add descs "${shortopt:+-$shortopt, }--$option VALUE" + array_add vars "$(echo_setv "$name" "$value")" + array_add options "${shortopt:+-$shortopt:,}--$option: $name=" + else + name="$var" + shortopt="$(__genparse_shortopt "$name")" + option="$(strlower "$name")" + name="${option//-/_}" + array_add names "$name" + array_add descs "${shortopt:+-$shortopt, }--$option" + array_add vars "$name=" + array_add options "${shortopt:+-$shortopt,}--$option $name=1" + fi + done + + echo -n 'function display_help() { + [ -n "$HELP_USAGE" ] || HELP_USAGE="USAGE + $scriptname' + [ -n "$descs" ] && echo -n ' [options]' + echo '"' + if [ -n "$descs" ]; then + echo -n ' [ -n "$HELP_OPTIONS" ] || HELP_OPTIONS="OPTIONS' + i=0 + while [ $i -lt ${#descs[*]} ]; do + name="${names[$i]}" + uname="$(strupper "$name")" + desc="${descs[$i]}" + echo -n " +\${HELP_${uname}_OPTION:- $desc\${HELP_${uname}_DESC:+ + \${HELP_${uname}_DESC// +/ + }}}" + i=$(($i + 1)) + done + echo '"' + fi + echo ' uecho "${HELP_DESC:+$HELP_DESC + +}$HELP_USAGE${HELP_OPTIONS:+ + +$HELP_OPTIONS}" +} +' + for var in "${vars[@]}"; do + echo "$var" + done + echo 'parse_opts "${PRETTYOPTS[@]}" \' + echo ' --help '\''$exit_with display_help'\'' \' + for option in "${options[@]}"; do + echo " $option \\" + done + echo ' @ args -- "$@" && set -- "${args[@]}" || die "$args"' +} +##@inc]base.args +uprovide base.tools +urequire base.args #XXX il manque des dépendances! + +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 _rval() { + local s="$*" + s="${s//\\/\\\\}" + s="${s//\"/\\\"}" + s="${s//\'/\'}" + s="${s//\$/\\\$}" + s="${s//\`/\\\`}" + s="${s// /\\ }" + recho_ "$s" +} +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 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 @@ -1943,7 +2718,7 @@ if [ -n "$BASH_VERSINFO" -a "${BASH_VERSINFO[0]}" -lt 4 ]; then 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.compat +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 @@ -2518,6 +3293,14 @@ function deref() { 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" } @@ -2552,6 +3335,83 @@ function path_if_test() { 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 @@ -2802,8 +3662,8 @@ function nl2cr() { } function _latin1compat() { LANG=fr_FR.UTF-8 sed $' -s/[’]/\x27/g -s/[«»]/"/g +s/[‘’]/\x27/g +s/[«»“”]/"/g s/[\xC2\xA0\xE2\x80\x87\xE2\x80\xAF\xE2\x81\xA0]/ /g ' } @@ -2835,11 +3695,12 @@ function list_all() { cd "$curdir" } function __la_cmd() { - [ -n "$*" ] || set '*' + [ $# -gt 0 ] || set '*' local arg local cmd="/bin/ls -1d" for arg in "$@"; do - cmd="$cmd $(quote_arg "$arg")" + arg="$(_rval "$arg")" + cmd="$cmd $arg" done cmd="$cmd 2>/dev/null" echo "$cmd" @@ -3853,7 +4714,7 @@ function page_maybe() { function utools_local() { local arg - [ -n "$*" ] || set -- opts verbosity interaction + [ $# -gt 0 ] || set -- opts verbosity interaction for arg in "$@"; do case "$arg" in parse_opts|opts|o|args) echo "local -a args";; @@ -3875,14 +4736,82 @@ function out_isatty() { function err_isatty() { tty -s <&2 } -function die() { - [ -n "$*" ] && eerror "$@"; exit 1 +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 exit_with { - [ -n "$*" ] && "$@"; exit $? +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_with { - [ -n "$1" ] && eerror "$1"; shift; [ -n "$*" ] && "$@"; exit 1 +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' @@ -3965,7 +4894,7 @@ function toienc() { fi } function uread() { - [ -n "$*" ] || set -- REPLY + [ $# -gt 0 ] || set -- REPLY local __r_var read "$@" for __r_var in "$@"; do @@ -4207,7 +5136,7 @@ function __t_etitle() { __etitle "$__t_title" 1>&2 fi fi - if [ -n "$*" ]; then + if [ $# -gt 0 ]; then "$@" __t_s=$? [ "$__t_eend" == "default" ] && __t_eend=1 @@ -4272,7 +5201,7 @@ function ebegin() { eflush __ebegin "$__b_msg" 1>&2 fi - if [ -n "$*" ]; then + if [ $# -gt 0 ]; then "$@" __b_s=$? [ "$__b_eend" == "default" ] && __b_eend=1 @@ -4292,7 +5221,7 @@ function edot() { else __edotx 1>&2 fi - show_verbose && [ -n "$*" ] && __edotd "$*" 1>&2 + show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2 return $s } function edotw() { @@ -4302,7 +5231,7 @@ function edotw() { [ -n "$1" ] && s="$1" shift __edotw 1>&2 - show_verbose && [ -n "$*" ] && __edotd "$*" 1>&2 + show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2 return $s } function ewait() { @@ -4379,15 +5308,15 @@ function ask_yesno() { fi } function read_value() { - local -a __rv_opts + 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 + local -a __rv_opts __rv_readline= __rv_showdef= __rv_nl=1 __rv_opts=(-s) __rv_read "$@" - echo "" } function __rv_read() { local __rv_int=1 @@ -4417,9 +5346,21 @@ function __rv_read() { else tooenc_ "Entrez la valeur" "$UTF8" 1>&2 fi - [ -n "$__rv_d" ] && tooenc_ " [$__rv_d]" 1>&2 - tooenc_ ": " "$UTF8" 1>&2 - uread "${__rv_opts[@]}" __rv_r + 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" @@ -4430,7 +5371,7 @@ function __rv_read() { 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 -- "$@" && + 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}" @@ -4491,6 +5432,25661 @@ function simple_menu() { 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 _rval() { + local s="$*" + s="${s//\\/\\\\}" + s="${s//\"/\\\"}" + s="${s//\'/\'}" + s="${s//\$/\\\$}" + s="${s//\`/\\\`}" + s="${s// /\\ }" + recho_ "$s" +} +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 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 +} +##@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="${v#-}" + v="${v//[0-9]/}" + [ -z "$v" ] +} +function ispnum() { + [ ${#1} -gt 0 ] || return 1 + local v="$1" + v="${v//[0-9]/}" + [ -z "$v" ] +} +function isrnum() { + [ ${#1} -gt 0 ] || return 1 + local v="$1" + v="${v#-}" + 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="${v#-}" + v="${v//[0-9]/}" + [ -z "$v" ] +} +function ispnum() { + [ ${#1} -gt 0 ] || return 1 + local v="$1" + v="${v//[0-9]/}" + [ -z "$v" ] +} +function isrnum() { + [ ${#1} -gt 0 ] || return 1 + local v="$1" + v="${v#-}" + 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//\//\\/}" + 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 +} +##@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 _rval() { + local s="$*" + s="${s//\\/\\\\}" + s="${s//\"/\\\"}" + s="${s//\'/\'}" + s="${s//\$/\\\$}" + s="${s//\`/\\\`}" + s="${s// /\\ }" + recho_ "$s" +} +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 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 +} +##@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="${v#-}" + v="${v//[0-9]/}" + [ -z "$v" ] +} +function ispnum() { + [ ${#1} -gt 0 ] || return 1 + local v="$1" + v="${v//[0-9]/}" + [ -z "$v" ] +} +function isrnum() { + [ ${#1} -gt 0 ] || return 1 + local v="$1" + v="${v#-}" + 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="${v#-}" + v="${v//[0-9]/}" + [ -z "$v" ] +} +function ispnum() { + [ ${#1} -gt 0 ] || return 1 + local v="$1" + v="${v//[0-9]/}" + [ -z "$v" ] +} +function isrnum() { + [ ${#1} -gt 0 ] || return 1 + local v="$1" + v="${v#-}" + 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//\//\\/}" + 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 +} +##@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 _rval() { + local s="$*" + s="${s//\\/\\\\}" + s="${s//\"/\\\"}" + s="${s//\'/\'}" + s="${s//\$/\\\$}" + s="${s//\`/\\\`}" + s="${s// /\\ }" + recho_ "$s" +} +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 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 +} +##@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="${v#-}" + v="${v//[0-9]/}" + [ -z "$v" ] +} +function ispnum() { + [ ${#1} -gt 0 ] || return 1 + local v="$1" + v="${v//[0-9]/}" + [ -z "$v" ] +} +function isrnum() { + [ ${#1} -gt 0 ] || return 1 + local v="$1" + v="${v#-}" + 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="${v#-}" + v="${v//[0-9]/}" + [ -z "$v" ] +} +function ispnum() { + [ ${#1} -gt 0 ] || return 1 + local v="$1" + v="${v//[0-9]/}" + [ -z "$v" ] +} +function isrnum() { + [ ${#1} -gt 0 ] || return 1 + local v="$1" + v="${v#-}" + 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//\//\\/}" + 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 +} +##@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 _rval() { + local s="$*" + s="${s//\\/\\\\}" + s="${s//\"/\\\"}" + s="${s//\'/\'}" + s="${s//\$/\\\$}" + s="${s//\`/\\\`}" + s="${s// /\\ }" + recho_ "$s" +} +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 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 +} +##@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="${v#-}" + v="${v//[0-9]/}" + [ -z "$v" ] +} +function ispnum() { + [ ${#1} -gt 0 ] || return 1 + local v="$1" + v="${v//[0-9]/}" + [ -z "$v" ] +} +function isrnum() { + [ ${#1} -gt 0 ] || return 1 + local v="$1" + v="${v#-}" + 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="${v#-}" + v="${v//[0-9]/}" + [ -z "$v" ] +} +function ispnum() { + [ ${#1} -gt 0 ] || return 1 + local v="$1" + v="${v//[0-9]/}" + [ -z "$v" ] +} +function isrnum() { + [ ${#1} -gt 0 ] || return 1 + local v="$1" + v="${v#-}" + 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//\//\\/}" + 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 +} +##@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 _rval() { + local s="$*" + s="${s//\\/\\\\}" + s="${s//\"/\\\"}" + s="${s//\'/\'}" + s="${s//\$/\\\$}" + s="${s//\`/\\\`}" + s="${s// /\\ }" + recho_ "$s" +} +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 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 +} +##@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="${v#-}" + v="${v//[0-9]/}" + [ -z "$v" ] +} +function ispnum() { + [ ${#1} -gt 0 ] || return 1 + local v="$1" + v="${v//[0-9]/}" + [ -z "$v" ] +} +function isrnum() { + [ ${#1} -gt 0 ] || return 1 + local v="$1" + v="${v#-}" + 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="${v#-}" + v="${v//[0-9]/}" + [ -z "$v" ] +} +function ispnum() { + [ ${#1} -gt 0 ] || return 1 + local v="$1" + v="${v//[0-9]/}" + [ -z "$v" ] +} +function isrnum() { + [ ${#1} -gt 0 ] || return 1 + local v="$1" + v="${v#-}" + 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//\//\\/}" + 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 +} +##@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 _rval() { + local s="$*" + s="${s//\\/\\\\}" + s="${s//\"/\\\"}" + s="${s//\'/\'}" + s="${s//\$/\\\$}" + s="${s//\`/\\\`}" + s="${s// /\\ }" + recho_ "$s" +} +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 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 +} +##@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="${v#-}" + v="${v//[0-9]/}" + [ -z "$v" ] +} +function ispnum() { + [ ${#1} -gt 0 ] || return 1 + local v="$1" + v="${v//[0-9]/}" + [ -z "$v" ] +} +function isrnum() { + [ ${#1} -gt 0 ] || return 1 + local v="$1" + v="${v#-}" + 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="${v#-}" + v="${v//[0-9]/}" + [ -z "$v" ] +} +function ispnum() { + [ ${#1} -gt 0 ] || return 1 + local v="$1" + v="${v//[0-9]/}" + [ -z "$v" ] +} +function isrnum() { + [ ${#1} -gt 0 ] || return 1 + local v="$1" + v="${v#-}" + 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//\//\\/}" + 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 +} +##@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 _rval() { + local s="$*" + s="${s//\\/\\\\}" + s="${s//\"/\\\"}" + s="${s//\'/\'}" + s="${s//\$/\\\$}" + s="${s//\`/\\\`}" + s="${s// /\\ }" + recho_ "$s" +} +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 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 +} +##@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="${v#-}" + v="${v//[0-9]/}" + [ -z "$v" ] +} +function ispnum() { + [ ${#1} -gt 0 ] || return 1 + local v="$1" + v="${v//[0-9]/}" + [ -z "$v" ] +} +function isrnum() { + [ ${#1} -gt 0 ] || return 1 + local v="$1" + v="${v#-}" + 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="${v#-}" + v="${v//[0-9]/}" + [ -z "$v" ] +} +function ispnum() { + [ ${#1} -gt 0 ] || return 1 + local v="$1" + v="${v//[0-9]/}" + [ -z "$v" ] +} +function isrnum() { + [ ${#1} -gt 0 ] || return 1 + local v="$1" + v="${v#-}" + 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//\//\\/}" + 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 +} +##@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 @@ -5798,7 +32394,6 @@ parse_opts "${PRETTYOPTS[@]}" \ array_fix_paths hosts if [ "$action" != "add_to_crontab" ]; then - # undoscript n'est valide que pour l'action -a undoscript= fi if [ -n "$cmdfile" -a -z "$cmd" ]; then @@ -5807,29 +32402,20 @@ fi [ -n "$cmdfile" ] && cmdfile="$(basename "$cmdfile")" if [ -n "$dundoscript" -a "$action" == "add_to_crontab" ]; then if [ -n "${hosts[*]}" -o -n "${hostsfiles[*]}" ]; then - # par défaut, faire un script d'annulation pour les déploiements - # distants undoscript="undo-ucrontab.sh" fi fi -################################################################################ -# Fonctions function update_undoscript() { - # Mettre à jour le fichier d'annulation $1 pour enlever la ligne de crontab - # $4 en se connectant éventuellement sur l'hôte $3 avec le user $2 local undoscript="$1" user="$2" host="$3" ctline="$4" - # $undoscript doit être défini [ -n "$undoscript" ] || return [ -n "$fake" ] && undoscript="fake-$undoscript" [ -z "$fake" ] && estep "Maj de $undoscript" if [ ! -f "$undoscript" ]; then cat >"$undoscript" <= 24 n'est pas traité fi echo "$hours:$minutes" } function update_ctline() { - # Mettre à jour la ligne de crontab $1 avec l'heure $2 à laquelle on rajoute - # $3 minutes local ctline="$1" time="$2" offset="$3" local hours minutes @@ -5894,19 +32474,14 @@ function update_ctline() { } function update_cmd() { - # Mettre à jour la ligne de crontab $1 avec la commande $2 local ctline="$1" cmd="$2" awkrun cmd="$cmd" '{$0 = $1 " " $2 " " $3 " " $4 " " $5 " " cmd; print}' <<<"$ctline" } -################################################################################ -# Programme principal function do_local() { if [ "$user" != "root" -a "$user" == "$USER" ]; then - # Si le user n'est pas root, et qu'il s'agisse du user courant, il ne faut - # pas utiliser l'option -u de crontab user= fi [ -n "$cmdfile" ] || cmdfile=custom-script @@ -5915,8 +32490,6 @@ function do_local() { local tmpcmd="$TMPDIR/ucrontab-$(basename "$cmdfile")" if [ -n "$cmd" ]; then echo "\ -#!/bin/bash -# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 $cmd"' /bin/rm -f "$0"; exit 0' >"$tmpcmd" chmod +x "$tmpcmd" @@ -5936,7 +32509,6 @@ $(sed 's/^/ /g' <<<"$cmd")" else r=$? if [ $r -eq 123 ]; then - # ignorer les erreurs si la ligne a déjà été ajoutée/supprimée r=0 if [ "$action" == "add_to_crontab" ]; then ewarn "La ligne '$ctline' existe déjà dans crontab" @@ -6009,14 +32581,12 @@ $(sed 's/^/ /g' <<<"$cmd")" return $r } -# calculer dom si nécessaire if [ -z "$dom" -o -z "$month" ]; then tomorrow="$(parse_date +1)" [ -n "$dom" ] || dom="${tomorrow%%/*}" [ -n "$month" ] || { month="${tomorrow#*/}"; month="${month%/*}"; } fi DEFAULT_CTLINE="0 7 $dom $month * /sbin/shutdown -h now" -# obtenir et mettre à jour si nécessaire ctline ctline="$1" if [ "${ctline#halt}" != "$ctline" ]; then if [ "${ctline#halt@}" != "$ctline" ]; then @@ -6026,23 +32596,17 @@ if [ "${ctline#halt}" != "$ctline" ]; then [ "$increment" == "auto" ] && increment=1 fi if [ -n "$hostsfiles" ]; then - # il faudra traiter un fichier d'hôtes [ -n "$ctline" ] || ctline="$DEFAULT_CTLINE" else - # il faudra traiter l'hote local ou les hôtes spécifiés sur la ligne de - # commande [ -n "$ctline" ] || die "Vous devez spécifier la ligne de crontab" fi [ -n "$time" ] && ctline="$(update_ctline "$ctline" "$time")" [ -z "$time" ] && time="$(get_time "$ctline")" -# par défaut, ne pas auto-incrémenter [ "$increment" == "auto" ] && increment= -# pour la configuration remote remotename="$scriptname.$$" aoffset=0 if [ -n "$hostsfiles" ]; then - # traiter un fichier d'hôtes orig_ctline="$ctline" orig_cmdfile="$cmdfile" orig_cmd="$cmd" @@ -6053,7 +32617,6 @@ if [ -n "$hostsfiles" ]; then gdelay= function start_group() { if [ -n "$gdelay" ]; then - # maj de time avec la nouvelle valeur time="$(update_time "$time" $(($aoffset + $gdelay)))" fi adelay="${1:-$DEFAULT_ADELAY}" @@ -6068,11 +32631,9 @@ if [ -n "$hostsfiles" ]; then cmd="$orig_cmd" if [ -n "$2" ]; then if [ "${2#<}" != "$2" ]; then - # on a spécifié un fichier de script cmdfile="${2#<}" cmd="$(<"$cmdfile")" || return 1 else - # utiliser directement cette commande cmdfile= cmd= ctline="$(update_cmd "$ctline" "$2")" @@ -6121,7 +32682,6 @@ $1 == "@include" { exit $r else - # traiter l'hote local ou les hôtes spécifiés sur la ligne de commande if [ -n "${hosts[*]}" ]; then do_remote; exit $? else