diff --git a/CHANGES.md b/CHANGES.md index 12709a3..9151691 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,38 @@ +## Version 6.2.0 du 13/03/2017-11:27 + +* `4a7b14b` ajouter un argument force à testupdated et testnewer +* `8a6678c` ruinst et rwoinst: piloter l'interaction distante à partir du paramétrage local +* `e9b574d` rwoinst: intégrer des fonctionnalités de ruinst; support préliminaire de deploy +* `2561f67` ruinst: utiliser la configuration ruinst par défaut pour deploy +* `38f21aa` ruinst: support de deploy pour calculer l'hôte pour le déploiement +* `d5846ba` deploy: possibilité de filtrer les variables à afficher. en cas d'échec, afficher false pour faciliter l'utilisation avec eval() +* `8fa58e2` quelques corrections sur deploy +* `20df6c4` support du depot deploy +* `3a24e83` régression dans set_array_cmd() +* `31fb39d` réorganiser certaines fonctions +* `528d579` ajout des fonctions seta(), _seta(), echo_seta() +* `a43359c` maj doc +* `2177e6a` cesser d'utiliser des fonctions obsolètes +* `9a777b3` cosmetic +* `a5fcf78` ajout de evali() +* `af3bb37` ajout de evals() +* `fbad986` corriger un problème potentiel avec should_quote() +* `f570438` bug avec recho -n; maj doc +* `3d1b826` cosmetic +* `e800376` cosmetic +* `0805f4f` SVirtualBox: ajout de l'option -r pour relancer avec restauration du snapshot +* `225060c` utempl/www: correction des options et modification cosmétique +* `ad88c99` Intégration de la branche update-templates + * `532d21d` support de la génération de pages html avec bootstrap + * `c52031b` maj de la description +* `ca4de19` Intégration de la branche update-apacheconfig + * `02f52af` afficher un menu si plusieurs répertoires de templates sont disponibles + * `6192c0a` description des modifications à apporter + * `f2b6381` SVirtualBox: démarrer en mode separate par défaut +* `7a38535` support des hôtes de l'université +* `b6b7fa9` uscrontab: support de l'option -G pour les tests +* `e58ff74` maj du template pour runs + ## Version 6.1.0 du 13/02/2017-17:06 * `748c2f7` Intégration de la branche update-network diff --git a/SVirtualBox b/SVirtualBox index 8f16855..252f09d 100755 --- a/SVirtualBox +++ b/SVirtualBox @@ -10,19 +10,38 @@ USAGE $scriptname [options] vmName OPTIONS - -n Ne rien faire excepté s'assurer que les modules VirtualBox sont chargés - -l Lister les machines virtuelles - -s Démarrer la machine virtuelle (par défaut) + -n, --nop + Ne rien faire excepté s'assurer que les modules VirtualBox sont chargés + -l, --list + Lister les machines virtuelles + -s, --start + Démarrer la machine virtuelle. C'est l'action par défaut. Si le nom de la machine virtuelle n'est pas spécifiée, un menu est affiché - -b Démarrer la VM sans interface graphique. Cette option n'est valide - qu'avec -s - -k Arrêter la machine virtuelle (par ACPI) - -p Mettre en veille la machine virtuelle (par ACPI) - -H Arrêter sauvagement la machine virtuelle - -R Redémarrer sauvagement la machine virtuelle - -S Enregistrer l'état de la machine virtuelle - -g Afficher le gestionnaire de machines virtuelle" + -x, --gui + -b, --headless + --separate + Ces options ne sont valides qu'avec -s et permettent de spécifier le + type de démarrage: 'gui' permet d'afficher une fenêtre complète dans + laquelle l'accélération graphique est supportée, headless démarre la + machine en tâche de fond, et separate affiche une fenêtre qui attaque la + machine démarrée en tâche de fond. --separate est l'option par défaut. + -k, -t, --stop + Arrêter la machine virtuelle. Les options -p, -H, -R, -S et -r + permettent de spécifier le type d'arrêt de la machine virtuelle + -p, --sleep + Mettre en veille la machine virtuelle (par ACPI) + -H, --poweroff + Arrêter sauvagement la machine virtuelle + -R, --reset + Redémarrer sauvagement la machine virtuelle + -S, --savestate + Enregistrer l'état de la machine virtuelle + -r, --rrestart + Arrêter la machine, restaurer l'état du dernier snapshot puis la + relancer. + -g, --gui + Afficher le gestionnaire de machines virtuelle" } function build_arrays() { @@ -62,20 +81,24 @@ function start_virtualbox() { } action=start +type=separate stopaction=acpipowerbutton -headless= +restore= parse_opts + "${PRETTYOPTS[@]}" \ --help '$exit_with display_help' \ - -n action=nop \ + -n,--nop action=nop \ -l,--list action=list \ -s,--start action=start \ - -b,--background,--headless headless=1 \ + -x,--gui type=gui \ + -b,--background,--headless type=headless \ + --separate type=separate \ -k,-t,--stop '$action=stop; stopaction=acpipowerbutton' \ -p,--sleep '$action=stop; stopaction=acpisleepbutton' \ - -H '$action=stop; stopaction=poweroff' \ - -R '$action=stop; stopaction=reset' \ - -S '$action=stop; stopaction=savestate' \ - -g action=gui \ + -H,--poweroff '$action=stop; stopaction=poweroff' \ + -R,--reset '$action=stop; stopaction=reset' \ + -S,--savestate '$action=stop; stopaction=savestate' \ + -r,--rrestart '$action=stop; restore=1' \ + -g,--gui action=gui \ @ args -- "$@" && set -- "${args[@]}" || die "$args" "$scriptdir/EnsureVM" virtualbox || die @@ -110,8 +133,8 @@ $(array_join rvms " fi if [ -n "$vm" ]; then - estep "Démarrage de $vm${headless:+ en tâche de fond}" - VBoxManage -q startvm ${headless:+--type headless} "$vm" "$@" + estep "Démarrage de $vm de type $type" + VBoxManage -q startvm --type "$type" "$vm" "$@" else ewarn "Aucune VM à démarrer n'a été trouvée" fi @@ -120,10 +143,23 @@ elif [ "$action" == stop ]; then if [ -z "$vm" -a "${rvms[*]}" ]; then select_vm rvms vm "Choisissez la VM à arrêter avec la méthode $stopaction" fi + [ -n "$vm" ] || die - if [ -n "$vm" ]; then - estep "Arrêt de $vm avec la méthode $stopaction" - VBoxManage -q controlvm "$vm" "$stopaction" + estep "Arrêt de $vm avec la méthode $stopaction" + VBoxManage -q controlvm "$vm" "$stopaction" || die + if [ -n "$restore" ]; then + ebegin "Attente de l'arrêt" + while true; do + build_arrays + array_contains svms "$vm" && break + edot 0 + sleep 1 + done + eend + estep "Restauration du snapshot" + VBoxManage -q snapshot "$vm" restorecurrent || die + estep "Démarrage" + VBoxManage -q startvm --type "$type" "$vm" fi elif [ "$action" == gui ]; then diff --git a/VERSION.txt b/VERSION.txt index dfda3e0..6abaeb2 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -6.1.0 +6.2.0 diff --git a/apacheconfig b/apacheconfig index 6f824b6..4003776 100755 --- a/apacheconfig +++ b/apacheconfig @@ -220,6 +220,28 @@ elif [ "$action" == deploy -o "$action" == localhosts ]; then elif [ "$action" == new-site ]; then host="$site_host" templdir="$site_templdir" + + if [ -z "$templdir" -a -d "$destdir/templates" ]; then + # si on ne précise pas le template à utiliser, alors afficher + # éventuellement un menu si plusieurs templates sont disponibles + templdirs=() + if [ -n "$(list_all "$destdir/templates" "*SITE*")" ]; then + array_add templdirs templates + templdir=templates + fi + array_from_lines stempldirs "$(list_dirs "$destdir/templates" | grep -v SITE)" + for stempldir in "${stempldirs[@]}"; do + if [ -n "$(list_all "$destdir/templates/$stempldir" "*SITE*")" ]; then + array_add templdirs "templates/$stempldir" + [ -n "$templdir" ] || templdir="templates/$stempldir" + fi + done + if [ ${#templdirs[*]} -gt 1 ]; then + simple_menu templdir templdirs -t "Choix du répertoire des modèles" -m "Veuillez choisir le modèle à utiliser" + fi + templdir="$destdir/$templdir" + fi + if [[ "$templdir" != */* ]] && [ -d "$destdir/templates/$templdir" ]; then templdir="$destdir/templates/$templdir" elif [ -z "$templdir" ]; then diff --git a/create-user b/create-user index 997f905..6fdbe69 100755 --- a/create-user +++ b/create-user @@ -161,11 +161,11 @@ $(qvals "./$scriptname" ${pkstring:+-s "$pkstring"} ${luser:+-l} "$user")" >"$wo estep "Exécution du script" "${ssh[@]}" "$remoteuser@$host" "\ -__estack=$(quoted_arg "$__estack") -__tlevel=$(quoted_arg "$__tlevel") +__estack=$(qval "$__estack") +__tlevel=$(qval "$__tlevel") export __estack __tlevel ${UTOOLS_LANG:+UTOOLS_LANG='$UTOOLS_LANG'; export UTOOLS_LANG -}$(quoted_args "./$archivename" ${tmproot:+--tmproot "$tmproot"})" +}$(qvals "./$archivename" ${tmproot:+--tmproot "$tmproot"})" r=$? ac_clean "$workdir" diff --git a/cssh b/cssh index 2a26417..aba5c67 100755 --- a/cssh +++ b/cssh @@ -23,7 +23,7 @@ vars="$("$scriptdir/ussh" --parse "$@")" || die eval "$vars" [ "${#hosts[*]}" -gt 0 ] || die "Vous devez spécifier l'hôte sur lequel se connecter" -cmd="'$(quoted_args "${args[@]}") +cmd="'$(qvals "${args[@]}") "' function __ask() { local r diff --git a/doc/tools/SVirtualBox.md b/doc/tools/SVirtualBox.md index 2d9e652..518c7d9 100644 --- a/doc/tools/SVirtualBox.md +++ b/doc/tools/SVirtualBox.md @@ -7,19 +7,38 @@ USAGE SVirtualBox [options] vmName OPTIONS - -n Ne rien faire excepté s'assurer que les modules VirtualBox sont chargés - -l Lister les machines virtuelles - -s Démarrer la machine virtuelle (par défaut) + -n, --nop + Ne rien faire excepté s'assurer que les modules VirtualBox sont chargés + -l, --list + Lister les machines virtuelles + -s, --start + Démarrer la machine virtuelle. C'est l'action par défaut. Si le nom de la machine virtuelle n'est pas spécifiée, un menu est affiché - -b Démarrer la VM sans interface graphique. Cette option n'est valide - qu'avec -s - -k Arrêter la machine virtuelle (par ACPI) - -p Mettre en veille la machine virtuelle (par ACPI) - -H Arrêter sauvagement la machine virtuelle - -R Redémarrer sauvagement la machine virtuelle - -S Enregistrer l'état de la machine virtuelle - -g Afficher le gestionnaire de machines virtuelle + -x, --gui + -b, --headless + --separate + Ces options ne sont valides qu'avec -s et permettent de spécifier le + type de démarrage: 'gui' permet d'afficher une fenêtre complète dans + laquelle l'accélération graphique est supportée, headless démarre la + machine en tâche de fond, et separate affiche une fenêtre qui attaque la + machine démarrée en tâche de fond. --separate est l'option par défaut. + -k, -t, --stop + Arrêter la machine virtuelle. Les options -p, -H, -R, -S et -r + permettent de spécifier le type d'arrêt de la machine virtuelle + -p, --sleep + Mettre en veille la machine virtuelle (par ACPI) + -H, --poweroff + Arrêter sauvagement la machine virtuelle + -R, --reset + Redémarrer sauvagement la machine virtuelle + -S, --savestate + Enregistrer l'état de la machine virtuelle + -r, --rrestart + Arrêter la machine, restaurer l'état du dernier snapshot puis la + relancer. + -g, --gui + Afficher le gestionnaire de machines virtuelle ~~~ -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary \ No newline at end of file diff --git a/doc/tools/create-user.md b/doc/tools/create-user.md new file mode 100644 index 0000000..4aca1b8 --- /dev/null +++ b/doc/tools/create-user.md @@ -0,0 +1,29 @@ +# create-user + +~~~ +create-user: créer un utilisateur sudoer et lui installer une clé publique ssh + +USAGE + create-user user [-p pubkey] + +OPTIONS + -p, --pkfile PKFILE + Installer la clé publique ssh contenue dans le fichier spécifié. Par + défaut, prendre le fichier ~/.ssh/id_rsa.pub de l'utilisateur courant. + -s, --pkstring PUBKEY + Installer la clé publique ssh spécifiée. Cette option avancée n'est pas + utilisée en temps normal. Elle a la priorité sur l'option --pkfile + -l, --luser + Ne pas donner à l'utilisateur le droit de sudoer. + -h, --host [USER@]HOST + Créer l'utilisateur sur l'hôte distant spécifié. Si l'utilisateur + distant n'est pas root, il doit être sudoer. + -T, --tmproot TMPROOT + Spécifier le répertoire temporaire sur l'hôte distant, comme par exemple + /var/tmp. Cette option est utile pour certains serveurs, qui ont un /tmp + minuscule. + -S, --ssh SSH + Spécifier le programme à utiliser pour la connection par ssh. +~~~ + +-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary \ No newline at end of file diff --git a/doc/tools/netconfig.md b/doc/tools/netconfig.md new file mode 100644 index 0000000..5b01a19 --- /dev/null +++ b/doc/tools/netconfig.md @@ -0,0 +1,45 @@ +# netconfig + +~~~ +netconfig: gérer la configuration du réseau + +USAGE + netconfig -c network.conf + netconfig [iface:]ip[/suffix]... + +OPTIONS + -P, --partial + Activer le mode de configuration partielle. C'est la valeur par défaut. + Dans ce mode, la configuration courante n'est pas modifiée. Seules de + nouvelles adresses ips sont configurées le cas échéant. + -F, --full + Activer le mode de configuration complète. Dans ce mode, le nom d'hôte + ainsi que toutes les interfaces, pont et adresses sont configurés. + -z, --reset + En mode full, recréer le fichier /etc/network/interfaces au lieu + d'essayer de le mettre à jour. + -l, --inline + Prendre la configuration depuis la ligne de commande. C'est la valeur + par défaut, sauf si un fichier network.conf existe dans le répertoire + courant. + Dans ce mode, chaque argument est une spécification d'adresse IP à + configurer. Les autres paramètres i.e les ponts, le nom d'hôte et le + contenu du fichier /etc/networks sont spécifiés avec les options -b, + -h et -e + -c, --config CONFIG + Spécifier le fichier de configuration à utiliser pour la configuration + du réseau. Cette option est automatiquement activée si le répertoire + courant contient un fichier network.conf + -w, --write + Ecrire la configuration actuelle dans le fichier network.conf + Note: comme ce script demande les droits de root, le fichier sera écrit + avec le propriétaire root. + -b, --bridge BR:IFACES + En mode inline, spécifier une liste de ponts à configurer. + -h, --host HOST + En mode inline, spécifier le nom d'hôte pleinement qualifié + -e, --etc-networks CONTENT + Spécifier un contenu pour remplacer le fichier /etc/networks +~~~ + +-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary \ No newline at end of file diff --git a/doc/tools/umountr.md b/doc/tools/umountr.md index 4caac66..a8c6ff3 100644 --- a/doc/tools/umountr.md +++ b/doc/tools/umountr.md @@ -6,13 +6,24 @@ umountr: démonter un système de fichier récursivement USAGE umountr mountpoint -Démonter tous les systèmes de fichiers qui sont montés en-dessous de mountpoint -puis démonter mountpoint. Démonter aussi tous les systèmes de fichiers -bind-montés à partir d'un sous-répertoire de mountpoint. - OPTION -c, --continuous Continuer même en cas d'erreur + -r, --recursive + -1, --no-recursive + Spécifier le type de démontage: + Avec -1, un démontage simple est effectué, comme avec umount. Ce type de + démontage est automatiquement sélectionné pour les systèmes de fichier + montés sous le répertoire /media + Avec -r, le démontage est récursif: tous les systèmes de fichiers qui + sont montés en-dessous de mountpoint sont démontés puis mountpoint est + démonté. Tous les systèmes de fichiers bind-montés à partir d'un sous- + répertoire de mountpoint sont démontés aussi. + -o, --poweroff + -k, --no-poweroff + Après avoir démonté le système de fichier mountpoint, éteindre le + périphérique qui y correspond. --poweroff est automatiquement activé + pour les systèmes de fichier montés sous le répertoire /media ~~~ -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary \ No newline at end of file diff --git a/doc/tools/uproject.md b/doc/tools/uproject.md index 93b3e16..473cc7b 100644 --- a/doc/tools/uproject.md +++ b/doc/tools/uproject.md @@ -56,11 +56,13 @@ COMMANDS -R Afficher les modifications effectuées depuis la dernière release. clone git@host:path/to/repo [destdir] + clone http://host/gituser/path/to/repo [destdir] Cloner un dépôt distant. Basculer sur la branche develop si elle existe. Initialiser git annex si le dépôt contient des fichiers annexés. Récupérer aussi ces fichiers avec 'git annex get' crone git@host:path/to/repo [destdir] + crone http://host/gituser/path/to/repo [destdir] Créer un dépôt distant sur gitolite, puis le cloner develop diff --git a/doc/tools/uscrontab.md b/doc/tools/uscrontab.md index c5a579b..a9da104 100644 --- a/doc/tools/uscrontab.md +++ b/doc/tools/uscrontab.md @@ -283,6 +283,12 @@ OPTIONS AVANCEES référence. Il faut respecter le format, sinon les résultats ne sont pas garantis. Le mieux est de reprendre le résultat de l'option --show-ctnow en le modifiant un peu si nécessaire. + -G, --any-ctnow + Pour le développement ou des tests, lancer toutes les commandes dans + l'ordre sans tenir compte de l'heure de référence. Cette commande ne + devrait pas être utilisée en temps normal, mais elle existe pour + simplifier les tests avec --show-ctnow + --force-ctnow dans les cas + simples. ~~~ -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary \ No newline at end of file diff --git a/doc/ulib/base.core.md b/doc/ulib/base.core.md index 2112d67..4403576 100644 --- a/doc/ulib/base.core.md +++ b/doc/ulib/base.core.md @@ -77,8 +77,9 @@ syntaxe 'setx -a array=cmd args...' est supportée aussi ~~~ Implémenter une syntaxe lisible et naturelle permettant d'enchainer des traitements sur une valeur. Par exemple, la commande -evalx cmd1... // cmd2... // cmd3... -affiche le résultat de la commande "$(cmd3 $(cmd2 $(cmd1)))" +evalx cmd1 [args1...] // cmd2 [args2...] // cmd3 [args3...] +est équivalente à la commande +cmd3 args3 "$(cmd2 args2 "$(cmd1 args1)")" Retourner le dernier code d'erreur non nul, ou 0 si toutes les commandes se sont exécutées sans erreur. ~~~ @@ -92,7 +93,7 @@ Implémenter une syntaxe alternative permettant d'enchainer des traitements sur un flux de données. Par exemple, la commande evalp cmd1... // cmd2... // cmd3... affiche le résultat de la commande "$(cmd1 | cmd2 | cmd3)" -Typiquement, cette fonction permet de faciliter la construction d'un +Typiquement, cette fonction permet de faciliter la *construction* d'un enchainement de commandes par programme, ou de faciliter l'utilisation de la fonction setx() pour récupérer le résultat d'un enchainement. Dans les autres cas, il est plus simple et naturel d'écrire les enchainements avec la syntaxe diff --git a/doc/ulib/base.num.md b/doc/ulib/base.num.md index cfbd9e0..72e7f5f 100644 --- a/doc/ulib/base.num.md +++ b/doc/ulib/base.num.md @@ -13,5 +13,9 @@ retourner vrai si $1 est une valeur numérique entière positive retourner vrai si $1 est une valeur numérique réelle (positive ou négative) le séparateur décimal peut être . ou , ~~~ +## `evali` +~~~ +Evaluer une expression numérique +~~~ -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary \ No newline at end of file diff --git a/doc/ulib/base.string.md b/doc/ulib/base.string.md index b074c99..04f9f5a 100644 --- a/doc/ulib/base.string.md +++ b/doc/ulib/base.string.md @@ -2,27 +2,27 @@ ## `straddp` ~~~ -ajouter le préfixe $1 à $2* +ajouter le préfixe $1 à $2..* ~~~ ## `strdelp` ~~~ -enlever le préfixe $1 à $2* +enlever le préfixe $1 à $2..* ~~~ ## `strdelp2` ~~~ -enlever le préfixe $1 le plus long à $2* +enlever le préfixe $1 le plus long à $2..* ~~~ ## `stradds` ~~~ -ajouter le suffixe $1 à $2* +ajouter le suffixe $1 à $2..* ~~~ ## `strdels` ~~~ -enlever le suffixe $1 à $2* +enlever le suffixe $1 à $2..* ~~~ ## `strdels2` ~~~ -enlever le suffixe le plus long $1 à $2* +enlever le suffixe le plus long $1 à $2..* ~~~ ## `strlower` ~~~ @@ -52,14 +52,14 @@ majuscule ~~~ ## `strmid` ~~~ -Afficher la plage $1 de la valeur $2*. La plage peut être d'une des formes +Afficher la plage $1 de la valeur $2..*. La plage peut être d'une des formes 'start', '[start]:length'. Si start est négatif, le compte est effectué à partir de la fin de la chaine. Si length est négatif, il est rajouté à la longueur de la chaine à partir de start ~~~ ## `strrepl` ~~~ -Remplacer dans la valeur $3* le motif $1 par la chaine $2. $1 peut commencer +Remplacer dans la valeur $3..* le motif $1 par la chaine $2. $1 peut commencer par l'un des caractères /, #, % pour indiquer le type de recherche ~~~ ## `strops` @@ -122,5 +122,46 @@ Tester si la chaine $1 commence par le wildcard $2 ~~~ Tester si la chaine $1 se termine par le wildcard $2 ~~~ +## `strsplitf` +~~~ +Cette fonction doit être appelée avec N arguments (avec N>1). Elle analyse et +découpe l'argument $N comme avec une ligne de commande du shell. Ensuite, elle +appelle la fonction $1 avec les arguments de $2 à ${N-1}, suivi des arguments +obtenus lors de l'analyse de l'argument $N. Par exemple, la commande suivante: +strsplitf cmd arg1 "long arg2" "arg3 'long arg4'" +est équivalente à: +cmd arg1 "long arg2" arg3 "long arg4" +Retourner le code 127 si la fonction à appeler n'est pas spécifiée. Retourner +le code 126 si une erreur s'est produite lors de l'analyse de l'argument $N +~~~ +## `strecho` +## `strqvals` +~~~ +Afficher chaque argument à part avec des quotes. A chainer avec strsplitf() +~~~ +## `strqlines` +~~~ +Afficher chaque ligne des fichiers spécifiés comme un argument. A chainer avec +strsplitf() +~~~ +## `strqarray` +~~~ +Afficher chaque valeur des tableaux $@ comme un argument. A chainer avec +strsplitf() +~~~ +## `evals` +~~~ +Enchainer des traitements sur des chaines de caractères, comme pour la fonction +evalx(). Il y a cependant quelques différences: +- Seules certains fonctions spécifiques peuvent être utilisées: elles sont +reconnaissables à leur préfixe 'str'. En effet, lors de l'utilisation d'une +commande par evals(), le préfixe 'str' est systématiquement ajouté. +- La fonction strsplitf() est traitée de façon particulière pour lancer une +commande avec le préfixe 'str' +Ainsi, la commande suivante: +evals cmd1 // splitf cmd2 +est équivalente à la commande: +strplitf strcmd2 "$(strcmd1)" +~~~ -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary \ No newline at end of file diff --git a/doc/ulib/conf.md b/doc/ulib/conf.md index 3179749..d62155b 100644 --- a/doc/ulib/conf.md +++ b/doc/ulib/conf.md @@ -13,9 +13,9 @@ Retourner 0 si une modification a été faite dans le fichier, 1 sinon ~~~ ## `conf_enableq` ~~~ -Comme conf_enable(), mais s'assure que les valeurs sont quotées dans le -fichier. Ceci permet de stocker des valeurs avec des espaces ou des -caractères spéciaux. +Comme conf_enable(), mais s'assure que les valeurs sont quotées si +nécessaire dans le fichier. Ceci permet de stocker des valeurs avec des +espaces ou des caractères spéciaux. ~~~ ## `conf_disable` ~~~ diff --git a/doc/ulib/debian.md b/doc/ulib/debian.md index 3d3b2be..c15221f 100644 --- a/doc/ulib/debian.md +++ b/doc/ulib/debian.md @@ -38,60 +38,6 @@ démarrage ~~~ Activer le service $1 pour qu'il se lance automatiquement au démarrage ~~~ -## `network_parse_confbr` -~~~ -network_parse_confbr "$confbr" br ifaces -~~~ -## `network_format_confbr` -~~~ -network_format_confbr "$br" ifaces --> "br:ifaces" -~~~ -## `network_parse_confip` -~~~ -network_parse_confip "$confip" iface gateway ipsuffixes -~~~ -## `network_parse_ipsuffix` -~~~ -network_parse_ipsuffix "$ipsuffix" ip suffix -~~~ -## `network_format_confip` -~~~ -network_format_confip "$iface" "$gateway" ipsuffixes --> "iface//gateway:ipsuffixes" -~~~ -## `network_format_ipsuffix` -~~~ -network_format_ipsuffix "$ip" "$suffix" --> "ip/suffix" -~~~ -## `network_fix_confbrs` -~~~ -normaliser le tableau $1(=confbrs): fusionner les doublons -~~~ -## `network_fix_confips` -~~~ -normaliser le tableau $1(=confips): fusionner les doublons, spécifier le -suffixe /24 par défaut, etc. $2 est le cas échéant l'interface associée -aux adresses ip non qualifiées -~~~ -## `network_fix_mainiface` -~~~ -A partir des valeurs des tableaux $1(=confbrs) et $2(=confips), et de -l'interface principale $3, déterminer l'interface principale. Si $3 est -spécifié, c'est la valeur sélectionnée. Sinon, si un bridge existe, c'est -le premier bridge qui est sélectionné. Sinon, la première interface est -sélectionnée. Sinon, on prend eth0. -Ensuite, réorganiser les tableaux de façon que confips[0] devienne la -configuration ip de l'interface principale. -~~~ -## `network_fix_confs` -## `network_set_confbrs` -~~~ -initialiser $1(=confbrs) avec l'état des bridges sur le système courant -~~~ -## `network_set_confips` -~~~ -initialiser le tableau $1(=confips) avec l'état des interfaces sur le -système courant -~~~ ## `network_interfaces_check_confbr` ~~~ Vérifier que la configuration du bridge $1, dont les membres sont les @@ -135,9 +81,6 @@ $3(=confips) ~~~ ## `network_fix_hostname` ## `network_fix_mailname` -## `network_fix_exim4` -## `network_fix_postfix` -## `network_fix_hosts` ## `network_config` ~~~ (Re)configurer le réseau sur l'hôte courant. Des efforts sont faits pour diff --git a/doc/ulib/ipcalc.md b/doc/ulib/ipcalc.md index b94fd7e..f5f86d5 100644 --- a/doc/ulib/ipcalc.md +++ b/doc/ulib/ipcalc.md @@ -73,5 +73,62 @@ Si $1 *semble* déjà être un nom d'hôte pleinement qualifié, l'afficher tel quel. Sinon utiliser ipcalc_fqdn() pour afficher le nom d'hôte pleinement qualifié correspondant. ~~~ +## `network_parse_confbr` +~~~ +network_parse_confbr "$confbr" br ifaces +~~~ +## `network_format_confbr` +~~~ +network_format_confbr "$br" ifaces --> "br:ifaces" +~~~ +## `network_parse_confip` +~~~ +network_parse_confip "$confip" iface gateway ipsuffixes +~~~ +## `network_parse_ipsuffix` +~~~ +network_parse_ipsuffix "$ipsuffix" ip suffix +~~~ +## `network_format_confip` +~~~ +network_format_confip "$iface" "$gateway" ipsuffixes --> "iface//gateway:ipsuffixes" +~~~ +## `network_format_ipsuffix` +~~~ +network_format_ipsuffix "$ip" "$suffix" --> "ip/suffix" +~~~ +## `network_fix_confbrs` +~~~ +normaliser le tableau $1(=confbrs): fusionner les doublons +~~~ +## `network_fix_confips` +~~~ +normaliser le tableau $1(=confips): fusionner les doublons, spécifier le +suffixe /24 par défaut, etc. $2 est le cas échéant l'interface associée +aux adresses ip non qualifiées +~~~ +## `network_fix_mainiface` +~~~ +A partir des valeurs des tableaux $1(=confbrs) et $2(=confips), et de +l'interface principale $3, déterminer l'interface principale. Si $3 est +spécifié, c'est la valeur sélectionnée. Sinon, si un bridge existe, c'est +le premier bridge qui est sélectionné. Sinon, la première interface est +sélectionnée. Sinon, on prend eth0. +Ensuite, réorganiser les tableaux de façon que confips[0] devienne la +configuration ip de l'interface principale. +~~~ +## `network_fix_confs` +## `network_set_confbrs` +~~~ +initialiser $1(=confbrs) avec l'état des bridges sur le système courant +~~~ +## `network_set_confips` +~~~ +initialiser le tableau $1(=confips) avec l'état des interfaces sur le +système courant +~~~ +## `network_fix_exim4` +## `network_fix_postfix` +## `network_fix_hosts` -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary \ No newline at end of file diff --git a/doc/ulib/redhat.md b/doc/ulib/redhat.md index e04e426..66f2059 100644 --- a/doc/ulib/redhat.md +++ b/doc/ulib/redhat.md @@ -32,9 +32,6 @@ démarrage ~~~ Activer le service $1 pour qu'il se lance automatiquement au démarrage ~~~ -## `create_bridge` -~~~ -Créer un nouveau pont nommé $1 avec les paramètres $2 -~~~ +## `network_fix_hostname` -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary \ No newline at end of file diff --git a/doc/ulib/sysinfos.md b/doc/ulib/sysinfos.md index d0bfa1b..3888611 100644 --- a/doc/ulib/sysinfos.md +++ b/doc/ulib/sysinfos.md @@ -11,6 +11,11 @@ et $3(=SYSVER) en fonction des valeurs des autres. Cette fonction est à utiliser quand on récupère cette information de la part de l'utilisateur, et qu'il faut compléter ~~~ +## `dump_sysinfos` +~~~ +Afficher les valeurs de SYSNAME, SYSDIST, SYSVER qui décrivent le système +actuel +~~~ ## `get_sysinfos_desc` ~~~ Afficher une chaine de la forme SYSNAME/SYSDIST/SYSVER qui décrit le @@ -46,6 +51,16 @@ cela n'a actuellement de sens qu'avec les version de MacOS X. Il faut aussi impérativement filtrer sur le système, e.g: check_sysinfos -s macosx -d 10.5+ ~~~ +## `unsupported_system` +~~~ +Afficher un message d'erreur indiquant que le système actuel n'est pas +supporté, et quitter le script +~~~ +## `require_sysinfos` +~~~ +Vérifier le système actuel avec check_sysinfos(), et afficher un message +d'erreur avec unsupported_system() s'il ne correspond pas à la requête +~~~ ## `on_debian` ~~~ Tester si on est sur debian. charger le module debian si c'est le cas. diff --git a/legacy/instinc/womonitor b/legacy/instinc/womonitor index e80c943..4cdc54c 100644 --- a/legacy/instinc/womonitor +++ b/legacy/instinc/womonitor @@ -224,7 +224,7 @@ found_element && $0 ~ /<\/element/ { local instance notfirst= for instance in "$@"; do - script="$script${notfirst:+|| }name == \"$(quote_awk "$instance")\"" + script="$script${notfirst:+|| }name == $(qawk "$instance")" notfirst=1 done script="$script"') { @@ -304,7 +304,7 @@ found_element && $0 ~ /<\/element/ { local instance notfirst= for instance in "$@"; do - script="$script${notfirst:+|| }name == \"$(quote_awk "$instance")\"" + script="$script${notfirst:+|| }name == $(qawk "$instance")" notfirst=1 done script="$script"') { diff --git a/lib/default/deploy b/lib/default/deploy new file mode 100644 index 0000000..6fd8cac --- /dev/null +++ b/lib/default/deploy @@ -0,0 +1,4 @@ +# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 + +# Emplacement où se trouve le dépôt source pour deploy +#DEPLOY_SRCDIR=~/wop/deploy diff --git a/lib/templates/www b/lib/templates/www index 755e66c..8d845c7 100755 --- a/lib/templates/www +++ b/lib/templates/www @@ -19,7 +19,42 @@ OPTIONS -f, --overwrite Ecraser le fichier s'il existe déjà -E, --encoding ENCODING - Spécifier l'encoding à utiliser pour la génération du fichier" + Spécifier l'encoding à utiliser pour la génération du fichier + --doctype DOCTYPE + -4, --html4 + -5, --html5 + Spécifier le type de document. Les options -4 et -5 sont équivalentes à + --doctype html4 et --doctype html5, respectivement. + -b, --baseurl BASEURL + Spécifier le chemin à partir de la racine qui contient les resources + blueprint et bootstrap + -B, --bspath, --bppath CLPATH + Spécifier le chemin sous BASEURL à partir duquel charger bootstrap ou + blueprint. La valeur par défaut est 'bootstrap' pour l'option --bs, + 'blueprint' pour l'option --bp + -s, --bs, --bootstrap + Activer le support de bootstrap. L'option --bs est automatiquement + activée si l'option --bspath n'est pas utilisée et le répertoire + [BASEURL/]bootstrap/ existe + -p, --bp, --blueprint + Activer le support de blueprint. L'option --bp est automatiquement + activée si l'option --bppath n'est pas utilisée et le répertoire + [BASEURL/]blueprint/ existe + -n, --nobs, --no-bootstrap, --nobp, --no-blueprint + Désactiver le support de bootstrap et blueprint + -j, --jquery + -k, --no-jquery + Activer (resp. désactiver) le chargement de jQuery à partir de BASEURL + pour les pages nues et avec blueprint. Avec bootstrap, le chargement de + jQuery est toujours effectué et cette option est ignorée. + --hl, --titlehl TITLEHL + Spécifier le tag à utiliser pour le titre. Vaut par défaut 'h1' pour les + templates HTML et PHP, 'h2' pour les templates overview et package + -T, --title TITLE + Spécifier le titre du document. + --head-title HTITLE + Spécifier le titre pour le tag dans la section <head>. La valeur + par défaut est celle de l'option --title." } NAME=www @@ -74,28 +109,114 @@ function __generate_html() { local dir="$(dirname "$file")" local nobpsuppl nobplocal nobpmobile - if [ "$blueprint" == auto ]; then - if [ -d "$dir/blueprint" ]; then - blueprint=1 - [ -f "$dir/bpsuppl.css" ] || nobpsuppl=1 - [ -f "$dir/bplocal.css" ] || nobplocal=1 - [ -f "$dir/bpmobile.css" ] || nobpmobile=1 + if [ "$csslib" == auto ]; then + if [ -n "$clpath" ]; then + if [ "$clpath" == bootstrap -o -z "${clpath##*/bootstrap}" ]; then + csslib=bootstrap + elif [ "$clpath" == blueprint -o -z "${clpath##*/blueprint}" ]; then + csslib=blueprint + else + csslib= + fi + elif [ -d "$dir/${baseurl#/}bootstrap" ]; then + csslib=bootstrap + elif [ -d "$dir/${baseurl#/}blueprint" ]; then + csslib=blueprint else - blueprint= + csslib= fi fi + if [ "$csslib" == bootstrap ]; then + [ -n "$clpath" ] || clpath=bootstrap + elif [ "$csslib" == blueprint ]; then + [ -n "$clpath" ] || clpath=blueprint + [ -f "$dir/${baseurl#/}bpsuppl.css" ] || nobpsuppl=1 + [ -f "$dir/${baseurl#/}bplocal.css" ] || nobplocal=1 + [ -f "$dir/${baseurl#/}bpmobile.css" ] || nobpmobile=1 + fi + + clpath="$baseurl$clpath" + [ "${clpath:$((-1)):1}" == / ] || clpath="$clpath/" + local jquerymin if [ "$jquery" == auto ]; then - if [ -f "$dir/jquery.min.js" ]; then + if [ "$csslib" == bootstrap ]; then + jquery= + elif [ -f "$dir/${baseurl#/}jquery.min.js" ]; then jquery=1 jquerymin=1 - elif [ -d "$dir/jquery.js" ]; then + elif [ -f "$dir/${baseurl#/}jquery.js" ]; then jquery=1 else jquery= fi fi + if [ "$doctype" == auto ]; then + if [ "$csslib" == bootstrap ]; then + doctype=html5 + else + doctype=html4 + fi + fi + head='<head>' + if [ "$doctype" == html5 ]; then + head="$head +"'<meta charset="'"$encoding"'" />' + else + head="$head +"'<meta http-equiv="Content-Type" content="text/html; charset='"$encoding"'" />' + fi + + if [ "$csslib" == bootstrap ]; then + head="$head +"'<meta http-equiv="X-UA-Compatible" content="IE=edge" /> +<meta name="viewport" content="width=device-width, initial-scale=1.0" /> +<link rel="shortcut" href="'"$clpath"'favicon.ico" /> +<link rel="icon apple-touch-icon" href="'"$clpath"'icon.png" />' + csslib='<link href="'"$clpath"'bootstrap/css/bootstrap.min.css" rel="stylesheet"/> +<script src="'"$clpath"'jquery.min.js" type="text/javascript"></script> +<script src="'"$clpath"'bootstrap/js/bootstrap.min.js" type="text/javascript"></script> +<!--[if lt IE 9]> +<script src="'"$clpath"'html5shiv/html5shiv.js"></script> +<script src="'"$clpath"'respond/respond.min.js"></script> +<![endif]-->' + startcl='<div class="container">' + endcl='</div>' + elif [ "$csslib" == blueprint ]; then + head="$head +"'<meta name="viewport" content="width=device-width, initial-scale=1.0" /> +<link rel="shortcut" href="'"$baseurl"'favicon.ico" /> +<link rel="icon apple-touch-icon" href="'"$baseurl"'icon.png" />' + csslib='<link rel="stylesheet" href="'"$clpath"'screen.css" type="text/css" media="screen, projection" /> +<link rel="stylesheet" href="'"$clpath"'print.css" type="text/css" media="print" /> +<!--[if lt IE 8]> +<link rel="stylesheet" href="'"$clpath"'ie.css" type="text/css" media="screen, projection" /> +<![endif]--> +<'"${nobpsuppl:+!--}"'link rel="stylesheet" href="'"$baseurl"'bpsuppl.css" type="text/css" media="screen, projection" /'"${nobpsuppl:+--}"'> +<'"${nobplocal:+!--}"'link rel="stylesheet" href="'"$baseurl"'bplocal.css" type="text/css" media="screen, projection" /'"${nobplocal:+--}"'> +<'"${nobpmobile:+!--}"'link rel="stylesheet" href="'"$baseurl"'bpmobile.css" type="text/css" media="handheld, only screen and (max-device-width: 480px)" /'"${nobpmobile:+--}"'>' + startcl='<div class="container">' + endcl='</div>' + else + # pas de csslib ou csslib non supporté + head="$head +"'<meta name="viewport" content="width=device-width, initial-scale=1.0" /> +<link rel="shortcut" href="'"$baseurl"'favicon.ico" /> +<link rel="icon apple-touch-icon" href="'"$baseurl"'icon.png" />' + csslib= + startcl= + endcl= + fi + if [ -n "$jquery" ]; then + jquery='<script src="'"${baseurl}jquery${jquerymin:+.min}.js"'"></script>' + fi + start='<title>'"$head_title"' + +' + end=' +' + case "$doctype" in html4) doctype='' @@ -110,27 +231,6 @@ function __generate_html() { html='' ;; esac - head=' - - - -' - [ -n "$blueprint" ] && blueprint=' - - -<'"${nobpsuppl:+!--}"'link rel="stylesheet" href="bpsuppl.css" type="text/css" media="screen, projection" /'"${nobpsuppl:+--}"'> -<'"${nobplocal:+!--}"'link rel="stylesheet" href="bplocal.css" type="text/css" media="screen, projection" /'"${nobplocal:+--}"'> -<'"${nobpmobile:+!--}"'link rel="stylesheet" href="bpmobile.css" type="text/css" media="handheld, only screen and (max-device-width: 480px)" /'"${nobpmobile:+--}"'>' - [ -n "$jquery" ] && jquery='' - start=''"$head_title"' - -' - startbp='
' - endbp='
' - end=' -' } function __before_write_html() { doctype="$doctype app local appname="$(basename -- "$1")" # supprimer l'extension @@ -1575,7 +1483,7 @@ function get_archive_versionsuffix() { function get_archive_version() { # Obtenir la valeur probable de la version de l'application ou du framework # contenu dans l'archive $1, e.g: -# get_archive_versionsuffix app-0.1.tgz +# get_archive_version app-0.1.tgz # --> 0.1 local basename="$(get_archive_basename "$1")" echo "$basename" | awk '{ @@ -1631,10 +1539,10 @@ function runscript_as() { local cmd cmd="\ -__estack=$(quoted_arg "$__estack") -__tlevel=$(quoted_args "$__tlevel") +__estack=$(qval "$__estack") +__tlevel=$(qval "$__tlevel") export __estack __tlevel -exec ${BASH:-/bin/sh} $(quoted_args "$@")" +exec ${BASH:-/bin/sh} $(qvals "$@")" if is_yes "$UTOOLS_USES_SU" || ! progexists sudo; then eecho "Entrez le mot de passe de root" @@ -1818,8 +1726,8 @@ En l'occurence, ce script est accédé par le chemin $script et ce chemin doit e estep "Lancement de la commande sur l'hôte distant $user@$host" local cmd - [ -n "$path" ] && cmd="$(quoted_args cd "$path"); " - cmd="$cmd$(quoted_args "$script" "$@")" + [ -n "$path" ] && cmd="$(qvals cd "$path"); " + cmd="$cmd$(qvals "$script" "$@")" ssh -qt "${UTOOLS_ENSURE_HOSTNAME_SSH_OPTS[@]}" "$user@$host" "$cmd" [ $? -eq 255 ] && return 12 return 1 @@ -2506,15 +2414,15 @@ function awkdef() { __ad_value="${1:$__ad_vpos}" if [ -n "$__ad_int" ]; then # valeur entière - echo "$__ad_name = int($(quoted_awk "$__ad_value") + 0)" + echo "$__ad_name = int($(qawk "$__ad_value") + 0)" elif [ -n "$__ad_str" ]; then # valeur chaine - echo "$__ad_name = $(quoted_awk "$__ad_value")" + echo "$__ad_name = $(qawk "$__ad_value")" elif [ ${#__ad_value} -lt 256 ] && isnum "$__ad_value"; then # considérer qu'une nombre fait moins de 256 chiffres echo "$__ad_name = $__ad_value" else - echo "$__ad_name = $(quoted_awk "$__ad_value")" + echo "$__ad_name = $(qawk "$__ad_value")" fi else # fin de l'analyse des définitions de variable @@ -2530,7 +2438,7 @@ function awkdef() { local __ad_i=1 echo "$__ad_name[0] = 0; delete $__ad_name" for __ad_arg in "${!__ad_value}"; do - echo "$__ad_name[$__ad_i]=$(quoted_awk "$__ad_arg")" + echo "$__ad_name[$__ad_i]=$(qawk "$__ad_arg")" __ad_i=$(($__ad_i + 1)) done eval "echo \"\${__ad_name}_count = \${#$__ad_value}\"" @@ -2539,7 +2447,7 @@ function awkdef() { done echo "}" for __ad_arg in "$@"; do - rawecho "$__ad_arg" + recho "$__ad_arg" done fi @@ -2967,7 +2875,7 @@ function tooenc() { # $3=($UTOOLS_OUTPUT_ENCODING) local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" if [ "$from" == "$to" ]; then - rawecho "$src" + recho "$src" else iconv -f "$from" -t "$to" <<<"$src" fi @@ -2980,9 +2888,9 @@ function tooenc_() { # $3=($UTOOLS_OUTPUT_ENCODING) local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" if [ "$from" == "$to" ]; then - rawecho_ "$src" + recho_ "$src" else - rawecho_ "$src" | iconv -f "$from" -t "$to" + recho_ "$src" | iconv -f "$from" -t "$to" fi } function uecho_() { @@ -2993,7 +2901,7 @@ function toienc() { # $3(=$UTOOLS_INPUT_ENCODING) local __tie_var="$1" __tie_to="${2:-$IENC}" __tie_from="${3:-$UTOOLS_INPUT_ENCODING}" if [ "$__tie_from" != "$__tie_to" ]; then - set_var "$__tie_var" "$(iconv -f "$__tie_from" -t "$__tie_to" <<<"${!__tie_var}")" + _setv "$__tie_var" "$(iconv -f "$__tie_from" -t "$__tie_to" <<<"${!__tie_var}")" fi } function uread() { @@ -3075,7 +2983,7 @@ function __indent() { /}" != "$1" ]; then sed "2,\$s/^/${__tlevel}/g" <<<"$1" else - rawecho "$1" + recho "$1" fi } # fonctions à surcharger pour modifier la façon dont les messages sont affichés @@ -3163,7 +3071,7 @@ function get_interaction_option() { :;} __epending= function eflush() { # Afficher les messages en attente - if [ -n "$__epending" ]; then rawecho "$__epending" 1>&2; __epending=; fi + if [ -n "$__epending" ]; then recho "$__epending" 1>&2; __epending=; fi } function eclearp() { # Supprimer les message en attente @@ -3211,7 +3119,7 @@ function edebug() { function trace() { # Afficher la commande $1..@, la lancer, puis afficher son code d'erreur si une # erreur se produit - local r cmd="$(quoted_args "$@")" + local r cmd="$(qvals "$@")" show_info && { eflush; __eecho "\$ $cmd" 1>&2; } "$@"; r=$? if [ $r -ne 0 ]; then @@ -3230,7 +3138,7 @@ function trace_error() { local r "$@"; r=$? if [ $r -ne 0 ]; then - local cmd="$(quoted_args "$@")" + local cmd="$(qvals "$@")" show_error && { eflush; __eecho "^ $cmd [EC #$r]" 1>&2; } fi return $r @@ -3649,7 +3557,7 @@ function __rv_read() { OENC="$UTF8" eerror "La valeur par défaut de $__rv_v doit être non vide" return 1 fi - set_var "$__rv_v" "$__rv_d" + _setv "$__rv_v" "$__rv_d" return 0 fi @@ -3678,7 +3586,7 @@ function __rv_read() { fi __rv_r="${__rv_r:-$__rv_d}" if [ -n "$__rv_r" ] || ! is_yes "$__rv_re"; then - set_var "$__rv_v" "$__rv_r" + _setv "$__rv_v" "$__rv_r" return 0 fi done @@ -3755,7 +3663,7 @@ function simple_menu() { __sm_c=0 fi done - set_var "$__sm_option_var" "$__sm_option" + _setv "$__sm_option_var" "$__sm_option" } function actions_menu() { @@ -3801,8 +3709,8 @@ function actions_menu() { eerror_unless [ ${#__am_action_descs[*]} -gt 0 ] "Vous devez spécifier le tableau des actions" || return __actions_menu || return 1 - setv "${1:-action}" "$__am_select_action" - setv "${2:-option}" "$__am_select_option" + _setv "${1:-action}" "$__am_select_action" + _setv "${2:-option}" "$__am_select_option" } function __actions_menu() { local title="$__am_title" @@ -4091,12 +3999,12 @@ function ac_set_tmpfile() { fi fi if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" + _setv "$1" "$3" [ -f "$3" -a "$4" == keep ] || >"$3" else local __acst_t="$(mktempf "$2")" autoclean "$__acst_t" - set_var "$1" "$__acst_t" + _setv "$1" "$__acst_t" fi } function ac_set_tmpdir() { @@ -4115,12 +4023,12 @@ function ac_set_tmpdir() { fi fi if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" + _setv "$1" "$3" mkdir -p "$3" else local __acst_t="$(mktempd "$2")" autoclean "$__acst_t" - set_var "$1" "$__acst_t" + _setv "$1" "$__acst_t" fi } function debug_tee() { diff --git a/lib/ulib/base.bool b/lib/ulib/base.bool index c1ce910..27ab80e 100644 --- a/lib/ulib/base.bool +++ b/lib/ulib/base.bool @@ -29,6 +29,24 @@ function yesval() { is_yes "$1" && echo 1 } +function setyesval() { +# mettre la valeur normalisée de la valeur "oui" de $2 dans la variable $1 + is_yes "$2" && _setv "$1" 1 || _setv "$1" "" +} +function normyesval() { +# remplacer la valeur de la variable $1 par la valeur normalisée de sa valeur "oui" +# Si $2 est non vide, prendre cette valeur plutôt que la valeur de la variable $1 + is_yes "${2:-"${!1}"}" && _setv "$1" 1 || _setv "$1" "" +} +function normyesvals() { +# remplacer les valeur des variables $1..* par les valeurs normalisées +# respectives de leur valeur "oui" + local __nyv_yesvar + for __nyv_yesvar in "$@"; do + is_yes "${!__nyv_yesvar}" && _setv "$__nyv_yesvar" 1 || _setv "$__nyv_yesvar" "" + done +} + function setb() { # Lancer la commande $2..@ en supprimant la sortie standard. Si la commande # retourne vrai, assigner la valeur 1 à la variable $1. Sinon, lui assigner la diff --git a/lib/ulib/base.compat b/lib/ulib/base.compat index a6a5095..c628136 100644 --- a/lib/ulib/base.compat +++ b/lib/ulib/base.compat @@ -2,15 +2,15 @@ ## Fonctions de base: support des fonctions obsolètes et des versions de bash < 4.x ##@cooked nocomments ##@include base.core -##@include base.num -##@include base.bool ##@include base.quote +##@include base.string +##@include base.bool uprovide base.compat -urequire base.core base.num base.bool base.quote ## Fonctions obsolètes # base.core +urequire base.core function setx2() { setxx "$@"; } function rawecho() { recho "$@"; } function rawecho_() { recho_ "$@"; } @@ -22,16 +22,39 @@ function set_var_cmd() { echo_setv "$@"; } function set_var_literal() { eval "$1=$2"; } # base.quote +urequire base.quote function quote_awk() { _qawk "$@"; } function quoted_awk() { qawk "$@"; } function quote_seds() { qseds "$@"; } function quote_form() { _qform "$@"; } function quoted_form() { qform "$@"; } +## Fonctions dépréciées + +function set_array_cmd() { +# Afficher la commande permettant d'initialiser le tableau $1 avec les valeurs: +# soit du tableau $2, soit de $3..$n si $2=="@" +# S'il n'y a que l'argument $1, alors afficher la commande permettant de +# recréer le tableau $1 + if [ $# -eq 1 ]; then echo_seta "$1" + elif [ "$2" == @ ]; then echo_seta "$1" "${@:3}" + else eval "echo_seta \"\$1\" \"\${$2[@]}\"" + fi +} +function set_array() { +# Soit $1 un tableau à créer. Si $2=="@", créer le tableau $1 avec les valeurs +# $3..$n. Sinon, créer le tableau $1 avec les valeurs du tableau $2. +# Cette fonction n'existe que comme un pendant de set_var(), mais le véritable +# intérêt est la fonction set_array_cmd(). cf array_copy() pour une version plus +# efficace de la copie de tableaux + eval "$(set_array_cmd "$@")" +} + ## Compatibilité avec bash >=2.x if [ -n "$BASH_VERSINFO" -a "${BASH_VERSINFO[0]}" -lt 4 ]; then # base.string + urequire base.string function strlower() { tr A-Z a-z <<<"$*"; } function strlower1() { local str="$*" @@ -60,6 +83,7 @@ if [ -n "$BASH_VERSINFO" -a "${BASH_VERSINFO[0]}" -lt 4 ]; then } # base.bool + urequire base.bool function is_yes() { case "$1" in o|oui|y|yes|v|vrai|t|true|on) return 0;; diff --git a/lib/ulib/base.core b/lib/ulib/base.core index d3c4484..1e08377 100644 --- a/lib/ulib/base.core +++ b/lib/ulib/base.core @@ -11,9 +11,9 @@ function recho() { # afficher une valeur brute. contrairement à la commande echo, ne reconnaitre # aucune option (i.e. -e, -E, -n ne sont pas signifiants) if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo "$first$@" + echo -n - + echo "$first" "$@" else echo "$@" fi @@ -22,9 +22,9 @@ function recho_() { # afficher une valeur brute, sans passer à la ligne. contrairement à la commande # echo, ne reconnaitre aucune option (i.e. -e, -E, -n ne sont pas signifiants) if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo -n "$first$@" + echo -n - + echo -n "$first" "$@" else echo -n "$@" fi @@ -45,11 +45,12 @@ function _qval() { } function should_quote() { # Tester si la chaine $* doit être mise entre quotes - local l="${#1}" + local s="$*" + local l="${#s}" # pour optimiser, toujours mettre entre quotes une chaine vide ou de plus de 80 caractères [ $l -eq 0 -o $l -gt 80 ] && return 0 # sinon, tester si la chaine contient des caractères spéciaux - local s="${*//[a-zA-Z0-9]/}" + s="${s//[a-zA-Z0-9]/}" s="${s//,/}" s="${s//./}" s="${s//+/}" @@ -165,7 +166,7 @@ function qlines() { sed "s/'/'\\\\''/g; s/.*/'&'/g" } function setv() { -# initialiser la variable $1 avec la valeur $2* +# initialiser la variable $1 avec la valeur $2..* # note: en principe, la syntaxe est 'setv var values...'. cependant, la # syntaxe 'setv var=values...' est supportée aussi local __s_var="$1"; shift @@ -190,6 +191,45 @@ function echo_setv() { fi echo "$__s_var=$(qvalr "$*")" } +function seta() { +# initialiser le tableau $1 avec les valeurs $2..@ +# note: en principe, la syntaxe est 'seta array values...'. cependant, la +# syntaxe 'seta array=values...' est supportée aussi + local __s_array="$1"; shift + if [[ "$__s_array" == *=* ]]; then + set -- "${__s_array#*=}" "$@" + __s_array="${__s_array%%=*}" + fi + eval "$__s_array=(\"\$@\")" +} +function _seta() { +# Comme la fonction seta() mais ne supporte que la syntaxe '_seta array values...' +# Cette fonction est légèrement plus rapide que seta() + local __s_array="$1"; shift + eval "$__s_array=(\"\$@\")" +} +function echo_seta() { +# Afficher la commande qui serait lancée par seta "$@" + local __s_var="$1"; shift + if [[ "$__s_var" == *=* ]]; then + set -- "${__s_var#*=}" "$@" + __s_var="${__s_var%%=*}" + fi + echo "$__s_var=($(qvals "$@"))" +} +function echo_seta2() { +# Afficher la commande qui recrée le tableau $1 +# Si des arguments sont spécifiés, cette fonction se comporte comme +# echo_seta() + local __s_var="$1"; shift + if [[ "$__s_var" == *=* ]]; then + set -- "${__s_var#*=}" "$@" + __s_var="${__s_var%%=*}" + elif [ $# -eq 0 ]; then + eval "set -- \"\${$__s_var[@]}\"" + fi + echo "$__s_var=($(qvals "$@"))" +} function setx() { # syntaxe 1: setx var cmd # initialiser la variable $1 avec le résultat de la commande "$2..@" @@ -234,8 +274,9 @@ function _setax() { function evalx() { # Implémenter une syntaxe lisible et naturelle permettant d'enchainer des # traitements sur une valeur. Par exemple, la commande -# evalx cmd1... // cmd2... // cmd3... -# affiche le résultat de la commande "$(cmd3 $(cmd2 $(cmd1)))" +# evalx cmd1 [args1...] // cmd2 [args2...] // cmd3 [args3...] +# est équivalente à la commande +# cmd3 args3 "$(cmd2 args2 "$(cmd1 args1)")" # Retourner le dernier code d'erreur non nul, ou 0 si toutes les commandes se # sont exécutées sans erreur. local __e_val __e_arg __e_r=0 @@ -285,7 +326,7 @@ function evalp() { # un flux de données. Par exemple, la commande # evalp cmd1... // cmd2... // cmd3... # affiche le résultat de la commande "$(cmd1 | cmd2 | cmd3)" -# Typiquement, cette fonction permet de faciliter la construction d'un +# Typiquement, cette fonction permet de faciliter la *construction* d'un # enchainement de commandes par programme, ou de faciliter l'utilisation de la # fonction setx() pour récupérer le résultat d'un enchainement. Dans les autres # cas, il est plus simple et naturel d'écrire les enchainements avec la syntaxe diff --git a/lib/ulib/base.deprecated b/lib/ulib/base.deprecated new file mode 100644 index 0000000..ff1d0e0 --- /dev/null +++ b/lib/ulib/base.deprecated @@ -0,0 +1,59 @@ +##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +## Fonctions dépréciées +##@cooked nocomments +uprovide base.deprecated + +# base.array + +function set_array_cmd() { +# Afficher la commande permettant d'initialiser le tableau $1 avec les valeurs: +# soit du tableau $2, soit de $3..$n si $2=="@" +# S'il n'y a que l'argument $1, alors afficher la commande permettant de +# recréer le tableau $1 + if [ $# -eq 1 ]; then echo_seta2 "$1" + elif [ "$2" == @ ]; then echo_seta "$1" "${@:3}" + else eval "echo_seta \"\$1\" \"\${$2[@]}\"" + fi +} +function set_array() { +# Soit $1 un tableau à créer. Si $2=="@", créer le tableau $1 avec les valeurs +# $3..$n. Sinon, créer le tableau $1 avec les valeurs du tableau $2. +# Cette fonction n'existe que comme un pendant de set_var(), mais le véritable +# intérêt est la fonction set_array_cmd(). cf array_copy() pour une version plus +# efficace de la copie de tableaux + eval "$(set_array_cmd "$@")" +} + +# base.misc + +function quote_in() { +# Comme quote_arg pour une chaine lue sur stdin + sed 's/\\/\\\\/g +s/"/\\"/g +s/\$/\\$/g +s/`/\\`/g' +} +function quote_sin() { +# Pour la chaine lue sur stdin, remplacer ' par '\''. Cela permet de protéger une +# chaine à mettre entre quotes + sed "s/'/'\\\\''/g" +} +function quote_sarg() { +# Dans la chaine $1, remplacer ' par '\''. Cette fonction utilise quote_sin, +# puisque le shell a des difficultés à faire le rechercher/remplacer approprié + quote_sin <<<"$1" +} +function quoted_sarg() { +# Dans la chaine $1, remplacer ' par '\'', et afficher la chaine entourée de +# quotes + echo "'$(quote_sarg "$1")'" +} +function quoted_sargs() { +# Comme quoted_sarg, mais tous les arguments sont quotés et affichés entourés de +# quotes, ce qui permet de construire des arguments d'une ligne de commande + local a s + for a in "$@"; do + s="${s:+$s }$(quoted_sarg "$a")" + done + recho "$s" +} diff --git a/lib/ulib/base.init b/lib/ulib/base.init index 5b2c59f..10a3e2c 100644 --- a/lib/ulib/base.init +++ b/lib/ulib/base.init @@ -33,10 +33,17 @@ export TMPDIR="${TMPDIR:-${TMP:-${TEMP:-/tmp}}}" [ -z "$USER" -a -n "$LOGNAME" ] && export USER="$LOGNAME" # Le fichier nutoolsrc doit être chargé systématiquement -# note: ajouter 'true' après le chargement de *nutoolsrc pour éviter que le -# module se termine sur une erreur si ces fichiers n'existent pas, ce qui -# empêcherait de le charger avec urequire() [ -f /etc/debian_chroot ] && UTOOLS_CHROOT=1 [ -f /etc/nutoolsrc ] && . /etc/nutoolsrc [ -f ~/.nutoolsrc ] && . ~/.nutoolsrc -true + +# Type de système sur lequel tourne le script +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 + # Dans un chroot, il est possible de forcer les valeurs + [ -n "$UTOOLS_UNAME_SYSTEM" ] && eval "UNAME_SYSTEM=$UTOOLS_UNAME_SYSTEM" + [ -n "$UTOOLS_UNAME_MACHINE" ] && eval "UNAME_MACHINE=$UTOOLS_UNAME_MACHINE" +fi diff --git a/lib/ulib/base.num b/lib/ulib/base.num index 9725806..0d064c8 100644 --- a/lib/ulib/base.num +++ b/lib/ulib/base.num @@ -27,3 +27,8 @@ function isrnum() { v="${v//[0-9]/}" [ -z "$v" ] } + +function evali() { +# Evaluer une expression numérique + echo "$(($*))" +} diff --git a/lib/ulib/base.string b/lib/ulib/base.string index 9a7fba3..af5f908 100644 --- a/lib/ulib/base.string +++ b/lib/ulib/base.string @@ -1,5 +1,5 @@ ##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 -## Fonctions de base: gestion des valeurs scalaires +## Fonctions de base: gestion des valeurs chaines scalaires ##@cooked nocomments # Note: contient du code spécifique à bash 4. Le module base.compat réimplémente # les fonctions concernées pour les rendre compatible avec bash >= 2.x @@ -11,35 +11,35 @@ urequire base.core # il faut d'abord le traiter avec _qval() function straddp() { -# ajouter le préfixe $1 à $2* +# ajouter le préfixe $1 à $2..* local p="$1"; shift echo "$p$*" } function strdelp() { -# enlever le préfixe $1 à $2* +# enlever le préfixe $1 à $2..* local p="$1"; shift local str="$*" echo "${str#$p}" } function strdelp2() { -# enlever le préfixe $1 le plus long à $2* +# enlever le préfixe $1 le plus long à $2..* local p="$1"; shift local str="$*" echo "${str##$p}" } function stradds() { -# ajouter le suffixe $1 à $2* +# ajouter le suffixe $1 à $2..* local s="$1"; shift echo "$*$s" } function strdels() { -# enlever le suffixe $1 à $2* +# enlever le suffixe $1 à $2..* local s="$1"; shift local str="$*" echo "${str%$s}" } function strdels2() { -# enlever le suffixe le plus long $1 à $2* +# enlever le suffixe le plus long $1 à $2..* local s="$1"; shift local str="$*" echo "${str%%$s}" @@ -76,7 +76,7 @@ function struppers() { echo "${*^}" } function strmid() { -# Afficher la plage $1 de la valeur $2*. La plage peut être d'une des formes +# Afficher la plage $1 de la valeur $2..*. La plage peut être d'une des formes # 'start', '[start]:length'. Si start est négatif, le compte est effectué à # partir de la fin de la chaine. Si length est négatif, il est rajouté à la # longueur de la chaine à partir de start @@ -100,7 +100,7 @@ function strmid() { eval 'echo "${str:'" $range"'}"' } function strrepl() { -# Remplacer dans la valeur $3* le motif $1 par la chaine $2. $1 peut commencer +# Remplacer dans la valeur $3..* le motif $1 par la chaine $2. $1 peut commencer # par l'un des caractères /, #, % pour indiquer le type de recherche local pattern="$1"; shift local repl="$1"; shift @@ -217,3 +217,97 @@ function endswith() { local str="$1" pattern="$2" eval '[ "${str%$pattern}" != "$str" ]' } + +function strsplitf() { +# Cette fonction doit être appelée avec N arguments (avec N>1). Elle analyse et +# découpe l'argument $N comme avec une ligne de commande du shell. Ensuite, elle +# appelle la fonction $1 avec les arguments de $2 à ${N-1}, suivi des arguments +# obtenus lors de l'analyse de l'argument $N. Par exemple, la commande suivante: +# strsplitf cmd arg1 "long arg2" "arg3 'long arg4'" +# est équivalente à: +# cmd arg1 "long arg2" arg3 "long arg4" +# Retourner le code 127 si la fonction à appeler n'est pas spécifiée. Retourner +# le code 126 si une erreur s'est produite lors de l'analyse de l'argument $N + [ $# -gt 0 ] || return 127 + local func count + func="$1"; shift + count=$# + if [ $count -gt 0 ]; then + eval 'set -- "${@:1:$(($count-1))}" '"${!count}" || return 126 + fi + "$func" "$@" +} +function strecho() { recho "$@"; } +function strqvals() { +# Afficher chaque argument à part avec des quotes. A chainer avec strsplitf() + qvals "$@" +} +function strqlines() { +# Afficher chaque ligne des fichiers spécifiés comme un argument. A chainer avec +# strsplitf() + local -a lines + _setax lines cat "$@" + qvals "${lines[@]}" +} +function strqarray() { +# Afficher chaque valeur des tableaux $@ comme un argument. A chainer avec +# strsplitf() + local __a __s="qvals" + for __a in "$@"; do __s="$__s \"\${$__a[@]}\""; done + eval "$__s" +} + +function evals() { +# Enchainer des traitements sur des chaines de caractères, comme pour la fonction +# evalx(). Il y a cependant quelques différences: +# - Seules certains fonctions spécifiques peuvent être utilisées: elles sont +# reconnaissables à leur préfixe 'str'. En effet, lors de l'utilisation d'une +# commande par evals(), le préfixe 'str' est systématiquement ajouté. +# - La fonction strsplitf() est traitée de façon particulière pour lancer une +# commande avec le préfixe 'str' +# Ainsi, la commande suivante: +# evals cmd1 // splitf cmd2 +# est équivalente à la commande: +# strplitf strcmd2 "$(strcmd1)" + local __e_val __e_arg __e_r=0 + local __e_firstcmd __e_firstarg __e_splitf + local -a __e_cmd + + __e_firstcmd=1 + while [ $# -gt 0 ]; do + __e_cmd=() + __e_firstarg=1 # premier argument + __e_splitf= # premier argument après splitf + while [ $# -gt 0 ]; do + __e_arg="$1"; shift + [ "$__e_arg" == // ] && break + if [ "${__e_arg%//}" != "$__e_arg" ]; then + local __e_tmp="${__e_arg%//}" + if [ -z "${__e_tmp//\\/}" ]; then + __e_arg="${__e_arg#\\}" + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + continue + fi + fi + if [ -n "$__e_firstarg" ]; then + __e_cmd=("str$__e_arg") + __e_firstarg= + [ "$__e_arg" == "splitf" ] && __e_splitf=1 + elif [ -n "$__e_splitf" ]; then + __e_cmd=("${__e_cmd[@]}" "str$__e_arg") + __e_splitf= + else + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + fi + done + + if [ -n "$__e_firstcmd" ]; then + __e_val="$("${__e_cmd[@]}")" || __e_r=$? + else + __e_val="$("${__e_cmd[@]}" "$__e_val")" || __e_r=$? + fi + __e_firstcmd= + done + [ -n "$__e_val" ] && echo "$__e_val" + return $__e_r +} diff --git a/lib/ulib/compat b/lib/ulib/compat index 32e0c23..89596dc 100644 --- a/lib/ulib/compat +++ b/lib/ulib/compat @@ -270,7 +270,7 @@ if check_sysinfos -s macosx; then done args=("${args[@]}" "$@") fi - quoted_args "${options[@]}" -- "${args[@]}" + qvals "${options[@]}" -- "${args[@]}" return 0 } diff --git a/lib/ulib/conf b/lib/ulib/conf index 1493e07..98c123c 100644 --- a/lib/ulib/conf +++ b/lib/ulib/conf @@ -47,7 +47,7 @@ function conf_enable() { fi if [ "$name" != "$param" ]; then # Ensuite, mettre à jour le fichier avec la valeur spécifiée - to="$(quote_seds "$value")" + to="$(qseds "$value")" sedi "\ /^[ $TAB]*export[ $TAB]*$name[ $TAB]*=/s/^\([ $TAB]*export[ $TAB]*$name[ $TAB]*=[ $TAB]*\).*\$/\\1$to/ /^[ $TAB]*$name[ $TAB]*=/s/^\([ $TAB]*$name[ $TAB]*=[ $TAB]*\).*\$/\\1$to/ @@ -61,14 +61,14 @@ function conf_enable() { } function conf_enableq() { - # Comme conf_enable(), mais s'assure que les valeurs sont quotées dans le - # fichier. Ceci permet de stocker des valeurs avec des espaces ou des - # caractères spéciaux. + # Comme conf_enable(), mais s'assure que les valeurs sont quotées si + # nécessaire dans le fichier. Ceci permet de stocker des valeurs avec des + # espaces ou des caractères spéciaux. local args arg name value args=("$1"); shift for arg in "$@"; do splitvar "$arg" name value - array_add args "$name=$(quoted_arg "$value")" + array_add args "$name=$(qvalm "$value")" done conf_enable "${args[@]}" } @@ -94,8 +94,8 @@ function conf_disable() { from0="^[ $TAB]*export[ $TAB]*$name[ $TAB]*=" from1="^[ $TAB]*$name[ $TAB]*=" if [ "$name" != "$param" ]; then - from0="$from0$(quote_seds "$value")\$" - from1="$from1$(quote_seds "$value")\$" + from0="$from0$(qseds "$value")\$" + from1="$from1$(qseds "$value")\$" fi if quietgrep "$from" "$conf"; then sedi "\ @@ -131,7 +131,7 @@ function conf_append() { local param name value from for param in "$@"; do splitvar "$param" name value - echo "$name=\"\${$name:+\$$name$CONF_APPEND_SEP}$(quote_arg "$value")\"" >>"$conf" + echo "$name=\"\${$name:+\$$name$CONF_APPEND_SEP}$(_qval "$value")\"" >>"$conf" modified=0 done @@ -160,11 +160,11 @@ function conf_array_append() { if quietgrep "^[ $TAB]*\(export[ $TAB]*\)\?$name=(" "$conf"; then # variable déjà existante [ "$name" != "$param" ] || continue - echo "$name=(\"\${$name[@]}\" $(quoted_arg "$value"))" >>"$conf" + echo "$name=(\"\${$name[@]}\" $(qvalm "$value"))" >>"$conf" else # nouvelle variable if [ "$name" != "$param" ]; then - echo "$name=($(quoted_arg "$value"))" >>"$conf" + echo "$name=($(qvalm "$value"))" >>"$conf" else echo "$name=()" >>"$conf" fi @@ -191,7 +191,7 @@ function conf_check() { splitvar "$param" name value from="^[ $TAB]*\(export[ $TAB]*\)\?$name[ $TAB]*=" if [ "$name" != "$param" ]; then - from="$from$(quote_seds "$value")\$" + from="$from$(qseds "$value")\$" fi quietgrep "$from" "$conf" || return 1 done @@ -232,7 +232,7 @@ function aconf_enable() { fi if [ "$name" != "$param" ]; then # Ensuite, mettre à jour le fichier avec la valeur spécifiée - to="$(quote_seds "$value")" + to="$(qseds "$value")" sedi "\ /^[ $TAB]*$name[ $TAB][ $TAB]*/s/^\([ $TAB]*$name[ $TAB]*\).*$/\\1$to/ /^[ $TAB]*$name\$/s/^\([ $TAB]*$name\)\$/\\1 $to/" "$conf" @@ -265,7 +265,7 @@ function aconf_disable() { # Essayer simplement de commenter la valeur dans le fichier from="^[ $TAB]*$name[ $TAB]*" if [ "$name" != "$param" ]; then - from="$from$(quote_seds "$value")\$" + from="$from$(qseds "$value")\$" fi if quietgrep "$from" "$conf"; then sedi "/$from/"'s/^/#/g' "$conf" @@ -317,7 +317,7 @@ function aconf_check() { splitvar "$param" name value from="^[ $TAB]*$name[ $TAB]*" if [ "$name" != "$param" ]; then - from="$from$(quote_seds "$value")\$" + from="$from$(qseds "$value")\$" fi quietgrep "$from" "$conf" || return 1 done @@ -350,17 +350,17 @@ function mconf_enable() { local script i param name value script="BEGIN { modified = 1 - section = $(quoted_awk "$section") + section = $(qawk "$section") in_section = 0" i=0 for param in "$@"; do splitvar "$param" name value script="$script - names[$i] = $(quoted_awk "$name")" + names[$i] = $(qawk "$name")" if [ "$name" != "$param" ]; then script="$script hasvalues[$i] = 1 - values[$i] = $(quoted_awk "$value")" + values[$i] = $(qawk "$value")" else script="$script hasvalues[$i] = 0 @@ -445,7 +445,7 @@ function mconf_disable() { local script match script="BEGIN { modified = 1 - section = $(quoted_awk "$section") + section = $(qawk "$section") in_section = 0 " local param name value @@ -453,7 +453,7 @@ function mconf_disable() { splitvar "$param" name value match="${match:+$match || }\$0 ~ /^[ $TAB]*$name[ $TAB]*=" if [ "$name" != "$param" ]; then - match="$match[ $TAB]*$(quote_seds "$value")\$" + match="$match[ $TAB]*$(qseds "$value")\$" fi match="$match/" done @@ -501,15 +501,15 @@ function mconf_append() { local script match script="BEGIN { modified = 1 - section=$(quoted_awk "$section") + section=$(qawk "$section") in_section=0 " i=0 for param in "$@"; do splitvar "$param" name value script="$script - names[$i] = $(quoted_awk "$name") - values[$i] = $(quoted_awk "$value") + names[$i] = $(qawk "$name") + values[$i] = $(qawk "$value") seen[$i] = 0" let i=$i+1 done @@ -569,14 +569,14 @@ function mconf_check() { local script i param name value script="BEGIN { - section = $(quoted_awk "$section") + section = $(qawk "$section") in_section = 0" i=0 for param in "$@"; do splitvar "$param" name value script="$script - names[$i] = $(quoted_awk "$name") - values[$i] = $(quoted_awk "$value") + names[$i] = $(qawk "$name") + values[$i] = $(qawk "$value") seen[$i] = 0" let i=$i+1 done @@ -593,7 +593,7 @@ function mconf_check() { script="$script in_section && \$0 ~ /^[ $TAB]*$name[ $TAB]*=" if [ "$name" != "$param" ]; then - script="$script$(quote_seds "$value")\$" + script="$script$(qseds "$value")\$" fi script="$script/ { seen[$i] = 1 diff --git a/lib/ulib/crontab b/lib/ulib/crontab index 9ff5747..cc08d1d 100644 --- a/lib/ulib/crontab +++ b/lib/ulib/crontab @@ -112,7 +112,9 @@ __CTRESOLVE_CTNOW="" # eval "$(ctresolve il faut rajouter rscripts et recipes @@ -987,11 +995,11 @@ function __runs_check_notref() { } function __runs_splitref() { if [[ "$1" == *=* ]]; then - set_var "${2:-__name}" "${1%%=*}" - set_var "${3:-__value}" "${1#*=}" + _setv "${2:-__name}" "${1%%=*}" + _setv "${3:-__value}" "${1#*=}" else - set_var "${2:-__name}" "$1" - set_var "${3:-__value}" "$1" + _setv "${2:-__name}" "$1" + _setv "${3:-__value}" "$1" fi } @@ -1038,7 +1046,7 @@ function runs_var() { array_set RUNSVARS "$__name" array_del RUNSARRAYS "$__name" array_set RUNSVARSINDIRECT "$__name" - set_var "$__name" "$__value" + _setv "$__name" "$__value" fi elif [[ "$1" == *@=* ]]; then __name="${1%%@=*}" @@ -1047,7 +1055,7 @@ function runs_var() { array_set RUNSVARS "$__name" array_set RUNSARRAYS "$__name" array_set RUNSVARSINDIRECT "$__name" - set_var "$__name" "$__value" + _setv "$__name" "$__value" fi elif [[ "$1" == *=* ]]; then __name="${1%%=*}" @@ -1056,12 +1064,12 @@ function runs_var() { array_set RUNSVARS "$__name" array_del RUNSARRAYS "$__name" array_del RUNSVARSINDIRECT "$__name" - set_var "$__name" "$__value" + _setv "$__name" "$__value" fi else break fi - [ -n "$RUNSVARDESC" ] && set_var "RUNSVARDESC_$__name" "$RUNSVARDESC" + [ -n "$RUNSVARDESC" ] && _setv "RUNSVARDESC_$__name" "$RUNSVARDESC" shift done # variables tableau @@ -1141,12 +1149,12 @@ function runs_set_lang() { if check_sysinfos -d debianlike; then eval "$(LANG= source_ifexists /etc/default/locale - set_var_cmd LANG "$LANG" + echo_setv LANG "$LANG" )" elif check_sysinfos -d redhatlike; then eval "$(LANG= source_ifexists /etc/locale.conf - set_var_cmd LANG "$LANG" + echo_setv LANG "$LANG" )" fi export LANG @@ -1160,9 +1168,9 @@ function runs_set_proxy() { if check_sysinfos -d debianlike; then eval "$(http_proxy=; ftp_proxy=; no_proxy= source_ifexists /etc/environment - set_var_cmd http_proxy "$http_proxy" - set_var_cmd ftp_proxy "$ftp_proxy" - set_var_cmd no_proxy "$no_proxy" + echo_setv http_proxy "$http_proxy" + echo_setv ftp_proxy "$ftp_proxy" + echo_setv no_proxy "$no_proxy" )" fi export http_proxy ftp_proxy no_proxy @@ -1215,7 +1223,7 @@ function runs_after() { if array_contains RUNSARRAYS "$__var"; then eval "array_copy __tmp $__var; local -a $__var; array_copy $__var __tmp" else - eval "set_var __tmp \"\${!__var}\"; local $__var; $__var=\"\$__tmp\"" + eval "_setv __tmp \"\${!__var}\"; local $__var; $__var=\"\$__tmp\"" fi done runs_clvars "${RUNSCLVARS[@]}" @@ -1229,7 +1237,7 @@ function runs_after() { if [[ "$__arg" == *!=* ]]; then __name="${__arg%%!=*}" __value="${__arg#*!=}" - __args=("${__args[@]}" "$__name=$(quoted_arg "${!__value}")") + __args=("${__args[@]}" "$__name=$(qvalm "${!__value}")") elif [[ "$__arg" == *@=* ]]; then __name="${__arg%%@=*}" __value="${__arg#*@=}[@]" @@ -1293,7 +1301,7 @@ function runs_indvars() { else # variable scalaire __ind="${!__var}" - set_var "$__var" "${!__ind}" + _setv "$__var" "${!__ind}" fi done RUNSVARSINDIRECT=() @@ -1306,7 +1314,7 @@ function runs_clvars_cmd() { __vars=() while [ -n "$1" ]; do if [ "$1" == ";" ]; then - echo "$__prefix$(quoted_args "${__vars[@]}")" + echo "$__prefix$(qvals "${__vars[@]}")" __vars=() __prefix=" " else @@ -1314,7 +1322,7 @@ function runs_clvars_cmd() { fi shift done - [ -n "${__vars[*]}" ] && echo "$__prefix$(quoted_args "${__vars[@]}")" + [ -n "${__vars[*]}" ] && echo "$__prefix$(qvals "${__vars[@]}")" } function runs_loadconfs() { @@ -1450,10 +1458,10 @@ function runs_action_dump() { eval "__count=\"\${#$__var[@]}\"" if [ "$__count" -eq 1 ]; then # variable scalaire - eecho "$__var=$(quoted_args "${!__values}")" + eecho "$__var=$(qvals "${!__values}")" else # variable tableau - eecho "$__var=($(quoted_args "${!__values}"))" + eecho "$__var=($(qvals "${!__values}"))" fi done exit 0 @@ -1527,7 +1535,7 @@ function runs_action_run() { # configuration dans le fichier $__shellconf __runs_check_varname "$__refvarname" || die - set_var "$__refvarname" "" + _setv "$__refvarname" "" splitwcs "$__shellconf" __tmpconf __wildconf if [ -n "$__wildconf" ]; then @@ -1630,7 +1638,7 @@ function runs_action_run() { runs_indvars for __name in "${RUNSVARS[@]}"; do __value="$(array_join "$__name" ":")" - __vars=("${__vars[@]}" "$(set_var_cmd "$__name" "$__value")") + __vars=("${__vars[@]}" "$(echo_setv "$__name" "$__value")") done if [ -n "$RUNS_REMOTE_SET_Y" ]; then @@ -1716,7 +1724,7 @@ function runs_action_export() { # configuration dans le fichier $__shellconf __runs_check_varname "$__refvarname" || die - set_var "$__refvarname" "" + _setv "$__refvarname" "" splitwcs "$__shellconf" __tmpconf __wildconf if [ -n "$__wildconf" ]; then @@ -1826,7 +1834,7 @@ function runs_action_export() { for __shellvar in "${__shellvars[@]}"; do # s'assurer que la variables sont vides # avant de sourcer $__shellconf - set_var "$__shellvar" + _setv "$__shellvar" done source "$__shellconf" for __shellvar in "${__shellvars[@]}"; do diff --git a/lib/ulib/support/install-pubkeys.sh b/lib/ulib/support/install-pubkeys.sh index 40fc73c..8eecbcc 100755 --- a/lib/ulib/support/install-pubkeys.sh +++ b/lib/ulib/support/install-pubkeys.sh @@ -76,18 +76,18 @@ function echo_() { } function recho() { if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo "$first$@" + echo -n - + echo "$first" "$@" else echo "$@" fi } function recho_() { if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo -n "$first$@" + echo -n - + echo -n "$first" "$@" else echo -n "$@" fi @@ -101,9 +101,10 @@ function _qval() { recho_ "$s" } function should_quote() { - local l="${#1}" + local s="$*" + local l="${#s}" [ $l -eq 0 -o $l -gt 80 ] && return 0 - local s="${*//[a-zA-Z0-9]/}" + s="${s//[a-zA-Z0-9]/}" s="${s//,/}" s="${s//./}" s="${s//+/}" @@ -438,7 +439,7 @@ function evalcmd() { } ##@inc]base.core ##@inc[base.string -## Fonctions de base: gestion des valeurs scalaires +## Fonctions de base: gestion des valeurs chaines scalaires uprovide base.string urequire base.core @@ -595,6 +596,75 @@ function endswith() { local str="$1" pattern="$2" eval '[ "${str%$pattern}" != "$str" ]' } + +function strsplitf() { + [ $# -gt 0 ] || return 127 + local func count + func="$1"; shift + count=$# + if [ $count -gt 0 ]; then + eval 'set -- "${@:1:$(($count-1))}" '"${!count}" || return 126 + fi + "$func" "$@" +} +function strecho() { recho "$@"; } +function strqvals() { + qvals "$@" +} +function strqlines() { + local -a lines + _setax lines cat "$@" + qvals "${lines[@]}" +} +function strqarray() { + local __a __s="qvals" + for __a in "$@"; do __s="$__s \"\${$__a[@]}\""; done + eval "$__s" +} + +function evals() { + local __e_val __e_arg __e_r=0 + local __e_firstcmd __e_firstarg __e_splitf + local -a __e_cmd + + __e_firstcmd=1 + while [ $# -gt 0 ]; do + __e_cmd=() + __e_firstarg=1 # premier argument + __e_splitf= # premier argument après splitf + while [ $# -gt 0 ]; do + __e_arg="$1"; shift + [ "$__e_arg" == // ] && break + if [ "${__e_arg%//}" != "$__e_arg" ]; then + local __e_tmp="${__e_arg%//}" + if [ -z "${__e_tmp//\\/}" ]; then + __e_arg="${__e_arg#\\}" + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + continue + fi + fi + if [ -n "$__e_firstarg" ]; then + __e_cmd=("str$__e_arg") + __e_firstarg= + [ "$__e_arg" == "splitf" ] && __e_splitf=1 + elif [ -n "$__e_splitf" ]; then + __e_cmd=("${__e_cmd[@]}" "str$__e_arg") + __e_splitf= + else + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + fi + done + + if [ -n "$__e_firstcmd" ]; then + __e_val="$("${__e_cmd[@]}")" || __e_r=$? + else + __e_val="$("${__e_cmd[@]}" "$__e_val")" || __e_r=$? + fi + __e_firstcmd= + done + [ -n "$__e_val" ] && echo "$__e_val" + return $__e_r +} ##@inc]base.string ##@inc[base.num ## Fonctions de base: gestion des valeurs numériques @@ -620,6 +690,10 @@ function isrnum() { v="${v//[0-9]/}" [ -z "$v" ] } + +function evali() { + echo "$(($*))" +} ##@inc]base.num ##@inc[base.bool ## Fonctions de base: valeurs booléennes @@ -647,6 +721,10 @@ function isrnum() { v="${v//[0-9]/}" [ -z "$v" ] } + +function evali() { + echo "$(($*))" +} ##@inc]base.num uprovide base.bool urequire base.num @@ -887,18 +965,18 @@ function echo_() { } function recho() { if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo "$first$@" + echo -n - + echo "$first" "$@" else echo "$@" fi } function recho_() { if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo -n "$first$@" + echo -n - + echo -n "$first" "$@" else echo -n "$@" fi @@ -912,9 +990,10 @@ function _qval() { recho_ "$s" } function should_quote() { - local l="${#1}" + local s="$*" + local l="${#s}" [ $l -eq 0 -o $l -gt 80 ] && return 0 - local s="${*//[a-zA-Z0-9]/}" + s="${s//[a-zA-Z0-9]/}" s="${s//,/}" s="${s//./}" s="${s//+/}" @@ -1249,7 +1328,7 @@ function evalcmd() { } ##@inc]base.core ##@inc[base.string -## Fonctions de base: gestion des valeurs scalaires +## Fonctions de base: gestion des valeurs chaines scalaires uprovide base.string urequire base.core @@ -1406,6 +1485,75 @@ function endswith() { local str="$1" pattern="$2" eval '[ "${str%$pattern}" != "$str" ]' } + +function strsplitf() { + [ $# -gt 0 ] || return 127 + local func count + func="$1"; shift + count=$# + if [ $count -gt 0 ]; then + eval 'set -- "${@:1:$(($count-1))}" '"${!count}" || return 126 + fi + "$func" "$@" +} +function strecho() { recho "$@"; } +function strqvals() { + qvals "$@" +} +function strqlines() { + local -a lines + _setax lines cat "$@" + qvals "${lines[@]}" +} +function strqarray() { + local __a __s="qvals" + for __a in "$@"; do __s="$__s \"\${$__a[@]}\""; done + eval "$__s" +} + +function evals() { + local __e_val __e_arg __e_r=0 + local __e_firstcmd __e_firstarg __e_splitf + local -a __e_cmd + + __e_firstcmd=1 + while [ $# -gt 0 ]; do + __e_cmd=() + __e_firstarg=1 # premier argument + __e_splitf= # premier argument après splitf + while [ $# -gt 0 ]; do + __e_arg="$1"; shift + [ "$__e_arg" == // ] && break + if [ "${__e_arg%//}" != "$__e_arg" ]; then + local __e_tmp="${__e_arg%//}" + if [ -z "${__e_tmp//\\/}" ]; then + __e_arg="${__e_arg#\\}" + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + continue + fi + fi + if [ -n "$__e_firstarg" ]; then + __e_cmd=("str$__e_arg") + __e_firstarg= + [ "$__e_arg" == "splitf" ] && __e_splitf=1 + elif [ -n "$__e_splitf" ]; then + __e_cmd=("${__e_cmd[@]}" "str$__e_arg") + __e_splitf= + else + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + fi + done + + if [ -n "$__e_firstcmd" ]; then + __e_val="$("${__e_cmd[@]}")" || __e_r=$? + else + __e_val="$("${__e_cmd[@]}" "$__e_val")" || __e_r=$? + fi + __e_firstcmd= + done + [ -n "$__e_val" ] && echo "$__e_val" + return $__e_r +} ##@inc]base.string ##@inc[base.array ## Fonctions de base: gestion des tableaux @@ -1726,18 +1874,18 @@ function echo_() { } function recho() { if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo "$first$@" + echo -n - + echo "$first" "$@" else echo "$@" fi } function recho_() { if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo -n "$first$@" + echo -n - + echo -n "$first" "$@" else echo -n "$@" fi @@ -1751,9 +1899,10 @@ function _qval() { recho_ "$s" } function should_quote() { - local l="${#1}" + local s="$*" + local l="${#s}" [ $l -eq 0 -o $l -gt 80 ] && return 0 - local s="${*//[a-zA-Z0-9]/}" + s="${s//[a-zA-Z0-9]/}" s="${s//,/}" s="${s//./}" s="${s//+/}" @@ -2088,7 +2237,7 @@ function evalcmd() { } ##@inc]base.core ##@inc[base.string -## Fonctions de base: gestion des valeurs scalaires +## Fonctions de base: gestion des valeurs chaines scalaires uprovide base.string urequire base.core @@ -2245,6 +2394,75 @@ function endswith() { local str="$1" pattern="$2" eval '[ "${str%$pattern}" != "$str" ]' } + +function strsplitf() { + [ $# -gt 0 ] || return 127 + local func count + func="$1"; shift + count=$# + if [ $count -gt 0 ]; then + eval 'set -- "${@:1:$(($count-1))}" '"${!count}" || return 126 + fi + "$func" "$@" +} +function strecho() { recho "$@"; } +function strqvals() { + qvals "$@" +} +function strqlines() { + local -a lines + _setax lines cat "$@" + qvals "${lines[@]}" +} +function strqarray() { + local __a __s="qvals" + for __a in "$@"; do __s="$__s \"\${$__a[@]}\""; done + eval "$__s" +} + +function evals() { + local __e_val __e_arg __e_r=0 + local __e_firstcmd __e_firstarg __e_splitf + local -a __e_cmd + + __e_firstcmd=1 + while [ $# -gt 0 ]; do + __e_cmd=() + __e_firstarg=1 # premier argument + __e_splitf= # premier argument après splitf + while [ $# -gt 0 ]; do + __e_arg="$1"; shift + [ "$__e_arg" == // ] && break + if [ "${__e_arg%//}" != "$__e_arg" ]; then + local __e_tmp="${__e_arg%//}" + if [ -z "${__e_tmp//\\/}" ]; then + __e_arg="${__e_arg#\\}" + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + continue + fi + fi + if [ -n "$__e_firstarg" ]; then + __e_cmd=("str$__e_arg") + __e_firstarg= + [ "$__e_arg" == "splitf" ] && __e_splitf=1 + elif [ -n "$__e_splitf" ]; then + __e_cmd=("${__e_cmd[@]}" "str$__e_arg") + __e_splitf= + else + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + fi + done + + if [ -n "$__e_firstcmd" ]; then + __e_val="$("${__e_cmd[@]}")" || __e_r=$? + else + __e_val="$("${__e_cmd[@]}" "$__e_val")" || __e_r=$? + fi + __e_firstcmd= + done + [ -n "$__e_val" ] && echo "$__e_val" + return $__e_r +} ##@inc]base.string ##@inc[base.array ## Fonctions de base: gestion des tableaux @@ -2686,18 +2904,18 @@ function echo_() { } function recho() { if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo "$first$@" + echo -n - + echo "$first" "$@" else echo "$@" fi } function recho_() { if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo -n "$first$@" + echo -n - + echo -n "$first" "$@" else echo -n "$@" fi @@ -2711,9 +2929,10 @@ function _qval() { recho_ "$s" } function should_quote() { - local l="${#1}" + local s="$*" + local l="${#s}" [ $l -eq 0 -o $l -gt 80 ] && return 0 - local s="${*//[a-zA-Z0-9]/}" + s="${s//[a-zA-Z0-9]/}" s="${s//,/}" s="${s//./}" s="${s//+/}" @@ -3047,31 +3266,290 @@ function evalcmd() { "${args[@]}" } ##@inc]base.core -##@inc[base.num -## Fonctions de base: gestion des valeurs numériques -uprovide base.num +##@inc[base.quote +## Fonctions de base: protection de valeurs chaine +uprovide base.quote +urequire base.core -function isnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//[0-9]/}" - [ -z "$v" ] +function _qawk() { + local s="$*" + s="${s//\\/\\\\}" + s="${s//\"/\\\"}" + s="${s// +/\\n}" + recho_ "$s" } -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - [ -z "${1//[0-9]/}" ] +function qawk() { + echo -n \" + _qawk "$@" + echo \" } -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//./}" - v="${v//,/}" - v="${v//[0-9]/}" - [ -z "$v" ] +function qseds() { + local s="$*" + s="${s//\\/\\\\}" + s="${s//\//\\/}" + s="${s// +/\\n}" + recho "$s" } -##@inc]base.num +function _qform() { + local s="$*" + s="${s//\%/%25}" + s="${s//+/%2B}" + s="${s//&/%26}" + s="${s//=/%3D}" + s="${s// /+}" + recho_ "$s" +} +function qform() { + local s="$*" + if [[ "$s" == *=* ]]; then + _qform "${s%%=*}" + echo -n = + _qform "${s#*=}" + echo + else + _qform "$s" + echo + fi +} +function _qsql() { + local q="'" qq="''" + echo "${*//$q/$qq}" +} +function qsql() { + local q="'" qq="''" + echo "'${*//$q/$qq}'" +} +##@inc]base.quote +##@inc[base.string +## Fonctions de base: gestion des valeurs chaines scalaires +uprovide base.string +urequire base.core + + +function straddp() { + local p="$1"; shift + echo "$p$*" +} +function strdelp() { + local p="$1"; shift + local str="$*" + echo "${str#$p}" +} +function strdelp2() { + local p="$1"; shift + local str="$*" + echo "${str##$p}" +} +function stradds() { + local s="$1"; shift + echo "$*$s" +} +function strdels() { + local s="$1"; shift + local str="$*" + echo "${str%$s}" +} +function strdels2() { + local s="$1"; shift + local str="$*" + echo "${str%%$s}" +} +function strlower() { + local str="$*" + echo "${str,,}" +} +function strlower1() { + local str="$*" + echo "${str,}" +} +function strlowers() { + local str="$*" + echo "${*,}" +} +function strupper() { + local str="$*" + echo "${str^^}" +} +function strupper1() { + local str="$*" + echo "${str^}" +} +function struppers() { + echo "${*^}" +} +function strmid() { + local range="$1"; shift + local str="$*" + if [[ "$range" == *:-* ]]; then + local max=${#str} + [ $max -eq 0 ] && return + local start="${range%%:*}" + [ -n "$start" ] || start=0 + while [ "$start" -lt 0 ]; do + start=$(($max$start)) + done + max=$(($max-$start)) + local length="${range#*:}" + while [ "$length" -lt 0 ]; do + length=$(($max$length)) + done + range="$start:$length" + fi + eval 'echo "${str:'" $range"'}"' +} +function strrepl() { + local pattern="$1"; shift + local repl="$1"; shift + local str="$*" + local cmd='echo "${str/' + if [ "${pattern#/}" != "$pattern" ]; then + pattern="${pattern#/}" + cmd="$cmd/" + elif [ "${pattern#\#}" != "$pattern" ]; then + pattern="${pattern#\#}" + cmd="$cmd#" + elif [ "${pattern#%}" != "$pattern" ]; then + pattern="${pattern#%}" + cmd="$cmd%" + fi + cmd="$cmd"'$pattern/$repl}"' + eval "$cmd" +} + +function strops() { + local -a __s_tmp + local __s_value="$1"; shift + while [ $# -gt 0 ]; do + case "$1" in + :-*|:=*|:\?*|:+*) eval '__s_value="${'"${__s_value}$1"'}"';; + d|deref) __s_value="${!__s_value}";; + dc|dcount|ds|dsize) + __s_value="${__s_value}[@]" + __s_tmp=("${!__s_value}") + __s_value="${#__s_tmp[@]}" + ;; + \#*|%*|/*|:*|^*|,*) eval '__s_value="${__s_value'"$1"'}"';; + l|length) __s_value="${#__s_value}";; + =|==|!=|\<|\>|-eq|-ne|-lt|-le|-gt|-ge) + __s_tmp=(\[ "$__s_value" "$@" ]); "${__s_tmp[@]}"; return $?;; + -n|-z) __s_tmp=(\[ "$1" "$__s_value" ]); "${__s_tmp[@]}"; return $?;; + +#*) eval '__s_value="'"${1#+#}"'$__s_value"';; + -#*) eval '__s_value="${__s_value'"${1#-}"'}"';; + +%*) eval '__s_value="$__s_value"'"${1#+%}";; + +*) eval '__s_value="$__s_value"'"${1#+}";; + -%*) eval '__s_value="${__s_value'"${1#-}"'}"';; + -*) eval '__s_value="${__s_value%'"${1#-}"'}"';; + mid|strmid) eval '__s_value="$(strmid "$2" "$__s_value")"'; shift;; + repl|strrepl) eval '__s_value="$(strrepl "$2" "$3" "$__s_value")"'; shift; shift;; + *) echo 1>&2 "strops: unknown operator: $1";; + esac + shift + done + echo "$__s_value" +} + +function first_char() { + local str="$*" + echo "${str:0:1}" +} +function last_char() { + local str="$*" + echo "${str: -1:1}" +} +function first_chars() { + local str="$*" + recho "${str:0:$((${#1}-1))}" +} +function last_chars() { + local str="$*" + recho "${str:1}" +} +function first_char_is() { + [ "${1:0:1}" == "$2" ] +} +function last_char_is() { + [ "${1:$((-1)):1}" == "$2" ] +} +function beginswith() { + local str="$1" pattern="$2" + eval '[ "${str#$pattern}" != "$str" ]' +} +function endswith() { + local str="$1" pattern="$2" + eval '[ "${str%$pattern}" != "$str" ]' +} + +function strsplitf() { + [ $# -gt 0 ] || return 127 + local func count + func="$1"; shift + count=$# + if [ $count -gt 0 ]; then + eval 'set -- "${@:1:$(($count-1))}" '"${!count}" || return 126 + fi + "$func" "$@" +} +function strecho() { recho "$@"; } +function strqvals() { + qvals "$@" +} +function strqlines() { + local -a lines + _setax lines cat "$@" + qvals "${lines[@]}" +} +function strqarray() { + local __a __s="qvals" + for __a in "$@"; do __s="$__s \"\${$__a[@]}\""; done + eval "$__s" +} + +function evals() { + local __e_val __e_arg __e_r=0 + local __e_firstcmd __e_firstarg __e_splitf + local -a __e_cmd + + __e_firstcmd=1 + while [ $# -gt 0 ]; do + __e_cmd=() + __e_firstarg=1 # premier argument + __e_splitf= # premier argument après splitf + while [ $# -gt 0 ]; do + __e_arg="$1"; shift + [ "$__e_arg" == // ] && break + if [ "${__e_arg%//}" != "$__e_arg" ]; then + local __e_tmp="${__e_arg%//}" + if [ -z "${__e_tmp//\\/}" ]; then + __e_arg="${__e_arg#\\}" + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + continue + fi + fi + if [ -n "$__e_firstarg" ]; then + __e_cmd=("str$__e_arg") + __e_firstarg= + [ "$__e_arg" == "splitf" ] && __e_splitf=1 + elif [ -n "$__e_splitf" ]; then + __e_cmd=("${__e_cmd[@]}" "str$__e_arg") + __e_splitf= + else + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + fi + done + + if [ -n "$__e_firstcmd" ]; then + __e_val="$("${__e_cmd[@]}")" || __e_r=$? + else + __e_val="$("${__e_cmd[@]}" "$__e_val")" || __e_r=$? + fi + __e_firstcmd= + done + [ -n "$__e_val" ] && echo "$__e_val" + return $__e_r +} +##@inc]base.string ##@inc[base.bool ## Fonctions de base: valeurs booléennes ##@inc[base.num @@ -3098,6 +3576,10 @@ function isrnum() { v="${v//[0-9]/}" [ -z "$v" ] } + +function evali() { + echo "$(($*))" +} ##@inc]base.num uprovide base.bool urequire base.num @@ -3160,66 +3642,10 @@ function setxb() { setx "$__s_var" evalb "$@" } ##@inc]base.bool -##@inc[base.quote -## Fonctions de base: protection de valeurs chaine -uprovide base.quote -urequire base.core - -function _qawk() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s// -/\\n}" - recho_ "$s" -} -function qawk() { - echo -n \" - _qawk "$@" - echo \" -} -function qseds() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\//\\/}" - s="${s// -/\\n}" - recho "$s" -} -function _qform() { - local s="$*" - s="${s//\%/%25}" - s="${s//+/%2B}" - s="${s//&/%26}" - s="${s//=/%3D}" - s="${s// /+}" - recho_ "$s" -} -function qform() { - local s="$*" - if [[ "$s" == *=* ]]; then - _qform "${s%%=*}" - echo -n = - _qform "${s#*=}" - echo - else - _qform "$s" - echo - fi -} -function _qsql() { - local q="'" qq="''" - echo "${*//$q/$qq}" -} -function qsql() { - local q="'" qq="''" - echo "'${*//$q/$qq}'" -} -##@inc]base.quote uprovide base.compat -urequire base.core base.num base.bool base.quote +urequire base.core function setx2() { setxx "$@"; } function rawecho() { recho "$@"; } function rawecho_() { recho_ "$@"; } @@ -3230,6 +3656,7 @@ function set_var() { setv "$@"; } function set_var_cmd() { echo_setv "$@"; } function set_var_literal() { eval "$1=$2"; } +urequire base.quote function quote_awk() { _qawk "$@"; } function quoted_awk() { qawk "$@"; } function quote_seds() { qseds "$@"; } @@ -3238,6 +3665,7 @@ function quoted_form() { qform "$@"; } if [ -n "$BASH_VERSINFO" -a "${BASH_VERSINFO[0]}" -lt 4 ]; then + urequire base.string function strlower() { tr A-Z a-z <<<"$*"; } function strlower1() { local str="$*" @@ -3265,6 +3693,7 @@ if [ -n "$BASH_VERSINFO" -a "${BASH_VERSINFO[0]}" -lt 4 ]; then echo "${vs[*]}" } + urequire base.bool function is_yes() { case "$1" in o|oui|y|yes|v|vrai|t|true|on) return 0;; @@ -3302,15 +3731,15 @@ if [ -n "$UTOOLS_CHROOT" ]; then fi function setyesval() { - is_yes "$2" && set_var "$1" 1 || set_var "$1" "" + is_yes "$2" && _setv "$1" 1 || _setv "$1" "" } function normyesval() { - is_yes "${2:-"${!1}"}" && set_var "$1" 1 || set_var "$1" "" + is_yes "${2:-"${!1}"}" && _setv "$1" 1 || _setv "$1" "" } function normyesvals() { local __nyv_yesvar for __nyv_yesvar in "$@"; do - is_yes "${!__nyv_yesvar}" && set_var "$__nyv_yesvar" 1 || set_var "$__nyv_yesvar" "" + is_yes "${!__nyv_yesvar}" && _setv "$__nyv_yesvar" 1 || _setv "$__nyv_yesvar" "" done } function quote_in() { @@ -3333,7 +3762,7 @@ function quoted_sargs() { for a in "$@"; do s="${s:+$s }$(quoted_sarg "$a")" done - rawecho "$s" + recho "$s" } function set_array_cmd() { @@ -3348,7 +3777,7 @@ function set_array_cmd() { __sac_f=1 for __sac_v in "$@"; do [ -n "$__sac_f" ] && __sac_f= || __sac_s="$__sac_s " - __sac_s="$__sac_s$(quoted_arg "$__sac_v")" + __sac_s="$__sac_s$(qvalm "$__sac_v")" done __sac_s="$__sac_s)" echo "$__sac_s" @@ -3377,7 +3806,7 @@ function array_del() { local __ad_v local -a __ad_vs eval 'for __ad_v in "${'"$1"'[@]}"; do - if [ "$__ad_v" != '"$(quoted_arg "$2")"' ]; then + if [ "$__ad_v" != '"$(qval "$2")"' ]; then array_add __ad_vs "$__ad_v" fi done' @@ -3386,7 +3815,7 @@ done' function array_addu() { local __as_v eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then + if [ "$__as_v" == '"$(qval "$2")"' ]; then return 1 fi done' @@ -3399,7 +3828,7 @@ function array_set() { function array_insu() { local __as_v eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then + if [ "$__as_v" == '"$(qval "$2")"' ]; then return 1 fi done' @@ -3430,7 +3859,7 @@ function array_eq() { function array_contains() { local __ac_v eval 'for __ac_v in "${'"$1"'[@]}"; do - if [ "$__ac_v" == '"$(quoted_arg "$2")"' ]; then + if [ "$__ac_v" == '"$(qvalm "$2")"' ]; then return 0 fi done' @@ -3439,7 +3868,7 @@ done' function array_icontains() { local __ac_v eval 'for __ac_v in "${'"$1"'[@]}"; do - if [ "$(strlower "$__ac_v")" == '"$(strlower "$(quoted_arg "$2")")"' ]; then + if [ "$(strlower "$__ac_v")" == '"$(strlower "$(qval "$2")")"' ]; then return 0 fi done' @@ -3449,7 +3878,7 @@ function array_find() { local __af_i __af_v __af_i=0 eval 'for __af_v in "${'"$1"'[@]}"; do - if [ "$__af_v" == '"$(quoted_arg "$2")"' ]; then + if [ "$__af_v" == '"$(qval "$2")"' ]; then if [ -n "$3" ]; then echo "${'"$3"'[$__af_i]}" else @@ -3508,10 +3937,10 @@ function array_map() { array_copy "$__am_an" __am_vs } function first_value() { - eval "rawecho \"\${$1[@]:0:1}\"" + eval "recho \"\${$1[@]:0:1}\"" } function last_value() { - eval "rawecho \"\${$1[@]:\$((-1)):1}\"" + eval "recho \"\${$1[@]:\$((-1)):1}\"" } function array_copy() { eval "$1=(\"\${$2[@]}\")" @@ -3591,9 +4020,9 @@ function array_join() { __aj_j="${__aj_j:+$__aj_j'"$__aj_s"'}$__aj_pf$__aj_l$__aj_sf" done' if [ -n "$__aj_j" ]; then - rawecho "$__aj_j" + recho "$__aj_j" elif [ "$__aj_an" != "\$@" -a -n "$3" ]; then - rawecho "$3" + recho "$3" fi } function array_mapjoin() { @@ -3643,26 +4072,21 @@ function parse_date() { local value="$1" type="${2:-date}" local now="$(awk 'BEGIN { print mktime(strftime("%Y %m %d 00 00 00 +0400")) }')" case "$value" in - +*) - value="$(($now + ${value#+} * 86400))" - ;; - *) - value="$(<<<"$value" awk -F/ '{ - nd = strftime("%d"); nm = strftime("%m"); ny = strftime("%Y") - d = $1 + 0; if (d < 1) d = nd; - m = $2 + 0; if (m < 1) m = nm; - if ($3 == "") y = ny; - else { y = $3 + 0; if (y < 100) y = y + 2000; } - print mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d)); - }')" + +*) value="$(($now + ${value#+} * 86400))";; + *) value="$(<<<"$value" awk -F/ '{ + nd = strftime("%d"); nm = strftime("%m"); ny = strftime("%Y") + d = $1 + 0; if (d < 1) d = nd; + m = $2 + 0; if (m < 1) m = nm; + if ($3 == "") y = ny; + else { y = $3 + 0; if (y < 100) y = y + 2000; } + print mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d)); + }')";; esac case "$type" in d|date) awk '{ print strftime("%d/%m/%Y", $0 + 0) }' <<<"$value";; l|ldap) awk '{ print strftime("%Y%m%d%H%M%S+0400", $0 + 0) }' <<<"$value";; m|mysql) awk '{ print strftime("%Y-%m-%d", $0 + 0) }' <<<"$value";; - *) - rawecho "$value" - ;; + *) recho "$value";; esac } @@ -3713,7 +4137,7 @@ function normpath() { ap="$ap$part" fi done - rawecho "$ap" + recho "$ap" } function abspath() { local ap="$1" @@ -3771,7 +4195,7 @@ function ppath() { [ "$cwd" != "/" -a "$cwd" != "$HOME" ] && path="${path#$cwd/}" [ "${path#$HOME/}" != "$path" ] && path="~${path#$HOME}" - rawecho "$path" + recho "$path" } function relpath() { local p="$(abspath "$1" "$3")" cwd="$2" @@ -3783,7 +4207,7 @@ function relpath() { if [ "$p" == "$cwd" ]; then echo "" elif [ "${p#$cwd/}" != "$p" ]; then - rawecho "${p#$cwd/}" + recho "${p#$cwd/}" else local rp while [ -n "$cwd" -a "${p#$cwd/}" == "$p" ]; do @@ -3851,8 +4275,8 @@ function splitwcs() { fi done [ "${__sw_p#/}" != "$__sw_p" ] && __sw_d="/$__sw_d" - set_var "$__sw_dd" "$__sw_d" - set_var "$__sw_df" "$__sw_f" + _setv "$__sw_dd" "$__sw_d" + _setv "$__sw_df" "$__sw_f" } function deref() { local OENC="$UTF8" @@ -3907,9 +4331,9 @@ function path_if_test() { local basedir="$1" if [ $op "$basedir/$file" ]; then if [ -n "$rel" ]; then - rawecho "$reldir$file" + recho "$reldir$file" else - rawecho "$basedir/$file" + recho "$basedir/$file" fi break fi @@ -4299,7 +4723,7 @@ function list_all() { cd "$b" 2>/dev/null || return eval "$(__la_cmd "$@")" | while read f; do [ "$f" == "." -o "$f" == ".." ] && continue - rawecho "$f" + recho "$f" done cd "$curdir" } @@ -4321,7 +4745,7 @@ function list_files() { cd "$b" 2>/dev/null || return eval "$(__la_cmd "$@")" | while read f; do - [ -f "$f" ] && rawecho "$f" + [ -f "$f" ] && recho "$f" done cd "$curdir" } @@ -4333,7 +4757,7 @@ function list_dirs() { cd "$b" 2>/dev/null || return eval "$(__la_cmd "$@")" | while read f; do [ "$f" == "." -o "$f" == ".." ] && continue - [ -d "$f" ] && rawecho "$f" + [ -d "$f" ] && recho "$f" done cd "$curdir" } @@ -4519,10 +4943,10 @@ function runscript_as() { local cmd cmd="\ -__estack=$(quoted_arg "$__estack") -__tlevel=$(quoted_args "$__tlevel") +__estack=$(qval "$__estack") +__tlevel=$(qval "$__tlevel") export __estack __tlevel -exec ${BASH:-/bin/sh} $(quoted_args "$@")" +exec ${BASH:-/bin/sh} $(qvals "$@")" if is_yes "$UTOOLS_USES_SU" || ! progexists sudo; then eecho "Entrez le mot de passe de root" @@ -4642,8 +5066,8 @@ En l'occurence, ce script est accédé par le chemin $script et ce chemin doit e estep "Lancement de la commande sur l'hôte distant $user@$host" local cmd - [ -n "$path" ] && cmd="$(quoted_args cd "$path"); " - cmd="$cmd$(quoted_args "$script" "$@")" + [ -n "$path" ] && cmd="$(qvals cd "$path"); " + cmd="$cmd$(qvals "$script" "$@")" ssh -qt "${UTOOLS_ENSURE_HOSTNAME_SSH_OPTS[@]}" "$user@$host" "$cmd" [ $? -eq 255 ] && return 12 return 1 @@ -5274,13 +5698,13 @@ function awkdef() { [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break __ad_value="${1:$__ad_vpos}" if [ -n "$__ad_int" ]; then - echo "$__ad_name = int($(quoted_awk "$__ad_value") + 0)" + echo "$__ad_name = int($(qawk "$__ad_value") + 0)" elif [ -n "$__ad_str" ]; then - echo "$__ad_name = $(quoted_awk "$__ad_value")" + echo "$__ad_name = $(qawk "$__ad_value")" elif [ ${#__ad_value} -lt 256 ] && isnum "$__ad_value"; then echo "$__ad_name = $__ad_value" else - echo "$__ad_name = $(quoted_awk "$__ad_value")" + echo "$__ad_name = $(qawk "$__ad_value")" fi else break @@ -5295,7 +5719,7 @@ function awkdef() { local __ad_i=1 echo "$__ad_name[0] = 0; delete $__ad_name" for __ad_arg in "${!__ad_value}"; do - echo "$__ad_name[$__ad_i]=$(quoted_awk "$__ad_arg")" + echo "$__ad_name[$__ad_i]=$(qawk "$__ad_arg")" __ad_i=$(($__ad_i + 1)) done eval "echo \"\${__ad_name}_count = \${#$__ad_value}\"" @@ -5304,7 +5728,7 @@ function awkdef() { done echo "}" for __ad_arg in "$@"; do - rawecho "$__ad_arg" + recho "$__ad_arg" done fi @@ -5635,7 +6059,7 @@ __init_encoding function tooenc() { local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" if [ "$from" == "$to" ]; then - rawecho "$src" + recho "$src" else iconv -f "$from" -t "$to" <<<"$src" fi @@ -5646,9 +6070,9 @@ function uecho() { function tooenc_() { local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" if [ "$from" == "$to" ]; then - rawecho_ "$src" + recho_ "$src" else - rawecho_ "$src" | iconv -f "$from" -t "$to" + recho_ "$src" | iconv -f "$from" -t "$to" fi } function uecho_() { @@ -5657,7 +6081,7 @@ function uecho_() { function toienc() { local __tie_var="$1" __tie_to="${2:-$IENC}" __tie_from="${3:-$UTOOLS_INPUT_ENCODING}" if [ "$__tie_from" != "$__tie_to" ]; then - set_var "$__tie_var" "$(iconv -f "$__tie_from" -t "$__tie_to" <<<"${!__tie_var}")" + _setv "$__tie_var" "$(iconv -f "$__tie_from" -t "$__tie_to" <<<"${!__tie_var}")" fi } function uread() { @@ -5721,7 +6145,7 @@ function __indent() { /}" != "$1" ]; then sed "2,\$s/^/${__tlevel}/g" <<<"$1" else - rawecho "$1" + recho "$1" fi } function __eerror() { tooenc "$(__edate)${__tlevel}ERROR $(__indent "$1")"; } @@ -5804,7 +6228,7 @@ function is_interaction() { function get_interaction_option() { :;} __epending= function eflush() { - if [ -n "$__epending" ]; then rawecho "$__epending" 1>&2; __epending=; fi + if [ -n "$__epending" ]; then recho "$__epending" 1>&2; __epending=; fi } function eclearp() { __epending= @@ -5840,7 +6264,7 @@ function edebug() { show_debug || return; eflush; __edebug "$*" 1>&2 } function trace() { - local r cmd="$(quoted_args "$@")" + local r cmd="$(qvals "$@")" show_info && { eflush; __eecho "\$ $cmd" 1>&2; } "$@"; r=$? if [ $r -ne 0 ]; then @@ -5856,7 +6280,7 @@ function trace_error() { local r "$@"; r=$? if [ $r -ne 0 ]; then - local cmd="$(quoted_args "$@")" + local cmd="$(qvals "$@")" show_error && { eflush; __eecho "^ $cmd [EC #$r]" 1>&2; } fi return $r @@ -6181,7 +6605,7 @@ function __rv_read() { OENC="$UTF8" eerror "La valeur par défaut de $__rv_v doit être non vide" return 1 fi - set_var "$__rv_v" "$__rv_d" + _setv "$__rv_v" "$__rv_d" return 0 fi @@ -6210,7 +6634,7 @@ function __rv_read() { fi __rv_r="${__rv_r:-$__rv_d}" if [ -n "$__rv_r" ] || ! is_yes "$__rv_re"; then - set_var "$__rv_v" "$__rv_r" + _setv "$__rv_v" "$__rv_r" return 0 fi done @@ -6276,7 +6700,7 @@ function simple_menu() { __sm_c=0 fi done - set_var "$__sm_option_var" "$__sm_option" + _setv "$__sm_option_var" "$__sm_option" } function actions_menu() { @@ -6303,8 +6727,8 @@ function actions_menu() { eerror_unless [ ${#__am_action_descs[*]} -gt 0 ] "Vous devez spécifier le tableau des actions" || return __actions_menu || return 1 - setv "${1:-action}" "$__am_select_action" - setv "${2:-option}" "$__am_select_option" + _setv "${1:-action}" "$__am_select_action" + _setv "${2:-option}" "$__am_select_option" } function __actions_menu() { local title="$__am_title" @@ -6563,12 +6987,12 @@ function ac_set_tmpfile() { fi fi if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" + _setv "$1" "$3" [ -f "$3" -a "$4" == keep ] || >"$3" else local __acst_t="$(mktempf "$2")" autoclean "$__acst_t" - set_var "$1" "$__acst_t" + _setv "$1" "$__acst_t" fi } function ac_set_tmpdir() { @@ -6581,12 +7005,12 @@ function ac_set_tmpdir() { fi fi if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" + _setv "$1" "$3" mkdir -p "$3" else local __acst_t="$(mktempd "$2")" autoclean "$__acst_t" - set_var "$1" "$__acst_t" + _setv "$1" "$__acst_t" fi } function debug_tee() { @@ -6663,9 +7087,9 @@ urequire base SYSNAMES=(linux linux64 linux32 linuxppc64 linuxppc32 linuxarm macosx) -linux_SYSDISTS=(debianlike debian ubuntu redhatlike rhel fedora centos suse gentoo) -linux32_SYSDISTS=(debianlike debian ubuntu redhatlike rhel fedora centos suse gentoo) -linux64_SYSDISTS=(debianlike debian ubuntu redhatlike rhel fedora centos suse gentoo) +linux_SYSDISTS=(debianlike debian ubuntu redhatlike ol rhel fedora centos suse gentoo) +linux32_SYSDISTS=(debianlike debian ubuntu redhatlike ol rhel fedora centos suse gentoo) +linux64_SYSDISTS=(debianlike debian ubuntu redhatlike ol rhel fedora centos suse gentoo) linuxppc32_SYSDISTS=(debianlike debian ubuntu redhatlike fedora) linuxppc64_SYSDISTS=(debianlike debian ubuntu redhatlike fedora) linuxarm_SYSDISTS=(debianlike debian ubuntu) @@ -6677,6 +7101,7 @@ debianlike_SYSVERS=() debian_SYSVERS=(stretch jessie wheezy squeeze lenny etch) ubuntu_SYSVERS=(oneiric natty maverick lucid karmic jaunty intrepid hardy) redhatlike_SYSVERS=() +ol_SYSVERS=(ol7 ol6 redhat7 redhat6) rhel_SYSVERS=(rhel7 rhel6 rhel5 rhel4 redhat7 redhat6 redhat5 redhat4) fedora_SYSVERS=(fedora14 fedora13 fedora12 fedora11) centos_SYSVERS=(centos7 centos6 centos5 centos4 redhat7 redhat6 redhat5 redhat4) @@ -6714,6 +7139,7 @@ function __compute_local_sysinfos_data() { "$UNAME_MACHINE" "$([ -f /etc/debian_version ] && cat /etc/debian_version)" "$([ -f /etc/gentoo-release ] && cat /etc/gentoo-release)" + "$([ -f /etc/oracle-release ] && cat /etc/oracle-release)" "$([ -f /etc/redhat-release ] && cat /etc/redhat-release)" "$([ -f /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Resources/version.plist ] && cat /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Resources/version.plist)" "$([ -f /System/Library/Frameworks/CoreServices.framework/Resources/version.plist ] && cat /System/Library/Frameworks/CoreServices.framework/Resources/version.plist)" @@ -6729,6 +7155,8 @@ echo .----------------. echo .----------------. [ -f /etc/gentoo-release ] && cat /etc/gentoo-release echo .----------------. +[ -f /etc/oracle-release ] && cat /etc/oracle-release +echo .----------------. [ -f /etc/redhat-release ] && cat /etc/redhat-release echo .----------------. [ -f /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Resources/version.plist ] && cat /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Resources/version.plist @@ -6767,10 +7195,14 @@ function __compute_sysinfos() { local machine="${SYSINFOS_DATA[1]}" local debian_version="${SYSINFOS_DATA[2]}" local gentoo_release="${SYSINFOS_DATA[3]}" - local redhat_release="${SYSINFOS_DATA[4]}" - local macosx_plist1="${SYSINFOS_DATA[5]}" - local macosx_plist2="${SYSINFOS_DATA[6]}" + local oracle_release="${SYSINFOS_DATA[4]}" + local redhat_release="${SYSINFOS_DATA[5]}" + local macosx_plist1="${SYSINFOS_DATA[6]}" + local macosx_plist2="${SYSINFOS_DATA[7]}" + MYSYSNAME=(unknown) + MYSYSDIST=(unknown) + MYSYSVER=(unknown) if [ "$system" == "Linux" ]; then case "$machine" in x86_64) MYSYSNAME=(linux64 linux); MYBITS=64;; @@ -6792,6 +7224,12 @@ function __compute_sysinfos() { esac elif [ -n "$gentoo_release" ]; then MYSYSDIST=(gentoo) + elif [ -n "$oracle_release" ]; then + MYSYSDIST=(ol rhel redhatlike) + case "$oracle_release" in + Oracle*Linux*release\ 7*) MYSYSVER=(ol7 rhel7 redhat7);; + Oracle*Linux*release\ 6*) MYSYSVER=(ol6 rhel6 redhat6);; + esac elif [ -n "$redhat_release" ]; then case "$redhat_release" in Fedora*) MYSYSDIST=(fedora redhatlike);; @@ -6825,13 +7263,14 @@ s/<\/string>.*$//g' done } MYSYSNAME=(macosx darwin) - case "$(get_macosx_version)" in + case "$(get_macosx_version "$macosx_plist1" "$macosx_plist2")" in 10.7*) MYSYSDIST=(lion);; 10.6*) MYSYSDIST=(snowleopard);; 10.5*) MYSYSDIST=(leopard);; 10.4*) MYSYSDIST=(tiger);; 10.3*) MYSYSDIST=(panther);; esac + MYSYSVER=() fi } @@ -6900,8 +7339,8 @@ function __fix_sysinfos_upward() { array_copy sysvers_ "${sysdist_}_SYSVERS" for sysver_ in "${sysvers_[@]}"; do if [ "$sysver_" == "${!sysvervar_}" ]; then - set_var "$sysdistvar_" "$sysdist_" - set_var "$sysnamevar_" "$sysname_" + _setv "$sysdistvar_" "$sysdist_" + _setv "$sysnamevar_" "$sysname_" return fi done @@ -6913,7 +7352,7 @@ function __fix_sysinfos_upward() { array_copy sysdists_ "${sysname_}_SYSDISTS" for sysdist_ in "${sysdists_[@]}"; do if [ "$sysdist_" == "${!sysdistvar_}" ]; then - set_var "$sysnamevar_" "$sysname_" + _setv "$sysnamevar_" "$sysname_" return fi done @@ -6928,7 +7367,7 @@ function __fix_sysinfos_downward() { if [ -z "${!sysdistvar_}" ]; then array_copy sysdists_ "${!sysnamevar_}_SYSDISTS" for sysdist_ in "${sysdists_[@]}"; do - set_var "$sysdistvar_" "$sysdist_" + _setv "$sysdistvar_" "$sysdist_" break done fi @@ -6937,7 +7376,7 @@ function __fix_sysinfos_downward() { if [ -z "${!sysvervar_}" ]; then array_copy sysvers_ "${sysdistvar_}_SYSVERS" for sysver_ in "${sysvers_[@]}"; do - set_var "$sysvervar_" "$sysver_" + _setv "$sysvervar_" "$sysver_" break done fi @@ -6946,12 +7385,23 @@ function ensure_sysinfos() { local sysnamevar_="${1:-SYSNAME}" local sysdistvar_="${2:-SYSDIST}" local sysvervar_="${3:-SYSVER}" - [ -n "${!sysdistvar_}" ] && set_var "$sysdistvar_" "$(__get_sysdist_alias "${!sysdistvar_}")" - [ -n "${!sysvervar_}" ] && set_var "$sysvervar_" "$(__get_sysver_alias "${!sysvervar_}")" + [ -n "${!sysdistvar_}" ] && _setv "$sysdistvar_" "$(__get_sysdist_alias "${!sysdistvar_}")" + [ -n "${!sysvervar_}" ] && _setv "$sysvervar_" "$(__get_sysver_alias "${!sysvervar_}")" __fix_sysinfos_upward __fix_sysinfos_downward } +function dump_sysinfos() { + local sysname_="${1:-MYSYSNAME}[*]" + local sysdist_="${2:-MYSYSDIST}[*]" + local sysver_="${3:-MYSYSVER}[*]" + echo "\ +sysname=(${!sysname_}) +sysdist=(${!sysdist_}) +sysver=(${!sysver_}) +bits=$MYBITS" +} + function get_sysinfos_desc() { local sysname_="${1:-MYSYSNAME}"; sysname_="${!sysname_}" local sysdist_="${2:-MYSYSDIST}"; sysdist_="${!sysdist_}" @@ -7087,6 +7537,24 @@ function check_sysinfos() { return $r_ } +function unsupported_system() { + local msg="Ce script n'est pas supporté sur $(get_sysinfos_desc)" + [ -n "$*" ] && msg="$msg +Il faut au moins l'un des systèmes suivants: $*" + die "$msg" +} + +function require_sysinfos() { + check_sysinfos "$@" && return 0 + local -a infos; local info + for info in "$@"; do + if ! [[ "$info" == -* ]]; then + infos=("${infos[@]}" "$info") + fi + done + unsupported_system "${infos[@]}" +} + function on_debian() { NUTOOLS_ON_DEBIAN= if check_sysinfos -d debian; then @@ -7371,7 +7839,7 @@ if check_sysinfos -s macosx; then done args=("${args[@]}" "$@") fi - quoted_args "${options[@]}" -- "${args[@]}" + qvals "${options[@]}" -- "${args[@]}" return 0 } diff --git a/lib/ulib/sysinfos b/lib/ulib/sysinfos index c19c746..1b7c707 100644 --- a/lib/ulib/sysinfos +++ b/lib/ulib/sysinfos @@ -270,8 +270,8 @@ function __fix_sysinfos_upward() { array_copy sysvers_ "${sysdist_}_SYSVERS" for sysver_ in "${sysvers_[@]}"; do if [ "$sysver_" == "${!sysvervar_}" ]; then - set_var "$sysdistvar_" "$sysdist_" - set_var "$sysnamevar_" "$sysname_" + _setv "$sysdistvar_" "$sysdist_" + _setv "$sysnamevar_" "$sysname_" return fi done @@ -284,7 +284,7 @@ function __fix_sysinfos_upward() { array_copy sysdists_ "${sysname_}_SYSDISTS" for sysdist_ in "${sysdists_[@]}"; do if [ "$sysdist_" == "${!sysdistvar_}" ]; then - set_var "$sysnamevar_" "$sysname_" + _setv "$sysnamevar_" "$sysname_" return fi done @@ -301,7 +301,7 @@ function __fix_sysinfos_downward() { # essayer de déterminer !sysdistvar_ à partir de !sysnamevar_ array_copy sysdists_ "${!sysnamevar_}_SYSDISTS" for sysdist_ in "${sysdists_[@]}"; do - set_var "$sysdistvar_" "$sysdist_" + _setv "$sysdistvar_" "$sysdist_" break done fi @@ -311,7 +311,7 @@ function __fix_sysinfos_downward() { # essayer de déterminer !sysvervar_ à partir de !sysdistvar_ array_copy sysvers_ "${sysdistvar_}_SYSVERS" for sysver_ in "${sysvers_[@]}"; do - set_var "$sysvervar_" "$sysver_" + _setv "$sysvervar_" "$sysver_" break done fi @@ -325,8 +325,8 @@ function ensure_sysinfos() { local sysnamevar_="${1:-SYSNAME}" local sysdistvar_="${2:-SYSDIST}" local sysvervar_="${3:-SYSVER}" - [ -n "${!sysdistvar_}" ] && set_var "$sysdistvar_" "$(__get_sysdist_alias "${!sysdistvar_}")" - [ -n "${!sysvervar_}" ] && set_var "$sysvervar_" "$(__get_sysver_alias "${!sysvervar_}")" + [ -n "${!sysdistvar_}" ] && _setv "$sysdistvar_" "$(__get_sysdist_alias "${!sysdistvar_}")" + [ -n "${!sysvervar_}" ] && _setv "$sysvervar_" "$(__get_sysver_alias "${!sysvervar_}")" __fix_sysinfos_upward __fix_sysinfos_downward } diff --git a/lib/ulib/templates/runsconfig/default.rr b/lib/ulib/templates/runsconfig/default.rr index 0037ef9..db6d77b 100644 --- a/lib/ulib/templates/runsconfig/default.rr +++ b/lib/ulib/templates/runsconfig/default.rr @@ -2,6 +2,10 @@ # Ce fichier contient la liste des script à lancer avec le compte root pour # configurer @@host@@ # Chaque ligne contient le nom du script suivi des arguments éventuels -#generic-base +#---Ne garder que la ligne correspondant au type d'hôte. ur=1 pour les hôtes de l'université +#jessie-base ur=1 +#ol6-base ur=1 +#ol7-base ur=1 +#--- #@services #@config diff --git a/lib/ulib/udir b/lib/ulib/udir index a7caa3a..7e57927 100644 --- a/lib/ulib/udir +++ b/lib/ulib/udir @@ -35,8 +35,8 @@ function udir_dump() { local udirf="$(abspath "${1:-.}")" [ -d "$udirf" ] && udirf="$udirf/.udir" if [ -f "$udirf" ]; then - set_var_cmd udir "$(dirname "$udirf")" - set_var_cmd udirf "$udirf" + echo_setv udir "$(dirname "$udirf")" + echo_setv udirf "$udirf" <"$udirf" filter_comment -m fi } @@ -140,11 +140,11 @@ function udir_update() { for param in "$@"; do name="${param%%=*}" script="$script - names[$i] = $(quoted_awk "$name")" + names[$i] = $(qawk "$name")" if [ "$name" != "$param" ]; then value="${param#*=}" script="$script - values[$i] = $(quoted_awk "$value")" + values[$i] = $(qawk "$value")" else script="$script values[$i] = \"\"" diff --git a/lib/ulib/uinst b/lib/ulib/uinst index 26e1027..6ea23f7 100644 --- a/lib/ulib/uinst +++ b/lib/ulib/uinst @@ -290,7 +290,7 @@ Utilisez 'udir -e $(ppath "$srcdir")' pour modifier les paramètres qui ont ét __uinst_migrate_legacy "$srcdir" __uinst_varcmds=() for __uinst_v in "${UDIR_VARS[@]}"; do - __uinst_varcmds=("${__uinst_varcmds[@]}" "$(set_var_cmd "$__uinst_v" "${!__uinst_v}")") + __uinst_varcmds=("${__uinst_varcmds[@]}" "$(echo_setv "$__uinst_v" "${!__uinst_v}")") done for __uinst_a in "${UDIR_ARRAYS[@]}"; do __uinst_varcmds=("${__uinst_varcmds[@]}" "$(set_array_cmd "$__uinst_a")") @@ -310,7 +310,7 @@ Utilisez 'udir -e $(ppath "$srcdir")' pour modifier les paramètres qui ont ét local udir_desc udir_note udir_types local profiles conf rootconf ulibsync copy_files - eval "$(udir_eval "$srcdir" 'set_var_cmd udir_desc "$udir_desc"; set_var_cmd udir_note "$udir_note"')" + eval "$(udir_eval "$srcdir" 'echo_setv udir_desc "$udir_desc"; echo_setv udir_note "$udir_note"')" etitle "Description du projet" check_interaction -c && estepn "La description courte de l'objet de ce projet est affichée avec udir -i" @@ -319,7 +319,7 @@ Utilisez 'udir -e $(ppath "$srcdir")' pour modifier les paramètres qui ont ét Elle peut être utilisée pour diriger le visiteur vers des informations importantes." read_value "Entrez une note associée au répertoire de ce projet" udir_note "$udir_note" N eend - udir_update "$srcdir" "udir_desc=$(quoted_arg "$udir_desc")" "udir_note=$(quoted_arg "$udir_note")" + udir_update "$srcdir" "udir_desc=$(qval "$udir_desc")" "udir_note=$(qval "$udir_note")" estepn "La configuration par défaut permet de créer un projet qui utilise les outils et librairies de nutools. Ce projet pourra ensuite être installé avec uinst" @@ -351,7 +351,7 @@ Ce projet pourra ensuite être installé avec uinst" mkdirof "$genfile" [ -f "$genfile" ] || echo '# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 __uaddpath "@@dest@@" PATH' >"$genfile" - udir_update "$srcdir" "configure_dest_for=($(quoted_arg "${genfile#"$srcdir/"}"))" + udir_update "$srcdir" "configure_dest_for=($(qvalm "${genfile#"$srcdir/"}"))" fi if [ -n "$conf" ]; then genfile="$srcdir/lib/uinst/conf" @@ -525,12 +525,12 @@ function __uinst_addvarnf() { eerror "La variable $1 est protégée" return 1 else - array_add UINST_CONFIG_VARCMDS "$(set_var_cmd "$1" "$2")" - set_var "$1" "$2" + array_add UINST_CONFIG_VARCMDS "$(echo_setv "$1" "$2")" + _setv "$1" "$2" if [ "$1" == "MYHOST" ]; then # cas particulier: initialiser aussi MYHOSTNAME - set_var "MYHOSTNAME" "${2%%.*}" - array_add UINST_CONFIG_VARCMDS "$(set_var_cmd "MYHOSTNAME" "$MYHOSTNAME")" + _setv "MYHOSTNAME" "${2%%.*}" + array_add UINST_CONFIG_VARCMDS "$(echo_setv "MYHOSTNAME" "$MYHOSTNAME")" fi return 0 fi @@ -683,7 +683,7 @@ function __uinst_prepare_conf() { # prepare_name=$srcdir # srcdir est un chemin relatif à $UINST_PREPARE_DIR (si la source était une # archive, il est possible que ce chemin soit en plusieurs parties - set_var_cmd prepare_name "$(relpath "$srcdir" "$UINST_PREPARE_DIR")" >"$UINST_PREPARE_CONF" + echo_setv prepare_name "$(relpath "$srcdir" "$UINST_PREPARE_DIR")" >"$UINST_PREPARE_CONF" } ################################################################################ @@ -796,28 +796,28 @@ function __uinst_udir2s() { __uinst_config="$__uinst_configdir/config" __uinst_abort="$__uinst_configdir/abort" __uinst_updateconfig="$__uinst_configdir/updateconfig" - set_var_cmd ABORT "$__uinst_abort" >>"$__uinst_config" - set_var_cmd CONFIG "$__uinst_updateconfig" >>"$__uinst_config" - set_var_cmd __verbosity "$__verbosity" >>"$__uinst_config" - set_var_cmd __interaction "$__interaction" >>"$__uinst_config" + echo_setv ABORT "$__uinst_abort" >>"$__uinst_config" + echo_setv CONFIG "$__uinst_updateconfig" >>"$__uinst_config" + echo_setv __verbosity "$__verbosity" >>"$__uinst_config" + echo_setv __interaction "$__interaction" >>"$__uinst_config" for __uinst_var in "${__uinst_vars[@]}"; do - set_var_cmd "$__uinst_var" "${!__uinst_var}" >>"$__uinst_config" + echo_setv "$__uinst_var" "${!__uinst_var}" >>"$__uinst_config" done for __uinst_var in "${__uinst_arrays[@]}"; do set_array_cmd "$__uinst_var" >>"$__uinst_config" done - set_var_cmd "UINST_LOCAL_PROFILES" "$UINST_LOCAL_PROFILES" >>"$__uinst_config" - set_var_cmd "UINST_ISTMPDIR" "$UINST_ISTMPDIR" >>"$__uinst_config" - set_var_cmd "UINST_ORIGSRC" "$UINST_ORIGSRC" >>"$__uinst_config" - set_var_cmd "UINST_SRCDIR" "$UINST_SRCDIR" >>"$__uinst_config" - set_var_cmd "ULIBDIR" "$ULIBDIR" >>"$__uinst_config" - set_var_cmd "UINST" "$UINST" >>"$__uinst_config" + echo_setv "UINST_LOCAL_PROFILES" "$UINST_LOCAL_PROFILES" >>"$__uinst_config" + echo_setv "UINST_ISTMPDIR" "$UINST_ISTMPDIR" >>"$__uinst_config" + echo_setv "UINST_ORIGSRC" "$UINST_ORIGSRC" >>"$__uinst_config" + echo_setv "UINST_SRCDIR" "$UINST_SRCDIR" >>"$__uinst_config" + echo_setv "ULIBDIR" "$ULIBDIR" >>"$__uinst_config" + echo_setv "UINST" "$UINST" >>"$__uinst_config" # ulib recalcule systématiquement la valeur de ULIBDIR. Pareil pour # pyulib/pyulib. Mais cela ne fonctionne pas si nous déployons sur une # machine avec bash 2.x. Il faut donc forcer l'utilisation de la valeur # calculée. - set_var_cmd "FORCED_ULIBDIR" "$ULIBDIR" >>"$__uinst_config" - set_var_cmd "FORCED_PYULIBDIR" "$PYULIBDIR" >>"$__uinst_config" + echo_setv "FORCED_ULIBDIR" "$ULIBDIR" >>"$__uinst_config" + echo_setv "FORCED_PYULIBDIR" "$PYULIBDIR" >>"$__uinst_config" ## Lancer les scripts de préconfiguration function __uinst_preconfig_scripts() { @@ -1241,13 +1241,13 @@ function __uinst_python() { local __uinst_config __uinst_var ac_set_tmpfile __uinst_config for __uinst_var in srcdir; do - set_var_cmd "$__uinst_var" "${!__uinst_var}" >>"$__uinst_config" + echo_setv "$__uinst_var" "${!__uinst_var}" >>"$__uinst_config" done - set_var_cmd "UINST_ISTMPDIR" "$UINST_ISTMPDIR" >>"$__uinst_config" - set_var_cmd "UINST_ORIGSRC" "$UINST_ORIGSRC" >>"$__uinst_config" - set_var_cmd "UINST_SRCDIR" "$UINST_SRCDIR" >>"$__uinst_config" - set_var_cmd "ULIBDIR" "$ULIBDIR" >>"$__uinst_config" - set_var_cmd "UINST" "$UINST" >>"$__uinst_config" + echo_setv "UINST_ISTMPDIR" "$UINST_ISTMPDIR" >>"$__uinst_config" + echo_setv "UINST_ORIGSRC" "$UINST_ORIGSRC" >>"$__uinst_config" + echo_setv "UINST_SRCDIR" "$UINST_SRCDIR" >>"$__uinst_config" + echo_setv "ULIBDIR" "$ULIBDIR" >>"$__uinst_config" + echo_setv "UINST" "$UINST" >>"$__uinst_config" runscript_as_root "$uinst2s" "$__uinst_config" } @@ -1354,16 +1354,16 @@ function __uinst_file() { local __uinst_config __uinst_var ac_set_tmpfile __uinst_config for __uinst_var in copy_files destdir srcdir owner modes; do - set_var_cmd "$__uinst_var" "${!__uinst_var}" >>"$__uinst_config" + echo_setv "$__uinst_var" "${!__uinst_var}" >>"$__uinst_config" done for __uinst_var in files modes; do set_array_cmd "$__uinst_var" >>"$__uinst_config" done - set_var_cmd "UINST_ISTMPDIR" "$UINST_ISTMPDIR" >>"$__uinst_config" - set_var_cmd "UINST_ORIGSRC" "$UINST_ORIGSRC" >>"$__uinst_config" - set_var_cmd "UINST_SRCDIR" "$UINST_SRCDIR" >>"$__uinst_config" - set_var_cmd "ULIBDIR" "$ULIBDIR" >>"$__uinst_config" - set_var_cmd "UINST" "$UINST" >>"$__uinst_config" + echo_setv "UINST_ISTMPDIR" "$UINST_ISTMPDIR" >>"$__uinst_config" + echo_setv "UINST_ORIGSRC" "$UINST_ORIGSRC" >>"$__uinst_config" + echo_setv "UINST_SRCDIR" "$UINST_SRCDIR" >>"$__uinst_config" + echo_setv "ULIBDIR" "$ULIBDIR" >>"$__uinst_config" + echo_setv "UINST" "$UINST" >>"$__uinst_config" runscript_as_root "$uinst2s" "$__uinst_config" } diff --git a/lib/ulib/webobjects b/lib/ulib/webobjects index d887e68..c091162 100644 --- a/lib/ulib/webobjects +++ b/lib/ulib/webobjects @@ -177,8 +177,8 @@ function read_infofile() { # Retourner 1 si un erreur s'est produite, par exemple si le fichier $1 # n'existe pas ou n'est pas accessible en lecture [ -f "$1" -a -r "$1" ] || return 1 - set_var "${2:-version}" "$(grep -A 1 CFBundleShortVersionString "$1" | tail -1 | sed 's/^.*\(.*\)<\/string>.*$/\1/')" - set_var "${3:-release}" "$(grep -A 1 CFBundleVersion "$1" | tail -1 | sed 's/^.*\(.*\)<\/string>.*$/\1/')" + _setv "${2:-version}" "$(grep -A 1 CFBundleShortVersionString "$1" | tail -1 | sed 's/^.*\(.*\)<\/string>.*$/\1/')" + _setv "${3:-release}" "$(grep -A 1 CFBundleVersion "$1" | tail -1 | sed 's/^.*\(.*\)<\/string>.*$/\1/')" } function write_infofile() { @@ -525,7 +525,7 @@ function woraurl() { 5*) _status=3;; *) _status=11;; esac - set_var "${4:-http_code}" "$_http_code" + _setv "${4:-http_code}" "$_http_code" return $_status } function wogeturl() { woraurl GET "$@"; } @@ -540,28 +540,28 @@ function splitins() { # Si $1==App, type=app et name=App # si $1==App-N, type=ins et name=App-N if [ -z "$1" ]; then - set_var "${2:-type}" all - set_var "${3:-name}" + _setv "${2:-type}" all + _setv "${3:-name}" elif [ "${1%.woa}" != "$1" ]; then - set_var "${2:-type}" woa - set_var "${3:-name}" "$1" + _setv "${2:-type}" woa + _setv "${3:-name}" "$1" elif [ "${1%.framework}" != "$1" ]; then - set_var "${2:-type}" fwk - set_var "${3:-name}" "$1" + _setv "${2:-type}" fwk + _setv "${3:-name}" "$1" elif [[ "$1" == *-* ]]; then local __si_name __si_num __si_name="${1%-*}" __si_num="${1##*-}" if [ -z "${__si_num//[0-9]/}" ]; then - set_var "${2:-type}" ins - set_var "${3:-name}" "$1" + _setv "${2:-type}" ins + _setv "${3:-name}" "$1" else - set_var "${2:-type}" app - set_var "${3:-name}" "$1" + _setv "${2:-type}" app + _setv "${3:-name}" "$1" fi elif [ -n "$1" ]; then - set_var "${2:-type}" app - set_var "${3:-name}" "$1" + _setv "${2:-type}" app + _setv "${3:-name}" "$1" fi } diff --git a/lib/ulib/woinst b/lib/ulib/woinst index 95714cc..0d3a7ca 100644 --- a/lib/ulib/woinst +++ b/lib/ulib/woinst @@ -102,7 +102,7 @@ COMMANDES while [ -n "$1" ]; do if [ "$1" == // ]; then if [ -n "${cmd[*]}" ]; then - cmds=("${cmds[@]}" "$(quoted_args "${cmd[@]}")") + cmds=("${cmds[@]}" "$(qvals "${cmd[@]}")") fi cmd=() else @@ -111,7 +111,7 @@ COMMANDES shift done if [ -n "${cmd[*]}" ]; then - cmds=("${cmds[@]}" "$(quoted_args "${cmd[@]}")") + cmds=("${cmds[@]}" "$(qvals "${cmd[@]}")") fi fi @@ -458,7 +458,7 @@ OPTIONS if [[ "$src" == *=* ]]; then splitvar "$src" name value array_add variables "$name" - set_var "$name" "$value" + _setv "$name" "$value" else src="$(abspath "$src")" valid= @@ -543,14 +543,14 @@ dans NEXT_ROOT = ${NEXT_ROOT:-/} local configfile variable ac_set_tmpfile configfile for variable in "${variables[@]}" bounce webinst ULIBDIR __estack __tlevel; do - set_var_cmd "$variable" "${!variable}" >>"$configfile" + echo_setv "$variable" "${!variable}" >>"$configfile" done for array in variables scripts applications frameworks; do set_array_cmd "$array" >>"$configfile" done # pour les serveurs qui ont une vieille version de bash, forcer la valeur de # ULIBDIR - set_var_cmd "FORCED_ULIBDIR" "$ULIBDIR" >>"$configfile" + echo_setv "FORCED_ULIBDIR" "$ULIBDIR" >>"$configfile" runscript_as_root "$ULIBDIR/support/woinst2s" "$configfile" diff --git a/lib/ulib/wosign b/lib/ulib/wosign index cd4f5e7..d812a73 100644 --- a/lib/ulib/wosign +++ b/lib/ulib/wosign @@ -18,9 +18,9 @@ function wosign_setup_maybe() { storepass= keyalias= source "$WOSIGN_CONF" - set_var_cmd WOSIGN_KEYSTORE "$keystore" - set_var_cmd WOSIGN_STOREPASS "$storepass" - set_var_cmd WOSIGN_KEYALIAS "$keyalias" + echo_setv WOSIGN_KEYSTORE "$keystore" + echo_setv WOSIGN_STOREPASS "$storepass" + echo_setv WOSIGN_KEYALIAS "$keyalias" )" [ -n "$WOSIGN_XTMPDIR" ] || ac_set_tmpdir WOSIGN_XTMPDIR diff --git a/mysqlcsv b/mysqlcsv index d139389..095997d 100755 --- a/mysqlcsv +++ b/mysqlcsv @@ -132,7 +132,7 @@ if [ "$password" != "--NOT-SET--" ]; then fi if [ -z "$query" -a -n "$input" -a "$input" != "-" ]; then - mysqlcmd="<$(quoted_arg "$input") $mysqlcmd" + mysqlcmd="<$(qval "$input") $mysqlcmd" fi eval "$mysqlcmd" | diff --git a/mysqlloadcsv b/mysqlloadcsv index 765c51a..c8424e4 100755 --- a/mysqlloadcsv +++ b/mysqlloadcsv @@ -340,7 +340,7 @@ if [ "$method" == load ]; then [ -n "$truncate" ] && echo "$truncate" echo "$loadcsv" echo "-- Commande à lancer pour importer la table dans MySQL:" - echo "-- $(quoted_args "${cmd[@]}")" + echo "-- $(qvals "${cmd[@]}")" else "${cmd[@]}"; r=$? fi diff --git a/pdev b/pdev index 46fda55..efd464b 100755 --- a/pdev +++ b/pdev @@ -298,7 +298,7 @@ if [ "$action" == delete ]; then eimportant "\ La branche $origin/$feature n'a plus lieu d'être, mais la configuration actuelle interdit de la supprimer. Veuillez le faire manuellement avec la commande suivante: - $(quoted_args git push "$origin" ":$feature")" + $(qvals git push "$origin" ":$feature")" fi fi fi diff --git a/rruns b/rruns index cddb3d1..94fdb89 100755 --- a/rruns +++ b/rruns @@ -419,11 +419,11 @@ for userhost in "${hosts[@]}"; do if scp -S "$SSH" "$archive" "$user@$host:"; then estep "Lancement du script de déploiement" "$SSH" -qt "$user@$host" "\ -__estack=$(quoted_arg "$__estack") -__tlevel=$(quoted_arg "$__tlevel") +__estack=$(qval "$__estack") +__tlevel=$(qval "$__tlevel") export __estack __tlevel ${UTOOLS_LANG:+UTOOLS_LANG='$UTOOLS_LANG'; export UTOOLS_LANG -}$(quoted_args "./$archivename" ${tmproot:+--tmproot "$tmproot"})" +}$(qvals "./$archivename" ${tmproot:+--tmproot "$tmproot"})" if [ -n "$init_sysinfos" ]; then estep "Calcul des informations de l'hôte distant" sysinfos_script=' diff --git a/ruinst b/ruinst index b72e0cc..e3cf14a 100755 --- a/ruinst +++ b/ruinst @@ -14,7 +14,9 @@ pas contenir d'espaces ni de caractères spéciaux. L'échappement de ces caractères n'est pas garanti. OPTIONS - -C Ne pas faire le déploiement. Configurer uniquement la connexion par clé + -C, --configure-user + --configure USER [--uses-su] + Ne pas faire le déploiement. Configurer uniquement la connexion par clé sur les hôtes distants spécifiés pour le user spécifié. Il faut pouvoir se connecter par mot de passe pour configurer la connexion par clé. Si l'on veut configurer la connexion par clé pour le user root, mais que @@ -26,14 +28,14 @@ OPTIONS Si l'hôte distant n'a pas sudo ou si sudo n'est pas configuré, il faut rajouter l'option --uses-su, e.g: $scriptname -h user@host --configure root --uses-su - -T tmproot + -T, --tmproot TMPROOT Spécifier le répertoire temporaire sur l'hôte distant, comme par exemple /var/tmp. Cette option est utile pour les vservers, qui ont par défaut un /tmp minuscule de 16 Mo. - -S, --ssh ssh + -S, --ssh SSH Spécifier le programme à utiliser pour la connection par ssh. - -h hosts - -h @hostsfile + -h, --host hosts + -h, --host @hostsfile Spécifier un ou plusieurs hôtes sur lequels faire le déploiement. Pour spécifier plusieurs hôtes, il est possible d'utiliser plusieurs fois l'option -h, ou spécifier en une seule fois plusieurs hôtes en les @@ -45,7 +47,17 @@ OPTIONS root. Il est possible de spécifier un autre utilisateur avec la syntaxe user@host, e.g -h user@host La forme @hostsfile permet de lire la liste des hôtes depuis le fichier - hostsfile, à raison d'un hôte par ligne." + hostsfile, à raison d'un hôte par ligne. + --deploy + --no-deploy + Autoriser (respectivement interdire) l'utilisation de la configuration + locale de déploiement pour identifier la destination si aucun hôte n'est + spécifié. + Par défaut, si aucun hôte n'est spécifié, la configuration locale de + déploiement est interrogée pour avoir cette information. + -c, --deploy-config CONFNAME + Cette option permet de spécifier le nom de la configuration à utiliser + pour effectuer la requête. Par défaut, utiliser le nom 'ruinst'" } set_defaults pubkeys @@ -54,18 +66,23 @@ action=deploy confuser= uses_su= tmproot= -hosts=() SSH= force_make_archive= +hosts=() +deploy_enable=1 +deploy_confname=ruinst parse_opts "${PRETTYOPTS[@]}" \ --help '$exit_with display_help' \ - -C action=configure \ + -C,--configure-user action=configure \ --configure: '$set@ confuser;action=configure' \ --uses-su uses_su=1 \ -T:,--tmproot: tmproot= \ -S:,--ssh: SSH= \ --force-make-archive force_make_archive=1 \ -h:,-H:,--host: hosts \ + --deploy deploy_enable=1 \ + --no-deploy deploy_enable= \ + -c:,--deploy-config deploy_confname= \ @ args -- "$@" && set -- "${args[@]}" || die "$args" : "${SSH:=ssh}" @@ -181,7 +198,7 @@ if [ "$action" == "configure" ]; then }$(<"$sshdir/$pubkey")" done fi - [ -n "$PUBKEYS" ] || die "La connexion sur les hôtes distants ne peut se faire que par mot de passe parce que vous n'avez pas de clé publique configurée. Modifiez le fichier ~/etc/default.pubkeys si ce message est erroné." + [ -n "$PUBKEYS" ] || die "La connexion sur les hôtes distants ne peut se faire que par mot de passe parce que vous n'avez pas de clé publique configurée. Modifiez le fichier ~/etc/default/pubkeys si ce message est erroné." [ -n "${hosts[*]}" ] || hosts=("$@") [ -n "${hosts[*]}" ] || die "Vous devez spécifier la liste des hôtes à configurer" @@ -214,6 +231,19 @@ else fi ## Hôtes sur lesquels faire le déploiement +if array_isempty hosts && [ -n "$deploy_enable" ]; then + urequire deploy + deploy_setconf "$deploy_confname" + if deploy_loadconf; then + setxx module=abspath "$src" // basename -- + if eval "$(deploy_query -v host DEST module ruinst_deploy "" shell "$module")"; then + check_interaction -c && einfo "Ce module sera déployé vers les hôtes suivants: +$(array_to_lines host "" " ")" + ask_any "Voulez-vous continuer?" Oq || die + array_copy hosts host + fi + fi +fi array_isempty hosts && read_value "Entrez une liste d'hôtes séparés par ':'" hosts "localhost" fix_hosts @@ -240,6 +270,11 @@ if [ -n "$make_archive" ]; then fi ## Déploiement + +# sur l'hôte distant, ne rendre interactif qu'à partir de -yy +rinteraction=$__interaction +[ $rinteraction -lt 2 ] && rinteraction=$(($rinteraction + 1)) + for host in "${hosts[@]}"; do if [ "$host" == "localhost" ]; then etitle -s "Déploiement sur l'hôte local" @@ -258,11 +293,12 @@ for host in "${hosts[@]}"; do scp -S "$SSH" "$archive" "$user@$host:" || die estep "Lancement du script de déploiement" "$SSH" -qt "$user@$host" "\ -__estack=$(quoted_arg "$__estack") -__tlevel=$(quoted_arg "$__tlevel") -export __estack __tlevel +__interaction=$rinteraction +__estack=$(qval "$__estack") +__tlevel=$(qval "$__tlevel") +export __interaction __estack __tlevel ${UTOOLS_LANG:+UTOOLS_LANG='$UTOOLS_LANG'; export UTOOLS_LANG -}$(quoted_args "./$archivename" ${tmproot:+--tmproot "$tmproot"} -- MYHOST="$host" "$@")" +}$(qvals "./$archivename" ${tmproot:+--tmproot "$tmproot"} -- MYHOST="$host" "$@")" eend fi done diff --git a/rwoinst b/rwoinst index 51c27ec..a415709 100755 --- a/rwoinst +++ b/rwoinst @@ -10,7 +10,9 @@ USAGE $scriptname [-H host] [-T tmproot] ... [-- options de woinst] OPTIONS - -C Ne pas faire le déploiement. Configurer uniquement la connexion par clé + -C, --configure-user + --configure USER [--uses-su] + Ne pas faire le déploiement. Configurer uniquement la connexion par clé sur les hôtes distants spécifiés pour le user spécifié. Il faut pouvoir se connecter par mot de passe pour configurer la connexion par clé. Si l'on veut configurer la connexion par clé pour le user root, mais que @@ -19,53 +21,135 @@ OPTIONS il est possible de faire la configuration avec '--configure root'. La commande serait alors $scriptname -H user@host --configure root - -T tmproot + Si l'hôte distant n'a pas sudo ou si sudo n'est pas configuré, il faut + rajouter l'option --uses-su, e.g: + $scriptname -h user@host --configure root --uses-su + -T, --tmproot TMPROOT Spécifier le répertoire temporaire sur l'hôte distant, comme par exemple /var/tmp. Cette option est utile pour les vservers, qui ont par défaut un /tmp minuscule de 16 Mo. - -S ssh + -S, --ssh SSH Spécifier le programme à utiliser pour la connection par ssh. + -h, --host hosts + -h, --host @hostsfile -H host - Spécifier un hôte distant sur lequel faire le déploiement. Plusieurs - options -H peuvent être spécifiées, ou alors on peut séparer plusieurs - hôtes par ':', e.g. -H host1:host2 + Spécifier un ou plusieurs hôtes sur lequels faire le déploiement. Pour + spécifier plusieurs hôtes, il est possible d'utiliser plusieurs fois + l'option -h, ou spécifier en une seule fois plusieurs hôtes en les + séparant par un espace ou le caractère ':', e.g. 'host1 host2' ou + 'host1:host2'. Si la spécification contient les caractères { et }, + l'expansion est effectuée, e.g + -h 'root@{host1,host2}.univ.run' Par défaut, la connexion sur l'hôte distant se fait avec l'utilisateur root. Il est possible de spécifier un autre utilisateur avec la syntaxe - user@host, e.g -H user@host" + user@host, e.g -h user@host + La forme @hostsfile permet de lire la liste des hôtes depuis le fichier + hostsfile, à raison d'un hôte par ligne. + --deploy + --no-deploy + Autoriser (respectivement interdire) l'utilisation de la configuration + locale de déploiement pour identifier la destination si aucun hôte n'est + spécifié. + Par défaut, si aucun hôte n'est spécifié, la configuration locale de + déploiement est interrogée pour avoir cette information. + -c, --deploy-config CONFNAME + Cette option permet de spécifier le nom de la configuration à utiliser + pour effectuer la requête. Par défaut, utiliser le nom 'rwoinst'" } set_defaults pubkeys action=deploy confuser= +uses_su= tmproot= -hosts=() SSH= +hosts=() +deploy_enable=1 +deploy_confname=rwoinst parse_opts "${PRETTYOPTS[@]}" \ --help '$exit_with display_help' \ - -C action=configure \ + -C,--configure-user action=configure \ --configure: '$set@ confuser;action=configure' \ + --uses-su uses_su=1 \ -T:,--tmproot: tmproot= \ - -S: SSH= \ + -S:,--ssh: SSH= \ -h:,-H:,--host: hosts \ + --deploy deploy_enable=1 \ + --no-deploy deploy_enable= \ + -c:,--deploy-config deploy_confname= \ @ args -- "$@" && set -- "${args[@]}" || die "$args" -function _dot_is_localhost() { - [ "$1" == "." ] && echo "localhost" || echo "$1" +SSH="${SSH:-ssh}" + +__PARSED_HOSTS=() +__PARSED_FILES=() +function parse_hostsfile() { + # Lire chacun des fichiers $* et initialiser __PARSED_HOSTS avec la liste + # des hôtes mentionnés dans les fichiers. + local inputfile basedir inputs input + for inputfile in "$@"; do + inputfile="$(abspath "$inputfile")" + array_contains __PARSED_FILES "$inputfile" && { + ewarn "$(ppath "$inputfile"): inclusion récursive" + continue + } + array_add __PARSED_FILES "$inputfile" + basedir="$(dirname "$inputfile")" + + array_from_lines inputs "$(<"$inputfile" filter_conf)" || { + ewarn "$inputfile: fichier ingnoré" + continue + } + for input in "${inputs[@]}"; do + if [ "${input#@}" != "$input" ]; then + # fichier inclus + parse_hostsfile "$(abspath "${input#@}" "$basedir")" + else + array_addu __PARSED_HOSTS "$input" + fi + done + done } +function __expand_braces() { + if [[ "$1" == *{* ]] && [[ "$1" == *}* ]]; then + eval "echo $1" + else + echo "$1" + fi +} +function __dot_is_localhost() { [ "$1" == "." ] && echo "localhost" || echo "$1"; } function fix_hosts() { - # Si hosts contient des éléments multiple, comme a:b, séparés ces + # Si hosts contient des éléments multiple, comme a:b, séparer ces # éléments. i.e (a b:c) --> (a b c) - # remplacer aussi les '.' par 'localhost' - array_fix_paths hosts - array_map hosts _dot_is_localhost + # Supporter la syntaxe @hostsfile qui permet de charger la liste des hôtes + # depuis un fichier. + # Remplacer aussi les '.' par 'localhost' + array_map hosts __expand_braces + array_fix_paths hosts ":" + array_fix_paths hosts " " + + local -a _hosts _tmphosts host + for host in "${hosts[@]}"; do + host="${host%/}" + if [ "${host#@}" != "$host" ]; then + __PARSED_HOSTS=() + parse_hostsfile "${host#@}" + array_fix_paths __PARSED_HOSTS + array_extendu _hosts __PARSED_HOSTS + else + array_addu _hosts "$host" + fi + done + array_copy hosts _hosts + array_map hosts __dot_is_localhost } ################################################################################ # Configuration de l'accès par clé aux hôtes if [ "$action" == "configure" ]; then - args=(${confuser:+--configure "$confuser"}) + args=(${confuser:+--configure "$confuser"} ${uses_su:+--uses-su} -S "$SSH") for host in "${hosts[@]}"; do args=("${args[@]}" -H "$host") done @@ -75,8 +159,6 @@ fi ################################################################################ # Déploiement -SSH="${SSH:-ssh}" - ## Bundle à déployer if [ -z "$1" ] || [[ "$1" == -* ]] || [[ "$1" == *=* ]]; then # pas d'argument, ou c'est une option (qui fait donc partie des arguments de @@ -85,6 +167,19 @@ if [ -z "$1" ] || [[ "$1" == -* ]] || [[ "$1" == *=* ]]; then fi ## Hôtes sur lesquels faire le déploiement +if array_isempty hosts && [ -n "$deploy_enable" ]; then + urequire deploy + deploy_setconf "$deploy_confname" + if deploy_loadconf; then + setxx wobundle=abspath "$1" // basename -- + if eval "$(deploy_query -v host DEST wobundle rwoinst_bundle "" shell "$wobundle")"; then + check_interaction -c && einfo "Ce bundle sera déployé vers les hôtes suivants: +$(array_to_lines host "" " ")" + ask_any "Voulez-vous continuer?" Oq || die + array_copy hosts host + fi + fi +fi array_isempty hosts && read_value "Entrez une liste d'hôtes séparés par ':'" hosts "localhost" fix_hosts @@ -147,6 +242,11 @@ etitle "Création de l'archive pour le déploiement" \ "$scriptdir/mkusfx" --bare --tmp-archive -o "$archive" "$workdir" -- ./woinst --is-tmpdir "${bundles[@]}" || die ## Déploiement + +# sur l'hôte distant, ne rendre interactif qu'à partir de -yy +rinteraction=$__interaction +[ $rinteraction -lt 2 ] && rinteraction=$(($rinteraction + 1)) + for host in "${hosts[@]}"; do if [ "$host" == "localhost" ]; then etitle "Déploiement sur l'hôte local" \ @@ -164,11 +264,12 @@ for host in "${hosts[@]}"; do scp -S "$SSH" "$archive" "$user@$host:" || die estep "Lancement du script de déploiement" "$SSH" -qt "$user@$host" "\ -__estack=$(quoted_arg "$__estack") -__tlevel=$(quoted_arg "$__tlevel") -export __estack __tlevel +__interaction=$rinteraction +__estack=$(qval "$__estack") +__tlevel=$(qval "$__tlevel") +export __interaction __estack __tlevel ${UTOOLS_LANG:+UTOOLS_LANG='$UTOOLS_LANG'; export UTOOLS_LANG -}$(quoted_args "./$archivename" ${tmproot:+--tmproot "$tmproot"} -- MYHOST="$host" "$@")" +}$(qvals "./$archivename" ${tmproot:+--tmproot "$tmproot"} -- MYHOST="$host" "$@")" eend fi done diff --git a/todo/dokuwiki b/todo/dokuwiki index 2f42164..dbe50ca 100755 --- a/todo/dokuwiki +++ b/todo/dokuwiki @@ -349,7 +349,7 @@ Voulez-vous continuer?" O || return 1 if [ -n "$edit" -a -n "$DWCOMMIT" ]; then __commit "$dwdir" "newpage $title --> $ns$name" newfiles modfiles || return else - estepi "dwci $(quoted_args "dwci newpage $title --> $ns$name")" + estepi "dwci $(qvals "dwci newpage $title --> $ns$name")" fi return 0 } @@ -453,7 +453,7 @@ function edit_cmd() { if [ -n "$DWCOMMIT" ]; then __commit "$dwdir" "edit ${page//\//:}" newfiles modfiles || return else - estepi "dwci $(quoted_args "edit ${page//\//:}")" + estepi "dwci $(qvals "edit ${page//\//:}")" fi return 0 } @@ -780,7 +780,7 @@ print tolower($0) if [ -n "$DWCOMMIT" ]; then __commit "$dwdir" "generate $srcdir" newfiles modfiles else - estepi "dwci $(quoted_args "generate $srcdir")" + estepi "dwci $(qvals "generate $srcdir")" fi ) } diff --git a/todo/mediawiki b/todo/mediawiki index 7ddc0bd..8e61851 100755 --- a/todo/mediawiki +++ b/todo/mediawiki @@ -237,7 +237,7 @@ function init_cmd() { read_value "URL du site MediaWiki" MWSITEURL http://localhost/mediawiki local var for var in MWDBHOST MWDBPORT MWDBUSER MWDBPASS MWDBNAME MWPREFIX MWSITEURL; do - set_var_cmd "$var" "${!var}" >>"$mwdir/.mediawiki" + echo_setv "$var" "${!var}" >>"$mwdir/.mediawiki" done fi @@ -351,7 +351,7 @@ Voulez-vous continuer?" N || return 1 if [ -n "$edit" -a -n "$MWCOMMIT" ]; then __commit "$mwdir" "newpage $title --> $name" newfiles modfiles || return else - estepi "mwci $(quoted_args "mwci newpage $title --> $name")" + estepi "mwci $(qvals "mwci newpage $title --> $name")" fi return 0 } @@ -440,7 +440,7 @@ function edit_cmd() { if [ -n "$MWCOMMIT" ]; then __commit "$mwdir" "edit ${page//\//:}" newfiles modfiles || return else - estepi "mwci $(quoted_args "edit ${page//\//:}")" + estepi "mwci $(qvals "edit ${page//\//:}")" fi return 0 } @@ -926,7 +926,7 @@ print tolower($0) if [ -n "$MWCOMMIT" ]; then __commit "$mwdir" "generate $srcdir" newfiles modfiles else - estepi "mwci $(quoted_args "generate $srcdir")" + estepi "mwci $(qvals "generate $srcdir")" fi ) } diff --git a/ucrontab b/ucrontab index b111c2e..21f2706 100755 --- a/ucrontab +++ b/ucrontab @@ -164,18 +164,18 @@ function echo_() { } function recho() { if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo "$first$@" + echo -n - + echo "$first" "$@" else echo "$@" fi } function recho_() { if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo -n "$first$@" + echo -n - + echo -n "$first" "$@" else echo -n "$@" fi @@ -189,9 +189,10 @@ function _qval() { recho_ "$s" } function should_quote() { - local l="${#1}" + local s="$*" + local l="${#s}" [ $l -eq 0 -o $l -gt 80 ] && return 0 - local s="${*//[a-zA-Z0-9]/}" + s="${s//[a-zA-Z0-9]/}" s="${s//,/}" s="${s//./}" s="${s//+/}" @@ -526,7 +527,7 @@ function evalcmd() { } ##@inc]base.core ##@inc[base.string -## Fonctions de base: gestion des valeurs scalaires +## Fonctions de base: gestion des valeurs chaines scalaires uprovide base.string urequire base.core @@ -683,6 +684,75 @@ function endswith() { local str="$1" pattern="$2" eval '[ "${str%$pattern}" != "$str" ]' } + +function strsplitf() { + [ $# -gt 0 ] || return 127 + local func count + func="$1"; shift + count=$# + if [ $count -gt 0 ]; then + eval 'set -- "${@:1:$(($count-1))}" '"${!count}" || return 126 + fi + "$func" "$@" +} +function strecho() { recho "$@"; } +function strqvals() { + qvals "$@" +} +function strqlines() { + local -a lines + _setax lines cat "$@" + qvals "${lines[@]}" +} +function strqarray() { + local __a __s="qvals" + for __a in "$@"; do __s="$__s \"\${$__a[@]}\""; done + eval "$__s" +} + +function evals() { + local __e_val __e_arg __e_r=0 + local __e_firstcmd __e_firstarg __e_splitf + local -a __e_cmd + + __e_firstcmd=1 + while [ $# -gt 0 ]; do + __e_cmd=() + __e_firstarg=1 # premier argument + __e_splitf= # premier argument après splitf + while [ $# -gt 0 ]; do + __e_arg="$1"; shift + [ "$__e_arg" == // ] && break + if [ "${__e_arg%//}" != "$__e_arg" ]; then + local __e_tmp="${__e_arg%//}" + if [ -z "${__e_tmp//\\/}" ]; then + __e_arg="${__e_arg#\\}" + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + continue + fi + fi + if [ -n "$__e_firstarg" ]; then + __e_cmd=("str$__e_arg") + __e_firstarg= + [ "$__e_arg" == "splitf" ] && __e_splitf=1 + elif [ -n "$__e_splitf" ]; then + __e_cmd=("${__e_cmd[@]}" "str$__e_arg") + __e_splitf= + else + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + fi + done + + if [ -n "$__e_firstcmd" ]; then + __e_val="$("${__e_cmd[@]}")" || __e_r=$? + else + __e_val="$("${__e_cmd[@]}" "$__e_val")" || __e_r=$? + fi + __e_firstcmd= + done + [ -n "$__e_val" ] && echo "$__e_val" + return $__e_r +} ##@inc]base.string ##@inc[base.num ## Fonctions de base: gestion des valeurs numériques @@ -708,6 +778,10 @@ function isrnum() { v="${v//[0-9]/}" [ -z "$v" ] } + +function evali() { + echo "$(($*))" +} ##@inc]base.num ##@inc[base.bool ## Fonctions de base: valeurs booléennes @@ -735,6 +809,10 @@ function isrnum() { v="${v//[0-9]/}" [ -z "$v" ] } + +function evali() { + echo "$(($*))" +} ##@inc]base.num uprovide base.bool urequire base.num @@ -975,18 +1053,18 @@ function echo_() { } function recho() { if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo "$first$@" + echo -n - + echo "$first" "$@" else echo "$@" fi } function recho_() { if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo -n "$first$@" + echo -n - + echo -n "$first" "$@" else echo -n "$@" fi @@ -1000,9 +1078,10 @@ function _qval() { recho_ "$s" } function should_quote() { - local l="${#1}" + local s="$*" + local l="${#s}" [ $l -eq 0 -o $l -gt 80 ] && return 0 - local s="${*//[a-zA-Z0-9]/}" + s="${s//[a-zA-Z0-9]/}" s="${s//,/}" s="${s//./}" s="${s//+/}" @@ -1337,7 +1416,7 @@ function evalcmd() { } ##@inc]base.core ##@inc[base.string -## Fonctions de base: gestion des valeurs scalaires +## Fonctions de base: gestion des valeurs chaines scalaires uprovide base.string urequire base.core @@ -1494,6 +1573,75 @@ function endswith() { local str="$1" pattern="$2" eval '[ "${str%$pattern}" != "$str" ]' } + +function strsplitf() { + [ $# -gt 0 ] || return 127 + local func count + func="$1"; shift + count=$# + if [ $count -gt 0 ]; then + eval 'set -- "${@:1:$(($count-1))}" '"${!count}" || return 126 + fi + "$func" "$@" +} +function strecho() { recho "$@"; } +function strqvals() { + qvals "$@" +} +function strqlines() { + local -a lines + _setax lines cat "$@" + qvals "${lines[@]}" +} +function strqarray() { + local __a __s="qvals" + for __a in "$@"; do __s="$__s \"\${$__a[@]}\""; done + eval "$__s" +} + +function evals() { + local __e_val __e_arg __e_r=0 + local __e_firstcmd __e_firstarg __e_splitf + local -a __e_cmd + + __e_firstcmd=1 + while [ $# -gt 0 ]; do + __e_cmd=() + __e_firstarg=1 # premier argument + __e_splitf= # premier argument après splitf + while [ $# -gt 0 ]; do + __e_arg="$1"; shift + [ "$__e_arg" == // ] && break + if [ "${__e_arg%//}" != "$__e_arg" ]; then + local __e_tmp="${__e_arg%//}" + if [ -z "${__e_tmp//\\/}" ]; then + __e_arg="${__e_arg#\\}" + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + continue + fi + fi + if [ -n "$__e_firstarg" ]; then + __e_cmd=("str$__e_arg") + __e_firstarg= + [ "$__e_arg" == "splitf" ] && __e_splitf=1 + elif [ -n "$__e_splitf" ]; then + __e_cmd=("${__e_cmd[@]}" "str$__e_arg") + __e_splitf= + else + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + fi + done + + if [ -n "$__e_firstcmd" ]; then + __e_val="$("${__e_cmd[@]}")" || __e_r=$? + else + __e_val="$("${__e_cmd[@]}" "$__e_val")" || __e_r=$? + fi + __e_firstcmd= + done + [ -n "$__e_val" ] && echo "$__e_val" + return $__e_r +} ##@inc]base.string ##@inc[base.array ## Fonctions de base: gestion des tableaux @@ -1814,18 +1962,18 @@ function echo_() { } function recho() { if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo "$first$@" + echo -n - + echo "$first" "$@" else echo "$@" fi } function recho_() { if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo -n "$first$@" + echo -n - + echo -n "$first" "$@" else echo -n "$@" fi @@ -1839,9 +1987,10 @@ function _qval() { recho_ "$s" } function should_quote() { - local l="${#1}" + local s="$*" + local l="${#s}" [ $l -eq 0 -o $l -gt 80 ] && return 0 - local s="${*//[a-zA-Z0-9]/}" + s="${s//[a-zA-Z0-9]/}" s="${s//,/}" s="${s//./}" s="${s//+/}" @@ -2176,7 +2325,7 @@ function evalcmd() { } ##@inc]base.core ##@inc[base.string -## Fonctions de base: gestion des valeurs scalaires +## Fonctions de base: gestion des valeurs chaines scalaires uprovide base.string urequire base.core @@ -2333,6 +2482,75 @@ function endswith() { local str="$1" pattern="$2" eval '[ "${str%$pattern}" != "$str" ]' } + +function strsplitf() { + [ $# -gt 0 ] || return 127 + local func count + func="$1"; shift + count=$# + if [ $count -gt 0 ]; then + eval 'set -- "${@:1:$(($count-1))}" '"${!count}" || return 126 + fi + "$func" "$@" +} +function strecho() { recho "$@"; } +function strqvals() { + qvals "$@" +} +function strqlines() { + local -a lines + _setax lines cat "$@" + qvals "${lines[@]}" +} +function strqarray() { + local __a __s="qvals" + for __a in "$@"; do __s="$__s \"\${$__a[@]}\""; done + eval "$__s" +} + +function evals() { + local __e_val __e_arg __e_r=0 + local __e_firstcmd __e_firstarg __e_splitf + local -a __e_cmd + + __e_firstcmd=1 + while [ $# -gt 0 ]; do + __e_cmd=() + __e_firstarg=1 # premier argument + __e_splitf= # premier argument après splitf + while [ $# -gt 0 ]; do + __e_arg="$1"; shift + [ "$__e_arg" == // ] && break + if [ "${__e_arg%//}" != "$__e_arg" ]; then + local __e_tmp="${__e_arg%//}" + if [ -z "${__e_tmp//\\/}" ]; then + __e_arg="${__e_arg#\\}" + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + continue + fi + fi + if [ -n "$__e_firstarg" ]; then + __e_cmd=("str$__e_arg") + __e_firstarg= + [ "$__e_arg" == "splitf" ] && __e_splitf=1 + elif [ -n "$__e_splitf" ]; then + __e_cmd=("${__e_cmd[@]}" "str$__e_arg") + __e_splitf= + else + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + fi + done + + if [ -n "$__e_firstcmd" ]; then + __e_val="$("${__e_cmd[@]}")" || __e_r=$? + else + __e_val="$("${__e_cmd[@]}" "$__e_val")" || __e_r=$? + fi + __e_firstcmd= + done + [ -n "$__e_val" ] && echo "$__e_val" + return $__e_r +} ##@inc]base.string ##@inc[base.array ## Fonctions de base: gestion des tableaux @@ -2774,18 +2992,18 @@ function echo_() { } function recho() { if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo "$first$@" + echo -n - + echo "$first" "$@" else echo "$@" fi } function recho_() { if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - local first="${1:1}"; shift - echo -n "$first$@" + echo -n - + echo -n "$first" "$@" else echo -n "$@" fi @@ -2799,9 +3017,10 @@ function _qval() { recho_ "$s" } function should_quote() { - local l="${#1}" + local s="$*" + local l="${#s}" [ $l -eq 0 -o $l -gt 80 ] && return 0 - local s="${*//[a-zA-Z0-9]/}" + s="${s//[a-zA-Z0-9]/}" s="${s//,/}" s="${s//./}" s="${s//+/}" @@ -3135,31 +3354,290 @@ function evalcmd() { "${args[@]}" } ##@inc]base.core -##@inc[base.num -## Fonctions de base: gestion des valeurs numériques -uprovide base.num +##@inc[base.quote +## Fonctions de base: protection de valeurs chaine +uprovide base.quote +urequire base.core -function isnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//[0-9]/}" - [ -z "$v" ] +function _qawk() { + local s="$*" + s="${s//\\/\\\\}" + s="${s//\"/\\\"}" + s="${s// +/\\n}" + recho_ "$s" } -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - [ -z "${1//[0-9]/}" ] +function qawk() { + echo -n \" + _qawk "$@" + echo \" } -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//./}" - v="${v//,/}" - v="${v//[0-9]/}" - [ -z "$v" ] +function qseds() { + local s="$*" + s="${s//\\/\\\\}" + s="${s//\//\\/}" + s="${s// +/\\n}" + recho "$s" } -##@inc]base.num +function _qform() { + local s="$*" + s="${s//\%/%25}" + s="${s//+/%2B}" + s="${s//&/%26}" + s="${s//=/%3D}" + s="${s// /+}" + recho_ "$s" +} +function qform() { + local s="$*" + if [[ "$s" == *=* ]]; then + _qform "${s%%=*}" + echo -n = + _qform "${s#*=}" + echo + else + _qform "$s" + echo + fi +} +function _qsql() { + local q="'" qq="''" + echo "${*//$q/$qq}" +} +function qsql() { + local q="'" qq="''" + echo "'${*//$q/$qq}'" +} +##@inc]base.quote +##@inc[base.string +## Fonctions de base: gestion des valeurs chaines scalaires +uprovide base.string +urequire base.core + + +function straddp() { + local p="$1"; shift + echo "$p$*" +} +function strdelp() { + local p="$1"; shift + local str="$*" + echo "${str#$p}" +} +function strdelp2() { + local p="$1"; shift + local str="$*" + echo "${str##$p}" +} +function stradds() { + local s="$1"; shift + echo "$*$s" +} +function strdels() { + local s="$1"; shift + local str="$*" + echo "${str%$s}" +} +function strdels2() { + local s="$1"; shift + local str="$*" + echo "${str%%$s}" +} +function strlower() { + local str="$*" + echo "${str,,}" +} +function strlower1() { + local str="$*" + echo "${str,}" +} +function strlowers() { + local str="$*" + echo "${*,}" +} +function strupper() { + local str="$*" + echo "${str^^}" +} +function strupper1() { + local str="$*" + echo "${str^}" +} +function struppers() { + echo "${*^}" +} +function strmid() { + local range="$1"; shift + local str="$*" + if [[ "$range" == *:-* ]]; then + local max=${#str} + [ $max -eq 0 ] && return + local start="${range%%:*}" + [ -n "$start" ] || start=0 + while [ "$start" -lt 0 ]; do + start=$(($max$start)) + done + max=$(($max-$start)) + local length="${range#*:}" + while [ "$length" -lt 0 ]; do + length=$(($max$length)) + done + range="$start:$length" + fi + eval 'echo "${str:'" $range"'}"' +} +function strrepl() { + local pattern="$1"; shift + local repl="$1"; shift + local str="$*" + local cmd='echo "${str/' + if [ "${pattern#/}" != "$pattern" ]; then + pattern="${pattern#/}" + cmd="$cmd/" + elif [ "${pattern#\#}" != "$pattern" ]; then + pattern="${pattern#\#}" + cmd="$cmd#" + elif [ "${pattern#%}" != "$pattern" ]; then + pattern="${pattern#%}" + cmd="$cmd%" + fi + cmd="$cmd"'$pattern/$repl}"' + eval "$cmd" +} + +function strops() { + local -a __s_tmp + local __s_value="$1"; shift + while [ $# -gt 0 ]; do + case "$1" in + :-*|:=*|:\?*|:+*) eval '__s_value="${'"${__s_value}$1"'}"';; + d|deref) __s_value="${!__s_value}";; + dc|dcount|ds|dsize) + __s_value="${__s_value}[@]" + __s_tmp=("${!__s_value}") + __s_value="${#__s_tmp[@]}" + ;; + \#*|%*|/*|:*|^*|,*) eval '__s_value="${__s_value'"$1"'}"';; + l|length) __s_value="${#__s_value}";; + =|==|!=|\<|\>|-eq|-ne|-lt|-le|-gt|-ge) + __s_tmp=(\[ "$__s_value" "$@" ]); "${__s_tmp[@]}"; return $?;; + -n|-z) __s_tmp=(\[ "$1" "$__s_value" ]); "${__s_tmp[@]}"; return $?;; + +#*) eval '__s_value="'"${1#+#}"'$__s_value"';; + -#*) eval '__s_value="${__s_value'"${1#-}"'}"';; + +%*) eval '__s_value="$__s_value"'"${1#+%}";; + +*) eval '__s_value="$__s_value"'"${1#+}";; + -%*) eval '__s_value="${__s_value'"${1#-}"'}"';; + -*) eval '__s_value="${__s_value%'"${1#-}"'}"';; + mid|strmid) eval '__s_value="$(strmid "$2" "$__s_value")"'; shift;; + repl|strrepl) eval '__s_value="$(strrepl "$2" "$3" "$__s_value")"'; shift; shift;; + *) echo 1>&2 "strops: unknown operator: $1";; + esac + shift + done + echo "$__s_value" +} + +function first_char() { + local str="$*" + echo "${str:0:1}" +} +function last_char() { + local str="$*" + echo "${str: -1:1}" +} +function first_chars() { + local str="$*" + recho "${str:0:$((${#1}-1))}" +} +function last_chars() { + local str="$*" + recho "${str:1}" +} +function first_char_is() { + [ "${1:0:1}" == "$2" ] +} +function last_char_is() { + [ "${1:$((-1)):1}" == "$2" ] +} +function beginswith() { + local str="$1" pattern="$2" + eval '[ "${str#$pattern}" != "$str" ]' +} +function endswith() { + local str="$1" pattern="$2" + eval '[ "${str%$pattern}" != "$str" ]' +} + +function strsplitf() { + [ $# -gt 0 ] || return 127 + local func count + func="$1"; shift + count=$# + if [ $count -gt 0 ]; then + eval 'set -- "${@:1:$(($count-1))}" '"${!count}" || return 126 + fi + "$func" "$@" +} +function strecho() { recho "$@"; } +function strqvals() { + qvals "$@" +} +function strqlines() { + local -a lines + _setax lines cat "$@" + qvals "${lines[@]}" +} +function strqarray() { + local __a __s="qvals" + for __a in "$@"; do __s="$__s \"\${$__a[@]}\""; done + eval "$__s" +} + +function evals() { + local __e_val __e_arg __e_r=0 + local __e_firstcmd __e_firstarg __e_splitf + local -a __e_cmd + + __e_firstcmd=1 + while [ $# -gt 0 ]; do + __e_cmd=() + __e_firstarg=1 # premier argument + __e_splitf= # premier argument après splitf + while [ $# -gt 0 ]; do + __e_arg="$1"; shift + [ "$__e_arg" == // ] && break + if [ "${__e_arg%//}" != "$__e_arg" ]; then + local __e_tmp="${__e_arg%//}" + if [ -z "${__e_tmp//\\/}" ]; then + __e_arg="${__e_arg#\\}" + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + continue + fi + fi + if [ -n "$__e_firstarg" ]; then + __e_cmd=("str$__e_arg") + __e_firstarg= + [ "$__e_arg" == "splitf" ] && __e_splitf=1 + elif [ -n "$__e_splitf" ]; then + __e_cmd=("${__e_cmd[@]}" "str$__e_arg") + __e_splitf= + else + __e_cmd=("${__e_cmd[@]}" "$__e_arg") + fi + done + + if [ -n "$__e_firstcmd" ]; then + __e_val="$("${__e_cmd[@]}")" || __e_r=$? + else + __e_val="$("${__e_cmd[@]}" "$__e_val")" || __e_r=$? + fi + __e_firstcmd= + done + [ -n "$__e_val" ] && echo "$__e_val" + return $__e_r +} +##@inc]base.string ##@inc[base.bool ## Fonctions de base: valeurs booléennes ##@inc[base.num @@ -3186,6 +3664,10 @@ function isrnum() { v="${v//[0-9]/}" [ -z "$v" ] } + +function evali() { + echo "$(($*))" +} ##@inc]base.num uprovide base.bool urequire base.num @@ -3248,66 +3730,10 @@ function setxb() { setx "$__s_var" evalb "$@" } ##@inc]base.bool -##@inc[base.quote -## Fonctions de base: protection de valeurs chaine -uprovide base.quote -urequire base.core - -function _qawk() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s// -/\\n}" - recho_ "$s" -} -function qawk() { - echo -n \" - _qawk "$@" - echo \" -} -function qseds() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\//\\/}" - s="${s// -/\\n}" - recho "$s" -} -function _qform() { - local s="$*" - s="${s//\%/%25}" - s="${s//+/%2B}" - s="${s//&/%26}" - s="${s//=/%3D}" - s="${s// /+}" - recho_ "$s" -} -function qform() { - local s="$*" - if [[ "$s" == *=* ]]; then - _qform "${s%%=*}" - echo -n = - _qform "${s#*=}" - echo - else - _qform "$s" - echo - fi -} -function _qsql() { - local q="'" qq="''" - echo "${*//$q/$qq}" -} -function qsql() { - local q="'" qq="''" - echo "'${*//$q/$qq}'" -} -##@inc]base.quote uprovide base.compat -urequire base.core base.num base.bool base.quote +urequire base.core function setx2() { setxx "$@"; } function rawecho() { recho "$@"; } function rawecho_() { recho_ "$@"; } @@ -3318,6 +3744,7 @@ function set_var() { setv "$@"; } function set_var_cmd() { echo_setv "$@"; } function set_var_literal() { eval "$1=$2"; } +urequire base.quote function quote_awk() { _qawk "$@"; } function quoted_awk() { qawk "$@"; } function quote_seds() { qseds "$@"; } @@ -3326,6 +3753,7 @@ function quoted_form() { qform "$@"; } if [ -n "$BASH_VERSINFO" -a "${BASH_VERSINFO[0]}" -lt 4 ]; then + urequire base.string function strlower() { tr A-Z a-z <<<"$*"; } function strlower1() { local str="$*" @@ -3353,6 +3781,7 @@ if [ -n "$BASH_VERSINFO" -a "${BASH_VERSINFO[0]}" -lt 4 ]; then echo "${vs[*]}" } + urequire base.bool function is_yes() { case "$1" in o|oui|y|yes|v|vrai|t|true|on) return 0;; @@ -3390,15 +3819,15 @@ if [ -n "$UTOOLS_CHROOT" ]; then fi function setyesval() { - is_yes "$2" && set_var "$1" 1 || set_var "$1" "" + is_yes "$2" && _setv "$1" 1 || _setv "$1" "" } function normyesval() { - is_yes "${2:-"${!1}"}" && set_var "$1" 1 || set_var "$1" "" + is_yes "${2:-"${!1}"}" && _setv "$1" 1 || _setv "$1" "" } function normyesvals() { local __nyv_yesvar for __nyv_yesvar in "$@"; do - is_yes "${!__nyv_yesvar}" && set_var "$__nyv_yesvar" 1 || set_var "$__nyv_yesvar" "" + is_yes "${!__nyv_yesvar}" && _setv "$__nyv_yesvar" 1 || _setv "$__nyv_yesvar" "" done } function quote_in() { @@ -3421,7 +3850,7 @@ function quoted_sargs() { for a in "$@"; do s="${s:+$s }$(quoted_sarg "$a")" done - rawecho "$s" + recho "$s" } function set_array_cmd() { @@ -3436,7 +3865,7 @@ function set_array_cmd() { __sac_f=1 for __sac_v in "$@"; do [ -n "$__sac_f" ] && __sac_f= || __sac_s="$__sac_s " - __sac_s="$__sac_s$(quoted_arg "$__sac_v")" + __sac_s="$__sac_s$(qvalm "$__sac_v")" done __sac_s="$__sac_s)" echo "$__sac_s" @@ -3465,7 +3894,7 @@ function array_del() { local __ad_v local -a __ad_vs eval 'for __ad_v in "${'"$1"'[@]}"; do - if [ "$__ad_v" != '"$(quoted_arg "$2")"' ]; then + if [ "$__ad_v" != '"$(qval "$2")"' ]; then array_add __ad_vs "$__ad_v" fi done' @@ -3474,7 +3903,7 @@ done' function array_addu() { local __as_v eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then + if [ "$__as_v" == '"$(qval "$2")"' ]; then return 1 fi done' @@ -3487,7 +3916,7 @@ function array_set() { function array_insu() { local __as_v eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then + if [ "$__as_v" == '"$(qval "$2")"' ]; then return 1 fi done' @@ -3518,7 +3947,7 @@ function array_eq() { function array_contains() { local __ac_v eval 'for __ac_v in "${'"$1"'[@]}"; do - if [ "$__ac_v" == '"$(quoted_arg "$2")"' ]; then + if [ "$__ac_v" == '"$(qvalm "$2")"' ]; then return 0 fi done' @@ -3527,7 +3956,7 @@ done' function array_icontains() { local __ac_v eval 'for __ac_v in "${'"$1"'[@]}"; do - if [ "$(strlower "$__ac_v")" == '"$(strlower "$(quoted_arg "$2")")"' ]; then + if [ "$(strlower "$__ac_v")" == '"$(strlower "$(qval "$2")")"' ]; then return 0 fi done' @@ -3537,7 +3966,7 @@ function array_find() { local __af_i __af_v __af_i=0 eval 'for __af_v in "${'"$1"'[@]}"; do - if [ "$__af_v" == '"$(quoted_arg "$2")"' ]; then + if [ "$__af_v" == '"$(qval "$2")"' ]; then if [ -n "$3" ]; then echo "${'"$3"'[$__af_i]}" else @@ -3596,10 +4025,10 @@ function array_map() { array_copy "$__am_an" __am_vs } function first_value() { - eval "rawecho \"\${$1[@]:0:1}\"" + eval "recho \"\${$1[@]:0:1}\"" } function last_value() { - eval "rawecho \"\${$1[@]:\$((-1)):1}\"" + eval "recho \"\${$1[@]:\$((-1)):1}\"" } function array_copy() { eval "$1=(\"\${$2[@]}\")" @@ -3679,9 +4108,9 @@ function array_join() { __aj_j="${__aj_j:+$__aj_j'"$__aj_s"'}$__aj_pf$__aj_l$__aj_sf" done' if [ -n "$__aj_j" ]; then - rawecho "$__aj_j" + recho "$__aj_j" elif [ "$__aj_an" != "\$@" -a -n "$3" ]; then - rawecho "$3" + recho "$3" fi } function array_mapjoin() { @@ -3731,26 +4160,21 @@ function parse_date() { local value="$1" type="${2:-date}" local now="$(awk 'BEGIN { print mktime(strftime("%Y %m %d 00 00 00 +0400")) }')" case "$value" in - +*) - value="$(($now + ${value#+} * 86400))" - ;; - *) - value="$(<<<"$value" awk -F/ '{ - nd = strftime("%d"); nm = strftime("%m"); ny = strftime("%Y") - d = $1 + 0; if (d < 1) d = nd; - m = $2 + 0; if (m < 1) m = nm; - if ($3 == "") y = ny; - else { y = $3 + 0; if (y < 100) y = y + 2000; } - print mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d)); - }')" + +*) value="$(($now + ${value#+} * 86400))";; + *) value="$(<<<"$value" awk -F/ '{ + nd = strftime("%d"); nm = strftime("%m"); ny = strftime("%Y") + d = $1 + 0; if (d < 1) d = nd; + m = $2 + 0; if (m < 1) m = nm; + if ($3 == "") y = ny; + else { y = $3 + 0; if (y < 100) y = y + 2000; } + print mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d)); + }')";; esac case "$type" in d|date) awk '{ print strftime("%d/%m/%Y", $0 + 0) }' <<<"$value";; l|ldap) awk '{ print strftime("%Y%m%d%H%M%S+0400", $0 + 0) }' <<<"$value";; m|mysql) awk '{ print strftime("%Y-%m-%d", $0 + 0) }' <<<"$value";; - *) - rawecho "$value" - ;; + *) recho "$value";; esac } @@ -3801,7 +4225,7 @@ function normpath() { ap="$ap$part" fi done - rawecho "$ap" + recho "$ap" } function abspath() { local ap="$1" @@ -3859,7 +4283,7 @@ function ppath() { [ "$cwd" != "/" -a "$cwd" != "$HOME" ] && path="${path#$cwd/}" [ "${path#$HOME/}" != "$path" ] && path="~${path#$HOME}" - rawecho "$path" + recho "$path" } function relpath() { local p="$(abspath "$1" "$3")" cwd="$2" @@ -3871,7 +4295,7 @@ function relpath() { if [ "$p" == "$cwd" ]; then echo "" elif [ "${p#$cwd/}" != "$p" ]; then - rawecho "${p#$cwd/}" + recho "${p#$cwd/}" else local rp while [ -n "$cwd" -a "${p#$cwd/}" == "$p" ]; do @@ -3939,8 +4363,8 @@ function splitwcs() { fi done [ "${__sw_p#/}" != "$__sw_p" ] && __sw_d="/$__sw_d" - set_var "$__sw_dd" "$__sw_d" - set_var "$__sw_df" "$__sw_f" + _setv "$__sw_dd" "$__sw_d" + _setv "$__sw_df" "$__sw_f" } function deref() { local OENC="$UTF8" @@ -3995,9 +4419,9 @@ function path_if_test() { local basedir="$1" if [ $op "$basedir/$file" ]; then if [ -n "$rel" ]; then - rawecho "$reldir$file" + recho "$reldir$file" else - rawecho "$basedir/$file" + recho "$basedir/$file" fi break fi @@ -4387,7 +4811,7 @@ function list_all() { cd "$b" 2>/dev/null || return eval "$(__la_cmd "$@")" | while read f; do [ "$f" == "." -o "$f" == ".." ] && continue - rawecho "$f" + recho "$f" done cd "$curdir" } @@ -4409,7 +4833,7 @@ function list_files() { cd "$b" 2>/dev/null || return eval "$(__la_cmd "$@")" | while read f; do - [ -f "$f" ] && rawecho "$f" + [ -f "$f" ] && recho "$f" done cd "$curdir" } @@ -4421,7 +4845,7 @@ function list_dirs() { cd "$b" 2>/dev/null || return eval "$(__la_cmd "$@")" | while read f; do [ "$f" == "." -o "$f" == ".." ] && continue - [ -d "$f" ] && rawecho "$f" + [ -d "$f" ] && recho "$f" done cd "$curdir" } @@ -4607,10 +5031,10 @@ function runscript_as() { local cmd cmd="\ -__estack=$(quoted_arg "$__estack") -__tlevel=$(quoted_args "$__tlevel") +__estack=$(qval "$__estack") +__tlevel=$(qval "$__tlevel") export __estack __tlevel -exec ${BASH:-/bin/sh} $(quoted_args "$@")" +exec ${BASH:-/bin/sh} $(qvals "$@")" if is_yes "$UTOOLS_USES_SU" || ! progexists sudo; then eecho "Entrez le mot de passe de root" @@ -4730,8 +5154,8 @@ En l'occurence, ce script est accédé par le chemin $script et ce chemin doit e estep "Lancement de la commande sur l'hôte distant $user@$host" local cmd - [ -n "$path" ] && cmd="$(quoted_args cd "$path"); " - cmd="$cmd$(quoted_args "$script" "$@")" + [ -n "$path" ] && cmd="$(qvals cd "$path"); " + cmd="$cmd$(qvals "$script" "$@")" ssh -qt "${UTOOLS_ENSURE_HOSTNAME_SSH_OPTS[@]}" "$user@$host" "$cmd" [ $? -eq 255 ] && return 12 return 1 @@ -5362,13 +5786,13 @@ function awkdef() { [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break __ad_value="${1:$__ad_vpos}" if [ -n "$__ad_int" ]; then - echo "$__ad_name = int($(quoted_awk "$__ad_value") + 0)" + echo "$__ad_name = int($(qawk "$__ad_value") + 0)" elif [ -n "$__ad_str" ]; then - echo "$__ad_name = $(quoted_awk "$__ad_value")" + echo "$__ad_name = $(qawk "$__ad_value")" elif [ ${#__ad_value} -lt 256 ] && isnum "$__ad_value"; then echo "$__ad_name = $__ad_value" else - echo "$__ad_name = $(quoted_awk "$__ad_value")" + echo "$__ad_name = $(qawk "$__ad_value")" fi else break @@ -5383,7 +5807,7 @@ function awkdef() { local __ad_i=1 echo "$__ad_name[0] = 0; delete $__ad_name" for __ad_arg in "${!__ad_value}"; do - echo "$__ad_name[$__ad_i]=$(quoted_awk "$__ad_arg")" + echo "$__ad_name[$__ad_i]=$(qawk "$__ad_arg")" __ad_i=$(($__ad_i + 1)) done eval "echo \"\${__ad_name}_count = \${#$__ad_value}\"" @@ -5392,7 +5816,7 @@ function awkdef() { done echo "}" for __ad_arg in "$@"; do - rawecho "$__ad_arg" + recho "$__ad_arg" done fi @@ -5723,7 +6147,7 @@ __init_encoding function tooenc() { local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" if [ "$from" == "$to" ]; then - rawecho "$src" + recho "$src" else iconv -f "$from" -t "$to" <<<"$src" fi @@ -5734,9 +6158,9 @@ function uecho() { function tooenc_() { local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" if [ "$from" == "$to" ]; then - rawecho_ "$src" + recho_ "$src" else - rawecho_ "$src" | iconv -f "$from" -t "$to" + recho_ "$src" | iconv -f "$from" -t "$to" fi } function uecho_() { @@ -5745,7 +6169,7 @@ function uecho_() { function toienc() { local __tie_var="$1" __tie_to="${2:-$IENC}" __tie_from="${3:-$UTOOLS_INPUT_ENCODING}" if [ "$__tie_from" != "$__tie_to" ]; then - set_var "$__tie_var" "$(iconv -f "$__tie_from" -t "$__tie_to" <<<"${!__tie_var}")" + _setv "$__tie_var" "$(iconv -f "$__tie_from" -t "$__tie_to" <<<"${!__tie_var}")" fi } function uread() { @@ -5809,7 +6233,7 @@ function __indent() { /}" != "$1" ]; then sed "2,\$s/^/${__tlevel}/g" <<<"$1" else - rawecho "$1" + recho "$1" fi } function __eerror() { tooenc "$(__edate)${__tlevel}ERROR $(__indent "$1")"; } @@ -5892,7 +6316,7 @@ function is_interaction() { function get_interaction_option() { :;} __epending= function eflush() { - if [ -n "$__epending" ]; then rawecho "$__epending" 1>&2; __epending=; fi + if [ -n "$__epending" ]; then recho "$__epending" 1>&2; __epending=; fi } function eclearp() { __epending= @@ -5928,7 +6352,7 @@ function edebug() { show_debug || return; eflush; __edebug "$*" 1>&2 } function trace() { - local r cmd="$(quoted_args "$@")" + local r cmd="$(qvals "$@")" show_info && { eflush; __eecho "\$ $cmd" 1>&2; } "$@"; r=$? if [ $r -ne 0 ]; then @@ -5944,7 +6368,7 @@ function trace_error() { local r "$@"; r=$? if [ $r -ne 0 ]; then - local cmd="$(quoted_args "$@")" + local cmd="$(qvals "$@")" show_error && { eflush; __eecho "^ $cmd [EC #$r]" 1>&2; } fi return $r @@ -6269,7 +6693,7 @@ function __rv_read() { OENC="$UTF8" eerror "La valeur par défaut de $__rv_v doit être non vide" return 1 fi - set_var "$__rv_v" "$__rv_d" + _setv "$__rv_v" "$__rv_d" return 0 fi @@ -6298,7 +6722,7 @@ function __rv_read() { fi __rv_r="${__rv_r:-$__rv_d}" if [ -n "$__rv_r" ] || ! is_yes "$__rv_re"; then - set_var "$__rv_v" "$__rv_r" + _setv "$__rv_v" "$__rv_r" return 0 fi done @@ -6364,7 +6788,7 @@ function simple_menu() { __sm_c=0 fi done - set_var "$__sm_option_var" "$__sm_option" + _setv "$__sm_option_var" "$__sm_option" } function actions_menu() { @@ -6391,8 +6815,8 @@ function actions_menu() { eerror_unless [ ${#__am_action_descs[*]} -gt 0 ] "Vous devez spécifier le tableau des actions" || return __actions_menu || return 1 - setv "${1:-action}" "$__am_select_action" - setv "${2:-option}" "$__am_select_option" + _setv "${1:-action}" "$__am_select_action" + _setv "${2:-option}" "$__am_select_option" } function __actions_menu() { local title="$__am_title" @@ -6651,12 +7075,12 @@ function ac_set_tmpfile() { fi fi if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" + _setv "$1" "$3" [ -f "$3" -a "$4" == keep ] || >"$3" else local __acst_t="$(mktempf "$2")" autoclean "$__acst_t" - set_var "$1" "$__acst_t" + _setv "$1" "$__acst_t" fi } function ac_set_tmpdir() { @@ -6669,12 +7093,12 @@ function ac_set_tmpdir() { fi fi if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" + _setv "$1" "$3" mkdir -p "$3" else local __acst_t="$(mktempd "$2")" autoclean "$__acst_t" - set_var "$1" "$__acst_t" + _setv "$1" "$__acst_t" fi } function debug_tee() { @@ -6732,26263 +7156,6 @@ function set_defaults() { } -: "${MYHOST:=$HOSTNAME}" -: "${MYHOSTNAME:=${MYHOST%%.*}}" -export MYHOST MYHOSTNAME - -function myhost() { - hostname -f 2>/dev/null || echo "$MYHOST" -} -function myhostname() { - hostname -s 2>/dev/null || echo "$MYHOSTNAME" -} -##@inc]base -uprovide base.tools -urequire base - -function base_umove() { - local -a args - local updatedir - args=(-d:,--updatedir: .) - parse_args_check "$@" || return; set -- "${args[@]}" - - eerror_unless [ -z "$updatedir" -o -d "$updatedir" ] "$updatedir: doit être un répertoire" || return - eerror_if [ $# -eq 0 ] "Vous devez spécifier les fichiers à déplacer" || return - eerror_if [ $# -eq 1 ] "Vous devez spécifier la destination" || return - - local -a srcs - local dest - - srcs=("$@") - setx dest=last_value srcs - array_del_last srcs - - if [ $# -eq 2 ]; then - if [ -d "$dest" ]; then - : # ce cas sera traité ci-dessous - elif [ -e "$dest" ]; then - eerror "$dest: refus d'écraser la destination" - return 1 - else - src="${srcs[0]}" - if [ -n "$updatedir" ]; then - if [ -L "$src" ]; then - ldest="$(readlinka "$src")" - array_find_links update_links "$ldest" "$updatedir" - else - array_find_links update_links "$src" "$updatedir" - fi - move_file "$src" "$dest" "${update_links[@]}" - else - move_link "$src" "$dest" - fi - return $? - fi - fi - - [ -d "$dest" ] || { - eerror "$dest: doit être un répertoire" - return 1 - } - for src in "${srcs[@]}"; do - if [ -n "$updatedir" ]; then - if [ -L "$src" ]; then - move_link "$src" "$dest" - else - array_find_links update_links "$src" "$updatedir" - move_file "$src" "$dest" "${update_links[@]}" - fi - else - move_link "$src" "$dest" - fi - done -} -##@inc]base.tools -##@inc[base.compat -## Fonctions de base: support des fonctions obsolètes et des versions de bash < 4.x -##@inc[base.core -## Fonctions de base: fondement -uprovide base.core - -function echo_() { - echo -n "$*" -} -function recho() { - if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - - local first="${1:1}"; shift - echo "$first$@" - else - echo "$@" - fi -} -function recho_() { - if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - - local first="${1:1}"; shift - echo -n "$first$@" - else - echo -n "$@" - fi -} -function _qval() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s//\$/\\\$}" - s="${s//\`/\\\`}" - recho_ "$s" -} -function should_quote() { - local l="${#1}" - [ $l -eq 0 -o $l -gt 80 ] && return 0 - local s="${*//[a-zA-Z0-9]/}" - s="${s//,/}" - s="${s//./}" - s="${s//+/}" - s="${s//\//}" - s="${s//-/}" - s="${s//_/}" - s="${s//=/}" - [ -n "$s" ] -} -function qval() { - echo -n \" - _qval "$@" - echo \" -} -function qvalm() { - if should_quote "$*"; then - echo -n \" - _qval "$@" - echo \" - else - recho "$*" - fi -} -function qvalr() { - if [ -z "$*" ]; then - : - elif should_quote "$*"; then - echo -n \" - _qval "$@" - echo \" - else - recho "$*" - fi -} -function qvals() { - local arg first=1 - for arg in "$@"; do - [ -z "$first" ] && echo -n " " - if should_quote "$arg"; then - echo -n \" - _qval "$arg" - echo -n \" - else - recho_ "$arg" - fi - first= - done - [ -z "$first" ] && echo -} -function qwc() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s//\$/\\\$}" - s="${s//\`/\\\`}" - local r a b - while [ -n "$s" ]; do - if [[ "$s" == *\** ]]; then - if [[ "$s" == *\?* ]]; then - a="${s%%\**}" - b="${s%%\?*}" - if [ ${#a} -lt ${#b} ]; then - s="${s#*\*}" - r="$r\"$a\"*" - else - s="${s#*\?}" - r="$r\"$b\"?" - fi - else - a="${s%%\**}" - s="${s#*\*}" - r="$r\"$a\"*" - fi - elif [[ "$s" == *\?* ]]; then - if [[ "$s" == *\** ]]; then - a="${s%%\**}" - b="${s%%\?*}" - if [ ${#a} -lt ${#b} ]; then - s="${s#*\*}" - r="$r\"$a\"*" - else - s="${s#*\?}" - r="$r\"$b\"?" - fi - else - a="${s%%\?*}" - s="${s#*\?}" - r="$r\"$a\"?" - fi - else - r="$r\"$s\"" - break - fi - done - recho_ "$r" -} -function qlines() { - sed "s/'/'\\\\''/g; s/.*/'&'/g" -} -function setv() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - eval "$__s_var=\"\$*\"" -} -function _setv() { - local __s_var="$1"; shift - eval "$__s_var=\"\$*\"" -} -function echo_setv() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - echo "$__s_var=$(qvalr "$*")" -} -function setx() { - if [ "$1" == -a ]; then - shift - local __s_array="$1"; shift - if [[ "$__s_array" == *=* ]]; then - set -- "${__s_array#*=}" "$@" - __s_array="${__s_array%%=*}" - fi - eval "$__s_array=($("$@" | qlines))" - else - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - eval "$__s_var="'"$("$@")"' - fi -} -function _setvx() { - local __s_var="$1"; shift - eval "$__s_var="'"$("$@")"' -} -function _setax() { - local __s_array="$1"; shift - eval "$__s_array=($("$@" | qlines))" -} -function evalx() { - local __e_val __e_arg __e_r=0 - local -a __e_cmd - - local __e_first=1 - while [ $# -gt 0 ]; do - __e_cmd=() - while [ $# -gt 0 ]; do - __e_arg="$1"; shift - [ "$__e_arg" == // ] && break - if [ "${__e_arg%//}" != "$__e_arg" ]; then - local __e_tmp="${__e_arg%//}" - if [ -z "${__e_tmp//\\/}" ]; then - __e_arg="${__e_arg#\\}" - __e_cmd=("${__e_cmd[@]}" "$__e_arg") - continue - fi - fi - __e_cmd=("${__e_cmd[@]}" "$__e_arg") - done - - if [ -n "$__e_first" ]; then - __e_val="$("${__e_cmd[@]}")" || __e_r=$? - else - __e_val="$("${__e_cmd[@]}" "$__e_val")" || __e_r=$? - fi - __e_first= - done - [ -n "$__e_val" ] && echo "$__e_val" - return $__e_r -} -function setxx() { - local -a __s_args - if [ "$1" == -a ]; then __s_args=(-a); shift; fi - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - __s_args=("${__s_args[@]}" "$__s_var") - setx "${__s_args[@]}" evalx "$@" -} -function evalp() { - local __e_arg __e_cmd - - while [ $# -gt 0 ]; do - __e_arg="$1"; shift - if [ "$__e_arg" == // ]; then - __e_cmd="$__e_cmd |" - continue - elif [ "${__e_arg%//}" != "$__e_arg" ]; then - local __e_tmp="${__e_arg%//}" - if [ -z "${__e_tmp//\\/}" ]; then - __e_arg="${__e_arg#\\}" - fi - fi - __e_cmd="${__e_cmd:+$__e_cmd }\"$(_qval "$__e_arg")\"" - done - eval "$__e_cmd" -} -function setxp() { - local -a __s_args - if [ "$1" == -a ]; then __s_args=(-a); shift; fi - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - __s_args=("${__s_args[@]}" "$__s_var") - setx "${__s_args[@]}" evalp "$@" -} -function testx() { - local __t_op="$1"; shift - local __t_val="$(evalx "$@")" - [ $__t_op "$__t_val" ] -} -function test2x() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalx "$@")" - [ "$__t_val1" $__t_op "$__t_val2" ] -} -function testrx() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalx "$@")" - eval '[[ "$__t_val1" '"$__t_op"' "$__t_val2" ]]' -} -function testp() { - local __t_op="$1"; shift - local __t_val="$(evalp "$@")" - [ $__t_op "$__t_val" ] -} -function test2p() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalp "$@")" - [ "$__t_val1" $__t_op "$__t_val2" ] -} -function testrp() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalp "$@")" - eval '[[ "$__t_val1" '"$__t_op"' "$__t_val2" ]]' -} - -function err2out() { - "$@" 2>&1 -} - -function is_defined() { - [ -n "$(declare -p "$1" 2>/dev/null)" ] -} -function is_array() { - case "$(declare -p "$1" 2>/dev/null)" in declare\ -a*) return 0;; esac - return 1 -} - -function upvar() { - if unset -v "$1"; then - if [ $# -eq 2 ]; then - eval "$1=\"\$2\"" - else - eval "$1=(\"\${@:2}\")" - fi - fi -} -function array_upvar() { - unset -v "$1" && eval "$1=(\"\${@:2}\")" -} -function upvars() { - while [ $# -gt 0 ]; do - case "$1" in - -a) - unset -v "$2" && eval "$2=(\"\${@:3}\")" - break - ;; - -a*) - unset -v "$2" && eval "$2=(\"\${@:3:${1#-a}}\")" - shift $((${1#-a} + 2)) || return 1 - ;; - *) - unset -v "$1" && eval "$1=\"\$2\"" - shift; shift - ;; - esac - done -} - -function __ab_process_pending() { - local -a values - case "$mode" in - cmd) values="$("${pending[@]}")";; - ssplit) eval "values=($("${pending[@]}"))";; - lsplit) eval "values=($("${pending[@]}" | qlines))";; - add) values=("${pending[@]}");; - esac - cmd=("${cmd[@]}" "${values[@]}") - pending=() -} -function array_buildcmd() { - local desta="$1"; shift; local "$desta" - local mode=add - local -a pending cmd - while [ $# -gt 0 ]; do - case "$1" in - ++c|++cmd|++) __ab_process_pending; mode=cmd;; - ++s|++ssplit) __ab_process_pending; mode=ssplit;; - ++l|++lsplit) __ab_process_pending; mode=lsplit;; - ++a|++add) __ab_process_pending; mode=add;; - *) pending=("${pending[@]}" "$1");; - esac - shift - done - __ab_process_pending - array_upvar "$desta" "${cmd[@]}" -} -function buildcmd() { - local -a args - array_buildcmd args "$@" - qvals "${args[@]}" -} -function evalcmd() { - local -a args - array_buildcmd args "$@" - "${args[@]}" -} -##@inc]base.core -##@inc[base.num -## Fonctions de base: gestion des valeurs numériques -uprovide base.num - -function isnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//[0-9]/}" - [ -z "$v" ] -} -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - [ -z "${1//[0-9]/}" ] -} -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//./}" - v="${v//,/}" - v="${v//[0-9]/}" - [ -z "$v" ] -} -##@inc]base.num -##@inc[base.bool -## Fonctions de base: valeurs booléennes -##@inc[base.num -## Fonctions de base: gestion des valeurs numériques -uprovide base.num - -function isnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//[0-9]/}" - [ -z "$v" ] -} -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - [ -z "${1//[0-9]/}" ] -} -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//./}" - v="${v//,/}" - v="${v//[0-9]/}" - [ -z "$v" ] -} -##@inc]base.num -uprovide base.bool -urequire base.num - -function is_yes() { - case "${1,,}" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - esac - isnum "$1" && [ "$1" -ne 0 ] && return 0 - return 1 -} -function is_no() { - case "${1,,}" in - n|non|no|f|faux|false|off) return 0;; - esac - isnum "$1" && [ "$1" -eq 0 ] && return 0 - return 1 -} -function yesval() { - is_yes "$1" && echo 1 -} - -function setb() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - local __s_r - if "$@" >/dev/null; then - eval "$__s_var=1" - else - __s_r=$? - eval "$__s_var=" - return $__s_r - fi -} -function _setb() { - local __s_var="$1"; shift - if "$@" >/dev/null; then - eval "$__s_var=1" - else - eval "$__s_var=" - fi -} - -function evalb() { - if evalx "$@" >/dev/null; then - echo 1 - else - return $? - fi -} -function setxb() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - setx "$__s_var" evalb "$@" -} -##@inc]base.bool -##@inc[base.quote -## Fonctions de base: protection de valeurs chaine -uprovide base.quote -urequire base.core - -function _qawk() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s// -/\\n}" - recho_ "$s" -} -function qawk() { - echo -n \" - _qawk "$@" - echo \" -} -function qseds() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\//\\/}" - s="${s// -/\\n}" - recho "$s" -} -function _qform() { - local s="$*" - s="${s//\%/%25}" - s="${s//+/%2B}" - s="${s//&/%26}" - s="${s//=/%3D}" - s="${s// /+}" - recho_ "$s" -} -function qform() { - local s="$*" - if [[ "$s" == *=* ]]; then - _qform "${s%%=*}" - echo -n = - _qform "${s#*=}" - echo - else - _qform "$s" - echo - fi -} -function _qsql() { - local q="'" qq="''" - echo "${*//$q/$qq}" -} -function qsql() { - local q="'" qq="''" - echo "'${*//$q/$qq}'" -} -##@inc]base.quote -uprovide base.compat -urequire base.core base.num base.bool base.quote - - -function setx2() { setxx "$@"; } -function rawecho() { recho "$@"; } -function rawecho_() { recho_ "$@"; } -function quote_arg() { _qval "$@"; } -function quoted_arg() { qvalm "$@"; } -function quoted_args() { qvals "$@"; } -function set_var() { setv "$@"; } -function set_var_cmd() { echo_setv "$@"; } -function set_var_literal() { eval "$1=$2"; } - -function quote_awk() { _qawk "$@"; } -function quoted_awk() { qawk "$@"; } -function quote_seds() { qseds "$@"; } -function quote_form() { _qform "$@"; } -function quoted_form() { qform "$@"; } - - -if [ -n "$BASH_VERSINFO" -a "${BASH_VERSINFO[0]}" -lt 4 ]; then - function strlower() { tr A-Z a-z <<<"$*"; } - function strlower1() { - local str="$*" - local h="${str:0:1}" r="${str:1}" - echo "$(tr A-Z a-z <<<"$h")$r" - } - function strlowers() { - local -a vs; local v - for v in "$@"; do - vs=("${vs[@]}" "$(strlower1 "$v")") - done - echo "${vs[*]}" - } - function strupper() { tr a-z A-Z <<<"$*"; } - function strupper1() { - local str="$*" - local h="${str:0:1}" r="${str:1}" - echo "$(tr a-z A-Z <<<"$h")$r" - } - function struppers() { - local -a vs; local v - for v in "$@"; do - vs=("${vs[@]}" "$(strupper1 "$v")") - done - echo "${vs[*]}" - } - - function is_yes() { - case "$1" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - O|OUI|Y|YES|V|VRAI|T|TRUE|ON) return 0;; - esac - isnum "$1" && [ "$1" -ne 0 ] && return 0 - case "$(strlower "$1")" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - esac - return 1 - } - function is_no() { - case "$1" in - n|non|no|f|faux|false|off) return 0;; - N|NON|NO|F|FAUX|FALSE|OFF) return 0;; - esac - isnum "$1" && [ "$1" -eq 0 ] && return 0 - case "$(strlower "$1")" in - n|non|no|f|faux|false|off) return 0;; - esac - return 1 - } -fi -##@inc]base.compat -uprovide base -urequire base.init base.core base.string base.num base.bool base.array base.quote base.split base.args base.tools base.compat - -UNAME_SYSTEM=`uname -s` -[ "${UNAME_SYSTEM#CYGWIN}" != "$UNAME_SYSTEM" ] && UNAME_SYSTEM=Cygwin -[ "${UNAME_SYSTEM#MINGW32}" != "$UNAME_SYSTEM" ] && UNAME_SYSTEM=Mingw -UNAME_MACHINE=`uname -m` -if [ -n "$UTOOLS_CHROOT" ]; then - [ -n "$UTOOLS_UNAME_SYSTEM" ] && eval "UNAME_SYSTEM=$UTOOLS_UNAME_SYSTEM" - [ -n "$UTOOLS_UNAME_MACHINE" ] && eval "UNAME_MACHINE=$UTOOLS_UNAME_MACHINE" -fi - -function setyesval() { - is_yes "$2" && set_var "$1" 1 || set_var "$1" "" -} -function normyesval() { - is_yes "${2:-"${!1}"}" && set_var "$1" 1 || set_var "$1" "" -} -function normyesvals() { - local __nyv_yesvar - for __nyv_yesvar in "$@"; do - is_yes "${!__nyv_yesvar}" && set_var "$__nyv_yesvar" 1 || set_var "$__nyv_yesvar" "" - done -} -function quote_in() { - sed 's/\\/\\\\/g -s/"/\\"/g -s/\$/\\$/g -s/`/\\`/g' -} -function quote_sin() { - sed "s/'/'\\\\''/g" -} -function quote_sarg() { - quote_sin <<<"$1" -} -function quoted_sarg() { - echo "'$(quote_sarg "$1")'" -} -function quoted_sargs() { - local a s - for a in "$@"; do - s="${s:+$s }$(quoted_sarg "$a")" - done - rawecho "$s" -} - -function set_array_cmd() { - [ $# -eq 1 ] && set -- "$1" "$1" - local __sac_s __sac_v __sac_f - __sac_s="$1=("; shift - if [ "$1" == "@" ]; then - shift - else - eval "set -- \"\${$1[@]}\"" - fi - __sac_f=1 - for __sac_v in "$@"; do - [ -n "$__sac_f" ] && __sac_f= || __sac_s="$__sac_s " - __sac_s="$__sac_s$(quoted_arg "$__sac_v")" - done - __sac_s="$__sac_s)" - echo "$__sac_s" -} -function set_array() { - eval "$(set_array_cmd "$@")" -} -function array_count() { - eval "echo \${#$1[*]}" -} -function array_isempty() { - [ $(array_count "$1") -eq 0 ] -} -function array_new() { - eval "$1=()" -} -function array_add() { - local __aa_a="$1"; shift - eval "$__aa_a=(\"\${$__aa_a[@]}\" \"\$@\")" -} -function array_ins() { - local __aa_a="$1"; shift - eval "$__aa_a=(\"\$@\" \"\${$__aa_a[@]}\")" -} -function array_del() { - local __ad_v - local -a __ad_vs - eval 'for __ad_v in "${'"$1"'[@]}"; do - if [ "$__ad_v" != '"$(quoted_arg "$2")"' ]; then - array_add __ad_vs "$__ad_v" - fi -done' - array_copy "$1" __ad_vs -} -function array_addu() { - local __as_v - eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then - return 1 - fi -done' - array_add "$1" "$2" - return 0 -} -function array_set() { - array_addu "$@" -} -function array_insu() { - local __as_v - eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then - return 1 - fi -done' - array_ins "$1" "$2" - return 0 -} -function array_fillrange() { - local -a __af_vs - local __af_i="${2:-1}" __af_to="${3:-10}" __af_step="${4:-1}" - while [ "$__af_i" -le "$__af_to" ]; do - __af_vs=("${__af_vs[@]}" "$__af_i") - __af_i=$(($__af_i + $__af_step)) - done - array_copy "$1" __af_vs -} -function array_eq() { - local -a __ae_a1 __ae_a2 - array_copy __ae_a1 "$1" - array_copy __ae_a2 "$2" - [ ${#__ae_a1[*]} -eq ${#__ae_a2[*]} ] || return 1 - local __ae_v __ae_i=0 - for __ae_v in "${__ae_a1[@]}"; do - [ "$__ae_v" == "${__ae_a2[$__ae_i]}" ] || return 1 - __ae_i=$(($__ae_i + 1)) - done - return 0 -} -function array_contains() { - local __ac_v - eval 'for __ac_v in "${'"$1"'[@]}"; do - if [ "$__ac_v" == '"$(quoted_arg "$2")"' ]; then - return 0 - fi -done' - return 1 -} -function array_find() { - local __af_i __af_v - __af_i=0 - eval 'for __af_v in "${'"$1"'[@]}"; do - if [ "$__af_v" == '"$(quoted_arg "$2")"' ]; then - if [ -n "$3" ]; then - echo "${'"$3"'[$__af_i]}" - else - echo "$__af_i" - fi - return 0 - fi - __af_i=$(($__af_i + 1)) -done' - return 1 -} -function array_reverse() { - local -a __ar_vs - local __ar_v - array_copy __ar_vs "$1" - array_new "$1" - for __ar_v in "${__ar_vs[@]}"; do - array_ins "$1" "$__ar_v" - done -} - -function array_replace() { - local __ar_sn="$1"; shift - local __ar_f="$1"; shift - local -a __ar_s __ar_d - local __ar_v - array_copy __ar_s "$__ar_sn" - for __ar_v in "${__ar_s[@]}"; do - if [ "$__ar_v" == "$__ar_f" ]; then - __ar_d=("${__ar_d[@]}" "$@") - else - __ar_d=("${__ar_d[@]}" "$__ar_v") - fi - done - array_copy "$__ar_sn" __ar_d -} -function array_each() { - local __ae_an="$1"; shift - local __ae_f="$1"; shift - local -a __ae_a - local __ae_v - array_copy __ae_a "$__ae_an" - for __ae_v in "${__ae_a[@]}"; do - "$__ae_f" "$__ae_v" "$@" - done -} -function array_map() { - local __am_an="$1"; shift - local __am_f="$1"; shift - local -a __am_a __am_vs - local __am_v - array_copy __am_a "$__am_an" - for __am_v in "${__am_a[@]}"; do - __am_vs=("${__am_vs[@]}" "$("$__am_f" "$__am_v" "$@")") - done - array_copy "$__am_an" __am_vs -} -function first_value() { - eval "rawecho \"\${$1[@]:0:1}\"" -} -function last_value() { - eval "rawecho \"\${$1[@]:\$((-1)):1}\"" -} -function array_copy() { - eval "$1=(\"\${$2[@]}\")" -} -function array_copy_firsts() { - eval "$1=(\"\${${2:-$1}[@]:0:\$((\${#${2:-$1}[@]}-1))}\")" -} -function array_del_last() { - array_copy_firsts "$1" -} -function array_copy_lasts() { - eval "$1=(\"\${${2:-$1}[@]:1}\")" -} -function array_del_first() { - array_copy_lasts "$1" -} -function array_extend() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]}\")" -} -function array_extendu() { - local __ae_v __ae_s=1 - eval 'for __ae_v in "${'"$2"'[@]}"; do - array_addu "$1" "$__ae_v" && __ae_s=0 -done' - return "$__ae_s" -} -function array_extend_firsts() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]:0:\$((\${#$2[@]}-1))}\")" -} -function array_extend_lasts() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]:1}\")" -} -function array_xsplit() { - eval "$1=($(recho_ "$2" | awkrun RS="${3:-:}" ' -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_split() { - eval "$1=($(recho_ "$2" | awkrun RS="${3:-:}" ' -/^$/ { next } -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_from_path() { - array_split "$1" "$2" ":" -} -function array_from_xlines() { - eval "$1=($(recho_ "$2" | _nl2lf | awk ' -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_from_lines() { - eval "$1=($(recho_ "$2" | _nl2lf | awk ' -/^$/ { next } -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_join() { - local __aj_an __aj_l __aj_j __aj_s="${2:-,}" __aj_pf __aj_sf - if [ "$1" == "@" ]; then - __aj_an="\$@" - shift; shift - else - __aj_an="\${$1[@]}" - __aj_pf="$4" - __aj_sf="$5" - fi - eval 'for __aj_l in "'"$__aj_an"'"; do - __aj_j="${__aj_j:+$__aj_j'"$__aj_s"'}$__aj_pf$__aj_l$__aj_sf" -done' - if [ -n "$__aj_j" ]; then - rawecho "$__aj_j" - elif [ "$__aj_an" != "\$@" -a -n "$3" ]; then - rawecho "$3" - fi -} -function array_mapjoin() { - local __amj_src="$1" __amj_func="$2" __amj_sep="$3" - shift; shift; shift - if [ "$__amj_src" == "@" ]; then - local -a __amj_tmpsrc - __amj_tmpsrc=("$@") - __amj_src=__amj_tmpsrc - set -- - fi - local -a __amj_tmp - array_copy __amj_tmp "$__amj_src" - array_map __amj_tmp "$__amj_func" - array_join __amj_tmp "$__amj_sep" "$@" -} -function array_to_lines() { - array_join "$1" " -" "$2" "$3" "$4" -} -function array_to_path() { - array_join "$1" ":" "$2" "$3" "$4" -} -function array_fix_paths() { - local __afp_an="$1" __afp_s="${2:-:}" - local -a __afp_vs - local __afp_v - array_copy __afp_vs "$__afp_an" - array_new "$__afp_an" - for __afp_v in "${__afp_vs[@]}"; do - array_split __afp_v "$__afp_v" "$__afp_s" - array_extend "$__afp_an" __afp_v - done -} - - -function get_date_rfc822() { - LC_TIME=C date +"%a, %d %b %Y %H:%M:%S %Z" -} -function get_date_fr() { - LC_TIME=C date +"%d/%m/%Y" -} -function get_time_fr() { - LC_TIME=C date +"%Hh%M" -} -function parse_date() { - local value="$1" type="${2:-date}" - local now="$(awk 'BEGIN { print mktime(strftime("%Y %m %d 00 00 00 +0400")) }')" - case "$value" in - +*) - value="$(($now + ${value#+} * 86400))" - ;; - *) - value="$(<<<"$value" awk -F/ '{ - nd = strftime("%d"); nm = strftime("%m"); ny = strftime("%Y") - d = $1 + 0; if (d < 1) d = nd; - m = $2 + 0; if (m < 1) m = nm; - if ($3 == "") y = ny; - else { y = $3 + 0; if (y < 100) y = y + 2000; } - print mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d)); - }')" - esac - case "$type" in - d|date) awk '{ print strftime("%d/%m/%Y", $0 + 0) }' <<<"$value";; - l|ldap) awk '{ print strftime("%Y%m%d%H%M%S+0400", $0 + 0) }' <<<"$value";; - m|mysql) awk '{ print strftime("%Y-%m-%d", $0 + 0) }' <<<"$value";; - *) - rawecho "$value" - ;; - esac -} - - -function udelpath() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; ${2:-PATH}"'="${'"${2:-PATH}"'#$1:}"; '"${2:-PATH}"'="${'"${2:-PATH}"'%:$1}"; '"${2:-PATH}"'="${'"${2:-PATH}"'//:$_qdir:/:}"; [ "$'"${2:-PATH}"'" == "$1" ] && '"${2:-PATH}"'=' -} -function uaddpath() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="${'"${2:-PATH}"':+$'"${2:-PATH}"':}$1"' -} -function uinspathm() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="$1${'"${2:-PATH}"':+:$'"${2:-PATH}"'}"' -} -function uinspath() { - udelpath "$@" - uinspathm "$@" -} - -function withpath() { - [ "${1#./}" != "$1" -o "${1#../}" != "$1" -o "${1#/}" != "$1" ] -} -function withext() { - local basename="$(basename -- "$1")" - [ "${basename%.*}" != "$basename" ] -} -function normpath() { - local -a parts - local part ap - array_split parts "$1" / - if [ "${1#/}" != "$1" ]; then - ap=/ - elif [ -n "$2" ]; then - ap="$2" - else - ap="$(pwd)" - fi - for part in "${parts[@]}"; do - if [ "$part" == "." ]; then - continue - elif [ "$part" == ".." ]; then - ap="${ap%/*}" - [ -n "$ap" ] || ap=/ - else - [ "$ap" != "/" ] && ap="$ap/" - ap="$ap$part" - fi - done - rawecho "$ap" -} -function abspath() { - local ap="$1" - if [ "${ap#/}" != "$ap" ]; then - __normpath "$ap" && return - else - local cwd - if [ -n "$2" ]; then - cwd="$(abspath "$2")" - else - cwd="$(pwd)" - fi - ap="$cwd/$ap" - __normpath "$ap" && return - fi - normpath "$ap" -} -function __normpath() { - if [ -d "$1" ]; then - if [ -x "$1" ]; then - (cd "$1"; pwd) - return 0 - fi - elif [ -f "$1" ]; then - local dn="$(dirname -- "$1")" bn="$(basename -- "$1")" - if [ -x "$dn" ]; then - (cd "$dn"; echo "$(pwd)/$bn") - return 0 - fi - fi - return 1 -} -function parentdirs() { - array_new "$1" - local __pd_d="$(abspath "$2")" - if [[ "$3" == r* ]]; then - while [ "$__pd_d" != "/" ]; do - array_ins "$1" "$__pd_d" - __pd_d="$(dirname "$__pd_d")" - done - else - while [ "$__pd_d" != "/" ]; do - array_add "$1" "$__pd_d" - __pd_d="$(dirname "$__pd_d")" - done - fi -} -function ppath() { - local path="$1" cwd="$2" - - path="$(abspath "$path")" # essayer de normaliser le chemin - [ -n "$cwd" ] || cwd="$(pwd)" - - [ "$path" = "$cwd" ] && path="." - [ "$cwd" != "/" -a "$cwd" != "$HOME" ] && path="${path/#$cwd\//}" - path="${path/#$HOME/~}" - - rawecho "$path" -} -function relpath() { - local p="$(abspath "$1" "$3")" cwd="$2" - if [ -z "$cwd" ]; then - cwd="$(pwd)" - else - cwd="$(abspath "$cwd" "$3")" - fi - if [ "$p" == "$cwd" ]; then - echo "" - elif [ "${p#$cwd/}" != "$p" ]; then - rawecho "${p#$cwd/}" - else - local rp - while [ -n "$cwd" -a "${p#$cwd/}" == "$p" ]; do - rp="${rp:+$rp/}.." - cwd="${cwd%/*}" - done - rp="$rp/${p#$cwd/}" - echo "${rp%//}" - fi -} -function relpathx() { - local p="$(relpath "$@")" - if [ -z "$p" ]; then - echo . - elif [ "${p#../}" != "$p" -o "${p#./}" != "$p" ]; then - echo "$p" - else - echo "./$p" - fi -} -function withinpath() { - local b="$1" p="$2" strict="${3:-N}" - b="$(abspath "$b")" - p="$(abspath "$p")" - if is_yes "$strict"; then - [ "${p#$b/}" != "$p" ] - else - [ "$p" == "$b" -o "${p#$b/}" != "$p" ] - fi -} -function safe_abspath() { - local p="$1" ba="$2" br="$3" - if [ -n "$ba" ]; then - ba="$(abspath "$ba")" - else - ba="$(pwd)" - fi - [ -n "$br" ] || br="$ba" - br="$(abspath "$br" "$ba")" - p="$(abspath "$p" "$ba")" - if [ "$p" == "$br" -o "${p#$br/}" != "$p" ]; then - echo "$p" - else - return 1 - fi -} -function safe_relpath() { - local p - if p="$(safe_abspath "$1" "$2" "$3")"; then - relpath "$p" "$2" "$(pwd)" - else - return 1 - fi -} -function splitwcs() { - local __sw_p="$1" - local __sw_dd="${2:-basedir}" __sw_df="${3:-filespec}" __sw_part __sw_d __sw_f - local -a __sw_parts - array_split __sw_parts "$__sw_p" "/" - for __sw_part in "${__sw_parts[@]}"; do - if [[ "$__sw_part" == *\** ]] || [[ "$__sw_part" == *\?* ]] || [ -n "$__sw_f" ]; then - __sw_f="${__sw_f:+$__sw_f/}$__sw_part" - else - __sw_d="${__sw_d:+$__sw_d/}$__sw_part" - fi - done - [ "${__sw_p#/}" != "$__sw_p" ] && __sw_d="/$__sw_d" - set_var "$__sw_dd" "$__sw_d" - set_var "$__sw_df" "$__sw_f" -} -function deref() { - local OENC="$UTF8" - - local max_deref=50 - local file="$1" - local basedir link - while [ -L "$file" ]; do - basedir="$(dirname "$file")" - link="$(readlink "$file")" - if first_char_is "$link" "/"; then - file="$link" - else - file="$basedir/$link" - fi - - max_deref=$(($max_deref - 1)) - [ $max_deref -eq 0 ] && die "Plus de 50 indirection. Le lien $file est-il récursif?" - done - abspath "$file" -} -function readlinka() { - if [ -L "$1" ]; then - local linkdir="$(dirname -- "$1")" - abspath "$(readlink "$1")" "$linkdir" - else - abspath "$1" - fi -} -function readlinkm() { - readlink -m "$1" -} -function path_if_test() { - local op="$1"; shift - local file="$1"; shift - local rel="$1" reldir=; shift - if beginswith "$rel" relative; then - reldir="${rel#relative}" - if beginswith "$reldir" :; then - reldir="${reldir#:}" - if [ -n "$reldir" ]; then - reldir="${reldir}/" - fi - else - reldir= - fi - else - rel= - fi - - while [ -n "$1" ]; do - local basedir="$1" - if [ $op "$basedir/$file" ]; then - if [ -n "$rel" ]; then - rawecho "$reldir$file" - else - rawecho "$basedir/$file" - fi - break - fi - shift - done -} -function update_link() { - [ -L "$2" ] || return 1 - local dest link="$2" - local linkdir="$(dirname "$link")" - local ldest="$(readlink "$link")" - if [ "${ldest#/}" != "$ldest" ]; then - dest="$(abspath "$1")" - else - dest="$(relpath "$1" "$linkdir")" - fi - if [ "$dest" == "$ldest" ]; then - : # pas besoin de mettre à jour - elif [ -d "$link" ]; then - rm -f "$link" && ln -s "$dest" "$link" - else - ln -sf "$dest" "$link" - fi -} -function update_links() { - [ -n "$1" ] || return 1 - local dest="$1"; shift - local r=0 link - for link in "$@"; do - update_link "$dest" "$link" || r=$? - done - return $r -} -function move_link() { - [ -n "$1" -a -n "$2" ] || return 1 - local link="$1" dest="$2" - [ -d "$dest" ] && dest="$dest/$(basename -- "$link")" - dest="$(abspath "$dest")" - if [ -L "$link" ]; then - link="$(abspath "$link")" - [ "$dest" == "$link" ] && return 0 - ldest="$(readlinka "$link")" - mv "$link" "$dest" || return 1 - update_link "$ldest" "$dest" - else - [ "$dest" == "$link" ] && return 0 - mv "$link" "$dest" - fi -} -function array_find_links() { - local -a __afl_links __afl_result - local __afl_dir="${3:-.}" - local __afl_dest __afl_destname __afl_link __afl_linkdir __afl_ldest - __afl_dest="$(abspath "$2")" - __afl_destname="${__afl_dest##*/}" - array_from_lines __afl_links "$(find "$__afl_dir" -type l)" - for __afl_link in "${__afl_links[@]}"; do - __afl_ldest="$(readlink "$__afl_link")" - if [ "$__afl_ldest" != "$__afl_destname" ]; then - [[ "$__afl_ldest" == */"$__afl_destname" ]] || continue - fi - __afl_link="$(abspath "$__afl_link" "$__afl_dir")" - __afl_linkdir="$(dirname -- "$__afl_link")" - __afl_ldest="$(abspath "$__afl_ldest" "$__afl_linkdir")" - if [ "$__afl_ldest" == "$__afl_dest" ]; then - array_add __afl_result "$__afl_link" - fi - done - array_copy "$1" __afl_result -} -function list_links() { - local -a links - array_find_links links "$@" - array_to_lines links -} -function move_file() { - [ -n "$1" -a -n "$2" ] || return 1 - local src="$1" dest="$2" link - shift; shift - [ -d "$dest" ] && dest="$dest/$(basename -- "$src")" - move_link "$src" "$dest" || return 1 - update_links "$dest" "$@" -} - -function get_nblines() { - [ -f "$1" ] && sed -ne '$=' "$1" || echo 0 -} -function mktempf() { - mktemp "${1:-"$TMPDIR/tmp.XXXXXX"}" -} -function mktempd() { - mktemp -d "${1:-"$TMPDIR/tmp.XXXXXX"}" -} -function mkdirof() { - mkdir -p "$(dirname -- "$1")" -} -function cp_a() { - /bin/cp -a "$@" -} -function cp_R() { - /bin/cp -pR "$@" -} -function quietgrep() { - grep -q "$@" 2>/dev/null -} -function quietdiff() { - diff -q "$@" >&/dev/null -} -function testsame() { - quietdiff "$@" -} -function testdiff() { - ! quietdiff "$@" -} -function testupdated() { - if [ -f "$2" ]; then - testdiff "$1" "$2" - else - return 0 - fi -} -function testnewer() { - test ! -e "$2" -o "$1" -nt "$2" -} -function ps_all() { - ps -axww -} -function progexists() { - test -n "$1" -a -x "$(which "$1" 2>/dev/null)" -} -function has_python() { - progexists python -} -function has_gawk() { - progexists gawk -} -function is_root() { - test `id -u` -eq 0 -} -function source_ifexists() { - if [ -f "$1" ]; then source "$1" || die; fi -} -function little_sleep { - LC_NUMERIC=C sleep 0.1 -} -function random_sleep { - sleep $(($RANDOM % ${1:-1800})) -} -function is_running() { - kill -0 "$1" >&/dev/null -} -function sedi() { - sed -i "$@" -} -function csort() { - LANG=C sort "$@" -} -function lsort() { sort "$@"; } -function cgrep() { - LANG=C grep "$@" -} -function lgrep() { grep "$@"; } -function csed() { - LANG=C sed "$@" -} -function lsed() { sed "$@"; } -function cawk() { - LANG=C awk "$@" -} -function lawk() { awk "$@"; } -function cdiff() { - LANG=C diff "$@" -} -function ldiff() { diff "$@"; } - - -function fix_mode() { - local file="$1" - [ -f "$file" ] || touch "$file" || return 1 - if [ ! -w "$file" ]; then - local mode="$(stat -c %a "$file")" - chmod ${mode:0:${#mode}-3}6${mode:${#mode}-2:2} "$file" - echo "$mode" - fi -} -function unfix_mode() { - [ -n "$2" ] && chmod "$2" "$1" -} -function get_mode() { - [ -f "$1" ] || touch "$1" || return 1 - stat -c %a "$1" -} -function rm_maybe() { - local parse_opts=1 arg rm - for arg in "$@"; do - if [ -n "$parse_opts" ]; then - if [ "$arg" == "--" ]; then - parse_opts= - elif [[ "$arg" == "-*" ]]; then - continue - elif [ -n "$arg" ]; then - rm=1 - break - fi - elif [ -n "$arg" ]; then - rm=1 - break - fi - done - [ -n "$rm" ] && /bin/rm "$@" -} -__CPDIR_RSYNC_SLOW=1 # synchro potentiellement plus lente, mais plus fidèle (option -c) -__CPDIR_RSYNC_ARGS=(-q) -function cpdir() { - - if progexists rsync; then - [ -d "$2" ] || mkdir -p "$2" || return 1 - if [ -d "$1" ]; then - rsync -a ${__CPDIR_RSYNC_SLOW:+-c} "${__CPDIR_RSYNC_ARGS[@]}" "$1/" "$2/" - else - rsync -a ${__CPDIR_RSYNC_SLOW:+-c} "${__CPDIR_RSYNC_ARGS[@]}" "$1" "$2/" - fi - else - __cpdir "$@" - fi -} -function __cpdir() { - local src="$1" dest="$2" method="${3:-cp_a}" - - if [ -d "$src" ]; then - [ -d "$dest" ] || mkdir -p "$dest" || return 1 - - local prevdir="$(pwd)" - - dest="$(abspath "$dest")" - cd "$src" - if [ -n "$(/bin/ls -a1)" ]; then - [ -n "$(/bin/ls -1)" ] && "$method" * "$dest" - local i - for i in .*; do - [ "$i" == "." -o "$i" == ".." ] && continue - "$method" "$i" "$dest" - done - fi - cd "$prevdir" - else - if [ -f "$dest" ]; then - "$method" "$src" "$dest" - elif [ -d "$dest" ]; then - "$method" "$src" "$dest" - else - mkdir -p "$dest" - "$method" "$src" "$dest" - fi - fi -} -__CPNOVCS_RSYNC_SLOW=1 # synchro potentiellement plus lente, mais plus fidèle (option -c) -__CPNOVCS_RSYNC_ARGS=(-q) -function cpnovcs() { - local src="$1" destdir="$2" - [ -d "$destdir" ] || mkdir -p "$destdir" || return 1 - if progexists rsync; then - local gitexclude=/.git/ - if [ "${src%/}" == "$src" ]; then - gitexclude="/$(basename -- "$src")$gitexclude" - fi - rsync -a ${__CPNOVCS_RSYNC_SLOW:+-c} --exclude CVS/ --exclude .svn/ --exclude "$gitexclude" "${__CPNOVCS_RSYNC_ARGS[@]}" "$src" "$destdir/" - elif [ "${src%/}" != "$src" ]; then - __cpdir "$src" "$destdir" - else - local srcname="$(basename -- "$src")" - mkdir -p "$destdir/$srcname" - __cpdir "$src" "$destdir/$srcname" - fi -} -function cpdirnovcs() { - if [ -d "$1" ]; then - cpnovcs "$1/" "$2" - else - cpnovcs "$1" "$2" - fi -} -function doinplace() { - if [ -n "$1" -a "$1" != "-" ]; then - local __dip_file="$1"; shift - autoclean "$__dip_file.tmp.$$" - "$@" <"$__dip_file" >"$__dip_file.tmp.$$" - local s=$? - [ "$s" == 0 ] && /bin/cat "$__dip_file.tmp.$$" >"$__dip_file" - /bin/rm -f "$__dip_file.tmp.$$" - return $s - else - shift - "$@" - fi -} -function doinplacef() { - if [ -n "$1" -a "$1" != "-" ]; then - local __dip_file="$1"; shift - autoclean "$__dip_file.tmp.$$" - "$@" <"$__dip_file" >"$__dip_file.tmp.$$" - local s=$? - /bin/cat "$__dip_file.tmp.$$" >"$__dip_file" - /bin/rm -f "$__dip_file.tmp.$$" - return $s - else - shift - "$@" - fi -} -function stripnl() { - tr -d '\r\n' -} -function _nl2lf() { - awk 'BEGIN {RS="\r|\r\n|\n"} {print}' -} -function nl2lf() { - doinplace "$1" _nl2lf -} -function _nl2crlf() { - awk 'BEGIN {RS="\r|\r\n|\n"} {print $0 "\r"}' -} -function nl2crlf() { - doinplace "$1" _nl2crlf -} -function _nl2cr() { - awk 'BEGIN {RS="\r|\r\n|\n"; ORS=""} {print $0 "\r"}' -} -function nl2cr() { - doinplace "$1" _nl2cr -} -function _latin1compat() { - LANG=fr_FR.UTF-8 sed $' -s/[‘’]/\x27/g -s/[«»“”]/"/g -s/[\xC2\xA0\xE2\x80\x87\xE2\x80\xAF\xE2\x81\xA0]/ /g -' -} -function _noaccents() { - LANG=fr_FR.UTF-8 sed ' -s/[à]/a/g -s/[éèêë]/e/g -s/[ïî]/i/g -s/[ôö]/o/g -s/[üû]/u/g -s/[ç]/c/g -s/[À]/A/g -s/[ÉÈÊË]/E/g -s/[ÏÎ]/I/g -s/[ÔÖ]/O/g -s/[ÜÛ]/U/g -s/[Ç]/C/g -' -} -function list_all() { - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ "$f" == "." -o "$f" == ".." ] && continue - rawecho "$f" - done - cd "$curdir" -} -function __la_cmd() { - [ $# -gt 0 ] || set '*' - local arg - local cmd="/bin/ls -1d" - for arg in "$@"; do - arg="$(_rval "$arg")" - cmd="$cmd $arg" - done - cmd="$cmd 2>/dev/null" - echo "$cmd" -} -function list_files() { - local f - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ -f "$f" ] && rawecho "$f" - done - cd "$curdir" -} -function list_dirs() { - local f - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ "$f" == "." -o "$f" == ".." ] && continue - [ -d "$f" ] && rawecho "$f" - done - cd "$curdir" -} -function __array_ls() { - local __al_l="list_${1:-all}"; shift - local __al_an="$1"; shift - local __al_d="${1:-.}"; shift - local -a __al_fs - array_from_lines __al_fs "$("$__al_l" "$__al_d" "$@")" - local __al_f - array_new "$__al_an" - for __al_f in "${__al_fs[@]}"; do - array_add "$__al_an" "$__al_d/$__al_f" - done -} -function array_lsall() { - __array_ls all "$@" -} -function array_lsdirs() { - __array_ls dirs "$@" -} -function array_lsfiles() { - __array_ls files "$@" -} -function filter_empty() { - sed '/^$/d' -} -function filter_vcspath() { - sed ' -/^.git$/d -/^.git\//d -/\/.git$/d -/\/.git\//d -/^.svn$/d -/^.svn\//d -/\/.svn$/d -/\/.svn\//d -' -} -function merge_contlines() { - awk 'substr($0, length($0)) == "\\" { - while (getline nextline) { - $0 = substr($0, 1, length($0) - 1) nextline - if (substr($0, length($0)) != "\\") break - } - print - next -} -{print}' -} -function filter_comment() { - local -a merge - [ "$1" == -m ] && merge=(merge_contlines) || merge=(cat) - awk ' - /^[ \t]*#/ { next } - /^[ \t]*$/ { next } - { print }' | "${merge[@]}" -} -function filter_conf() { - local -a merge - [ "$1" == -m ] && merge=(merge_contlines) || merge=(cat) - grep -v '^#' | grep -v '^$' | "${merge[@]}" -} -function is_archive() { - local name="${1%.zip}" - name="${name%.tgz}" - name="${name%.tbz2}" - name="${name%.tar.gz}" - name="${name%.tar.bz2}" - name="${name%.tar}" - name="${name%.jar}" - name="${name%.war}" - name="${name%.ear}" - [ "$name" != "$1" ] -} -function extract_archive() { - local arch="$1" destdir="${2:-.}" - shift; shift - if endswith "$arch" .zip; then - unzip -q -d "$destdir" "$arch" "$@" || return - elif endswith "$arch" .tgz || endswith "$arch" .tar.gz; then - tar xzf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .tbz2 || endswith "$arch" .tar.bz2; then - tar xjf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .tar; then - tar xf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .jar || endswith "$arch" .war || endswith "$arch" .ear; then - ( - arch="$(abspath "$arch")" - cd "$destdir" - jar xf "$arch" "$@" - ) || return - else - return 1 - fi -} -function get_archive_basename() { - local basename="$(basename -- "$1")" - basename="${basename%.zip}" - basename="${basename%.tgz}" - basename="${basename%.tbz2}" - basename="${basename%.gz}" - basename="${basename%.bz2}" - basename="${basename%.tar}" - basename="${basename%.jar}" - basename="${basename%.war}" - basename="${basename%.ear}" - echo "$basename" -} -function get_archive_appname() { - local appname="$(basename -- "$1")" - appname="${appname%.zip}" - appname="${appname%.tgz}" - appname="${appname%.tbz2}" - appname="${appname%.gz}" - appname="${appname%.bz2}" - appname="${appname%.tar}" - appname="${appname%.jar}" - appname="${appname%.war}" - appname="${appname%.ear}" - echo "$appname" | awk '{ - if (match($0, /[-_.]([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/)) { - print substr($0, 1, RSTART - 1) - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/)) { - print substr($0, 1, RSTART - 1) - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print substr($0, 1, RSTART - 1) - } else { - print $0 - } -}' -} -function get_archive_versionsuffix() { - local basename="$(get_archive_basename "$1")" - echo "$basename" | awk '{ - if (match($0, /([-_.][0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print vs["1"] - } -}' -} -function get_archive_version() { - local basename="$(get_archive_basename "$1")" - echo "$basename" | awk '{ - if (match($0, /[-_.]([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print vs["1"] - } -}' -} -function __dump_usernames() { - = 500 && $6 ~ /^\/home\// { print $1 }' -} -function dump_usernames() { - array_from_lines "${1:-usernames}" "$(__dump_usernames)" -} -function __resolv_ips() { - LANG=C host "$1" 2>/dev/null | awk '/address / { gsub(/^.*address /, ""); print }' -} -function resolv_ips() { - array_from_lines "${1:-ips}" "$(__resolv_ips "$2")" -} -function __resolv_hosts() { - LANG=C host "$1" 2>/dev/null | awk '/domain name pointer / { gsub(/^.*domain name pointer /, ""); gsub(/\.$/, ""); print }' -} -function resolv_hosts() { - array_from_lines "${1:-hosts}" "$(__resolv_hosts "$2")" -} -function runscript_as() { - local OENC="$UTF8" - local user="${1:-root}"; shift - local exec_maybe= - if [ "$1" = "exec" ]; then - exec_maybe=exec - shift - fi - - local cmd - cmd="\ -__estack=$(quoted_arg "$__estack") -__tlevel=$(quoted_args "$__tlevel") -export __estack __tlevel -exec ${BASH:-/bin/sh} $(quoted_args "$@")" - - if is_yes "$UTOOLS_USES_SU" || ! progexists sudo; then - eecho "Entrez le mot de passe de root" - $exec_maybe su "$user" -c "$cmd" - else - if [ "$user" == "root" ]; then - $exec_maybe sudo -p "Entrez le mot de passe de %u: " "${BASH:-/bin/sh}" -c "$cmd" - else - $exec_maybe sudo -p "Entrez le mot de passe de %u: " su "$user" -c "$cmd" - fi - fi -} -function runscript_as_root() { - if is_root; then - local exec_maybe= - if [ "$1" = "exec" ]; then - exec_maybe=exec - shift - fi - $exec_maybe "${BASH:-/bin/sh}" "$@" - else - runscript_as root "$@" - fi -} -function run_as() { - local user="${1:-root}"; shift - local exec_maybe=exec - if [ "$1" = "--noexec" ]; then - exec_maybe= - shift - fi - - runscript_as "$user" $exec_maybe "$0" "$@" -} -function run_as_root() { - is_root || run_as root "$@" -} -function check_user() { - local user - for user in "$@"; do - [ "$USER" == "$user" ] && return 0 - done - return 1 -} -function ensure_user() { - local -a users - while [ $# -gt 0 -a "$1" != "--" ]; do - array_add users "$1" - shift - done - [ "$1" == "--" ] && shift - - if ! check_user "${users[@]}"; then - if [ ${#users[*]} -gt 1 ]; then - ewarn "Cette commande doit être lancée avec l'un des users ${users[*]}" - else - ewarn "Cette commande doit être lancée avec le user ${users[0]}" - fi - if ask_yesno "Voulez-vous tenter de relancer la commande avec le bon user?" O; then - estep "Lancement du script avec le user ${users[0]}" - run_as "${users[0]}" "$@" - return 1 - elif is_root; then - return 11 - else - return 10 - fi - fi - return 0 -} -function check_hostname() { - local userhost user host path - for userhost in "$@"; do - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - [ "$MYHOSTNAME" == "${host%%.*}" ] && return 0 - done - return 1 -} -function check_userhostname() { - local userhost path user host - for userhost in "$@"; do - if check_hostname "$userhost"; then - [[ "$userhost" == *@* ]] || return 0 - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - check_user "$user" && return 0 - fi - done - return 1 -} -UTOOLS_ENSURE_HOSTNAME_SSH_OPTS=() -function ensure_hostname() { - local -a userhosts - while [ $# -gt 0 -a "$1" != "--" ]; do - array_add userhosts "$1" - shift - done - [ "$1" == "--" ] && shift - - local userhost user host path - if ! check_hostname "${userhosts[@]}"; then - if [ ${#userhosts[*]} -gt 1 ]; then - ewarn "Cette commande n'est valide que sur l'un des hôtes ${userhosts[*]}" - else - ewarn "Cette commande n'est valide que sur l'hôte ${userhosts[0]}" - fi - - enote "Vous pouvez tenter de relancer le script sur ${userhosts[0]}, mais cela requière que ce script ET les données dont il a besoin soient installés dans la même version et dans le même répertoire sur l'hôte distant" - if ask_yesno "Voulez-vous tenter de relancer le script sur l'hôte distant?" N; then - splitfsep "${userhosts[0]}" : userhost path - splituserhost "$userhost" user host - [ -n "$user" ] || user=root - - estep "Lancement de la commande sur l'hôte distant $user@$host" - local cmd - [ -n "$path" ] && cmd="$(quoted_args cd "$path"); " - cmd="$cmd$(quoted_args "$script" "$@")" - ssh -qt "${UTOOLS_ENSURE_HOSTNAME_SSH_OPTS[@]}" "$user@$host" "$cmd" - [ $? -eq 255 ] && return 12 - return 1 - else - return 11 - fi - fi - local userhost user host - for userhost in "${userhosts[@]}"; do - [[ "$userhost" == *@* ]] || continue - if check_hostname "$userhost"; then - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - [ -n "$path" ] && cd "$path" - ensure_user "$user" -- "$@" - return $? - fi - done - return 0 -} - -__AWKDEF_FUNCTIONS=' -function quote_html(s) { - gsub(/&/, "\\&", s) - gsub(/"/, "\\"", s) - gsub(/>/, "\\>", s) - gsub(/", s) - gsub(/"/, "\"", s) - gsub(/&/, "\\&", s) - return s -} -function quote_value(s) {'" - gsub(/'/, \"'\\\\''\", s) - return \"'\" s \"'\" -"'} -function quoted_values( i, line) { - line = "" - for (i = 1; i <= NF; i++) { - if (i > 1) line = line " " - line = line quote_value($i) - } - return line -} -function quote_subrepl(s) { - gsub(/\\/, "\\\\", s) - gsub(/&/, "\\\\&", s) - return s -} -function quote_grep(s) { - gsub(/[[\\.^$*]/, "\\\\&", s) - return s -} -function quote_egrep(s) { - gsub(/[[\\.^$*+?()|{]/, "\\\\&", s) - return s -} -function quote_sql(s) {'" - gsub(/'/, \"''\", s) - return \"'\" s \"'\" -"'} -function unquote_mysqlcsv(s) { - gsub(/\\n/, "\n", s) - gsub(/\\t/, "\t", s) - gsub(/\\0/, "\0", s) - gsub(/\\\\/, "\\", s) - return s -} -function array_new(dest) { - dest[0] = 0 # forcer awk à considérer dest comme un tableau - delete dest -} -function array_newsize(dest, size, i) { - dest[0] = 0 # forcer awk à considérer dest comme un tableau - delete dest - size = int(size) - for (i = 1; i <= size; i++) { - dest[i] = "" - } -} -function array_len(values, count, i) { - count = 0 - for (i in values) { - count++ - } - return count -} -function mkindices(values, indices, i, j) { - array_new(indices) - j = 1 - for (i in values) { - indices[j++] = int(i) - } - return asort(indices) -} -function array_copy(dest, src, count, indices, i) { - array_new(dest) - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - dest[indices[i]] = src[indices[i]] - } -} -function array_getlastindex(src, count, indices) { - count = mkindices(src, indices) - if (count == 0) return 0 - return indices[count] -} -function array_add(dest, value, lastindex) { - lastindex = array_getlastindex(dest) - dest[lastindex + 1] = value -} -function array_deli(dest, i, l) { - i = int(i) - if (i == 0) return - l = array_len(dest) - while (i < l) { - dest[i] = dest[i + 1] - i++ - } - delete dest[l] -} -function array_del(dest, value, ignoreCase, i) { - do { - i = key_index(value, dest, ignoreCase) - if (i != 0) array_deli(dest, i) - } while (i != 0) -} -function array_extend(dest, src, count, lastindex, indices, i) { - lastindex = array_getlastindex(dest) - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - dest[lastindex + i] = src[indices[i]] - } -} -function array_fill(dest, i) { - array_new(dest) - for (i = 1; i <= NF; i++) { - dest[i] = $i - } -} -function array_getline(src, count, indices, i, j) { - $0 = "" - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - j = indices[i] - $j = src[j] - } -} -function array_appendline(src, count, indices, i, nf, j) { - count = mkindices(src, indices) - nf = NF - for (i = 1; i <= count; i++) { - j = nf + indices[i] - $j = src[indices[i]] - } -} -function in_array(value, values, ignoreCase, i) { - if (ignoreCase) { - value = tolower(value) - for (i in values) { - if (tolower(values[i]) == value) return 1 - } - } else { - for (i in values) { - if (values[i] == value) return 1 - } - } - return 0 -} -function key_index(value, values, ignoreCase, i) { - if (ignoreCase) { - value = tolower(value) - for (i in values) { - if (tolower(values[i]) == value) return int(i) - } - } else { - for (i in values) { - if (values[i] == value) return int(i) - } - } - return 0 -} -function array2s(values, prefix, sep, suffix, noindices, first, i, s) { - if (!prefix) prefix = "[" - if (!sep) sep = ", " - if (!suffix) suffix = "]" - s = prefix - first = 1 - for (i in values) { - if (first) first = 0 - else s = s sep - if (!noindices) s = s "[" i "]=" - s = s values[i] - } - s = s suffix - return s -} -function array2so(values, prefix, sep, suffix, noindices, count, indices, i, s) { - if (!prefix) prefix = "[" - if (!sep) sep = ", " - if (!suffix) suffix = "]" - s = prefix - count = mkindices(values, indices) - for (i = 1; i <= count; i++) { - if (i > 1) s = s sep - if (!noindices) s = s "[" indices[i] "]=" - s = s values[indices[i]] - } - s = s suffix - return s -} -function array_join(values, sep, prefix, suffix, count, indices, i, s) { - s = prefix - count = mkindices(values, indices) - for (i = 1; i <= count; i++) { - if (i > 1) s = s sep - s = s values[indices[i]] - } - s = s suffix - return s -} -function printto(s, output) { - if (output == "") { - print s - } else if (output ~ /^>>/) { - sub(/^>>/, "", output) - print s >>output - } else if (output ~ /^>/) { - sub(/^>/, "", output) - print s >output - } else { - print s >output - } -} -function find_line(input, field, value, orig, line) { - orig = $0 - line = "" - while ((getline 0) { - if ($field == value) { - line = $0 - break - } - } - close(input) - $0 = orig - return line -} -function merge_line(input, field, key, line) { - line = find_line(input, field, $key) - if (line != "") $0 = $0 FS line -} -function __csv_parse_quoted(line, destl, colsep, qchar, echar, pos, tmpl, nextc, resl) { - line = substr(line, 2) - resl = "" - while (1) { - pos = index(line, qchar) - if (pos == 0) { - resl = resl line - destl[0] = "" - destl[1] = 0 - return resl - } - if (echar != "" && pos > 1) { - prevc = substr(line, pos - 1, 1) - quotec = substr(line, pos, 1) - nextc = substr(line, pos + 1, 1) - if (prevc == echar) { - tmpl = substr(line, 1, pos - 2) - resl = resl tmpl quotec - line = substr(line, pos + 1) - continue - } - tmpl = substr(line, 1, pos - 1) - if (nextc == colsep || nextc == "") { - resl = resl tmpl - destl[0] = substr(line, pos + 2) - destl[1] = nextc == colsep - return resl - } else { - resl = resl tmpl quotec - line = substr(line, pos + 1) - } - } else { - tmpl = substr(line, 1, pos - 1) - quotec = substr(line, pos, 1) - nextc = substr(line, pos + 1, 1) - if (nextc == colsep || nextc == "") { - resl = resl tmpl - destl[0] = substr(line, pos + 2) - destl[1] = nextc == colsep - return resl - } else if (nextc == qchar) { - resl = resl tmpl quotec - line = substr(line, pos + 2) - } else { - resl = resl tmpl quotec - line = substr(line, pos + 1) - } - } - } -} -function __csv_parse_unquoted(line, destl, colsep, qchar, echar, pos) { - pos = index(line, colsep) - if (pos == 0) { - destl[0] = "" - destl[1] = 0 - return line - } else { - destl[0] = substr(line, pos + 1) - destl[1] = 1 - return substr(line, 1, pos - 1) - } -} -function __array_parsecsv(fields, line, nbfields, colsep, qchar, echar, shouldparse, destl, i) { - array_new(fields) - array_new(destl) - i = 1 - shouldparse = 0 - while (shouldparse || line != "") { - if (index(line, qchar) == 1) { - value = __csv_parse_quoted(line, destl, colsep, qchar, echar) - line = destl[0] - shouldparse = destl[1] - } else { - value = __csv_parse_unquoted(line, destl, colsep, qchar, echar) - line = destl[0] - shouldparse = destl[1] - } - fields[i] = value - i = i + 1 - } - if (nbfields) { - nbfields = int(nbfields) - i = array_len(fields) - while (i < nbfields) { - i++ - fields[i] = "" - } - } - return array_len(fields) -} -BEGIN { - DEFAULT_COLSEP = "," - DEFAULT_QCHAR = "\"" - DEFAULT_ECHAR = "" -} -function array_parsecsv2(fields, line, nbfields, colsep, qchar, echar) { - return __array_parsecsv(fields, line, nbfields, colsep, qchar, echar) -} -function array_parsecsv(fields, line, nbfields, colsep, qchar, echar) { - if (colsep == "") colsep = DEFAULT_COLSEP - if (qchar == "") qchar = DEFAULT_QCHAR - if (echar == "") echar = DEFAULT_ECHAR - return __array_parsecsv(fields, line, nbfields, colsep, qchar, echar) -} -function parsecsv(line, fields) { - array_parsecsv(fields, line) - array_getline(fields) - return NF -} -function getlinecsv(file, fields) { - if (file) { - getline 1) line = line colsep - if (qchar != "" && index(value, qchar) != 0) { - if (echar != "") gsub(qchar, quote_subrepl(echar) "&", value); - else gsub(qchar, "&&", value); - } - if (qchar != "" && (index(value, mvsep) != 0 || index(value, colsep) != 0 || index(value, qchar) != 0 || __csv_should_quote(value))) { - line = line qchar value qchar - } else { - line = line value - } - } - return line -} -function array_formatcsv(fields) { - return array_formatcsv2(fields, ",", ";", "\"", "") -} -function array_printcsv(fields, output) { - printto(array_formatcsv(fields), output) -} -function get_formatcsv( fields) { - array_fill(fields) - return array_formatcsv(fields) -} -function formatcsv() { - $0 = get_formatcsv() -} -function printcsv(output, fields) { - array_fill(fields) - array_printcsv(fields, output) -} -function array_findcsv(fields, input, field, value, nbfields, orig, found, i) { - array_new(orig) - array_fill(orig) - array_new(fields) - found = 0 - while ((getline 0) { - array_parsecsv(fields, $0, nbfields) - if (fields[field] == value) { - found = 1 - break - } - } - close(input) - array_getline(orig) - if (!found) { - delete fields - if (nbfields) { - nbfields = int(nbfields) - i = array_len(fields) - while (i < nbfields) { - i++ - fields[i] = "" - } - } - } - return found -} - -function __and(var, x, l_res, l_i) { - l_res=0; - for (l_i=0; l_i < 8; l_i++){ - if (var%2 == 1 && x%2 == 1) l_res=l_res/2 + 128; - else l_res/=2; - var=int(var/2); - x=int(x/2); - } - return l_res; -} -function __lshift(var, x) { - while(x > 0){ - var*=2; - x--; - } - return var; -} -function __rshift(var, x) { - while(x > 0){ - var=int(var/2); - x--; - } - return var; -} -BEGIN { - __BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" -} -function b64decode(src, result, base1, base2, base3, base4) { - result = "" - while (length(src) > 0) { - base1 = substr(src, 1, 1) - base2 = substr(src, 2, 1) - base3 = substr(src, 3, 1); if (base3 == "") base3 = "=" - base4 = substr(src, 4, 1); if (base4 == "") base4 = "=" - byte1 = index(__BASE64, base1) - 1 - if (byte1 < 0) byte1 = 0 - byte2 = index(__BASE64, base2) - 1 - if (byte2 < 0) byte2 = 0 - byte3 = index(__BASE64, base3) - 1 - if (byte3 < 0) byte3 = 0 - byte4 = index(__BASE64, base4) - 1 - if (byte4 < 0) byte4 = 0 - result = result sprintf( "%c", __lshift(__and(byte1, 63), 2) + __rshift(__and(byte2, 48), 4) ) - if (base3 != "=") result = result sprintf( "%c", __lshift(__and(byte2, 15), 4) + __rshift(__and(byte3, 60), 2) ) - if (base4 != "=") result = result sprintf( "%c", __lshift(__and(byte3, 3), 6) + byte4 ) - src = substr(src, 5) - } - return result -} -' -function awkdef() { - - if [ "${1:0:3}" == "-f" ]; then - shift - echo "$__AWKDEF_FUNCTIONS" - fi - if [ $# -gt 0 ]; then - local __ad_arg __ad_vpos __ad_name __ad_value - echo "BEGIN {" - while [ -n "${1:0:1}" ]; do - __ad_arg="${1:0:256}" - local __ad_array= - if [ "${__ad_arg%\[@\]}" != "$__ad_arg" ]; then - __ad_array=1 - __ad_name="${__ad_arg%\[@\]}" - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_value="$__ad_name" - elif [[ "$__ad_arg" == *\[@\]=* ]]; then - __ad_array=1 - __ad_name="${__ad_arg%%\[@\]=*}" - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_vpos=$((${#__ad_name} + 4)) - __ad_value="${1:$__ad_vpos}" - [ ${#__ad_value} -ne 0 ] || __ad_value="$__ad_name" - elif [[ "$__ad_arg" == *=* ]]; then - local __ad_int= __ad_str= - __ad_name="${__ad_arg%%=*}" - __ad_vpos=$((${#__ad_name} + 1)) - if [ "${__ad_name%:int}" != "$__ad_name" ]; then - __ad_int=1 - __ad_name="${__ad_name%:int}" - elif [ "${__ad_name%:str}" != "$__ad_name" ]; then - __ad_str=1 - __ad_name="${__ad_name%:str}" - fi - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_value="${1:$__ad_vpos}" - if [ -n "$__ad_int" ]; then - echo "$__ad_name = int($(quoted_awk "$__ad_value") + 0)" - elif [ -n "$__ad_str" ]; then - echo "$__ad_name = $(quoted_awk "$__ad_value")" - elif [ ${#__ad_value} -lt 256 ] && isnum "$__ad_value"; then - echo "$__ad_name = $__ad_value" - else - echo "$__ad_name = $(quoted_awk "$__ad_value")" - fi - else - break - fi - if [ -n "$__ad_array" ]; then - if [ "${__ad_value:0:2}" == $'<\n' ]; then - local -a __ad_values - array_from_lines __ad_values "${__ad_value:2}" - __ad_value=__ad_values - fi - __ad_value="${__ad_value}[@]" - local __ad_i=1 - echo "$__ad_name[0] = 0; delete $__ad_name" - for __ad_arg in "${!__ad_value}"; do - echo "$__ad_name[$__ad_i]=$(quoted_awk "$__ad_arg")" - __ad_i=$(($__ad_i + 1)) - done - eval "echo \"\${__ad_name}_count = \${#$__ad_value}\"" - fi - shift - done - echo "}" - for __ad_arg in "$@"; do - rawecho "$__ad_arg" - done - fi -} -function lawkrun() { - local -a __ar_defs __ar_args - while [ $# -gt 0 -a "$1" != "--" ]; do - __ar_defs=("${__ar_defs[@]}" "$1") - shift - done - shift - while [ $# -gt 0 ]; do - __ar_args=("${__ar_args[@]}" "$1") - shift - done - local __ar_script="$(awkdef "${__ar_defs[@]}")" - awk "$__ar_script" "${__ar_args[@]}" -} -function cawkrun() { LANG=C lawkrun "$@"; } -function awkrun() { LANG=C lawkrun "$@"; } - -function __lf_get_age() { - local y=$(date "+%Y") - local dy=$(date "+%j"); while [ "${dy#0}" != "$dy" ]; do dy="${dy#0}"; done - [ -n "$dy" ] || dy=0 - local h=$(date "+%H"); while [ "${h#0}" != "$h" ]; do h="${h#0}"; done - [ -n "$h" ] || h=0 - echo $((($y * 365 + $dy) * 24 + $h)) -} -function lf_trylock() { - local eoo lockfile max_hours=4 - while [ -n "$1" ]; do - case "$1" in - -h) shift; max_hours="$1";; - --) shift; eoo=1;; - *) eoo=1;; - esac - [ -n "$eoo" ] && break - shift - done - - lockfile="$1" - [ -n "$lockfile" ] || die "il faut spécifier un fichier pour le verrou" - - local now="$(__lf_get_age)" - if (set -C; echo "$now" >"$lockfile") 2>/dev/null; then - return 0 - fi - local prev diff - if prev="$(<"$lockfile")"; then - diff="$(($now - $prev))" - if [ "$diff" -gt "$max_hours" ]; then - echo stale - else - echo locked - fi - elif [ -f "$lockfile" ]; then - echo retry - fi - return 1 -} -function pidfile_set() { - local eoo pidfile pid=$$ replace= - while [ -n "$1" ]; do - case "$1" in - -p) - shift - pid="$1" - ;; - -r) - replace=1 - ;; - --) - shift - eoo=1 - ;; - *) - eoo=1 - ;; - esac - [ -n "$eoo" ] && break - shift - done - - pidfile="$1" - [ -n "$pidfile" ] || return 10 - - if [ -f "$pidfile" ]; then - local curpid="$(<"$pidfile")" - if is_running "$curpid"; then - return 1 - elif [ -n "$replace" ]; then - /bin/rm -f "$pidfile" || return 10 - else - return 2 - fi - fi - - echo_ "$pid" >"$pidfile" || return 10 - autoclean "$pidfile" - return 0 -} -function pidfile_check() { - local pidfile="$1" - [ -n "$pidfile" ] || return 10 - - if [ -f "$pidfile" ]; then - [ -r "$pidfile" ] || return 10 - local pid="$(<"$pidfile")" - is_running "$pid" && return 0 - fi - return 1 -} -function page_maybe() { - if isatty; then - less -XF "$@" - else - cat - fi -} - - -function utools_local() { - local arg - [ $# -gt 0 ] || set -- opts verbosity interaction - for arg in "$@"; do - case "$arg" in - parse_opts|opts|o|args) echo "local -a args";; - verbosity|v) echo "local __verbosity='$__verbosity'";; - interaction|i) echo "local __interaction='$__interaction'";; - esac - done -} - -function isatty() { - tty -s <&1 -} -function in_isatty() { - tty -s -} -function out_isatty() { - tty -s <&1 -} -function err_isatty() { - tty -s <&2 -} -function die() { [ $# -gt 0 ] && eerror "$@"; exit 1; } -function exit_with { if [ $# -gt 0 ]; then "$@"; fi; exit $?; } -function die_with { [ $# -gt 0 ] && eerror "$1"; shift; [ $# -gt 0 ] && "$@"; exit 1; } -function die_unless() { - local count=$# - if [ $count -eq 0 ]; then - exit 1 - elif [ $count -eq 1 ]; then - "$@" || exit $? - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - : - else - r=$? - eerror "$m" - exit $r - fi - fi -} -function eerror_unless() { - local count=$# - if [ $count -eq 0 ]; then - return 1 - elif [ $count -eq 1 ]; then - "$@" || return $? - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - : - else - r=$? - eerror "$m" - return $r - fi - fi -} -function die_if() { - local count=$# - if [ $count -eq 0 ]; then - : - elif [ $count -eq 1 ]; then - "$@" && exit 1 - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - eerror "$m" - exit 1 - fi - fi -} -function eerror_if() { - local count=$# - if [ $count -eq 0 ]; then - : - elif [ $count -eq 1 ]; then - "$@" && return 1 - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - eerror "$m" - return 1 - fi - fi -} - -TAB=$'\t' -LATIN1=iso-8859-1 -LATIN9=iso-8859-15 -UTF8=utf-8 -OENC="$UTF8" - -if ! progexists iconv; then - function iconv() { cat; } -fi - -function __lang_encoding() { - local lang="$(<<<"$LANG" awk '{ print tolower($0) }')" - case "$lang" in - *@euro) echo "iso-8859-15";; - *.utf-8|*.utf8) echo "utf-8";; - *) echo "iso-8859-1";; - esac -} -function __norm_encoding() { - awk '{ - enc = tolower($0) - gsub(/^latin$/, "latin1", enc) - gsub(/^latin1$/, "iso-8859-1", enc) - gsub(/^latin9$/, "iso-8859-15", enc) - gsub(/[-_]/, "", enc) - if (enc == "iso8859" || enc == "iso88591" || enc == "8859" || enc == "88591") print "iso-8859-1" - else if (enc == "iso885915" || enc == "885915") print "iso-8859-15" - else if (enc == "utf" || enc == "utf8") print "utf-8" - else print $0 - }' <<<"$1" -} -function __init_encoding() { - local DEFAULT_ENCODING="$(__lang_encoding)" - [ -n "$DEFAULT_ENCODING" ] || DEFAULT_ENCODING=utf-8 - [ -n "$UTOOLS_OUTPUT_ENCODING" ] || UTOOLS_OUTPUT_ENCODING="$DEFAULT_ENCODING" - UTOOLS_OUTPUT_ENCODING="$(__norm_encoding "$UTOOLS_OUTPUT_ENCODING")" - [ -n "$UTOOLS_INPUT_ENCODING" ] || UTOOLS_INPUT_ENCODING="$UTOOLS_OUTPUT_ENCODING" - UTOOLS_INPUT_ENCODING="$(__norm_encoding "$UTOOLS_INPUT_ENCODING")" - [ -n "$UTOOLS_EDITOR_ENCODING" ] || UTOOLS_EDITOR_ENCODING="$UTOOLS_INPUT_ENCODING" - UTOOLS_EDITOR_ENCODING="$(__norm_encoding "$UTOOLS_EDITOR_ENCODING")" - - IENC="$UTOOLS_INPUT_ENCODING" - OENC="$UTOOLS_OUTPUT_ENCODING" -} - -if [ -n "$UTOOLS_LANG" -a -z "$LANG" ]; then - export UTOOLS_LANG - export LANG="$UTOOLS_LANG" -fi -__init_encoding - -function tooenc() { - local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - rawecho "$src" - else - iconv -f "$from" -t "$to" <<<"$src" - fi -} -function uecho() { - tooenc "$*" -} -function tooenc_() { - local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - rawecho_ "$src" - else - rawecho_ "$src" | iconv -f "$from" -t "$to" - fi -} -function uecho_() { - tooenc_ "$*" -} -function toienc() { - local __tie_var="$1" __tie_to="${2:-$IENC}" __tie_from="${3:-$UTOOLS_INPUT_ENCODING}" - if [ "$__tie_from" != "$__tie_to" ]; then - set_var "$__tie_var" "$(iconv -f "$__tie_from" -t "$__tie_to" <<<"${!__tie_var}")" - fi -} -function uread() { - [ $# -gt 0 ] || set -- REPLY - local __r_var - read "$@" - for __r_var in "$@"; do - [ -z "$__r_var" -o "${__r_var:0:1}" == "-" ] && continue # ignorer les options - toienc "$__r_var" - done -} - -function stooenc() { - local from="${1:-$OENC}" to="${2:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - cat - else - iconv -f "$from" -t "$to" - fi -} -function stoienc() { - local to="${1:-$IENC}" from="${2:-$UTOOLS_INPUT_ENCODING}" - if [ "$from" == "$to" ]; then - cat - else - iconv -f "$from" -t "$to" - fi -} - -export UTOOLS_EDATE -function __edate() { [ -n "$UTOOLS_EDATE" ] && date +"[%d/%m/%Y-%H:%M:%S] "; } - -export UTOOLS_ELOG_OVERWRITE -function __set_no_colors() { :; } -function elogto() { - UTOOLS_EDATE=1 - if [ -n "$1" -a -n "$2" ]; then - LANG=fr_FR.UTF8 - UTOOLS_OUTPUT_ENCODING="$UTF8" - __set_no_colors 1 - if [ -n "$UTOOLS_ELOG_OVERWRITE" ]; then - exec >"$1" 2>"$2" - else - exec >>"$1" 2>>"$2" - fi - elif [ -n "$1" ]; then - LANG=fr_FR.UTF8 - UTOOLS_OUTPUT_ENCODING="$UTF8" - __set_no_colors 1 - if [ -n "$UTOOLS_ELOG_OVERWRITE" ]; then - exec >"$1" 2>&1 - else - exec >>"$1" 2>&1 - fi - fi -} - -export __estack __tlevel -function __indent() { - if [ "${1/ -/}" != "$1" ]; then - sed "2,\$s/^/${__tlevel}/g" <<<"$1" - else - rawecho "$1" - fi -} -function __eerror() { tooenc "$(__edate)${__tlevel}* error: $(__indent "$1")"; } -function __ewarn() { tooenc "$(__edate)${__tlevel}* warning: $(__indent "$1")"; } -function __enote() { tooenc "$(__edate)${__tlevel}* note: $(__indent "$1")"; } -function __ebanner() { - local maxi="${COLUMNS:-80}" - local -a lines - local psfix line - - psfix="$(__edate)${__tlevel}" - while [ ${#psfix} -lt $maxi ]; do psfix="$psfix="; done - - tooenc "$psfix" - maxi=$(($maxi - 1)) - array_from_xlines lines "$1" - for line in "" "${lines[@]}" ""; do - line="$(__edate)${__tlevel}= $line" - if [ ${#line} -le $maxi ]; then - while [ ${#line} -lt $maxi ]; do line="$line "; done - line="$line=" - fi - tooenc "$line" - done - tooenc "$psfix" -} -function __eimportant() { tooenc "$(__edate)${__tlevel}* important: $(__indent "$1")"; } -function __eattention() { tooenc "$(__edate)${__tlevel}* attention: $(__indent "$1")"; } -function __einfo() { tooenc "$(__edate)${__tlevel}* info: $(__indent "$1")"; } -function __eecho() { tooenc "$(__edate)${__tlevel}$(__indent "$1")"; } -function __eecho_() { tooenc_ "$(__edate)${__tlevel}$(__indent "$1")"; } -function __edebug() { tooenc "$(__edate)${__tlevel}* debug: $(__indent "$1")"; } -function __estep() { tooenc "$(__edate)${__tlevel}* $(__indent "$1")"; } -function __estepe() { __estep "$@"; } -function __estepw() { __estep "$@"; } -function __estepn() { __estep "$@"; } -function __estepi() { __estep "$@"; } -function __estep_() { tooenc_ "$(__edate)${__tlevel}* $(__indent "$1")"; } -function __estepe_() { __estep_ "$@"; } -function __estepw_() { __estep_ "$@"; } -function __estepn_() { __estep_ "$@"; } -function __estepi_() { __estep_ "$@"; } -function __etitle() { tooenc "$(__edate)${__tlevel}+++ $(__indent "$1")"; } -function __ebegin() { tooenc_ "$(__edate)${__tlevel}* $(__indent "$1"): "; } -function __edoto() { echo_ "."; } -function __edotw() { echo_ "w"; } -function __edotx() { echo_ "x"; } -function __edotp() { echo_ "+"; } -function __edotd() { tooenc "($1)"; } -function __eendo() { echo "[ok]"; } -function __eendx() { echo "[error]"; } -PRETTYOPTS=() -function set_verbosity() { :;} -function set_interaction() { :;} -function show_error() { - return 0 -} -function show_warn() { - return 0 -} -function show_info() { - return 0 -} -function show_verbose() { - return 0 -} -function show_debug() { - [ -n "$DEBUG" ] -} -function check_verbosity() { - return 0 -} -function get_verbosity_option() { :;} -function check_interaction() { - return 0 -} -function is_interaction() { - return 1 -} -function get_interaction_option() { :;} -__epending= -function eflush() { - if [ -n "$__epending" ]; then rawecho "$__epending" 1>&2; __epending=; fi -} -function eclearp() { - __epending= -} -function eerror() { - show_error || return; eflush; __eerror "$*" 1>&2 -} -function ewarn() { - show_warn || return; eflush; __ewarn "$*" 1>&2 -} -function enote() { - show_info || return; eflush; __enote "$*" 1>&2 -} -function ebanner() { - show_error || return; eflush; __ebanner "$*" 1>&2; sleep 5 -} -function eimportant() { - show_error || return; eflush; __eimportant "$*" 1>&2 -} -function eattention() { - show_warn || return; eflush; __eattention "$*" 1>&2 -} -function einfo() { - show_info || return; eflush; __einfo "$*" 1>&2 -} -function eecho() { - show_info || return; eflush; __eecho "$*" 1>&2 -} -function eecho_() { - show_info || return; eflush; __eecho_ "$*" 1>&2 -} -function edebug() { - show_debug || return; eflush; __edebug "$*" 1>&2 -} -function trace() { - local r cmd="$(quoted_args "$@")" - show_info && { eflush; __eecho "\$ $cmd" 1>&2; } - "$@"; r=$? - if [ $r -ne 0 ]; then - if show_info; then - eflush; __eecho "^ [EC #$r]" 1>&2 - elif show_error; then - eflush; __eecho "^ $cmd [EC #$r]" 1>&2; - fi - fi - return $r -} -function trace_error() { - local r - "$@"; r=$? - if [ $r -ne 0 ]; then - local cmd="$(quoted_args "$@")" - show_error && { eflush; __eecho "^ $cmd [EC #$r]" 1>&2; } - fi - return $r -} - -function etitle() { - local __t_deferred= - __t_etitle "$@" -} -function etitled() { - local __t_deferred=1 - __t_etitle "$@" -} -function __t_etitle() { - local __t_eend=default - local __t_clearp= - while [ -n "$1" ]; do - if [ "$1" == "--" ]; then - shift - break - elif [ "$1" == "-s" ]; then - __t_eend= - shift - elif [ "$1" == "--eend" ]; then - __t_eend=1 - shift - elif [ "$1" == "-p" ]; then - __t_clearp=1 - shift - else - break - fi - done - local __t_title="$1"; shift - local __t_s=0 - [ -n "$__estack" ] && __tlevel="${__tlevel} " - __estack="$__estack:t" - if show_info; then - if [ -n "$__t_deferred" ]; then - __epending="${__epending:+$__epending -}$(__etitle "$__t_title")" - else - eflush - __etitle "$__t_title" 1>&2 - fi - fi - if [ $# -gt 0 ]; then - "$@" - __t_s=$? - [ "$__t_eend" == "default" ] && __t_eend=1 - fi - [ "$__t_eend" == "default" ] && __t_eend= - if [ -n "$__t_eend" ]; then - eend $__t_s - [ -n "$__t_clearp" ] && eclearp - fi - return $__t_s -} -function estep() { - show_info || return; eflush; __estep "$*" 1>&2 -} -function estepe() { - show_info || return; eflush; __estepe "$*" 1>&2 -} -function estepw() { - show_info || return; eflush; __estepw "$*" 1>&2 -} -function estepn() { - show_info || return; eflush; __estepn "$*" 1>&2 -} -function estepi() { - show_info || return; eflush; __estepi "$*" 1>&2 -} -function estep_() { - show_info || return; eflush; __estep_ "$*" 1>&2 -} -function estepe_() { - show_info || return; eflush; __estepe_ "$*" 1>&2 -} -function estepw_() { - show_info || return; eflush; __estepw_ "$*" 1>&2 -} -function estepn_() { - show_info || return; eflush; __estepn_ "$*" 1>&2 -} -function estepi_() { - show_info || return; eflush; __estepi_ "$*" 1>&2 -} -function ebegin() { - local __b_eend=default - while [ -n "$1" ]; do - if [ "$1" == "--" ]; then - shift - break - elif [ "$1" == "-s" ]; then - __b_eend= - shift - elif [ "$1" == "--eend" ]; then - __b_eend=1 - shift - else - break - fi - done - local __b_msg="$1"; shift - local __b_s=0 - __estack="$__estack:b" - if show_info; then - eflush - __ebegin "$__b_msg" 1>&2 - fi - if [ $# -gt 0 ]; then - "$@" - __b_s=$? - [ "$__b_eend" == "default" ] && __b_eend=1 - fi - [ "$__b_eend" == "default" ] && __b_eend= - [ -n "$__b_eend" ] && eend $__b_s - return $__b_s -} -function edot() { - local s=$? - show_info || return - eflush - [ -n "$1" ] && s="$1" - shift - if [ "$s" == "0" ]; then - __edoto 1>&2 - else - __edotx 1>&2 - fi - show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2 - return $s -} -function edotw() { - local s=$? - show_info || return - eflush - [ -n "$1" ] && s="$1" - shift - __edotw 1>&2 - show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2 - return $s -} -function ewait() { - [ -n "$1" ] || return 1 - if show_info; then - local count=2 - eflush - little_sleep # certains processus retournent tout de suite - while is_running "$1"; do - sleep 1 - if [ $count -gt 0 ]; then - count=$(($count - 1)) - else - __edotp 1>&2 - fi - done - __edoto 1>&2 - else - wait "$1" - fi -} -function eend() { - local s=$? - if [ "$1" == "-c" ]; then - __estack= - __tlevel= - elif [ "${__estack%:b}" != "$__estack" ]; then - __estack="${__estack%:b}" - show_info || return - eflush - [ -n "$1" ] && s="$1" - if [ "$s" == "0" ]; then - __eendo 1>&2 - else - __eendx 1>&2 - fi - elif [ "${__estack%:t}" != "$__estack" ]; then - __estack="${__estack%:t}" - __tlevel="${__tlevel% }" - fi -} -function ask_yesno() { - local interactive=1 - if [[ "$1" == -* ]]; then - if [ "$1" != -- ]; then - check_interaction "$1" || interactive= - fi - shift - else - check_interaction -c || interactive= - fi - local default="${2:-N}" - if [ "$default" == "C" ]; then - [ -n "$interactive" ] && default=N || default=O - elif [ "$default" == "X" ]; then - [ -n "$interactive" ] && default=O || default=N - fi - if [ -n "$interactive" ]; then - eflush - local message="$1" - local prompt="[oN]" - local r - is_yes "$default" && prompt="[On]" - if [ -n "$message" ]; then - tooenc_ "$message" 1>&2 - else - tooenc_ "Voulez-vous continuer?" "$UTF8" 1>&2 - fi - tooenc_ " $prompt " "$UTF8" 1>&2 - uread r - is_yes "${r:-$default}" - else - is_yes "$default" - fi -} -function read_value() { - local -a __rv_opts __rv_readline=1 __rv_showdef=1 __rv_nl= - __rv_opts=() - [ -n "$UTOOLS_NO_READLINE" ] && __rv_readline= - __rv_read "$@" -} -function read_password() { - local -a __rv_opts __rv_readline= __rv_showdef= __rv_nl=1 - __rv_opts=(-s) - __rv_read "$@" -} -function __rv_read() { - local __rv_int=1 - if [[ "$1" == -* ]]; then - if [ "$1" != -- ]; then - check_interaction "$1" || __rv_int= - fi - shift - else - check_interaction -c || __rv_int= - fi - local __rv_msg="$1" __rv_v="${2:-value}" __rv_d="$3" __rv_re="${4:-O}" - if [ -z "$__rv_int" ]; then - if is_yes "$__rv_re" && [ -z "$__rv_d" ]; then - OENC="$UTF8" eerror "La valeur par défaut de $__rv_v doit être non vide" - return 1 - fi - set_var "$__rv_v" "$__rv_d" - return 0 - fi - - eflush - local __rv_r - while true; do - if [ -n "$__rv_msg" ]; then - tooenc_ "$__rv_msg" 1>&2 - else - tooenc_ "Entrez la valeur" "$UTF8" 1>&2 - fi - if [ -n "$__rv_readline" ]; then - tooenc_ ": " "$UTF8" 1>&2 - uread -e ${__rv_d:+-i"$__rv_d"} "${__rv_opts[@]}" __rv_r - else - if [ -n "$__rv_d" ]; then - if [ -n "$__rv_showdef" ]; then - tooenc_ " [$__rv_d]" 1>&2 - else - tooenc_ " [****]" 1>&2 - fi - fi - tooenc_ ": " "$UTF8" 1>&2 - uread "${__rv_opts[@]}" __rv_r - [ -n "$__rv_nl" ] && echo - fi - __rv_r="${__rv_r:-$__rv_d}" - if [ -n "$__rv_r" ] || ! is_yes "$__rv_re"; then - set_var "$__rv_v" "$__rv_r" - return 0 - fi - done -} -function simple_menu() { - local __sm_title= __sm_yourchoice= __sm_default= - local -a __sm_args - parse_opts -t: __sm_title= -m: __sm_yourchoice= -d: __sm_default= @ __sm_args -- "$@" && - set -- "${__sm_args[@]}" || ewarn "$__sm_args" - - local __sm_option_var="${1:-option}" __sm_options_var="${2:-options}" - local __sm_option __sm_options - __sm_options="$__sm_options_var[*]" - if [ -z "${!__sm_options}" ]; then - OENC="$UTF8" eerror "Le tableau $__sm_options_var doit être non vide" - return 1 - fi - [ -z "$__sm_default" ] && __sm_default="${!__sm_option_var}" - - eflush - array_copy __sm_options "$__sm_options_var" - local __sm_c=0 __sm_i __sm_choice - while true; do - if [ "$__sm_c" == "0" ]; then - [ -n "$__sm_title" ] && tooenc "=== $__sm_title ===" 1>&2 - __sm_i=1 - for __sm_option in "${__sm_options[@]}"; do - if [ "$__sm_option" == "$__sm_default" ]; then - tooenc "$__sm_i*- $__sm_option" 1>&2 - else - tooenc "$__sm_i - $__sm_option" 1>&2 - fi - let __sm_i=$__sm_i+1 - done - fi - - if [ -n "$__sm_yourchoice" ]; then - tooenc_ "$__sm_yourchoice" 1>&2 - else - tooenc_ "Entrez le numéro de l'option choisie" "$UTF8" 1>&2 - fi - tooenc_ ": " "$UTF8" 1>&2 - uread __sm_choice - - if [ -z "$__sm_choice" -a -n "$__sm_default" ]; then - __sm_option="$__sm_default" - break - fi - if [ -n "$__sm_choice" -a -z "${__sm_choice//[0-9]/}" ]; then - if [ "$__sm_choice" -gt 0 -a "$__sm_choice" -le "${#__sm_options[*]}" ]; then - __sm_option="${__sm_options[$(($__sm_choice - 1))]}" - break - else - OENC="$UTF8" eerror "Numéro d'option incorrect" - fi - else - OENC="$UTF8" eerror "Vous devez saisir le numéro de l'option choisie" - fi - - let __sm_c=$__sm_c+1 - if [ "$__sm_c" -eq 5 ]; then - tooenc "" "$UTF8" 1>&2 - __sm_c=0 - fi - done - set_var "$__sm_option_var" "$__sm_option" -} - -function actions_menu() { - local -a __am_action_descs __am_options __am_void_actions - local __am_tmp __am_select_action __am_select_option __am_title __am_optyc __am_actyc - local __am_default_action=auto __am_quit_action=auto - local __am_default_option= - local -a __am_args - parse_opts \ - -t: __am_title= \ - -m: __am_optyc= \ - -M: __am_actyc= \ - -e: __am_void_actions \ - -d: __am_default_action= \ - -q: __am_quit_action= \ - -o: __am_default_option= \ - @ __am_args -- "$@" && set -- "${__am_args[@]}" || { eerror "$__am_args"; return 1; } - - __am_tmp="${1:-action}"; __am_select_action="${!__am_tmp}" - __am_tmp="${2:-option}"; __am_select_option="${!__am_tmp}" - [ -n "$__am_default_option" ] && __am_select_option="$__am_default_option" - array_copy __am_action_descs "${3:-actions}" - array_copy __am_options "${4:-options}" - - eerror_unless [ ${#__am_action_descs[*]} -gt 0 ] "Vous devez spécifier le tableau des actions" || return - __actions_menu || return 1 - setv "${1:-action}" "$__am_select_action" - setv "${2:-option}" "$__am_select_option" -} -function __actions_menu() { - local title="$__am_title" - local optyc="$__am_optyc" actyc="$__am_actyc" - local default_action="$__am_default_action" - local quit_action="$__am_quit_action" - local select_action="$__am_select_action" - local select_option="$__am_select_option" - local -a action_descs options void_actions - array_copy action_descs __am_action_descs - array_copy options __am_options - array_copy void_actions __am_void_actions - - local no_options - array_isempty options && no_options=1 - - local -a actions - local tmp action name - for tmp in "${action_descs[@]}"; do - splitfsep2 "$tmp" : action name - [ -n "$action" ] || action="${name:0:1}" - action="$(strlower "$action")" - array_addu actions "$action" - done - - if [ "$default_action" == auto ]; then - default_action="$select_action" - if [ -n "$default_action" ]; then - array_contains actions "$default_action" || default_action= - fi - [ -n "$default_action" ] || default_action="${actions[0]}" - fi - default_action="${default_action:0:1}" - default_action="$(strlower "$default_action")" - - if [ "$quit_action" == auto ]; then - if [ ${#actions[*]} -gt 1 ]; then - quit_action="${actions[@]:$((-1)):1}" - array_addu void_actions "$quit_action" - fi - fi - quit_action="${quit_action:0:1}" - quit_action="$(strlower "$quit_action")" - - local action_title - for tmp in "${action_descs[@]}"; do - splitfsep2 "$tmp" : action name - [ -n "$action" ] || action="${name:0:1}" - [ -n "$name" ] || name="$action" - action="$(strlower "$action")" - if [ -n "$no_options" ]; then - if ! array_contains void_actions "$action"; then - array_del actions "$action" - continue - fi - fi - [ "$action" == "$default_action" ] && name="$name*" - action_title="${action_title:+$action_title/}$name" - done - if [ -n "$default_action" ]; then - array_contains actions "$default_action" || default_action= - fi - if [ -n "$quit_action" ]; then - array_contains actions "$quit_action" || quit_action= - fi - - if [ -n "$no_options" ]; then - if array_isempty void_actions; then - eerror "Aucune option n'est définie. Il faut définir le tableau des actions vides" - return 1 - fi - __void_actions_menu - else - __options_actions_menu - fi -} -function __void_actions_menu() { - eflush - local c=0 choice - while true; do - if [ $c -eq 0 ]; then - [ -n "$title" ] && __etitle "$title" 1>&2 - __eecho_ "=== Actions disponibles: " 1>&2 - tooenc "$action_title" 1>&2 - fi - if [ -n "$actyc" ]; then - __eecho_ "$actyc" 1>&2 - elif [ -n "$optyc" ]; then - __eecho_ "$optyc" 1>&2 - else - __eecho_ "Entrez l'action à effectuer" 1>&2 - fi - tooenc_ ": " 1>&2 - uread choice - if [ -z "$choice" -a -n "$default_action" ]; then - select_action="$default_action" - break - fi - - choice="${choice:0:1}" - choice="$(strlower "$choice")" - if array_contains actions "$choice"; then - select_action="$choice" - break - elif [ -n "$choice" ]; then - eerror "$choice: action incorrecte" - else - eerror "vous devez saisir l'action à effectuer" - fi - let c=$c+1 - if [ $c -eq 5 ]; then - tooenc "" 1>&2 - c=0 - fi - done - __am_select_action="$select_action" - __am_select_option= -} -function __options_actions_menu() { - eflush - local c=0 option choice action option - while true; do - if [ $c -eq 0 ]; then - [ -n "$title" ] && __etitle "$title" 1>&2 - i=1 - for option in "${options[@]}"; do - if [ "$option" == "$select_option" ]; then - tooenc "$i*- $option" 1>&2 - else - tooenc "$i - $option" 1>&2 - fi - let i=$i+1 - done - __estepn_ "Actions disponibles: " 1>&2 - tooenc "$action_title" 1>&2 - fi - if [ -n "$optyc" ]; then - __eecho_ "$optyc" 1>&2 - else - __eecho_ "Entrez l'action et le numéro de l'option choisie" 1>&2 - fi - tooenc_ ": " 1>&2 - uread choice - - if [ -z "$choice" -a -n "$default_action" ]; then - action="$default_action" - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - elif [ -n "$select_option" ]; then - select_action="$action" - break - fi - fi - action="${choice:0:1}" - action="$(strlower "$action")" - if array_contains actions "$action"; then - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - else - option="${choice:1}" - option="${option// /}" - if [ -z "$option" -a -n "$select_option" ]; then - select_action="$action" - break - elif [ -z "$option" ]; then - eerror "vous devez saisir le numéro de l'option" - elif isnum "$option"; then - if [ $option -gt 0 -a $option -le ${#options[*]} ]; then - select_action="$action" - select_option="${options[$(($option - 1))]}" - break - fi - else - eerror "$option: numéro d'option incorrecte" - fi - fi - elif isnum "$choice"; then - action="$default_action" - if [ -n "$action" ]; then - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - else - option="${choice// /}" - if [ -z "$option" ]; then - eerror "vous devez saisir le numéro de l'option" - elif isnum "$option"; then - if [ $option -gt 0 -a $option -le ${#options[*]} ]; then - select_action="$action" - select_option="${options[$(($option - 1))]}" - break - fi - else - eerror "$option: numéro d'option incorrecte" - fi - fi - else - eerror "Vous devez spécifier l'action à effectuer" - fi - elif [ -n "$choice" ]; then - eerror "$choice: action et/ou option incorrecte" - else - eerror "vous devez saisir l'action à effectuer" - fi - let c=$c+1 - if [ $c -eq 5 ]; then - tooenc "" 1>&2 - c=0 - fi - done - __am_select_action="$select_action" - __am_select_option="$select_option" -} - - -function __ac_forgetall() { __ac_files=(); } -__ac_forgetall -function __ac_trap() { - local file - for file in "${__ac_files[@]}"; do - [ -e "$file" ] && rm -rf "$file" 2>/dev/null - done - __ac_forgetall -} -trap __ac_trap 1 3 15 EXIT -function autoclean() { - local file - for file in "$@"; do - [ -n "$file" ] && array_add __ac_files "$file" - done -} -function ac_cleanall() { - __ac_trap -} -function ac_clean() { - local file - for file in "$@"; do - if array_contains __ac_files "$file"; then - [ -e "$file" ] && rm -rf "$file" 2>/dev/null - array_del __ac_files "$file" - fi - done -} -function ac_set_tmpfile() { - local __acst_d - if show_debug; then - if [ -n "$5" ]; then - is_yes "${!5}" && __acst_d=1 - else - __acst_d=1 - fi - fi - if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" - [ -f "$3" -a "$4" == keep ] || >"$3" - else - local __acst_t="$(mktempf "$2")" - autoclean "$__acst_t" - set_var "$1" "$__acst_t" - fi -} -function ac_set_tmpdir() { - local __acst_d - if show_debug; then - if [ -n "$4" ]; then - is_yes "${!4}" && __acst_d=1 - else - __acst_d=1 - fi - fi - if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" - mkdir -p "$3" - else - local __acst_t="$(mktempd "$2")" - autoclean "$__acst_t" - set_var "$1" "$__acst_t" - fi -} -function debug_tee() { - if show_debug; then - tee "$@" - else - cat - fi -} - - -function get_defaults_files() { - local __gd_dest="${1:-defaults}"; shift - local -a __gd_fs - local __gd_f __gd_found - for __gd_f in "$@"; do - __gd_found= - if [ -r "/etc/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "/etc/default/$__gd_f") - __gd_found=1 - fi - if [ -r "$HOME/etc/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "$HOME/etc/default/$__gd_f") - __gd_found=1 - fi - if [ -z "$__gd_found" -a -r "$scriptdir/lib/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "$scriptdir/lib/default/$__gd_f") - fi - done - array_copy "$__gd_dest" __gd_fs -} - -function set_defaults() { - local -a __sd_fs - local __sd_f - get_defaults_files __sd_fs "$@" - for __sd_f in "${__sd_fs[@]}"; do - source "$__sd_f" - done -} - - -: "${MYHOST:=$HOSTNAME}" -: "${MYHOSTNAME:=${MYHOST%%.*}}" -export MYHOST MYHOSTNAME - -function myhost() { - hostname -f 2>/dev/null || echo "$MYHOST" -} -function myhostname() { - hostname -s 2>/dev/null || echo "$MYHOSTNAME" -} -##@inc]base -uprovide base.tools -urequire base - -function base_umove() { - local -a args - local updatedir - args=(-d:,--updatedir: .) - parse_args_check "$@" || return; set -- "${args[@]}" - - eerror_unless [ -z "$updatedir" -o -d "$updatedir" ] "$updatedir: doit être un répertoire" || return - eerror_if [ $# -eq 0 ] "Vous devez spécifier les fichiers à déplacer" || return - eerror_if [ $# -eq 1 ] "Vous devez spécifier la destination" || return - - local -a srcs - local dest - - srcs=("$@") - setx dest=last_value srcs - array_del_last srcs - - if [ $# -eq 2 ]; then - if [ -d "$dest" ]; then - : # ce cas sera traité ci-dessous - elif [ -e "$dest" ]; then - eerror "$dest: refus d'écraser la destination" - return 1 - else - src="${srcs[0]}" - if [ -n "$updatedir" ]; then - if [ -L "$src" ]; then - ldest="$(readlinka "$src")" - array_find_links update_links "$ldest" "$updatedir" - else - array_find_links update_links "$src" "$updatedir" - fi - move_file "$src" "$dest" "${update_links[@]}" - else - move_link "$src" "$dest" - fi - return $? - fi - fi - - [ -d "$dest" ] || { - eerror "$dest: doit être un répertoire" - return 1 - } - for src in "${srcs[@]}"; do - if [ -n "$updatedir" ]; then - if [ -L "$src" ]; then - move_link "$src" "$dest" - else - array_find_links update_links "$src" "$updatedir" - move_file "$src" "$dest" "${update_links[@]}" - fi - else - move_link "$src" "$dest" - fi - done -} -##@inc]base.tools -##@inc[base.compat -## Fonctions de base: support des fonctions obsolètes et des versions de bash < 4.x -##@inc[base.core -## Fonctions de base: fondement -uprovide base.core - -function echo_() { - echo -n "$*" -} -function recho() { - if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - - local first="${1:1}"; shift - echo "$first$@" - else - echo "$@" - fi -} -function recho_() { - if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - - local first="${1:1}"; shift - echo -n "$first$@" - else - echo -n "$@" - fi -} -function _qval() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s//\$/\\\$}" - s="${s//\`/\\\`}" - recho_ "$s" -} -function should_quote() { - local l="${#1}" - [ $l -eq 0 -o $l -gt 80 ] && return 0 - local s="${*//[a-zA-Z0-9]/}" - s="${s//,/}" - s="${s//./}" - s="${s//+/}" - s="${s//\//}" - s="${s//-/}" - s="${s//_/}" - s="${s//=/}" - [ -n "$s" ] -} -function qval() { - echo -n \" - _qval "$@" - echo \" -} -function qvalm() { - if should_quote "$*"; then - echo -n \" - _qval "$@" - echo \" - else - recho "$*" - fi -} -function qvalr() { - if [ -z "$*" ]; then - : - elif should_quote "$*"; then - echo -n \" - _qval "$@" - echo \" - else - recho "$*" - fi -} -function qvals() { - local arg first=1 - for arg in "$@"; do - [ -z "$first" ] && echo -n " " - if should_quote "$arg"; then - echo -n \" - _qval "$arg" - echo -n \" - else - recho_ "$arg" - fi - first= - done - [ -z "$first" ] && echo -} -function qwc() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s//\$/\\\$}" - s="${s//\`/\\\`}" - local r a b - while [ -n "$s" ]; do - if [[ "$s" == *\** ]]; then - if [[ "$s" == *\?* ]]; then - a="${s%%\**}" - b="${s%%\?*}" - if [ ${#a} -lt ${#b} ]; then - s="${s#*\*}" - r="$r\"$a\"*" - else - s="${s#*\?}" - r="$r\"$b\"?" - fi - else - a="${s%%\**}" - s="${s#*\*}" - r="$r\"$a\"*" - fi - elif [[ "$s" == *\?* ]]; then - if [[ "$s" == *\** ]]; then - a="${s%%\**}" - b="${s%%\?*}" - if [ ${#a} -lt ${#b} ]; then - s="${s#*\*}" - r="$r\"$a\"*" - else - s="${s#*\?}" - r="$r\"$b\"?" - fi - else - a="${s%%\?*}" - s="${s#*\?}" - r="$r\"$a\"?" - fi - else - r="$r\"$s\"" - break - fi - done - recho_ "$r" -} -function qlines() { - sed "s/'/'\\\\''/g; s/.*/'&'/g" -} -function setv() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - eval "$__s_var=\"\$*\"" -} -function _setv() { - local __s_var="$1"; shift - eval "$__s_var=\"\$*\"" -} -function echo_setv() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - echo "$__s_var=$(qvalr "$*")" -} -function setx() { - if [ "$1" == -a ]; then - shift - local __s_array="$1"; shift - if [[ "$__s_array" == *=* ]]; then - set -- "${__s_array#*=}" "$@" - __s_array="${__s_array%%=*}" - fi - eval "$__s_array=($("$@" | qlines))" - else - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - eval "$__s_var="'"$("$@")"' - fi -} -function _setvx() { - local __s_var="$1"; shift - eval "$__s_var="'"$("$@")"' -} -function _setax() { - local __s_array="$1"; shift - eval "$__s_array=($("$@" | qlines))" -} -function evalx() { - local __e_val __e_arg __e_r=0 - local -a __e_cmd - - local __e_first=1 - while [ $# -gt 0 ]; do - __e_cmd=() - while [ $# -gt 0 ]; do - __e_arg="$1"; shift - [ "$__e_arg" == // ] && break - if [ "${__e_arg%//}" != "$__e_arg" ]; then - local __e_tmp="${__e_arg%//}" - if [ -z "${__e_tmp//\\/}" ]; then - __e_arg="${__e_arg#\\}" - __e_cmd=("${__e_cmd[@]}" "$__e_arg") - continue - fi - fi - __e_cmd=("${__e_cmd[@]}" "$__e_arg") - done - - if [ -n "$__e_first" ]; then - __e_val="$("${__e_cmd[@]}")" || __e_r=$? - else - __e_val="$("${__e_cmd[@]}" "$__e_val")" || __e_r=$? - fi - __e_first= - done - [ -n "$__e_val" ] && echo "$__e_val" - return $__e_r -} -function setxx() { - local -a __s_args - if [ "$1" == -a ]; then __s_args=(-a); shift; fi - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - __s_args=("${__s_args[@]}" "$__s_var") - setx "${__s_args[@]}" evalx "$@" -} -function evalp() { - local __e_arg __e_cmd - - while [ $# -gt 0 ]; do - __e_arg="$1"; shift - if [ "$__e_arg" == // ]; then - __e_cmd="$__e_cmd |" - continue - elif [ "${__e_arg%//}" != "$__e_arg" ]; then - local __e_tmp="${__e_arg%//}" - if [ -z "${__e_tmp//\\/}" ]; then - __e_arg="${__e_arg#\\}" - fi - fi - __e_cmd="${__e_cmd:+$__e_cmd }\"$(_qval "$__e_arg")\"" - done - eval "$__e_cmd" -} -function setxp() { - local -a __s_args - if [ "$1" == -a ]; then __s_args=(-a); shift; fi - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - __s_args=("${__s_args[@]}" "$__s_var") - setx "${__s_args[@]}" evalp "$@" -} -function testx() { - local __t_op="$1"; shift - local __t_val="$(evalx "$@")" - [ $__t_op "$__t_val" ] -} -function test2x() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalx "$@")" - [ "$__t_val1" $__t_op "$__t_val2" ] -} -function testrx() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalx "$@")" - eval '[[ "$__t_val1" '"$__t_op"' "$__t_val2" ]]' -} -function testp() { - local __t_op="$1"; shift - local __t_val="$(evalp "$@")" - [ $__t_op "$__t_val" ] -} -function test2p() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalp "$@")" - [ "$__t_val1" $__t_op "$__t_val2" ] -} -function testrp() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalp "$@")" - eval '[[ "$__t_val1" '"$__t_op"' "$__t_val2" ]]' -} - -function err2out() { - "$@" 2>&1 -} - -function is_defined() { - [ -n "$(declare -p "$1" 2>/dev/null)" ] -} -function is_array() { - case "$(declare -p "$1" 2>/dev/null)" in declare\ -a*) return 0;; esac - return 1 -} - -function upvar() { - if unset -v "$1"; then - if [ $# -eq 2 ]; then - eval "$1=\"\$2\"" - else - eval "$1=(\"\${@:2}\")" - fi - fi -} -function array_upvar() { - unset -v "$1" && eval "$1=(\"\${@:2}\")" -} -function upvars() { - while [ $# -gt 0 ]; do - case "$1" in - -a) - unset -v "$2" && eval "$2=(\"\${@:3}\")" - break - ;; - -a*) - unset -v "$2" && eval "$2=(\"\${@:3:${1#-a}}\")" - shift $((${1#-a} + 2)) || return 1 - ;; - *) - unset -v "$1" && eval "$1=\"\$2\"" - shift; shift - ;; - esac - done -} - -function __ab_process_pending() { - local -a values - case "$mode" in - cmd) values="$("${pending[@]}")";; - ssplit) eval "values=($("${pending[@]}"))";; - lsplit) eval "values=($("${pending[@]}" | qlines))";; - add) values=("${pending[@]}");; - esac - cmd=("${cmd[@]}" "${values[@]}") - pending=() -} -function array_buildcmd() { - local desta="$1"; shift; local "$desta" - local mode=add - local -a pending cmd - while [ $# -gt 0 ]; do - case "$1" in - ++c|++cmd|++) __ab_process_pending; mode=cmd;; - ++s|++ssplit) __ab_process_pending; mode=ssplit;; - ++l|++lsplit) __ab_process_pending; mode=lsplit;; - ++a|++add) __ab_process_pending; mode=add;; - *) pending=("${pending[@]}" "$1");; - esac - shift - done - __ab_process_pending - array_upvar "$desta" "${cmd[@]}" -} -function buildcmd() { - local -a args - array_buildcmd args "$@" - qvals "${args[@]}" -} -function evalcmd() { - local -a args - array_buildcmd args "$@" - "${args[@]}" -} -##@inc]base.core -##@inc[base.num -## Fonctions de base: gestion des valeurs numériques -uprovide base.num - -function isnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//[0-9]/}" - [ -z "$v" ] -} -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - [ -z "${1//[0-9]/}" ] -} -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//./}" - v="${v//,/}" - v="${v//[0-9]/}" - [ -z "$v" ] -} -##@inc]base.num -##@inc[base.bool -## Fonctions de base: valeurs booléennes -##@inc[base.num -## Fonctions de base: gestion des valeurs numériques -uprovide base.num - -function isnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//[0-9]/}" - [ -z "$v" ] -} -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - [ -z "${1//[0-9]/}" ] -} -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//./}" - v="${v//,/}" - v="${v//[0-9]/}" - [ -z "$v" ] -} -##@inc]base.num -uprovide base.bool -urequire base.num - -function is_yes() { - case "${1,,}" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - esac - isnum "$1" && [ "$1" -ne 0 ] && return 0 - return 1 -} -function is_no() { - case "${1,,}" in - n|non|no|f|faux|false|off) return 0;; - esac - isnum "$1" && [ "$1" -eq 0 ] && return 0 - return 1 -} -function yesval() { - is_yes "$1" && echo 1 -} - -function setb() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - local __s_r - if "$@" >/dev/null; then - eval "$__s_var=1" - else - __s_r=$? - eval "$__s_var=" - return $__s_r - fi -} -function _setb() { - local __s_var="$1"; shift - if "$@" >/dev/null; then - eval "$__s_var=1" - else - eval "$__s_var=" - fi -} - -function evalb() { - if evalx "$@" >/dev/null; then - echo 1 - else - return $? - fi -} -function setxb() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - setx "$__s_var" evalb "$@" -} -##@inc]base.bool -##@inc[base.quote -## Fonctions de base: protection de valeurs chaine -uprovide base.quote -urequire base.core - -function _qawk() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s// -/\\n}" - recho_ "$s" -} -function qawk() { - echo -n \" - _qawk "$@" - echo \" -} -function qseds() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\//\\/}" - s="${s// -/\\n}" - recho "$s" -} -function _qform() { - local s="$*" - s="${s//\%/%25}" - s="${s//+/%2B}" - s="${s//&/%26}" - s="${s//=/%3D}" - s="${s// /+}" - recho_ "$s" -} -function qform() { - local s="$*" - if [[ "$s" == *=* ]]; then - _qform "${s%%=*}" - echo -n = - _qform "${s#*=}" - echo - else - _qform "$s" - echo - fi -} -function _qsql() { - local q="'" qq="''" - echo "${*//$q/$qq}" -} -function qsql() { - local q="'" qq="''" - echo "'${*//$q/$qq}'" -} -##@inc]base.quote -uprovide base.compat -urequire base.core base.num base.bool base.quote - - -function setx2() { setxx "$@"; } -function rawecho() { recho "$@"; } -function rawecho_() { recho_ "$@"; } -function quote_arg() { _qval "$@"; } -function quoted_arg() { qvalm "$@"; } -function quoted_args() { qvals "$@"; } -function set_var() { setv "$@"; } -function set_var_cmd() { echo_setv "$@"; } -function set_var_literal() { eval "$1=$2"; } - -function quote_awk() { _qawk "$@"; } -function quoted_awk() { qawk "$@"; } -function quote_seds() { qseds "$@"; } -function quote_form() { _qform "$@"; } -function quoted_form() { qform "$@"; } - - -if [ -n "$BASH_VERSINFO" -a "${BASH_VERSINFO[0]}" -lt 4 ]; then - function strlower() { tr A-Z a-z <<<"$*"; } - function strlower1() { - local str="$*" - local h="${str:0:1}" r="${str:1}" - echo "$(tr A-Z a-z <<<"$h")$r" - } - function strlowers() { - local -a vs; local v - for v in "$@"; do - vs=("${vs[@]}" "$(strlower1 "$v")") - done - echo "${vs[*]}" - } - function strupper() { tr a-z A-Z <<<"$*"; } - function strupper1() { - local str="$*" - local h="${str:0:1}" r="${str:1}" - echo "$(tr a-z A-Z <<<"$h")$r" - } - function struppers() { - local -a vs; local v - for v in "$@"; do - vs=("${vs[@]}" "$(strupper1 "$v")") - done - echo "${vs[*]}" - } - - function is_yes() { - case "$1" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - O|OUI|Y|YES|V|VRAI|T|TRUE|ON) return 0;; - esac - isnum "$1" && [ "$1" -ne 0 ] && return 0 - case "$(strlower "$1")" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - esac - return 1 - } - function is_no() { - case "$1" in - n|non|no|f|faux|false|off) return 0;; - N|NON|NO|F|FAUX|FALSE|OFF) return 0;; - esac - isnum "$1" && [ "$1" -eq 0 ] && return 0 - case "$(strlower "$1")" in - n|non|no|f|faux|false|off) return 0;; - esac - return 1 - } -fi -##@inc]base.compat -uprovide base -urequire base.init base.core base.string base.num base.bool base.array base.quote base.split base.args base.tools base.compat - -UNAME_SYSTEM=`uname -s` -[ "${UNAME_SYSTEM#CYGWIN}" != "$UNAME_SYSTEM" ] && UNAME_SYSTEM=Cygwin -[ "${UNAME_SYSTEM#MINGW32}" != "$UNAME_SYSTEM" ] && UNAME_SYSTEM=Mingw -UNAME_MACHINE=`uname -m` -if [ -n "$UTOOLS_CHROOT" ]; then - [ -n "$UTOOLS_UNAME_SYSTEM" ] && eval "UNAME_SYSTEM=$UTOOLS_UNAME_SYSTEM" - [ -n "$UTOOLS_UNAME_MACHINE" ] && eval "UNAME_MACHINE=$UTOOLS_UNAME_MACHINE" -fi - -function setyesval() { - is_yes "$2" && set_var "$1" 1 || set_var "$1" "" -} -function normyesval() { - is_yes "${2:-"${!1}"}" && set_var "$1" 1 || set_var "$1" "" -} -function normyesvals() { - local __nyv_yesvar - for __nyv_yesvar in "$@"; do - is_yes "${!__nyv_yesvar}" && set_var "$__nyv_yesvar" 1 || set_var "$__nyv_yesvar" "" - done -} -function quote_in() { - sed 's/\\/\\\\/g -s/"/\\"/g -s/\$/\\$/g -s/`/\\`/g' -} -function quote_sin() { - sed "s/'/'\\\\''/g" -} -function quote_sarg() { - quote_sin <<<"$1" -} -function quoted_sarg() { - echo "'$(quote_sarg "$1")'" -} -function quoted_sargs() { - local a s - for a in "$@"; do - s="${s:+$s }$(quoted_sarg "$a")" - done - rawecho "$s" -} - -function set_array_cmd() { - [ $# -eq 1 ] && set -- "$1" "$1" - local __sac_s __sac_v __sac_f - __sac_s="$1=("; shift - if [ "$1" == "@" ]; then - shift - else - eval "set -- \"\${$1[@]}\"" - fi - __sac_f=1 - for __sac_v in "$@"; do - [ -n "$__sac_f" ] && __sac_f= || __sac_s="$__sac_s " - __sac_s="$__sac_s$(quoted_arg "$__sac_v")" - done - __sac_s="$__sac_s)" - echo "$__sac_s" -} -function set_array() { - eval "$(set_array_cmd "$@")" -} -function array_count() { - eval "echo \${#$1[*]}" -} -function array_isempty() { - [ $(array_count "$1") -eq 0 ] -} -function array_new() { - eval "$1=()" -} -function array_add() { - local __aa_a="$1"; shift - eval "$__aa_a=(\"\${$__aa_a[@]}\" \"\$@\")" -} -function array_ins() { - local __aa_a="$1"; shift - eval "$__aa_a=(\"\$@\" \"\${$__aa_a[@]}\")" -} -function array_del() { - local __ad_v - local -a __ad_vs - eval 'for __ad_v in "${'"$1"'[@]}"; do - if [ "$__ad_v" != '"$(quoted_arg "$2")"' ]; then - array_add __ad_vs "$__ad_v" - fi -done' - array_copy "$1" __ad_vs -} -function array_addu() { - local __as_v - eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then - return 1 - fi -done' - array_add "$1" "$2" - return 0 -} -function array_set() { - array_addu "$@" -} -function array_insu() { - local __as_v - eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then - return 1 - fi -done' - array_ins "$1" "$2" - return 0 -} -function array_fillrange() { - local -a __af_vs - local __af_i="${2:-1}" __af_to="${3:-10}" __af_step="${4:-1}" - while [ "$__af_i" -le "$__af_to" ]; do - __af_vs=("${__af_vs[@]}" "$__af_i") - __af_i=$(($__af_i + $__af_step)) - done - array_copy "$1" __af_vs -} -function array_eq() { - local -a __ae_a1 __ae_a2 - array_copy __ae_a1 "$1" - array_copy __ae_a2 "$2" - [ ${#__ae_a1[*]} -eq ${#__ae_a2[*]} ] || return 1 - local __ae_v __ae_i=0 - for __ae_v in "${__ae_a1[@]}"; do - [ "$__ae_v" == "${__ae_a2[$__ae_i]}" ] || return 1 - __ae_i=$(($__ae_i + 1)) - done - return 0 -} -function array_contains() { - local __ac_v - eval 'for __ac_v in "${'"$1"'[@]}"; do - if [ "$__ac_v" == '"$(quoted_arg "$2")"' ]; then - return 0 - fi -done' - return 1 -} -function array_find() { - local __af_i __af_v - __af_i=0 - eval 'for __af_v in "${'"$1"'[@]}"; do - if [ "$__af_v" == '"$(quoted_arg "$2")"' ]; then - if [ -n "$3" ]; then - echo "${'"$3"'[$__af_i]}" - else - echo "$__af_i" - fi - return 0 - fi - __af_i=$(($__af_i + 1)) -done' - return 1 -} -function array_reverse() { - local -a __ar_vs - local __ar_v - array_copy __ar_vs "$1" - array_new "$1" - for __ar_v in "${__ar_vs[@]}"; do - array_ins "$1" "$__ar_v" - done -} - -function array_replace() { - local __ar_sn="$1"; shift - local __ar_f="$1"; shift - local -a __ar_s __ar_d - local __ar_v - array_copy __ar_s "$__ar_sn" - for __ar_v in "${__ar_s[@]}"; do - if [ "$__ar_v" == "$__ar_f" ]; then - __ar_d=("${__ar_d[@]}" "$@") - else - __ar_d=("${__ar_d[@]}" "$__ar_v") - fi - done - array_copy "$__ar_sn" __ar_d -} -function array_each() { - local __ae_an="$1"; shift - local __ae_f="$1"; shift - local -a __ae_a - local __ae_v - array_copy __ae_a "$__ae_an" - for __ae_v in "${__ae_a[@]}"; do - "$__ae_f" "$__ae_v" "$@" - done -} -function array_map() { - local __am_an="$1"; shift - local __am_f="$1"; shift - local -a __am_a __am_vs - local __am_v - array_copy __am_a "$__am_an" - for __am_v in "${__am_a[@]}"; do - __am_vs=("${__am_vs[@]}" "$("$__am_f" "$__am_v" "$@")") - done - array_copy "$__am_an" __am_vs -} -function first_value() { - eval "rawecho \"\${$1[@]:0:1}\"" -} -function last_value() { - eval "rawecho \"\${$1[@]:\$((-1)):1}\"" -} -function array_copy() { - eval "$1=(\"\${$2[@]}\")" -} -function array_copy_firsts() { - eval "$1=(\"\${${2:-$1}[@]:0:\$((\${#${2:-$1}[@]}-1))}\")" -} -function array_del_last() { - array_copy_firsts "$1" -} -function array_copy_lasts() { - eval "$1=(\"\${${2:-$1}[@]:1}\")" -} -function array_del_first() { - array_copy_lasts "$1" -} -function array_extend() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]}\")" -} -function array_extendu() { - local __ae_v __ae_s=1 - eval 'for __ae_v in "${'"$2"'[@]}"; do - array_addu "$1" "$__ae_v" && __ae_s=0 -done' - return "$__ae_s" -} -function array_extend_firsts() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]:0:\$((\${#$2[@]}-1))}\")" -} -function array_extend_lasts() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]:1}\")" -} -function array_xsplit() { - eval "$1=($(recho_ "$2" | awkrun RS="${3:-:}" ' -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_split() { - eval "$1=($(recho_ "$2" | awkrun RS="${3:-:}" ' -/^$/ { next } -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_from_path() { - array_split "$1" "$2" ":" -} -function array_from_xlines() { - eval "$1=($(recho_ "$2" | _nl2lf | awk ' -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_from_lines() { - eval "$1=($(recho_ "$2" | _nl2lf | awk ' -/^$/ { next } -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_join() { - local __aj_an __aj_l __aj_j __aj_s="${2:-,}" __aj_pf __aj_sf - if [ "$1" == "@" ]; then - __aj_an="\$@" - shift; shift - else - __aj_an="\${$1[@]}" - __aj_pf="$4" - __aj_sf="$5" - fi - eval 'for __aj_l in "'"$__aj_an"'"; do - __aj_j="${__aj_j:+$__aj_j'"$__aj_s"'}$__aj_pf$__aj_l$__aj_sf" -done' - if [ -n "$__aj_j" ]; then - rawecho "$__aj_j" - elif [ "$__aj_an" != "\$@" -a -n "$3" ]; then - rawecho "$3" - fi -} -function array_mapjoin() { - local __amj_src="$1" __amj_func="$2" __amj_sep="$3" - shift; shift; shift - if [ "$__amj_src" == "@" ]; then - local -a __amj_tmpsrc - __amj_tmpsrc=("$@") - __amj_src=__amj_tmpsrc - set -- - fi - local -a __amj_tmp - array_copy __amj_tmp "$__amj_src" - array_map __amj_tmp "$__amj_func" - array_join __amj_tmp "$__amj_sep" "$@" -} -function array_to_lines() { - array_join "$1" " -" "$2" "$3" "$4" -} -function array_to_path() { - array_join "$1" ":" "$2" "$3" "$4" -} -function array_fix_paths() { - local __afp_an="$1" __afp_s="${2:-:}" - local -a __afp_vs - local __afp_v - array_copy __afp_vs "$__afp_an" - array_new "$__afp_an" - for __afp_v in "${__afp_vs[@]}"; do - array_split __afp_v "$__afp_v" "$__afp_s" - array_extend "$__afp_an" __afp_v - done -} - - -function get_date_rfc822() { - LC_TIME=C date +"%a, %d %b %Y %H:%M:%S %Z" -} -function get_date_fr() { - LC_TIME=C date +"%d/%m/%Y" -} -function get_time_fr() { - LC_TIME=C date +"%Hh%M" -} -function parse_date() { - local value="$1" type="${2:-date}" - local now="$(awk 'BEGIN { print mktime(strftime("%Y %m %d 00 00 00 +0400")) }')" - case "$value" in - +*) - value="$(($now + ${value#+} * 86400))" - ;; - *) - value="$(<<<"$value" awk -F/ '{ - nd = strftime("%d"); nm = strftime("%m"); ny = strftime("%Y") - d = $1 + 0; if (d < 1) d = nd; - m = $2 + 0; if (m < 1) m = nm; - if ($3 == "") y = ny; - else { y = $3 + 0; if (y < 100) y = y + 2000; } - print mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d)); - }')" - esac - case "$type" in - d|date) awk '{ print strftime("%d/%m/%Y", $0 + 0) }' <<<"$value";; - l|ldap) awk '{ print strftime("%Y%m%d%H%M%S+0400", $0 + 0) }' <<<"$value";; - m|mysql) awk '{ print strftime("%Y-%m-%d", $0 + 0) }' <<<"$value";; - *) - rawecho "$value" - ;; - esac -} - - -function udelpath() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; ${2:-PATH}"'="${'"${2:-PATH}"'#$1:}"; '"${2:-PATH}"'="${'"${2:-PATH}"'%:$1}"; '"${2:-PATH}"'="${'"${2:-PATH}"'//:$_qdir:/:}"; [ "$'"${2:-PATH}"'" == "$1" ] && '"${2:-PATH}"'=' -} -function uaddpath() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="${'"${2:-PATH}"':+$'"${2:-PATH}"':}$1"' -} -function uinspathm() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="$1${'"${2:-PATH}"':+:$'"${2:-PATH}"'}"' -} -function uinspath() { - udelpath "$@" - uinspathm "$@" -} - -function withpath() { - [ "${1#./}" != "$1" -o "${1#../}" != "$1" -o "${1#/}" != "$1" ] -} -function withext() { - local basename="$(basename -- "$1")" - [ "${basename%.*}" != "$basename" ] -} -function normpath() { - local -a parts - local part ap - array_split parts "$1" / - if [ "${1#/}" != "$1" ]; then - ap=/ - elif [ -n "$2" ]; then - ap="$2" - else - ap="$(pwd)" - fi - for part in "${parts[@]}"; do - if [ "$part" == "." ]; then - continue - elif [ "$part" == ".." ]; then - ap="${ap%/*}" - [ -n "$ap" ] || ap=/ - else - [ "$ap" != "/" ] && ap="$ap/" - ap="$ap$part" - fi - done - rawecho "$ap" -} -function abspath() { - local ap="$1" - if [ "${ap#/}" != "$ap" ]; then - __normpath "$ap" && return - else - local cwd - if [ -n "$2" ]; then - cwd="$(abspath "$2")" - else - cwd="$(pwd)" - fi - ap="$cwd/$ap" - __normpath "$ap" && return - fi - normpath "$ap" -} -function __normpath() { - if [ -d "$1" ]; then - if [ -x "$1" ]; then - (cd "$1"; pwd) - return 0 - fi - elif [ -f "$1" ]; then - local dn="$(dirname -- "$1")" bn="$(basename -- "$1")" - if [ -x "$dn" ]; then - (cd "$dn"; echo "$(pwd)/$bn") - return 0 - fi - fi - return 1 -} -function parentdirs() { - array_new "$1" - local __pd_d="$(abspath "$2")" - if [[ "$3" == r* ]]; then - while [ "$__pd_d" != "/" ]; do - array_ins "$1" "$__pd_d" - __pd_d="$(dirname "$__pd_d")" - done - else - while [ "$__pd_d" != "/" ]; do - array_add "$1" "$__pd_d" - __pd_d="$(dirname "$__pd_d")" - done - fi -} -function ppath() { - local path="$1" cwd="$2" - - path="$(abspath "$path")" # essayer de normaliser le chemin - [ -n "$cwd" ] || cwd="$(pwd)" - - [ "$path" = "$cwd" ] && path="." - [ "$cwd" != "/" -a "$cwd" != "$HOME" ] && path="${path/#$cwd\//}" - path="${path/#$HOME/~}" - - rawecho "$path" -} -function relpath() { - local p="$(abspath "$1" "$3")" cwd="$2" - if [ -z "$cwd" ]; then - cwd="$(pwd)" - else - cwd="$(abspath "$cwd" "$3")" - fi - if [ "$p" == "$cwd" ]; then - echo "" - elif [ "${p#$cwd/}" != "$p" ]; then - rawecho "${p#$cwd/}" - else - local rp - while [ -n "$cwd" -a "${p#$cwd/}" == "$p" ]; do - rp="${rp:+$rp/}.." - cwd="${cwd%/*}" - done - rp="$rp/${p#$cwd/}" - echo "${rp%//}" - fi -} -function relpathx() { - local p="$(relpath "$@")" - if [ -z "$p" ]; then - echo . - elif [ "${p#../}" != "$p" -o "${p#./}" != "$p" ]; then - echo "$p" - else - echo "./$p" - fi -} -function withinpath() { - local b="$1" p="$2" strict="${3:-N}" - b="$(abspath "$b")" - p="$(abspath "$p")" - if is_yes "$strict"; then - [ "${p#$b/}" != "$p" ] - else - [ "$p" == "$b" -o "${p#$b/}" != "$p" ] - fi -} -function safe_abspath() { - local p="$1" ba="$2" br="$3" - if [ -n "$ba" ]; then - ba="$(abspath "$ba")" - else - ba="$(pwd)" - fi - [ -n "$br" ] || br="$ba" - br="$(abspath "$br" "$ba")" - p="$(abspath "$p" "$ba")" - if [ "$p" == "$br" -o "${p#$br/}" != "$p" ]; then - echo "$p" - else - return 1 - fi -} -function safe_relpath() { - local p - if p="$(safe_abspath "$1" "$2" "$3")"; then - relpath "$p" "$2" "$(pwd)" - else - return 1 - fi -} -function splitwcs() { - local __sw_p="$1" - local __sw_dd="${2:-basedir}" __sw_df="${3:-filespec}" __sw_part __sw_d __sw_f - local -a __sw_parts - array_split __sw_parts "$__sw_p" "/" - for __sw_part in "${__sw_parts[@]}"; do - if [[ "$__sw_part" == *\** ]] || [[ "$__sw_part" == *\?* ]] || [ -n "$__sw_f" ]; then - __sw_f="${__sw_f:+$__sw_f/}$__sw_part" - else - __sw_d="${__sw_d:+$__sw_d/}$__sw_part" - fi - done - [ "${__sw_p#/}" != "$__sw_p" ] && __sw_d="/$__sw_d" - set_var "$__sw_dd" "$__sw_d" - set_var "$__sw_df" "$__sw_f" -} -function deref() { - local OENC="$UTF8" - - local max_deref=50 - local file="$1" - local basedir link - while [ -L "$file" ]; do - basedir="$(dirname "$file")" - link="$(readlink "$file")" - if first_char_is "$link" "/"; then - file="$link" - else - file="$basedir/$link" - fi - - max_deref=$(($max_deref - 1)) - [ $max_deref -eq 0 ] && die "Plus de 50 indirection. Le lien $file est-il récursif?" - done - abspath "$file" -} -function readlinka() { - if [ -L "$1" ]; then - local linkdir="$(dirname -- "$1")" - abspath "$(readlink "$1")" "$linkdir" - else - abspath "$1" - fi -} -function readlinkm() { - readlink -m "$1" -} -function path_if_test() { - local op="$1"; shift - local file="$1"; shift - local rel="$1" reldir=; shift - if beginswith "$rel" relative; then - reldir="${rel#relative}" - if beginswith "$reldir" :; then - reldir="${reldir#:}" - if [ -n "$reldir" ]; then - reldir="${reldir}/" - fi - else - reldir= - fi - else - rel= - fi - - while [ -n "$1" ]; do - local basedir="$1" - if [ $op "$basedir/$file" ]; then - if [ -n "$rel" ]; then - rawecho "$reldir$file" - else - rawecho "$basedir/$file" - fi - break - fi - shift - done -} -function update_link() { - [ -L "$2" ] || return 1 - local dest link="$2" - local linkdir="$(dirname "$link")" - local ldest="$(readlink "$link")" - if [ "${ldest#/}" != "$ldest" ]; then - dest="$(abspath "$1")" - else - dest="$(relpath "$1" "$linkdir")" - fi - if [ "$dest" == "$ldest" ]; then - : # pas besoin de mettre à jour - elif [ -d "$link" ]; then - rm -f "$link" && ln -s "$dest" "$link" - else - ln -sf "$dest" "$link" - fi -} -function update_links() { - [ -n "$1" ] || return 1 - local dest="$1"; shift - local r=0 link - for link in "$@"; do - update_link "$dest" "$link" || r=$? - done - return $r -} -function move_link() { - [ -n "$1" -a -n "$2" ] || return 1 - local link="$1" dest="$2" - [ -d "$dest" ] && dest="$dest/$(basename -- "$link")" - dest="$(abspath "$dest")" - if [ -L "$link" ]; then - link="$(abspath "$link")" - [ "$dest" == "$link" ] && return 0 - ldest="$(readlinka "$link")" - mv "$link" "$dest" || return 1 - update_link "$ldest" "$dest" - else - [ "$dest" == "$link" ] && return 0 - mv "$link" "$dest" - fi -} -function array_find_links() { - local -a __afl_links __afl_result - local __afl_dir="${3:-.}" - local __afl_dest __afl_destname __afl_link __afl_linkdir __afl_ldest - __afl_dest="$(abspath "$2")" - __afl_destname="${__afl_dest##*/}" - array_from_lines __afl_links "$(find "$__afl_dir" -type l)" - for __afl_link in "${__afl_links[@]}"; do - __afl_ldest="$(readlink "$__afl_link")" - if [ "$__afl_ldest" != "$__afl_destname" ]; then - [[ "$__afl_ldest" == */"$__afl_destname" ]] || continue - fi - __afl_link="$(abspath "$__afl_link" "$__afl_dir")" - __afl_linkdir="$(dirname -- "$__afl_link")" - __afl_ldest="$(abspath "$__afl_ldest" "$__afl_linkdir")" - if [ "$__afl_ldest" == "$__afl_dest" ]; then - array_add __afl_result "$__afl_link" - fi - done - array_copy "$1" __afl_result -} -function list_links() { - local -a links - array_find_links links "$@" - array_to_lines links -} -function move_file() { - [ -n "$1" -a -n "$2" ] || return 1 - local src="$1" dest="$2" link - shift; shift - [ -d "$dest" ] && dest="$dest/$(basename -- "$src")" - move_link "$src" "$dest" || return 1 - update_links "$dest" "$@" -} - -function get_nblines() { - [ -f "$1" ] && sed -ne '$=' "$1" || echo 0 -} -function mktempf() { - mktemp "${1:-"$TMPDIR/tmp.XXXXXX"}" -} -function mktempd() { - mktemp -d "${1:-"$TMPDIR/tmp.XXXXXX"}" -} -function mkdirof() { - mkdir -p "$(dirname -- "$1")" -} -function cp_a() { - /bin/cp -a "$@" -} -function cp_R() { - /bin/cp -pR "$@" -} -function quietgrep() { - grep -q "$@" 2>/dev/null -} -function quietdiff() { - diff -q "$@" >&/dev/null -} -function testsame() { - quietdiff "$@" -} -function testdiff() { - ! quietdiff "$@" -} -function testupdated() { - if [ -f "$2" ]; then - testdiff "$1" "$2" - else - return 0 - fi -} -function testnewer() { - test ! -e "$2" -o "$1" -nt "$2" -} -function ps_all() { - ps -axww -} -function progexists() { - test -n "$1" -a -x "$(which "$1" 2>/dev/null)" -} -function has_python() { - progexists python -} -function has_gawk() { - progexists gawk -} -function is_root() { - test `id -u` -eq 0 -} -function source_ifexists() { - if [ -f "$1" ]; then source "$1" || die; fi -} -function little_sleep { - LC_NUMERIC=C sleep 0.1 -} -function random_sleep { - sleep $(($RANDOM % ${1:-1800})) -} -function is_running() { - kill -0 "$1" >&/dev/null -} -function sedi() { - sed -i "$@" -} -function csort() { - LANG=C sort "$@" -} -function lsort() { sort "$@"; } -function cgrep() { - LANG=C grep "$@" -} -function lgrep() { grep "$@"; } -function csed() { - LANG=C sed "$@" -} -function lsed() { sed "$@"; } -function cawk() { - LANG=C awk "$@" -} -function lawk() { awk "$@"; } -function cdiff() { - LANG=C diff "$@" -} -function ldiff() { diff "$@"; } - - -function fix_mode() { - local file="$1" - [ -f "$file" ] || touch "$file" || return 1 - if [ ! -w "$file" ]; then - local mode="$(stat -c %a "$file")" - chmod ${mode:0:${#mode}-3}6${mode:${#mode}-2:2} "$file" - echo "$mode" - fi -} -function unfix_mode() { - [ -n "$2" ] && chmod "$2" "$1" -} -function get_mode() { - [ -f "$1" ] || touch "$1" || return 1 - stat -c %a "$1" -} -function rm_maybe() { - local parse_opts=1 arg rm - for arg in "$@"; do - if [ -n "$parse_opts" ]; then - if [ "$arg" == "--" ]; then - parse_opts= - elif [[ "$arg" == "-*" ]]; then - continue - elif [ -n "$arg" ]; then - rm=1 - break - fi - elif [ -n "$arg" ]; then - rm=1 - break - fi - done - [ -n "$rm" ] && /bin/rm "$@" -} -__CPDIR_RSYNC_SLOW=1 # synchro potentiellement plus lente, mais plus fidèle (option -c) -__CPDIR_RSYNC_ARGS=(-q) -function cpdir() { - - if progexists rsync; then - [ -d "$2" ] || mkdir -p "$2" || return 1 - if [ -d "$1" ]; then - rsync -a ${__CPDIR_RSYNC_SLOW:+-c} "${__CPDIR_RSYNC_ARGS[@]}" "$1/" "$2/" - else - rsync -a ${__CPDIR_RSYNC_SLOW:+-c} "${__CPDIR_RSYNC_ARGS[@]}" "$1" "$2/" - fi - else - __cpdir "$@" - fi -} -function __cpdir() { - local src="$1" dest="$2" method="${3:-cp_a}" - - if [ -d "$src" ]; then - [ -d "$dest" ] || mkdir -p "$dest" || return 1 - - local prevdir="$(pwd)" - - dest="$(abspath "$dest")" - cd "$src" - if [ -n "$(/bin/ls -a1)" ]; then - [ -n "$(/bin/ls -1)" ] && "$method" * "$dest" - local i - for i in .*; do - [ "$i" == "." -o "$i" == ".." ] && continue - "$method" "$i" "$dest" - done - fi - cd "$prevdir" - else - if [ -f "$dest" ]; then - "$method" "$src" "$dest" - elif [ -d "$dest" ]; then - "$method" "$src" "$dest" - else - mkdir -p "$dest" - "$method" "$src" "$dest" - fi - fi -} -__CPNOVCS_RSYNC_SLOW=1 # synchro potentiellement plus lente, mais plus fidèle (option -c) -__CPNOVCS_RSYNC_ARGS=(-q) -function cpnovcs() { - local src="$1" destdir="$2" - [ -d "$destdir" ] || mkdir -p "$destdir" || return 1 - if progexists rsync; then - local gitexclude=/.git/ - if [ "${src%/}" == "$src" ]; then - gitexclude="/$(basename -- "$src")$gitexclude" - fi - rsync -a ${__CPNOVCS_RSYNC_SLOW:+-c} --exclude CVS/ --exclude .svn/ --exclude "$gitexclude" "${__CPNOVCS_RSYNC_ARGS[@]}" "$src" "$destdir/" - elif [ "${src%/}" != "$src" ]; then - __cpdir "$src" "$destdir" - else - local srcname="$(basename -- "$src")" - mkdir -p "$destdir/$srcname" - __cpdir "$src" "$destdir/$srcname" - fi -} -function cpdirnovcs() { - if [ -d "$1" ]; then - cpnovcs "$1/" "$2" - else - cpnovcs "$1" "$2" - fi -} -function doinplace() { - if [ -n "$1" -a "$1" != "-" ]; then - local __dip_file="$1"; shift - autoclean "$__dip_file.tmp.$$" - "$@" <"$__dip_file" >"$__dip_file.tmp.$$" - local s=$? - [ "$s" == 0 ] && /bin/cat "$__dip_file.tmp.$$" >"$__dip_file" - /bin/rm -f "$__dip_file.tmp.$$" - return $s - else - shift - "$@" - fi -} -function doinplacef() { - if [ -n "$1" -a "$1" != "-" ]; then - local __dip_file="$1"; shift - autoclean "$__dip_file.tmp.$$" - "$@" <"$__dip_file" >"$__dip_file.tmp.$$" - local s=$? - /bin/cat "$__dip_file.tmp.$$" >"$__dip_file" - /bin/rm -f "$__dip_file.tmp.$$" - return $s - else - shift - "$@" - fi -} -function stripnl() { - tr -d '\r\n' -} -function _nl2lf() { - awk 'BEGIN {RS="\r|\r\n|\n"} {print}' -} -function nl2lf() { - doinplace "$1" _nl2lf -} -function _nl2crlf() { - awk 'BEGIN {RS="\r|\r\n|\n"} {print $0 "\r"}' -} -function nl2crlf() { - doinplace "$1" _nl2crlf -} -function _nl2cr() { - awk 'BEGIN {RS="\r|\r\n|\n"; ORS=""} {print $0 "\r"}' -} -function nl2cr() { - doinplace "$1" _nl2cr -} -function _latin1compat() { - LANG=fr_FR.UTF-8 sed $' -s/[‘’]/\x27/g -s/[«»“”]/"/g -s/[\xC2\xA0\xE2\x80\x87\xE2\x80\xAF\xE2\x81\xA0]/ /g -' -} -function _noaccents() { - LANG=fr_FR.UTF-8 sed ' -s/[à]/a/g -s/[éèêë]/e/g -s/[ïî]/i/g -s/[ôö]/o/g -s/[üû]/u/g -s/[ç]/c/g -s/[À]/A/g -s/[ÉÈÊË]/E/g -s/[ÏÎ]/I/g -s/[ÔÖ]/O/g -s/[ÜÛ]/U/g -s/[Ç]/C/g -' -} -function list_all() { - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ "$f" == "." -o "$f" == ".." ] && continue - rawecho "$f" - done - cd "$curdir" -} -function __la_cmd() { - [ $# -gt 0 ] || set '*' - local arg - local cmd="/bin/ls -1d" - for arg in "$@"; do - arg="$(_rval "$arg")" - cmd="$cmd $arg" - done - cmd="$cmd 2>/dev/null" - echo "$cmd" -} -function list_files() { - local f - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ -f "$f" ] && rawecho "$f" - done - cd "$curdir" -} -function list_dirs() { - local f - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ "$f" == "." -o "$f" == ".." ] && continue - [ -d "$f" ] && rawecho "$f" - done - cd "$curdir" -} -function __array_ls() { - local __al_l="list_${1:-all}"; shift - local __al_an="$1"; shift - local __al_d="${1:-.}"; shift - local -a __al_fs - array_from_lines __al_fs "$("$__al_l" "$__al_d" "$@")" - local __al_f - array_new "$__al_an" - for __al_f in "${__al_fs[@]}"; do - array_add "$__al_an" "$__al_d/$__al_f" - done -} -function array_lsall() { - __array_ls all "$@" -} -function array_lsdirs() { - __array_ls dirs "$@" -} -function array_lsfiles() { - __array_ls files "$@" -} -function filter_empty() { - sed '/^$/d' -} -function filter_vcspath() { - sed ' -/^.git$/d -/^.git\//d -/\/.git$/d -/\/.git\//d -/^.svn$/d -/^.svn\//d -/\/.svn$/d -/\/.svn\//d -' -} -function merge_contlines() { - awk 'substr($0, length($0)) == "\\" { - while (getline nextline) { - $0 = substr($0, 1, length($0) - 1) nextline - if (substr($0, length($0)) != "\\") break - } - print - next -} -{print}' -} -function filter_comment() { - local -a merge - [ "$1" == -m ] && merge=(merge_contlines) || merge=(cat) - awk ' - /^[ \t]*#/ { next } - /^[ \t]*$/ { next } - { print }' | "${merge[@]}" -} -function filter_conf() { - local -a merge - [ "$1" == -m ] && merge=(merge_contlines) || merge=(cat) - grep -v '^#' | grep -v '^$' | "${merge[@]}" -} -function is_archive() { - local name="${1%.zip}" - name="${name%.tgz}" - name="${name%.tbz2}" - name="${name%.tar.gz}" - name="${name%.tar.bz2}" - name="${name%.tar}" - name="${name%.jar}" - name="${name%.war}" - name="${name%.ear}" - [ "$name" != "$1" ] -} -function extract_archive() { - local arch="$1" destdir="${2:-.}" - shift; shift - if endswith "$arch" .zip; then - unzip -q -d "$destdir" "$arch" "$@" || return - elif endswith "$arch" .tgz || endswith "$arch" .tar.gz; then - tar xzf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .tbz2 || endswith "$arch" .tar.bz2; then - tar xjf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .tar; then - tar xf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .jar || endswith "$arch" .war || endswith "$arch" .ear; then - ( - arch="$(abspath "$arch")" - cd "$destdir" - jar xf "$arch" "$@" - ) || return - else - return 1 - fi -} -function get_archive_basename() { - local basename="$(basename -- "$1")" - basename="${basename%.zip}" - basename="${basename%.tgz}" - basename="${basename%.tbz2}" - basename="${basename%.gz}" - basename="${basename%.bz2}" - basename="${basename%.tar}" - basename="${basename%.jar}" - basename="${basename%.war}" - basename="${basename%.ear}" - echo "$basename" -} -function get_archive_appname() { - local appname="$(basename -- "$1")" - appname="${appname%.zip}" - appname="${appname%.tgz}" - appname="${appname%.tbz2}" - appname="${appname%.gz}" - appname="${appname%.bz2}" - appname="${appname%.tar}" - appname="${appname%.jar}" - appname="${appname%.war}" - appname="${appname%.ear}" - echo "$appname" | awk '{ - if (match($0, /[-_.]([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/)) { - print substr($0, 1, RSTART - 1) - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/)) { - print substr($0, 1, RSTART - 1) - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print substr($0, 1, RSTART - 1) - } else { - print $0 - } -}' -} -function get_archive_versionsuffix() { - local basename="$(get_archive_basename "$1")" - echo "$basename" | awk '{ - if (match($0, /([-_.][0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print vs["1"] - } -}' -} -function get_archive_version() { - local basename="$(get_archive_basename "$1")" - echo "$basename" | awk '{ - if (match($0, /[-_.]([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print vs["1"] - } -}' -} -function __dump_usernames() { - = 500 && $6 ~ /^\/home\// { print $1 }' -} -function dump_usernames() { - array_from_lines "${1:-usernames}" "$(__dump_usernames)" -} -function __resolv_ips() { - LANG=C host "$1" 2>/dev/null | awk '/address / { gsub(/^.*address /, ""); print }' -} -function resolv_ips() { - array_from_lines "${1:-ips}" "$(__resolv_ips "$2")" -} -function __resolv_hosts() { - LANG=C host "$1" 2>/dev/null | awk '/domain name pointer / { gsub(/^.*domain name pointer /, ""); gsub(/\.$/, ""); print }' -} -function resolv_hosts() { - array_from_lines "${1:-hosts}" "$(__resolv_hosts "$2")" -} -function runscript_as() { - local OENC="$UTF8" - local user="${1:-root}"; shift - local exec_maybe= - if [ "$1" = "exec" ]; then - exec_maybe=exec - shift - fi - - local cmd - cmd="\ -__estack=$(quoted_arg "$__estack") -__tlevel=$(quoted_args "$__tlevel") -export __estack __tlevel -exec ${BASH:-/bin/sh} $(quoted_args "$@")" - - if is_yes "$UTOOLS_USES_SU" || ! progexists sudo; then - eecho "Entrez le mot de passe de root" - $exec_maybe su "$user" -c "$cmd" - else - if [ "$user" == "root" ]; then - $exec_maybe sudo -p "Entrez le mot de passe de %u: " "${BASH:-/bin/sh}" -c "$cmd" - else - $exec_maybe sudo -p "Entrez le mot de passe de %u: " su "$user" -c "$cmd" - fi - fi -} -function runscript_as_root() { - if is_root; then - local exec_maybe= - if [ "$1" = "exec" ]; then - exec_maybe=exec - shift - fi - $exec_maybe "${BASH:-/bin/sh}" "$@" - else - runscript_as root "$@" - fi -} -function run_as() { - local user="${1:-root}"; shift - local exec_maybe=exec - if [ "$1" = "--noexec" ]; then - exec_maybe= - shift - fi - - runscript_as "$user" $exec_maybe "$0" "$@" -} -function run_as_root() { - is_root || run_as root "$@" -} -function check_user() { - local user - for user in "$@"; do - [ "$USER" == "$user" ] && return 0 - done - return 1 -} -function ensure_user() { - local -a users - while [ $# -gt 0 -a "$1" != "--" ]; do - array_add users "$1" - shift - done - [ "$1" == "--" ] && shift - - if ! check_user "${users[@]}"; then - if [ ${#users[*]} -gt 1 ]; then - ewarn "Cette commande doit être lancée avec l'un des users ${users[*]}" - else - ewarn "Cette commande doit être lancée avec le user ${users[0]}" - fi - if ask_yesno "Voulez-vous tenter de relancer la commande avec le bon user?" O; then - estep "Lancement du script avec le user ${users[0]}" - run_as "${users[0]}" "$@" - return 1 - elif is_root; then - return 11 - else - return 10 - fi - fi - return 0 -} -function check_hostname() { - local userhost user host path - for userhost in "$@"; do - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - [ "$MYHOSTNAME" == "${host%%.*}" ] && return 0 - done - return 1 -} -function check_userhostname() { - local userhost path user host - for userhost in "$@"; do - if check_hostname "$userhost"; then - [[ "$userhost" == *@* ]] || return 0 - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - check_user "$user" && return 0 - fi - done - return 1 -} -UTOOLS_ENSURE_HOSTNAME_SSH_OPTS=() -function ensure_hostname() { - local -a userhosts - while [ $# -gt 0 -a "$1" != "--" ]; do - array_add userhosts "$1" - shift - done - [ "$1" == "--" ] && shift - - local userhost user host path - if ! check_hostname "${userhosts[@]}"; then - if [ ${#userhosts[*]} -gt 1 ]; then - ewarn "Cette commande n'est valide que sur l'un des hôtes ${userhosts[*]}" - else - ewarn "Cette commande n'est valide que sur l'hôte ${userhosts[0]}" - fi - - enote "Vous pouvez tenter de relancer le script sur ${userhosts[0]}, mais cela requière que ce script ET les données dont il a besoin soient installés dans la même version et dans le même répertoire sur l'hôte distant" - if ask_yesno "Voulez-vous tenter de relancer le script sur l'hôte distant?" N; then - splitfsep "${userhosts[0]}" : userhost path - splituserhost "$userhost" user host - [ -n "$user" ] || user=root - - estep "Lancement de la commande sur l'hôte distant $user@$host" - local cmd - [ -n "$path" ] && cmd="$(quoted_args cd "$path"); " - cmd="$cmd$(quoted_args "$script" "$@")" - ssh -qt "${UTOOLS_ENSURE_HOSTNAME_SSH_OPTS[@]}" "$user@$host" "$cmd" - [ $? -eq 255 ] && return 12 - return 1 - else - return 11 - fi - fi - local userhost user host - for userhost in "${userhosts[@]}"; do - [[ "$userhost" == *@* ]] || continue - if check_hostname "$userhost"; then - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - [ -n "$path" ] && cd "$path" - ensure_user "$user" -- "$@" - return $? - fi - done - return 0 -} - -__AWKDEF_FUNCTIONS=' -function quote_html(s) { - gsub(/&/, "\\&", s) - gsub(/"/, "\\"", s) - gsub(/>/, "\\>", s) - gsub(/", s) - gsub(/"/, "\"", s) - gsub(/&/, "\\&", s) - return s -} -function quote_value(s) {'" - gsub(/'/, \"'\\\\''\", s) - return \"'\" s \"'\" -"'} -function quoted_values( i, line) { - line = "" - for (i = 1; i <= NF; i++) { - if (i > 1) line = line " " - line = line quote_value($i) - } - return line -} -function quote_subrepl(s) { - gsub(/\\/, "\\\\", s) - gsub(/&/, "\\\\&", s) - return s -} -function quote_grep(s) { - gsub(/[[\\.^$*]/, "\\\\&", s) - return s -} -function quote_egrep(s) { - gsub(/[[\\.^$*+?()|{]/, "\\\\&", s) - return s -} -function quote_sql(s) {'" - gsub(/'/, \"''\", s) - return \"'\" s \"'\" -"'} -function unquote_mysqlcsv(s) { - gsub(/\\n/, "\n", s) - gsub(/\\t/, "\t", s) - gsub(/\\0/, "\0", s) - gsub(/\\\\/, "\\", s) - return s -} -function array_new(dest) { - dest[0] = 0 # forcer awk à considérer dest comme un tableau - delete dest -} -function array_newsize(dest, size, i) { - dest[0] = 0 # forcer awk à considérer dest comme un tableau - delete dest - size = int(size) - for (i = 1; i <= size; i++) { - dest[i] = "" - } -} -function array_len(values, count, i) { - count = 0 - for (i in values) { - count++ - } - return count -} -function mkindices(values, indices, i, j) { - array_new(indices) - j = 1 - for (i in values) { - indices[j++] = int(i) - } - return asort(indices) -} -function array_copy(dest, src, count, indices, i) { - array_new(dest) - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - dest[indices[i]] = src[indices[i]] - } -} -function array_getlastindex(src, count, indices) { - count = mkindices(src, indices) - if (count == 0) return 0 - return indices[count] -} -function array_add(dest, value, lastindex) { - lastindex = array_getlastindex(dest) - dest[lastindex + 1] = value -} -function array_deli(dest, i, l) { - i = int(i) - if (i == 0) return - l = array_len(dest) - while (i < l) { - dest[i] = dest[i + 1] - i++ - } - delete dest[l] -} -function array_del(dest, value, ignoreCase, i) { - do { - i = key_index(value, dest, ignoreCase) - if (i != 0) array_deli(dest, i) - } while (i != 0) -} -function array_extend(dest, src, count, lastindex, indices, i) { - lastindex = array_getlastindex(dest) - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - dest[lastindex + i] = src[indices[i]] - } -} -function array_fill(dest, i) { - array_new(dest) - for (i = 1; i <= NF; i++) { - dest[i] = $i - } -} -function array_getline(src, count, indices, i, j) { - $0 = "" - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - j = indices[i] - $j = src[j] - } -} -function array_appendline(src, count, indices, i, nf, j) { - count = mkindices(src, indices) - nf = NF - for (i = 1; i <= count; i++) { - j = nf + indices[i] - $j = src[indices[i]] - } -} -function in_array(value, values, ignoreCase, i) { - if (ignoreCase) { - value = tolower(value) - for (i in values) { - if (tolower(values[i]) == value) return 1 - } - } else { - for (i in values) { - if (values[i] == value) return 1 - } - } - return 0 -} -function key_index(value, values, ignoreCase, i) { - if (ignoreCase) { - value = tolower(value) - for (i in values) { - if (tolower(values[i]) == value) return int(i) - } - } else { - for (i in values) { - if (values[i] == value) return int(i) - } - } - return 0 -} -function array2s(values, prefix, sep, suffix, noindices, first, i, s) { - if (!prefix) prefix = "[" - if (!sep) sep = ", " - if (!suffix) suffix = "]" - s = prefix - first = 1 - for (i in values) { - if (first) first = 0 - else s = s sep - if (!noindices) s = s "[" i "]=" - s = s values[i] - } - s = s suffix - return s -} -function array2so(values, prefix, sep, suffix, noindices, count, indices, i, s) { - if (!prefix) prefix = "[" - if (!sep) sep = ", " - if (!suffix) suffix = "]" - s = prefix - count = mkindices(values, indices) - for (i = 1; i <= count; i++) { - if (i > 1) s = s sep - if (!noindices) s = s "[" indices[i] "]=" - s = s values[indices[i]] - } - s = s suffix - return s -} -function array_join(values, sep, prefix, suffix, count, indices, i, s) { - s = prefix - count = mkindices(values, indices) - for (i = 1; i <= count; i++) { - if (i > 1) s = s sep - s = s values[indices[i]] - } - s = s suffix - return s -} -function printto(s, output) { - if (output == "") { - print s - } else if (output ~ /^>>/) { - sub(/^>>/, "", output) - print s >>output - } else if (output ~ /^>/) { - sub(/^>/, "", output) - print s >output - } else { - print s >output - } -} -function find_line(input, field, value, orig, line) { - orig = $0 - line = "" - while ((getline 0) { - if ($field == value) { - line = $0 - break - } - } - close(input) - $0 = orig - return line -} -function merge_line(input, field, key, line) { - line = find_line(input, field, $key) - if (line != "") $0 = $0 FS line -} -function __csv_parse_quoted(line, destl, colsep, qchar, echar, pos, tmpl, nextc, resl) { - line = substr(line, 2) - resl = "" - while (1) { - pos = index(line, qchar) - if (pos == 0) { - resl = resl line - destl[0] = "" - destl[1] = 0 - return resl - } - if (echar != "" && pos > 1) { - prevc = substr(line, pos - 1, 1) - quotec = substr(line, pos, 1) - nextc = substr(line, pos + 1, 1) - if (prevc == echar) { - tmpl = substr(line, 1, pos - 2) - resl = resl tmpl quotec - line = substr(line, pos + 1) - continue - } - tmpl = substr(line, 1, pos - 1) - if (nextc == colsep || nextc == "") { - resl = resl tmpl - destl[0] = substr(line, pos + 2) - destl[1] = nextc == colsep - return resl - } else { - resl = resl tmpl quotec - line = substr(line, pos + 1) - } - } else { - tmpl = substr(line, 1, pos - 1) - quotec = substr(line, pos, 1) - nextc = substr(line, pos + 1, 1) - if (nextc == colsep || nextc == "") { - resl = resl tmpl - destl[0] = substr(line, pos + 2) - destl[1] = nextc == colsep - return resl - } else if (nextc == qchar) { - resl = resl tmpl quotec - line = substr(line, pos + 2) - } else { - resl = resl tmpl quotec - line = substr(line, pos + 1) - } - } - } -} -function __csv_parse_unquoted(line, destl, colsep, qchar, echar, pos) { - pos = index(line, colsep) - if (pos == 0) { - destl[0] = "" - destl[1] = 0 - return line - } else { - destl[0] = substr(line, pos + 1) - destl[1] = 1 - return substr(line, 1, pos - 1) - } -} -function __array_parsecsv(fields, line, nbfields, colsep, qchar, echar, shouldparse, destl, i) { - array_new(fields) - array_new(destl) - i = 1 - shouldparse = 0 - while (shouldparse || line != "") { - if (index(line, qchar) == 1) { - value = __csv_parse_quoted(line, destl, colsep, qchar, echar) - line = destl[0] - shouldparse = destl[1] - } else { - value = __csv_parse_unquoted(line, destl, colsep, qchar, echar) - line = destl[0] - shouldparse = destl[1] - } - fields[i] = value - i = i + 1 - } - if (nbfields) { - nbfields = int(nbfields) - i = array_len(fields) - while (i < nbfields) { - i++ - fields[i] = "" - } - } - return array_len(fields) -} -BEGIN { - DEFAULT_COLSEP = "," - DEFAULT_QCHAR = "\"" - DEFAULT_ECHAR = "" -} -function array_parsecsv2(fields, line, nbfields, colsep, qchar, echar) { - return __array_parsecsv(fields, line, nbfields, colsep, qchar, echar) -} -function array_parsecsv(fields, line, nbfields, colsep, qchar, echar) { - if (colsep == "") colsep = DEFAULT_COLSEP - if (qchar == "") qchar = DEFAULT_QCHAR - if (echar == "") echar = DEFAULT_ECHAR - return __array_parsecsv(fields, line, nbfields, colsep, qchar, echar) -} -function parsecsv(line, fields) { - array_parsecsv(fields, line) - array_getline(fields) - return NF -} -function getlinecsv(file, fields) { - if (file) { - getline 1) line = line colsep - if (qchar != "" && index(value, qchar) != 0) { - if (echar != "") gsub(qchar, quote_subrepl(echar) "&", value); - else gsub(qchar, "&&", value); - } - if (qchar != "" && (index(value, mvsep) != 0 || index(value, colsep) != 0 || index(value, qchar) != 0 || __csv_should_quote(value))) { - line = line qchar value qchar - } else { - line = line value - } - } - return line -} -function array_formatcsv(fields) { - return array_formatcsv2(fields, ",", ";", "\"", "") -} -function array_printcsv(fields, output) { - printto(array_formatcsv(fields), output) -} -function get_formatcsv( fields) { - array_fill(fields) - return array_formatcsv(fields) -} -function formatcsv() { - $0 = get_formatcsv() -} -function printcsv(output, fields) { - array_fill(fields) - array_printcsv(fields, output) -} -function array_findcsv(fields, input, field, value, nbfields, orig, found, i) { - array_new(orig) - array_fill(orig) - array_new(fields) - found = 0 - while ((getline 0) { - array_parsecsv(fields, $0, nbfields) - if (fields[field] == value) { - found = 1 - break - } - } - close(input) - array_getline(orig) - if (!found) { - delete fields - if (nbfields) { - nbfields = int(nbfields) - i = array_len(fields) - while (i < nbfields) { - i++ - fields[i] = "" - } - } - } - return found -} - -function __and(var, x, l_res, l_i) { - l_res=0; - for (l_i=0; l_i < 8; l_i++){ - if (var%2 == 1 && x%2 == 1) l_res=l_res/2 + 128; - else l_res/=2; - var=int(var/2); - x=int(x/2); - } - return l_res; -} -function __lshift(var, x) { - while(x > 0){ - var*=2; - x--; - } - return var; -} -function __rshift(var, x) { - while(x > 0){ - var=int(var/2); - x--; - } - return var; -} -BEGIN { - __BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" -} -function b64decode(src, result, base1, base2, base3, base4) { - result = "" - while (length(src) > 0) { - base1 = substr(src, 1, 1) - base2 = substr(src, 2, 1) - base3 = substr(src, 3, 1); if (base3 == "") base3 = "=" - base4 = substr(src, 4, 1); if (base4 == "") base4 = "=" - byte1 = index(__BASE64, base1) - 1 - if (byte1 < 0) byte1 = 0 - byte2 = index(__BASE64, base2) - 1 - if (byte2 < 0) byte2 = 0 - byte3 = index(__BASE64, base3) - 1 - if (byte3 < 0) byte3 = 0 - byte4 = index(__BASE64, base4) - 1 - if (byte4 < 0) byte4 = 0 - result = result sprintf( "%c", __lshift(__and(byte1, 63), 2) + __rshift(__and(byte2, 48), 4) ) - if (base3 != "=") result = result sprintf( "%c", __lshift(__and(byte2, 15), 4) + __rshift(__and(byte3, 60), 2) ) - if (base4 != "=") result = result sprintf( "%c", __lshift(__and(byte3, 3), 6) + byte4 ) - src = substr(src, 5) - } - return result -} -' -function awkdef() { - - if [ "${1:0:3}" == "-f" ]; then - shift - echo "$__AWKDEF_FUNCTIONS" - fi - if [ $# -gt 0 ]; then - local __ad_arg __ad_vpos __ad_name __ad_value - echo "BEGIN {" - while [ -n "${1:0:1}" ]; do - __ad_arg="${1:0:256}" - local __ad_array= - if [ "${__ad_arg%\[@\]}" != "$__ad_arg" ]; then - __ad_array=1 - __ad_name="${__ad_arg%\[@\]}" - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_value="$__ad_name" - elif [[ "$__ad_arg" == *\[@\]=* ]]; then - __ad_array=1 - __ad_name="${__ad_arg%%\[@\]=*}" - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_vpos=$((${#__ad_name} + 4)) - __ad_value="${1:$__ad_vpos}" - [ ${#__ad_value} -ne 0 ] || __ad_value="$__ad_name" - elif [[ "$__ad_arg" == *=* ]]; then - local __ad_int= __ad_str= - __ad_name="${__ad_arg%%=*}" - __ad_vpos=$((${#__ad_name} + 1)) - if [ "${__ad_name%:int}" != "$__ad_name" ]; then - __ad_int=1 - __ad_name="${__ad_name%:int}" - elif [ "${__ad_name%:str}" != "$__ad_name" ]; then - __ad_str=1 - __ad_name="${__ad_name%:str}" - fi - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_value="${1:$__ad_vpos}" - if [ -n "$__ad_int" ]; then - echo "$__ad_name = int($(quoted_awk "$__ad_value") + 0)" - elif [ -n "$__ad_str" ]; then - echo "$__ad_name = $(quoted_awk "$__ad_value")" - elif [ ${#__ad_value} -lt 256 ] && isnum "$__ad_value"; then - echo "$__ad_name = $__ad_value" - else - echo "$__ad_name = $(quoted_awk "$__ad_value")" - fi - else - break - fi - if [ -n "$__ad_array" ]; then - if [ "${__ad_value:0:2}" == $'<\n' ]; then - local -a __ad_values - array_from_lines __ad_values "${__ad_value:2}" - __ad_value=__ad_values - fi - __ad_value="${__ad_value}[@]" - local __ad_i=1 - echo "$__ad_name[0] = 0; delete $__ad_name" - for __ad_arg in "${!__ad_value}"; do - echo "$__ad_name[$__ad_i]=$(quoted_awk "$__ad_arg")" - __ad_i=$(($__ad_i + 1)) - done - eval "echo \"\${__ad_name}_count = \${#$__ad_value}\"" - fi - shift - done - echo "}" - for __ad_arg in "$@"; do - rawecho "$__ad_arg" - done - fi -} -function lawkrun() { - local -a __ar_defs __ar_args - while [ $# -gt 0 -a "$1" != "--" ]; do - __ar_defs=("${__ar_defs[@]}" "$1") - shift - done - shift - while [ $# -gt 0 ]; do - __ar_args=("${__ar_args[@]}" "$1") - shift - done - local __ar_script="$(awkdef "${__ar_defs[@]}")" - awk "$__ar_script" "${__ar_args[@]}" -} -function cawkrun() { LANG=C lawkrun "$@"; } -function awkrun() { LANG=C lawkrun "$@"; } - -function __lf_get_age() { - local y=$(date "+%Y") - local dy=$(date "+%j"); while [ "${dy#0}" != "$dy" ]; do dy="${dy#0}"; done - [ -n "$dy" ] || dy=0 - local h=$(date "+%H"); while [ "${h#0}" != "$h" ]; do h="${h#0}"; done - [ -n "$h" ] || h=0 - echo $((($y * 365 + $dy) * 24 + $h)) -} -function lf_trylock() { - local eoo lockfile max_hours=4 - while [ -n "$1" ]; do - case "$1" in - -h) shift; max_hours="$1";; - --) shift; eoo=1;; - *) eoo=1;; - esac - [ -n "$eoo" ] && break - shift - done - - lockfile="$1" - [ -n "$lockfile" ] || die "il faut spécifier un fichier pour le verrou" - - local now="$(__lf_get_age)" - if (set -C; echo "$now" >"$lockfile") 2>/dev/null; then - return 0 - fi - local prev diff - if prev="$(<"$lockfile")"; then - diff="$(($now - $prev))" - if [ "$diff" -gt "$max_hours" ]; then - echo stale - else - echo locked - fi - elif [ -f "$lockfile" ]; then - echo retry - fi - return 1 -} -function pidfile_set() { - local eoo pidfile pid=$$ replace= - while [ -n "$1" ]; do - case "$1" in - -p) - shift - pid="$1" - ;; - -r) - replace=1 - ;; - --) - shift - eoo=1 - ;; - *) - eoo=1 - ;; - esac - [ -n "$eoo" ] && break - shift - done - - pidfile="$1" - [ -n "$pidfile" ] || return 10 - - if [ -f "$pidfile" ]; then - local curpid="$(<"$pidfile")" - if is_running "$curpid"; then - return 1 - elif [ -n "$replace" ]; then - /bin/rm -f "$pidfile" || return 10 - else - return 2 - fi - fi - - echo_ "$pid" >"$pidfile" || return 10 - autoclean "$pidfile" - return 0 -} -function pidfile_check() { - local pidfile="$1" - [ -n "$pidfile" ] || return 10 - - if [ -f "$pidfile" ]; then - [ -r "$pidfile" ] || return 10 - local pid="$(<"$pidfile")" - is_running "$pid" && return 0 - fi - return 1 -} -function page_maybe() { - if isatty; then - less -XF "$@" - else - cat - fi -} - - -function utools_local() { - local arg - [ $# -gt 0 ] || set -- opts verbosity interaction - for arg in "$@"; do - case "$arg" in - parse_opts|opts|o|args) echo "local -a args";; - verbosity|v) echo "local __verbosity='$__verbosity'";; - interaction|i) echo "local __interaction='$__interaction'";; - esac - done -} - -function isatty() { - tty -s <&1 -} -function in_isatty() { - tty -s -} -function out_isatty() { - tty -s <&1 -} -function err_isatty() { - tty -s <&2 -} -function die() { [ $# -gt 0 ] && eerror "$@"; exit 1; } -function exit_with { if [ $# -gt 0 ]; then "$@"; fi; exit $?; } -function die_with { [ $# -gt 0 ] && eerror "$1"; shift; [ $# -gt 0 ] && "$@"; exit 1; } -function die_unless() { - local count=$# - if [ $count -eq 0 ]; then - exit 1 - elif [ $count -eq 1 ]; then - "$@" || exit $? - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - : - else - r=$? - eerror "$m" - exit $r - fi - fi -} -function eerror_unless() { - local count=$# - if [ $count -eq 0 ]; then - return 1 - elif [ $count -eq 1 ]; then - "$@" || return $? - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - : - else - r=$? - eerror "$m" - return $r - fi - fi -} -function die_if() { - local count=$# - if [ $count -eq 0 ]; then - : - elif [ $count -eq 1 ]; then - "$@" && exit 1 - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - eerror "$m" - exit 1 - fi - fi -} -function eerror_if() { - local count=$# - if [ $count -eq 0 ]; then - : - elif [ $count -eq 1 ]; then - "$@" && return 1 - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - eerror "$m" - return 1 - fi - fi -} - -TAB=$'\t' -LATIN1=iso-8859-1 -LATIN9=iso-8859-15 -UTF8=utf-8 -OENC="$UTF8" - -if ! progexists iconv; then - function iconv() { cat; } -fi - -function __lang_encoding() { - local lang="$(<<<"$LANG" awk '{ print tolower($0) }')" - case "$lang" in - *@euro) echo "iso-8859-15";; - *.utf-8|*.utf8) echo "utf-8";; - *) echo "iso-8859-1";; - esac -} -function __norm_encoding() { - awk '{ - enc = tolower($0) - gsub(/^latin$/, "latin1", enc) - gsub(/^latin1$/, "iso-8859-1", enc) - gsub(/^latin9$/, "iso-8859-15", enc) - gsub(/[-_]/, "", enc) - if (enc == "iso8859" || enc == "iso88591" || enc == "8859" || enc == "88591") print "iso-8859-1" - else if (enc == "iso885915" || enc == "885915") print "iso-8859-15" - else if (enc == "utf" || enc == "utf8") print "utf-8" - else print $0 - }' <<<"$1" -} -function __init_encoding() { - local DEFAULT_ENCODING="$(__lang_encoding)" - [ -n "$DEFAULT_ENCODING" ] || DEFAULT_ENCODING=utf-8 - [ -n "$UTOOLS_OUTPUT_ENCODING" ] || UTOOLS_OUTPUT_ENCODING="$DEFAULT_ENCODING" - UTOOLS_OUTPUT_ENCODING="$(__norm_encoding "$UTOOLS_OUTPUT_ENCODING")" - [ -n "$UTOOLS_INPUT_ENCODING" ] || UTOOLS_INPUT_ENCODING="$UTOOLS_OUTPUT_ENCODING" - UTOOLS_INPUT_ENCODING="$(__norm_encoding "$UTOOLS_INPUT_ENCODING")" - [ -n "$UTOOLS_EDITOR_ENCODING" ] || UTOOLS_EDITOR_ENCODING="$UTOOLS_INPUT_ENCODING" - UTOOLS_EDITOR_ENCODING="$(__norm_encoding "$UTOOLS_EDITOR_ENCODING")" - - IENC="$UTOOLS_INPUT_ENCODING" - OENC="$UTOOLS_OUTPUT_ENCODING" -} - -if [ -n "$UTOOLS_LANG" -a -z "$LANG" ]; then - export UTOOLS_LANG - export LANG="$UTOOLS_LANG" -fi -__init_encoding - -function tooenc() { - local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - rawecho "$src" - else - iconv -f "$from" -t "$to" <<<"$src" - fi -} -function uecho() { - tooenc "$*" -} -function tooenc_() { - local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - rawecho_ "$src" - else - rawecho_ "$src" | iconv -f "$from" -t "$to" - fi -} -function uecho_() { - tooenc_ "$*" -} -function toienc() { - local __tie_var="$1" __tie_to="${2:-$IENC}" __tie_from="${3:-$UTOOLS_INPUT_ENCODING}" - if [ "$__tie_from" != "$__tie_to" ]; then - set_var "$__tie_var" "$(iconv -f "$__tie_from" -t "$__tie_to" <<<"${!__tie_var}")" - fi -} -function uread() { - [ $# -gt 0 ] || set -- REPLY - local __r_var - read "$@" - for __r_var in "$@"; do - [ -z "$__r_var" -o "${__r_var:0:1}" == "-" ] && continue # ignorer les options - toienc "$__r_var" - done -} - -function stooenc() { - local from="${1:-$OENC}" to="${2:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - cat - else - iconv -f "$from" -t "$to" - fi -} -function stoienc() { - local to="${1:-$IENC}" from="${2:-$UTOOLS_INPUT_ENCODING}" - if [ "$from" == "$to" ]; then - cat - else - iconv -f "$from" -t "$to" - fi -} - -export UTOOLS_EDATE -function __edate() { [ -n "$UTOOLS_EDATE" ] && date +"[%d/%m/%Y-%H:%M:%S] "; } - -export UTOOLS_ELOG_OVERWRITE -function __set_no_colors() { :; } -function elogto() { - UTOOLS_EDATE=1 - if [ -n "$1" -a -n "$2" ]; then - LANG=fr_FR.UTF8 - UTOOLS_OUTPUT_ENCODING="$UTF8" - __set_no_colors 1 - if [ -n "$UTOOLS_ELOG_OVERWRITE" ]; then - exec >"$1" 2>"$2" - else - exec >>"$1" 2>>"$2" - fi - elif [ -n "$1" ]; then - LANG=fr_FR.UTF8 - UTOOLS_OUTPUT_ENCODING="$UTF8" - __set_no_colors 1 - if [ -n "$UTOOLS_ELOG_OVERWRITE" ]; then - exec >"$1" 2>&1 - else - exec >>"$1" 2>&1 - fi - fi -} - -export __estack __tlevel -function __indent() { - if [ "${1/ -/}" != "$1" ]; then - sed "2,\$s/^/${__tlevel}/g" <<<"$1" - else - rawecho "$1" - fi -} -function __eerror() { tooenc "$(__edate)${__tlevel}* error: $(__indent "$1")"; } -function __ewarn() { tooenc "$(__edate)${__tlevel}* warning: $(__indent "$1")"; } -function __enote() { tooenc "$(__edate)${__tlevel}* note: $(__indent "$1")"; } -function __ebanner() { - local maxi="${COLUMNS:-80}" - local -a lines - local psfix line - - psfix="$(__edate)${__tlevel}" - while [ ${#psfix} -lt $maxi ]; do psfix="$psfix="; done - - tooenc "$psfix" - maxi=$(($maxi - 1)) - array_from_xlines lines "$1" - for line in "" "${lines[@]}" ""; do - line="$(__edate)${__tlevel}= $line" - if [ ${#line} -le $maxi ]; then - while [ ${#line} -lt $maxi ]; do line="$line "; done - line="$line=" - fi - tooenc "$line" - done - tooenc "$psfix" -} -function __eimportant() { tooenc "$(__edate)${__tlevel}* important: $(__indent "$1")"; } -function __eattention() { tooenc "$(__edate)${__tlevel}* attention: $(__indent "$1")"; } -function __einfo() { tooenc "$(__edate)${__tlevel}* info: $(__indent "$1")"; } -function __eecho() { tooenc "$(__edate)${__tlevel}$(__indent "$1")"; } -function __eecho_() { tooenc_ "$(__edate)${__tlevel}$(__indent "$1")"; } -function __edebug() { tooenc "$(__edate)${__tlevel}* debug: $(__indent "$1")"; } -function __estep() { tooenc "$(__edate)${__tlevel}* $(__indent "$1")"; } -function __estepe() { __estep "$@"; } -function __estepw() { __estep "$@"; } -function __estepn() { __estep "$@"; } -function __estepi() { __estep "$@"; } -function __estep_() { tooenc_ "$(__edate)${__tlevel}* $(__indent "$1")"; } -function __estepe_() { __estep_ "$@"; } -function __estepw_() { __estep_ "$@"; } -function __estepn_() { __estep_ "$@"; } -function __estepi_() { __estep_ "$@"; } -function __etitle() { tooenc "$(__edate)${__tlevel}+++ $(__indent "$1")"; } -function __ebegin() { tooenc_ "$(__edate)${__tlevel}* $(__indent "$1"): "; } -function __edoto() { echo_ "."; } -function __edotw() { echo_ "w"; } -function __edotx() { echo_ "x"; } -function __edotp() { echo_ "+"; } -function __edotd() { tooenc "($1)"; } -function __eendo() { echo "[ok]"; } -function __eendx() { echo "[error]"; } -PRETTYOPTS=() -function set_verbosity() { :;} -function set_interaction() { :;} -function show_error() { - return 0 -} -function show_warn() { - return 0 -} -function show_info() { - return 0 -} -function show_verbose() { - return 0 -} -function show_debug() { - [ -n "$DEBUG" ] -} -function check_verbosity() { - return 0 -} -function get_verbosity_option() { :;} -function check_interaction() { - return 0 -} -function is_interaction() { - return 1 -} -function get_interaction_option() { :;} -__epending= -function eflush() { - if [ -n "$__epending" ]; then rawecho "$__epending" 1>&2; __epending=; fi -} -function eclearp() { - __epending= -} -function eerror() { - show_error || return; eflush; __eerror "$*" 1>&2 -} -function ewarn() { - show_warn || return; eflush; __ewarn "$*" 1>&2 -} -function enote() { - show_info || return; eflush; __enote "$*" 1>&2 -} -function ebanner() { - show_error || return; eflush; __ebanner "$*" 1>&2; sleep 5 -} -function eimportant() { - show_error || return; eflush; __eimportant "$*" 1>&2 -} -function eattention() { - show_warn || return; eflush; __eattention "$*" 1>&2 -} -function einfo() { - show_info || return; eflush; __einfo "$*" 1>&2 -} -function eecho() { - show_info || return; eflush; __eecho "$*" 1>&2 -} -function eecho_() { - show_info || return; eflush; __eecho_ "$*" 1>&2 -} -function edebug() { - show_debug || return; eflush; __edebug "$*" 1>&2 -} -function trace() { - local r cmd="$(quoted_args "$@")" - show_info && { eflush; __eecho "\$ $cmd" 1>&2; } - "$@"; r=$? - if [ $r -ne 0 ]; then - if show_info; then - eflush; __eecho "^ [EC #$r]" 1>&2 - elif show_error; then - eflush; __eecho "^ $cmd [EC #$r]" 1>&2; - fi - fi - return $r -} -function trace_error() { - local r - "$@"; r=$? - if [ $r -ne 0 ]; then - local cmd="$(quoted_args "$@")" - show_error && { eflush; __eecho "^ $cmd [EC #$r]" 1>&2; } - fi - return $r -} - -function etitle() { - local __t_deferred= - __t_etitle "$@" -} -function etitled() { - local __t_deferred=1 - __t_etitle "$@" -} -function __t_etitle() { - local __t_eend=default - local __t_clearp= - while [ -n "$1" ]; do - if [ "$1" == "--" ]; then - shift - break - elif [ "$1" == "-s" ]; then - __t_eend= - shift - elif [ "$1" == "--eend" ]; then - __t_eend=1 - shift - elif [ "$1" == "-p" ]; then - __t_clearp=1 - shift - else - break - fi - done - local __t_title="$1"; shift - local __t_s=0 - [ -n "$__estack" ] && __tlevel="${__tlevel} " - __estack="$__estack:t" - if show_info; then - if [ -n "$__t_deferred" ]; then - __epending="${__epending:+$__epending -}$(__etitle "$__t_title")" - else - eflush - __etitle "$__t_title" 1>&2 - fi - fi - if [ $# -gt 0 ]; then - "$@" - __t_s=$? - [ "$__t_eend" == "default" ] && __t_eend=1 - fi - [ "$__t_eend" == "default" ] && __t_eend= - if [ -n "$__t_eend" ]; then - eend $__t_s - [ -n "$__t_clearp" ] && eclearp - fi - return $__t_s -} -function estep() { - show_info || return; eflush; __estep "$*" 1>&2 -} -function estepe() { - show_info || return; eflush; __estepe "$*" 1>&2 -} -function estepw() { - show_info || return; eflush; __estepw "$*" 1>&2 -} -function estepn() { - show_info || return; eflush; __estepn "$*" 1>&2 -} -function estepi() { - show_info || return; eflush; __estepi "$*" 1>&2 -} -function estep_() { - show_info || return; eflush; __estep_ "$*" 1>&2 -} -function estepe_() { - show_info || return; eflush; __estepe_ "$*" 1>&2 -} -function estepw_() { - show_info || return; eflush; __estepw_ "$*" 1>&2 -} -function estepn_() { - show_info || return; eflush; __estepn_ "$*" 1>&2 -} -function estepi_() { - show_info || return; eflush; __estepi_ "$*" 1>&2 -} -function ebegin() { - local __b_eend=default - while [ -n "$1" ]; do - if [ "$1" == "--" ]; then - shift - break - elif [ "$1" == "-s" ]; then - __b_eend= - shift - elif [ "$1" == "--eend" ]; then - __b_eend=1 - shift - else - break - fi - done - local __b_msg="$1"; shift - local __b_s=0 - __estack="$__estack:b" - if show_info; then - eflush - __ebegin "$__b_msg" 1>&2 - fi - if [ $# -gt 0 ]; then - "$@" - __b_s=$? - [ "$__b_eend" == "default" ] && __b_eend=1 - fi - [ "$__b_eend" == "default" ] && __b_eend= - [ -n "$__b_eend" ] && eend $__b_s - return $__b_s -} -function edot() { - local s=$? - show_info || return - eflush - [ -n "$1" ] && s="$1" - shift - if [ "$s" == "0" ]; then - __edoto 1>&2 - else - __edotx 1>&2 - fi - show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2 - return $s -} -function edotw() { - local s=$? - show_info || return - eflush - [ -n "$1" ] && s="$1" - shift - __edotw 1>&2 - show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2 - return $s -} -function ewait() { - [ -n "$1" ] || return 1 - if show_info; then - local count=2 - eflush - little_sleep # certains processus retournent tout de suite - while is_running "$1"; do - sleep 1 - if [ $count -gt 0 ]; then - count=$(($count - 1)) - else - __edotp 1>&2 - fi - done - __edoto 1>&2 - else - wait "$1" - fi -} -function eend() { - local s=$? - if [ "$1" == "-c" ]; then - __estack= - __tlevel= - elif [ "${__estack%:b}" != "$__estack" ]; then - __estack="${__estack%:b}" - show_info || return - eflush - [ -n "$1" ] && s="$1" - if [ "$s" == "0" ]; then - __eendo 1>&2 - else - __eendx 1>&2 - fi - elif [ "${__estack%:t}" != "$__estack" ]; then - __estack="${__estack%:t}" - __tlevel="${__tlevel% }" - fi -} -function ask_yesno() { - local interactive=1 - if [[ "$1" == -* ]]; then - if [ "$1" != -- ]; then - check_interaction "$1" || interactive= - fi - shift - else - check_interaction -c || interactive= - fi - local default="${2:-N}" - if [ "$default" == "C" ]; then - [ -n "$interactive" ] && default=N || default=O - elif [ "$default" == "X" ]; then - [ -n "$interactive" ] && default=O || default=N - fi - if [ -n "$interactive" ]; then - eflush - local message="$1" - local prompt="[oN]" - local r - is_yes "$default" && prompt="[On]" - if [ -n "$message" ]; then - tooenc_ "$message" 1>&2 - else - tooenc_ "Voulez-vous continuer?" "$UTF8" 1>&2 - fi - tooenc_ " $prompt " "$UTF8" 1>&2 - uread r - is_yes "${r:-$default}" - else - is_yes "$default" - fi -} -function read_value() { - local -a __rv_opts __rv_readline=1 __rv_showdef=1 __rv_nl= - __rv_opts=() - [ -n "$UTOOLS_NO_READLINE" ] && __rv_readline= - __rv_read "$@" -} -function read_password() { - local -a __rv_opts __rv_readline= __rv_showdef= __rv_nl=1 - __rv_opts=(-s) - __rv_read "$@" -} -function __rv_read() { - local __rv_int=1 - if [[ "$1" == -* ]]; then - if [ "$1" != -- ]; then - check_interaction "$1" || __rv_int= - fi - shift - else - check_interaction -c || __rv_int= - fi - local __rv_msg="$1" __rv_v="${2:-value}" __rv_d="$3" __rv_re="${4:-O}" - if [ -z "$__rv_int" ]; then - if is_yes "$__rv_re" && [ -z "$__rv_d" ]; then - OENC="$UTF8" eerror "La valeur par défaut de $__rv_v doit être non vide" - return 1 - fi - set_var "$__rv_v" "$__rv_d" - return 0 - fi - - eflush - local __rv_r - while true; do - if [ -n "$__rv_msg" ]; then - tooenc_ "$__rv_msg" 1>&2 - else - tooenc_ "Entrez la valeur" "$UTF8" 1>&2 - fi - if [ -n "$__rv_readline" ]; then - tooenc_ ": " "$UTF8" 1>&2 - uread -e ${__rv_d:+-i"$__rv_d"} "${__rv_opts[@]}" __rv_r - else - if [ -n "$__rv_d" ]; then - if [ -n "$__rv_showdef" ]; then - tooenc_ " [$__rv_d]" 1>&2 - else - tooenc_ " [****]" 1>&2 - fi - fi - tooenc_ ": " "$UTF8" 1>&2 - uread "${__rv_opts[@]}" __rv_r - [ -n "$__rv_nl" ] && echo - fi - __rv_r="${__rv_r:-$__rv_d}" - if [ -n "$__rv_r" ] || ! is_yes "$__rv_re"; then - set_var "$__rv_v" "$__rv_r" - return 0 - fi - done -} -function simple_menu() { - local __sm_title= __sm_yourchoice= __sm_default= - local -a __sm_args - parse_opts -t: __sm_title= -m: __sm_yourchoice= -d: __sm_default= @ __sm_args -- "$@" && - set -- "${__sm_args[@]}" || ewarn "$__sm_args" - - local __sm_option_var="${1:-option}" __sm_options_var="${2:-options}" - local __sm_option __sm_options - __sm_options="$__sm_options_var[*]" - if [ -z "${!__sm_options}" ]; then - OENC="$UTF8" eerror "Le tableau $__sm_options_var doit être non vide" - return 1 - fi - [ -z "$__sm_default" ] && __sm_default="${!__sm_option_var}" - - eflush - array_copy __sm_options "$__sm_options_var" - local __sm_c=0 __sm_i __sm_choice - while true; do - if [ "$__sm_c" == "0" ]; then - [ -n "$__sm_title" ] && tooenc "=== $__sm_title ===" 1>&2 - __sm_i=1 - for __sm_option in "${__sm_options[@]}"; do - if [ "$__sm_option" == "$__sm_default" ]; then - tooenc "$__sm_i*- $__sm_option" 1>&2 - else - tooenc "$__sm_i - $__sm_option" 1>&2 - fi - let __sm_i=$__sm_i+1 - done - fi - - if [ -n "$__sm_yourchoice" ]; then - tooenc_ "$__sm_yourchoice" 1>&2 - else - tooenc_ "Entrez le numéro de l'option choisie" "$UTF8" 1>&2 - fi - tooenc_ ": " "$UTF8" 1>&2 - uread __sm_choice - - if [ -z "$__sm_choice" -a -n "$__sm_default" ]; then - __sm_option="$__sm_default" - break - fi - if [ -n "$__sm_choice" -a -z "${__sm_choice//[0-9]/}" ]; then - if [ "$__sm_choice" -gt 0 -a "$__sm_choice" -le "${#__sm_options[*]}" ]; then - __sm_option="${__sm_options[$(($__sm_choice - 1))]}" - break - else - OENC="$UTF8" eerror "Numéro d'option incorrect" - fi - else - OENC="$UTF8" eerror "Vous devez saisir le numéro de l'option choisie" - fi - - let __sm_c=$__sm_c+1 - if [ "$__sm_c" -eq 5 ]; then - tooenc "" "$UTF8" 1>&2 - __sm_c=0 - fi - done - set_var "$__sm_option_var" "$__sm_option" -} - -function actions_menu() { - local -a __am_action_descs __am_options __am_void_actions - local __am_tmp __am_select_action __am_select_option __am_title __am_optyc __am_actyc - local __am_default_action=auto __am_quit_action=auto - local __am_default_option= - local -a __am_args - parse_opts \ - -t: __am_title= \ - -m: __am_optyc= \ - -M: __am_actyc= \ - -e: __am_void_actions \ - -d: __am_default_action= \ - -q: __am_quit_action= \ - -o: __am_default_option= \ - @ __am_args -- "$@" && set -- "${__am_args[@]}" || { eerror "$__am_args"; return 1; } - - __am_tmp="${1:-action}"; __am_select_action="${!__am_tmp}" - __am_tmp="${2:-option}"; __am_select_option="${!__am_tmp}" - [ -n "$__am_default_option" ] && __am_select_option="$__am_default_option" - array_copy __am_action_descs "${3:-actions}" - array_copy __am_options "${4:-options}" - - eerror_unless [ ${#__am_action_descs[*]} -gt 0 ] "Vous devez spécifier le tableau des actions" || return - __actions_menu || return 1 - setv "${1:-action}" "$__am_select_action" - setv "${2:-option}" "$__am_select_option" -} -function __actions_menu() { - local title="$__am_title" - local optyc="$__am_optyc" actyc="$__am_actyc" - local default_action="$__am_default_action" - local quit_action="$__am_quit_action" - local select_action="$__am_select_action" - local select_option="$__am_select_option" - local -a action_descs options void_actions - array_copy action_descs __am_action_descs - array_copy options __am_options - array_copy void_actions __am_void_actions - - local no_options - array_isempty options && no_options=1 - - local -a actions - local tmp action name - for tmp in "${action_descs[@]}"; do - splitfsep2 "$tmp" : action name - [ -n "$action" ] || action="${name:0:1}" - action="$(strlower "$action")" - array_addu actions "$action" - done - - if [ "$default_action" == auto ]; then - default_action="$select_action" - if [ -n "$default_action" ]; then - array_contains actions "$default_action" || default_action= - fi - [ -n "$default_action" ] || default_action="${actions[0]}" - fi - default_action="${default_action:0:1}" - default_action="$(strlower "$default_action")" - - if [ "$quit_action" == auto ]; then - if [ ${#actions[*]} -gt 1 ]; then - quit_action="${actions[@]:$((-1)):1}" - array_addu void_actions "$quit_action" - fi - fi - quit_action="${quit_action:0:1}" - quit_action="$(strlower "$quit_action")" - - local action_title - for tmp in "${action_descs[@]}"; do - splitfsep2 "$tmp" : action name - [ -n "$action" ] || action="${name:0:1}" - [ -n "$name" ] || name="$action" - action="$(strlower "$action")" - if [ -n "$no_options" ]; then - if ! array_contains void_actions "$action"; then - array_del actions "$action" - continue - fi - fi - [ "$action" == "$default_action" ] && name="$name*" - action_title="${action_title:+$action_title/}$name" - done - if [ -n "$default_action" ]; then - array_contains actions "$default_action" || default_action= - fi - if [ -n "$quit_action" ]; then - array_contains actions "$quit_action" || quit_action= - fi - - if [ -n "$no_options" ]; then - if array_isempty void_actions; then - eerror "Aucune option n'est définie. Il faut définir le tableau des actions vides" - return 1 - fi - __void_actions_menu - else - __options_actions_menu - fi -} -function __void_actions_menu() { - eflush - local c=0 choice - while true; do - if [ $c -eq 0 ]; then - [ -n "$title" ] && __etitle "$title" 1>&2 - __eecho_ "=== Actions disponibles: " 1>&2 - tooenc "$action_title" 1>&2 - fi - if [ -n "$actyc" ]; then - __eecho_ "$actyc" 1>&2 - elif [ -n "$optyc" ]; then - __eecho_ "$optyc" 1>&2 - else - __eecho_ "Entrez l'action à effectuer" 1>&2 - fi - tooenc_ ": " 1>&2 - uread choice - if [ -z "$choice" -a -n "$default_action" ]; then - select_action="$default_action" - break - fi - - choice="${choice:0:1}" - choice="$(strlower "$choice")" - if array_contains actions "$choice"; then - select_action="$choice" - break - elif [ -n "$choice" ]; then - eerror "$choice: action incorrecte" - else - eerror "vous devez saisir l'action à effectuer" - fi - let c=$c+1 - if [ $c -eq 5 ]; then - tooenc "" 1>&2 - c=0 - fi - done - __am_select_action="$select_action" - __am_select_option= -} -function __options_actions_menu() { - eflush - local c=0 option choice action option - while true; do - if [ $c -eq 0 ]; then - [ -n "$title" ] && __etitle "$title" 1>&2 - i=1 - for option in "${options[@]}"; do - if [ "$option" == "$select_option" ]; then - tooenc "$i*- $option" 1>&2 - else - tooenc "$i - $option" 1>&2 - fi - let i=$i+1 - done - __estepn_ "Actions disponibles: " 1>&2 - tooenc "$action_title" 1>&2 - fi - if [ -n "$optyc" ]; then - __eecho_ "$optyc" 1>&2 - else - __eecho_ "Entrez l'action et le numéro de l'option choisie" 1>&2 - fi - tooenc_ ": " 1>&2 - uread choice - - if [ -z "$choice" -a -n "$default_action" ]; then - action="$default_action" - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - elif [ -n "$select_option" ]; then - select_action="$action" - break - fi - fi - action="${choice:0:1}" - action="$(strlower "$action")" - if array_contains actions "$action"; then - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - else - option="${choice:1}" - option="${option// /}" - if [ -z "$option" -a -n "$select_option" ]; then - select_action="$action" - break - elif [ -z "$option" ]; then - eerror "vous devez saisir le numéro de l'option" - elif isnum "$option"; then - if [ $option -gt 0 -a $option -le ${#options[*]} ]; then - select_action="$action" - select_option="${options[$(($option - 1))]}" - break - fi - else - eerror "$option: numéro d'option incorrecte" - fi - fi - elif isnum "$choice"; then - action="$default_action" - if [ -n "$action" ]; then - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - else - option="${choice// /}" - if [ -z "$option" ]; then - eerror "vous devez saisir le numéro de l'option" - elif isnum "$option"; then - if [ $option -gt 0 -a $option -le ${#options[*]} ]; then - select_action="$action" - select_option="${options[$(($option - 1))]}" - break - fi - else - eerror "$option: numéro d'option incorrecte" - fi - fi - else - eerror "Vous devez spécifier l'action à effectuer" - fi - elif [ -n "$choice" ]; then - eerror "$choice: action et/ou option incorrecte" - else - eerror "vous devez saisir l'action à effectuer" - fi - let c=$c+1 - if [ $c -eq 5 ]; then - tooenc "" 1>&2 - c=0 - fi - done - __am_select_action="$select_action" - __am_select_option="$select_option" -} - - -function __ac_forgetall() { __ac_files=(); } -__ac_forgetall -function __ac_trap() { - local file - for file in "${__ac_files[@]}"; do - [ -e "$file" ] && rm -rf "$file" 2>/dev/null - done - __ac_forgetall -} -trap __ac_trap 1 3 15 EXIT -function autoclean() { - local file - for file in "$@"; do - [ -n "$file" ] && array_add __ac_files "$file" - done -} -function ac_cleanall() { - __ac_trap -} -function ac_clean() { - local file - for file in "$@"; do - if array_contains __ac_files "$file"; then - [ -e "$file" ] && rm -rf "$file" 2>/dev/null - array_del __ac_files "$file" - fi - done -} -function ac_set_tmpfile() { - local __acst_d - if show_debug; then - if [ -n "$5" ]; then - is_yes "${!5}" && __acst_d=1 - else - __acst_d=1 - fi - fi - if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" - [ -f "$3" -a "$4" == keep ] || >"$3" - else - local __acst_t="$(mktempf "$2")" - autoclean "$__acst_t" - set_var "$1" "$__acst_t" - fi -} -function ac_set_tmpdir() { - local __acst_d - if show_debug; then - if [ -n "$4" ]; then - is_yes "${!4}" && __acst_d=1 - else - __acst_d=1 - fi - fi - if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" - mkdir -p "$3" - else - local __acst_t="$(mktempd "$2")" - autoclean "$__acst_t" - set_var "$1" "$__acst_t" - fi -} -function debug_tee() { - if show_debug; then - tee "$@" - else - cat - fi -} - - -function get_defaults_files() { - local __gd_dest="${1:-defaults}"; shift - local -a __gd_fs - local __gd_f __gd_found - for __gd_f in "$@"; do - __gd_found= - if [ -r "/etc/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "/etc/default/$__gd_f") - __gd_found=1 - fi - if [ -r "$HOME/etc/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "$HOME/etc/default/$__gd_f") - __gd_found=1 - fi - if [ -z "$__gd_found" -a -r "$scriptdir/lib/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "$scriptdir/lib/default/$__gd_f") - fi - done - array_copy "$__gd_dest" __gd_fs -} - -function set_defaults() { - local -a __sd_fs - local __sd_f - get_defaults_files __sd_fs "$@" - for __sd_f in "${__sd_fs[@]}"; do - source "$__sd_f" - done -} - - -: "${MYHOST:=$HOSTNAME}" -: "${MYHOSTNAME:=${MYHOST%%.*}}" -export MYHOST MYHOSTNAME - -function myhost() { - hostname -f 2>/dev/null || echo "$MYHOST" -} -function myhostname() { - hostname -s 2>/dev/null || echo "$MYHOSTNAME" -} -##@inc]base -uprovide base.tools -urequire base - -function base_umove() { - local -a args - local updatedir - args=(-d:,--updatedir: .) - parse_args_check "$@" || return; set -- "${args[@]}" - - eerror_unless [ -z "$updatedir" -o -d "$updatedir" ] "$updatedir: doit être un répertoire" || return - eerror_if [ $# -eq 0 ] "Vous devez spécifier les fichiers à déplacer" || return - eerror_if [ $# -eq 1 ] "Vous devez spécifier la destination" || return - - local -a srcs - local dest - - srcs=("$@") - setx dest=last_value srcs - array_del_last srcs - - if [ $# -eq 2 ]; then - if [ -d "$dest" ]; then - : # ce cas sera traité ci-dessous - elif [ -e "$dest" ]; then - eerror "$dest: refus d'écraser la destination" - return 1 - else - src="${srcs[0]}" - if [ -n "$updatedir" ]; then - if [ -L "$src" ]; then - ldest="$(readlinka "$src")" - array_find_links update_links "$ldest" "$updatedir" - else - array_find_links update_links "$src" "$updatedir" - fi - move_file "$src" "$dest" "${update_links[@]}" - else - move_link "$src" "$dest" - fi - return $? - fi - fi - - [ -d "$dest" ] || { - eerror "$dest: doit être un répertoire" - return 1 - } - for src in "${srcs[@]}"; do - if [ -n "$updatedir" ]; then - if [ -L "$src" ]; then - move_link "$src" "$dest" - else - array_find_links update_links "$src" "$updatedir" - move_file "$src" "$dest" "${update_links[@]}" - fi - else - move_link "$src" "$dest" - fi - done -} -##@inc]base.tools -##@inc[base.compat -## Fonctions de base: support des fonctions obsolètes et des versions de bash < 4.x -##@inc[base.core -## Fonctions de base: fondement -uprovide base.core - -function echo_() { - echo -n "$*" -} -function recho() { - if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - - local first="${1:1}"; shift - echo "$first$@" - else - echo "$@" - fi -} -function recho_() { - if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - - local first="${1:1}"; shift - echo -n "$first$@" - else - echo -n "$@" - fi -} -function _qval() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s//\$/\\\$}" - s="${s//\`/\\\`}" - recho_ "$s" -} -function should_quote() { - local l="${#1}" - [ $l -eq 0 -o $l -gt 80 ] && return 0 - local s="${*//[a-zA-Z0-9]/}" - s="${s//,/}" - s="${s//./}" - s="${s//+/}" - s="${s//\//}" - s="${s//-/}" - s="${s//_/}" - s="${s//=/}" - [ -n "$s" ] -} -function qval() { - echo -n \" - _qval "$@" - echo \" -} -function qvalm() { - if should_quote "$*"; then - echo -n \" - _qval "$@" - echo \" - else - recho "$*" - fi -} -function qvalr() { - if [ -z "$*" ]; then - : - elif should_quote "$*"; then - echo -n \" - _qval "$@" - echo \" - else - recho "$*" - fi -} -function qvals() { - local arg first=1 - for arg in "$@"; do - [ -z "$first" ] && echo -n " " - if should_quote "$arg"; then - echo -n \" - _qval "$arg" - echo -n \" - else - recho_ "$arg" - fi - first= - done - [ -z "$first" ] && echo -} -function qwc() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s//\$/\\\$}" - s="${s//\`/\\\`}" - local r a b - while [ -n "$s" ]; do - if [[ "$s" == *\** ]]; then - if [[ "$s" == *\?* ]]; then - a="${s%%\**}" - b="${s%%\?*}" - if [ ${#a} -lt ${#b} ]; then - s="${s#*\*}" - r="$r\"$a\"*" - else - s="${s#*\?}" - r="$r\"$b\"?" - fi - else - a="${s%%\**}" - s="${s#*\*}" - r="$r\"$a\"*" - fi - elif [[ "$s" == *\?* ]]; then - if [[ "$s" == *\** ]]; then - a="${s%%\**}" - b="${s%%\?*}" - if [ ${#a} -lt ${#b} ]; then - s="${s#*\*}" - r="$r\"$a\"*" - else - s="${s#*\?}" - r="$r\"$b\"?" - fi - else - a="${s%%\?*}" - s="${s#*\?}" - r="$r\"$a\"?" - fi - else - r="$r\"$s\"" - break - fi - done - recho_ "$r" -} -function qlines() { - sed "s/'/'\\\\''/g; s/.*/'&'/g" -} -function setv() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - eval "$__s_var=\"\$*\"" -} -function _setv() { - local __s_var="$1"; shift - eval "$__s_var=\"\$*\"" -} -function echo_setv() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - echo "$__s_var=$(qvalr "$*")" -} -function setx() { - if [ "$1" == -a ]; then - shift - local __s_array="$1"; shift - if [[ "$__s_array" == *=* ]]; then - set -- "${__s_array#*=}" "$@" - __s_array="${__s_array%%=*}" - fi - eval "$__s_array=($("$@" | qlines))" - else - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - eval "$__s_var="'"$("$@")"' - fi -} -function _setvx() { - local __s_var="$1"; shift - eval "$__s_var="'"$("$@")"' -} -function _setax() { - local __s_array="$1"; shift - eval "$__s_array=($("$@" | qlines))" -} -function evalx() { - local __e_val __e_arg __e_r=0 - local -a __e_cmd - - local __e_first=1 - while [ $# -gt 0 ]; do - __e_cmd=() - while [ $# -gt 0 ]; do - __e_arg="$1"; shift - [ "$__e_arg" == // ] && break - if [ "${__e_arg%//}" != "$__e_arg" ]; then - local __e_tmp="${__e_arg%//}" - if [ -z "${__e_tmp//\\/}" ]; then - __e_arg="${__e_arg#\\}" - __e_cmd=("${__e_cmd[@]}" "$__e_arg") - continue - fi - fi - __e_cmd=("${__e_cmd[@]}" "$__e_arg") - done - - if [ -n "$__e_first" ]; then - __e_val="$("${__e_cmd[@]}")" || __e_r=$? - else - __e_val="$("${__e_cmd[@]}" "$__e_val")" || __e_r=$? - fi - __e_first= - done - [ -n "$__e_val" ] && echo "$__e_val" - return $__e_r -} -function setxx() { - local -a __s_args - if [ "$1" == -a ]; then __s_args=(-a); shift; fi - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - __s_args=("${__s_args[@]}" "$__s_var") - setx "${__s_args[@]}" evalx "$@" -} -function evalp() { - local __e_arg __e_cmd - - while [ $# -gt 0 ]; do - __e_arg="$1"; shift - if [ "$__e_arg" == // ]; then - __e_cmd="$__e_cmd |" - continue - elif [ "${__e_arg%//}" != "$__e_arg" ]; then - local __e_tmp="${__e_arg%//}" - if [ -z "${__e_tmp//\\/}" ]; then - __e_arg="${__e_arg#\\}" - fi - fi - __e_cmd="${__e_cmd:+$__e_cmd }\"$(_qval "$__e_arg")\"" - done - eval "$__e_cmd" -} -function setxp() { - local -a __s_args - if [ "$1" == -a ]; then __s_args=(-a); shift; fi - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - __s_args=("${__s_args[@]}" "$__s_var") - setx "${__s_args[@]}" evalp "$@" -} -function testx() { - local __t_op="$1"; shift - local __t_val="$(evalx "$@")" - [ $__t_op "$__t_val" ] -} -function test2x() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalx "$@")" - [ "$__t_val1" $__t_op "$__t_val2" ] -} -function testrx() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalx "$@")" - eval '[[ "$__t_val1" '"$__t_op"' "$__t_val2" ]]' -} -function testp() { - local __t_op="$1"; shift - local __t_val="$(evalp "$@")" - [ $__t_op "$__t_val" ] -} -function test2p() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalp "$@")" - [ "$__t_val1" $__t_op "$__t_val2" ] -} -function testrp() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalp "$@")" - eval '[[ "$__t_val1" '"$__t_op"' "$__t_val2" ]]' -} - -function err2out() { - "$@" 2>&1 -} - -function is_defined() { - [ -n "$(declare -p "$1" 2>/dev/null)" ] -} -function is_array() { - case "$(declare -p "$1" 2>/dev/null)" in declare\ -a*) return 0;; esac - return 1 -} - -function upvar() { - if unset -v "$1"; then - if [ $# -eq 2 ]; then - eval "$1=\"\$2\"" - else - eval "$1=(\"\${@:2}\")" - fi - fi -} -function array_upvar() { - unset -v "$1" && eval "$1=(\"\${@:2}\")" -} -function upvars() { - while [ $# -gt 0 ]; do - case "$1" in - -a) - unset -v "$2" && eval "$2=(\"\${@:3}\")" - break - ;; - -a*) - unset -v "$2" && eval "$2=(\"\${@:3:${1#-a}}\")" - shift $((${1#-a} + 2)) || return 1 - ;; - *) - unset -v "$1" && eval "$1=\"\$2\"" - shift; shift - ;; - esac - done -} - -function __ab_process_pending() { - local -a values - case "$mode" in - cmd) values="$("${pending[@]}")";; - ssplit) eval "values=($("${pending[@]}"))";; - lsplit) eval "values=($("${pending[@]}" | qlines))";; - add) values=("${pending[@]}");; - esac - cmd=("${cmd[@]}" "${values[@]}") - pending=() -} -function array_buildcmd() { - local desta="$1"; shift; local "$desta" - local mode=add - local -a pending cmd - while [ $# -gt 0 ]; do - case "$1" in - ++c|++cmd|++) __ab_process_pending; mode=cmd;; - ++s|++ssplit) __ab_process_pending; mode=ssplit;; - ++l|++lsplit) __ab_process_pending; mode=lsplit;; - ++a|++add) __ab_process_pending; mode=add;; - *) pending=("${pending[@]}" "$1");; - esac - shift - done - __ab_process_pending - array_upvar "$desta" "${cmd[@]}" -} -function buildcmd() { - local -a args - array_buildcmd args "$@" - qvals "${args[@]}" -} -function evalcmd() { - local -a args - array_buildcmd args "$@" - "${args[@]}" -} -##@inc]base.core -##@inc[base.num -## Fonctions de base: gestion des valeurs numériques -uprovide base.num - -function isnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//[0-9]/}" - [ -z "$v" ] -} -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - [ -z "${1//[0-9]/}" ] -} -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//./}" - v="${v//,/}" - v="${v//[0-9]/}" - [ -z "$v" ] -} -##@inc]base.num -##@inc[base.bool -## Fonctions de base: valeurs booléennes -##@inc[base.num -## Fonctions de base: gestion des valeurs numériques -uprovide base.num - -function isnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//[0-9]/}" - [ -z "$v" ] -} -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - [ -z "${1//[0-9]/}" ] -} -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//./}" - v="${v//,/}" - v="${v//[0-9]/}" - [ -z "$v" ] -} -##@inc]base.num -uprovide base.bool -urequire base.num - -function is_yes() { - case "${1,,}" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - esac - isnum "$1" && [ "$1" -ne 0 ] && return 0 - return 1 -} -function is_no() { - case "${1,,}" in - n|non|no|f|faux|false|off) return 0;; - esac - isnum "$1" && [ "$1" -eq 0 ] && return 0 - return 1 -} -function yesval() { - is_yes "$1" && echo 1 -} - -function setb() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - local __s_r - if "$@" >/dev/null; then - eval "$__s_var=1" - else - __s_r=$? - eval "$__s_var=" - return $__s_r - fi -} -function _setb() { - local __s_var="$1"; shift - if "$@" >/dev/null; then - eval "$__s_var=1" - else - eval "$__s_var=" - fi -} - -function evalb() { - if evalx "$@" >/dev/null; then - echo 1 - else - return $? - fi -} -function setxb() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - setx "$__s_var" evalb "$@" -} -##@inc]base.bool -##@inc[base.quote -## Fonctions de base: protection de valeurs chaine -uprovide base.quote -urequire base.core - -function _qawk() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s// -/\\n}" - recho_ "$s" -} -function qawk() { - echo -n \" - _qawk "$@" - echo \" -} -function qseds() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\//\\/}" - s="${s// -/\\n}" - recho "$s" -} -function _qform() { - local s="$*" - s="${s//\%/%25}" - s="${s//+/%2B}" - s="${s//&/%26}" - s="${s//=/%3D}" - s="${s// /+}" - recho_ "$s" -} -function qform() { - local s="$*" - if [[ "$s" == *=* ]]; then - _qform "${s%%=*}" - echo -n = - _qform "${s#*=}" - echo - else - _qform "$s" - echo - fi -} -function _qsql() { - local q="'" qq="''" - echo "${*//$q/$qq}" -} -function qsql() { - local q="'" qq="''" - echo "'${*//$q/$qq}'" -} -##@inc]base.quote -uprovide base.compat -urequire base.core base.num base.bool base.quote - - -function setx2() { setxx "$@"; } -function rawecho() { recho "$@"; } -function rawecho_() { recho_ "$@"; } -function quote_arg() { _qval "$@"; } -function quoted_arg() { qvalm "$@"; } -function quoted_args() { qvals "$@"; } -function set_var() { setv "$@"; } -function set_var_cmd() { echo_setv "$@"; } -function set_var_literal() { eval "$1=$2"; } - -function quote_awk() { _qawk "$@"; } -function quoted_awk() { qawk "$@"; } -function quote_seds() { qseds "$@"; } -function quote_form() { _qform "$@"; } -function quoted_form() { qform "$@"; } - - -if [ -n "$BASH_VERSINFO" -a "${BASH_VERSINFO[0]}" -lt 4 ]; then - function strlower() { tr A-Z a-z <<<"$*"; } - function strlower1() { - local str="$*" - local h="${str:0:1}" r="${str:1}" - echo "$(tr A-Z a-z <<<"$h")$r" - } - function strlowers() { - local -a vs; local v - for v in "$@"; do - vs=("${vs[@]}" "$(strlower1 "$v")") - done - echo "${vs[*]}" - } - function strupper() { tr a-z A-Z <<<"$*"; } - function strupper1() { - local str="$*" - local h="${str:0:1}" r="${str:1}" - echo "$(tr a-z A-Z <<<"$h")$r" - } - function struppers() { - local -a vs; local v - for v in "$@"; do - vs=("${vs[@]}" "$(strupper1 "$v")") - done - echo "${vs[*]}" - } - - function is_yes() { - case "$1" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - O|OUI|Y|YES|V|VRAI|T|TRUE|ON) return 0;; - esac - isnum "$1" && [ "$1" -ne 0 ] && return 0 - case "$(strlower "$1")" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - esac - return 1 - } - function is_no() { - case "$1" in - n|non|no|f|faux|false|off) return 0;; - N|NON|NO|F|FAUX|FALSE|OFF) return 0;; - esac - isnum "$1" && [ "$1" -eq 0 ] && return 0 - case "$(strlower "$1")" in - n|non|no|f|faux|false|off) return 0;; - esac - return 1 - } -fi -##@inc]base.compat -uprovide base -urequire base.init base.core base.string base.num base.bool base.array base.quote base.split base.args base.tools base.compat - -UNAME_SYSTEM=`uname -s` -[ "${UNAME_SYSTEM#CYGWIN}" != "$UNAME_SYSTEM" ] && UNAME_SYSTEM=Cygwin -[ "${UNAME_SYSTEM#MINGW32}" != "$UNAME_SYSTEM" ] && UNAME_SYSTEM=Mingw -UNAME_MACHINE=`uname -m` -if [ -n "$UTOOLS_CHROOT" ]; then - [ -n "$UTOOLS_UNAME_SYSTEM" ] && eval "UNAME_SYSTEM=$UTOOLS_UNAME_SYSTEM" - [ -n "$UTOOLS_UNAME_MACHINE" ] && eval "UNAME_MACHINE=$UTOOLS_UNAME_MACHINE" -fi - -function setyesval() { - is_yes "$2" && set_var "$1" 1 || set_var "$1" "" -} -function normyesval() { - is_yes "${2:-"${!1}"}" && set_var "$1" 1 || set_var "$1" "" -} -function normyesvals() { - local __nyv_yesvar - for __nyv_yesvar in "$@"; do - is_yes "${!__nyv_yesvar}" && set_var "$__nyv_yesvar" 1 || set_var "$__nyv_yesvar" "" - done -} -function quote_in() { - sed 's/\\/\\\\/g -s/"/\\"/g -s/\$/\\$/g -s/`/\\`/g' -} -function quote_sin() { - sed "s/'/'\\\\''/g" -} -function quote_sarg() { - quote_sin <<<"$1" -} -function quoted_sarg() { - echo "'$(quote_sarg "$1")'" -} -function quoted_sargs() { - local a s - for a in "$@"; do - s="${s:+$s }$(quoted_sarg "$a")" - done - rawecho "$s" -} - -function set_array_cmd() { - [ $# -eq 1 ] && set -- "$1" "$1" - local __sac_s __sac_v __sac_f - __sac_s="$1=("; shift - if [ "$1" == "@" ]; then - shift - else - eval "set -- \"\${$1[@]}\"" - fi - __sac_f=1 - for __sac_v in "$@"; do - [ -n "$__sac_f" ] && __sac_f= || __sac_s="$__sac_s " - __sac_s="$__sac_s$(quoted_arg "$__sac_v")" - done - __sac_s="$__sac_s)" - echo "$__sac_s" -} -function set_array() { - eval "$(set_array_cmd "$@")" -} -function array_count() { - eval "echo \${#$1[*]}" -} -function array_isempty() { - [ $(array_count "$1") -eq 0 ] -} -function array_new() { - eval "$1=()" -} -function array_add() { - local __aa_a="$1"; shift - eval "$__aa_a=(\"\${$__aa_a[@]}\" \"\$@\")" -} -function array_ins() { - local __aa_a="$1"; shift - eval "$__aa_a=(\"\$@\" \"\${$__aa_a[@]}\")" -} -function array_del() { - local __ad_v - local -a __ad_vs - eval 'for __ad_v in "${'"$1"'[@]}"; do - if [ "$__ad_v" != '"$(quoted_arg "$2")"' ]; then - array_add __ad_vs "$__ad_v" - fi -done' - array_copy "$1" __ad_vs -} -function array_addu() { - local __as_v - eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then - return 1 - fi -done' - array_add "$1" "$2" - return 0 -} -function array_set() { - array_addu "$@" -} -function array_insu() { - local __as_v - eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then - return 1 - fi -done' - array_ins "$1" "$2" - return 0 -} -function array_fillrange() { - local -a __af_vs - local __af_i="${2:-1}" __af_to="${3:-10}" __af_step="${4:-1}" - while [ "$__af_i" -le "$__af_to" ]; do - __af_vs=("${__af_vs[@]}" "$__af_i") - __af_i=$(($__af_i + $__af_step)) - done - array_copy "$1" __af_vs -} -function array_eq() { - local -a __ae_a1 __ae_a2 - array_copy __ae_a1 "$1" - array_copy __ae_a2 "$2" - [ ${#__ae_a1[*]} -eq ${#__ae_a2[*]} ] || return 1 - local __ae_v __ae_i=0 - for __ae_v in "${__ae_a1[@]}"; do - [ "$__ae_v" == "${__ae_a2[$__ae_i]}" ] || return 1 - __ae_i=$(($__ae_i + 1)) - done - return 0 -} -function array_contains() { - local __ac_v - eval 'for __ac_v in "${'"$1"'[@]}"; do - if [ "$__ac_v" == '"$(quoted_arg "$2")"' ]; then - return 0 - fi -done' - return 1 -} -function array_find() { - local __af_i __af_v - __af_i=0 - eval 'for __af_v in "${'"$1"'[@]}"; do - if [ "$__af_v" == '"$(quoted_arg "$2")"' ]; then - if [ -n "$3" ]; then - echo "${'"$3"'[$__af_i]}" - else - echo "$__af_i" - fi - return 0 - fi - __af_i=$(($__af_i + 1)) -done' - return 1 -} -function array_reverse() { - local -a __ar_vs - local __ar_v - array_copy __ar_vs "$1" - array_new "$1" - for __ar_v in "${__ar_vs[@]}"; do - array_ins "$1" "$__ar_v" - done -} - -function array_replace() { - local __ar_sn="$1"; shift - local __ar_f="$1"; shift - local -a __ar_s __ar_d - local __ar_v - array_copy __ar_s "$__ar_sn" - for __ar_v in "${__ar_s[@]}"; do - if [ "$__ar_v" == "$__ar_f" ]; then - __ar_d=("${__ar_d[@]}" "$@") - else - __ar_d=("${__ar_d[@]}" "$__ar_v") - fi - done - array_copy "$__ar_sn" __ar_d -} -function array_each() { - local __ae_an="$1"; shift - local __ae_f="$1"; shift - local -a __ae_a - local __ae_v - array_copy __ae_a "$__ae_an" - for __ae_v in "${__ae_a[@]}"; do - "$__ae_f" "$__ae_v" "$@" - done -} -function array_map() { - local __am_an="$1"; shift - local __am_f="$1"; shift - local -a __am_a __am_vs - local __am_v - array_copy __am_a "$__am_an" - for __am_v in "${__am_a[@]}"; do - __am_vs=("${__am_vs[@]}" "$("$__am_f" "$__am_v" "$@")") - done - array_copy "$__am_an" __am_vs -} -function first_value() { - eval "rawecho \"\${$1[@]:0:1}\"" -} -function last_value() { - eval "rawecho \"\${$1[@]:\$((-1)):1}\"" -} -function array_copy() { - eval "$1=(\"\${$2[@]}\")" -} -function array_copy_firsts() { - eval "$1=(\"\${${2:-$1}[@]:0:\$((\${#${2:-$1}[@]}-1))}\")" -} -function array_del_last() { - array_copy_firsts "$1" -} -function array_copy_lasts() { - eval "$1=(\"\${${2:-$1}[@]:1}\")" -} -function array_del_first() { - array_copy_lasts "$1" -} -function array_extend() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]}\")" -} -function array_extendu() { - local __ae_v __ae_s=1 - eval 'for __ae_v in "${'"$2"'[@]}"; do - array_addu "$1" "$__ae_v" && __ae_s=0 -done' - return "$__ae_s" -} -function array_extend_firsts() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]:0:\$((\${#$2[@]}-1))}\")" -} -function array_extend_lasts() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]:1}\")" -} -function array_xsplit() { - eval "$1=($(recho_ "$2" | awkrun RS="${3:-:}" ' -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_split() { - eval "$1=($(recho_ "$2" | awkrun RS="${3:-:}" ' -/^$/ { next } -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_from_path() { - array_split "$1" "$2" ":" -} -function array_from_xlines() { - eval "$1=($(recho_ "$2" | _nl2lf | awk ' -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_from_lines() { - eval "$1=($(recho_ "$2" | _nl2lf | awk ' -/^$/ { next } -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_join() { - local __aj_an __aj_l __aj_j __aj_s="${2:-,}" __aj_pf __aj_sf - if [ "$1" == "@" ]; then - __aj_an="\$@" - shift; shift - else - __aj_an="\${$1[@]}" - __aj_pf="$4" - __aj_sf="$5" - fi - eval 'for __aj_l in "'"$__aj_an"'"; do - __aj_j="${__aj_j:+$__aj_j'"$__aj_s"'}$__aj_pf$__aj_l$__aj_sf" -done' - if [ -n "$__aj_j" ]; then - rawecho "$__aj_j" - elif [ "$__aj_an" != "\$@" -a -n "$3" ]; then - rawecho "$3" - fi -} -function array_mapjoin() { - local __amj_src="$1" __amj_func="$2" __amj_sep="$3" - shift; shift; shift - if [ "$__amj_src" == "@" ]; then - local -a __amj_tmpsrc - __amj_tmpsrc=("$@") - __amj_src=__amj_tmpsrc - set -- - fi - local -a __amj_tmp - array_copy __amj_tmp "$__amj_src" - array_map __amj_tmp "$__amj_func" - array_join __amj_tmp "$__amj_sep" "$@" -} -function array_to_lines() { - array_join "$1" " -" "$2" "$3" "$4" -} -function array_to_path() { - array_join "$1" ":" "$2" "$3" "$4" -} -function array_fix_paths() { - local __afp_an="$1" __afp_s="${2:-:}" - local -a __afp_vs - local __afp_v - array_copy __afp_vs "$__afp_an" - array_new "$__afp_an" - for __afp_v in "${__afp_vs[@]}"; do - array_split __afp_v "$__afp_v" "$__afp_s" - array_extend "$__afp_an" __afp_v - done -} - - -function get_date_rfc822() { - LC_TIME=C date +"%a, %d %b %Y %H:%M:%S %Z" -} -function get_date_fr() { - LC_TIME=C date +"%d/%m/%Y" -} -function get_time_fr() { - LC_TIME=C date +"%Hh%M" -} -function parse_date() { - local value="$1" type="${2:-date}" - local now="$(awk 'BEGIN { print mktime(strftime("%Y %m %d 00 00 00 +0400")) }')" - case "$value" in - +*) - value="$(($now + ${value#+} * 86400))" - ;; - *) - value="$(<<<"$value" awk -F/ '{ - nd = strftime("%d"); nm = strftime("%m"); ny = strftime("%Y") - d = $1 + 0; if (d < 1) d = nd; - m = $2 + 0; if (m < 1) m = nm; - if ($3 == "") y = ny; - else { y = $3 + 0; if (y < 100) y = y + 2000; } - print mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d)); - }')" - esac - case "$type" in - d|date) awk '{ print strftime("%d/%m/%Y", $0 + 0) }' <<<"$value";; - l|ldap) awk '{ print strftime("%Y%m%d%H%M%S+0400", $0 + 0) }' <<<"$value";; - m|mysql) awk '{ print strftime("%Y-%m-%d", $0 + 0) }' <<<"$value";; - *) - rawecho "$value" - ;; - esac -} - - -function udelpath() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; ${2:-PATH}"'="${'"${2:-PATH}"'#$1:}"; '"${2:-PATH}"'="${'"${2:-PATH}"'%:$1}"; '"${2:-PATH}"'="${'"${2:-PATH}"'//:$_qdir:/:}"; [ "$'"${2:-PATH}"'" == "$1" ] && '"${2:-PATH}"'=' -} -function uaddpath() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="${'"${2:-PATH}"':+$'"${2:-PATH}"':}$1"' -} -function uinspathm() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="$1${'"${2:-PATH}"':+:$'"${2:-PATH}"'}"' -} -function uinspath() { - udelpath "$@" - uinspathm "$@" -} - -function withpath() { - [ "${1#./}" != "$1" -o "${1#../}" != "$1" -o "${1#/}" != "$1" ] -} -function withext() { - local basename="$(basename -- "$1")" - [ "${basename%.*}" != "$basename" ] -} -function normpath() { - local -a parts - local part ap - array_split parts "$1" / - if [ "${1#/}" != "$1" ]; then - ap=/ - elif [ -n "$2" ]; then - ap="$2" - else - ap="$(pwd)" - fi - for part in "${parts[@]}"; do - if [ "$part" == "." ]; then - continue - elif [ "$part" == ".." ]; then - ap="${ap%/*}" - [ -n "$ap" ] || ap=/ - else - [ "$ap" != "/" ] && ap="$ap/" - ap="$ap$part" - fi - done - rawecho "$ap" -} -function abspath() { - local ap="$1" - if [ "${ap#/}" != "$ap" ]; then - __normpath "$ap" && return - else - local cwd - if [ -n "$2" ]; then - cwd="$(abspath "$2")" - else - cwd="$(pwd)" - fi - ap="$cwd/$ap" - __normpath "$ap" && return - fi - normpath "$ap" -} -function __normpath() { - if [ -d "$1" ]; then - if [ -x "$1" ]; then - (cd "$1"; pwd) - return 0 - fi - elif [ -f "$1" ]; then - local dn="$(dirname -- "$1")" bn="$(basename -- "$1")" - if [ -x "$dn" ]; then - (cd "$dn"; echo "$(pwd)/$bn") - return 0 - fi - fi - return 1 -} -function parentdirs() { - array_new "$1" - local __pd_d="$(abspath "$2")" - if [[ "$3" == r* ]]; then - while [ "$__pd_d" != "/" ]; do - array_ins "$1" "$__pd_d" - __pd_d="$(dirname "$__pd_d")" - done - else - while [ "$__pd_d" != "/" ]; do - array_add "$1" "$__pd_d" - __pd_d="$(dirname "$__pd_d")" - done - fi -} -function ppath() { - local path="$1" cwd="$2" - - path="$(abspath "$path")" # essayer de normaliser le chemin - [ -n "$cwd" ] || cwd="$(pwd)" - - [ "$path" = "$cwd" ] && path="." - [ "$cwd" != "/" -a "$cwd" != "$HOME" ] && path="${path/#$cwd\//}" - path="${path/#$HOME/~}" - - rawecho "$path" -} -function relpath() { - local p="$(abspath "$1" "$3")" cwd="$2" - if [ -z "$cwd" ]; then - cwd="$(pwd)" - else - cwd="$(abspath "$cwd" "$3")" - fi - if [ "$p" == "$cwd" ]; then - echo "" - elif [ "${p#$cwd/}" != "$p" ]; then - rawecho "${p#$cwd/}" - else - local rp - while [ -n "$cwd" -a "${p#$cwd/}" == "$p" ]; do - rp="${rp:+$rp/}.." - cwd="${cwd%/*}" - done - rp="$rp/${p#$cwd/}" - echo "${rp%//}" - fi -} -function relpathx() { - local p="$(relpath "$@")" - if [ -z "$p" ]; then - echo . - elif [ "${p#../}" != "$p" -o "${p#./}" != "$p" ]; then - echo "$p" - else - echo "./$p" - fi -} -function withinpath() { - local b="$1" p="$2" strict="${3:-N}" - b="$(abspath "$b")" - p="$(abspath "$p")" - if is_yes "$strict"; then - [ "${p#$b/}" != "$p" ] - else - [ "$p" == "$b" -o "${p#$b/}" != "$p" ] - fi -} -function safe_abspath() { - local p="$1" ba="$2" br="$3" - if [ -n "$ba" ]; then - ba="$(abspath "$ba")" - else - ba="$(pwd)" - fi - [ -n "$br" ] || br="$ba" - br="$(abspath "$br" "$ba")" - p="$(abspath "$p" "$ba")" - if [ "$p" == "$br" -o "${p#$br/}" != "$p" ]; then - echo "$p" - else - return 1 - fi -} -function safe_relpath() { - local p - if p="$(safe_abspath "$1" "$2" "$3")"; then - relpath "$p" "$2" "$(pwd)" - else - return 1 - fi -} -function splitwcs() { - local __sw_p="$1" - local __sw_dd="${2:-basedir}" __sw_df="${3:-filespec}" __sw_part __sw_d __sw_f - local -a __sw_parts - array_split __sw_parts "$__sw_p" "/" - for __sw_part in "${__sw_parts[@]}"; do - if [[ "$__sw_part" == *\** ]] || [[ "$__sw_part" == *\?* ]] || [ -n "$__sw_f" ]; then - __sw_f="${__sw_f:+$__sw_f/}$__sw_part" - else - __sw_d="${__sw_d:+$__sw_d/}$__sw_part" - fi - done - [ "${__sw_p#/}" != "$__sw_p" ] && __sw_d="/$__sw_d" - set_var "$__sw_dd" "$__sw_d" - set_var "$__sw_df" "$__sw_f" -} -function deref() { - local OENC="$UTF8" - - local max_deref=50 - local file="$1" - local basedir link - while [ -L "$file" ]; do - basedir="$(dirname "$file")" - link="$(readlink "$file")" - if first_char_is "$link" "/"; then - file="$link" - else - file="$basedir/$link" - fi - - max_deref=$(($max_deref - 1)) - [ $max_deref -eq 0 ] && die "Plus de 50 indirection. Le lien $file est-il récursif?" - done - abspath "$file" -} -function readlinka() { - if [ -L "$1" ]; then - local linkdir="$(dirname -- "$1")" - abspath "$(readlink "$1")" "$linkdir" - else - abspath "$1" - fi -} -function readlinkm() { - readlink -m "$1" -} -function path_if_test() { - local op="$1"; shift - local file="$1"; shift - local rel="$1" reldir=; shift - if beginswith "$rel" relative; then - reldir="${rel#relative}" - if beginswith "$reldir" :; then - reldir="${reldir#:}" - if [ -n "$reldir" ]; then - reldir="${reldir}/" - fi - else - reldir= - fi - else - rel= - fi - - while [ -n "$1" ]; do - local basedir="$1" - if [ $op "$basedir/$file" ]; then - if [ -n "$rel" ]; then - rawecho "$reldir$file" - else - rawecho "$basedir/$file" - fi - break - fi - shift - done -} -function update_link() { - [ -L "$2" ] || return 1 - local dest link="$2" - local linkdir="$(dirname "$link")" - local ldest="$(readlink "$link")" - if [ "${ldest#/}" != "$ldest" ]; then - dest="$(abspath "$1")" - else - dest="$(relpath "$1" "$linkdir")" - fi - if [ "$dest" == "$ldest" ]; then - : # pas besoin de mettre à jour - elif [ -d "$link" ]; then - rm -f "$link" && ln -s "$dest" "$link" - else - ln -sf "$dest" "$link" - fi -} -function update_links() { - [ -n "$1" ] || return 1 - local dest="$1"; shift - local r=0 link - for link in "$@"; do - update_link "$dest" "$link" || r=$? - done - return $r -} -function move_link() { - [ -n "$1" -a -n "$2" ] || return 1 - local link="$1" dest="$2" - [ -d "$dest" ] && dest="$dest/$(basename -- "$link")" - dest="$(abspath "$dest")" - if [ -L "$link" ]; then - link="$(abspath "$link")" - [ "$dest" == "$link" ] && return 0 - ldest="$(readlinka "$link")" - mv "$link" "$dest" || return 1 - update_link "$ldest" "$dest" - else - [ "$dest" == "$link" ] && return 0 - mv "$link" "$dest" - fi -} -function array_find_links() { - local -a __afl_links __afl_result - local __afl_dir="${3:-.}" - local __afl_dest __afl_destname __afl_link __afl_linkdir __afl_ldest - __afl_dest="$(abspath "$2")" - __afl_destname="${__afl_dest##*/}" - array_from_lines __afl_links "$(find "$__afl_dir" -type l)" - for __afl_link in "${__afl_links[@]}"; do - __afl_ldest="$(readlink "$__afl_link")" - if [ "$__afl_ldest" != "$__afl_destname" ]; then - [[ "$__afl_ldest" == */"$__afl_destname" ]] || continue - fi - __afl_link="$(abspath "$__afl_link" "$__afl_dir")" - __afl_linkdir="$(dirname -- "$__afl_link")" - __afl_ldest="$(abspath "$__afl_ldest" "$__afl_linkdir")" - if [ "$__afl_ldest" == "$__afl_dest" ]; then - array_add __afl_result "$__afl_link" - fi - done - array_copy "$1" __afl_result -} -function list_links() { - local -a links - array_find_links links "$@" - array_to_lines links -} -function move_file() { - [ -n "$1" -a -n "$2" ] || return 1 - local src="$1" dest="$2" link - shift; shift - [ -d "$dest" ] && dest="$dest/$(basename -- "$src")" - move_link "$src" "$dest" || return 1 - update_links "$dest" "$@" -} - -function get_nblines() { - [ -f "$1" ] && sed -ne '$=' "$1" || echo 0 -} -function mktempf() { - mktemp "${1:-"$TMPDIR/tmp.XXXXXX"}" -} -function mktempd() { - mktemp -d "${1:-"$TMPDIR/tmp.XXXXXX"}" -} -function mkdirof() { - mkdir -p "$(dirname -- "$1")" -} -function cp_a() { - /bin/cp -a "$@" -} -function cp_R() { - /bin/cp -pR "$@" -} -function quietgrep() { - grep -q "$@" 2>/dev/null -} -function quietdiff() { - diff -q "$@" >&/dev/null -} -function testsame() { - quietdiff "$@" -} -function testdiff() { - ! quietdiff "$@" -} -function testupdated() { - if [ -f "$2" ]; then - testdiff "$1" "$2" - else - return 0 - fi -} -function testnewer() { - test ! -e "$2" -o "$1" -nt "$2" -} -function ps_all() { - ps -axww -} -function progexists() { - test -n "$1" -a -x "$(which "$1" 2>/dev/null)" -} -function has_python() { - progexists python -} -function has_gawk() { - progexists gawk -} -function is_root() { - test `id -u` -eq 0 -} -function source_ifexists() { - if [ -f "$1" ]; then source "$1" || die; fi -} -function little_sleep { - LC_NUMERIC=C sleep 0.1 -} -function random_sleep { - sleep $(($RANDOM % ${1:-1800})) -} -function is_running() { - kill -0 "$1" >&/dev/null -} -function sedi() { - sed -i "$@" -} -function csort() { - LANG=C sort "$@" -} -function lsort() { sort "$@"; } -function cgrep() { - LANG=C grep "$@" -} -function lgrep() { grep "$@"; } -function csed() { - LANG=C sed "$@" -} -function lsed() { sed "$@"; } -function cawk() { - LANG=C awk "$@" -} -function lawk() { awk "$@"; } -function cdiff() { - LANG=C diff "$@" -} -function ldiff() { diff "$@"; } - - -function fix_mode() { - local file="$1" - [ -f "$file" ] || touch "$file" || return 1 - if [ ! -w "$file" ]; then - local mode="$(stat -c %a "$file")" - chmod ${mode:0:${#mode}-3}6${mode:${#mode}-2:2} "$file" - echo "$mode" - fi -} -function unfix_mode() { - [ -n "$2" ] && chmod "$2" "$1" -} -function get_mode() { - [ -f "$1" ] || touch "$1" || return 1 - stat -c %a "$1" -} -function rm_maybe() { - local parse_opts=1 arg rm - for arg in "$@"; do - if [ -n "$parse_opts" ]; then - if [ "$arg" == "--" ]; then - parse_opts= - elif [[ "$arg" == "-*" ]]; then - continue - elif [ -n "$arg" ]; then - rm=1 - break - fi - elif [ -n "$arg" ]; then - rm=1 - break - fi - done - [ -n "$rm" ] && /bin/rm "$@" -} -__CPDIR_RSYNC_SLOW=1 # synchro potentiellement plus lente, mais plus fidèle (option -c) -__CPDIR_RSYNC_ARGS=(-q) -function cpdir() { - - if progexists rsync; then - [ -d "$2" ] || mkdir -p "$2" || return 1 - if [ -d "$1" ]; then - rsync -a ${__CPDIR_RSYNC_SLOW:+-c} "${__CPDIR_RSYNC_ARGS[@]}" "$1/" "$2/" - else - rsync -a ${__CPDIR_RSYNC_SLOW:+-c} "${__CPDIR_RSYNC_ARGS[@]}" "$1" "$2/" - fi - else - __cpdir "$@" - fi -} -function __cpdir() { - local src="$1" dest="$2" method="${3:-cp_a}" - - if [ -d "$src" ]; then - [ -d "$dest" ] || mkdir -p "$dest" || return 1 - - local prevdir="$(pwd)" - - dest="$(abspath "$dest")" - cd "$src" - if [ -n "$(/bin/ls -a1)" ]; then - [ -n "$(/bin/ls -1)" ] && "$method" * "$dest" - local i - for i in .*; do - [ "$i" == "." -o "$i" == ".." ] && continue - "$method" "$i" "$dest" - done - fi - cd "$prevdir" - else - if [ -f "$dest" ]; then - "$method" "$src" "$dest" - elif [ -d "$dest" ]; then - "$method" "$src" "$dest" - else - mkdir -p "$dest" - "$method" "$src" "$dest" - fi - fi -} -__CPNOVCS_RSYNC_SLOW=1 # synchro potentiellement plus lente, mais plus fidèle (option -c) -__CPNOVCS_RSYNC_ARGS=(-q) -function cpnovcs() { - local src="$1" destdir="$2" - [ -d "$destdir" ] || mkdir -p "$destdir" || return 1 - if progexists rsync; then - local gitexclude=/.git/ - if [ "${src%/}" == "$src" ]; then - gitexclude="/$(basename -- "$src")$gitexclude" - fi - rsync -a ${__CPNOVCS_RSYNC_SLOW:+-c} --exclude CVS/ --exclude .svn/ --exclude "$gitexclude" "${__CPNOVCS_RSYNC_ARGS[@]}" "$src" "$destdir/" - elif [ "${src%/}" != "$src" ]; then - __cpdir "$src" "$destdir" - else - local srcname="$(basename -- "$src")" - mkdir -p "$destdir/$srcname" - __cpdir "$src" "$destdir/$srcname" - fi -} -function cpdirnovcs() { - if [ -d "$1" ]; then - cpnovcs "$1/" "$2" - else - cpnovcs "$1" "$2" - fi -} -function doinplace() { - if [ -n "$1" -a "$1" != "-" ]; then - local __dip_file="$1"; shift - autoclean "$__dip_file.tmp.$$" - "$@" <"$__dip_file" >"$__dip_file.tmp.$$" - local s=$? - [ "$s" == 0 ] && /bin/cat "$__dip_file.tmp.$$" >"$__dip_file" - /bin/rm -f "$__dip_file.tmp.$$" - return $s - else - shift - "$@" - fi -} -function doinplacef() { - if [ -n "$1" -a "$1" != "-" ]; then - local __dip_file="$1"; shift - autoclean "$__dip_file.tmp.$$" - "$@" <"$__dip_file" >"$__dip_file.tmp.$$" - local s=$? - /bin/cat "$__dip_file.tmp.$$" >"$__dip_file" - /bin/rm -f "$__dip_file.tmp.$$" - return $s - else - shift - "$@" - fi -} -function stripnl() { - tr -d '\r\n' -} -function _nl2lf() { - awk 'BEGIN {RS="\r|\r\n|\n"} {print}' -} -function nl2lf() { - doinplace "$1" _nl2lf -} -function _nl2crlf() { - awk 'BEGIN {RS="\r|\r\n|\n"} {print $0 "\r"}' -} -function nl2crlf() { - doinplace "$1" _nl2crlf -} -function _nl2cr() { - awk 'BEGIN {RS="\r|\r\n|\n"; ORS=""} {print $0 "\r"}' -} -function nl2cr() { - doinplace "$1" _nl2cr -} -function _latin1compat() { - LANG=fr_FR.UTF-8 sed $' -s/[‘’]/\x27/g -s/[«»“”]/"/g -s/[\xC2\xA0\xE2\x80\x87\xE2\x80\xAF\xE2\x81\xA0]/ /g -' -} -function _noaccents() { - LANG=fr_FR.UTF-8 sed ' -s/[à]/a/g -s/[éèêë]/e/g -s/[ïî]/i/g -s/[ôö]/o/g -s/[üû]/u/g -s/[ç]/c/g -s/[À]/A/g -s/[ÉÈÊË]/E/g -s/[ÏÎ]/I/g -s/[ÔÖ]/O/g -s/[ÜÛ]/U/g -s/[Ç]/C/g -' -} -function list_all() { - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ "$f" == "." -o "$f" == ".." ] && continue - rawecho "$f" - done - cd "$curdir" -} -function __la_cmd() { - [ $# -gt 0 ] || set '*' - local arg - local cmd="/bin/ls -1d" - for arg in "$@"; do - arg="$(_rval "$arg")" - cmd="$cmd $arg" - done - cmd="$cmd 2>/dev/null" - echo "$cmd" -} -function list_files() { - local f - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ -f "$f" ] && rawecho "$f" - done - cd "$curdir" -} -function list_dirs() { - local f - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ "$f" == "." -o "$f" == ".." ] && continue - [ -d "$f" ] && rawecho "$f" - done - cd "$curdir" -} -function __array_ls() { - local __al_l="list_${1:-all}"; shift - local __al_an="$1"; shift - local __al_d="${1:-.}"; shift - local -a __al_fs - array_from_lines __al_fs "$("$__al_l" "$__al_d" "$@")" - local __al_f - array_new "$__al_an" - for __al_f in "${__al_fs[@]}"; do - array_add "$__al_an" "$__al_d/$__al_f" - done -} -function array_lsall() { - __array_ls all "$@" -} -function array_lsdirs() { - __array_ls dirs "$@" -} -function array_lsfiles() { - __array_ls files "$@" -} -function filter_empty() { - sed '/^$/d' -} -function filter_vcspath() { - sed ' -/^.git$/d -/^.git\//d -/\/.git$/d -/\/.git\//d -/^.svn$/d -/^.svn\//d -/\/.svn$/d -/\/.svn\//d -' -} -function merge_contlines() { - awk 'substr($0, length($0)) == "\\" { - while (getline nextline) { - $0 = substr($0, 1, length($0) - 1) nextline - if (substr($0, length($0)) != "\\") break - } - print - next -} -{print}' -} -function filter_comment() { - local -a merge - [ "$1" == -m ] && merge=(merge_contlines) || merge=(cat) - awk ' - /^[ \t]*#/ { next } - /^[ \t]*$/ { next } - { print }' | "${merge[@]}" -} -function filter_conf() { - local -a merge - [ "$1" == -m ] && merge=(merge_contlines) || merge=(cat) - grep -v '^#' | grep -v '^$' | "${merge[@]}" -} -function is_archive() { - local name="${1%.zip}" - name="${name%.tgz}" - name="${name%.tbz2}" - name="${name%.tar.gz}" - name="${name%.tar.bz2}" - name="${name%.tar}" - name="${name%.jar}" - name="${name%.war}" - name="${name%.ear}" - [ "$name" != "$1" ] -} -function extract_archive() { - local arch="$1" destdir="${2:-.}" - shift; shift - if endswith "$arch" .zip; then - unzip -q -d "$destdir" "$arch" "$@" || return - elif endswith "$arch" .tgz || endswith "$arch" .tar.gz; then - tar xzf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .tbz2 || endswith "$arch" .tar.bz2; then - tar xjf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .tar; then - tar xf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .jar || endswith "$arch" .war || endswith "$arch" .ear; then - ( - arch="$(abspath "$arch")" - cd "$destdir" - jar xf "$arch" "$@" - ) || return - else - return 1 - fi -} -function get_archive_basename() { - local basename="$(basename -- "$1")" - basename="${basename%.zip}" - basename="${basename%.tgz}" - basename="${basename%.tbz2}" - basename="${basename%.gz}" - basename="${basename%.bz2}" - basename="${basename%.tar}" - basename="${basename%.jar}" - basename="${basename%.war}" - basename="${basename%.ear}" - echo "$basename" -} -function get_archive_appname() { - local appname="$(basename -- "$1")" - appname="${appname%.zip}" - appname="${appname%.tgz}" - appname="${appname%.tbz2}" - appname="${appname%.gz}" - appname="${appname%.bz2}" - appname="${appname%.tar}" - appname="${appname%.jar}" - appname="${appname%.war}" - appname="${appname%.ear}" - echo "$appname" | awk '{ - if (match($0, /[-_.]([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/)) { - print substr($0, 1, RSTART - 1) - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/)) { - print substr($0, 1, RSTART - 1) - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print substr($0, 1, RSTART - 1) - } else { - print $0 - } -}' -} -function get_archive_versionsuffix() { - local basename="$(get_archive_basename "$1")" - echo "$basename" | awk '{ - if (match($0, /([-_.][0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print vs["1"] - } -}' -} -function get_archive_version() { - local basename="$(get_archive_basename "$1")" - echo "$basename" | awk '{ - if (match($0, /[-_.]([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print vs["1"] - } -}' -} -function __dump_usernames() { - = 500 && $6 ~ /^\/home\// { print $1 }' -} -function dump_usernames() { - array_from_lines "${1:-usernames}" "$(__dump_usernames)" -} -function __resolv_ips() { - LANG=C host "$1" 2>/dev/null | awk '/address / { gsub(/^.*address /, ""); print }' -} -function resolv_ips() { - array_from_lines "${1:-ips}" "$(__resolv_ips "$2")" -} -function __resolv_hosts() { - LANG=C host "$1" 2>/dev/null | awk '/domain name pointer / { gsub(/^.*domain name pointer /, ""); gsub(/\.$/, ""); print }' -} -function resolv_hosts() { - array_from_lines "${1:-hosts}" "$(__resolv_hosts "$2")" -} -function runscript_as() { - local OENC="$UTF8" - local user="${1:-root}"; shift - local exec_maybe= - if [ "$1" = "exec" ]; then - exec_maybe=exec - shift - fi - - local cmd - cmd="\ -__estack=$(quoted_arg "$__estack") -__tlevel=$(quoted_args "$__tlevel") -export __estack __tlevel -exec ${BASH:-/bin/sh} $(quoted_args "$@")" - - if is_yes "$UTOOLS_USES_SU" || ! progexists sudo; then - eecho "Entrez le mot de passe de root" - $exec_maybe su "$user" -c "$cmd" - else - if [ "$user" == "root" ]; then - $exec_maybe sudo -p "Entrez le mot de passe de %u: " "${BASH:-/bin/sh}" -c "$cmd" - else - $exec_maybe sudo -p "Entrez le mot de passe de %u: " su "$user" -c "$cmd" - fi - fi -} -function runscript_as_root() { - if is_root; then - local exec_maybe= - if [ "$1" = "exec" ]; then - exec_maybe=exec - shift - fi - $exec_maybe "${BASH:-/bin/sh}" "$@" - else - runscript_as root "$@" - fi -} -function run_as() { - local user="${1:-root}"; shift - local exec_maybe=exec - if [ "$1" = "--noexec" ]; then - exec_maybe= - shift - fi - - runscript_as "$user" $exec_maybe "$0" "$@" -} -function run_as_root() { - is_root || run_as root "$@" -} -function check_user() { - local user - for user in "$@"; do - [ "$USER" == "$user" ] && return 0 - done - return 1 -} -function ensure_user() { - local -a users - while [ $# -gt 0 -a "$1" != "--" ]; do - array_add users "$1" - shift - done - [ "$1" == "--" ] && shift - - if ! check_user "${users[@]}"; then - if [ ${#users[*]} -gt 1 ]; then - ewarn "Cette commande doit être lancée avec l'un des users ${users[*]}" - else - ewarn "Cette commande doit être lancée avec le user ${users[0]}" - fi - if ask_yesno "Voulez-vous tenter de relancer la commande avec le bon user?" O; then - estep "Lancement du script avec le user ${users[0]}" - run_as "${users[0]}" "$@" - return 1 - elif is_root; then - return 11 - else - return 10 - fi - fi - return 0 -} -function check_hostname() { - local userhost user host path - for userhost in "$@"; do - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - [ "$MYHOSTNAME" == "${host%%.*}" ] && return 0 - done - return 1 -} -function check_userhostname() { - local userhost path user host - for userhost in "$@"; do - if check_hostname "$userhost"; then - [[ "$userhost" == *@* ]] || return 0 - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - check_user "$user" && return 0 - fi - done - return 1 -} -UTOOLS_ENSURE_HOSTNAME_SSH_OPTS=() -function ensure_hostname() { - local -a userhosts - while [ $# -gt 0 -a "$1" != "--" ]; do - array_add userhosts "$1" - shift - done - [ "$1" == "--" ] && shift - - local userhost user host path - if ! check_hostname "${userhosts[@]}"; then - if [ ${#userhosts[*]} -gt 1 ]; then - ewarn "Cette commande n'est valide que sur l'un des hôtes ${userhosts[*]}" - else - ewarn "Cette commande n'est valide que sur l'hôte ${userhosts[0]}" - fi - - enote "Vous pouvez tenter de relancer le script sur ${userhosts[0]}, mais cela requière que ce script ET les données dont il a besoin soient installés dans la même version et dans le même répertoire sur l'hôte distant" - if ask_yesno "Voulez-vous tenter de relancer le script sur l'hôte distant?" N; then - splitfsep "${userhosts[0]}" : userhost path - splituserhost "$userhost" user host - [ -n "$user" ] || user=root - - estep "Lancement de la commande sur l'hôte distant $user@$host" - local cmd - [ -n "$path" ] && cmd="$(quoted_args cd "$path"); " - cmd="$cmd$(quoted_args "$script" "$@")" - ssh -qt "${UTOOLS_ENSURE_HOSTNAME_SSH_OPTS[@]}" "$user@$host" "$cmd" - [ $? -eq 255 ] && return 12 - return 1 - else - return 11 - fi - fi - local userhost user host - for userhost in "${userhosts[@]}"; do - [[ "$userhost" == *@* ]] || continue - if check_hostname "$userhost"; then - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - [ -n "$path" ] && cd "$path" - ensure_user "$user" -- "$@" - return $? - fi - done - return 0 -} - -__AWKDEF_FUNCTIONS=' -function quote_html(s) { - gsub(/&/, "\\&", s) - gsub(/"/, "\\"", s) - gsub(/>/, "\\>", s) - gsub(/", s) - gsub(/"/, "\"", s) - gsub(/&/, "\\&", s) - return s -} -function quote_value(s) {'" - gsub(/'/, \"'\\\\''\", s) - return \"'\" s \"'\" -"'} -function quoted_values( i, line) { - line = "" - for (i = 1; i <= NF; i++) { - if (i > 1) line = line " " - line = line quote_value($i) - } - return line -} -function quote_subrepl(s) { - gsub(/\\/, "\\\\", s) - gsub(/&/, "\\\\&", s) - return s -} -function quote_grep(s) { - gsub(/[[\\.^$*]/, "\\\\&", s) - return s -} -function quote_egrep(s) { - gsub(/[[\\.^$*+?()|{]/, "\\\\&", s) - return s -} -function quote_sql(s) {'" - gsub(/'/, \"''\", s) - return \"'\" s \"'\" -"'} -function unquote_mysqlcsv(s) { - gsub(/\\n/, "\n", s) - gsub(/\\t/, "\t", s) - gsub(/\\0/, "\0", s) - gsub(/\\\\/, "\\", s) - return s -} -function array_new(dest) { - dest[0] = 0 # forcer awk à considérer dest comme un tableau - delete dest -} -function array_newsize(dest, size, i) { - dest[0] = 0 # forcer awk à considérer dest comme un tableau - delete dest - size = int(size) - for (i = 1; i <= size; i++) { - dest[i] = "" - } -} -function array_len(values, count, i) { - count = 0 - for (i in values) { - count++ - } - return count -} -function mkindices(values, indices, i, j) { - array_new(indices) - j = 1 - for (i in values) { - indices[j++] = int(i) - } - return asort(indices) -} -function array_copy(dest, src, count, indices, i) { - array_new(dest) - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - dest[indices[i]] = src[indices[i]] - } -} -function array_getlastindex(src, count, indices) { - count = mkindices(src, indices) - if (count == 0) return 0 - return indices[count] -} -function array_add(dest, value, lastindex) { - lastindex = array_getlastindex(dest) - dest[lastindex + 1] = value -} -function array_deli(dest, i, l) { - i = int(i) - if (i == 0) return - l = array_len(dest) - while (i < l) { - dest[i] = dest[i + 1] - i++ - } - delete dest[l] -} -function array_del(dest, value, ignoreCase, i) { - do { - i = key_index(value, dest, ignoreCase) - if (i != 0) array_deli(dest, i) - } while (i != 0) -} -function array_extend(dest, src, count, lastindex, indices, i) { - lastindex = array_getlastindex(dest) - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - dest[lastindex + i] = src[indices[i]] - } -} -function array_fill(dest, i) { - array_new(dest) - for (i = 1; i <= NF; i++) { - dest[i] = $i - } -} -function array_getline(src, count, indices, i, j) { - $0 = "" - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - j = indices[i] - $j = src[j] - } -} -function array_appendline(src, count, indices, i, nf, j) { - count = mkindices(src, indices) - nf = NF - for (i = 1; i <= count; i++) { - j = nf + indices[i] - $j = src[indices[i]] - } -} -function in_array(value, values, ignoreCase, i) { - if (ignoreCase) { - value = tolower(value) - for (i in values) { - if (tolower(values[i]) == value) return 1 - } - } else { - for (i in values) { - if (values[i] == value) return 1 - } - } - return 0 -} -function key_index(value, values, ignoreCase, i) { - if (ignoreCase) { - value = tolower(value) - for (i in values) { - if (tolower(values[i]) == value) return int(i) - } - } else { - for (i in values) { - if (values[i] == value) return int(i) - } - } - return 0 -} -function array2s(values, prefix, sep, suffix, noindices, first, i, s) { - if (!prefix) prefix = "[" - if (!sep) sep = ", " - if (!suffix) suffix = "]" - s = prefix - first = 1 - for (i in values) { - if (first) first = 0 - else s = s sep - if (!noindices) s = s "[" i "]=" - s = s values[i] - } - s = s suffix - return s -} -function array2so(values, prefix, sep, suffix, noindices, count, indices, i, s) { - if (!prefix) prefix = "[" - if (!sep) sep = ", " - if (!suffix) suffix = "]" - s = prefix - count = mkindices(values, indices) - for (i = 1; i <= count; i++) { - if (i > 1) s = s sep - if (!noindices) s = s "[" indices[i] "]=" - s = s values[indices[i]] - } - s = s suffix - return s -} -function array_join(values, sep, prefix, suffix, count, indices, i, s) { - s = prefix - count = mkindices(values, indices) - for (i = 1; i <= count; i++) { - if (i > 1) s = s sep - s = s values[indices[i]] - } - s = s suffix - return s -} -function printto(s, output) { - if (output == "") { - print s - } else if (output ~ /^>>/) { - sub(/^>>/, "", output) - print s >>output - } else if (output ~ /^>/) { - sub(/^>/, "", output) - print s >output - } else { - print s >output - } -} -function find_line(input, field, value, orig, line) { - orig = $0 - line = "" - while ((getline 0) { - if ($field == value) { - line = $0 - break - } - } - close(input) - $0 = orig - return line -} -function merge_line(input, field, key, line) { - line = find_line(input, field, $key) - if (line != "") $0 = $0 FS line -} -function __csv_parse_quoted(line, destl, colsep, qchar, echar, pos, tmpl, nextc, resl) { - line = substr(line, 2) - resl = "" - while (1) { - pos = index(line, qchar) - if (pos == 0) { - resl = resl line - destl[0] = "" - destl[1] = 0 - return resl - } - if (echar != "" && pos > 1) { - prevc = substr(line, pos - 1, 1) - quotec = substr(line, pos, 1) - nextc = substr(line, pos + 1, 1) - if (prevc == echar) { - tmpl = substr(line, 1, pos - 2) - resl = resl tmpl quotec - line = substr(line, pos + 1) - continue - } - tmpl = substr(line, 1, pos - 1) - if (nextc == colsep || nextc == "") { - resl = resl tmpl - destl[0] = substr(line, pos + 2) - destl[1] = nextc == colsep - return resl - } else { - resl = resl tmpl quotec - line = substr(line, pos + 1) - } - } else { - tmpl = substr(line, 1, pos - 1) - quotec = substr(line, pos, 1) - nextc = substr(line, pos + 1, 1) - if (nextc == colsep || nextc == "") { - resl = resl tmpl - destl[0] = substr(line, pos + 2) - destl[1] = nextc == colsep - return resl - } else if (nextc == qchar) { - resl = resl tmpl quotec - line = substr(line, pos + 2) - } else { - resl = resl tmpl quotec - line = substr(line, pos + 1) - } - } - } -} -function __csv_parse_unquoted(line, destl, colsep, qchar, echar, pos) { - pos = index(line, colsep) - if (pos == 0) { - destl[0] = "" - destl[1] = 0 - return line - } else { - destl[0] = substr(line, pos + 1) - destl[1] = 1 - return substr(line, 1, pos - 1) - } -} -function __array_parsecsv(fields, line, nbfields, colsep, qchar, echar, shouldparse, destl, i) { - array_new(fields) - array_new(destl) - i = 1 - shouldparse = 0 - while (shouldparse || line != "") { - if (index(line, qchar) == 1) { - value = __csv_parse_quoted(line, destl, colsep, qchar, echar) - line = destl[0] - shouldparse = destl[1] - } else { - value = __csv_parse_unquoted(line, destl, colsep, qchar, echar) - line = destl[0] - shouldparse = destl[1] - } - fields[i] = value - i = i + 1 - } - if (nbfields) { - nbfields = int(nbfields) - i = array_len(fields) - while (i < nbfields) { - i++ - fields[i] = "" - } - } - return array_len(fields) -} -BEGIN { - DEFAULT_COLSEP = "," - DEFAULT_QCHAR = "\"" - DEFAULT_ECHAR = "" -} -function array_parsecsv2(fields, line, nbfields, colsep, qchar, echar) { - return __array_parsecsv(fields, line, nbfields, colsep, qchar, echar) -} -function array_parsecsv(fields, line, nbfields, colsep, qchar, echar) { - if (colsep == "") colsep = DEFAULT_COLSEP - if (qchar == "") qchar = DEFAULT_QCHAR - if (echar == "") echar = DEFAULT_ECHAR - return __array_parsecsv(fields, line, nbfields, colsep, qchar, echar) -} -function parsecsv(line, fields) { - array_parsecsv(fields, line) - array_getline(fields) - return NF -} -function getlinecsv(file, fields) { - if (file) { - getline 1) line = line colsep - if (qchar != "" && index(value, qchar) != 0) { - if (echar != "") gsub(qchar, quote_subrepl(echar) "&", value); - else gsub(qchar, "&&", value); - } - if (qchar != "" && (index(value, mvsep) != 0 || index(value, colsep) != 0 || index(value, qchar) != 0 || __csv_should_quote(value))) { - line = line qchar value qchar - } else { - line = line value - } - } - return line -} -function array_formatcsv(fields) { - return array_formatcsv2(fields, ",", ";", "\"", "") -} -function array_printcsv(fields, output) { - printto(array_formatcsv(fields), output) -} -function get_formatcsv( fields) { - array_fill(fields) - return array_formatcsv(fields) -} -function formatcsv() { - $0 = get_formatcsv() -} -function printcsv(output, fields) { - array_fill(fields) - array_printcsv(fields, output) -} -function array_findcsv(fields, input, field, value, nbfields, orig, found, i) { - array_new(orig) - array_fill(orig) - array_new(fields) - found = 0 - while ((getline 0) { - array_parsecsv(fields, $0, nbfields) - if (fields[field] == value) { - found = 1 - break - } - } - close(input) - array_getline(orig) - if (!found) { - delete fields - if (nbfields) { - nbfields = int(nbfields) - i = array_len(fields) - while (i < nbfields) { - i++ - fields[i] = "" - } - } - } - return found -} - -function __and(var, x, l_res, l_i) { - l_res=0; - for (l_i=0; l_i < 8; l_i++){ - if (var%2 == 1 && x%2 == 1) l_res=l_res/2 + 128; - else l_res/=2; - var=int(var/2); - x=int(x/2); - } - return l_res; -} -function __lshift(var, x) { - while(x > 0){ - var*=2; - x--; - } - return var; -} -function __rshift(var, x) { - while(x > 0){ - var=int(var/2); - x--; - } - return var; -} -BEGIN { - __BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" -} -function b64decode(src, result, base1, base2, base3, base4) { - result = "" - while (length(src) > 0) { - base1 = substr(src, 1, 1) - base2 = substr(src, 2, 1) - base3 = substr(src, 3, 1); if (base3 == "") base3 = "=" - base4 = substr(src, 4, 1); if (base4 == "") base4 = "=" - byte1 = index(__BASE64, base1) - 1 - if (byte1 < 0) byte1 = 0 - byte2 = index(__BASE64, base2) - 1 - if (byte2 < 0) byte2 = 0 - byte3 = index(__BASE64, base3) - 1 - if (byte3 < 0) byte3 = 0 - byte4 = index(__BASE64, base4) - 1 - if (byte4 < 0) byte4 = 0 - result = result sprintf( "%c", __lshift(__and(byte1, 63), 2) + __rshift(__and(byte2, 48), 4) ) - if (base3 != "=") result = result sprintf( "%c", __lshift(__and(byte2, 15), 4) + __rshift(__and(byte3, 60), 2) ) - if (base4 != "=") result = result sprintf( "%c", __lshift(__and(byte3, 3), 6) + byte4 ) - src = substr(src, 5) - } - return result -} -' -function awkdef() { - - if [ "${1:0:3}" == "-f" ]; then - shift - echo "$__AWKDEF_FUNCTIONS" - fi - if [ $# -gt 0 ]; then - local __ad_arg __ad_vpos __ad_name __ad_value - echo "BEGIN {" - while [ -n "${1:0:1}" ]; do - __ad_arg="${1:0:256}" - local __ad_array= - if [ "${__ad_arg%\[@\]}" != "$__ad_arg" ]; then - __ad_array=1 - __ad_name="${__ad_arg%\[@\]}" - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_value="$__ad_name" - elif [[ "$__ad_arg" == *\[@\]=* ]]; then - __ad_array=1 - __ad_name="${__ad_arg%%\[@\]=*}" - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_vpos=$((${#__ad_name} + 4)) - __ad_value="${1:$__ad_vpos}" - [ ${#__ad_value} -ne 0 ] || __ad_value="$__ad_name" - elif [[ "$__ad_arg" == *=* ]]; then - local __ad_int= __ad_str= - __ad_name="${__ad_arg%%=*}" - __ad_vpos=$((${#__ad_name} + 1)) - if [ "${__ad_name%:int}" != "$__ad_name" ]; then - __ad_int=1 - __ad_name="${__ad_name%:int}" - elif [ "${__ad_name%:str}" != "$__ad_name" ]; then - __ad_str=1 - __ad_name="${__ad_name%:str}" - fi - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_value="${1:$__ad_vpos}" - if [ -n "$__ad_int" ]; then - echo "$__ad_name = int($(quoted_awk "$__ad_value") + 0)" - elif [ -n "$__ad_str" ]; then - echo "$__ad_name = $(quoted_awk "$__ad_value")" - elif [ ${#__ad_value} -lt 256 ] && isnum "$__ad_value"; then - echo "$__ad_name = $__ad_value" - else - echo "$__ad_name = $(quoted_awk "$__ad_value")" - fi - else - break - fi - if [ -n "$__ad_array" ]; then - if [ "${__ad_value:0:2}" == $'<\n' ]; then - local -a __ad_values - array_from_lines __ad_values "${__ad_value:2}" - __ad_value=__ad_values - fi - __ad_value="${__ad_value}[@]" - local __ad_i=1 - echo "$__ad_name[0] = 0; delete $__ad_name" - for __ad_arg in "${!__ad_value}"; do - echo "$__ad_name[$__ad_i]=$(quoted_awk "$__ad_arg")" - __ad_i=$(($__ad_i + 1)) - done - eval "echo \"\${__ad_name}_count = \${#$__ad_value}\"" - fi - shift - done - echo "}" - for __ad_arg in "$@"; do - rawecho "$__ad_arg" - done - fi -} -function lawkrun() { - local -a __ar_defs __ar_args - while [ $# -gt 0 -a "$1" != "--" ]; do - __ar_defs=("${__ar_defs[@]}" "$1") - shift - done - shift - while [ $# -gt 0 ]; do - __ar_args=("${__ar_args[@]}" "$1") - shift - done - local __ar_script="$(awkdef "${__ar_defs[@]}")" - awk "$__ar_script" "${__ar_args[@]}" -} -function cawkrun() { LANG=C lawkrun "$@"; } -function awkrun() { LANG=C lawkrun "$@"; } - -function __lf_get_age() { - local y=$(date "+%Y") - local dy=$(date "+%j"); while [ "${dy#0}" != "$dy" ]; do dy="${dy#0}"; done - [ -n "$dy" ] || dy=0 - local h=$(date "+%H"); while [ "${h#0}" != "$h" ]; do h="${h#0}"; done - [ -n "$h" ] || h=0 - echo $((($y * 365 + $dy) * 24 + $h)) -} -function lf_trylock() { - local eoo lockfile max_hours=4 - while [ -n "$1" ]; do - case "$1" in - -h) shift; max_hours="$1";; - --) shift; eoo=1;; - *) eoo=1;; - esac - [ -n "$eoo" ] && break - shift - done - - lockfile="$1" - [ -n "$lockfile" ] || die "il faut spécifier un fichier pour le verrou" - - local now="$(__lf_get_age)" - if (set -C; echo "$now" >"$lockfile") 2>/dev/null; then - return 0 - fi - local prev diff - if prev="$(<"$lockfile")"; then - diff="$(($now - $prev))" - if [ "$diff" -gt "$max_hours" ]; then - echo stale - else - echo locked - fi - elif [ -f "$lockfile" ]; then - echo retry - fi - return 1 -} -function pidfile_set() { - local eoo pidfile pid=$$ replace= - while [ -n "$1" ]; do - case "$1" in - -p) - shift - pid="$1" - ;; - -r) - replace=1 - ;; - --) - shift - eoo=1 - ;; - *) - eoo=1 - ;; - esac - [ -n "$eoo" ] && break - shift - done - - pidfile="$1" - [ -n "$pidfile" ] || return 10 - - if [ -f "$pidfile" ]; then - local curpid="$(<"$pidfile")" - if is_running "$curpid"; then - return 1 - elif [ -n "$replace" ]; then - /bin/rm -f "$pidfile" || return 10 - else - return 2 - fi - fi - - echo_ "$pid" >"$pidfile" || return 10 - autoclean "$pidfile" - return 0 -} -function pidfile_check() { - local pidfile="$1" - [ -n "$pidfile" ] || return 10 - - if [ -f "$pidfile" ]; then - [ -r "$pidfile" ] || return 10 - local pid="$(<"$pidfile")" - is_running "$pid" && return 0 - fi - return 1 -} -function page_maybe() { - if isatty; then - less -XF "$@" - else - cat - fi -} - - -function utools_local() { - local arg - [ $# -gt 0 ] || set -- opts verbosity interaction - for arg in "$@"; do - case "$arg" in - parse_opts|opts|o|args) echo "local -a args";; - verbosity|v) echo "local __verbosity='$__verbosity'";; - interaction|i) echo "local __interaction='$__interaction'";; - esac - done -} - -function isatty() { - tty -s <&1 -} -function in_isatty() { - tty -s -} -function out_isatty() { - tty -s <&1 -} -function err_isatty() { - tty -s <&2 -} -function die() { [ $# -gt 0 ] && eerror "$@"; exit 1; } -function exit_with { if [ $# -gt 0 ]; then "$@"; fi; exit $?; } -function die_with { [ $# -gt 0 ] && eerror "$1"; shift; [ $# -gt 0 ] && "$@"; exit 1; } -function die_unless() { - local count=$# - if [ $count -eq 0 ]; then - exit 1 - elif [ $count -eq 1 ]; then - "$@" || exit $? - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - : - else - r=$? - eerror "$m" - exit $r - fi - fi -} -function eerror_unless() { - local count=$# - if [ $count -eq 0 ]; then - return 1 - elif [ $count -eq 1 ]; then - "$@" || return $? - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - : - else - r=$? - eerror "$m" - return $r - fi - fi -} -function die_if() { - local count=$# - if [ $count -eq 0 ]; then - : - elif [ $count -eq 1 ]; then - "$@" && exit 1 - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - eerror "$m" - exit 1 - fi - fi -} -function eerror_if() { - local count=$# - if [ $count -eq 0 ]; then - : - elif [ $count -eq 1 ]; then - "$@" && return 1 - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - eerror "$m" - return 1 - fi - fi -} - -TAB=$'\t' -LATIN1=iso-8859-1 -LATIN9=iso-8859-15 -UTF8=utf-8 -OENC="$UTF8" - -if ! progexists iconv; then - function iconv() { cat; } -fi - -function __lang_encoding() { - local lang="$(<<<"$LANG" awk '{ print tolower($0) }')" - case "$lang" in - *@euro) echo "iso-8859-15";; - *.utf-8|*.utf8) echo "utf-8";; - *) echo "iso-8859-1";; - esac -} -function __norm_encoding() { - awk '{ - enc = tolower($0) - gsub(/^latin$/, "latin1", enc) - gsub(/^latin1$/, "iso-8859-1", enc) - gsub(/^latin9$/, "iso-8859-15", enc) - gsub(/[-_]/, "", enc) - if (enc == "iso8859" || enc == "iso88591" || enc == "8859" || enc == "88591") print "iso-8859-1" - else if (enc == "iso885915" || enc == "885915") print "iso-8859-15" - else if (enc == "utf" || enc == "utf8") print "utf-8" - else print $0 - }' <<<"$1" -} -function __init_encoding() { - local DEFAULT_ENCODING="$(__lang_encoding)" - [ -n "$DEFAULT_ENCODING" ] || DEFAULT_ENCODING=utf-8 - [ -n "$UTOOLS_OUTPUT_ENCODING" ] || UTOOLS_OUTPUT_ENCODING="$DEFAULT_ENCODING" - UTOOLS_OUTPUT_ENCODING="$(__norm_encoding "$UTOOLS_OUTPUT_ENCODING")" - [ -n "$UTOOLS_INPUT_ENCODING" ] || UTOOLS_INPUT_ENCODING="$UTOOLS_OUTPUT_ENCODING" - UTOOLS_INPUT_ENCODING="$(__norm_encoding "$UTOOLS_INPUT_ENCODING")" - [ -n "$UTOOLS_EDITOR_ENCODING" ] || UTOOLS_EDITOR_ENCODING="$UTOOLS_INPUT_ENCODING" - UTOOLS_EDITOR_ENCODING="$(__norm_encoding "$UTOOLS_EDITOR_ENCODING")" - - IENC="$UTOOLS_INPUT_ENCODING" - OENC="$UTOOLS_OUTPUT_ENCODING" -} - -if [ -n "$UTOOLS_LANG" -a -z "$LANG" ]; then - export UTOOLS_LANG - export LANG="$UTOOLS_LANG" -fi -__init_encoding - -function tooenc() { - local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - rawecho "$src" - else - iconv -f "$from" -t "$to" <<<"$src" - fi -} -function uecho() { - tooenc "$*" -} -function tooenc_() { - local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - rawecho_ "$src" - else - rawecho_ "$src" | iconv -f "$from" -t "$to" - fi -} -function uecho_() { - tooenc_ "$*" -} -function toienc() { - local __tie_var="$1" __tie_to="${2:-$IENC}" __tie_from="${3:-$UTOOLS_INPUT_ENCODING}" - if [ "$__tie_from" != "$__tie_to" ]; then - set_var "$__tie_var" "$(iconv -f "$__tie_from" -t "$__tie_to" <<<"${!__tie_var}")" - fi -} -function uread() { - [ $# -gt 0 ] || set -- REPLY - local __r_var - read "$@" - for __r_var in "$@"; do - [ -z "$__r_var" -o "${__r_var:0:1}" == "-" ] && continue # ignorer les options - toienc "$__r_var" - done -} - -function stooenc() { - local from="${1:-$OENC}" to="${2:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - cat - else - iconv -f "$from" -t "$to" - fi -} -function stoienc() { - local to="${1:-$IENC}" from="${2:-$UTOOLS_INPUT_ENCODING}" - if [ "$from" == "$to" ]; then - cat - else - iconv -f "$from" -t "$to" - fi -} - -export UTOOLS_EDATE -function __edate() { [ -n "$UTOOLS_EDATE" ] && date +"[%d/%m/%Y-%H:%M:%S] "; } - -export UTOOLS_ELOG_OVERWRITE -function __set_no_colors() { :; } -function elogto() { - UTOOLS_EDATE=1 - if [ -n "$1" -a -n "$2" ]; then - LANG=fr_FR.UTF8 - UTOOLS_OUTPUT_ENCODING="$UTF8" - __set_no_colors 1 - if [ -n "$UTOOLS_ELOG_OVERWRITE" ]; then - exec >"$1" 2>"$2" - else - exec >>"$1" 2>>"$2" - fi - elif [ -n "$1" ]; then - LANG=fr_FR.UTF8 - UTOOLS_OUTPUT_ENCODING="$UTF8" - __set_no_colors 1 - if [ -n "$UTOOLS_ELOG_OVERWRITE" ]; then - exec >"$1" 2>&1 - else - exec >>"$1" 2>&1 - fi - fi -} - -export __estack __tlevel -function __indent() { - if [ "${1/ -/}" != "$1" ]; then - sed "2,\$s/^/${__tlevel}/g" <<<"$1" - else - rawecho "$1" - fi -} -function __eerror() { tooenc "$(__edate)${__tlevel}* error: $(__indent "$1")"; } -function __ewarn() { tooenc "$(__edate)${__tlevel}* warning: $(__indent "$1")"; } -function __enote() { tooenc "$(__edate)${__tlevel}* note: $(__indent "$1")"; } -function __ebanner() { - local maxi="${COLUMNS:-80}" - local -a lines - local psfix line - - psfix="$(__edate)${__tlevel}" - while [ ${#psfix} -lt $maxi ]; do psfix="$psfix="; done - - tooenc "$psfix" - maxi=$(($maxi - 1)) - array_from_xlines lines "$1" - for line in "" "${lines[@]}" ""; do - line="$(__edate)${__tlevel}= $line" - if [ ${#line} -le $maxi ]; then - while [ ${#line} -lt $maxi ]; do line="$line "; done - line="$line=" - fi - tooenc "$line" - done - tooenc "$psfix" -} -function __eimportant() { tooenc "$(__edate)${__tlevel}* important: $(__indent "$1")"; } -function __eattention() { tooenc "$(__edate)${__tlevel}* attention: $(__indent "$1")"; } -function __einfo() { tooenc "$(__edate)${__tlevel}* info: $(__indent "$1")"; } -function __eecho() { tooenc "$(__edate)${__tlevel}$(__indent "$1")"; } -function __eecho_() { tooenc_ "$(__edate)${__tlevel}$(__indent "$1")"; } -function __edebug() { tooenc "$(__edate)${__tlevel}* debug: $(__indent "$1")"; } -function __estep() { tooenc "$(__edate)${__tlevel}* $(__indent "$1")"; } -function __estepe() { __estep "$@"; } -function __estepw() { __estep "$@"; } -function __estepn() { __estep "$@"; } -function __estepi() { __estep "$@"; } -function __estep_() { tooenc_ "$(__edate)${__tlevel}* $(__indent "$1")"; } -function __estepe_() { __estep_ "$@"; } -function __estepw_() { __estep_ "$@"; } -function __estepn_() { __estep_ "$@"; } -function __estepi_() { __estep_ "$@"; } -function __etitle() { tooenc "$(__edate)${__tlevel}+++ $(__indent "$1")"; } -function __ebegin() { tooenc_ "$(__edate)${__tlevel}* $(__indent "$1"): "; } -function __edoto() { echo_ "."; } -function __edotw() { echo_ "w"; } -function __edotx() { echo_ "x"; } -function __edotp() { echo_ "+"; } -function __edotd() { tooenc "($1)"; } -function __eendo() { echo "[ok]"; } -function __eendx() { echo "[error]"; } -PRETTYOPTS=() -function set_verbosity() { :;} -function set_interaction() { :;} -function show_error() { - return 0 -} -function show_warn() { - return 0 -} -function show_info() { - return 0 -} -function show_verbose() { - return 0 -} -function show_debug() { - [ -n "$DEBUG" ] -} -function check_verbosity() { - return 0 -} -function get_verbosity_option() { :;} -function check_interaction() { - return 0 -} -function is_interaction() { - return 1 -} -function get_interaction_option() { :;} -__epending= -function eflush() { - if [ -n "$__epending" ]; then rawecho "$__epending" 1>&2; __epending=; fi -} -function eclearp() { - __epending= -} -function eerror() { - show_error || return; eflush; __eerror "$*" 1>&2 -} -function ewarn() { - show_warn || return; eflush; __ewarn "$*" 1>&2 -} -function enote() { - show_info || return; eflush; __enote "$*" 1>&2 -} -function ebanner() { - show_error || return; eflush; __ebanner "$*" 1>&2; sleep 5 -} -function eimportant() { - show_error || return; eflush; __eimportant "$*" 1>&2 -} -function eattention() { - show_warn || return; eflush; __eattention "$*" 1>&2 -} -function einfo() { - show_info || return; eflush; __einfo "$*" 1>&2 -} -function eecho() { - show_info || return; eflush; __eecho "$*" 1>&2 -} -function eecho_() { - show_info || return; eflush; __eecho_ "$*" 1>&2 -} -function edebug() { - show_debug || return; eflush; __edebug "$*" 1>&2 -} -function trace() { - local r cmd="$(quoted_args "$@")" - show_info && { eflush; __eecho "\$ $cmd" 1>&2; } - "$@"; r=$? - if [ $r -ne 0 ]; then - if show_info; then - eflush; __eecho "^ [EC #$r]" 1>&2 - elif show_error; then - eflush; __eecho "^ $cmd [EC #$r]" 1>&2; - fi - fi - return $r -} -function trace_error() { - local r - "$@"; r=$? - if [ $r -ne 0 ]; then - local cmd="$(quoted_args "$@")" - show_error && { eflush; __eecho "^ $cmd [EC #$r]" 1>&2; } - fi - return $r -} - -function etitle() { - local __t_deferred= - __t_etitle "$@" -} -function etitled() { - local __t_deferred=1 - __t_etitle "$@" -} -function __t_etitle() { - local __t_eend=default - local __t_clearp= - while [ -n "$1" ]; do - if [ "$1" == "--" ]; then - shift - break - elif [ "$1" == "-s" ]; then - __t_eend= - shift - elif [ "$1" == "--eend" ]; then - __t_eend=1 - shift - elif [ "$1" == "-p" ]; then - __t_clearp=1 - shift - else - break - fi - done - local __t_title="$1"; shift - local __t_s=0 - [ -n "$__estack" ] && __tlevel="${__tlevel} " - __estack="$__estack:t" - if show_info; then - if [ -n "$__t_deferred" ]; then - __epending="${__epending:+$__epending -}$(__etitle "$__t_title")" - else - eflush - __etitle "$__t_title" 1>&2 - fi - fi - if [ $# -gt 0 ]; then - "$@" - __t_s=$? - [ "$__t_eend" == "default" ] && __t_eend=1 - fi - [ "$__t_eend" == "default" ] && __t_eend= - if [ -n "$__t_eend" ]; then - eend $__t_s - [ -n "$__t_clearp" ] && eclearp - fi - return $__t_s -} -function estep() { - show_info || return; eflush; __estep "$*" 1>&2 -} -function estepe() { - show_info || return; eflush; __estepe "$*" 1>&2 -} -function estepw() { - show_info || return; eflush; __estepw "$*" 1>&2 -} -function estepn() { - show_info || return; eflush; __estepn "$*" 1>&2 -} -function estepi() { - show_info || return; eflush; __estepi "$*" 1>&2 -} -function estep_() { - show_info || return; eflush; __estep_ "$*" 1>&2 -} -function estepe_() { - show_info || return; eflush; __estepe_ "$*" 1>&2 -} -function estepw_() { - show_info || return; eflush; __estepw_ "$*" 1>&2 -} -function estepn_() { - show_info || return; eflush; __estepn_ "$*" 1>&2 -} -function estepi_() { - show_info || return; eflush; __estepi_ "$*" 1>&2 -} -function ebegin() { - local __b_eend=default - while [ -n "$1" ]; do - if [ "$1" == "--" ]; then - shift - break - elif [ "$1" == "-s" ]; then - __b_eend= - shift - elif [ "$1" == "--eend" ]; then - __b_eend=1 - shift - else - break - fi - done - local __b_msg="$1"; shift - local __b_s=0 - __estack="$__estack:b" - if show_info; then - eflush - __ebegin "$__b_msg" 1>&2 - fi - if [ $# -gt 0 ]; then - "$@" - __b_s=$? - [ "$__b_eend" == "default" ] && __b_eend=1 - fi - [ "$__b_eend" == "default" ] && __b_eend= - [ -n "$__b_eend" ] && eend $__b_s - return $__b_s -} -function edot() { - local s=$? - show_info || return - eflush - [ -n "$1" ] && s="$1" - shift - if [ "$s" == "0" ]; then - __edoto 1>&2 - else - __edotx 1>&2 - fi - show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2 - return $s -} -function edotw() { - local s=$? - show_info || return - eflush - [ -n "$1" ] && s="$1" - shift - __edotw 1>&2 - show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2 - return $s -} -function ewait() { - [ -n "$1" ] || return 1 - if show_info; then - local count=2 - eflush - little_sleep # certains processus retournent tout de suite - while is_running "$1"; do - sleep 1 - if [ $count -gt 0 ]; then - count=$(($count - 1)) - else - __edotp 1>&2 - fi - done - __edoto 1>&2 - else - wait "$1" - fi -} -function eend() { - local s=$? - if [ "$1" == "-c" ]; then - __estack= - __tlevel= - elif [ "${__estack%:b}" != "$__estack" ]; then - __estack="${__estack%:b}" - show_info || return - eflush - [ -n "$1" ] && s="$1" - if [ "$s" == "0" ]; then - __eendo 1>&2 - else - __eendx 1>&2 - fi - elif [ "${__estack%:t}" != "$__estack" ]; then - __estack="${__estack%:t}" - __tlevel="${__tlevel% }" - fi -} -function ask_yesno() { - local interactive=1 - if [[ "$1" == -* ]]; then - if [ "$1" != -- ]; then - check_interaction "$1" || interactive= - fi - shift - else - check_interaction -c || interactive= - fi - local default="${2:-N}" - if [ "$default" == "C" ]; then - [ -n "$interactive" ] && default=N || default=O - elif [ "$default" == "X" ]; then - [ -n "$interactive" ] && default=O || default=N - fi - if [ -n "$interactive" ]; then - eflush - local message="$1" - local prompt="[oN]" - local r - is_yes "$default" && prompt="[On]" - if [ -n "$message" ]; then - tooenc_ "$message" 1>&2 - else - tooenc_ "Voulez-vous continuer?" "$UTF8" 1>&2 - fi - tooenc_ " $prompt " "$UTF8" 1>&2 - uread r - is_yes "${r:-$default}" - else - is_yes "$default" - fi -} -function read_value() { - local -a __rv_opts __rv_readline=1 __rv_showdef=1 __rv_nl= - __rv_opts=() - [ -n "$UTOOLS_NO_READLINE" ] && __rv_readline= - __rv_read "$@" -} -function read_password() { - local -a __rv_opts __rv_readline= __rv_showdef= __rv_nl=1 - __rv_opts=(-s) - __rv_read "$@" -} -function __rv_read() { - local __rv_int=1 - if [[ "$1" == -* ]]; then - if [ "$1" != -- ]; then - check_interaction "$1" || __rv_int= - fi - shift - else - check_interaction -c || __rv_int= - fi - local __rv_msg="$1" __rv_v="${2:-value}" __rv_d="$3" __rv_re="${4:-O}" - if [ -z "$__rv_int" ]; then - if is_yes "$__rv_re" && [ -z "$__rv_d" ]; then - OENC="$UTF8" eerror "La valeur par défaut de $__rv_v doit être non vide" - return 1 - fi - set_var "$__rv_v" "$__rv_d" - return 0 - fi - - eflush - local __rv_r - while true; do - if [ -n "$__rv_msg" ]; then - tooenc_ "$__rv_msg" 1>&2 - else - tooenc_ "Entrez la valeur" "$UTF8" 1>&2 - fi - if [ -n "$__rv_readline" ]; then - tooenc_ ": " "$UTF8" 1>&2 - uread -e ${__rv_d:+-i"$__rv_d"} "${__rv_opts[@]}" __rv_r - else - if [ -n "$__rv_d" ]; then - if [ -n "$__rv_showdef" ]; then - tooenc_ " [$__rv_d]" 1>&2 - else - tooenc_ " [****]" 1>&2 - fi - fi - tooenc_ ": " "$UTF8" 1>&2 - uread "${__rv_opts[@]}" __rv_r - [ -n "$__rv_nl" ] && echo - fi - __rv_r="${__rv_r:-$__rv_d}" - if [ -n "$__rv_r" ] || ! is_yes "$__rv_re"; then - set_var "$__rv_v" "$__rv_r" - return 0 - fi - done -} -function simple_menu() { - local __sm_title= __sm_yourchoice= __sm_default= - local -a __sm_args - parse_opts -t: __sm_title= -m: __sm_yourchoice= -d: __sm_default= @ __sm_args -- "$@" && - set -- "${__sm_args[@]}" || ewarn "$__sm_args" - - local __sm_option_var="${1:-option}" __sm_options_var="${2:-options}" - local __sm_option __sm_options - __sm_options="$__sm_options_var[*]" - if [ -z "${!__sm_options}" ]; then - OENC="$UTF8" eerror "Le tableau $__sm_options_var doit être non vide" - return 1 - fi - [ -z "$__sm_default" ] && __sm_default="${!__sm_option_var}" - - eflush - array_copy __sm_options "$__sm_options_var" - local __sm_c=0 __sm_i __sm_choice - while true; do - if [ "$__sm_c" == "0" ]; then - [ -n "$__sm_title" ] && tooenc "=== $__sm_title ===" 1>&2 - __sm_i=1 - for __sm_option in "${__sm_options[@]}"; do - if [ "$__sm_option" == "$__sm_default" ]; then - tooenc "$__sm_i*- $__sm_option" 1>&2 - else - tooenc "$__sm_i - $__sm_option" 1>&2 - fi - let __sm_i=$__sm_i+1 - done - fi - - if [ -n "$__sm_yourchoice" ]; then - tooenc_ "$__sm_yourchoice" 1>&2 - else - tooenc_ "Entrez le numéro de l'option choisie" "$UTF8" 1>&2 - fi - tooenc_ ": " "$UTF8" 1>&2 - uread __sm_choice - - if [ -z "$__sm_choice" -a -n "$__sm_default" ]; then - __sm_option="$__sm_default" - break - fi - if [ -n "$__sm_choice" -a -z "${__sm_choice//[0-9]/}" ]; then - if [ "$__sm_choice" -gt 0 -a "$__sm_choice" -le "${#__sm_options[*]}" ]; then - __sm_option="${__sm_options[$(($__sm_choice - 1))]}" - break - else - OENC="$UTF8" eerror "Numéro d'option incorrect" - fi - else - OENC="$UTF8" eerror "Vous devez saisir le numéro de l'option choisie" - fi - - let __sm_c=$__sm_c+1 - if [ "$__sm_c" -eq 5 ]; then - tooenc "" "$UTF8" 1>&2 - __sm_c=0 - fi - done - set_var "$__sm_option_var" "$__sm_option" -} - -function actions_menu() { - local -a __am_action_descs __am_options __am_void_actions - local __am_tmp __am_select_action __am_select_option __am_title __am_optyc __am_actyc - local __am_default_action=auto __am_quit_action=auto - local __am_default_option= - local -a __am_args - parse_opts \ - -t: __am_title= \ - -m: __am_optyc= \ - -M: __am_actyc= \ - -e: __am_void_actions \ - -d: __am_default_action= \ - -q: __am_quit_action= \ - -o: __am_default_option= \ - @ __am_args -- "$@" && set -- "${__am_args[@]}" || { eerror "$__am_args"; return 1; } - - __am_tmp="${1:-action}"; __am_select_action="${!__am_tmp}" - __am_tmp="${2:-option}"; __am_select_option="${!__am_tmp}" - [ -n "$__am_default_option" ] && __am_select_option="$__am_default_option" - array_copy __am_action_descs "${3:-actions}" - array_copy __am_options "${4:-options}" - - eerror_unless [ ${#__am_action_descs[*]} -gt 0 ] "Vous devez spécifier le tableau des actions" || return - __actions_menu || return 1 - setv "${1:-action}" "$__am_select_action" - setv "${2:-option}" "$__am_select_option" -} -function __actions_menu() { - local title="$__am_title" - local optyc="$__am_optyc" actyc="$__am_actyc" - local default_action="$__am_default_action" - local quit_action="$__am_quit_action" - local select_action="$__am_select_action" - local select_option="$__am_select_option" - local -a action_descs options void_actions - array_copy action_descs __am_action_descs - array_copy options __am_options - array_copy void_actions __am_void_actions - - local no_options - array_isempty options && no_options=1 - - local -a actions - local tmp action name - for tmp in "${action_descs[@]}"; do - splitfsep2 "$tmp" : action name - [ -n "$action" ] || action="${name:0:1}" - action="$(strlower "$action")" - array_addu actions "$action" - done - - if [ "$default_action" == auto ]; then - default_action="$select_action" - if [ -n "$default_action" ]; then - array_contains actions "$default_action" || default_action= - fi - [ -n "$default_action" ] || default_action="${actions[0]}" - fi - default_action="${default_action:0:1}" - default_action="$(strlower "$default_action")" - - if [ "$quit_action" == auto ]; then - if [ ${#actions[*]} -gt 1 ]; then - quit_action="${actions[@]:$((-1)):1}" - array_addu void_actions "$quit_action" - fi - fi - quit_action="${quit_action:0:1}" - quit_action="$(strlower "$quit_action")" - - local action_title - for tmp in "${action_descs[@]}"; do - splitfsep2 "$tmp" : action name - [ -n "$action" ] || action="${name:0:1}" - [ -n "$name" ] || name="$action" - action="$(strlower "$action")" - if [ -n "$no_options" ]; then - if ! array_contains void_actions "$action"; then - array_del actions "$action" - continue - fi - fi - [ "$action" == "$default_action" ] && name="$name*" - action_title="${action_title:+$action_title/}$name" - done - if [ -n "$default_action" ]; then - array_contains actions "$default_action" || default_action= - fi - if [ -n "$quit_action" ]; then - array_contains actions "$quit_action" || quit_action= - fi - - if [ -n "$no_options" ]; then - if array_isempty void_actions; then - eerror "Aucune option n'est définie. Il faut définir le tableau des actions vides" - return 1 - fi - __void_actions_menu - else - __options_actions_menu - fi -} -function __void_actions_menu() { - eflush - local c=0 choice - while true; do - if [ $c -eq 0 ]; then - [ -n "$title" ] && __etitle "$title" 1>&2 - __eecho_ "=== Actions disponibles: " 1>&2 - tooenc "$action_title" 1>&2 - fi - if [ -n "$actyc" ]; then - __eecho_ "$actyc" 1>&2 - elif [ -n "$optyc" ]; then - __eecho_ "$optyc" 1>&2 - else - __eecho_ "Entrez l'action à effectuer" 1>&2 - fi - tooenc_ ": " 1>&2 - uread choice - if [ -z "$choice" -a -n "$default_action" ]; then - select_action="$default_action" - break - fi - - choice="${choice:0:1}" - choice="$(strlower "$choice")" - if array_contains actions "$choice"; then - select_action="$choice" - break - elif [ -n "$choice" ]; then - eerror "$choice: action incorrecte" - else - eerror "vous devez saisir l'action à effectuer" - fi - let c=$c+1 - if [ $c -eq 5 ]; then - tooenc "" 1>&2 - c=0 - fi - done - __am_select_action="$select_action" - __am_select_option= -} -function __options_actions_menu() { - eflush - local c=0 option choice action option - while true; do - if [ $c -eq 0 ]; then - [ -n "$title" ] && __etitle "$title" 1>&2 - i=1 - for option in "${options[@]}"; do - if [ "$option" == "$select_option" ]; then - tooenc "$i*- $option" 1>&2 - else - tooenc "$i - $option" 1>&2 - fi - let i=$i+1 - done - __estepn_ "Actions disponibles: " 1>&2 - tooenc "$action_title" 1>&2 - fi - if [ -n "$optyc" ]; then - __eecho_ "$optyc" 1>&2 - else - __eecho_ "Entrez l'action et le numéro de l'option choisie" 1>&2 - fi - tooenc_ ": " 1>&2 - uread choice - - if [ -z "$choice" -a -n "$default_action" ]; then - action="$default_action" - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - elif [ -n "$select_option" ]; then - select_action="$action" - break - fi - fi - action="${choice:0:1}" - action="$(strlower "$action")" - if array_contains actions "$action"; then - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - else - option="${choice:1}" - option="${option// /}" - if [ -z "$option" -a -n "$select_option" ]; then - select_action="$action" - break - elif [ -z "$option" ]; then - eerror "vous devez saisir le numéro de l'option" - elif isnum "$option"; then - if [ $option -gt 0 -a $option -le ${#options[*]} ]; then - select_action="$action" - select_option="${options[$(($option - 1))]}" - break - fi - else - eerror "$option: numéro d'option incorrecte" - fi - fi - elif isnum "$choice"; then - action="$default_action" - if [ -n "$action" ]; then - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - else - option="${choice// /}" - if [ -z "$option" ]; then - eerror "vous devez saisir le numéro de l'option" - elif isnum "$option"; then - if [ $option -gt 0 -a $option -le ${#options[*]} ]; then - select_action="$action" - select_option="${options[$(($option - 1))]}" - break - fi - else - eerror "$option: numéro d'option incorrecte" - fi - fi - else - eerror "Vous devez spécifier l'action à effectuer" - fi - elif [ -n "$choice" ]; then - eerror "$choice: action et/ou option incorrecte" - else - eerror "vous devez saisir l'action à effectuer" - fi - let c=$c+1 - if [ $c -eq 5 ]; then - tooenc "" 1>&2 - c=0 - fi - done - __am_select_action="$select_action" - __am_select_option="$select_option" -} - - -function __ac_forgetall() { __ac_files=(); } -__ac_forgetall -function __ac_trap() { - local file - for file in "${__ac_files[@]}"; do - [ -e "$file" ] && rm -rf "$file" 2>/dev/null - done - __ac_forgetall -} -trap __ac_trap 1 3 15 EXIT -function autoclean() { - local file - for file in "$@"; do - [ -n "$file" ] && array_add __ac_files "$file" - done -} -function ac_cleanall() { - __ac_trap -} -function ac_clean() { - local file - for file in "$@"; do - if array_contains __ac_files "$file"; then - [ -e "$file" ] && rm -rf "$file" 2>/dev/null - array_del __ac_files "$file" - fi - done -} -function ac_set_tmpfile() { - local __acst_d - if show_debug; then - if [ -n "$5" ]; then - is_yes "${!5}" && __acst_d=1 - else - __acst_d=1 - fi - fi - if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" - [ -f "$3" -a "$4" == keep ] || >"$3" - else - local __acst_t="$(mktempf "$2")" - autoclean "$__acst_t" - set_var "$1" "$__acst_t" - fi -} -function ac_set_tmpdir() { - local __acst_d - if show_debug; then - if [ -n "$4" ]; then - is_yes "${!4}" && __acst_d=1 - else - __acst_d=1 - fi - fi - if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" - mkdir -p "$3" - else - local __acst_t="$(mktempd "$2")" - autoclean "$__acst_t" - set_var "$1" "$__acst_t" - fi -} -function debug_tee() { - if show_debug; then - tee "$@" - else - cat - fi -} - - -function get_defaults_files() { - local __gd_dest="${1:-defaults}"; shift - local -a __gd_fs - local __gd_f __gd_found - for __gd_f in "$@"; do - __gd_found= - if [ -r "/etc/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "/etc/default/$__gd_f") - __gd_found=1 - fi - if [ -r "$HOME/etc/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "$HOME/etc/default/$__gd_f") - __gd_found=1 - fi - if [ -z "$__gd_found" -a -r "$scriptdir/lib/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "$scriptdir/lib/default/$__gd_f") - fi - done - array_copy "$__gd_dest" __gd_fs -} - -function set_defaults() { - local -a __sd_fs - local __sd_f - get_defaults_files __sd_fs "$@" - for __sd_f in "${__sd_fs[@]}"; do - source "$__sd_f" - done -} - - -: "${MYHOST:=$HOSTNAME}" -: "${MYHOSTNAME:=${MYHOST%%.*}}" -export MYHOST MYHOSTNAME - -function myhost() { - hostname -f 2>/dev/null || echo "$MYHOST" -} -function myhostname() { - hostname -s 2>/dev/null || echo "$MYHOSTNAME" -} -##@inc]base -uprovide base.tools -urequire base - -function base_umove() { - local -a args - local updatedir - args=(-d:,--updatedir: .) - parse_args_check "$@" || return; set -- "${args[@]}" - - eerror_unless [ -z "$updatedir" -o -d "$updatedir" ] "$updatedir: doit être un répertoire" || return - eerror_if [ $# -eq 0 ] "Vous devez spécifier les fichiers à déplacer" || return - eerror_if [ $# -eq 1 ] "Vous devez spécifier la destination" || return - - local -a srcs - local dest - - srcs=("$@") - setx dest=last_value srcs - array_del_last srcs - - if [ $# -eq 2 ]; then - if [ -d "$dest" ]; then - : # ce cas sera traité ci-dessous - elif [ -e "$dest" ]; then - eerror "$dest: refus d'écraser la destination" - return 1 - else - src="${srcs[0]}" - if [ -n "$updatedir" ]; then - if [ -L "$src" ]; then - ldest="$(readlinka "$src")" - array_find_links update_links "$ldest" "$updatedir" - else - array_find_links update_links "$src" "$updatedir" - fi - move_file "$src" "$dest" "${update_links[@]}" - else - move_link "$src" "$dest" - fi - return $? - fi - fi - - [ -d "$dest" ] || { - eerror "$dest: doit être un répertoire" - return 1 - } - for src in "${srcs[@]}"; do - if [ -n "$updatedir" ]; then - if [ -L "$src" ]; then - move_link "$src" "$dest" - else - array_find_links update_links "$src" "$updatedir" - move_file "$src" "$dest" "${update_links[@]}" - fi - else - move_link "$src" "$dest" - fi - done -} -##@inc]base.tools -##@inc[base.compat -## Fonctions de base: support des fonctions obsolètes et des versions de bash < 4.x -##@inc[base.core -## Fonctions de base: fondement -uprovide base.core - -function echo_() { - echo -n "$*" -} -function recho() { - if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - - local first="${1:1}"; shift - echo "$first$@" - else - echo "$@" - fi -} -function recho_() { - if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - - local first="${1:1}"; shift - echo -n "$first$@" - else - echo -n "$@" - fi -} -function _qval() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s//\$/\\\$}" - s="${s//\`/\\\`}" - recho_ "$s" -} -function should_quote() { - local l="${#1}" - [ $l -eq 0 -o $l -gt 80 ] && return 0 - local s="${*//[a-zA-Z0-9]/}" - s="${s//,/}" - s="${s//./}" - s="${s//+/}" - s="${s//\//}" - s="${s//-/}" - s="${s//_/}" - s="${s//=/}" - [ -n "$s" ] -} -function qval() { - echo -n \" - _qval "$@" - echo \" -} -function qvalm() { - if should_quote "$*"; then - echo -n \" - _qval "$@" - echo \" - else - recho "$*" - fi -} -function qvalr() { - if [ -z "$*" ]; then - : - elif should_quote "$*"; then - echo -n \" - _qval "$@" - echo \" - else - recho "$*" - fi -} -function qvals() { - local arg first=1 - for arg in "$@"; do - [ -z "$first" ] && echo -n " " - if should_quote "$arg"; then - echo -n \" - _qval "$arg" - echo -n \" - else - recho_ "$arg" - fi - first= - done - [ -z "$first" ] && echo -} -function qwc() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s//\$/\\\$}" - s="${s//\`/\\\`}" - local r a b - while [ -n "$s" ]; do - if [[ "$s" == *\** ]]; then - if [[ "$s" == *\?* ]]; then - a="${s%%\**}" - b="${s%%\?*}" - if [ ${#a} -lt ${#b} ]; then - s="${s#*\*}" - r="$r\"$a\"*" - else - s="${s#*\?}" - r="$r\"$b\"?" - fi - else - a="${s%%\**}" - s="${s#*\*}" - r="$r\"$a\"*" - fi - elif [[ "$s" == *\?* ]]; then - if [[ "$s" == *\** ]]; then - a="${s%%\**}" - b="${s%%\?*}" - if [ ${#a} -lt ${#b} ]; then - s="${s#*\*}" - r="$r\"$a\"*" - else - s="${s#*\?}" - r="$r\"$b\"?" - fi - else - a="${s%%\?*}" - s="${s#*\?}" - r="$r\"$a\"?" - fi - else - r="$r\"$s\"" - break - fi - done - recho_ "$r" -} -function qlines() { - sed "s/'/'\\\\''/g; s/.*/'&'/g" -} -function setv() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - eval "$__s_var=\"\$*\"" -} -function _setv() { - local __s_var="$1"; shift - eval "$__s_var=\"\$*\"" -} -function echo_setv() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - echo "$__s_var=$(qvalr "$*")" -} -function setx() { - if [ "$1" == -a ]; then - shift - local __s_array="$1"; shift - if [[ "$__s_array" == *=* ]]; then - set -- "${__s_array#*=}" "$@" - __s_array="${__s_array%%=*}" - fi - eval "$__s_array=($("$@" | qlines))" - else - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - eval "$__s_var="'"$("$@")"' - fi -} -function _setvx() { - local __s_var="$1"; shift - eval "$__s_var="'"$("$@")"' -} -function _setax() { - local __s_array="$1"; shift - eval "$__s_array=($("$@" | qlines))" -} -function evalx() { - local __e_val __e_arg __e_r=0 - local -a __e_cmd - - local __e_first=1 - while [ $# -gt 0 ]; do - __e_cmd=() - while [ $# -gt 0 ]; do - __e_arg="$1"; shift - [ "$__e_arg" == // ] && break - if [ "${__e_arg%//}" != "$__e_arg" ]; then - local __e_tmp="${__e_arg%//}" - if [ -z "${__e_tmp//\\/}" ]; then - __e_arg="${__e_arg#\\}" - __e_cmd=("${__e_cmd[@]}" "$__e_arg") - continue - fi - fi - __e_cmd=("${__e_cmd[@]}" "$__e_arg") - done - - if [ -n "$__e_first" ]; then - __e_val="$("${__e_cmd[@]}")" || __e_r=$? - else - __e_val="$("${__e_cmd[@]}" "$__e_val")" || __e_r=$? - fi - __e_first= - done - [ -n "$__e_val" ] && echo "$__e_val" - return $__e_r -} -function setxx() { - local -a __s_args - if [ "$1" == -a ]; then __s_args=(-a); shift; fi - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - __s_args=("${__s_args[@]}" "$__s_var") - setx "${__s_args[@]}" evalx "$@" -} -function evalp() { - local __e_arg __e_cmd - - while [ $# -gt 0 ]; do - __e_arg="$1"; shift - if [ "$__e_arg" == // ]; then - __e_cmd="$__e_cmd |" - continue - elif [ "${__e_arg%//}" != "$__e_arg" ]; then - local __e_tmp="${__e_arg%//}" - if [ -z "${__e_tmp//\\/}" ]; then - __e_arg="${__e_arg#\\}" - fi - fi - __e_cmd="${__e_cmd:+$__e_cmd }\"$(_qval "$__e_arg")\"" - done - eval "$__e_cmd" -} -function setxp() { - local -a __s_args - if [ "$1" == -a ]; then __s_args=(-a); shift; fi - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - __s_args=("${__s_args[@]}" "$__s_var") - setx "${__s_args[@]}" evalp "$@" -} -function testx() { - local __t_op="$1"; shift - local __t_val="$(evalx "$@")" - [ $__t_op "$__t_val" ] -} -function test2x() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalx "$@")" - [ "$__t_val1" $__t_op "$__t_val2" ] -} -function testrx() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalx "$@")" - eval '[[ "$__t_val1" '"$__t_op"' "$__t_val2" ]]' -} -function testp() { - local __t_op="$1"; shift - local __t_val="$(evalp "$@")" - [ $__t_op "$__t_val" ] -} -function test2p() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalp "$@")" - [ "$__t_val1" $__t_op "$__t_val2" ] -} -function testrp() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalp "$@")" - eval '[[ "$__t_val1" '"$__t_op"' "$__t_val2" ]]' -} - -function err2out() { - "$@" 2>&1 -} - -function is_defined() { - [ -n "$(declare -p "$1" 2>/dev/null)" ] -} -function is_array() { - case "$(declare -p "$1" 2>/dev/null)" in declare\ -a*) return 0;; esac - return 1 -} - -function upvar() { - if unset -v "$1"; then - if [ $# -eq 2 ]; then - eval "$1=\"\$2\"" - else - eval "$1=(\"\${@:2}\")" - fi - fi -} -function array_upvar() { - unset -v "$1" && eval "$1=(\"\${@:2}\")" -} -function upvars() { - while [ $# -gt 0 ]; do - case "$1" in - -a) - unset -v "$2" && eval "$2=(\"\${@:3}\")" - break - ;; - -a*) - unset -v "$2" && eval "$2=(\"\${@:3:${1#-a}}\")" - shift $((${1#-a} + 2)) || return 1 - ;; - *) - unset -v "$1" && eval "$1=\"\$2\"" - shift; shift - ;; - esac - done -} - -function __ab_process_pending() { - local -a values - case "$mode" in - cmd) values="$("${pending[@]}")";; - ssplit) eval "values=($("${pending[@]}"))";; - lsplit) eval "values=($("${pending[@]}" | qlines))";; - add) values=("${pending[@]}");; - esac - cmd=("${cmd[@]}" "${values[@]}") - pending=() -} -function array_buildcmd() { - local desta="$1"; shift; local "$desta" - local mode=add - local -a pending cmd - while [ $# -gt 0 ]; do - case "$1" in - ++c|++cmd|++) __ab_process_pending; mode=cmd;; - ++s|++ssplit) __ab_process_pending; mode=ssplit;; - ++l|++lsplit) __ab_process_pending; mode=lsplit;; - ++a|++add) __ab_process_pending; mode=add;; - *) pending=("${pending[@]}" "$1");; - esac - shift - done - __ab_process_pending - array_upvar "$desta" "${cmd[@]}" -} -function buildcmd() { - local -a args - array_buildcmd args "$@" - qvals "${args[@]}" -} -function evalcmd() { - local -a args - array_buildcmd args "$@" - "${args[@]}" -} -##@inc]base.core -##@inc[base.num -## Fonctions de base: gestion des valeurs numériques -uprovide base.num - -function isnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//[0-9]/}" - [ -z "$v" ] -} -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - [ -z "${1//[0-9]/}" ] -} -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//./}" - v="${v//,/}" - v="${v//[0-9]/}" - [ -z "$v" ] -} -##@inc]base.num -##@inc[base.bool -## Fonctions de base: valeurs booléennes -##@inc[base.num -## Fonctions de base: gestion des valeurs numériques -uprovide base.num - -function isnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//[0-9]/}" - [ -z "$v" ] -} -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - [ -z "${1//[0-9]/}" ] -} -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//./}" - v="${v//,/}" - v="${v//[0-9]/}" - [ -z "$v" ] -} -##@inc]base.num -uprovide base.bool -urequire base.num - -function is_yes() { - case "${1,,}" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - esac - isnum "$1" && [ "$1" -ne 0 ] && return 0 - return 1 -} -function is_no() { - case "${1,,}" in - n|non|no|f|faux|false|off) return 0;; - esac - isnum "$1" && [ "$1" -eq 0 ] && return 0 - return 1 -} -function yesval() { - is_yes "$1" && echo 1 -} - -function setb() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - local __s_r - if "$@" >/dev/null; then - eval "$__s_var=1" - else - __s_r=$? - eval "$__s_var=" - return $__s_r - fi -} -function _setb() { - local __s_var="$1"; shift - if "$@" >/dev/null; then - eval "$__s_var=1" - else - eval "$__s_var=" - fi -} - -function evalb() { - if evalx "$@" >/dev/null; then - echo 1 - else - return $? - fi -} -function setxb() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - setx "$__s_var" evalb "$@" -} -##@inc]base.bool -##@inc[base.quote -## Fonctions de base: protection de valeurs chaine -uprovide base.quote -urequire base.core - -function _qawk() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s// -/\\n}" - recho_ "$s" -} -function qawk() { - echo -n \" - _qawk "$@" - echo \" -} -function qseds() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\//\\/}" - s="${s// -/\\n}" - recho "$s" -} -function _qform() { - local s="$*" - s="${s//\%/%25}" - s="${s//+/%2B}" - s="${s//&/%26}" - s="${s//=/%3D}" - s="${s// /+}" - recho_ "$s" -} -function qform() { - local s="$*" - if [[ "$s" == *=* ]]; then - _qform "${s%%=*}" - echo -n = - _qform "${s#*=}" - echo - else - _qform "$s" - echo - fi -} -function _qsql() { - local q="'" qq="''" - echo "${*//$q/$qq}" -} -function qsql() { - local q="'" qq="''" - echo "'${*//$q/$qq}'" -} -##@inc]base.quote -uprovide base.compat -urequire base.core base.num base.bool base.quote - - -function setx2() { setxx "$@"; } -function rawecho() { recho "$@"; } -function rawecho_() { recho_ "$@"; } -function quote_arg() { _qval "$@"; } -function quoted_arg() { qvalm "$@"; } -function quoted_args() { qvals "$@"; } -function set_var() { setv "$@"; } -function set_var_cmd() { echo_setv "$@"; } -function set_var_literal() { eval "$1=$2"; } - -function quote_awk() { _qawk "$@"; } -function quoted_awk() { qawk "$@"; } -function quote_seds() { qseds "$@"; } -function quote_form() { _qform "$@"; } -function quoted_form() { qform "$@"; } - - -if [ -n "$BASH_VERSINFO" -a "${BASH_VERSINFO[0]}" -lt 4 ]; then - function strlower() { tr A-Z a-z <<<"$*"; } - function strlower1() { - local str="$*" - local h="${str:0:1}" r="${str:1}" - echo "$(tr A-Z a-z <<<"$h")$r" - } - function strlowers() { - local -a vs; local v - for v in "$@"; do - vs=("${vs[@]}" "$(strlower1 "$v")") - done - echo "${vs[*]}" - } - function strupper() { tr a-z A-Z <<<"$*"; } - function strupper1() { - local str="$*" - local h="${str:0:1}" r="${str:1}" - echo "$(tr a-z A-Z <<<"$h")$r" - } - function struppers() { - local -a vs; local v - for v in "$@"; do - vs=("${vs[@]}" "$(strupper1 "$v")") - done - echo "${vs[*]}" - } - - function is_yes() { - case "$1" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - O|OUI|Y|YES|V|VRAI|T|TRUE|ON) return 0;; - esac - isnum "$1" && [ "$1" -ne 0 ] && return 0 - case "$(strlower "$1")" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - esac - return 1 - } - function is_no() { - case "$1" in - n|non|no|f|faux|false|off) return 0;; - N|NON|NO|F|FAUX|FALSE|OFF) return 0;; - esac - isnum "$1" && [ "$1" -eq 0 ] && return 0 - case "$(strlower "$1")" in - n|non|no|f|faux|false|off) return 0;; - esac - return 1 - } -fi -##@inc]base.compat -uprovide base -urequire base.init base.core base.string base.num base.bool base.array base.quote base.split base.args base.tools base.compat - -UNAME_SYSTEM=`uname -s` -[ "${UNAME_SYSTEM#CYGWIN}" != "$UNAME_SYSTEM" ] && UNAME_SYSTEM=Cygwin -[ "${UNAME_SYSTEM#MINGW32}" != "$UNAME_SYSTEM" ] && UNAME_SYSTEM=Mingw -UNAME_MACHINE=`uname -m` -if [ -n "$UTOOLS_CHROOT" ]; then - [ -n "$UTOOLS_UNAME_SYSTEM" ] && eval "UNAME_SYSTEM=$UTOOLS_UNAME_SYSTEM" - [ -n "$UTOOLS_UNAME_MACHINE" ] && eval "UNAME_MACHINE=$UTOOLS_UNAME_MACHINE" -fi - -function setyesval() { - is_yes "$2" && set_var "$1" 1 || set_var "$1" "" -} -function normyesval() { - is_yes "${2:-"${!1}"}" && set_var "$1" 1 || set_var "$1" "" -} -function normyesvals() { - local __nyv_yesvar - for __nyv_yesvar in "$@"; do - is_yes "${!__nyv_yesvar}" && set_var "$__nyv_yesvar" 1 || set_var "$__nyv_yesvar" "" - done -} -function quote_in() { - sed 's/\\/\\\\/g -s/"/\\"/g -s/\$/\\$/g -s/`/\\`/g' -} -function quote_sin() { - sed "s/'/'\\\\''/g" -} -function quote_sarg() { - quote_sin <<<"$1" -} -function quoted_sarg() { - echo "'$(quote_sarg "$1")'" -} -function quoted_sargs() { - local a s - for a in "$@"; do - s="${s:+$s }$(quoted_sarg "$a")" - done - rawecho "$s" -} - -function set_array_cmd() { - [ $# -eq 1 ] && set -- "$1" "$1" - local __sac_s __sac_v __sac_f - __sac_s="$1=("; shift - if [ "$1" == "@" ]; then - shift - else - eval "set -- \"\${$1[@]}\"" - fi - __sac_f=1 - for __sac_v in "$@"; do - [ -n "$__sac_f" ] && __sac_f= || __sac_s="$__sac_s " - __sac_s="$__sac_s$(quoted_arg "$__sac_v")" - done - __sac_s="$__sac_s)" - echo "$__sac_s" -} -function set_array() { - eval "$(set_array_cmd "$@")" -} -function array_count() { - eval "echo \${#$1[*]}" -} -function array_isempty() { - [ $(array_count "$1") -eq 0 ] -} -function array_new() { - eval "$1=()" -} -function array_add() { - local __aa_a="$1"; shift - eval "$__aa_a=(\"\${$__aa_a[@]}\" \"\$@\")" -} -function array_ins() { - local __aa_a="$1"; shift - eval "$__aa_a=(\"\$@\" \"\${$__aa_a[@]}\")" -} -function array_del() { - local __ad_v - local -a __ad_vs - eval 'for __ad_v in "${'"$1"'[@]}"; do - if [ "$__ad_v" != '"$(quoted_arg "$2")"' ]; then - array_add __ad_vs "$__ad_v" - fi -done' - array_copy "$1" __ad_vs -} -function array_addu() { - local __as_v - eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then - return 1 - fi -done' - array_add "$1" "$2" - return 0 -} -function array_set() { - array_addu "$@" -} -function array_insu() { - local __as_v - eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then - return 1 - fi -done' - array_ins "$1" "$2" - return 0 -} -function array_fillrange() { - local -a __af_vs - local __af_i="${2:-1}" __af_to="${3:-10}" __af_step="${4:-1}" - while [ "$__af_i" -le "$__af_to" ]; do - __af_vs=("${__af_vs[@]}" "$__af_i") - __af_i=$(($__af_i + $__af_step)) - done - array_copy "$1" __af_vs -} -function array_eq() { - local -a __ae_a1 __ae_a2 - array_copy __ae_a1 "$1" - array_copy __ae_a2 "$2" - [ ${#__ae_a1[*]} -eq ${#__ae_a2[*]} ] || return 1 - local __ae_v __ae_i=0 - for __ae_v in "${__ae_a1[@]}"; do - [ "$__ae_v" == "${__ae_a2[$__ae_i]}" ] || return 1 - __ae_i=$(($__ae_i + 1)) - done - return 0 -} -function array_contains() { - local __ac_v - eval 'for __ac_v in "${'"$1"'[@]}"; do - if [ "$__ac_v" == '"$(quoted_arg "$2")"' ]; then - return 0 - fi -done' - return 1 -} -function array_find() { - local __af_i __af_v - __af_i=0 - eval 'for __af_v in "${'"$1"'[@]}"; do - if [ "$__af_v" == '"$(quoted_arg "$2")"' ]; then - if [ -n "$3" ]; then - echo "${'"$3"'[$__af_i]}" - else - echo "$__af_i" - fi - return 0 - fi - __af_i=$(($__af_i + 1)) -done' - return 1 -} -function array_reverse() { - local -a __ar_vs - local __ar_v - array_copy __ar_vs "$1" - array_new "$1" - for __ar_v in "${__ar_vs[@]}"; do - array_ins "$1" "$__ar_v" - done -} - -function array_replace() { - local __ar_sn="$1"; shift - local __ar_f="$1"; shift - local -a __ar_s __ar_d - local __ar_v - array_copy __ar_s "$__ar_sn" - for __ar_v in "${__ar_s[@]}"; do - if [ "$__ar_v" == "$__ar_f" ]; then - __ar_d=("${__ar_d[@]}" "$@") - else - __ar_d=("${__ar_d[@]}" "$__ar_v") - fi - done - array_copy "$__ar_sn" __ar_d -} -function array_each() { - local __ae_an="$1"; shift - local __ae_f="$1"; shift - local -a __ae_a - local __ae_v - array_copy __ae_a "$__ae_an" - for __ae_v in "${__ae_a[@]}"; do - "$__ae_f" "$__ae_v" "$@" - done -} -function array_map() { - local __am_an="$1"; shift - local __am_f="$1"; shift - local -a __am_a __am_vs - local __am_v - array_copy __am_a "$__am_an" - for __am_v in "${__am_a[@]}"; do - __am_vs=("${__am_vs[@]}" "$("$__am_f" "$__am_v" "$@")") - done - array_copy "$__am_an" __am_vs -} -function first_value() { - eval "rawecho \"\${$1[@]:0:1}\"" -} -function last_value() { - eval "rawecho \"\${$1[@]:\$((-1)):1}\"" -} -function array_copy() { - eval "$1=(\"\${$2[@]}\")" -} -function array_copy_firsts() { - eval "$1=(\"\${${2:-$1}[@]:0:\$((\${#${2:-$1}[@]}-1))}\")" -} -function array_del_last() { - array_copy_firsts "$1" -} -function array_copy_lasts() { - eval "$1=(\"\${${2:-$1}[@]:1}\")" -} -function array_del_first() { - array_copy_lasts "$1" -} -function array_extend() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]}\")" -} -function array_extendu() { - local __ae_v __ae_s=1 - eval 'for __ae_v in "${'"$2"'[@]}"; do - array_addu "$1" "$__ae_v" && __ae_s=0 -done' - return "$__ae_s" -} -function array_extend_firsts() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]:0:\$((\${#$2[@]}-1))}\")" -} -function array_extend_lasts() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]:1}\")" -} -function array_xsplit() { - eval "$1=($(recho_ "$2" | awkrun RS="${3:-:}" ' -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_split() { - eval "$1=($(recho_ "$2" | awkrun RS="${3:-:}" ' -/^$/ { next } -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_from_path() { - array_split "$1" "$2" ":" -} -function array_from_xlines() { - eval "$1=($(recho_ "$2" | _nl2lf | awk ' -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_from_lines() { - eval "$1=($(recho_ "$2" | _nl2lf | awk ' -/^$/ { next } -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_join() { - local __aj_an __aj_l __aj_j __aj_s="${2:-,}" __aj_pf __aj_sf - if [ "$1" == "@" ]; then - __aj_an="\$@" - shift; shift - else - __aj_an="\${$1[@]}" - __aj_pf="$4" - __aj_sf="$5" - fi - eval 'for __aj_l in "'"$__aj_an"'"; do - __aj_j="${__aj_j:+$__aj_j'"$__aj_s"'}$__aj_pf$__aj_l$__aj_sf" -done' - if [ -n "$__aj_j" ]; then - rawecho "$__aj_j" - elif [ "$__aj_an" != "\$@" -a -n "$3" ]; then - rawecho "$3" - fi -} -function array_mapjoin() { - local __amj_src="$1" __amj_func="$2" __amj_sep="$3" - shift; shift; shift - if [ "$__amj_src" == "@" ]; then - local -a __amj_tmpsrc - __amj_tmpsrc=("$@") - __amj_src=__amj_tmpsrc - set -- - fi - local -a __amj_tmp - array_copy __amj_tmp "$__amj_src" - array_map __amj_tmp "$__amj_func" - array_join __amj_tmp "$__amj_sep" "$@" -} -function array_to_lines() { - array_join "$1" " -" "$2" "$3" "$4" -} -function array_to_path() { - array_join "$1" ":" "$2" "$3" "$4" -} -function array_fix_paths() { - local __afp_an="$1" __afp_s="${2:-:}" - local -a __afp_vs - local __afp_v - array_copy __afp_vs "$__afp_an" - array_new "$__afp_an" - for __afp_v in "${__afp_vs[@]}"; do - array_split __afp_v "$__afp_v" "$__afp_s" - array_extend "$__afp_an" __afp_v - done -} - - -function get_date_rfc822() { - LC_TIME=C date +"%a, %d %b %Y %H:%M:%S %Z" -} -function get_date_fr() { - LC_TIME=C date +"%d/%m/%Y" -} -function get_time_fr() { - LC_TIME=C date +"%Hh%M" -} -function parse_date() { - local value="$1" type="${2:-date}" - local now="$(awk 'BEGIN { print mktime(strftime("%Y %m %d 00 00 00 +0400")) }')" - case "$value" in - +*) - value="$(($now + ${value#+} * 86400))" - ;; - *) - value="$(<<<"$value" awk -F/ '{ - nd = strftime("%d"); nm = strftime("%m"); ny = strftime("%Y") - d = $1 + 0; if (d < 1) d = nd; - m = $2 + 0; if (m < 1) m = nm; - if ($3 == "") y = ny; - else { y = $3 + 0; if (y < 100) y = y + 2000; } - print mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d)); - }')" - esac - case "$type" in - d|date) awk '{ print strftime("%d/%m/%Y", $0 + 0) }' <<<"$value";; - l|ldap) awk '{ print strftime("%Y%m%d%H%M%S+0400", $0 + 0) }' <<<"$value";; - m|mysql) awk '{ print strftime("%Y-%m-%d", $0 + 0) }' <<<"$value";; - *) - rawecho "$value" - ;; - esac -} - - -function udelpath() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; ${2:-PATH}"'="${'"${2:-PATH}"'#$1:}"; '"${2:-PATH}"'="${'"${2:-PATH}"'%:$1}"; '"${2:-PATH}"'="${'"${2:-PATH}"'//:$_qdir:/:}"; [ "$'"${2:-PATH}"'" == "$1" ] && '"${2:-PATH}"'=' -} -function uaddpath() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="${'"${2:-PATH}"':+$'"${2:-PATH}"':}$1"' -} -function uinspathm() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="$1${'"${2:-PATH}"':+:$'"${2:-PATH}"'}"' -} -function uinspath() { - udelpath "$@" - uinspathm "$@" -} - -function withpath() { - [ "${1#./}" != "$1" -o "${1#../}" != "$1" -o "${1#/}" != "$1" ] -} -function withext() { - local basename="$(basename -- "$1")" - [ "${basename%.*}" != "$basename" ] -} -function normpath() { - local -a parts - local part ap - array_split parts "$1" / - if [ "${1#/}" != "$1" ]; then - ap=/ - elif [ -n "$2" ]; then - ap="$2" - else - ap="$(pwd)" - fi - for part in "${parts[@]}"; do - if [ "$part" == "." ]; then - continue - elif [ "$part" == ".." ]; then - ap="${ap%/*}" - [ -n "$ap" ] || ap=/ - else - [ "$ap" != "/" ] && ap="$ap/" - ap="$ap$part" - fi - done - rawecho "$ap" -} -function abspath() { - local ap="$1" - if [ "${ap#/}" != "$ap" ]; then - __normpath "$ap" && return - else - local cwd - if [ -n "$2" ]; then - cwd="$(abspath "$2")" - else - cwd="$(pwd)" - fi - ap="$cwd/$ap" - __normpath "$ap" && return - fi - normpath "$ap" -} -function __normpath() { - if [ -d "$1" ]; then - if [ -x "$1" ]; then - (cd "$1"; pwd) - return 0 - fi - elif [ -f "$1" ]; then - local dn="$(dirname -- "$1")" bn="$(basename -- "$1")" - if [ -x "$dn" ]; then - (cd "$dn"; echo "$(pwd)/$bn") - return 0 - fi - fi - return 1 -} -function parentdirs() { - array_new "$1" - local __pd_d="$(abspath "$2")" - if [[ "$3" == r* ]]; then - while [ "$__pd_d" != "/" ]; do - array_ins "$1" "$__pd_d" - __pd_d="$(dirname "$__pd_d")" - done - else - while [ "$__pd_d" != "/" ]; do - array_add "$1" "$__pd_d" - __pd_d="$(dirname "$__pd_d")" - done - fi -} -function ppath() { - local path="$1" cwd="$2" - - path="$(abspath "$path")" # essayer de normaliser le chemin - [ -n "$cwd" ] || cwd="$(pwd)" - - [ "$path" = "$cwd" ] && path="." - [ "$cwd" != "/" -a "$cwd" != "$HOME" ] && path="${path/#$cwd\//}" - path="${path/#$HOME/~}" - - rawecho "$path" -} -function relpath() { - local p="$(abspath "$1" "$3")" cwd="$2" - if [ -z "$cwd" ]; then - cwd="$(pwd)" - else - cwd="$(abspath "$cwd" "$3")" - fi - if [ "$p" == "$cwd" ]; then - echo "" - elif [ "${p#$cwd/}" != "$p" ]; then - rawecho "${p#$cwd/}" - else - local rp - while [ -n "$cwd" -a "${p#$cwd/}" == "$p" ]; do - rp="${rp:+$rp/}.." - cwd="${cwd%/*}" - done - rp="$rp/${p#$cwd/}" - echo "${rp%//}" - fi -} -function relpathx() { - local p="$(relpath "$@")" - if [ -z "$p" ]; then - echo . - elif [ "${p#../}" != "$p" -o "${p#./}" != "$p" ]; then - echo "$p" - else - echo "./$p" - fi -} -function withinpath() { - local b="$1" p="$2" strict="${3:-N}" - b="$(abspath "$b")" - p="$(abspath "$p")" - if is_yes "$strict"; then - [ "${p#$b/}" != "$p" ] - else - [ "$p" == "$b" -o "${p#$b/}" != "$p" ] - fi -} -function safe_abspath() { - local p="$1" ba="$2" br="$3" - if [ -n "$ba" ]; then - ba="$(abspath "$ba")" - else - ba="$(pwd)" - fi - [ -n "$br" ] || br="$ba" - br="$(abspath "$br" "$ba")" - p="$(abspath "$p" "$ba")" - if [ "$p" == "$br" -o "${p#$br/}" != "$p" ]; then - echo "$p" - else - return 1 - fi -} -function safe_relpath() { - local p - if p="$(safe_abspath "$1" "$2" "$3")"; then - relpath "$p" "$2" "$(pwd)" - else - return 1 - fi -} -function splitwcs() { - local __sw_p="$1" - local __sw_dd="${2:-basedir}" __sw_df="${3:-filespec}" __sw_part __sw_d __sw_f - local -a __sw_parts - array_split __sw_parts "$__sw_p" "/" - for __sw_part in "${__sw_parts[@]}"; do - if [[ "$__sw_part" == *\** ]] || [[ "$__sw_part" == *\?* ]] || [ -n "$__sw_f" ]; then - __sw_f="${__sw_f:+$__sw_f/}$__sw_part" - else - __sw_d="${__sw_d:+$__sw_d/}$__sw_part" - fi - done - [ "${__sw_p#/}" != "$__sw_p" ] && __sw_d="/$__sw_d" - set_var "$__sw_dd" "$__sw_d" - set_var "$__sw_df" "$__sw_f" -} -function deref() { - local OENC="$UTF8" - - local max_deref=50 - local file="$1" - local basedir link - while [ -L "$file" ]; do - basedir="$(dirname "$file")" - link="$(readlink "$file")" - if first_char_is "$link" "/"; then - file="$link" - else - file="$basedir/$link" - fi - - max_deref=$(($max_deref - 1)) - [ $max_deref -eq 0 ] && die "Plus de 50 indirection. Le lien $file est-il récursif?" - done - abspath "$file" -} -function readlinka() { - if [ -L "$1" ]; then - local linkdir="$(dirname -- "$1")" - abspath "$(readlink "$1")" "$linkdir" - else - abspath "$1" - fi -} -function readlinkm() { - readlink -m "$1" -} -function path_if_test() { - local op="$1"; shift - local file="$1"; shift - local rel="$1" reldir=; shift - if beginswith "$rel" relative; then - reldir="${rel#relative}" - if beginswith "$reldir" :; then - reldir="${reldir#:}" - if [ -n "$reldir" ]; then - reldir="${reldir}/" - fi - else - reldir= - fi - else - rel= - fi - - while [ -n "$1" ]; do - local basedir="$1" - if [ $op "$basedir/$file" ]; then - if [ -n "$rel" ]; then - rawecho "$reldir$file" - else - rawecho "$basedir/$file" - fi - break - fi - shift - done -} -function update_link() { - [ -L "$2" ] || return 1 - local dest link="$2" - local linkdir="$(dirname "$link")" - local ldest="$(readlink "$link")" - if [ "${ldest#/}" != "$ldest" ]; then - dest="$(abspath "$1")" - else - dest="$(relpath "$1" "$linkdir")" - fi - if [ "$dest" == "$ldest" ]; then - : # pas besoin de mettre à jour - elif [ -d "$link" ]; then - rm -f "$link" && ln -s "$dest" "$link" - else - ln -sf "$dest" "$link" - fi -} -function update_links() { - [ -n "$1" ] || return 1 - local dest="$1"; shift - local r=0 link - for link in "$@"; do - update_link "$dest" "$link" || r=$? - done - return $r -} -function move_link() { - [ -n "$1" -a -n "$2" ] || return 1 - local link="$1" dest="$2" - [ -d "$dest" ] && dest="$dest/$(basename -- "$link")" - dest="$(abspath "$dest")" - if [ -L "$link" ]; then - link="$(abspath "$link")" - [ "$dest" == "$link" ] && return 0 - ldest="$(readlinka "$link")" - mv "$link" "$dest" || return 1 - update_link "$ldest" "$dest" - else - [ "$dest" == "$link" ] && return 0 - mv "$link" "$dest" - fi -} -function array_find_links() { - local -a __afl_links __afl_result - local __afl_dir="${3:-.}" - local __afl_dest __afl_destname __afl_link __afl_linkdir __afl_ldest - __afl_dest="$(abspath "$2")" - __afl_destname="${__afl_dest##*/}" - array_from_lines __afl_links "$(find "$__afl_dir" -type l)" - for __afl_link in "${__afl_links[@]}"; do - __afl_ldest="$(readlink "$__afl_link")" - if [ "$__afl_ldest" != "$__afl_destname" ]; then - [[ "$__afl_ldest" == */"$__afl_destname" ]] || continue - fi - __afl_link="$(abspath "$__afl_link" "$__afl_dir")" - __afl_linkdir="$(dirname -- "$__afl_link")" - __afl_ldest="$(abspath "$__afl_ldest" "$__afl_linkdir")" - if [ "$__afl_ldest" == "$__afl_dest" ]; then - array_add __afl_result "$__afl_link" - fi - done - array_copy "$1" __afl_result -} -function list_links() { - local -a links - array_find_links links "$@" - array_to_lines links -} -function move_file() { - [ -n "$1" -a -n "$2" ] || return 1 - local src="$1" dest="$2" link - shift; shift - [ -d "$dest" ] && dest="$dest/$(basename -- "$src")" - move_link "$src" "$dest" || return 1 - update_links "$dest" "$@" -} - -function get_nblines() { - [ -f "$1" ] && sed -ne '$=' "$1" || echo 0 -} -function mktempf() { - mktemp "${1:-"$TMPDIR/tmp.XXXXXX"}" -} -function mktempd() { - mktemp -d "${1:-"$TMPDIR/tmp.XXXXXX"}" -} -function mkdirof() { - mkdir -p "$(dirname -- "$1")" -} -function cp_a() { - /bin/cp -a "$@" -} -function cp_R() { - /bin/cp -pR "$@" -} -function quietgrep() { - grep -q "$@" 2>/dev/null -} -function quietdiff() { - diff -q "$@" >&/dev/null -} -function testsame() { - quietdiff "$@" -} -function testdiff() { - ! quietdiff "$@" -} -function testupdated() { - if [ -f "$2" ]; then - testdiff "$1" "$2" - else - return 0 - fi -} -function testnewer() { - test ! -e "$2" -o "$1" -nt "$2" -} -function ps_all() { - ps -axww -} -function progexists() { - test -n "$1" -a -x "$(which "$1" 2>/dev/null)" -} -function has_python() { - progexists python -} -function has_gawk() { - progexists gawk -} -function is_root() { - test `id -u` -eq 0 -} -function source_ifexists() { - if [ -f "$1" ]; then source "$1" || die; fi -} -function little_sleep { - LC_NUMERIC=C sleep 0.1 -} -function random_sleep { - sleep $(($RANDOM % ${1:-1800})) -} -function is_running() { - kill -0 "$1" >&/dev/null -} -function sedi() { - sed -i "$@" -} -function csort() { - LANG=C sort "$@" -} -function lsort() { sort "$@"; } -function cgrep() { - LANG=C grep "$@" -} -function lgrep() { grep "$@"; } -function csed() { - LANG=C sed "$@" -} -function lsed() { sed "$@"; } -function cawk() { - LANG=C awk "$@" -} -function lawk() { awk "$@"; } -function cdiff() { - LANG=C diff "$@" -} -function ldiff() { diff "$@"; } - - -function fix_mode() { - local file="$1" - [ -f "$file" ] || touch "$file" || return 1 - if [ ! -w "$file" ]; then - local mode="$(stat -c %a "$file")" - chmod ${mode:0:${#mode}-3}6${mode:${#mode}-2:2} "$file" - echo "$mode" - fi -} -function unfix_mode() { - [ -n "$2" ] && chmod "$2" "$1" -} -function get_mode() { - [ -f "$1" ] || touch "$1" || return 1 - stat -c %a "$1" -} -function rm_maybe() { - local parse_opts=1 arg rm - for arg in "$@"; do - if [ -n "$parse_opts" ]; then - if [ "$arg" == "--" ]; then - parse_opts= - elif [[ "$arg" == "-*" ]]; then - continue - elif [ -n "$arg" ]; then - rm=1 - break - fi - elif [ -n "$arg" ]; then - rm=1 - break - fi - done - [ -n "$rm" ] && /bin/rm "$@" -} -__CPDIR_RSYNC_SLOW=1 # synchro potentiellement plus lente, mais plus fidèle (option -c) -__CPDIR_RSYNC_ARGS=(-q) -function cpdir() { - - if progexists rsync; then - [ -d "$2" ] || mkdir -p "$2" || return 1 - if [ -d "$1" ]; then - rsync -a ${__CPDIR_RSYNC_SLOW:+-c} "${__CPDIR_RSYNC_ARGS[@]}" "$1/" "$2/" - else - rsync -a ${__CPDIR_RSYNC_SLOW:+-c} "${__CPDIR_RSYNC_ARGS[@]}" "$1" "$2/" - fi - else - __cpdir "$@" - fi -} -function __cpdir() { - local src="$1" dest="$2" method="${3:-cp_a}" - - if [ -d "$src" ]; then - [ -d "$dest" ] || mkdir -p "$dest" || return 1 - - local prevdir="$(pwd)" - - dest="$(abspath "$dest")" - cd "$src" - if [ -n "$(/bin/ls -a1)" ]; then - [ -n "$(/bin/ls -1)" ] && "$method" * "$dest" - local i - for i in .*; do - [ "$i" == "." -o "$i" == ".." ] && continue - "$method" "$i" "$dest" - done - fi - cd "$prevdir" - else - if [ -f "$dest" ]; then - "$method" "$src" "$dest" - elif [ -d "$dest" ]; then - "$method" "$src" "$dest" - else - mkdir -p "$dest" - "$method" "$src" "$dest" - fi - fi -} -__CPNOVCS_RSYNC_SLOW=1 # synchro potentiellement plus lente, mais plus fidèle (option -c) -__CPNOVCS_RSYNC_ARGS=(-q) -function cpnovcs() { - local src="$1" destdir="$2" - [ -d "$destdir" ] || mkdir -p "$destdir" || return 1 - if progexists rsync; then - local gitexclude=/.git/ - if [ "${src%/}" == "$src" ]; then - gitexclude="/$(basename -- "$src")$gitexclude" - fi - rsync -a ${__CPNOVCS_RSYNC_SLOW:+-c} --exclude CVS/ --exclude .svn/ --exclude "$gitexclude" "${__CPNOVCS_RSYNC_ARGS[@]}" "$src" "$destdir/" - elif [ "${src%/}" != "$src" ]; then - __cpdir "$src" "$destdir" - else - local srcname="$(basename -- "$src")" - mkdir -p "$destdir/$srcname" - __cpdir "$src" "$destdir/$srcname" - fi -} -function cpdirnovcs() { - if [ -d "$1" ]; then - cpnovcs "$1/" "$2" - else - cpnovcs "$1" "$2" - fi -} -function doinplace() { - if [ -n "$1" -a "$1" != "-" ]; then - local __dip_file="$1"; shift - autoclean "$__dip_file.tmp.$$" - "$@" <"$__dip_file" >"$__dip_file.tmp.$$" - local s=$? - [ "$s" == 0 ] && /bin/cat "$__dip_file.tmp.$$" >"$__dip_file" - /bin/rm -f "$__dip_file.tmp.$$" - return $s - else - shift - "$@" - fi -} -function doinplacef() { - if [ -n "$1" -a "$1" != "-" ]; then - local __dip_file="$1"; shift - autoclean "$__dip_file.tmp.$$" - "$@" <"$__dip_file" >"$__dip_file.tmp.$$" - local s=$? - /bin/cat "$__dip_file.tmp.$$" >"$__dip_file" - /bin/rm -f "$__dip_file.tmp.$$" - return $s - else - shift - "$@" - fi -} -function stripnl() { - tr -d '\r\n' -} -function _nl2lf() { - awk 'BEGIN {RS="\r|\r\n|\n"} {print}' -} -function nl2lf() { - doinplace "$1" _nl2lf -} -function _nl2crlf() { - awk 'BEGIN {RS="\r|\r\n|\n"} {print $0 "\r"}' -} -function nl2crlf() { - doinplace "$1" _nl2crlf -} -function _nl2cr() { - awk 'BEGIN {RS="\r|\r\n|\n"; ORS=""} {print $0 "\r"}' -} -function nl2cr() { - doinplace "$1" _nl2cr -} -function _latin1compat() { - LANG=fr_FR.UTF-8 sed $' -s/[‘’]/\x27/g -s/[«»“”]/"/g -s/[\xC2\xA0\xE2\x80\x87\xE2\x80\xAF\xE2\x81\xA0]/ /g -' -} -function _noaccents() { - LANG=fr_FR.UTF-8 sed ' -s/[à]/a/g -s/[éèêë]/e/g -s/[ïî]/i/g -s/[ôö]/o/g -s/[üû]/u/g -s/[ç]/c/g -s/[À]/A/g -s/[ÉÈÊË]/E/g -s/[ÏÎ]/I/g -s/[ÔÖ]/O/g -s/[ÜÛ]/U/g -s/[Ç]/C/g -' -} -function list_all() { - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ "$f" == "." -o "$f" == ".." ] && continue - rawecho "$f" - done - cd "$curdir" -} -function __la_cmd() { - [ $# -gt 0 ] || set '*' - local arg - local cmd="/bin/ls -1d" - for arg in "$@"; do - arg="$(_rval "$arg")" - cmd="$cmd $arg" - done - cmd="$cmd 2>/dev/null" - echo "$cmd" -} -function list_files() { - local f - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ -f "$f" ] && rawecho "$f" - done - cd "$curdir" -} -function list_dirs() { - local f - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ "$f" == "." -o "$f" == ".." ] && continue - [ -d "$f" ] && rawecho "$f" - done - cd "$curdir" -} -function __array_ls() { - local __al_l="list_${1:-all}"; shift - local __al_an="$1"; shift - local __al_d="${1:-.}"; shift - local -a __al_fs - array_from_lines __al_fs "$("$__al_l" "$__al_d" "$@")" - local __al_f - array_new "$__al_an" - for __al_f in "${__al_fs[@]}"; do - array_add "$__al_an" "$__al_d/$__al_f" - done -} -function array_lsall() { - __array_ls all "$@" -} -function array_lsdirs() { - __array_ls dirs "$@" -} -function array_lsfiles() { - __array_ls files "$@" -} -function filter_empty() { - sed '/^$/d' -} -function filter_vcspath() { - sed ' -/^.git$/d -/^.git\//d -/\/.git$/d -/\/.git\//d -/^.svn$/d -/^.svn\//d -/\/.svn$/d -/\/.svn\//d -' -} -function merge_contlines() { - awk 'substr($0, length($0)) == "\\" { - while (getline nextline) { - $0 = substr($0, 1, length($0) - 1) nextline - if (substr($0, length($0)) != "\\") break - } - print - next -} -{print}' -} -function filter_comment() { - local -a merge - [ "$1" == -m ] && merge=(merge_contlines) || merge=(cat) - awk ' - /^[ \t]*#/ { next } - /^[ \t]*$/ { next } - { print }' | "${merge[@]}" -} -function filter_conf() { - local -a merge - [ "$1" == -m ] && merge=(merge_contlines) || merge=(cat) - grep -v '^#' | grep -v '^$' | "${merge[@]}" -} -function is_archive() { - local name="${1%.zip}" - name="${name%.tgz}" - name="${name%.tbz2}" - name="${name%.tar.gz}" - name="${name%.tar.bz2}" - name="${name%.tar}" - name="${name%.jar}" - name="${name%.war}" - name="${name%.ear}" - [ "$name" != "$1" ] -} -function extract_archive() { - local arch="$1" destdir="${2:-.}" - shift; shift - if endswith "$arch" .zip; then - unzip -q -d "$destdir" "$arch" "$@" || return - elif endswith "$arch" .tgz || endswith "$arch" .tar.gz; then - tar xzf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .tbz2 || endswith "$arch" .tar.bz2; then - tar xjf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .tar; then - tar xf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .jar || endswith "$arch" .war || endswith "$arch" .ear; then - ( - arch="$(abspath "$arch")" - cd "$destdir" - jar xf "$arch" "$@" - ) || return - else - return 1 - fi -} -function get_archive_basename() { - local basename="$(basename -- "$1")" - basename="${basename%.zip}" - basename="${basename%.tgz}" - basename="${basename%.tbz2}" - basename="${basename%.gz}" - basename="${basename%.bz2}" - basename="${basename%.tar}" - basename="${basename%.jar}" - basename="${basename%.war}" - basename="${basename%.ear}" - echo "$basename" -} -function get_archive_appname() { - local appname="$(basename -- "$1")" - appname="${appname%.zip}" - appname="${appname%.tgz}" - appname="${appname%.tbz2}" - appname="${appname%.gz}" - appname="${appname%.bz2}" - appname="${appname%.tar}" - appname="${appname%.jar}" - appname="${appname%.war}" - appname="${appname%.ear}" - echo "$appname" | awk '{ - if (match($0, /[-_.]([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/)) { - print substr($0, 1, RSTART - 1) - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/)) { - print substr($0, 1, RSTART - 1) - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print substr($0, 1, RSTART - 1) - } else { - print $0 - } -}' -} -function get_archive_versionsuffix() { - local basename="$(get_archive_basename "$1")" - echo "$basename" | awk '{ - if (match($0, /([-_.][0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print vs["1"] - } -}' -} -function get_archive_version() { - local basename="$(get_archive_basename "$1")" - echo "$basename" | awk '{ - if (match($0, /[-_.]([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print vs["1"] - } -}' -} -function __dump_usernames() { - = 500 && $6 ~ /^\/home\// { print $1 }' -} -function dump_usernames() { - array_from_lines "${1:-usernames}" "$(__dump_usernames)" -} -function __resolv_ips() { - LANG=C host "$1" 2>/dev/null | awk '/address / { gsub(/^.*address /, ""); print }' -} -function resolv_ips() { - array_from_lines "${1:-ips}" "$(__resolv_ips "$2")" -} -function __resolv_hosts() { - LANG=C host "$1" 2>/dev/null | awk '/domain name pointer / { gsub(/^.*domain name pointer /, ""); gsub(/\.$/, ""); print }' -} -function resolv_hosts() { - array_from_lines "${1:-hosts}" "$(__resolv_hosts "$2")" -} -function runscript_as() { - local OENC="$UTF8" - local user="${1:-root}"; shift - local exec_maybe= - if [ "$1" = "exec" ]; then - exec_maybe=exec - shift - fi - - local cmd - cmd="\ -__estack=$(quoted_arg "$__estack") -__tlevel=$(quoted_args "$__tlevel") -export __estack __tlevel -exec ${BASH:-/bin/sh} $(quoted_args "$@")" - - if is_yes "$UTOOLS_USES_SU" || ! progexists sudo; then - eecho "Entrez le mot de passe de root" - $exec_maybe su "$user" -c "$cmd" - else - if [ "$user" == "root" ]; then - $exec_maybe sudo -p "Entrez le mot de passe de %u: " "${BASH:-/bin/sh}" -c "$cmd" - else - $exec_maybe sudo -p "Entrez le mot de passe de %u: " su "$user" -c "$cmd" - fi - fi -} -function runscript_as_root() { - if is_root; then - local exec_maybe= - if [ "$1" = "exec" ]; then - exec_maybe=exec - shift - fi - $exec_maybe "${BASH:-/bin/sh}" "$@" - else - runscript_as root "$@" - fi -} -function run_as() { - local user="${1:-root}"; shift - local exec_maybe=exec - if [ "$1" = "--noexec" ]; then - exec_maybe= - shift - fi - - runscript_as "$user" $exec_maybe "$0" "$@" -} -function run_as_root() { - is_root || run_as root "$@" -} -function check_user() { - local user - for user in "$@"; do - [ "$USER" == "$user" ] && return 0 - done - return 1 -} -function ensure_user() { - local -a users - while [ $# -gt 0 -a "$1" != "--" ]; do - array_add users "$1" - shift - done - [ "$1" == "--" ] && shift - - if ! check_user "${users[@]}"; then - if [ ${#users[*]} -gt 1 ]; then - ewarn "Cette commande doit être lancée avec l'un des users ${users[*]}" - else - ewarn "Cette commande doit être lancée avec le user ${users[0]}" - fi - if ask_yesno "Voulez-vous tenter de relancer la commande avec le bon user?" O; then - estep "Lancement du script avec le user ${users[0]}" - run_as "${users[0]}" "$@" - return 1 - elif is_root; then - return 11 - else - return 10 - fi - fi - return 0 -} -function check_hostname() { - local userhost user host path - for userhost in "$@"; do - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - [ "$MYHOSTNAME" == "${host%%.*}" ] && return 0 - done - return 1 -} -function check_userhostname() { - local userhost path user host - for userhost in "$@"; do - if check_hostname "$userhost"; then - [[ "$userhost" == *@* ]] || return 0 - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - check_user "$user" && return 0 - fi - done - return 1 -} -UTOOLS_ENSURE_HOSTNAME_SSH_OPTS=() -function ensure_hostname() { - local -a userhosts - while [ $# -gt 0 -a "$1" != "--" ]; do - array_add userhosts "$1" - shift - done - [ "$1" == "--" ] && shift - - local userhost user host path - if ! check_hostname "${userhosts[@]}"; then - if [ ${#userhosts[*]} -gt 1 ]; then - ewarn "Cette commande n'est valide que sur l'un des hôtes ${userhosts[*]}" - else - ewarn "Cette commande n'est valide que sur l'hôte ${userhosts[0]}" - fi - - enote "Vous pouvez tenter de relancer le script sur ${userhosts[0]}, mais cela requière que ce script ET les données dont il a besoin soient installés dans la même version et dans le même répertoire sur l'hôte distant" - if ask_yesno "Voulez-vous tenter de relancer le script sur l'hôte distant?" N; then - splitfsep "${userhosts[0]}" : userhost path - splituserhost "$userhost" user host - [ -n "$user" ] || user=root - - estep "Lancement de la commande sur l'hôte distant $user@$host" - local cmd - [ -n "$path" ] && cmd="$(quoted_args cd "$path"); " - cmd="$cmd$(quoted_args "$script" "$@")" - ssh -qt "${UTOOLS_ENSURE_HOSTNAME_SSH_OPTS[@]}" "$user@$host" "$cmd" - [ $? -eq 255 ] && return 12 - return 1 - else - return 11 - fi - fi - local userhost user host - for userhost in "${userhosts[@]}"; do - [[ "$userhost" == *@* ]] || continue - if check_hostname "$userhost"; then - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - [ -n "$path" ] && cd "$path" - ensure_user "$user" -- "$@" - return $? - fi - done - return 0 -} - -__AWKDEF_FUNCTIONS=' -function quote_html(s) { - gsub(/&/, "\\&", s) - gsub(/"/, "\\"", s) - gsub(/>/, "\\>", s) - gsub(/", s) - gsub(/"/, "\"", s) - gsub(/&/, "\\&", s) - return s -} -function quote_value(s) {'" - gsub(/'/, \"'\\\\''\", s) - return \"'\" s \"'\" -"'} -function quoted_values( i, line) { - line = "" - for (i = 1; i <= NF; i++) { - if (i > 1) line = line " " - line = line quote_value($i) - } - return line -} -function quote_subrepl(s) { - gsub(/\\/, "\\\\", s) - gsub(/&/, "\\\\&", s) - return s -} -function quote_grep(s) { - gsub(/[[\\.^$*]/, "\\\\&", s) - return s -} -function quote_egrep(s) { - gsub(/[[\\.^$*+?()|{]/, "\\\\&", s) - return s -} -function quote_sql(s) {'" - gsub(/'/, \"''\", s) - return \"'\" s \"'\" -"'} -function unquote_mysqlcsv(s) { - gsub(/\\n/, "\n", s) - gsub(/\\t/, "\t", s) - gsub(/\\0/, "\0", s) - gsub(/\\\\/, "\\", s) - return s -} -function array_new(dest) { - dest[0] = 0 # forcer awk à considérer dest comme un tableau - delete dest -} -function array_newsize(dest, size, i) { - dest[0] = 0 # forcer awk à considérer dest comme un tableau - delete dest - size = int(size) - for (i = 1; i <= size; i++) { - dest[i] = "" - } -} -function array_len(values, count, i) { - count = 0 - for (i in values) { - count++ - } - return count -} -function mkindices(values, indices, i, j) { - array_new(indices) - j = 1 - for (i in values) { - indices[j++] = int(i) - } - return asort(indices) -} -function array_copy(dest, src, count, indices, i) { - array_new(dest) - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - dest[indices[i]] = src[indices[i]] - } -} -function array_getlastindex(src, count, indices) { - count = mkindices(src, indices) - if (count == 0) return 0 - return indices[count] -} -function array_add(dest, value, lastindex) { - lastindex = array_getlastindex(dest) - dest[lastindex + 1] = value -} -function array_deli(dest, i, l) { - i = int(i) - if (i == 0) return - l = array_len(dest) - while (i < l) { - dest[i] = dest[i + 1] - i++ - } - delete dest[l] -} -function array_del(dest, value, ignoreCase, i) { - do { - i = key_index(value, dest, ignoreCase) - if (i != 0) array_deli(dest, i) - } while (i != 0) -} -function array_extend(dest, src, count, lastindex, indices, i) { - lastindex = array_getlastindex(dest) - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - dest[lastindex + i] = src[indices[i]] - } -} -function array_fill(dest, i) { - array_new(dest) - for (i = 1; i <= NF; i++) { - dest[i] = $i - } -} -function array_getline(src, count, indices, i, j) { - $0 = "" - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - j = indices[i] - $j = src[j] - } -} -function array_appendline(src, count, indices, i, nf, j) { - count = mkindices(src, indices) - nf = NF - for (i = 1; i <= count; i++) { - j = nf + indices[i] - $j = src[indices[i]] - } -} -function in_array(value, values, ignoreCase, i) { - if (ignoreCase) { - value = tolower(value) - for (i in values) { - if (tolower(values[i]) == value) return 1 - } - } else { - for (i in values) { - if (values[i] == value) return 1 - } - } - return 0 -} -function key_index(value, values, ignoreCase, i) { - if (ignoreCase) { - value = tolower(value) - for (i in values) { - if (tolower(values[i]) == value) return int(i) - } - } else { - for (i in values) { - if (values[i] == value) return int(i) - } - } - return 0 -} -function array2s(values, prefix, sep, suffix, noindices, first, i, s) { - if (!prefix) prefix = "[" - if (!sep) sep = ", " - if (!suffix) suffix = "]" - s = prefix - first = 1 - for (i in values) { - if (first) first = 0 - else s = s sep - if (!noindices) s = s "[" i "]=" - s = s values[i] - } - s = s suffix - return s -} -function array2so(values, prefix, sep, suffix, noindices, count, indices, i, s) { - if (!prefix) prefix = "[" - if (!sep) sep = ", " - if (!suffix) suffix = "]" - s = prefix - count = mkindices(values, indices) - for (i = 1; i <= count; i++) { - if (i > 1) s = s sep - if (!noindices) s = s "[" indices[i] "]=" - s = s values[indices[i]] - } - s = s suffix - return s -} -function array_join(values, sep, prefix, suffix, count, indices, i, s) { - s = prefix - count = mkindices(values, indices) - for (i = 1; i <= count; i++) { - if (i > 1) s = s sep - s = s values[indices[i]] - } - s = s suffix - return s -} -function printto(s, output) { - if (output == "") { - print s - } else if (output ~ /^>>/) { - sub(/^>>/, "", output) - print s >>output - } else if (output ~ /^>/) { - sub(/^>/, "", output) - print s >output - } else { - print s >output - } -} -function find_line(input, field, value, orig, line) { - orig = $0 - line = "" - while ((getline 0) { - if ($field == value) { - line = $0 - break - } - } - close(input) - $0 = orig - return line -} -function merge_line(input, field, key, line) { - line = find_line(input, field, $key) - if (line != "") $0 = $0 FS line -} -function __csv_parse_quoted(line, destl, colsep, qchar, echar, pos, tmpl, nextc, resl) { - line = substr(line, 2) - resl = "" - while (1) { - pos = index(line, qchar) - if (pos == 0) { - resl = resl line - destl[0] = "" - destl[1] = 0 - return resl - } - if (echar != "" && pos > 1) { - prevc = substr(line, pos - 1, 1) - quotec = substr(line, pos, 1) - nextc = substr(line, pos + 1, 1) - if (prevc == echar) { - tmpl = substr(line, 1, pos - 2) - resl = resl tmpl quotec - line = substr(line, pos + 1) - continue - } - tmpl = substr(line, 1, pos - 1) - if (nextc == colsep || nextc == "") { - resl = resl tmpl - destl[0] = substr(line, pos + 2) - destl[1] = nextc == colsep - return resl - } else { - resl = resl tmpl quotec - line = substr(line, pos + 1) - } - } else { - tmpl = substr(line, 1, pos - 1) - quotec = substr(line, pos, 1) - nextc = substr(line, pos + 1, 1) - if (nextc == colsep || nextc == "") { - resl = resl tmpl - destl[0] = substr(line, pos + 2) - destl[1] = nextc == colsep - return resl - } else if (nextc == qchar) { - resl = resl tmpl quotec - line = substr(line, pos + 2) - } else { - resl = resl tmpl quotec - line = substr(line, pos + 1) - } - } - } -} -function __csv_parse_unquoted(line, destl, colsep, qchar, echar, pos) { - pos = index(line, colsep) - if (pos == 0) { - destl[0] = "" - destl[1] = 0 - return line - } else { - destl[0] = substr(line, pos + 1) - destl[1] = 1 - return substr(line, 1, pos - 1) - } -} -function __array_parsecsv(fields, line, nbfields, colsep, qchar, echar, shouldparse, destl, i) { - array_new(fields) - array_new(destl) - i = 1 - shouldparse = 0 - while (shouldparse || line != "") { - if (index(line, qchar) == 1) { - value = __csv_parse_quoted(line, destl, colsep, qchar, echar) - line = destl[0] - shouldparse = destl[1] - } else { - value = __csv_parse_unquoted(line, destl, colsep, qchar, echar) - line = destl[0] - shouldparse = destl[1] - } - fields[i] = value - i = i + 1 - } - if (nbfields) { - nbfields = int(nbfields) - i = array_len(fields) - while (i < nbfields) { - i++ - fields[i] = "" - } - } - return array_len(fields) -} -BEGIN { - DEFAULT_COLSEP = "," - DEFAULT_QCHAR = "\"" - DEFAULT_ECHAR = "" -} -function array_parsecsv2(fields, line, nbfields, colsep, qchar, echar) { - return __array_parsecsv(fields, line, nbfields, colsep, qchar, echar) -} -function array_parsecsv(fields, line, nbfields, colsep, qchar, echar) { - if (colsep == "") colsep = DEFAULT_COLSEP - if (qchar == "") qchar = DEFAULT_QCHAR - if (echar == "") echar = DEFAULT_ECHAR - return __array_parsecsv(fields, line, nbfields, colsep, qchar, echar) -} -function parsecsv(line, fields) { - array_parsecsv(fields, line) - array_getline(fields) - return NF -} -function getlinecsv(file, fields) { - if (file) { - getline 1) line = line colsep - if (qchar != "" && index(value, qchar) != 0) { - if (echar != "") gsub(qchar, quote_subrepl(echar) "&", value); - else gsub(qchar, "&&", value); - } - if (qchar != "" && (index(value, mvsep) != 0 || index(value, colsep) != 0 || index(value, qchar) != 0 || __csv_should_quote(value))) { - line = line qchar value qchar - } else { - line = line value - } - } - return line -} -function array_formatcsv(fields) { - return array_formatcsv2(fields, ",", ";", "\"", "") -} -function array_printcsv(fields, output) { - printto(array_formatcsv(fields), output) -} -function get_formatcsv( fields) { - array_fill(fields) - return array_formatcsv(fields) -} -function formatcsv() { - $0 = get_formatcsv() -} -function printcsv(output, fields) { - array_fill(fields) - array_printcsv(fields, output) -} -function array_findcsv(fields, input, field, value, nbfields, orig, found, i) { - array_new(orig) - array_fill(orig) - array_new(fields) - found = 0 - while ((getline 0) { - array_parsecsv(fields, $0, nbfields) - if (fields[field] == value) { - found = 1 - break - } - } - close(input) - array_getline(orig) - if (!found) { - delete fields - if (nbfields) { - nbfields = int(nbfields) - i = array_len(fields) - while (i < nbfields) { - i++ - fields[i] = "" - } - } - } - return found -} - -function __and(var, x, l_res, l_i) { - l_res=0; - for (l_i=0; l_i < 8; l_i++){ - if (var%2 == 1 && x%2 == 1) l_res=l_res/2 + 128; - else l_res/=2; - var=int(var/2); - x=int(x/2); - } - return l_res; -} -function __lshift(var, x) { - while(x > 0){ - var*=2; - x--; - } - return var; -} -function __rshift(var, x) { - while(x > 0){ - var=int(var/2); - x--; - } - return var; -} -BEGIN { - __BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" -} -function b64decode(src, result, base1, base2, base3, base4) { - result = "" - while (length(src) > 0) { - base1 = substr(src, 1, 1) - base2 = substr(src, 2, 1) - base3 = substr(src, 3, 1); if (base3 == "") base3 = "=" - base4 = substr(src, 4, 1); if (base4 == "") base4 = "=" - byte1 = index(__BASE64, base1) - 1 - if (byte1 < 0) byte1 = 0 - byte2 = index(__BASE64, base2) - 1 - if (byte2 < 0) byte2 = 0 - byte3 = index(__BASE64, base3) - 1 - if (byte3 < 0) byte3 = 0 - byte4 = index(__BASE64, base4) - 1 - if (byte4 < 0) byte4 = 0 - result = result sprintf( "%c", __lshift(__and(byte1, 63), 2) + __rshift(__and(byte2, 48), 4) ) - if (base3 != "=") result = result sprintf( "%c", __lshift(__and(byte2, 15), 4) + __rshift(__and(byte3, 60), 2) ) - if (base4 != "=") result = result sprintf( "%c", __lshift(__and(byte3, 3), 6) + byte4 ) - src = substr(src, 5) - } - return result -} -' -function awkdef() { - - if [ "${1:0:3}" == "-f" ]; then - shift - echo "$__AWKDEF_FUNCTIONS" - fi - if [ $# -gt 0 ]; then - local __ad_arg __ad_vpos __ad_name __ad_value - echo "BEGIN {" - while [ -n "${1:0:1}" ]; do - __ad_arg="${1:0:256}" - local __ad_array= - if [ "${__ad_arg%\[@\]}" != "$__ad_arg" ]; then - __ad_array=1 - __ad_name="${__ad_arg%\[@\]}" - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_value="$__ad_name" - elif [[ "$__ad_arg" == *\[@\]=* ]]; then - __ad_array=1 - __ad_name="${__ad_arg%%\[@\]=*}" - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_vpos=$((${#__ad_name} + 4)) - __ad_value="${1:$__ad_vpos}" - [ ${#__ad_value} -ne 0 ] || __ad_value="$__ad_name" - elif [[ "$__ad_arg" == *=* ]]; then - local __ad_int= __ad_str= - __ad_name="${__ad_arg%%=*}" - __ad_vpos=$((${#__ad_name} + 1)) - if [ "${__ad_name%:int}" != "$__ad_name" ]; then - __ad_int=1 - __ad_name="${__ad_name%:int}" - elif [ "${__ad_name%:str}" != "$__ad_name" ]; then - __ad_str=1 - __ad_name="${__ad_name%:str}" - fi - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_value="${1:$__ad_vpos}" - if [ -n "$__ad_int" ]; then - echo "$__ad_name = int($(quoted_awk "$__ad_value") + 0)" - elif [ -n "$__ad_str" ]; then - echo "$__ad_name = $(quoted_awk "$__ad_value")" - elif [ ${#__ad_value} -lt 256 ] && isnum "$__ad_value"; then - echo "$__ad_name = $__ad_value" - else - echo "$__ad_name = $(quoted_awk "$__ad_value")" - fi - else - break - fi - if [ -n "$__ad_array" ]; then - if [ "${__ad_value:0:2}" == $'<\n' ]; then - local -a __ad_values - array_from_lines __ad_values "${__ad_value:2}" - __ad_value=__ad_values - fi - __ad_value="${__ad_value}[@]" - local __ad_i=1 - echo "$__ad_name[0] = 0; delete $__ad_name" - for __ad_arg in "${!__ad_value}"; do - echo "$__ad_name[$__ad_i]=$(quoted_awk "$__ad_arg")" - __ad_i=$(($__ad_i + 1)) - done - eval "echo \"\${__ad_name}_count = \${#$__ad_value}\"" - fi - shift - done - echo "}" - for __ad_arg in "$@"; do - rawecho "$__ad_arg" - done - fi -} -function lawkrun() { - local -a __ar_defs __ar_args - while [ $# -gt 0 -a "$1" != "--" ]; do - __ar_defs=("${__ar_defs[@]}" "$1") - shift - done - shift - while [ $# -gt 0 ]; do - __ar_args=("${__ar_args[@]}" "$1") - shift - done - local __ar_script="$(awkdef "${__ar_defs[@]}")" - awk "$__ar_script" "${__ar_args[@]}" -} -function cawkrun() { LANG=C lawkrun "$@"; } -function awkrun() { LANG=C lawkrun "$@"; } - -function __lf_get_age() { - local y=$(date "+%Y") - local dy=$(date "+%j"); while [ "${dy#0}" != "$dy" ]; do dy="${dy#0}"; done - [ -n "$dy" ] || dy=0 - local h=$(date "+%H"); while [ "${h#0}" != "$h" ]; do h="${h#0}"; done - [ -n "$h" ] || h=0 - echo $((($y * 365 + $dy) * 24 + $h)) -} -function lf_trylock() { - local eoo lockfile max_hours=4 - while [ -n "$1" ]; do - case "$1" in - -h) shift; max_hours="$1";; - --) shift; eoo=1;; - *) eoo=1;; - esac - [ -n "$eoo" ] && break - shift - done - - lockfile="$1" - [ -n "$lockfile" ] || die "il faut spécifier un fichier pour le verrou" - - local now="$(__lf_get_age)" - if (set -C; echo "$now" >"$lockfile") 2>/dev/null; then - return 0 - fi - local prev diff - if prev="$(<"$lockfile")"; then - diff="$(($now - $prev))" - if [ "$diff" -gt "$max_hours" ]; then - echo stale - else - echo locked - fi - elif [ -f "$lockfile" ]; then - echo retry - fi - return 1 -} -function pidfile_set() { - local eoo pidfile pid=$$ replace= - while [ -n "$1" ]; do - case "$1" in - -p) - shift - pid="$1" - ;; - -r) - replace=1 - ;; - --) - shift - eoo=1 - ;; - *) - eoo=1 - ;; - esac - [ -n "$eoo" ] && break - shift - done - - pidfile="$1" - [ -n "$pidfile" ] || return 10 - - if [ -f "$pidfile" ]; then - local curpid="$(<"$pidfile")" - if is_running "$curpid"; then - return 1 - elif [ -n "$replace" ]; then - /bin/rm -f "$pidfile" || return 10 - else - return 2 - fi - fi - - echo_ "$pid" >"$pidfile" || return 10 - autoclean "$pidfile" - return 0 -} -function pidfile_check() { - local pidfile="$1" - [ -n "$pidfile" ] || return 10 - - if [ -f "$pidfile" ]; then - [ -r "$pidfile" ] || return 10 - local pid="$(<"$pidfile")" - is_running "$pid" && return 0 - fi - return 1 -} -function page_maybe() { - if isatty; then - less -XF "$@" - else - cat - fi -} - - -function utools_local() { - local arg - [ $# -gt 0 ] || set -- opts verbosity interaction - for arg in "$@"; do - case "$arg" in - parse_opts|opts|o|args) echo "local -a args";; - verbosity|v) echo "local __verbosity='$__verbosity'";; - interaction|i) echo "local __interaction='$__interaction'";; - esac - done -} - -function isatty() { - tty -s <&1 -} -function in_isatty() { - tty -s -} -function out_isatty() { - tty -s <&1 -} -function err_isatty() { - tty -s <&2 -} -function die() { [ $# -gt 0 ] && eerror "$@"; exit 1; } -function exit_with { if [ $# -gt 0 ]; then "$@"; fi; exit $?; } -function die_with { [ $# -gt 0 ] && eerror "$1"; shift; [ $# -gt 0 ] && "$@"; exit 1; } -function die_unless() { - local count=$# - if [ $count -eq 0 ]; then - exit 1 - elif [ $count -eq 1 ]; then - "$@" || exit $? - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - : - else - r=$? - eerror "$m" - exit $r - fi - fi -} -function eerror_unless() { - local count=$# - if [ $count -eq 0 ]; then - return 1 - elif [ $count -eq 1 ]; then - "$@" || return $? - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - : - else - r=$? - eerror "$m" - return $r - fi - fi -} -function die_if() { - local count=$# - if [ $count -eq 0 ]; then - : - elif [ $count -eq 1 ]; then - "$@" && exit 1 - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - eerror "$m" - exit 1 - fi - fi -} -function eerror_if() { - local count=$# - if [ $count -eq 0 ]; then - : - elif [ $count -eq 1 ]; then - "$@" && return 1 - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - eerror "$m" - return 1 - fi - fi -} - -TAB=$'\t' -LATIN1=iso-8859-1 -LATIN9=iso-8859-15 -UTF8=utf-8 -OENC="$UTF8" - -if ! progexists iconv; then - function iconv() { cat; } -fi - -function __lang_encoding() { - local lang="$(<<<"$LANG" awk '{ print tolower($0) }')" - case "$lang" in - *@euro) echo "iso-8859-15";; - *.utf-8|*.utf8) echo "utf-8";; - *) echo "iso-8859-1";; - esac -} -function __norm_encoding() { - awk '{ - enc = tolower($0) - gsub(/^latin$/, "latin1", enc) - gsub(/^latin1$/, "iso-8859-1", enc) - gsub(/^latin9$/, "iso-8859-15", enc) - gsub(/[-_]/, "", enc) - if (enc == "iso8859" || enc == "iso88591" || enc == "8859" || enc == "88591") print "iso-8859-1" - else if (enc == "iso885915" || enc == "885915") print "iso-8859-15" - else if (enc == "utf" || enc == "utf8") print "utf-8" - else print $0 - }' <<<"$1" -} -function __init_encoding() { - local DEFAULT_ENCODING="$(__lang_encoding)" - [ -n "$DEFAULT_ENCODING" ] || DEFAULT_ENCODING=utf-8 - [ -n "$UTOOLS_OUTPUT_ENCODING" ] || UTOOLS_OUTPUT_ENCODING="$DEFAULT_ENCODING" - UTOOLS_OUTPUT_ENCODING="$(__norm_encoding "$UTOOLS_OUTPUT_ENCODING")" - [ -n "$UTOOLS_INPUT_ENCODING" ] || UTOOLS_INPUT_ENCODING="$UTOOLS_OUTPUT_ENCODING" - UTOOLS_INPUT_ENCODING="$(__norm_encoding "$UTOOLS_INPUT_ENCODING")" - [ -n "$UTOOLS_EDITOR_ENCODING" ] || UTOOLS_EDITOR_ENCODING="$UTOOLS_INPUT_ENCODING" - UTOOLS_EDITOR_ENCODING="$(__norm_encoding "$UTOOLS_EDITOR_ENCODING")" - - IENC="$UTOOLS_INPUT_ENCODING" - OENC="$UTOOLS_OUTPUT_ENCODING" -} - -if [ -n "$UTOOLS_LANG" -a -z "$LANG" ]; then - export UTOOLS_LANG - export LANG="$UTOOLS_LANG" -fi -__init_encoding - -function tooenc() { - local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - rawecho "$src" - else - iconv -f "$from" -t "$to" <<<"$src" - fi -} -function uecho() { - tooenc "$*" -} -function tooenc_() { - local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - rawecho_ "$src" - else - rawecho_ "$src" | iconv -f "$from" -t "$to" - fi -} -function uecho_() { - tooenc_ "$*" -} -function toienc() { - local __tie_var="$1" __tie_to="${2:-$IENC}" __tie_from="${3:-$UTOOLS_INPUT_ENCODING}" - if [ "$__tie_from" != "$__tie_to" ]; then - set_var "$__tie_var" "$(iconv -f "$__tie_from" -t "$__tie_to" <<<"${!__tie_var}")" - fi -} -function uread() { - [ $# -gt 0 ] || set -- REPLY - local __r_var - read "$@" - for __r_var in "$@"; do - [ -z "$__r_var" -o "${__r_var:0:1}" == "-" ] && continue # ignorer les options - toienc "$__r_var" - done -} - -function stooenc() { - local from="${1:-$OENC}" to="${2:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - cat - else - iconv -f "$from" -t "$to" - fi -} -function stoienc() { - local to="${1:-$IENC}" from="${2:-$UTOOLS_INPUT_ENCODING}" - if [ "$from" == "$to" ]; then - cat - else - iconv -f "$from" -t "$to" - fi -} - -export UTOOLS_EDATE -function __edate() { [ -n "$UTOOLS_EDATE" ] && date +"[%d/%m/%Y-%H:%M:%S] "; } - -export UTOOLS_ELOG_OVERWRITE -function __set_no_colors() { :; } -function elogto() { - UTOOLS_EDATE=1 - if [ -n "$1" -a -n "$2" ]; then - LANG=fr_FR.UTF8 - UTOOLS_OUTPUT_ENCODING="$UTF8" - __set_no_colors 1 - if [ -n "$UTOOLS_ELOG_OVERWRITE" ]; then - exec >"$1" 2>"$2" - else - exec >>"$1" 2>>"$2" - fi - elif [ -n "$1" ]; then - LANG=fr_FR.UTF8 - UTOOLS_OUTPUT_ENCODING="$UTF8" - __set_no_colors 1 - if [ -n "$UTOOLS_ELOG_OVERWRITE" ]; then - exec >"$1" 2>&1 - else - exec >>"$1" 2>&1 - fi - fi -} - -export __estack __tlevel -function __indent() { - if [ "${1/ -/}" != "$1" ]; then - sed "2,\$s/^/${__tlevel}/g" <<<"$1" - else - rawecho "$1" - fi -} -function __eerror() { tooenc "$(__edate)${__tlevel}* error: $(__indent "$1")"; } -function __ewarn() { tooenc "$(__edate)${__tlevel}* warning: $(__indent "$1")"; } -function __enote() { tooenc "$(__edate)${__tlevel}* note: $(__indent "$1")"; } -function __ebanner() { - local maxi="${COLUMNS:-80}" - local -a lines - local psfix line - - psfix="$(__edate)${__tlevel}" - while [ ${#psfix} -lt $maxi ]; do psfix="$psfix="; done - - tooenc "$psfix" - maxi=$(($maxi - 1)) - array_from_xlines lines "$1" - for line in "" "${lines[@]}" ""; do - line="$(__edate)${__tlevel}= $line" - if [ ${#line} -le $maxi ]; then - while [ ${#line} -lt $maxi ]; do line="$line "; done - line="$line=" - fi - tooenc "$line" - done - tooenc "$psfix" -} -function __eimportant() { tooenc "$(__edate)${__tlevel}* important: $(__indent "$1")"; } -function __eattention() { tooenc "$(__edate)${__tlevel}* attention: $(__indent "$1")"; } -function __einfo() { tooenc "$(__edate)${__tlevel}* info: $(__indent "$1")"; } -function __eecho() { tooenc "$(__edate)${__tlevel}$(__indent "$1")"; } -function __eecho_() { tooenc_ "$(__edate)${__tlevel}$(__indent "$1")"; } -function __edebug() { tooenc "$(__edate)${__tlevel}* debug: $(__indent "$1")"; } -function __estep() { tooenc "$(__edate)${__tlevel}* $(__indent "$1")"; } -function __estepe() { __estep "$@"; } -function __estepw() { __estep "$@"; } -function __estepn() { __estep "$@"; } -function __estepi() { __estep "$@"; } -function __estep_() { tooenc_ "$(__edate)${__tlevel}* $(__indent "$1")"; } -function __estepe_() { __estep_ "$@"; } -function __estepw_() { __estep_ "$@"; } -function __estepn_() { __estep_ "$@"; } -function __estepi_() { __estep_ "$@"; } -function __etitle() { tooenc "$(__edate)${__tlevel}+++ $(__indent "$1")"; } -function __ebegin() { tooenc_ "$(__edate)${__tlevel}* $(__indent "$1"): "; } -function __edoto() { echo_ "."; } -function __edotw() { echo_ "w"; } -function __edotx() { echo_ "x"; } -function __edotp() { echo_ "+"; } -function __edotd() { tooenc "($1)"; } -function __eendo() { echo "[ok]"; } -function __eendx() { echo "[error]"; } -PRETTYOPTS=() -function set_verbosity() { :;} -function set_interaction() { :;} -function show_error() { - return 0 -} -function show_warn() { - return 0 -} -function show_info() { - return 0 -} -function show_verbose() { - return 0 -} -function show_debug() { - [ -n "$DEBUG" ] -} -function check_verbosity() { - return 0 -} -function get_verbosity_option() { :;} -function check_interaction() { - return 0 -} -function is_interaction() { - return 1 -} -function get_interaction_option() { :;} -__epending= -function eflush() { - if [ -n "$__epending" ]; then rawecho "$__epending" 1>&2; __epending=; fi -} -function eclearp() { - __epending= -} -function eerror() { - show_error || return; eflush; __eerror "$*" 1>&2 -} -function ewarn() { - show_warn || return; eflush; __ewarn "$*" 1>&2 -} -function enote() { - show_info || return; eflush; __enote "$*" 1>&2 -} -function ebanner() { - show_error || return; eflush; __ebanner "$*" 1>&2; sleep 5 -} -function eimportant() { - show_error || return; eflush; __eimportant "$*" 1>&2 -} -function eattention() { - show_warn || return; eflush; __eattention "$*" 1>&2 -} -function einfo() { - show_info || return; eflush; __einfo "$*" 1>&2 -} -function eecho() { - show_info || return; eflush; __eecho "$*" 1>&2 -} -function eecho_() { - show_info || return; eflush; __eecho_ "$*" 1>&2 -} -function edebug() { - show_debug || return; eflush; __edebug "$*" 1>&2 -} -function trace() { - local r cmd="$(quoted_args "$@")" - show_info && { eflush; __eecho "\$ $cmd" 1>&2; } - "$@"; r=$? - if [ $r -ne 0 ]; then - if show_info; then - eflush; __eecho "^ [EC #$r]" 1>&2 - elif show_error; then - eflush; __eecho "^ $cmd [EC #$r]" 1>&2; - fi - fi - return $r -} -function trace_error() { - local r - "$@"; r=$? - if [ $r -ne 0 ]; then - local cmd="$(quoted_args "$@")" - show_error && { eflush; __eecho "^ $cmd [EC #$r]" 1>&2; } - fi - return $r -} - -function etitle() { - local __t_deferred= - __t_etitle "$@" -} -function etitled() { - local __t_deferred=1 - __t_etitle "$@" -} -function __t_etitle() { - local __t_eend=default - local __t_clearp= - while [ -n "$1" ]; do - if [ "$1" == "--" ]; then - shift - break - elif [ "$1" == "-s" ]; then - __t_eend= - shift - elif [ "$1" == "--eend" ]; then - __t_eend=1 - shift - elif [ "$1" == "-p" ]; then - __t_clearp=1 - shift - else - break - fi - done - local __t_title="$1"; shift - local __t_s=0 - [ -n "$__estack" ] && __tlevel="${__tlevel} " - __estack="$__estack:t" - if show_info; then - if [ -n "$__t_deferred" ]; then - __epending="${__epending:+$__epending -}$(__etitle "$__t_title")" - else - eflush - __etitle "$__t_title" 1>&2 - fi - fi - if [ $# -gt 0 ]; then - "$@" - __t_s=$? - [ "$__t_eend" == "default" ] && __t_eend=1 - fi - [ "$__t_eend" == "default" ] && __t_eend= - if [ -n "$__t_eend" ]; then - eend $__t_s - [ -n "$__t_clearp" ] && eclearp - fi - return $__t_s -} -function estep() { - show_info || return; eflush; __estep "$*" 1>&2 -} -function estepe() { - show_info || return; eflush; __estepe "$*" 1>&2 -} -function estepw() { - show_info || return; eflush; __estepw "$*" 1>&2 -} -function estepn() { - show_info || return; eflush; __estepn "$*" 1>&2 -} -function estepi() { - show_info || return; eflush; __estepi "$*" 1>&2 -} -function estep_() { - show_info || return; eflush; __estep_ "$*" 1>&2 -} -function estepe_() { - show_info || return; eflush; __estepe_ "$*" 1>&2 -} -function estepw_() { - show_info || return; eflush; __estepw_ "$*" 1>&2 -} -function estepn_() { - show_info || return; eflush; __estepn_ "$*" 1>&2 -} -function estepi_() { - show_info || return; eflush; __estepi_ "$*" 1>&2 -} -function ebegin() { - local __b_eend=default - while [ -n "$1" ]; do - if [ "$1" == "--" ]; then - shift - break - elif [ "$1" == "-s" ]; then - __b_eend= - shift - elif [ "$1" == "--eend" ]; then - __b_eend=1 - shift - else - break - fi - done - local __b_msg="$1"; shift - local __b_s=0 - __estack="$__estack:b" - if show_info; then - eflush - __ebegin "$__b_msg" 1>&2 - fi - if [ $# -gt 0 ]; then - "$@" - __b_s=$? - [ "$__b_eend" == "default" ] && __b_eend=1 - fi - [ "$__b_eend" == "default" ] && __b_eend= - [ -n "$__b_eend" ] && eend $__b_s - return $__b_s -} -function edot() { - local s=$? - show_info || return - eflush - [ -n "$1" ] && s="$1" - shift - if [ "$s" == "0" ]; then - __edoto 1>&2 - else - __edotx 1>&2 - fi - show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2 - return $s -} -function edotw() { - local s=$? - show_info || return - eflush - [ -n "$1" ] && s="$1" - shift - __edotw 1>&2 - show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2 - return $s -} -function ewait() { - [ -n "$1" ] || return 1 - if show_info; then - local count=2 - eflush - little_sleep # certains processus retournent tout de suite - while is_running "$1"; do - sleep 1 - if [ $count -gt 0 ]; then - count=$(($count - 1)) - else - __edotp 1>&2 - fi - done - __edoto 1>&2 - else - wait "$1" - fi -} -function eend() { - local s=$? - if [ "$1" == "-c" ]; then - __estack= - __tlevel= - elif [ "${__estack%:b}" != "$__estack" ]; then - __estack="${__estack%:b}" - show_info || return - eflush - [ -n "$1" ] && s="$1" - if [ "$s" == "0" ]; then - __eendo 1>&2 - else - __eendx 1>&2 - fi - elif [ "${__estack%:t}" != "$__estack" ]; then - __estack="${__estack%:t}" - __tlevel="${__tlevel% }" - fi -} -function ask_yesno() { - local interactive=1 - if [[ "$1" == -* ]]; then - if [ "$1" != -- ]; then - check_interaction "$1" || interactive= - fi - shift - else - check_interaction -c || interactive= - fi - local default="${2:-N}" - if [ "$default" == "C" ]; then - [ -n "$interactive" ] && default=N || default=O - elif [ "$default" == "X" ]; then - [ -n "$interactive" ] && default=O || default=N - fi - if [ -n "$interactive" ]; then - eflush - local message="$1" - local prompt="[oN]" - local r - is_yes "$default" && prompt="[On]" - if [ -n "$message" ]; then - tooenc_ "$message" 1>&2 - else - tooenc_ "Voulez-vous continuer?" "$UTF8" 1>&2 - fi - tooenc_ " $prompt " "$UTF8" 1>&2 - uread r - is_yes "${r:-$default}" - else - is_yes "$default" - fi -} -function read_value() { - local -a __rv_opts __rv_readline=1 __rv_showdef=1 __rv_nl= - __rv_opts=() - [ -n "$UTOOLS_NO_READLINE" ] && __rv_readline= - __rv_read "$@" -} -function read_password() { - local -a __rv_opts __rv_readline= __rv_showdef= __rv_nl=1 - __rv_opts=(-s) - __rv_read "$@" -} -function __rv_read() { - local __rv_int=1 - if [[ "$1" == -* ]]; then - if [ "$1" != -- ]; then - check_interaction "$1" || __rv_int= - fi - shift - else - check_interaction -c || __rv_int= - fi - local __rv_msg="$1" __rv_v="${2:-value}" __rv_d="$3" __rv_re="${4:-O}" - if [ -z "$__rv_int" ]; then - if is_yes "$__rv_re" && [ -z "$__rv_d" ]; then - OENC="$UTF8" eerror "La valeur par défaut de $__rv_v doit être non vide" - return 1 - fi - set_var "$__rv_v" "$__rv_d" - return 0 - fi - - eflush - local __rv_r - while true; do - if [ -n "$__rv_msg" ]; then - tooenc_ "$__rv_msg" 1>&2 - else - tooenc_ "Entrez la valeur" "$UTF8" 1>&2 - fi - if [ -n "$__rv_readline" ]; then - tooenc_ ": " "$UTF8" 1>&2 - uread -e ${__rv_d:+-i"$__rv_d"} "${__rv_opts[@]}" __rv_r - else - if [ -n "$__rv_d" ]; then - if [ -n "$__rv_showdef" ]; then - tooenc_ " [$__rv_d]" 1>&2 - else - tooenc_ " [****]" 1>&2 - fi - fi - tooenc_ ": " "$UTF8" 1>&2 - uread "${__rv_opts[@]}" __rv_r - [ -n "$__rv_nl" ] && echo - fi - __rv_r="${__rv_r:-$__rv_d}" - if [ -n "$__rv_r" ] || ! is_yes "$__rv_re"; then - set_var "$__rv_v" "$__rv_r" - return 0 - fi - done -} -function simple_menu() { - local __sm_title= __sm_yourchoice= __sm_default= - local -a __sm_args - parse_opts -t: __sm_title= -m: __sm_yourchoice= -d: __sm_default= @ __sm_args -- "$@" && - set -- "${__sm_args[@]}" || ewarn "$__sm_args" - - local __sm_option_var="${1:-option}" __sm_options_var="${2:-options}" - local __sm_option __sm_options - __sm_options="$__sm_options_var[*]" - if [ -z "${!__sm_options}" ]; then - OENC="$UTF8" eerror "Le tableau $__sm_options_var doit être non vide" - return 1 - fi - [ -z "$__sm_default" ] && __sm_default="${!__sm_option_var}" - - eflush - array_copy __sm_options "$__sm_options_var" - local __sm_c=0 __sm_i __sm_choice - while true; do - if [ "$__sm_c" == "0" ]; then - [ -n "$__sm_title" ] && tooenc "=== $__sm_title ===" 1>&2 - __sm_i=1 - for __sm_option in "${__sm_options[@]}"; do - if [ "$__sm_option" == "$__sm_default" ]; then - tooenc "$__sm_i*- $__sm_option" 1>&2 - else - tooenc "$__sm_i - $__sm_option" 1>&2 - fi - let __sm_i=$__sm_i+1 - done - fi - - if [ -n "$__sm_yourchoice" ]; then - tooenc_ "$__sm_yourchoice" 1>&2 - else - tooenc_ "Entrez le numéro de l'option choisie" "$UTF8" 1>&2 - fi - tooenc_ ": " "$UTF8" 1>&2 - uread __sm_choice - - if [ -z "$__sm_choice" -a -n "$__sm_default" ]; then - __sm_option="$__sm_default" - break - fi - if [ -n "$__sm_choice" -a -z "${__sm_choice//[0-9]/}" ]; then - if [ "$__sm_choice" -gt 0 -a "$__sm_choice" -le "${#__sm_options[*]}" ]; then - __sm_option="${__sm_options[$(($__sm_choice - 1))]}" - break - else - OENC="$UTF8" eerror "Numéro d'option incorrect" - fi - else - OENC="$UTF8" eerror "Vous devez saisir le numéro de l'option choisie" - fi - - let __sm_c=$__sm_c+1 - if [ "$__sm_c" -eq 5 ]; then - tooenc "" "$UTF8" 1>&2 - __sm_c=0 - fi - done - set_var "$__sm_option_var" "$__sm_option" -} - -function actions_menu() { - local -a __am_action_descs __am_options __am_void_actions - local __am_tmp __am_select_action __am_select_option __am_title __am_optyc __am_actyc - local __am_default_action=auto __am_quit_action=auto - local __am_default_option= - local -a __am_args - parse_opts \ - -t: __am_title= \ - -m: __am_optyc= \ - -M: __am_actyc= \ - -e: __am_void_actions \ - -d: __am_default_action= \ - -q: __am_quit_action= \ - -o: __am_default_option= \ - @ __am_args -- "$@" && set -- "${__am_args[@]}" || { eerror "$__am_args"; return 1; } - - __am_tmp="${1:-action}"; __am_select_action="${!__am_tmp}" - __am_tmp="${2:-option}"; __am_select_option="${!__am_tmp}" - [ -n "$__am_default_option" ] && __am_select_option="$__am_default_option" - array_copy __am_action_descs "${3:-actions}" - array_copy __am_options "${4:-options}" - - eerror_unless [ ${#__am_action_descs[*]} -gt 0 ] "Vous devez spécifier le tableau des actions" || return - __actions_menu || return 1 - setv "${1:-action}" "$__am_select_action" - setv "${2:-option}" "$__am_select_option" -} -function __actions_menu() { - local title="$__am_title" - local optyc="$__am_optyc" actyc="$__am_actyc" - local default_action="$__am_default_action" - local quit_action="$__am_quit_action" - local select_action="$__am_select_action" - local select_option="$__am_select_option" - local -a action_descs options void_actions - array_copy action_descs __am_action_descs - array_copy options __am_options - array_copy void_actions __am_void_actions - - local no_options - array_isempty options && no_options=1 - - local -a actions - local tmp action name - for tmp in "${action_descs[@]}"; do - splitfsep2 "$tmp" : action name - [ -n "$action" ] || action="${name:0:1}" - action="$(strlower "$action")" - array_addu actions "$action" - done - - if [ "$default_action" == auto ]; then - default_action="$select_action" - if [ -n "$default_action" ]; then - array_contains actions "$default_action" || default_action= - fi - [ -n "$default_action" ] || default_action="${actions[0]}" - fi - default_action="${default_action:0:1}" - default_action="$(strlower "$default_action")" - - if [ "$quit_action" == auto ]; then - if [ ${#actions[*]} -gt 1 ]; then - quit_action="${actions[@]:$((-1)):1}" - array_addu void_actions "$quit_action" - fi - fi - quit_action="${quit_action:0:1}" - quit_action="$(strlower "$quit_action")" - - local action_title - for tmp in "${action_descs[@]}"; do - splitfsep2 "$tmp" : action name - [ -n "$action" ] || action="${name:0:1}" - [ -n "$name" ] || name="$action" - action="$(strlower "$action")" - if [ -n "$no_options" ]; then - if ! array_contains void_actions "$action"; then - array_del actions "$action" - continue - fi - fi - [ "$action" == "$default_action" ] && name="$name*" - action_title="${action_title:+$action_title/}$name" - done - if [ -n "$default_action" ]; then - array_contains actions "$default_action" || default_action= - fi - if [ -n "$quit_action" ]; then - array_contains actions "$quit_action" || quit_action= - fi - - if [ -n "$no_options" ]; then - if array_isempty void_actions; then - eerror "Aucune option n'est définie. Il faut définir le tableau des actions vides" - return 1 - fi - __void_actions_menu - else - __options_actions_menu - fi -} -function __void_actions_menu() { - eflush - local c=0 choice - while true; do - if [ $c -eq 0 ]; then - [ -n "$title" ] && __etitle "$title" 1>&2 - __eecho_ "=== Actions disponibles: " 1>&2 - tooenc "$action_title" 1>&2 - fi - if [ -n "$actyc" ]; then - __eecho_ "$actyc" 1>&2 - elif [ -n "$optyc" ]; then - __eecho_ "$optyc" 1>&2 - else - __eecho_ "Entrez l'action à effectuer" 1>&2 - fi - tooenc_ ": " 1>&2 - uread choice - if [ -z "$choice" -a -n "$default_action" ]; then - select_action="$default_action" - break - fi - - choice="${choice:0:1}" - choice="$(strlower "$choice")" - if array_contains actions "$choice"; then - select_action="$choice" - break - elif [ -n "$choice" ]; then - eerror "$choice: action incorrecte" - else - eerror "vous devez saisir l'action à effectuer" - fi - let c=$c+1 - if [ $c -eq 5 ]; then - tooenc "" 1>&2 - c=0 - fi - done - __am_select_action="$select_action" - __am_select_option= -} -function __options_actions_menu() { - eflush - local c=0 option choice action option - while true; do - if [ $c -eq 0 ]; then - [ -n "$title" ] && __etitle "$title" 1>&2 - i=1 - for option in "${options[@]}"; do - if [ "$option" == "$select_option" ]; then - tooenc "$i*- $option" 1>&2 - else - tooenc "$i - $option" 1>&2 - fi - let i=$i+1 - done - __estepn_ "Actions disponibles: " 1>&2 - tooenc "$action_title" 1>&2 - fi - if [ -n "$optyc" ]; then - __eecho_ "$optyc" 1>&2 - else - __eecho_ "Entrez l'action et le numéro de l'option choisie" 1>&2 - fi - tooenc_ ": " 1>&2 - uread choice - - if [ -z "$choice" -a -n "$default_action" ]; then - action="$default_action" - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - elif [ -n "$select_option" ]; then - select_action="$action" - break - fi - fi - action="${choice:0:1}" - action="$(strlower "$action")" - if array_contains actions "$action"; then - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - else - option="${choice:1}" - option="${option// /}" - if [ -z "$option" -a -n "$select_option" ]; then - select_action="$action" - break - elif [ -z "$option" ]; then - eerror "vous devez saisir le numéro de l'option" - elif isnum "$option"; then - if [ $option -gt 0 -a $option -le ${#options[*]} ]; then - select_action="$action" - select_option="${options[$(($option - 1))]}" - break - fi - else - eerror "$option: numéro d'option incorrecte" - fi - fi - elif isnum "$choice"; then - action="$default_action" - if [ -n "$action" ]; then - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - else - option="${choice// /}" - if [ -z "$option" ]; then - eerror "vous devez saisir le numéro de l'option" - elif isnum "$option"; then - if [ $option -gt 0 -a $option -le ${#options[*]} ]; then - select_action="$action" - select_option="${options[$(($option - 1))]}" - break - fi - else - eerror "$option: numéro d'option incorrecte" - fi - fi - else - eerror "Vous devez spécifier l'action à effectuer" - fi - elif [ -n "$choice" ]; then - eerror "$choice: action et/ou option incorrecte" - else - eerror "vous devez saisir l'action à effectuer" - fi - let c=$c+1 - if [ $c -eq 5 ]; then - tooenc "" 1>&2 - c=0 - fi - done - __am_select_action="$select_action" - __am_select_option="$select_option" -} - - -function __ac_forgetall() { __ac_files=(); } -__ac_forgetall -function __ac_trap() { - local file - for file in "${__ac_files[@]}"; do - [ -e "$file" ] && rm -rf "$file" 2>/dev/null - done - __ac_forgetall -} -trap __ac_trap 1 3 15 EXIT -function autoclean() { - local file - for file in "$@"; do - [ -n "$file" ] && array_add __ac_files "$file" - done -} -function ac_cleanall() { - __ac_trap -} -function ac_clean() { - local file - for file in "$@"; do - if array_contains __ac_files "$file"; then - [ -e "$file" ] && rm -rf "$file" 2>/dev/null - array_del __ac_files "$file" - fi - done -} -function ac_set_tmpfile() { - local __acst_d - if show_debug; then - if [ -n "$5" ]; then - is_yes "${!5}" && __acst_d=1 - else - __acst_d=1 - fi - fi - if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" - [ -f "$3" -a "$4" == keep ] || >"$3" - else - local __acst_t="$(mktempf "$2")" - autoclean "$__acst_t" - set_var "$1" "$__acst_t" - fi -} -function ac_set_tmpdir() { - local __acst_d - if show_debug; then - if [ -n "$4" ]; then - is_yes "${!4}" && __acst_d=1 - else - __acst_d=1 - fi - fi - if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" - mkdir -p "$3" - else - local __acst_t="$(mktempd "$2")" - autoclean "$__acst_t" - set_var "$1" "$__acst_t" - fi -} -function debug_tee() { - if show_debug; then - tee "$@" - else - cat - fi -} - - -function get_defaults_files() { - local __gd_dest="${1:-defaults}"; shift - local -a __gd_fs - local __gd_f __gd_found - for __gd_f in "$@"; do - __gd_found= - if [ -r "/etc/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "/etc/default/$__gd_f") - __gd_found=1 - fi - if [ -r "$HOME/etc/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "$HOME/etc/default/$__gd_f") - __gd_found=1 - fi - if [ -z "$__gd_found" -a -r "$scriptdir/lib/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "$scriptdir/lib/default/$__gd_f") - fi - done - array_copy "$__gd_dest" __gd_fs -} - -function set_defaults() { - local -a __sd_fs - local __sd_f - get_defaults_files __sd_fs "$@" - for __sd_f in "${__sd_fs[@]}"; do - source "$__sd_f" - done -} - - -: "${MYHOST:=$HOSTNAME}" -: "${MYHOSTNAME:=${MYHOST%%.*}}" -export MYHOST MYHOSTNAME - -function myhost() { - hostname -f 2>/dev/null || echo "$MYHOST" -} -function myhostname() { - hostname -s 2>/dev/null || echo "$MYHOSTNAME" -} -##@inc]base -uprovide base.tools -urequire base - -function base_umove() { - local -a args - local updatedir - args=(-d:,--updatedir: .) - parse_args_check "$@" || return; set -- "${args[@]}" - - eerror_unless [ -z "$updatedir" -o -d "$updatedir" ] "$updatedir: doit être un répertoire" || return - eerror_if [ $# -eq 0 ] "Vous devez spécifier les fichiers à déplacer" || return - eerror_if [ $# -eq 1 ] "Vous devez spécifier la destination" || return - - local -a srcs - local dest - - srcs=("$@") - setx dest=last_value srcs - array_del_last srcs - - if [ $# -eq 2 ]; then - if [ -d "$dest" ]; then - : # ce cas sera traité ci-dessous - elif [ -e "$dest" ]; then - eerror "$dest: refus d'écraser la destination" - return 1 - else - src="${srcs[0]}" - if [ -n "$updatedir" ]; then - if [ -L "$src" ]; then - ldest="$(readlinka "$src")" - array_find_links update_links "$ldest" "$updatedir" - else - array_find_links update_links "$src" "$updatedir" - fi - move_file "$src" "$dest" "${update_links[@]}" - else - move_link "$src" "$dest" - fi - return $? - fi - fi - - [ -d "$dest" ] || { - eerror "$dest: doit être un répertoire" - return 1 - } - for src in "${srcs[@]}"; do - if [ -n "$updatedir" ]; then - if [ -L "$src" ]; then - move_link "$src" "$dest" - else - array_find_links update_links "$src" "$updatedir" - move_file "$src" "$dest" "${update_links[@]}" - fi - else - move_link "$src" "$dest" - fi - done -} -##@inc]base.tools -##@inc[base.compat -## Fonctions de base: support des fonctions obsolètes et des versions de bash < 4.x -##@inc[base.core -## Fonctions de base: fondement -uprovide base.core - -function echo_() { - echo -n "$*" -} -function recho() { - if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - - local first="${1:1}"; shift - echo "$first$@" - else - echo "$@" - fi -} -function recho_() { - if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - - local first="${1:1}"; shift - echo -n "$first$@" - else - echo -n "$@" - fi -} -function _qval() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s//\$/\\\$}" - s="${s//\`/\\\`}" - recho_ "$s" -} -function should_quote() { - local l="${#1}" - [ $l -eq 0 -o $l -gt 80 ] && return 0 - local s="${*//[a-zA-Z0-9]/}" - s="${s//,/}" - s="${s//./}" - s="${s//+/}" - s="${s//\//}" - s="${s//-/}" - s="${s//_/}" - s="${s//=/}" - [ -n "$s" ] -} -function qval() { - echo -n \" - _qval "$@" - echo \" -} -function qvalm() { - if should_quote "$*"; then - echo -n \" - _qval "$@" - echo \" - else - recho "$*" - fi -} -function qvalr() { - if [ -z "$*" ]; then - : - elif should_quote "$*"; then - echo -n \" - _qval "$@" - echo \" - else - recho "$*" - fi -} -function qvals() { - local arg first=1 - for arg in "$@"; do - [ -z "$first" ] && echo -n " " - if should_quote "$arg"; then - echo -n \" - _qval "$arg" - echo -n \" - else - recho_ "$arg" - fi - first= - done - [ -z "$first" ] && echo -} -function qwc() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s//\$/\\\$}" - s="${s//\`/\\\`}" - local r a b - while [ -n "$s" ]; do - if [[ "$s" == *\** ]]; then - if [[ "$s" == *\?* ]]; then - a="${s%%\**}" - b="${s%%\?*}" - if [ ${#a} -lt ${#b} ]; then - s="${s#*\*}" - r="$r\"$a\"*" - else - s="${s#*\?}" - r="$r\"$b\"?" - fi - else - a="${s%%\**}" - s="${s#*\*}" - r="$r\"$a\"*" - fi - elif [[ "$s" == *\?* ]]; then - if [[ "$s" == *\** ]]; then - a="${s%%\**}" - b="${s%%\?*}" - if [ ${#a} -lt ${#b} ]; then - s="${s#*\*}" - r="$r\"$a\"*" - else - s="${s#*\?}" - r="$r\"$b\"?" - fi - else - a="${s%%\?*}" - s="${s#*\?}" - r="$r\"$a\"?" - fi - else - r="$r\"$s\"" - break - fi - done - recho_ "$r" -} -function qlines() { - sed "s/'/'\\\\''/g; s/.*/'&'/g" -} -function setv() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - eval "$__s_var=\"\$*\"" -} -function _setv() { - local __s_var="$1"; shift - eval "$__s_var=\"\$*\"" -} -function echo_setv() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - echo "$__s_var=$(qvalr "$*")" -} -function setx() { - if [ "$1" == -a ]; then - shift - local __s_array="$1"; shift - if [[ "$__s_array" == *=* ]]; then - set -- "${__s_array#*=}" "$@" - __s_array="${__s_array%%=*}" - fi - eval "$__s_array=($("$@" | qlines))" - else - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - eval "$__s_var="'"$("$@")"' - fi -} -function _setvx() { - local __s_var="$1"; shift - eval "$__s_var="'"$("$@")"' -} -function _setax() { - local __s_array="$1"; shift - eval "$__s_array=($("$@" | qlines))" -} -function evalx() { - local __e_val __e_arg __e_r=0 - local -a __e_cmd - - local __e_first=1 - while [ $# -gt 0 ]; do - __e_cmd=() - while [ $# -gt 0 ]; do - __e_arg="$1"; shift - [ "$__e_arg" == // ] && break - if [ "${__e_arg%//}" != "$__e_arg" ]; then - local __e_tmp="${__e_arg%//}" - if [ -z "${__e_tmp//\\/}" ]; then - __e_arg="${__e_arg#\\}" - __e_cmd=("${__e_cmd[@]}" "$__e_arg") - continue - fi - fi - __e_cmd=("${__e_cmd[@]}" "$__e_arg") - done - - if [ -n "$__e_first" ]; then - __e_val="$("${__e_cmd[@]}")" || __e_r=$? - else - __e_val="$("${__e_cmd[@]}" "$__e_val")" || __e_r=$? - fi - __e_first= - done - [ -n "$__e_val" ] && echo "$__e_val" - return $__e_r -} -function setxx() { - local -a __s_args - if [ "$1" == -a ]; then __s_args=(-a); shift; fi - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - __s_args=("${__s_args[@]}" "$__s_var") - setx "${__s_args[@]}" evalx "$@" -} -function evalp() { - local __e_arg __e_cmd - - while [ $# -gt 0 ]; do - __e_arg="$1"; shift - if [ "$__e_arg" == // ]; then - __e_cmd="$__e_cmd |" - continue - elif [ "${__e_arg%//}" != "$__e_arg" ]; then - local __e_tmp="${__e_arg%//}" - if [ -z "${__e_tmp//\\/}" ]; then - __e_arg="${__e_arg#\\}" - fi - fi - __e_cmd="${__e_cmd:+$__e_cmd }\"$(_qval "$__e_arg")\"" - done - eval "$__e_cmd" -} -function setxp() { - local -a __s_args - if [ "$1" == -a ]; then __s_args=(-a); shift; fi - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - __s_args=("${__s_args[@]}" "$__s_var") - setx "${__s_args[@]}" evalp "$@" -} -function testx() { - local __t_op="$1"; shift - local __t_val="$(evalx "$@")" - [ $__t_op "$__t_val" ] -} -function test2x() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalx "$@")" - [ "$__t_val1" $__t_op "$__t_val2" ] -} -function testrx() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalx "$@")" - eval '[[ "$__t_val1" '"$__t_op"' "$__t_val2" ]]' -} -function testp() { - local __t_op="$1"; shift - local __t_val="$(evalp "$@")" - [ $__t_op "$__t_val" ] -} -function test2p() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalp "$@")" - [ "$__t_val1" $__t_op "$__t_val2" ] -} -function testrp() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalp "$@")" - eval '[[ "$__t_val1" '"$__t_op"' "$__t_val2" ]]' -} - -function err2out() { - "$@" 2>&1 -} - -function is_defined() { - [ -n "$(declare -p "$1" 2>/dev/null)" ] -} -function is_array() { - case "$(declare -p "$1" 2>/dev/null)" in declare\ -a*) return 0;; esac - return 1 -} - -function upvar() { - if unset -v "$1"; then - if [ $# -eq 2 ]; then - eval "$1=\"\$2\"" - else - eval "$1=(\"\${@:2}\")" - fi - fi -} -function array_upvar() { - unset -v "$1" && eval "$1=(\"\${@:2}\")" -} -function upvars() { - while [ $# -gt 0 ]; do - case "$1" in - -a) - unset -v "$2" && eval "$2=(\"\${@:3}\")" - break - ;; - -a*) - unset -v "$2" && eval "$2=(\"\${@:3:${1#-a}}\")" - shift $((${1#-a} + 2)) || return 1 - ;; - *) - unset -v "$1" && eval "$1=\"\$2\"" - shift; shift - ;; - esac - done -} - -function __ab_process_pending() { - local -a values - case "$mode" in - cmd) values="$("${pending[@]}")";; - ssplit) eval "values=($("${pending[@]}"))";; - lsplit) eval "values=($("${pending[@]}" | qlines))";; - add) values=("${pending[@]}");; - esac - cmd=("${cmd[@]}" "${values[@]}") - pending=() -} -function array_buildcmd() { - local desta="$1"; shift; local "$desta" - local mode=add - local -a pending cmd - while [ $# -gt 0 ]; do - case "$1" in - ++c|++cmd|++) __ab_process_pending; mode=cmd;; - ++s|++ssplit) __ab_process_pending; mode=ssplit;; - ++l|++lsplit) __ab_process_pending; mode=lsplit;; - ++a|++add) __ab_process_pending; mode=add;; - *) pending=("${pending[@]}" "$1");; - esac - shift - done - __ab_process_pending - array_upvar "$desta" "${cmd[@]}" -} -function buildcmd() { - local -a args - array_buildcmd args "$@" - qvals "${args[@]}" -} -function evalcmd() { - local -a args - array_buildcmd args "$@" - "${args[@]}" -} -##@inc]base.core -##@inc[base.num -## Fonctions de base: gestion des valeurs numériques -uprovide base.num - -function isnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//[0-9]/}" - [ -z "$v" ] -} -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - [ -z "${1//[0-9]/}" ] -} -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//./}" - v="${v//,/}" - v="${v//[0-9]/}" - [ -z "$v" ] -} -##@inc]base.num -##@inc[base.bool -## Fonctions de base: valeurs booléennes -##@inc[base.num -## Fonctions de base: gestion des valeurs numériques -uprovide base.num - -function isnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//[0-9]/}" - [ -z "$v" ] -} -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - [ -z "${1//[0-9]/}" ] -} -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//./}" - v="${v//,/}" - v="${v//[0-9]/}" - [ -z "$v" ] -} -##@inc]base.num -uprovide base.bool -urequire base.num - -function is_yes() { - case "${1,,}" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - esac - isnum "$1" && [ "$1" -ne 0 ] && return 0 - return 1 -} -function is_no() { - case "${1,,}" in - n|non|no|f|faux|false|off) return 0;; - esac - isnum "$1" && [ "$1" -eq 0 ] && return 0 - return 1 -} -function yesval() { - is_yes "$1" && echo 1 -} - -function setb() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - local __s_r - if "$@" >/dev/null; then - eval "$__s_var=1" - else - __s_r=$? - eval "$__s_var=" - return $__s_r - fi -} -function _setb() { - local __s_var="$1"; shift - if "$@" >/dev/null; then - eval "$__s_var=1" - else - eval "$__s_var=" - fi -} - -function evalb() { - if evalx "$@" >/dev/null; then - echo 1 - else - return $? - fi -} -function setxb() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - setx "$__s_var" evalb "$@" -} -##@inc]base.bool -##@inc[base.quote -## Fonctions de base: protection de valeurs chaine -uprovide base.quote -urequire base.core - -function _qawk() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s// -/\\n}" - recho_ "$s" -} -function qawk() { - echo -n \" - _qawk "$@" - echo \" -} -function qseds() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\//\\/}" - s="${s// -/\\n}" - recho "$s" -} -function _qform() { - local s="$*" - s="${s//\%/%25}" - s="${s//+/%2B}" - s="${s//&/%26}" - s="${s//=/%3D}" - s="${s// /+}" - recho_ "$s" -} -function qform() { - local s="$*" - if [[ "$s" == *=* ]]; then - _qform "${s%%=*}" - echo -n = - _qform "${s#*=}" - echo - else - _qform "$s" - echo - fi -} -function _qsql() { - local q="'" qq="''" - echo "${*//$q/$qq}" -} -function qsql() { - local q="'" qq="''" - echo "'${*//$q/$qq}'" -} -##@inc]base.quote -uprovide base.compat -urequire base.core base.num base.bool base.quote - - -function setx2() { setxx "$@"; } -function rawecho() { recho "$@"; } -function rawecho_() { recho_ "$@"; } -function quote_arg() { _qval "$@"; } -function quoted_arg() { qvalm "$@"; } -function quoted_args() { qvals "$@"; } -function set_var() { setv "$@"; } -function set_var_cmd() { echo_setv "$@"; } -function set_var_literal() { eval "$1=$2"; } - -function quote_awk() { _qawk "$@"; } -function quoted_awk() { qawk "$@"; } -function quote_seds() { qseds "$@"; } -function quote_form() { _qform "$@"; } -function quoted_form() { qform "$@"; } - - -if [ -n "$BASH_VERSINFO" -a "${BASH_VERSINFO[0]}" -lt 4 ]; then - function strlower() { tr A-Z a-z <<<"$*"; } - function strlower1() { - local str="$*" - local h="${str:0:1}" r="${str:1}" - echo "$(tr A-Z a-z <<<"$h")$r" - } - function strlowers() { - local -a vs; local v - for v in "$@"; do - vs=("${vs[@]}" "$(strlower1 "$v")") - done - echo "${vs[*]}" - } - function strupper() { tr a-z A-Z <<<"$*"; } - function strupper1() { - local str="$*" - local h="${str:0:1}" r="${str:1}" - echo "$(tr a-z A-Z <<<"$h")$r" - } - function struppers() { - local -a vs; local v - for v in "$@"; do - vs=("${vs[@]}" "$(strupper1 "$v")") - done - echo "${vs[*]}" - } - - function is_yes() { - case "$1" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - O|OUI|Y|YES|V|VRAI|T|TRUE|ON) return 0;; - esac - isnum "$1" && [ "$1" -ne 0 ] && return 0 - case "$(strlower "$1")" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - esac - return 1 - } - function is_no() { - case "$1" in - n|non|no|f|faux|false|off) return 0;; - N|NON|NO|F|FAUX|FALSE|OFF) return 0;; - esac - isnum "$1" && [ "$1" -eq 0 ] && return 0 - case "$(strlower "$1")" in - n|non|no|f|faux|false|off) return 0;; - esac - return 1 - } -fi -##@inc]base.compat -uprovide base -urequire base.init base.core base.string base.num base.bool base.array base.quote base.split base.args base.tools base.compat - -UNAME_SYSTEM=`uname -s` -[ "${UNAME_SYSTEM#CYGWIN}" != "$UNAME_SYSTEM" ] && UNAME_SYSTEM=Cygwin -[ "${UNAME_SYSTEM#MINGW32}" != "$UNAME_SYSTEM" ] && UNAME_SYSTEM=Mingw -UNAME_MACHINE=`uname -m` -if [ -n "$UTOOLS_CHROOT" ]; then - [ -n "$UTOOLS_UNAME_SYSTEM" ] && eval "UNAME_SYSTEM=$UTOOLS_UNAME_SYSTEM" - [ -n "$UTOOLS_UNAME_MACHINE" ] && eval "UNAME_MACHINE=$UTOOLS_UNAME_MACHINE" -fi - -function setyesval() { - is_yes "$2" && set_var "$1" 1 || set_var "$1" "" -} -function normyesval() { - is_yes "${2:-"${!1}"}" && set_var "$1" 1 || set_var "$1" "" -} -function normyesvals() { - local __nyv_yesvar - for __nyv_yesvar in "$@"; do - is_yes "${!__nyv_yesvar}" && set_var "$__nyv_yesvar" 1 || set_var "$__nyv_yesvar" "" - done -} -function quote_in() { - sed 's/\\/\\\\/g -s/"/\\"/g -s/\$/\\$/g -s/`/\\`/g' -} -function quote_sin() { - sed "s/'/'\\\\''/g" -} -function quote_sarg() { - quote_sin <<<"$1" -} -function quoted_sarg() { - echo "'$(quote_sarg "$1")'" -} -function quoted_sargs() { - local a s - for a in "$@"; do - s="${s:+$s }$(quoted_sarg "$a")" - done - rawecho "$s" -} - -function set_array_cmd() { - [ $# -eq 1 ] && set -- "$1" "$1" - local __sac_s __sac_v __sac_f - __sac_s="$1=("; shift - if [ "$1" == "@" ]; then - shift - else - eval "set -- \"\${$1[@]}\"" - fi - __sac_f=1 - for __sac_v in "$@"; do - [ -n "$__sac_f" ] && __sac_f= || __sac_s="$__sac_s " - __sac_s="$__sac_s$(quoted_arg "$__sac_v")" - done - __sac_s="$__sac_s)" - echo "$__sac_s" -} -function set_array() { - eval "$(set_array_cmd "$@")" -} -function array_count() { - eval "echo \${#$1[*]}" -} -function array_isempty() { - [ $(array_count "$1") -eq 0 ] -} -function array_new() { - eval "$1=()" -} -function array_add() { - local __aa_a="$1"; shift - eval "$__aa_a=(\"\${$__aa_a[@]}\" \"\$@\")" -} -function array_ins() { - local __aa_a="$1"; shift - eval "$__aa_a=(\"\$@\" \"\${$__aa_a[@]}\")" -} -function array_del() { - local __ad_v - local -a __ad_vs - eval 'for __ad_v in "${'"$1"'[@]}"; do - if [ "$__ad_v" != '"$(quoted_arg "$2")"' ]; then - array_add __ad_vs "$__ad_v" - fi -done' - array_copy "$1" __ad_vs -} -function array_addu() { - local __as_v - eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then - return 1 - fi -done' - array_add "$1" "$2" - return 0 -} -function array_set() { - array_addu "$@" -} -function array_insu() { - local __as_v - eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then - return 1 - fi -done' - array_ins "$1" "$2" - return 0 -} -function array_fillrange() { - local -a __af_vs - local __af_i="${2:-1}" __af_to="${3:-10}" __af_step="${4:-1}" - while [ "$__af_i" -le "$__af_to" ]; do - __af_vs=("${__af_vs[@]}" "$__af_i") - __af_i=$(($__af_i + $__af_step)) - done - array_copy "$1" __af_vs -} -function array_eq() { - local -a __ae_a1 __ae_a2 - array_copy __ae_a1 "$1" - array_copy __ae_a2 "$2" - [ ${#__ae_a1[*]} -eq ${#__ae_a2[*]} ] || return 1 - local __ae_v __ae_i=0 - for __ae_v in "${__ae_a1[@]}"; do - [ "$__ae_v" == "${__ae_a2[$__ae_i]}" ] || return 1 - __ae_i=$(($__ae_i + 1)) - done - return 0 -} -function array_contains() { - local __ac_v - eval 'for __ac_v in "${'"$1"'[@]}"; do - if [ "$__ac_v" == '"$(quoted_arg "$2")"' ]; then - return 0 - fi -done' - return 1 -} -function array_find() { - local __af_i __af_v - __af_i=0 - eval 'for __af_v in "${'"$1"'[@]}"; do - if [ "$__af_v" == '"$(quoted_arg "$2")"' ]; then - if [ -n "$3" ]; then - echo "${'"$3"'[$__af_i]}" - else - echo "$__af_i" - fi - return 0 - fi - __af_i=$(($__af_i + 1)) -done' - return 1 -} -function array_reverse() { - local -a __ar_vs - local __ar_v - array_copy __ar_vs "$1" - array_new "$1" - for __ar_v in "${__ar_vs[@]}"; do - array_ins "$1" "$__ar_v" - done -} - -function array_replace() { - local __ar_sn="$1"; shift - local __ar_f="$1"; shift - local -a __ar_s __ar_d - local __ar_v - array_copy __ar_s "$__ar_sn" - for __ar_v in "${__ar_s[@]}"; do - if [ "$__ar_v" == "$__ar_f" ]; then - __ar_d=("${__ar_d[@]}" "$@") - else - __ar_d=("${__ar_d[@]}" "$__ar_v") - fi - done - array_copy "$__ar_sn" __ar_d -} -function array_each() { - local __ae_an="$1"; shift - local __ae_f="$1"; shift - local -a __ae_a - local __ae_v - array_copy __ae_a "$__ae_an" - for __ae_v in "${__ae_a[@]}"; do - "$__ae_f" "$__ae_v" "$@" - done -} -function array_map() { - local __am_an="$1"; shift - local __am_f="$1"; shift - local -a __am_a __am_vs - local __am_v - array_copy __am_a "$__am_an" - for __am_v in "${__am_a[@]}"; do - __am_vs=("${__am_vs[@]}" "$("$__am_f" "$__am_v" "$@")") - done - array_copy "$__am_an" __am_vs -} -function first_value() { - eval "rawecho \"\${$1[@]:0:1}\"" -} -function last_value() { - eval "rawecho \"\${$1[@]:\$((-1)):1}\"" -} -function array_copy() { - eval "$1=(\"\${$2[@]}\")" -} -function array_copy_firsts() { - eval "$1=(\"\${${2:-$1}[@]:0:\$((\${#${2:-$1}[@]}-1))}\")" -} -function array_del_last() { - array_copy_firsts "$1" -} -function array_copy_lasts() { - eval "$1=(\"\${${2:-$1}[@]:1}\")" -} -function array_del_first() { - array_copy_lasts "$1" -} -function array_extend() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]}\")" -} -function array_extendu() { - local __ae_v __ae_s=1 - eval 'for __ae_v in "${'"$2"'[@]}"; do - array_addu "$1" "$__ae_v" && __ae_s=0 -done' - return "$__ae_s" -} -function array_extend_firsts() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]:0:\$((\${#$2[@]}-1))}\")" -} -function array_extend_lasts() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]:1}\")" -} -function array_xsplit() { - eval "$1=($(recho_ "$2" | awkrun RS="${3:-:}" ' -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_split() { - eval "$1=($(recho_ "$2" | awkrun RS="${3:-:}" ' -/^$/ { next } -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_from_path() { - array_split "$1" "$2" ":" -} -function array_from_xlines() { - eval "$1=($(recho_ "$2" | _nl2lf | awk ' -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_from_lines() { - eval "$1=($(recho_ "$2" | _nl2lf | awk ' -/^$/ { next } -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_join() { - local __aj_an __aj_l __aj_j __aj_s="${2:-,}" __aj_pf __aj_sf - if [ "$1" == "@" ]; then - __aj_an="\$@" - shift; shift - else - __aj_an="\${$1[@]}" - __aj_pf="$4" - __aj_sf="$5" - fi - eval 'for __aj_l in "'"$__aj_an"'"; do - __aj_j="${__aj_j:+$__aj_j'"$__aj_s"'}$__aj_pf$__aj_l$__aj_sf" -done' - if [ -n "$__aj_j" ]; then - rawecho "$__aj_j" - elif [ "$__aj_an" != "\$@" -a -n "$3" ]; then - rawecho "$3" - fi -} -function array_mapjoin() { - local __amj_src="$1" __amj_func="$2" __amj_sep="$3" - shift; shift; shift - if [ "$__amj_src" == "@" ]; then - local -a __amj_tmpsrc - __amj_tmpsrc=("$@") - __amj_src=__amj_tmpsrc - set -- - fi - local -a __amj_tmp - array_copy __amj_tmp "$__amj_src" - array_map __amj_tmp "$__amj_func" - array_join __amj_tmp "$__amj_sep" "$@" -} -function array_to_lines() { - array_join "$1" " -" "$2" "$3" "$4" -} -function array_to_path() { - array_join "$1" ":" "$2" "$3" "$4" -} -function array_fix_paths() { - local __afp_an="$1" __afp_s="${2:-:}" - local -a __afp_vs - local __afp_v - array_copy __afp_vs "$__afp_an" - array_new "$__afp_an" - for __afp_v in "${__afp_vs[@]}"; do - array_split __afp_v "$__afp_v" "$__afp_s" - array_extend "$__afp_an" __afp_v - done -} - - -function get_date_rfc822() { - LC_TIME=C date +"%a, %d %b %Y %H:%M:%S %Z" -} -function get_date_fr() { - LC_TIME=C date +"%d/%m/%Y" -} -function get_time_fr() { - LC_TIME=C date +"%Hh%M" -} -function parse_date() { - local value="$1" type="${2:-date}" - local now="$(awk 'BEGIN { print mktime(strftime("%Y %m %d 00 00 00 +0400")) }')" - case "$value" in - +*) - value="$(($now + ${value#+} * 86400))" - ;; - *) - value="$(<<<"$value" awk -F/ '{ - nd = strftime("%d"); nm = strftime("%m"); ny = strftime("%Y") - d = $1 + 0; if (d < 1) d = nd; - m = $2 + 0; if (m < 1) m = nm; - if ($3 == "") y = ny; - else { y = $3 + 0; if (y < 100) y = y + 2000; } - print mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d)); - }')" - esac - case "$type" in - d|date) awk '{ print strftime("%d/%m/%Y", $0 + 0) }' <<<"$value";; - l|ldap) awk '{ print strftime("%Y%m%d%H%M%S+0400", $0 + 0) }' <<<"$value";; - m|mysql) awk '{ print strftime("%Y-%m-%d", $0 + 0) }' <<<"$value";; - *) - rawecho "$value" - ;; - esac -} - - -function udelpath() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; ${2:-PATH}"'="${'"${2:-PATH}"'#$1:}"; '"${2:-PATH}"'="${'"${2:-PATH}"'%:$1}"; '"${2:-PATH}"'="${'"${2:-PATH}"'//:$_qdir:/:}"; [ "$'"${2:-PATH}"'" == "$1" ] && '"${2:-PATH}"'=' -} -function uaddpath() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="${'"${2:-PATH}"':+$'"${2:-PATH}"':}$1"' -} -function uinspathm() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="$1${'"${2:-PATH}"':+:$'"${2:-PATH}"'}"' -} -function uinspath() { - udelpath "$@" - uinspathm "$@" -} - -function withpath() { - [ "${1#./}" != "$1" -o "${1#../}" != "$1" -o "${1#/}" != "$1" ] -} -function withext() { - local basename="$(basename -- "$1")" - [ "${basename%.*}" != "$basename" ] -} -function normpath() { - local -a parts - local part ap - array_split parts "$1" / - if [ "${1#/}" != "$1" ]; then - ap=/ - elif [ -n "$2" ]; then - ap="$2" - else - ap="$(pwd)" - fi - for part in "${parts[@]}"; do - if [ "$part" == "." ]; then - continue - elif [ "$part" == ".." ]; then - ap="${ap%/*}" - [ -n "$ap" ] || ap=/ - else - [ "$ap" != "/" ] && ap="$ap/" - ap="$ap$part" - fi - done - rawecho "$ap" -} -function abspath() { - local ap="$1" - if [ "${ap#/}" != "$ap" ]; then - __normpath "$ap" && return - else - local cwd - if [ -n "$2" ]; then - cwd="$(abspath "$2")" - else - cwd="$(pwd)" - fi - ap="$cwd/$ap" - __normpath "$ap" && return - fi - normpath "$ap" -} -function __normpath() { - if [ -d "$1" ]; then - if [ -x "$1" ]; then - (cd "$1"; pwd) - return 0 - fi - elif [ -f "$1" ]; then - local dn="$(dirname -- "$1")" bn="$(basename -- "$1")" - if [ -x "$dn" ]; then - (cd "$dn"; echo "$(pwd)/$bn") - return 0 - fi - fi - return 1 -} -function parentdirs() { - array_new "$1" - local __pd_d="$(abspath "$2")" - if [[ "$3" == r* ]]; then - while [ "$__pd_d" != "/" ]; do - array_ins "$1" "$__pd_d" - __pd_d="$(dirname "$__pd_d")" - done - else - while [ "$__pd_d" != "/" ]; do - array_add "$1" "$__pd_d" - __pd_d="$(dirname "$__pd_d")" - done - fi -} -function ppath() { - local path="$1" cwd="$2" - - path="$(abspath "$path")" # essayer de normaliser le chemin - [ -n "$cwd" ] || cwd="$(pwd)" - - [ "$path" = "$cwd" ] && path="." - [ "$cwd" != "/" -a "$cwd" != "$HOME" ] && path="${path/#$cwd\//}" - path="${path/#$HOME/~}" - - rawecho "$path" -} -function relpath() { - local p="$(abspath "$1" "$3")" cwd="$2" - if [ -z "$cwd" ]; then - cwd="$(pwd)" - else - cwd="$(abspath "$cwd" "$3")" - fi - if [ "$p" == "$cwd" ]; then - echo "" - elif [ "${p#$cwd/}" != "$p" ]; then - rawecho "${p#$cwd/}" - else - local rp - while [ -n "$cwd" -a "${p#$cwd/}" == "$p" ]; do - rp="${rp:+$rp/}.." - cwd="${cwd%/*}" - done - rp="$rp/${p#$cwd/}" - echo "${rp%//}" - fi -} -function relpathx() { - local p="$(relpath "$@")" - if [ -z "$p" ]; then - echo . - elif [ "${p#../}" != "$p" -o "${p#./}" != "$p" ]; then - echo "$p" - else - echo "./$p" - fi -} -function withinpath() { - local b="$1" p="$2" strict="${3:-N}" - b="$(abspath "$b")" - p="$(abspath "$p")" - if is_yes "$strict"; then - [ "${p#$b/}" != "$p" ] - else - [ "$p" == "$b" -o "${p#$b/}" != "$p" ] - fi -} -function safe_abspath() { - local p="$1" ba="$2" br="$3" - if [ -n "$ba" ]; then - ba="$(abspath "$ba")" - else - ba="$(pwd)" - fi - [ -n "$br" ] || br="$ba" - br="$(abspath "$br" "$ba")" - p="$(abspath "$p" "$ba")" - if [ "$p" == "$br" -o "${p#$br/}" != "$p" ]; then - echo "$p" - else - return 1 - fi -} -function safe_relpath() { - local p - if p="$(safe_abspath "$1" "$2" "$3")"; then - relpath "$p" "$2" "$(pwd)" - else - return 1 - fi -} -function splitwcs() { - local __sw_p="$1" - local __sw_dd="${2:-basedir}" __sw_df="${3:-filespec}" __sw_part __sw_d __sw_f - local -a __sw_parts - array_split __sw_parts "$__sw_p" "/" - for __sw_part in "${__sw_parts[@]}"; do - if [[ "$__sw_part" == *\** ]] || [[ "$__sw_part" == *\?* ]] || [ -n "$__sw_f" ]; then - __sw_f="${__sw_f:+$__sw_f/}$__sw_part" - else - __sw_d="${__sw_d:+$__sw_d/}$__sw_part" - fi - done - [ "${__sw_p#/}" != "$__sw_p" ] && __sw_d="/$__sw_d" - set_var "$__sw_dd" "$__sw_d" - set_var "$__sw_df" "$__sw_f" -} -function deref() { - local OENC="$UTF8" - - local max_deref=50 - local file="$1" - local basedir link - while [ -L "$file" ]; do - basedir="$(dirname "$file")" - link="$(readlink "$file")" - if first_char_is "$link" "/"; then - file="$link" - else - file="$basedir/$link" - fi - - max_deref=$(($max_deref - 1)) - [ $max_deref -eq 0 ] && die "Plus de 50 indirection. Le lien $file est-il récursif?" - done - abspath "$file" -} -function readlinka() { - if [ -L "$1" ]; then - local linkdir="$(dirname -- "$1")" - abspath "$(readlink "$1")" "$linkdir" - else - abspath "$1" - fi -} -function readlinkm() { - readlink -m "$1" -} -function path_if_test() { - local op="$1"; shift - local file="$1"; shift - local rel="$1" reldir=; shift - if beginswith "$rel" relative; then - reldir="${rel#relative}" - if beginswith "$reldir" :; then - reldir="${reldir#:}" - if [ -n "$reldir" ]; then - reldir="${reldir}/" - fi - else - reldir= - fi - else - rel= - fi - - while [ -n "$1" ]; do - local basedir="$1" - if [ $op "$basedir/$file" ]; then - if [ -n "$rel" ]; then - rawecho "$reldir$file" - else - rawecho "$basedir/$file" - fi - break - fi - shift - done -} -function update_link() { - [ -L "$2" ] || return 1 - local dest link="$2" - local linkdir="$(dirname "$link")" - local ldest="$(readlink "$link")" - if [ "${ldest#/}" != "$ldest" ]; then - dest="$(abspath "$1")" - else - dest="$(relpath "$1" "$linkdir")" - fi - if [ "$dest" == "$ldest" ]; then - : # pas besoin de mettre à jour - elif [ -d "$link" ]; then - rm -f "$link" && ln -s "$dest" "$link" - else - ln -sf "$dest" "$link" - fi -} -function update_links() { - [ -n "$1" ] || return 1 - local dest="$1"; shift - local r=0 link - for link in "$@"; do - update_link "$dest" "$link" || r=$? - done - return $r -} -function move_link() { - [ -n "$1" -a -n "$2" ] || return 1 - local link="$1" dest="$2" - [ -d "$dest" ] && dest="$dest/$(basename -- "$link")" - dest="$(abspath "$dest")" - if [ -L "$link" ]; then - link="$(abspath "$link")" - [ "$dest" == "$link" ] && return 0 - ldest="$(readlinka "$link")" - mv "$link" "$dest" || return 1 - update_link "$ldest" "$dest" - else - [ "$dest" == "$link" ] && return 0 - mv "$link" "$dest" - fi -} -function array_find_links() { - local -a __afl_links __afl_result - local __afl_dir="${3:-.}" - local __afl_dest __afl_destname __afl_link __afl_linkdir __afl_ldest - __afl_dest="$(abspath "$2")" - __afl_destname="${__afl_dest##*/}" - array_from_lines __afl_links "$(find "$__afl_dir" -type l)" - for __afl_link in "${__afl_links[@]}"; do - __afl_ldest="$(readlink "$__afl_link")" - if [ "$__afl_ldest" != "$__afl_destname" ]; then - [[ "$__afl_ldest" == */"$__afl_destname" ]] || continue - fi - __afl_link="$(abspath "$__afl_link" "$__afl_dir")" - __afl_linkdir="$(dirname -- "$__afl_link")" - __afl_ldest="$(abspath "$__afl_ldest" "$__afl_linkdir")" - if [ "$__afl_ldest" == "$__afl_dest" ]; then - array_add __afl_result "$__afl_link" - fi - done - array_copy "$1" __afl_result -} -function list_links() { - local -a links - array_find_links links "$@" - array_to_lines links -} -function move_file() { - [ -n "$1" -a -n "$2" ] || return 1 - local src="$1" dest="$2" link - shift; shift - [ -d "$dest" ] && dest="$dest/$(basename -- "$src")" - move_link "$src" "$dest" || return 1 - update_links "$dest" "$@" -} - -function get_nblines() { - [ -f "$1" ] && sed -ne '$=' "$1" || echo 0 -} -function mktempf() { - mktemp "${1:-"$TMPDIR/tmp.XXXXXX"}" -} -function mktempd() { - mktemp -d "${1:-"$TMPDIR/tmp.XXXXXX"}" -} -function mkdirof() { - mkdir -p "$(dirname -- "$1")" -} -function cp_a() { - /bin/cp -a "$@" -} -function cp_R() { - /bin/cp -pR "$@" -} -function quietgrep() { - grep -q "$@" 2>/dev/null -} -function quietdiff() { - diff -q "$@" >&/dev/null -} -function testsame() { - quietdiff "$@" -} -function testdiff() { - ! quietdiff "$@" -} -function testupdated() { - if [ -f "$2" ]; then - testdiff "$1" "$2" - else - return 0 - fi -} -function testnewer() { - test ! -e "$2" -o "$1" -nt "$2" -} -function ps_all() { - ps -axww -} -function progexists() { - test -n "$1" -a -x "$(which "$1" 2>/dev/null)" -} -function has_python() { - progexists python -} -function has_gawk() { - progexists gawk -} -function is_root() { - test `id -u` -eq 0 -} -function source_ifexists() { - if [ -f "$1" ]; then source "$1" || die; fi -} -function little_sleep { - LC_NUMERIC=C sleep 0.1 -} -function random_sleep { - sleep $(($RANDOM % ${1:-1800})) -} -function is_running() { - kill -0 "$1" >&/dev/null -} -function sedi() { - sed -i "$@" -} -function csort() { - LANG=C sort "$@" -} -function lsort() { sort "$@"; } -function cgrep() { - LANG=C grep "$@" -} -function lgrep() { grep "$@"; } -function csed() { - LANG=C sed "$@" -} -function lsed() { sed "$@"; } -function cawk() { - LANG=C awk "$@" -} -function lawk() { awk "$@"; } -function cdiff() { - LANG=C diff "$@" -} -function ldiff() { diff "$@"; } - - -function fix_mode() { - local file="$1" - [ -f "$file" ] || touch "$file" || return 1 - if [ ! -w "$file" ]; then - local mode="$(stat -c %a "$file")" - chmod ${mode:0:${#mode}-3}6${mode:${#mode}-2:2} "$file" - echo "$mode" - fi -} -function unfix_mode() { - [ -n "$2" ] && chmod "$2" "$1" -} -function get_mode() { - [ -f "$1" ] || touch "$1" || return 1 - stat -c %a "$1" -} -function rm_maybe() { - local parse_opts=1 arg rm - for arg in "$@"; do - if [ -n "$parse_opts" ]; then - if [ "$arg" == "--" ]; then - parse_opts= - elif [[ "$arg" == "-*" ]]; then - continue - elif [ -n "$arg" ]; then - rm=1 - break - fi - elif [ -n "$arg" ]; then - rm=1 - break - fi - done - [ -n "$rm" ] && /bin/rm "$@" -} -__CPDIR_RSYNC_SLOW=1 # synchro potentiellement plus lente, mais plus fidèle (option -c) -__CPDIR_RSYNC_ARGS=(-q) -function cpdir() { - - if progexists rsync; then - [ -d "$2" ] || mkdir -p "$2" || return 1 - if [ -d "$1" ]; then - rsync -a ${__CPDIR_RSYNC_SLOW:+-c} "${__CPDIR_RSYNC_ARGS[@]}" "$1/" "$2/" - else - rsync -a ${__CPDIR_RSYNC_SLOW:+-c} "${__CPDIR_RSYNC_ARGS[@]}" "$1" "$2/" - fi - else - __cpdir "$@" - fi -} -function __cpdir() { - local src="$1" dest="$2" method="${3:-cp_a}" - - if [ -d "$src" ]; then - [ -d "$dest" ] || mkdir -p "$dest" || return 1 - - local prevdir="$(pwd)" - - dest="$(abspath "$dest")" - cd "$src" - if [ -n "$(/bin/ls -a1)" ]; then - [ -n "$(/bin/ls -1)" ] && "$method" * "$dest" - local i - for i in .*; do - [ "$i" == "." -o "$i" == ".." ] && continue - "$method" "$i" "$dest" - done - fi - cd "$prevdir" - else - if [ -f "$dest" ]; then - "$method" "$src" "$dest" - elif [ -d "$dest" ]; then - "$method" "$src" "$dest" - else - mkdir -p "$dest" - "$method" "$src" "$dest" - fi - fi -} -__CPNOVCS_RSYNC_SLOW=1 # synchro potentiellement plus lente, mais plus fidèle (option -c) -__CPNOVCS_RSYNC_ARGS=(-q) -function cpnovcs() { - local src="$1" destdir="$2" - [ -d "$destdir" ] || mkdir -p "$destdir" || return 1 - if progexists rsync; then - local gitexclude=/.git/ - if [ "${src%/}" == "$src" ]; then - gitexclude="/$(basename -- "$src")$gitexclude" - fi - rsync -a ${__CPNOVCS_RSYNC_SLOW:+-c} --exclude CVS/ --exclude .svn/ --exclude "$gitexclude" "${__CPNOVCS_RSYNC_ARGS[@]}" "$src" "$destdir/" - elif [ "${src%/}" != "$src" ]; then - __cpdir "$src" "$destdir" - else - local srcname="$(basename -- "$src")" - mkdir -p "$destdir/$srcname" - __cpdir "$src" "$destdir/$srcname" - fi -} -function cpdirnovcs() { - if [ -d "$1" ]; then - cpnovcs "$1/" "$2" - else - cpnovcs "$1" "$2" - fi -} -function doinplace() { - if [ -n "$1" -a "$1" != "-" ]; then - local __dip_file="$1"; shift - autoclean "$__dip_file.tmp.$$" - "$@" <"$__dip_file" >"$__dip_file.tmp.$$" - local s=$? - [ "$s" == 0 ] && /bin/cat "$__dip_file.tmp.$$" >"$__dip_file" - /bin/rm -f "$__dip_file.tmp.$$" - return $s - else - shift - "$@" - fi -} -function doinplacef() { - if [ -n "$1" -a "$1" != "-" ]; then - local __dip_file="$1"; shift - autoclean "$__dip_file.tmp.$$" - "$@" <"$__dip_file" >"$__dip_file.tmp.$$" - local s=$? - /bin/cat "$__dip_file.tmp.$$" >"$__dip_file" - /bin/rm -f "$__dip_file.tmp.$$" - return $s - else - shift - "$@" - fi -} -function stripnl() { - tr -d '\r\n' -} -function _nl2lf() { - awk 'BEGIN {RS="\r|\r\n|\n"} {print}' -} -function nl2lf() { - doinplace "$1" _nl2lf -} -function _nl2crlf() { - awk 'BEGIN {RS="\r|\r\n|\n"} {print $0 "\r"}' -} -function nl2crlf() { - doinplace "$1" _nl2crlf -} -function _nl2cr() { - awk 'BEGIN {RS="\r|\r\n|\n"; ORS=""} {print $0 "\r"}' -} -function nl2cr() { - doinplace "$1" _nl2cr -} -function _latin1compat() { - LANG=fr_FR.UTF-8 sed $' -s/[‘’]/\x27/g -s/[«»“”]/"/g -s/[\xC2\xA0\xE2\x80\x87\xE2\x80\xAF\xE2\x81\xA0]/ /g -' -} -function _noaccents() { - LANG=fr_FR.UTF-8 sed ' -s/[à]/a/g -s/[éèêë]/e/g -s/[ïî]/i/g -s/[ôö]/o/g -s/[üû]/u/g -s/[ç]/c/g -s/[À]/A/g -s/[ÉÈÊË]/E/g -s/[ÏÎ]/I/g -s/[ÔÖ]/O/g -s/[ÜÛ]/U/g -s/[Ç]/C/g -' -} -function list_all() { - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ "$f" == "." -o "$f" == ".." ] && continue - rawecho "$f" - done - cd "$curdir" -} -function __la_cmd() { - [ $# -gt 0 ] || set '*' - local arg - local cmd="/bin/ls -1d" - for arg in "$@"; do - arg="$(_rval "$arg")" - cmd="$cmd $arg" - done - cmd="$cmd 2>/dev/null" - echo "$cmd" -} -function list_files() { - local f - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ -f "$f" ] && rawecho "$f" - done - cd "$curdir" -} -function list_dirs() { - local f - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ "$f" == "." -o "$f" == ".." ] && continue - [ -d "$f" ] && rawecho "$f" - done - cd "$curdir" -} -function __array_ls() { - local __al_l="list_${1:-all}"; shift - local __al_an="$1"; shift - local __al_d="${1:-.}"; shift - local -a __al_fs - array_from_lines __al_fs "$("$__al_l" "$__al_d" "$@")" - local __al_f - array_new "$__al_an" - for __al_f in "${__al_fs[@]}"; do - array_add "$__al_an" "$__al_d/$__al_f" - done -} -function array_lsall() { - __array_ls all "$@" -} -function array_lsdirs() { - __array_ls dirs "$@" -} -function array_lsfiles() { - __array_ls files "$@" -} -function filter_empty() { - sed '/^$/d' -} -function filter_vcspath() { - sed ' -/^.git$/d -/^.git\//d -/\/.git$/d -/\/.git\//d -/^.svn$/d -/^.svn\//d -/\/.svn$/d -/\/.svn\//d -' -} -function merge_contlines() { - awk 'substr($0, length($0)) == "\\" { - while (getline nextline) { - $0 = substr($0, 1, length($0) - 1) nextline - if (substr($0, length($0)) != "\\") break - } - print - next -} -{print}' -} -function filter_comment() { - local -a merge - [ "$1" == -m ] && merge=(merge_contlines) || merge=(cat) - awk ' - /^[ \t]*#/ { next } - /^[ \t]*$/ { next } - { print }' | "${merge[@]}" -} -function filter_conf() { - local -a merge - [ "$1" == -m ] && merge=(merge_contlines) || merge=(cat) - grep -v '^#' | grep -v '^$' | "${merge[@]}" -} -function is_archive() { - local name="${1%.zip}" - name="${name%.tgz}" - name="${name%.tbz2}" - name="${name%.tar.gz}" - name="${name%.tar.bz2}" - name="${name%.tar}" - name="${name%.jar}" - name="${name%.war}" - name="${name%.ear}" - [ "$name" != "$1" ] -} -function extract_archive() { - local arch="$1" destdir="${2:-.}" - shift; shift - if endswith "$arch" .zip; then - unzip -q -d "$destdir" "$arch" "$@" || return - elif endswith "$arch" .tgz || endswith "$arch" .tar.gz; then - tar xzf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .tbz2 || endswith "$arch" .tar.bz2; then - tar xjf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .tar; then - tar xf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .jar || endswith "$arch" .war || endswith "$arch" .ear; then - ( - arch="$(abspath "$arch")" - cd "$destdir" - jar xf "$arch" "$@" - ) || return - else - return 1 - fi -} -function get_archive_basename() { - local basename="$(basename -- "$1")" - basename="${basename%.zip}" - basename="${basename%.tgz}" - basename="${basename%.tbz2}" - basename="${basename%.gz}" - basename="${basename%.bz2}" - basename="${basename%.tar}" - basename="${basename%.jar}" - basename="${basename%.war}" - basename="${basename%.ear}" - echo "$basename" -} -function get_archive_appname() { - local appname="$(basename -- "$1")" - appname="${appname%.zip}" - appname="${appname%.tgz}" - appname="${appname%.tbz2}" - appname="${appname%.gz}" - appname="${appname%.bz2}" - appname="${appname%.tar}" - appname="${appname%.jar}" - appname="${appname%.war}" - appname="${appname%.ear}" - echo "$appname" | awk '{ - if (match($0, /[-_.]([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/)) { - print substr($0, 1, RSTART - 1) - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/)) { - print substr($0, 1, RSTART - 1) - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print substr($0, 1, RSTART - 1) - } else { - print $0 - } -}' -} -function get_archive_versionsuffix() { - local basename="$(get_archive_basename "$1")" - echo "$basename" | awk '{ - if (match($0, /([-_.][0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print vs["1"] - } -}' -} -function get_archive_version() { - local basename="$(get_archive_basename "$1")" - echo "$basename" | awk '{ - if (match($0, /[-_.]([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print vs["1"] - } -}' -} -function __dump_usernames() { - = 500 && $6 ~ /^\/home\// { print $1 }' -} -function dump_usernames() { - array_from_lines "${1:-usernames}" "$(__dump_usernames)" -} -function __resolv_ips() { - LANG=C host "$1" 2>/dev/null | awk '/address / { gsub(/^.*address /, ""); print }' -} -function resolv_ips() { - array_from_lines "${1:-ips}" "$(__resolv_ips "$2")" -} -function __resolv_hosts() { - LANG=C host "$1" 2>/dev/null | awk '/domain name pointer / { gsub(/^.*domain name pointer /, ""); gsub(/\.$/, ""); print }' -} -function resolv_hosts() { - array_from_lines "${1:-hosts}" "$(__resolv_hosts "$2")" -} -function runscript_as() { - local OENC="$UTF8" - local user="${1:-root}"; shift - local exec_maybe= - if [ "$1" = "exec" ]; then - exec_maybe=exec - shift - fi - - local cmd - cmd="\ -__estack=$(quoted_arg "$__estack") -__tlevel=$(quoted_args "$__tlevel") -export __estack __tlevel -exec ${BASH:-/bin/sh} $(quoted_args "$@")" - - if is_yes "$UTOOLS_USES_SU" || ! progexists sudo; then - eecho "Entrez le mot de passe de root" - $exec_maybe su "$user" -c "$cmd" - else - if [ "$user" == "root" ]; then - $exec_maybe sudo -p "Entrez le mot de passe de %u: " "${BASH:-/bin/sh}" -c "$cmd" - else - $exec_maybe sudo -p "Entrez le mot de passe de %u: " su "$user" -c "$cmd" - fi - fi -} -function runscript_as_root() { - if is_root; then - local exec_maybe= - if [ "$1" = "exec" ]; then - exec_maybe=exec - shift - fi - $exec_maybe "${BASH:-/bin/sh}" "$@" - else - runscript_as root "$@" - fi -} -function run_as() { - local user="${1:-root}"; shift - local exec_maybe=exec - if [ "$1" = "--noexec" ]; then - exec_maybe= - shift - fi - - runscript_as "$user" $exec_maybe "$0" "$@" -} -function run_as_root() { - is_root || run_as root "$@" -} -function check_user() { - local user - for user in "$@"; do - [ "$USER" == "$user" ] && return 0 - done - return 1 -} -function ensure_user() { - local -a users - while [ $# -gt 0 -a "$1" != "--" ]; do - array_add users "$1" - shift - done - [ "$1" == "--" ] && shift - - if ! check_user "${users[@]}"; then - if [ ${#users[*]} -gt 1 ]; then - ewarn "Cette commande doit être lancée avec l'un des users ${users[*]}" - else - ewarn "Cette commande doit être lancée avec le user ${users[0]}" - fi - if ask_yesno "Voulez-vous tenter de relancer la commande avec le bon user?" O; then - estep "Lancement du script avec le user ${users[0]}" - run_as "${users[0]}" "$@" - return 1 - elif is_root; then - return 11 - else - return 10 - fi - fi - return 0 -} -function check_hostname() { - local userhost user host path - for userhost in "$@"; do - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - [ "$MYHOSTNAME" == "${host%%.*}" ] && return 0 - done - return 1 -} -function check_userhostname() { - local userhost path user host - for userhost in "$@"; do - if check_hostname "$userhost"; then - [[ "$userhost" == *@* ]] || return 0 - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - check_user "$user" && return 0 - fi - done - return 1 -} -UTOOLS_ENSURE_HOSTNAME_SSH_OPTS=() -function ensure_hostname() { - local -a userhosts - while [ $# -gt 0 -a "$1" != "--" ]; do - array_add userhosts "$1" - shift - done - [ "$1" == "--" ] && shift - - local userhost user host path - if ! check_hostname "${userhosts[@]}"; then - if [ ${#userhosts[*]} -gt 1 ]; then - ewarn "Cette commande n'est valide que sur l'un des hôtes ${userhosts[*]}" - else - ewarn "Cette commande n'est valide que sur l'hôte ${userhosts[0]}" - fi - - enote "Vous pouvez tenter de relancer le script sur ${userhosts[0]}, mais cela requière que ce script ET les données dont il a besoin soient installés dans la même version et dans le même répertoire sur l'hôte distant" - if ask_yesno "Voulez-vous tenter de relancer le script sur l'hôte distant?" N; then - splitfsep "${userhosts[0]}" : userhost path - splituserhost "$userhost" user host - [ -n "$user" ] || user=root - - estep "Lancement de la commande sur l'hôte distant $user@$host" - local cmd - [ -n "$path" ] && cmd="$(quoted_args cd "$path"); " - cmd="$cmd$(quoted_args "$script" "$@")" - ssh -qt "${UTOOLS_ENSURE_HOSTNAME_SSH_OPTS[@]}" "$user@$host" "$cmd" - [ $? -eq 255 ] && return 12 - return 1 - else - return 11 - fi - fi - local userhost user host - for userhost in "${userhosts[@]}"; do - [[ "$userhost" == *@* ]] || continue - if check_hostname "$userhost"; then - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - [ -n "$path" ] && cd "$path" - ensure_user "$user" -- "$@" - return $? - fi - done - return 0 -} - -__AWKDEF_FUNCTIONS=' -function quote_html(s) { - gsub(/&/, "\\&", s) - gsub(/"/, "\\"", s) - gsub(/>/, "\\>", s) - gsub(/", s) - gsub(/"/, "\"", s) - gsub(/&/, "\\&", s) - return s -} -function quote_value(s) {'" - gsub(/'/, \"'\\\\''\", s) - return \"'\" s \"'\" -"'} -function quoted_values( i, line) { - line = "" - for (i = 1; i <= NF; i++) { - if (i > 1) line = line " " - line = line quote_value($i) - } - return line -} -function quote_subrepl(s) { - gsub(/\\/, "\\\\", s) - gsub(/&/, "\\\\&", s) - return s -} -function quote_grep(s) { - gsub(/[[\\.^$*]/, "\\\\&", s) - return s -} -function quote_egrep(s) { - gsub(/[[\\.^$*+?()|{]/, "\\\\&", s) - return s -} -function quote_sql(s) {'" - gsub(/'/, \"''\", s) - return \"'\" s \"'\" -"'} -function unquote_mysqlcsv(s) { - gsub(/\\n/, "\n", s) - gsub(/\\t/, "\t", s) - gsub(/\\0/, "\0", s) - gsub(/\\\\/, "\\", s) - return s -} -function array_new(dest) { - dest[0] = 0 # forcer awk à considérer dest comme un tableau - delete dest -} -function array_newsize(dest, size, i) { - dest[0] = 0 # forcer awk à considérer dest comme un tableau - delete dest - size = int(size) - for (i = 1; i <= size; i++) { - dest[i] = "" - } -} -function array_len(values, count, i) { - count = 0 - for (i in values) { - count++ - } - return count -} -function mkindices(values, indices, i, j) { - array_new(indices) - j = 1 - for (i in values) { - indices[j++] = int(i) - } - return asort(indices) -} -function array_copy(dest, src, count, indices, i) { - array_new(dest) - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - dest[indices[i]] = src[indices[i]] - } -} -function array_getlastindex(src, count, indices) { - count = mkindices(src, indices) - if (count == 0) return 0 - return indices[count] -} -function array_add(dest, value, lastindex) { - lastindex = array_getlastindex(dest) - dest[lastindex + 1] = value -} -function array_deli(dest, i, l) { - i = int(i) - if (i == 0) return - l = array_len(dest) - while (i < l) { - dest[i] = dest[i + 1] - i++ - } - delete dest[l] -} -function array_del(dest, value, ignoreCase, i) { - do { - i = key_index(value, dest, ignoreCase) - if (i != 0) array_deli(dest, i) - } while (i != 0) -} -function array_extend(dest, src, count, lastindex, indices, i) { - lastindex = array_getlastindex(dest) - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - dest[lastindex + i] = src[indices[i]] - } -} -function array_fill(dest, i) { - array_new(dest) - for (i = 1; i <= NF; i++) { - dest[i] = $i - } -} -function array_getline(src, count, indices, i, j) { - $0 = "" - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - j = indices[i] - $j = src[j] - } -} -function array_appendline(src, count, indices, i, nf, j) { - count = mkindices(src, indices) - nf = NF - for (i = 1; i <= count; i++) { - j = nf + indices[i] - $j = src[indices[i]] - } -} -function in_array(value, values, ignoreCase, i) { - if (ignoreCase) { - value = tolower(value) - for (i in values) { - if (tolower(values[i]) == value) return 1 - } - } else { - for (i in values) { - if (values[i] == value) return 1 - } - } - return 0 -} -function key_index(value, values, ignoreCase, i) { - if (ignoreCase) { - value = tolower(value) - for (i in values) { - if (tolower(values[i]) == value) return int(i) - } - } else { - for (i in values) { - if (values[i] == value) return int(i) - } - } - return 0 -} -function array2s(values, prefix, sep, suffix, noindices, first, i, s) { - if (!prefix) prefix = "[" - if (!sep) sep = ", " - if (!suffix) suffix = "]" - s = prefix - first = 1 - for (i in values) { - if (first) first = 0 - else s = s sep - if (!noindices) s = s "[" i "]=" - s = s values[i] - } - s = s suffix - return s -} -function array2so(values, prefix, sep, suffix, noindices, count, indices, i, s) { - if (!prefix) prefix = "[" - if (!sep) sep = ", " - if (!suffix) suffix = "]" - s = prefix - count = mkindices(values, indices) - for (i = 1; i <= count; i++) { - if (i > 1) s = s sep - if (!noindices) s = s "[" indices[i] "]=" - s = s values[indices[i]] - } - s = s suffix - return s -} -function array_join(values, sep, prefix, suffix, count, indices, i, s) { - s = prefix - count = mkindices(values, indices) - for (i = 1; i <= count; i++) { - if (i > 1) s = s sep - s = s values[indices[i]] - } - s = s suffix - return s -} -function printto(s, output) { - if (output == "") { - print s - } else if (output ~ /^>>/) { - sub(/^>>/, "", output) - print s >>output - } else if (output ~ /^>/) { - sub(/^>/, "", output) - print s >output - } else { - print s >output - } -} -function find_line(input, field, value, orig, line) { - orig = $0 - line = "" - while ((getline 0) { - if ($field == value) { - line = $0 - break - } - } - close(input) - $0 = orig - return line -} -function merge_line(input, field, key, line) { - line = find_line(input, field, $key) - if (line != "") $0 = $0 FS line -} -function __csv_parse_quoted(line, destl, colsep, qchar, echar, pos, tmpl, nextc, resl) { - line = substr(line, 2) - resl = "" - while (1) { - pos = index(line, qchar) - if (pos == 0) { - resl = resl line - destl[0] = "" - destl[1] = 0 - return resl - } - if (echar != "" && pos > 1) { - prevc = substr(line, pos - 1, 1) - quotec = substr(line, pos, 1) - nextc = substr(line, pos + 1, 1) - if (prevc == echar) { - tmpl = substr(line, 1, pos - 2) - resl = resl tmpl quotec - line = substr(line, pos + 1) - continue - } - tmpl = substr(line, 1, pos - 1) - if (nextc == colsep || nextc == "") { - resl = resl tmpl - destl[0] = substr(line, pos + 2) - destl[1] = nextc == colsep - return resl - } else { - resl = resl tmpl quotec - line = substr(line, pos + 1) - } - } else { - tmpl = substr(line, 1, pos - 1) - quotec = substr(line, pos, 1) - nextc = substr(line, pos + 1, 1) - if (nextc == colsep || nextc == "") { - resl = resl tmpl - destl[0] = substr(line, pos + 2) - destl[1] = nextc == colsep - return resl - } else if (nextc == qchar) { - resl = resl tmpl quotec - line = substr(line, pos + 2) - } else { - resl = resl tmpl quotec - line = substr(line, pos + 1) - } - } - } -} -function __csv_parse_unquoted(line, destl, colsep, qchar, echar, pos) { - pos = index(line, colsep) - if (pos == 0) { - destl[0] = "" - destl[1] = 0 - return line - } else { - destl[0] = substr(line, pos + 1) - destl[1] = 1 - return substr(line, 1, pos - 1) - } -} -function __array_parsecsv(fields, line, nbfields, colsep, qchar, echar, shouldparse, destl, i) { - array_new(fields) - array_new(destl) - i = 1 - shouldparse = 0 - while (shouldparse || line != "") { - if (index(line, qchar) == 1) { - value = __csv_parse_quoted(line, destl, colsep, qchar, echar) - line = destl[0] - shouldparse = destl[1] - } else { - value = __csv_parse_unquoted(line, destl, colsep, qchar, echar) - line = destl[0] - shouldparse = destl[1] - } - fields[i] = value - i = i + 1 - } - if (nbfields) { - nbfields = int(nbfields) - i = array_len(fields) - while (i < nbfields) { - i++ - fields[i] = "" - } - } - return array_len(fields) -} -BEGIN { - DEFAULT_COLSEP = "," - DEFAULT_QCHAR = "\"" - DEFAULT_ECHAR = "" -} -function array_parsecsv2(fields, line, nbfields, colsep, qchar, echar) { - return __array_parsecsv(fields, line, nbfields, colsep, qchar, echar) -} -function array_parsecsv(fields, line, nbfields, colsep, qchar, echar) { - if (colsep == "") colsep = DEFAULT_COLSEP - if (qchar == "") qchar = DEFAULT_QCHAR - if (echar == "") echar = DEFAULT_ECHAR - return __array_parsecsv(fields, line, nbfields, colsep, qchar, echar) -} -function parsecsv(line, fields) { - array_parsecsv(fields, line) - array_getline(fields) - return NF -} -function getlinecsv(file, fields) { - if (file) { - getline 1) line = line colsep - if (qchar != "" && index(value, qchar) != 0) { - if (echar != "") gsub(qchar, quote_subrepl(echar) "&", value); - else gsub(qchar, "&&", value); - } - if (qchar != "" && (index(value, mvsep) != 0 || index(value, colsep) != 0 || index(value, qchar) != 0 || __csv_should_quote(value))) { - line = line qchar value qchar - } else { - line = line value - } - } - return line -} -function array_formatcsv(fields) { - return array_formatcsv2(fields, ",", ";", "\"", "") -} -function array_printcsv(fields, output) { - printto(array_formatcsv(fields), output) -} -function get_formatcsv( fields) { - array_fill(fields) - return array_formatcsv(fields) -} -function formatcsv() { - $0 = get_formatcsv() -} -function printcsv(output, fields) { - array_fill(fields) - array_printcsv(fields, output) -} -function array_findcsv(fields, input, field, value, nbfields, orig, found, i) { - array_new(orig) - array_fill(orig) - array_new(fields) - found = 0 - while ((getline 0) { - array_parsecsv(fields, $0, nbfields) - if (fields[field] == value) { - found = 1 - break - } - } - close(input) - array_getline(orig) - if (!found) { - delete fields - if (nbfields) { - nbfields = int(nbfields) - i = array_len(fields) - while (i < nbfields) { - i++ - fields[i] = "" - } - } - } - return found -} - -function __and(var, x, l_res, l_i) { - l_res=0; - for (l_i=0; l_i < 8; l_i++){ - if (var%2 == 1 && x%2 == 1) l_res=l_res/2 + 128; - else l_res/=2; - var=int(var/2); - x=int(x/2); - } - return l_res; -} -function __lshift(var, x) { - while(x > 0){ - var*=2; - x--; - } - return var; -} -function __rshift(var, x) { - while(x > 0){ - var=int(var/2); - x--; - } - return var; -} -BEGIN { - __BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" -} -function b64decode(src, result, base1, base2, base3, base4) { - result = "" - while (length(src) > 0) { - base1 = substr(src, 1, 1) - base2 = substr(src, 2, 1) - base3 = substr(src, 3, 1); if (base3 == "") base3 = "=" - base4 = substr(src, 4, 1); if (base4 == "") base4 = "=" - byte1 = index(__BASE64, base1) - 1 - if (byte1 < 0) byte1 = 0 - byte2 = index(__BASE64, base2) - 1 - if (byte2 < 0) byte2 = 0 - byte3 = index(__BASE64, base3) - 1 - if (byte3 < 0) byte3 = 0 - byte4 = index(__BASE64, base4) - 1 - if (byte4 < 0) byte4 = 0 - result = result sprintf( "%c", __lshift(__and(byte1, 63), 2) + __rshift(__and(byte2, 48), 4) ) - if (base3 != "=") result = result sprintf( "%c", __lshift(__and(byte2, 15), 4) + __rshift(__and(byte3, 60), 2) ) - if (base4 != "=") result = result sprintf( "%c", __lshift(__and(byte3, 3), 6) + byte4 ) - src = substr(src, 5) - } - return result -} -' -function awkdef() { - - if [ "${1:0:3}" == "-f" ]; then - shift - echo "$__AWKDEF_FUNCTIONS" - fi - if [ $# -gt 0 ]; then - local __ad_arg __ad_vpos __ad_name __ad_value - echo "BEGIN {" - while [ -n "${1:0:1}" ]; do - __ad_arg="${1:0:256}" - local __ad_array= - if [ "${__ad_arg%\[@\]}" != "$__ad_arg" ]; then - __ad_array=1 - __ad_name="${__ad_arg%\[@\]}" - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_value="$__ad_name" - elif [[ "$__ad_arg" == *\[@\]=* ]]; then - __ad_array=1 - __ad_name="${__ad_arg%%\[@\]=*}" - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_vpos=$((${#__ad_name} + 4)) - __ad_value="${1:$__ad_vpos}" - [ ${#__ad_value} -ne 0 ] || __ad_value="$__ad_name" - elif [[ "$__ad_arg" == *=* ]]; then - local __ad_int= __ad_str= - __ad_name="${__ad_arg%%=*}" - __ad_vpos=$((${#__ad_name} + 1)) - if [ "${__ad_name%:int}" != "$__ad_name" ]; then - __ad_int=1 - __ad_name="${__ad_name%:int}" - elif [ "${__ad_name%:str}" != "$__ad_name" ]; then - __ad_str=1 - __ad_name="${__ad_name%:str}" - fi - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_value="${1:$__ad_vpos}" - if [ -n "$__ad_int" ]; then - echo "$__ad_name = int($(quoted_awk "$__ad_value") + 0)" - elif [ -n "$__ad_str" ]; then - echo "$__ad_name = $(quoted_awk "$__ad_value")" - elif [ ${#__ad_value} -lt 256 ] && isnum "$__ad_value"; then - echo "$__ad_name = $__ad_value" - else - echo "$__ad_name = $(quoted_awk "$__ad_value")" - fi - else - break - fi - if [ -n "$__ad_array" ]; then - if [ "${__ad_value:0:2}" == $'<\n' ]; then - local -a __ad_values - array_from_lines __ad_values "${__ad_value:2}" - __ad_value=__ad_values - fi - __ad_value="${__ad_value}[@]" - local __ad_i=1 - echo "$__ad_name[0] = 0; delete $__ad_name" - for __ad_arg in "${!__ad_value}"; do - echo "$__ad_name[$__ad_i]=$(quoted_awk "$__ad_arg")" - __ad_i=$(($__ad_i + 1)) - done - eval "echo \"\${__ad_name}_count = \${#$__ad_value}\"" - fi - shift - done - echo "}" - for __ad_arg in "$@"; do - rawecho "$__ad_arg" - done - fi -} -function lawkrun() { - local -a __ar_defs __ar_args - while [ $# -gt 0 -a "$1" != "--" ]; do - __ar_defs=("${__ar_defs[@]}" "$1") - shift - done - shift - while [ $# -gt 0 ]; do - __ar_args=("${__ar_args[@]}" "$1") - shift - done - local __ar_script="$(awkdef "${__ar_defs[@]}")" - awk "$__ar_script" "${__ar_args[@]}" -} -function cawkrun() { LANG=C lawkrun "$@"; } -function awkrun() { LANG=C lawkrun "$@"; } - -function __lf_get_age() { - local y=$(date "+%Y") - local dy=$(date "+%j"); while [ "${dy#0}" != "$dy" ]; do dy="${dy#0}"; done - [ -n "$dy" ] || dy=0 - local h=$(date "+%H"); while [ "${h#0}" != "$h" ]; do h="${h#0}"; done - [ -n "$h" ] || h=0 - echo $((($y * 365 + $dy) * 24 + $h)) -} -function lf_trylock() { - local eoo lockfile max_hours=4 - while [ -n "$1" ]; do - case "$1" in - -h) shift; max_hours="$1";; - --) shift; eoo=1;; - *) eoo=1;; - esac - [ -n "$eoo" ] && break - shift - done - - lockfile="$1" - [ -n "$lockfile" ] || die "il faut spécifier un fichier pour le verrou" - - local now="$(__lf_get_age)" - if (set -C; echo "$now" >"$lockfile") 2>/dev/null; then - return 0 - fi - local prev diff - if prev="$(<"$lockfile")"; then - diff="$(($now - $prev))" - if [ "$diff" -gt "$max_hours" ]; then - echo stale - else - echo locked - fi - elif [ -f "$lockfile" ]; then - echo retry - fi - return 1 -} -function pidfile_set() { - local eoo pidfile pid=$$ replace= - while [ -n "$1" ]; do - case "$1" in - -p) - shift - pid="$1" - ;; - -r) - replace=1 - ;; - --) - shift - eoo=1 - ;; - *) - eoo=1 - ;; - esac - [ -n "$eoo" ] && break - shift - done - - pidfile="$1" - [ -n "$pidfile" ] || return 10 - - if [ -f "$pidfile" ]; then - local curpid="$(<"$pidfile")" - if is_running "$curpid"; then - return 1 - elif [ -n "$replace" ]; then - /bin/rm -f "$pidfile" || return 10 - else - return 2 - fi - fi - - echo_ "$pid" >"$pidfile" || return 10 - autoclean "$pidfile" - return 0 -} -function pidfile_check() { - local pidfile="$1" - [ -n "$pidfile" ] || return 10 - - if [ -f "$pidfile" ]; then - [ -r "$pidfile" ] || return 10 - local pid="$(<"$pidfile")" - is_running "$pid" && return 0 - fi - return 1 -} -function page_maybe() { - if isatty; then - less -XF "$@" - else - cat - fi -} - - -function utools_local() { - local arg - [ $# -gt 0 ] || set -- opts verbosity interaction - for arg in "$@"; do - case "$arg" in - parse_opts|opts|o|args) echo "local -a args";; - verbosity|v) echo "local __verbosity='$__verbosity'";; - interaction|i) echo "local __interaction='$__interaction'";; - esac - done -} - -function isatty() { - tty -s <&1 -} -function in_isatty() { - tty -s -} -function out_isatty() { - tty -s <&1 -} -function err_isatty() { - tty -s <&2 -} -function die() { [ $# -gt 0 ] && eerror "$@"; exit 1; } -function exit_with { if [ $# -gt 0 ]; then "$@"; fi; exit $?; } -function die_with { [ $# -gt 0 ] && eerror "$1"; shift; [ $# -gt 0 ] && "$@"; exit 1; } -function die_unless() { - local count=$# - if [ $count -eq 0 ]; then - exit 1 - elif [ $count -eq 1 ]; then - "$@" || exit $? - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - : - else - r=$? - eerror "$m" - exit $r - fi - fi -} -function eerror_unless() { - local count=$# - if [ $count -eq 0 ]; then - return 1 - elif [ $count -eq 1 ]; then - "$@" || return $? - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - : - else - r=$? - eerror "$m" - return $r - fi - fi -} -function die_if() { - local count=$# - if [ $count -eq 0 ]; then - : - elif [ $count -eq 1 ]; then - "$@" && exit 1 - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - eerror "$m" - exit 1 - fi - fi -} -function eerror_if() { - local count=$# - if [ $count -eq 0 ]; then - : - elif [ $count -eq 1 ]; then - "$@" && return 1 - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - eerror "$m" - return 1 - fi - fi -} - -TAB=$'\t' -LATIN1=iso-8859-1 -LATIN9=iso-8859-15 -UTF8=utf-8 -OENC="$UTF8" - -if ! progexists iconv; then - function iconv() { cat; } -fi - -function __lang_encoding() { - local lang="$(<<<"$LANG" awk '{ print tolower($0) }')" - case "$lang" in - *@euro) echo "iso-8859-15";; - *.utf-8|*.utf8) echo "utf-8";; - *) echo "iso-8859-1";; - esac -} -function __norm_encoding() { - awk '{ - enc = tolower($0) - gsub(/^latin$/, "latin1", enc) - gsub(/^latin1$/, "iso-8859-1", enc) - gsub(/^latin9$/, "iso-8859-15", enc) - gsub(/[-_]/, "", enc) - if (enc == "iso8859" || enc == "iso88591" || enc == "8859" || enc == "88591") print "iso-8859-1" - else if (enc == "iso885915" || enc == "885915") print "iso-8859-15" - else if (enc == "utf" || enc == "utf8") print "utf-8" - else print $0 - }' <<<"$1" -} -function __init_encoding() { - local DEFAULT_ENCODING="$(__lang_encoding)" - [ -n "$DEFAULT_ENCODING" ] || DEFAULT_ENCODING=utf-8 - [ -n "$UTOOLS_OUTPUT_ENCODING" ] || UTOOLS_OUTPUT_ENCODING="$DEFAULT_ENCODING" - UTOOLS_OUTPUT_ENCODING="$(__norm_encoding "$UTOOLS_OUTPUT_ENCODING")" - [ -n "$UTOOLS_INPUT_ENCODING" ] || UTOOLS_INPUT_ENCODING="$UTOOLS_OUTPUT_ENCODING" - UTOOLS_INPUT_ENCODING="$(__norm_encoding "$UTOOLS_INPUT_ENCODING")" - [ -n "$UTOOLS_EDITOR_ENCODING" ] || UTOOLS_EDITOR_ENCODING="$UTOOLS_INPUT_ENCODING" - UTOOLS_EDITOR_ENCODING="$(__norm_encoding "$UTOOLS_EDITOR_ENCODING")" - - IENC="$UTOOLS_INPUT_ENCODING" - OENC="$UTOOLS_OUTPUT_ENCODING" -} - -if [ -n "$UTOOLS_LANG" -a -z "$LANG" ]; then - export UTOOLS_LANG - export LANG="$UTOOLS_LANG" -fi -__init_encoding - -function tooenc() { - local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - rawecho "$src" - else - iconv -f "$from" -t "$to" <<<"$src" - fi -} -function uecho() { - tooenc "$*" -} -function tooenc_() { - local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - rawecho_ "$src" - else - rawecho_ "$src" | iconv -f "$from" -t "$to" - fi -} -function uecho_() { - tooenc_ "$*" -} -function toienc() { - local __tie_var="$1" __tie_to="${2:-$IENC}" __tie_from="${3:-$UTOOLS_INPUT_ENCODING}" - if [ "$__tie_from" != "$__tie_to" ]; then - set_var "$__tie_var" "$(iconv -f "$__tie_from" -t "$__tie_to" <<<"${!__tie_var}")" - fi -} -function uread() { - [ $# -gt 0 ] || set -- REPLY - local __r_var - read "$@" - for __r_var in "$@"; do - [ -z "$__r_var" -o "${__r_var:0:1}" == "-" ] && continue # ignorer les options - toienc "$__r_var" - done -} - -function stooenc() { - local from="${1:-$OENC}" to="${2:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - cat - else - iconv -f "$from" -t "$to" - fi -} -function stoienc() { - local to="${1:-$IENC}" from="${2:-$UTOOLS_INPUT_ENCODING}" - if [ "$from" == "$to" ]; then - cat - else - iconv -f "$from" -t "$to" - fi -} - -export UTOOLS_EDATE -function __edate() { [ -n "$UTOOLS_EDATE" ] && date +"[%d/%m/%Y-%H:%M:%S] "; } - -export UTOOLS_ELOG_OVERWRITE -function __set_no_colors() { :; } -function elogto() { - UTOOLS_EDATE=1 - if [ -n "$1" -a -n "$2" ]; then - LANG=fr_FR.UTF8 - UTOOLS_OUTPUT_ENCODING="$UTF8" - __set_no_colors 1 - if [ -n "$UTOOLS_ELOG_OVERWRITE" ]; then - exec >"$1" 2>"$2" - else - exec >>"$1" 2>>"$2" - fi - elif [ -n "$1" ]; then - LANG=fr_FR.UTF8 - UTOOLS_OUTPUT_ENCODING="$UTF8" - __set_no_colors 1 - if [ -n "$UTOOLS_ELOG_OVERWRITE" ]; then - exec >"$1" 2>&1 - else - exec >>"$1" 2>&1 - fi - fi -} - -export __estack __tlevel -function __indent() { - if [ "${1/ -/}" != "$1" ]; then - sed "2,\$s/^/${__tlevel}/g" <<<"$1" - else - rawecho "$1" - fi -} -function __eerror() { tooenc "$(__edate)${__tlevel}* error: $(__indent "$1")"; } -function __ewarn() { tooenc "$(__edate)${__tlevel}* warning: $(__indent "$1")"; } -function __enote() { tooenc "$(__edate)${__tlevel}* note: $(__indent "$1")"; } -function __ebanner() { - local maxi="${COLUMNS:-80}" - local -a lines - local psfix line - - psfix="$(__edate)${__tlevel}" - while [ ${#psfix} -lt $maxi ]; do psfix="$psfix="; done - - tooenc "$psfix" - maxi=$(($maxi - 1)) - array_from_xlines lines "$1" - for line in "" "${lines[@]}" ""; do - line="$(__edate)${__tlevel}= $line" - if [ ${#line} -le $maxi ]; then - while [ ${#line} -lt $maxi ]; do line="$line "; done - line="$line=" - fi - tooenc "$line" - done - tooenc "$psfix" -} -function __eimportant() { tooenc "$(__edate)${__tlevel}* important: $(__indent "$1")"; } -function __eattention() { tooenc "$(__edate)${__tlevel}* attention: $(__indent "$1")"; } -function __einfo() { tooenc "$(__edate)${__tlevel}* info: $(__indent "$1")"; } -function __eecho() { tooenc "$(__edate)${__tlevel}$(__indent "$1")"; } -function __eecho_() { tooenc_ "$(__edate)${__tlevel}$(__indent "$1")"; } -function __edebug() { tooenc "$(__edate)${__tlevel}* debug: $(__indent "$1")"; } -function __estep() { tooenc "$(__edate)${__tlevel}* $(__indent "$1")"; } -function __estepe() { __estep "$@"; } -function __estepw() { __estep "$@"; } -function __estepn() { __estep "$@"; } -function __estepi() { __estep "$@"; } -function __estep_() { tooenc_ "$(__edate)${__tlevel}* $(__indent "$1")"; } -function __estepe_() { __estep_ "$@"; } -function __estepw_() { __estep_ "$@"; } -function __estepn_() { __estep_ "$@"; } -function __estepi_() { __estep_ "$@"; } -function __etitle() { tooenc "$(__edate)${__tlevel}+++ $(__indent "$1")"; } -function __ebegin() { tooenc_ "$(__edate)${__tlevel}* $(__indent "$1"): "; } -function __edoto() { echo_ "."; } -function __edotw() { echo_ "w"; } -function __edotx() { echo_ "x"; } -function __edotp() { echo_ "+"; } -function __edotd() { tooenc "($1)"; } -function __eendo() { echo "[ok]"; } -function __eendx() { echo "[error]"; } -PRETTYOPTS=() -function set_verbosity() { :;} -function set_interaction() { :;} -function show_error() { - return 0 -} -function show_warn() { - return 0 -} -function show_info() { - return 0 -} -function show_verbose() { - return 0 -} -function show_debug() { - [ -n "$DEBUG" ] -} -function check_verbosity() { - return 0 -} -function get_verbosity_option() { :;} -function check_interaction() { - return 0 -} -function is_interaction() { - return 1 -} -function get_interaction_option() { :;} -__epending= -function eflush() { - if [ -n "$__epending" ]; then rawecho "$__epending" 1>&2; __epending=; fi -} -function eclearp() { - __epending= -} -function eerror() { - show_error || return; eflush; __eerror "$*" 1>&2 -} -function ewarn() { - show_warn || return; eflush; __ewarn "$*" 1>&2 -} -function enote() { - show_info || return; eflush; __enote "$*" 1>&2 -} -function ebanner() { - show_error || return; eflush; __ebanner "$*" 1>&2; sleep 5 -} -function eimportant() { - show_error || return; eflush; __eimportant "$*" 1>&2 -} -function eattention() { - show_warn || return; eflush; __eattention "$*" 1>&2 -} -function einfo() { - show_info || return; eflush; __einfo "$*" 1>&2 -} -function eecho() { - show_info || return; eflush; __eecho "$*" 1>&2 -} -function eecho_() { - show_info || return; eflush; __eecho_ "$*" 1>&2 -} -function edebug() { - show_debug || return; eflush; __edebug "$*" 1>&2 -} -function trace() { - local r cmd="$(quoted_args "$@")" - show_info && { eflush; __eecho "\$ $cmd" 1>&2; } - "$@"; r=$? - if [ $r -ne 0 ]; then - if show_info; then - eflush; __eecho "^ [EC #$r]" 1>&2 - elif show_error; then - eflush; __eecho "^ $cmd [EC #$r]" 1>&2; - fi - fi - return $r -} -function trace_error() { - local r - "$@"; r=$? - if [ $r -ne 0 ]; then - local cmd="$(quoted_args "$@")" - show_error && { eflush; __eecho "^ $cmd [EC #$r]" 1>&2; } - fi - return $r -} - -function etitle() { - local __t_deferred= - __t_etitle "$@" -} -function etitled() { - local __t_deferred=1 - __t_etitle "$@" -} -function __t_etitle() { - local __t_eend=default - local __t_clearp= - while [ -n "$1" ]; do - if [ "$1" == "--" ]; then - shift - break - elif [ "$1" == "-s" ]; then - __t_eend= - shift - elif [ "$1" == "--eend" ]; then - __t_eend=1 - shift - elif [ "$1" == "-p" ]; then - __t_clearp=1 - shift - else - break - fi - done - local __t_title="$1"; shift - local __t_s=0 - [ -n "$__estack" ] && __tlevel="${__tlevel} " - __estack="$__estack:t" - if show_info; then - if [ -n "$__t_deferred" ]; then - __epending="${__epending:+$__epending -}$(__etitle "$__t_title")" - else - eflush - __etitle "$__t_title" 1>&2 - fi - fi - if [ $# -gt 0 ]; then - "$@" - __t_s=$? - [ "$__t_eend" == "default" ] && __t_eend=1 - fi - [ "$__t_eend" == "default" ] && __t_eend= - if [ -n "$__t_eend" ]; then - eend $__t_s - [ -n "$__t_clearp" ] && eclearp - fi - return $__t_s -} -function estep() { - show_info || return; eflush; __estep "$*" 1>&2 -} -function estepe() { - show_info || return; eflush; __estepe "$*" 1>&2 -} -function estepw() { - show_info || return; eflush; __estepw "$*" 1>&2 -} -function estepn() { - show_info || return; eflush; __estepn "$*" 1>&2 -} -function estepi() { - show_info || return; eflush; __estepi "$*" 1>&2 -} -function estep_() { - show_info || return; eflush; __estep_ "$*" 1>&2 -} -function estepe_() { - show_info || return; eflush; __estepe_ "$*" 1>&2 -} -function estepw_() { - show_info || return; eflush; __estepw_ "$*" 1>&2 -} -function estepn_() { - show_info || return; eflush; __estepn_ "$*" 1>&2 -} -function estepi_() { - show_info || return; eflush; __estepi_ "$*" 1>&2 -} -function ebegin() { - local __b_eend=default - while [ -n "$1" ]; do - if [ "$1" == "--" ]; then - shift - break - elif [ "$1" == "-s" ]; then - __b_eend= - shift - elif [ "$1" == "--eend" ]; then - __b_eend=1 - shift - else - break - fi - done - local __b_msg="$1"; shift - local __b_s=0 - __estack="$__estack:b" - if show_info; then - eflush - __ebegin "$__b_msg" 1>&2 - fi - if [ $# -gt 0 ]; then - "$@" - __b_s=$? - [ "$__b_eend" == "default" ] && __b_eend=1 - fi - [ "$__b_eend" == "default" ] && __b_eend= - [ -n "$__b_eend" ] && eend $__b_s - return $__b_s -} -function edot() { - local s=$? - show_info || return - eflush - [ -n "$1" ] && s="$1" - shift - if [ "$s" == "0" ]; then - __edoto 1>&2 - else - __edotx 1>&2 - fi - show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2 - return $s -} -function edotw() { - local s=$? - show_info || return - eflush - [ -n "$1" ] && s="$1" - shift - __edotw 1>&2 - show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2 - return $s -} -function ewait() { - [ -n "$1" ] || return 1 - if show_info; then - local count=2 - eflush - little_sleep # certains processus retournent tout de suite - while is_running "$1"; do - sleep 1 - if [ $count -gt 0 ]; then - count=$(($count - 1)) - else - __edotp 1>&2 - fi - done - __edoto 1>&2 - else - wait "$1" - fi -} -function eend() { - local s=$? - if [ "$1" == "-c" ]; then - __estack= - __tlevel= - elif [ "${__estack%:b}" != "$__estack" ]; then - __estack="${__estack%:b}" - show_info || return - eflush - [ -n "$1" ] && s="$1" - if [ "$s" == "0" ]; then - __eendo 1>&2 - else - __eendx 1>&2 - fi - elif [ "${__estack%:t}" != "$__estack" ]; then - __estack="${__estack%:t}" - __tlevel="${__tlevel% }" - fi -} -function ask_yesno() { - local interactive=1 - if [[ "$1" == -* ]]; then - if [ "$1" != -- ]; then - check_interaction "$1" || interactive= - fi - shift - else - check_interaction -c || interactive= - fi - local default="${2:-N}" - if [ "$default" == "C" ]; then - [ -n "$interactive" ] && default=N || default=O - elif [ "$default" == "X" ]; then - [ -n "$interactive" ] && default=O || default=N - fi - if [ -n "$interactive" ]; then - eflush - local message="$1" - local prompt="[oN]" - local r - is_yes "$default" && prompt="[On]" - if [ -n "$message" ]; then - tooenc_ "$message" 1>&2 - else - tooenc_ "Voulez-vous continuer?" "$UTF8" 1>&2 - fi - tooenc_ " $prompt " "$UTF8" 1>&2 - uread r - is_yes "${r:-$default}" - else - is_yes "$default" - fi -} -function read_value() { - local -a __rv_opts __rv_readline=1 __rv_showdef=1 __rv_nl= - __rv_opts=() - [ -n "$UTOOLS_NO_READLINE" ] && __rv_readline= - __rv_read "$@" -} -function read_password() { - local -a __rv_opts __rv_readline= __rv_showdef= __rv_nl=1 - __rv_opts=(-s) - __rv_read "$@" -} -function __rv_read() { - local __rv_int=1 - if [[ "$1" == -* ]]; then - if [ "$1" != -- ]; then - check_interaction "$1" || __rv_int= - fi - shift - else - check_interaction -c || __rv_int= - fi - local __rv_msg="$1" __rv_v="${2:-value}" __rv_d="$3" __rv_re="${4:-O}" - if [ -z "$__rv_int" ]; then - if is_yes "$__rv_re" && [ -z "$__rv_d" ]; then - OENC="$UTF8" eerror "La valeur par défaut de $__rv_v doit être non vide" - return 1 - fi - set_var "$__rv_v" "$__rv_d" - return 0 - fi - - eflush - local __rv_r - while true; do - if [ -n "$__rv_msg" ]; then - tooenc_ "$__rv_msg" 1>&2 - else - tooenc_ "Entrez la valeur" "$UTF8" 1>&2 - fi - if [ -n "$__rv_readline" ]; then - tooenc_ ": " "$UTF8" 1>&2 - uread -e ${__rv_d:+-i"$__rv_d"} "${__rv_opts[@]}" __rv_r - else - if [ -n "$__rv_d" ]; then - if [ -n "$__rv_showdef" ]; then - tooenc_ " [$__rv_d]" 1>&2 - else - tooenc_ " [****]" 1>&2 - fi - fi - tooenc_ ": " "$UTF8" 1>&2 - uread "${__rv_opts[@]}" __rv_r - [ -n "$__rv_nl" ] && echo - fi - __rv_r="${__rv_r:-$__rv_d}" - if [ -n "$__rv_r" ] || ! is_yes "$__rv_re"; then - set_var "$__rv_v" "$__rv_r" - return 0 - fi - done -} -function simple_menu() { - local __sm_title= __sm_yourchoice= __sm_default= - local -a __sm_args - parse_opts -t: __sm_title= -m: __sm_yourchoice= -d: __sm_default= @ __sm_args -- "$@" && - set -- "${__sm_args[@]}" || ewarn "$__sm_args" - - local __sm_option_var="${1:-option}" __sm_options_var="${2:-options}" - local __sm_option __sm_options - __sm_options="$__sm_options_var[*]" - if [ -z "${!__sm_options}" ]; then - OENC="$UTF8" eerror "Le tableau $__sm_options_var doit être non vide" - return 1 - fi - [ -z "$__sm_default" ] && __sm_default="${!__sm_option_var}" - - eflush - array_copy __sm_options "$__sm_options_var" - local __sm_c=0 __sm_i __sm_choice - while true; do - if [ "$__sm_c" == "0" ]; then - [ -n "$__sm_title" ] && tooenc "=== $__sm_title ===" 1>&2 - __sm_i=1 - for __sm_option in "${__sm_options[@]}"; do - if [ "$__sm_option" == "$__sm_default" ]; then - tooenc "$__sm_i*- $__sm_option" 1>&2 - else - tooenc "$__sm_i - $__sm_option" 1>&2 - fi - let __sm_i=$__sm_i+1 - done - fi - - if [ -n "$__sm_yourchoice" ]; then - tooenc_ "$__sm_yourchoice" 1>&2 - else - tooenc_ "Entrez le numéro de l'option choisie" "$UTF8" 1>&2 - fi - tooenc_ ": " "$UTF8" 1>&2 - uread __sm_choice - - if [ -z "$__sm_choice" -a -n "$__sm_default" ]; then - __sm_option="$__sm_default" - break - fi - if [ -n "$__sm_choice" -a -z "${__sm_choice//[0-9]/}" ]; then - if [ "$__sm_choice" -gt 0 -a "$__sm_choice" -le "${#__sm_options[*]}" ]; then - __sm_option="${__sm_options[$(($__sm_choice - 1))]}" - break - else - OENC="$UTF8" eerror "Numéro d'option incorrect" - fi - else - OENC="$UTF8" eerror "Vous devez saisir le numéro de l'option choisie" - fi - - let __sm_c=$__sm_c+1 - if [ "$__sm_c" -eq 5 ]; then - tooenc "" "$UTF8" 1>&2 - __sm_c=0 - fi - done - set_var "$__sm_option_var" "$__sm_option" -} - -function actions_menu() { - local -a __am_action_descs __am_options __am_void_actions - local __am_tmp __am_select_action __am_select_option __am_title __am_optyc __am_actyc - local __am_default_action=auto __am_quit_action=auto - local __am_default_option= - local -a __am_args - parse_opts \ - -t: __am_title= \ - -m: __am_optyc= \ - -M: __am_actyc= \ - -e: __am_void_actions \ - -d: __am_default_action= \ - -q: __am_quit_action= \ - -o: __am_default_option= \ - @ __am_args -- "$@" && set -- "${__am_args[@]}" || { eerror "$__am_args"; return 1; } - - __am_tmp="${1:-action}"; __am_select_action="${!__am_tmp}" - __am_tmp="${2:-option}"; __am_select_option="${!__am_tmp}" - [ -n "$__am_default_option" ] && __am_select_option="$__am_default_option" - array_copy __am_action_descs "${3:-actions}" - array_copy __am_options "${4:-options}" - - eerror_unless [ ${#__am_action_descs[*]} -gt 0 ] "Vous devez spécifier le tableau des actions" || return - __actions_menu || return 1 - setv "${1:-action}" "$__am_select_action" - setv "${2:-option}" "$__am_select_option" -} -function __actions_menu() { - local title="$__am_title" - local optyc="$__am_optyc" actyc="$__am_actyc" - local default_action="$__am_default_action" - local quit_action="$__am_quit_action" - local select_action="$__am_select_action" - local select_option="$__am_select_option" - local -a action_descs options void_actions - array_copy action_descs __am_action_descs - array_copy options __am_options - array_copy void_actions __am_void_actions - - local no_options - array_isempty options && no_options=1 - - local -a actions - local tmp action name - for tmp in "${action_descs[@]}"; do - splitfsep2 "$tmp" : action name - [ -n "$action" ] || action="${name:0:1}" - action="$(strlower "$action")" - array_addu actions "$action" - done - - if [ "$default_action" == auto ]; then - default_action="$select_action" - if [ -n "$default_action" ]; then - array_contains actions "$default_action" || default_action= - fi - [ -n "$default_action" ] || default_action="${actions[0]}" - fi - default_action="${default_action:0:1}" - default_action="$(strlower "$default_action")" - - if [ "$quit_action" == auto ]; then - if [ ${#actions[*]} -gt 1 ]; then - quit_action="${actions[@]:$((-1)):1}" - array_addu void_actions "$quit_action" - fi - fi - quit_action="${quit_action:0:1}" - quit_action="$(strlower "$quit_action")" - - local action_title - for tmp in "${action_descs[@]}"; do - splitfsep2 "$tmp" : action name - [ -n "$action" ] || action="${name:0:1}" - [ -n "$name" ] || name="$action" - action="$(strlower "$action")" - if [ -n "$no_options" ]; then - if ! array_contains void_actions "$action"; then - array_del actions "$action" - continue - fi - fi - [ "$action" == "$default_action" ] && name="$name*" - action_title="${action_title:+$action_title/}$name" - done - if [ -n "$default_action" ]; then - array_contains actions "$default_action" || default_action= - fi - if [ -n "$quit_action" ]; then - array_contains actions "$quit_action" || quit_action= - fi - - if [ -n "$no_options" ]; then - if array_isempty void_actions; then - eerror "Aucune option n'est définie. Il faut définir le tableau des actions vides" - return 1 - fi - __void_actions_menu - else - __options_actions_menu - fi -} -function __void_actions_menu() { - eflush - local c=0 choice - while true; do - if [ $c -eq 0 ]; then - [ -n "$title" ] && __etitle "$title" 1>&2 - __eecho_ "=== Actions disponibles: " 1>&2 - tooenc "$action_title" 1>&2 - fi - if [ -n "$actyc" ]; then - __eecho_ "$actyc" 1>&2 - elif [ -n "$optyc" ]; then - __eecho_ "$optyc" 1>&2 - else - __eecho_ "Entrez l'action à effectuer" 1>&2 - fi - tooenc_ ": " 1>&2 - uread choice - if [ -z "$choice" -a -n "$default_action" ]; then - select_action="$default_action" - break - fi - - choice="${choice:0:1}" - choice="$(strlower "$choice")" - if array_contains actions "$choice"; then - select_action="$choice" - break - elif [ -n "$choice" ]; then - eerror "$choice: action incorrecte" - else - eerror "vous devez saisir l'action à effectuer" - fi - let c=$c+1 - if [ $c -eq 5 ]; then - tooenc "" 1>&2 - c=0 - fi - done - __am_select_action="$select_action" - __am_select_option= -} -function __options_actions_menu() { - eflush - local c=0 option choice action option - while true; do - if [ $c -eq 0 ]; then - [ -n "$title" ] && __etitle "$title" 1>&2 - i=1 - for option in "${options[@]}"; do - if [ "$option" == "$select_option" ]; then - tooenc "$i*- $option" 1>&2 - else - tooenc "$i - $option" 1>&2 - fi - let i=$i+1 - done - __estepn_ "Actions disponibles: " 1>&2 - tooenc "$action_title" 1>&2 - fi - if [ -n "$optyc" ]; then - __eecho_ "$optyc" 1>&2 - else - __eecho_ "Entrez l'action et le numéro de l'option choisie" 1>&2 - fi - tooenc_ ": " 1>&2 - uread choice - - if [ -z "$choice" -a -n "$default_action" ]; then - action="$default_action" - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - elif [ -n "$select_option" ]; then - select_action="$action" - break - fi - fi - action="${choice:0:1}" - action="$(strlower "$action")" - if array_contains actions "$action"; then - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - else - option="${choice:1}" - option="${option// /}" - if [ -z "$option" -a -n "$select_option" ]; then - select_action="$action" - break - elif [ -z "$option" ]; then - eerror "vous devez saisir le numéro de l'option" - elif isnum "$option"; then - if [ $option -gt 0 -a $option -le ${#options[*]} ]; then - select_action="$action" - select_option="${options[$(($option - 1))]}" - break - fi - else - eerror "$option: numéro d'option incorrecte" - fi - fi - elif isnum "$choice"; then - action="$default_action" - if [ -n "$action" ]; then - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - else - option="${choice// /}" - if [ -z "$option" ]; then - eerror "vous devez saisir le numéro de l'option" - elif isnum "$option"; then - if [ $option -gt 0 -a $option -le ${#options[*]} ]; then - select_action="$action" - select_option="${options[$(($option - 1))]}" - break - fi - else - eerror "$option: numéro d'option incorrecte" - fi - fi - else - eerror "Vous devez spécifier l'action à effectuer" - fi - elif [ -n "$choice" ]; then - eerror "$choice: action et/ou option incorrecte" - else - eerror "vous devez saisir l'action à effectuer" - fi - let c=$c+1 - if [ $c -eq 5 ]; then - tooenc "" 1>&2 - c=0 - fi - done - __am_select_action="$select_action" - __am_select_option="$select_option" -} - - -function __ac_forgetall() { __ac_files=(); } -__ac_forgetall -function __ac_trap() { - local file - for file in "${__ac_files[@]}"; do - [ -e "$file" ] && rm -rf "$file" 2>/dev/null - done - __ac_forgetall -} -trap __ac_trap 1 3 15 EXIT -function autoclean() { - local file - for file in "$@"; do - [ -n "$file" ] && array_add __ac_files "$file" - done -} -function ac_cleanall() { - __ac_trap -} -function ac_clean() { - local file - for file in "$@"; do - if array_contains __ac_files "$file"; then - [ -e "$file" ] && rm -rf "$file" 2>/dev/null - array_del __ac_files "$file" - fi - done -} -function ac_set_tmpfile() { - local __acst_d - if show_debug; then - if [ -n "$5" ]; then - is_yes "${!5}" && __acst_d=1 - else - __acst_d=1 - fi - fi - if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" - [ -f "$3" -a "$4" == keep ] || >"$3" - else - local __acst_t="$(mktempf "$2")" - autoclean "$__acst_t" - set_var "$1" "$__acst_t" - fi -} -function ac_set_tmpdir() { - local __acst_d - if show_debug; then - if [ -n "$4" ]; then - is_yes "${!4}" && __acst_d=1 - else - __acst_d=1 - fi - fi - if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" - mkdir -p "$3" - else - local __acst_t="$(mktempd "$2")" - autoclean "$__acst_t" - set_var "$1" "$__acst_t" - fi -} -function debug_tee() { - if show_debug; then - tee "$@" - else - cat - fi -} - - -function get_defaults_files() { - local __gd_dest="${1:-defaults}"; shift - local -a __gd_fs - local __gd_f __gd_found - for __gd_f in "$@"; do - __gd_found= - if [ -r "/etc/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "/etc/default/$__gd_f") - __gd_found=1 - fi - if [ -r "$HOME/etc/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "$HOME/etc/default/$__gd_f") - __gd_found=1 - fi - if [ -z "$__gd_found" -a -r "$scriptdir/lib/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "$scriptdir/lib/default/$__gd_f") - fi - done - array_copy "$__gd_dest" __gd_fs -} - -function set_defaults() { - local -a __sd_fs - local __sd_f - get_defaults_files __sd_fs "$@" - for __sd_f in "${__sd_fs[@]}"; do - source "$__sd_f" - done -} - - -: "${MYHOST:=$HOSTNAME}" -: "${MYHOSTNAME:=${MYHOST%%.*}}" -export MYHOST MYHOSTNAME - -function myhost() { - hostname -f 2>/dev/null || echo "$MYHOST" -} -function myhostname() { - hostname -s 2>/dev/null || echo "$MYHOSTNAME" -} -##@inc]base -uprovide base.tools -urequire base - -function base_umove() { - local -a args - local updatedir - args=(-d:,--updatedir: .) - parse_args_check "$@" || return; set -- "${args[@]}" - - eerror_unless [ -z "$updatedir" -o -d "$updatedir" ] "$updatedir: doit être un répertoire" || return - eerror_if [ $# -eq 0 ] "Vous devez spécifier les fichiers à déplacer" || return - eerror_if [ $# -eq 1 ] "Vous devez spécifier la destination" || return - - local -a srcs - local dest - - srcs=("$@") - setx dest=last_value srcs - array_del_last srcs - - if [ $# -eq 2 ]; then - if [ -d "$dest" ]; then - : # ce cas sera traité ci-dessous - elif [ -e "$dest" ]; then - eerror "$dest: refus d'écraser la destination" - return 1 - else - src="${srcs[0]}" - if [ -n "$updatedir" ]; then - if [ -L "$src" ]; then - ldest="$(readlinka "$src")" - array_find_links update_links "$ldest" "$updatedir" - else - array_find_links update_links "$src" "$updatedir" - fi - move_file "$src" "$dest" "${update_links[@]}" - else - move_link "$src" "$dest" - fi - return $? - fi - fi - - [ -d "$dest" ] || { - eerror "$dest: doit être un répertoire" - return 1 - } - for src in "${srcs[@]}"; do - if [ -n "$updatedir" ]; then - if [ -L "$src" ]; then - move_link "$src" "$dest" - else - array_find_links update_links "$src" "$updatedir" - move_file "$src" "$dest" "${update_links[@]}" - fi - else - move_link "$src" "$dest" - fi - done -} -##@inc]base.tools -##@inc[base.compat -## Fonctions de base: support des fonctions obsolètes et des versions de bash < 4.x -##@inc[base.core -## Fonctions de base: fondement -uprovide base.core - -function echo_() { - echo -n "$*" -} -function recho() { - if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - - local first="${1:1}"; shift - echo "$first$@" - else - echo "$@" - fi -} -function recho_() { - if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - - local first="${1:1}"; shift - echo -n "$first$@" - else - echo -n "$@" - fi -} -function _qval() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s//\$/\\\$}" - s="${s//\`/\\\`}" - recho_ "$s" -} -function should_quote() { - local l="${#1}" - [ $l -eq 0 -o $l -gt 80 ] && return 0 - local s="${*//[a-zA-Z0-9]/}" - s="${s//,/}" - s="${s//./}" - s="${s//+/}" - s="${s//\//}" - s="${s//-/}" - s="${s//_/}" - s="${s//=/}" - [ -n "$s" ] -} -function qval() { - echo -n \" - _qval "$@" - echo \" -} -function qvalm() { - if should_quote "$*"; then - echo -n \" - _qval "$@" - echo \" - else - recho "$*" - fi -} -function qvalr() { - if [ -z "$*" ]; then - : - elif should_quote "$*"; then - echo -n \" - _qval "$@" - echo \" - else - recho "$*" - fi -} -function qvals() { - local arg first=1 - for arg in "$@"; do - [ -z "$first" ] && echo -n " " - if should_quote "$arg"; then - echo -n \" - _qval "$arg" - echo -n \" - else - recho_ "$arg" - fi - first= - done - [ -z "$first" ] && echo -} -function qwc() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s//\$/\\\$}" - s="${s//\`/\\\`}" - local r a b - while [ -n "$s" ]; do - if [[ "$s" == *\** ]]; then - if [[ "$s" == *\?* ]]; then - a="${s%%\**}" - b="${s%%\?*}" - if [ ${#a} -lt ${#b} ]; then - s="${s#*\*}" - r="$r\"$a\"*" - else - s="${s#*\?}" - r="$r\"$b\"?" - fi - else - a="${s%%\**}" - s="${s#*\*}" - r="$r\"$a\"*" - fi - elif [[ "$s" == *\?* ]]; then - if [[ "$s" == *\** ]]; then - a="${s%%\**}" - b="${s%%\?*}" - if [ ${#a} -lt ${#b} ]; then - s="${s#*\*}" - r="$r\"$a\"*" - else - s="${s#*\?}" - r="$r\"$b\"?" - fi - else - a="${s%%\?*}" - s="${s#*\?}" - r="$r\"$a\"?" - fi - else - r="$r\"$s\"" - break - fi - done - recho_ "$r" -} -function qlines() { - sed "s/'/'\\\\''/g; s/.*/'&'/g" -} -function setv() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - eval "$__s_var=\"\$*\"" -} -function _setv() { - local __s_var="$1"; shift - eval "$__s_var=\"\$*\"" -} -function echo_setv() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - echo "$__s_var=$(qvalr "$*")" -} -function setx() { - if [ "$1" == -a ]; then - shift - local __s_array="$1"; shift - if [[ "$__s_array" == *=* ]]; then - set -- "${__s_array#*=}" "$@" - __s_array="${__s_array%%=*}" - fi - eval "$__s_array=($("$@" | qlines))" - else - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - eval "$__s_var="'"$("$@")"' - fi -} -function _setvx() { - local __s_var="$1"; shift - eval "$__s_var="'"$("$@")"' -} -function _setax() { - local __s_array="$1"; shift - eval "$__s_array=($("$@" | qlines))" -} -function evalx() { - local __e_val __e_arg __e_r=0 - local -a __e_cmd - - local __e_first=1 - while [ $# -gt 0 ]; do - __e_cmd=() - while [ $# -gt 0 ]; do - __e_arg="$1"; shift - [ "$__e_arg" == // ] && break - if [ "${__e_arg%//}" != "$__e_arg" ]; then - local __e_tmp="${__e_arg%//}" - if [ -z "${__e_tmp//\\/}" ]; then - __e_arg="${__e_arg#\\}" - __e_cmd=("${__e_cmd[@]}" "$__e_arg") - continue - fi - fi - __e_cmd=("${__e_cmd[@]}" "$__e_arg") - done - - if [ -n "$__e_first" ]; then - __e_val="$("${__e_cmd[@]}")" || __e_r=$? - else - __e_val="$("${__e_cmd[@]}" "$__e_val")" || __e_r=$? - fi - __e_first= - done - [ -n "$__e_val" ] && echo "$__e_val" - return $__e_r -} -function setxx() { - local -a __s_args - if [ "$1" == -a ]; then __s_args=(-a); shift; fi - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - __s_args=("${__s_args[@]}" "$__s_var") - setx "${__s_args[@]}" evalx "$@" -} -function evalp() { - local __e_arg __e_cmd - - while [ $# -gt 0 ]; do - __e_arg="$1"; shift - if [ "$__e_arg" == // ]; then - __e_cmd="$__e_cmd |" - continue - elif [ "${__e_arg%//}" != "$__e_arg" ]; then - local __e_tmp="${__e_arg%//}" - if [ -z "${__e_tmp//\\/}" ]; then - __e_arg="${__e_arg#\\}" - fi - fi - __e_cmd="${__e_cmd:+$__e_cmd }\"$(_qval "$__e_arg")\"" - done - eval "$__e_cmd" -} -function setxp() { - local -a __s_args - if [ "$1" == -a ]; then __s_args=(-a); shift; fi - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - __s_args=("${__s_args[@]}" "$__s_var") - setx "${__s_args[@]}" evalp "$@" -} -function testx() { - local __t_op="$1"; shift - local __t_val="$(evalx "$@")" - [ $__t_op "$__t_val" ] -} -function test2x() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalx "$@")" - [ "$__t_val1" $__t_op "$__t_val2" ] -} -function testrx() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalx "$@")" - eval '[[ "$__t_val1" '"$__t_op"' "$__t_val2" ]]' -} -function testp() { - local __t_op="$1"; shift - local __t_val="$(evalp "$@")" - [ $__t_op "$__t_val" ] -} -function test2p() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalp "$@")" - [ "$__t_val1" $__t_op "$__t_val2" ] -} -function testrp() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalp "$@")" - eval '[[ "$__t_val1" '"$__t_op"' "$__t_val2" ]]' -} - -function err2out() { - "$@" 2>&1 -} - -function is_defined() { - [ -n "$(declare -p "$1" 2>/dev/null)" ] -} -function is_array() { - case "$(declare -p "$1" 2>/dev/null)" in declare\ -a*) return 0;; esac - return 1 -} - -function upvar() { - if unset -v "$1"; then - if [ $# -eq 2 ]; then - eval "$1=\"\$2\"" - else - eval "$1=(\"\${@:2}\")" - fi - fi -} -function array_upvar() { - unset -v "$1" && eval "$1=(\"\${@:2}\")" -} -function upvars() { - while [ $# -gt 0 ]; do - case "$1" in - -a) - unset -v "$2" && eval "$2=(\"\${@:3}\")" - break - ;; - -a*) - unset -v "$2" && eval "$2=(\"\${@:3:${1#-a}}\")" - shift $((${1#-a} + 2)) || return 1 - ;; - *) - unset -v "$1" && eval "$1=\"\$2\"" - shift; shift - ;; - esac - done -} - -function __ab_process_pending() { - local -a values - case "$mode" in - cmd) values="$("${pending[@]}")";; - ssplit) eval "values=($("${pending[@]}"))";; - lsplit) eval "values=($("${pending[@]}" | qlines))";; - add) values=("${pending[@]}");; - esac - cmd=("${cmd[@]}" "${values[@]}") - pending=() -} -function array_buildcmd() { - local desta="$1"; shift; local "$desta" - local mode=add - local -a pending cmd - while [ $# -gt 0 ]; do - case "$1" in - ++c|++cmd|++) __ab_process_pending; mode=cmd;; - ++s|++ssplit) __ab_process_pending; mode=ssplit;; - ++l|++lsplit) __ab_process_pending; mode=lsplit;; - ++a|++add) __ab_process_pending; mode=add;; - *) pending=("${pending[@]}" "$1");; - esac - shift - done - __ab_process_pending - array_upvar "$desta" "${cmd[@]}" -} -function buildcmd() { - local -a args - array_buildcmd args "$@" - qvals "${args[@]}" -} -function evalcmd() { - local -a args - array_buildcmd args "$@" - "${args[@]}" -} -##@inc]base.core -##@inc[base.num -## Fonctions de base: gestion des valeurs numériques -uprovide base.num - -function isnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//[0-9]/}" - [ -z "$v" ] -} -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - [ -z "${1//[0-9]/}" ] -} -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//./}" - v="${v//,/}" - v="${v//[0-9]/}" - [ -z "$v" ] -} -##@inc]base.num -##@inc[base.bool -## Fonctions de base: valeurs booléennes -##@inc[base.num -## Fonctions de base: gestion des valeurs numériques -uprovide base.num - -function isnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//[0-9]/}" - [ -z "$v" ] -} -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - [ -z "${1//[0-9]/}" ] -} -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//./}" - v="${v//,/}" - v="${v//[0-9]/}" - [ -z "$v" ] -} -##@inc]base.num -uprovide base.bool -urequire base.num - -function is_yes() { - case "${1,,}" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - esac - isnum "$1" && [ "$1" -ne 0 ] && return 0 - return 1 -} -function is_no() { - case "${1,,}" in - n|non|no|f|faux|false|off) return 0;; - esac - isnum "$1" && [ "$1" -eq 0 ] && return 0 - return 1 -} -function yesval() { - is_yes "$1" && echo 1 -} - -function setb() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - local __s_r - if "$@" >/dev/null; then - eval "$__s_var=1" - else - __s_r=$? - eval "$__s_var=" - return $__s_r - fi -} -function _setb() { - local __s_var="$1"; shift - if "$@" >/dev/null; then - eval "$__s_var=1" - else - eval "$__s_var=" - fi -} - -function evalb() { - if evalx "$@" >/dev/null; then - echo 1 - else - return $? - fi -} -function setxb() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - setx "$__s_var" evalb "$@" -} -##@inc]base.bool -##@inc[base.quote -## Fonctions de base: protection de valeurs chaine -uprovide base.quote -urequire base.core - -function _qawk() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s// -/\\n}" - recho_ "$s" -} -function qawk() { - echo -n \" - _qawk "$@" - echo \" -} -function qseds() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\//\\/}" - s="${s// -/\\n}" - recho "$s" -} -function _qform() { - local s="$*" - s="${s//\%/%25}" - s="${s//+/%2B}" - s="${s//&/%26}" - s="${s//=/%3D}" - s="${s// /+}" - recho_ "$s" -} -function qform() { - local s="$*" - if [[ "$s" == *=* ]]; then - _qform "${s%%=*}" - echo -n = - _qform "${s#*=}" - echo - else - _qform "$s" - echo - fi -} -function _qsql() { - local q="'" qq="''" - echo "${*//$q/$qq}" -} -function qsql() { - local q="'" qq="''" - echo "'${*//$q/$qq}'" -} -##@inc]base.quote -uprovide base.compat -urequire base.core base.num base.bool base.quote - - -function setx2() { setxx "$@"; } -function rawecho() { recho "$@"; } -function rawecho_() { recho_ "$@"; } -function quote_arg() { _qval "$@"; } -function quoted_arg() { qvalm "$@"; } -function quoted_args() { qvals "$@"; } -function set_var() { setv "$@"; } -function set_var_cmd() { echo_setv "$@"; } -function set_var_literal() { eval "$1=$2"; } - -function quote_awk() { _qawk "$@"; } -function quoted_awk() { qawk "$@"; } -function quote_seds() { qseds "$@"; } -function quote_form() { _qform "$@"; } -function quoted_form() { qform "$@"; } - - -if [ -n "$BASH_VERSINFO" -a "${BASH_VERSINFO[0]}" -lt 4 ]; then - function strlower() { tr A-Z a-z <<<"$*"; } - function strlower1() { - local str="$*" - local h="${str:0:1}" r="${str:1}" - echo "$(tr A-Z a-z <<<"$h")$r" - } - function strlowers() { - local -a vs; local v - for v in "$@"; do - vs=("${vs[@]}" "$(strlower1 "$v")") - done - echo "${vs[*]}" - } - function strupper() { tr a-z A-Z <<<"$*"; } - function strupper1() { - local str="$*" - local h="${str:0:1}" r="${str:1}" - echo "$(tr a-z A-Z <<<"$h")$r" - } - function struppers() { - local -a vs; local v - for v in "$@"; do - vs=("${vs[@]}" "$(strupper1 "$v")") - done - echo "${vs[*]}" - } - - function is_yes() { - case "$1" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - O|OUI|Y|YES|V|VRAI|T|TRUE|ON) return 0;; - esac - isnum "$1" && [ "$1" -ne 0 ] && return 0 - case "$(strlower "$1")" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - esac - return 1 - } - function is_no() { - case "$1" in - n|non|no|f|faux|false|off) return 0;; - N|NON|NO|F|FAUX|FALSE|OFF) return 0;; - esac - isnum "$1" && [ "$1" -eq 0 ] && return 0 - case "$(strlower "$1")" in - n|non|no|f|faux|false|off) return 0;; - esac - return 1 - } -fi -##@inc]base.compat -uprovide base -urequire base.init base.core base.string base.num base.bool base.array base.quote base.split base.args base.tools base.compat - -UNAME_SYSTEM=`uname -s` -[ "${UNAME_SYSTEM#CYGWIN}" != "$UNAME_SYSTEM" ] && UNAME_SYSTEM=Cygwin -[ "${UNAME_SYSTEM#MINGW32}" != "$UNAME_SYSTEM" ] && UNAME_SYSTEM=Mingw -UNAME_MACHINE=`uname -m` -if [ -n "$UTOOLS_CHROOT" ]; then - [ -n "$UTOOLS_UNAME_SYSTEM" ] && eval "UNAME_SYSTEM=$UTOOLS_UNAME_SYSTEM" - [ -n "$UTOOLS_UNAME_MACHINE" ] && eval "UNAME_MACHINE=$UTOOLS_UNAME_MACHINE" -fi - -function setyesval() { - is_yes "$2" && set_var "$1" 1 || set_var "$1" "" -} -function normyesval() { - is_yes "${2:-"${!1}"}" && set_var "$1" 1 || set_var "$1" "" -} -function normyesvals() { - local __nyv_yesvar - for __nyv_yesvar in "$@"; do - is_yes "${!__nyv_yesvar}" && set_var "$__nyv_yesvar" 1 || set_var "$__nyv_yesvar" "" - done -} -function quote_in() { - sed 's/\\/\\\\/g -s/"/\\"/g -s/\$/\\$/g -s/`/\\`/g' -} -function quote_sin() { - sed "s/'/'\\\\''/g" -} -function quote_sarg() { - quote_sin <<<"$1" -} -function quoted_sarg() { - echo "'$(quote_sarg "$1")'" -} -function quoted_sargs() { - local a s - for a in "$@"; do - s="${s:+$s }$(quoted_sarg "$a")" - done - rawecho "$s" -} - -function set_array_cmd() { - [ $# -eq 1 ] && set -- "$1" "$1" - local __sac_s __sac_v __sac_f - __sac_s="$1=("; shift - if [ "$1" == "@" ]; then - shift - else - eval "set -- \"\${$1[@]}\"" - fi - __sac_f=1 - for __sac_v in "$@"; do - [ -n "$__sac_f" ] && __sac_f= || __sac_s="$__sac_s " - __sac_s="$__sac_s$(quoted_arg "$__sac_v")" - done - __sac_s="$__sac_s)" - echo "$__sac_s" -} -function set_array() { - eval "$(set_array_cmd "$@")" -} -function array_count() { - eval "echo \${#$1[*]}" -} -function array_isempty() { - [ $(array_count "$1") -eq 0 ] -} -function array_new() { - eval "$1=()" -} -function array_add() { - local __aa_a="$1"; shift - eval "$__aa_a=(\"\${$__aa_a[@]}\" \"\$@\")" -} -function array_ins() { - local __aa_a="$1"; shift - eval "$__aa_a=(\"\$@\" \"\${$__aa_a[@]}\")" -} -function array_del() { - local __ad_v - local -a __ad_vs - eval 'for __ad_v in "${'"$1"'[@]}"; do - if [ "$__ad_v" != '"$(quoted_arg "$2")"' ]; then - array_add __ad_vs "$__ad_v" - fi -done' - array_copy "$1" __ad_vs -} -function array_addu() { - local __as_v - eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then - return 1 - fi -done' - array_add "$1" "$2" - return 0 -} -function array_set() { - array_addu "$@" -} -function array_insu() { - local __as_v - eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then - return 1 - fi -done' - array_ins "$1" "$2" - return 0 -} -function array_fillrange() { - local -a __af_vs - local __af_i="${2:-1}" __af_to="${3:-10}" __af_step="${4:-1}" - while [ "$__af_i" -le "$__af_to" ]; do - __af_vs=("${__af_vs[@]}" "$__af_i") - __af_i=$(($__af_i + $__af_step)) - done - array_copy "$1" __af_vs -} -function array_eq() { - local -a __ae_a1 __ae_a2 - array_copy __ae_a1 "$1" - array_copy __ae_a2 "$2" - [ ${#__ae_a1[*]} -eq ${#__ae_a2[*]} ] || return 1 - local __ae_v __ae_i=0 - for __ae_v in "${__ae_a1[@]}"; do - [ "$__ae_v" == "${__ae_a2[$__ae_i]}" ] || return 1 - __ae_i=$(($__ae_i + 1)) - done - return 0 -} -function array_contains() { - local __ac_v - eval 'for __ac_v in "${'"$1"'[@]}"; do - if [ "$__ac_v" == '"$(quoted_arg "$2")"' ]; then - return 0 - fi -done' - return 1 -} -function array_find() { - local __af_i __af_v - __af_i=0 - eval 'for __af_v in "${'"$1"'[@]}"; do - if [ "$__af_v" == '"$(quoted_arg "$2")"' ]; then - if [ -n "$3" ]; then - echo "${'"$3"'[$__af_i]}" - else - echo "$__af_i" - fi - return 0 - fi - __af_i=$(($__af_i + 1)) -done' - return 1 -} -function array_reverse() { - local -a __ar_vs - local __ar_v - array_copy __ar_vs "$1" - array_new "$1" - for __ar_v in "${__ar_vs[@]}"; do - array_ins "$1" "$__ar_v" - done -} - -function array_replace() { - local __ar_sn="$1"; shift - local __ar_f="$1"; shift - local -a __ar_s __ar_d - local __ar_v - array_copy __ar_s "$__ar_sn" - for __ar_v in "${__ar_s[@]}"; do - if [ "$__ar_v" == "$__ar_f" ]; then - __ar_d=("${__ar_d[@]}" "$@") - else - __ar_d=("${__ar_d[@]}" "$__ar_v") - fi - done - array_copy "$__ar_sn" __ar_d -} -function array_each() { - local __ae_an="$1"; shift - local __ae_f="$1"; shift - local -a __ae_a - local __ae_v - array_copy __ae_a "$__ae_an" - for __ae_v in "${__ae_a[@]}"; do - "$__ae_f" "$__ae_v" "$@" - done -} -function array_map() { - local __am_an="$1"; shift - local __am_f="$1"; shift - local -a __am_a __am_vs - local __am_v - array_copy __am_a "$__am_an" - for __am_v in "${__am_a[@]}"; do - __am_vs=("${__am_vs[@]}" "$("$__am_f" "$__am_v" "$@")") - done - array_copy "$__am_an" __am_vs -} -function first_value() { - eval "rawecho \"\${$1[@]:0:1}\"" -} -function last_value() { - eval "rawecho \"\${$1[@]:\$((-1)):1}\"" -} -function array_copy() { - eval "$1=(\"\${$2[@]}\")" -} -function array_copy_firsts() { - eval "$1=(\"\${${2:-$1}[@]:0:\$((\${#${2:-$1}[@]}-1))}\")" -} -function array_del_last() { - array_copy_firsts "$1" -} -function array_copy_lasts() { - eval "$1=(\"\${${2:-$1}[@]:1}\")" -} -function array_del_first() { - array_copy_lasts "$1" -} -function array_extend() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]}\")" -} -function array_extendu() { - local __ae_v __ae_s=1 - eval 'for __ae_v in "${'"$2"'[@]}"; do - array_addu "$1" "$__ae_v" && __ae_s=0 -done' - return "$__ae_s" -} -function array_extend_firsts() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]:0:\$((\${#$2[@]}-1))}\")" -} -function array_extend_lasts() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]:1}\")" -} -function array_xsplit() { - eval "$1=($(recho_ "$2" | awkrun RS="${3:-:}" ' -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_split() { - eval "$1=($(recho_ "$2" | awkrun RS="${3:-:}" ' -/^$/ { next } -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_from_path() { - array_split "$1" "$2" ":" -} -function array_from_xlines() { - eval "$1=($(recho_ "$2" | _nl2lf | awk ' -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_from_lines() { - eval "$1=($(recho_ "$2" | _nl2lf | awk ' -/^$/ { next } -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_join() { - local __aj_an __aj_l __aj_j __aj_s="${2:-,}" __aj_pf __aj_sf - if [ "$1" == "@" ]; then - __aj_an="\$@" - shift; shift - else - __aj_an="\${$1[@]}" - __aj_pf="$4" - __aj_sf="$5" - fi - eval 'for __aj_l in "'"$__aj_an"'"; do - __aj_j="${__aj_j:+$__aj_j'"$__aj_s"'}$__aj_pf$__aj_l$__aj_sf" -done' - if [ -n "$__aj_j" ]; then - rawecho "$__aj_j" - elif [ "$__aj_an" != "\$@" -a -n "$3" ]; then - rawecho "$3" - fi -} -function array_mapjoin() { - local __amj_src="$1" __amj_func="$2" __amj_sep="$3" - shift; shift; shift - if [ "$__amj_src" == "@" ]; then - local -a __amj_tmpsrc - __amj_tmpsrc=("$@") - __amj_src=__amj_tmpsrc - set -- - fi - local -a __amj_tmp - array_copy __amj_tmp "$__amj_src" - array_map __amj_tmp "$__amj_func" - array_join __amj_tmp "$__amj_sep" "$@" -} -function array_to_lines() { - array_join "$1" " -" "$2" "$3" "$4" -} -function array_to_path() { - array_join "$1" ":" "$2" "$3" "$4" -} -function array_fix_paths() { - local __afp_an="$1" __afp_s="${2:-:}" - local -a __afp_vs - local __afp_v - array_copy __afp_vs "$__afp_an" - array_new "$__afp_an" - for __afp_v in "${__afp_vs[@]}"; do - array_split __afp_v "$__afp_v" "$__afp_s" - array_extend "$__afp_an" __afp_v - done -} - - -function get_date_rfc822() { - LC_TIME=C date +"%a, %d %b %Y %H:%M:%S %Z" -} -function get_date_fr() { - LC_TIME=C date +"%d/%m/%Y" -} -function get_time_fr() { - LC_TIME=C date +"%Hh%M" -} -function parse_date() { - local value="$1" type="${2:-date}" - local now="$(awk 'BEGIN { print mktime(strftime("%Y %m %d 00 00 00 +0400")) }')" - case "$value" in - +*) - value="$(($now + ${value#+} * 86400))" - ;; - *) - value="$(<<<"$value" awk -F/ '{ - nd = strftime("%d"); nm = strftime("%m"); ny = strftime("%Y") - d = $1 + 0; if (d < 1) d = nd; - m = $2 + 0; if (m < 1) m = nm; - if ($3 == "") y = ny; - else { y = $3 + 0; if (y < 100) y = y + 2000; } - print mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d)); - }')" - esac - case "$type" in - d|date) awk '{ print strftime("%d/%m/%Y", $0 + 0) }' <<<"$value";; - l|ldap) awk '{ print strftime("%Y%m%d%H%M%S+0400", $0 + 0) }' <<<"$value";; - m|mysql) awk '{ print strftime("%Y-%m-%d", $0 + 0) }' <<<"$value";; - *) - rawecho "$value" - ;; - esac -} - - -function udelpath() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; ${2:-PATH}"'="${'"${2:-PATH}"'#$1:}"; '"${2:-PATH}"'="${'"${2:-PATH}"'%:$1}"; '"${2:-PATH}"'="${'"${2:-PATH}"'//:$_qdir:/:}"; [ "$'"${2:-PATH}"'" == "$1" ] && '"${2:-PATH}"'=' -} -function uaddpath() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="${'"${2:-PATH}"':+$'"${2:-PATH}"':}$1"' -} -function uinspathm() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="$1${'"${2:-PATH}"':+:$'"${2:-PATH}"'}"' -} -function uinspath() { - udelpath "$@" - uinspathm "$@" -} - -function withpath() { - [ "${1#./}" != "$1" -o "${1#../}" != "$1" -o "${1#/}" != "$1" ] -} -function withext() { - local basename="$(basename -- "$1")" - [ "${basename%.*}" != "$basename" ] -} -function normpath() { - local -a parts - local part ap - array_split parts "$1" / - if [ "${1#/}" != "$1" ]; then - ap=/ - elif [ -n "$2" ]; then - ap="$2" - else - ap="$(pwd)" - fi - for part in "${parts[@]}"; do - if [ "$part" == "." ]; then - continue - elif [ "$part" == ".." ]; then - ap="${ap%/*}" - [ -n "$ap" ] || ap=/ - else - [ "$ap" != "/" ] && ap="$ap/" - ap="$ap$part" - fi - done - rawecho "$ap" -} -function abspath() { - local ap="$1" - if [ "${ap#/}" != "$ap" ]; then - __normpath "$ap" && return - else - local cwd - if [ -n "$2" ]; then - cwd="$(abspath "$2")" - else - cwd="$(pwd)" - fi - ap="$cwd/$ap" - __normpath "$ap" && return - fi - normpath "$ap" -} -function __normpath() { - if [ -d "$1" ]; then - if [ -x "$1" ]; then - (cd "$1"; pwd) - return 0 - fi - elif [ -f "$1" ]; then - local dn="$(dirname -- "$1")" bn="$(basename -- "$1")" - if [ -x "$dn" ]; then - (cd "$dn"; echo "$(pwd)/$bn") - return 0 - fi - fi - return 1 -} -function parentdirs() { - array_new "$1" - local __pd_d="$(abspath "$2")" - if [[ "$3" == r* ]]; then - while [ "$__pd_d" != "/" ]; do - array_ins "$1" "$__pd_d" - __pd_d="$(dirname "$__pd_d")" - done - else - while [ "$__pd_d" != "/" ]; do - array_add "$1" "$__pd_d" - __pd_d="$(dirname "$__pd_d")" - done - fi -} -function ppath() { - local path="$1" cwd="$2" - - path="$(abspath "$path")" # essayer de normaliser le chemin - [ -n "$cwd" ] || cwd="$(pwd)" - - [ "$path" = "$cwd" ] && path="." - [ "$cwd" != "/" -a "$cwd" != "$HOME" ] && path="${path/#$cwd\//}" - path="${path/#$HOME/~}" - - rawecho "$path" -} -function relpath() { - local p="$(abspath "$1" "$3")" cwd="$2" - if [ -z "$cwd" ]; then - cwd="$(pwd)" - else - cwd="$(abspath "$cwd" "$3")" - fi - if [ "$p" == "$cwd" ]; then - echo "" - elif [ "${p#$cwd/}" != "$p" ]; then - rawecho "${p#$cwd/}" - else - local rp - while [ -n "$cwd" -a "${p#$cwd/}" == "$p" ]; do - rp="${rp:+$rp/}.." - cwd="${cwd%/*}" - done - rp="$rp/${p#$cwd/}" - echo "${rp%//}" - fi -} -function relpathx() { - local p="$(relpath "$@")" - if [ -z "$p" ]; then - echo . - elif [ "${p#../}" != "$p" -o "${p#./}" != "$p" ]; then - echo "$p" - else - echo "./$p" - fi -} -function withinpath() { - local b="$1" p="$2" strict="${3:-N}" - b="$(abspath "$b")" - p="$(abspath "$p")" - if is_yes "$strict"; then - [ "${p#$b/}" != "$p" ] - else - [ "$p" == "$b" -o "${p#$b/}" != "$p" ] - fi -} -function safe_abspath() { - local p="$1" ba="$2" br="$3" - if [ -n "$ba" ]; then - ba="$(abspath "$ba")" - else - ba="$(pwd)" - fi - [ -n "$br" ] || br="$ba" - br="$(abspath "$br" "$ba")" - p="$(abspath "$p" "$ba")" - if [ "$p" == "$br" -o "${p#$br/}" != "$p" ]; then - echo "$p" - else - return 1 - fi -} -function safe_relpath() { - local p - if p="$(safe_abspath "$1" "$2" "$3")"; then - relpath "$p" "$2" "$(pwd)" - else - return 1 - fi -} -function splitwcs() { - local __sw_p="$1" - local __sw_dd="${2:-basedir}" __sw_df="${3:-filespec}" __sw_part __sw_d __sw_f - local -a __sw_parts - array_split __sw_parts "$__sw_p" "/" - for __sw_part in "${__sw_parts[@]}"; do - if [[ "$__sw_part" == *\** ]] || [[ "$__sw_part" == *\?* ]] || [ -n "$__sw_f" ]; then - __sw_f="${__sw_f:+$__sw_f/}$__sw_part" - else - __sw_d="${__sw_d:+$__sw_d/}$__sw_part" - fi - done - [ "${__sw_p#/}" != "$__sw_p" ] && __sw_d="/$__sw_d" - set_var "$__sw_dd" "$__sw_d" - set_var "$__sw_df" "$__sw_f" -} -function deref() { - local OENC="$UTF8" - - local max_deref=50 - local file="$1" - local basedir link - while [ -L "$file" ]; do - basedir="$(dirname "$file")" - link="$(readlink "$file")" - if first_char_is "$link" "/"; then - file="$link" - else - file="$basedir/$link" - fi - - max_deref=$(($max_deref - 1)) - [ $max_deref -eq 0 ] && die "Plus de 50 indirection. Le lien $file est-il récursif?" - done - abspath "$file" -} -function readlinka() { - if [ -L "$1" ]; then - local linkdir="$(dirname -- "$1")" - abspath "$(readlink "$1")" "$linkdir" - else - abspath "$1" - fi -} -function readlinkm() { - readlink -m "$1" -} -function path_if_test() { - local op="$1"; shift - local file="$1"; shift - local rel="$1" reldir=; shift - if beginswith "$rel" relative; then - reldir="${rel#relative}" - if beginswith "$reldir" :; then - reldir="${reldir#:}" - if [ -n "$reldir" ]; then - reldir="${reldir}/" - fi - else - reldir= - fi - else - rel= - fi - - while [ -n "$1" ]; do - local basedir="$1" - if [ $op "$basedir/$file" ]; then - if [ -n "$rel" ]; then - rawecho "$reldir$file" - else - rawecho "$basedir/$file" - fi - break - fi - shift - done -} -function update_link() { - [ -L "$2" ] || return 1 - local dest link="$2" - local linkdir="$(dirname "$link")" - local ldest="$(readlink "$link")" - if [ "${ldest#/}" != "$ldest" ]; then - dest="$(abspath "$1")" - else - dest="$(relpath "$1" "$linkdir")" - fi - if [ "$dest" == "$ldest" ]; then - : # pas besoin de mettre à jour - elif [ -d "$link" ]; then - rm -f "$link" && ln -s "$dest" "$link" - else - ln -sf "$dest" "$link" - fi -} -function update_links() { - [ -n "$1" ] || return 1 - local dest="$1"; shift - local r=0 link - for link in "$@"; do - update_link "$dest" "$link" || r=$? - done - return $r -} -function move_link() { - [ -n "$1" -a -n "$2" ] || return 1 - local link="$1" dest="$2" - [ -d "$dest" ] && dest="$dest/$(basename -- "$link")" - dest="$(abspath "$dest")" - if [ -L "$link" ]; then - link="$(abspath "$link")" - [ "$dest" == "$link" ] && return 0 - ldest="$(readlinka "$link")" - mv "$link" "$dest" || return 1 - update_link "$ldest" "$dest" - else - [ "$dest" == "$link" ] && return 0 - mv "$link" "$dest" - fi -} -function array_find_links() { - local -a __afl_links __afl_result - local __afl_dir="${3:-.}" - local __afl_dest __afl_destname __afl_link __afl_linkdir __afl_ldest - __afl_dest="$(abspath "$2")" - __afl_destname="${__afl_dest##*/}" - array_from_lines __afl_links "$(find "$__afl_dir" -type l)" - for __afl_link in "${__afl_links[@]}"; do - __afl_ldest="$(readlink "$__afl_link")" - if [ "$__afl_ldest" != "$__afl_destname" ]; then - [[ "$__afl_ldest" == */"$__afl_destname" ]] || continue - fi - __afl_link="$(abspath "$__afl_link" "$__afl_dir")" - __afl_linkdir="$(dirname -- "$__afl_link")" - __afl_ldest="$(abspath "$__afl_ldest" "$__afl_linkdir")" - if [ "$__afl_ldest" == "$__afl_dest" ]; then - array_add __afl_result "$__afl_link" - fi - done - array_copy "$1" __afl_result -} -function list_links() { - local -a links - array_find_links links "$@" - array_to_lines links -} -function move_file() { - [ -n "$1" -a -n "$2" ] || return 1 - local src="$1" dest="$2" link - shift; shift - [ -d "$dest" ] && dest="$dest/$(basename -- "$src")" - move_link "$src" "$dest" || return 1 - update_links "$dest" "$@" -} - -function get_nblines() { - [ -f "$1" ] && sed -ne '$=' "$1" || echo 0 -} -function mktempf() { - mktemp "${1:-"$TMPDIR/tmp.XXXXXX"}" -} -function mktempd() { - mktemp -d "${1:-"$TMPDIR/tmp.XXXXXX"}" -} -function mkdirof() { - mkdir -p "$(dirname -- "$1")" -} -function cp_a() { - /bin/cp -a "$@" -} -function cp_R() { - /bin/cp -pR "$@" -} -function quietgrep() { - grep -q "$@" 2>/dev/null -} -function quietdiff() { - diff -q "$@" >&/dev/null -} -function testsame() { - quietdiff "$@" -} -function testdiff() { - ! quietdiff "$@" -} -function testupdated() { - if [ -f "$2" ]; then - testdiff "$1" "$2" - else - return 0 - fi -} -function testnewer() { - test ! -e "$2" -o "$1" -nt "$2" -} -function ps_all() { - ps -axww -} -function progexists() { - test -n "$1" -a -x "$(which "$1" 2>/dev/null)" -} -function has_python() { - progexists python -} -function has_gawk() { - progexists gawk -} -function is_root() { - test `id -u` -eq 0 -} -function source_ifexists() { - if [ -f "$1" ]; then source "$1" || die; fi -} -function little_sleep { - LC_NUMERIC=C sleep 0.1 -} -function random_sleep { - sleep $(($RANDOM % ${1:-1800})) -} -function is_running() { - kill -0 "$1" >&/dev/null -} -function sedi() { - sed -i "$@" -} -function csort() { - LANG=C sort "$@" -} -function lsort() { sort "$@"; } -function cgrep() { - LANG=C grep "$@" -} -function lgrep() { grep "$@"; } -function csed() { - LANG=C sed "$@" -} -function lsed() { sed "$@"; } -function cawk() { - LANG=C awk "$@" -} -function lawk() { awk "$@"; } -function cdiff() { - LANG=C diff "$@" -} -function ldiff() { diff "$@"; } - - -function fix_mode() { - local file="$1" - [ -f "$file" ] || touch "$file" || return 1 - if [ ! -w "$file" ]; then - local mode="$(stat -c %a "$file")" - chmod ${mode:0:${#mode}-3}6${mode:${#mode}-2:2} "$file" - echo "$mode" - fi -} -function unfix_mode() { - [ -n "$2" ] && chmod "$2" "$1" -} -function get_mode() { - [ -f "$1" ] || touch "$1" || return 1 - stat -c %a "$1" -} -function rm_maybe() { - local parse_opts=1 arg rm - for arg in "$@"; do - if [ -n "$parse_opts" ]; then - if [ "$arg" == "--" ]; then - parse_opts= - elif [[ "$arg" == "-*" ]]; then - continue - elif [ -n "$arg" ]; then - rm=1 - break - fi - elif [ -n "$arg" ]; then - rm=1 - break - fi - done - [ -n "$rm" ] && /bin/rm "$@" -} -__CPDIR_RSYNC_SLOW=1 # synchro potentiellement plus lente, mais plus fidèle (option -c) -__CPDIR_RSYNC_ARGS=(-q) -function cpdir() { - - if progexists rsync; then - [ -d "$2" ] || mkdir -p "$2" || return 1 - if [ -d "$1" ]; then - rsync -a ${__CPDIR_RSYNC_SLOW:+-c} "${__CPDIR_RSYNC_ARGS[@]}" "$1/" "$2/" - else - rsync -a ${__CPDIR_RSYNC_SLOW:+-c} "${__CPDIR_RSYNC_ARGS[@]}" "$1" "$2/" - fi - else - __cpdir "$@" - fi -} -function __cpdir() { - local src="$1" dest="$2" method="${3:-cp_a}" - - if [ -d "$src" ]; then - [ -d "$dest" ] || mkdir -p "$dest" || return 1 - - local prevdir="$(pwd)" - - dest="$(abspath "$dest")" - cd "$src" - if [ -n "$(/bin/ls -a1)" ]; then - [ -n "$(/bin/ls -1)" ] && "$method" * "$dest" - local i - for i in .*; do - [ "$i" == "." -o "$i" == ".." ] && continue - "$method" "$i" "$dest" - done - fi - cd "$prevdir" - else - if [ -f "$dest" ]; then - "$method" "$src" "$dest" - elif [ -d "$dest" ]; then - "$method" "$src" "$dest" - else - mkdir -p "$dest" - "$method" "$src" "$dest" - fi - fi -} -__CPNOVCS_RSYNC_SLOW=1 # synchro potentiellement plus lente, mais plus fidèle (option -c) -__CPNOVCS_RSYNC_ARGS=(-q) -function cpnovcs() { - local src="$1" destdir="$2" - [ -d "$destdir" ] || mkdir -p "$destdir" || return 1 - if progexists rsync; then - local gitexclude=/.git/ - if [ "${src%/}" == "$src" ]; then - gitexclude="/$(basename -- "$src")$gitexclude" - fi - rsync -a ${__CPNOVCS_RSYNC_SLOW:+-c} --exclude CVS/ --exclude .svn/ --exclude "$gitexclude" "${__CPNOVCS_RSYNC_ARGS[@]}" "$src" "$destdir/" - elif [ "${src%/}" != "$src" ]; then - __cpdir "$src" "$destdir" - else - local srcname="$(basename -- "$src")" - mkdir -p "$destdir/$srcname" - __cpdir "$src" "$destdir/$srcname" - fi -} -function cpdirnovcs() { - if [ -d "$1" ]; then - cpnovcs "$1/" "$2" - else - cpnovcs "$1" "$2" - fi -} -function doinplace() { - if [ -n "$1" -a "$1" != "-" ]; then - local __dip_file="$1"; shift - autoclean "$__dip_file.tmp.$$" - "$@" <"$__dip_file" >"$__dip_file.tmp.$$" - local s=$? - [ "$s" == 0 ] && /bin/cat "$__dip_file.tmp.$$" >"$__dip_file" - /bin/rm -f "$__dip_file.tmp.$$" - return $s - else - shift - "$@" - fi -} -function doinplacef() { - if [ -n "$1" -a "$1" != "-" ]; then - local __dip_file="$1"; shift - autoclean "$__dip_file.tmp.$$" - "$@" <"$__dip_file" >"$__dip_file.tmp.$$" - local s=$? - /bin/cat "$__dip_file.tmp.$$" >"$__dip_file" - /bin/rm -f "$__dip_file.tmp.$$" - return $s - else - shift - "$@" - fi -} -function stripnl() { - tr -d '\r\n' -} -function _nl2lf() { - awk 'BEGIN {RS="\r|\r\n|\n"} {print}' -} -function nl2lf() { - doinplace "$1" _nl2lf -} -function _nl2crlf() { - awk 'BEGIN {RS="\r|\r\n|\n"} {print $0 "\r"}' -} -function nl2crlf() { - doinplace "$1" _nl2crlf -} -function _nl2cr() { - awk 'BEGIN {RS="\r|\r\n|\n"; ORS=""} {print $0 "\r"}' -} -function nl2cr() { - doinplace "$1" _nl2cr -} -function _latin1compat() { - LANG=fr_FR.UTF-8 sed $' -s/[‘’]/\x27/g -s/[«»“”]/"/g -s/[\xC2\xA0\xE2\x80\x87\xE2\x80\xAF\xE2\x81\xA0]/ /g -' -} -function _noaccents() { - LANG=fr_FR.UTF-8 sed ' -s/[à]/a/g -s/[éèêë]/e/g -s/[ïî]/i/g -s/[ôö]/o/g -s/[üû]/u/g -s/[ç]/c/g -s/[À]/A/g -s/[ÉÈÊË]/E/g -s/[ÏÎ]/I/g -s/[ÔÖ]/O/g -s/[ÜÛ]/U/g -s/[Ç]/C/g -' -} -function list_all() { - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ "$f" == "." -o "$f" == ".." ] && continue - rawecho "$f" - done - cd "$curdir" -} -function __la_cmd() { - [ $# -gt 0 ] || set '*' - local arg - local cmd="/bin/ls -1d" - for arg in "$@"; do - arg="$(_rval "$arg")" - cmd="$cmd $arg" - done - cmd="$cmd 2>/dev/null" - echo "$cmd" -} -function list_files() { - local f - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ -f "$f" ] && rawecho "$f" - done - cd "$curdir" -} -function list_dirs() { - local f - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ "$f" == "." -o "$f" == ".." ] && continue - [ -d "$f" ] && rawecho "$f" - done - cd "$curdir" -} -function __array_ls() { - local __al_l="list_${1:-all}"; shift - local __al_an="$1"; shift - local __al_d="${1:-.}"; shift - local -a __al_fs - array_from_lines __al_fs "$("$__al_l" "$__al_d" "$@")" - local __al_f - array_new "$__al_an" - for __al_f in "${__al_fs[@]}"; do - array_add "$__al_an" "$__al_d/$__al_f" - done -} -function array_lsall() { - __array_ls all "$@" -} -function array_lsdirs() { - __array_ls dirs "$@" -} -function array_lsfiles() { - __array_ls files "$@" -} -function filter_empty() { - sed '/^$/d' -} -function filter_vcspath() { - sed ' -/^.git$/d -/^.git\//d -/\/.git$/d -/\/.git\//d -/^.svn$/d -/^.svn\//d -/\/.svn$/d -/\/.svn\//d -' -} -function merge_contlines() { - awk 'substr($0, length($0)) == "\\" { - while (getline nextline) { - $0 = substr($0, 1, length($0) - 1) nextline - if (substr($0, length($0)) != "\\") break - } - print - next -} -{print}' -} -function filter_comment() { - local -a merge - [ "$1" == -m ] && merge=(merge_contlines) || merge=(cat) - awk ' - /^[ \t]*#/ { next } - /^[ \t]*$/ { next } - { print }' | "${merge[@]}" -} -function filter_conf() { - local -a merge - [ "$1" == -m ] && merge=(merge_contlines) || merge=(cat) - grep -v '^#' | grep -v '^$' | "${merge[@]}" -} -function is_archive() { - local name="${1%.zip}" - name="${name%.tgz}" - name="${name%.tbz2}" - name="${name%.tar.gz}" - name="${name%.tar.bz2}" - name="${name%.tar}" - name="${name%.jar}" - name="${name%.war}" - name="${name%.ear}" - [ "$name" != "$1" ] -} -function extract_archive() { - local arch="$1" destdir="${2:-.}" - shift; shift - if endswith "$arch" .zip; then - unzip -q -d "$destdir" "$arch" "$@" || return - elif endswith "$arch" .tgz || endswith "$arch" .tar.gz; then - tar xzf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .tbz2 || endswith "$arch" .tar.bz2; then - tar xjf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .tar; then - tar xf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .jar || endswith "$arch" .war || endswith "$arch" .ear; then - ( - arch="$(abspath "$arch")" - cd "$destdir" - jar xf "$arch" "$@" - ) || return - else - return 1 - fi -} -function get_archive_basename() { - local basename="$(basename -- "$1")" - basename="${basename%.zip}" - basename="${basename%.tgz}" - basename="${basename%.tbz2}" - basename="${basename%.gz}" - basename="${basename%.bz2}" - basename="${basename%.tar}" - basename="${basename%.jar}" - basename="${basename%.war}" - basename="${basename%.ear}" - echo "$basename" -} -function get_archive_appname() { - local appname="$(basename -- "$1")" - appname="${appname%.zip}" - appname="${appname%.tgz}" - appname="${appname%.tbz2}" - appname="${appname%.gz}" - appname="${appname%.bz2}" - appname="${appname%.tar}" - appname="${appname%.jar}" - appname="${appname%.war}" - appname="${appname%.ear}" - echo "$appname" | awk '{ - if (match($0, /[-_.]([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/)) { - print substr($0, 1, RSTART - 1) - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/)) { - print substr($0, 1, RSTART - 1) - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print substr($0, 1, RSTART - 1) - } else { - print $0 - } -}' -} -function get_archive_versionsuffix() { - local basename="$(get_archive_basename "$1")" - echo "$basename" | awk '{ - if (match($0, /([-_.][0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print vs["1"] - } -}' -} -function get_archive_version() { - local basename="$(get_archive_basename "$1")" - echo "$basename" | awk '{ - if (match($0, /[-_.]([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print vs["1"] - } -}' -} -function __dump_usernames() { - = 500 && $6 ~ /^\/home\// { print $1 }' -} -function dump_usernames() { - array_from_lines "${1:-usernames}" "$(__dump_usernames)" -} -function __resolv_ips() { - LANG=C host "$1" 2>/dev/null | awk '/address / { gsub(/^.*address /, ""); print }' -} -function resolv_ips() { - array_from_lines "${1:-ips}" "$(__resolv_ips "$2")" -} -function __resolv_hosts() { - LANG=C host "$1" 2>/dev/null | awk '/domain name pointer / { gsub(/^.*domain name pointer /, ""); gsub(/\.$/, ""); print }' -} -function resolv_hosts() { - array_from_lines "${1:-hosts}" "$(__resolv_hosts "$2")" -} -function runscript_as() { - local OENC="$UTF8" - local user="${1:-root}"; shift - local exec_maybe= - if [ "$1" = "exec" ]; then - exec_maybe=exec - shift - fi - - local cmd - cmd="\ -__estack=$(quoted_arg "$__estack") -__tlevel=$(quoted_args "$__tlevel") -export __estack __tlevel -exec ${BASH:-/bin/sh} $(quoted_args "$@")" - - if is_yes "$UTOOLS_USES_SU" || ! progexists sudo; then - eecho "Entrez le mot de passe de root" - $exec_maybe su "$user" -c "$cmd" - else - if [ "$user" == "root" ]; then - $exec_maybe sudo -p "Entrez le mot de passe de %u: " "${BASH:-/bin/sh}" -c "$cmd" - else - $exec_maybe sudo -p "Entrez le mot de passe de %u: " su "$user" -c "$cmd" - fi - fi -} -function runscript_as_root() { - if is_root; then - local exec_maybe= - if [ "$1" = "exec" ]; then - exec_maybe=exec - shift - fi - $exec_maybe "${BASH:-/bin/sh}" "$@" - else - runscript_as root "$@" - fi -} -function run_as() { - local user="${1:-root}"; shift - local exec_maybe=exec - if [ "$1" = "--noexec" ]; then - exec_maybe= - shift - fi - - runscript_as "$user" $exec_maybe "$0" "$@" -} -function run_as_root() { - is_root || run_as root "$@" -} -function check_user() { - local user - for user in "$@"; do - [ "$USER" == "$user" ] && return 0 - done - return 1 -} -function ensure_user() { - local -a users - while [ $# -gt 0 -a "$1" != "--" ]; do - array_add users "$1" - shift - done - [ "$1" == "--" ] && shift - - if ! check_user "${users[@]}"; then - if [ ${#users[*]} -gt 1 ]; then - ewarn "Cette commande doit être lancée avec l'un des users ${users[*]}" - else - ewarn "Cette commande doit être lancée avec le user ${users[0]}" - fi - if ask_yesno "Voulez-vous tenter de relancer la commande avec le bon user?" O; then - estep "Lancement du script avec le user ${users[0]}" - run_as "${users[0]}" "$@" - return 1 - elif is_root; then - return 11 - else - return 10 - fi - fi - return 0 -} -function check_hostname() { - local userhost user host path - for userhost in "$@"; do - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - [ "$MYHOSTNAME" == "${host%%.*}" ] && return 0 - done - return 1 -} -function check_userhostname() { - local userhost path user host - for userhost in "$@"; do - if check_hostname "$userhost"; then - [[ "$userhost" == *@* ]] || return 0 - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - check_user "$user" && return 0 - fi - done - return 1 -} -UTOOLS_ENSURE_HOSTNAME_SSH_OPTS=() -function ensure_hostname() { - local -a userhosts - while [ $# -gt 0 -a "$1" != "--" ]; do - array_add userhosts "$1" - shift - done - [ "$1" == "--" ] && shift - - local userhost user host path - if ! check_hostname "${userhosts[@]}"; then - if [ ${#userhosts[*]} -gt 1 ]; then - ewarn "Cette commande n'est valide que sur l'un des hôtes ${userhosts[*]}" - else - ewarn "Cette commande n'est valide que sur l'hôte ${userhosts[0]}" - fi - - enote "Vous pouvez tenter de relancer le script sur ${userhosts[0]}, mais cela requière que ce script ET les données dont il a besoin soient installés dans la même version et dans le même répertoire sur l'hôte distant" - if ask_yesno "Voulez-vous tenter de relancer le script sur l'hôte distant?" N; then - splitfsep "${userhosts[0]}" : userhost path - splituserhost "$userhost" user host - [ -n "$user" ] || user=root - - estep "Lancement de la commande sur l'hôte distant $user@$host" - local cmd - [ -n "$path" ] && cmd="$(quoted_args cd "$path"); " - cmd="$cmd$(quoted_args "$script" "$@")" - ssh -qt "${UTOOLS_ENSURE_HOSTNAME_SSH_OPTS[@]}" "$user@$host" "$cmd" - [ $? -eq 255 ] && return 12 - return 1 - else - return 11 - fi - fi - local userhost user host - for userhost in "${userhosts[@]}"; do - [[ "$userhost" == *@* ]] || continue - if check_hostname "$userhost"; then - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - [ -n "$path" ] && cd "$path" - ensure_user "$user" -- "$@" - return $? - fi - done - return 0 -} - -__AWKDEF_FUNCTIONS=' -function quote_html(s) { - gsub(/&/, "\\&", s) - gsub(/"/, "\\"", s) - gsub(/>/, "\\>", s) - gsub(/", s) - gsub(/"/, "\"", s) - gsub(/&/, "\\&", s) - return s -} -function quote_value(s) {'" - gsub(/'/, \"'\\\\''\", s) - return \"'\" s \"'\" -"'} -function quoted_values( i, line) { - line = "" - for (i = 1; i <= NF; i++) { - if (i > 1) line = line " " - line = line quote_value($i) - } - return line -} -function quote_subrepl(s) { - gsub(/\\/, "\\\\", s) - gsub(/&/, "\\\\&", s) - return s -} -function quote_grep(s) { - gsub(/[[\\.^$*]/, "\\\\&", s) - return s -} -function quote_egrep(s) { - gsub(/[[\\.^$*+?()|{]/, "\\\\&", s) - return s -} -function quote_sql(s) {'" - gsub(/'/, \"''\", s) - return \"'\" s \"'\" -"'} -function unquote_mysqlcsv(s) { - gsub(/\\n/, "\n", s) - gsub(/\\t/, "\t", s) - gsub(/\\0/, "\0", s) - gsub(/\\\\/, "\\", s) - return s -} -function array_new(dest) { - dest[0] = 0 # forcer awk à considérer dest comme un tableau - delete dest -} -function array_newsize(dest, size, i) { - dest[0] = 0 # forcer awk à considérer dest comme un tableau - delete dest - size = int(size) - for (i = 1; i <= size; i++) { - dest[i] = "" - } -} -function array_len(values, count, i) { - count = 0 - for (i in values) { - count++ - } - return count -} -function mkindices(values, indices, i, j) { - array_new(indices) - j = 1 - for (i in values) { - indices[j++] = int(i) - } - return asort(indices) -} -function array_copy(dest, src, count, indices, i) { - array_new(dest) - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - dest[indices[i]] = src[indices[i]] - } -} -function array_getlastindex(src, count, indices) { - count = mkindices(src, indices) - if (count == 0) return 0 - return indices[count] -} -function array_add(dest, value, lastindex) { - lastindex = array_getlastindex(dest) - dest[lastindex + 1] = value -} -function array_deli(dest, i, l) { - i = int(i) - if (i == 0) return - l = array_len(dest) - while (i < l) { - dest[i] = dest[i + 1] - i++ - } - delete dest[l] -} -function array_del(dest, value, ignoreCase, i) { - do { - i = key_index(value, dest, ignoreCase) - if (i != 0) array_deli(dest, i) - } while (i != 0) -} -function array_extend(dest, src, count, lastindex, indices, i) { - lastindex = array_getlastindex(dest) - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - dest[lastindex + i] = src[indices[i]] - } -} -function array_fill(dest, i) { - array_new(dest) - for (i = 1; i <= NF; i++) { - dest[i] = $i - } -} -function array_getline(src, count, indices, i, j) { - $0 = "" - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - j = indices[i] - $j = src[j] - } -} -function array_appendline(src, count, indices, i, nf, j) { - count = mkindices(src, indices) - nf = NF - for (i = 1; i <= count; i++) { - j = nf + indices[i] - $j = src[indices[i]] - } -} -function in_array(value, values, ignoreCase, i) { - if (ignoreCase) { - value = tolower(value) - for (i in values) { - if (tolower(values[i]) == value) return 1 - } - } else { - for (i in values) { - if (values[i] == value) return 1 - } - } - return 0 -} -function key_index(value, values, ignoreCase, i) { - if (ignoreCase) { - value = tolower(value) - for (i in values) { - if (tolower(values[i]) == value) return int(i) - } - } else { - for (i in values) { - if (values[i] == value) return int(i) - } - } - return 0 -} -function array2s(values, prefix, sep, suffix, noindices, first, i, s) { - if (!prefix) prefix = "[" - if (!sep) sep = ", " - if (!suffix) suffix = "]" - s = prefix - first = 1 - for (i in values) { - if (first) first = 0 - else s = s sep - if (!noindices) s = s "[" i "]=" - s = s values[i] - } - s = s suffix - return s -} -function array2so(values, prefix, sep, suffix, noindices, count, indices, i, s) { - if (!prefix) prefix = "[" - if (!sep) sep = ", " - if (!suffix) suffix = "]" - s = prefix - count = mkindices(values, indices) - for (i = 1; i <= count; i++) { - if (i > 1) s = s sep - if (!noindices) s = s "[" indices[i] "]=" - s = s values[indices[i]] - } - s = s suffix - return s -} -function array_join(values, sep, prefix, suffix, count, indices, i, s) { - s = prefix - count = mkindices(values, indices) - for (i = 1; i <= count; i++) { - if (i > 1) s = s sep - s = s values[indices[i]] - } - s = s suffix - return s -} -function printto(s, output) { - if (output == "") { - print s - } else if (output ~ /^>>/) { - sub(/^>>/, "", output) - print s >>output - } else if (output ~ /^>/) { - sub(/^>/, "", output) - print s >output - } else { - print s >output - } -} -function find_line(input, field, value, orig, line) { - orig = $0 - line = "" - while ((getline 0) { - if ($field == value) { - line = $0 - break - } - } - close(input) - $0 = orig - return line -} -function merge_line(input, field, key, line) { - line = find_line(input, field, $key) - if (line != "") $0 = $0 FS line -} -function __csv_parse_quoted(line, destl, colsep, qchar, echar, pos, tmpl, nextc, resl) { - line = substr(line, 2) - resl = "" - while (1) { - pos = index(line, qchar) - if (pos == 0) { - resl = resl line - destl[0] = "" - destl[1] = 0 - return resl - } - if (echar != "" && pos > 1) { - prevc = substr(line, pos - 1, 1) - quotec = substr(line, pos, 1) - nextc = substr(line, pos + 1, 1) - if (prevc == echar) { - tmpl = substr(line, 1, pos - 2) - resl = resl tmpl quotec - line = substr(line, pos + 1) - continue - } - tmpl = substr(line, 1, pos - 1) - if (nextc == colsep || nextc == "") { - resl = resl tmpl - destl[0] = substr(line, pos + 2) - destl[1] = nextc == colsep - return resl - } else { - resl = resl tmpl quotec - line = substr(line, pos + 1) - } - } else { - tmpl = substr(line, 1, pos - 1) - quotec = substr(line, pos, 1) - nextc = substr(line, pos + 1, 1) - if (nextc == colsep || nextc == "") { - resl = resl tmpl - destl[0] = substr(line, pos + 2) - destl[1] = nextc == colsep - return resl - } else if (nextc == qchar) { - resl = resl tmpl quotec - line = substr(line, pos + 2) - } else { - resl = resl tmpl quotec - line = substr(line, pos + 1) - } - } - } -} -function __csv_parse_unquoted(line, destl, colsep, qchar, echar, pos) { - pos = index(line, colsep) - if (pos == 0) { - destl[0] = "" - destl[1] = 0 - return line - } else { - destl[0] = substr(line, pos + 1) - destl[1] = 1 - return substr(line, 1, pos - 1) - } -} -function __array_parsecsv(fields, line, nbfields, colsep, qchar, echar, shouldparse, destl, i) { - array_new(fields) - array_new(destl) - i = 1 - shouldparse = 0 - while (shouldparse || line != "") { - if (index(line, qchar) == 1) { - value = __csv_parse_quoted(line, destl, colsep, qchar, echar) - line = destl[0] - shouldparse = destl[1] - } else { - value = __csv_parse_unquoted(line, destl, colsep, qchar, echar) - line = destl[0] - shouldparse = destl[1] - } - fields[i] = value - i = i + 1 - } - if (nbfields) { - nbfields = int(nbfields) - i = array_len(fields) - while (i < nbfields) { - i++ - fields[i] = "" - } - } - return array_len(fields) -} -BEGIN { - DEFAULT_COLSEP = "," - DEFAULT_QCHAR = "\"" - DEFAULT_ECHAR = "" -} -function array_parsecsv2(fields, line, nbfields, colsep, qchar, echar) { - return __array_parsecsv(fields, line, nbfields, colsep, qchar, echar) -} -function array_parsecsv(fields, line, nbfields, colsep, qchar, echar) { - if (colsep == "") colsep = DEFAULT_COLSEP - if (qchar == "") qchar = DEFAULT_QCHAR - if (echar == "") echar = DEFAULT_ECHAR - return __array_parsecsv(fields, line, nbfields, colsep, qchar, echar) -} -function parsecsv(line, fields) { - array_parsecsv(fields, line) - array_getline(fields) - return NF -} -function getlinecsv(file, fields) { - if (file) { - getline 1) line = line colsep - if (qchar != "" && index(value, qchar) != 0) { - if (echar != "") gsub(qchar, quote_subrepl(echar) "&", value); - else gsub(qchar, "&&", value); - } - if (qchar != "" && (index(value, mvsep) != 0 || index(value, colsep) != 0 || index(value, qchar) != 0 || __csv_should_quote(value))) { - line = line qchar value qchar - } else { - line = line value - } - } - return line -} -function array_formatcsv(fields) { - return array_formatcsv2(fields, ",", ";", "\"", "") -} -function array_printcsv(fields, output) { - printto(array_formatcsv(fields), output) -} -function get_formatcsv( fields) { - array_fill(fields) - return array_formatcsv(fields) -} -function formatcsv() { - $0 = get_formatcsv() -} -function printcsv(output, fields) { - array_fill(fields) - array_printcsv(fields, output) -} -function array_findcsv(fields, input, field, value, nbfields, orig, found, i) { - array_new(orig) - array_fill(orig) - array_new(fields) - found = 0 - while ((getline 0) { - array_parsecsv(fields, $0, nbfields) - if (fields[field] == value) { - found = 1 - break - } - } - close(input) - array_getline(orig) - if (!found) { - delete fields - if (nbfields) { - nbfields = int(nbfields) - i = array_len(fields) - while (i < nbfields) { - i++ - fields[i] = "" - } - } - } - return found -} - -function __and(var, x, l_res, l_i) { - l_res=0; - for (l_i=0; l_i < 8; l_i++){ - if (var%2 == 1 && x%2 == 1) l_res=l_res/2 + 128; - else l_res/=2; - var=int(var/2); - x=int(x/2); - } - return l_res; -} -function __lshift(var, x) { - while(x > 0){ - var*=2; - x--; - } - return var; -} -function __rshift(var, x) { - while(x > 0){ - var=int(var/2); - x--; - } - return var; -} -BEGIN { - __BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" -} -function b64decode(src, result, base1, base2, base3, base4) { - result = "" - while (length(src) > 0) { - base1 = substr(src, 1, 1) - base2 = substr(src, 2, 1) - base3 = substr(src, 3, 1); if (base3 == "") base3 = "=" - base4 = substr(src, 4, 1); if (base4 == "") base4 = "=" - byte1 = index(__BASE64, base1) - 1 - if (byte1 < 0) byte1 = 0 - byte2 = index(__BASE64, base2) - 1 - if (byte2 < 0) byte2 = 0 - byte3 = index(__BASE64, base3) - 1 - if (byte3 < 0) byte3 = 0 - byte4 = index(__BASE64, base4) - 1 - if (byte4 < 0) byte4 = 0 - result = result sprintf( "%c", __lshift(__and(byte1, 63), 2) + __rshift(__and(byte2, 48), 4) ) - if (base3 != "=") result = result sprintf( "%c", __lshift(__and(byte2, 15), 4) + __rshift(__and(byte3, 60), 2) ) - if (base4 != "=") result = result sprintf( "%c", __lshift(__and(byte3, 3), 6) + byte4 ) - src = substr(src, 5) - } - return result -} -' -function awkdef() { - - if [ "${1:0:3}" == "-f" ]; then - shift - echo "$__AWKDEF_FUNCTIONS" - fi - if [ $# -gt 0 ]; then - local __ad_arg __ad_vpos __ad_name __ad_value - echo "BEGIN {" - while [ -n "${1:0:1}" ]; do - __ad_arg="${1:0:256}" - local __ad_array= - if [ "${__ad_arg%\[@\]}" != "$__ad_arg" ]; then - __ad_array=1 - __ad_name="${__ad_arg%\[@\]}" - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_value="$__ad_name" - elif [[ "$__ad_arg" == *\[@\]=* ]]; then - __ad_array=1 - __ad_name="${__ad_arg%%\[@\]=*}" - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_vpos=$((${#__ad_name} + 4)) - __ad_value="${1:$__ad_vpos}" - [ ${#__ad_value} -ne 0 ] || __ad_value="$__ad_name" - elif [[ "$__ad_arg" == *=* ]]; then - local __ad_int= __ad_str= - __ad_name="${__ad_arg%%=*}" - __ad_vpos=$((${#__ad_name} + 1)) - if [ "${__ad_name%:int}" != "$__ad_name" ]; then - __ad_int=1 - __ad_name="${__ad_name%:int}" - elif [ "${__ad_name%:str}" != "$__ad_name" ]; then - __ad_str=1 - __ad_name="${__ad_name%:str}" - fi - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_value="${1:$__ad_vpos}" - if [ -n "$__ad_int" ]; then - echo "$__ad_name = int($(quoted_awk "$__ad_value") + 0)" - elif [ -n "$__ad_str" ]; then - echo "$__ad_name = $(quoted_awk "$__ad_value")" - elif [ ${#__ad_value} -lt 256 ] && isnum "$__ad_value"; then - echo "$__ad_name = $__ad_value" - else - echo "$__ad_name = $(quoted_awk "$__ad_value")" - fi - else - break - fi - if [ -n "$__ad_array" ]; then - if [ "${__ad_value:0:2}" == $'<\n' ]; then - local -a __ad_values - array_from_lines __ad_values "${__ad_value:2}" - __ad_value=__ad_values - fi - __ad_value="${__ad_value}[@]" - local __ad_i=1 - echo "$__ad_name[0] = 0; delete $__ad_name" - for __ad_arg in "${!__ad_value}"; do - echo "$__ad_name[$__ad_i]=$(quoted_awk "$__ad_arg")" - __ad_i=$(($__ad_i + 1)) - done - eval "echo \"\${__ad_name}_count = \${#$__ad_value}\"" - fi - shift - done - echo "}" - for __ad_arg in "$@"; do - rawecho "$__ad_arg" - done - fi -} -function lawkrun() { - local -a __ar_defs __ar_args - while [ $# -gt 0 -a "$1" != "--" ]; do - __ar_defs=("${__ar_defs[@]}" "$1") - shift - done - shift - while [ $# -gt 0 ]; do - __ar_args=("${__ar_args[@]}" "$1") - shift - done - local __ar_script="$(awkdef "${__ar_defs[@]}")" - awk "$__ar_script" "${__ar_args[@]}" -} -function cawkrun() { LANG=C lawkrun "$@"; } -function awkrun() { LANG=C lawkrun "$@"; } - -function __lf_get_age() { - local y=$(date "+%Y") - local dy=$(date "+%j"); while [ "${dy#0}" != "$dy" ]; do dy="${dy#0}"; done - [ -n "$dy" ] || dy=0 - local h=$(date "+%H"); while [ "${h#0}" != "$h" ]; do h="${h#0}"; done - [ -n "$h" ] || h=0 - echo $((($y * 365 + $dy) * 24 + $h)) -} -function lf_trylock() { - local eoo lockfile max_hours=4 - while [ -n "$1" ]; do - case "$1" in - -h) shift; max_hours="$1";; - --) shift; eoo=1;; - *) eoo=1;; - esac - [ -n "$eoo" ] && break - shift - done - - lockfile="$1" - [ -n "$lockfile" ] || die "il faut spécifier un fichier pour le verrou" - - local now="$(__lf_get_age)" - if (set -C; echo "$now" >"$lockfile") 2>/dev/null; then - return 0 - fi - local prev diff - if prev="$(<"$lockfile")"; then - diff="$(($now - $prev))" - if [ "$diff" -gt "$max_hours" ]; then - echo stale - else - echo locked - fi - elif [ -f "$lockfile" ]; then - echo retry - fi - return 1 -} -function pidfile_set() { - local eoo pidfile pid=$$ replace= - while [ -n "$1" ]; do - case "$1" in - -p) - shift - pid="$1" - ;; - -r) - replace=1 - ;; - --) - shift - eoo=1 - ;; - *) - eoo=1 - ;; - esac - [ -n "$eoo" ] && break - shift - done - - pidfile="$1" - [ -n "$pidfile" ] || return 10 - - if [ -f "$pidfile" ]; then - local curpid="$(<"$pidfile")" - if is_running "$curpid"; then - return 1 - elif [ -n "$replace" ]; then - /bin/rm -f "$pidfile" || return 10 - else - return 2 - fi - fi - - echo_ "$pid" >"$pidfile" || return 10 - autoclean "$pidfile" - return 0 -} -function pidfile_check() { - local pidfile="$1" - [ -n "$pidfile" ] || return 10 - - if [ -f "$pidfile" ]; then - [ -r "$pidfile" ] || return 10 - local pid="$(<"$pidfile")" - is_running "$pid" && return 0 - fi - return 1 -} -function page_maybe() { - if isatty; then - less -XF "$@" - else - cat - fi -} - - -function utools_local() { - local arg - [ $# -gt 0 ] || set -- opts verbosity interaction - for arg in "$@"; do - case "$arg" in - parse_opts|opts|o|args) echo "local -a args";; - verbosity|v) echo "local __verbosity='$__verbosity'";; - interaction|i) echo "local __interaction='$__interaction'";; - esac - done -} - -function isatty() { - tty -s <&1 -} -function in_isatty() { - tty -s -} -function out_isatty() { - tty -s <&1 -} -function err_isatty() { - tty -s <&2 -} -function die() { [ $# -gt 0 ] && eerror "$@"; exit 1; } -function exit_with { if [ $# -gt 0 ]; then "$@"; fi; exit $?; } -function die_with { [ $# -gt 0 ] && eerror "$1"; shift; [ $# -gt 0 ] && "$@"; exit 1; } -function die_unless() { - local count=$# - if [ $count -eq 0 ]; then - exit 1 - elif [ $count -eq 1 ]; then - "$@" || exit $? - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - : - else - r=$? - eerror "$m" - exit $r - fi - fi -} -function eerror_unless() { - local count=$# - if [ $count -eq 0 ]; then - return 1 - elif [ $count -eq 1 ]; then - "$@" || return $? - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - : - else - r=$? - eerror "$m" - return $r - fi - fi -} -function die_if() { - local count=$# - if [ $count -eq 0 ]; then - : - elif [ $count -eq 1 ]; then - "$@" && exit 1 - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - eerror "$m" - exit 1 - fi - fi -} -function eerror_if() { - local count=$# - if [ $count -eq 0 ]; then - : - elif [ $count -eq 1 ]; then - "$@" && return 1 - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - eerror "$m" - return 1 - fi - fi -} - -TAB=$'\t' -LATIN1=iso-8859-1 -LATIN9=iso-8859-15 -UTF8=utf-8 -OENC="$UTF8" - -if ! progexists iconv; then - function iconv() { cat; } -fi - -function __lang_encoding() { - local lang="$(<<<"$LANG" awk '{ print tolower($0) }')" - case "$lang" in - *@euro) echo "iso-8859-15";; - *.utf-8|*.utf8) echo "utf-8";; - *) echo "iso-8859-1";; - esac -} -function __norm_encoding() { - awk '{ - enc = tolower($0) - gsub(/^latin$/, "latin1", enc) - gsub(/^latin1$/, "iso-8859-1", enc) - gsub(/^latin9$/, "iso-8859-15", enc) - gsub(/[-_]/, "", enc) - if (enc == "iso8859" || enc == "iso88591" || enc == "8859" || enc == "88591") print "iso-8859-1" - else if (enc == "iso885915" || enc == "885915") print "iso-8859-15" - else if (enc == "utf" || enc == "utf8") print "utf-8" - else print $0 - }' <<<"$1" -} -function __init_encoding() { - local DEFAULT_ENCODING="$(__lang_encoding)" - [ -n "$DEFAULT_ENCODING" ] || DEFAULT_ENCODING=utf-8 - [ -n "$UTOOLS_OUTPUT_ENCODING" ] || UTOOLS_OUTPUT_ENCODING="$DEFAULT_ENCODING" - UTOOLS_OUTPUT_ENCODING="$(__norm_encoding "$UTOOLS_OUTPUT_ENCODING")" - [ -n "$UTOOLS_INPUT_ENCODING" ] || UTOOLS_INPUT_ENCODING="$UTOOLS_OUTPUT_ENCODING" - UTOOLS_INPUT_ENCODING="$(__norm_encoding "$UTOOLS_INPUT_ENCODING")" - [ -n "$UTOOLS_EDITOR_ENCODING" ] || UTOOLS_EDITOR_ENCODING="$UTOOLS_INPUT_ENCODING" - UTOOLS_EDITOR_ENCODING="$(__norm_encoding "$UTOOLS_EDITOR_ENCODING")" - - IENC="$UTOOLS_INPUT_ENCODING" - OENC="$UTOOLS_OUTPUT_ENCODING" -} - -if [ -n "$UTOOLS_LANG" -a -z "$LANG" ]; then - export UTOOLS_LANG - export LANG="$UTOOLS_LANG" -fi -__init_encoding - -function tooenc() { - local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - rawecho "$src" - else - iconv -f "$from" -t "$to" <<<"$src" - fi -} -function uecho() { - tooenc "$*" -} -function tooenc_() { - local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - rawecho_ "$src" - else - rawecho_ "$src" | iconv -f "$from" -t "$to" - fi -} -function uecho_() { - tooenc_ "$*" -} -function toienc() { - local __tie_var="$1" __tie_to="${2:-$IENC}" __tie_from="${3:-$UTOOLS_INPUT_ENCODING}" - if [ "$__tie_from" != "$__tie_to" ]; then - set_var "$__tie_var" "$(iconv -f "$__tie_from" -t "$__tie_to" <<<"${!__tie_var}")" - fi -} -function uread() { - [ $# -gt 0 ] || set -- REPLY - local __r_var - read "$@" - for __r_var in "$@"; do - [ -z "$__r_var" -o "${__r_var:0:1}" == "-" ] && continue # ignorer les options - toienc "$__r_var" - done -} - -function stooenc() { - local from="${1:-$OENC}" to="${2:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - cat - else - iconv -f "$from" -t "$to" - fi -} -function stoienc() { - local to="${1:-$IENC}" from="${2:-$UTOOLS_INPUT_ENCODING}" - if [ "$from" == "$to" ]; then - cat - else - iconv -f "$from" -t "$to" - fi -} - -export UTOOLS_EDATE -function __edate() { [ -n "$UTOOLS_EDATE" ] && date +"[%d/%m/%Y-%H:%M:%S] "; } - -export UTOOLS_ELOG_OVERWRITE -function __set_no_colors() { :; } -function elogto() { - UTOOLS_EDATE=1 - if [ -n "$1" -a -n "$2" ]; then - LANG=fr_FR.UTF8 - UTOOLS_OUTPUT_ENCODING="$UTF8" - __set_no_colors 1 - if [ -n "$UTOOLS_ELOG_OVERWRITE" ]; then - exec >"$1" 2>"$2" - else - exec >>"$1" 2>>"$2" - fi - elif [ -n "$1" ]; then - LANG=fr_FR.UTF8 - UTOOLS_OUTPUT_ENCODING="$UTF8" - __set_no_colors 1 - if [ -n "$UTOOLS_ELOG_OVERWRITE" ]; then - exec >"$1" 2>&1 - else - exec >>"$1" 2>&1 - fi - fi -} - -export __estack __tlevel -function __indent() { - if [ "${1/ -/}" != "$1" ]; then - sed "2,\$s/^/${__tlevel}/g" <<<"$1" - else - rawecho "$1" - fi -} -function __eerror() { tooenc "$(__edate)${__tlevel}* error: $(__indent "$1")"; } -function __ewarn() { tooenc "$(__edate)${__tlevel}* warning: $(__indent "$1")"; } -function __enote() { tooenc "$(__edate)${__tlevel}* note: $(__indent "$1")"; } -function __ebanner() { - local maxi="${COLUMNS:-80}" - local -a lines - local psfix line - - psfix="$(__edate)${__tlevel}" - while [ ${#psfix} -lt $maxi ]; do psfix="$psfix="; done - - tooenc "$psfix" - maxi=$(($maxi - 1)) - array_from_xlines lines "$1" - for line in "" "${lines[@]}" ""; do - line="$(__edate)${__tlevel}= $line" - if [ ${#line} -le $maxi ]; then - while [ ${#line} -lt $maxi ]; do line="$line "; done - line="$line=" - fi - tooenc "$line" - done - tooenc "$psfix" -} -function __eimportant() { tooenc "$(__edate)${__tlevel}* important: $(__indent "$1")"; } -function __eattention() { tooenc "$(__edate)${__tlevel}* attention: $(__indent "$1")"; } -function __einfo() { tooenc "$(__edate)${__tlevel}* info: $(__indent "$1")"; } -function __eecho() { tooenc "$(__edate)${__tlevel}$(__indent "$1")"; } -function __eecho_() { tooenc_ "$(__edate)${__tlevel}$(__indent "$1")"; } -function __edebug() { tooenc "$(__edate)${__tlevel}* debug: $(__indent "$1")"; } -function __estep() { tooenc "$(__edate)${__tlevel}* $(__indent "$1")"; } -function __estepe() { __estep "$@"; } -function __estepw() { __estep "$@"; } -function __estepn() { __estep "$@"; } -function __estepi() { __estep "$@"; } -function __estep_() { tooenc_ "$(__edate)${__tlevel}* $(__indent "$1")"; } -function __estepe_() { __estep_ "$@"; } -function __estepw_() { __estep_ "$@"; } -function __estepn_() { __estep_ "$@"; } -function __estepi_() { __estep_ "$@"; } -function __etitle() { tooenc "$(__edate)${__tlevel}+++ $(__indent "$1")"; } -function __ebegin() { tooenc_ "$(__edate)${__tlevel}* $(__indent "$1"): "; } -function __edoto() { echo_ "."; } -function __edotw() { echo_ "w"; } -function __edotx() { echo_ "x"; } -function __edotp() { echo_ "+"; } -function __edotd() { tooenc "($1)"; } -function __eendo() { echo "[ok]"; } -function __eendx() { echo "[error]"; } -PRETTYOPTS=() -function set_verbosity() { :;} -function set_interaction() { :;} -function show_error() { - return 0 -} -function show_warn() { - return 0 -} -function show_info() { - return 0 -} -function show_verbose() { - return 0 -} -function show_debug() { - [ -n "$DEBUG" ] -} -function check_verbosity() { - return 0 -} -function get_verbosity_option() { :;} -function check_interaction() { - return 0 -} -function is_interaction() { - return 1 -} -function get_interaction_option() { :;} -__epending= -function eflush() { - if [ -n "$__epending" ]; then rawecho "$__epending" 1>&2; __epending=; fi -} -function eclearp() { - __epending= -} -function eerror() { - show_error || return; eflush; __eerror "$*" 1>&2 -} -function ewarn() { - show_warn || return; eflush; __ewarn "$*" 1>&2 -} -function enote() { - show_info || return; eflush; __enote "$*" 1>&2 -} -function ebanner() { - show_error || return; eflush; __ebanner "$*" 1>&2; sleep 5 -} -function eimportant() { - show_error || return; eflush; __eimportant "$*" 1>&2 -} -function eattention() { - show_warn || return; eflush; __eattention "$*" 1>&2 -} -function einfo() { - show_info || return; eflush; __einfo "$*" 1>&2 -} -function eecho() { - show_info || return; eflush; __eecho "$*" 1>&2 -} -function eecho_() { - show_info || return; eflush; __eecho_ "$*" 1>&2 -} -function edebug() { - show_debug || return; eflush; __edebug "$*" 1>&2 -} -function trace() { - local r cmd="$(quoted_args "$@")" - show_info && { eflush; __eecho "\$ $cmd" 1>&2; } - "$@"; r=$? - if [ $r -ne 0 ]; then - if show_info; then - eflush; __eecho "^ [EC #$r]" 1>&2 - elif show_error; then - eflush; __eecho "^ $cmd [EC #$r]" 1>&2; - fi - fi - return $r -} -function trace_error() { - local r - "$@"; r=$? - if [ $r -ne 0 ]; then - local cmd="$(quoted_args "$@")" - show_error && { eflush; __eecho "^ $cmd [EC #$r]" 1>&2; } - fi - return $r -} - -function etitle() { - local __t_deferred= - __t_etitle "$@" -} -function etitled() { - local __t_deferred=1 - __t_etitle "$@" -} -function __t_etitle() { - local __t_eend=default - local __t_clearp= - while [ -n "$1" ]; do - if [ "$1" == "--" ]; then - shift - break - elif [ "$1" == "-s" ]; then - __t_eend= - shift - elif [ "$1" == "--eend" ]; then - __t_eend=1 - shift - elif [ "$1" == "-p" ]; then - __t_clearp=1 - shift - else - break - fi - done - local __t_title="$1"; shift - local __t_s=0 - [ -n "$__estack" ] && __tlevel="${__tlevel} " - __estack="$__estack:t" - if show_info; then - if [ -n "$__t_deferred" ]; then - __epending="${__epending:+$__epending -}$(__etitle "$__t_title")" - else - eflush - __etitle "$__t_title" 1>&2 - fi - fi - if [ $# -gt 0 ]; then - "$@" - __t_s=$? - [ "$__t_eend" == "default" ] && __t_eend=1 - fi - [ "$__t_eend" == "default" ] && __t_eend= - if [ -n "$__t_eend" ]; then - eend $__t_s - [ -n "$__t_clearp" ] && eclearp - fi - return $__t_s -} -function estep() { - show_info || return; eflush; __estep "$*" 1>&2 -} -function estepe() { - show_info || return; eflush; __estepe "$*" 1>&2 -} -function estepw() { - show_info || return; eflush; __estepw "$*" 1>&2 -} -function estepn() { - show_info || return; eflush; __estepn "$*" 1>&2 -} -function estepi() { - show_info || return; eflush; __estepi "$*" 1>&2 -} -function estep_() { - show_info || return; eflush; __estep_ "$*" 1>&2 -} -function estepe_() { - show_info || return; eflush; __estepe_ "$*" 1>&2 -} -function estepw_() { - show_info || return; eflush; __estepw_ "$*" 1>&2 -} -function estepn_() { - show_info || return; eflush; __estepn_ "$*" 1>&2 -} -function estepi_() { - show_info || return; eflush; __estepi_ "$*" 1>&2 -} -function ebegin() { - local __b_eend=default - while [ -n "$1" ]; do - if [ "$1" == "--" ]; then - shift - break - elif [ "$1" == "-s" ]; then - __b_eend= - shift - elif [ "$1" == "--eend" ]; then - __b_eend=1 - shift - else - break - fi - done - local __b_msg="$1"; shift - local __b_s=0 - __estack="$__estack:b" - if show_info; then - eflush - __ebegin "$__b_msg" 1>&2 - fi - if [ $# -gt 0 ]; then - "$@" - __b_s=$? - [ "$__b_eend" == "default" ] && __b_eend=1 - fi - [ "$__b_eend" == "default" ] && __b_eend= - [ -n "$__b_eend" ] && eend $__b_s - return $__b_s -} -function edot() { - local s=$? - show_info || return - eflush - [ -n "$1" ] && s="$1" - shift - if [ "$s" == "0" ]; then - __edoto 1>&2 - else - __edotx 1>&2 - fi - show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2 - return $s -} -function edotw() { - local s=$? - show_info || return - eflush - [ -n "$1" ] && s="$1" - shift - __edotw 1>&2 - show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2 - return $s -} -function ewait() { - [ -n "$1" ] || return 1 - if show_info; then - local count=2 - eflush - little_sleep # certains processus retournent tout de suite - while is_running "$1"; do - sleep 1 - if [ $count -gt 0 ]; then - count=$(($count - 1)) - else - __edotp 1>&2 - fi - done - __edoto 1>&2 - else - wait "$1" - fi -} -function eend() { - local s=$? - if [ "$1" == "-c" ]; then - __estack= - __tlevel= - elif [ "${__estack%:b}" != "$__estack" ]; then - __estack="${__estack%:b}" - show_info || return - eflush - [ -n "$1" ] && s="$1" - if [ "$s" == "0" ]; then - __eendo 1>&2 - else - __eendx 1>&2 - fi - elif [ "${__estack%:t}" != "$__estack" ]; then - __estack="${__estack%:t}" - __tlevel="${__tlevel% }" - fi -} -function ask_yesno() { - local interactive=1 - if [[ "$1" == -* ]]; then - if [ "$1" != -- ]; then - check_interaction "$1" || interactive= - fi - shift - else - check_interaction -c || interactive= - fi - local default="${2:-N}" - if [ "$default" == "C" ]; then - [ -n "$interactive" ] && default=N || default=O - elif [ "$default" == "X" ]; then - [ -n "$interactive" ] && default=O || default=N - fi - if [ -n "$interactive" ]; then - eflush - local message="$1" - local prompt="[oN]" - local r - is_yes "$default" && prompt="[On]" - if [ -n "$message" ]; then - tooenc_ "$message" 1>&2 - else - tooenc_ "Voulez-vous continuer?" "$UTF8" 1>&2 - fi - tooenc_ " $prompt " "$UTF8" 1>&2 - uread r - is_yes "${r:-$default}" - else - is_yes "$default" - fi -} -function read_value() { - local -a __rv_opts __rv_readline=1 __rv_showdef=1 __rv_nl= - __rv_opts=() - [ -n "$UTOOLS_NO_READLINE" ] && __rv_readline= - __rv_read "$@" -} -function read_password() { - local -a __rv_opts __rv_readline= __rv_showdef= __rv_nl=1 - __rv_opts=(-s) - __rv_read "$@" -} -function __rv_read() { - local __rv_int=1 - if [[ "$1" == -* ]]; then - if [ "$1" != -- ]; then - check_interaction "$1" || __rv_int= - fi - shift - else - check_interaction -c || __rv_int= - fi - local __rv_msg="$1" __rv_v="${2:-value}" __rv_d="$3" __rv_re="${4:-O}" - if [ -z "$__rv_int" ]; then - if is_yes "$__rv_re" && [ -z "$__rv_d" ]; then - OENC="$UTF8" eerror "La valeur par défaut de $__rv_v doit être non vide" - return 1 - fi - set_var "$__rv_v" "$__rv_d" - return 0 - fi - - eflush - local __rv_r - while true; do - if [ -n "$__rv_msg" ]; then - tooenc_ "$__rv_msg" 1>&2 - else - tooenc_ "Entrez la valeur" "$UTF8" 1>&2 - fi - if [ -n "$__rv_readline" ]; then - tooenc_ ": " "$UTF8" 1>&2 - uread -e ${__rv_d:+-i"$__rv_d"} "${__rv_opts[@]}" __rv_r - else - if [ -n "$__rv_d" ]; then - if [ -n "$__rv_showdef" ]; then - tooenc_ " [$__rv_d]" 1>&2 - else - tooenc_ " [****]" 1>&2 - fi - fi - tooenc_ ": " "$UTF8" 1>&2 - uread "${__rv_opts[@]}" __rv_r - [ -n "$__rv_nl" ] && echo - fi - __rv_r="${__rv_r:-$__rv_d}" - if [ -n "$__rv_r" ] || ! is_yes "$__rv_re"; then - set_var "$__rv_v" "$__rv_r" - return 0 - fi - done -} -function simple_menu() { - local __sm_title= __sm_yourchoice= __sm_default= - local -a __sm_args - parse_opts -t: __sm_title= -m: __sm_yourchoice= -d: __sm_default= @ __sm_args -- "$@" && - set -- "${__sm_args[@]}" || ewarn "$__sm_args" - - local __sm_option_var="${1:-option}" __sm_options_var="${2:-options}" - local __sm_option __sm_options - __sm_options="$__sm_options_var[*]" - if [ -z "${!__sm_options}" ]; then - OENC="$UTF8" eerror "Le tableau $__sm_options_var doit être non vide" - return 1 - fi - [ -z "$__sm_default" ] && __sm_default="${!__sm_option_var}" - - eflush - array_copy __sm_options "$__sm_options_var" - local __sm_c=0 __sm_i __sm_choice - while true; do - if [ "$__sm_c" == "0" ]; then - [ -n "$__sm_title" ] && tooenc "=== $__sm_title ===" 1>&2 - __sm_i=1 - for __sm_option in "${__sm_options[@]}"; do - if [ "$__sm_option" == "$__sm_default" ]; then - tooenc "$__sm_i*- $__sm_option" 1>&2 - else - tooenc "$__sm_i - $__sm_option" 1>&2 - fi - let __sm_i=$__sm_i+1 - done - fi - - if [ -n "$__sm_yourchoice" ]; then - tooenc_ "$__sm_yourchoice" 1>&2 - else - tooenc_ "Entrez le numéro de l'option choisie" "$UTF8" 1>&2 - fi - tooenc_ ": " "$UTF8" 1>&2 - uread __sm_choice - - if [ -z "$__sm_choice" -a -n "$__sm_default" ]; then - __sm_option="$__sm_default" - break - fi - if [ -n "$__sm_choice" -a -z "${__sm_choice//[0-9]/}" ]; then - if [ "$__sm_choice" -gt 0 -a "$__sm_choice" -le "${#__sm_options[*]}" ]; then - __sm_option="${__sm_options[$(($__sm_choice - 1))]}" - break - else - OENC="$UTF8" eerror "Numéro d'option incorrect" - fi - else - OENC="$UTF8" eerror "Vous devez saisir le numéro de l'option choisie" - fi - - let __sm_c=$__sm_c+1 - if [ "$__sm_c" -eq 5 ]; then - tooenc "" "$UTF8" 1>&2 - __sm_c=0 - fi - done - set_var "$__sm_option_var" "$__sm_option" -} - -function actions_menu() { - local -a __am_action_descs __am_options __am_void_actions - local __am_tmp __am_select_action __am_select_option __am_title __am_optyc __am_actyc - local __am_default_action=auto __am_quit_action=auto - local __am_default_option= - local -a __am_args - parse_opts \ - -t: __am_title= \ - -m: __am_optyc= \ - -M: __am_actyc= \ - -e: __am_void_actions \ - -d: __am_default_action= \ - -q: __am_quit_action= \ - -o: __am_default_option= \ - @ __am_args -- "$@" && set -- "${__am_args[@]}" || { eerror "$__am_args"; return 1; } - - __am_tmp="${1:-action}"; __am_select_action="${!__am_tmp}" - __am_tmp="${2:-option}"; __am_select_option="${!__am_tmp}" - [ -n "$__am_default_option" ] && __am_select_option="$__am_default_option" - array_copy __am_action_descs "${3:-actions}" - array_copy __am_options "${4:-options}" - - eerror_unless [ ${#__am_action_descs[*]} -gt 0 ] "Vous devez spécifier le tableau des actions" || return - __actions_menu || return 1 - setv "${1:-action}" "$__am_select_action" - setv "${2:-option}" "$__am_select_option" -} -function __actions_menu() { - local title="$__am_title" - local optyc="$__am_optyc" actyc="$__am_actyc" - local default_action="$__am_default_action" - local quit_action="$__am_quit_action" - local select_action="$__am_select_action" - local select_option="$__am_select_option" - local -a action_descs options void_actions - array_copy action_descs __am_action_descs - array_copy options __am_options - array_copy void_actions __am_void_actions - - local no_options - array_isempty options && no_options=1 - - local -a actions - local tmp action name - for tmp in "${action_descs[@]}"; do - splitfsep2 "$tmp" : action name - [ -n "$action" ] || action="${name:0:1}" - action="$(strlower "$action")" - array_addu actions "$action" - done - - if [ "$default_action" == auto ]; then - default_action="$select_action" - if [ -n "$default_action" ]; then - array_contains actions "$default_action" || default_action= - fi - [ -n "$default_action" ] || default_action="${actions[0]}" - fi - default_action="${default_action:0:1}" - default_action="$(strlower "$default_action")" - - if [ "$quit_action" == auto ]; then - if [ ${#actions[*]} -gt 1 ]; then - quit_action="${actions[@]:$((-1)):1}" - array_addu void_actions "$quit_action" - fi - fi - quit_action="${quit_action:0:1}" - quit_action="$(strlower "$quit_action")" - - local action_title - for tmp in "${action_descs[@]}"; do - splitfsep2 "$tmp" : action name - [ -n "$action" ] || action="${name:0:1}" - [ -n "$name" ] || name="$action" - action="$(strlower "$action")" - if [ -n "$no_options" ]; then - if ! array_contains void_actions "$action"; then - array_del actions "$action" - continue - fi - fi - [ "$action" == "$default_action" ] && name="$name*" - action_title="${action_title:+$action_title/}$name" - done - if [ -n "$default_action" ]; then - array_contains actions "$default_action" || default_action= - fi - if [ -n "$quit_action" ]; then - array_contains actions "$quit_action" || quit_action= - fi - - if [ -n "$no_options" ]; then - if array_isempty void_actions; then - eerror "Aucune option n'est définie. Il faut définir le tableau des actions vides" - return 1 - fi - __void_actions_menu - else - __options_actions_menu - fi -} -function __void_actions_menu() { - eflush - local c=0 choice - while true; do - if [ $c -eq 0 ]; then - [ -n "$title" ] && __etitle "$title" 1>&2 - __eecho_ "=== Actions disponibles: " 1>&2 - tooenc "$action_title" 1>&2 - fi - if [ -n "$actyc" ]; then - __eecho_ "$actyc" 1>&2 - elif [ -n "$optyc" ]; then - __eecho_ "$optyc" 1>&2 - else - __eecho_ "Entrez l'action à effectuer" 1>&2 - fi - tooenc_ ": " 1>&2 - uread choice - if [ -z "$choice" -a -n "$default_action" ]; then - select_action="$default_action" - break - fi - - choice="${choice:0:1}" - choice="$(strlower "$choice")" - if array_contains actions "$choice"; then - select_action="$choice" - break - elif [ -n "$choice" ]; then - eerror "$choice: action incorrecte" - else - eerror "vous devez saisir l'action à effectuer" - fi - let c=$c+1 - if [ $c -eq 5 ]; then - tooenc "" 1>&2 - c=0 - fi - done - __am_select_action="$select_action" - __am_select_option= -} -function __options_actions_menu() { - eflush - local c=0 option choice action option - while true; do - if [ $c -eq 0 ]; then - [ -n "$title" ] && __etitle "$title" 1>&2 - i=1 - for option in "${options[@]}"; do - if [ "$option" == "$select_option" ]; then - tooenc "$i*- $option" 1>&2 - else - tooenc "$i - $option" 1>&2 - fi - let i=$i+1 - done - __estepn_ "Actions disponibles: " 1>&2 - tooenc "$action_title" 1>&2 - fi - if [ -n "$optyc" ]; then - __eecho_ "$optyc" 1>&2 - else - __eecho_ "Entrez l'action et le numéro de l'option choisie" 1>&2 - fi - tooenc_ ": " 1>&2 - uread choice - - if [ -z "$choice" -a -n "$default_action" ]; then - action="$default_action" - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - elif [ -n "$select_option" ]; then - select_action="$action" - break - fi - fi - action="${choice:0:1}" - action="$(strlower "$action")" - if array_contains actions "$action"; then - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - else - option="${choice:1}" - option="${option// /}" - if [ -z "$option" -a -n "$select_option" ]; then - select_action="$action" - break - elif [ -z "$option" ]; then - eerror "vous devez saisir le numéro de l'option" - elif isnum "$option"; then - if [ $option -gt 0 -a $option -le ${#options[*]} ]; then - select_action="$action" - select_option="${options[$(($option - 1))]}" - break - fi - else - eerror "$option: numéro d'option incorrecte" - fi - fi - elif isnum "$choice"; then - action="$default_action" - if [ -n "$action" ]; then - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - else - option="${choice// /}" - if [ -z "$option" ]; then - eerror "vous devez saisir le numéro de l'option" - elif isnum "$option"; then - if [ $option -gt 0 -a $option -le ${#options[*]} ]; then - select_action="$action" - select_option="${options[$(($option - 1))]}" - break - fi - else - eerror "$option: numéro d'option incorrecte" - fi - fi - else - eerror "Vous devez spécifier l'action à effectuer" - fi - elif [ -n "$choice" ]; then - eerror "$choice: action et/ou option incorrecte" - else - eerror "vous devez saisir l'action à effectuer" - fi - let c=$c+1 - if [ $c -eq 5 ]; then - tooenc "" 1>&2 - c=0 - fi - done - __am_select_action="$select_action" - __am_select_option="$select_option" -} - - -function __ac_forgetall() { __ac_files=(); } -__ac_forgetall -function __ac_trap() { - local file - for file in "${__ac_files[@]}"; do - [ -e "$file" ] && rm -rf "$file" 2>/dev/null - done - __ac_forgetall -} -trap __ac_trap 1 3 15 EXIT -function autoclean() { - local file - for file in "$@"; do - [ -n "$file" ] && array_add __ac_files "$file" - done -} -function ac_cleanall() { - __ac_trap -} -function ac_clean() { - local file - for file in "$@"; do - if array_contains __ac_files "$file"; then - [ -e "$file" ] && rm -rf "$file" 2>/dev/null - array_del __ac_files "$file" - fi - done -} -function ac_set_tmpfile() { - local __acst_d - if show_debug; then - if [ -n "$5" ]; then - is_yes "${!5}" && __acst_d=1 - else - __acst_d=1 - fi - fi - if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" - [ -f "$3" -a "$4" == keep ] || >"$3" - else - local __acst_t="$(mktempf "$2")" - autoclean "$__acst_t" - set_var "$1" "$__acst_t" - fi -} -function ac_set_tmpdir() { - local __acst_d - if show_debug; then - if [ -n "$4" ]; then - is_yes "${!4}" && __acst_d=1 - else - __acst_d=1 - fi - fi - if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" - mkdir -p "$3" - else - local __acst_t="$(mktempd "$2")" - autoclean "$__acst_t" - set_var "$1" "$__acst_t" - fi -} -function debug_tee() { - if show_debug; then - tee "$@" - else - cat - fi -} - - -function get_defaults_files() { - local __gd_dest="${1:-defaults}"; shift - local -a __gd_fs - local __gd_f __gd_found - for __gd_f in "$@"; do - __gd_found= - if [ -r "/etc/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "/etc/default/$__gd_f") - __gd_found=1 - fi - if [ -r "$HOME/etc/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "$HOME/etc/default/$__gd_f") - __gd_found=1 - fi - if [ -z "$__gd_found" -a -r "$scriptdir/lib/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "$scriptdir/lib/default/$__gd_f") - fi - done - array_copy "$__gd_dest" __gd_fs -} - -function set_defaults() { - local -a __sd_fs - local __sd_f - get_defaults_files __sd_fs "$@" - for __sd_f in "${__sd_fs[@]}"; do - source "$__sd_f" - done -} - - -: "${MYHOST:=$HOSTNAME}" -: "${MYHOSTNAME:=${MYHOST%%.*}}" -export MYHOST MYHOSTNAME - -function myhost() { - hostname -f 2>/dev/null || echo "$MYHOST" -} -function myhostname() { - hostname -s 2>/dev/null || echo "$MYHOSTNAME" -} -##@inc]base -uprovide base.tools -urequire base - -function base_umove() { - local -a args - local updatedir - args=(-d:,--updatedir: .) - parse_args_check "$@" || return; set -- "${args[@]}" - - eerror_unless [ -z "$updatedir" -o -d "$updatedir" ] "$updatedir: doit être un répertoire" || return - eerror_if [ $# -eq 0 ] "Vous devez spécifier les fichiers à déplacer" || return - eerror_if [ $# -eq 1 ] "Vous devez spécifier la destination" || return - - local -a srcs - local dest - - srcs=("$@") - setx dest=last_value srcs - array_del_last srcs - - if [ $# -eq 2 ]; then - if [ -d "$dest" ]; then - : # ce cas sera traité ci-dessous - elif [ -e "$dest" ]; then - eerror "$dest: refus d'écraser la destination" - return 1 - else - src="${srcs[0]}" - if [ -n "$updatedir" ]; then - if [ -L "$src" ]; then - ldest="$(readlinka "$src")" - array_find_links update_links "$ldest" "$updatedir" - else - array_find_links update_links "$src" "$updatedir" - fi - move_file "$src" "$dest" "${update_links[@]}" - else - move_link "$src" "$dest" - fi - return $? - fi - fi - - [ -d "$dest" ] || { - eerror "$dest: doit être un répertoire" - return 1 - } - for src in "${srcs[@]}"; do - if [ -n "$updatedir" ]; then - if [ -L "$src" ]; then - move_link "$src" "$dest" - else - array_find_links update_links "$src" "$updatedir" - move_file "$src" "$dest" "${update_links[@]}" - fi - else - move_link "$src" "$dest" - fi - done -} -##@inc]base.tools -##@inc[base.compat -## Fonctions de base: support des fonctions obsolètes et des versions de bash < 4.x -##@inc[base.core -## Fonctions de base: fondement -uprovide base.core - -function echo_() { - echo -n "$*" -} -function recho() { - if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - - local first="${1:1}"; shift - echo "$first$@" - else - echo "$@" - fi -} -function recho_() { - if [[ "${1:0:2}" == -[eEn] ]]; then - echo -n - - local first="${1:1}"; shift - echo -n "$first$@" - else - echo -n "$@" - fi -} -function _qval() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s//\$/\\\$}" - s="${s//\`/\\\`}" - recho_ "$s" -} -function should_quote() { - local l="${#1}" - [ $l -eq 0 -o $l -gt 80 ] && return 0 - local s="${*//[a-zA-Z0-9]/}" - s="${s//,/}" - s="${s//./}" - s="${s//+/}" - s="${s//\//}" - s="${s//-/}" - s="${s//_/}" - s="${s//=/}" - [ -n "$s" ] -} -function qval() { - echo -n \" - _qval "$@" - echo \" -} -function qvalm() { - if should_quote "$*"; then - echo -n \" - _qval "$@" - echo \" - else - recho "$*" - fi -} -function qvalr() { - if [ -z "$*" ]; then - : - elif should_quote "$*"; then - echo -n \" - _qval "$@" - echo \" - else - recho "$*" - fi -} -function qvals() { - local arg first=1 - for arg in "$@"; do - [ -z "$first" ] && echo -n " " - if should_quote "$arg"; then - echo -n \" - _qval "$arg" - echo -n \" - else - recho_ "$arg" - fi - first= - done - [ -z "$first" ] && echo -} -function qwc() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s//\$/\\\$}" - s="${s//\`/\\\`}" - local r a b - while [ -n "$s" ]; do - if [[ "$s" == *\** ]]; then - if [[ "$s" == *\?* ]]; then - a="${s%%\**}" - b="${s%%\?*}" - if [ ${#a} -lt ${#b} ]; then - s="${s#*\*}" - r="$r\"$a\"*" - else - s="${s#*\?}" - r="$r\"$b\"?" - fi - else - a="${s%%\**}" - s="${s#*\*}" - r="$r\"$a\"*" - fi - elif [[ "$s" == *\?* ]]; then - if [[ "$s" == *\** ]]; then - a="${s%%\**}" - b="${s%%\?*}" - if [ ${#a} -lt ${#b} ]; then - s="${s#*\*}" - r="$r\"$a\"*" - else - s="${s#*\?}" - r="$r\"$b\"?" - fi - else - a="${s%%\?*}" - s="${s#*\?}" - r="$r\"$a\"?" - fi - else - r="$r\"$s\"" - break - fi - done - recho_ "$r" -} -function qlines() { - sed "s/'/'\\\\''/g; s/.*/'&'/g" -} -function setv() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - eval "$__s_var=\"\$*\"" -} -function _setv() { - local __s_var="$1"; shift - eval "$__s_var=\"\$*\"" -} -function echo_setv() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - echo "$__s_var=$(qvalr "$*")" -} -function setx() { - if [ "$1" == -a ]; then - shift - local __s_array="$1"; shift - if [[ "$__s_array" == *=* ]]; then - set -- "${__s_array#*=}" "$@" - __s_array="${__s_array%%=*}" - fi - eval "$__s_array=($("$@" | qlines))" - else - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - eval "$__s_var="'"$("$@")"' - fi -} -function _setvx() { - local __s_var="$1"; shift - eval "$__s_var="'"$("$@")"' -} -function _setax() { - local __s_array="$1"; shift - eval "$__s_array=($("$@" | qlines))" -} -function evalx() { - local __e_val __e_arg __e_r=0 - local -a __e_cmd - - local __e_first=1 - while [ $# -gt 0 ]; do - __e_cmd=() - while [ $# -gt 0 ]; do - __e_arg="$1"; shift - [ "$__e_arg" == // ] && break - if [ "${__e_arg%//}" != "$__e_arg" ]; then - local __e_tmp="${__e_arg%//}" - if [ -z "${__e_tmp//\\/}" ]; then - __e_arg="${__e_arg#\\}" - __e_cmd=("${__e_cmd[@]}" "$__e_arg") - continue - fi - fi - __e_cmd=("${__e_cmd[@]}" "$__e_arg") - done - - if [ -n "$__e_first" ]; then - __e_val="$("${__e_cmd[@]}")" || __e_r=$? - else - __e_val="$("${__e_cmd[@]}" "$__e_val")" || __e_r=$? - fi - __e_first= - done - [ -n "$__e_val" ] && echo "$__e_val" - return $__e_r -} -function setxx() { - local -a __s_args - if [ "$1" == -a ]; then __s_args=(-a); shift; fi - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - __s_args=("${__s_args[@]}" "$__s_var") - setx "${__s_args[@]}" evalx "$@" -} -function evalp() { - local __e_arg __e_cmd - - while [ $# -gt 0 ]; do - __e_arg="$1"; shift - if [ "$__e_arg" == // ]; then - __e_cmd="$__e_cmd |" - continue - elif [ "${__e_arg%//}" != "$__e_arg" ]; then - local __e_tmp="${__e_arg%//}" - if [ -z "${__e_tmp//\\/}" ]; then - __e_arg="${__e_arg#\\}" - fi - fi - __e_cmd="${__e_cmd:+$__e_cmd }\"$(_qval "$__e_arg")\"" - done - eval "$__e_cmd" -} -function setxp() { - local -a __s_args - if [ "$1" == -a ]; then __s_args=(-a); shift; fi - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - __s_args=("${__s_args[@]}" "$__s_var") - setx "${__s_args[@]}" evalp "$@" -} -function testx() { - local __t_op="$1"; shift - local __t_val="$(evalx "$@")" - [ $__t_op "$__t_val" ] -} -function test2x() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalx "$@")" - [ "$__t_val1" $__t_op "$__t_val2" ] -} -function testrx() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalx "$@")" - eval '[[ "$__t_val1" '"$__t_op"' "$__t_val2" ]]' -} -function testp() { - local __t_op="$1"; shift - local __t_val="$(evalp "$@")" - [ $__t_op "$__t_val" ] -} -function test2p() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalp "$@")" - [ "$__t_val1" $__t_op "$__t_val2" ] -} -function testrp() { - local __t_val1="$1"; shift - local __t_op="$1"; shift - local __t_val2="$(evalp "$@")" - eval '[[ "$__t_val1" '"$__t_op"' "$__t_val2" ]]' -} - -function err2out() { - "$@" 2>&1 -} - -function is_defined() { - [ -n "$(declare -p "$1" 2>/dev/null)" ] -} -function is_array() { - case "$(declare -p "$1" 2>/dev/null)" in declare\ -a*) return 0;; esac - return 1 -} - -function upvar() { - if unset -v "$1"; then - if [ $# -eq 2 ]; then - eval "$1=\"\$2\"" - else - eval "$1=(\"\${@:2}\")" - fi - fi -} -function array_upvar() { - unset -v "$1" && eval "$1=(\"\${@:2}\")" -} -function upvars() { - while [ $# -gt 0 ]; do - case "$1" in - -a) - unset -v "$2" && eval "$2=(\"\${@:3}\")" - break - ;; - -a*) - unset -v "$2" && eval "$2=(\"\${@:3:${1#-a}}\")" - shift $((${1#-a} + 2)) || return 1 - ;; - *) - unset -v "$1" && eval "$1=\"\$2\"" - shift; shift - ;; - esac - done -} - -function __ab_process_pending() { - local -a values - case "$mode" in - cmd) values="$("${pending[@]}")";; - ssplit) eval "values=($("${pending[@]}"))";; - lsplit) eval "values=($("${pending[@]}" | qlines))";; - add) values=("${pending[@]}");; - esac - cmd=("${cmd[@]}" "${values[@]}") - pending=() -} -function array_buildcmd() { - local desta="$1"; shift; local "$desta" - local mode=add - local -a pending cmd - while [ $# -gt 0 ]; do - case "$1" in - ++c|++cmd|++) __ab_process_pending; mode=cmd;; - ++s|++ssplit) __ab_process_pending; mode=ssplit;; - ++l|++lsplit) __ab_process_pending; mode=lsplit;; - ++a|++add) __ab_process_pending; mode=add;; - *) pending=("${pending[@]}" "$1");; - esac - shift - done - __ab_process_pending - array_upvar "$desta" "${cmd[@]}" -} -function buildcmd() { - local -a args - array_buildcmd args "$@" - qvals "${args[@]}" -} -function evalcmd() { - local -a args - array_buildcmd args "$@" - "${args[@]}" -} -##@inc]base.core -##@inc[base.num -## Fonctions de base: gestion des valeurs numériques -uprovide base.num - -function isnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//[0-9]/}" - [ -z "$v" ] -} -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - [ -z "${1//[0-9]/}" ] -} -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//./}" - v="${v//,/}" - v="${v//[0-9]/}" - [ -z "$v" ] -} -##@inc]base.num -##@inc[base.bool -## Fonctions de base: valeurs booléennes -##@inc[base.num -## Fonctions de base: gestion des valeurs numériques -uprovide base.num - -function isnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//[0-9]/}" - [ -z "$v" ] -} -function ispnum() { - [ ${#1} -gt 0 ] || return 1 - [ -z "${1//[0-9]/}" ] -} -function isrnum() { - [ ${#1} -gt 0 ] || return 1 - local v="${1#-}" - [ ${#v} -gt 0 ] || return 1 - v="${v//./}" - v="${v//,/}" - v="${v//[0-9]/}" - [ -z "$v" ] -} -##@inc]base.num -uprovide base.bool -urequire base.num - -function is_yes() { - case "${1,,}" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - esac - isnum "$1" && [ "$1" -ne 0 ] && return 0 - return 1 -} -function is_no() { - case "${1,,}" in - n|non|no|f|faux|false|off) return 0;; - esac - isnum "$1" && [ "$1" -eq 0 ] && return 0 - return 1 -} -function yesval() { - is_yes "$1" && echo 1 -} - -function setb() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - local __s_r - if "$@" >/dev/null; then - eval "$__s_var=1" - else - __s_r=$? - eval "$__s_var=" - return $__s_r - fi -} -function _setb() { - local __s_var="$1"; shift - if "$@" >/dev/null; then - eval "$__s_var=1" - else - eval "$__s_var=" - fi -} - -function evalb() { - if evalx "$@" >/dev/null; then - echo 1 - else - return $? - fi -} -function setxb() { - local __s_var="$1"; shift - if [[ "$__s_var" == *=* ]]; then - set -- "${__s_var#*=}" "$@" - __s_var="${__s_var%%=*}" - fi - setx "$__s_var" evalb "$@" -} -##@inc]base.bool -##@inc[base.quote -## Fonctions de base: protection de valeurs chaine -uprovide base.quote -urequire base.core - -function _qawk() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\"/\\\"}" - s="${s// -/\\n}" - recho_ "$s" -} -function qawk() { - echo -n \" - _qawk "$@" - echo \" -} -function qseds() { - local s="$*" - s="${s//\\/\\\\}" - s="${s//\//\\/}" - s="${s// -/\\n}" - recho "$s" -} -function _qform() { - local s="$*" - s="${s//\%/%25}" - s="${s//+/%2B}" - s="${s//&/%26}" - s="${s//=/%3D}" - s="${s// /+}" - recho_ "$s" -} -function qform() { - local s="$*" - if [[ "$s" == *=* ]]; then - _qform "${s%%=*}" - echo -n = - _qform "${s#*=}" - echo - else - _qform "$s" - echo - fi -} -function _qsql() { - local q="'" qq="''" - echo "${*//$q/$qq}" -} -function qsql() { - local q="'" qq="''" - echo "'${*//$q/$qq}'" -} -##@inc]base.quote -uprovide base.compat -urequire base.core base.num base.bool base.quote - - -function setx2() { setxx "$@"; } -function rawecho() { recho "$@"; } -function rawecho_() { recho_ "$@"; } -function quote_arg() { _qval "$@"; } -function quoted_arg() { qvalm "$@"; } -function quoted_args() { qvals "$@"; } -function set_var() { setv "$@"; } -function set_var_cmd() { echo_setv "$@"; } -function set_var_literal() { eval "$1=$2"; } - -function quote_awk() { _qawk "$@"; } -function quoted_awk() { qawk "$@"; } -function quote_seds() { qseds "$@"; } -function quote_form() { _qform "$@"; } -function quoted_form() { qform "$@"; } - - -if [ -n "$BASH_VERSINFO" -a "${BASH_VERSINFO[0]}" -lt 4 ]; then - function strlower() { tr A-Z a-z <<<"$*"; } - function strlower1() { - local str="$*" - local h="${str:0:1}" r="${str:1}" - echo "$(tr A-Z a-z <<<"$h")$r" - } - function strlowers() { - local -a vs; local v - for v in "$@"; do - vs=("${vs[@]}" "$(strlower1 "$v")") - done - echo "${vs[*]}" - } - function strupper() { tr a-z A-Z <<<"$*"; } - function strupper1() { - local str="$*" - local h="${str:0:1}" r="${str:1}" - echo "$(tr a-z A-Z <<<"$h")$r" - } - function struppers() { - local -a vs; local v - for v in "$@"; do - vs=("${vs[@]}" "$(strupper1 "$v")") - done - echo "${vs[*]}" - } - - function is_yes() { - case "$1" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - O|OUI|Y|YES|V|VRAI|T|TRUE|ON) return 0;; - esac - isnum "$1" && [ "$1" -ne 0 ] && return 0 - case "$(strlower "$1")" in - o|oui|y|yes|v|vrai|t|true|on) return 0;; - esac - return 1 - } - function is_no() { - case "$1" in - n|non|no|f|faux|false|off) return 0;; - N|NON|NO|F|FAUX|FALSE|OFF) return 0;; - esac - isnum "$1" && [ "$1" -eq 0 ] && return 0 - case "$(strlower "$1")" in - n|non|no|f|faux|false|off) return 0;; - esac - return 1 - } -fi -##@inc]base.compat -uprovide base -urequire base.init base.core base.string base.num base.bool base.array base.quote base.split base.args base.tools base.compat - -UNAME_SYSTEM=`uname -s` -[ "${UNAME_SYSTEM#CYGWIN}" != "$UNAME_SYSTEM" ] && UNAME_SYSTEM=Cygwin -[ "${UNAME_SYSTEM#MINGW32}" != "$UNAME_SYSTEM" ] && UNAME_SYSTEM=Mingw -UNAME_MACHINE=`uname -m` -if [ -n "$UTOOLS_CHROOT" ]; then - [ -n "$UTOOLS_UNAME_SYSTEM" ] && eval "UNAME_SYSTEM=$UTOOLS_UNAME_SYSTEM" - [ -n "$UTOOLS_UNAME_MACHINE" ] && eval "UNAME_MACHINE=$UTOOLS_UNAME_MACHINE" -fi - -function setyesval() { - is_yes "$2" && set_var "$1" 1 || set_var "$1" "" -} -function normyesval() { - is_yes "${2:-"${!1}"}" && set_var "$1" 1 || set_var "$1" "" -} -function normyesvals() { - local __nyv_yesvar - for __nyv_yesvar in "$@"; do - is_yes "${!__nyv_yesvar}" && set_var "$__nyv_yesvar" 1 || set_var "$__nyv_yesvar" "" - done -} -function quote_in() { - sed 's/\\/\\\\/g -s/"/\\"/g -s/\$/\\$/g -s/`/\\`/g' -} -function quote_sin() { - sed "s/'/'\\\\''/g" -} -function quote_sarg() { - quote_sin <<<"$1" -} -function quoted_sarg() { - echo "'$(quote_sarg "$1")'" -} -function quoted_sargs() { - local a s - for a in "$@"; do - s="${s:+$s }$(quoted_sarg "$a")" - done - rawecho "$s" -} - -function set_array_cmd() { - [ $# -eq 1 ] && set -- "$1" "$1" - local __sac_s __sac_v __sac_f - __sac_s="$1=("; shift - if [ "$1" == "@" ]; then - shift - else - eval "set -- \"\${$1[@]}\"" - fi - __sac_f=1 - for __sac_v in "$@"; do - [ -n "$__sac_f" ] && __sac_f= || __sac_s="$__sac_s " - __sac_s="$__sac_s$(quoted_arg "$__sac_v")" - done - __sac_s="$__sac_s)" - echo "$__sac_s" -} -function set_array() { - eval "$(set_array_cmd "$@")" -} -function array_count() { - eval "echo \${#$1[*]}" -} -function array_isempty() { - [ $(array_count "$1") -eq 0 ] -} -function array_new() { - eval "$1=()" -} -function array_add() { - local __aa_a="$1"; shift - eval "$__aa_a=(\"\${$__aa_a[@]}\" \"\$@\")" -} -function array_ins() { - local __aa_a="$1"; shift - eval "$__aa_a=(\"\$@\" \"\${$__aa_a[@]}\")" -} -function array_del() { - local __ad_v - local -a __ad_vs - eval 'for __ad_v in "${'"$1"'[@]}"; do - if [ "$__ad_v" != '"$(quoted_arg "$2")"' ]; then - array_add __ad_vs "$__ad_v" - fi -done' - array_copy "$1" __ad_vs -} -function array_addu() { - local __as_v - eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then - return 1 - fi -done' - array_add "$1" "$2" - return 0 -} -function array_set() { - array_addu "$@" -} -function array_insu() { - local __as_v - eval 'for __as_v in "${'"$1"'[@]}"; do - if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then - return 1 - fi -done' - array_ins "$1" "$2" - return 0 -} -function array_fillrange() { - local -a __af_vs - local __af_i="${2:-1}" __af_to="${3:-10}" __af_step="${4:-1}" - while [ "$__af_i" -le "$__af_to" ]; do - __af_vs=("${__af_vs[@]}" "$__af_i") - __af_i=$(($__af_i + $__af_step)) - done - array_copy "$1" __af_vs -} -function array_eq() { - local -a __ae_a1 __ae_a2 - array_copy __ae_a1 "$1" - array_copy __ae_a2 "$2" - [ ${#__ae_a1[*]} -eq ${#__ae_a2[*]} ] || return 1 - local __ae_v __ae_i=0 - for __ae_v in "${__ae_a1[@]}"; do - [ "$__ae_v" == "${__ae_a2[$__ae_i]}" ] || return 1 - __ae_i=$(($__ae_i + 1)) - done - return 0 -} -function array_contains() { - local __ac_v - eval 'for __ac_v in "${'"$1"'[@]}"; do - if [ "$__ac_v" == '"$(quoted_arg "$2")"' ]; then - return 0 - fi -done' - return 1 -} -function array_find() { - local __af_i __af_v - __af_i=0 - eval 'for __af_v in "${'"$1"'[@]}"; do - if [ "$__af_v" == '"$(quoted_arg "$2")"' ]; then - if [ -n "$3" ]; then - echo "${'"$3"'[$__af_i]}" - else - echo "$__af_i" - fi - return 0 - fi - __af_i=$(($__af_i + 1)) -done' - return 1 -} -function array_reverse() { - local -a __ar_vs - local __ar_v - array_copy __ar_vs "$1" - array_new "$1" - for __ar_v in "${__ar_vs[@]}"; do - array_ins "$1" "$__ar_v" - done -} - -function array_replace() { - local __ar_sn="$1"; shift - local __ar_f="$1"; shift - local -a __ar_s __ar_d - local __ar_v - array_copy __ar_s "$__ar_sn" - for __ar_v in "${__ar_s[@]}"; do - if [ "$__ar_v" == "$__ar_f" ]; then - __ar_d=("${__ar_d[@]}" "$@") - else - __ar_d=("${__ar_d[@]}" "$__ar_v") - fi - done - array_copy "$__ar_sn" __ar_d -} -function array_each() { - local __ae_an="$1"; shift - local __ae_f="$1"; shift - local -a __ae_a - local __ae_v - array_copy __ae_a "$__ae_an" - for __ae_v in "${__ae_a[@]}"; do - "$__ae_f" "$__ae_v" "$@" - done -} -function array_map() { - local __am_an="$1"; shift - local __am_f="$1"; shift - local -a __am_a __am_vs - local __am_v - array_copy __am_a "$__am_an" - for __am_v in "${__am_a[@]}"; do - __am_vs=("${__am_vs[@]}" "$("$__am_f" "$__am_v" "$@")") - done - array_copy "$__am_an" __am_vs -} -function first_value() { - eval "rawecho \"\${$1[@]:0:1}\"" -} -function last_value() { - eval "rawecho \"\${$1[@]:\$((-1)):1}\"" -} -function array_copy() { - eval "$1=(\"\${$2[@]}\")" -} -function array_copy_firsts() { - eval "$1=(\"\${${2:-$1}[@]:0:\$((\${#${2:-$1}[@]}-1))}\")" -} -function array_del_last() { - array_copy_firsts "$1" -} -function array_copy_lasts() { - eval "$1=(\"\${${2:-$1}[@]:1}\")" -} -function array_del_first() { - array_copy_lasts "$1" -} -function array_extend() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]}\")" -} -function array_extendu() { - local __ae_v __ae_s=1 - eval 'for __ae_v in "${'"$2"'[@]}"; do - array_addu "$1" "$__ae_v" && __ae_s=0 -done' - return "$__ae_s" -} -function array_extend_firsts() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]:0:\$((\${#$2[@]}-1))}\")" -} -function array_extend_lasts() { - eval "$1=(\"\${$1[@]}\" \"\${$2[@]:1}\")" -} -function array_xsplit() { - eval "$1=($(recho_ "$2" | awkrun RS="${3:-:}" ' -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_split() { - eval "$1=($(recho_ "$2" | awkrun RS="${3:-:}" ' -/^$/ { next } -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_from_path() { - array_split "$1" "$2" ":" -} -function array_from_xlines() { - eval "$1=($(recho_ "$2" | _nl2lf | awk ' -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_from_lines() { - eval "$1=($(recho_ "$2" | _nl2lf | awk ' -/^$/ { next } -{ - gsub(/'\''/, "'\'\\\\\'\''") - print "'\''" $0 "'\''" -}'))" #" -} -function array_join() { - local __aj_an __aj_l __aj_j __aj_s="${2:-,}" __aj_pf __aj_sf - if [ "$1" == "@" ]; then - __aj_an="\$@" - shift; shift - else - __aj_an="\${$1[@]}" - __aj_pf="$4" - __aj_sf="$5" - fi - eval 'for __aj_l in "'"$__aj_an"'"; do - __aj_j="${__aj_j:+$__aj_j'"$__aj_s"'}$__aj_pf$__aj_l$__aj_sf" -done' - if [ -n "$__aj_j" ]; then - rawecho "$__aj_j" - elif [ "$__aj_an" != "\$@" -a -n "$3" ]; then - rawecho "$3" - fi -} -function array_mapjoin() { - local __amj_src="$1" __amj_func="$2" __amj_sep="$3" - shift; shift; shift - if [ "$__amj_src" == "@" ]; then - local -a __amj_tmpsrc - __amj_tmpsrc=("$@") - __amj_src=__amj_tmpsrc - set -- - fi - local -a __amj_tmp - array_copy __amj_tmp "$__amj_src" - array_map __amj_tmp "$__amj_func" - array_join __amj_tmp "$__amj_sep" "$@" -} -function array_to_lines() { - array_join "$1" " -" "$2" "$3" "$4" -} -function array_to_path() { - array_join "$1" ":" "$2" "$3" "$4" -} -function array_fix_paths() { - local __afp_an="$1" __afp_s="${2:-:}" - local -a __afp_vs - local __afp_v - array_copy __afp_vs "$__afp_an" - array_new "$__afp_an" - for __afp_v in "${__afp_vs[@]}"; do - array_split __afp_v "$__afp_v" "$__afp_s" - array_extend "$__afp_an" __afp_v - done -} - - -function get_date_rfc822() { - LC_TIME=C date +"%a, %d %b %Y %H:%M:%S %Z" -} -function get_date_fr() { - LC_TIME=C date +"%d/%m/%Y" -} -function get_time_fr() { - LC_TIME=C date +"%Hh%M" -} -function parse_date() { - local value="$1" type="${2:-date}" - local now="$(awk 'BEGIN { print mktime(strftime("%Y %m %d 00 00 00 +0400")) }')" - case "$value" in - +*) - value="$(($now + ${value#+} * 86400))" - ;; - *) - value="$(<<<"$value" awk -F/ '{ - nd = strftime("%d"); nm = strftime("%m"); ny = strftime("%Y") - d = $1 + 0; if (d < 1) d = nd; - m = $2 + 0; if (m < 1) m = nm; - if ($3 == "") y = ny; - else { y = $3 + 0; if (y < 100) y = y + 2000; } - print mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d)); - }')" - esac - case "$type" in - d|date) awk '{ print strftime("%d/%m/%Y", $0 + 0) }' <<<"$value";; - l|ldap) awk '{ print strftime("%Y%m%d%H%M%S+0400", $0 + 0) }' <<<"$value";; - m|mysql) awk '{ print strftime("%Y-%m-%d", $0 + 0) }' <<<"$value";; - *) - rawecho "$value" - ;; - esac -} - - -function udelpath() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; ${2:-PATH}"'="${'"${2:-PATH}"'#$1:}"; '"${2:-PATH}"'="${'"${2:-PATH}"'%:$1}"; '"${2:-PATH}"'="${'"${2:-PATH}"'//:$_qdir:/:}"; [ "$'"${2:-PATH}"'" == "$1" ] && '"${2:-PATH}"'=' -} -function uaddpath() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="${'"${2:-PATH}"':+$'"${2:-PATH}"':}$1"' -} -function uinspathm() { - local _qdir="${1//\//\\/}" - eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="$1${'"${2:-PATH}"':+:$'"${2:-PATH}"'}"' -} -function uinspath() { - udelpath "$@" - uinspathm "$@" -} - -function withpath() { - [ "${1#./}" != "$1" -o "${1#../}" != "$1" -o "${1#/}" != "$1" ] -} -function withext() { - local basename="$(basename -- "$1")" - [ "${basename%.*}" != "$basename" ] -} -function normpath() { - local -a parts - local part ap - array_split parts "$1" / - if [ "${1#/}" != "$1" ]; then - ap=/ - elif [ -n "$2" ]; then - ap="$2" - else - ap="$(pwd)" - fi - for part in "${parts[@]}"; do - if [ "$part" == "." ]; then - continue - elif [ "$part" == ".." ]; then - ap="${ap%/*}" - [ -n "$ap" ] || ap=/ - else - [ "$ap" != "/" ] && ap="$ap/" - ap="$ap$part" - fi - done - rawecho "$ap" -} -function abspath() { - local ap="$1" - if [ "${ap#/}" != "$ap" ]; then - __normpath "$ap" && return - else - local cwd - if [ -n "$2" ]; then - cwd="$(abspath "$2")" - else - cwd="$(pwd)" - fi - ap="$cwd/$ap" - __normpath "$ap" && return - fi - normpath "$ap" -} -function __normpath() { - if [ -d "$1" ]; then - if [ -x "$1" ]; then - (cd "$1"; pwd) - return 0 - fi - elif [ -f "$1" ]; then - local dn="$(dirname -- "$1")" bn="$(basename -- "$1")" - if [ -x "$dn" ]; then - (cd "$dn"; echo "$(pwd)/$bn") - return 0 - fi - fi - return 1 -} -function parentdirs() { - array_new "$1" - local __pd_d="$(abspath "$2")" - if [[ "$3" == r* ]]; then - while [ "$__pd_d" != "/" ]; do - array_ins "$1" "$__pd_d" - __pd_d="$(dirname "$__pd_d")" - done - else - while [ "$__pd_d" != "/" ]; do - array_add "$1" "$__pd_d" - __pd_d="$(dirname "$__pd_d")" - done - fi -} -function ppath() { - local path="$1" cwd="$2" - - path="$(abspath "$path")" # essayer de normaliser le chemin - [ -n "$cwd" ] || cwd="$(pwd)" - - [ "$path" = "$cwd" ] && path="." - [ "$cwd" != "/" -a "$cwd" != "$HOME" ] && path="${path/#$cwd\//}" - path="${path/#$HOME/~}" - - rawecho "$path" -} -function relpath() { - local p="$(abspath "$1" "$3")" cwd="$2" - if [ -z "$cwd" ]; then - cwd="$(pwd)" - else - cwd="$(abspath "$cwd" "$3")" - fi - if [ "$p" == "$cwd" ]; then - echo "" - elif [ "${p#$cwd/}" != "$p" ]; then - rawecho "${p#$cwd/}" - else - local rp - while [ -n "$cwd" -a "${p#$cwd/}" == "$p" ]; do - rp="${rp:+$rp/}.." - cwd="${cwd%/*}" - done - rp="$rp/${p#$cwd/}" - echo "${rp%//}" - fi -} -function relpathx() { - local p="$(relpath "$@")" - if [ -z "$p" ]; then - echo . - elif [ "${p#../}" != "$p" -o "${p#./}" != "$p" ]; then - echo "$p" - else - echo "./$p" - fi -} -function withinpath() { - local b="$1" p="$2" strict="${3:-N}" - b="$(abspath "$b")" - p="$(abspath "$p")" - if is_yes "$strict"; then - [ "${p#$b/}" != "$p" ] - else - [ "$p" == "$b" -o "${p#$b/}" != "$p" ] - fi -} -function safe_abspath() { - local p="$1" ba="$2" br="$3" - if [ -n "$ba" ]; then - ba="$(abspath "$ba")" - else - ba="$(pwd)" - fi - [ -n "$br" ] || br="$ba" - br="$(abspath "$br" "$ba")" - p="$(abspath "$p" "$ba")" - if [ "$p" == "$br" -o "${p#$br/}" != "$p" ]; then - echo "$p" - else - return 1 - fi -} -function safe_relpath() { - local p - if p="$(safe_abspath "$1" "$2" "$3")"; then - relpath "$p" "$2" "$(pwd)" - else - return 1 - fi -} -function splitwcs() { - local __sw_p="$1" - local __sw_dd="${2:-basedir}" __sw_df="${3:-filespec}" __sw_part __sw_d __sw_f - local -a __sw_parts - array_split __sw_parts "$__sw_p" "/" - for __sw_part in "${__sw_parts[@]}"; do - if [[ "$__sw_part" == *\** ]] || [[ "$__sw_part" == *\?* ]] || [ -n "$__sw_f" ]; then - __sw_f="${__sw_f:+$__sw_f/}$__sw_part" - else - __sw_d="${__sw_d:+$__sw_d/}$__sw_part" - fi - done - [ "${__sw_p#/}" != "$__sw_p" ] && __sw_d="/$__sw_d" - set_var "$__sw_dd" "$__sw_d" - set_var "$__sw_df" "$__sw_f" -} -function deref() { - local OENC="$UTF8" - - local max_deref=50 - local file="$1" - local basedir link - while [ -L "$file" ]; do - basedir="$(dirname "$file")" - link="$(readlink "$file")" - if first_char_is "$link" "/"; then - file="$link" - else - file="$basedir/$link" - fi - - max_deref=$(($max_deref - 1)) - [ $max_deref -eq 0 ] && die "Plus de 50 indirection. Le lien $file est-il récursif?" - done - abspath "$file" -} -function readlinka() { - if [ -L "$1" ]; then - local linkdir="$(dirname -- "$1")" - abspath "$(readlink "$1")" "$linkdir" - else - abspath "$1" - fi -} -function readlinkm() { - readlink -m "$1" -} -function path_if_test() { - local op="$1"; shift - local file="$1"; shift - local rel="$1" reldir=; shift - if beginswith "$rel" relative; then - reldir="${rel#relative}" - if beginswith "$reldir" :; then - reldir="${reldir#:}" - if [ -n "$reldir" ]; then - reldir="${reldir}/" - fi - else - reldir= - fi - else - rel= - fi - - while [ -n "$1" ]; do - local basedir="$1" - if [ $op "$basedir/$file" ]; then - if [ -n "$rel" ]; then - rawecho "$reldir$file" - else - rawecho "$basedir/$file" - fi - break - fi - shift - done -} -function update_link() { - [ -L "$2" ] || return 1 - local dest link="$2" - local linkdir="$(dirname "$link")" - local ldest="$(readlink "$link")" - if [ "${ldest#/}" != "$ldest" ]; then - dest="$(abspath "$1")" - else - dest="$(relpath "$1" "$linkdir")" - fi - if [ "$dest" == "$ldest" ]; then - : # pas besoin de mettre à jour - elif [ -d "$link" ]; then - rm -f "$link" && ln -s "$dest" "$link" - else - ln -sf "$dest" "$link" - fi -} -function update_links() { - [ -n "$1" ] || return 1 - local dest="$1"; shift - local r=0 link - for link in "$@"; do - update_link "$dest" "$link" || r=$? - done - return $r -} -function move_link() { - [ -n "$1" -a -n "$2" ] || return 1 - local link="$1" dest="$2" - [ -d "$dest" ] && dest="$dest/$(basename -- "$link")" - dest="$(abspath "$dest")" - if [ -L "$link" ]; then - link="$(abspath "$link")" - [ "$dest" == "$link" ] && return 0 - ldest="$(readlinka "$link")" - mv "$link" "$dest" || return 1 - update_link "$ldest" "$dest" - else - [ "$dest" == "$link" ] && return 0 - mv "$link" "$dest" - fi -} -function array_find_links() { - local -a __afl_links __afl_result - local __afl_dir="${3:-.}" - local __afl_dest __afl_destname __afl_link __afl_linkdir __afl_ldest - __afl_dest="$(abspath "$2")" - __afl_destname="${__afl_dest##*/}" - array_from_lines __afl_links "$(find "$__afl_dir" -type l)" - for __afl_link in "${__afl_links[@]}"; do - __afl_ldest="$(readlink "$__afl_link")" - if [ "$__afl_ldest" != "$__afl_destname" ]; then - [[ "$__afl_ldest" == */"$__afl_destname" ]] || continue - fi - __afl_link="$(abspath "$__afl_link" "$__afl_dir")" - __afl_linkdir="$(dirname -- "$__afl_link")" - __afl_ldest="$(abspath "$__afl_ldest" "$__afl_linkdir")" - if [ "$__afl_ldest" == "$__afl_dest" ]; then - array_add __afl_result "$__afl_link" - fi - done - array_copy "$1" __afl_result -} -function list_links() { - local -a links - array_find_links links "$@" - array_to_lines links -} -function move_file() { - [ -n "$1" -a -n "$2" ] || return 1 - local src="$1" dest="$2" link - shift; shift - [ -d "$dest" ] && dest="$dest/$(basename -- "$src")" - move_link "$src" "$dest" || return 1 - update_links "$dest" "$@" -} - -function get_nblines() { - [ -f "$1" ] && sed -ne '$=' "$1" || echo 0 -} -function mktempf() { - mktemp "${1:-"$TMPDIR/tmp.XXXXXX"}" -} -function mktempd() { - mktemp -d "${1:-"$TMPDIR/tmp.XXXXXX"}" -} -function mkdirof() { - mkdir -p "$(dirname -- "$1")" -} -function cp_a() { - /bin/cp -a "$@" -} -function cp_R() { - /bin/cp -pR "$@" -} -function quietgrep() { - grep -q "$@" 2>/dev/null -} -function quietdiff() { - diff -q "$@" >&/dev/null -} -function testsame() { - quietdiff "$@" -} -function testdiff() { - ! quietdiff "$@" -} -function testupdated() { - if [ -f "$2" ]; then - testdiff "$1" "$2" - else - return 0 - fi -} -function testnewer() { - test ! -e "$2" -o "$1" -nt "$2" -} -function ps_all() { - ps -axww -} -function progexists() { - test -n "$1" -a -x "$(which "$1" 2>/dev/null)" -} -function has_python() { - progexists python -} -function has_gawk() { - progexists gawk -} -function is_root() { - test `id -u` -eq 0 -} -function source_ifexists() { - if [ -f "$1" ]; then source "$1" || die; fi -} -function little_sleep { - LC_NUMERIC=C sleep 0.1 -} -function random_sleep { - sleep $(($RANDOM % ${1:-1800})) -} -function is_running() { - kill -0 "$1" >&/dev/null -} -function sedi() { - sed -i "$@" -} -function csort() { - LANG=C sort "$@" -} -function lsort() { sort "$@"; } -function cgrep() { - LANG=C grep "$@" -} -function lgrep() { grep "$@"; } -function csed() { - LANG=C sed "$@" -} -function lsed() { sed "$@"; } -function cawk() { - LANG=C awk "$@" -} -function lawk() { awk "$@"; } -function cdiff() { - LANG=C diff "$@" -} -function ldiff() { diff "$@"; } - - -function fix_mode() { - local file="$1" - [ -f "$file" ] || touch "$file" || return 1 - if [ ! -w "$file" ]; then - local mode="$(stat -c %a "$file")" - chmod ${mode:0:${#mode}-3}6${mode:${#mode}-2:2} "$file" - echo "$mode" - fi -} -function unfix_mode() { - [ -n "$2" ] && chmod "$2" "$1" -} -function get_mode() { - [ -f "$1" ] || touch "$1" || return 1 - stat -c %a "$1" -} -function rm_maybe() { - local parse_opts=1 arg rm - for arg in "$@"; do - if [ -n "$parse_opts" ]; then - if [ "$arg" == "--" ]; then - parse_opts= - elif [[ "$arg" == "-*" ]]; then - continue - elif [ -n "$arg" ]; then - rm=1 - break - fi - elif [ -n "$arg" ]; then - rm=1 - break - fi - done - [ -n "$rm" ] && /bin/rm "$@" -} -__CPDIR_RSYNC_SLOW=1 # synchro potentiellement plus lente, mais plus fidèle (option -c) -__CPDIR_RSYNC_ARGS=(-q) -function cpdir() { - - if progexists rsync; then - [ -d "$2" ] || mkdir -p "$2" || return 1 - if [ -d "$1" ]; then - rsync -a ${__CPDIR_RSYNC_SLOW:+-c} "${__CPDIR_RSYNC_ARGS[@]}" "$1/" "$2/" - else - rsync -a ${__CPDIR_RSYNC_SLOW:+-c} "${__CPDIR_RSYNC_ARGS[@]}" "$1" "$2/" - fi - else - __cpdir "$@" - fi -} -function __cpdir() { - local src="$1" dest="$2" method="${3:-cp_a}" - - if [ -d "$src" ]; then - [ -d "$dest" ] || mkdir -p "$dest" || return 1 - - local prevdir="$(pwd)" - - dest="$(abspath "$dest")" - cd "$src" - if [ -n "$(/bin/ls -a1)" ]; then - [ -n "$(/bin/ls -1)" ] && "$method" * "$dest" - local i - for i in .*; do - [ "$i" == "." -o "$i" == ".." ] && continue - "$method" "$i" "$dest" - done - fi - cd "$prevdir" - else - if [ -f "$dest" ]; then - "$method" "$src" "$dest" - elif [ -d "$dest" ]; then - "$method" "$src" "$dest" - else - mkdir -p "$dest" - "$method" "$src" "$dest" - fi - fi -} -__CPNOVCS_RSYNC_SLOW=1 # synchro potentiellement plus lente, mais plus fidèle (option -c) -__CPNOVCS_RSYNC_ARGS=(-q) -function cpnovcs() { - local src="$1" destdir="$2" - [ -d "$destdir" ] || mkdir -p "$destdir" || return 1 - if progexists rsync; then - local gitexclude=/.git/ - if [ "${src%/}" == "$src" ]; then - gitexclude="/$(basename -- "$src")$gitexclude" - fi - rsync -a ${__CPNOVCS_RSYNC_SLOW:+-c} --exclude CVS/ --exclude .svn/ --exclude "$gitexclude" "${__CPNOVCS_RSYNC_ARGS[@]}" "$src" "$destdir/" - elif [ "${src%/}" != "$src" ]; then - __cpdir "$src" "$destdir" - else - local srcname="$(basename -- "$src")" - mkdir -p "$destdir/$srcname" - __cpdir "$src" "$destdir/$srcname" - fi -} -function cpdirnovcs() { - if [ -d "$1" ]; then - cpnovcs "$1/" "$2" - else - cpnovcs "$1" "$2" - fi -} -function doinplace() { - if [ -n "$1" -a "$1" != "-" ]; then - local __dip_file="$1"; shift - autoclean "$__dip_file.tmp.$$" - "$@" <"$__dip_file" >"$__dip_file.tmp.$$" - local s=$? - [ "$s" == 0 ] && /bin/cat "$__dip_file.tmp.$$" >"$__dip_file" - /bin/rm -f "$__dip_file.tmp.$$" - return $s - else - shift - "$@" - fi -} -function doinplacef() { - if [ -n "$1" -a "$1" != "-" ]; then - local __dip_file="$1"; shift - autoclean "$__dip_file.tmp.$$" - "$@" <"$__dip_file" >"$__dip_file.tmp.$$" - local s=$? - /bin/cat "$__dip_file.tmp.$$" >"$__dip_file" - /bin/rm -f "$__dip_file.tmp.$$" - return $s - else - shift - "$@" - fi -} -function stripnl() { - tr -d '\r\n' -} -function _nl2lf() { - awk 'BEGIN {RS="\r|\r\n|\n"} {print}' -} -function nl2lf() { - doinplace "$1" _nl2lf -} -function _nl2crlf() { - awk 'BEGIN {RS="\r|\r\n|\n"} {print $0 "\r"}' -} -function nl2crlf() { - doinplace "$1" _nl2crlf -} -function _nl2cr() { - awk 'BEGIN {RS="\r|\r\n|\n"; ORS=""} {print $0 "\r"}' -} -function nl2cr() { - doinplace "$1" _nl2cr -} -function _latin1compat() { - LANG=fr_FR.UTF-8 sed $' -s/[‘’]/\x27/g -s/[«»“”]/"/g -s/[\xC2\xA0\xE2\x80\x87\xE2\x80\xAF\xE2\x81\xA0]/ /g -' -} -function _noaccents() { - LANG=fr_FR.UTF-8 sed ' -s/[à]/a/g -s/[éèêë]/e/g -s/[ïî]/i/g -s/[ôö]/o/g -s/[üû]/u/g -s/[ç]/c/g -s/[À]/A/g -s/[ÉÈÊË]/E/g -s/[ÏÎ]/I/g -s/[ÔÖ]/O/g -s/[ÜÛ]/U/g -s/[Ç]/C/g -' -} -function list_all() { - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ "$f" == "." -o "$f" == ".." ] && continue - rawecho "$f" - done - cd "$curdir" -} -function __la_cmd() { - [ $# -gt 0 ] || set '*' - local arg - local cmd="/bin/ls -1d" - for arg in "$@"; do - arg="$(_rval "$arg")" - cmd="$cmd $arg" - done - cmd="$cmd 2>/dev/null" - echo "$cmd" -} -function list_files() { - local f - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ -f "$f" ] && rawecho "$f" - done - cd "$curdir" -} -function list_dirs() { - local f - local curdir="$(pwd)" - local b="${1:-.}"; shift - - cd "$b" 2>/dev/null || return - eval "$(__la_cmd "$@")" | while read f; do - [ "$f" == "." -o "$f" == ".." ] && continue - [ -d "$f" ] && rawecho "$f" - done - cd "$curdir" -} -function __array_ls() { - local __al_l="list_${1:-all}"; shift - local __al_an="$1"; shift - local __al_d="${1:-.}"; shift - local -a __al_fs - array_from_lines __al_fs "$("$__al_l" "$__al_d" "$@")" - local __al_f - array_new "$__al_an" - for __al_f in "${__al_fs[@]}"; do - array_add "$__al_an" "$__al_d/$__al_f" - done -} -function array_lsall() { - __array_ls all "$@" -} -function array_lsdirs() { - __array_ls dirs "$@" -} -function array_lsfiles() { - __array_ls files "$@" -} -function filter_empty() { - sed '/^$/d' -} -function filter_vcspath() { - sed ' -/^.git$/d -/^.git\//d -/\/.git$/d -/\/.git\//d -/^.svn$/d -/^.svn\//d -/\/.svn$/d -/\/.svn\//d -' -} -function merge_contlines() { - awk 'substr($0, length($0)) == "\\" { - while (getline nextline) { - $0 = substr($0, 1, length($0) - 1) nextline - if (substr($0, length($0)) != "\\") break - } - print - next -} -{print}' -} -function filter_comment() { - local -a merge - [ "$1" == -m ] && merge=(merge_contlines) || merge=(cat) - awk ' - /^[ \t]*#/ { next } - /^[ \t]*$/ { next } - { print }' | "${merge[@]}" -} -function filter_conf() { - local -a merge - [ "$1" == -m ] && merge=(merge_contlines) || merge=(cat) - grep -v '^#' | grep -v '^$' | "${merge[@]}" -} -function is_archive() { - local name="${1%.zip}" - name="${name%.tgz}" - name="${name%.tbz2}" - name="${name%.tar.gz}" - name="${name%.tar.bz2}" - name="${name%.tar}" - name="${name%.jar}" - name="${name%.war}" - name="${name%.ear}" - [ "$name" != "$1" ] -} -function extract_archive() { - local arch="$1" destdir="${2:-.}" - shift; shift - if endswith "$arch" .zip; then - unzip -q -d "$destdir" "$arch" "$@" || return - elif endswith "$arch" .tgz || endswith "$arch" .tar.gz; then - tar xzf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .tbz2 || endswith "$arch" .tar.bz2; then - tar xjf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .tar; then - tar xf "$arch" -C "$destdir" "$@" || return - elif endswith "$arch" .jar || endswith "$arch" .war || endswith "$arch" .ear; then - ( - arch="$(abspath "$arch")" - cd "$destdir" - jar xf "$arch" "$@" - ) || return - else - return 1 - fi -} -function get_archive_basename() { - local basename="$(basename -- "$1")" - basename="${basename%.zip}" - basename="${basename%.tgz}" - basename="${basename%.tbz2}" - basename="${basename%.gz}" - basename="${basename%.bz2}" - basename="${basename%.tar}" - basename="${basename%.jar}" - basename="${basename%.war}" - basename="${basename%.ear}" - echo "$basename" -} -function get_archive_appname() { - local appname="$(basename -- "$1")" - appname="${appname%.zip}" - appname="${appname%.tgz}" - appname="${appname%.tbz2}" - appname="${appname%.gz}" - appname="${appname%.bz2}" - appname="${appname%.tar}" - appname="${appname%.jar}" - appname="${appname%.war}" - appname="${appname%.ear}" - echo "$appname" | awk '{ - if (match($0, /[-_.]([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/)) { - print substr($0, 1, RSTART - 1) - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/)) { - print substr($0, 1, RSTART - 1) - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print substr($0, 1, RSTART - 1) - } else { - print $0 - } -}' -} -function get_archive_versionsuffix() { - local basename="$(get_archive_basename "$1")" - echo "$basename" | awk '{ - if (match($0, /([-_.][0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print vs["1"] - } -}' -} -function get_archive_version() { - local basename="$(get_archive_basename "$1")" - echo "$basename" | awk '{ - if (match($0, /[-_.]([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+([-_.][0-9]+)*([a-zA-Z][0-9]*|[-_.][0-9]+[a-zA-Z][0-9]*)?)$/, vs)) { - print vs["1"] - } else if (match($0, /([0-9]+[a-z][a-z][a-z0-9]?)$/, vs)) { - print vs["1"] - } -}' -} -function __dump_usernames() { - = 500 && $6 ~ /^\/home\// { print $1 }' -} -function dump_usernames() { - array_from_lines "${1:-usernames}" "$(__dump_usernames)" -} -function __resolv_ips() { - LANG=C host "$1" 2>/dev/null | awk '/address / { gsub(/^.*address /, ""); print }' -} -function resolv_ips() { - array_from_lines "${1:-ips}" "$(__resolv_ips "$2")" -} -function __resolv_hosts() { - LANG=C host "$1" 2>/dev/null | awk '/domain name pointer / { gsub(/^.*domain name pointer /, ""); gsub(/\.$/, ""); print }' -} -function resolv_hosts() { - array_from_lines "${1:-hosts}" "$(__resolv_hosts "$2")" -} -function runscript_as() { - local OENC="$UTF8" - local user="${1:-root}"; shift - local exec_maybe= - if [ "$1" = "exec" ]; then - exec_maybe=exec - shift - fi - - local cmd - cmd="\ -__estack=$(quoted_arg "$__estack") -__tlevel=$(quoted_args "$__tlevel") -export __estack __tlevel -exec ${BASH:-/bin/sh} $(quoted_args "$@")" - - if is_yes "$UTOOLS_USES_SU" || ! progexists sudo; then - eecho "Entrez le mot de passe de root" - $exec_maybe su "$user" -c "$cmd" - else - if [ "$user" == "root" ]; then - $exec_maybe sudo -p "Entrez le mot de passe de %u: " "${BASH:-/bin/sh}" -c "$cmd" - else - $exec_maybe sudo -p "Entrez le mot de passe de %u: " su "$user" -c "$cmd" - fi - fi -} -function runscript_as_root() { - if is_root; then - local exec_maybe= - if [ "$1" = "exec" ]; then - exec_maybe=exec - shift - fi - $exec_maybe "${BASH:-/bin/sh}" "$@" - else - runscript_as root "$@" - fi -} -function run_as() { - local user="${1:-root}"; shift - local exec_maybe=exec - if [ "$1" = "--noexec" ]; then - exec_maybe= - shift - fi - - runscript_as "$user" $exec_maybe "$0" "$@" -} -function run_as_root() { - is_root || run_as root "$@" -} -function check_user() { - local user - for user in "$@"; do - [ "$USER" == "$user" ] && return 0 - done - return 1 -} -function ensure_user() { - local -a users - while [ $# -gt 0 -a "$1" != "--" ]; do - array_add users "$1" - shift - done - [ "$1" == "--" ] && shift - - if ! check_user "${users[@]}"; then - if [ ${#users[*]} -gt 1 ]; then - ewarn "Cette commande doit être lancée avec l'un des users ${users[*]}" - else - ewarn "Cette commande doit être lancée avec le user ${users[0]}" - fi - if ask_yesno "Voulez-vous tenter de relancer la commande avec le bon user?" O; then - estep "Lancement du script avec le user ${users[0]}" - run_as "${users[0]}" "$@" - return 1 - elif is_root; then - return 11 - else - return 10 - fi - fi - return 0 -} -function check_hostname() { - local userhost user host path - for userhost in "$@"; do - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - [ "$MYHOSTNAME" == "${host%%.*}" ] && return 0 - done - return 1 -} -function check_userhostname() { - local userhost path user host - for userhost in "$@"; do - if check_hostname "$userhost"; then - [[ "$userhost" == *@* ]] || return 0 - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - check_user "$user" && return 0 - fi - done - return 1 -} -UTOOLS_ENSURE_HOSTNAME_SSH_OPTS=() -function ensure_hostname() { - local -a userhosts - while [ $# -gt 0 -a "$1" != "--" ]; do - array_add userhosts "$1" - shift - done - [ "$1" == "--" ] && shift - - local userhost user host path - if ! check_hostname "${userhosts[@]}"; then - if [ ${#userhosts[*]} -gt 1 ]; then - ewarn "Cette commande n'est valide que sur l'un des hôtes ${userhosts[*]}" - else - ewarn "Cette commande n'est valide que sur l'hôte ${userhosts[0]}" - fi - - enote "Vous pouvez tenter de relancer le script sur ${userhosts[0]}, mais cela requière que ce script ET les données dont il a besoin soient installés dans la même version et dans le même répertoire sur l'hôte distant" - if ask_yesno "Voulez-vous tenter de relancer le script sur l'hôte distant?" N; then - splitfsep "${userhosts[0]}" : userhost path - splituserhost "$userhost" user host - [ -n "$user" ] || user=root - - estep "Lancement de la commande sur l'hôte distant $user@$host" - local cmd - [ -n "$path" ] && cmd="$(quoted_args cd "$path"); " - cmd="$cmd$(quoted_args "$script" "$@")" - ssh -qt "${UTOOLS_ENSURE_HOSTNAME_SSH_OPTS[@]}" "$user@$host" "$cmd" - [ $? -eq 255 ] && return 12 - return 1 - else - return 11 - fi - fi - local userhost user host - for userhost in "${userhosts[@]}"; do - [[ "$userhost" == *@* ]] || continue - if check_hostname "$userhost"; then - splitfsep "$userhost" : userhost path - splituserhost "$userhost" user host - [ -n "$path" ] && cd "$path" - ensure_user "$user" -- "$@" - return $? - fi - done - return 0 -} - -__AWKDEF_FUNCTIONS=' -function quote_html(s) { - gsub(/&/, "\\&", s) - gsub(/"/, "\\"", s) - gsub(/>/, "\\>", s) - gsub(/", s) - gsub(/"/, "\"", s) - gsub(/&/, "\\&", s) - return s -} -function quote_value(s) {'" - gsub(/'/, \"'\\\\''\", s) - return \"'\" s \"'\" -"'} -function quoted_values( i, line) { - line = "" - for (i = 1; i <= NF; i++) { - if (i > 1) line = line " " - line = line quote_value($i) - } - return line -} -function quote_subrepl(s) { - gsub(/\\/, "\\\\", s) - gsub(/&/, "\\\\&", s) - return s -} -function quote_grep(s) { - gsub(/[[\\.^$*]/, "\\\\&", s) - return s -} -function quote_egrep(s) { - gsub(/[[\\.^$*+?()|{]/, "\\\\&", s) - return s -} -function quote_sql(s) {'" - gsub(/'/, \"''\", s) - return \"'\" s \"'\" -"'} -function unquote_mysqlcsv(s) { - gsub(/\\n/, "\n", s) - gsub(/\\t/, "\t", s) - gsub(/\\0/, "\0", s) - gsub(/\\\\/, "\\", s) - return s -} -function array_new(dest) { - dest[0] = 0 # forcer awk à considérer dest comme un tableau - delete dest -} -function array_newsize(dest, size, i) { - dest[0] = 0 # forcer awk à considérer dest comme un tableau - delete dest - size = int(size) - for (i = 1; i <= size; i++) { - dest[i] = "" - } -} -function array_len(values, count, i) { - count = 0 - for (i in values) { - count++ - } - return count -} -function mkindices(values, indices, i, j) { - array_new(indices) - j = 1 - for (i in values) { - indices[j++] = int(i) - } - return asort(indices) -} -function array_copy(dest, src, count, indices, i) { - array_new(dest) - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - dest[indices[i]] = src[indices[i]] - } -} -function array_getlastindex(src, count, indices) { - count = mkindices(src, indices) - if (count == 0) return 0 - return indices[count] -} -function array_add(dest, value, lastindex) { - lastindex = array_getlastindex(dest) - dest[lastindex + 1] = value -} -function array_deli(dest, i, l) { - i = int(i) - if (i == 0) return - l = array_len(dest) - while (i < l) { - dest[i] = dest[i + 1] - i++ - } - delete dest[l] -} -function array_del(dest, value, ignoreCase, i) { - do { - i = key_index(value, dest, ignoreCase) - if (i != 0) array_deli(dest, i) - } while (i != 0) -} -function array_extend(dest, src, count, lastindex, indices, i) { - lastindex = array_getlastindex(dest) - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - dest[lastindex + i] = src[indices[i]] - } -} -function array_fill(dest, i) { - array_new(dest) - for (i = 1; i <= NF; i++) { - dest[i] = $i - } -} -function array_getline(src, count, indices, i, j) { - $0 = "" - count = mkindices(src, indices) - for (i = 1; i <= count; i++) { - j = indices[i] - $j = src[j] - } -} -function array_appendline(src, count, indices, i, nf, j) { - count = mkindices(src, indices) - nf = NF - for (i = 1; i <= count; i++) { - j = nf + indices[i] - $j = src[indices[i]] - } -} -function in_array(value, values, ignoreCase, i) { - if (ignoreCase) { - value = tolower(value) - for (i in values) { - if (tolower(values[i]) == value) return 1 - } - } else { - for (i in values) { - if (values[i] == value) return 1 - } - } - return 0 -} -function key_index(value, values, ignoreCase, i) { - if (ignoreCase) { - value = tolower(value) - for (i in values) { - if (tolower(values[i]) == value) return int(i) - } - } else { - for (i in values) { - if (values[i] == value) return int(i) - } - } - return 0 -} -function array2s(values, prefix, sep, suffix, noindices, first, i, s) { - if (!prefix) prefix = "[" - if (!sep) sep = ", " - if (!suffix) suffix = "]" - s = prefix - first = 1 - for (i in values) { - if (first) first = 0 - else s = s sep - if (!noindices) s = s "[" i "]=" - s = s values[i] - } - s = s suffix - return s -} -function array2so(values, prefix, sep, suffix, noindices, count, indices, i, s) { - if (!prefix) prefix = "[" - if (!sep) sep = ", " - if (!suffix) suffix = "]" - s = prefix - count = mkindices(values, indices) - for (i = 1; i <= count; i++) { - if (i > 1) s = s sep - if (!noindices) s = s "[" indices[i] "]=" - s = s values[indices[i]] - } - s = s suffix - return s -} -function array_join(values, sep, prefix, suffix, count, indices, i, s) { - s = prefix - count = mkindices(values, indices) - for (i = 1; i <= count; i++) { - if (i > 1) s = s sep - s = s values[indices[i]] - } - s = s suffix - return s -} -function printto(s, output) { - if (output == "") { - print s - } else if (output ~ /^>>/) { - sub(/^>>/, "", output) - print s >>output - } else if (output ~ /^>/) { - sub(/^>/, "", output) - print s >output - } else { - print s >output - } -} -function find_line(input, field, value, orig, line) { - orig = $0 - line = "" - while ((getline 0) { - if ($field == value) { - line = $0 - break - } - } - close(input) - $0 = orig - return line -} -function merge_line(input, field, key, line) { - line = find_line(input, field, $key) - if (line != "") $0 = $0 FS line -} -function __csv_parse_quoted(line, destl, colsep, qchar, echar, pos, tmpl, nextc, resl) { - line = substr(line, 2) - resl = "" - while (1) { - pos = index(line, qchar) - if (pos == 0) { - resl = resl line - destl[0] = "" - destl[1] = 0 - return resl - } - if (echar != "" && pos > 1) { - prevc = substr(line, pos - 1, 1) - quotec = substr(line, pos, 1) - nextc = substr(line, pos + 1, 1) - if (prevc == echar) { - tmpl = substr(line, 1, pos - 2) - resl = resl tmpl quotec - line = substr(line, pos + 1) - continue - } - tmpl = substr(line, 1, pos - 1) - if (nextc == colsep || nextc == "") { - resl = resl tmpl - destl[0] = substr(line, pos + 2) - destl[1] = nextc == colsep - return resl - } else { - resl = resl tmpl quotec - line = substr(line, pos + 1) - } - } else { - tmpl = substr(line, 1, pos - 1) - quotec = substr(line, pos, 1) - nextc = substr(line, pos + 1, 1) - if (nextc == colsep || nextc == "") { - resl = resl tmpl - destl[0] = substr(line, pos + 2) - destl[1] = nextc == colsep - return resl - } else if (nextc == qchar) { - resl = resl tmpl quotec - line = substr(line, pos + 2) - } else { - resl = resl tmpl quotec - line = substr(line, pos + 1) - } - } - } -} -function __csv_parse_unquoted(line, destl, colsep, qchar, echar, pos) { - pos = index(line, colsep) - if (pos == 0) { - destl[0] = "" - destl[1] = 0 - return line - } else { - destl[0] = substr(line, pos + 1) - destl[1] = 1 - return substr(line, 1, pos - 1) - } -} -function __array_parsecsv(fields, line, nbfields, colsep, qchar, echar, shouldparse, destl, i) { - array_new(fields) - array_new(destl) - i = 1 - shouldparse = 0 - while (shouldparse || line != "") { - if (index(line, qchar) == 1) { - value = __csv_parse_quoted(line, destl, colsep, qchar, echar) - line = destl[0] - shouldparse = destl[1] - } else { - value = __csv_parse_unquoted(line, destl, colsep, qchar, echar) - line = destl[0] - shouldparse = destl[1] - } - fields[i] = value - i = i + 1 - } - if (nbfields) { - nbfields = int(nbfields) - i = array_len(fields) - while (i < nbfields) { - i++ - fields[i] = "" - } - } - return array_len(fields) -} -BEGIN { - DEFAULT_COLSEP = "," - DEFAULT_QCHAR = "\"" - DEFAULT_ECHAR = "" -} -function array_parsecsv2(fields, line, nbfields, colsep, qchar, echar) { - return __array_parsecsv(fields, line, nbfields, colsep, qchar, echar) -} -function array_parsecsv(fields, line, nbfields, colsep, qchar, echar) { - if (colsep == "") colsep = DEFAULT_COLSEP - if (qchar == "") qchar = DEFAULT_QCHAR - if (echar == "") echar = DEFAULT_ECHAR - return __array_parsecsv(fields, line, nbfields, colsep, qchar, echar) -} -function parsecsv(line, fields) { - array_parsecsv(fields, line) - array_getline(fields) - return NF -} -function getlinecsv(file, fields) { - if (file) { - getline 1) line = line colsep - if (qchar != "" && index(value, qchar) != 0) { - if (echar != "") gsub(qchar, quote_subrepl(echar) "&", value); - else gsub(qchar, "&&", value); - } - if (qchar != "" && (index(value, mvsep) != 0 || index(value, colsep) != 0 || index(value, qchar) != 0 || __csv_should_quote(value))) { - line = line qchar value qchar - } else { - line = line value - } - } - return line -} -function array_formatcsv(fields) { - return array_formatcsv2(fields, ",", ";", "\"", "") -} -function array_printcsv(fields, output) { - printto(array_formatcsv(fields), output) -} -function get_formatcsv( fields) { - array_fill(fields) - return array_formatcsv(fields) -} -function formatcsv() { - $0 = get_formatcsv() -} -function printcsv(output, fields) { - array_fill(fields) - array_printcsv(fields, output) -} -function array_findcsv(fields, input, field, value, nbfields, orig, found, i) { - array_new(orig) - array_fill(orig) - array_new(fields) - found = 0 - while ((getline 0) { - array_parsecsv(fields, $0, nbfields) - if (fields[field] == value) { - found = 1 - break - } - } - close(input) - array_getline(orig) - if (!found) { - delete fields - if (nbfields) { - nbfields = int(nbfields) - i = array_len(fields) - while (i < nbfields) { - i++ - fields[i] = "" - } - } - } - return found -} - -function __and(var, x, l_res, l_i) { - l_res=0; - for (l_i=0; l_i < 8; l_i++){ - if (var%2 == 1 && x%2 == 1) l_res=l_res/2 + 128; - else l_res/=2; - var=int(var/2); - x=int(x/2); - } - return l_res; -} -function __lshift(var, x) { - while(x > 0){ - var*=2; - x--; - } - return var; -} -function __rshift(var, x) { - while(x > 0){ - var=int(var/2); - x--; - } - return var; -} -BEGIN { - __BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" -} -function b64decode(src, result, base1, base2, base3, base4) { - result = "" - while (length(src) > 0) { - base1 = substr(src, 1, 1) - base2 = substr(src, 2, 1) - base3 = substr(src, 3, 1); if (base3 == "") base3 = "=" - base4 = substr(src, 4, 1); if (base4 == "") base4 = "=" - byte1 = index(__BASE64, base1) - 1 - if (byte1 < 0) byte1 = 0 - byte2 = index(__BASE64, base2) - 1 - if (byte2 < 0) byte2 = 0 - byte3 = index(__BASE64, base3) - 1 - if (byte3 < 0) byte3 = 0 - byte4 = index(__BASE64, base4) - 1 - if (byte4 < 0) byte4 = 0 - result = result sprintf( "%c", __lshift(__and(byte1, 63), 2) + __rshift(__and(byte2, 48), 4) ) - if (base3 != "=") result = result sprintf( "%c", __lshift(__and(byte2, 15), 4) + __rshift(__and(byte3, 60), 2) ) - if (base4 != "=") result = result sprintf( "%c", __lshift(__and(byte3, 3), 6) + byte4 ) - src = substr(src, 5) - } - return result -} -' -function awkdef() { - - if [ "${1:0:3}" == "-f" ]; then - shift - echo "$__AWKDEF_FUNCTIONS" - fi - if [ $# -gt 0 ]; then - local __ad_arg __ad_vpos __ad_name __ad_value - echo "BEGIN {" - while [ -n "${1:0:1}" ]; do - __ad_arg="${1:0:256}" - local __ad_array= - if [ "${__ad_arg%\[@\]}" != "$__ad_arg" ]; then - __ad_array=1 - __ad_name="${__ad_arg%\[@\]}" - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_value="$__ad_name" - elif [[ "$__ad_arg" == *\[@\]=* ]]; then - __ad_array=1 - __ad_name="${__ad_arg%%\[@\]=*}" - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_vpos=$((${#__ad_name} + 4)) - __ad_value="${1:$__ad_vpos}" - [ ${#__ad_value} -ne 0 ] || __ad_value="$__ad_name" - elif [[ "$__ad_arg" == *=* ]]; then - local __ad_int= __ad_str= - __ad_name="${__ad_arg%%=*}" - __ad_vpos=$((${#__ad_name} + 1)) - if [ "${__ad_name%:int}" != "$__ad_name" ]; then - __ad_int=1 - __ad_name="${__ad_name%:int}" - elif [ "${__ad_name%:str}" != "$__ad_name" ]; then - __ad_str=1 - __ad_name="${__ad_name%:str}" - fi - [ -z "${__ad_name//[a-zA-Z0-9_]/}" ] || break - __ad_value="${1:$__ad_vpos}" - if [ -n "$__ad_int" ]; then - echo "$__ad_name = int($(quoted_awk "$__ad_value") + 0)" - elif [ -n "$__ad_str" ]; then - echo "$__ad_name = $(quoted_awk "$__ad_value")" - elif [ ${#__ad_value} -lt 256 ] && isnum "$__ad_value"; then - echo "$__ad_name = $__ad_value" - else - echo "$__ad_name = $(quoted_awk "$__ad_value")" - fi - else - break - fi - if [ -n "$__ad_array" ]; then - if [ "${__ad_value:0:2}" == $'<\n' ]; then - local -a __ad_values - array_from_lines __ad_values "${__ad_value:2}" - __ad_value=__ad_values - fi - __ad_value="${__ad_value}[@]" - local __ad_i=1 - echo "$__ad_name[0] = 0; delete $__ad_name" - for __ad_arg in "${!__ad_value}"; do - echo "$__ad_name[$__ad_i]=$(quoted_awk "$__ad_arg")" - __ad_i=$(($__ad_i + 1)) - done - eval "echo \"\${__ad_name}_count = \${#$__ad_value}\"" - fi - shift - done - echo "}" - for __ad_arg in "$@"; do - rawecho "$__ad_arg" - done - fi -} -function lawkrun() { - local -a __ar_defs __ar_args - while [ $# -gt 0 -a "$1" != "--" ]; do - __ar_defs=("${__ar_defs[@]}" "$1") - shift - done - shift - while [ $# -gt 0 ]; do - __ar_args=("${__ar_args[@]}" "$1") - shift - done - local __ar_script="$(awkdef "${__ar_defs[@]}")" - awk "$__ar_script" "${__ar_args[@]}" -} -function cawkrun() { LANG=C lawkrun "$@"; } -function awkrun() { LANG=C lawkrun "$@"; } - -function __lf_get_age() { - local y=$(date "+%Y") - local dy=$(date "+%j"); while [ "${dy#0}" != "$dy" ]; do dy="${dy#0}"; done - [ -n "$dy" ] || dy=0 - local h=$(date "+%H"); while [ "${h#0}" != "$h" ]; do h="${h#0}"; done - [ -n "$h" ] || h=0 - echo $((($y * 365 + $dy) * 24 + $h)) -} -function lf_trylock() { - local eoo lockfile max_hours=4 - while [ -n "$1" ]; do - case "$1" in - -h) shift; max_hours="$1";; - --) shift; eoo=1;; - *) eoo=1;; - esac - [ -n "$eoo" ] && break - shift - done - - lockfile="$1" - [ -n "$lockfile" ] || die "il faut spécifier un fichier pour le verrou" - - local now="$(__lf_get_age)" - if (set -C; echo "$now" >"$lockfile") 2>/dev/null; then - return 0 - fi - local prev diff - if prev="$(<"$lockfile")"; then - diff="$(($now - $prev))" - if [ "$diff" -gt "$max_hours" ]; then - echo stale - else - echo locked - fi - elif [ -f "$lockfile" ]; then - echo retry - fi - return 1 -} -function pidfile_set() { - local eoo pidfile pid=$$ replace= - while [ -n "$1" ]; do - case "$1" in - -p) - shift - pid="$1" - ;; - -r) - replace=1 - ;; - --) - shift - eoo=1 - ;; - *) - eoo=1 - ;; - esac - [ -n "$eoo" ] && break - shift - done - - pidfile="$1" - [ -n "$pidfile" ] || return 10 - - if [ -f "$pidfile" ]; then - local curpid="$(<"$pidfile")" - if is_running "$curpid"; then - return 1 - elif [ -n "$replace" ]; then - /bin/rm -f "$pidfile" || return 10 - else - return 2 - fi - fi - - echo_ "$pid" >"$pidfile" || return 10 - autoclean "$pidfile" - return 0 -} -function pidfile_check() { - local pidfile="$1" - [ -n "$pidfile" ] || return 10 - - if [ -f "$pidfile" ]; then - [ -r "$pidfile" ] || return 10 - local pid="$(<"$pidfile")" - is_running "$pid" && return 0 - fi - return 1 -} -function page_maybe() { - if isatty; then - less -XF "$@" - else - cat - fi -} - - -function utools_local() { - local arg - [ $# -gt 0 ] || set -- opts verbosity interaction - for arg in "$@"; do - case "$arg" in - parse_opts|opts|o|args) echo "local -a args";; - verbosity|v) echo "local __verbosity='$__verbosity'";; - interaction|i) echo "local __interaction='$__interaction'";; - esac - done -} - -function isatty() { - tty -s <&1 -} -function in_isatty() { - tty -s -} -function out_isatty() { - tty -s <&1 -} -function err_isatty() { - tty -s <&2 -} -function die() { [ $# -gt 0 ] && eerror "$@"; exit 1; } -function exit_with { if [ $# -gt 0 ]; then "$@"; fi; exit $?; } -function die_with { [ $# -gt 0 ] && eerror "$1"; shift; [ $# -gt 0 ] && "$@"; exit 1; } -function die_unless() { - local count=$# - if [ $count -eq 0 ]; then - exit 1 - elif [ $count -eq 1 ]; then - "$@" || exit $? - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - : - else - r=$? - eerror "$m" - exit $r - fi - fi -} -function eerror_unless() { - local count=$# - if [ $count -eq 0 ]; then - return 1 - elif [ $count -eq 1 ]; then - "$@" || return $? - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - : - else - r=$? - eerror "$m" - return $r - fi - fi -} -function die_if() { - local count=$# - if [ $count -eq 0 ]; then - : - elif [ $count -eq 1 ]; then - "$@" && exit 1 - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - eerror "$m" - exit 1 - fi - fi -} -function eerror_if() { - local count=$# - if [ $count -eq 0 ]; then - : - elif [ $count -eq 1 ]; then - "$@" && return 1 - else - local m r - m="${@:$count}" - count=$(($count - 1)) - set -- "${@:1:$count}" - if "$@"; then - eerror "$m" - return 1 - fi - fi -} - -TAB=$'\t' -LATIN1=iso-8859-1 -LATIN9=iso-8859-15 -UTF8=utf-8 -OENC="$UTF8" - -if ! progexists iconv; then - function iconv() { cat; } -fi - -function __lang_encoding() { - local lang="$(<<<"$LANG" awk '{ print tolower($0) }')" - case "$lang" in - *@euro) echo "iso-8859-15";; - *.utf-8|*.utf8) echo "utf-8";; - *) echo "iso-8859-1";; - esac -} -function __norm_encoding() { - awk '{ - enc = tolower($0) - gsub(/^latin$/, "latin1", enc) - gsub(/^latin1$/, "iso-8859-1", enc) - gsub(/^latin9$/, "iso-8859-15", enc) - gsub(/[-_]/, "", enc) - if (enc == "iso8859" || enc == "iso88591" || enc == "8859" || enc == "88591") print "iso-8859-1" - else if (enc == "iso885915" || enc == "885915") print "iso-8859-15" - else if (enc == "utf" || enc == "utf8") print "utf-8" - else print $0 - }' <<<"$1" -} -function __init_encoding() { - local DEFAULT_ENCODING="$(__lang_encoding)" - [ -n "$DEFAULT_ENCODING" ] || DEFAULT_ENCODING=utf-8 - [ -n "$UTOOLS_OUTPUT_ENCODING" ] || UTOOLS_OUTPUT_ENCODING="$DEFAULT_ENCODING" - UTOOLS_OUTPUT_ENCODING="$(__norm_encoding "$UTOOLS_OUTPUT_ENCODING")" - [ -n "$UTOOLS_INPUT_ENCODING" ] || UTOOLS_INPUT_ENCODING="$UTOOLS_OUTPUT_ENCODING" - UTOOLS_INPUT_ENCODING="$(__norm_encoding "$UTOOLS_INPUT_ENCODING")" - [ -n "$UTOOLS_EDITOR_ENCODING" ] || UTOOLS_EDITOR_ENCODING="$UTOOLS_INPUT_ENCODING" - UTOOLS_EDITOR_ENCODING="$(__norm_encoding "$UTOOLS_EDITOR_ENCODING")" - - IENC="$UTOOLS_INPUT_ENCODING" - OENC="$UTOOLS_OUTPUT_ENCODING" -} - -if [ -n "$UTOOLS_LANG" -a -z "$LANG" ]; then - export UTOOLS_LANG - export LANG="$UTOOLS_LANG" -fi -__init_encoding - -function tooenc() { - local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - rawecho "$src" - else - iconv -f "$from" -t "$to" <<<"$src" - fi -} -function uecho() { - tooenc "$*" -} -function tooenc_() { - local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - rawecho_ "$src" - else - rawecho_ "$src" | iconv -f "$from" -t "$to" - fi -} -function uecho_() { - tooenc_ "$*" -} -function toienc() { - local __tie_var="$1" __tie_to="${2:-$IENC}" __tie_from="${3:-$UTOOLS_INPUT_ENCODING}" - if [ "$__tie_from" != "$__tie_to" ]; then - set_var "$__tie_var" "$(iconv -f "$__tie_from" -t "$__tie_to" <<<"${!__tie_var}")" - fi -} -function uread() { - [ $# -gt 0 ] || set -- REPLY - local __r_var - read "$@" - for __r_var in "$@"; do - [ -z "$__r_var" -o "${__r_var:0:1}" == "-" ] && continue # ignorer les options - toienc "$__r_var" - done -} - -function stooenc() { - local from="${1:-$OENC}" to="${2:-$UTOOLS_OUTPUT_ENCODING}" - if [ "$from" == "$to" ]; then - cat - else - iconv -f "$from" -t "$to" - fi -} -function stoienc() { - local to="${1:-$IENC}" from="${2:-$UTOOLS_INPUT_ENCODING}" - if [ "$from" == "$to" ]; then - cat - else - iconv -f "$from" -t "$to" - fi -} - -export UTOOLS_EDATE -function __edate() { [ -n "$UTOOLS_EDATE" ] && date +"[%d/%m/%Y-%H:%M:%S] "; } - -export UTOOLS_ELOG_OVERWRITE -function __set_no_colors() { :; } -function elogto() { - UTOOLS_EDATE=1 - if [ -n "$1" -a -n "$2" ]; then - LANG=fr_FR.UTF8 - UTOOLS_OUTPUT_ENCODING="$UTF8" - __set_no_colors 1 - if [ -n "$UTOOLS_ELOG_OVERWRITE" ]; then - exec >"$1" 2>"$2" - else - exec >>"$1" 2>>"$2" - fi - elif [ -n "$1" ]; then - LANG=fr_FR.UTF8 - UTOOLS_OUTPUT_ENCODING="$UTF8" - __set_no_colors 1 - if [ -n "$UTOOLS_ELOG_OVERWRITE" ]; then - exec >"$1" 2>&1 - else - exec >>"$1" 2>&1 - fi - fi -} - -export __estack __tlevel -function __indent() { - if [ "${1/ -/}" != "$1" ]; then - sed "2,\$s/^/${__tlevel}/g" <<<"$1" - else - rawecho "$1" - fi -} -function __eerror() { tooenc "$(__edate)${__tlevel}* error: $(__indent "$1")"; } -function __ewarn() { tooenc "$(__edate)${__tlevel}* warning: $(__indent "$1")"; } -function __enote() { tooenc "$(__edate)${__tlevel}* note: $(__indent "$1")"; } -function __ebanner() { - local maxi="${COLUMNS:-80}" - local -a lines - local psfix line - - psfix="$(__edate)${__tlevel}" - while [ ${#psfix} -lt $maxi ]; do psfix="$psfix="; done - - tooenc "$psfix" - maxi=$(($maxi - 1)) - array_from_xlines lines "$1" - for line in "" "${lines[@]}" ""; do - line="$(__edate)${__tlevel}= $line" - if [ ${#line} -le $maxi ]; then - while [ ${#line} -lt $maxi ]; do line="$line "; done - line="$line=" - fi - tooenc "$line" - done - tooenc "$psfix" -} -function __eimportant() { tooenc "$(__edate)${__tlevel}* important: $(__indent "$1")"; } -function __eattention() { tooenc "$(__edate)${__tlevel}* attention: $(__indent "$1")"; } -function __einfo() { tooenc "$(__edate)${__tlevel}* info: $(__indent "$1")"; } -function __eecho() { tooenc "$(__edate)${__tlevel}$(__indent "$1")"; } -function __eecho_() { tooenc_ "$(__edate)${__tlevel}$(__indent "$1")"; } -function __edebug() { tooenc "$(__edate)${__tlevel}* debug: $(__indent "$1")"; } -function __estep() { tooenc "$(__edate)${__tlevel}* $(__indent "$1")"; } -function __estepe() { __estep "$@"; } -function __estepw() { __estep "$@"; } -function __estepn() { __estep "$@"; } -function __estepi() { __estep "$@"; } -function __estep_() { tooenc_ "$(__edate)${__tlevel}* $(__indent "$1")"; } -function __estepe_() { __estep_ "$@"; } -function __estepw_() { __estep_ "$@"; } -function __estepn_() { __estep_ "$@"; } -function __estepi_() { __estep_ "$@"; } -function __etitle() { tooenc "$(__edate)${__tlevel}+++ $(__indent "$1")"; } -function __ebegin() { tooenc_ "$(__edate)${__tlevel}* $(__indent "$1"): "; } -function __edoto() { echo_ "."; } -function __edotw() { echo_ "w"; } -function __edotx() { echo_ "x"; } -function __edotp() { echo_ "+"; } -function __edotd() { tooenc "($1)"; } -function __eendo() { echo "[ok]"; } -function __eendx() { echo "[error]"; } -PRETTYOPTS=() -function set_verbosity() { :;} -function set_interaction() { :;} -function show_error() { - return 0 -} -function show_warn() { - return 0 -} -function show_info() { - return 0 -} -function show_verbose() { - return 0 -} -function show_debug() { - [ -n "$DEBUG" ] -} -function check_verbosity() { - return 0 -} -function get_verbosity_option() { :;} -function check_interaction() { - return 0 -} -function is_interaction() { - return 1 -} -function get_interaction_option() { :;} -__epending= -function eflush() { - if [ -n "$__epending" ]; then rawecho "$__epending" 1>&2; __epending=; fi -} -function eclearp() { - __epending= -} -function eerror() { - show_error || return; eflush; __eerror "$*" 1>&2 -} -function ewarn() { - show_warn || return; eflush; __ewarn "$*" 1>&2 -} -function enote() { - show_info || return; eflush; __enote "$*" 1>&2 -} -function ebanner() { - show_error || return; eflush; __ebanner "$*" 1>&2; sleep 5 -} -function eimportant() { - show_error || return; eflush; __eimportant "$*" 1>&2 -} -function eattention() { - show_warn || return; eflush; __eattention "$*" 1>&2 -} -function einfo() { - show_info || return; eflush; __einfo "$*" 1>&2 -} -function eecho() { - show_info || return; eflush; __eecho "$*" 1>&2 -} -function eecho_() { - show_info || return; eflush; __eecho_ "$*" 1>&2 -} -function edebug() { - show_debug || return; eflush; __edebug "$*" 1>&2 -} -function trace() { - local r cmd="$(quoted_args "$@")" - show_info && { eflush; __eecho "\$ $cmd" 1>&2; } - "$@"; r=$? - if [ $r -ne 0 ]; then - if show_info; then - eflush; __eecho "^ [EC #$r]" 1>&2 - elif show_error; then - eflush; __eecho "^ $cmd [EC #$r]" 1>&2; - fi - fi - return $r -} -function trace_error() { - local r - "$@"; r=$? - if [ $r -ne 0 ]; then - local cmd="$(quoted_args "$@")" - show_error && { eflush; __eecho "^ $cmd [EC #$r]" 1>&2; } - fi - return $r -} - -function etitle() { - local __t_deferred= - __t_etitle "$@" -} -function etitled() { - local __t_deferred=1 - __t_etitle "$@" -} -function __t_etitle() { - local __t_eend=default - local __t_clearp= - while [ -n "$1" ]; do - if [ "$1" == "--" ]; then - shift - break - elif [ "$1" == "-s" ]; then - __t_eend= - shift - elif [ "$1" == "--eend" ]; then - __t_eend=1 - shift - elif [ "$1" == "-p" ]; then - __t_clearp=1 - shift - else - break - fi - done - local __t_title="$1"; shift - local __t_s=0 - [ -n "$__estack" ] && __tlevel="${__tlevel} " - __estack="$__estack:t" - if show_info; then - if [ -n "$__t_deferred" ]; then - __epending="${__epending:+$__epending -}$(__etitle "$__t_title")" - else - eflush - __etitle "$__t_title" 1>&2 - fi - fi - if [ $# -gt 0 ]; then - "$@" - __t_s=$? - [ "$__t_eend" == "default" ] && __t_eend=1 - fi - [ "$__t_eend" == "default" ] && __t_eend= - if [ -n "$__t_eend" ]; then - eend $__t_s - [ -n "$__t_clearp" ] && eclearp - fi - return $__t_s -} -function estep() { - show_info || return; eflush; __estep "$*" 1>&2 -} -function estepe() { - show_info || return; eflush; __estepe "$*" 1>&2 -} -function estepw() { - show_info || return; eflush; __estepw "$*" 1>&2 -} -function estepn() { - show_info || return; eflush; __estepn "$*" 1>&2 -} -function estepi() { - show_info || return; eflush; __estepi "$*" 1>&2 -} -function estep_() { - show_info || return; eflush; __estep_ "$*" 1>&2 -} -function estepe_() { - show_info || return; eflush; __estepe_ "$*" 1>&2 -} -function estepw_() { - show_info || return; eflush; __estepw_ "$*" 1>&2 -} -function estepn_() { - show_info || return; eflush; __estepn_ "$*" 1>&2 -} -function estepi_() { - show_info || return; eflush; __estepi_ "$*" 1>&2 -} -function ebegin() { - local __b_eend=default - while [ -n "$1" ]; do - if [ "$1" == "--" ]; then - shift - break - elif [ "$1" == "-s" ]; then - __b_eend= - shift - elif [ "$1" == "--eend" ]; then - __b_eend=1 - shift - else - break - fi - done - local __b_msg="$1"; shift - local __b_s=0 - __estack="$__estack:b" - if show_info; then - eflush - __ebegin "$__b_msg" 1>&2 - fi - if [ $# -gt 0 ]; then - "$@" - __b_s=$? - [ "$__b_eend" == "default" ] && __b_eend=1 - fi - [ "$__b_eend" == "default" ] && __b_eend= - [ -n "$__b_eend" ] && eend $__b_s - return $__b_s -} -function edot() { - local s=$? - show_info || return - eflush - [ -n "$1" ] && s="$1" - shift - if [ "$s" == "0" ]; then - __edoto 1>&2 - else - __edotx 1>&2 - fi - show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2 - return $s -} -function edotw() { - local s=$? - show_info || return - eflush - [ -n "$1" ] && s="$1" - shift - __edotw 1>&2 - show_verbose && [ $# -gt 0 ] && __edotd "$*" 1>&2 - return $s -} -function ewait() { - [ -n "$1" ] || return 1 - if show_info; then - local count=2 - eflush - little_sleep # certains processus retournent tout de suite - while is_running "$1"; do - sleep 1 - if [ $count -gt 0 ]; then - count=$(($count - 1)) - else - __edotp 1>&2 - fi - done - __edoto 1>&2 - else - wait "$1" - fi -} -function eend() { - local s=$? - if [ "$1" == "-c" ]; then - __estack= - __tlevel= - elif [ "${__estack%:b}" != "$__estack" ]; then - __estack="${__estack%:b}" - show_info || return - eflush - [ -n "$1" ] && s="$1" - if [ "$s" == "0" ]; then - __eendo 1>&2 - else - __eendx 1>&2 - fi - elif [ "${__estack%:t}" != "$__estack" ]; then - __estack="${__estack%:t}" - __tlevel="${__tlevel% }" - fi -} -function ask_yesno() { - local interactive=1 - if [[ "$1" == -* ]]; then - if [ "$1" != -- ]; then - check_interaction "$1" || interactive= - fi - shift - else - check_interaction -c || interactive= - fi - local default="${2:-N}" - if [ "$default" == "C" ]; then - [ -n "$interactive" ] && default=N || default=O - elif [ "$default" == "X" ]; then - [ -n "$interactive" ] && default=O || default=N - fi - if [ -n "$interactive" ]; then - eflush - local message="$1" - local prompt="[oN]" - local r - is_yes "$default" && prompt="[On]" - if [ -n "$message" ]; then - tooenc_ "$message" 1>&2 - else - tooenc_ "Voulez-vous continuer?" "$UTF8" 1>&2 - fi - tooenc_ " $prompt " "$UTF8" 1>&2 - uread r - is_yes "${r:-$default}" - else - is_yes "$default" - fi -} -function read_value() { - local -a __rv_opts __rv_readline=1 __rv_showdef=1 __rv_nl= - __rv_opts=() - [ -n "$UTOOLS_NO_READLINE" ] && __rv_readline= - __rv_read "$@" -} -function read_password() { - local -a __rv_opts __rv_readline= __rv_showdef= __rv_nl=1 - __rv_opts=(-s) - __rv_read "$@" -} -function __rv_read() { - local __rv_int=1 - if [[ "$1" == -* ]]; then - if [ "$1" != -- ]; then - check_interaction "$1" || __rv_int= - fi - shift - else - check_interaction -c || __rv_int= - fi - local __rv_msg="$1" __rv_v="${2:-value}" __rv_d="$3" __rv_re="${4:-O}" - if [ -z "$__rv_int" ]; then - if is_yes "$__rv_re" && [ -z "$__rv_d" ]; then - OENC="$UTF8" eerror "La valeur par défaut de $__rv_v doit être non vide" - return 1 - fi - set_var "$__rv_v" "$__rv_d" - return 0 - fi - - eflush - local __rv_r - while true; do - if [ -n "$__rv_msg" ]; then - tooenc_ "$__rv_msg" 1>&2 - else - tooenc_ "Entrez la valeur" "$UTF8" 1>&2 - fi - if [ -n "$__rv_readline" ]; then - tooenc_ ": " "$UTF8" 1>&2 - uread -e ${__rv_d:+-i"$__rv_d"} "${__rv_opts[@]}" __rv_r - else - if [ -n "$__rv_d" ]; then - if [ -n "$__rv_showdef" ]; then - tooenc_ " [$__rv_d]" 1>&2 - else - tooenc_ " [****]" 1>&2 - fi - fi - tooenc_ ": " "$UTF8" 1>&2 - uread "${__rv_opts[@]}" __rv_r - [ -n "$__rv_nl" ] && echo - fi - __rv_r="${__rv_r:-$__rv_d}" - if [ -n "$__rv_r" ] || ! is_yes "$__rv_re"; then - set_var "$__rv_v" "$__rv_r" - return 0 - fi - done -} -function simple_menu() { - local __sm_title= __sm_yourchoice= __sm_default= - local -a __sm_args - parse_opts -t: __sm_title= -m: __sm_yourchoice= -d: __sm_default= @ __sm_args -- "$@" && - set -- "${__sm_args[@]}" || ewarn "$__sm_args" - - local __sm_option_var="${1:-option}" __sm_options_var="${2:-options}" - local __sm_option __sm_options - __sm_options="$__sm_options_var[*]" - if [ -z "${!__sm_options}" ]; then - OENC="$UTF8" eerror "Le tableau $__sm_options_var doit être non vide" - return 1 - fi - [ -z "$__sm_default" ] && __sm_default="${!__sm_option_var}" - - eflush - array_copy __sm_options "$__sm_options_var" - local __sm_c=0 __sm_i __sm_choice - while true; do - if [ "$__sm_c" == "0" ]; then - [ -n "$__sm_title" ] && tooenc "=== $__sm_title ===" 1>&2 - __sm_i=1 - for __sm_option in "${__sm_options[@]}"; do - if [ "$__sm_option" == "$__sm_default" ]; then - tooenc "$__sm_i*- $__sm_option" 1>&2 - else - tooenc "$__sm_i - $__sm_option" 1>&2 - fi - let __sm_i=$__sm_i+1 - done - fi - - if [ -n "$__sm_yourchoice" ]; then - tooenc_ "$__sm_yourchoice" 1>&2 - else - tooenc_ "Entrez le numéro de l'option choisie" "$UTF8" 1>&2 - fi - tooenc_ ": " "$UTF8" 1>&2 - uread __sm_choice - - if [ -z "$__sm_choice" -a -n "$__sm_default" ]; then - __sm_option="$__sm_default" - break - fi - if [ -n "$__sm_choice" -a -z "${__sm_choice//[0-9]/}" ]; then - if [ "$__sm_choice" -gt 0 -a "$__sm_choice" -le "${#__sm_options[*]}" ]; then - __sm_option="${__sm_options[$(($__sm_choice - 1))]}" - break - else - OENC="$UTF8" eerror "Numéro d'option incorrect" - fi - else - OENC="$UTF8" eerror "Vous devez saisir le numéro de l'option choisie" - fi - - let __sm_c=$__sm_c+1 - if [ "$__sm_c" -eq 5 ]; then - tooenc "" "$UTF8" 1>&2 - __sm_c=0 - fi - done - set_var "$__sm_option_var" "$__sm_option" -} - -function actions_menu() { - local -a __am_action_descs __am_options __am_void_actions - local __am_tmp __am_select_action __am_select_option __am_title __am_optyc __am_actyc - local __am_default_action=auto __am_quit_action=auto - local __am_default_option= - local -a __am_args - parse_opts \ - -t: __am_title= \ - -m: __am_optyc= \ - -M: __am_actyc= \ - -e: __am_void_actions \ - -d: __am_default_action= \ - -q: __am_quit_action= \ - -o: __am_default_option= \ - @ __am_args -- "$@" && set -- "${__am_args[@]}" || { eerror "$__am_args"; return 1; } - - __am_tmp="${1:-action}"; __am_select_action="${!__am_tmp}" - __am_tmp="${2:-option}"; __am_select_option="${!__am_tmp}" - [ -n "$__am_default_option" ] && __am_select_option="$__am_default_option" - array_copy __am_action_descs "${3:-actions}" - array_copy __am_options "${4:-options}" - - eerror_unless [ ${#__am_action_descs[*]} -gt 0 ] "Vous devez spécifier le tableau des actions" || return - __actions_menu || return 1 - setv "${1:-action}" "$__am_select_action" - setv "${2:-option}" "$__am_select_option" -} -function __actions_menu() { - local title="$__am_title" - local optyc="$__am_optyc" actyc="$__am_actyc" - local default_action="$__am_default_action" - local quit_action="$__am_quit_action" - local select_action="$__am_select_action" - local select_option="$__am_select_option" - local -a action_descs options void_actions - array_copy action_descs __am_action_descs - array_copy options __am_options - array_copy void_actions __am_void_actions - - local no_options - array_isempty options && no_options=1 - - local -a actions - local tmp action name - for tmp in "${action_descs[@]}"; do - splitfsep2 "$tmp" : action name - [ -n "$action" ] || action="${name:0:1}" - action="$(strlower "$action")" - array_addu actions "$action" - done - - if [ "$default_action" == auto ]; then - default_action="$select_action" - if [ -n "$default_action" ]; then - array_contains actions "$default_action" || default_action= - fi - [ -n "$default_action" ] || default_action="${actions[0]}" - fi - default_action="${default_action:0:1}" - default_action="$(strlower "$default_action")" - - if [ "$quit_action" == auto ]; then - if [ ${#actions[*]} -gt 1 ]; then - quit_action="${actions[@]:$((-1)):1}" - array_addu void_actions "$quit_action" - fi - fi - quit_action="${quit_action:0:1}" - quit_action="$(strlower "$quit_action")" - - local action_title - for tmp in "${action_descs[@]}"; do - splitfsep2 "$tmp" : action name - [ -n "$action" ] || action="${name:0:1}" - [ -n "$name" ] || name="$action" - action="$(strlower "$action")" - if [ -n "$no_options" ]; then - if ! array_contains void_actions "$action"; then - array_del actions "$action" - continue - fi - fi - [ "$action" == "$default_action" ] && name="$name*" - action_title="${action_title:+$action_title/}$name" - done - if [ -n "$default_action" ]; then - array_contains actions "$default_action" || default_action= - fi - if [ -n "$quit_action" ]; then - array_contains actions "$quit_action" || quit_action= - fi - - if [ -n "$no_options" ]; then - if array_isempty void_actions; then - eerror "Aucune option n'est définie. Il faut définir le tableau des actions vides" - return 1 - fi - __void_actions_menu - else - __options_actions_menu - fi -} -function __void_actions_menu() { - eflush - local c=0 choice - while true; do - if [ $c -eq 0 ]; then - [ -n "$title" ] && __etitle "$title" 1>&2 - __eecho_ "=== Actions disponibles: " 1>&2 - tooenc "$action_title" 1>&2 - fi - if [ -n "$actyc" ]; then - __eecho_ "$actyc" 1>&2 - elif [ -n "$optyc" ]; then - __eecho_ "$optyc" 1>&2 - else - __eecho_ "Entrez l'action à effectuer" 1>&2 - fi - tooenc_ ": " 1>&2 - uread choice - if [ -z "$choice" -a -n "$default_action" ]; then - select_action="$default_action" - break - fi - - choice="${choice:0:1}" - choice="$(strlower "$choice")" - if array_contains actions "$choice"; then - select_action="$choice" - break - elif [ -n "$choice" ]; then - eerror "$choice: action incorrecte" - else - eerror "vous devez saisir l'action à effectuer" - fi - let c=$c+1 - if [ $c -eq 5 ]; then - tooenc "" 1>&2 - c=0 - fi - done - __am_select_action="$select_action" - __am_select_option= -} -function __options_actions_menu() { - eflush - local c=0 option choice action option - while true; do - if [ $c -eq 0 ]; then - [ -n "$title" ] && __etitle "$title" 1>&2 - i=1 - for option in "${options[@]}"; do - if [ "$option" == "$select_option" ]; then - tooenc "$i*- $option" 1>&2 - else - tooenc "$i - $option" 1>&2 - fi - let i=$i+1 - done - __estepn_ "Actions disponibles: " 1>&2 - tooenc "$action_title" 1>&2 - fi - if [ -n "$optyc" ]; then - __eecho_ "$optyc" 1>&2 - else - __eecho_ "Entrez l'action et le numéro de l'option choisie" 1>&2 - fi - tooenc_ ": " 1>&2 - uread choice - - if [ -z "$choice" -a -n "$default_action" ]; then - action="$default_action" - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - elif [ -n "$select_option" ]; then - select_action="$action" - break - fi - fi - action="${choice:0:1}" - action="$(strlower "$action")" - if array_contains actions "$action"; then - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - else - option="${choice:1}" - option="${option// /}" - if [ -z "$option" -a -n "$select_option" ]; then - select_action="$action" - break - elif [ -z "$option" ]; then - eerror "vous devez saisir le numéro de l'option" - elif isnum "$option"; then - if [ $option -gt 0 -a $option -le ${#options[*]} ]; then - select_action="$action" - select_option="${options[$(($option - 1))]}" - break - fi - else - eerror "$option: numéro d'option incorrecte" - fi - fi - elif isnum "$choice"; then - action="$default_action" - if [ -n "$action" ]; then - if array_contains void_actions "$action"; then - select_action="$action" - select_option= - break - else - option="${choice// /}" - if [ -z "$option" ]; then - eerror "vous devez saisir le numéro de l'option" - elif isnum "$option"; then - if [ $option -gt 0 -a $option -le ${#options[*]} ]; then - select_action="$action" - select_option="${options[$(($option - 1))]}" - break - fi - else - eerror "$option: numéro d'option incorrecte" - fi - fi - else - eerror "Vous devez spécifier l'action à effectuer" - fi - elif [ -n "$choice" ]; then - eerror "$choice: action et/ou option incorrecte" - else - eerror "vous devez saisir l'action à effectuer" - fi - let c=$c+1 - if [ $c -eq 5 ]; then - tooenc "" 1>&2 - c=0 - fi - done - __am_select_action="$select_action" - __am_select_option="$select_option" -} - - -function __ac_forgetall() { __ac_files=(); } -__ac_forgetall -function __ac_trap() { - local file - for file in "${__ac_files[@]}"; do - [ -e "$file" ] && rm -rf "$file" 2>/dev/null - done - __ac_forgetall -} -trap __ac_trap 1 3 15 EXIT -function autoclean() { - local file - for file in "$@"; do - [ -n "$file" ] && array_add __ac_files "$file" - done -} -function ac_cleanall() { - __ac_trap -} -function ac_clean() { - local file - for file in "$@"; do - if array_contains __ac_files "$file"; then - [ -e "$file" ] && rm -rf "$file" 2>/dev/null - array_del __ac_files "$file" - fi - done -} -function ac_set_tmpfile() { - local __acst_d - if show_debug; then - if [ -n "$5" ]; then - is_yes "${!5}" && __acst_d=1 - else - __acst_d=1 - fi - fi - if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" - [ -f "$3" -a "$4" == keep ] || >"$3" - else - local __acst_t="$(mktempf "$2")" - autoclean "$__acst_t" - set_var "$1" "$__acst_t" - fi -} -function ac_set_tmpdir() { - local __acst_d - if show_debug; then - if [ -n "$4" ]; then - is_yes "${!4}" && __acst_d=1 - else - __acst_d=1 - fi - fi - if [ -n "$__acst_d" -a -n "$3" ]; then - set_var "$1" "$3" - mkdir -p "$3" - else - local __acst_t="$(mktempd "$2")" - autoclean "$__acst_t" - set_var "$1" "$__acst_t" - fi -} -function debug_tee() { - if show_debug; then - tee "$@" - else - cat - fi -} - - -function get_defaults_files() { - local __gd_dest="${1:-defaults}"; shift - local -a __gd_fs - local __gd_f __gd_found - for __gd_f in "$@"; do - __gd_found= - if [ -r "/etc/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "/etc/default/$__gd_f") - __gd_found=1 - fi - if [ -r "$HOME/etc/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "$HOME/etc/default/$__gd_f") - __gd_found=1 - fi - if [ -z "$__gd_found" -a -r "$scriptdir/lib/default/$__gd_f" ]; then - __gd_fs=("${__gd_fs[@]}" "$scriptdir/lib/default/$__gd_f") - fi - done - array_copy "$__gd_dest" __gd_fs -} - -function set_defaults() { - local -a __sd_fs - local __sd_f - get_defaults_files __sd_fs "$@" - for __sd_f in "${__sd_fs[@]}"; do - source "$__sd_f" - done -} - - : "${MYHOST:=$HOSTNAME}" : "${MYHOSTNAME:=${MYHOST%%.*}}" export MYHOST MYHOSTNAME @@ -33208,9 +7375,9 @@ urequire base SYSNAMES=(linux linux64 linux32 linuxppc64 linuxppc32 linuxarm macosx) -linux_SYSDISTS=(debianlike debian ubuntu redhatlike rhel fedora centos suse gentoo) -linux32_SYSDISTS=(debianlike debian ubuntu redhatlike rhel fedora centos suse gentoo) -linux64_SYSDISTS=(debianlike debian ubuntu redhatlike rhel fedora centos suse gentoo) +linux_SYSDISTS=(debianlike debian ubuntu redhatlike ol rhel fedora centos suse gentoo) +linux32_SYSDISTS=(debianlike debian ubuntu redhatlike ol rhel fedora centos suse gentoo) +linux64_SYSDISTS=(debianlike debian ubuntu redhatlike ol rhel fedora centos suse gentoo) linuxppc32_SYSDISTS=(debianlike debian ubuntu redhatlike fedora) linuxppc64_SYSDISTS=(debianlike debian ubuntu redhatlike fedora) linuxarm_SYSDISTS=(debianlike debian ubuntu) @@ -33222,6 +7389,7 @@ debianlike_SYSVERS=() debian_SYSVERS=(stretch jessie wheezy squeeze lenny etch) ubuntu_SYSVERS=(oneiric natty maverick lucid karmic jaunty intrepid hardy) redhatlike_SYSVERS=() +ol_SYSVERS=(ol7 ol6 redhat7 redhat6) rhel_SYSVERS=(rhel7 rhel6 rhel5 rhel4 redhat7 redhat6 redhat5 redhat4) fedora_SYSVERS=(fedora14 fedora13 fedora12 fedora11) centos_SYSVERS=(centos7 centos6 centos5 centos4 redhat7 redhat6 redhat5 redhat4) @@ -33259,6 +7427,7 @@ function __compute_local_sysinfos_data() { "$UNAME_MACHINE" "$([ -f /etc/debian_version ] && cat /etc/debian_version)" "$([ -f /etc/gentoo-release ] && cat /etc/gentoo-release)" + "$([ -f /etc/oracle-release ] && cat /etc/oracle-release)" "$([ -f /etc/redhat-release ] && cat /etc/redhat-release)" "$([ -f /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Resources/version.plist ] && cat /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Resources/version.plist)" "$([ -f /System/Library/Frameworks/CoreServices.framework/Resources/version.plist ] && cat /System/Library/Frameworks/CoreServices.framework/Resources/version.plist)" @@ -33274,6 +7443,8 @@ echo .----------------. echo .----------------. [ -f /etc/gentoo-release ] && cat /etc/gentoo-release echo .----------------. +[ -f /etc/oracle-release ] && cat /etc/oracle-release +echo .----------------. [ -f /etc/redhat-release ] && cat /etc/redhat-release echo .----------------. [ -f /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Resources/version.plist ] && cat /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Resources/version.plist @@ -33312,10 +7483,14 @@ function __compute_sysinfos() { local machine="${SYSINFOS_DATA[1]}" local debian_version="${SYSINFOS_DATA[2]}" local gentoo_release="${SYSINFOS_DATA[3]}" - local redhat_release="${SYSINFOS_DATA[4]}" - local macosx_plist1="${SYSINFOS_DATA[5]}" - local macosx_plist2="${SYSINFOS_DATA[6]}" + local oracle_release="${SYSINFOS_DATA[4]}" + local redhat_release="${SYSINFOS_DATA[5]}" + local macosx_plist1="${SYSINFOS_DATA[6]}" + local macosx_plist2="${SYSINFOS_DATA[7]}" + MYSYSNAME=(unknown) + MYSYSDIST=(unknown) + MYSYSVER=(unknown) if [ "$system" == "Linux" ]; then case "$machine" in x86_64) MYSYSNAME=(linux64 linux); MYBITS=64;; @@ -33337,6 +7512,12 @@ function __compute_sysinfos() { esac elif [ -n "$gentoo_release" ]; then MYSYSDIST=(gentoo) + elif [ -n "$oracle_release" ]; then + MYSYSDIST=(ol rhel redhatlike) + case "$oracle_release" in + Oracle*Linux*release\ 7*) MYSYSVER=(ol7 rhel7 redhat7);; + Oracle*Linux*release\ 6*) MYSYSVER=(ol6 rhel6 redhat6);; + esac elif [ -n "$redhat_release" ]; then case "$redhat_release" in Fedora*) MYSYSDIST=(fedora redhatlike);; @@ -33370,13 +7551,14 @@ s/<\/string>.*$//g' done } MYSYSNAME=(macosx darwin) - case "$(get_macosx_version)" in + case "$(get_macosx_version "$macosx_plist1" "$macosx_plist2")" in 10.7*) MYSYSDIST=(lion);; 10.6*) MYSYSDIST=(snowleopard);; 10.5*) MYSYSDIST=(leopard);; 10.4*) MYSYSDIST=(tiger);; 10.3*) MYSYSDIST=(panther);; esac + MYSYSVER=() fi } @@ -33445,8 +7627,8 @@ function __fix_sysinfos_upward() { array_copy sysvers_ "${sysdist_}_SYSVERS" for sysver_ in "${sysvers_[@]}"; do if [ "$sysver_" == "${!sysvervar_}" ]; then - set_var "$sysdistvar_" "$sysdist_" - set_var "$sysnamevar_" "$sysname_" + _setv "$sysdistvar_" "$sysdist_" + _setv "$sysnamevar_" "$sysname_" return fi done @@ -33458,7 +7640,7 @@ function __fix_sysinfos_upward() { array_copy sysdists_ "${sysname_}_SYSDISTS" for sysdist_ in "${sysdists_[@]}"; do if [ "$sysdist_" == "${!sysdistvar_}" ]; then - set_var "$sysnamevar_" "$sysname_" + _setv "$sysnamevar_" "$sysname_" return fi done @@ -33473,7 +7655,7 @@ function __fix_sysinfos_downward() { if [ -z "${!sysdistvar_}" ]; then array_copy sysdists_ "${!sysnamevar_}_SYSDISTS" for sysdist_ in "${sysdists_[@]}"; do - set_var "$sysdistvar_" "$sysdist_" + _setv "$sysdistvar_" "$sysdist_" break done fi @@ -33482,7 +7664,7 @@ function __fix_sysinfos_downward() { if [ -z "${!sysvervar_}" ]; then array_copy sysvers_ "${sysdistvar_}_SYSVERS" for sysver_ in "${sysvers_[@]}"; do - set_var "$sysvervar_" "$sysver_" + _setv "$sysvervar_" "$sysver_" break done fi @@ -33491,12 +7673,23 @@ function ensure_sysinfos() { local sysnamevar_="${1:-SYSNAME}" local sysdistvar_="${2:-SYSDIST}" local sysvervar_="${3:-SYSVER}" - [ -n "${!sysdistvar_}" ] && set_var "$sysdistvar_" "$(__get_sysdist_alias "${!sysdistvar_}")" - [ -n "${!sysvervar_}" ] && set_var "$sysvervar_" "$(__get_sysver_alias "${!sysvervar_}")" + [ -n "${!sysdistvar_}" ] && _setv "$sysdistvar_" "$(__get_sysdist_alias "${!sysdistvar_}")" + [ -n "${!sysvervar_}" ] && _setv "$sysvervar_" "$(__get_sysver_alias "${!sysvervar_}")" __fix_sysinfos_upward __fix_sysinfos_downward } +function dump_sysinfos() { + local sysname_="${1:-MYSYSNAME}[*]" + local sysdist_="${2:-MYSYSDIST}[*]" + local sysver_="${3:-MYSYSVER}[*]" + echo "\ +sysname=(${!sysname_}) +sysdist=(${!sysdist_}) +sysver=(${!sysver_}) +bits=$MYBITS" +} + function get_sysinfos_desc() { local sysname_="${1:-MYSYSNAME}"; sysname_="${!sysname_}" local sysdist_="${2:-MYSYSDIST}"; sysdist_="${!sysdist_}" @@ -33632,6 +7825,24 @@ function check_sysinfos() { return $r_ } +function unsupported_system() { + local msg="Ce script n'est pas supporté sur $(get_sysinfos_desc)" + [ -n "$*" ] && msg="$msg +Il faut au moins l'un des systèmes suivants: $*" + die "$msg" +} + +function require_sysinfos() { + check_sysinfos "$@" && return 0 + local -a infos; local info + for info in "$@"; do + if ! [[ "$info" == -* ]]; then + infos=("${infos[@]}" "$info") + fi + done + unsupported_system "${infos[@]}" +} + function on_debian() { NUTOOLS_ON_DEBIAN= if check_sysinfos -d debian; then @@ -33916,7 +8127,7 @@ if check_sysinfos -s macosx; then done args=("${args[@]}" "$@") fi - quoted_args "${options[@]}" -- "${args[@]}" + qvals "${options[@]}" -- "${args[@]}" return 0 } @@ -34093,7 +8304,9 @@ function ctnow() { __CTRESOLVE_CTNOW="" function ctresolve() { local -a ctnow - if [ -n "$__CTRESOLVE_CTNOW" ]; then + if [ "$__CTRESOLVE_CTNOW" == "**ANY**" ]; then + ctnow=("$__CTRESOLVE_CTNOW") + elif [ -n "$__CTRESOLVE_CTNOW" ]; then eval "ctnow=($__CTRESOLVE_CTNOW)" else eval "ctnow=($(ctnow))" @@ -34129,6 +8342,8 @@ function ctmatch_one(ctval, ref, parts, part, i, j, start, end, ste return ok } function ctmatch_all(M, H, dom, mon, dow, refM, refH, refdom, refmon, refdow, Mok, Hok, domok, monok, dowok) { + if (refM == "**ANY**") return 1 + gsub(/\*/, "0-59", M) Mok = ctmatch_one(M, refM) @@ -34376,7 +8591,7 @@ EOF } [ -n "$host" ] && undocmd=("${undocmd[@]}" -H "$host") undocmd=("${undocmd[@]}" "$ctline") - echo "$(quoted_args "${undocmd[@]}") || allok=" >>"$undoscript" + echo "$(qvals "${undocmd[@]}") || allok=" >>"$undoscript" } function get_time() { @@ -34442,10 +8657,10 @@ $cmd"' if [ -n "$fake" ]; then if [ -n "$cmd" ]; then - eecho "$action $(quoted_args "$(update_cmd "$ctline" "$tmpcmd:")") + eecho "$action $(qvals "$(update_cmd "$ctline" "$tmpcmd:")") $(sed 's/^/ /g' <<<"$cmd")" else - eecho "$action $(quoted_args "$ctline")" + eecho "$action $(qvals "$ctline")" fi elif "$action" "$ctline" "$user"; then estep "$action $ctline" @@ -34490,16 +8705,16 @@ function do_remote() { else ssh_user="$user" fi - ssh_cmd="$(quoted_args chmod +x "$remotename"); $(quoted_args "./$remotename" --autoclean "$remotename" "$actionopt" -u "$user" --dom "$dom" --month "$month" ${cmd:+-s "$cmdfile" -S "$cmd"} "$ctline"); true" + ssh_cmd="$(qvals chmod +x "$remotename"); $(qvals "./$remotename" --autoclean "$remotename" "$actionopt" -u "$user" --dom "$dom" --month "$month" ${cmd:+-s "$cmdfile" -S "$cmd"} "$ctline"); true" [ -z "$fake" ] && etitle -s "$host" ok= if [ -n "$fake" ]; then if [ -n "$cmd" ]; then - eecho "[$host] $action $(quoted_arg "$(update_cmd "$ctline" "$cmdfile:")") + eecho "[$host] $action $(qvalm "$(update_cmd "$ctline" "$cmdfile:")") $(sed 's/^/ /g' <<<"$cmd")" else - eecho "[$host] $action $(quoted_arg "$ctline")" + eecho "[$host] $action $(qvalm "$ctline")" fi ok=1 elif scp -o ConnectTimeout=5 -q "$script" "$ssh_user@$host:$remotename"; then diff --git a/udist b/udist index 5ec2755..01eae77 100755 --- a/udist +++ b/udist @@ -237,10 +237,10 @@ function __load_udist_nolocal() { ( [ -d "$udistf" ] && udistf="$udistf/.udist" source "$udistf" - set_var_cmd "${2}VERSION" "$VERSION" + echo_setv "${2}VERSION" "$VERSION" set_array_cmd "${2}VERSIONS" VERSIONS set_array_cmd "${2}TAGS" TAGS - set_var_cmd "${2}ORIGIN" "$ORIGIN" + echo_setv "${2}ORIGIN" "$ORIGIN" set_array_cmd "${2}LOCALS" LOCALS ); } @@ -264,10 +264,10 @@ function __save_udist() { splitpair "$__su_dest" __su_dest __su_varname [ -n "$__su_varname" ] || __su_varname="$__su_dest" case "$__su_dest" in - VERSION) array_add __su_cmd "$(set_var_cmd VERSION "${!__su_varname}")";; + VERSION) array_add __su_cmd "$(echo_setv VERSION "${!__su_varname}")";; VERSIONS) array_add __su_cmd "$(set_array_cmd VERSIONS "${__su_varname}")";; TAGS) array_add __su_cmd "$(set_array_cmd TAGS "${__su_varname}")";; - ORIGIN) array_add __su_cmd "$(set_var_cmd ORIGIN "${!__su_varname}")";; + ORIGIN) array_add __su_cmd "$(echo_setv ORIGIN "${!__su_varname}")";; LOCALS) array_add __su_cmd "$(set_array_cmd LOCALS "${__su_varname}")";; esac done @@ -1306,7 +1306,7 @@ function local_put_cmd() { local script= for localfile in "${localfiles[@]}"; do [ -n "$script" ] && script="$script; " - script="$script$(quoted_args chown "$owner" "$destdir/$localfile")" + script="$script$(qvals chown "$owner" "$destdir/$localfile")" done "${ssh:-ssh}" -qt "$userhost:$destdir" "$script" fi diff --git a/uldap b/uldap index befeb1d..6d5cdef 100755 --- a/uldap +++ b/uldap @@ -41,7 +41,7 @@ function split_cmds() { fi done if [ -n "$__sc_addtocmd" ]; then - __sc_cmd="${__sc_cmd:+$__sc_cmd }$(quoted_arg "$__sc_arg")" + __sc_cmd="${__sc_cmd:+$__sc_cmd }$(qvalm "$__sc_arg")" __sc_arg= fi if [ -n "$__sc_foundsep" ]; then @@ -150,7 +150,7 @@ function set_values() { if array_contains VARIABLES "$uname" || array_contains SPECIAL_VARIABLES "$uname"; then "set_$lname" "$value" || s=1 elif ! array_contains PROTECTED_VARIABLES "$name"; then - set_var "$name" "$value" + _setv "$name" "$value" else s=1 fi @@ -321,7 +321,7 @@ function __push() { local __varcmd __name for __name in "$@"; do __varcmd="${__varcmd:+$__varcmd -}$(set_var_cmd "$__name" "${!__name}")" +}$(echo_setv "$__name" "${!__name}")" done WSSTACK=("${WSSTACK[@]}" "$__varcmd") } @@ -1349,7 +1349,7 @@ function uldap_undo() { function uldap_ifok() { if [ "$EXITCODE" -eq 0 ]; then - eval_cmdline "$(quoted_args "$@")" + eval_cmdline "$(qvals "$@")" else return 0 fi @@ -1357,7 +1357,7 @@ function uldap_ifok() { function uldap_iferror() { if [ "$EXITCODE" -ne 0 ]; then - eval_cmdline "$(quoted_args "$@")" + eval_cmdline "$(qvals "$@")" else return 0 fi @@ -1464,7 +1464,7 @@ if [ -n "$*" ]; then INTERACTIVE= [ "$EXIT_ON_ERROR" == auto ] && set_values exit_on_error=true # splitter sur les lignes - array_from_lines lcmds "$(quoted_args "$@")" + array_from_lines lcmds "$(qvals "$@")" [ -n "$AUTOPRINT" ] && array_add lcmds print elif [ -n "$lscriptfile" ]; then [ -f "$lscriptfile" ] || die "$lscriptfile: fichier introuvable" diff --git a/ulib b/ulib index 1a91c35..4e7b311 100755 --- a/ulib +++ b/ulib @@ -343,18 +343,18 @@ if ! grep -q '$scriptdir/profile' ~/.bash_profile; then fi # Modifier le PATH. Ajouter aussi le chemin vers les uapps python -PATH=$(quoted_args "$scriptdir:$scriptdir/lib/pyulib/src/uapps:$PATH") +PATH=$(qval "$scriptdir:$scriptdir/lib/pyulib/src/uapps:$PATH") if [ -n '$DEFAULT_PS1' ]; then - DEFAULT_PS1=$(quoted_args "[ulibshell] $DEFAULT_PS1") + DEFAULT_PS1=$(qval "[ulibshell] $DEFAULT_PS1") else if [ -z '$PS1' ]; then PS1='\\u@\\h \\w \\$ ' fi PS1=\"[ulibshell] \$PS1\" fi -$(quoted_args source "$scriptdir/lib/ulib/ulib") -__ULIB_FORCE_RELOAD=$(quoted_args "$__ULIB_FORCE_RELOAD") +$(qvals source "$scriptdir/lib/ulib/ulib") +__ULIB_FORCE_RELOAD=$(qval "$__ULIB_FORCE_RELOAD") urequire DEFAULTS" >"$bashrc" array_fix_paths modules @@ -362,7 +362,7 @@ urequire DEFAULTS" >"$bashrc" etitle "Chargement des modules" for module in "${modules[@]}"; do estep "$module" - quoted_args urequire "$module" >>"$bashrc" + qvals urequire "$module" >>"$bashrc" done eend fi diff --git a/umatch b/umatch index af3b7ae..212971d 100755 --- a/umatch +++ b/umatch @@ -120,14 +120,14 @@ case "$regexp" in ip) regexp='[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+';; esac -cmd="$(quoted_args match "$regexp" "$sep")" +cmd="$(qvals match "$regexp" "$sep")" [ -n "$sort" ] && cmd="$cmd | sort" -[ -n "$count" ] && cmd="$cmd | $(quoted_args count "$count" "$sep" "$all_lines")" +[ -n "$count" ] && cmd="$cmd | $(qvals count "$count" "$sep" "$all_lines")" if [ -n "$multiple" ]; then if [ -n "$all_lines" ]; then - cmd="$cmd | $(quoted_args grep -v -B 1 "^1$sep")" + cmd="$cmd | $(qvals grep -v -B 1 "^1$sep")" else - cmd="$cmd | $(quoted_args grep -v "^1$sep")" + cmd="$cmd | $(qvals grep -v "^1$sep")" fi fi diff --git a/uscrontab b/uscrontab index fb8af9e..e0ca551 100755 --- a/uscrontab +++ b/uscrontab @@ -285,7 +285,13 @@ OPTIONS AVANCEES Pour le développement ou des tests, forcer la valeur de l'heure de référence. Il faut respecter le format, sinon les résultats ne sont pas garantis. Le mieux est de reprendre le résultat de l'option --show-ctnow - en le modifiant un peu si nécessaire." + en le modifiant un peu si nécessaire. + -G, --any-ctnow + Pour le développement ou des tests, lancer toutes les commandes dans + l'ordre sans tenir compte de l'heure de référence. Cette commande ne + devrait pas être utilisée en temps normal, mais elle existe pour + simplifier les tests avec --show-ctnow + --force-ctnow dans les cas + simples." } function set_usercrontabs() { @@ -361,6 +367,7 @@ parse_opts "${PRETTYOPTS[@]}" \ -k:,--stop: USCRONTAB_STOPEC= \ --show-ctnow action=show-ctnow \ --force-ctnow: __CTRESOLVE_CTNOW= \ + -G,--any-ctnow __CTRESOLVE_CTNOW="**ANY**" \ @ args -- "$@" && set -- "${args[@]}" || die "$args" uscrontab="$1"; shift @@ -477,12 +484,12 @@ fi if [ "$action" == "install" ]; then ctline="$USCRONTAB_CTLINE" - [ -n "$uscrontab" ] && ctline="$ctline $(quoted_arg "$uscrontab")" + [ -n "$uscrontab" ] && ctline="$ctline $(qvalm "$uscrontab")" enable_in_crontab "$ctline" && estep "add_to_crontab $ctline" elif [ "$action" == "uninstall" ]; then ctline="$USCRONTAB_CTLINE" - [ -n "$uscrontab" ] && ctline="$ctline $(quoted_arg "$uscrontab")" + [ -n "$uscrontab" ] && ctline="$ctline $(qvalm "$uscrontab")" if [ -n "$disable_only" ]; then disable_in_crontab "$ctline" && estep "disable_in_crontab $ctline" else @@ -648,7 +655,7 @@ puis supprimez le cas échéant le fichier $pidfile" for __var in "$@"; do splitvar "$__var" __name __value edebug "$__name=$__value" - set_var "$__name" "$__value" + _setv "$__name" "$__value" done eval "$__ctscript" ac_cleanall diff --git a/ussh b/ussh index 0079fc3..104706f 100755 --- a/ussh +++ b/ussh @@ -369,13 +369,13 @@ function show_vars() { local -a sshopts [ "${#hosts[*]}" -gt 1 ] && exec= set_array_cmd hosts - set_var_cmd ssh "$SSH" - set_var_cmd exec "$exec" + echo_setv ssh "$SSH" + echo_setv exec "$exec" set_array_cmd args @ "$@" for host in "${hosts[@]}"; do array_copy sshopts SSHOPTS __update_sshopts "$host" "$@" - set_var_cmd host "$host" + echo_setv host "$host" set_array_cmd options sshopts done }