diff --git a/doc/EnsureVM.md b/doc/EnsureVM.md new file mode 100644 index 0000000..aa982f7 --- /dev/null +++ b/doc/EnsureVM.md @@ -0,0 +1,12 @@ +# EnsureVM + +~~~ +EnsureVM: s'assurer que les services sont lancés pour un type de virtualisation + +USAGE + EnsureVM type + +Les types supportés sont virtualbox et kvm (par défaut) +~~~ + +-*- 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/SKvm.md b/doc/SKvm.md new file mode 100644 index 0000000..46d6d98 --- /dev/null +++ b/doc/SKvm.md @@ -0,0 +1,36 @@ +# SKvm + +~~~ +SKvm: lancer une machine virtuelle kvm + +USAGE + SKvm [options] vmName + SKvm {-l|-A|-g} + +OPTIONS + -n, --check + Ne rien faire excepté s'assurer que les modules kvm sont chargés + -u, --user + Lancer l'opération avec les droits de l'utilisateur courant. Par défaut, + ce script tente d'acquérir les droits de root. + -l, --list + Lister les machines virtuelles + -s, --start + Démarrer la machine virtuelle (par défaut) + Si le nom de la machine virtuelle n'est pas spécifiée, un menu est + affiché + -k, --stop + Arrêter la machine virtuelle + -H, --destroy + Arrêter sauvagement la machine virtuelle + -r, --restart + Redémarrer la machine virtuelle + -S, --managed-save + Enregistrer l'état de la machine virtuelle + -A, --stop-all + Arrêter toutes les machines virtuelles qui tournent actuellement + -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/SKvm.twp b/doc/SKvm.twp index f51b308..8d66b66 100644 --- a/doc/SKvm.twp +++ b/doc/SKvm.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:20 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -14,17 +14,27 @@ USAGE SKvm {-l|-A|-g} OPTIONS - -n Ne rien faire excepté s'assurer que les modules kvm sont chargés - -u Lancer l'opération avec les droits de l'utilisateur courant. Par défaut, + -n, --check + Ne rien faire excepté s'assurer que les modules kvm sont chargés + -u, --user + Lancer l'opération avec les droits de l'utilisateur courant. Par défaut, ce script tente d'acquérir les droits de root. - -l Lister les machines virtuelles - -s Démarrer la machine virtuelle (par défaut) + -l, --list + Lister les machines virtuelles + -s, --start + Démarrer la machine virtuelle (par défaut) Si le nom de la machine virtuelle n'est pas spécifiée, un menu est affiché - -k Arrêter la machine virtuelle - -H Arrêter sauvagement la machine virtuelle - -r Redémarrer la machine virtuelle - -S Enregistrer l'état de la machine virtuelle - -A Arrêter toutes les machines virtuelles qui tournent actuellement - -g Afficher le gestionnaire de machines virtuelle + -k, --stop + Arrêter la machine virtuelle + -H, --destroy + Arrêter sauvagement la machine virtuelle + -r, --restart + Redémarrer la machine virtuelle + -S, --managed-save + Enregistrer l'état de la machine virtuelle + -A, --stop-all + Arrêter toutes les machines virtuelles qui tournent actuellement + -g, --gui + Afficher le gestionnaire de machines virtuelle }}} diff --git a/doc/SVirtualBox.md b/doc/SVirtualBox.md new file mode 100644 index 0000000..2d9e652 --- /dev/null +++ b/doc/SVirtualBox.md @@ -0,0 +1,25 @@ +# SVirtualBox + +~~~ +SVirtualBox: lancer une machine virtuelle VirtualBox + +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) + 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 +~~~ + +-*- 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/SVirtualBox.twp b/doc/SVirtualBox.twp index 3d7def5..b07371d 100644 --- a/doc/SVirtualBox.twp +++ b/doc/SVirtualBox.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:20 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -18,6 +18,8 @@ OPTIONS -s Démarrer la machine virtuelle (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 diff --git a/doc/_root.md b/doc/_root.md new file mode 100644 index 0000000..5badffc --- /dev/null +++ b/doc/_root.md @@ -0,0 +1,8 @@ +# _root + +~~~ +_root: devenir l'utilisateur root, avec 'sudo' si possible, ou 'su' si +'sudo' n'est pas installé +~~~ + +-*- 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/apacheconfig.md b/doc/apacheconfig.md new file mode 100644 index 0000000..9f05203 --- /dev/null +++ b/doc/apacheconfig.md @@ -0,0 +1,65 @@ +# apacheconfig + +~~~ +apacheconfig: Gérer la configuration d'un serveur web apache + +USAGE + apacheconfig -c + apacheconfig -t -- args... + +OPTIONS + -c, --create + Créer un nouveau répertoire de configuration pour un hôte + -d, --destdir DESTDIR[=apacheconfig] + Nom du répertoire local de configuration. + + -t, --template [OPT] + Gérer les fichiers du répertoire local avec templatectl. La valeur de + cette option est utilisée comme argument court pour l'invocation de + templatectl, e.g + apacheconfig -tm args + est équivalent à + templatectl -m args + Les arguments qui restent sont passés tels quels à templatectl + Les options courantes de templatectl -l, -v, -m, -L sont disponibles + directement + --help-template + Afficher l'aide concernent la gestion des templates. + Equivalent à -t -- --help + -h, --host HOST + Spécifier l'hôte. Equivalent à -v host=HOST + --sysname SYSNAME + --sysdist SYSDIST + -s, --sysver SYSVER + Spécifier la distribution pour laquelle synchroniser le template. Par + défaut, choisir les valeurs correspondantes au système courant. + Les options -7 et -8 sont des aliases respectivement pour -s wheezy et + -s jessie, parce que les fichiers par défaut ont changé à partir de + debian jessie. + + -u, --update, --deploy + Mettre à jour la configuration système à partir du répertoire local. + Lors du déploiement de la configuration, les valeurs des variables + dynamiques sont remplacées dans les fichiers destination. + Les arguments qui restent sont passés tels quels à apache_autoconf + -r, --certsdir CERTSDIR + Spécifier le cas échéant le répertoire contenant les certificats à + déployer. Cet argument est requis si le répertoire certsconf/ existe. + + --localhosts + Créer dans le fichier /etc/hosts tous les noms d'hôte ayant un suffixe + .local mentionnés dans les fichiers de site. Cette option est utile pour + le développement et les tests. + -C, --one-conf CONF + Ne déployer que le fichier de configuration spécifié. Cette option est + utilisée avec --deploy et est utile pour le développement et les tests. + -M, --one-module MODULE + Ne déployer que le fichier de module spécifié. Cette option est utilisée + avec --deploy et est utile pour le développement et les tests. + -S, --one-site SITE + Ne déployer que le fichier de site spécifié. Cette option est utilisée + avec --deploy ou --localhosts et est utile pour le développement et les + tests. +~~~ + +-*- 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/apacheconfig.twp b/doc/apacheconfig.twp new file mode 100644 index 0000000..e5f2c89 --- /dev/null +++ b/doc/apacheconfig.twp @@ -0,0 +1,69 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:18 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: apacheconfig + +{{{ +apacheconfig: Gérer la configuration d'un serveur web apache + +USAGE + apacheconfig -c + apacheconfig -t -- args... + +OPTIONS + -c, --create + Créer un nouveau répertoire de configuration pour un hôte + -d, --destdir DESTDIR[=apacheconfig] + Nom du répertoire local de configuration. + + -t, --template [OPT] + Gérer les fichiers du répertoire local avec templatectl. La valeur de + cette option est utilisée comme argument court pour l'invocation de + templatectl, e.g + apacheconfig -tm args + est équivalent à + templatectl -m args + Les arguments qui restent sont passés tels quels à templatectl + Les options courantes de templatectl -l, -v, -m, -L sont disponibles + directement + --help-template + Afficher l'aide concernent la gestion des templates. + Equivalent à -t -- --help + -h, --host HOST + Spécifier l'hôte. Equivalent à -v host=HOST + --sysname SYSNAME + --sysdist SYSDIST + -s, --sysver SYSVER + Spécifier la distribution pour laquelle synchroniser le template. Par + défaut, choisir les valeurs correspondantes au système courant. + Les options -7 et -8 sont des aliases respectivement pour -s wheezy et + -s jessie, parce que les fichiers par défaut ont changé à partir de + debian jessie. + + -u, --update, --deploy + Mettre à jour la configuration système à partir du répertoire local. + Lors du déploiement de la configuration, les valeurs des variables + dynamiques sont remplacées dans les fichiers destination. + Les arguments qui restent sont passés tels quels à apache_autoconf + -r, --certsdir CERTSDIR + Spécifier le cas échéant le répertoire contenant les certificats à + déployer. Cet argument est requis si le répertoire certsconf/ existe. + + --localhosts + Créer dans le fichier /etc/hosts tous les noms d'hôte ayant un suffixe + .local mentionnés dans les fichiers de site. Cette option est utile pour + le développement et les tests. + -C, --one-conf CONF + Ne déployer que le fichier de configuration spécifié. Cette option est + utilisée avec --deploy et est utile pour le développement et les tests. + -M, --one-module MODULE + Ne déployer que le fichier de module spécifié. Cette option est utilisée + avec --deploy et est utile pour le développement et les tests. + -S, --one-site SITE + Ne déployer que le fichier de site spécifié. Cette option est utilisée + avec --deploy ou --localhosts et est utile pour le développement et les + tests. +}}} diff --git a/doc/authftp.md b/doc/authftp.md new file mode 100644 index 0000000..f35d009 --- /dev/null +++ b/doc/authftp.md @@ -0,0 +1,35 @@ +# authftp + +~~~ +authftp: Se connecter sur un site FTP authentifié +Ce script nécessite ncftp. Il est conçu pour faciliter l'accès à des sites FTP +s'il est requis d'y accéder par un proxy FTP pour les connexion authentifiées. + +USAGE + authftp [options] host login password [path] + +OPTIONS + -p, --proxy + -n, --noproxy + Forcer l'utilisation, resp. ne pas utiliser, le proxy FTP (i.e. faire la + connexion directement) + -l, --lftp + Se connecter avec lftp au lieu de ncftp. Le fonctionnement n'est pas + garanti si l'on utilise un proxy FTP. + -o OPTION + Ajouter une option à la commande lancée. Si l'option prend un argument, + il faut doubler l'option -o, e.g. + authftp -l -o -e -o 'mirror remote local' host login pass + Dans cet exemple, l'option -e de lftp est utilisée pour faire un miroir + local du répertoire remote. + --tls + Indiquer que la connexion se fera en TLS. Implique --lftp puisque ncftp + ne le supporte pas. + +note: A cause d'une limitation de lftp, ce n'est pas possible de se connecter +automatiquement avec lftp si le mot de passe contient une virgule. A cause de la +façon dont le proxy ftp est configuré, il n'est pas possible de se connecter +avec un mot de passe qui contient le caractère @ +~~~ + +-*- 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/authftp.twp b/doc/authftp.twp index b383b5c..f132efe 100644 --- a/doc/authftp.twp +++ b/doc/authftp.twp @@ -1,18 +1,39 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:19 +##@created: 27/04/2016 03:18 ##@modifier: jclain ##@changecount: 1 ##@tags: ##@title: authftp {{{ -authftp: Se connecter avec ncftp sur un site FTP authentifié -Ce script est conçu pour les sites qui utilisent un proxy FTP pour les connexion -authentifiées. +authftp: Se connecter sur un site FTP authentifié +Ce script nécessite ncftp. Il est conçu pour faciliter l'accès à des sites FTP +s'il est requis d'y accéder par un proxy FTP pour les connexion authentifiées. USAGE authftp [options] host login password [path] OPTIONS + -p, --proxy + -n, --noproxy + Forcer l'utilisation, resp. ne pas utiliser, le proxy FTP (i.e. faire la + connexion directement) + -l, --lftp + Se connecter avec lftp au lieu de ncftp. Le fonctionnement n'est pas + garanti si l'on utilise un proxy FTP. + -o OPTION + Ajouter une option à la commande lancée. Si l'option prend un argument, + il faut doubler l'option -o, e.g. + authftp -l -o -e -o 'mirror remote local' host login pass + Dans cet exemple, l'option -e de lftp est utilisée pour faire un miroir + local du répertoire remote. + --tls + Indiquer que la connexion se fera en TLS. Implique --lftp puisque ncftp + ne le supporte pas. + +note: A cause d'une limitation de lftp, ce n'est pas possible de se connecter +automatiquement avec lftp si le mot de passe contient une virgule. A cause de la +façon dont le proxy ftp est configuré, il n'est pas possible de se connecter +avec un mot de passe qui contient le caractère @ }}} diff --git a/doc/caturl.md b/doc/caturl.md new file mode 100644 index 0000000..fbc78e5 --- /dev/null +++ b/doc/caturl.md @@ -0,0 +1,10 @@ +# caturl + +~~~ +caturl: Afficher une url + +USAGE + caturl +~~~ + +-*- 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/compileAndGo.md b/doc/compileAndGo.md new file mode 100644 index 0000000..739cd83 --- /dev/null +++ b/doc/compileAndGo.md @@ -0,0 +1,7 @@ +# compileAndGo + +~~~ +compileAndGo: see http://Yost.com/computers/compileAndGo +~~~ + +-*- 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/cssh.md b/doc/cssh.md new file mode 100644 index 0000000..6833512 --- /dev/null +++ b/doc/cssh.md @@ -0,0 +1,14 @@ +# cssh + +~~~ +cssh: Faire une connexion ssh en lançant automatiquement un screen sur l'hôte distant + +USAGE + cssh [user@]host [options] + +En principe, hormis l'argument user@host, il ne faudrait spécifier que des +options. Dans le cas où d'autres arguments seraient spécifiés, les meilleurs +efforts sont faits pour lancer ces commandes avant screen. +~~~ + +-*- 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/cssh.twp b/doc/cssh.twp new file mode 100644 index 0000000..228e26e --- /dev/null +++ b/doc/cssh.twp @@ -0,0 +1,18 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:18 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: cssh + +{{{ +cssh: Faire une connexion ssh en lançant automatiquement un screen sur l'hôte distant + +USAGE + cssh [user@]host [options] + +En principe, hormis l'argument user@host, il ne faudrait spécifier que des +options. Dans le cas où d'autres arguments seraient spécifiés, les meilleurs +efforts sont faits pour lancer ces commandes avant screen. +}}} diff --git a/doc/doinplace.md b/doc/doinplace.md new file mode 100644 index 0000000..5053c0d --- /dev/null +++ b/doc/doinplace.md @@ -0,0 +1,31 @@ +# doinplace + +~~~ +doinplace: filtrer en place un fichier à travers une suite de commandes + +USAGE + doinplace FILE COMMAND [ARGS...] + +Si on utilise une commande avec des options, penser à utliser '--' pour séparer +les options de ce script des options de la commande + +En plus des commandes systèmes, il est possible d'utiliser toute fonction de +nutools qui effectue des traitement sur un flux comme stripnl, filter_empty, +merge_contlines, filter_comment, filter_conf, etc. Les fonctions nl2lf, nl2crlf, +nl2cr, latin1compat et noaccents sont aussi disponibles par convenance. + +OPTIONS + -p, --evalp + Evaluer la commande avec evalp(), ce qui permet de chainer plusieurs + commandes en les séparant par //. Cette option est automatiquement + activée si ce script est lancé avec le nom doinplacex + -g, --ignore-error, --replace-always + Normalement, le fichier n'est pas remplacé si la commande retourne une + erreur. Avec cette option, le fichier est remplacé quel que soit le code + de retour de la commande. A utiliser par exemple avec des commandes + comme grep qui peuvent retourner FAUX s'ils ne trouvent pas le motif. + Cette option est automatiquement activée si ce script est lancé avec le + nom doinplacef +~~~ + +-*- 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/doinplace.twp b/doc/doinplace.twp new file mode 100644 index 0000000..6d291d5 --- /dev/null +++ b/doc/doinplace.twp @@ -0,0 +1,35 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:18 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: doinplace + +{{{ +doinplace: filtrer en place un fichier à travers une suite de commandes + +USAGE + doinplace FILE COMMAND [ARGS...] + +Si on utilise une commande avec des options, penser à utliser '--' pour séparer +les options de ce script des options de la commande + +En plus des commandes systèmes, il est possible d'utiliser toute fonction de +nutools qui effectue des traitement sur un flux comme stripnl, filter_empty, +merge_contlines, filter_comment, filter_conf, etc. Les fonctions nl2lf, nl2crlf, +nl2cr, latin1compat et noaccents sont aussi disponibles par convenance. + +OPTIONS + -p, --evalp + Evaluer la commande avec evalp(), ce qui permet de chainer plusieurs + commandes en les séparant par //. Cette option est automatiquement + activée si ce script est lancé avec le nom doinplacex + -g, --ignore-error, --replace-always + Normalement, le fichier n'est pas remplacé si la commande retourne une + erreur. Avec cette option, le fichier est remplacé quel que soit le code + de retour de la commande. A utiliser par exemple avec des commandes + comme grep qui peuvent retourner FAUX s'ils ne trouvent pas le motif. + Cette option est automatiquement activée si ce script est lancé avec le + nom doinplacef +}}} diff --git a/doc/dumpclients.md b/doc/dumpclients.md new file mode 100644 index 0000000..d40bbf0 --- /dev/null +++ b/doc/dumpclients.md @@ -0,0 +1,26 @@ +# dumpclients + +~~~ +dumpclients: afficher les connexions TCP entrantes sur un port + +USAGE + dumpclients [options] port + +OPTIONS + -4, --only-tcp + -6, --only-tcp6 + Se limiter au protocole spécifié. Par défaut, afficher toutes les + connexions, qu'elles soient en IPv4 ou en IPv6 + -a, --all + Afficher tous les sockets, y compris les ports d'écoute. Par défaut, + seules les sockets ouvertes sont affichées. + -n, --numeric + Afficher uniquement les adresses IP au lieu du nom d'hôte. + -z, --allow-no-port + Ne pas exiger que le port soit spécifié + --show none,ip,port,state + Spécifier d'afficher comme informations supplémentaire: rien, l'adresse + ip, le port et/ou l'état. Par défaut, afficher le port et l'état. +~~~ + +-*- 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/dumpclients.twp b/doc/dumpclients.twp new file mode 100644 index 0000000..6983b14 --- /dev/null +++ b/doc/dumpclients.twp @@ -0,0 +1,30 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:18 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: dumpclients + +{{{ +dumpclients: afficher les connexions TCP entrantes sur un port + +USAGE + dumpclients [options] port + +OPTIONS + -4, --only-tcp + -6, --only-tcp6 + Se limiter au protocole spécifié. Par défaut, afficher toutes les + connexions, qu'elles soient en IPv4 ou en IPv6 + -a, --all + Afficher tous les sockets, y compris les ports d'écoute. Par défaut, + seules les sockets ouvertes sont affichées. + -n, --numeric + Afficher uniquement les adresses IP au lieu du nom d'hôte. + -z, --allow-no-port + Ne pas exiger que le port soit spécifié + --show none,ip,port,state + Spécifier d'afficher comme informations supplémentaire: rien, l'adresse + ip, le port et/ou l'état. Par défaut, afficher le port et l'état. +}}} diff --git a/doc/em.md b/doc/em.md new file mode 100644 index 0000000..9f5b43e --- /dev/null +++ b/doc/em.md @@ -0,0 +1,91 @@ +# em + +~~~ +Usage: /usr/bin/emacs [OPTION-OR-FILENAME]... + +Run Emacs, the extensible, customizable, self-documenting real-time +display editor. The recommended way to start Emacs for normal editing +is with no options at all. + +Run M-x info RET m emacs RET m emacs invocation RET inside Emacs to +read the main documentation for these command-line arguments. + +Initialization options: + +--batch do not do interactive display; implies -q +--daemon start a server in the background +--debug-init enable Emacs Lisp debugger for init file +--display, -d DISPLAY use X server DISPLAY +--no-desktop do not load a saved desktop +--no-init-file, -q load neither ~/.emacs nor default.el +--no-shared-memory, -nl do not use shared memory +--no-site-file do not load site-start.el +--no-splash do not display a splash screen on startup +--no-window-system, -nw do not communicate with X, ignoring $DISPLAY +--quick, -Q equivalent to -q --no-site-file --no-splash +--script FILE run FILE as an Emacs Lisp script +--terminal, -t DEVICE use DEVICE for terminal I/O +--user, -u USER load ~USER/.emacs instead of your own + +Action options: + +FILE visit FILE using find-file ++LINE go to line LINE in next FILE ++LINE:COLUMN go to line LINE, column COLUMN, in next FILE +--directory, -L DIR add DIR to variable load-path +--eval EXPR evaluate Emacs Lisp expression EXPR +--execute EXPR evaluate Emacs Lisp expression EXPR +--file FILE visit FILE using find-file +--find-file FILE visit FILE using find-file +--funcall, -f FUNC call Emacs Lisp function FUNC with no arguments +--insert FILE insert contents of FILE into current buffer +--kill exit without asking for confirmation +--load, -l FILE load Emacs Lisp FILE using the load function +--visit FILE visit FILE using find-file + +Display options: + +--background-color, -bg COLOR window background color +--basic-display, -D disable many display features; + used for debugging Emacs +--border-color, -bd COLOR main border color +--border-width, -bw WIDTH width of main border +--color, --color=MODE override color mode for character terminals; + MODE defaults to `auto', and can also + be `never', `auto', `always', + or a mode name like `ansi8' +--cursor-color, -cr COLOR color of the Emacs cursor indicating point +--font, -fn FONT default font; must be fixed-width +--foreground-color, -fg COLOR window foreground color +--fullheight, -fh make the first frame high as the screen +--fullscreen, -fs make first frame fullscreen +--fullwidth, -fw make the first frame wide as the screen +--maximized, -mm make the first frame maximized +--geometry, -g GEOMETRY window geometry +--no-bitmap-icon, -nbi do not use picture of gnu for Emacs icon +--iconic start Emacs in iconified state +--internal-border, -ib WIDTH width between text and main border +--line-spacing, -lsp PIXELS additional space to put between lines +--mouse-color, -ms COLOR mouse cursor color in Emacs window +--name NAME title for initial Emacs frame +--no-blinking-cursor, -nbc disable blinking cursor +--reverse-video, -r, -rv switch foreground and background +--title, -T TITLE title for initial Emacs frame +--vertical-scroll-bars, -vb enable vertical scroll bars +--xrm XRESOURCES set additional X resources +--parent-id XID set parent window +--help display this help and exit +--version output version information and exit + +You can generally also specify long option names with a single -; for +example, -batch as well as --batch. You can use any unambiguous +abbreviation for a --option. + +Various environment variables and window system resources also affect +Emacs' operation. See the main documentation. + +Report bugs to bug-gnu-emacs@gnu.org. First, please see the Bugs +section of the Emacs manual or the file BUGS. +~~~ + +-*- 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/em.twp b/doc/em.twp new file mode 100644 index 0000000..e405ebf --- /dev/null +++ b/doc/em.twp @@ -0,0 +1,95 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:18 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: em + +{{{ +Usage: /usr/bin/emacs [OPTION-OR-FILENAME]... + +Run Emacs, the extensible, customizable, self-documenting real-time +display editor. The recommended way to start Emacs for normal editing +is with no options at all. + +Run M-x info RET m emacs RET m emacs invocation RET inside Emacs to +read the main documentation for these command-line arguments. + +Initialization options: + +--batch do not do interactive display; implies -q +--daemon start a server in the background +--debug-init enable Emacs Lisp debugger for init file +--display, -d DISPLAY use X server DISPLAY +--no-desktop do not load a saved desktop +--no-init-file, -q load neither ~/.emacs nor default.el +--no-shared-memory, -nl do not use shared memory +--no-site-file do not load site-start.el +--no-splash do not display a splash screen on startup +--no-window-system, -nw do not communicate with X, ignoring $DISPLAY +--quick, -Q equivalent to -q --no-site-file --no-splash +--script FILE run FILE as an Emacs Lisp script +--terminal, -t DEVICE use DEVICE for terminal I/O +--user, -u USER load ~USER/.emacs instead of your own + +Action options: + +FILE visit FILE using find-file ++LINE go to line LINE in next FILE ++LINE:COLUMN go to line LINE, column COLUMN, in next FILE +--directory, -L DIR add DIR to variable load-path +--eval EXPR evaluate Emacs Lisp expression EXPR +--execute EXPR evaluate Emacs Lisp expression EXPR +--file FILE visit FILE using find-file +--find-file FILE visit FILE using find-file +--funcall, -f FUNC call Emacs Lisp function FUNC with no arguments +--insert FILE insert contents of FILE into current buffer +--kill exit without asking for confirmation +--load, -l FILE load Emacs Lisp FILE using the load function +--visit FILE visit FILE using find-file + +Display options: + +--background-color, -bg COLOR window background color +--basic-display, -D disable many display features; + used for debugging Emacs +--border-color, -bd COLOR main border color +--border-width, -bw WIDTH width of main border +--color, --color=MODE override color mode for character terminals; + MODE defaults to `auto', and can also + be `never', `auto', `always', + or a mode name like `ansi8' +--cursor-color, -cr COLOR color of the Emacs cursor indicating point +--font, -fn FONT default font; must be fixed-width +--foreground-color, -fg COLOR window foreground color +--fullheight, -fh make the first frame high as the screen +--fullscreen, -fs make first frame fullscreen +--fullwidth, -fw make the first frame wide as the screen +--maximized, -mm make the first frame maximized +--geometry, -g GEOMETRY window geometry +--no-bitmap-icon, -nbi do not use picture of gnu for Emacs icon +--iconic start Emacs in iconified state +--internal-border, -ib WIDTH width between text and main border +--line-spacing, -lsp PIXELS additional space to put between lines +--mouse-color, -ms COLOR mouse cursor color in Emacs window +--name NAME title for initial Emacs frame +--no-blinking-cursor, -nbc disable blinking cursor +--reverse-video, -r, -rv switch foreground and background +--title, -T TITLE title for initial Emacs frame +--vertical-scroll-bars, -vb enable vertical scroll bars +--xrm XRESOURCES set additional X resources +--parent-id XID set parent window +--help display this help and exit +--version output version information and exit + +You can generally also specify long option names with a single -; for +example, -batch as well as --batch. You can use any unambiguous +abbreviation for a --option. + +Various environment variables and window system resources also affect +Emacs' operation. See the main documentation. + +Report bugs to bug-gnu-emacs@gnu.org. First, please see the Bugs +section of the Emacs manual or the file BUGS. +}}} diff --git a/doc/fconv.md b/doc/fconv.md new file mode 100644 index 0000000..e3aa317 --- /dev/null +++ b/doc/fconv.md @@ -0,0 +1,60 @@ +# fconv + +~~~ +fconv: convertir un fichier ou les fichiers d'un répertoire + +USAGE + fconv -f FILE [cmds...] + fconv FILE [cmds...] + +Une ou plusieurs commandes peuvent être spécifiées, séparées par // +La commande par défaut est 'lf' +Si des commandes utilisant des options sont utilisées, penser à séparer les +options de fconv avec -- + +OPTIONS + -N, --detect-always + Pour la commande conv, ne pas optimiser le calcul de l'encoding. Cette + option n'est valide que si src_enc n'est pas spécifié. On assume que + tous les fichiers n'ont pas le même encoding: l'encoding src_enc est + donc recalculé à chaque fois. + -r, --reverse + Pour la commande conv, inverser src_enc et dest_enc, qui doivent être + tous les deux spécifiés. + -f, --file FILE + Spécifier le fichier ou le répertoire concerné par la conversion. Les + aliases -d et --dir sont aussi reconnus. + Si cette option n'est pas spécifiée, le premier argument est considéré + comme le nom du fichier ou du répertoire à convertir. Par défaut, + convertir l'entrée standard. + Si un répertoire est spécifié, tous les fichiers de ce répertoire et de + ses sous-répertoires sont recherchés de façon récursive, sans limite de + profondeur. Ensuite, chacun de ces fichiers est converti. + --show-cmd + Afficher la commande qui serait exécutée + +COMMANDES + c, conv dest_enc [src_enc] + Convertir le fichier dans un autre encoding. + dest_enc est l'encoding destination. Il doit être spécifié. + src_enc est l'encoding source. S'il n'est pas spécifié ou vaut 'detect', + il est autodétecté. + U, utf8 [src_enc] + Equivalent à conv utf8 src_enc + L, latin1 [src_enc] + Equivalent à conv latin1 src_enc + lf + crlf + cr + Convertir respectivement les caractères de fin de ligne en LF, CR/LF ou CR + lc, latin1compat + Transformer certains caratères UTF-8 en équivalents qui existent en Latin1 + na, noaccents + Transformer les caractères accentués en caractères non accentués + sort [-u] + Trier le fichier avec la commande sort. Attention! Il ne faut utiliser + que les options de sort qui agissent sur un flux e.g. -u pour trier les + lignes de façon unique. +~~~ + +-*- 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/fconv.twp b/doc/fconv.twp index 827c105..5306686 100644 --- a/doc/fconv.twp +++ b/doc/fconv.twp @@ -1,27 +1,64 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:19 +##@created: 27/04/2016 03:18 ##@modifier: jclain ##@changecount: 1 ##@tags: ##@title: fconv {{{ -fconv: convertir des fichiers dans un autre encoding +fconv: convertir un fichier ou les fichiers d'un répertoire USAGE - fconv [-f src_enc] [ -t dest_enc] [/path/to/file] + fconv -f FILE [cmds...] + fconv FILE [cmds...] + +Une ou plusieurs commandes peuvent être spécifiées, séparées par // +La commande par défaut est 'lf' +Si des commandes utilisant des options sont utilisées, penser à séparer les +options de fconv avec -- OPTIONS - -f from - Encoding source. Si n'est pas spécifié ou vaut 'detect', l'encoding est - autodétecté. - -t to - Encoding destination. Doit être spécifié. - Cas particulier: si to vaut 'lf' ou 'crlf', from est ignoré, et seuls - les caractères de fin de lignes sont convertis. - -N Ne pas optimiser le calcul de l'encoding. Cette option n'est valide que - si -f n'est pas spécifié. On assume que tous les noms de fichiers n'ont - pas le même encoding. L'encoding from est donc recalculé à chaque fois. - -r inverser from et to, qui doivent être tous les deux spécifiés. + -N, --detect-always + Pour la commande conv, ne pas optimiser le calcul de l'encoding. Cette + option n'est valide que si src_enc n'est pas spécifié. On assume que + tous les fichiers n'ont pas le même encoding: l'encoding src_enc est + donc recalculé à chaque fois. + -r, --reverse + Pour la commande conv, inverser src_enc et dest_enc, qui doivent être + tous les deux spécifiés. + -f, --file FILE + Spécifier le fichier ou le répertoire concerné par la conversion. Les + aliases -d et --dir sont aussi reconnus. + Si cette option n'est pas spécifiée, le premier argument est considéré + comme le nom du fichier ou du répertoire à convertir. Par défaut, + convertir l'entrée standard. + Si un répertoire est spécifié, tous les fichiers de ce répertoire et de + ses sous-répertoires sont recherchés de façon récursive, sans limite de + profondeur. Ensuite, chacun de ces fichiers est converti. + --show-cmd + Afficher la commande qui serait exécutée + +COMMANDES + c, conv dest_enc [src_enc] + Convertir le fichier dans un autre encoding. + dest_enc est l'encoding destination. Il doit être spécifié. + src_enc est l'encoding source. S'il n'est pas spécifié ou vaut 'detect', + il est autodétecté. + U, utf8 [src_enc] + Equivalent à conv utf8 src_enc + L, latin1 [src_enc] + Equivalent à conv latin1 src_enc + lf + crlf + cr + Convertir respectivement les caractères de fin de ligne en LF, CR/LF ou CR + lc, latin1compat + Transformer certains caratères UTF-8 en équivalents qui existent en Latin1 + na, noaccents + Transformer les caractères accentués en caractères non accentués + sort [-u] + Trier le fichier avec la commande sort. Attention! Il ne faut utiliser + que les options de sort qui agissent sur un flux e.g. -u pour trier les + lignes de façon unique. }}} diff --git a/doc/fnconv.md b/doc/fnconv.md new file mode 100644 index 0000000..02e1d31 --- /dev/null +++ b/doc/fnconv.md @@ -0,0 +1,54 @@ +# fnconv + +~~~ +fnconv: renommer un fichier ou les fichiers d'un répertoire + +USAGE + fnconv -f FILE [cmds...] + fnconv FILE [cmds...] + +Une ou plusieurs commandes peuvent être spécifiées, séparées // +La commande par défaut est 'fixcase' + +OPTIONS + -N, --detect-always + Pour la commande conv, ne pas optimiser le calcul de l'encoding. Cette + option n'est valide que si src_enc n'est pas spécifié. On assume que + tous les fichiers n'ont pas le même encoding: l'encoding src_enc est + donc recalculé à chaque fois. + -r, --reverse + Pour la commande conv, inverser src_enc et dest_enc, qui doivent être + tous les deux spécifiés. + -f, --file FILE + Spécifier le fichier ou le répertoire concerné par le renommage. Les + aliases -d et --dir sont aussi reconnus. + Si cette option n'est pas spécifiée, le premier argument est considéré + comme le nom du fichier ou du répertoire à renommer. + Si un répertoire est spécifié, le traitement est appliqué à tous les + fichiers et répertoires de façon récursive, sans limite de profondeur. + --show-cmd + Afficher la commande qui serait exécutée + +COMMANDES + C, conv dest_enc [src_enc] + Convertir le nom du fichier dans un autre encoding. + dest_enc est l'encoding destination. Il doit être spécifié. + src_enc est l'encoding source. S'il n'est pas spécifié ou vaut 'detect', + il est autodétecté. + U, utf8 [src_enc] + Equivalent à conv utf8 src_enc + L, latin1 [src_enc] + Equivalent à conv latin1 src_enc + lc, latin1compat + Transformer certains caratères UTF-8 en équivalents qui existent en Latin1 + na, noaccents + Transformer les caractères accentués en caractères non accentués + l, lowercase + Transfomer le nom en minuscule + u, uppercase + Transformer le nom en majuscule + f, fixcase + Transformer le nom en minuscule s'il est entièrement en majuscule +~~~ + +-*- 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/fnconv.twp b/doc/fnconv.twp index ad7bbc3..7337bce 100644 --- a/doc/fnconv.twp +++ b/doc/fnconv.twp @@ -1,25 +1,58 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:19 +##@created: 27/04/2016 03:18 ##@modifier: jclain ##@changecount: 1 ##@tags: ##@title: fnconv {{{ -fnconv: renommer des fichiers en changeant leur encoding +fnconv: renommer un fichier ou les fichiers d'un répertoire USAGE - fnconv [-f src_enc] [ -t dest_enc] [/path/to/file] + fnconv -f FILE [cmds...] + fnconv FILE [cmds...] + +Une ou plusieurs commandes peuvent être spécifiées, séparées // +La commande par défaut est 'fixcase' OPTIONS - -f from - Encoding source. Si n'est pas spécifié ou vaut 'detect', l'encoding est - autodétecté. - -t to - Encoding destination. Doit être spécifié. - -N Ne pas optimiser le calcul de l'encoding. Cette option n'est valide que - si -f n'est pas spécifié. On assume que tous les noms de fichiers n'ont - pas le même encoding. L'encoding from est donc recalculé à chaque fois. - -r inverser from et to, qui doivent être tous les deux spécifiés. + -N, --detect-always + Pour la commande conv, ne pas optimiser le calcul de l'encoding. Cette + option n'est valide que si src_enc n'est pas spécifié. On assume que + tous les fichiers n'ont pas le même encoding: l'encoding src_enc est + donc recalculé à chaque fois. + -r, --reverse + Pour la commande conv, inverser src_enc et dest_enc, qui doivent être + tous les deux spécifiés. + -f, --file FILE + Spécifier le fichier ou le répertoire concerné par le renommage. Les + aliases -d et --dir sont aussi reconnus. + Si cette option n'est pas spécifiée, le premier argument est considéré + comme le nom du fichier ou du répertoire à renommer. + Si un répertoire est spécifié, le traitement est appliqué à tous les + fichiers et répertoires de façon récursive, sans limite de profondeur. + --show-cmd + Afficher la commande qui serait exécutée + +COMMANDES + C, conv dest_enc [src_enc] + Convertir le nom du fichier dans un autre encoding. + dest_enc est l'encoding destination. Il doit être spécifié. + src_enc est l'encoding source. S'il n'est pas spécifié ou vaut 'detect', + il est autodétecté. + U, utf8 [src_enc] + Equivalent à conv utf8 src_enc + L, latin1 [src_enc] + Equivalent à conv latin1 src_enc + lc, latin1compat + Transformer certains caratères UTF-8 en équivalents qui existent en Latin1 + na, noaccents + Transformer les caractères accentués en caractères non accentués + l, lowercase + Transfomer le nom en minuscule + u, uppercase + Transformer le nom en majuscule + f, fixcase + Transformer le nom en minuscule s'il est entièrement en majuscule }}} diff --git a/doc/geturl.md b/doc/geturl.md new file mode 100644 index 0000000..cf5ba4e --- /dev/null +++ b/doc/geturl.md @@ -0,0 +1,10 @@ +# geturl + +~~~ +geturl: Télécharger un fichier avec wget ou curl + +USAGE + geturl [wget options] +~~~ + +-*- 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/index.md b/doc/index.md new file mode 100644 index 0000000..374a8f1 --- /dev/null +++ b/doc/index.md @@ -0,0 +1,35 @@ +# Présentation + +nutools est un ensemble d'utilitaires pour faciliter l'utililisation des Unixes, +en particulier Linux, mais aussi MacOS X et Cygwin. + +C'est aussi une librairie de scripts shell réutilisables ([ulib]()) et une +librairie de modules python réutilisables (pyulib) + +# Prérequis + +Python >= 2.3 et GNU Awk sont requis pour que toutes les fonctionnalités soient +supportées. +* Sous Linux, lors de l'installation du package, les meilleurs efforts sont fait + pour que ces packages soient installés. +* Sous MacOSX, il faut installer manuellement Fink, DarwinPorts ou Homebrew + +# Outils + +Chaque outil contient une aide intégrée. Il suffit de lancer l'outil avec +l'argument `--help` pour avoir une aide détaillée. + +* Déploiement d'un répertoire ou d'une archive + * [uinst](): Déploiement local + * [mkusfx](): Faire une archive auto-installable avec uinst + * [ruinst](): Déploiement distant avec uinst + * [runs](): Lancer un script avec le protocole RUNS + * [rruns](): Déploiement distant avec runs +* Librairie réutilisable de scripts shell + * [uinc](): Dépliage des inclusions dans un fichier + * [ulibsync](): Faire une copie locale pour un projet de ulib et/ou pyulib +* Autres outils + * [udir](): Gestion des paramètres d'un répertoire. Ces paramètres sont entre + autres utilisés par uinst et uinc. + +-*- 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/mkRewriteRules.md b/doc/mkRewriteRules.md new file mode 100644 index 0000000..feb8df6 --- /dev/null +++ b/doc/mkRewriteRules.md @@ -0,0 +1,82 @@ +# mkRewriteRules + +~~~ +mkRewriteRules: Créer un fichier de redirections pour Apache à partir d'un certain +nombre de règles + +USAGE + mkRewriteRules -f rewrite.rules [-o RewriteRules.conf] [-w RewriteRules.html] host + +OPTIONS + -p Générer les directives et tenir compte de proxy_acls + Par défaut, le champ proxy_acls est ignoré + +FORMAT des règles de mapping +============================ + +Les commentaires commencent par le signe "#" +Les règles sont de la forme: + src:dest:host:suffix:OPTS:prot:proxy_acls + ^prefix + =literal + +prot vaut par défaut http. Il peut valoir aussi https + +Si dest ou suffix se terminent par $, on est en mode NO_SLASH +En mode NO_SLASH, si src se termine par $, on est en mode NO_TRAIL + +* Si dest est de la forme Application.woa +En mode NO_SLASH, on génère + RewriteRule ^/src(.*) [prot://host]/cgi-bin/WebObjects/dest[/suffix]$1 [L,OPTS] +En mode NO_SLASH+NO_TRAIL, on génère + RewriteRule ^/src [prot://host]/cgi-bin/WebObjects/dest[/suffix] [L,OPTS] +En mode normal, on génère + RewriteRule ^/src$ /src/ + RewriteRule ^/src/(.*) [prot://host]/cgi-bin/WebObjects/dest[/suffix]/$1 [L,OPTS] + +* Si dest n'est pas de la forme Application.woa +En mode NO_SLASH, on génère + RewriteRule ^/src(.*) [prot://host]/dest[/suffix]$1 [L,OPTS] +En mode NO_SLASH+NO_TRAIL, on génère + RewriteRule ^/src [prot://host]/dest[/suffix] [L,OPTS] +En mode normal, on génère + RewriteRule ^/src$ /src/ + RewriteRule ^/src/(.*) /dest[/suffix]/$1 [L,OPTS] + +Si une règle est précédée d'une ou plusieurs lignes de la forme "^prefix", +ces lignes sont copiées avant chacune des commandes RewriteRule générées +pour une règle. Ceci permet d'ajouter des conditions avec RewriteCond pour +une règle. e.g. + ^RewriteCond %{REMOTE_ADDR} 10\..* + src:dest.woa +qui génère: + RewriteCond %{REMOTE_ADDR} 10\..* + RewriteRule ^/src$ /src/ + RewriteCond %{REMOTE_ADDR} 10\..* + RewriteRule ^/src/(.*) /cgi-bin/WebObjects/dest.woa/$1 [L] + +Une ligne de la forme "=literal" est recopiée sans modifications (sans le "=") +dans le fichier de sortie. + +proxy_acls est utilisé si l'option -p est spécifiée et OPTS contient P (comme +proxy), ou si le mode de réécriture requière l'utilisation d'un proxy. + +* Avec la valeur "None", aucune directive n'est générée +* Si aucune valeur n'est spécifiée, la directive suivante est générée: + + AddDefaultCharset off + Order Deny,Allow + Allow from all + +* Si une valeur est spécifiée, la directive suivante est générée: + + AddDefaultCharset off + Order Allow,Deny + Allow from $proxy_acls + + +Dans les exemples donnés ci-dessus, $URL est l'url générée par la réécriture, +et $proxy_acls la valeur du champ proxy_acls spécifiée ci-dessus. +~~~ + +-*- 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/mkiso.md b/doc/mkiso.md new file mode 100644 index 0000000..4d8ccc0 --- /dev/null +++ b/doc/mkiso.md @@ -0,0 +1,21 @@ +# mkiso + +~~~ +mkiso: créer une image iso d'un répertoire + +USAGE + mkiso [options] srcdir [dest.iso] + +OPTIONS + -M, --hfs + créer une image hybride ISO/HFS + -V, --volume + Nom du volume. Par défaut, prendre le nom de base du répertoire + d'origine. La taille est de 32 caractères max. + -A, --application + Description de l'application qui est sur l'image créée. Par défaut, + prendre le nom de base du répertoire d'origine. La taille est de 128 + caractères max. +~~~ + +-*- 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/mkiso.twp b/doc/mkiso.twp index 0c07c0a..a42ac0c 100644 --- a/doc/mkiso.twp +++ b/doc/mkiso.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:19 +##@created: 27/04/2016 03:18 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -15,4 +15,11 @@ USAGE OPTIONS -M, --hfs créer une image hybride ISO/HFS + -V, --volume + Nom du volume. Par défaut, prendre le nom de base du répertoire + d'origine. La taille est de 32 caractères max. + -A, --application + Description de l'application qui est sur l'image créée. Par défaut, + prendre le nom de base du répertoire d'origine. La taille est de 128 + caractères max. }}} diff --git a/doc/mkurl.md b/doc/mkurl.md new file mode 100644 index 0000000..68d33cf --- /dev/null +++ b/doc/mkurl.md @@ -0,0 +1,16 @@ +# mkurl + +~~~ +mkurl: Enregistrer une url dans un fichier raccourci + +USAGE + mkurl [output] + +OPTIONS +Par défaut, l'url est enregistrée dans un fichier homepage.url +Mais il est possible de spécifier un fichier avec l'extension .url pour un +raccourci utilisable aussi sous Windows, ou avec l'extension .desktop pour +compatibilité avec le standard XDG +~~~ + +-*- 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/mkusfx.md b/doc/mkusfx.md new file mode 100644 index 0000000..8aa65e6 --- /dev/null +++ b/doc/mkusfx.md @@ -0,0 +1,31 @@ +# mkusfx + +~~~ +mkusfx: Créer une archive auto-extractible qui installe son contenu avec uinst + +USAGE + mkusfx [options] [--bare] src cmd... + mkusfx [options] [--uinst] src + +OPTIONS + --bare + Installer le contenu de l'archive en lançant la commande 'cmd...' avec + le répertoire courant étant le contenu de l'archive. Typiquement, ce + sera une commande de forme './script', où script est un fichier situé à + la racine de l'archive + Dans ce mode d'installation, l'option --self-contained est ignorée. + --uinst + Installer le contenu de l'archive avec uinst (par défaut) + -o dest + Spécifier le fichier de sortie. Par défaut, il s'agit de + ${src}-installer.run + --tmp-archive + Spécifier qu'il s'agit d'une archive temporaire. Cette archive + s'auto-détruit après utilisation. + --self-contained + Spécifier que l'archive doit pouvoir s'installer même sur un système sur + lequel nutools n'est pas installé. Cette archive contiendra une copie + locale de ulib et uinst.sh +~~~ + +-*- 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/mocifs.md b/doc/mocifs.md new file mode 100644 index 0000000..8fc5c3a --- /dev/null +++ b/doc/mocifs.md @@ -0,0 +1,26 @@ +# mocifs + +~~~ +mocifs: Monter un partage Windows/Samba/CIFS + +USAGE + mocifs [user@]host[/path] [mountpoint] + +Par défaut, le répertoire distant est montée sur un répertoire avec le même nom +de base que l'hôte. Si le répertoire distant est déjà monté, il est démonté. +Les options -M et -U permettent de modifier le comportement par défaut. + +OPTIONS + -M + Forcer le montage + -U + Forcer le démontage + -o OPTIONS + Ajouter les options spécifiées à la commande de montage mount.cifs + -u USERNAME + -p PASSWORD + -c USERNAME:PASSWORD + Spécifier les credentials à utiliser pour la connexion +~~~ + +-*- 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/mocifs.twp b/doc/mocifs.twp new file mode 100644 index 0000000..7cea103 --- /dev/null +++ b/doc/mocifs.twp @@ -0,0 +1,30 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:18 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: mocifs + +{{{ +mocifs: Monter un partage Windows/Samba/CIFS + +USAGE + mocifs [user@]host[/path] [mountpoint] + +Par défaut, le répertoire distant est montée sur un répertoire avec le même nom +de base que l'hôte. Si le répertoire distant est déjà monté, il est démonté. +Les options -M et -U permettent de modifier le comportement par défaut. + +OPTIONS + -M + Forcer le montage + -U + Forcer le démontage + -o OPTIONS + Ajouter les options spécifiées à la commande de montage mount.cifs + -u USERNAME + -p PASSWORD + -c USERNAME:PASSWORD + Spécifier les credentials à utiliser pour la connexion +}}} diff --git a/doc/modav.md b/doc/modav.md new file mode 100644 index 0000000..eee88e9 --- /dev/null +++ b/doc/modav.md @@ -0,0 +1,40 @@ +# modav + +~~~ +modav: Monter un répertoire sur un hôte distant avec davfs + +USAGE + modav http[s]://host[/path] [mountpoint] + +Par défaut, le répertoire distant est montée sur un répertoire avec le même nom +de base que l'hôte. Si le répertoire distant est déjà monté, il est démonté. +Les options -M et -U permettent de modifier le comportement par défaut. + +OPTIONS + -M + Forcer le montage + -U + Forcer le démontage + -o OPTIONS + Ajouter les options spécifiées à la commande de montage + -u USERNAME + -p PASSWORD + -c USERNAME:PASSWORD + Si les credentials à utiliser ne sont pas configuré dans le fichier + /etc/davfs2/secrets, cette option permet de les spécifier. Si cette + option est utilisée, il est possible de rajouter + ask_auth 0 + dans le fichier /etc/davfs2/davfs2.conf pour éviter le conflit qui se + produit quand des informations sont demandées interactivement. C'est le + cas par exemple si une connexion en https est faite et que la chaine de + certification n'est pas configurée. Pour mémoire, cela se fait avec + servercert myCAs.pem + dans le fichier /etc/davfs2/davfs2.conf + Bien entendu, il est préférable de configurer les credentials dans le + fichier /etc/davfs2/secrets avec la syntaxe + url username password + ou + mountpoint username password +~~~ + +-*- 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/modav.twp b/doc/modav.twp new file mode 100644 index 0000000..13556bc --- /dev/null +++ b/doc/modav.twp @@ -0,0 +1,44 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:18 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: modav + +{{{ +modav: Monter un répertoire sur un hôte distant avec davfs + +USAGE + modav http[s]://host[/path] [mountpoint] + +Par défaut, le répertoire distant est montée sur un répertoire avec le même nom +de base que l'hôte. Si le répertoire distant est déjà monté, il est démonté. +Les options -M et -U permettent de modifier le comportement par défaut. + +OPTIONS + -M + Forcer le montage + -U + Forcer le démontage + -o OPTIONS + Ajouter les options spécifiées à la commande de montage + -u USERNAME + -p PASSWORD + -c USERNAME:PASSWORD + Si les credentials à utiliser ne sont pas configuré dans le fichier + /etc/davfs2/secrets, cette option permet de les spécifier. Si cette + option est utilisée, il est possible de rajouter + ask_auth 0 + dans le fichier /etc/davfs2/davfs2.conf pour éviter le conflit qui se + produit quand des informations sont demandées interactivement. C'est le + cas par exemple si une connexion en https est faite et que la chaine de + certification n'est pas configurée. Pour mémoire, cela se fait avec + servercert myCAs.pem + dans le fichier /etc/davfs2/davfs2.conf + Bien entendu, il est préférable de configurer les credentials dans le + fichier /etc/davfs2/secrets avec la syntaxe + url username password + ou + mountpoint username password +}}} diff --git a/doc/moiso.md b/doc/moiso.md new file mode 100644 index 0000000..8304e78 --- /dev/null +++ b/doc/moiso.md @@ -0,0 +1,20 @@ +# moiso + +~~~ +moiso: Monter une image ISO + +USAGE + moiso image.iso [mountpoint] + +Par défaut, l'image iso est montée sur un répertoire avec le même nom de base. +Si l'image est déjà montée, elle est démontée. Les options -m et -u permettent +de modifier le comportement par défaut. + +OPTIONS + -m + Forcer le montage + -u + Forcer le démontage +~~~ + +-*- 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/moiso.twp b/doc/moiso.twp new file mode 100644 index 0000000..e8ec2be --- /dev/null +++ b/doc/moiso.twp @@ -0,0 +1,24 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:18 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: moiso + +{{{ +moiso: Monter une image ISO + +USAGE + moiso image.iso [mountpoint] + +Par défaut, l'image iso est montée sur un répertoire avec le même nom de base. +Si l'image est déjà montée, elle est démontée. Les options -m et -u permettent +de modifier le comportement par défaut. + +OPTIONS + -m + Forcer le montage + -u + Forcer le démontage +}}} diff --git a/doc/mossh.md b/doc/mossh.md new file mode 100644 index 0000000..314e1c8 --- /dev/null +++ b/doc/mossh.md @@ -0,0 +1,29 @@ +# mossh + +~~~ +mossh: Monter un répertoire sur un hôte distant avec sshfs + +USAGE + mossh [user@]host[:/path] [mountpoint] + +Par défaut, le répertoire distant est montée sur un répertoire avec le même nom +de base que l'hôte. Si le répertoire distant est déjà monté, il est démonté. +Les options -M et -U permettent de modifier le comportement par défaut. + +OPTIONS + -M + Forcer le montage + -U + Forcer le démontage + -o OPTIONS + Ajouter les options spécifiées à la commande de montage + -s + Equivalent à -o allow_other ou -o allow_root selon que l'on est root ou + non + -u USER + Spécifier le user pour la connexion distante, s'il n'est pas possible de + le spécifier dans l'url. En cas de conflit, la valeur dans l'url est + prioritaire par rapport à cette option. +~~~ + +-*- 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/mossh.twp b/doc/mossh.twp new file mode 100644 index 0000000..0a64a06 --- /dev/null +++ b/doc/mossh.twp @@ -0,0 +1,33 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:18 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: mossh + +{{{ +mossh: Monter un répertoire sur un hôte distant avec sshfs + +USAGE + mossh [user@]host[:/path] [mountpoint] + +Par défaut, le répertoire distant est montée sur un répertoire avec le même nom +de base que l'hôte. Si le répertoire distant est déjà monté, il est démonté. +Les options -M et -U permettent de modifier le comportement par défaut. + +OPTIONS + -M + Forcer le montage + -U + Forcer le démontage + -o OPTIONS + Ajouter les options spécifiées à la commande de montage + -s + Equivalent à -o allow_other ou -o allow_root selon que l'on est root ou + non + -u USER + Spécifier le user pour la connexion distante, s'il n'est pas possible de + le spécifier dans l'url. En cas de conflit, la valeur dans l'url est + prioritaire par rapport à cette option. +}}} diff --git a/doc/mysqlcsv.md b/doc/mysqlcsv.md new file mode 100644 index 0000000..c6f47d2 --- /dev/null +++ b/doc/mysqlcsv.md @@ -0,0 +1,65 @@ +# mysqlcsv + +~~~ +mysqlcsv: Faire une requête MySQL et formater la sortie pour traitement avec awkcsv + +USAGE + mysqlcsv [query [db]] [-- mysql options] + +query est la requête sql à exécuter. Si query n'est pas spécifiée, la(les) + requête(s) sql sont prises sur l'entrée standard, ou depuis un fichier + si l'option -f est spécifiée. +db est le nom de la base de données. Cette argument n'est lu que si le nom + de la base de donnée n'est ni spécifié dans le fichier de configuration, + ni spécifié avec l'option -D + +OPTIONS + -h, --host HOST + -P, --port PORT + -u, --user USER + -pPASSWORD + -D, --database DATABASE + Informations de connexion à la base de données + -C, --config CONFIG + Prendre les informations de connexion depuis le fichier spécifié. + Le fichier doit être de la forme + host=HOST + #post=3306 + user=USER + password=PASS + #database=DB + #query=QUERY + Les variables port, database et query sont facultatives. + Les valeurs définies dans ce fichier sont prioritaires par rapport à + celles qui auraient été spécifiées sur la ligne de commande. + Utiliser password=--NOT-SET-- s'il faut se connecter sans mot de passe + Cette option peut être utilisée plusieurs fois, auquel cas les fichiers + sont chargés dans l'ordre. + --profile PROFILE + La variable $PROFILE est définie avec la valeur spécifiée avant de + sourcer les fichiers de configuration. Cela permet d'avoir des fichiers + de configuration qui calculent dynamiquement les paramètres en fonction + de la valeur du profil. + -N, --no-headers + Ne pas afficher les en-têtes + -c, --force + Continuer le traitement même en cas d'erreur + -r, --raw + Ne pas autoriser mysql à mettre en échappement certaines valeurs + retournées par le serveur. Par défaut, les transformations suivantes + sont effectuées: + newline --> \n + tab --> \t + nul --> \0 + \ --> \\ + -n, --nulls + Transformer dans le flux en sortie les valeurs NULL en chaines vides + -f, --input INPUT + Lire la requête depuis le fichier input au lieu de le lire depuis la + ligne de commande ou l'entrée standard. Ne pas spécifier cette option + ou utiliser '-' pour lire depuis l'entrée standard. + Cette option est ignorée si la requête est spécifiée parmi les + arguments. +~~~ + +-*- 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/mysqlcsv.twp b/doc/mysqlcsv.twp new file mode 100644 index 0000000..24590c0 --- /dev/null +++ b/doc/mysqlcsv.twp @@ -0,0 +1,69 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:18 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: mysqlcsv + +{{{ +mysqlcsv: Faire une requête MySQL et formater la sortie pour traitement avec awkcsv + +USAGE + mysqlcsv [query [db]] [-- mysql options] + +query est la requête sql à exécuter. Si query n'est pas spécifiée, la(les) + requête(s) sql sont prises sur l'entrée standard, ou depuis un fichier + si l'option -f est spécifiée. +db est le nom de la base de données. Cette argument n'est lu que si le nom + de la base de donnée n'est ni spécifié dans le fichier de configuration, + ni spécifié avec l'option -D + +OPTIONS + -h, --host HOST + -P, --port PORT + -u, --user USER + -pPASSWORD + -D, --database DATABASE + Informations de connexion à la base de données + -C, --config CONFIG + Prendre les informations de connexion depuis le fichier spécifié. + Le fichier doit être de la forme + host=HOST + #post=3306 + user=USER + password=PASS + #database=DB + #query=QUERY + Les variables port, database et query sont facultatives. + Les valeurs définies dans ce fichier sont prioritaires par rapport à + celles qui auraient été spécifiées sur la ligne de commande. + Utiliser password=--NOT-SET-- s'il faut se connecter sans mot de passe + Cette option peut être utilisée plusieurs fois, auquel cas les fichiers + sont chargés dans l'ordre. + --profile PROFILE + La variable $PROFILE est définie avec la valeur spécifiée avant de + sourcer les fichiers de configuration. Cela permet d'avoir des fichiers + de configuration qui calculent dynamiquement les paramètres en fonction + de la valeur du profil. + -N, --no-headers + Ne pas afficher les en-têtes + -c, --force + Continuer le traitement même en cas d'erreur + -r, --raw + Ne pas autoriser mysql à mettre en échappement certaines valeurs + retournées par le serveur. Par défaut, les transformations suivantes + sont effectuées: + newline --> \n + tab --> \t + nul --> \0 + \ --> \\ + -n, --nulls + Transformer dans le flux en sortie les valeurs NULL en chaines vides + -f, --input INPUT + Lire la requête depuis le fichier input au lieu de le lire depuis la + ligne de commande ou l'entrée standard. Ne pas spécifier cette option + ou utiliser '-' pour lire depuis l'entrée standard. + Cette option est ignorée si la requête est spécifiée parmi les + arguments. +}}} diff --git a/doc/mysqlloadcsv.md b/doc/mysqlloadcsv.md new file mode 100644 index 0000000..3d0dd93 --- /dev/null +++ b/doc/mysqlloadcsv.md @@ -0,0 +1,108 @@ +# mysqlloadcsv + +~~~ +mysqlloadcsv: Charger une table MySQL avec un fichier csv + +USAGE + mysqlloadcsv [db.]table [fields...] [-- mysql options] + +db est le nom de la base de données +table est le nom de la table à charger +fields est la liste des colonnes. Si cette valeur est spécifiée, il faudra + peut-être utiliser l'option -s pour ignorer le cas échéant la ligne des + en-têtes dans le fichier en entrée. Sinon, les colonnes à utiliser sont + calculées à partir du fichier en entrée. + +Dans les données en entrées, qui doivent être en UTF8, les conversions suivantes +sont effectuées par MySQL: + + \0 --> + \b --> + \n --> + \r --> + \t --> + \Z --> Ctrl+Z + \N --> NULL + +OPTIONS + -h, --host host + -P, --port port + -u, --user user + -ppassword + Informations de connexion à la base de données + -C, --config CONFIG + Prendre les informations de connexion depuis le fichier spécifié. + Le fichier doit être de la forme + host=HOST.TLD + #post=3306 + user=USER + password=PASS + #dbtable=DB.TABLE + #fields=(FIELDS...) + # Il est possible aussi de spécifier DB et TABLE séparément: + #database=DB + #table=TABLE + Les variables port, dbtable et fields sont facultatives. + Les valeurs définies dans ce fichier sont prioritaires par rapport à + celles qui auraient été spécifiées sur la ligne de commande. + Utiliser password=--NOT-SET-- s'il faut se connecter sans mot de passe + Cette option peut être utilisée plusieurs fois, auquel cas les fichiers + sont chargés dans l'ordre. + --profile PROFILE + La variable $PROFILE est définie avec la valeur spécifiée avant de + sourcer les fichiers de configuration. Cela permet d'avoir des fichiers + de configuration qui calculent dynamiquement les paramètres en fonction + de la valeur du profil. + -f, --input INPUT + Fichier en entrée. Ne pas spécifier cette option ou utiliser '-' pour + lire depuis l'entrée standard. + -d, --auto-dbtable DB + Spécifier la base de données avec laquelle se connecter. De plus, si le + nom de la table n'est pas spécifié, prendre par défaut le nom de base du + fichier spécifié avec l'option -f + -s, --skip-lines NBLINES + Nombre de lignes à sauter dans le fichier en entrée + -n, --fake + Ne pas effectuer l'opération. Afficher simplement la commande SQL. + --run + Forcer le lancement de l'opération. Utiliser cette option avec -A pour + créer la table avec les paramètres analysés. + -T, --truncate + Vider la table avant d'effectuer le chargement + -L, --load-data + Charger les données avec la commande 'load data local'. C'est l'option + par défaut. Le fichier est transmis tel quel à MySQL. + -I, --insert-data + Charger les données en générant des commandes 'insert into'. L'effet est + en principe le même avec l'option -L (sauf que certains formats de date + exotiques seront correctement importés). Cette option peut aussi être + utilisée avec l'option -n pour générer une liste de commande à corriger + et/ou adapter. + -U, -k, --update-data KEY + Au lieu de charger de nouvelles données, essayer de mettre à jour la + table. KEY est le nom de la colonne qui est utilisée comme clé. Toutes + les autres colonnes sont les nouvelles données à mettre à jour. Si + aucune ligne ne correspond à une clé donnée, la mise à jour pour cette + ligne est ignorée. + Note: utiliser les options -T et -U ensemble n'a pas de sens, mais -T + est quand même honoré. + -Z, --null-value VALUE + Avec les options -I et -U, considérer que NULL est représenté par la + chaine spécifiée. Par défaut, utiliser \N + -z, --null-is-empty + Avec les options -I et -U, considérer que NULL est représenté par la + chaine vide. Cette option est équivalente à -Z '' + -t, --types [DEFAULT_TYPE,]FIELD:TYPE,... + Spécifier pour chaque champ mentionné le type de donnée à forcer. Le + type 'auto' signifie que le type est autodétecté. C'est la valeur par + défaut. Les autres types valides sont 'str', 'int' et 'date' + Cette option est ignorée avec l'option -L + -A, --analyse + Analyser les données et afficher une requête pour créer une table qui + pourrait contenir ces données. + Cette option implique --fake et affiche simplement la commande SQL. + Pour lancer la commande SQL générée, il faut ajouter l'option --run + APRES cette option +~~~ + +-*- 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/mysqlloadcsv.twp b/doc/mysqlloadcsv.twp new file mode 100644 index 0000000..d07938f --- /dev/null +++ b/doc/mysqlloadcsv.twp @@ -0,0 +1,112 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:18 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: mysqlloadcsv + +{{{ +mysqlloadcsv: Charger une table MySQL avec un fichier csv + +USAGE + mysqlloadcsv [db.]table [fields...] [-- mysql options] + +db est le nom de la base de données +table est le nom de la table à charger +fields est la liste des colonnes. Si cette valeur est spécifiée, il faudra + peut-être utiliser l'option -s pour ignorer le cas échéant la ligne des + en-têtes dans le fichier en entrée. Sinon, les colonnes à utiliser sont + calculées à partir du fichier en entrée. + +Dans les données en entrées, qui doivent être en UTF8, les conversions suivantes +sont effectuées par MySQL: + + \0 --> + \b --> + \n --> + \r --> + \t --> + \Z --> Ctrl+Z + \N --> NULL + +OPTIONS + -h, --host host + -P, --port port + -u, --user user + -ppassword + Informations de connexion à la base de données + -C, --config CONFIG + Prendre les informations de connexion depuis le fichier spécifié. + Le fichier doit être de la forme + host=HOST.TLD + #post=3306 + user=USER + password=PASS + #dbtable=DB.TABLE + #fields=(FIELDS...) + # Il est possible aussi de spécifier DB et TABLE séparément: + #database=DB + #table=TABLE + Les variables port, dbtable et fields sont facultatives. + Les valeurs définies dans ce fichier sont prioritaires par rapport à + celles qui auraient été spécifiées sur la ligne de commande. + Utiliser password=--NOT-SET-- s'il faut se connecter sans mot de passe + Cette option peut être utilisée plusieurs fois, auquel cas les fichiers + sont chargés dans l'ordre. + --profile PROFILE + La variable $PROFILE est définie avec la valeur spécifiée avant de + sourcer les fichiers de configuration. Cela permet d'avoir des fichiers + de configuration qui calculent dynamiquement les paramètres en fonction + de la valeur du profil. + -f, --input INPUT + Fichier en entrée. Ne pas spécifier cette option ou utiliser '-' pour + lire depuis l'entrée standard. + -d, --auto-dbtable DB + Spécifier la base de données avec laquelle se connecter. De plus, si le + nom de la table n'est pas spécifié, prendre par défaut le nom de base du + fichier spécifié avec l'option -f + -s, --skip-lines NBLINES + Nombre de lignes à sauter dans le fichier en entrée + -n, --fake + Ne pas effectuer l'opération. Afficher simplement la commande SQL. + --run + Forcer le lancement de l'opération. Utiliser cette option avec -A pour + créer la table avec les paramètres analysés. + -T, --truncate + Vider la table avant d'effectuer le chargement + -L, --load-data + Charger les données avec la commande 'load data local'. C'est l'option + par défaut. Le fichier est transmis tel quel à MySQL. + -I, --insert-data + Charger les données en générant des commandes 'insert into'. L'effet est + en principe le même avec l'option -L (sauf que certains formats de date + exotiques seront correctement importés). Cette option peut aussi être + utilisée avec l'option -n pour générer une liste de commande à corriger + et/ou adapter. + -U, -k, --update-data KEY + Au lieu de charger de nouvelles données, essayer de mettre à jour la + table. KEY est le nom de la colonne qui est utilisée comme clé. Toutes + les autres colonnes sont les nouvelles données à mettre à jour. Si + aucune ligne ne correspond à une clé donnée, la mise à jour pour cette + ligne est ignorée. + Note: utiliser les options -T et -U ensemble n'a pas de sens, mais -T + est quand même honoré. + -Z, --null-value VALUE + Avec les options -I et -U, considérer que NULL est représenté par la + chaine spécifiée. Par défaut, utiliser \N + -z, --null-is-empty + Avec les options -I et -U, considérer que NULL est représenté par la + chaine vide. Cette option est équivalente à -Z '' + -t, --types [DEFAULT_TYPE,]FIELD:TYPE,... + Spécifier pour chaque champ mentionné le type de donnée à forcer. Le + type 'auto' signifie que le type est autodétecté. C'est la valeur par + défaut. Les autres types valides sont 'str', 'int' et 'date' + Cette option est ignorée avec l'option -L + -A, --analyse + Analyser les données et afficher une requête pour créer une table qui + pourrait contenir ces données. + Cette option implique --fake et affiche simplement la commande SQL. + Pour lancer la commande SQL générée, il faut ajouter l'option --run + APRES cette option +}}} diff --git a/doc/noerr.md b/doc/noerr.md new file mode 100644 index 0000000..0dfdca6 --- /dev/null +++ b/doc/noerr.md @@ -0,0 +1,7 @@ +# noerr + +~~~ +noerr: lancer une commande en supprimant la sortie d'erreur +~~~ + +-*- 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/noerr.twp b/doc/noerr.twp new file mode 100644 index 0000000..ca9e012 --- /dev/null +++ b/doc/noerr.twp @@ -0,0 +1,11 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:18 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: noerr + +{{{ +noerr: lancer une commande en supprimant la sortie d'erreur +}}} diff --git a/doc/noerror.md b/doc/noerror.md new file mode 100644 index 0000000..c87162b --- /dev/null +++ b/doc/noerror.md @@ -0,0 +1,7 @@ +# noerror + +~~~ +noerror: lancer une commande en masquant son code de retour. le code de retour est toujours 0 +~~~ + +-*- 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/noerror.twp b/doc/noerror.twp new file mode 100644 index 0000000..08abded --- /dev/null +++ b/doc/noerror.twp @@ -0,0 +1,11 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:18 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: noerror + +{{{ +noerror: lancer une commande en masquant son code de retour. le code de retour est toujours 0 +}}} diff --git a/doc/noout.md b/doc/noout.md new file mode 100644 index 0000000..8b584df --- /dev/null +++ b/doc/noout.md @@ -0,0 +1,7 @@ +# noout + +~~~ +noout: lancer une commande en supprimant la sortie standard +~~~ + +-*- 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/noout.twp b/doc/noout.twp new file mode 100644 index 0000000..cc2b854 --- /dev/null +++ b/doc/noout.twp @@ -0,0 +1,11 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:18 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: noout + +{{{ +noout: lancer une commande en supprimant la sortie standard +}}} diff --git a/doc/nutools.html b/doc/nutools.html new file mode 100644 index 0000000..0b988ec --- /dev/null +++ b/doc/nutools.html @@ -0,0 +1,17817 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
<!--{{{-->
+<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
+<!--}}}-->
+
+
+
+
Background: #fff
+Foreground: #000
+PrimaryPale: #8cf
+PrimaryLight: #18f
+PrimaryMid: #04b
+PrimaryDark: #014
+SecondaryPale: #ffc
+SecondaryLight: #fe8
+SecondaryMid: #db4
+SecondaryDark: #841
+TertiaryPale: #eee
+TertiaryLight: #ccc
+TertiaryMid: #999
+TertiaryDark: #666
+Error: #f88
+
+
+
+
/*{{{*/
+body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
+
+a {color:[[ColorPalette::PrimaryMid]];}
+a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
+a img {border:0;}
+
+h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
+h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
+h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}
+
+.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
+.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
+.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}
+
+.header {background:[[ColorPalette::PrimaryMid]];}
+.headerShadow {color:[[ColorPalette::Foreground]];}
+.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
+.headerForeground {color:[[ColorPalette::Background]];}
+.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}
+
+.tabSelected {color:[[ColorPalette::PrimaryDark]];
+	background:[[ColorPalette::TertiaryPale]];
+	border-left:1px solid [[ColorPalette::TertiaryLight]];
+	border-top:1px solid [[ColorPalette::TertiaryLight]];
+	border-right:1px solid [[ColorPalette::TertiaryLight]];
+}
+.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
+.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
+.tabContents .button {border:0;}
+
+#sidebar {}
+#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
+#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
+#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
+#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
+#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}
+
+.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
+.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
+.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
+.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
+	border:1px solid [[ColorPalette::PrimaryMid]];}
+.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
+.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
+.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
+.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
+	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
+.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
+.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
+	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}
+
+.wizard .notChanged {background:transparent;}
+.wizard .changedLocally {background:#80ff80;}
+.wizard .changedServer {background:#8080ff;}
+.wizard .changedBoth {background:#ff8080;}
+.wizard .notFound {background:#ffff80;}
+.wizard .putToServer {background:#ff80ff;}
+.wizard .gotFromServer {background:#80ffff;}
+
+#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
+#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}
+
+.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}
+
+.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
+.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
+.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
+.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
+.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
+.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
+.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
+.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}
+
+.tiddler .defaultCommand {font-weight:bold;}
+
+.shadow .title {color:[[ColorPalette::TertiaryDark]];}
+
+.title {color:[[ColorPalette::SecondaryDark]];}
+.subtitle {color:[[ColorPalette::TertiaryDark]];}
+
+.toolbar {color:[[ColorPalette::PrimaryMid]];}
+.toolbar a {color:[[ColorPalette::TertiaryLight]];}
+.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
+.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}
+
+.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
+.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
+.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
+.tagging .button, .tagged .button {border:none;}
+
+.footer {color:[[ColorPalette::TertiaryLight]];}
+.selected .footer {color:[[ColorPalette::TertiaryMid]];}
+
+.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
+.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
+.lowlight {background:[[ColorPalette::TertiaryLight]];}
+
+.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}
+
+.imageLink, #displayArea .imageLink {background:transparent;}
+
+.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}
+
+.viewer .listTitle {list-style-type:none; margin-left:-2em;}
+.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
+.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}
+
+.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
+.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
+.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}
+
+.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
+.viewer code {color:[[ColorPalette::SecondaryDark]];}
+.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}
+
+.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}
+
+.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
+.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
+.editorFooter {color:[[ColorPalette::TertiaryMid]];}
+.readOnly {background:[[ColorPalette::TertiaryPale]];}
+
+#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
+#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
+#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
+#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
+#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
+#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
+#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
+.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
+.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
+#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:alpha(opacity=60);}
+/*}}}*/
+
+
+
/*{{{*/
+* html .tiddler {height:1%;}
+
+body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}
+
+h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
+h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
+h4,h5,h6 {margin-top:1em;}
+h1 {font-size:1.35em;}
+h2 {font-size:1.25em;}
+h3 {font-size:1.1em;}
+h4 {font-size:1em;}
+h5 {font-size:.9em;}
+
+hr {height:1px;}
+
+a {text-decoration:none;}
+
+dt {font-weight:bold;}
+
+ol {list-style-type:decimal;}
+ol ol {list-style-type:lower-alpha;}
+ol ol ol {list-style-type:lower-roman;}
+ol ol ol ol {list-style-type:decimal;}
+ol ol ol ol ol {list-style-type:lower-alpha;}
+ol ol ol ol ol ol {list-style-type:lower-roman;}
+ol ol ol ol ol ol ol {list-style-type:decimal;}
+
+.txtOptionInput {width:11em;}
+
+#contentWrapper .chkOptionInput {border:0;}
+
+.externalLink {text-decoration:underline;}
+
+.indent {margin-left:3em;}
+.outdent {margin-left:3em; text-indent:-3em;}
+code.escaped {white-space:nowrap;}
+
+.tiddlyLinkExisting {font-weight:bold;}
+.tiddlyLinkNonExisting {font-style:italic;}
+
+/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
+a.tiddlyLinkNonExisting.shadow {font-weight:bold;}
+
+#mainMenu .tiddlyLinkExisting,
+	#mainMenu .tiddlyLinkNonExisting,
+	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
+#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}
+
+.header {position:relative;}
+.header a:hover {background:transparent;}
+.headerShadow {position:relative; padding:4.5em 0 1em 1em; left:-1px; top:-1px;}
+.headerForeground {position:absolute; padding:4.5em 0 1em 1em; left:0; top:0;}
+
+.siteTitle {font-size:3em;}
+.siteSubtitle {font-size:1.2em;}
+
+#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}
+
+#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
+#sidebarOptions {padding-top:0.3em;}
+#sidebarOptions a {margin:0 0.2em; padding:0.2em 0.3em; display:block;}
+#sidebarOptions input {margin:0.4em 0.5em;}
+#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
+#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
+#sidebarOptions .sliderPanel input {margin:0 0 0.3em 0;}
+#sidebarTabs .tabContents {width:15em; overflow:hidden;}
+
+.wizard {padding:0.1em 1em 0 2em;}
+.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
+.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
+.wizardStep {padding:1em 1em 1em 1em;}
+.wizard .button {margin:0.5em 0 0; font-size:1.2em;}
+.wizardFooter {padding:0.8em 0.4em 0.8em 0;}
+.wizardFooter .status {padding:0 0.4em; margin-left:1em;}
+.wizard .button {padding:0.1em 0.2em;}
+
+#messageArea {position:fixed; top:2em; right:0; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
+.messageToolbar {display:block; text-align:right; padding:0.2em;}
+#messageArea a {text-decoration:underline;}
+
+.tiddlerPopupButton {padding:0.2em;}
+.popupTiddler {position: absolute; z-index:300; padding:1em; margin:0;}
+
+.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
+.popup .popupMessage {padding:0.4em;}
+.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0;}
+.popup li.disabled {padding:0.4em;}
+.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
+.listBreak {font-size:1px; line-height:1px;}
+.listBreak div {margin:2px 0;}
+
+.tabset {padding:1em 0 0 0.5em;}
+.tab {margin:0 0 0 0.25em; padding:2px;}
+.tabContents {padding:0.5em;}
+.tabContents ul, .tabContents ol {margin:0; padding:0;}
+.txtMainTab .tabContents li {list-style:none;}
+.tabContents li.listLink { margin-left:.75em;}
+
+#contentWrapper {display:block;}
+#splashScreen {display:none;}
+
+#displayArea {margin:1em 17em 0 14em;}
+
+.toolbar {text-align:right; font-size:.9em;}
+
+.tiddler {padding:1em 1em 0;}
+
+.missing .viewer,.missing .title {font-style:italic;}
+
+.title {font-size:1.6em; font-weight:bold;}
+
+.missing .subtitle {display:none;}
+.subtitle {font-size:1.1em;}
+
+.tiddler .button {padding:0.2em 0.4em;}
+
+.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
+.isTag .tagging {display:block;}
+.tagged {margin:0.5em; float:right;}
+.tagging, .tagged {font-size:0.9em; padding:0.25em;}
+.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
+.tagClear {clear:both;}
+
+.footer {font-size:.9em;}
+.footer li {display:inline;}
+
+.annotation {padding:0.5em; margin:0.5em;}
+
+* html .viewer pre {width:99%; padding:0 0 1em 0;}
+.viewer {line-height:1.4em; padding-top:0.5em;}
+.viewer .button {margin:0 0.25em; padding:0 0.25em;}
+.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
+.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}
+
+.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
+.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
+table.listView {font-size:0.85em; margin:0.8em 1.0em;}
+table.listView th, table.listView td, table.listView tr {padding:0 3px 0 3px;}
+
+.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
+.viewer code {font-size:1.2em; line-height:1.4em;}
+
+.editor {font-size:1.1em;}
+.editor input, .editor textarea {display:block; width:100%; font:inherit;}
+.editorFooter {padding:0.25em 0; font-size:.9em;}
+.editorFooter .button {padding-top:0; padding-bottom:0;}
+
+.fieldsetFix {border:0; padding:0; margin:1px 0px;}
+
+.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
+.zoomer div {padding:1em;}
+
+* html #backstage {width:99%;}
+* html #backstageArea {width:99%;}
+#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em;}
+#backstageToolbar {position:relative;}
+#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em;}
+#backstageButton {display:none; position:absolute; z-index:175; top:0; right:0;}
+#backstageButton a {padding:0.1em 0.4em; margin:0.1em;}
+#backstage {position:relative; width:100%; z-index:50;}
+#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin-left:3em; padding:1em;}
+.backstagePanelFooter {padding-top:0.2em; float:right;}
+.backstagePanelFooter a {padding:0.2em 0.4em;}
+#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}
+
+.whenBackstage {display:none;}
+.backstageVisible .whenBackstage {display:block;}
+/*}}}*/
+
+
+
+
/***
+StyleSheet for use when a translation requires any css style changes.
+This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
+***/
+/*{{{*/
+body {font-size:0.8em;}
+#sidebarOptions {font-size:1.05em;}
+#sidebarOptions a {font-style:normal;}
+#sidebarOptions .sliderPanel {font-size:0.95em;}
+.subtitle {font-size:0.8em;}
+.viewer table.listView {font-size:0.95em;}
+/*}}}*/
+
+
+
/*{{{*/
+@media print {
+#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none !important;}
+#displayArea {margin: 1em 1em 0em;}
+noscript {display:none;} /* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
+}
+/*}}}*/
+
+
+
<!--{{{-->
+<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
+<div class='headerShadow'>
+<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
+<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
+</div>
+<div class='headerForeground'>
+<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
+<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
+</div>
+</div>
+<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
+<div id='sidebar'>
+<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
+<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
+</div>
+<div id='displayArea'>
+<div id='messageArea'></div>
+<div id='tiddlerDisplay'></div>
+</div>
+<!--}}}-->
+
+
+
<!--{{{-->
+<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
+<div class='title' macro='view title'></div>
+<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
+<div class='tagging' macro='tagging'></div>
+<div class='tagged' macro='tags'></div>
+<div class='viewer' macro='view text wikified'></div>
+<div class='tagClear'></div>
+<!--}}}-->
+
+
+
<!--{{{-->
+<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
+<div class='title' macro='view title'></div>
+<div class='editor' macro='edit title'></div>
+<div macro='annotations'></div>
+<div class='editor' macro='edit text'></div>
+<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
+<!--}}}-->
+
+
+
To get started with this blank [[TiddlyWiki]], you'll need to modify the following tiddlers:
+* [[SiteTitle]] & [[SiteSubtitle]]: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
+* [[MainMenu]]: The menu (usually on the left)
+* [[DefaultTiddlers]]: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
+You'll also need to enter your username for signing your edits: <<option txtUserName>>
+
+
+
These [[InterfaceOptions]] for customising [[TiddlyWiki]] are saved in your browser
+
+Your username for signing your edits. Write it as a [[WikiWord]] (eg [[JoeBloggs]])
+
+<<option txtUserName>>
+<<option chkSaveBackups>> [[SaveBackups]]
+<<option chkAutoSave>> [[AutoSave]]
+<<option chkRegExpSearch>> [[RegExpSearch]]
+<<option chkCaseSensitiveSearch>> [[CaseSensitiveSearch]]
+<<option chkAnimate>> [[EnableAnimations]]
+
+----
+Also see [[AdvancedOptions]]
+
+
+
<<importTiddlers>>
+
+
+ +
+
+
[[Main]]
+
+
+
{{{
+EnsureVM: s'assurer que les services sont lancés pour un type de virtualisation
+
+USAGE
+    EnsureVM type
+
+Les types supportés sont virtualbox et kvm (par défaut)
+}}}
+
+
+
!Présentation
+nutools est un ensemble d'utilitaires pour faciliter l'utililisation des Unixes, en particulier Linux, mais aussi MacOS X et Cygwin.
+C'est aussi une librairie de scripts shell réutilisables ([[ulib]]) et une librairie de modules python réutilisables (pyulib)
+
+!Prérequis
+Python >= 2.3 et GNU Awk sont requis pour que toutes les fonctionnalités soient supportées.
+* Sous Linux, lors de l'installation du package, les meilleurs efforts sont fait pour que ces packages soient installés.
+* Sous MacOSX, il faut installer manuellement Fink, DarwinPorts ou Homebrew
+
+! Outils
+Chaque outil contient une aide intégrée. Il suffit de lancer l'outil avec l'argument {{{--help}}} pour avoir une aide détaillée.
+* Déploiement d'un répertoire ou d'une archive
+** [[uinst]]: Déploiement local
+** [[mkusfx]]: Faire une archive auto-installable avec uinst
+** [[ruinst]]: Déploiement distant avec uinst
+** [[runs]]: Lancer un script avec le protocole RUNS
+** [[rruns]]: Déploiement distant avec runs
+* Librairie réutilisable de scripts shell
+** [[uinc]]: Dépliage des inclusions dans un fichier
+** [[ulibsync]]: Faire une copie locale pour un projet de ulib et/ou pyulib
+* Autres outils
+** [[udir]]: Gestion des paramètres d'un répertoire. Ces paramètres sont entre autres utilisés par uinst et uinc.
+
+
+
[[GettingStarted]]
+
+
+
{{{
+SKvm: lancer une machine virtuelle kvm
+
+USAGE
+    SKvm [options] vmName
+    SKvm {-l|-A|-g}
+
+OPTIONS
+    -n, --check
+        Ne rien faire excepté s'assurer que les modules kvm sont chargés
+    -u, --user
+        Lancer l'opération avec les droits de l'utilisateur courant. Par défaut,
+        ce script tente d'acquérir les droits de root.
+    -l, --list
+        Lister les machines virtuelles
+    -s, --start
+        Démarrer la machine virtuelle (par défaut)
+        Si le nom de la machine virtuelle n'est pas spécifiée, un menu est
+        affiché
+    -k, --stop
+        Arrêter la machine virtuelle
+    -H, --destroy
+        Arrêter sauvagement la machine virtuelle
+    -r, --restart
+        Redémarrer la machine virtuelle
+    -S, --managed-save
+        Enregistrer l'état de la machine virtuelle
+    -A, --stop-all
+        Arrêter toutes les machines virtuelles qui tournent actuellement
+    -g, --gui
+        Afficher le gestionnaire de machines virtuelle
+}}}
+
+
+
{{{
+SVirtualBox: lancer une machine virtuelle VirtualBox
+
+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)
+        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
+}}}
+
+
+
Outils divers pour linux/macosx, et librairies pour bash
+
+
+
nutools
+
+
+

+
+
+
{{{
+_root: devenir l'utilisateur root, avec 'sudo' si possible, ou 'su' si
+'sudo' n'est pas installé
+}}}
+
+
+
{{{
+apacheconfig: Gérer la configuration d'un serveur web apache
+
+USAGE
+    apacheconfig -c
+    apacheconfig -t -- args...
+
+OPTIONS
+    -c, --create
+        Créer un nouveau répertoire de configuration pour un hôte
+    -d, --destdir DESTDIR[=apacheconfig]
+        Nom du répertoire local de configuration.
+
+    -t, --template [OPT]
+        Gérer les fichiers du répertoire local avec templatectl. La valeur de
+        cette option est utilisée comme argument court pour l'invocation de
+        templatectl, e.g
+            apacheconfig -tm args
+        est équivalent à
+            templatectl -m args
+        Les arguments qui restent sont passés tels quels à templatectl
+        Les options courantes de templatectl -l, -v, -m, -L sont disponibles
+        directement
+    --help-template
+        Afficher l'aide concernent la gestion des templates.
+        Equivalent à -t -- --help
+    -h, --host HOST
+        Spécifier l'hôte. Equivalent à -v host=HOST
+    --sysname SYSNAME
+    --sysdist SYSDIST
+    -s, --sysver SYSVER
+        Spécifier la distribution pour laquelle synchroniser le template. Par
+        défaut, choisir les valeurs correspondantes au système courant.
+        Les options -7 et -8 sont des aliases respectivement pour -s wheezy et
+        -s jessie, parce que les fichiers par défaut ont changé à partir de
+        debian jessie.
+
+    -u, --update, --deploy
+        Mettre à jour la configuration système à partir du répertoire local.
+        Lors du déploiement de la configuration, les valeurs des variables
+        dynamiques sont remplacées dans les fichiers destination.
+        Les arguments qui restent sont passés tels quels à apache_autoconf
+    -r, --certsdir CERTSDIR
+        Spécifier le cas échéant le répertoire contenant les certificats à
+        déployer. Cet argument est requis si le répertoire certsconf/ existe.
+
+    --localhosts
+        Créer dans le fichier /etc/hosts tous les noms d'hôte ayant un suffixe
+        .local mentionnés dans les fichiers de site. Cette option est utile pour
+        le développement et les tests.
+    -C, --one-conf CONF
+        Ne déployer que le fichier de configuration spécifié. Cette option est
+        utilisée avec --deploy et est utile pour le développement et les tests.
+    -M, --one-module MODULE
+        Ne déployer que le fichier de module spécifié. Cette option est utilisée
+        avec --deploy et est utile pour le développement et les tests.
+    -S, --one-site SITE
+        Ne déployer que le fichier de site spécifié. Cette option est utilisée
+        avec --deploy ou --localhosts et est utile pour le développement et les
+        tests.
+}}}
+
+
+
{{{
+authftp: Se connecter sur un site FTP authentifié
+Ce script nécessite ncftp. Il est conçu pour faciliter l'accès à des sites FTP
+s'il est requis d'y accéder par un proxy FTP pour les connexion authentifiées.
+
+USAGE
+    authftp [options] host login password [path]
+
+OPTIONS
+    -p, --proxy
+    -n, --noproxy
+        Forcer l'utilisation, resp. ne pas utiliser, le proxy FTP (i.e. faire la
+        connexion directement)
+    -l, --lftp
+        Se connecter avec lftp au lieu de ncftp. Le fonctionnement n'est pas
+        garanti si l'on utilise un proxy FTP.
+    -o OPTION
+        Ajouter une option à la commande lancée. Si l'option prend un argument,
+        il faut doubler l'option -o, e.g.
+            authftp -l -o -e -o 'mirror remote local' host login pass
+        Dans cet exemple, l'option -e de lftp est utilisée pour faire un miroir
+        local du répertoire remote.
+    --tls
+        Indiquer que la connexion se fera en TLS. Implique --lftp puisque ncftp
+        ne le supporte pas.
+
+note: A cause d'une limitation de lftp, ce n'est pas possible de se connecter
+automatiquement avec lftp si le mot de passe contient une virgule. A cause de la
+façon dont le proxy ftp est configuré, il n'est pas possible de se connecter
+avec un mot de passe qui contient le caractère @
+}}}
+
+
+
{{{
+caturl: Afficher une url
+
+USAGE
+    caturl <file.url|file.desktop|URL>
+}}}
+
+
+
{{{
+compileAndGo: see http://Yost.com/computers/compileAndGo
+}}}
+
+
+
{{{
+cssh: Faire une connexion ssh en lançant automatiquement un screen sur l'hôte distant
+
+USAGE
+    cssh [user@]host [options]
+
+En principe, hormis l'argument user@host, il ne faudrait spécifier que des
+options. Dans le cas où d'autres arguments seraient spécifiés, les meilleurs
+efforts sont faits pour lancer ces commandes avant screen.
+}}}
+
+
+
{{{
+doinplace: filtrer en place un fichier à travers une suite de commandes
+
+USAGE
+    doinplace FILE COMMAND [ARGS...]
+
+Si on utilise une commande avec des options, penser à utliser '--' pour séparer
+les options de ce script des options de la commande
+
+En plus des commandes systèmes, il est possible d'utiliser toute fonction de
+nutools qui effectue des traitement sur un flux comme stripnl, filter_empty,
+merge_contlines, filter_comment, filter_conf, etc. Les fonctions nl2lf, nl2crlf,
+nl2cr, latin1compat et noaccents sont aussi disponibles par convenance.
+
+OPTIONS
+    -p, --evalp
+        Evaluer la commande avec evalp(), ce qui permet de chainer plusieurs
+        commandes en les séparant par //. Cette option est automatiquement
+        activée si ce script est lancé avec le nom doinplacex
+    -g, --ignore-error, --replace-always
+        Normalement, le fichier n'est pas remplacé si la commande retourne une
+        erreur. Avec cette option, le fichier est remplacé quel que soit le code
+        de retour de la commande. A utiliser par exemple avec des commandes
+        comme grep qui peuvent retourner FAUX s'ils ne trouvent pas le motif.
+        Cette option est automatiquement activée si ce script est lancé avec le
+        nom doinplacef
+}}}
+
+
+
{{{
+dumpclients: afficher les connexions TCP entrantes sur un port
+
+USAGE
+    dumpclients [options] port
+
+OPTIONS
+    -4, --only-tcp
+    -6, --only-tcp6
+        Se limiter au protocole spécifié. Par défaut, afficher toutes les
+        connexions, qu'elles soient en IPv4 ou en IPv6
+    -a, --all
+        Afficher tous les sockets, y compris les ports d'écoute. Par défaut,
+        seules les sockets ouvertes sont affichées.
+    -n, --numeric
+        Afficher uniquement les adresses IP au lieu du nom d'hôte.
+    -z, --allow-no-port
+        Ne pas exiger que le port soit spécifié
+    --show none,ip,port,state
+        Spécifier d'afficher comme informations supplémentaire: rien, l'adresse
+        ip, le port et/ou l'état. Par défaut, afficher le port et l'état.
+}}}
+
+
+
{{{
+Usage: /usr/bin/emacs [OPTION-OR-FILENAME]...
+
+Run Emacs, the extensible, customizable, self-documenting real-time
+display editor.  The recommended way to start Emacs for normal editing
+is with no options at all.
+
+Run M-x info RET m emacs RET m emacs invocation RET inside Emacs to
+read the main documentation for these command-line arguments.
+
+Initialization options:
+
+--batch                     do not do interactive display; implies -q
+--daemon                    start a server in the background
+--debug-init                enable Emacs Lisp debugger for init file
+--display, -d DISPLAY       use X server DISPLAY
+--no-desktop                do not load a saved desktop
+--no-init-file, -q          load neither ~/.emacs nor default.el
+--no-shared-memory, -nl     do not use shared memory
+--no-site-file              do not load site-start.el
+--no-splash                 do not display a splash screen on startup
+--no-window-system, -nw     do not communicate with X, ignoring $DISPLAY
+--quick, -Q                 equivalent to -q --no-site-file --no-splash
+--script FILE               run FILE as an Emacs Lisp script
+--terminal, -t DEVICE       use DEVICE for terminal I/O
+--user, -u USER             load ~USER/.emacs instead of your own
+
+Action options:
+
+FILE                    visit FILE using find-file
++LINE                   go to line LINE in next FILE
++LINE:COLUMN            go to line LINE, column COLUMN, in next FILE
+--directory, -L DIR     add DIR to variable load-path
+--eval EXPR             evaluate Emacs Lisp expression EXPR
+--execute EXPR          evaluate Emacs Lisp expression EXPR
+--file FILE             visit FILE using find-file
+--find-file FILE        visit FILE using find-file
+--funcall, -f FUNC      call Emacs Lisp function FUNC with no arguments
+--insert FILE           insert contents of FILE into current buffer
+--kill                  exit without asking for confirmation
+--load, -l FILE         load Emacs Lisp FILE using the load function
+--visit FILE            visit FILE using find-file
+
+Display options:
+
+--background-color, -bg COLOR   window background color
+--basic-display, -D             disable many display features;
+                                  used for debugging Emacs
+--border-color, -bd COLOR       main border color
+--border-width, -bw WIDTH       width of main border
+--color, --color=MODE           override color mode for character terminals;
+                                  MODE defaults to `auto', and can also
+                                  be `never', `auto', `always',
+                                  or a mode name like `ansi8'
+--cursor-color, -cr COLOR       color of the Emacs cursor indicating point
+--font, -fn FONT                default font; must be fixed-width
+--foreground-color, -fg COLOR   window foreground color
+--fullheight, -fh               make the first frame high as the screen
+--fullscreen, -fs               make first frame fullscreen
+--fullwidth, -fw                make the first frame wide as the screen
+--maximized, -mm                make the first frame maximized
+--geometry, -g GEOMETRY         window geometry
+--no-bitmap-icon, -nbi          do not use picture of gnu for Emacs icon
+--iconic                        start Emacs in iconified state
+--internal-border, -ib WIDTH    width between text and main border
+--line-spacing, -lsp PIXELS     additional space to put between lines
+--mouse-color, -ms COLOR        mouse cursor color in Emacs window
+--name NAME                     title for initial Emacs frame
+--no-blinking-cursor, -nbc      disable blinking cursor
+--reverse-video, -r, -rv        switch foreground and background
+--title, -T TITLE               title for initial Emacs frame
+--vertical-scroll-bars, -vb     enable vertical scroll bars
+--xrm XRESOURCES                set additional X resources
+--parent-id XID                 set parent window
+--help                          display this help and exit
+--version                       output version information and exit
+
+You can generally also specify long option names with a single -; for
+example, -batch as well as --batch.  You can use any unambiguous
+abbreviation for a --option.
+
+Various environment variables and window system resources also affect
+Emacs' operation.  See the main documentation.
+
+Report bugs to bug-gnu-emacs@gnu.org.  First, please see the Bugs
+section of the Emacs manual or the file BUGS.
+}}}
+
+
+
{{{
+fconv: convertir un fichier ou les fichiers d'un répertoire
+
+USAGE
+    fconv -f FILE [cmds...]
+    fconv FILE [cmds...]
+
+Une ou plusieurs commandes peuvent être spécifiées, séparées par //
+La commande par défaut est 'lf'
+Si des commandes utilisant des options sont utilisées, penser à séparer les
+options de fconv avec --
+
+OPTIONS
+    -N, --detect-always
+        Pour la commande conv, ne pas optimiser le calcul de l'encoding. Cette
+        option n'est valide que si src_enc n'est pas spécifié. On assume que
+        tous les fichiers n'ont pas le même encoding: l'encoding src_enc est
+        donc recalculé à chaque fois.
+    -r, --reverse
+        Pour la commande conv, inverser src_enc et dest_enc, qui doivent être
+        tous les deux spécifiés.
+    -f, --file FILE
+        Spécifier le fichier ou le répertoire concerné par la conversion. Les
+        aliases -d et --dir sont aussi reconnus.
+        Si cette option n'est pas spécifiée, le premier argument est considéré
+        comme le nom du fichier ou du répertoire à convertir. Par défaut,
+        convertir l'entrée standard.
+        Si un répertoire est spécifié, tous les fichiers de ce répertoire et de
+        ses sous-répertoires sont recherchés de façon récursive, sans limite de
+        profondeur. Ensuite, chacun de ces fichiers est converti.
+    --show-cmd
+        Afficher la commande qui serait exécutée
+
+COMMANDES
+    c, conv dest_enc [src_enc]
+        Convertir le fichier dans un autre encoding.
+        dest_enc est l'encoding destination. Il doit être spécifié.
+        src_enc est l'encoding source. S'il n'est pas spécifié ou vaut 'detect',
+            il est autodétecté.
+    U, utf8 [src_enc]
+        Equivalent à conv utf8 src_enc
+    L, latin1 [src_enc]
+        Equivalent à conv latin1 src_enc
+    lf
+    crlf
+    cr
+        Convertir respectivement les caractères de fin de ligne en LF, CR/LF ou CR
+    lc, latin1compat
+        Transformer certains caratères UTF-8 en équivalents qui existent en Latin1
+    na, noaccents
+        Transformer les caractères accentués en caractères non accentués
+    sort [-u]
+        Trier le fichier avec la commande sort. Attention! Il ne faut utiliser
+        que les options de sort qui agissent sur un flux e.g. -u pour trier les
+        lignes de façon unique.
+}}}
+
+
+
{{{
+fnconv: renommer un fichier ou les fichiers d'un répertoire
+
+USAGE
+    fnconv -f FILE [cmds...]
+    fnconv FILE [cmds...]
+
+Une ou plusieurs commandes peuvent être spécifiées, séparées //
+La commande par défaut est 'fixcase'
+
+OPTIONS
+    -N, --detect-always
+        Pour la commande conv, ne pas optimiser le calcul de l'encoding. Cette
+        option n'est valide que si src_enc n'est pas spécifié. On assume que
+        tous les fichiers n'ont pas le même encoding: l'encoding src_enc est
+        donc recalculé à chaque fois.
+    -r, --reverse
+        Pour la commande conv, inverser src_enc et dest_enc, qui doivent être
+        tous les deux spécifiés.
+    -f, --file FILE
+        Spécifier le fichier ou le répertoire concerné par le renommage. Les
+        aliases -d et --dir sont aussi reconnus.
+        Si cette option n'est pas spécifiée, le premier argument est considéré
+        comme le nom du fichier ou du répertoire à renommer.
+        Si un répertoire est spécifié, le traitement est appliqué à tous les
+        fichiers et répertoires de façon récursive, sans limite de profondeur.
+    --show-cmd
+        Afficher la commande qui serait exécutée
+
+COMMANDES
+    C, conv dest_enc [src_enc]
+        Convertir le nom du fichier dans un autre encoding.
+        dest_enc est l'encoding destination. Il doit être spécifié.
+        src_enc est l'encoding source. S'il n'est pas spécifié ou vaut 'detect',
+            il est autodétecté.
+    U, utf8 [src_enc]
+        Equivalent à conv utf8 src_enc
+    L, latin1 [src_enc]
+        Equivalent à conv latin1 src_enc
+    lc, latin1compat
+        Transformer certains caratères UTF-8 en équivalents qui existent en Latin1
+    na, noaccents
+        Transformer les caractères accentués en caractères non accentués
+    l, lowercase
+        Transfomer le nom en minuscule
+    u, uppercase
+        Transformer le nom en majuscule
+    f, fixcase
+        Transformer le nom en minuscule s'il est entièrement en majuscule
+}}}
+
+
+
{{{
+geturl: Télécharger un fichier avec wget ou curl
+
+USAGE
+    geturl <file.url|file.desktop|URL> [wget options]
+}}}
+
+
+
{{{
+mkRewriteRules: Créer un fichier de redirections pour Apache à partir d'un certain
+nombre de règles
+
+USAGE
+    mkRewriteRules -f rewrite.rules [-o RewriteRules.conf] [-w RewriteRules.html] host
+
+OPTIONS
+    -p  Générer les directives <Proxy...> et tenir compte de proxy_acls
+        Par défaut, le champ proxy_acls est ignoré
+
+FORMAT des règles de mapping
+============================
+
+Les commentaires commencent par le signe "#"
+Les règles sont de la forme:
+    src:dest:host:suffix:OPTS:prot:proxy_acls
+    ^prefix
+    =literal
+
+prot vaut par défaut http. Il peut valoir aussi https
+
+Si dest ou suffix se terminent par $, on est en mode NO_SLASH
+En mode NO_SLASH, si src se termine par $, on est en mode NO_TRAIL
+
+* Si dest est de la forme Application.woa
+En mode NO_SLASH, on génère
+    RewriteRule ^/src(.*) [prot://host]/cgi-bin/WebObjects/dest[/suffix]$1 [L,OPTS]
+En mode NO_SLASH+NO_TRAIL, on génère
+    RewriteRule ^/src [prot://host]/cgi-bin/WebObjects/dest[/suffix] [L,OPTS]
+En mode normal, on génère
+    RewriteRule ^/src$ /src/
+    RewriteRule ^/src/(.*) [prot://host]/cgi-bin/WebObjects/dest[/suffix]/$1 [L,OPTS]
+
+* Si dest n'est pas de la forme Application.woa
+En mode NO_SLASH, on génère
+    RewriteRule ^/src(.*) [prot://host]/dest[/suffix]$1 [L,OPTS]
+En mode NO_SLASH+NO_TRAIL, on génère
+    RewriteRule ^/src [prot://host]/dest[/suffix] [L,OPTS]
+En mode normal, on génère
+    RewriteRule ^/src$ /src/
+    RewriteRule ^/src/(.*) /dest[/suffix]/$1 [L,OPTS]
+
+Si une règle est précédée d'une ou plusieurs lignes de la forme "^prefix",
+ces lignes sont copiées avant chacune des commandes RewriteRule générées
+pour une règle. Ceci permet d'ajouter des conditions avec RewriteCond pour
+une règle. e.g.
+    ^RewriteCond %{REMOTE_ADDR} 10\..*
+    src:dest.woa
+qui génère:
+    RewriteCond %{REMOTE_ADDR} 10\..*
+    RewriteRule ^/src$ /src/
+    RewriteCond %{REMOTE_ADDR} 10\..*
+    RewriteRule ^/src/(.*) /cgi-bin/WebObjects/dest.woa/$1 [L]
+
+Une ligne de la forme "=literal" est recopiée sans modifications (sans le "=")
+dans le fichier de sortie.
+
+proxy_acls est utilisé si l'option -p est spécifiée et OPTS contient P (comme
+proxy), ou si le mode de réécriture requière l'utilisation d'un proxy.
+
+* Avec la valeur "None", aucune directive <Proxy> n'est générée
+* Si aucune valeur n'est spécifiée, la directive suivante est générée:
+  <Proxy $URL>
+    AddDefaultCharset off
+    Order Deny,Allow
+    Allow from all
+  </Proxy>
+* Si une valeur est spécifiée, la directive suivante est générée:
+  <Proxy $URL>
+    AddDefaultCharset off
+    Order Allow,Deny
+    Allow from $proxy_acls
+  </Proxy>
+
+Dans les exemples donnés ci-dessus, $URL est l'url générée par la réécriture,
+et $proxy_acls la valeur du champ proxy_acls spécifiée ci-dessus.
+}}}
+
+
+
{{{
+mkiso: créer une image iso d'un répertoire
+
+USAGE
+    mkiso [options] srcdir [dest.iso]
+
+OPTIONS
+    -M, --hfs
+        créer une image hybride ISO/HFS
+    -V, --volume
+        Nom du volume. Par défaut, prendre le nom de base du répertoire
+        d'origine. La taille est de 32 caractères max.
+    -A, --application
+        Description de l'application qui est sur l'image créée. Par défaut,
+        prendre le nom de base du répertoire d'origine. La taille est de 128
+        caractères max.
+}}}
+
+
+
{{{
+mkurl: Enregistrer une url dans un fichier raccourci
+
+USAGE
+    mkurl <url> [output]
+
+OPTIONS
+Par défaut, l'url est enregistrée dans un fichier homepage.url
+Mais il est possible de spécifier un fichier avec l'extension .url pour un
+raccourci utilisable aussi sous Windows, ou avec l'extension .desktop pour
+compatibilité avec le standard XDG
+}}}
+
+
+
{{{
+mkusfx: Créer une archive auto-extractible qui installe son contenu avec uinst
+
+USAGE
+    mkusfx [options] [--bare] src cmd...
+    mkusfx [options] [--uinst] src
+
+OPTIONS
+    --bare
+        Installer le contenu de l'archive en lançant la commande 'cmd...' avec
+        le répertoire courant étant le contenu de l'archive. Typiquement, ce
+        sera une commande de forme './script', où script est un fichier situé à
+        la racine de l'archive
+        Dans ce mode d'installation, l'option --self-contained est ignorée.
+    --uinst
+        Installer le contenu de l'archive avec uinst (par défaut)
+    -o dest
+        Spécifier le fichier de sortie. Par défaut, il s'agit de
+        ${src}-installer.run
+    --tmp-archive
+        Spécifier qu'il s'agit d'une archive temporaire. Cette archive
+        s'auto-détruit après utilisation.
+    --self-contained
+        Spécifier que l'archive doit pouvoir s'installer même sur un système sur
+        lequel nutools n'est pas installé. Cette archive contiendra une copie
+        locale de ulib et uinst.sh
+}}}
+
+
+
{{{
+mocifs: Monter un partage Windows/Samba/CIFS
+
+USAGE
+    mocifs [user@]host[/path] [mountpoint]
+
+Par défaut, le répertoire distant est montée sur un répertoire avec le même nom
+de base que l'hôte. Si le répertoire distant est déjà monté, il est démonté.
+Les options -M et -U permettent de modifier le comportement par défaut.
+
+OPTIONS
+    -M
+        Forcer le montage
+    -U
+        Forcer le démontage
+    -o OPTIONS
+        Ajouter les options spécifiées à la commande de montage mount.cifs
+    -u USERNAME
+    -p PASSWORD
+    -c USERNAME:PASSWORD
+        Spécifier les credentials à utiliser pour la connexion
+}}}
+
+
+
{{{
+modav: Monter un répertoire sur un hôte distant avec davfs
+
+USAGE
+    modav http[s]://host[/path] [mountpoint]
+
+Par défaut, le répertoire distant est montée sur un répertoire avec le même nom
+de base que l'hôte. Si le répertoire distant est déjà monté, il est démonté.
+Les options -M et -U permettent de modifier le comportement par défaut.
+
+OPTIONS
+    -M
+        Forcer le montage
+    -U
+        Forcer le démontage
+    -o OPTIONS
+        Ajouter les options spécifiées à la commande de montage
+    -u USERNAME
+    -p PASSWORD
+    -c USERNAME:PASSWORD
+        Si les credentials à utiliser ne sont pas configuré dans le fichier
+        /etc/davfs2/secrets, cette option permet de les spécifier. Si cette
+        option est utilisée, il est possible de rajouter
+            ask_auth 0
+        dans le fichier /etc/davfs2/davfs2.conf pour éviter le conflit qui se
+        produit quand des informations sont demandées interactivement. C'est le
+        cas par exemple si une connexion en https est faite et que la chaine de
+        certification n'est pas configurée. Pour mémoire, cela se fait avec
+            servercert myCAs.pem
+        dans le fichier /etc/davfs2/davfs2.conf
+        Bien entendu, il est préférable de configurer les credentials dans le
+        fichier /etc/davfs2/secrets avec la syntaxe
+            url         username    password
+        ou
+            mountpoint  username    password
+}}}
+
+
+
{{{
+moiso: Monter une image ISO
+
+USAGE
+    moiso image.iso [mountpoint]
+
+Par défaut, l'image iso est montée sur un répertoire avec le même nom de base.
+Si l'image est déjà montée, elle est démontée. Les options -m et -u permettent
+de modifier le comportement par défaut.
+
+OPTIONS
+    -m
+        Forcer le montage
+    -u
+        Forcer le démontage
+}}}
+
+
+
{{{
+mossh: Monter un répertoire sur un hôte distant avec sshfs
+
+USAGE
+    mossh [user@]host[:/path] [mountpoint]
+
+Par défaut, le répertoire distant est montée sur un répertoire avec le même nom
+de base que l'hôte. Si le répertoire distant est déjà monté, il est démonté.
+Les options -M et -U permettent de modifier le comportement par défaut.
+
+OPTIONS
+    -M
+        Forcer le montage
+    -U
+        Forcer le démontage
+    -o OPTIONS
+        Ajouter les options spécifiées à la commande de montage
+    -s
+        Equivalent à -o allow_other ou -o allow_root selon que l'on est root ou
+        non
+    -u USER
+        Spécifier le user pour la connexion distante, s'il n'est pas possible de
+        le spécifier dans l'url. En cas de conflit, la valeur dans l'url est
+        prioritaire par rapport à cette option.
+}}}
+
+
+
{{{
+mysqlcsv: Faire une requête MySQL et formater la sortie pour traitement avec awkcsv
+
+USAGE
+    mysqlcsv [query [db]] [-- mysql options]
+
+query   est la requête sql à exécuter. Si query n'est pas spécifiée, la(les)
+        requête(s) sql sont prises sur l'entrée standard, ou depuis un fichier
+        si l'option -f est spécifiée.
+db      est le nom de la base de données. Cette argument n'est lu que si le nom
+        de la base de donnée n'est ni spécifié dans le fichier de configuration,
+        ni spécifié avec l'option -D
+
+OPTIONS
+    -h, --host HOST
+    -P, --port PORT
+    -u, --user USER
+    -pPASSWORD
+    -D, --database DATABASE
+        Informations de connexion à la base de données
+    -C, --config CONFIG
+        Prendre les informations de connexion depuis le fichier spécifié.
+        Le fichier doit être de la forme
+            host=HOST
+            #post=3306
+            user=USER
+            password=PASS
+            #database=DB
+            #query=QUERY
+        Les variables port, database et query sont facultatives.
+        Les valeurs définies dans ce fichier sont prioritaires par rapport à
+        celles qui auraient été spécifiées sur la ligne de commande.
+        Utiliser password=--NOT-SET-- s'il faut se connecter sans mot de passe
+        Cette option peut être utilisée plusieurs fois, auquel cas les fichiers
+        sont chargés dans l'ordre.
+    --profile PROFILE
+        La variable $PROFILE est définie avec la valeur spécifiée avant de
+        sourcer les fichiers de configuration. Cela permet d'avoir des fichiers
+        de configuration qui calculent dynamiquement les paramètres en fonction
+        de la valeur du profil.
+    -N, --no-headers
+        Ne pas afficher les en-têtes
+    -c, --force
+        Continuer le traitement même en cas d'erreur
+    -r, --raw
+        Ne pas autoriser mysql à mettre en échappement certaines valeurs
+        retournées par le serveur. Par défaut, les transformations suivantes
+        sont effectuées:
+            newline --> \n
+            tab     --> \t
+            nul     --> \0
+            \      --> \\
+    -n, --nulls
+        Transformer dans le flux en sortie les valeurs NULL en chaines vides
+    -f, --input INPUT
+        Lire la requête depuis le fichier input au lieu de le lire depuis la
+        ligne de commande ou l'entrée standard. Ne pas spécifier cette option
+        ou utiliser '-' pour lire depuis l'entrée standard.
+        Cette option est ignorée si la requête est spécifiée parmi les
+        arguments.
+}}}
+
+
+
{{{
+mysqlloadcsv: Charger une table MySQL avec un fichier csv
+
+USAGE
+    mysqlloadcsv [db.]table [fields...] [-- mysql options]
+
+db      est le nom de la base de données
+table   est le nom de la table à charger
+fields  est la liste des colonnes. Si cette valeur est spécifiée, il faudra
+        peut-être utiliser l'option -s pour ignorer le cas échéant la ligne des
+        en-têtes dans le fichier en entrée. Sinon, les colonnes à utiliser sont
+        calculées à partir du fichier en entrée.
+
+Dans les données en entrées, qui doivent être en UTF8, les conversions suivantes
+sont effectuées par MySQL:
+
+    \0 --> <caractère NUL>
+    \b --> <backspace>
+    \n --> <newline>
+    \r --> <carriage return>
+    \t --> <tab>
+    \Z --> Ctrl+Z
+    \N --> NULL
+
+OPTIONS
+    -h, --host host
+    -P, --port port
+    -u, --user user
+    -ppassword
+        Informations de connexion à la base de données
+    -C, --config CONFIG
+        Prendre les informations de connexion depuis le fichier spécifié.
+        Le fichier doit être de la forme
+            host=HOST.TLD
+            #post=3306
+            user=USER
+            password=PASS
+            #dbtable=DB.TABLE
+            #fields=(FIELDS...)
+            # Il est possible aussi de spécifier DB et TABLE séparément:
+            #database=DB
+            #table=TABLE
+        Les variables port, dbtable et fields sont facultatives.
+        Les valeurs définies dans ce fichier sont prioritaires par rapport à
+        celles qui auraient été spécifiées sur la ligne de commande.
+        Utiliser password=--NOT-SET-- s'il faut se connecter sans mot de passe
+        Cette option peut être utilisée plusieurs fois, auquel cas les fichiers
+        sont chargés dans l'ordre.
+    --profile PROFILE
+        La variable $PROFILE est définie avec la valeur spécifiée avant de
+        sourcer les fichiers de configuration. Cela permet d'avoir des fichiers
+        de configuration qui calculent dynamiquement les paramètres en fonction
+        de la valeur du profil.
+    -f, --input INPUT
+        Fichier en entrée. Ne pas spécifier cette option ou utiliser '-' pour
+        lire depuis l'entrée standard.
+    -d, --auto-dbtable DB
+        Spécifier la base de données avec laquelle se connecter. De plus, si le
+        nom de la table n'est pas spécifié, prendre par défaut le nom de base du
+        fichier spécifié avec l'option -f
+    -s, --skip-lines NBLINES
+        Nombre de lignes à sauter dans le fichier en entrée
+    -n, --fake
+        Ne pas effectuer l'opération. Afficher simplement la commande SQL.
+    --run
+        Forcer le lancement de l'opération. Utiliser cette option avec -A pour
+        créer la table avec les paramètres analysés.
+    -T, --truncate
+        Vider la table avant d'effectuer le chargement
+    -L, --load-data
+        Charger les données avec la commande 'load data local'. C'est l'option
+        par défaut. Le fichier est transmis tel quel à MySQL.
+    -I, --insert-data
+        Charger les données en générant des commandes 'insert into'. L'effet est
+        en principe le même avec l'option -L (sauf que certains formats de date
+        exotiques seront correctement importés). Cette option peut aussi être
+        utilisée avec l'option -n pour générer une liste de commande à corriger
+        et/ou adapter.
+    -U, -k, --update-data KEY
+        Au lieu de charger de nouvelles données, essayer de mettre à jour la
+        table. KEY est le nom de la colonne qui est utilisée comme clé. Toutes
+        les autres colonnes sont les nouvelles données à mettre à jour. Si
+        aucune ligne ne correspond à une clé donnée, la mise à jour pour cette
+        ligne est ignorée.
+        Note: utiliser les options -T et -U ensemble n'a pas de sens, mais -T
+        est quand même honoré.
+    -Z, --null-value VALUE
+        Avec les options -I et -U, considérer que NULL est représenté par la
+        chaine spécifiée. Par défaut, utiliser \N
+    -z, --null-is-empty
+        Avec les options -I et -U, considérer que NULL est représenté par la
+        chaine vide. Cette option est équivalente à -Z ''
+    -t, --types [DEFAULT_TYPE,]FIELD:TYPE,...
+        Spécifier pour chaque champ mentionné le type de donnée à forcer. Le
+        type 'auto' signifie que le type est autodétecté. C'est la valeur par
+        défaut. Les autres types valides sont 'str', 'int' et 'date'
+        Cette option est ignorée avec l'option -L
+    -A, --analyse
+        Analyser les données et afficher une requête pour créer une table qui
+        pourrait contenir ces données.
+        Cette option implique --fake et affiche simplement la commande SQL.
+        Pour lancer la commande SQL générée, il faut ajouter l'option --run
+        APRES cette option
+}}}
+
+
+
{{{
+noerr: lancer une commande en supprimant la sortie d'erreur
+}}}
+
+
+
{{{
+noerror: lancer une commande en masquant son code de retour. le code de retour est toujours 0
+}}}
+
+
+
{{{
+noout: lancer une commande en supprimant la sortie standard
+}}}
+
+
+
{{{
+nutools: configurer ou afficher des informations sur nutools
+
+USAGE
+    nutools [VERSION]
+
+OPTIONS
+    -C, --configure
+        Faire la configuration pour l'utilisateur courant en appelant uenv -u
+        Avec cette option, l'option -l (ou --local-profiles) est aussi reconnue
+        et est passée directement à uenv
+    -v, --version
+        Afficher la version de nutools installée. C'est l'option par défaut
+    -c, --check
+        Calculer si la version installée correspond à la version spécifiée
+    -o, --oper OPERATOR
+        Spécifier l'opérateur à utiliser avec l'option --check (par défaut,
+        utiliser l'opérateur ge, qui permet de vérifier si la version minimum
+        spécifiée est installée)
+    --eq
+    --ne
+    --lt
+    --le
+    --gt
+    --ge
+    --same
+    --diff
+        Ces options sont des raccourcis. L'option '--OP' est équivalente à
+        '--check --op OP'
+}}}
+
+
+
{{{
+openurl: Ouvrir une URL dans un navigateur
+
+USAGE
+    openurl <file.url|file.desktop|URL>
+}}}
+
+
+
{{{
+pdev: basculer sur une branche de développement
+
+USAGE
+    pdev [FEATURE [SOURCE]]
+    pdev -m|-l|-d [FEATURE]
+
+- Vérifier l'existence de la branche develop. La créer si nécessaire en la
+  basant sur [origin/]master.
+- Vérifier s'il n'y a pas de modifications locales. Sinon, proposer de faire un
+  commit ou un stash.
+- Si FEATURE est spécifié, et si on n'est pas déjà sur cette branche, basculer
+  vers cette nouvelle branche. S'il s'agit d'une nouvelle branche, la baser sur
+  la branche SOURCE, qui vaut par défaut develop
+- Si FEATURE n'est pas spécifié, basculer sur develop s'il s'agit de la seule
+  solution, sinon afficher un menu pour choisir la branche de destination.
+
+OPTIONS
+    -C, --projdir PROJDIR
+        Spécifier le répertoire de base du projet qui est dans git. Par défaut,
+        on travaille dans le répertoire courant et on laisse git trouver le
+        répertoire de base du projet. Avec cette option, le répertoire courant
+        est modifié avant de lancer les commandes git.
+    -O, --origin ORIGIN
+        Spécifier le nom de l'origine. Par défaut, utiliser 'origin'
+    -o, --offline
+        En cas de création d'une branche, ne pas pousser vers l'origine; ne pas
+        tenter le cas échéant de traquer la branche dans l'origine; ne pas
+        supprimer une branche dans l'origine. Cette option est automatiquement
+        activée si la variable UTOOLS_VCS_OFFLINE est définie.
+    --online
+        Annuler l'effet de la variable UTOOLS_VCS_OFFLINE: forcer le mode online
+    --sync
+        Faire un certain nombre d'opération pour 'corriger' le dépôt local: pour
+        chacune des branches distantes, vérifier qu'il existe une branche locale
+        qui la traque, et pour chaque feature branche locale, vérifier qu'il
+        existe une branche distante associée. Cette option nécessite --online
+
+    -s, --squash COMMIT_MSG
+        Si la branche actuelle est une feature branch, la merger comme un seul
+        commit avec le message COMMIT_MSG dans develop puis la supprimer. Puis
+        basculer sur la branche develop.
+        Cette option ne devrait pas être utilisée avec -k, puisque bien que les
+        modifications soient mergées, la branche elle-même n'est pas considérée
+        comme mergée. Les résultats sont donc indéfinis si la branche est mergée
+        à plusieurs reprises.
+    -b, --rebase
+        Si la branche actuelle est une feature branch, lancer 'git rebase -i'
+        sur la feature branch. Cela permet de réordonner les commits pour
+        nettoyer l'historique avant de fusionner la branche avec -m
+        Cette option devrait le cas échéant être utilisée immédiatement avant -m
+        ou alors il faut forcer le push et communiquer avec l'équipe sur le fait
+        que la branche de feature a été rebasée.
+    -m, --merge
+        Si la branche actuelle est une feature branch, la merger dans develop
+        puis la supprimer. Puis basculer sur la branche develop.
+    --merge-log
+        Ajouter un résumé des modifications sur la feature branch en ajoutant le
+        log en une ligne de chaque commit dans le message du merge. Cette option
+        n'est en principe pas nécessaire puisque 'prel -um' intègre la liste des
+        commits dans CHANGES.txt
+    -k, --keep
+        Avec l'option -m, ne pas supprimer une feature branch après l'avoir
+        fusionnée dans develop. Cela permet d'intégrer les modifications petit à
+        petit.
+    --delete
+        Supprimer une feature branch, à condition qu'elle aie déjà été
+        entièrement fusionnée dans la branch develop
+    --force-delete
+        Supprimer une feature branch, même si elle n'a pas encore été fusionnée
+        dans la branche develop
+
+    -l, --log
+    -d, --diff
+        Afficher les modifications entre deux branches. L'option --log affiche
+        les modifications dans l'ordre alors que --diff affiche les différences
+        sous forme de diff. Les deux options peuvent être combinées et ont
+        l'effet de 'git log -p'
+        La branche comparée, s'il elle n'est pas spécifiée, est par défaut la
+        branche courante. S'il s'agit d'une feature branch, elle est comparée à
+        develop. S'il s'agit de la branche develop, elle est comparée à master.
+}}}
+
+
+
{{{
+prel: basculer sur une branche de release
+
+USAGE
+    prel -u [SOURCE]
+    prel -c [RELEASE [SOURCE]]
+    prel -m|-l|-d [RELEASE]
+
+- Vérifier s'il n'y a pas de modifications locales. Sinon, proposer de faire un
+  commit ou un stash.
+- Avec l'option -c, s'il existe une branche de release, proposer de basculer
+  vers elle ou sur la branche master. Sinon, basculer sur la branche master.
+- Avec l'option -u, proposer ou fixer une branche de release à créer. Si elle
+  existe déjà, basculer vers elle. Sinon, la créer en la basant sur SOURCE, qui
+  vaut par défaut develop
+
+OPTIONS
+    -C, --projdir PROJDIR
+        Spécifier le répertoire de base du projet qui est dans git. Par défaut,
+        on travaille dans le répertoire courant et on laisse git trouver le
+        répertoire de base du projet. Avec cette option, le répertoire courant
+        est modifié avant de lancer les commandes git.
+    -O, --origin ORIGIN
+        Spécifier le nom de l'origine. Par défaut, utiliser 'origin'
+    -o, --offline
+        En cas de création d'une branche, ne pas pousser vers l'origine; ne pas
+        tenter le cas échéant de traquer la branche dans l'origine; ne pas
+        supprimer une branche dans l'origine. Cette option est automatiquement
+        activée si la variable UTOOLS_VCS_OFFLINE est définie.
+    --online
+        Annuler l'effet de la variable UTOOLS_VCS_OFFLINE: forcer le mode online
+
+    -c, --checkout
+        Basculer vers une branche de release existante. C'est l'option par
+        défaut. Si aucune branche de release n'existe, basculer vers master
+    -u, --update
+        Préparer une nouvelle release. Utiliser une des options -x, -z ou -p
+        pour spécifier le type de release à préparer. Si la branche qui serait
+        créée pour le type de release existe déjà, basculer vers cette branche.
+        S'il faut la créer, la baser sur la branche SOURCE, qui vaut par défaut
+        develop
+    --menu
+    -x, --major
+    -z, --minor
+    -p, --patchlevel
+        Utilisé avec l'option -u, soit afficher un menu pour choisir la version
+        de la nouvelle release (par défaut), soit préparer respectivement une
+        release majeure, mineure, ou pour correction de bug.
+    -v-OPT
+        Avec l'option -u, spécifier une option de pver permettant de choisir la
+        version de la nouvelle release. Les options supportées sont -v, -l, -a,
+        -b, -r et -R. Par exemple, si la version actuelle sur la branche master
+        est 0.2.3, les options '-uz -v-lbeta' permettent de préparer la release
+        0.3.0-beta
+        En principe, cette option n'a pas à être utilisée, puisque dans une
+        branche de release, on peut faire vivre les versions de pré-release
+        jusqu'à la release finale. Ainsi, la branche de release est nommée
+        d'après la version finale, mais le projet peut recevoir une version de
+        pré-release incrémentale.
+    -w, --write
+        Si une nouvelle branche est créée avec -u, mettre à jour le fichier
+        VERSION.txt avec pver. C'est l'option par défaut.
+    -n, --no-write
+        Si une nouvelle branche est créée avec -u, NE PAS mettre à jour le
+        fichier VERSION.txt avec pver. Utiliser cette option si la mise à jour
+        du numéro de version doit être faite d'une manière particulière.
+    -e, --edit
+        Editer le fichier CHANGES.txt autogénéré par -u -w
+        Cette option est surtout utile si -m est utilisé avec -u, pour donner la
+        possibilité de corriger la liste des modifications avant leur
+        enregistrement définitif.
+
+    -m, --merge
+        Si la branche actuelle est une branche de release, ou s'il existe une
+        branche de release, la merger dans master, puis dans develop, puis la
+        supprimer. Puis basculer sur la branche master.
+        S'il n'existe pas de branche de release, proposer de fusionner les
+        modifications de la branche develop dans la branche master, sans
+        préparer de branche de release au préalable.
+    --delete
+        Supprimer une branche de release, à condition qu'elle aie déjà été
+        entièrement fusionnée dans la branch master
+    --force-delete
+        Supprimer une branche de release, même si elle n'a pas encore été
+        fusionnée dans la branche master
+
+    -s, --summary
+        Afficher la liste des différences entre la branche develop et la branche
+        master, comme elle serait générée par les options -u -w pour le fichier
+        CHANGES.txt
+    -l, --log
+        Afficher les modifications actuellement effectuée dans la branche de
+        release par rapport à develop.
+    -d, --diff
+        Afficher les modifications actuellement effectuée dans la branche de
+        release par rapport à develop, sous forme de diff.
+}}}
+
+
+
{{{
+pver: gérer des numéros de version selon les règles du versionage sémantique v2.0.0 (http://semver.org/)
+
+USAGE
+    pver [options]
+
+OPTIONS
+    -f, --file VERSIONFILE
+        Gérer le numéro de version se trouvant dans le fichier spécifié. Le
+        fichier est créé si nécessaire. C'est l'option par défaut si un fichier
+        nommé VERSION.txt se trouve dans le répertoire courant.
+    -e, --maven POMFILE
+        Gérer le numéro de version se trouvant dans le fichier pom.xml spécifié.
+        Le fichier DOIT exister. C'est l'option par défaut si un fichier nommé
+        pom.xml se trouve dans le répertoire courant.
+    -F, --file-string VERSIONFILE
+        Prendre pour valeur de départ le contenu du fichier VERSIONFILE (qui
+        vaut par défaut VERSION.txt)
+    -g, --git-string [branch:]VERSIONFILE
+        Prendre pour valeur de départ le contenu du fichier VERSIONFILE (qui
+        vaut par défaut VERSION.txt) dans la branche BRANCH (qui vaut par défaut
+        master) du dépôt git situé dans le répertoire courant.
+    -s, --string VERSION
+        Prendre pour valeur de départ le numéro de version spécifié
+
+    --show
+        Afficher le numéro de version. C'est l'action par défaut
+    --allow-empty
+        Supporter que la version puisse ne pas être spécifiée ni trouvée. Dans
+        ce cas, ne pas assumer que la version effective est 0.0.0
+        Avec --show et --update, ne rien afficher si la version est vide.
+    --check
+        Vérifier que le numéro de version est conforme aux règles du versionage
+        sémantique
+    --convert
+    --no-convert
+        Activer (resp. désactiver) la conversion automatique.  Par défaut, si la
+        version est au format classique 'x.z[.p]-rDD/MM/YYYY', elle est
+        convertie automatiquement au format sémantique x.z.p+rYYYYMMDD
+    --eq VERSION
+    --ne VERSION
+    --lt VERSION
+    --le VERSION
+    --gt VERSION
+    --ge VERSION
+    --same VERSION
+    --diff VERSION
+        Comparer avec la version spécifiée. Les opérateurs --eq, --ne, --lt,
+        --le, --gt, et --ge ignorent l'identifiant de build (comme le demande la
+        règle du versionage sémantique). Les opérateurs --same et --diff
+        comparent aussi les identifiants de build.
+    -v, --set-version VERSION
+        Spécifier un nouveau numéro de version qui écrase la valeur actuelle.
+        Cette option ne devrait pas être utilisée en temps normal parce que cela
+        va contre les règles du versionage sémantique.
+    --prel
+        Spécifier un nouveau numéro de version qui écrase la valeur actuelle. Le
+        numéro de version est obtenu à partir du nom de la branche git courante,
+        qui doit être de la forme release-VERSION
+    -u, --update
+        Mettre à jour le numéro de version.
+
+    --menu
+        Afficher un menu permettant de choisir le composant de la version à
+        incrémenter
+    -x, --major
+        Augmenter le numéro de version majeure
+    -z, --minor
+        Augmenter le numéro de version mineure. C'est la valeur par défaut.
+    -p, --patchlevel
+        Augmenter le numéro de patch
+
+    -l, --prelease ID
+        Spécifier un identifiant de pré-release, à ajouter au numéro de version.
+    -a, --alpha
+    -b, --beta
+    -r, --rc
+        Spécifier une pré-release de type alpha, beta, ou rc. Si la version est
+        déjà dans ce type, augmenter la dernière valeur numérique des composants
+        de l'identifiant, e.g. alpha deviant alpha.1, beta-1.2 devient beta-1.3,
+        rc1 devient rc2
+        XXX ces fonctions ne sont pas encore implémentées
+    -R, --final, --release
+        Supprimer l'identifiant de prérelease
+
+    -m, --metadata ID
+        Spécifier un identifiant de build, à ajouter au numéro de version.
+    -M, --vcs-metadata
+        Spécifier l'identifiant à partir de la révision actuelle dans le
+        gestionnaire de version. Note: pour le moment, seul git est supporté.
+    --add-metadata ID
+        Ajouter l'identifiant spécifié à la valeur actuelle, au lieu de la
+        remplacer. Séparer l'identifiant de la valeur précédente avec un '.'
+}}}
+
+
+
{{{
+pz: faire une archive du projet
+
+USAGE
+    pz
+
+OPTIONS
+    -C, --projdir PROJDIR
+        Spécifier le répertoire de base du projet qui est dans git. Par défaut,
+        on travaille dans le répertoire courant et on laisse git trouver le
+        répertoire de base du projet. Avec cette option, le répertoire courant
+        est modifié avant de lancer les commandes git.
+    -d, --destdir DESTDIR
+        Spécifier le répertoire dans lequel générer l'archive. Par défaut,
+        prendre le répertoire parent du répertoire de base du dépôt.
+}}}
+
+
+
{{{
+Usage: reptyr [-s] PID
+       reptyr -l|-L [COMMAND [ARGS]]
+  -l    Create a new pty pair and print the name of the slave.
+           if there are command-line arguments after -l
+           they are executed with REPTYR_PTY set to path of pty.
+  -L    Like '-l', but also redirect the child's stdio to the slave.
+  -s    Attach fds 0-2 on the target, even if it is not attached to a tty.
+  -h    Print this help message and exit.
+  -v    Print the version number and exit.
+  -V    Print verbose debug output.
+}}}
+
+
+
{{{
+rmtildes: supprimer les fichiers *~ dans le répertoire courant
+
+USAGE
+    rmtildes [dir [glob]]
+
+Par défaut, dir==. et glob==*~
+}}}
+
+
+
{{{
+rruns: Déploiement distant avec runs
+
+USAGE
+    rruns [-h hosts] [-T tmproot] rscriptname name=value...
+    rruns [-h hosts] [-T tmproot] @recipe name=value...
+    rruns [-h hosts] [-T tmproot] -f rscript name=value...
+    rruns [-h hosts] [-T tmproot] -r recipe name=value...
+
+Lancer ce script sans argument (hors options) est équivalent à le lancer avec
+l'argument @default
+
+OPTIONS
+    -C  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
+        ce n'est pas possible de se connecter par mot de passe avec le user root
+        sur l'hôte distant, et qu'il existe un user sudoer sur l'hôte distant,
+        il est possible de faire la configuration avec '--configure root'. La
+        commande serait alors
+            rruns -h user@host --configure root
+    -T 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
+        Spécifier le programme à utiliser pour la connection par ssh.
+    -h host
+    -h @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
+        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
+        La forme @hostsfile permet de lire la liste des hôtes depuis le fichier
+        hostsfile, à raison d'un hôte par ligne.
+        Si cette option n'est pas spécifiée, et que le répertoire courant est
+        dans un des répertoires de $RUNSHOSTSPATH, sélectionner l'hôte
+        correspondant. Sinon, l'utilisateur doit saisir l'hôte distant de façon
+        interactive.
+    -f RSCRIPT
+        Lancer le script individuel spécifié au lieu de chercher dans les
+        répertoires $RUNS{SCRIPTS,HOSTS}PATH
+    -r RECIPE
+        Lancer les scripts spécifiés dans le fichier de recettes individuel
+        spécifié.
+    -z  Forcer la réinstallation des scripts qui se basent sur shouldrun/setdone
+    -o OUTPUT
+        Générer l'archive à lancer sur l'hôte distant au lieu de faire le
+        déploiement. Si plusieurs hôtes sont spécifiés, OUTPUT est considéré
+        comme un nom de base auquel est ajouté le nom de l'hôte sur lequel
+        l'archive doit être déployée.
+    --init
+    --no-init
+        Forcer (resp. empêcher) la création des répertoires d'hôte correspondant
+        aux hôtes spécifiés. Par défaut, la création des répertoires d'hôte est
+        effectuée uniquement si ce script est lancé sans argument.
+    --sysinfos
+        Après un déploiement réussi sur l'hôte distant, inscrire si ce n'est
+        déjà fait le résultat de la commande usysinfos dans le fichier
+        sysinfos.conf du répertoire d'hôte.
+        Cette option est automatiquement activée si ce script est lancé sans
+        argument (hors options).
+}}}
+
+
+
{{{
+ruinst: Déploiement distant avec uinst
+
+USAGE
+    ruinst [-h host] [-T tmproot] <file|archive|dir> [-- options de uinst]
+
+note: à cause d'une limitation de makeself, les options de uinst ne devraient
+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é
+        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
+        ce n'est pas possible de se connecter par mot de passe avec le user root
+        sur l'hôte distant, et qu'il existe un user sudoer sur l'hôte distant,
+        il est possible de faire la configuration avec '--configure root'. La
+        commande serait alors
+            ruinst -h user@host --configure root
+        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:
+            ruinst -h user@host --configure root --uses-su
+    -T 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
+        Spécifier le programme à utiliser pour la connection par ssh.
+    -h hosts
+    -h @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
+        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
+        La forme @hostsfile permet de lire la liste des hôtes depuis le fichier
+        hostsfile, à raison d'un hôte par ligne.
+}}}
+
+
+
{{{
+rumount: démonter un système de fichier récursivement
+
+USAGE
+    rumount 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.
+}}}
+
+
+
{{{
+runs: Lancer un script avec le protocole runs
+
+USAGE
+    runs [options] rscriptname name=value...
+    runs [options] @recipe name=value...
+    runs [options] -f rscript name=value...
+    runs [options] -r recipe name=value...
+
+OPTIONS
+Configuration
+    --init
+    --verify
+        Vérifier le nom d'hôte et créer si nécessaire le répertoire d'hôte
+        correspondant à l'hôte courant ou à l'hôte spécifié avec l'option -h
+        Avec --verify, la création du répertoire d'hôte n'est pas effectuée.
+    --sysinfos DATA
+        Avec l'option --init, initialiser le fichier sysinfos.conf avec DATA, si
+        le fichier n'a pas déjà été provisionné. Sans cette option, un fichier
+        vide avec des commentaires est créé à la place.
+    --create RSCRIPT
+        Créer un modèle de script avec le nom donné.
+        Avec l'option -h, le script est créé dans le répertoire d'hôte
+        correspondant à l'hôte spécifié
+
+Gestion des scripts
+    -s  Forcer l'exécution du script avec l'utilisateur root si ce n'est pas
+        déjà le cas
+    -f RSCRIPT
+        Lancer le script individuel spécifié au lieu de chercher dans les
+        répertoires de $RUNSSCRIPTSPATH
+    -r RECIPE
+        Lancer les scripts spécifiés dans le fichier de recettes individuel
+        spécifié.
+    -h HOSTNAME[.DOMAIN]
+        Spécifier que les scripts sont destinés à être lancés sur l'hôte
+        spécifié. Les scripts sont alors aussi cherchés dans les répertoires
+        {$RUNSHOSTSPATH}/$hostname.$domain (par défaut) et
+        {$RUNSHOSTSPATH}/$domain/$hostname (le cas échéant)
+        L'option --host est équivalente, sauf que son argument est facultatif et
+        que sa valeur par défaut est l'hôte courant, soit sulfure
+    --list
+        Afficher la liste des scripts qui sont disponibles. Avec l'option -h,
+        inclure aussi les scripts spécifiques à cet hôte.
+        Avec cette option, les arguments supplémentaires agissent comme des
+        filtres (regexp utilisée avec l'opérateur == de la commande [[). Les
+        noms des scripts doivent valider au moins un filtre.
+    --info
+        Afficher la la description du script et la valeur de chaque variable
+        définies
+    --desc-only
+        Afficher seulement la description du script
+    -z  Forcer la réinstallation des scripts qui se basent sur shouldrun/setdone
+}}}
+
+
+
{{{
+runsconfig: Gérer un répertoire d'hôte de runs
+
+USAGE
+    runsconfig -c [host [destdir]]
+    runsconfig -t -- args...
+
+OPTIONS
+    -c, --create
+        Créer un nouveau répertoire de configuration pour un hôte
+    -d, --destdir DESTDIR[=runs]
+        Nom du répertoire local de configuration.
+
+    -t, --template [OPT]
+        Gérer les fichiers du répertoire local avec templatectl. La valeur de
+        cette option est utilisée comme argument court pour l'invocation de
+        templatectl, e.g
+            runsconfig -tm args
+        est équivalent à
+            templatectl -m args
+        Les arguments qui restent sont passés tels quels à templatectl
+        Les options courantes de templatectl -l, -v, -m, -L sont disponibles
+        directement
+    --help-template
+        Afficher l'aide concernent la gestion des templates.
+        Equivalent à -t -- --help
+    -h, --host HOST
+        Spécifier l'hôte. Equivalent à -v host=HOST
+}}}
+
+
+
{{{
+runsmod: récupérer des dépôts git à usage de runs
+
+USAGE
+    runsmod [options] [-h host] [modules...]
+
+Tous les dépôts spécifiés dans la configuration sont récupérés. Si des modules
+sont spécifiés, les dépôts correspondants sont récupérés aussi. Avec l'option
+-h, des dépôts spécifiques à l'hôte peuvent éventuellement être récupérés en
+plus.
+
+OPTIONS
+    -c, --config CONFIG
+        Spécifier un fichier de configuration à charger au lieu de la valeur par
+        défaut ~/etc/default/runs
+    --prod
+    --devel
+        Forcer un mode de sélection des urls. En mode production, préférer pour
+        le clonage les urls de production, qui sont en principe accessibles sans
+        authentification et en lecture seule. En mode développement, préférer
+        pour le clonage les urls de développement, qui sont en principe
+        accessibles par clé ssh et en lecture/écriture
+    --no-fetch
+        Ne rien récupérer. Utile avec --update-repolist
+    -N, --no-host
+    -A, --all-hosts
+    -H, -h, --host HOST
+    -T, --this-host
+        Options permettant de spécifier l'hôte pour la récupération de dépôts
+        spécifiques.
+        --no-host demande explicitement à ce qu'aucun hôte ne soit spécifié
+        --all-hosts sélectionne tous les dépôts spécifiques
+        --host récupère uniquement les dépôts pour l'hôte spécifié
+        --this-host équivaut à --host sulfure
+        L'option par défaut est --this-host en mode production et --all-hosts en
+        mode développement
+    --update-repolist
+        Forcer la mise à jour de la liste des dépôts. En principe, cette mise à
+        jour n'est pas faite plus d'une fois par période de 24 heures.
+    -0, --offline
+    -n, --no-pull
+    -u, --pull
+        Spécifier le mode opératoire pour la récupération des dépôts.
+        En mode --offline, ni clone ni pull ne sont autorisés. Le module doit
+        avoir déjà été cloné.
+        En mode --no-pull, seul le clonage est autorisé, e.g. le dépôt est
+        cloné si ce n'est pas déjà le cas.
+        En mode --pull, cloner le dépôt si ce n'est pas déjà le cas, ou le
+        mettre à jour le dépôt avant de l'utiliser s'il avait déjà été cloné.
+        Par défaut, utiliser --pull en mode production et --no-pull en mode
+        développement.
+    -i, --identity IDENTITY_FILE
+        Spécifier le fichier depuis lequel lire la clé privée pour les
+        connexions par ssh.
+    -o, --output OUTPUT
+        Spécifier un fichier dans lequel écrire des définitions de variables,
+        notamment REPODIRS qui reçoit la liste des chemins des dépôts qui ont
+        été récupérés. De plus, les variables RUNSSCRIPTSPATH, RUNSMODULESPATH
+        et RUNSHOSTSPATH sont définies.
+    -a, --append-output
+        Ajouter au fichier OUTPUT au lieu de l'écraser
+}}}
+
+
+
{{{
+rwoinst: Déploiement distant avec woinst
+
+USAGE
+    rwoinst [-H host] [-T tmproot] <file|archive|dir>... [-- options de woinst]
+
+OPTIONS
+    -C  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
+        ce n'est pas possible de se connecter par mot de passe avec le user root
+        sur l'hôte distant, et qu'il existe un user sudoer sur l'hôte distant,
+        il est possible de faire la configuration avec '--configure root'. La
+        commande serait alors
+            rwoinst -H user@host --configure root
+    -T 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
+        Spécifier le programme à utiliser pour la connection par ssh.
+    -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
+        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
+}}}
+
+
+
{{{
+USAGE:
+    sqlcsv [query]
+
+query   est la requête SQL à exécuter. Si query n'est pas spécifiée ou si elle
+        vaut '-', la requête SQL est lue sur l'entrée standard, ou depuis un
+        fichier si l'option -f est spécifiée.
+
+DEMARRAGE
+
+Au démarrage, les répertoires de configuration (utilisateur ~/.sqlcsv et système
+/etc/sqlcsv) sont analysés. Les fichiers *.jar situés dans ces répertoires sont
+ajoutés au CLASSPATH. La présence de certains fichiers est testée pour activer
+éventuellement les logs détaillés.
+
+OPTIONS
+    -C, --config CONFIG
+        Prendre les informations de connexion depuis le fichier de propriété
+        spécifié. Pour l'identifiant CONN, la propriété 'CONN.url' doit exister
+        dans ce fichier avec la valeur de l'url jdbc de connexion. De plus, les
+        propriétés 'CONN.user' et 'CONN.password' contiennent respectivement si
+        nécessaire le nom et le mot de passe de connexion. La propriété
+        'loglevel', si elle existe, est utilisée pour configurer le niveau
+        d'affichage des logs, comme avec l'option --loglevel
+        Si cette option n'est pas spécifiée, un fichier nommé sqlcsv.properties
+        est recherché dans l'ordre: dans le répertoire courant, dans le
+        répertoire de configuration utilisateur, puis dans le répertoire de
+        configuration système. Si le fichier est trouvé, il est chargé
+        automatiquement.
+    -l, --conn CONN
+        Spécifier l'identifiant (ou l'url) de connexion. Cette information est
+        obligatoire. Si cette option n'est pas fournie, il faut spécifier un
+        fichier de configuration avec l'option -C dans lequel *une seule*
+        propriété 'CONN.url' est définie.
+    -u, --user USER
+    -p, --password PASSWORD
+        Spécifier un nom de connexion et un mot de passe si l'url ne le fournit
+        pas. Ces valeurs ont la priorité sur les valeurs éventuellement déjà
+        présentes dans le fichier de propriété.
+    -f, --input INPUT
+        Lire la requête depuis le fichier INPUT au lieu de la lire depuis la
+        ligne de commande ou l'entrée standard. Ne pas spécifier cette option ou
+        utiliser '-' pour lire depuis l'entrée standard. Cette option est
+        ignorée si la requête est fournie sur la ligne de commande.
+    -o, --output OUTPUT
+        Ecrire le résultat dans le fichier OUTPUT. Utiliser '-' pour spécifier
+        la sortie standard (c'est la valeur par défaut). S'il y a plusieurs
+        requêtes et que le fichier de sortie n'est pas la sortie standard,
+        ajouter un numéro incrémental au nom du fichier en sortie pour chaque
+        requête. Sinon, il est possible de spécifier plusieurs fois cette option
+        pour nommer les fichiers correspondant à chaque requête.
+    -t, --autocommit
+        Activer le mode autocommit
+    -c, --ignore-io-error
+        Continuer le traitement même en cas d'erreur du système de fichiers.
+        Cependant le traitement s'arrête et la transaction est annulée si une
+        autre erreur se produit.
+    -y, --ignore-any-error
+        Continuer le traitement même en cas d'erreur quelconque.
+    -n, --no-headers
+        Ne JAMAIS inclure les en-têtes dans la sortie, même avec l'option -h
+    -a, --append
+        Ajouter le résultat au fichier OUTPUT au lieu de l'écraser.
+    -A, --auto-na
+        Activer les option -n -a si le fichier OUTPUT existe et qu'il est non
+        vide. Le test n'est effectué que pour le premier fichier spécifié.
+    -s, --same-output
+        Utiliser le même fichier pour écrire le résultat de toutes les requêtes.
+        Normalement, un numéro incrémental est ajouté au fichier en sortie si
+        plusieurs requêtes sont spécifiées. Si les en-têtes sont les mêmes,
+        ajouter le résultat au fichier directement à la suite. Sinon, sauter une
+        ligne blanche et afficher les nouveaux en-têtes.
+    -h, --force-headers
+        En cas d'écriture du résultat de plusieurs requêtes dans un même
+        fichier, ne pas tenter de concaténer les résultats même si les en-têtes
+        sont les mêmes.
+    --uc-output
+        Ajouter dans la sortie les résultat de toutes les requêtes, pas
+        seulement celles de type DQML
+    --loglevel LOGLEVEL
+        Spécifier le niveau de logs à afficher. Les valeurs valides sont à
+        choisir parmi ALL, FINEST, FINER, FINE, CONFIG, INFO, WARNING, ERROR
+        La présence de certains fichiers dans les répertoires de configuration
+        utilisateur ou système configure les logs avant que les options de la
+        ligne de commande ne soient analysés: un fichier DEBUG fait démarrer
+        l'application avec le niveau de log ALL ce qui permet de voir les logs
+        concernant le chargement des jar. Un fichier SQL_DEBUG permet d'activer
+        la trace de DriverManager. Exemple:
+            mkdir -p ~/.sqlcsv && touch ~/.sqlcsv/{DEBUG,SQL_DEBUG}
+}}}
+
+
+
{{{
+twsync: synchroniser un répertoire de wiki avec un tiddlywiki
+
+USAGE
+    twsync [options]
+
+Un répertoire de wiki est un répertoire où chaque page est contenu dans un
+fichier avec l'extension .twp
+Un tiddlywiki est un fichier html contenant le code de TiddlyWiki et les données
+associées.
+
+OPTIONS
+    -d wikidir
+    -f wikifile
+        Spécifier le répertoire de wiki et le tiddlywiki à traiter. Par défaut,
+        il s'agit de wiki.html dans le répertoire courant.
+    -u  Importer les pages de wikidir dans le tiddlywiki. Utiliser cette action
+        quand les pages de wikidir sont modifiées et qu'il faut mettre à jour le
+        tiddlywiki.
+        Il s'agit de l'action par défaut
+    --force
+        Forcer l'importation des pages même si les tiddlers correspondant sont
+        plus récents dans le tiddlywiki
+        Forcer aussi la regénération de wikifile même si aucune modification n'a
+        été détectée
+    -e  Exporter les tiddlers du tiddlywiki vers wikidir. Utiliser cette action
+        quand le tiddlywiki a été modifié, et qu'il faut synchroniser wikidir
+        avec les dernières modifications.
+    -U  Mettre à jour le fichier wikifile avec la dernière version de tiddlywiki
+        située dans ~/wop/modules/nutools/lib/tiddlywiki/empty.html
+}}}
+
+
+
{{{
+uawk: wrapper pour des outils implémentés en awk
+
+USAGE
+    uawk TOOL args...
+
+Les noms d'outils valides sont: awkrun awkcsv grepcsv awkfsv2csv mergecsv sortcsv dumpcsv printcsv
+Utiliser l'option --help pour obtenir de l'aide sur chacun des outils
+}}}
+
+
+
{{{
+ubackup: faire une sauvegarde des fichiers
+
+USAGE
+    ubackup [options]
+
+OPTIONS
+    -l  Lister les profils de sauvegarde disponibles.
+    -p  Spécifier le profil de sauvegarde à effectuer. Par défaut, toutes les
+        sauvegardes sont effectuées.
+    -u USER
+        Faire le sauvegarde pour l'utilisateur $USER. Cette option n'est valide
+        que pour l'utilisateur root.
+    -n  Afficher ce qui doit être fait plutôt que de le faire
+    -H  Arrêter la machine après une sauvegarde REUSSIE.
+}}}
+
+
+
{{{
+ucalc: Afficher une valeur dans plusieurs unités
+
+USAGE
+    ucalc value
+
+Sans suffixe, la valeur est exprimée en octets. Sinon, elle peut être suffixée
+pour spécifier l'unité dans laquelle est exprimée la valeur:
+    K,M,G,T -- Kibi (1024), Mibi (1024^2), Gibi (1024^3), Tebi (1024^4)
+    k,m,g,t -- Kilo (1000), Mega (1000^2), Giga (1000^3), Tera (1000^4)
+    s       -- secteurs de 512 octets
+    S       -- secteurs de 2048 octets
+    p       -- pages de 4096 octets
+    c       -- cylindres (si l'option -c est spécifiée)
+    b       -- octets
+
+OPTIONS
+    -u UNIT
+        Spécifier l'unité de value. Le suffixe qui est éventuellement sur value
+        est ignoré.
+    -o UNIT
+        Spécifier l'unité en sortie. Par défaut, afficher la valeur dans toutes
+        les unités supportées.
+    -c VALUE
+        Taille d'un cylindre en octets, pour permettre l'affichage des valeurs
+        en cylindres
+}}}
+
+
+
{{{
+uconf: Activer ou désactiver un paramètre dans un fichier de configuration
+
+USAGE
+    uconf [options] config name[=value]...
+
+OPTIONS
+    -e
+        Activer le paramètre (par défaut). Si le paramètre existe, mais est
+        commenté, il est décommenté. Si une valeur est spécifiée pour le
+        paramètre, le paramètre est modifié dans le fichier en conséquence.
+    -q
+        Cette option s'utilise avec l'option -e et le type shell. Elle permet
+        de s'assurer que les valeurs ayant des espaces et/ou des caractères
+        spéciaux sont quotées
+    -d
+        Désactiver le paramètre. Le paramètre est commenté s'il existe dans le
+        fichier
+    -a
+        Ajouter une valeur à la variable, ou un paramètre avec cette valeur
+        (suivant le type de fichier de configuration)
+    -A
+        Ajouter une valeur au tableau, ou un paramètre avec cette valeur
+        (suivant le type de fichier de configuration)
+    -t TYPE
+        Type de fichier de configuration. TYPE peut être sh (par défaut), apache
+        ou mysql.
+        shell
+            les paramètres sont de la forme 'name=value', et les commentaires
+            débutent par '#'. Ce type peut être utilisé pour tous les fichiers
+            ayant ces caractéristiques, dont les fichiers de script shell
+        apache
+            les paramètres sont de la forme 'name value', et les commentaires
+            débutent par '#'. Ce type peut être utilisé pour tous les fichiers
+            ayant ces caractéristiques, dont les fichiers de configuration
+            apache
+        mysql, php
+            les paramètres sont dans des sections nommées de la forme [section],
+            sont de la forme 'name=value', et les commentaires débutent par '#'
+            ou ';'
+            Ce type peut être utilisé pour tous les fichiers ayant ces
+            caractéristiques, dont les fichiers de configuration de mysql et de
+            php. Avec ce type, la section est obligatoire.
+    -s SECTION
+        Avec le type mysql, préciser la section dans laquelle inscrire le
+        paramètre. Attention! La section DOIT exister, elle n'est pas créée
+        automatiquement.
+}}}
+
+
+
{{{
+ucrontab: Ajouter/Supprimer une ligne dans crontab
+
+USAGE
+    ucrontab [options] ctline
+
+OPTIONS
+    -a  Ajouter la ligne dans le fichier crontab (par défaut)
+    -r  Enlever la ligne dans le fichier crontab
+    -u user
+        Spécifier l'utilisateur pour lequel on modifie crontab. Par défaut,
+        modifier le crontab de root
+    -H host:hosts...
+        Modifier le crontab sur les hôtes distants spécifiés. Avec l'hôte '.' ou
+        'localhost', la modification est faite sur l'hôte local
+        Si l'action est -a, un script 'undo-ucrontab.sh' est créé dans le
+        répertoire courant, qui annule la planification. Il est possible de
+        lancer ce script le lendemain pour enlever les planifications
+        installées.
+    ctline
+        Ligne de crontab de la forme 'minutes hours days months dows command'
+        Si la ligne est de la forme halt[@hh:mm], la commande 'shutdown -h now'
+        est planifiée pour le LENDEMAIN à hh:mm. si hh:mm n'est pas spécifié,
+        l'arrêt est planifié pour 7:00
+    -t hh:mm
+        Ignorer la partie 'minutes hours days months dows' de ctline, et la
+        remplacer par une planification à hh:mm le LENDEMAIN.
+    --dom dayOfMonth
+    --month month
+        Spécifier respectivement le jour du mois et le mois (1-12) auquel faire
+        la planification. Par défaut, les planifications sont effectuées pour le
+        LENDEMAIN. Il est conseillé de spécifier les deux arguments si le jour
+        doit être fixé.
+    -s cmdfile
+        Spécifier un fichier, dont le contenu est utilisé pour générer le script
+        qui est planifié. Le fichier doit contenir l'ensemble des commandes à
+        exécuter. Le script est modifié pour s'autodétruire à la fin de son
+        exécution. Si ce comportement n'est pas souhaité, il faut rajouter la
+        commande 'exit 0' à la fin.
+    -S cmd
+        Comme -s, mais spécifier le contenu du fichier directement sur la ligne
+        de commande.
+    -f hostsfile
+        Spécifier un fichier qui contient la liste des hôtes sur lesquels faire
+        les planifications.
+        Les options -s, -S, -H, -d, -n sont ignorées. L'option --add est valide
+        jusqu'au premier @group du fichier. Voici le format de ce fichier:
+
+        Un groupe d'hôte débute par une ligne de la forme '@group:adelay:gdelay'
+        - adelay est le nombre de minutes à laisser passer entre les hôtes du
+          groupe (par défaut 1)
+        - gdelay est le nombre de minutes à laisser passer après le traitement
+          du groupe (par défaut 15)
+        Les autres lignes sont des hôtes sur lequels planifier l'opération, de
+        la forme 'host:cmd'
+        - host est un nom d'hôte pleinement qualifié, sur lequel il est possible
+          de se connecter par clé.
+        - cmd est une description de la commande à lancer pour effectuer
+          l'opération planifiée. Utiliser la syntaxe '<script' pour prendre le
+          contenu du fichier de script spécifié. Le script est copié dans un
+          fichier temporaire sur l'hôte, et se supprime après son
+          lancement. Sinon, la commande spécifiée est utilisée telle quelle. Si
+          cmd n'est pas spécifié, prendre la commande par défaut donnée par
+          ctline
+        Les lignes vides et commençant par '#' sont ignorées
+        La commande '@include:file' permet d'inclure un autre fichier
+
+    -d  Activer l'incrémentation automatique des heures de planification entre
+        chaque hôte. Ceci permet par exemple de planifier l'arrêt d'un certain
+        nombre de machines dans un ordre précis, en horaire décalé.
+        Cette option est activée par défaut si ctline==halt[@time]
+    -n  Désactiver l'incrémentation automatique des heures de planification.
+    --add ADELAY
+        Spécifier le nombre de minutes entre chaque hôte pour l'incrémentation
+        automatique des heures de planification. Par défaut, il y a 1 minute
+        entre chaque hôte.
+    --us undo-script
+        Spécifier le nom du script qui annule la planification. Utiliser ""
+        pour désactiver cette fonctionnalité.
+    --fake
+        Afficher simplement les modifications qui doivent être effectuées.
+}}}
+
+
+
{{{
+udaemon.cgo: start a program as a daemon
+
+USAGE
+    udaemon.cgo /path/to/prog [args...]
+
+OPTIONS
+    -d DESTDIR
+        Change to DESTDIR instead of "/" before starting the program
+}}}
+
+
+
{{{
+udir: gérer les variables de répertoire
+
+USAGE
+    udir [options] [dir [name=value...]]
+
+Par défaut, mettre à jour les variables du répertoire avec les définitions
+données. Attention! Les définitions sont insérées *telles quelles* dans le
+fichier. Par exemple, pour définir une variable qui contient des espaces,
+on pourra faire:
+    udir /path/to/dir 'var="value with spaces"'
+pour définir un tableau:
+    udir /path/to/dir 'array=(first second)'
+
+OPTIONS
+    -i
+        Afficher la description du répertoire. C'est l'action par défaut si ce
+        script est lancé *sans argument*
+    -d
+        Afficher toutes les variables définies pour le répertoire 'dir'.
+    -x 'cmds;...'
+        Exécuter les commandes dans le contexte des variables définies pour le
+        répertoire.
+    -e
+        Editer les variables du répertoire
+    --local-vars
+        Avec -d, ajouter des directives 'local' aux définitions de variables
+    -A
+        Avec -d et -x, considérer les variables de tous les répertoires parents
+        jusqu'à la racine. Pour ne considérer que les variables du répertoire
+        spécifié (par défaut), utiliser --local-only
+    --help-vars
+        Afficher une descriptions des variables spécifiques aux outils de nutools
+}}}
+
+
+
{{{
+udist: gestion d'une distribution upstream
+
+Des fichiers de configuration (par exemple) sont distribués par un partenaire,
+et il faut maintenir des modifications locales, tout en acceptant les mises à
+jour provenant de l'upstream. Ce script aide à maintenir un tel scénario.
+
+En général, la distribution upstream identifie les fichiers modifiables en leur
+donnant une extension particulière, par exemple 'file.origine' ou 'file.default'
+La liste des extensions reconnues est spécifiée avec l'option -s. Lors de leur
+intégration dans le répertoire local, ces fichiers sont copiés sans cette
+extension.
+
+Terminologie: Les fichiers pour lesquels il faut maintenir une version locale
+sont appelés 'fichiers locaux', qu'ils viennent de la distribution upstream ou
+non. Les autres fichiers qui proviennent de la distribution sont appelés
+'fichiers upstream'.
+
+USAGE
+    udist cmd [options]
+
+OPTIONS COMMUNES
+    -s .EXT
+        Ajouter une extension à la liste des extensions reconnues comme contenu
+        original modifiable dans la distribution upstream. Par défaut, les
+        extensions suivantes sont reconnues:
+            .udist .origine .default
+        Cette option peut être utilisée autant de fois que nécessaire.
+    --clear-origexts
+        Supprimer la liste par défaut des extensions origines. Cette option doit
+        être spécifiée avant l'option -s pour construire une nouvelle liste.
+        La liste des extensions ne doit pas être vide. Si c'est le cas, elle est
+        modifiée pour contenir l'unique élément (.udist)
+    -d WORKDIR
+        Spécifier le répertoire de travail. Par défaut, la racine du répertoire
+        de travail est cherchée à partir du répertoire courant.
+    --help
+        Afficher l'aide détaillée de la commande spécifiée
+
+COMMANDES
+    init [WORKDIR [ARCHIVE]]
+        Initialiser un répertoire de travail pour contenir une distribution
+        upstream
+
+    upstream-new, new SRCDIR|ARCHIVE [WORKDIR]
+        Intégrer une nouvelle distribution upstream.
+        Les nouveaux fichiers sont copiés tout de suite dans le répertoire de
+        travail. Par contre, les modifications ne sont intégrées qu'avec la
+        commande patch
+    upstream-clear, clear [WORKDIR]
+        Supprimer tous les fichiers non modifiés de l'upstream.
+
+    local-create, create FILE
+        Créer et/ou identifier FILE comme une modification locale par rapport à
+        l'upstream.
+    local-edit, edit FILE
+        S'assurer que local-create a été exécuté si nécessaire pour FILE, puis
+        l'éditer avec vim
+
+    local-copy, cp SRCFILE DESTFILE
+    local-move, mv SRCFILE DESTFILE
+    local-remove, rm FILE
+        Frontend pour respectivement cp, mv et rm. Ces commandes agissent aussi
+        sur les fichiers orig et de tag.
+
+    local-tag, tag FILE TAG
+        Faire une copie du fichier local avec le tag spécifié. Si le fichier de
+        tag existe déjà, il est écrasé.
+    local-switch, switch TAG FILE
+        Sélectionner la copie avec le tag spécifié.
+
+    local-put, put [WORKDIR] DESTDIR
+        Copier tous les fichiers locaux dans DESTDIR, par exemple pour faire une
+        sauvegarde. Si DESTDIR n'est pas spécifié, prendre la valeur de
+        l'origine, affichée par local-list
+    local-get, get [-l|-s] SRCDIR [WORKDIR]
+        Opération inverse de local-put: intégrer tous les fichiers de SRCDIR
+        comme fichiers locaux. Si SRCDIR n'est pas spécifié, prendre la valeur
+        de l'origine, affichée par local-list
+    local-list, list [WORKDIR]
+        Lister tous les fichiers locaux. Les fichiers pour lesquels il faut
+        intégrer une modification de l'upstream avec la commande local-patch
+        sont identifiés visuellement.
+
+    upstream-diff, udiff [FILE]
+        Après intégration d'une nouvelle distribution upstream, afficher les
+        modifications entre la nouvelle distribution upstream et l'ancienne pour
+        tous les fichiers modifiables
+    local-diff, ldiff [FILE]
+        Afficher les modifications locales par rapport à l'upstream pour le(s)
+        fichier(s) spécifié(s).
+    local-patch, lpatch [FILE]
+        Après intégration d'une nouvelle distribution upstream, appliquer au(x)
+        le(s) fichier(s) spécifié(s) les modifications disponibles affichées par
+        upstream-diff.
+    local-forget, lforget [FILE]
+        Après intégration d'une nouvelle distribution upstream, oublier les
+        modifications disponibles pour le(s) fichier(s) spécifié(s).
+}}}
+
+
+
{{{
+uenv: Mettre à jour la configuration de l'environnement
+
+USAGE
+    uenv [-u [projdirs...]]
+
+Cette commande met à jour l'ordre de chargement des fichiers de configuration
+dans ~/etc/{profile.d,bashrc.d}. Elle est donc utile si ces fichiers ont été
+modifiés manuellement, ou si un fichier a été ajouté manuellement.
+
+OPTIONS
+    HOME=/path/to/homedir
+        Spécifier le chemin vers ~
+        Cette option doit être placée avant les valeurs projdirs.
+    -u, --update
+        Installer ou mettre à jour les fichiers de profil des projets spécifiés:
+        Les fichiers ~/.profile, ~/.bash_profile et ~/.bashrc sont vérifiés et
+        corriger automatiquement pour inclure les fichiers de nutools.
+        Ensuite, les fichiers de profil sont copié dans les répertoires
+        ~/etc/{profile.d,bashrc.d,default}
+        Les projets spécifiés *doivent* être configurés avec uinst -C, et
+        définir la valeur install_profiles=true dans leur fichier .udir
+        Si aucun projet n'est spécifié, prendre les fichiers de profil de
+        nutools.
+    -l, --local-profiles
+        Avec l'option -u, installer les profils locaux comme tels. Pour les
+        fichiers de profil qui sont indiqués comme non partagés, les copier dans
+        des répertoires spécifiques de la forme {profile,bashrc}.HOSTNAME.d et
+        default.HOSTNAME
+    -s, --shared-profiles
+        Installer les profils locaux comme des profils partagés. C'est l'option
+        par défaut.
+}}}
+
+
+
{{{
+ufixmod: forcer le mode d'une liste de fichiers
+
+USAGE
+    ufixmod [options] [dirs|files....]
+
+Le mode forcé pour les répertoires est rwxr-xr-x
+Le mode forcé pour les fichiers est rw-r--r--
+
+OPTIONS
+    -x, --executable
+        Forcer le mode rwX-r-Xr-X pour les fichiers
+}}}
+
+
+
{{{
+ugenpass: générer un mot de passe au hasard
+
+USAGE
+    ugenpass [options]
+
+OPTIONS
+    -l, --len LEN
+        Spécifier le nombre de caractères du mot de passe généré
+    -U, --upper COUNT
+    -L, --lower COUNT
+    -A, --alpha COUNT
+    -N, --number COUNT
+    -S, --symbol COUNT
+    -B, --special COUNT
+        Spécifier le nombre minimum de chaque classe de caractère
+}}}
+
+
+
{{{
+uinc.py: Plier/déplier des inclusions dans un fichier
+
+USAGE
+    uinc.py [[options] dest...]
+
+OPTIONS
+    -f  Plier les inclusions
+    -u  Déplier les inclusions (par défaut)
+    -@  Forcer le caractère '@' pour le pliage/dépliage
+    -*  Forcer le caractère '*' pour le pliage/dépliage
+    --auto
+        Activer la recherche automatique de paramètres (par défaut)
+    --noauto
+        Désactiver la recherche automatique de paramètres
+    -I SPEC
+        Spécifier des fichiers à inclure dans les répertoires spécifiés
+    -X SPEC
+        Spécifier des fichiers à exclure dans les répertoires spécifiés
+    --refdir REFDIR
+        Spécifier le répertoire de référence. Soit un répertoire DEST spécifié
+        dans les arguments. Si un fichier à inclure *n'est pas* un fils du
+        répertoire DEST, l'emplacement effectif du fichier est calculé en
+        faisant comme si DEST==REFDIR.
+        Par exemple, soit DEST=/dest/path et REFDIR=/refdir/path. Si le fichier
+        /dest/path/file inclue le fichier ../inc, alors c'est le fichier
+        /refdir/inc qui est considéré.
+        Ceci permet de traiter les inclusions dans une copie temporaire d'un
+        répertoire, dans le cas où les fichier font référence à d'autres
+        fichiers situés relativement à l'emplacement original.
+
+Les spécifications de fichiers sont de types glob: ils peuvent contenir les
+wildcards * et ?. Ils supportent en plus la chaine '**' qui signifie n'importe
+quelle profondeur de répertoire. 'dir/' est équivalent à 'dir/**' et signifie
+tous les fichiers situés dans l'arborescence à partir de dir.
+
+La variable UINCPATH contient une liste de répertoires qui sont consultés pour
+trouver les fichiers à inclure.
+}}}
+
+
+
{{{
+uinc.py: Plier/déplier des inclusions dans un fichier
+
+USAGE
+    uinc.py [[options] dest...]
+
+OPTIONS
+    -f  Plier les inclusions
+    -u  Déplier les inclusions (par défaut)
+    -@  Forcer le caractère '@' pour le pliage/dépliage
+    -*  Forcer le caractère '*' pour le pliage/dépliage
+    --auto
+        Activer la recherche automatique de paramètres (par défaut)
+    --noauto
+        Désactiver la recherche automatique de paramètres
+    -I SPEC
+        Spécifier des fichiers à inclure dans les répertoires spécifiés
+    -X SPEC
+        Spécifier des fichiers à exclure dans les répertoires spécifiés
+    --refdir REFDIR
+        Spécifier le répertoire de référence. Soit un répertoire DEST spécifié
+        dans les arguments. Si un fichier à inclure *n'est pas* un fils du
+        répertoire DEST, l'emplacement effectif du fichier est calculé en
+        faisant comme si DEST==REFDIR.
+        Par exemple, soit DEST=/dest/path et REFDIR=/refdir/path. Si le fichier
+        /dest/path/file inclue le fichier ../inc, alors c'est le fichier
+        /refdir/inc qui est considéré.
+        Ceci permet de traiter les inclusions dans une copie temporaire d'un
+        répertoire, dans le cas où les fichier font référence à d'autres
+        fichiers situés relativement à l'emplacement original.
+
+Les spécifications de fichiers sont de types glob: ils peuvent contenir les
+wildcards * et ?. Ils supportent en plus la chaine '**' qui signifie n'importe
+quelle profondeur de répertoire. 'dir/' est équivalent à 'dir/**' et signifie
+tous les fichiers situés dans l'arborescence à partir de dir.
+
+La variable UINCPATH contient une liste de répertoires qui sont consultés pour
+trouver les fichiers à inclure.
+}}}
+
+
+
{{{
+uinst.sh: Déployer en local un fichier, une archive, ou un répertoire
+
+USAGE
+    uinst.sh [options] <file|archive|dir>
+
+OPTIONS
+    var=value
+        Spécifier la valeur d'une variable ou d'un préfixe, plutôt que de
+        laisser uprefix l'autodétecter. Utiliser 'uprefix -l' pour avoir une
+        liste de préfixes valides. Utiliser 'udir --help-vars' pour avoir une
+        liste de variables valides pour uinst.sh.
+    -d /path/to/destdir
+        Spécifier le répertoire destination, exactement comme si la valeur
+        destdir avait été spécifiée, i.e destdir="/path/to/destdir"
+    -h, --host [user@]host
+        Avec la méthode de déploiement uinst:rsync, permettre de spécifier un
+        hôte différent. Cette option est ignorée pour les autres méthodes de
+        déploiement. Si host vaut localhost, un déploiement local avec ssh est
+        effectué. Si host vaut '.', un déploiement local *sans passer par ssh*
+        est effectué, comme si seul le chemin avait été spécifié.
+        Cette option initialise la valeur destdir_override_userhost
+    -S, --ssh ssh
+        Avec la méthode de déploiement uinst:rsync, spécifier le programme à
+        utiliser pour la connection par ssh. Cette option initialise la valeur
+        destdir_ssh
+    --force-remote
+        Avec la méthode de déploiement uinst:rsync, si un hôte est spécifié dans
+        la valeur de destdir, forcer le déploiement distant avec ssh+rsync, même
+        si l'hôte et l'utilisateur correspondent aux valeurs courantes. Cette
+        option initialise la valeur destdir_force_remote
+    -a, --auto
+        Si la source n'est pas spécifiée, déterminer le répertoire à déployer
+        automatiquement (c'est la valeur par défaut)
+    --no-auto
+        Ne pas déterminer automatiquement le répertoire à déployer.
+    --prefix
+        Corriger les chemins srcdir et destdir qui commencent par des préfixes
+        valides (c'est la valeur par défaut). Utiliser 'uprefix -l' pour avoir
+        une liste de préfixes valides
+    --no-prefix
+        Ne jamais corriger un chemin.
+    --include-vcs
+        Inclure les fichiers de VCS dans les fichiers copiés. Par défaut, les
+        fichiers de VCS sont exclus.
+    -l, --local-profiles
+        Installer les profils locaux comme tels
+    --shared-profiles
+        Installer les profils locaux comme des profils partagés. C'est la valeur
+        par défaut pour compatibilité.
+    -C  Configurer un répertoire pour le déploiement avec uinst
+        Ajouter l'option --force pour forcer la reconfiguration
+}}}
+
+
+
{{{
+uinst: Déployer en local un fichier, une archive, ou un répertoire
+
+USAGE
+    uinst [options] <file|archive|dir>
+
+OPTIONS
+    var=value
+        Spécifier la valeur d'une variable ou d'un préfixe, plutôt que de
+        laisser uprefix l'autodétecter. Utiliser 'uprefix -l' pour avoir une
+        liste de préfixes valides. Utiliser 'udir --help-vars' pour avoir une
+        liste de variables valides pour uinst.
+    -d /path/to/destdir
+        Spécifier le répertoire destination, exactement comme si la valeur
+        destdir avait été spécifiée, i.e destdir="/path/to/destdir"
+    -h, --host [user@]host
+        Avec la méthode de déploiement uinst:rsync, permettre de spécifier un
+        hôte différent. Cette option est ignorée pour les autres méthodes de
+        déploiement. Si host vaut localhost, un déploiement local avec ssh est
+        effectué. Si host vaut '.', un déploiement local *sans passer par ssh*
+        est effectué, comme si seul le chemin avait été spécifié.
+        Cette option initialise la valeur destdir_override_userhost
+    -S, --ssh ssh
+        Avec la méthode de déploiement uinst:rsync, spécifier le programme à
+        utiliser pour la connection par ssh. Cette option initialise la valeur
+        destdir_ssh
+    --force-remote
+        Avec la méthode de déploiement uinst:rsync, si un hôte est spécifié dans
+        la valeur de destdir, forcer le déploiement distant avec ssh+rsync, même
+        si l'hôte et l'utilisateur correspondent aux valeurs courantes. Cette
+        option initialise la valeur destdir_force_remote
+    -a, --auto
+        Si la source n'est pas spécifiée, déterminer le répertoire à déployer
+        automatiquement (c'est la valeur par défaut)
+    --no-auto
+        Ne pas déterminer automatiquement le répertoire à déployer.
+    --prefix
+        Corriger les chemins srcdir et destdir qui commencent par des préfixes
+        valides (c'est la valeur par défaut). Utiliser 'uprefix -l' pour avoir
+        une liste de préfixes valides
+    --no-prefix
+        Ne jamais corriger un chemin.
+    --include-vcs
+        Inclure les fichiers de VCS dans les fichiers copiés. Par défaut, les
+        fichiers de VCS sont exclus.
+    -l, --local-profiles
+        Installer les profils locaux comme tels
+    --shared-profiles
+        Installer les profils locaux comme des profils partagés. C'est la valeur
+        par défaut pour compatibilité.
+    -C  Configurer un répertoire pour le déploiement avec uinst
+        Ajouter l'option --force pour forcer la reconfiguration
+}}}
+
+
+
{{{
+ujava: Lancer un script après avoir sélectionné une version de java
+
+USAGE
+    ujava [options] version [args...]
+
+OPTIONS
+    -b, --bits 32|64|auto
+    --32
+    --64
+        Sélectionner une version 32 ou 64 bits de java
+    -e, --exact
+        Sélectionner la version *exacte* de java demandée, au lieu de la version
+        minimum correspondant à la version demandée.
+        Si la version requise de java n'est pas trouvée, retourner avec le code
+        d'erreur 254.
+
+La version de java attendue peut-être exprimée de l'une des façons suivantes:
+1.4 1.4+ 1.5 1.5+ 1.6 1.6+ 1.7 1.7+
+Si args n'est pas spécifié, un shell est lancé dans lequel les variables
+JAVA_HOME, JAVA, JAVAC et PATH sont mis à jour.
+}}}
+
+
+
{{{
+uldap: Shell pour accéder à un serveur ldap
+
+USAGE
+    uldap [options]
+
+OPTIONS
+    -C profile
+        Sélectionner un profil de connexion. Par défaut, si l'option -H n'est
+        pas spécifiée, le premier profil est sélectionné.
+    -x  Ne pas tenter de faire une connexion sur le profil par défaut si aucun
+        profil n'est sélectionné.
+    -f script
+        Lire les commandes depuis le script spécifié.
+    -n  Avec un script donné en ligne de commande ou lu depuis un fichier, ne pas
+        ajouter automatiquement la commande print à la fin
+    -i  Si un script est spécifié, passer en mode interactif après l'exécution
+        du script.
+    -e  Forcer l'arrêt du script si une erreur se produit. C'est l'option par
+        défaut pour un script spécifié avec -f.
+    -l input.ldif
+        Charger le fichier input.ldif comme espace de travail initial
+    -H ldapuri
+    -D binddn
+    -w password
+    -b searchbase
+    -v var=value
+
+COMMANDES
+    $ cmd
+        Passer directement une commande au shell.
+    set [options] [var=value...]
+        Changer des options ou des variables. set sans argument affiche la liste
+        des variables définies.
+    [set] plain
+        Passer en mode 'plain': indiquer que l'espace de travail contient des
+        données brutes. Les pré-traitements et post-traitements (uncut_on_load,
+        decode_on_load, encode_on_save, cut_on_save) ne sont pas appliqués sur
+        cet espace de travail
+    [set] ldif
+        Passer en mode 'ldif': indiquer que l'espace de travail contient des
+        données ldif. Les pré-traitements et post-traitements sont appliqués
+        normalement sur cet espace de travail
+    [set] append
+        Pour certaines opérations, spécifier si le résultat de la *prochaine*
+        opération remplace le contenu de l'espace de travail courant (par
+        défaut), ou si le résultat est ajouté à la fin.
+    last
+        Afficher en mode édition la dernière commande. Cette commande n'est
+        fonctionnelle qu'avec une version de bash >=4.x
+    profile name
+        Choisir le profil 'name'. Equivalent à 'set profile=name'. Sans
+        argument, afficher la liste des profils valides.
+    auth anonymous|binddn [password]
+        Spécifier le compte à utiliser pour se connecter. Equivalent à
+        'set binddn=binddn; set password=password'
+    clear [-k]
+        Vider l'espace de travail et passer en mode 'plain'.
+        Avec l'option -k, supprimer aussi tout l'historique d'annulation.
+    load [-k] input
+        Charger un fichier dans l'espace de travail. Si l'extension du fichier
+        est .ldif, passer en mode 'ldif'
+        En mode append, rajouter le contenu du fichier à l'espace de travail,
+        puis repasser en mode replace.
+        Le code de retour est 0 si le fichier a été chargé, 1 sinon.
+    save [-a] output
+        Sauvegarder l'espace de travail dans un fichier.
+        Avec l'option -a, rajouter au fichier au lieu de l'écraser
+    print
+        Afficher l'espace de travail
+    alias a=rdn...
+        Définir un alias pour la commande cd. 'a' est l'alias, 'rdn' est le dn
+        correspondant, exprimé par rapport à $suffix. Sans argument, afficher
+        la liste des aliases définis.
+    cd rdn
+        Changer searchbase. Par défaut, il s'agit d'un rdn relatif à $searchbase
+        - Certains aliases sont supportés: .. pour l'objet parent, ~ pour
+          $suffix, / pour la racine. 'cd' sans argument équivaut à 'cd ~'
+        - Si le dn commence par '~/', il s'agit d'un rdn relatif à $suffix.
+        - Si le dn commence par /, searchbase reçoit la valeur rdn sans
+          modifications (sauf bien sûr enlever le '/' de tête si nécessaire). Il
+          faut alors que ce soit un dn absolu.
+    ls [-b searchbase] [filter [attrs...]]
+    search [-b searchbase] [filter [attrs...]]
+        Utiliser ldapsearch pour faire la recherche, et copier le résultat dans
+        l'espace de travail. 'ls' est équivalent à 'search -s one'. Si ce n'est
+        pas déjà le cas, passer en mode 'ldif'.
+        L'option -b prend une valeur avec la même syntaxe que la commande cd,
+        sauf que les alias ne sont pas supportés. En particulier, la valeur est
+        relative au $searchbase courant. Pour faire une recherche par rapport à
+        $suffix, il faut utiliser la syntaxe ~/searchbase.
+        En mode append, rajouter le résultat de la recherche à l'espace de
+        travail, puis repasser en mode replace.
+        Le code de retour est 1 si aucun enregistrement n'a été trouvé, sinon
+        le code de retour est celui de la commande ldapsearch.
+    cut Couper les lignes trop longues. Cette action est en principe effectuée
+        automatiquement lors de la sauvegarde. Il n'est pas conseillé
+        d'appliquer des méthodes de transformation après avoir utilisé cette
+        action.
+    uncut
+        Fusionner les lignes coupées. Cette action est en principe effectuée
+        automatiquement lors du chargement ou après la recherche.
+    encode [attrs...]
+        Encoder en base64 les valeurs des attributs mentionnés.
+    decode [attrs...]
+        Décoder les valeurs des attributs mentionnés si nécessaire (c'est à dire
+        s'ils sont encodés en base64)
+    keepattr attrs...
+        Garder uniquement les lignes des attributs mentionnés. Ensuite,
+        supprimer les objets ayant uniquement la ligne dn: (en d'autres termes,
+        keepattr sans argument supprime *tout* l'espace de travail)
+    keepval attr patterns...
+        Pour l'attribut attr, garder uniquement les lignes pour lesquelles les
+        valeurs correspondent aux expressions régulières. Les autres attributs
+        ne sont pas modifiés. Ensuite, supprimer les objets ayant uniquement la
+        ligne dn:
+    exclude attrs...
+        Supprimer les lignes des attributs mentionnés. Ensuite, supprimer les
+        objets ayant uniquement la ligne dn:
+    excludeval attr patterns...
+        Pour l'attribut attr, supprimer les lignes pour lesquelles les
+        valeurs correspondent aux expressions régulières. Les autres attributs
+        ne sont pas modifiés. Ensuite, supprimer les objets ayant uniquement la
+        ligne dn:
+    keepvalentry attr patterns...
+        Pour l'attribut attr, vérifier si *au moins une* valeur correspond à
+        l'une des expressions régulières. Si c'est le cas, garder l'entrée
+        entière, sinon supprimer l'entrée.
+    excludevalentry attr patterns...
+        Pour l'attribut attr, vérifier si *aucune* des valeurs ne correspond à
+        l'une des expressions régulières. Si c'est le cas, garder l'entrée
+        entière, sinon supprimer l'entrée.
+    setval attr values...
+        Remplacer toutes les valeurs de l'attribut attr par les valeurs
+        spécifiées.
+    addval attr values...
+        Ajouter un nouvel attribut avec les valeurs spécifiées. Si l'attribut
+        existe déjà, les nouvelles valeurs sont ajoutées à la fin.
+    sed args
+        Modifier l'espace de travail avec le résultat de la commande sed.
+        note: aucun argument n'est filtré, mais il ne faut pas utiliser les
+        options de sed qui provoquent la modification en place du fichier,
+        comme par exemple l'option -i
+    awk args
+        Modifier l'espace de travail avec le résultat de la commande awk.
+    grep args
+        Modifier l'espace de travail avec le résultat de la commande grep.
+    format [options] attrs...
+        Formater l'espace de travail en données tabulaires, et passer en mode
+        'plain'.
+        --show-headers
+            Afficher les en-têtes
+        -F FSEP
+            Spécifier le séparateur pour les attributs. Par défaut, il s'agit du
+            caractère de tabulation.
+        -R VSEP
+            Spécifier le séparateur pour les valeurs des attributs. Par défaut, il
+            s'agit du point-virgule ';'
+        -e  Retourner les valeurs comme des variables shell. Les options -F et -R
+            sont ignorées. Les attributs multivalués sont écrits sous forme de
+            tableaux. Par exemple:
+                attributes=('mail' 'givenName')
+                index=0
+                mail='user@domain.fr'
+                givenName=('peter' 'gabriel')
+        --bc
+            Dans le mode -e, spécifier une commande à insérer avant le premier
+            enregistrement. Quand cette commande est lancée, index==-1
+        -c  Dans le mode -e, spécifier une commande à insérer après chaque
+            enregistrement
+        --ec
+            Dans le mode -e, spécifier une commande à insérer après le dernier
+            enregistrement
+    sort [args]
+        Modifier l'espace de travail avec le résultat de la commande sort.
+    edit
+        Lancer un éditeur pour modifier l'espace de travail.
+    diff [options]
+        Afficher les différences entre l'espace de travail et la version
+        précédente
+    ifok cmd
+    iferror cmd
+        Si le dernier code de retour est 0 (resp. !=0), lancer la commande cmd
+    skip n
+        Sauter les n prochaines commandes. A utiliser avec ifok et iferror
+    undo
+        Annuler la dernière modification effectuée sur l'espace de travail
+
+Les directives suivantes prennent le contenu de l'espace de travail, et le
+transforment en une suite de commandes de modifications pour ldapmodify:
+
+    A   Créer un objet de toutes pièces avec les attributs donnés et leurs
+        valeurs.
+    a   Ajouter les valeurs spécifiée à l'attribut
+    r   Remplacer les valeurs de l'attribut par celles spécifiées
+    d   Supprimer les valeurs spécifiées de l'attribut
+    D   Supprimer l'attribut
+    delentry
+        Supprimer l'objet
+    ldapmodify
+        Utiliser ldapmodify pour modifier les objets sur le serveur. Il faut
+        utiliser au préalable l'une des méthodes de transformation parmi A, a,
+        r, d, D, delentry.
+        Le code de retour est celui de la commande ldapmodify.
+    ldapadd
+        Utiliser ldapadd pour créer les objets situés dans l'espace de travail.
+        Le code de retour est celui de la commande ldapadd.
+    ldapdelete
+        Utiliser ldapdelete pour supprimer la liste des dns situés dans l'espace
+        de travail.
+        Le code de retour est celui de la commande ldapdelete.
+
+Notes:
+- les expressions régulières sont celles reconnues par awk.
+- pour spécifier plusieurs actions sur une même ligne, les séparer par //
+- le code de retour est 0 si ok, 255 si une erreur s'est produite (erreur de
+  syntaxe, de connexion, de lecture/écriture de fichier, etc.). sinon, les
+  opérations ldap{search,modify,delete,add} ont leur code de retour respectifs
+}}}
+
+
+
!Liste des librairies de ulib
+* [[ulib/apache]]
+* [[ulib/apache.tools]]
+* [[ulib/auto]]
+* [[ulib/awk]]
+* [[ulib/base]]
+* [[ulib/base.args]]
+* [[ulib/base.array]]
+* [[ulib/base.bool]]
+* [[ulib/base.compat]]
+* [[ulib/base.core]]
+* [[ulib/base.init]]
+* [[ulib/base.num]]
+* [[ulib/base.quote]]
+* [[ulib/base.split]]
+* [[ulib/base.string]]
+* [[ulib/base.tools]]
+* [[ulib/base.ulib]]
+* [[ulib/bash]]
+* [[ulib/cgi]]
+* [[ulib/cgisupport]]
+* [[ulib/compat]]
+* [[ulib/conf]]
+* [[ulib/crontab]]
+* [[ulib/debian]]
+* [[ulib/DEFAULTS]]
+* [[ulib/install]]
+* [[ulib/ipcalc]]
+* [[ulib/java]]
+* [[ulib/javaproperties]]
+* [[ulib/json]]
+* [[ulib/ldap]]
+* [[ulib/ldif]]
+* [[ulib/legacy]]
+* [[ulib/macosx]]
+* [[ulib/mkcrypt]]
+* [[ulib/modeline]]
+* [[ulib/network-manager-service]]
+* [[ulib/password]]
+* [[ulib/prefixes]]
+* [[ulib/PREFIXES-DEFAULTS]]
+* [[ulib/pretty]]
+* [[ulib/ptools]]
+* [[ulib/redhat]]
+* [[ulib/runs]]
+* [[ulib/runsmod]]
+* [[ulib/runsmod.defaults]]
+* [[ulib/semver]]
+* [[ulib/service]]
+* [[ulib/sysinfos]]
+* [[ulib/template]]
+* [[ulib/tiddlywiki]]
+* [[ulib/udir]]
+* [[ulib/uenv]]
+* [[ulib/uenv_update]]
+* [[ulib/uinc]]
+* [[ulib/uinst]]
+* [[ulib/ulib]]
+* [[ulib/ulibsh]]
+* [[ulib/vcs]]
+* [[ulib/virsh]]
+* [[ulib/webobjects]]
+* [[ulib/woinst]]
+* [[ulib/wondermonitor]]
+* [[ulib/wosign]]
+* [[ulib/wotaskd]]
+
+
+

+
+
+
!! {{{compute_all_prefixes}}}
+!! {{{recompute_all_prefixes}}}
+
+
+
!! {{{apache_resolvecert}}}
+{{{
+Calculer l'emplacement des certificats correspondant aux arguments $1 et
+$2 (qui correspondent aux options --conf et --dir de apache_addcert()),
+puis initialiser les variables $3(=cert), $4(=key) et $5(=ca)
+}}}
+!! {{{apache_addcert}}}
+!! {{{apache_autoconf}}}
+!! {{{apache_autoconf_localhosts}}}
+
+
+
!! {{{get_default_apachebin_prefix}}}
+!! {{{get_default_apacheversion_prefix}}}
+!! {{{get_default_apachectl_prefix}}}
+!! {{{get_default_apachelogdir_prefix}}}
+!! {{{get_default_apachesslcertsdir_prefix}}}
+!! {{{get_default_apachesslkeysdir_prefix}}}
+!! {{{get_default_apacheconfdir_prefix}}}
+!! {{{get_default_apacheconf_prefix}}}
+!! {{{get_default_apacheavsitesdir_prefix}}}
+!! {{{get_default_apachesitesdir_prefix}}}
+!! {{{get_default_htdocsdir_prefix}}}
+!! {{{get_default_cgibindir_prefix}}}
+!! {{{compute_apache_prefixes}}}
+!! {{{recompute_apache_prefixes}}}
+!! {{{get_APACHEBIN_prefix}}}
+!! {{{get_APACHEVERSION_prefix}}}
+!! {{{get_APACHECTL_prefix}}}
+!! {{{get_APACHELOGDIR_prefix}}}
+!! {{{get_APACHESSLCERTSDIR_prefix}}}
+!! {{{get_APACHESSLKEYSDIR_prefix}}}
+!! {{{get_APACHECONFDIR_prefix}}}
+!! {{{get_APACHECONF_prefix}}}
+!! {{{get_APACHEAVSITESDIR_prefix}}}
+!! {{{get_APACHESITESDIR_prefix}}}
+!! {{{get_HTDOCSDIR_prefix}}}
+!! {{{get_CGIBINDIR_prefix}}}
+
+
+

+
+
+
!! {{{parseheaders}}}
+!! {{{printheaders}}}
+!! {{{resetheaders}}}
+!! {{{copyall}}}
+!! {{{lawkcsv}}}
+!! {{{cawkcsv}}}
+!! {{{awkcsv}}}
+!! {{{lgrepcsv}}}
+!! {{{cgrepcsv}}}
+!! {{{grepcsv}}}
+!! {{{lawkfsv2csv}}}
+!! {{{cawkfsv2csv}}}
+!! {{{awkfsv2csv}}}
+!! {{{lmergecsv}}}
+{{{
+Fusionner sur la sortie standard les deux fichiers csv $1 et $2. La clé du
+fichier $1 est spécifiée par l'option --lkey et vaut 1 par défaut. La clé
+du fichier $2 est spécifiée par l'option --rkey et vaut 1 par défaut. Les
+valeurs des clés ne doivent pas faire plus de 64 caractères de long.
+}}}
+!! {{{readleft}}}
+!! {{{readright}}}
+!! {{{right2left}}}
+!! {{{cmergecsv}}}
+!! {{{mergecsv}}}
+!! {{{lsortcsv}}}
+{{{
+Trier le fichier csv $1. La clé du tri est spécifiée par l'option -k et
+vaut 1 par défaut. Les valeurs des clés ne doivent pas faire plus de 64
+caractères de long.
+}}}
+!! {{{csortcsv}}}
+!! {{{sortcsv}}}
+!! {{{ldumpcsv}}}
+!! {{{cdumpcsv}}}
+!! {{{dumpcsv}}}
+!! {{{lprintcsv}}}
+!! {{{cprintcsv}}}
+!! {{{printcsv}}}
+
+
+
!! {{{parse_opts}}}
+{{{
+Analyser des arguments. Cette fonction doit être appelée avec une description
+des options à analyser, suivie des arguments proprement dits. En fonction des
+options rencontrées, certaines variables sont mises à jour.
+Les arguments de cette fonction sont donc de la forme 'optdescs -- args'
+}}}
+!! {{{parse_args_check}}}
+{{{
+Simplifier l'utilisation de parse_opts(). En entrée, le tableau args doit être
+initialisé avec la liste des options. En sortie, ce tableau contient la liste
+des arguments restant sur la ligne de commande. En cas d'erreur, retourner 1.
+Exemple d'utilisation:
+args=(...)
+parse_args_check "$@" || return; set -- "${args[@]}"
+}}}
+!! {{{parse_args}}}
+{{{
+Simplifier l'utilisation de parse_opts(). En entrée, le tableau args doit être
+initialisé avec la liste des options. En sortie, ce tableau contient la liste
+des arguments restant sur la ligne de commande. En cas d'erreur, quitter le
+script avec die()
+Exemple d'utilisation:
+args=(...)
+parse_args_check "$@"; set -- "${args[@]}"
+}}}
+!! {{{genparse}}}
+{{{
+Afficher une ligne de commande à évaluer pour simplifier l'utilisation de
+parse_opts(). Une fonction display_help() par défaut est définie et les
+options appropriées de parse_opts sont utilisées pour reconnaître les options
+spécifiées par les arguments.
+Cette fonction peut être utilisée de cette manière:
+HELP_DESC=...
+HELP_ARG_DESC=... # pour chaque arg
+eval "$(genparse [args...])"
+D'autres variables peuvent être définies: HELP_USAGE, HELP_OPTIONS,
+HELP_ARG_OPTION. Consulter le source pour connaitre leur utilisation
+Les arguments de cette fonction sont de la forme 'sansarg' pour une option
+simple qui ne prend pas d'argument ou 'avecarg=[default-value]' pour une
+option qui prend un argument. Les options générées sont des options
+longues. En l'occurence, les options générées sont respectivement '--sansarg'
+et '--avecarg:'
+Les variables et les options sont toujours en minuscule. Pour les variables,
+le caractère '-' est remplacé par '_'. Si une option contient une lettre en
+majuscule, l'option courte correspondante à cette lettre sera aussi reconnue.
+Par exemple, la commande suivante:
+genparse Force enCoding=utf-8 input= long-Option=
+affichera ceci:
+function display_help() {
+[ -n "$HELP_USAGE" ] || HELP_USAGE="USAGE
+$scriptname [options]"
+[ -n "$HELP_OPTIONS" ] || HELP_OPTIONS="OPTIONS
+${HELP_FORCE_OPTION:-    -f, --force${HELP_FORCE_DESC:+
+$HELP_FORCE_DESC}}
+}}}
+
+
+

+
+
+
!! {{{is_yes}}}
+{{{
+retourner vrai si $1 est une valeur "oui"
+}}}
+!! {{{is_no}}}
+{{{
+retourner vrai si $1 est une valeur "non"
+}}}
+!! {{{yesval}}}
+{{{
+normaliser une valeur vraie: si $1 est une valeur "oui", afficher 1, sinon
+afficher une chaine vide
+}}}
+!! {{{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
+valeur ""
+note: en principe, la syntaxe est 'setb var cmd args...'. cependant, la
+syntaxe 'setb var=cmd args...' est supportée aussi
+}}}
+!! {{{evalb}}}
+{{{
+Lancer la commande $@ avec evalx() en supprimant la sortie standard. Si la
+commande retourne vrai, afficher 1. Sinon, afficher ""
+}}}
+!! {{{setxb}}}
+{{{
+équivalent à setx $1 evalb $2..@
+}}}
+
+
+
!! {{{setx2}}}
+!! {{{rawecho}}}
+!! {{{rawecho_}}}
+!! {{{quote_arg}}}
+!! {{{quoted_arg}}}
+!! {{{quoted_args}}}
+!! {{{set_var}}}
+!! {{{set_var_cmd}}}
+!! {{{set_var_literal}}}
+!! {{{quote_awk}}}
+!! {{{quoted_awk}}}
+!! {{{quote_seds}}}
+!! {{{quote_form}}}
+!! {{{quoted_form}}}
+
+
+
!! {{{echo_}}}
+{{{
+afficher la valeur $* sans passer à la ligne
+}}}
+!! {{{recho}}}
+{{{
+afficher une valeur brute. contrairement à la commande echo, ne reconnaitre
+aucune option (i.e. -e, -E, -n ne sont pas signifiants)
+}}}
+!! {{{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)
+}}}
+!! {{{should_quote}}}
+{{{
+Tester si la chaine $* doit être mise entre quotes
+}}}
+!! {{{qval}}}
+{{{
+Afficher la chaine $* quotée avec "
+}}}
+!! {{{qvalm}}}
+{{{
+Afficher la chaine $* quotée si nécessaire avec "
+}}}
+!! {{{qvalr}}}
+{{{
+Afficher la chaine $* quotée si nécessaire avec ", sauf si elle est vide
+}}}
+!! {{{qvals}}}
+{{{
+Afficher chaque argument de cette fonction quotée le cas échéant avec "
+Chaque valeur est séparée par un espace.
+}}}
+!! {{{qwc}}}
+{{{
+Dans la chaine $*, remplacer \ par \\, " par \", $ par \$, ` par \`, puis
+quoter la chaine avec ", sauf les wildcards * et ?
+Cela permet de quoter une chaine permettant de glober des fichiers, e.g
+eval "ls $(qwc "$value")"
+Note: la protection de ! n'est pas effectuée, parce que le comportement du
+shell est incohérent entre le shell interactif et les scripts. Pour une
+version plus robuste, il est nécessaire d'utiliser un programme externe tel
+que sed ou awk
+}}}
+!! {{{qlines}}}
+{{{
+Traiter chaque ligne de l'entrée standard pour en faire des chaines quotées
+avec '
+}}}
+!! {{{setv}}}
+{{{
+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
+}}}
+!! {{{echo_setv}}}
+{{{
+Afficher la commande qui serait lancée par setv "$@"
+}}}
+!! {{{setx}}}
+{{{
+syntaxe 1: setx var cmd
+initialiser la variable $1 avec le résultat de la commande "$2..@"
+note: en principe, la syntaxe est 'setx var cmd args...'. cependant, la
+syntaxe 'setx var=cmd args...' est supportée aussi
+syntaxe 2: setx -a array cmd
+initialiser le tableau $1 avec le résultat de la commande "$2..@", chaque
+ligne du résultat étant un élément du tableau
+note: en principe, la syntaxe est 'setx -a array cmd args...'. cependant, la
+syntaxe 'setx -a array=cmd args...' est supportée aussi
+}}}
+!! {{{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)))"
+Retourner le dernier code d'erreur non nul, ou 0 si toutes les commandes se
+sont exécutées sans erreur.
+}}}
+!! {{{setxx}}}
+{{{
+équivalent à setx $1 evalx $2..@
+}}}
+!! {{{evalp}}}
+{{{
+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
+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
+de bash.
+}}}
+!! {{{setxp}}}
+{{{
+équivalent à setx $1 evalp $2..@
+}}}
+!! {{{testx}}}
+{{{
+Faire un test unaire avec la commande [ sur une valeur calculée avec evalx.
+Utiliser la syntaxe 'testx op cmds...' e.g.
+testx -z cmd1 // cmd2
+}}}
+!! {{{test2x}}}
+{{{
+Faire une test binaire avec la commande [ entre une valeur spécifiée et une
+valeur calculée avec evalx. Utiliser la syntaxe 'test2x value op cmds...' e.g.
+test2x value == cmd1 // cmd2
+}}}
+!! {{{testrx}}}
+{{{
+Faire une test binaire avec la commande [[ entre une valeur spécifiée et une
+valeur calculée avec evalx. Utiliser la syntaxe 'testrx value op cmds...' e.g.
+testrx value == cmd1 // cmd2
+}}}
+!! {{{testp}}}
+{{{
+Faire un test unaire avec la commande [ sur une valeur calculée avec evalp.
+Utiliser la syntaxe 'testp op cmds...' e.g.
+testp -z cmd1 // cmd2
+}}}
+!! {{{test2p}}}
+{{{
+Faire une test binaire avec la commande [ entre une valeur spécifiée et une
+valeur calculée avec evalp. Utiliser la syntaxe 'test2p value op cmds...' e.g.
+test2p value == cmd1 // cmd2
+}}}
+!! {{{testrp}}}
+{{{
+Faire une test binaire avec la commande [[ entre une valeur spécifiée et une
+valeur calculée avec evalp. Utiliser la syntaxe 'testrp value op cmds...' e.g.
+testrp value == cmd1 // cmd2
+}}}
+!! {{{err2out}}}
+{{{
+lancer la commande $@ en redirigeant la sortie d'erreur sur la sortie standard
+}}}
+
+
+

+
+
+
!! {{{isnum}}}
+{{{
+retourner vrai si $1 est une valeur numérique entière (positive ou négative)
+}}}
+!! {{{ispnum}}}
+{{{
+retourner vrai si $1 est une valeur numérique entière positive
+}}}
+!! {{{isrnum}}}
+{{{
+retourner vrai si $1 est une valeur numérique réelle (positive ou négative)
+le séparateur décimal peut être . ou ,
+}}}
+
+
+
!! {{{qawk}}}
+{{{
+Dans la chaine $*, remplacer \ par \\ et " par \" et afficher la chaine
+entourée de guillemets. Ceci est utile pour quoter des valeur à insérer dans
+un script awk
+}}}
+!! {{{qseds}}}
+{{{
+Quoter la chaine $*, qui doit être utilisée comme chaine de recherche ou de
+remplacement de grep, sed ou awk
+}}}
+!! {{{qform}}}
+{{{
+Dans la chaine $* qui est de la forme "name=value", remplacer dans name et
+dans value '%' par '%25', '+' par '%2B', '&' par '%26', '=' par '%3D', ' ' par
+'+'
+}}}
+
+
+
!! {{{splitfsep}}}
+{{{
+Découper $1 de la forme "first[SEPsecond]" entre first, qui est placé dans la
+variable $3(=first) et second, qui est placée dans la variable $4(=second). $2
+est la valeur SEP. Le découpage est faite sur la *première* occurence de SEP.
+}}}
+!! {{{splitfsep2}}}
+{{{
+Découper $1 de la forme "[firstSEP]second" entre first, qui est placé dans la
+variable $3(=first) et second, qui est placée dans la variable $4(=second). $2
+est la valeur SEP. Le découpage est faite sur la *première* occurence de SEP.
+}}}
+!! {{{splitlsep}}}
+{{{
+Découper $1 de la forme "first[SEPsecond]" entre first, qui est placé dans la
+variable $3(=first) et second, qui est placée dans la variable $4(=second). $2
+est la valeur SEP. Le découpage est faite sur la *dernière* occurence de SEP.
+}}}
+!! {{{splitlsep2}}}
+{{{
+Découper $1 de la forme "[firstSEP]second" entre first, qui est placé dans la
+variable $3(=first) et second, qui est placée dans la variable $4(=second). $2
+est la valeur SEP. Le découpage est faite sur la *dernière* occurence de SEP.
+}}}
+!! {{{splitvar}}}
+{{{
+Découper $1 de la forme name[=value] entre le nom, qui est placé dans la
+variable $2(=name) et la valeur, qui est placée dans la variable $3(=value)
+}}}
+!! {{{splitpath}}}
+{{{
+Découper $1 de la forme [dir/]name entre le répertoire, qui est placé dans la
+variable $2(=dir), et le nom du fichier, qui est placé dans la variable
+$3(=name)
+}}}
+!! {{{splitname}}}
+{{{
+Découper $1 de la forme basename[.ext] entre le nom de base du fichier, qui
+est placé dans la variable $2(=basename) et l'extension, qui est placée dans
+la variable $3(=ext)
+Attention, si $1 est un chemin, le résultat risque d'être faussé. Par exemple,
+'splitname a.b/c' ne donne pas le résultat escompté.
+}}}
+!! {{{splithost}}}
+{{{
+Découper $1 de la forme hostname[.domain] entre le nom d'hôte, qui est placé
+dans la variable $2(=hostname) et le domaine, qui est placée dans la variable
+$3(=domain)
+}}}
+!! {{{splituserhost}}}
+{{{
+Découper $1 de la forme [user@]host entre le nom de l'utilisateur, qui est placé
+dans la variable $2(=user) et le nom d'hôte, qui est placée dans la variable
+$3(=host)
+}}}
+!! {{{splitpair}}}
+{{{
+Découper $1 de la forme first[:second] entre la première valeur, qui est placé
+dans la variable $2(=src) et la deuxième valeur, qui est placée dans la variable
+$3(=dest)
+}}}
+!! {{{splitproxy}}}
+{{{
+Découper $1 de la forme http://[user:password@]host[:port]/ entre les valeurs
+$2(=host), $3(=port), $4(=user), $5(=password)
+}}}
+!! {{{spliturl}}}
+{{{
+Découper $1 de la forme scheme://[user:password@]host[:port]/path entre les
+valeurs $2(=scheme), $3(=user), $4(=password), $5(=host), $6(=port), $7(=path)
+}}}
+
+
+
!! {{{straddp}}}
+{{{
+ajouter le préfixe $1 à $2*
+}}}
+!! {{{strdelp}}}
+{{{
+enlever le préfixe $1 à $2*
+}}}
+!! {{{strdelp2}}}
+{{{
+enlever le préfixe $1 le plus long à $2*
+}}}
+!! {{{stradds}}}
+{{{
+ajouter le suffixe $1 à $2*
+}}}
+!! {{{strdels}}}
+{{{
+enlever le suffixe $1 à $2*
+}}}
+!! {{{strdels2}}}
+{{{
+enlever le suffixe le plus long $1 à $2*
+}}}
+!! {{{strlower}}}
+{{{
+afficher en minuscule la valeur $*
+}}}
+!! {{{strlower1}}}
+{{{
+afficher la valeur $* après avoir converti la première lettre en minuscule
+}}}
+!! {{{strlowers}}}
+{{{
+afficher les valeurs $1..* après avoir converti leur première lettre en
+minuscule
+}}}
+!! {{{strupper}}}
+{{{
+afficher en majuscule la valeur $*
+}}}
+!! {{{strupper1}}}
+{{{
+afficher la valeur $* après avoir converti la première lettre en majuscule
+}}}
+!! {{{struppers}}}
+{{{
+afficher les valeurs $1..* après avoir converti leur première lettre en
+majuscule
+}}}
+!! {{{strmid}}}
+{{{
+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
+par l'un des caractères /, #, % pour indiquer le type de recherche
+}}}
+!! {{{first_char}}}
+{{{
+retourner le premier caractère de la chaine $*
+}}}
+!! {{{last_char}}}
+{{{
+retourner le dernier caractère de la chaine $*
+}}}
+!! {{{first_chars}}}
+{{{
+retourner tous les caractères de la chaine $*, excepté le dernier
+}}}
+!! {{{last_chars}}}
+{{{
+retourner tous les caractères de la chaine $*, excepté le premier
+}}}
+!! {{{first_char_is}}}
+{{{
+Tester si le premier caractère de la chaine $1 est $2
+}}}
+!! {{{last_char_is}}}
+{{{
+Tester si le dernier caractère de la chaine $1 est $2
+}}}
+!! {{{beginswith}}}
+{{{
+Tester si la chaine $1 commence par le wildcard $2
+}}}
+!! {{{endswith}}}
+{{{
+Tester si la chaine $1 se termine par le wildcard $2
+}}}
+
+
+
!! {{{base_umove}}}
+{{{
+Outil de haut niveau pour déplacer un fichier ou un lien. Si c'est un lien qui
+est déplacé, la destination du lien est mise à jour si elle est relative.
+l'option '-d UPDATEDIR' permet de spécifier un répertoire dans lequel tous les
+liens qui pointent vers le fichier déplacé sont mis à jour si le déplacement
+du fichier se fait avec succès.
+}}}
+!! {{{base_udelete}}}
+{{{
+Outil de haut niveau pour supprimer un fichier ou un lien. Si on doit
+supprimer un fichier, et que l'option '-d UPDATEDIR' est spécifiée, et que des
+liens du répertoire UPDATEDIR pointent vers le fichier supprimé, ces liens
+sont supprimés aussi.
+}}}
+!! {{{base_ucopy}}}
+{{{
+Outil de haut niveau pour copier un fichier ou un lien. Si c'est un lien qui
+est copié, la destination du lien est mise à jour si elle est relative.
+}}}
+
+
+
!! {{{setyesval}}}
+{{{
+mettre la valeur normalisée de la valeur "oui" de $2 dans la variable $1
+}}}
+!! {{{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
+}}}
+!! {{{normyesvals}}}
+{{{
+remplacer les valeur des variables $1..* par les valeurs normalisées
+respectives de leur valeur "oui"
+}}}
+!! {{{quote_in}}}
+{{{
+Comme quote_arg pour une chaine lue sur stdin
+}}}
+!! {{{quote_sin}}}
+{{{
+Pour la chaine lue sur stdin, remplacer ' par '\''. Cela permet de protéger une
+chaine à mettre entre quotes
+}}}
+!! {{{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é
+}}}
+!! {{{quoted_sarg}}}
+{{{
+Dans la chaine $1, remplacer ' par '\'', et afficher la chaine entourée de
+quotes
+}}}
+!! {{{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
+}}}
+!! {{{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
+}}}
+!! {{{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
+}}}
+!! {{{array_count}}}
+{{{
+retourner le nombre d'éléments du tableau $1
+}}}
+!! {{{array_isempty}}}
+{{{
+tester si le tableau $1 est vide
+}}}
+!! {{{array_new}}}
+{{{
+créer un tableau vide dont le nom est $1
+}}}
+!! {{{array_add}}}
+{{{
+ajouter les valeurs $2..@ au tableau dont le nom est $1
+}}}
+!! {{{array_ins}}}
+{{{
+insérer les valeurs $2..@ au début du tableau dont le nom est $1
+}}}
+!! {{{array_del}}}
+{{{
+supprimer *les* valeurs $2 du tableau dont le nom est $1
+}}}
+!! {{{array_addu}}}
+{{{
+ajouter la valeur $2 au tableau dont le nom est $1, si la valeur n'y est pas
+déjà. Retourner vrai si la valeur a été ajoutée
+}}}
+!! {{{array_set}}}
+!! {{{array_insu}}}
+{{{
+insérer la valeur $2 au début du tableau tableau dont le nom est $1, si la
+valeur n'y est pas déjà. Retourner vrai si la valeur a été ajoutée.
+}}}
+!! {{{array_fillrange}}}
+{{{
+Initialiser le tableau $1 avec les nombres de $2(=1) à $3(=10) avec un step de $4(=1)
+}}}
+!! {{{array_eq}}}
+{{{
+tester l'égalité des tableaux $1 et $2
+}}}
+!! {{{array_contains}}}
+{{{
+tester si le tableau dont le nom est $1 contient la valeur $2
+}}}
+!! {{{array_icontains}}}
+{{{
+tester si le tableau dont le nom est $1 contient la valeur $2, sans tenir
+compte de la casse
+}}}
+!! {{{array_find}}}
+{{{
+si le tableau $1 contient la valeur $2, retourner l'index de la valeur. Si le
+tableau $3 est spécifié, retourner la valeur à l'index dans ce tableau
+}}}
+!! {{{array_reverse}}}
+{{{
+Inverser l'ordre des élément du tableau $1
+}}}
+!! {{{array_replace}}}
+{{{
+dans le tableau $1, remplacer toutes les occurences de $2 par $3..*
+}}}
+!! {{{array_each}}}
+{{{
+Pour chacune des valeurs 'v' du tableau $1, appeler la fonction $2 avec les
+arguments '$v $3..$n'
+}}}
+!! {{{array_map}}}
+{{{
+Pour chacune des valeurs 'v' du tableau $1, appeler la fonction $2 avec les
+arguments '$v $3..$n', et remplacer la valeur par le résultat de la fonction
+}}}
+!! {{{first_value}}}
+{{{
+retourner la première valeur du tableau $1
+}}}
+!! {{{last_value}}}
+{{{
+retourner la dernière valeur du tableau $1
+}}}
+!! {{{array_copy}}}
+{{{
+copier le contenu du tableau $2 dans le tableau $1
+}}}
+!! {{{array_copy_firsts}}}
+{{{
+copier tous les valeurs du tableau $2(=$1) dans le tableau $1, excepté la dernière
+}}}
+!! {{{array_del_last}}}
+!! {{{array_copy_lasts}}}
+{{{
+copier tous les valeurs du tableau $2(=$1) dans le tableau $1, excepté la première
+}}}
+!! {{{array_del_first}}}
+!! {{{array_extend}}}
+{{{
+ajouter le contenu du tableau $2 au tableau $1
+}}}
+!! {{{array_extendu}}}
+{{{
+ajouter chacune des valeurs du tableau $2 au tableau $1, si ces valeurs n'y
+sont pas déjà. Retourner vrai si au moins une valeur a été ajoutée
+}}}
+!! {{{array_extend_firsts}}}
+{{{
+ajouter toutes les valeurs du tableau $2 dans le tableau $1, excepté la dernière
+}}}
+!! {{{array_extend_lasts}}}
+{{{
+ajouter toutes les valeurs du tableau $2 dans le tableau $1, excepté la première
+}}}
+!! {{{array_xsplit}}}
+{{{
+créer le tableau $1 avec chaque élément de $2 (un ensemble d'éléments séparés
+par $3, qui vaut ':' par défaut).
+}}}
+!! {{{array_split}}}
+{{{
+créer le tableau $1 avec chaque élément de $2 (un ensemble d'éléments séparés
+par $3, qui vaut ':' par défaut). Les éléments vides sont ignorés. par exemple
+"a::b" est équivalent à "a:b"
+}}}
+!! {{{array_from_path}}}
+!! {{{array_from_xlines}}}
+{{{
+créer le tableau $1 avec chaque ligne de $2.
+}}}
+!! {{{array_from_lines}}}
+{{{
+créer le tableau $1 avec chaque ligne de $2. Les lignes vides sont ignorés.
+}}}
+!! {{{array_join}}}
+{{{
+afficher le contenu du tableau dont le nom est $1 sous forme d'une liste de
+valeurs séparées par $2 (par défaut, une virgule)
+Si $1=="@", alors les éléments du tableaux sont les arguments de la fonction à
+partir de $3
+Si $1!="@" et que le tableau est vide, afficher $3
+Si $1!="@", $4 et $5 sont des préfixes et suffixes à rajouter à chaque élément
+}}}
+!! {{{array_mapjoin}}}
+{{{
+map le tableau $1 avec la fonction $2, puis afficher le résultat en séparant
+chaque élément par $3. Les arguments et la sémantique sont les mêmes que pour
+array_join en tenant compte de l'argument supplémentaire $2 qui est la
+fonction pour array_map (les autres arguments sont décalés en conséquence)
+}}}
+!! {{{array_to_lines}}}
+{{{
+afficher le tableau dont le nom est $1 sous forme de lignes
+}}}
+!! {{{array_to_path}}}
+{{{
+afficher le tableau dont le nom est $1 sous forme d'une liste de chemins
+séparés par ':')
+}}}
+!! {{{array_fix_paths}}}
+{{{
+Corriger les valeurs du tableau $1. Les valeurs contenant le séparateur
+$2(=':') sont séparées en plusieurs valeurs. Par exemple avec le tableau
+input=(a b:c), le résultat est input=(a b c)
+}}}
+!! {{{get_date_rfc822}}}
+!! {{{get_date_fr}}}
+!! {{{get_time_fr}}}
+!! {{{parse_date}}}
+!! {{{udelpath}}}
+{{{
+supprimer le chemin $1 de $2(=PATH)
+}}}
+!! {{{uaddpath}}}
+{{{
+Ajouter le chemin $1 à la fin, dans $2(=PATH), s'il n'y existe pas déjà
+}}}
+!! {{{uinspathm}}}
+{{{
+Ajouter le chemin $1 au début, dans $2(=PATH), s'il n'y existe pas déjà
+}}}
+!! {{{uinspath}}}
+{{{
+S'assurer que le chemin $1 soit au début de $2(=PATH)
+}}}
+!! {{{withpath}}}
+{{{
+tester si le chemin est relatif à . ou à .., ou est absolu. i.e 'withpath a/b'
+renvoie faux alors que 'withpath ./a/b' renvoie vrai
+}}}
+!! {{{withext}}}
+{{{
+tester si le fichier a une extension
+}}}
+!! {{{normpath}}}
+{{{
+normaliser le chemin $1, qui est soit absolu, soit relatif à $2 (qui vaut
+$(pwd) par défaut)
+}}}
+!! {{{abspath}}}
+{{{
+Retourner un chemin absolu vers $1. Si $2 est non nul et si $1 est un chemin
+relatif, alors $1 est exprimé par rapport à $2, sinon il est exprimé par
+rapport au répertoire courant.
+Si le chemin n'existe pas, il n'est PAS normalisé. Sinon, les meilleurs
+efforts sont faits pour normaliser le chemin.
+}}}
+!! {{{parentdirs}}}
+{{{
+Obtenir la liste de tous les parents du répertoire $2 dans le tableau $1, du
+répertoire $2 vers la racine. Si $3 commence par 'r' (comme reverse), l'ordre
+est inversé: le tableau contient les répertoire de la racine vers $2.
+}}}
+!! {{{ppath}}}
+{{{
+Dans un chemin *absolu*, remplacer "$HOME" par "~" et "$(pwd)/" par "", afin
+que le chemin soit plus facile à lire. Le répertoire courant est spécifié par
+$2 ou $(pwd) si $2 est vide
+}}}
+!! {{{relpath}}}
+{{{
+Afficher le chemin relatif de $1 par rapport à $2. Si $2 n'est pas spécifié,
+on prend le répertoire courant. Si $1 ou $2 ne sont pas des chemins absolus,
+il sont transformés en chemins absolus par rapport à $3. Si $1==$2, retourner
+une chaine vide
+}}}
+!! {{{relpathx}}}
+{{{
+Comme relpath, mais pour un chemin vers un exécutable qu'il faut lancer:
+s'assurer qu'il y a une spécification de chemin, e.g. ./script
+}}}
+!! {{{withinpath}}}
+{{{
+Tester si le chemin absolu $2 se trouve dans le chemin absolu "$1" (appelée
+barrière). Soit un chemin P, on considère que P est dans P. Si ce comportement
+n'est pas souhaité, $3(=N) doit valoir O, auquel cas P est dans Q implique que
+P != Q.
+}}}
+!! {{{safe_abspath}}}
+{{{
+Afficher le chemin absolu de $1, par rapport à $2, si et seulement si le
+chemin résultat ne se trouve pas en dehors de la barrière $3. Si $2 n'est pas
+spécifié, prendre le répertoire courant. S'il est relatif, l'exprimer par
+rapport au répertoire courant. Si $3 est relatif, l'exprimer par rapport à $2.
+Si le chemin résultat est sité en dehors de la barrière, ne rien afficher et
+retourner un code d'erreur.
+Si le chemin $1 n'existe pas, il n'est PAS normalisé. Sinon, les meilleurs
+efforts sont faits pour normaliser le chemin résultat.
+}}}
+!! {{{safe_relpath}}}
+{{{
+Afficher le chemin relatif de $1 par rapport à $2 si et seulement si le chemin
+résultat ne se trouve pas en dehors de la barrière $3. Si $2 n'est pas
+spécifié, prendre le répertoire courant. S'il est relatif, l'exprimer par
+rapport au répertoire courant. Si $3 est relatif, l'exprimer par rapport à $2.
+Si le chemin résultat est sité en dehors de la barrière, ne rien afficher et
+retourner un code d'erreur.
+}}}
+!! {{{splitwcs}}}
+{{{
+Découper un nom de chemin $1 entre la partie sans wildcards, qui est placée dans
+la variables $2(=basedir), et la partie avec wildcards, qui est placée dans la
+variable $3(=filespec)
+}}}
+!! {{{deref}}}
+{{{
+Retourner un chemin absolu vers le fichier $1, dans lequel toutes les
+composantes "lien symbolique" ont été supprimées.
+DEPRECATED: Cette fonction est dépréciée. Utiliser à la place readlinkm()
+}}}
+!! {{{readlinka}}}
+{{{
+Afficher un chemin absolu vers la destination du fichier $1. Si $1 n'est pas
+un lien, afficher simplement le chemin du fichier
+}}}
+!! {{{readlinkm}}}
+{{{
+Retourner un chemin absolu vers le fichier $1, dans lequel toutes les
+composantes "lien symbolique" ont été supprimées. Il n'est pas requis que les
+composantes du chemin existent.
+}}}
+!! {{{path_if_test}}}
+{{{
+afficher un chemin si le fichier $2 existe (en utilisant l'opérateur $1) dans
+l'un des chemins absolus $4..n. si $3==relative, afficher le chemin relatif,
+sinon le chemin absolu. note: $3 peut être de la forme relative:path, auquel
+cas le chemin affiché est exprimé relativement à path
+}}}
+!! {{{update_link}}}
+{{{
+mettre à jour le lien $2 pour qu'il pointe vers le fichier $1
+}}}
+!! {{{update_links}}}
+{{{
+Mettre à jour les liens $2..@ pour qu'ils pointent vers la nouvelle
+destination $1
+}}}
+!! {{{move_link}}}
+{{{
+Déplacer le lien $1 vers $2, et mettre à jour la destination du lien si
+elle est exprimée de façon relative
+Si $1 n'est pas un lien, le déplacer normalement avec mv
+}}}
+!! {{{copy_link}}}
+{{{
+Copier le lien $1 vers $2, et mettre à jour la destination du lien si
+elle est exprimée de façon relative
+Si $1 n'est pas un lien, le copier normalement avec cp
+}}}
+!! {{{array_find_links}}}
+{{{
+Chercher dans le répertoire $3 (qui est par défaut le répertoire courant)
+les liens vers le fichier $2, et ajouter leurs chemins absolus dans le
+tableau $1
+}}}
+!! {{{list_links}}}
+{{{
+Chercher dans le répertoire $2 les liens vers le fichier $1, et les
+afficher, un par ligne.
+}}}
+!! {{{move_file}}}
+{{{
+Déplacer le fichier $1 vers $2, et mettre à jour les liens $3..@ pour
+qu'ils pointent vers la nouvelle destination
+}}}
+!! {{{get_nblines}}}
+{{{
+Afficher le nombre de lignes d'un fichier
+}}}
+!! {{{mktempf}}}
+{{{
+générer un fichier temporaire et retourner son nom
+}}}
+!! {{{mktempd}}}
+{{{
+générer un répertoire temporaire et retourner son nom
+}}}
+!! {{{mkdirof}}}
+{{{
+Créer le répertoire correspondant à un fichier
+}}}
+!! {{{cp_a}}}
+{{{
+copier des fichiers en gardant le maximum de propriétés
+}}}
+!! {{{cp_R}}}
+{{{
+copier des fichiers récursivement, en suivant les liens symboliques
+}}}
+!! {{{quietgrep}}}
+{{{
+tester la présence d'un pattern dans un fichier
+}}}
+!! {{{quietdiff}}}
+{{{
+tester si deux fichiers sont identiques
+}}}
+!! {{{testsame}}}
+{{{
+tester si deux fichiers sont identiques/différents
+}}}
+!! {{{testdiff}}}
+!! {{{testupdated}}}
+{{{
+test si $2 n'existe pas ou si $1 est différent de $2
+}}}
+!! {{{testnewer}}}
+{{{
+test si $2 n'existe pas ou si $1 est plus récent que $2
+}}}
+!! {{{ps_all}}}
+{{{
+afficher tous les processus avec le maximum d'informations
+}}}
+!! {{{progexists}}}
+{{{
+tester l'existence d'un programme dans le PATH
+}}}
+!! {{{has_python}}}
+{{{
+tester la présence de python
+}}}
+!! {{{has_gawk}}}
+{{{
+tester la présence de gnuawk
+}}}
+!! {{{is_root}}}
+{{{
+tester si on est root
+}}}
+!! {{{source_ifexists}}}
+{{{
+sourcer un fichier s'il existe
+}}}
+!! {{{is_running}}}
+{{{
+tester si un programme dont on donne le PID tourne
+}}}
+!! {{{sedi}}}
+{{{
+Lancer sed sur un fichier en le modifiant en place
+}}}
+!! {{{csort}}}
+{{{
+Lancer sort avec LANG=C pour éviter les problèmes avec la locale. en effet,
+avec LANG!=C, sort utilise les règles de la locale pour le tri, et par
+exemple, avec LANG=fr_FR.UTF-8, la locale indique que les ponctuations doivent
+être ignorées.
+}}}
+!! {{{lsort}}}
+!! {{{cgrep}}}
+{{{
+Lancer grep avec LANG=C pour éviter les problèmes avec la locale. cf csort
+pour une explication.
+}}}
+!! {{{lgrep}}}
+!! {{{csed}}}
+{{{
+Lancer sed avec LANG=C pour éviter les problèmes avec la locale. cf csort pour
+une explication.
+}}}
+!! {{{lsed}}}
+!! {{{cawk}}}
+{{{
+Lancer awk avec LANG=C pour éviter les problèmes avec la locale. cf csort pour
+une explication.
+}}}
+!! {{{lawk}}}
+!! {{{cdiff}}}
+{{{
+Lancer diff avec LANG=C pour éviter les problèmes avec la locale. cf csort
+pour une explication.
+}}}
+!! {{{ldiff}}}
+!! {{{fix_mode}}}
+{{{
+Si le fichier $1 n'est pas writable, le rendre writable temporairement. Si
+nécessaire, le fichier est créé.
+Cette fonction s'utilise de cette façon:
+mode="$(fix_mode file)"
+...
+unfix_mode file "$mode"
+}}}
+!! {{{unfix_mode}}}
+{{{
+Restaurer le mode $2 du fichier $1 traité par fix_mode
+}}}
+!! {{{get_mode}}}
+{{{
+Obtenir le mode du fichier $1, en le créant si nécessaire. A utiliser avec
+unfix_mode pour restaurer le mode d'un fichier qui a été traité avec un
+fichier temporaire intermédiaire
+}}}
+!! {{{rm_maybe}}}
+{{{
+Supprimer les fichiers dont on donne la liste. Si aucun fichier n'est
+spécifié, cette fonction est un NOP
+}}}
+!! {{{cpdir}}}
+{{{
+copier un fichier dans un répertoire, ou le contenu d'un répertoire dans un
+autre répertoire, que le répertoire source soit un lien symbolique ou
+non. Cette fonction existe parce que le comportement de "cp_a src dest" n'est
+pas consistant selon les plateformes, surtout si src est un lien symbolique
+sur un répertoire: parfois on copie le lien, parfois on copie le contenu du
+répertoire, parfois on copie le répertoire...
+La copie est faite avec rsync si possible. Les options du tableau
+__CPDIR_RSYNC_ARGS sont rajoutées aux options standard de rsync.
+}}}
+!! {{{cpnovcs}}}
+{{{
+copier le fichier/répertoire $1 *dans* le *répertoire* $2 avec rsync. Les
+options du tableau __CPNOVCS_RSYNC_ARGS sont rajoutées aux options standard
+de rsync.
+Si $1 est un répertoire, la copie est faite en ignorant les sous-répertoires
+de VCS (.svn, CVS). En ce qui concerne les répertoire de VCS, git aussi est
+supporté, mais uniquement s'il est à la racine du transfert.
+Si $1 se termine par un '/', c'est le contenu du répertoire qui est copié, pas
+le répertoire lui-même. Si rsync n'est pas trouvé sur le système, alors on
+fait une copie standard qui inclue les répertoires de VCS.
+}}}
+!! {{{cpvcs}}}
+{{{
+comme cpnovcs, mais ne pas ignorer les répertoires de VCS
+}}}
+!! {{{cpdirnovcs}}}
+{{{
+Le pendant de cpdir, mais en ignorant les sous-répertoires de VCS: copier le
+contenu du répertoire $1 dans le répertoire $2
+}}}
+!! {{{doinplace}}}
+{{{
+Filtrer le fichier $1 à travers la commande $2..$*, puis remplacer le fichier
+s'il n'y a pas eu d'erreur. Retourner le code d'erreur de la commande. Si $1
+n'est pas spécifié ou vaut -, filtrer l'entrée standard vers la sortie
+standard.
+La variante doinplacef remplace le fichier quelque soit le code de retour de
+la commande. A utiliser avec des commandes comme grep qui peuvent retourner
+FAUX s'ils ne trouvent pas le motif
+}}}
+!! {{{doinplacef}}}
+!! {{{stripnl}}}
+{{{
+Supprimer les caractères de fin de ligne de la chaine en entrée
+}}}
+!! {{{nl2lf}}}
+!! {{{nl2crlf}}}
+!! {{{nl2cr}}}
+!! {{{list_all}}}
+{{{
+Lister les fichiers ou répertoires du répertoire $1, un par ligne
+Les répertoires . et .. sont enlevés de la liste
+$1=un répertoire dont le contenu doit être listé
+$2..@=un ensemble de patterns pour le listage
+}}}
+!! {{{list_files}}}
+{{{
+Lister les fichiers du répertoire $1, un par ligne
+$1=un répertoire dont le contenu doit être listé.
+$2..@=un ensemble de patterns pour le listage
+}}}
+!! {{{list_dirs}}}
+{{{
+Lister les répertoires du répertoire $1, un par ligne
+Les répertoires . et .. sont enlevés de la liste
+$1=un répertoire dont le contenu doit être listé.
+$2..@=un ensemble de patterns pour le listage
+}}}
+!! {{{array_lsall}}}
+{{{
+Lister les fichiers avec `list_all $2 $3...`, et les mettre dans le
+tableau $1. Le tableau contient les chemins complets, par seulement les
+noms comme avec list_all
+}}}
+!! {{{array_lsdirs}}}
+{{{
+Lister les fichiers avec `list_dirs $2 $3...`, et les mettre dans le
+tableau $1. Le tableau contient les chemins complets, par seulement les
+noms comme avec list_dirs
+}}}
+!! {{{array_lsfiles}}}
+{{{
+Lister les fichiers avec `list_files $2 $3...`, et les mettre dans le
+tableau $1. Le tableau contient les chemins complets, par seulement les
+noms comme avec list_files
+}}}
+!! {{{filter_empty}}}
+{{{
+Filtrer l'entrée standard en enlevant les lignes vides
+}}}
+!! {{{filter_vcspath}}}
+{{{
+L'entrée standard étant une liste de chemins, filtrer les fichiers et
+répertoire qui ont un rapport avec subversion ou git
+}}}
+!! {{{merge_contlines}}}
+{{{
+Avec les lignes lues sur stdin, fusionner celles qui se terminent par \ avec
+les suivantes.
+}}}
+!! {{{filter_comment}}}
+{{{
+Filtrer un fichier de configuration lu sur stdin en enlevant les commentaires
+et les lignes vides.
+Avec $1==-m, fusionner les lignes qui se terminent par \ avec les suivantes
+Comme filter_conf(), les commentaires doivent être sur une ligne à part.
+Contrairement à filter_conf, il n'est pas nécessaire que le caractère '#' soit
+en début de ligne: il peut apparaitre après des espaces et des tabulations. De
+même, une ligne qui ne contient que des espaces et des tabulations est
+considérée comme vide.
+}}}
+!! {{{filter_conf}}}
+{{{
+filtrer un fichier de configuration lu sur stdin en enlevant les commentaires
+et les lignes vides. Une ligne n'est considérée commentaire que si '#' est un
+première position. Utiliser filter_comment() si les commentaire peuvent
+commencer par des caractères espace et tabulation.
+Si $1==-m, fusionner les lignes qui se terminent par \ avec les suivantes
+}}}
+!! {{{is_archive}}}
+{{{
+tester si l'extension d'un fichier indique que c'est une archive
+}}}
+!! {{{extract_archive}}}
+{{{
+Extraire le contenu de l'archive $1 dans le répertoire ${2:-.}
+}}}
+!! {{{get_archive_basename}}}
+{{{
+Obtenir le nom de base de l'archive $1
+}}}
+!! {{{get_archive_appname}}}
+{{{
+Obtenir le nom probable de l'application ou du framework contenu dans
+l'archive $1, e.g:
+get_archive_versionsuffix app-0.1.tgz
+--> app
+}}}
+!! {{{get_archive_versionsuffix}}}
+{{{
+Obtenir la valeur probable de la version de l'application ou du framework
+contenu dans l'archive $1, avec le caractère de séparation, e.g:
+get_archive_versionsuffix app-0.1.tgz
+--> -0.1
+}}}
+!! {{{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
+--> 0.1
+}}}
+!! {{{dump_usernames}}}
+{{{
+Placer dans le tableau $1 la liste des utilisateurs du système
+Cette implémentation consulte /etc/passwd et liste tous les utilisateurs dont
+le homedir se trouve dans /home, et dont l'uid est >=500
+}}}
+!! {{{resolv_ips}}}
+{{{
+Placer dans le tableau $1(=ips) la liste des adresses ip correspondant à
+l'hôte $2. La résolution est effectuée avec la commande host.
+}}}
+!! {{{resolv_hosts}}}
+{{{
+Placer dans le tableau $1(=hosts) la liste des hôtes correspondant à
+l'adresse ip $2. La résolution est effectuée avec la commande host.
+}}}
+!! {{{runscript_as}}}
+{{{
+Utiliser bash pour lancer le script $2 avec les arguments $3..$n afin qu'il
+tourne avec les droits d'un autre user $1(=root). Si $2=exec, utiliser exec
+pour lancer le script et ses arguments qui commencent à partir de $3, ce qui
+fait que cette fonction ne retourne pas.
+Attention! cette fonction ne teste pas avec si on est déjà le user $1. Il y a
+donc un risque de boucle infinie si on ne teste pas le user courant.
+}}}
+!! {{{runscript_as_root}}}
+{{{
+Utiliser bash pour lancer le script $1 avec les arguments $2..$* avec les
+droits de root. Si on est déjà en root, le script est simplement lancé. Sinon,
+utiliser runscript_as pour lancer le script avec les droits de root.
+}}}
+!! {{{run_as}}}
+{{{
+Relancer le script courant afin qu'il tourne avec les droits d'un autre user
+$1(=root)
+Attention! cette fonction ne teste pas avec si on est déjà ce user. Il y a
+donc un risque de boucle infinie si on ne teste pas le user courant.
+Il faut lancer cette fonction avec les arguments du script en cours. Par
+exemple::
+run_as root "$@"
+Si $2=--noexec, on n'utilise pas la fonction exec, ce qui fait que la fonction
+retourne. Sinon, on peut considérer que cette fonction ne retourne jamais
+}}}
+!! {{{run_as_root}}}
+{{{
+relancer le script courant afin qu'il tourne en root si on est pas en déjà
+root. Sinon, cette fonction est un nop.
+}}}
+!! {{{check_user}}}
+{{{
+Vérifier si le user courant est l'un des users $1..*
+}}}
+!! {{{ensure_user}}}
+{{{
+Vérifier si le user courant est l'un des users $1..N où N est la position du
+premier "--". Si ce n'est pas le cas et que l'on est root, relancer le script
+avec ce user grâce à la fonction run_as()
+Retourner 1 si ce n'était pas le bon user. Retourner 10 si ce n'était pas le
+bon user et que l'on n'est pas root (donc impossible à priori de relancer le
+script avec le bon user). Retourner 11 si l'utilisateur a choisi de ne pas
+lancer le script avec le bon utilisateur
+A utiliser de cette manière:
+if ensure_user users... -- args; then
+# ... on est avec le bon user; faire les opérations
+else
+# ... ce code n'est exécuté que si une erreur s'est produite, ou si ce
+# n'était pas le bon user et que l'option --noexec est utilisée
+fi
+}}}
+!! {{{check_hostname}}}
+{{{
+Vérifier si le hostname courant est l'un des hôtes $1..*
+localhost matche toujours
+}}}
+!! {{{check_userhostname}}}
+{{{
+Vérifier si le hostname et éventuellement le user courant sont l'un des
+arguments $1..*
+Chaque argument est de la forme [user@]host, mais le test ne tient compte que
+du nom de l'hôte, sans tenir compte du domaine. Si le user n'est pas spécifié,
+le test ne porte que sur hostname.
+}}}
+!! {{{ensure_hostname}}}
+{{{
+Vérifier si le hostname et le user courant sont l'un des arguments $1..*
+Chaque argument est de la forme [user@]host, mais le test ne tient compte que
+du nom de l'hôte, sans tenir compte du domaine.
+Si user est spécifié:
+- Si on est sur le bon hôte mais pas le bon user, ensure_user est lancé avec
+l'argument approprié pour relancer le script
+Si l'argument était de la forme userhost:path, le répertoire courant est
+changé avant de lancer le script avec le bon utilisateur.
+Sinon (si user n'est pas spécifié):
+- Si on n'est pas sur le bon hôte, après confirmation le script est lancé avec
+ssh sur l'hôte distant avec le user spécifié (qui vaut par défaut root). Ce
+script DOIT exister sur l'hôte distant avec le même chemin.
+Si l'argument était de la forme userhost:path, le répertoire courant distant
+est changé avant de lancer le script
+Si on est avec le bon user sur le bon hôte, le répertoire courant n'est jamais
+changé.
+Retourner 1 si ce n'était pas le bon user. Retourner 10 si ce n'était pas le
+bon user et que l'on n'est pas root (donc impossible à priori de relancer le
+script avec le bon user). Retourner 11 si l'utilisateur a choisi de ne pas
+lancer le script sur l'hôte distant. Retourner 12 si une erreur s'est produite
+avec ssh.
+A utiliser de cette manière:
+if ensure_hostname user@host... -- args; then
+# ... on est [avec le bon user] sur le bon hôte; faire les opérations
+else
+# ... ce code n'est exécuté que si une erreur s'est produite, ou si ce
+# n'était pas le bon user et que l'option --noexec est utilisée
+fi
+}}}
+!! {{{sqvals}}}
+!! {{{quoted_values}}}
+!! {{{formatcsv}}}
+!! {{{awkdef}}}
+{{{
+Afficher un script à insérer au début d'un script awk. Ce script définit dans
+une section BEGIN{} les variables donnés en arguments, et avec l'option -f,
+des fonctions utiles. Si une valeur ne ressemble pas à une définition de
+variable, l'analyse des variables s'arrête et le reste des arguments est
+inséré tel quel. Cette fonction peut être utilisée de cette manière:
+awk "$(awkdef -f var=value... 'script awk')"
+Normalement, les variables définies sont scalaires, avec une syntaxe de la
+forme var[:type]=value. type peut valoir str ou int, pour forcer le type de la
+variable créée dans awk.
+Il est possible d'utiliser la syntaxe awk_array[@]=bash_array ou array[@] (qui
+est équivalente à array[@]=array) pour initialiser le tableau awk_array, qui
+contiendra toute les valeurs du tableau nommé bash_array, avec les indices de
+1 à N, N étant le nombre d'éléments du tableau bash_array. La variable
+awk_array_count est aussi initialisée, et contient le nombre d'éléments du
+tableau
+La syntaxe "awk_array[@]=<\n..." permet de spécifier les valeurs du tableau,
+une par ligne, e.g:
+$'values[@]=<\nvalue1\nvalue2'
+pour un tableau values qui contiendra deux valeurs: value1 et value2
+Avec l'option -f, des fonctions supplémentaires sont définies. Elles sont
+décrites dans le module awk.
+}}}
+!! {{{lawkrun}}}
+{{{
+wrapper pour lancer awk avec un script préparé par awkdef. Les définitions et
+les arguments sont séparés par --, e.g.
+awkrun var0=value0 var1=value1 script -- input0 input1
+}}}
+!! {{{cawkrun}}}
+!! {{{awkrun}}}
+!! {{{lf_trylock}}}
+{{{
+USAGE
+lf_trylock [-h max_hours] /path/to/lockfile
+OPTIONS
+lockfile
+fichier qui doit contenir le verrou
+-h max_hours
+Nombre d'heures (par défaut 4) au bout duquel afficher stale
+Sinon, afficher locked
+Retourne 0 si le verrou a été placé correctement. Il ne faut pas oublier de
+supprimer le fichier. Le mieux est de le faire supprimer automatiquement par
+autoclean:
+lockfile=...
+case "$(lf_trylock "$lockfile")" in
+locked) ...;;
+stale) ...;;
+esac
+autoclean "$lockfile"
+Sinon, retourner 1 et afficher l'une des deux valeurs suivantes:
+- stale si le verrou a déjà été placé, depuis au moins max_hours heures
+- locked si le verrou a déjà été placé
+- retry si une erreur s'est produite pendant la pose du verrou ou sa
+lecture. Cela peut se produire si les droits ne sont pas suffisants pour
+écrire dans le répertoire destination, ou si le fichier a été supprimé
+avant sa lecture (race-condition). Dans ce dernier cas, reessayer permettra
+d'acquérir le verrou
+}}}
+!! {{{pidfile_set}}}
+{{{
+USAGE
+pidfile_set [-p pid] /path/to/pidfile
+OPTIONS
+pidfile
+fichier qui doit contenir le pid du script
+-p pid
+spécifier le pid. par défaut, utiliser $$
+-r  si pidfile existe mais que le processus ne tourne plus, faire
+comme si le fichier n'existe pas.
+Retourner 0 si le pid a été correctement écrit dans le fichier. Ce fichier
+sera supprimé automatiquement en fin de script
+Retourner 1 si le fichier existe déjà et que le processus est en train de
+tourner.
+Retourner 2 si le fichier existe déjà mais que le processus ne tourne plus.
+Retourner 10 si autre erreur grave s'est produite (par exemple, s'il manque le
+chemin vers pidfile, ou si le fichier n'est pas accessible en écriture.)
+}}}
+!! {{{pidfile_check}}}
+{{{
+USAGE
+pidfile_check /path/to/pidfile
+OPTIONS
+pidfile
+fichier qui doit contenir le pid d'un processus
+Cette fonction permet de vérifier si le processus associé à un fichier de pid
+est en train de tourner.
+Retourner 0 si le fichier de pid existe et que le process du pid spécifié est
+en train de tourner. Retourner 1 sinon.
+Retourner 10 si erreur grave s'est produite (par exemple, s'il manque le
+chemin vers pidfile, ou si le fichier n'est pas accessible en lecture.)
+}}}
+!! {{{page_maybe}}}
+{{{
+Utiliser less, si possible, pour afficher le flux en entrée. Si le terminal
+n'est pas interactif ou si le nombre de lignes en entrée est inférieur au
+nombre de lignes du terminal, afficher simplement le flux.
+Les arguments de cette fonction sont passés à less
+}}}
+!! {{{utools_local}}}
+{{{
+Afficher les commandes pour rendre locales certaines variables en fonction des
+arguments:
+- opts rend locale args, pour utiliser parse_opts() à l'intérieur d'une
+fonction.
+- verbosity et interaction rendent respectivement locales __verbosity et
+__interaction. Ceci est utile pour pouvoir appeler sans risque de pollution
+de l'environnement une fonction qui utilise parse_opts() avec les
+définitions de PRETTYOPTS.
+Si aucun arguments n'est fourni, toutes les définitions sont affichées.
+}}}
+!! {{{stdredir}}}
+{{{
+Lancer la commande $4..@ en redirigeant stdin depuis $1, stdout vers $2,
+stderr vers $3. Si $1 est vide ou vaut /dev/stdin, la redirection n'est
+pas faite. Si $2 est vide ou vaut /dev/stdout, la redirection n'est pas
+faite. Si $3 est vide ou vaut /dev/stderr, la redirection n'est pas faite.
+Cette fonction existe parce que sur certaines versions de bash, il semble
+que les redirections /dev/std* ne sont pas traitées de façon particulière.
+De plus, sur des technologies telles que OpenVZ, les chemins /dev/std* ne
+sont pas créés (parce que /proc/self/fd/* n'est pas accessible). Donc,
+dans de rares cas où le script tourne sur OpenVZ avec une version de bash
+qui est buggée, la redirection n'est pas faite correctement.
+}}}
+!! {{{isatty}}}
+{{{
+tester si STDOUT n'est pas une redirection
+}}}
+!! {{{in_isatty}}}
+{{{
+tester si STDIN n'est pas une redirection
+}}}
+!! {{{out_isatty}}}
+{{{
+tester si STDOUT n'est pas une redirection
+}}}
+!! {{{err_isatty}}}
+{{{
+tester si STDERR n'est pas une redirection
+}}}
+!! {{{die}}}
+!! {{{die_unless}}}
+{{{
+Afficher $-1 et quitter le script avec die() si la commande $1..-2 retourne
+FAUX
+}}}
+!! {{{eerror_unless}}}
+{{{
+Afficher $-1 avec eerror() et retourner $? si la commande $1..-2 retourne FAUX
+}}}
+!! {{{die_if}}}
+{{{
+Afficher $-1 et quitter le script avec die() si la commande $1..-2 retourne
+VRAI
+}}}
+!! {{{eerror_if}}}
+{{{
+Afficher $-1 avec eerror() et retourner le code d'erreur 1 si la commande
+$1..-2 retourne VRAI
+}}}
+!! {{{noerror}}}
+{{{
+lancer la commande "$@" et masquer son code de retour
+}}}
+!! {{{noout}}}
+{{{
+lancer la commande "$@" en supprimant sa sortie standard
+}}}
+!! {{{noerr}}}
+{{{
+lancer la commande "$@" en supprimant sa sortie d'erreur
+}}}
+!! {{{tooenc}}}
+{{{
+Transformer la valeur $1 de l'encoding $2(=$OENC) vers l'encoding de sortie
+$3=($UTOOLS_OUTPUT_ENCODING)
+}}}
+!! {{{uecho}}}
+!! {{{tooenc_}}}
+{{{
+Transformer la valeur $1 de l'encoding $2(=$OENC) vers l'encoding de sortie
+$3=($UTOOLS_OUTPUT_ENCODING)
+}}}
+!! {{{uecho_}}}
+!! {{{toienc}}}
+{{{
+Transformer la valeur $1 de $2(=$IENC) vers l'encoding d'entrée
+$3(=$UTOOLS_INPUT_ENCODING)
+}}}
+!! {{{uread}}}
+{{{
+Lire une valeur sur stdin et la placer dans la variable $1. On assume que la
+valeur en entrée est encodée dans l'encoding d'entrée par défaut
+}}}
+!! {{{stooenc}}}
+{{{
+Transformer la valeur lue sur stdin de $OENC vers l'encoding de sortie par
+défaut ($UTOOLS_OUTPUT_ENCODING)
+}}}
+!! {{{stoienc}}}
+{{{
+Transformer la valeur lue sur stdin de $IENC vers l'encoding d'entrée par
+défaut ($UTOOLS_INPUT_ENCODING)
+}}}
+!! {{{elogto}}}
+{{{
+Activer UTOOLS_EDATE et rediriger STDOUT et STDERR vers le fichier $1
+Si deux fichiers sont spécifiés, rediriger STDOUT vers $1 et STDERR vers $2
+Si aucun fichier n'est spécifié, ne pas faire de redirection
+Si la redirection est activée, forcer l'utilisation de l'encoding UTF8
+Si UTOOLS_ELOG_OVERWRITE=1, alors le fichier en sortie est écrasé. Sinon, les
+lignes en sortie lui sont ajoutées
+}}}
+!! {{{set_verbosity}}}
+!! {{{set_interaction}}}
+!! {{{show_error}}}
+{{{
+tester respectivement si on doit afficher les messages d'erreur,
+d'avertissement, d'information, de debug
+}}}
+!! {{{show_warn}}}
+!! {{{show_info}}}
+!! {{{show_verbose}}}
+!! {{{show_debug}}}
+!! {{{check_verbosity}}}
+!! {{{get_verbosity_option}}}
+!! {{{check_interaction}}}
+!! {{{is_interaction}}}
+!! {{{get_interaction_option}}}
+!! {{{eflush}}}
+{{{
+Afficher les messages en attente
+}}}
+!! {{{eclearp}}}
+{{{
+Supprimer les message en attente
+}}}
+!! {{{eerror}}}
+{{{
+Afficher un message d'erreur
+}}}
+!! {{{ewarn}}}
+{{{
+Afficher un message d'avertissement
+}}}
+!! {{{enote}}}
+{{{
+Afficher un message d'information de même niveau qu'un avertissement
+}}}
+!! {{{ebanner}}}
+{{{
+Afficher un message très important encadré, puis attendre 5 secondes
+}}}
+!! {{{eimportant}}}
+{{{
+Afficher un message très important
+}}}
+!! {{{eattention}}}
+{{{
+Afficher un message important
+}}}
+!! {{{einfo}}}
+{{{
+Afficher un message d'information
+}}}
+!! {{{eecho}}}
+{{{
+Afficher un message d'information sans préfixe
+}}}
+!! {{{eecho_}}}
+!! {{{edebug}}}
+{{{
+Afficher un message de debug
+}}}
+!! {{{trace}}}
+{{{
+Afficher la commande $1..@, la lancer, puis afficher son code d'erreur si une
+erreur se produit
+}}}
+!! {{{trace_error}}}
+{{{
+Lancer la commande $1..@, puis afficher son code d'erreur si une erreur se
+produit. La différence avec trace() est que la commande n'est affichée que si
+une erreur se produit.
+}}}
+!! {{{etitle}}}
+{{{
+Afficher le titre $1, qui est le début éventuel d'une section. Les section
+imbriquées sont affichées indentées. La section n'est pas terminée, et il faut
+la terminer explicitement avec eend, sauf dans certains cas précis:
+- Si $2..$* est spécifié, c'est une commande. Lancer la commande dans le
+contexte de la section. Puis, la section est automatiquement terminée sauf si
+l'option -s est spécifiée, auquel cas la section reste ouverte. Si l'option -p
+est spécifiée, eclearp() est appelé pour purger les messages en attente
+- Dans le cas contraire, l'option -s est ignorée: la section doit toujours
+être terminée explicitement.
+La fonction etitled() est comme etitle(), mais le titre n'est pas affiché
+immédiatement. L'affichage effectif est effectué dès qu'une fonction e* est
+utilisée. Ceci permet, avec la fonction eclearp(), de ne pas afficher de titre
+pour une section vide.
+}}}
+!! {{{etitled}}}
+!! {{{estep}}}
+{{{
+Afficher la description d'une opération. Cette fonction est particulièrement
+appropriée dans le contexte d'un etitle.
+Les variantes e (error), w (warning), n (note), i (info) permettent d'afficher
+des couleurs différentes, mais toutes sont du niveau info.
+}}}
+!! {{{estepe}}}
+!! {{{estepw}}}
+!! {{{estepn}}}
+!! {{{estepi}}}
+!! {{{estep_}}}
+!! {{{estepe_}}}
+!! {{{estepw_}}}
+!! {{{estepn_}}}
+!! {{{estepi_}}}
+!! {{{ebegin}}}
+{{{
+Afficher le message $1, qui décrit le début d'une opération. Cette fonction
+débute une section, qu'il faut terminer avec eend.
+Si $2..$* est spécifié, c'est une commande. Lancer la commande dans le
+contexte de la section. Puis, la section est terminée automatiquement, sauf si
+l'option -s est spécifiée, auquel cas la section reste ouverte.
+}}}
+!! {{{edot}}}
+{{{
+Afficher une étape d'une opération, matérialisée par un point '.' ou une
+croix 'x' en cas de succès ou d'erreur. Cette fonction est particulièrement
+appropriée dans le contexte d'un ebegin.
+}}}
+!! {{{edotw}}}
+{{{
+Afficher un avertissement comme étape d'une opération, matérialisée par une
+lettre 'w' (typiquement de couleur jaune). Cette fonction est particulièrement
+appropriée dans le contexte d'un ebegin.
+}}}
+!! {{{ewait}}}
+{{{
+Afficher les étapes d'une opération qui dure, matérialisées par des '+' toutes
+les secondes tant que le processus $1 tourne.
+A utiliser de cette manière:
+ebegin "msg"
+cmd &
+ewait $!
+eend
+}}}
+!! {{{eend}}}
+{{{
+Terminer une section.
+Avec l'option -c, remettre à zéro toutes les informations de section
+Si la section en cours est un ebegin, afficher la fin de l'opération: [ok] ou
+[error] en fonction du code de retour de la dernière commande (ou de $1 si
+cette valeur est donnée)
+Si la section en cours est un etitle, marquer la fin de la section concernée
+par le titre.
+}}}
+!! {{{elinedots}}}
+{{{
+Afficher un message comme avec ebegin "$1", puis afficher un point '.' pour
+chaque ligne lue sur stdin. Cela permet de suivre une opération. En mode
+DEBUG, afficher la ligne affichée plutôt qu'un point.
+Si $2..$* sont spécifiés, lancer la commande et suivre sa sortie. Ainsi,
+'elinedots msg cmd args' est un raccourci pour 'cmd args | elinedots msg'
+}}}
+!! {{{ask_yesno}}}
+{{{
+Afficher le message $1 suivi de [oN] ou [On] suivant que $2 vaut O ou N, puis
+lire la réponse. Retourner 0 si la réponse est vrai, 1 sinon.
+Si $1 est une option, elle est utilisée avec check_interaction pour savoir si
+on est en mode interactif ou non. A ce moment-là, les valeurs sont décalées
+($2=message, $3=default)
+Si $2 vaut C, la valeur par défaut est N si on est interactif, O sinon
+Si $2 vaut X, la valeur par défaut est O si on est interactif, N sinon
+}}}
+!! {{{read_value}}}
+{{{
+Afficher le message $1 suivi de la valeur par défaut [$3] si elle est non
+vide, puis lire la valeur donnée par l'utilisateur. Cette valeur doit être non
+vide si $4(=O) est vrai. La valeur saisie est placée dans la variable
+$2(=value)
+Si $1 est une option, elle est utilisée avec check_interaction pour savoir si
+on est en mode interactif ou non. A ce moment-là, les valeurs sont décalées
+($2=message, $3=variable, $4=default, $5=required)
+En mode non interactif, c'est la valeur par défaut qui est sélectionnée. Si
+l'utilisateur requière que la valeur soit non vide et que la valeur par défaut
+est vide, afficher un message d'erreur et retourner faux
+read_password() est comme read_value(), mais la valeur saisie n'est pas
+affichée, ce qui la rend appropriée pour la lecture d'un mot de passe.
+}}}
+!! {{{read_password}}}
+!! {{{simple_menu}}}
+{{{
+Afficher un menu simple dont les éléments sont les valeurs du tableau
+$2(=options). L'option choisie est placée dans la variable $1(=option)
+-t TITLE: spécifier le titre du menu
+-m YOUR_CHOICE: spécifier le message d'invite pour la sélection de l'option
+-d DEFAULT: spécifier l'option par défaut. Par défaut, prendre la valeur
+actuelle de la variable $1(=option)
+}}}
+!! {{{actions_menu}}}
+{{{
+Afficher un menu dont les éléments sont les valeurs du tableau $4(=options),
+et une liste d'actions tirées du tableau $3(=actions). L'option choisie est
+placée dans la variable $2(=option). L'action choisie est placée dans la
+variable $1(=action)
+Un choix est saisi sous la forme [action]num_option
+-t TITLE: spécifier le titre du menu
+-m OPT_YOUR_CHOICE: spécifier le message d'invite pour la sélection de
+l'action et de l'option
+-M ACT_YOUR_CHOICE: spécifier le message d'invite dans le cas où aucune option
+n'est disponible. Dans ce cas, seules les actions vides sont possibles.
+-e VOID_ACTION: spécifier qu'une action est vide, c'est à dire qu'elle ne
+requière pas d'être associée à une option. Par défaut, la dernière action
+est classée dans cette catégorie puisque c'est l'action "quitter"
+-d DEFAULT_ACTION: choisir l'action par défaut. par défaut, c'est la première
+action.
+-q QUIT_ACTION: choisir l'option "quitter" qui provoque la sortie du menu sans
+choix. par défaut, c'est la dernière action.
+-o DEFAULT_OPTION: choisir l'option par défaut. par défaut, prendre la valeur
+actuelle de la variable $2(=option)
+}}}
+!! {{{autoclean}}}
+{{{
+Ajouter $1..$n à la liste des fichiers à supprimer à la fin du programme
+}}}
+!! {{{ac_cleanall}}}
+{{{
+Supprimer *tous* les fichiers temporaires gérés par autoclean tout de suite.
+}}}
+!! {{{ac_clean}}}
+{{{
+Supprimer les fichier temporaires $1..$* si et seulement s'ils ont été générés
+par ac_set_tmpfile ou ac_set_tmpdir
+}}}
+!! {{{ac_set_tmpfile}}}
+{{{
+Créer un fichier temporaire avec le motif $2, l'ajouter à la liste des
+fichiers à supprimer en fin de programme, et mettre sa valeur dans la
+variable $1
+En mode debug, si ($5 est vide ou ${!5} est une valeur vraie), et si $3 n'est
+pas vide, prendre ce fichier au lieu de générer un nouveau fichier
+temporaire. Si $4==keep, ne pas écraser le fichier $3 s'il existe.
+}}}
+!! {{{ac_set_tmpdir}}}
+{{{
+Créer un répertoire temporaire avec le motif $2, l'ajouter à la liste des
+fichiers à supprimer en fin de programme, et mettre sa valeur dans la
+variable $1
+En mode debug, si ($4 est vide ou ${!4} est une valeur vraie), et si $3 n'est
+pas vide, prendre ce nom de répertoire au lieu de créer un nouveau répertoire
+temporaire
+}}}
+!! {{{debug_tee}}}
+{{{
+En mode debug, passer le flux à travers la commande 'tee "$@"'. Sinon, le flux
+est passé inchangé.
+}}}
+!! {{{get_user_defaults_file}}}
+{{{
+Afficher le chemin vers le fichier utilisateur à éditer pour qu'il soit chargé
+par 'set_defaults $1'. Ce fichier n'existe pas forcément; il faut peut-être le
+créer.
+}}}
+!! {{{get_defaults_files}}}
+{{{
+Initialiser le tableau $1(=defaults) avec la liste des fichiers qui seraient
+chargés par la commande 'set_defaults $2..N'
+}}}
+!! {{{set_defaults}}}
+{{{
+Pour chaque argument, sourcer /etc/default/$arg *et* (en priorité
+~/etc/default.$HOSTNAME/$arg ou à défaut ~/etc/default/$arg) si ceux-ci
+existent. *Sinon*, lire $scriptdir/lib/default/$arg si ce fichier existe
+}}}
+!! {{{myhost}}}
+{{{
+Afficher le nom d'hôte pleinement qualifié, en faisant appel à la commande
+hostname. Par comparaison, $MYHOST est fourni par bash.
+}}}
+!! {{{myhostname}}}
+{{{
+Afficher le nom d'hôte sans domaine, en faisant appel à la commande
+hostname. Par comparaison, $MYHOSTNAME est fourni par bash.
+}}}
+
+
+

+
+
+

+
+
+
!! {{{is_cgi}}}
+{{{
+Tester si on est lancé comme un script CGI
+}}}
+!! {{{ctype_header}}}
+{{{
+Générer une en-tête Content-Type: avec la valeur $1[=text/html]
+}}}
+!! {{{cdisp_header}}}
+{{{
+Générer une en-tête Content-Disposition: avec le type $2[=attachment] et
+le nom de fichier $1[=result]
+}}}
+!! {{{nocache_header}}}
+{{{
+Générer des en-têtes qui désactivent la mise en cache du contenu
+}}}
+!! {{{cgicontent}}}
+{{{
+Générer les en-têtes nécessaire avant de servir le contenu.
+$1(=text/html) est le type de contenu. S'il faut servir le contenu avec
+une disposition "attachment", $2 est le nom de fichier à proposer à
+l'utilisateur. Si $3 est spécifié, c'est le chemin vers le fichier dont le
+contenu doit être servi.
+$4..* sont des en-têtes supplémentaires à rajouter
+}}}
+!! {{{cgicontent_nocache}}}
+{{{
+Générer les en-têtes nécessaire avant de servir le contenu. Rajouter les
+entêtes pour désactiver la mise en cache.
+$1(=text/html) est le type de contenu. S'il faut servir le contenu avec
+une disposition "attachment", $2 est le nom de fichier à proposer à
+l'utilisateur. Si $3 est spécifié, c'est le chemin vers le fichier dont le
+contenu doit être servi.
+$4..* sont des en-têtes supplémentaires à rajouter
+}}}
+!! {{{cgierror}}}
+{{{
+Afficher les en-têtes pour désactiver la mise en cache, puis afficher un
+message d'erreur puis arrêter le script
+}}}
+!! {{{cgiredirect}}}
+{{{
+Afficher les en-têtes pour rediriger le client vers la page $1 puis
+arrêter le script
+}}}
+
+
+
!! {{{cgiparams}}}
+!! {{{cgilsxml}}}
+!! {{{cgiupload}}}
+
+
+

+
+
+
!! {{{conf_enable}}}
+{{{
+Dans le fichier de configuration $1, activer les paramètres $2..*
+Chaque argument de cette fonction correspond à une directive du fichier de
+configuration et doit être de la forme name[=value]
+Dans tous les cas, toutes les directives de ce nom sont recherchées et
+décommentées. Si value est précisée, les directives sont mises à jour. Si
+la directive ne figure pas dans le fichier, elle y est rajoutée à la fin
+avec la valeur spécifiée.
+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.
+}}}
+!! {{{conf_disable}}}
+{{{
+Dans le fichier de configuration $1, désactiver les paramètres $2..*
+Chaque argument de cette fonction correspond à une directive du fichier de
+configuration et doit être de la forme name[=value]
+Toutes les directives de ce noms sont recherchées et commentées. La valeur
+si elle est spécifiée, est ignorée. Si la directive ne figure pas dans le
+fichier, c'est un NOP.
+Retourner 0 si une modification a été faite dans le fichier, 1 sinon
+}}}
+!! {{{conf_append}}}
+{{{
+Dans le fichier de configuration $1, augmenter les valeurs des variables
+correspondant aux paramètres $2..*
+Chaque argument de cette fonction correspond à une variable du fichier de
+configuration, et doit être de la forme name=value
+Une ligne 'name="${name:+$name:}$value"' est générée à la fin du fichier
+de configuration.
+Par défaut, le séparateur CONF_APPEND_SEP vaut ':', mais il est possible
+de changer cette valeur, de façon globale
+Retourner 0 si une modification a été faite dans le fichier, 1 sinon
+}}}
+!! {{{conf_array_append}}}
+{{{
+Dans le fichier de configuration $1, augmenter les valeurs des variables
+de tableau correspondant aux paramètres $2..*
+Chaque argument de cette fonction correspond à une variable du fichier de
+configuration, et doit être de la forme name=value
+Une ligne name=("${name[@]}" "$value") est générée à la fin du fichier de
+configuration
+Retourner 0 si une modification a été faite dans le fichier, 1 sinon
+}}}
+!! {{{conf_check}}}
+{{{
+Dans le fichier de configuration $1, tester si tous les paramètres $2..*
+sont présents.
+Chaque argument de cette fonction correspond à une variable du fichier de
+configuration, et doit être de la forme name[=value]
+Si une valeur est spécifiée, vérifier que le fichier contient la valeur
+correspondante. Sinon, tester uniquement la présence de la directive.
+}}}
+!! {{{aconf_enable}}}
+{{{
+Dans le fichier de configuration $1, activer les paramètres $2..*
+Chaque argument de cette fonction correspond à une directive du fichier de
+configuration et doit être de la forme name[=value]
+Toutes les directives de ce nom sont recherchées et décommentées, et la
+valeur mise à jour. Si la directive ne figure pas dans le fichier, elle y
+est rajoutée à la fin. A cause du mode opératoire, cette fonction ne
+convient pas pour les directives dont le nom peut apparaitre plusieurs
+fois dans le fichier
+Retourner 0 si une modification a été faite dans le fichier, 1 sinon
+}}}
+!! {{{aconf_disable}}}
+{{{
+Dans le fichier de configuration $1, désactiver les paramètres $2..*
+Chaque argument de cette fonction correspond à une directive du fichier de
+configuration et doit être de la forme name[=value]
+Si la valeur est précisée, la directive correspondant à ce nom et cette
+valeur est recherchée et commentée. Sinon, toutes les directives de ce
+noms sont recherchées et commentées. Si la directive ne figure pas dans le
+fichier, c'est un NOP.
+Retourner 0 si une modification a été faite dans le fichier, 1 sinon
+}}}
+!! {{{aconf_append}}}
+{{{
+Dans le fichier de configuration $1, ajouter des directives correspondant
+aux paramètres $2..*
+Chaque argument de cette fonction correspond à une directive du fichier de
+configuration et doit être de la forme name=value
+Une ligne '$name $value' est ajoutée à la fin du fichier de configuration
+Retourner 0 si une modification a été faite dans le fichier, 1 sinon
+}}}
+!! {{{aconf_array_append}}}
+!! {{{aconf_check}}}
+{{{
+Dans le fichier de configuration $1, tester si tous les paramètres $2..*
+sont présents.
+Chaque argument de cette fonction correspond à une variable du fichier de
+configuration, et doit être de la forme name[=value]
+Si une valeur est spécifiée, vérifier que le fichier contient la valeur
+correspondante. Sinon, tester uniquement la présence de la directive.
+}}}
+!! {{{mconf_enable}}}
+{{{
+Dans le fichier de configuration $1, activer les paramètres $3..* de la
+section $2
+Chaque argument de cette fonction correspond à une directive du fichier de
+configuration et doit être de la forme name[=value]
+Toutes les directives de ce nom sont recherchées et décommentées, et la
+valeur mise à jour. Si la directive ne figure pas dans le fichier, elle y
+est rajoutée à la fin. A cause du mode opératoire, cette fonction ne
+convient pas pour les directives dont le nom peut apparaitre plusieurs
+fois dans le fichier
+Retourner 0 si une modification a été faite dans le fichier, 1 sinon
+Cette fonction nécessite gawk et ignore la locale
+}}}
+!! {{{mconf_disable}}}
+{{{
+Dans le fichier de configuration $1, désactiver les paramètres $3..* de la
+section $2.
+Chaque argument de cette fonction correspond à une directive du fichier de
+configuration et doit être de la forme name[=value]
+Si la valeur est précisée, la directive correspondant à ce nom et cette
+valeur est recherchée et commentée. Sinon, toutes les directives de ce
+noms sont recherchées et commentées. Si la directive ne figure pas dans le
+fichier, c'est un NOP.
+Retourner 0 si une modification a été faite dans le fichier, 1 sinon
+Cette fonction nécessite gawk et ignore la locale
+}}}
+!! {{{mconf_append}}}
+{{{
+Dans le fichier de configuration $1, ajouter des directives correspondant
+aux paramètres $3..* dans la section $2
+Chaque argument de cette fonction correspond à une directive du fichier de
+configuration et doit être de la forme name=value
+Une ligne '$name = $value' est ajoutée à la fin de la section, qui est
+créée si nécessaire à la fin du fichier de configuration
+Retourner 0 si une modification a été faite dans le fichier, 1 sinon
+Cette fonction nécessite gawk et ignore la locale
+}}}
+!! {{{mconf_array_append}}}
+!! {{{mconf_check}}}
+{{{
+Dans le fichier de configuration $1, tester si tous les paramètres $3..*
+sont présents dans la section $2
+Chaque argument de cette fonction correspond à une variable du fichier de
+configuration, et doit être de la forme name[=value]
+Si une valeur est spécifiée, vérifier que le fichier contient la valeur
+correspondante. Sinon, tester uniquement la présence de la directive.
+Cette fonction nécessite gawk et ignore la locale
+}}}
+!! {{{gconf_addline}}}
+{{{
+USAGE
+gconf_addline configfile -a BEGIN -z END NEWLINE
+Dans le fichier de configuration $1, ajouter la ligne NEWLINE entre les lignes
+BEGIN et END.
+-a BEGIN
+Spécifier une expression pour matcher une ligne de type BEGIN. Si
+cette option n'est pas spécifiée, on considère que le début de fichier
+matche la ligne BEGIN: la ligne NEWLINE est ajoutée dès que possible.
+Les lignes sont matchées dans l'ordre, i.e. avec '-a 1 -a 2', il faut
+d'abord trouver la ligne 1 puis la ligne 2, sinon, le test n'est pas
+concluant.
+-t LINE
+Si après avoir matché toutes les lignes BEGIN, la ligne LINE est
+rencontrée, alors considérer que la ligne à rajouter existe déjà et
+qu'il ne faut pas la rajouter de nouveau
+-r LINE
+Si après avoir matché toutes les lignes BEGIN, la ligne LINE est
+rencontrée, alors considérer que la ligne à rajouter existe et qu'il
+faut la mettre à jour. Supprimer la ligne existante et la remplacer
+par la nouvelle ligne.
+-z END
+Spécifier une expression pour matcher la ligne de type END. Que cette
+option soit ou non spécifiée, on considère toujours que la fin de
+fichier matche la ligne END. Ainsi, si END n'est pas trouvée, la ligne
+NEWLINE est ajoutée à la fin du fichier.
+Dès que la ligne END est rencontrée, et si aucun des tests -t ou -r
+n'est concluant, alors ajouter la nouvelle ligne avant celle-ci
+-n MAX[=1]
+Ajouter au plus MAX occurences de NEWLINE. Après avoir matché END, le
+cycle recommence, au plus MAX-1 fois. Utiliser MAX=-1 pour désactiver
+la limite
+Cette fonction nécessite gawk et ignore la locale
+Retourner 0 si l'ajout s'est fait correctement. Retourner 1 si BEGIN n'a
+pas été trouvé, et donc aucun ajout n'a été effectué. Retourner 2 si une
+erreur quelconque s'est produite
+}}}
+!! {{{writelines_maybe}}}
+
+
+
!! {{{add_to_crontab}}}
+!! {{{remove_from_crontab}}}
+!! {{{disable_in_crontab}}}
+!! {{{enable_in_crontab}}}
+!! {{{ctnow}}}
+{{{
+date +"%-M %-H %-d %-m %u"
+}}}
+!! {{{ctresolve}}}
+!! {{{get_default_crontabdir_prefix}}}
+!! {{{compute_crontab_prefixes}}}
+!! {{{recompute_crontab_prefixes}}}
+!! {{{get_CRONTABDIR_prefix}}}
+
+
+
!! {{{pkg_check}}}
+{{{
+Vérifier que les packages sont installés sur le système
+}}}
+!! {{{pkg_update}}}
+{{{
+Mettre à jour la liste des packages silencieusement sans confirmation
+}}}
+!! {{{pkg_upgrade}}}
+{{{
+Mettre à jour la liste des packages silencieusement sans confirmation
+}}}
+!! {{{pkg_install}}}
+{{{
+Installer les packages silencieusement et sans confirmation
+}}}
+!! {{{pkg_installm}}}
+{{{
+Installer les packages silencieusement et sans confirmation
+Retourner 0 si au moins un des packages a été installé. Sinon, les
+packages n'ont pas été installés, soit parce qu'ils sont déjà installé,
+soit parce qu'il y a eu une erreur.
+}}}
+!! {{{pkg_check_install}}}
+{{{
+Si le programme $1 n'existe pas, alors installer les packages $2..$@
+S'il n'y a pas d'arguments $2..$@ utiliser $1 comme nom de package
+Retourner 0 si au moins un des packages a été installé
+}}}
+!! {{{service_disable}}}
+{{{
+Désactiver le service $1 pour qu'il ne se lance pas automatiquement au
+démarrage
+}}}
+!! {{{service_enable}}}
+{{{
+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
+interfaces du tableau $2(=ifaces) est faite dans le fichier
+$3(=/etc/network/interfaces)
+}}}
+!! {{{network_interfaces_check_confip}}}
+{{{
+Vérifier que la configuration de l'interface $1, avec la passerelle $2,
+avec les adresses IP du tabbleau $3(=ipsuffixes) est faite dans le fichier
+$4(=/etc/network/interfaces)
+}}}
+!! {{{network_interfaces_remove_iface}}}
+{{{
+Supprimer dans le fichier $2(=/etc/network/interfaces) toute la
+configuration qui concerne l'interface $1
+}}}
+!! {{{network_interfaces_remove_ifaces}}}
+{{{
+Supprimer dans le fichier $2(=/etc/network/interfaces) toute la
+configuration qui concerne les interfaces du tableau $1=(ifaces)
+}}}
+!! {{{network_interfaces_remove_confbr}}}
+{{{
+Supprimer dans le fichier $3(=/etc/network/interfaces) toute la
+configuration qui concerne le bridge $1, et dont les interfaces sont
+listées dans le tableau $2(=ifaces)
+}}}
+!! {{{network_interfaces_add_confip}}}
+{{{
+ajouter dans le fichier $4(=/etc/network/interfaces) la configuration pour
+l'interface $1, avec éventuellement la passerelle $2, et les adresses ips
+telles qu'elles sont définies dans le table $3(=ipsuffixes)
+}}}
+!! {{{network_interfaces_add_confbr}}}
+{{{
+ajouter dans le fichier $4(=/etc/network/interfaces) la configuration pour
+le bridge $1, avec la liste des interfaces dans le tableau $2(=ifaces) et
+la liste des configurations des adresses des interfaces dans le tableau
+$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.
+$1 (host) est le nom d'hôte.
+$2 (confips) est le nom d'un tableau contenant la configuration des
+adresses ips pour les interfaces.
+$3 (confbrs) est le nom d'un tableau contenant la configuration des
+bridges à créer/mettre à jour.
+$4 (mainiface) est le nom de l'interface principale, c'est à dire
+l'interface qui est sélectionnée si une adresse ip n'est pas préfixée de
+son interface. En principe, l'interface principale est le premier bridge
+défini ou la première interface définie.
+$5 (reset_interfaces) spécifie de ne pas chercher à mettre à jour le
+fichier /etc/network/interfaces, mais de le recréer depuis zéro.
+$6 (oldhost) est le nom d'hôte actuel, avant la modification
+Si un des arguments n'est pas spécifié, il est ignoré.
+Le tableau confips doit contenir des définitions d'une des formes
+suivantes:
+[[iface][//gateway]:]address[/suffix],...
+[iface:]dhcp
+La deuxième forme est pour spécifier qu'une interface est configurée par
+DHCP. iface vaut par défaut eth0, sauf si une définition de bridge
+existe, auquel cas il s'agit du premier bridge défini. Pour chaque
+interface, seule la première spécification d'adresse IP tient compte de
+l'argument gateway. Les autres spécifications définissent des adresses IP
+supplémentaires pour l'interface.
+Le tableau brs doit contenir des définitions de la forme suivante:
+br:ifaces,...
+br est le nom du bridge, e.g. br0. ifaces est une liste d'interfaces
+séparées par une virgule. e.g. br0:eth0,eth1
+Bien que ce soit techniquement possible, ce script interdit que l'on
+définisse une adresse IP pour une interface faisant partie d'un bridge.
+}}}
+
+
+
!! {{{ensure_exists}}}
+{{{
+Créer le fichier vide "$1" s'il n'existe pas déjà, avec les permissions
+$2(=644). retourner vrai si le fichier a été créé sans erreur
+}}}
+!! {{{copy_replace}}}
+{{{
+Copier de façon inconditionnelle le fichier $1 vers le fichier $2, en
+réinitialisation les permissions à la valeur $3
+}}}
+!! {{{copy_new}}}
+{{{
+Copier le fichier "$1" vers le fichier "$2", avec les permissions $3(=644)
+Ne pas écraser le fichier destination s'il existe déjà
+Retourner vrai si le fichier a été copié sans erreur
+}}}
+!! {{{copy_update}}}
+{{{
+Copier le fichier "$1" vers le fichier "$2", si $2 n'existe pas, ou si $1
+a été modifié par rapport à $2. Réinitialiser le cas échéant les
+permissions à la valeur $3
+Retourner vrai si le fichier a été copié sans erreur.
+}}}
+!! {{{copy_update_ask}}}
+{{{
+Copier ou mettre à jour le fichier $1 vers le fichier $2.
+Si le fichier existe déjà, la différence est affichée, et une confirmation
+est demandée pour l'écrasement du fichier.
+Retourner vrai si le fichier a été copié sans erreur.
+}}}
+!! {{{copy_tree}}}
+{{{
+Copier de façon inconditionnelle l'arborescence $1 dans l'arborescence $2
+}}}
+!! {{{link_new}}}
+{{{
+Si $2 n'existe pas, créer le lien symbolique $2 pointant vers $1
+}}}
+
+
+
!! {{{get_random_kvm_macaddr}}}
+{{{
+Obtenir une adresse mac au hasard commençant par 52:54:00 pour KVM
+}}}
+!! {{{ipcalc_splitipmask}}}
+{{{
+Découper $1 de la forme ip[/mask] entre l'adresse ip, qui est placé dans
+la variable $2(=ip) et le masque, qui est placée dans la variable
+$3(=mask)
+}}}
+!! {{{ipcalc_checkip}}}
+{{{
+Vérifier l'adresse ip $1 pour voir si elle est valide. Si l'adresse est
+valide, l'afficher. Sinon, retourner 1
+}}}
+!! {{{ipcalc_checkmask}}}
+{{{
+vérifier le masque de sous-réseau $1 pour voir si elle est valide. Si oui,
+afficher le suffixe (0, 8, 16, 24, 32) associé. Sinon retourner 1
+}}}
+!! {{{ipcalc_netmask}}}
+{{{
+à partir d'un suffixe (0, 8, 16, 24, 32) ou d'un masque de sous-réseau,
+afficher le masque de sous-réseau. si le suffixe ou le masque ne sont pas
+reconnus, retourner 1
+}}}
+!! {{{ipcalc_broadcast}}}
+{{{
+Calculer l'adresse de broadcast correspondant à l'adresse ip $1. Le masque
+de sous-réseau peut-être indiqué dans l'adresse ip avec le suffixe /n ou
+/x.x.x.x ou donné dans l'argument $2. Seuls les suffixes 0, 8, 16, 24, 32
+sont supportés.
+Retourner 1 si un erreur s'est produite, par exemple si l'adresse ou le
+suffixe sont invalides ou non supportés.
+}}}
+!! {{{ipcalc_gateway}}}
+{{{
+Calculer l'adresse du gateway correspondant à l'adresse ip $1, en
+considérant que le gateway est la première adresse du réseau. Le masque de
+sous-réseau peut-être indiqué dans l'adresse ip avec le suffixe /n ou
+/x.x.x.x ou donné dans l'argument $2. Seuls les suffixes 0, 8, 16, 24, 32
+sont supportés.
+Retourner 1 si un erreur s'est produite, par exemple si l'adresse ou le
+suffixe sont invalides ou non supportés.
+}}}
+!! {{{ipcalc_match}}}
+{{{
+Vérifier si l'adresse $1 correspond au modèle $2, e.g.:
+ipcalc_match 10.75.0.23 10/8         --> TRUE
+ipcalc_match 10.75.0.23 10.75.0.0/24 --> TRUE
+ipcalc_match 10.75.0.23 10.75.0.28   --> FALSE
+}}}
+!! {{{ipcalc_fqdn}}}
+{{{
+Calculer si possible le nom pleinement qualifié correspondant à l'hôte $1.
+Dans tous les cas, afficher l'hôte, mais retourner 1 si la calcul n'a pas
+pu être effectué.
+}}}
+!! {{{ipcalc_fqdn_maybe}}}
+{{{
+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.
+}}}
+
+
+
!! {{{select_java}}}
+{{{
+sélectionner la version *minimum* de java correspondant à $1
+$1== 1.3|1.3+|1.4|1.4+|1.5|1.5+|1.6|1.6+|1.7|1.7+|1.8|1.8+
+Si $2 est défini, il peut s'agit de 32 ou 64 selon que l'on requière la
+version 32bits ou 64 bits
+}}}
+!! {{{select_java_exact}}}
+{{{
+sélectionner la version *exacte* de java correspondant à $1
+$1== 1.3|1.4|1.5|1.6|1.7|1.8 pour une correspondance exacte
+$1== 1.3+|1.4+|1.5+|1.6+|1.7+|1.8+ pour une version minimum
+Si $2 est défini, il peut s'agit de 32 ou 64 selon que l'on requière la
+version 32bits ou 64 bits
+}}}
+!! {{{select_java_any}}}
+{{{
+Sélectionner la version exacte de java correspondant aux arguments, dans
+l'ordre, jusqu'à ce qu'un argument corresponde. DEFAULT correspond à la
+valeur actuelle de JAVA_HOME, si elle est définie.
+Si aucun argument n'est défini, on assume "DEFAULT 5 6 7 8 1.4"
+}}}
+!! {{{get_default_javahome_prefix}}}
+!! {{{get_javaextensions_prefix}}}
+!! {{{compute_java_prefixes}}}
+!! {{{recompute_java_prefixes}}}
+!! {{{get_JAVA_HOME_prefix}}}
+!! {{{get_JAVAEXTENSIONS_prefix}}}
+
+
+
!! {{{read_property}}}
+{{{
+Lire la propriété $2 dans le fichier $1, et placer la valeur dans la
+variable $3. Si la propriété n'existe pas, prendre la valeur par défaut
+$4. Si $3=="", elle est construite à partir de $2 en remplaçant les '.'
+par '_'
+Retourner 1 si une erreur s'est produite (par exemple si le fichier
+n'existe pas ou n'est pas accessible en lecture)
+}}}
+!! {{{write_property}}}
+{{{
+Ecrire la propriété $2 dans le fichier $1 avec la valeur $3.
+Retourner 1 si une erreur s'est produite (par exemple si le fichier
+n'existe pas ou n'est pas accessible en écriture)
+}}}
+!! {{{write_properties}}}
+{{{
+Ecrire les propriétés $2..* dans le fichier $1. Les propriétés sont de la
+forme "name=value"
+}}}
+!! {{{norm_properties}}}
+{{{
+Normaliser un fichier de propriété: Les commentaires sont supprimés, les
+valeurs sont triées par ordre alphabétique, les caractères accentués sont
+remplacés par des caractères unicode \\uxxxx, les séquences unicodes sont
+transformées en minuscule.
+}}}
+
+
+
!! {{{json_filter}}}
+{{{
+traiter un flux json pour que chaque valeur soit sur une ligne séparée,
+facilitant le traitement par un script bash
+}}}
+!! {{{awkjson}}}
+
+
+
!! {{{get_default_ldapconfdir_prefix}}}
+{{{
+Calculer et afficher la valeur par défaut de LDAPCONFDIR, ou une chaine
+vide si l'on n'a pas pu le détecter automatiquement.
+}}}
+!! {{{get_default_ldapowner_prefix}}}
+{{{
+Calculer et afficher la valeur par défaut de LDAPOWNER, ou une chaine
+vide si l'on n'a pas pu le détecter automatiquement.
+}}}
+!! {{{compute_ldap_prefixes}}}
+!! {{{recompute_ldap_prefixes}}}
+!! {{{get_LDAPCONFDIR_prefix}}}
+!! {{{get_LDAPOWNER_prefix}}}
+!! {{{split_ldapuri}}}
+{{{
+spliter le ldapuri $1 en $2(=proto), $3(=host) et $4(=port)
+}}}
+!! {{{get_suffixes}}}
+{{{
+obtenir les suffixes de connexion du serveur avec l'uri $1, un par ligne
+retourner 1 si la valeur n'a pas pu être obtenue
+}}}
+!! {{{get_anysuffix}}}
+{{{
+obtenir le *premier* suffixe du serveur avec l'uri $1
+retourner 1 si la valeur n'a pas pu être obtenue
+}}}
+!! {{{get_dcsuffix}}}
+{{{
+obtenir le *premier* suffixe du serveur avec l'uri $1 qui se termine par
+dc=TLD où TLD est une valeur quelconque. A priori, c'est un suffixe d'une
+base de donnée non administrative.
+retourner 1 si la valeur n'a pas pu être obtenue
+}}}
+!! {{{get_suffix}}}
+{{{
+obtenir le *premier* suffixe du serveur avec l'uri $1 qui se termine si
+possible par dc=TLD où TLD est une valeur quelconque. Dans le cas normal,
+le suffixe affiché est celui d'une base non administrative.
+retourner 1 si la valeur n'a pas pu être obtenue
+}}}
+!! {{{reldn}}}
+!! {{{absdn}}}
+{{{
+obtenir le dn absolu correspondant au dn $1, le dn de base étant
+$2(=$SUFFIX)
+}}}
+!! {{{subof}}}
+{{{
+tester si le dn absolu $1 est $2 ou un enfant de $2
+}}}
+!! {{{rabsdn}}}
+{{{
+comme absdn, mais tient compte de la valeur de $3(=$SEARCHBASE)
+Si le dn commence par "~/", le dn est relatif à $2(=$SUFFIX)
+Si le dn commence par "/", le dn est absolu
+Sinon, le dn est relatif à $3
+}}}
+!! {{{pdn}}}
+{{{
+corriger pour *affichage* un dn *absolu*. pour la racine "", afficher
+'/'. pour $2(=$SUFFIX), afficher '~'. sinon, afficher le dn relativement à
+$2
+}}}
+!! {{{filter_slapdconf}}}
+{{{
+Traiter un fichier de configuration slapd.conf en fusionnant les lignes
+qui sont découpées. Ceci permet de faire des traitements sur le contenu.
+Ce filtre s'utilisera normalement avec filter_conf, e.g.:
+<slapd.conf filter_slapdconf | filter_conf >result.conf
+}}}
+
+
+
!! {{{def_match_attr}}}
+!! {{{def_match_value}}}
+!! {{{uncut_lines}}}
+{{{
+reformer les lignes qui sont coupées
+}}}
+!! {{{cut_lines}}}
+{{{
+couper les lignes trop longues
+}}}
+!! {{{ensure_complete_objects}}}
+{{{
+S'assurer que le ldif ne contient que des objets complets (éliminant ainsi
+les groupes ayant seulement dn:)
+}}}
+!! {{{delete_marked_objects}}}
+{{{
+Supprimer les objets marqués avec --DELETE--:
+}}}
+!! {{{dump_ldif}}}
+!! {{{tl_addattr}}}
+!! {{{tl_modifyattr}}}
+!! {{{tl_deleteattr}}}
+!! {{{tl_deleteentry}}}
+!! {{{tl_touchentry}}}
+!! {{{tl_keepattr}}}
+!! {{{tl_keepval}}}
+!! {{{tl_excludeattr}}}
+!! {{{tl_excludeval}}}
+!! {{{tl_keepvalentry}}}
+!! {{{tl_excludevalentry}}}
+!! {{{tl_replval}}}
+!! {{{tl_addval}}}
+!! {{{tl_defval}}}
+!! {{{print_values}}}
+!! {{{tl_ensureval}}}
+!! {{{print_ensure_values}}}
+!! {{{tl_decode}}}
+!! {{{tl_encode}}}
+!! {{{tl_format}}}
+!! {{{dump_headers}}}
+!! {{{tl_formatcsv}}}
+!! {{{tl_parsecsv}}}
+!! {{{tl_parsecsvmod}}}
+!! {{{get_transform_cmd}}}
+{{{
+Créer une liste de commandes bash à évaluer en fonction des arguments: une
+suite de commandes séparées par //
+Les variables suivantes peuvent être définies en entrée:
+_T_inputfile:
+Si cette variable est non vide, lire à partir du fichier $_T_inputfile
+au lieu de stdin
+_T_uncut_before:
+faut-il fusionner automatiquement les lignes *avant* de lancer les
+commandes.
+_T_cut_after:
+faut-il découper automatiquement les lignes *après* avoir lancé les
+commandes.
+}}}
+!! {{{transform}}}
+
+
+
!! {{{file_get_vars}}}
+{{{
+lire les variables dans un fichier
+}}}
+!! {{{file_set_vars}}}
+{{{
+écrire les variables dans un fichier. Le fichier *doit exister*
+}}}
+!! {{{write_all_remaining_vars}}}
+!! {{{file_get_properties}}}
+{{{
+lire les propriétés d'un fichier de propriété java ou xml
+}}}
+!! {{{file_set_properties}}}
+{{{
+écrire les propriétés d'un fichier de propriété java ou xml
+}}}
+!! {{{file_get_java_properties}}}
+{{{
+lire les propriétés d'un fichier de propriétés java. note: les noms de
+propriété java peuvent contenir le caractère "." mais pas les noms de
+variable bash. La conversion est faite automatiquement. Par exemple::
+file_get_properties build.properties path.to.package "default value"
+charge la valeur de la propriété dans la variable path_to_package
+}}}
+!! {{{file_set_java_properties}}}
+{{{
+écrire des propriétés dans un fichier de propriétés java.
+}}}
+!! {{{write_all_remaining_vars}}}
+!! {{{file_get_xml_properties}}}
+{{{
+lire les propriétés d'un fichier de propriétés xml. Limitation: les
+propriétés ne doivent pas être continuées sur plusieurs lignes. Les
+propriétés doivent être écrites sous la forme::
+<propname>propvalue</propname>
+}}}
+!! {{{file_set_xml_properties}}}
+{{{
+écrire des propriétés dans un fichier de propriétés java.
+}}}
+!! {{{write_all_remaining_vars}}}
+
+
+
!! {{{local_shellfix}}}
+{{{
+Modifier le compte local $1 pour qu'il utilise bash au lieu de sh
+}}}
+!! {{{local_usercheck}}}
+{{{
+Vérifier si le user local $1 existe
+}}}
+!! {{{local_useradd}}}
+{{{
+Créer le user local $1
+USAGE: local_useradd username [gecos [passwd]]
+OPTIONS
+-s  Créer l'utilisateur avec les droits d'administrateur
+-m  Créer le home directory
+}}}
+
+
+
!! {{{mkcrypt}}}
+
+
+
!! {{{printml}}}
+!! {{{addml}}}
+
+
+
!! {{{SERVICE_OVERRIDE_network_manager_stopx}}}
+{{{
+désactiver network-manager avant de l'arrêter, ce qui permet de s'assurer
+que chaque chaque connexion est arrêtée proprement
+}}}
+!! {{{SERVICE_OVERRIDE_network_manager_startx}}}
+{{{
+cette fonction est le pendant de stopx: penser à relancer network-manager
+après avoir démarré le service
+}}}
+
+
+
!! {{{random_index}}}
+{{{
+Afficher un index au hasard dans le tableau $1
+}}}
+!! {{{random_value}}}
+{{{
+Afficher une valeur au hasard dans le tableau $1
+}}}
+!! {{{random_char}}}
+{{{
+Afficher un caractère au hasard dans la chaine $1
+}}}
+!! {{{genpass}}}
+{{{
+Générer un mot de passe au hasard avec les paramètres GENPASS_*
+}}}
+
+
+
!! {{{pkg_check}}}
+{{{
+Vérifier que les packages sont installés sur le système
+Retourner 123 si le système n'est pas supporté, et donc qu'aucune commande
+d'installation de package n'est disponible.
+}}}
+!! {{{pkg_install}}}
+{{{
+Installer les packages sans confirmation
+Retourner 123 si le système n'est pas supporté, et donc qu'aucune commande
+d'installation de package n'est disponible.
+}}}
+
+
+
!! {{{get_USER_prefix}}}
+!! {{{get_HOME_prefix}}}
+!! {{{has_prefix}}}
+!! {{{expand_prefix}}}
+!! {{{list_prefixes}}}
+!! {{{dump_prefixes}}}
+
+
+
!! {{{get_color}}}
+!! {{{set_verbosity}}}
+!! {{{set_interaction}}}
+!! {{{show_error}}}
+!! {{{show_warn}}}
+!! {{{show_info}}}
+!! {{{show_verbose}}}
+!! {{{show_debug}}}
+!! {{{check_verbosity}}}
+!! {{{get_verbosity_option}}}
+!! {{{check_interaction}}}
+!! {{{is_interaction}}}
+!! {{{get_interaction_option}}}
+
+
+
!! {{{is_any_branch}}}
+!! {{{is_master_branch}}}
+!! {{{is_develop_branch}}}
+!! {{{is_release_branch}}}
+!! {{{is_hotfix_branch}}}
+!! {{{is_feature_branch}}}
+!! {{{list_release_branches}}}
+!! {{{list_hotfix_branches}}}
+!! {{{list_feature_branches}}}
+!! {{{pver}}}
+
+
+
!! {{{pkg_check}}}
+{{{
+Vérifier que les packages sont installés sur le système
+}}}
+!! {{{pkg_update}}}
+{{{
+Mettre à jour la liste des packages silencieusement sans confirmation
+}}}
+!! {{{pkg_upgrade}}}
+{{{
+Mettre à jour la liste des packages silencieusement sans confirmation
+}}}
+!! {{{pkg_install}}}
+{{{
+Installer les packages silencieusement et sans confirmation
+}}}
+!! {{{pkg_installm}}}
+{{{
+Installer les packages silencieusement et sans confirmation
+Retourner 0 si au moins un des packages a été installé. Sinon, les
+packages n'ont pas été instllés, soit parce qu'ils sont déjà installé,
+soit parce qu'il y a eu une erreur.
+}}}
+!! {{{service_disable}}}
+{{{
+Désactiver le service $1 pour qu'il ne se lance pas automatiquement au
+démarrage
+}}}
+!! {{{service_enable}}}
+{{{
+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
+}}}
+
+
+
!! {{{runs_initdir}}}
+{{{
+Initialiser le répertoire d'hôte. $1 est un nom d'hôte pleinement
+qualifié, et les fichiers sont créés dans le premier répertoire de
+RUNSHOSTSDIRS qui convient: si un fichier .udir existe avec un tableau
+runs_domains qui contient le domaine de l'hôte spécifié, alors c'est ce
+répertoire qui est sélectionné. Sinon, on prend le premier répertoire de
+RUNSHOSTSDIRS.
+$2 spécifie si le fichier doit être créé avec de l'aide (yes) ou avec le
+script minimum (no)
+$3 est le contenu à placer dans le fichier sysinfos.conf, s'il n'a pas
+déjà été provisionné.
+Il faut lancer __runs_setpath avant d'utiliser cette fonction et
+RUNSHOSTDIRS ne doit pas être vide
+}}}
+!! {{{runs_create_rscript}}}
+{{{
+Créer un modèle de script. Si $2 est spécifié, c'est un nom d'hôte
+pleinement qualifié. Le répertoire d'hôte correspondant *doit* exister.
+$3 spécifie si le fichier doit être créé avec de l'aide (yes) ou avec le
+script minimum (no)
+Si $2!="", il faut lancer __runs_setpath avant d'utiliser cette fonction
+et RUNSHOSTDIRS ne doit pas être vide
+Le chemin du nouveau script est ajouté au tableau new_rscripts
+}}}
+!! {{{runs_unsupported_system}}}
+{{{
+Afficher un message d'erreur indiquant que le système actuel n'est pas
+supporté, et quitter le script
+}}}
+!! {{{runs_require_sysinfos}}}
+{{{
+Vérifier le système actuel avec check_sysinfos(), et afficher un message
+d'erreur avec runs_unsupported_system() s'il ne correspond pas à la
+requête
+}}}
+!! {{{runs_find_host}}}
+!! {{{runs_add_domain}}}
+{{{
+Si $1 est nom d'hôte pleinement qualifié, retourner cette valeur
+Sinon, lui rajouter le domaine RUNSDOMAIN
+}}}
+!! {{{runs_find_hostfile}}}
+{{{
+Trouver et afficher le fichier d'hôte $1 dans les répertoires du tableau
+$3(=RUNSHOSTSDIRS), pour l'hôte $2(=$RUNSHOST). Retourner 0 en cas de
+succès, 1 en cas d'échec.
+Si host=$2 est une valeur non vide, la recherche est effectuée dans
+{$RUNSHOSTSDIRS}/$host et {$RUNSHOSTSDIRS}/$domain/$hostname. Sinon,
+retourner 1, car il faut spécifier un nom d'hôte.
+}}}
+!! {{{runs_find_datafile}}}
+{{{
+Trouver et afficher le fichier de données $1 dans le répertoire $3 s'il
+est non vide puis dans les répertoires des tableaux $4(=RUNSSCRIPTSDIRS),
+$5(=RUNSMODULESDIRS) et $6(=RUNSHOSTSDIRS), pour l'hôte
+$2(=$RUNSHOST). Retourner 0 en cas de succès, 1 en cas d'échec.
+- D'abord, si $1 *n'est pas* de la forme "./path" ou "../path", chercher
+dans $3.
+- Puis si l'hôte est spécifié, chercher dans {$RUNSHOSTSDIRS}/$host et
+{$RUNSHOSTSDIRS}/$domain/$hostname.
+- Puis chercher dans {$RUNSSCRIPTSDIRS} puis {$RUNSMODULESDIRS}.
+- Puis, si $1 est de la forme "./path" ou "../path", chercher dans $3.
+- Sinon, retourner 1
+}}}
+!! {{{runs_initvars}}}
+{{{
+Initialiser les variables RUNSDIR, RUNSSCRIPT, RUNSDIRPATH,
+RUNSSCRIPTPATH, RUNSSCRIPTDIR et RUNSSCRIPTNAME pour le script $1.
+Les valeurs sont initialisées comme suit:
+RUNSSCRIPT="$(abspath "$1")"
+RUNSDIR="$2" (le répertoire de $RUNS*PATH dans lequel a été trouvé le
+script)
+Si $3!="", RUNSDIRPATH="$3" et RUNSSCRIPTPATH="$4"
+Sinon, RUNSDIRPATH="$RUNSSCRIPTDIR" et RUNSSCRIPTPATH="$RUNSSCRIPTNAME"
+}}}
+!! {{{runs_find_scriptfile}}}
+{{{
+Trouver sans l'afficher le script $1 dans les répertoires des tableaux
+$3(=RUNSSCRIPTSDIRS), $4(=RUNSMODULESDIRS) et $5(=RUNSHOSTSDIRS), en
+considérant que le script sera lancé sur l'hôte $2(=$RUNSHOST), et
+initialiser les variables RUNSDIR, RUNSSCRIPT, RUNSSCRIPTDIR,
+RUNSSCRIPTNAME, RUNSDIRPATH et RUNSSCRIPTPATH. Retourner 0 en cas de
+succès, 1 en cas d'échec.
+$6 vaut ".rs" par défaut est c'est une extension à rajouter au nom
+spécifié si le fichier sans l'extension n'existe pas
+RUNSDIR est le répertoire dans lequel a été trouvé le script (parmi les
+valeurs fournies dans les tableaux RUNSSCRIPTSDIRS, RUNSMODULESDIRS,
+RUNSHOSTSDIRS), RUNSDIRPATH est le répertoire à partir duquel est exprimé
+le chemin du script (i.e RUNSDIRPATH + RUNSSCRIPTPATH == RUNSSCRIPT),
+RUNSSCRIPT contient le chemin absolu vers le script, RUNSSCRIPTPATH
+contient le chemin du script dans RUNSDIRPATH, RUNSSCRIPTDIR le répertoire
+du script, et RUNSSCRIPTNAME le nom du script.
+D'abord, si l'hôte est spécifié, chercher dans {$RUNSHOSTSDIRS}/$host et
+{$RUNSHOSTSDIRS}/$domain/$hostname. Puis chercher dans {$RUNSSCRIPTSDIRS}
+}}}
+!! {{{runs_find_scriptfile_reverse}}}
+{{{
+Soit le fichier de script $1, exprimée de façon absolue, trouver le
+fichier parmi les tableaux $3(=RUNSSCRIPTSDIRS), $4(=RUNSMODULESDIRS)
+et $5(=RUNSHOSTSDIRS), en considérant que le script sera lancé sur l'hôte
+$2(=$RUNSHOST), puis initialiser les variables RUNSDIR, RUNSSCRIPT,
+RUNSSCRIPTDIR, RUNSSCRIPTNAME, RUNSDIRPATH et RUNSSCRIPTPATH. Retourner 0
+en cas de succès, 1 en cas d'échec.
+}}}
+!! {{{runs_rscript}}}
+{{{
+Lancer le fichier $1 comme un script avec les arguments $2..$*. Retourner
+la valeur de retour du script.
+}}}
+!! {{{runs_recipe}}}
+{{{
+Lancer les scripts de la recette contenue dans le fichier $1. Arrêter au
+premier script qui est en erreur
+}}}
+!! {{{runs_rscriptpath}}}
+{{{
+Lancer le script $1 avec les arguments $2..$*. Le script est cherché dans
+les répertoires de RUNSSCRIPTSPATH. Retourner 123 si le script n'est pas
+trouvé, sinon retourner la valeur de retour du script.
+}}}
+!! {{{runs_recipepath}}}
+{{{
+Lancer la recette $1. Le fichier de recette est cherché dans les
+répertoires de RUNSSCRIPTSPATH. Retourner 123 si le fichier de recette n'a
+pas été trouvé, sinon retourner la valeur de retour de runs_recipe()
+}}}
+!! {{{runs_init}}}
+!! {{{runs_initdomains}}}
+{{{
+Si ce n'est pas déjà le cas, initialiser RUNSDOMAINS en fonction de
+/etc/resolv.conf
+}}}
+!! {{{runs_inithost}}}
+!! {{{runs_initsysinfos}}}
+!! {{{runs_initworkdir}}}
+!! {{{runs_after_export}}}
+{{{
+après l'export, initialiser varsfile avec les valeurs qu'il faut garder
+entre le déploiement local et le déploiement distant.
+}}}
+!! {{{runs_check_runsscript}}}
+!! {{{runs_var}}}
+{{{
+Initialiser les variables selon les directives données en ligne de
+commande.
+Les arguments peuvent être une suite de définitions de la forme
+'scalar=value', 'scalar!=name', 'array+=value', 'array-=value' ou
+'array@=name'.
+Sinon, le *dernier* argument peut-être de l'une des formes suivantes:
+'array value0 [value1...]' pour initialiser un tableau,
+'array+ value0 [value1...]' pour ajouter des valeurs à un tableau,
+'array- value0 [value1...]' pour enlever des valeurs à un tableau.
+Les formes 'scalar!=value' et 'array@=value' sont des indirections et
+permettent d'initialiser la variable avec la valeur d'une autre
+variable. L'avantage est que la résolution de la valeur est faite
+uniquement lors de l'appel de cette fonction, ce qui est utile avec des
+fonction comme 'after -r'
+}}}
+!! {{{runs_conf}}}
+{{{
+Activer les flags $*
+}}}
+!! {{{runs_indref}}}
+{{{
+fonction de convenance pour créer des références $3..* avec le fichier de
+configuration $1 et les variables $2
+}}}
+!! {{{runs_refcerts}}}
+{{{
+fonction de convenance pour créer une référence à un répertoire contenant
+des certificats mentionnés dans le fichier de configuration $1. Si les
+références $2..* ne sont pas mentionnées, la variable certsdir dans le
+fichier de configuration est utilisée.
+}}}
+!! {{{runs_refapacheconfig}}}
+{{{
+fonction de convenance pour créer les références à un répertoire de
+configuration pour apache.
+USAGE: refapacheconfig autoconfdir=path/to/autoconfdir [certsdir=[path/to/certsdir]]
+- autoconfdir= est requis et permet de définir à la fois la variable qui
+contiendra la référence ainsi que le répertoire à référencer.
+- certsdir= est optionel. Si cet argument est spécifié sous la forme
+certsdir=path/to/certsdir, il permet de définir à la fois la variable qui
+contiendra la référence ainsi que le répertoire à référencer. Si
+l'argument est spécifié sous la forme certsdir=, il permet de définir la
+variable qui contiendra la référence. C'est cette variable qui sera lue
+dans les fichiers de configuration. Si l'argument n'est pas spécifié, on
+considère que l'argument 'certsdir=' a été utilisé.
+}}}
+!! {{{runs_set_lang}}}
+{{{
+Charger la valeur de LANG depuis l'environnement. La variable LANG est
+initialisée
+}}}
+!! {{{runs_set_proxy}}}
+{{{
+Charger la valeur du proxy depuis l'environnement. Les variables
+http_proxy, ftp_proxy et no_proxy sont initialisées
+}}}
+!! {{{runs_check_confs}}}
+{{{
+Vérifier l'état courant par rapport aux flags
+}}}
+!! {{{runs_after}}}
+{{{
+Vérifier que ce script est lancé après le scriptpath $1, par rapport à
+RUNSSTORY
+}}}
+!! {{{runs_clvars}}}
+{{{
+Traiter les spécifications de variables données en ligne de commande ou
+dans un fichier de recettes
+}}}
+!! {{{runs_indvars}}}
+{{{
+Résoudre les valeurs effectives des variables qui sont des indirections
+}}}
+!! {{{runs_clvars_cmd}}}
+{{{
+écrire la ligne de recette correspondant au script $1 et aux variables
+$2..$*
+}}}
+!! {{{runs_loadconfs}}}
+!! {{{runs_clearvars}}}
+!! {{{runs_action_desc}}}
+!! {{{runs_action_dump}}}
+!! {{{runs_action_run}}}
+!! {{{runs_action_export}}}
+!! {{{shouldrun}}}
+!! {{{checkdone}}}
+!! {{{requiredone}}}
+!! {{{setdone}}}
+!! {{{resetdone}}}
+
+
+

+
+
+
!! {{{runsmod_checkenv}}}
+{{{
+vérifier l'environement. créer les répertoires nécessaires.
+}}}
+!! {{{runsmod_should_update_repolists}}}
+{{{
+tester s'il faut mettre à jour au moins un des fichiers contenant les
+listes des dépôts
+}}}
+!! {{{runsmod_update_repolists}}}
+{{{
+mettre à jour si nécessaire les fichiers contenant les listes des dépôts.
+Si $1 n'est pas vide, forcer la mise à jour de tous les fichiers
+}}}
+!! {{{runsmod_setup_vars}}}
+{{{
+récupérer configuration statique pour la mettre à jour
+}}}
+!! {{{runsmod_clone_or_pull}}}
+{{{
+Chercher les modules $3..@, pour l'hôte $1 qui est le mode d'hôte: none,
+all, self ou one pour un hôte spécifique $2. Ajouter les chemins dans le
+tableau REPO_DIRS. Mettre à jour les tableaux SCRIPTS_DIRS, MODULES_DIRS
+et HOSTS_DIRS
+}}}
+!! {{{runsmod_teardown_vars}}}
+
+
+
!! {{{semver_parse}}}
+!! {{{semver_incmajor}}}
+!! {{{semver_incminor}}}
+!! {{{semver_incpatchlevel}}}
+!! {{{semver_setversion}}}
+!! {{{semver_setprelease}}}
+!! {{{semver_compare_prelease}}}
+!! {{{semver_setmetadata}}}
+!! {{{semver_addmetadata}}}
+!! {{{semver_compare_metadata}}}
+{{{
+même algo que pour prelease
+}}}
+!! {{{semver_copy}}}
+!! {{{semver_build}}}
+!! {{{semver_setvar}}}
+!! {{{psemver_parse}}}
+!! {{{psemver_incmajor}}}
+!! {{{psemver_incminor}}}
+!! {{{psemver_incpatchlevel}}}
+!! {{{psemver_setversion}}}
+!! {{{psemver_setprelease}}}
+!! {{{psemver_compare_prelease}}}
+!! {{{psemver_setmetadata}}}
+!! {{{psemver_addmetadata}}}
+!! {{{psemver_compare_metadata}}}
+!! {{{psemver_copy}}}
+!! {{{psemver_build}}}
+!! {{{psemver_setvar}}}
+
+
+
!! {{{service}}}
+!! {{{service_start}}}
+{{{
+démarrer le service $1 de façon inconditionnelle
+}}}
+!! {{{service_startm}}}
+{{{
+démarrer le service $1 s'il n'est pas déjà démarré
+}}}
+!! {{{service_stop}}}
+{{{
+arrêter le service $1 de façon inconditionnelle
+}}}
+!! {{{service_stopm}}}
+{{{
+arrêter le service $1 s'il n'est pas déjà arrêté
+}}}
+!! {{{service_reload}}}
+{{{
+recharger le service $1
+}}}
+!! {{{service_status}}}
+{{{
+tester/afficher le status du service $1
+}}}
+
+
+
!! {{{read_data}}}
+!! {{{dump_data}}}
+!! {{{compute_local_sysinfos}}}
+!! {{{compute_remote_sysinfos}}}
+!! {{{ensure_sysinfos}}}
+{{{
+Essayer de déterminer les valeurs des variables $1(=SYSNAME), $2(=SYSDIST)
+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
+}}}
+!! {{{get_sysinfos_desc}}}
+{{{
+Afficher une chaine de la forme SYSNAME/SYSDIST/SYSVER qui décrit le
+système actuel
+}}}
+!! {{{check_sysinfos}}}
+{{{
+Tester si le système courant ($MYSYSNAME, $MYSYSDIST, $MYSYSVER, $MYBITS)
+correspond à au moins un des arguments.
+Il est possible de spécifier des variables différentes pour tester le
+système courant avec l'option --vars qui doit être spécifiée en premier:
+check_sysinfos --vars sysname sysdist sysver bits -d debian
+Les options -s, -d, -v, -b permettent respectivement de vérifier le
+système, la distribution, la version et le nombre de bits. Il est possible
+de spécifier plusieurs tests à effectuer, e.g.:
+check_sysinfos -d debian ubuntu -b 64
+pour tester si l'on est sur une distribution debian ou ubuntu *et* sur un
+système 64 bits
+Note: avec l'option --vars, il peut arriver que sysname, sysdist ou sysver
+ne soient pas des tableaux mais des variables scalaires, surtout si elles
+sont fournies par l'utilisateur. Il est conseillé dans ce cas de tester
+toutes les possibilités quand on vérifie une valeur, e.g.:
+check_sysinfos --vars sysname sysdist sysver bits -s linux64 linux32 linux
+pour tester si on est sur un système linux
+Avec l'option -v, il est possible de suffixer la valeur avec + ou - selon
+que l'on veut toutes les versions situées après ou avant la version
+spécifiée. Attention, à cause d'une limitation de l'implémentation, il
+faut alors impérativement filtrer aussi sur la distribution, e.g:
+check_sysinfo -d debian -v lenny+
+pour tester si on est en lenny ou en squeeze.
+De même, l'option -d accepte aussi de suffixer la valeur avec + ou -, mais
+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+
+}}}
+!! {{{on_debian}}}
+{{{
+Tester si on est sur debian. charger le module debian si c'est le cas.
+Si une commande $1..@ est spécifiée, la lancer, mais il n'est alors plus
+possible de lancer des tests plus spécifiques avec __on_debian()
+}}}
+!! {{{on_debian:}}}
+!! {{{on_stretch}}}
+!! {{{on_jessie}}}
+!! {{{on_wheezy}}}
+!! {{{on_squeeze}}}
+!! {{{on_default}}}
+
+
+
!! {{{template_list}}}
+{{{
+Soit $N le séparateur --, lister les fichiers des répertoires sources
+$2..$(N-1) qui seraient fusionnés avec template_merge() ou supprimés avec
+template_unmerge() du répertoire destination $1. Si des chemins sont spécifiés
+avec les arguments $(N+1)..@, ne traiter que les fichiers qui correspondent à
+ces spécifications. Exemple:
+template_list destdir srcdirs... -- specs...
+}}}
+!! {{{template_merge}}}
+{{{
+Soit $N le séparateur --, copier dans le répertoire destination $1 les
+fichiers des répertoires sources $2..$(N-1) correspondant aux spécifications
+$(N+1)..@, si ces fichiers n'ont pas été modifiés dans le répertoire de
+destination.
+Les fichiers sources ayant l'extension .template sont ignorés par défaut, sauf
+s'ils sonts demandés explicitement. Exemple:
+template_merge destdir srcdirs... -- specs...
+}}}
+!! {{{template_unmerge}}}
+{{{
+Soit $N le séparateur --, supprimer du répertoire destination $1 les fichiers
+provenant des répertoires sources $2..$(N-1) et qui n'ont pas été modifiés. Si
+des chemins sont spécifiés avec les arguments $(N+1)..@, ne traiter que les
+fichiers qui correspondent à ces spécifications. Exemple:
+template_unmerge destdir srcdirs... -- specs...
+}}}
+!! {{{template_cleandest}}}
+{{{
+Supprimer dans le répertoire de destination $1 tous les répertoires vides.
+Cette fonction est habituellement utilisée après template_unmerge()
+Ignorer les chemins qui contiennent .git/ et .svn/
+}}}
+!! {{{template_diff}}}
+{{{
+Afficher les différences entre les fichiers du répertoire de destination $1 et
+les fichiers des répertoires sources $2..@
+}}}
+!! {{{template_srcdir}}}
+{{{
+Obtenir le chemin vers le répertoire source de templates $1, situé dans
+ULIBDIR/templates
+}}}
+!! {{{templatectl_config}}}
+{{{
+Obtenir le chemin vers le fichier de configuration pour le répertoire $1
+Si $2==nohideconfig, utiliser le nom CONFIG.conf, sinon utiliser par défaut
+.CONFIG sauf si le fichier CONFIG.conf existe
+}}}
+!! {{{templatectl_loadvars}}}
+{{{
+Charger les valeurs des variables depuis le fichier $1
+Les variables suivantes doivent être définies:
+- Le tableau TEMPLATECTL_DEFAULTS permet de donner une valeur par défaut aux
+variables mentionnées dans TEMPLATE_STATIC_VARS. C'est une liste de valeurs
+de la forme 'name=value'
+- Le tableau TEMPLATECTL_VARS contient des variables supplémentaires
+spécifiées par l'utilisateur. C'est une liste de valeurs de la forme
+'name=value'
+- TEMPLATE_STATIC_VARS doit contenir une liste de noms de variables qui
+peuvent être remplacés dans les fichiers de template.
+- TEMPLATE_DYNAMIC_VARS contient une liste de noms de variables valides, mais
+qui ne doivent pas être remplacés, en effet, ils sont utilisés pour le
+déploiement des fichiers.
+- TEMPLATE_NOWRITE_VARS contient une liste de noms de variables qui ne
+devraient pas être écrits dans le fichier des variables, sauf si elles
+reçoivent une valeur explicite de la part de l'utilisateur. Ce tableau est
+mis à jour lors de l'analyse du tableau TEMPLATECTL_VARS
+}}}
+!! {{{templatectl_writevars}}}
+{{{
+Ecrire les variables dans le fichier $1
+}}}
+!! {{{templatectl_list_vars}}}
+{{{
+Afficher les valeurs des variables
+}}}
+!! {{{templatectl}}}
+{{{
+Fonction de haut niveau qui facilite l'utilisation des fonctions template_*
+définir la fonction __display_templatectl_help() pour l'affichage de l'aide
+- Le tableau TEMPLATECTL_SRCDIRS doit contenir la liste des répertoires
+sources pour les templates. Alternativement, il est possible de définir la
+variable TEMPLATECTL_SRCDIR s'il n'y a qu'un seul répertoire source pour le
+template
+- TEMPLATECTL_CONFIG est le nom de base du fichier à partir duquel sont
+chargées les variables et dans lequel sont écrites les variables avec
+l'option --write-vars
+Si le nom de base est CONFIG, le fichier s'appelera .CONFIG si l'option
+--hide-config est utilisée (par défaut) ou CONFIG.conf si l'option
+--no-hide-config est utilisée
+Les variables de template_loadvars() sont aussi prises en compte
+}}}
+
+
+
!! {{{twget_version}}}
+{{{
+lire le numéro de version dans le fichier $1
+}}}
+!! {{{twdump_header}}}
+{{{
+lire et afficher le contenu avant-storeArea du tiddlywiki $1
+}}}
+!! {{{twdump_footer}}}
+{{{
+lire et afficher le contenu après-storeArea du tiddlywiki $1
+}}}
+!! {{{twdump_storeArea}}}
+{{{
+lire et afficher le storeArea dans le tiddlywiki $1
+}}}
+!! {{{twreplace_storeArea}}}
+{{{
+dans le tiddlywiki $1, remplacer le storeArea par le fichier $2 (par défaut, lu sur stdin)
+}}}
+!! {{{twupgrade}}}
+{{{
+mettre à jour le tiddlywiki $1 sur la base du tiddlywiki plus récent $2
+}}}
+!! {{{twdate_curtwp}}}
+{{{
+obtenir la date courante dans le format "dd/mm/YYYY HH:MM" exprimée dans
+l'heure locale
+$1 est éventuellement la date exprimée en nombre de secondes depuis
+l'epoch, exprimée dans l'heure locale
+}}}
+!! {{{twdate_tid2twp}}}
+{{{
+Transformer $1, une date de la forme "YYYYmmddHHMM" exprimée dans le
+timezone UTC en une chaine "dd/mm/YYYY HH:MM" exprimée dans l'heure locale
+Si $1 n'est pas dans le bon format, ne rien afficher
+}}}
+!! {{{twdate_curtid}}}
+{{{
+obtenir la date courante dans le format "YYYYmmddHHMM" exprimée dans le
+timezone UTC
+$1 est éventuellement la date exprimée en nombre de secondes depuis
+l'epoch, exprimée dans l'heure locale
+}}}
+!! {{{twdate_twp2tid}}}
+{{{
+Transformer $1, une date de la forme "dd/mm/YYYY HH:MM" exprimée en heure
+locale en une chaine "YYYYmmddHHMM" exprimée dans le timezone UTC
+Si $1 n'est pas dans le bon format, ne rien afficher
+}}}
+!! {{{twdump_tiddlers}}}
+{{{
+dumper les tiddlers du fichier $1 généré avec twdump_storeArea() sous
+forme d'une liste d'appel de fonction '__tiddler_data title creator
+modifier created modified tags changecount content'
+Les arguments de la fonction sont les valeurs brutes du tiddler, qui ont
+simplement été corrigées avec unquote_html()
+}}}
+!! {{{dump_tiddler}}}
+!! {{{twdump_twpage}}}
+{{{
+Dumper le contenu de la twpage $1 sous forme d'un appel à une function
+'__twpage_data title creator modifier created modified tags changecount
+content'
+Les arguments de la fonction sont les valeurs brutes de la twpage, sauf
+que le champ modified contient toujours la date de dernière modification
+du fichier.
+}}}
+!! {{{twwrite_tiddler}}}
+{{{
+Ecrire sur STDOUT le tiddler correspondant aux paramètres sont spécifiés
+sur la ligne de commande. Les arguments sont les valeurs brutes prises de
+la twpage, telles qu'elles sont générées par twdump_twpage()
+}}}
+!! {{{twcheck_twpage_modified}}}
+{{{
+Vérifier si la twpage $1 peut être écrasée par un tiddler dont la date de
+modification est $2, de format "YYYYmmddHHMM" exprimée dans le timezone
+UTC
+C'est le cas si le fichier $1 n'existe pas, ou a une date de modification
+antérieure à $2
+}}}
+!! {{{twcheck_twpage_newtwpage}}}
+{{{
+Vérifier si la twpage $1 peut être écrasée par la twpage $2
+C'est le cas si le fichier $1 n'existe pas, ou a une date de modification
+antérieure à $2
+}}}
+!! {{{twwrite_twpage}}}
+{{{
+Ecrire dans le répertoire courant le fichier correspondant au tiddler dont
+les paramètres sont spécifiés sur la ligne de commande. Les arguments sont
+les valeurs brutes prises du tiddler, telles qu'elles sont générées par
+twdump_tiddlers()
+Retourner 0 si le fichier a été écrasé, 1 s'il n'a pas été écrasé parce
+qu'il n'a pas été modifié, 2 s'il n'a pas été écrasé parce qu'il est plus
+récent.
+Si TW_VERBOSE=1, afficher un message informatif lors de l'export
+}}}
+!! {{{export_to_twpages}}}
+{{{
+Exporter tous les tiddlers du tiddlywiki $1 dans le répertoire $2
+}}}
+!! {{{import_from_twpages}}}
+{{{
+Remplacer les tiddlers du tiddlywiki $1 par les twpages du répertoire $2
+}}}
+
+
+
!! {{{udir_check}}}
+{{{
+Vérifier si le fichier $1 existe
+Si $1 est un répertoire, prendre $1/.udir
+}}}
+!! {{{udir_create_maybe}}}
+{{{
+Si le fichier $1 n'existe pas, le créer comme un template .udir
+Si $1 est un répertoire, prendre $1/.udir
+}}}
+!! {{{udir_dump}}}
+{{{
+Dumper toutes les variables définies pour le fichier $1
+Si $1 est un répertoire, prendre $1/.udir
+}}}
+!! {{{udir_eval}}}
+{{{
+Evaluer la commande "$2..$*" dans le contexte des variables définies pour
+le répertoire $1. La commande est évaluée dans un sous-shell pour ne pas
+polluer l'espace de noms courant.
+}}}
+!! {{{udir_dump_all}}}
+{{{
+Dumper toutes les variables définies pour le répertoire $1 et *tous ses
+parents* jusqu'à la racine
+}}}
+!! {{{udir_eval_all}}}
+{{{
+Evaluer la commande "$2..$*" dans le contexte des variables définies pour
+le répertoire $1 et *tous ses parents* jusqu'à la racine
+}}}
+!! {{{udir_parse}}}
+{{{
+Dans le fichier $1, lire les noms des variables
+Si $1 est un répertoire, prendre $1/.udir
+Les noms des variables sont placés dans le tableau $2(=UDIR_VARS), et les noms
+des tableaux sont placés dans le tableau $3(=UDIR_ARRAYS)
+note: les regex qui sont entre "" au lieu de // le sont à cause d'un bug
+de awk sous macosx
+}}}
+!! {{{udir_update}}}
+{{{
+Dans le fichier $1, mettre à jour les variables $2..*
+Si $1 est un répertoire, prendre $1/.udir
+Chaque argument de cette fonction est de la forme name[=value]
+Si value n'est pas précisée, la variable obtient une valeur nulle
+(i.e. var=)
+Si la variable ne figure pas dans le fichier, elle est rajoutée à la fin
+du fichier.
+Cette fonction nécessite gawk.
+}}}
+!! {{{write_unseen}}}
+!! {{{udir_edit}}}
+
+
+

+
+
+
!! {{{uenv_update_dir}}}
+{{{
+Mettre à jour l'ordre de chargement pour le répertoire $1 qui contient des
+fichiers de profil pour le shell. L'ordre dans lequel le fichiers de
+profil doivent être chargé est écrit dans le fichier $1/.source_in_order
+Si $2 est spécifié, il s'agit d'un fichier temporaire utilisé pour les
+calculs de l'ordre des chargements.
+$3(=$1) est le répertoire de destination. Si $1 est un répertoire de
+préparation temporaire, on peut spécifier grâce à $3 quel est le
+répertoire final après préparation.
+S'ils sont spécifiés, les arguments $4..* sont des répertoires contenant
+des fichiers de profils supplémentaires qu'il faut considérer aussi. Dans
+ce cas, $3 est ignoré.
+}}}
+!! {{{uenv_set_destdirs}}}
+!! {{{uenv_sourced_in}}}
+{{{
+vérifier que l'un des fichiers $2..$* est sourcé dans $1
+}}}
+!! {{{uenv_configure_profiles}}}
+!! {{{uenv_install_profiles}}}
+
+
+
!! {{{uinc}}}
+
+
+
!! {{{uinst}}}
+{{{
+lancer uinst en déclarant les variables locales, de façon à ne pas polluer
+l'environnement de l'appelant.
+}}}
+!! {{{uinst_nolocal}}}
+{{{
+Interface en mode ligne de commande pour uinst. Appeler cette fonction
+avec les paramètres de la ligne de commande, e.g.:
+uinst_nolocal "$@"
+}}}
+
+
+
!! {{{eerror}}}
+!! {{{die}}}
+!! {{{uprovided}}}
+{{{
+Tester si le module $1 a déjà été chargé par urequire
+}}}
+!! {{{uprovide}}}
+{{{
+Spécifier que le module $1 a été sourcée, ou prétendre que c'est le cas.
+Retourner 1 si le module était déjà pourvu, 0 si c'est la première fois
+qu'on le pourvoit
+}}}
+!! {{{urequire}}}
+{{{
+Sourcer un module recherché dans ULIBDIRS
+Le module DEFAULTS est traité de façon particulière: si le fichier associé
+n'est pas trouvé, charger base, pretty, sysinfos et compat à la place
+Si un module n'est pas trouvé, quitter le script avec die()
+}}}
+!! {{{ulibadd}}}
+{{{
+Ajouter $1 au chemin de recherche de urequire
+}}}
+!! {{{ulibsync}}}
+{{{
+Synchroniser les modules de ulib dans le répertoire $1
+}}}
+!! {{{ulibver}}}
+{{{
+Vérifier que la version actuelle de ulib est au moins à la version $1
+(inclue) et éventuellement au plus à la version $2 (exclue)
+}}}
+!! {{{ulibver_require}}}
+
+
+
!! {{{eerror}}}
+!! {{{die}}}
+!! {{{uprovided}}}
+!! {{{uprovide}}}
+!! {{{urequire}}}
+!! {{{ulibadd}}}
+!! {{{ulibsync}}}
+!! {{{ulibver}}}
+!! {{{ulibver_require}}}
+
+
+
!! {{{vcs_getvcs_help}}}
+!! {{{vcs_getvcs}}}
+!! {{{vcs_getroot_help}}}
+!! {{{vcs_getroot}}}
+!! {{{vcs_getrepos_help}}}
+!! {{{vcs_getrepos}}}
+!! {{{vcs_geturl_help}}}
+!! {{{vcs_geturl}}}
+!! {{{vcs_vcs_help}}}
+!! {{{vcs_vcs}}}
+!! {{{vcs_add_help}}}
+!! {{{vcs_add}}}
+{{{
+le répertoire de référence est le répertoire du premier fichier ajouté
+}}}
+!! {{{vcs_remove_help}}}
+!! {{{vcs_remove}}}
+{{{
+le répertoire de référence est le répertoire du premier fichier supprimé
+}}}
+!! {{{vcs_copy_help}}}
+!! {{{vcs_copy}}}
+{{{
+le répertoire de référence est le répertoire de destination
+}}}
+!! {{{vcs_move_help}}}
+!! {{{vcs_move}}}
+{{{
+le répertoire de référence est le répertoire de destination
+}}}
+!! {{{vcs_mkdir_help}}}
+!! {{{vcs_mkdir}}}
+{{{
+le répertoire de référence est le répertoire du premier répertoire créé
+}}}
+!! {{{vcs_commit_help}}}
+!! {{{vcs_commit}}}
+!! {{{vcs_status_help}}}
+!! {{{vcs_status}}}
+!! {{{vcs_update_help}}}
+!! {{{vcs_update}}}
+!! {{{vcs_push_help}}}
+!! {{{vcs_push}}}
+!! {{{vcs_diff_help}}}
+!! {{{vcs_diff}}}
+!! {{{vcs_tag_help}}}
+!! {{{vcs_tag}}}
+!! {{{git_getrepos}}}
+!! {{{git_geturl}}}
+!! {{{git_have_annex}}}
+!! {{{git_add}}}
+!! {{{git_remove}}}
+!! {{{git_copy}}}
+!! {{{git_move}}}
+!! {{{git_mkdir}}}
+!! {{{git_commit}}}
+!! {{{git_status}}}
+!! {{{git_update}}}
+!! {{{git_push}}}
+!! {{{git_diff}}}
+!! {{{git_tag}}}
+!! {{{git_check_gitvcs}}}
+!! {{{git_ensure_gitvcs}}}
+!! {{{git_list_branches}}}
+!! {{{git_list_rbranches}}}
+!! {{{git_list_pbranches}}}
+{{{
+lister les branches locales et celles qui existent dans l'origine
+$1(=origin) et qui pourraient devenir une branche locale avec la commande
+git checkout -b
+}}}
+!! {{{git_have_branch}}}
+!! {{{git_have_rbranch}}}
+!! {{{git_get_branch}}}
+!! {{{git_get_branch_remote}}}
+!! {{{git_get_branch_merge}}}
+!! {{{git_get_branch_rbranch}}}
+!! {{{git_is_branch}}}
+!! {{{git_have_remote}}}
+!! {{{git_track_branch}}}
+!! {{{git_ensure_branch}}}
+{{{
+retourner 0 si la branche a été créée, 1 si elle existait déjà, 2 en cas d'erreur
+}}}
+!! {{{git_check_cleancheckout}}}
+{{{
+vérifier qu'il n'y a pas de modification locales dans le dépôt
+correspondant au répertoire courant.
+}}}
+!! {{{git_ensure_cleancheckout}}}
+!! {{{git_is_ancestor}}}
+{{{
+vérifier que la branche $1 est un ancêtre direct de la branche $2, qui
+vaut par défaut refs/remotes/${3:-origin}/$1
+note: cette fonction retourne vrai si $1 et $2 identifient le même commit
+}}}
+!! {{{git_should_ff}}}
+{{{
+vérifier si la branche $1 devrait être fast-forwardée à partir de la
+branche d'origine $2, qui vaut par défaut refs/remotes/${3:-origin}/$1
+note: cette fonction est similaire à git_is_ancestor(), mais retourne
+false si $1 et $2 identifient le même commit
+}}}
+!! {{{git_should_push}}}
+{{{
+vérifier si la branche $1 devrait être poussée vers la branche de même nom
+dans l'origine $2(=origin), parce que l'origin peut-être fast-forwardée à
+partir de cette branche.
+}}}
+!! {{{git_fast_forward}}}
+{{{
+vérifier que la branche courante est bien $1, puis tester s'il faut la
+fast-forwarder à partir de la branche d'origine $2, puis le faire si c'est
+nécessaire. la branche d'origine $2 vaut par défaut refs/remotes/origin/$1
+}}}
+!! {{{git_is_merged}}}
+{{{
+vérifier que les branches $1 et $2 ont un ancêtre commun, et que la
+branche $1 a été complètement fusionnée dans la branche destination $2
+}}}
+!! {{{git_annex_initial}}}
+{{{
+sur le dépôt $1 fraichement cloné, vérifier s'il faut faire git annex
+init. Si oui, l'initialiser avec le nom d'hôte, et récupérer tous les
+fichiers annexés
+retourner 1 si une erreur s'est produite
+}}}
+!! {{{svn_getrepos}}}
+!! {{{svn_geturl}}}
+!! {{{svn_add}}}
+!! {{{svn_remove}}}
+!! {{{svn_copy}}}
+!! {{{svn_move}}}
+!! {{{svn_mkdir}}}
+!! {{{svn_commit}}}
+!! {{{svn_status}}}
+!! {{{svn_update}}}
+!! {{{svn_push}}}
+!! {{{svn_diff}}}
+!! {{{svn_tag}}}
+!! {{{cvs_getrepos}}}
+!! {{{cvs_geturl}}}
+!! {{{cvs_add}}}
+!! {{{cvs_remove}}}
+!! {{{cvs_copy}}}
+!! {{{cvs_move}}}
+!! {{{cvs_mkdir}}}
+!! {{{cvs_commit}}}
+!! {{{cvs_status}}}
+!! {{{cvs_update}}}
+!! {{{cvs_push}}}
+!! {{{cvs_diff}}}
+!! {{{cvs_tag}}}
+
+
+
!! {{{virsh_filter}}}
+{{{
+filtrer une sortie liste de virsh. En pratique, ne prendre que les lignes
+non vides à partir de la ligne "----*"
+}}}
+!! {{{virsh_list}}}
+!! {{{virsh_pool_list}}}
+!! {{{guess_vm_type}}}
+{{{
+Afficher hn, kvm, vmware, virtualbox ou openvz suivant que l'on est
+*probablement* respectivement sur une machine physique, une machine
+virtuelle kvm, vmware, virtualbox, openvz
+XXX pour le moment, seuls openvz, kvm et hn sont supportés
+}}}
+
+
+
!! {{{compute_webobjects_prefixes}}}
+!! {{{recompute_webobjects_prefixes}}}
+!! {{{get_NEXT_ROOT_prefix}}}
+!! {{{get_WOROOT_prefix}}}
+!! {{{get_LOCALROOT_prefix}}}
+!! {{{get_SYSTEMFRAMEWORKS_prefix}}}
+!! {{{get_WOEXTENSIONS_prefix}}}
+!! {{{get_WOFRAMEWORKS_prefix}}}
+!! {{{get_WOAPPLICATIONS_prefix}}}
+!! {{{get_WOCONFIGURATION_prefix}}}
+!! {{{get_WOAUTOSTART_prefix}}}
+!! {{{get_WOLOGS_prefix}}}
+!! {{{get_WOVERSION_prefix}}}
+!! {{{is_wobundle}}}
+{{{
+Tester si $1 a un nom de bundle valide, c'est à dire avec l'extension .woa
+ou .framework
+}}}
+!! {{{is_woappdir}}}
+{{{
+Tester si $1 est un répertoire d'application webobjects. Le test est
+effectué sur le contenu du bundle, pas sur le nom (utiliser is_wobundle()
+pour cela)
+}}}
+!! {{{is_wofwkdir}}}
+{{{
+Tester si $1 est un répertoire de framework webobjects. Le test est
+effectué sur le contenu du bundle, pas sur le nom (utiliser is_wobundle()
+pour cela)
+}}}
+!! {{{get_app_winclspth}}}
+{{{
+calculer la valeur de Contents/Windows/CLSSPATH.txt pour l'application $1
+}}}
+!! {{{get_infofile}}}
+{{{
+Obtenir le chemin vers le fichier Info.plist dans le répertoire de
+resource du bundle $1
+}}}
+!! {{{read_infofile}}}
+{{{
+Lire la version et le numéro de release dans le fichier $1 (chemin vers
+Info.plist) et les placer dans les variables $2(=version) et $3(=release)
+Retourner 1 si un erreur s'est produite, par exemple si le fichier $1
+n'existe pas ou n'est pas accessible en lecture
+}}}
+!! {{{write_infofile}}}
+{{{
+Ecrire $2 (la version) et $3 (le numéro de release) dans le fichier $1
+(chemin vers Info.plist)
+Retourner 1 si un erreur s'est produite, par exemple si le fichier $1
+n'existe pas
+}}}
+!! {{{get_jawotoolsfile}}}
+{{{
+Obtenir le chemin vers le fichier jawotools.properties dans le bundle $1
+}}}
+!! {{{read_jawotoolsfile}}}
+{{{
+lire le fichier de propriété $1 et placer les valeurs dans les variables
+$2(=version), $3(=releaseDate), $4(=description)
+}}}
+!! {{{save_jawotoolsfile}}}
+{{{
+écrire le fichier de propriété $1 avec les valeurs version ($2),
+releaseDate ($3) et description ($4)
+}}}
+!! {{{get_versionfile}}}
+{{{
+Obtenir le chemin vers le fichier VERSION.txt dans le répertoire de
+resource du bundle $1
+}}}
+!! {{{get_configfile}}}
+{{{
+obtenir le chemin vers le fichier de configuration du répertoire de
+resource du bundle
+$1=bundle ou resdir (appdir/Contents/Resources ou fwkdir/Resources)
+}}}
+!! {{{searchreplace_classpath}}}
+{{{
+Dans les fichiers classpath de l'application $1, remplacer $2 par $3. Si
+$3 est vide, la ligne est supprimée
+}}}
+!! {{{dump_jars}}}
+{{{
+Afficher les jars des frameworks utilisés par l'application $1
+}}}
+!! {{{dump_frameworks}}}
+{{{
+Afficher les frameworks utilisés par l'application $1
+}}}
+!! {{{remove_framework}}}
+{{{
+supprimer le framework $2 (nom de base) des fichiers de classpath du
+bundle d'application $1
+}}}
+!! {{{add_framework}}}
+{{{
+s'il n'y existe pas déjà, ajouter le framework $2 (nom de base ou chemin
+absolu) aux fichiers de classpath du bundle d'application $1
+}}}
+!! {{{fix_jars_case}}}
+{{{
+Vérifier que la casse des jars de tous les frameworks utilisés par
+l'application $1 est conforme au système de fichier
+}}}
+!! {{{verifix_bundle}}}
+{{{
+vérifier et corriger le bundle $1. Pour une application, on vérifie que le
+script est exécutable. Pour un framework, on vérifie que le framework est
+conforme au modèle des framework générés par WebObjects.
+}}}
+!! {{{compute_fapps}}}
+{{{
+Placer dans le tableau $1(=fappnames) la liste des noms de bundle
+d'applications qui dépendent du framework $2
+Cette opération est faite à partir des informations sur le système de
+fichier. Elle ne peut donc concerner qu'une installation locale.
+}}}
+!! {{{woraurl}}}
+{{{
+Faire une requête avec la méthode $1 sur l'url $2 avec le payload $3 (par
+exemple pour la méthode POST). la réponse est disponible dans le fichier
+$WORAURL_DATA, $4(=http_code) contient le code de réponse.
+Retourner 0 en cas de succès, ou une valeur différente de zéro si un
+erreur se produit (typiquement, 3 pour une erreur du serveur, 1 pour une
+réponse applicative, comme par exemple si l'application n'existe pas)
+Les codes de réponse 2xx et 417 sont des succès
+Les autres codes (à priori 4xx ou 5xx) sont des erreurs
+note: le code 417 est utilisé par le moniteur pour répondre "Non", par
+opposition à 200 utilisé pour répondre "OUI"
+}}}
+!! {{{wogeturl}}}
+!! {{{splitins}}}
+{{{
+Analyser le nom $1, qui peut être de forme '', 'Name.woa',
+'Name.framework', 'App' ou 'Instance-N' (où N est un nombre), et
+initialiser les variables $2(=type) et $3(=name)
+Si $1=="", type=all et name=""
+Si $1==Name.woa, type=woa et name=Name.woa
+Si $1==Name.framework, type=fwk et name=Name.framework
+Si $1==App, type=app et name=App
+si $1==App-N, type=ins et name=App-N
+}}}
+!! {{{create_wodirs_maybe}}}
+!! {{{check_autostart}}}
+{{{
+vérifier la présence du fichier $WOAUTOSTART. Si ce n'est pas le cas, le
+créer avec le contenu du tableau $1
+}}}
+!! {{{get_autostart_order}}}
+{{{
+Initialiser le tableau $1 avec la liste donnée dans le fichier
+$WOAUTOSTART
+}}}
+!! {{{apply_autostart_order}}}
+{{{
+Réordonner les valeurs $3..* selon la liste donnée dans le tableau $2,
+puis placer le résultat dans le tableau $1. $2 doit être construit avec
+get_autostart_order(). Si $2 n'est pas spécifié, la liste est construite
+localement.
+Si le tableau contient des lignes de délai @N, replacer les délais après
+les applications appropriées
+}}}
+!! {{{wotaskd_stop}}}
+!! {{{wotaskd_start}}}
+!! {{{javamonitor_stop}}}
+!! {{{womonitor_stop}}}
+!! {{{javamonitor_start}}}
+!! {{{womonitor_start}}}
+!! {{{woservices_stop}}}
+!! {{{woservices_start}}}
+
+
+
!! {{{date2version}}}
+!! {{{woconf}}}
+!! {{{wotag}}}
+!! {{{woinst}}}
+
+
+
!! {{{wom__statistics}}}
+{{{
+Afficher les statistiques pour le serveur $1, avec éventuellement le mot
+de passe $2
+}}}
+!! {{{wom__info}}}
+{{{
+Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
+$3, et afficher des informations sur l'application $1 (par défaut, all)
+}}}
+!! {{{wom__info_filter}}}
+{{{
+filtrer le résultat de wom__info en ne gardant que les tags
+name, state, activeSessions, autoRecover, deaths, host, port
+}}}
+!! {{{wom_info}}}
+{{{
+Contacter le moniteur sur l'hôte $3, avec éventuellement le mot de passe
+$4, et initialiser le tableau $1 avec une liste de valeurs quotés de la
+forme:
+"'name' 'state' 'activeSessions' 'autoRecover' 'deaths' 'host' 'port'"
+concernant l'application $2 (par défaut, toutes les applications). Notez
+qu'il y a une ligne par instance d'application
+Ces valeurs peuvent être utilisées comme arguments d'une fonction. par
+exemple:
+wom_info appinfos "" host pw
+for args in "${appinfos[@]}"; do
+eval "userfunc $args"
+done
+}}}
+!! {{{wom_getValidAndRunning}}}
+{{{
+Placer la liste des applications valides dans le tableau $1(=valid_apps)
+et la liste des applications qui tournent dans le tableau
+$2=(running_apps), en contactant le moniteur sur l'hôte $3, avec
+éventuellement le mot de passe $4.
+}}}
+!! {{{show_appinfo}}}
+{{{
+Afficher des informations sur une application. Les arguments doivent être
+le résultat de la fonction wom_info()
+}}}
+!! {{{wom_running}}}
+{{{
+Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
+$3, et tester si l'application $1 (par défaut, all) tourne actuellement
+}}}
+!! {{{wom_start}}}
+{{{
+Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
+$3, et démarrer l'application $1 (par défaut, all)
+}}}
+!! {{{wom_stopped}}}
+{{{
+Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
+$3, et tester si l'application $1 (par défaut, all) est actuellement arrêtée
+}}}
+!! {{{wom_stop}}}
+{{{
+Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
+$3, et arrêter l'application $1 (par défaut, all)
+}}}
+!! {{{wom_forceQuit}}}
+{{{
+Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
+$3, et forcer l'arrêt de l'application $1 (par défaut, all)
+}}}
+!! {{{wom_turnScheduledOn}}}
+{{{
+Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
+$3, et activer le flag scheduled sur l'application $1 (par défaut, all)
+}}}
+!! {{{wom_turnScheduledOff}}}
+{{{
+Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
+$3, et désactiver le flag scheduled sur l'application $1 (par défaut, all)
+}}}
+!! {{{wom_turnRefuseNewSessionOn}}}
+{{{
+Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
+$3, et activer le flag refuseNewSession sur l'application $1 (par défaut,
+all)
+}}}
+!! {{{wom_turnRefuseNewSessionOff}}}
+{{{
+Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
+$3, et désactiver le flag refuseNewSession sur l'application $1 (par
+défaut, all)
+}}}
+!! {{{wom_turnAutoRecoverOn}}}
+{{{
+Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
+$3, et activer le flag autoRecover sur l'application $1 (par défaut, all)
+}}}
+!! {{{wom_turnAutoRecoverOff}}}
+{{{
+Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
+$3, et désactiver le flag autoRecover sur l'application $1 (par défaut,
+all)
+}}}
+!! {{{wom_bounce}}}
+{{{
+Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
+$3, et redémarrer l'application $1 (par défaut, all) en mode bounce
+}}}
+!! {{{wom_clearDeaths}}}
+{{{
+Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe
+$3, et effacer le compte des morts suspectes pour l'application $1 (par
+défaut, all)
+}}}
+!! {{{wom__getApplications}}}
+{{{
+Obtenir des information sur la définition de l'application $1 (ou de
+toutes les applications si $1=="") en contactant le moniteur sur l'hôte $2
+avec éventuellement le mot de passe $3. Le résultat est un flux xml,
+chaque application étant défini dans un tag <MApplications>. Si un erreur
+se produit, l'erreur est dans un tag <Strings>
+}}}
+!! {{{wom__getApplications_filter}}}
+{{{
+filtrer le résultat de wom__getApplications en ne gardant que les tags
+name, unixPath, macPath, winPath
+}}}
+!! {{{wom_getApplications}}}
+{{{
+Obtenir la liste des applications définies en contactant le moniteur sur
+l'hôte $3 avec éventuellement le mot de passe $4, et initialiser le
+tableau $1 avec une liste de valeurs quotées de la forme:
+"'name' 'unixPath' 'macPath' 'winPath'"
+concernant l'application $2 (par défaut, toutes les applications)
+Ces valeurs peuvent être utilisées comme arguments d'une fonction. par
+exemple:
+wom_getApplications appinfos "" host pw
+for args in "${appinfos[@]}"; do
+eval "userfunc $args"
+done
+}}}
+!! {{{wom_addApplication}}}
+{{{
+Ajouter une application nommée $1 en contactant le moniteur sur l'hôte $2,
+avec éventuellement le mot de passe $3.
+Soit le nom Name, par défaut l'exécutable se trouve dans
+WOAPPLICATIONS/Name.woa/Name et les logs dans /var/log/WebObjects, et le
+flag autoRecover est activé
+XXX supporter la possibilité de modifier les valeurs par défaut
+}}}
+!! {{{wom_addInstance}}}
+{{{
+Ajouter une instance sur localhost pour l'application nommée $1 en
+contactant le moniteur sur l'hôte $2, avec éventuellement le mot de passe
+$3.
+XXX supporter la possibilité de modifier les valeurs par défaut
+}}}
+!! {{{check_compute_apps_localhost}}}
+{{{
+si les arguments de compute_apps contiennent des bundles de framework, il
+faut avoir accès au système de fichier local. vérifier si l'un des
+arguments $2..* est un framework. si c'est le cas, vérifier que l'hôte $1
+est localhost.
+retourner 0 si c'est ok, 1 s'il y a des frameworks et que host n'est pas
+localhost
+}}}
+!! {{{compute_apps}}}
+{{{
+Remplir le tableau $1(=apps) avec la liste des applications correspondant
+aux arguments $3...*
+Un bundle de framework (Name.framework) est remplacé par la liste des
+bundles d'applications qui dépendent de ce framework. Cette information
+est obtenue en consultant le système de fichier local.
+Un bundle d'application est remplacé par la liste des applications qui
+sont définies pour ce bundle. Cette information est obtenue en consultant
+le tableau généré par wom_getApplications(), dont le nom est $2
+Les arguments de la forme @N sont ignorés, ils correspondent à des délais
+à respecter lors du démarrage de l'application
+}}}
+!! {{{get_error_msg}}}
+!! {{{start_apps}}}
+{{{
+Démarrer les applications $3..$* en contactant le moniteur sur l'hôte $1
+avec le mot de passe éventuel $2
+Les variables globales enable_autorecover et force_enable_autorecover
+permettent respectivement d'activer l'autoRecover après le démarrage de
+l'application et de forcer l'activation de l'autoRecover même si
+l'instance tournait déjà.
+Un argument de la forme @N provoque une attente de N secondes. Ceci permet
+de placer un temps d'attente entre le démarrage de certaines applications.
+}}}
+!! {{{stop_apps}}}
+{{{
+Arrêter les applications $3..$* en contactant le moniteur sur l'hôte $1
+avec le mot de passe éventuel $2
+Les variables globales disable_autorecover et force_disable_autorecover
+permettent respectivement de désactiver l'autoRecover après l'arrêt de
+l'application et de forcer la désactivation de l'autoRecover même si
+l'instance ne tournait pas.
+L'option {-a ARRAY} permet de remplir ARRAY avec la liste des applications
+qui ont été effectivement arrêtées. Cette option si elle est spécifiée
+doit être en premier
+Pour compatibilité avec start_apps, les arguments de la forme @N sont
+ignorés. Il n'y a pas de temps d'attente entre les applications lors de
+l'arrêt.
+}}}
+!! {{{bounce_apps}}}
+{{{
+Redémarrer les applications $3..$* en mode bounce en contactant le
+moniteur sur l'hôte $1 avec le mot de passe éventuel $2
+Pour compatibilité avec start_apps, les arguments de la forme @N sont
+ignorés. Il n'y a pas de temps d'attente entre les applications lors du
+redémarrage.
+}}}
+
+
+
!! {{{wosign_setup_maybe}}}
+!! {{{wosign_jar}}}
+!! {{{wosignable}}}
+!! {{{wosign}}}
+{{{
+Signer un bundle, les jars d'un répertoire, ou un jar
+L'option -f force la resignature des jars d'un répertoire ou d'un
+bundle. Elle force aussi la signature d'un jar, même s'il semble qu'il
+soit la version signée d'un autre jar
+on présuppose que wosignable a retourné true
+}}}
+
+
+
!! {{{wot_config}}}
+{{{
+Afficher la configuration de wotaskd
+}}}
+
+
+
{{{
+ulibshell: Lancer un shell après avoir chargé des modules de ulib
+
+USAGE
+    ulibshell [options] [args...]
+
+OPTIONS
+    -r module
+        Spécifier un module à charger avec urequire. Plusieurs modules peuvent
+        être spécifiés en les séparant par ':'
+
+Un shell est lancé dans lequel les modules spécifiés sont chargés. Par défaut,
+seul le module DEFAULTS est chargé. Les arguments sont passés inchangés au
+shell.
+}}}
+
+
+
{{{
+ulibsync: Copier les librairies ulib et/ou pyulib
+
+USAGE
+    ulibsync [options] destdir
+
+OPTIONS
+    -u  Copier ulib
+    -p  Copier pyulib
+}}}
+
+
+
{{{
+ulink: déplacer, supprimer, copier un fichier ou un lien
+
+Quand on déplace ou qu'on copie un lien, la destination du lien est mise à jour
+
+USAGE
+    ulink mv files... dest
+    ulink cp files... dest
+    ulink rm files...
+
+OPTIONS
+    -d UPDATEDIR
+        Chercher dans UPDATEDIR tous les liens qui pointent vers le fichier
+        concerné, et mettre à jour ces liens après avoir déplacé le fichier, ou
+        supprimer ces liens si le fichier est supprimé.
+}}}
+
+
+
{{{
+umatch: Afficher le résultat d'une recherche par regexp et compter
+éventuellement leurs occurences
+
+USAGE
+    umatch [options] [regexp]
+
+Chaque ligne *entière* de stdin est mise en correspondance avec l'expression
+regulière qui doit avoir la syntaxe de awk. S'il y a correspondance, afficher
+soit toute l'expression matchée, soit chaque groupe s'il y a des expressions
+parenthésées, chacun des groupes étant séparé par le caractère sep.
+
+Si l'expression régulière n'est pas spécifiée, elle vaut par défaut '.*' ce qui
+fait que toutes les lignes correspondent. Ceci peut être utile avec les options
+-s et -c.
+
+Certaines expressions régulières sont prédéfinies. regexp peut avoir l'une des
+valeurs prédéfinies suivantes:
+
+    ip --> [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+
+
+OPTIONS
+    -F sep
+        Spécifier le caractère séparateur en sortie s'il faut afficher des
+        champs multiples. Par défaut, utiliser le caractère ':'
+        Si un séparateur vide est spécifié, le séparateur standard de awk est
+        utilisé.
+    -s  Trier le résultat
+    -C FIELDNUM
+    -c, --count
+        Compter les occurences successives de la valeur du champ FIELDNUM, et
+        afficher une ligne de la forme 'count<sep>last_line' pour chaque groupe,
+        last_line étant la dernière occurence du groupe. L'option -c correspond
+        à '-C 0', c'est à dire compter les occurences successives de toute les
+        lignes.
+        Le séparateur utilisé pour calculer le numéro de champ est sep, spécifié
+        avec l'option -F.
+    -a, --all-lines
+        Avec les options -c/-C, afficher toutes les lignes des occurences
+        successives au lieu de seulement la ligne de la dernière occurence. Ceci
+        est utile surtout avec l'option -C, pour voir les différences avec les
+        différentes lignes.
+    -m, --multiple
+        Avec les options -c/-C, n'afficher que les lignes dont le compte est
+        supérieur à 1. Avec l'option -a, les groupes contigus sont séparés par
+        une ligne '--'
+}}}
+
+
+
{{{
+umirror: faire un miroir d'un site web
+
+USAGE
+    umirror [options] url [wget_options]
+
+OPTIONS
+    -l
+        Convertir les liens pour consultation locale
+}}}
+
+
+
{{{
+USAGE:
+    upassword -p [-f aeskeyfile] [clear [salts...]]
+    upassword -p [-f aeskeyfile] -j JKEY codetu [salts...]
+    upassword -p -f aeskeyfile -k crypted [salts...]
+    upassword -f aeskeyfile -G [password [salt]]
+    upassword -f aeskeyfile -s
+    upassword -f aeskeyfile -e clear
+    upassword -f aeskeyfile -d crypted
+    upassword --batch
+
+OPTIONS
+    -p, --hash-password
+        Crypter un mot de passe (option par défaut). Si le mot de passe en clair
+        et/ou le salt ne sont pas spécifiés, ils sont choisis au hasard.
+    -j, --clear-is-codetu JKEY
+        Indiquer que l'argument clear est un numéro d'étudiant, à partir duquel
+        il faut générer le mot de passe. Cette option n'est valide qu'avec -p
+    -k, --clear-is-crypted
+        Indiquer que l'argument clear doit d'abord être décrypté avec la clé AES
+        spécifiée avant utilisation. Cette option n'est valide qu'avec -p
+    -G, --aes-genkey
+        Générer une clé AES pour utilisation avec les options -s, -e, -d
+    -s, --aes-showkey
+        Afficher encodée en base64 la clé AES contenue dans le fichier spécifié
+    -e, --aes-encrypt
+        Crypter un mot de passe avec la clé AES spécifiée
+    -d, --aes-decrypt
+        Décrypter un mot de passe avec la clé AES spécifiée
+    -f, --aes-keyfile
+        Spécifier le fichier contenant la clé AES. Cette option est obligatoire
+        avec les options -G, -s, -e et -d
+    --shell
+        Afficher les valeurs pour évaluation par le shell
+
+MODE BATCH
+Utiliser l'option --batch active le mode batch. Dans ce mode, chaque ligne est
+un ensemble d'arguments, comme si on avait lancé le script à plusieurs reprises.
+L'analyseur est limité: le découpage des arguments est fait sur les espaces.
+Les lignes commençant par # sont ignorées.
+Si une ligne commence par --batch-after, alors cette ligne est affichée après
+chaque résultat. Ceci permet de générer un script qui peut être évalué.
+
+Voici un exemple:
+    upassword --batch <<EOF
+    --batch-after process_password1 args
+    --shell
+    --shell fixed-password1
+    --batch-after process_password2 args
+    --shell fixed-password2
+    EOF
+Le résultat serait quelque chose comme:
+    clear='<random-password>'
+    ... # toutes les valeurs lm, ntlm, crypt, sha, xsha, ssha, md5, smd5
+    process_password1 args
+    clear='fixed-password1'
+    ... # toutes les valeurs lm, ntlm, crypt, sha, xsha, ssha, md5, smd5
+    process_password1 args
+    clear='fixed-password2'
+    ... # toutes les valeurs lm, ntlm, crypt, sha, xsha, ssha, md5, smd5
+    process_password2 args
+}}}
+
+
+
{{{
+update-nutools: mettre à jour nutools
+}}}
+
+
+
{{{
+uprefix: Afficher les préfixes valides pour uinst
+
+USAGE
+    uprefix -l|--dump|prefix...
+
+OPTIONS
+    -l
+        Afficher la liste des préfixes valides
+    --dump
+        Afficher la liste des préfixes valides et leurs valeurs
+    prefix
+        Afficher la valeur du préfixe spécifié
+}}}
+
+
+
{{{
+uproject: Outil pour gérer des projets
+
+USAGE
+    uproject cmd [args]
+
+COMMANDS
+    getvcs [dir]
+        Afficher le type de VCS pour dir.
+    getroot [dir]
+        Si dir est un répertoire versionné, retourner le répertoire racine du
+        projet versionné.
+    getrepos [dir]
+        Si dir est un répertoire versionné, retourner l'url du repository du
+        projet versionné.
+    geturl [dir]
+        Si dir est un répertoire versionné, retourner son url dans le
+        repository.
+    fold [dir]
+    unfold [dir]
+        Utiliser uinc pour défaire (resp. refaire) toutes les inclusions des
+        fichiers de dir. Cela nécessite qu'un fichier .udir soit configuré à la
+        racine du projet avec uinc=true
+    vcs [args]
+        Appeler le gestionnaire de gestion approprié avec les arguments donnés.
+    add files...
+        Ajouter les fichiers files dans le gestionnaire de version.
+    remove files...
+        Supprimer les fichiers versionnés files.
+    copy from to
+        Copier le fichier versionné from vers le fichier to.
+    move from to
+        Renommer le fichier versionné from vers le fichier to.
+    mkdir dir
+        Créer un nouveau répertoire versionné.
+    commit message [files...]
+        Enregistrer les modifications (par défaut sur tous les fichiers
+        modifiés) avec le commentaire message.
+    status
+        Afficher l'état des fichiers versionnés et non versionnés.
+    update [-x]
+        Mettre à jour la copie locale avec la copie sur le serveur.
+        -x  Ne pas mettre à jour les références externes (si appliquable)
+        -n, --no-autoff
+            Ne pas faire de fast-forward automatique pour toutes les branches
+            traquées. Par défaut, s'il n'y a pas de modifications locales,
+            essayer de fast-fowarder toutes les branches locales traquées.
+    diff [options]
+        Afficher les différences.
+        -l  Afficher les différences non commitées (par défaut)
+        -c  Afficher les différences en passe d'être commitées (si appliquable)
+        -r REV
+            Afficher les différences depuis la révision REV.
+        -R  Afficher les modifications effectuées depuis la dernière release.
+
+    clone git@host:path/to/repo [destdir]
+        Cloner un dépôt distant. 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]
+        Créer un dépôt distant sur gitolite, puis le cloner
+
+    develop
+    release
+    hotfix
+        Démarrer le travail sur une branche respectivement de développement, de
+        release, ou de correction de bugs. Lancer chaque commande avec --help
+        pour les détails. Nécessite git.
+
+    archive
+        Créer une archive du projet courant. Nécessite git.
+
+    annex [args]
+        Lancer git annex avec les arguments spécifiés.
+    xadd
+    xunlock
+    xdrop
+    xwhereis
+    xwebapp
+        Chacune de ces commandes est un raccourci vers la commande
+        correspondante de git annex, sans le préfixe 'x'
+    xsync
+        Sur un dépot où git-annex est activé, lancer 'git annex sync' si on est
+        en mode indirect ou 'git annex sync --content' si on est en mode direct.
+        Sur un dépôt où git-annex n'est pas activé, faire l'équivalent des
+        commandes 'git add -A && git commit && git pull && git push'
+    xcopy
+    xmove
+    xget
+        Comme ci-dessus, mais si la commande s'exécute sans erreur, lancer
+        aussi 'git annex sync'
+    xinitial
+        Sur un dépôt fraichement cloné, initialiser le dépôt avec 'annex init'
+        s'il contient des fichiers annexés. Récupérer aussi ces fichiers avec
+        'annex get'
+    xconfig-export [dir]
+        Installer des hooks pour qu'un dépôt puisse être utilisé pour servir des
+        fichiers, par exemple avec un serveur web. Plus précisément, un hook
+        post-receive est créé avec la commande 'git annex merge', et un hook
+        post-update est créé avec la commande 'git update-server-info'
+
+    printml [-t TYPE]
+        Afficher le modeline pour un fichier du type spécifié
+    addml [-t TYPE] file
+        Ajouter un modele pour le fichier spécifié, s'il n'en a pas déjà un.
+        Si nécessaire, forcer le type du fichier au lieu de l'autodétecter
+    new [options] file [template options]
+        Créer un nouveau fichier à partir d'un modèle.
+        Avant le nom du fichier, les options suivantes sont valides:
+        -t TEMPLATE
+            Spécifier le modèle de fichier à utiliser. Par défaut, le modèle
+            à utiliser est déduit de l'extension ou du nom du fichier.
+        -e  Editer le fichier après l'avoir créé.
+        Après le nom du fichier, toutes les options sont spécifiques au modèle
+        utilisé pour créer le nouveau fichier. Utiliser l'option --help pour
+        avoir une description des options disponibles.
+}}}
+
+
+
{{{
+uscrontab: lancer une suite de commande en respectant une planification de type cron
+
+USAGE
+    uscrontab [options] [/path/to/uscrontab] [var=value...]
+    uscrontab -e [/path/to/uscrontab]
+    uscrontab -l
+
+La première forme du script doit normalement être lancé toutes les minutes par
+une tâche cron. Utiliser l'option --install pour ajouter automatique la ligne
+dans la crontab de l'utilisateur.
+
+Avec la première forme du script, le fichier spécifié est traité. Si aucun
+fichier n'est spécifié, fusionner s'il existe le fichier
+    /var/local/uscrontab/users/jclain
+avec chacun des fichiers du répertoire
+    /var/local/uscrontab/users.d/jclain
+dans un fichier temporaire, puis exécuter le fichier résultat avec le nom
+virtuel
+    /var/local/uscrontab/jclain
+note: le nom virtuel est utilisé pour le verrouillage avec --lock
+
+A chaque lancement de ce script, le fichier /path/to/uscrontab spécifié est
+examiné pour déterminer quels commandes doivent être exécutées. Ce fichier est
+composé de lignes dans un format particulier, qui sont analysées et traitées
+dans l'ordre.
+
+Quelles que soient les lignes qui sont sélectionnées pour l'exécution, elles
+sont garanties de s'exécuter dans l'ordre du fichier, l'une après l'autre.
+
+Les définitions var=value mentionnées sur la ligne de commande sont des
+définitions de variables à effectuer avant de lancer les commandes.
+
+Les lignes commençant par # sont des commentaires et sont ignorées
+
+== Définitions de variables et exécution de commandes ==
+
+    Les lignes de la forme suivante sont des définitions de variable:
+
+        [export] var="valeur de la variable"
+
+    Ces lignes sont des définitions de variable bash qui sont exécutées telles
+    quelles. Il n'est donc pas autorisé de mettre des espaces autour de =. Par
+    exemple, les lignes suivantes sont des erreurs de syntaxe:
+
+        var = bad
+        var=pas de quotes autour de la valeur
+
+    alors que celles-ci sont correctes:
+
+        var=ok
+        var="valeur avec des espaces"
+        var='on peut utiliser des quotes aussi'
+
+    Il est possible de manipuler les variables de type PATH avec une syntaxe
+    particulière de l'opérateur d'assignation. Les opérateurs += et %= utilisent
+    uaddpath(), #= utilise uinspath() et -= utilise udelpath(). Par exemple, les
+    lignes suivantes ajoutent respectivement /usr/local/nutools puis enlèvent
+    /opt/rogue au PATH:
+
+        PATH+=/usr/local/nutools
+        PATH-=/opt/rogue
+
+    Bien sûr, il ne faut pas oublier de quoter les espaces:
+
+        PATH+="/path/to/dir with spaces"
+
+    La syntaxe ?= permet de définir la valeur d'une variable si elle n'est pas
+    déjà définie:
+
+        var?=default
+
+    Les lignes de la forme suivante permettent d'exécuter une commande qui est
+    exécutée systématiquement et ignore la planification:
+
+        $one-line-command
+
+    Une variante permet de spécifier des commandes sur plusieurs lignes.
+    ATTENTION! ${ et $} doivent être tous seuls sur la ligne.
+
+        ${
+        several
+        commands
+        ...
+        $}
+
+    Ces commandes sont exécutées systématiquement et ignorent la planification.
+    On peut s'en servir notamment pour lire un fichier de configuration qui
+    définit des variables ou des fonctions:
+
+        $source path/to/file
+
+    Le code d'erreur de ces commandes est ignoré, contrairement à ce qui se
+    passe pour les commandes qui font l'objet d'une planification.
+
+== Planification de commandes ==
+
+    Les autres lignes doivent être au format d'une ligne de crontab:
+
+        minutes hours days months dows command-line
+
+    command-line peut être n'importe quelle ligne de commande bash, pourvu
+    qu'elle soit sur une seule ligne.
+
+    Certaines extensions par rapport à la syntaxe de crontab sont autorisées. Il
+    est en particulier possible de spécifier plusieurs planifications pour une
+    seule commande. Par exemple, les lignes suivantes permettent d'exécuter
+    'command' toutes les heures ET à 1h05:
+
+        0 * * * *
+        5 1 * * * command
+
+    Il est aussi possible d'utiliser la même planification pour plusieurs
+    commandes sans devoir répéter la définition de la planification. Les lignes
+    suivantes planifient command1 et command2 toutes les heures:
+
+        0 * * * * command1
+                  command2
+
+    Pour être prise en compte, la ligne command2 doit commencer par au moins un
+    espace ou une tabulation. Pour la lisibilité, la syntaxe suivante est
+    supportée aussi:
+
+        0 * * * *
+          command1
+          command2
+
+    Les deux formats peuvent être utilisés ensemble. Par exemple les lignes
+    suivantes exécutent command1 et command2 toutes les heures ET à 1h05:
+
+        0 * * * *
+        5 1 * * * command1
+                  command2
+
+    Par défaut, le script s'arrête à la première commande planifiée qui retourne
+    avec un code d'erreur. Il est possible d'ignorer le code d'erreur d'une
+    commande avec nostop, e.g:
+
+        0 * * * * nostop command
+
+    Cf aussi l'option --continuous pour modifier le comportement par défaut
+
+== Fonctions disponibles ==
+
+    La fonction check_pidfile() est disponible, et permet de vérifier qu'une
+    opération n'est pas déjà en cours. Si cette fonction est utilisée, il ne
+    faut pas modifier la valeur de -k. Par exemple:
+
+        0 1 * * *
+          check_pidfile /path/to/pid [args]
+          long-running-script
+
+    check_pidfile() doit être utilisée toute seule sur la ligne et s'utilise
+    avec les argument suivants:
+
+        check_pidfile PIDFILE [DESC] [BARRIER]
+
+    - PIDFILE est le fichier de PID qui est vérifié
+    - DESC est la description du traitement qui est effectué. La valeur par
+      défaut est "Une synchronisation". Si le fichier de PID est présent, le
+      message suivant est affiché:
+        DESC est en cours.
+        Si vous pensez que c'est une erreur, veuillez vérifier le process de pid PID
+        puis supprimez le cas échéant le fichier PIDFILE
+    - BARRIER est un fichier qui est créé avec le contenu 'PID' s'il n'existe
+      pas encore, et si la vérification du fichier de PID est faite avec succès.
+      La présence de ce fichier peut-être vérifiée par un processus externe pour
+      empêcher par exemple de mettre à jour les scripts pendant qu'il sont en
+      train de tourner.
+      Son contenu peut être examiné pour connaître le PID du processus qui l'a
+      créé initialement. Le fichier est automatiquement supprimé à la fin de ce
+      script.
+      Attention: ce fichier n'est pas un verrou, il peut être supprimé à tout
+      moment. Notamment, si deux scripts sont configurés pour créer le même
+      fichier barrière, le premier script supprimera le fichier barrière avant
+      la fin de l'exécution du second script.
+
+    La fonction remove_pidfile() permet de supprimer un fichier de pid pour
+    spécifier qu'une opération est terminée. Considérons l'exemple suivant:
+
+        0 1 * * *
+          check_pidfile /path/to/pid
+          script1
+          script2
+          remove_pidfile /path/to/pid
+          script3
+
+    Dans cet exemple, il ne faut pas qu'une autre occurence de script1 tourne
+    pendant que script2 tourne. Par contre, plusieurs occurences de script3
+    peuvent tourner en parallèle.
+
+    La fonction elogto() permet de spécifier un fichier vers lequel toutes les
+    sorties sont redirigées.
+
+OPTIONS
+    -A, --install
+        Installer une planification toutes les minutes du script dans la crontab
+        de l'utilisateur. Si l'argument /path/to/uscrontab n'est pas spécifié,
+        c'est une planification générique qui exécute les fichiers par défaut
+        qui est installée.
+    -R, --uninstall
+        Désinstaller la planification toutes les minutes du script de la crontab
+        de l'utilisateur. Si l'argument /path/to/uscrontab est spécifié, cette
+        instance est désinstallée. Sinon, ne désinstaller que la planification
+        générique.
+    -d, --disable-only
+        Avec l'option -R, désactiver la planification au lieu de la supprimer.
+    -e, --edit
+        Lancer un editeur pour modifier l'uscrontab spécifiée. Si aucun fichier
+        n'est spécifié, éditer /var/local/uscrontab/users/jclain
+    -a, --add
+        Installer un script uscrontab dans le répertoire approprié. L'argument
+        doit être de la forme [name:]/path/to/uscrontab
+        Si name n'est pas spécifié, le nom de base du fichier spécifié est
+        utilisé. Si name est vide ou vaut $USER (soit jclain en l'occurence),
+        copier le fichier spécifié vers le chemin /var/local/uscrontab/users/jclain
+        Sinon, copier le fichier spécifié vers /var/local/uscrontab/users.d/jclain/name
+    -r, --remove
+        Supprimer le script uscrontab spécifié. L'argument doit être le nom du
+        script à supprimer.  Si l'argument n'est pas spécifié ou vaut $USER
+        (soit jclain en l'occurence), supprimer le fichier /var/local/uscrontab/users/jclain
+        s'il existe
+    -l, --list
+        Si l'argument /path/to/crontab est spécifié, afficher le contenu de ce
+        fichier. Sinon, lister les contenus des fichiers crontab qui sont
+        exécutés avec la planification actuelle. Si une planification générique
+        est installée, ou si aucune planification n'est en cours, afficher le
+        contenu du fichier
+            /var/local/uscrontab/users/jclain
+        et chacun des fichiers du répertoire
+            /var/local/uscrontab/users.d/jclain
+    -n, --fake
+        Afficher au lieu de les exécuter les commandes qui doivent être lancées
+    -P, --pause-for NBMINS
+        Désactiver les planifications pendant NBMINS minutes. Utiliser -1 pour
+        désactiver les planifications sans limite de durée. Pendant la période
+        de pause, toutes les invocations de uscrontab n'ont aucun effet, sauf si
+        on utilise l'option --force
+    -Y, --unpause
+        Réactiver les planifications après une mise en pause
+    -p, --pause
+        Désactiver les planifications pendant 1 journée. Equivalent à -P 1440
+    -f, --force
+        Forcer l'exécution de la planification, même si elle a été mise en pause
+        avec l'option --pause
+
+OPTIONS AVANCEES
+    --lock LOCKFILE
+        Inscrire dans le fichier spécifié des informations permettant d'éviter
+        les invocations simultanées de ce script. Si selon ce fichier, le script
+        tourne depuis plus de 8 heures, un message d'erreur
+        est consigné et un message d'avertissement est affiché au plus une fois.
+        Utiliser --lock '' pour désactiver cette fonctionnalité
+        Par défaut, si ce script est lancé en root, le fichier utilisé pour le
+        verrouillage est de la forme /var/run/uscrontab/abspath/to/crontab
+        Si le script est lancé avec un compte utilisateur, aucun verrouillage
+        n'est effectué.
+    --lockdelay LOCKDELAY[=8]
+        Changer le nombre d'heures pendant lesquelles on autorise le script a
+        verrouiller l'exécution avant d'afficher un avertissement.
+    -c, --continuous
+        Par défaut, ce script s'arrête à la première commande planifiée qui
+        retourne avec un code d'erreur. Notez que les codes d'erreur des
+        commandes sans planification sont toujours ignorés. Avec cette option,
+        ce script ne s'arrête jamais, bien qu'il retourne toujours un code
+        d'erreur si une erreur s'est produite.  Il est possible d'ignorer le
+        code d'erreur pour une commande en particulier avec le préfixe nostop
+    -k, --stopec EXITCODE[=101]
+        Spécifier un code d'erreur spécial qui arrête ce script sans erreur, ou
+        '' pour désactiver cette fonctionnalité. Ceci permet en début de script
+        de faire des tests par exemple sur l'environnement avant de lancer les
+        scripts planifiés. Si l'environnement ne convient pas, il suffit au
+        script de contrôle de retourner le code d'erreur spécifique pour arrêter
+        le traitement.
+    --show-ctnow
+        Afficher l'heure de référence au format crontab 'min hou day mon dow'
+        Cette valeur peut être utilisée avec l'option --force-ctnow dans des
+        tests pour reproduire une condition spécifique.
+    --force-ctnow 'min hou day mon dow'
+        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.
+}}}
+
+
+
{{{
+ussh: se connecter par ssh à un ou plusieurs hôtes
+
+USAGE
+    ussh [options] hosts
+    ussh [options] @hostsfile
+    ussh -r hosts
+    ussh --parse hosts
+
+OPTIONS
+    hosts
+    @hostsfile
+        Spécifier un ou plusieurs hôtes distants sur lequels faire la connexion.
+        Pour spécifier plusieurs hôtes, il faut les séparer 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
+            'root@{host1,host2}.univ.run'
+        La forme @hostsfile permet de lire la liste des hôtes depuis le fichier
+        hostsfile, à raison d'un hôte par ligne.
+
+Toutes les options de ssh sont reconnues. Les options longues suivantes sont
+reconnues comme alias de certaines options courtes de ssh:
+    --quiet
+        alias de -q, activer le mode non verbeux
+    --tty
+        alias de -t, forcer l'allocation d'un TTY
+    --login USER
+        alias de -l, spécifier le user avec lequel se connecter
+    --port PORT
+        alias de -p, spécifier le port sur lequel se connecter
+
+Les options suivantes sont exclusives à ce script:
+    -d, --domain DOMAIN
+        Spécifier un domaine par défaut pour les hôtes qui sont spécifiés sans
+        domaine.
+    -z, --ssh SSH
+        Spécifier l'exécutable à utiliser pour lancer ssh.
+    -r, --remove
+        Lancer 'ssh-keygen -R' pour chacun des hôtes spécifiés avant de s'y
+        connecter. Par exemple:
+            ussh -r host.tld
+        est équivalent à:
+            ssh-keygen -R host.tld
+            ssh-keygen -R host
+            ssh-keygen -R 10.10.1.5
+            ssh host.tld
+        si l'adresse ip de host.tld est 10.10.1.5
+        Quand cette option est spécifié, l'option -j est reconnue et permet de
+        NE PAS se reconnecter à l'hôte juste après avoir nettoyé les clés. Avec
+        l'option -j, TOUS les arguments sont des noms d'hôte puisqu'aucune
+        connexion n'est effectuée.
+    --exec
+    --no-exec
+        Avec --exec, si un seul hôte est spécifié, lancer le processus ssh avec
+        exec, pour éviter d'encombrer la mémoire. C'est l'option par défaut.
+        Avec --no-exec, ne jamais utiliser exec pour lancer ssh.
+    --parse
+        Afficher la définition des variables ssh, options, hosts et args qui
+        permettent d'effectuer la connexion à partir d'un autre script. Exemple:
+            eval "$(ussh --parse args...)"
+            for host in "${hosts[@]}"; do
+                ${exec:+exec} "$ssh" "${options[@]}" "$host" "${args[@]}"
+            done
+    --cc
+        Assumer que nutools est installé sur l'hôte distant, et y lancer uwatch
+        avec l'option --cc, pour permettre de garder la connexion active dans le
+        cadre d'une redirection de port.
+
+Si la variable UTOOLS_USSH_RSYNC_SUPPORT contient une valeur non vide, l'analyse
+des arguments s'arrête à la première valeur qui n'est pas une option, afin de
+permettre l'utilisation de ce script avec l'option -e de rsync.
+}}}
+
+
+
{{{
+usysinfos: Afficher les informations sur le système
+
+USAGE
+    usysinfos [query]
+
+Si la requête est spécifiée, tester si le système courant correspond à la
+requête. Voir la doc de check_sysinfos() pour le format de la requête.
+
+Sinon, afficher les informations sur le système courant.
+}}}
+
+
+
{{{
+utempl: Créer un nouveau fichier à partir d'un modèle
+
+USAGE
+    utempl [options] file [template options]
+
+OPTIONS
+Avant le nom du nouveau fichier, les options suivantes peuvent être utilisées:
+    -t TEMPLATE
+        Spécifier le modèle de fichier à utiliser. Par défaut, le modèle
+        à utiliser est déduit de l'extension ou du nom du fichier.
+    -e, --edit
+        Editer le fichier après l'avoir créé
+    -g, --no-edit
+        Ne pas éditer le fichier après l'avoir créé
+
+Après le nom du fichier, toutes les options sont spécifiques au modèle
+utilisé pour créer le nouveau fichier. Utiliser l'option --help pour
+avoir une description des options disponibles.
+}}}
+
+
+
{{{
+utrigger: lancer une commande en différé
+
+USAGE
+    utrigger [options] -- command [args]
+
+La commande est lancée après un certain temps, sauf si ce script est rappelé
+(auquel cas le compte est réinitialisé), ou si l'opération est annulée.
+Attention! La commande est lancée en tâche de fond, et son entrée standard est
+connectée à un fichier qui peut être provisionné avec l'option -a
+
+note: ce script ne fonctionne que sous Linux puisqu'il utilise la commande flock
+
+OPTIONS
+    -n, --name NAME
+        Spécifier un nom identifiant la tâche. Par défaut, le nom est généré à
+        partir des détails de la tâche à lancer. Ce nom est utilisé pour
+        identifier les invocations successives.
+    -f, --cmdfile CMDFILE
+        Spécifier un fichier contenant les commandes à lancer. Le fichier est
+        sourcé dans un sous-shell. Utiliser - pour lire les commandes depuis
+        l'entrée standard.
+    --rundelay RUNDELAY[=5]
+        Nombre de secondes au bout desquelles la commande est lancée. Si ce
+        script est relancé avant la fin de ce décompte, le compte est remis à
+        zéro.
+        Utiliser --rundelay '' pour désactiver cette fonctionnalité, auquel cas
+        la commande est lancée immédiatement.
+    -s, --sudo
+        Forcer l'exécution de la commande avec l'utilisateur root si ce n'est
+        pas déjà le cas
+    -a, --datafile DATAFILE
+        Accumuler des données à fournir à la commande. Les informations du
+        fichier DATAFILE (utiliser - pour l'entrée standard) sont ajoutées à un
+        fichier temporaires, et sont fournies en une seule fois à la commande
+        sur son entrée standard.
+    -A, --data DATA
+        Variante de --datafile où les données sont fournies sur la ligne de
+        commande au lieu d'un fichier externe. Si les deux options -a et -A sont
+        spécifiées, les données sont accumulées dans l'ordre --datafile puis
+        --data
+    -k, --cancel
+        Annuler le lancement planifié d'une commande. Si la commande est déjà en
+        train de tourner, cette option n'a aucun effet.
+}}}
+
+
+
{{{
+uwatch: afficher l'heure
+
+USAGE
+    uwatch [options]
+
+OPTIONS
+    -t, --time
+        Afficher l'heure (par défaut)
+    -c, --count
+        Afficher le temps écoulé depuis le lancement de ce script
+    -u, --units
+        Avec l'option --count, afficher l'unité: sec., min. ou heures
+    -o, --offset NBSEC
+        Avec l'option --count, spécifier un nombre de secondes à partir duquel
+        compter
+    -s, --step NBSECS[=1]
+        Spécifier la période de rafraichissement de l'affichage
+    -a, --prefix PREFIX
+        Spécifier une chaine à afficher avant l'heure
+    -z, --suffix SUFFIX
+        Spécifier une chaine à afficher après l'heure
+    --cc
+        Equivalent à -c -s 5 -a 'Connecté sur $MYHOST depuis ' -z '...'
+        Permet de garantir une activité sur une connexion SSH utilisée
+        uniquement pour faire une redirection de port
+}}}
+
+
+
{{{
+vzusage: afficher des informations sur une machine virtuelle OpenVZ
+
+USAGE
+    vzusage [options] [params...]d
+
+OPTIONS
+    -b  Afficher les informations de /proc/user_beancounters
+    -f  N'afficher que les valeurs pour lesquelles failcnt > 0.
+        Implique -b
+    -z coef
+        Afficher les instructions à utiliser pour augmenter de coef% les
+        valeurs pour lesquelles failcnt > 0. Implique -f
+    -c config|veid
+        Afficher les informations du fichier de configuration plutôt que les
+        beancounters
+}}}
+
+
+
{{{
+woArchive: créer une archive de la distribution WebObjects en cours
+USAGE
+    woArchive [-n name] [-f files]
+
+OPTIONS
+    -n NAME
+        Nom de base de l'archive. Par défaut il s'agit de WebObjects-<version>
+
+    -f FILES
+        Nom de la liste des fichiers de l'archives. Par défaut il s'agit de
+        $NAME.files
+}}}
+
+
+
{{{
+woSwitch: Changer la version de WebObjects pour le système en cours
+USAGE
+    woSwitch [-f from.files] to-archive.tar.gz
+
+OPTIONS
+    -f from.files
+        Spécifier la liste des fichiers pour la version de WebObjects
+        installée. Par défaut, il s'agit de WebObjects-<version>.files
+        La liste doit correspondre à la version en cours.
+
+    -F  Forcer l'installation, même si la version en cours ne correspond pas à ce
+        qui est inscrit dans from.files
+
+    to-archive.tar.gz
+        Nom de l'archive qui contient la version à installer.
+
+Ce script ne fonctionne que sur MacOS X
+Le contenu des répertoires suivants est sauvegardé avant le changement:
+    /Library/WebObject/Applications
+    /Library/WebObject/Configuration
+    /Library/WebObject/Extensions
+Ensuite, les répertoires Applications et Configuration sont restaurés. Il faudra
+restaurer Extensions manuellement.
+}}}
+
+
+
{{{
+woctl: Contrôler des applications WebObjects
+
+USAGE
+    woctl [options] action args
+    wostart args...
+    wostop args...
+    wobounce args...
+    worestart args...
+
+OPTIONS
+    -h HOST
+        Spécifier l'hôte qui fait tourner le moniteur sous la forme host[:port]
+    -p PASSWORD
+        Spécifier le mot de passe pour le moniteur
+
+ACTIONS
+    Dans les arguments des actions ci-dessous, une application peut être
+    spécifiée sous la forme App ou App.woa. Spécifier une application revient à
+    spécifier toutes les instances configurées pour cette application.
+    Si on spécifie un framework sous la forme Fwk.framework, cela revient à
+    spécifier toutes les applications qui dépendent de ce framework.
+    Sinon, une instance individuelle est de la forme App-N, où N est un entier
+    positif.
+
+    status
+        afficher l'état des instances qui tournent actuellement
+    version
+        afficher la version de WebObjects installée
+    wotaskd
+    javamonitor
+    woservices
+        piloter wotaskd/javamonitor
+    _create
+        créer une instance par défaut dans javamonitor
+    configure
+        configurer un bundle
+    tag
+        ajouter une information de version à un bundle
+    run
+        lancer une application localement en mode debug
+    download
+        télécharger une application ou un framework
+    start apps...
+        démarrer une ou plusieurs applications
+    stop apps...
+        arrêter une ou plusieurs applications
+    restart apps...
+        relancer une ou plusieurs applications
+    bounce apps...
+        relancer une ou plusieurs applications en mode bounce
+}}}
+
+
+
{{{
+woinst: Déployer un bundle (application ou framework) de WebObjects
+
+USAGE
+    woinst [options] <file|archive|dir>...
+
+OPTIONS
+    PREFIX=value
+        Spécifier une valeur pour un préfixe, plutôt que de laisser uprefix
+        l'autodétecter. Utiliser uprefix -l pour une liste de préfixes valides.
+    -b  Redémarrer les instances en mode bounce.
+        Par défaut, les instances sont arrêtées avant le déploiement, et
+        redémarrées après
+    -W  Ne déployer que les resources web. Implique -n
+    -n  Ne pas tagger les bundles déployés avec un numéro de version. Par
+        défaut, l'utilisateur est invité à compléter des informations telles
+        que n° de version et date de release si ces informations ne sont pas
+        disponible.
+    -x CMD
+        Exécuter la commande CMD après avoir effectué le déploiement
+}}}
+
+
+
{{{
+wosign: signer les jars d'un bundle
+
+USAGE
+    wosign <app.woa|fwk.framework|file.jar>
+
+OPTIONS
+    -f  Forcer la (re)signature des jars
+    -d  Enlever la signature des jars originaux
+    -s  Signer les jar du bundle [PAR DEFAUT]
+    --init
+        Initialiser les fichiers de configuration pour la signature des bundles.
+    --sudo
+        Si le répertoire de destination des fichiers de configuration n'est
+        accessible en écriture, relancer le script en root.
+}}}
+
+
+ + + + + + + + + + + + diff --git a/doc/nutools.md b/doc/nutools.md new file mode 100644 index 0000000..bcb61c6 --- /dev/null +++ b/doc/nutools.md @@ -0,0 +1,34 @@ +# nutools + +~~~ +nutools: configurer ou afficher des informations sur nutools + +USAGE + nutools [VERSION] + +OPTIONS + -C, --configure + Faire la configuration pour l'utilisateur courant en appelant uenv -u + Avec cette option, l'option -l (ou --local-profiles) est aussi reconnue + et est passée directement à uenv + -v, --version + Afficher la version de nutools installée. C'est l'option par défaut + -c, --check + Calculer si la version installée correspond à la version spécifiée + -o, --oper OPERATOR + Spécifier l'opérateur à utiliser avec l'option --check (par défaut, + utiliser l'opérateur ge, qui permet de vérifier si la version minimum + spécifiée est installée) + --eq + --ne + --lt + --le + --gt + --ge + --same + --diff + Ces options sont des raccourcis. L'option '--OP' est équivalente à + '--check --op OP' +~~~ + +-*- 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/nutools.twp b/doc/nutools.twp new file mode 100644 index 0000000..f0accb6 --- /dev/null +++ b/doc/nutools.twp @@ -0,0 +1,38 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:18 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: nutools + +{{{ +nutools: configurer ou afficher des informations sur nutools + +USAGE + nutools [VERSION] + +OPTIONS + -C, --configure + Faire la configuration pour l'utilisateur courant en appelant uenv -u + Avec cette option, l'option -l (ou --local-profiles) est aussi reconnue + et est passée directement à uenv + -v, --version + Afficher la version de nutools installée. C'est l'option par défaut + -c, --check + Calculer si la version installée correspond à la version spécifiée + -o, --oper OPERATOR + Spécifier l'opérateur à utiliser avec l'option --check (par défaut, + utiliser l'opérateur ge, qui permet de vérifier si la version minimum + spécifiée est installée) + --eq + --ne + --lt + --le + --gt + --ge + --same + --diff + Ces options sont des raccourcis. L'option '--OP' est équivalente à + '--check --op OP' +}}} diff --git a/doc/openurl.md b/doc/openurl.md new file mode 100644 index 0000000..932d6c5 --- /dev/null +++ b/doc/openurl.md @@ -0,0 +1,10 @@ +# openurl + +~~~ +openurl: Ouvrir une URL dans un navigateur + +USAGE + openurl +~~~ + +-*- 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/pdev.md b/doc/pdev.md new file mode 100644 index 0000000..6b79484 --- /dev/null +++ b/doc/pdev.md @@ -0,0 +1,86 @@ +# pdev + +~~~ +pdev: basculer sur une branche de développement + +USAGE + pdev [FEATURE [SOURCE]] + pdev -m|-l|-d [FEATURE] + +- Vérifier l'existence de la branche develop. La créer si nécessaire en la + basant sur [origin/]master. +- Vérifier s'il n'y a pas de modifications locales. Sinon, proposer de faire un + commit ou un stash. +- Si FEATURE est spécifié, et si on n'est pas déjà sur cette branche, basculer + vers cette nouvelle branche. S'il s'agit d'une nouvelle branche, la baser sur + la branche SOURCE, qui vaut par défaut develop +- Si FEATURE n'est pas spécifié, basculer sur develop s'il s'agit de la seule + solution, sinon afficher un menu pour choisir la branche de destination. + +OPTIONS + -C, --projdir PROJDIR + Spécifier le répertoire de base du projet qui est dans git. Par défaut, + on travaille dans le répertoire courant et on laisse git trouver le + répertoire de base du projet. Avec cette option, le répertoire courant + est modifié avant de lancer les commandes git. + -O, --origin ORIGIN + Spécifier le nom de l'origine. Par défaut, utiliser 'origin' + -o, --offline + En cas de création d'une branche, ne pas pousser vers l'origine; ne pas + tenter le cas échéant de traquer la branche dans l'origine; ne pas + supprimer une branche dans l'origine. Cette option est automatiquement + activée si la variable UTOOLS_VCS_OFFLINE est définie. + --online + Annuler l'effet de la variable UTOOLS_VCS_OFFLINE: forcer le mode online + --sync + Faire un certain nombre d'opération pour 'corriger' le dépôt local: pour + chacune des branches distantes, vérifier qu'il existe une branche locale + qui la traque, et pour chaque feature branche locale, vérifier qu'il + existe une branche distante associée. Cette option nécessite --online + + -s, --squash COMMIT_MSG + Si la branche actuelle est une feature branch, la merger comme un seul + commit avec le message COMMIT_MSG dans develop puis la supprimer. Puis + basculer sur la branche develop. + Cette option ne devrait pas être utilisée avec -k, puisque bien que les + modifications soient mergées, la branche elle-même n'est pas considérée + comme mergée. Les résultats sont donc indéfinis si la branche est mergée + à plusieurs reprises. + -b, --rebase + Si la branche actuelle est une feature branch, lancer 'git rebase -i' + sur la feature branch. Cela permet de réordonner les commits pour + nettoyer l'historique avant de fusionner la branche avec -m + Cette option devrait le cas échéant être utilisée immédiatement avant -m + ou alors il faut forcer le push et communiquer avec l'équipe sur le fait + que la branche de feature a été rebasée. + -m, --merge + Si la branche actuelle est une feature branch, la merger dans develop + puis la supprimer. Puis basculer sur la branche develop. + --merge-log + Ajouter un résumé des modifications sur la feature branch en ajoutant le + log en une ligne de chaque commit dans le message du merge. Cette option + n'est en principe pas nécessaire puisque 'prel -um' intègre la liste des + commits dans CHANGES.txt + -k, --keep + Avec l'option -m, ne pas supprimer une feature branch après l'avoir + fusionnée dans develop. Cela permet d'intégrer les modifications petit à + petit. + --delete + Supprimer une feature branch, à condition qu'elle aie déjà été + entièrement fusionnée dans la branch develop + --force-delete + Supprimer une feature branch, même si elle n'a pas encore été fusionnée + dans la branche develop + + -l, --log + -d, --diff + Afficher les modifications entre deux branches. L'option --log affiche + les modifications dans l'ordre alors que --diff affiche les différences + sous forme de diff. Les deux options peuvent être combinées et ont + l'effet de 'git log -p' + La branche comparée, s'il elle n'est pas spécifiée, est par défaut la + branche courante. S'il s'agit d'une feature branch, elle est comparée à + develop. S'il s'agit de la branche develop, elle est comparée à master. +~~~ + +-*- 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/pdev.twp b/doc/pdev.twp new file mode 100644 index 0000000..5ad1858 --- /dev/null +++ b/doc/pdev.twp @@ -0,0 +1,90 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:18 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: pdev + +{{{ +pdev: basculer sur une branche de développement + +USAGE + pdev [FEATURE [SOURCE]] + pdev -m|-l|-d [FEATURE] + +- Vérifier l'existence de la branche develop. La créer si nécessaire en la + basant sur [origin/]master. +- Vérifier s'il n'y a pas de modifications locales. Sinon, proposer de faire un + commit ou un stash. +- Si FEATURE est spécifié, et si on n'est pas déjà sur cette branche, basculer + vers cette nouvelle branche. S'il s'agit d'une nouvelle branche, la baser sur + la branche SOURCE, qui vaut par défaut develop +- Si FEATURE n'est pas spécifié, basculer sur develop s'il s'agit de la seule + solution, sinon afficher un menu pour choisir la branche de destination. + +OPTIONS + -C, --projdir PROJDIR + Spécifier le répertoire de base du projet qui est dans git. Par défaut, + on travaille dans le répertoire courant et on laisse git trouver le + répertoire de base du projet. Avec cette option, le répertoire courant + est modifié avant de lancer les commandes git. + -O, --origin ORIGIN + Spécifier le nom de l'origine. Par défaut, utiliser 'origin' + -o, --offline + En cas de création d'une branche, ne pas pousser vers l'origine; ne pas + tenter le cas échéant de traquer la branche dans l'origine; ne pas + supprimer une branche dans l'origine. Cette option est automatiquement + activée si la variable UTOOLS_VCS_OFFLINE est définie. + --online + Annuler l'effet de la variable UTOOLS_VCS_OFFLINE: forcer le mode online + --sync + Faire un certain nombre d'opération pour 'corriger' le dépôt local: pour + chacune des branches distantes, vérifier qu'il existe une branche locale + qui la traque, et pour chaque feature branche locale, vérifier qu'il + existe une branche distante associée. Cette option nécessite --online + + -s, --squash COMMIT_MSG + Si la branche actuelle est une feature branch, la merger comme un seul + commit avec le message COMMIT_MSG dans develop puis la supprimer. Puis + basculer sur la branche develop. + Cette option ne devrait pas être utilisée avec -k, puisque bien que les + modifications soient mergées, la branche elle-même n'est pas considérée + comme mergée. Les résultats sont donc indéfinis si la branche est mergée + à plusieurs reprises. + -b, --rebase + Si la branche actuelle est une feature branch, lancer 'git rebase -i' + sur la feature branch. Cela permet de réordonner les commits pour + nettoyer l'historique avant de fusionner la branche avec -m + Cette option devrait le cas échéant être utilisée immédiatement avant -m + ou alors il faut forcer le push et communiquer avec l'équipe sur le fait + que la branche de feature a été rebasée. + -m, --merge + Si la branche actuelle est une feature branch, la merger dans develop + puis la supprimer. Puis basculer sur la branche develop. + --merge-log + Ajouter un résumé des modifications sur la feature branch en ajoutant le + log en une ligne de chaque commit dans le message du merge. Cette option + n'est en principe pas nécessaire puisque 'prel -um' intègre la liste des + commits dans CHANGES.txt + -k, --keep + Avec l'option -m, ne pas supprimer une feature branch après l'avoir + fusionnée dans develop. Cela permet d'intégrer les modifications petit à + petit. + --delete + Supprimer une feature branch, à condition qu'elle aie déjà été + entièrement fusionnée dans la branch develop + --force-delete + Supprimer une feature branch, même si elle n'a pas encore été fusionnée + dans la branche develop + + -l, --log + -d, --diff + Afficher les modifications entre deux branches. L'option --log affiche + les modifications dans l'ordre alors que --diff affiche les différences + sous forme de diff. Les deux options peuvent être combinées et ont + l'effet de 'git log -p' + La branche comparée, s'il elle n'est pas spécifiée, est par défaut la + branche courante. S'il s'agit d'une feature branch, elle est comparée à + develop. S'il s'agit de la branche develop, elle est comparée à master. +}}} diff --git a/doc/prel.md b/doc/prel.md new file mode 100644 index 0000000..7e19a20 --- /dev/null +++ b/doc/prel.md @@ -0,0 +1,101 @@ +# prel + +~~~ +prel: basculer sur une branche de release + +USAGE + prel -u [SOURCE] + prel -c [RELEASE [SOURCE]] + prel -m|-l|-d [RELEASE] + +- Vérifier s'il n'y a pas de modifications locales. Sinon, proposer de faire un + commit ou un stash. +- Avec l'option -c, s'il existe une branche de release, proposer de basculer + vers elle ou sur la branche master. Sinon, basculer sur la branche master. +- Avec l'option -u, proposer ou fixer une branche de release à créer. Si elle + existe déjà, basculer vers elle. Sinon, la créer en la basant sur SOURCE, qui + vaut par défaut develop + +OPTIONS + -C, --projdir PROJDIR + Spécifier le répertoire de base du projet qui est dans git. Par défaut, + on travaille dans le répertoire courant et on laisse git trouver le + répertoire de base du projet. Avec cette option, le répertoire courant + est modifié avant de lancer les commandes git. + -O, --origin ORIGIN + Spécifier le nom de l'origine. Par défaut, utiliser 'origin' + -o, --offline + En cas de création d'une branche, ne pas pousser vers l'origine; ne pas + tenter le cas échéant de traquer la branche dans l'origine; ne pas + supprimer une branche dans l'origine. Cette option est automatiquement + activée si la variable UTOOLS_VCS_OFFLINE est définie. + --online + Annuler l'effet de la variable UTOOLS_VCS_OFFLINE: forcer le mode online + + -c, --checkout + Basculer vers une branche de release existante. C'est l'option par + défaut. Si aucune branche de release n'existe, basculer vers master + -u, --update + Préparer une nouvelle release. Utiliser une des options -x, -z ou -p + pour spécifier le type de release à préparer. Si la branche qui serait + créée pour le type de release existe déjà, basculer vers cette branche. + S'il faut la créer, la baser sur la branche SOURCE, qui vaut par défaut + develop + --menu + -x, --major + -z, --minor + -p, --patchlevel + Utilisé avec l'option -u, soit afficher un menu pour choisir la version + de la nouvelle release (par défaut), soit préparer respectivement une + release majeure, mineure, ou pour correction de bug. + -v-OPT + Avec l'option -u, spécifier une option de pver permettant de choisir la + version de la nouvelle release. Les options supportées sont -v, -l, -a, + -b, -r et -R. Par exemple, si la version actuelle sur la branche master + est 0.2.3, les options '-uz -v-lbeta' permettent de préparer la release + 0.3.0-beta + En principe, cette option n'a pas à être utilisée, puisque dans une + branche de release, on peut faire vivre les versions de pré-release + jusqu'à la release finale. Ainsi, la branche de release est nommée + d'après la version finale, mais le projet peut recevoir une version de + pré-release incrémentale. + -w, --write + Si une nouvelle branche est créée avec -u, mettre à jour le fichier + VERSION.txt avec pver. C'est l'option par défaut. + -n, --no-write + Si une nouvelle branche est créée avec -u, NE PAS mettre à jour le + fichier VERSION.txt avec pver. Utiliser cette option si la mise à jour + du numéro de version doit être faite d'une manière particulière. + -e, --edit + Editer le fichier CHANGES.txt autogénéré par -u -w + Cette option est surtout utile si -m est utilisé avec -u, pour donner la + possibilité de corriger la liste des modifications avant leur + enregistrement définitif. + + -m, --merge + Si la branche actuelle est une branche de release, ou s'il existe une + branche de release, la merger dans master, puis dans develop, puis la + supprimer. Puis basculer sur la branche master. + S'il n'existe pas de branche de release, proposer de fusionner les + modifications de la branche develop dans la branche master, sans + préparer de branche de release au préalable. + --delete + Supprimer une branche de release, à condition qu'elle aie déjà été + entièrement fusionnée dans la branch master + --force-delete + Supprimer une branche de release, même si elle n'a pas encore été + fusionnée dans la branche master + + -s, --summary + Afficher la liste des différences entre la branche develop et la branche + master, comme elle serait générée par les options -u -w pour le fichier + CHANGES.txt + -l, --log + Afficher les modifications actuellement effectuée dans la branche de + release par rapport à develop. + -d, --diff + Afficher les modifications actuellement effectuée dans la branche de + release par rapport à develop, sous forme de diff. +~~~ + +-*- 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/prel.twp b/doc/prel.twp new file mode 100644 index 0000000..eb0f4cf --- /dev/null +++ b/doc/prel.twp @@ -0,0 +1,105 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:18 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: prel + +{{{ +prel: basculer sur une branche de release + +USAGE + prel -u [SOURCE] + prel -c [RELEASE [SOURCE]] + prel -m|-l|-d [RELEASE] + +- Vérifier s'il n'y a pas de modifications locales. Sinon, proposer de faire un + commit ou un stash. +- Avec l'option -c, s'il existe une branche de release, proposer de basculer + vers elle ou sur la branche master. Sinon, basculer sur la branche master. +- Avec l'option -u, proposer ou fixer une branche de release à créer. Si elle + existe déjà, basculer vers elle. Sinon, la créer en la basant sur SOURCE, qui + vaut par défaut develop + +OPTIONS + -C, --projdir PROJDIR + Spécifier le répertoire de base du projet qui est dans git. Par défaut, + on travaille dans le répertoire courant et on laisse git trouver le + répertoire de base du projet. Avec cette option, le répertoire courant + est modifié avant de lancer les commandes git. + -O, --origin ORIGIN + Spécifier le nom de l'origine. Par défaut, utiliser 'origin' + -o, --offline + En cas de création d'une branche, ne pas pousser vers l'origine; ne pas + tenter le cas échéant de traquer la branche dans l'origine; ne pas + supprimer une branche dans l'origine. Cette option est automatiquement + activée si la variable UTOOLS_VCS_OFFLINE est définie. + --online + Annuler l'effet de la variable UTOOLS_VCS_OFFLINE: forcer le mode online + + -c, --checkout + Basculer vers une branche de release existante. C'est l'option par + défaut. Si aucune branche de release n'existe, basculer vers master + -u, --update + Préparer une nouvelle release. Utiliser une des options -x, -z ou -p + pour spécifier le type de release à préparer. Si la branche qui serait + créée pour le type de release existe déjà, basculer vers cette branche. + S'il faut la créer, la baser sur la branche SOURCE, qui vaut par défaut + develop + --menu + -x, --major + -z, --minor + -p, --patchlevel + Utilisé avec l'option -u, soit afficher un menu pour choisir la version + de la nouvelle release (par défaut), soit préparer respectivement une + release majeure, mineure, ou pour correction de bug. + -v-OPT + Avec l'option -u, spécifier une option de pver permettant de choisir la + version de la nouvelle release. Les options supportées sont -v, -l, -a, + -b, -r et -R. Par exemple, si la version actuelle sur la branche master + est 0.2.3, les options '-uz -v-lbeta' permettent de préparer la release + 0.3.0-beta + En principe, cette option n'a pas à être utilisée, puisque dans une + branche de release, on peut faire vivre les versions de pré-release + jusqu'à la release finale. Ainsi, la branche de release est nommée + d'après la version finale, mais le projet peut recevoir une version de + pré-release incrémentale. + -w, --write + Si une nouvelle branche est créée avec -u, mettre à jour le fichier + VERSION.txt avec pver. C'est l'option par défaut. + -n, --no-write + Si une nouvelle branche est créée avec -u, NE PAS mettre à jour le + fichier VERSION.txt avec pver. Utiliser cette option si la mise à jour + du numéro de version doit être faite d'une manière particulière. + -e, --edit + Editer le fichier CHANGES.txt autogénéré par -u -w + Cette option est surtout utile si -m est utilisé avec -u, pour donner la + possibilité de corriger la liste des modifications avant leur + enregistrement définitif. + + -m, --merge + Si la branche actuelle est une branche de release, ou s'il existe une + branche de release, la merger dans master, puis dans develop, puis la + supprimer. Puis basculer sur la branche master. + S'il n'existe pas de branche de release, proposer de fusionner les + modifications de la branche develop dans la branche master, sans + préparer de branche de release au préalable. + --delete + Supprimer une branche de release, à condition qu'elle aie déjà été + entièrement fusionnée dans la branch master + --force-delete + Supprimer une branche de release, même si elle n'a pas encore été + fusionnée dans la branche master + + -s, --summary + Afficher la liste des différences entre la branche develop et la branche + master, comme elle serait générée par les options -u -w pour le fichier + CHANGES.txt + -l, --log + Afficher les modifications actuellement effectuée dans la branche de + release par rapport à develop. + -d, --diff + Afficher les modifications actuellement effectuée dans la branche de + release par rapport à develop, sous forme de diff. +}}} diff --git a/doc/pver.md b/doc/pver.md new file mode 100644 index 0000000..b87a431 --- /dev/null +++ b/doc/pver.md @@ -0,0 +1,98 @@ +# pver + +~~~ +pver: gérer des numéros de version selon les règles du versionage sémantique v2.0.0 (http://semver.org/) + +USAGE + pver [options] + +OPTIONS + -f, --file VERSIONFILE + Gérer le numéro de version se trouvant dans le fichier spécifié. Le + fichier est créé si nécessaire. C'est l'option par défaut si un fichier + nommé VERSION.txt se trouve dans le répertoire courant. + -e, --maven POMFILE + Gérer le numéro de version se trouvant dans le fichier pom.xml spécifié. + Le fichier DOIT exister. C'est l'option par défaut si un fichier nommé + pom.xml se trouve dans le répertoire courant. + -F, --file-string VERSIONFILE + Prendre pour valeur de départ le contenu du fichier VERSIONFILE (qui + vaut par défaut VERSION.txt) + -g, --git-string [branch:]VERSIONFILE + Prendre pour valeur de départ le contenu du fichier VERSIONFILE (qui + vaut par défaut VERSION.txt) dans la branche BRANCH (qui vaut par défaut + master) du dépôt git situé dans le répertoire courant. + -s, --string VERSION + Prendre pour valeur de départ le numéro de version spécifié + + --show + Afficher le numéro de version. C'est l'action par défaut + --allow-empty + Supporter que la version puisse ne pas être spécifiée ni trouvée. Dans + ce cas, ne pas assumer que la version effective est 0.0.0 + Avec --show et --update, ne rien afficher si la version est vide. + --check + Vérifier que le numéro de version est conforme aux règles du versionage + sémantique + --convert + --no-convert + Activer (resp. désactiver) la conversion automatique. Par défaut, si la + version est au format classique 'x.z[.p]-rDD/MM/YYYY', elle est + convertie automatiquement au format sémantique x.z.p+rYYYYMMDD + --eq VERSION + --ne VERSION + --lt VERSION + --le VERSION + --gt VERSION + --ge VERSION + --same VERSION + --diff VERSION + Comparer avec la version spécifiée. Les opérateurs --eq, --ne, --lt, + --le, --gt, et --ge ignorent l'identifiant de build (comme le demande la + règle du versionage sémantique). Les opérateurs --same et --diff + comparent aussi les identifiants de build. + -v, --set-version VERSION + Spécifier un nouveau numéro de version qui écrase la valeur actuelle. + Cette option ne devrait pas être utilisée en temps normal parce que cela + va contre les règles du versionage sémantique. + --prel + Spécifier un nouveau numéro de version qui écrase la valeur actuelle. Le + numéro de version est obtenu à partir du nom de la branche git courante, + qui doit être de la forme release-VERSION + -u, --update + Mettre à jour le numéro de version. + + --menu + Afficher un menu permettant de choisir le composant de la version à + incrémenter + -x, --major + Augmenter le numéro de version majeure + -z, --minor + Augmenter le numéro de version mineure. C'est la valeur par défaut. + -p, --patchlevel + Augmenter le numéro de patch + + -l, --prelease ID + Spécifier un identifiant de pré-release, à ajouter au numéro de version. + -a, --alpha + -b, --beta + -r, --rc + Spécifier une pré-release de type alpha, beta, ou rc. Si la version est + déjà dans ce type, augmenter la dernière valeur numérique des composants + de l'identifiant, e.g. alpha deviant alpha.1, beta-1.2 devient beta-1.3, + rc1 devient rc2 + XXX ces fonctions ne sont pas encore implémentées + -R, --final, --release + Supprimer l'identifiant de prérelease + + -m, --metadata ID + Spécifier un identifiant de build, à ajouter au numéro de version. + -M, --vcs-metadata + Spécifier l'identifiant à partir de la révision actuelle dans le + gestionnaire de version. Note: pour le moment, seul git est supporté. + --add-metadata ID + Ajouter l'identifiant spécifié à la valeur actuelle, au lieu de la + remplacer. Séparer l'identifiant de la valeur précédente avec un '.' +~~~ + +-*- 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/pver.twp b/doc/pver.twp new file mode 100644 index 0000000..243b6b1 --- /dev/null +++ b/doc/pver.twp @@ -0,0 +1,102 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:18 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: pver + +{{{ +pver: gérer des numéros de version selon les règles du versionage sémantique v2.0.0 (http://semver.org/) + +USAGE + pver [options] + +OPTIONS + -f, --file VERSIONFILE + Gérer le numéro de version se trouvant dans le fichier spécifié. Le + fichier est créé si nécessaire. C'est l'option par défaut si un fichier + nommé VERSION.txt se trouve dans le répertoire courant. + -e, --maven POMFILE + Gérer le numéro de version se trouvant dans le fichier pom.xml spécifié. + Le fichier DOIT exister. C'est l'option par défaut si un fichier nommé + pom.xml se trouve dans le répertoire courant. + -F, --file-string VERSIONFILE + Prendre pour valeur de départ le contenu du fichier VERSIONFILE (qui + vaut par défaut VERSION.txt) + -g, --git-string [branch:]VERSIONFILE + Prendre pour valeur de départ le contenu du fichier VERSIONFILE (qui + vaut par défaut VERSION.txt) dans la branche BRANCH (qui vaut par défaut + master) du dépôt git situé dans le répertoire courant. + -s, --string VERSION + Prendre pour valeur de départ le numéro de version spécifié + + --show + Afficher le numéro de version. C'est l'action par défaut + --allow-empty + Supporter que la version puisse ne pas être spécifiée ni trouvée. Dans + ce cas, ne pas assumer que la version effective est 0.0.0 + Avec --show et --update, ne rien afficher si la version est vide. + --check + Vérifier que le numéro de version est conforme aux règles du versionage + sémantique + --convert + --no-convert + Activer (resp. désactiver) la conversion automatique. Par défaut, si la + version est au format classique 'x.z[.p]-rDD/MM/YYYY', elle est + convertie automatiquement au format sémantique x.z.p+rYYYYMMDD + --eq VERSION + --ne VERSION + --lt VERSION + --le VERSION + --gt VERSION + --ge VERSION + --same VERSION + --diff VERSION + Comparer avec la version spécifiée. Les opérateurs --eq, --ne, --lt, + --le, --gt, et --ge ignorent l'identifiant de build (comme le demande la + règle du versionage sémantique). Les opérateurs --same et --diff + comparent aussi les identifiants de build. + -v, --set-version VERSION + Spécifier un nouveau numéro de version qui écrase la valeur actuelle. + Cette option ne devrait pas être utilisée en temps normal parce que cela + va contre les règles du versionage sémantique. + --prel + Spécifier un nouveau numéro de version qui écrase la valeur actuelle. Le + numéro de version est obtenu à partir du nom de la branche git courante, + qui doit être de la forme release-VERSION + -u, --update + Mettre à jour le numéro de version. + + --menu + Afficher un menu permettant de choisir le composant de la version à + incrémenter + -x, --major + Augmenter le numéro de version majeure + -z, --minor + Augmenter le numéro de version mineure. C'est la valeur par défaut. + -p, --patchlevel + Augmenter le numéro de patch + + -l, --prelease ID + Spécifier un identifiant de pré-release, à ajouter au numéro de version. + -a, --alpha + -b, --beta + -r, --rc + Spécifier une pré-release de type alpha, beta, ou rc. Si la version est + déjà dans ce type, augmenter la dernière valeur numérique des composants + de l'identifiant, e.g. alpha deviant alpha.1, beta-1.2 devient beta-1.3, + rc1 devient rc2 + XXX ces fonctions ne sont pas encore implémentées + -R, --final, --release + Supprimer l'identifiant de prérelease + + -m, --metadata ID + Spécifier un identifiant de build, à ajouter au numéro de version. + -M, --vcs-metadata + Spécifier l'identifiant à partir de la révision actuelle dans le + gestionnaire de version. Note: pour le moment, seul git est supporté. + --add-metadata ID + Ajouter l'identifiant spécifié à la valeur actuelle, au lieu de la + remplacer. Séparer l'identifiant de la valeur précédente avec un '.' +}}} diff --git a/doc/pz.md b/doc/pz.md new file mode 100644 index 0000000..ec5ef8b --- /dev/null +++ b/doc/pz.md @@ -0,0 +1,20 @@ +# pz + +~~~ +pz: faire une archive du projet + +USAGE + pz + +OPTIONS + -C, --projdir PROJDIR + Spécifier le répertoire de base du projet qui est dans git. Par défaut, + on travaille dans le répertoire courant et on laisse git trouver le + répertoire de base du projet. Avec cette option, le répertoire courant + est modifié avant de lancer les commandes git. + -d, --destdir DESTDIR + Spécifier le répertoire dans lequel générer l'archive. Par défaut, + prendre le répertoire parent du répertoire de base du dépôt. +~~~ + +-*- 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/pz.twp b/doc/pz.twp new file mode 100644 index 0000000..a49c742 --- /dev/null +++ b/doc/pz.twp @@ -0,0 +1,24 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:18 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: pz + +{{{ +pz: faire une archive du projet + +USAGE + pz + +OPTIONS + -C, --projdir PROJDIR + Spécifier le répertoire de base du projet qui est dans git. Par défaut, + on travaille dans le répertoire courant et on laisse git trouver le + répertoire de base du projet. Avec cette option, le répertoire courant + est modifié avant de lancer les commandes git. + -d, --destdir DESTDIR + Spécifier le répertoire dans lequel générer l'archive. Par défaut, + prendre le répertoire parent du répertoire de base du dépôt. +}}} diff --git a/doc/reptyr.cgo.md b/doc/reptyr.cgo.md new file mode 100644 index 0000000..f36e6c8 --- /dev/null +++ b/doc/reptyr.cgo.md @@ -0,0 +1,16 @@ +# reptyr.cgo + +~~~ +Usage: reptyr [-s] PID + reptyr -l|-L [COMMAND [ARGS]] + -l Create a new pty pair and print the name of the slave. + if there are command-line arguments after -l + they are executed with REPTYR_PTY set to path of pty. + -L Like '-l', but also redirect the child's stdio to the slave. + -s Attach fds 0-2 on the target, even if it is not attached to a tty. + -h Print this help message and exit. + -v Print the version number and exit. + -V Print verbose debug output. +~~~ + +-*- 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/reptyr.cgo.twp b/doc/reptyr.cgo.twp new file mode 100644 index 0000000..f1b3003 --- /dev/null +++ b/doc/reptyr.cgo.twp @@ -0,0 +1,20 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:18 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: reptyr.cgo + +{{{ +Usage: reptyr [-s] PID + reptyr -l|-L [COMMAND [ARGS]] + -l Create a new pty pair and print the name of the slave. + if there are command-line arguments after -l + they are executed with REPTYR_PTY set to path of pty. + -L Like '-l', but also redirect the child's stdio to the slave. + -s Attach fds 0-2 on the target, even if it is not attached to a tty. + -h Print this help message and exit. + -v Print the version number and exit. + -V Print verbose debug output. +}}} diff --git a/doc/rmtildes.md b/doc/rmtildes.md new file mode 100644 index 0000000..41c968f --- /dev/null +++ b/doc/rmtildes.md @@ -0,0 +1,12 @@ +# rmtildes + +~~~ +rmtildes: supprimer les fichiers *~ dans le répertoire courant + +USAGE + rmtildes [dir [glob]] + +Par défaut, dir==. et glob==*~ +~~~ + +-*- 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/rruns.md b/doc/rruns.md new file mode 100644 index 0000000..2147b84 --- /dev/null +++ b/doc/rruns.md @@ -0,0 +1,74 @@ +# rruns + +~~~ +rruns: Déploiement distant avec runs + +USAGE + rruns [-h hosts] [-T tmproot] rscriptname name=value... + rruns [-h hosts] [-T tmproot] @recipe name=value... + rruns [-h hosts] [-T tmproot] -f rscript name=value... + rruns [-h hosts] [-T tmproot] -r recipe name=value... + +Lancer ce script sans argument (hors options) est équivalent à le lancer avec +l'argument @default + +OPTIONS + -C 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 + ce n'est pas possible de se connecter par mot de passe avec le user root + sur l'hôte distant, et qu'il existe un user sudoer sur l'hôte distant, + il est possible de faire la configuration avec '--configure root'. La + commande serait alors + rruns -h user@host --configure root + -T 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 + Spécifier le programme à utiliser pour la connection par ssh. + -h host + -h @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 + 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 + La forme @hostsfile permet de lire la liste des hôtes depuis le fichier + hostsfile, à raison d'un hôte par ligne. + Si cette option n'est pas spécifiée, et que le répertoire courant est + dans un des répertoires de $RUNSHOSTSPATH, sélectionner l'hôte + correspondant. Sinon, l'utilisateur doit saisir l'hôte distant de façon + interactive. + -f RSCRIPT + Lancer le script individuel spécifié au lieu de chercher dans les + répertoires $RUNS{SCRIPTS,HOSTS}PATH + -r RECIPE + Lancer les scripts spécifiés dans le fichier de recettes individuel + spécifié. + -z Forcer la réinstallation des scripts qui se basent sur shouldrun/setdone + -o OUTPUT + Générer l'archive à lancer sur l'hôte distant au lieu de faire le + déploiement. Si plusieurs hôtes sont spécifiés, OUTPUT est considéré + comme un nom de base auquel est ajouté le nom de l'hôte sur lequel + l'archive doit être déployée. + --init + --no-init + Forcer (resp. empêcher) la création des répertoires d'hôte correspondant + aux hôtes spécifiés. Par défaut, la création des répertoires d'hôte est + effectuée uniquement si ce script est lancé sans argument. + --sysinfos + Après un déploiement réussi sur l'hôte distant, inscrire si ce n'est + déjà fait le résultat de la commande usysinfos dans le fichier + sysinfos.conf du répertoire d'hôte. + Cette option est automatiquement activée si ce script est lancé sans + argument (hors options). +~~~ + +-*- 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/rruns.twp b/doc/rruns.twp index a485afe..a492593 100644 --- a/doc/rruns.twp +++ b/doc/rruns.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 30/03/2012 04:42 +##@created: 27/04/2016 03:18 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -10,10 +10,10 @@ rruns: Déploiement distant avec runs USAGE - rruns [-H host] [-T tmproot] rscriptname name=value... - rruns [-H host] [-T tmproot] @recipe name=value... - rruns [-H host] [-T tmproot] -f rscript name=value... - rruns [-H host] [-T tmproot] -r recipe name=value... + rruns [-h hosts] [-T tmproot] rscriptname name=value... + rruns [-h hosts] [-T tmproot] @recipe name=value... + rruns [-h hosts] [-T tmproot] -f rscript name=value... + rruns [-h hosts] [-T tmproot] -r recipe name=value... Lancer ce script sans argument (hors options) est équivalent à le lancer avec l'argument @default @@ -27,20 +27,31 @@ OPTIONS sur l'hôte distant, et qu'il existe un user sudoer sur l'hôte distant, il est possible de faire la configuration avec '--configure root'. La commande serait alors - rruns -H user@host --configure root + rruns -h user@host --configure root -T 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 Spécifier le programme à utiliser pour la connection par ssh. - -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 + -h host + -h @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 + 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 jclain@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. + Si cette option n'est pas spécifiée, et que le répertoire courant est + dans un des répertoires de $RUNSHOSTSPATH, sélectionner l'hôte + correspondant. Sinon, l'utilisateur doit saisir l'hôte distant de façon + interactive. -f RSCRIPT Lancer le script individuel spécifié au lieu de chercher dans les répertoires $RUNS{SCRIPTS,HOSTS}PATH @@ -53,6 +64,11 @@ OPTIONS déploiement. Si plusieurs hôtes sont spécifiés, OUTPUT est considéré comme un nom de base auquel est ajouté le nom de l'hôte sur lequel l'archive doit être déployée. + --init + --no-init + Forcer (resp. empêcher) la création des répertoires d'hôte correspondant + aux hôtes spécifiés. Par défaut, la création des répertoires d'hôte est + effectuée uniquement si ce script est lancé sans argument. --sysinfos Après un déploiement réussi sur l'hôte distant, inscrire si ce n'est déjà fait le résultat de la commande usysinfos dans le fichier diff --git a/doc/ruinst.md b/doc/ruinst.md new file mode 100644 index 0000000..8948173 --- /dev/null +++ b/doc/ruinst.md @@ -0,0 +1,48 @@ +# ruinst + +~~~ +ruinst: Déploiement distant avec uinst + +USAGE + ruinst [-h host] [-T tmproot] [-- options de uinst] + +note: à cause d'une limitation de makeself, les options de uinst ne devraient +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é + 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 + ce n'est pas possible de se connecter par mot de passe avec le user root + sur l'hôte distant, et qu'il existe un user sudoer sur l'hôte distant, + il est possible de faire la configuration avec '--configure root'. La + commande serait alors + ruinst -h user@host --configure root + 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: + ruinst -h user@host --configure root --uses-su + -T 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 + Spécifier le programme à utiliser pour la connection par ssh. + -h hosts + -h @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 + 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 + La forme @hostsfile permet de lire la liste des hôtes depuis le fichier + hostsfile, à raison d'un hôte par ligne. +~~~ + +-*- 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/ruinst.twp b/doc/ruinst.twp index 5d87d04..bfd5161 100644 --- a/doc/ruinst.twp +++ b/doc/ruinst.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:20 +##@created: 27/04/2016 03:18 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -10,7 +10,11 @@ ruinst: Déploiement distant avec uinst USAGE - ruinst [-H host] [-T tmproot] [-- options de uinst] + ruinst [-h host] [-T tmproot] [-- options de uinst] + +note: à cause d'une limitation de makeself, les options de uinst ne devraient +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é @@ -21,18 +25,28 @@ OPTIONS sur l'hôte distant, et qu'il existe un user sudoer sur l'hôte distant, il est possible de faire la configuration avec '--configure root'. La commande serait alors - ruinst -H user@host --configure root + ruinst -h user@host --configure root + 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: + ruinst -h user@host --configure root --uses-su -T 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 - 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 + -h hosts + -h @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 + 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. }}} diff --git a/doc/rumount.md b/doc/rumount.md new file mode 100644 index 0000000..097077b --- /dev/null +++ b/doc/rumount.md @@ -0,0 +1,14 @@ +# rumount + +~~~ +rumount: démonter un système de fichier récursivement + +USAGE + rumount 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. +~~~ + +-*- 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/rumount.twp b/doc/rumount.twp new file mode 100644 index 0000000..0e3573f --- /dev/null +++ b/doc/rumount.twp @@ -0,0 +1,18 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:18 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: rumount + +{{{ +rumount: démonter un système de fichier récursivement + +USAGE + rumount 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. +}}} diff --git a/doc/runs.md b/doc/runs.md new file mode 100644 index 0000000..3ecd61c --- /dev/null +++ b/doc/runs.md @@ -0,0 +1,58 @@ +# runs + +~~~ +runs: Lancer un script avec le protocole runs + +USAGE + runs [options] rscriptname name=value... + runs [options] @recipe name=value... + runs [options] -f rscript name=value... + runs [options] -r recipe name=value... + +OPTIONS +Configuration + --init + --verify + Vérifier le nom d'hôte et créer si nécessaire le répertoire d'hôte + correspondant à l'hôte courant ou à l'hôte spécifié avec l'option -h + Avec --verify, la création du répertoire d'hôte n'est pas effectuée. + --sysinfos DATA + Avec l'option --init, initialiser le fichier sysinfos.conf avec DATA, si + le fichier n'a pas déjà été provisionné. Sans cette option, un fichier + vide avec des commentaires est créé à la place. + --create RSCRIPT + Créer un modèle de script avec le nom donné. + Avec l'option -h, le script est créé dans le répertoire d'hôte + correspondant à l'hôte spécifié + +Gestion des scripts + -s Forcer l'exécution du script avec l'utilisateur root si ce n'est pas + déjà le cas + -f RSCRIPT + Lancer le script individuel spécifié au lieu de chercher dans les + répertoires de $RUNSSCRIPTSPATH + -r RECIPE + Lancer les scripts spécifiés dans le fichier de recettes individuel + spécifié. + -h HOSTNAME[.DOMAIN] + Spécifier que les scripts sont destinés à être lancés sur l'hôte + spécifié. Les scripts sont alors aussi cherchés dans les répertoires + {$RUNSHOSTSPATH}/$hostname.$domain (par défaut) et + {$RUNSHOSTSPATH}/$domain/$hostname (le cas échéant) + L'option --host est équivalente, sauf que son argument est facultatif et + que sa valeur par défaut est l'hôte courant, soit sulfure + --list + Afficher la liste des scripts qui sont disponibles. Avec l'option -h, + inclure aussi les scripts spécifiques à cet hôte. + Avec cette option, les arguments supplémentaires agissent comme des + filtres (regexp utilisée avec l'opérateur == de la commande [[). Les + noms des scripts doivent valider au moins un filtre. + --info + Afficher la la description du script et la valeur de chaque variable + définies + --desc-only + Afficher seulement la description du script + -z Forcer la réinstallation des scripts qui se basent sur shouldrun/setdone +~~~ + +-*- 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/runs.twp b/doc/runs.twp index 171dde0..978e900 100644 --- a/doc/runs.twp +++ b/doc/runs.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 30/03/2012 04:42 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -18,8 +18,10 @@ USAGE OPTIONS Configuration --init - Créer le répertoire d'hôte correspondant à l'hôte courant ou à l'hôte - spécifié avec l'option -h + --verify + Vérifier le nom d'hôte et créer si nécessaire le répertoire d'hôte + correspondant à l'hôte courant ou à l'hôte spécifié avec l'option -h + Avec --verify, la création du répertoire d'hôte n'est pas effectuée. --sysinfos DATA Avec l'option --init, initialiser le fichier sysinfos.conf avec DATA, si le fichier n'a pas déjà été provisionné. Sans cette option, un fichier @@ -44,7 +46,7 @@ Gestion des scripts {$RUNSHOSTSPATH}/$hostname.$domain (par défaut) et {$RUNSHOSTSPATH}/$domain/$hostname (le cas échéant) L'option --host est équivalente, sauf que son argument est facultatif et - que sa valeur par défaut est l'hôte courant, soit melee + que sa valeur par défaut est l'hôte courant, soit sulfure --list Afficher la liste des scripts qui sont disponibles. Avec l'option -h, inclure aussi les scripts spécifiques à cet hôte. diff --git a/doc/runsconfig.md b/doc/runsconfig.md new file mode 100644 index 0000000..f08bfe0 --- /dev/null +++ b/doc/runsconfig.md @@ -0,0 +1,33 @@ +# runsconfig + +~~~ +runsconfig: Gérer un répertoire d'hôte de runs + +USAGE + runsconfig -c [host [destdir]] + runsconfig -t -- args... + +OPTIONS + -c, --create + Créer un nouveau répertoire de configuration pour un hôte + -d, --destdir DESTDIR[=runs] + Nom du répertoire local de configuration. + + -t, --template [OPT] + Gérer les fichiers du répertoire local avec templatectl. La valeur de + cette option est utilisée comme argument court pour l'invocation de + templatectl, e.g + runsconfig -tm args + est équivalent à + templatectl -m args + Les arguments qui restent sont passés tels quels à templatectl + Les options courantes de templatectl -l, -v, -m, -L sont disponibles + directement + --help-template + Afficher l'aide concernent la gestion des templates. + Equivalent à -t -- --help + -h, --host HOST + Spécifier l'hôte. Equivalent à -v host=HOST +~~~ + +-*- 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/runsconfig.twp b/doc/runsconfig.twp new file mode 100644 index 0000000..3cc4a10 --- /dev/null +++ b/doc/runsconfig.twp @@ -0,0 +1,37 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: runsconfig + +{{{ +runsconfig: Gérer un répertoire d'hôte de runs + +USAGE + runsconfig -c [host [destdir]] + runsconfig -t -- args... + +OPTIONS + -c, --create + Créer un nouveau répertoire de configuration pour un hôte + -d, --destdir DESTDIR[=runs] + Nom du répertoire local de configuration. + + -t, --template [OPT] + Gérer les fichiers du répertoire local avec templatectl. La valeur de + cette option est utilisée comme argument court pour l'invocation de + templatectl, e.g + runsconfig -tm args + est équivalent à + templatectl -m args + Les arguments qui restent sont passés tels quels à templatectl + Les options courantes de templatectl -l, -v, -m, -L sont disponibles + directement + --help-template + Afficher l'aide concernent la gestion des templates. + Equivalent à -t -- --help + -h, --host HOST + Spécifier l'hôte. Equivalent à -v host=HOST +}}} diff --git a/doc/runsmod.md b/doc/runsmod.md new file mode 100644 index 0000000..8c5bf5e --- /dev/null +++ b/doc/runsmod.md @@ -0,0 +1,66 @@ +# runsmod + +~~~ +runsmod: récupérer des dépôts git à usage de runs + +USAGE + runsmod [options] [-h host] [modules...] + +Tous les dépôts spécifiés dans la configuration sont récupérés. Si des modules +sont spécifiés, les dépôts correspondants sont récupérés aussi. Avec l'option +-h, des dépôts spécifiques à l'hôte peuvent éventuellement être récupérés en +plus. + +OPTIONS + -c, --config CONFIG + Spécifier un fichier de configuration à charger au lieu de la valeur par + défaut ~/etc/default/runs + --prod + --devel + Forcer un mode de sélection des urls. En mode production, préférer pour + le clonage les urls de production, qui sont en principe accessibles sans + authentification et en lecture seule. En mode développement, préférer + pour le clonage les urls de développement, qui sont en principe + accessibles par clé ssh et en lecture/écriture + --no-fetch + Ne rien récupérer. Utile avec --update-repolist + -N, --no-host + -A, --all-hosts + -H, -h, --host HOST + -T, --this-host + Options permettant de spécifier l'hôte pour la récupération de dépôts + spécifiques. + --no-host demande explicitement à ce qu'aucun hôte ne soit spécifié + --all-hosts sélectionne tous les dépôts spécifiques + --host récupère uniquement les dépôts pour l'hôte spécifié + --this-host équivaut à --host sulfure + L'option par défaut est --this-host en mode production et --all-hosts en + mode développement + --update-repolist + Forcer la mise à jour de la liste des dépôts. En principe, cette mise à + jour n'est pas faite plus d'une fois par période de 24 heures. + -0, --offline + -n, --no-pull + -u, --pull + Spécifier le mode opératoire pour la récupération des dépôts. + En mode --offline, ni clone ni pull ne sont autorisés. Le module doit + avoir déjà été cloné. + En mode --no-pull, seul le clonage est autorisé, e.g. le dépôt est + cloné si ce n'est pas déjà le cas. + En mode --pull, cloner le dépôt si ce n'est pas déjà le cas, ou le + mettre à jour le dépôt avant de l'utiliser s'il avait déjà été cloné. + Par défaut, utiliser --pull en mode production et --no-pull en mode + développement. + -i, --identity IDENTITY_FILE + Spécifier le fichier depuis lequel lire la clé privée pour les + connexions par ssh. + -o, --output OUTPUT + Spécifier un fichier dans lequel écrire des définitions de variables, + notamment REPODIRS qui reçoit la liste des chemins des dépôts qui ont + été récupérés. De plus, les variables RUNSSCRIPTSPATH, RUNSMODULESPATH + et RUNSHOSTSPATH sont définies. + -a, --append-output + Ajouter au fichier OUTPUT au lieu de l'écraser +~~~ + +-*- 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/runsmod.twp b/doc/runsmod.twp new file mode 100644 index 0000000..9d90c90 --- /dev/null +++ b/doc/runsmod.twp @@ -0,0 +1,70 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: runsmod + +{{{ +runsmod: récupérer des dépôts git à usage de runs + +USAGE + runsmod [options] [-h host] [modules...] + +Tous les dépôts spécifiés dans la configuration sont récupérés. Si des modules +sont spécifiés, les dépôts correspondants sont récupérés aussi. Avec l'option +-h, des dépôts spécifiques à l'hôte peuvent éventuellement être récupérés en +plus. + +OPTIONS + -c, --config CONFIG + Spécifier un fichier de configuration à charger au lieu de la valeur par + défaut ~/etc/default/runs + --prod + --devel + Forcer un mode de sélection des urls. En mode production, préférer pour + le clonage les urls de production, qui sont en principe accessibles sans + authentification et en lecture seule. En mode développement, préférer + pour le clonage les urls de développement, qui sont en principe + accessibles par clé ssh et en lecture/écriture + --no-fetch + Ne rien récupérer. Utile avec --update-repolist + -N, --no-host + -A, --all-hosts + -H, -h, --host HOST + -T, --this-host + Options permettant de spécifier l'hôte pour la récupération de dépôts + spécifiques. + --no-host demande explicitement à ce qu'aucun hôte ne soit spécifié + --all-hosts sélectionne tous les dépôts spécifiques + --host récupère uniquement les dépôts pour l'hôte spécifié + --this-host équivaut à --host sulfure + L'option par défaut est --this-host en mode production et --all-hosts en + mode développement + --update-repolist + Forcer la mise à jour de la liste des dépôts. En principe, cette mise à + jour n'est pas faite plus d'une fois par période de 24 heures. + -0, --offline + -n, --no-pull + -u, --pull + Spécifier le mode opératoire pour la récupération des dépôts. + En mode --offline, ni clone ni pull ne sont autorisés. Le module doit + avoir déjà été cloné. + En mode --no-pull, seul le clonage est autorisé, e.g. le dépôt est + cloné si ce n'est pas déjà le cas. + En mode --pull, cloner le dépôt si ce n'est pas déjà le cas, ou le + mettre à jour le dépôt avant de l'utiliser s'il avait déjà été cloné. + Par défaut, utiliser --pull en mode production et --no-pull en mode + développement. + -i, --identity IDENTITY_FILE + Spécifier le fichier depuis lequel lire la clé privée pour les + connexions par ssh. + -o, --output OUTPUT + Spécifier un fichier dans lequel écrire des définitions de variables, + notamment REPODIRS qui reçoit la liste des chemins des dépôts qui ont + été récupérés. De plus, les variables RUNSSCRIPTSPATH, RUNSMODULESPATH + et RUNSHOSTSPATH sont définies. + -a, --append-output + Ajouter au fichier OUTPUT au lieu de l'écraser +}}} diff --git a/doc/rwoinst.md b/doc/rwoinst.md new file mode 100644 index 0000000..170400d --- /dev/null +++ b/doc/rwoinst.md @@ -0,0 +1,34 @@ +# rwoinst + +~~~ +rwoinst: Déploiement distant avec woinst + +USAGE + rwoinst [-H host] [-T tmproot] ... [-- options de woinst] + +OPTIONS + -C 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 + ce n'est pas possible de se connecter par mot de passe avec le user root + sur l'hôte distant, et qu'il existe un user sudoer sur l'hôte distant, + il est possible de faire la configuration avec '--configure root'. La + commande serait alors + rwoinst -H user@host --configure root + -T 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 + Spécifier le programme à utiliser pour la connection par ssh. + -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 + 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 +~~~ + +-*- 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/sqlcsv.md b/doc/sqlcsv.md new file mode 100644 index 0000000..9ed690e --- /dev/null +++ b/doc/sqlcsv.md @@ -0,0 +1,94 @@ +# sqlcsv + +~~~ +USAGE: + sqlcsv [query] + +query est la requête SQL à exécuter. Si query n'est pas spécifiée ou si elle + vaut '-', la requête SQL est lue sur l'entrée standard, ou depuis un + fichier si l'option -f est spécifiée. + +DEMARRAGE + +Au démarrage, les répertoires de configuration (utilisateur ~/.sqlcsv et système +/etc/sqlcsv) sont analysés. Les fichiers *.jar situés dans ces répertoires sont +ajoutés au CLASSPATH. La présence de certains fichiers est testée pour activer +éventuellement les logs détaillés. + +OPTIONS + -C, --config CONFIG + Prendre les informations de connexion depuis le fichier de propriété + spécifié. Pour l'identifiant CONN, la propriété 'CONN.url' doit exister + dans ce fichier avec la valeur de l'url jdbc de connexion. De plus, les + propriétés 'CONN.user' et 'CONN.password' contiennent respectivement si + nécessaire le nom et le mot de passe de connexion. La propriété + 'loglevel', si elle existe, est utilisée pour configurer le niveau + d'affichage des logs, comme avec l'option --loglevel + Si cette option n'est pas spécifiée, un fichier nommé sqlcsv.properties + est recherché dans l'ordre: dans le répertoire courant, dans le + répertoire de configuration utilisateur, puis dans le répertoire de + configuration système. Si le fichier est trouvé, il est chargé + automatiquement. + -l, --conn CONN + Spécifier l'identifiant (ou l'url) de connexion. Cette information est + obligatoire. Si cette option n'est pas fournie, il faut spécifier un + fichier de configuration avec l'option -C dans lequel *une seule* + propriété 'CONN.url' est définie. + -u, --user USER + -p, --password PASSWORD + Spécifier un nom de connexion et un mot de passe si l'url ne le fournit + pas. Ces valeurs ont la priorité sur les valeurs éventuellement déjà + présentes dans le fichier de propriété. + -f, --input INPUT + Lire la requête depuis le fichier INPUT au lieu de la lire depuis la + ligne de commande ou l'entrée standard. Ne pas spécifier cette option ou + utiliser '-' pour lire depuis l'entrée standard. Cette option est + ignorée si la requête est fournie sur la ligne de commande. + -o, --output OUTPUT + Ecrire le résultat dans le fichier OUTPUT. Utiliser '-' pour spécifier + la sortie standard (c'est la valeur par défaut). S'il y a plusieurs + requêtes et que le fichier de sortie n'est pas la sortie standard, + ajouter un numéro incrémental au nom du fichier en sortie pour chaque + requête. Sinon, il est possible de spécifier plusieurs fois cette option + pour nommer les fichiers correspondant à chaque requête. + -t, --autocommit + Activer le mode autocommit + -c, --ignore-io-error + Continuer le traitement même en cas d'erreur du système de fichiers. + Cependant le traitement s'arrête et la transaction est annulée si une + autre erreur se produit. + -y, --ignore-any-error + Continuer le traitement même en cas d'erreur quelconque. + -n, --no-headers + Ne JAMAIS inclure les en-têtes dans la sortie, même avec l'option -h + -a, --append + Ajouter le résultat au fichier OUTPUT au lieu de l'écraser. + -A, --auto-na + Activer les option -n -a si le fichier OUTPUT existe et qu'il est non + vide. Le test n'est effectué que pour le premier fichier spécifié. + -s, --same-output + Utiliser le même fichier pour écrire le résultat de toutes les requêtes. + Normalement, un numéro incrémental est ajouté au fichier en sortie si + plusieurs requêtes sont spécifiées. Si les en-têtes sont les mêmes, + ajouter le résultat au fichier directement à la suite. Sinon, sauter une + ligne blanche et afficher les nouveaux en-têtes. + -h, --force-headers + En cas d'écriture du résultat de plusieurs requêtes dans un même + fichier, ne pas tenter de concaténer les résultats même si les en-têtes + sont les mêmes. + --uc-output + Ajouter dans la sortie les résultat de toutes les requêtes, pas + seulement celles de type DQML + --loglevel LOGLEVEL + Spécifier le niveau de logs à afficher. Les valeurs valides sont à + choisir parmi ALL, FINEST, FINER, FINE, CONFIG, INFO, WARNING, ERROR + La présence de certains fichiers dans les répertoires de configuration + utilisateur ou système configure les logs avant que les options de la + ligne de commande ne soient analysés: un fichier DEBUG fait démarrer + l'application avec le niveau de log ALL ce qui permet de voir les logs + concernant le chargement des jar. Un fichier SQL_DEBUG permet d'activer + la trace de DriverManager. Exemple: + mkdir -p ~/.sqlcsv && touch ~/.sqlcsv/{DEBUG,SQL_DEBUG} +~~~ + +-*- 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/sqlcsv.twp b/doc/sqlcsv.twp new file mode 100644 index 0000000..fe91aba --- /dev/null +++ b/doc/sqlcsv.twp @@ -0,0 +1,98 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: sqlcsv + +{{{ +USAGE: + sqlcsv [query] + +query est la requête SQL à exécuter. Si query n'est pas spécifiée ou si elle + vaut '-', la requête SQL est lue sur l'entrée standard, ou depuis un + fichier si l'option -f est spécifiée. + +DEMARRAGE + +Au démarrage, les répertoires de configuration (utilisateur ~/.sqlcsv et système +/etc/sqlcsv) sont analysés. Les fichiers *.jar situés dans ces répertoires sont +ajoutés au CLASSPATH. La présence de certains fichiers est testée pour activer +éventuellement les logs détaillés. + +OPTIONS + -C, --config CONFIG + Prendre les informations de connexion depuis le fichier de propriété + spécifié. Pour l'identifiant CONN, la propriété 'CONN.url' doit exister + dans ce fichier avec la valeur de l'url jdbc de connexion. De plus, les + propriétés 'CONN.user' et 'CONN.password' contiennent respectivement si + nécessaire le nom et le mot de passe de connexion. La propriété + 'loglevel', si elle existe, est utilisée pour configurer le niveau + d'affichage des logs, comme avec l'option --loglevel + Si cette option n'est pas spécifiée, un fichier nommé sqlcsv.properties + est recherché dans l'ordre: dans le répertoire courant, dans le + répertoire de configuration utilisateur, puis dans le répertoire de + configuration système. Si le fichier est trouvé, il est chargé + automatiquement. + -l, --conn CONN + Spécifier l'identifiant (ou l'url) de connexion. Cette information est + obligatoire. Si cette option n'est pas fournie, il faut spécifier un + fichier de configuration avec l'option -C dans lequel *une seule* + propriété 'CONN.url' est définie. + -u, --user USER + -p, --password PASSWORD + Spécifier un nom de connexion et un mot de passe si l'url ne le fournit + pas. Ces valeurs ont la priorité sur les valeurs éventuellement déjà + présentes dans le fichier de propriété. + -f, --input INPUT + Lire la requête depuis le fichier INPUT au lieu de la lire depuis la + ligne de commande ou l'entrée standard. Ne pas spécifier cette option ou + utiliser '-' pour lire depuis l'entrée standard. Cette option est + ignorée si la requête est fournie sur la ligne de commande. + -o, --output OUTPUT + Ecrire le résultat dans le fichier OUTPUT. Utiliser '-' pour spécifier + la sortie standard (c'est la valeur par défaut). S'il y a plusieurs + requêtes et que le fichier de sortie n'est pas la sortie standard, + ajouter un numéro incrémental au nom du fichier en sortie pour chaque + requête. Sinon, il est possible de spécifier plusieurs fois cette option + pour nommer les fichiers correspondant à chaque requête. + -t, --autocommit + Activer le mode autocommit + -c, --ignore-io-error + Continuer le traitement même en cas d'erreur du système de fichiers. + Cependant le traitement s'arrête et la transaction est annulée si une + autre erreur se produit. + -y, --ignore-any-error + Continuer le traitement même en cas d'erreur quelconque. + -n, --no-headers + Ne JAMAIS inclure les en-têtes dans la sortie, même avec l'option -h + -a, --append + Ajouter le résultat au fichier OUTPUT au lieu de l'écraser. + -A, --auto-na + Activer les option -n -a si le fichier OUTPUT existe et qu'il est non + vide. Le test n'est effectué que pour le premier fichier spécifié. + -s, --same-output + Utiliser le même fichier pour écrire le résultat de toutes les requêtes. + Normalement, un numéro incrémental est ajouté au fichier en sortie si + plusieurs requêtes sont spécifiées. Si les en-têtes sont les mêmes, + ajouter le résultat au fichier directement à la suite. Sinon, sauter une + ligne blanche et afficher les nouveaux en-têtes. + -h, --force-headers + En cas d'écriture du résultat de plusieurs requêtes dans un même + fichier, ne pas tenter de concaténer les résultats même si les en-têtes + sont les mêmes. + --uc-output + Ajouter dans la sortie les résultat de toutes les requêtes, pas + seulement celles de type DQML + --loglevel LOGLEVEL + Spécifier le niveau de logs à afficher. Les valeurs valides sont à + choisir parmi ALL, FINEST, FINER, FINE, CONFIG, INFO, WARNING, ERROR + La présence de certains fichiers dans les répertoires de configuration + utilisateur ou système configure les logs avant que les options de la + ligne de commande ne soient analysés: un fichier DEBUG fait démarrer + l'application avec le niveau de log ALL ce qui permet de voir les logs + concernant le chargement des jar. Un fichier SQL_DEBUG permet d'activer + la trace de DriverManager. Exemple: + mkdir -p ~/.sqlcsv && touch ~/.sqlcsv/{DEBUG,SQL_DEBUG} +}}} diff --git a/doc/twsync.md b/doc/twsync.md new file mode 100644 index 0000000..d3f4b27 --- /dev/null +++ b/doc/twsync.md @@ -0,0 +1,35 @@ +# twsync + +~~~ +twsync: synchroniser un répertoire de wiki avec un tiddlywiki + +USAGE + twsync [options] + +Un répertoire de wiki est un répertoire où chaque page est contenu dans un +fichier avec l'extension .twp +Un tiddlywiki est un fichier html contenant le code de TiddlyWiki et les données +associées. + +OPTIONS + -d wikidir + -f wikifile + Spécifier le répertoire de wiki et le tiddlywiki à traiter. Par défaut, + il s'agit de wiki.html dans le répertoire courant. + -u Importer les pages de wikidir dans le tiddlywiki. Utiliser cette action + quand les pages de wikidir sont modifiées et qu'il faut mettre à jour le + tiddlywiki. + Il s'agit de l'action par défaut + --force + Forcer l'importation des pages même si les tiddlers correspondant sont + plus récents dans le tiddlywiki + Forcer aussi la regénération de wikifile même si aucune modification n'a + été détectée + -e Exporter les tiddlers du tiddlywiki vers wikidir. Utiliser cette action + quand le tiddlywiki a été modifié, et qu'il faut synchroniser wikidir + avec les dernières modifications. + -U Mettre à jour le fichier wikifile avec la dernière version de tiddlywiki + située dans ~/wop/modules/nutools/lib/tiddlywiki/empty.html +~~~ + +-*- 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/uawk.md b/doc/uawk.md new file mode 100644 index 0000000..2466c1b --- /dev/null +++ b/doc/uawk.md @@ -0,0 +1,13 @@ +# uawk + +~~~ +uawk: wrapper pour des outils implémentés en awk + +USAGE + uawk TOOL args... + +Les noms d'outils valides sont: awkrun awkcsv grepcsv awkfsv2csv mergecsv sortcsv dumpcsv printcsv +Utiliser l'option --help pour obtenir de l'aide sur chacun des outils +~~~ + +-*- 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/uawk.twp b/doc/uawk.twp new file mode 100644 index 0000000..494c2d8 --- /dev/null +++ b/doc/uawk.twp @@ -0,0 +1,17 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: uawk + +{{{ +uawk: wrapper pour des outils implémentés en awk + +USAGE + uawk TOOL args... + +Les noms d'outils valides sont: awkrun awkcsv grepcsv awkfsv2csv mergecsv sortcsv dumpcsv printcsv +Utiliser l'option --help pour obtenir de l'aide sur chacun des outils +}}} diff --git a/doc/ubackup.md b/doc/ubackup.md new file mode 100644 index 0000000..326a7a3 --- /dev/null +++ b/doc/ubackup.md @@ -0,0 +1,20 @@ +# ubackup + +~~~ +ubackup: faire une sauvegarde des fichiers + +USAGE + ubackup [options] + +OPTIONS + -l Lister les profils de sauvegarde disponibles. + -p Spécifier le profil de sauvegarde à effectuer. Par défaut, toutes les + sauvegardes sont effectuées. + -u USER + Faire le sauvegarde pour l'utilisateur $USER. Cette option n'est valide + que pour l'utilisateur root. + -n Afficher ce qui doit être fait plutôt que de le faire + -H Arrêter la machine après une sauvegarde REUSSIE. +~~~ + +-*- 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/ucalc.md b/doc/ucalc.md new file mode 100644 index 0000000..42269c4 --- /dev/null +++ b/doc/ucalc.md @@ -0,0 +1,31 @@ +# ucalc + +~~~ +ucalc: Afficher une valeur dans plusieurs unités + +USAGE + ucalc value + +Sans suffixe, la valeur est exprimée en octets. Sinon, elle peut être suffixée +pour spécifier l'unité dans laquelle est exprimée la valeur: + K,M,G,T -- Kibi (1024), Mibi (1024^2), Gibi (1024^3), Tebi (1024^4) + k,m,g,t -- Kilo (1000), Mega (1000^2), Giga (1000^3), Tera (1000^4) + s -- secteurs de 512 octets + S -- secteurs de 2048 octets + p -- pages de 4096 octets + c -- cylindres (si l'option -c est spécifiée) + b -- octets + +OPTIONS + -u UNIT + Spécifier l'unité de value. Le suffixe qui est éventuellement sur value + est ignoré. + -o UNIT + Spécifier l'unité en sortie. Par défaut, afficher la valeur dans toutes + les unités supportées. + -c VALUE + Taille d'un cylindre en octets, pour permettre l'affichage des valeurs + en cylindres +~~~ + +-*- 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/ucalc.twp b/doc/ucalc.twp new file mode 100644 index 0000000..87c3bef --- /dev/null +++ b/doc/ucalc.twp @@ -0,0 +1,35 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: ucalc + +{{{ +ucalc: Afficher une valeur dans plusieurs unités + +USAGE + ucalc value + +Sans suffixe, la valeur est exprimée en octets. Sinon, elle peut être suffixée +pour spécifier l'unité dans laquelle est exprimée la valeur: + K,M,G,T -- Kibi (1024), Mibi (1024^2), Gibi (1024^3), Tebi (1024^4) + k,m,g,t -- Kilo (1000), Mega (1000^2), Giga (1000^3), Tera (1000^4) + s -- secteurs de 512 octets + S -- secteurs de 2048 octets + p -- pages de 4096 octets + c -- cylindres (si l'option -c est spécifiée) + b -- octets + +OPTIONS + -u UNIT + Spécifier l'unité de value. Le suffixe qui est éventuellement sur value + est ignoré. + -o UNIT + Spécifier l'unité en sortie. Par défaut, afficher la valeur dans toutes + les unités supportées. + -c VALUE + Taille d'un cylindre en octets, pour permettre l'affichage des valeurs + en cylindres +}}} diff --git a/doc/uconf.md b/doc/uconf.md new file mode 100644 index 0000000..4c8c01d --- /dev/null +++ b/doc/uconf.md @@ -0,0 +1,52 @@ +# uconf + +~~~ +uconf: Activer ou désactiver un paramètre dans un fichier de configuration + +USAGE + uconf [options] config name[=value]... + +OPTIONS + -e + Activer le paramètre (par défaut). Si le paramètre existe, mais est + commenté, il est décommenté. Si une valeur est spécifiée pour le + paramètre, le paramètre est modifié dans le fichier en conséquence. + -q + Cette option s'utilise avec l'option -e et le type shell. Elle permet + de s'assurer que les valeurs ayant des espaces et/ou des caractères + spéciaux sont quotées + -d + Désactiver le paramètre. Le paramètre est commenté s'il existe dans le + fichier + -a + Ajouter une valeur à la variable, ou un paramètre avec cette valeur + (suivant le type de fichier de configuration) + -A + Ajouter une valeur au tableau, ou un paramètre avec cette valeur + (suivant le type de fichier de configuration) + -t TYPE + Type de fichier de configuration. TYPE peut être sh (par défaut), apache + ou mysql. + shell + les paramètres sont de la forme 'name=value', et les commentaires + débutent par '#'. Ce type peut être utilisé pour tous les fichiers + ayant ces caractéristiques, dont les fichiers de script shell + apache + les paramètres sont de la forme 'name value', et les commentaires + débutent par '#'. Ce type peut être utilisé pour tous les fichiers + ayant ces caractéristiques, dont les fichiers de configuration + apache + mysql, php + les paramètres sont dans des sections nommées de la forme [section], + sont de la forme 'name=value', et les commentaires débutent par '#' + ou ';' + Ce type peut être utilisé pour tous les fichiers ayant ces + caractéristiques, dont les fichiers de configuration de mysql et de + php. Avec ce type, la section est obligatoire. + -s SECTION + Avec le type mysql, préciser la section dans laquelle inscrire le + paramètre. Attention! La section DOIT exister, elle n'est pas créée + automatiquement. +~~~ + +-*- 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/uconf.twp b/doc/uconf.twp index eea3882..14fa196 100644 --- a/doc/uconf.twp +++ b/doc/uconf.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:20 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -13,17 +13,22 @@ USAGE uconf [options] config name[=value]... OPTIONS - -e Activer le paramètre (par défaut). Si le paramètre existe, mais est + -e + Activer le paramètre (par défaut). Si le paramètre existe, mais est commenté, il est décommenté. Si une valeur est spécifiée pour le paramètre, le paramètre est modifié dans le fichier en conséquence. - -q Cette option s'utilise avec l'option -e et le type shell. Elle permet + -q + Cette option s'utilise avec l'option -e et le type shell. Elle permet de s'assurer que les valeurs ayant des espaces et/ou des caractères spéciaux sont quotées - -d Désactiver le paramètre. Le paramètre est commenté s'il existe dans le + -d + Désactiver le paramètre. Le paramètre est commenté s'il existe dans le fichier - -a Ajouter une valeur à la variable, ou un paramètre avec cette valeur + -a + Ajouter une valeur à la variable, ou un paramètre avec cette valeur (suivant le type de fichier de configuration) - -A Ajouter une valeur au tableau, ou un paramètre avec cette valeur + -A + Ajouter une valeur au tableau, ou un paramètre avec cette valeur (suivant le type de fichier de configuration) -t TYPE Type de fichier de configuration. TYPE peut être sh (par défaut), apache diff --git a/doc/ucrontab.md b/doc/ucrontab.md new file mode 100644 index 0000000..27c3aca --- /dev/null +++ b/doc/ucrontab.md @@ -0,0 +1,86 @@ +# ucrontab + +~~~ +ucrontab: Ajouter/Supprimer une ligne dans crontab + +USAGE + ucrontab [options] ctline + +OPTIONS + -a Ajouter la ligne dans le fichier crontab (par défaut) + -r Enlever la ligne dans le fichier crontab + -u user + Spécifier l'utilisateur pour lequel on modifie crontab. Par défaut, + modifier le crontab de root + -H host:hosts... + Modifier le crontab sur les hôtes distants spécifiés. Avec l'hôte '.' ou + 'localhost', la modification est faite sur l'hôte local + Si l'action est -a, un script 'undo-ucrontab.sh' est créé dans le + répertoire courant, qui annule la planification. Il est possible de + lancer ce script le lendemain pour enlever les planifications + installées. + ctline + Ligne de crontab de la forme 'minutes hours days months dows command' + Si la ligne est de la forme halt[@hh:mm], la commande 'shutdown -h now' + est planifiée pour le LENDEMAIN à hh:mm. si hh:mm n'est pas spécifié, + l'arrêt est planifié pour 7:00 + -t hh:mm + Ignorer la partie 'minutes hours days months dows' de ctline, et la + remplacer par une planification à hh:mm le LENDEMAIN. + --dom dayOfMonth + --month month + Spécifier respectivement le jour du mois et le mois (1-12) auquel faire + la planification. Par défaut, les planifications sont effectuées pour le + LENDEMAIN. Il est conseillé de spécifier les deux arguments si le jour + doit être fixé. + -s cmdfile + Spécifier un fichier, dont le contenu est utilisé pour générer le script + qui est planifié. Le fichier doit contenir l'ensemble des commandes à + exécuter. Le script est modifié pour s'autodétruire à la fin de son + exécution. Si ce comportement n'est pas souhaité, il faut rajouter la + commande 'exit 0' à la fin. + -S cmd + Comme -s, mais spécifier le contenu du fichier directement sur la ligne + de commande. + -f hostsfile + Spécifier un fichier qui contient la liste des hôtes sur lesquels faire + les planifications. + Les options -s, -S, -H, -d, -n sont ignorées. L'option --add est valide + jusqu'au premier @group du fichier. Voici le format de ce fichier: + + Un groupe d'hôte débute par une ligne de la forme '@group:adelay:gdelay' + - adelay est le nombre de minutes à laisser passer entre les hôtes du + groupe (par défaut 1) + - gdelay est le nombre de minutes à laisser passer après le traitement + du groupe (par défaut 15) + Les autres lignes sont des hôtes sur lequels planifier l'opération, de + la forme 'host:cmd' + - host est un nom d'hôte pleinement qualifié, sur lequel il est possible + de se connecter par clé. + - cmd est une description de la commande à lancer pour effectuer + l'opération planifiée. Utiliser la syntaxe ' + +OPTIONS + var=value + Spécifier la valeur d'une variable ou d'un préfixe, plutôt que de + laisser uprefix l'autodétecter. Utiliser 'uprefix -l' pour avoir une + liste de préfixes valides. Utiliser 'udir --help-vars' pour avoir une + liste de variables valides pour uinst. + -d /path/to/destdir + Spécifier le répertoire destination, exactement comme si la valeur + destdir avait été spécifiée, i.e destdir="/path/to/destdir" + -h, --host [user@]host + Avec la méthode de déploiement uinst:rsync, permettre de spécifier un + hôte différent. Cette option est ignorée pour les autres méthodes de + déploiement. Si host vaut localhost, un déploiement local avec ssh est + effectué. Si host vaut '.', un déploiement local *sans passer par ssh* + est effectué, comme si seul le chemin avait été spécifié. + Cette option initialise la valeur destdir_override_userhost + -S, --ssh ssh + Avec la méthode de déploiement uinst:rsync, spécifier le programme à + utiliser pour la connection par ssh. Cette option initialise la valeur + destdir_ssh + --force-remote + Avec la méthode de déploiement uinst:rsync, si un hôte est spécifié dans + la valeur de destdir, forcer le déploiement distant avec ssh+rsync, même + si l'hôte et l'utilisateur correspondent aux valeurs courantes. Cette + option initialise la valeur destdir_force_remote + -a, --auto + Si la source n'est pas spécifiée, déterminer le répertoire à déployer + automatiquement (c'est la valeur par défaut) + --no-auto + Ne pas déterminer automatiquement le répertoire à déployer. + --prefix + Corriger les chemins srcdir et destdir qui commencent par des préfixes + valides (c'est la valeur par défaut). Utiliser 'uprefix -l' pour avoir + une liste de préfixes valides + --no-prefix + Ne jamais corriger un chemin. + --include-vcs + Inclure les fichiers de VCS dans les fichiers copiés. Par défaut, les + fichiers de VCS sont exclus. + -l, --local-profiles + Installer les profils locaux comme tels + --shared-profiles + Installer les profils locaux comme des profils partagés. C'est la valeur + par défaut pour compatibilité. + -C Configurer un répertoire pour le déploiement avec uinst + Ajouter l'option --force pour forcer la reconfiguration +~~~ + +-*- 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/uinst.sh.md b/doc/uinst.sh.md new file mode 100644 index 0000000..7feb4b7 --- /dev/null +++ b/doc/uinst.sh.md @@ -0,0 +1,57 @@ +# uinst.sh + +~~~ +uinst.sh: Déployer en local un fichier, une archive, ou un répertoire + +USAGE + uinst.sh [options] + +OPTIONS + var=value + Spécifier la valeur d'une variable ou d'un préfixe, plutôt que de + laisser uprefix l'autodétecter. Utiliser 'uprefix -l' pour avoir une + liste de préfixes valides. Utiliser 'udir --help-vars' pour avoir une + liste de variables valides pour uinst.sh. + -d /path/to/destdir + Spécifier le répertoire destination, exactement comme si la valeur + destdir avait été spécifiée, i.e destdir="/path/to/destdir" + -h, --host [user@]host + Avec la méthode de déploiement uinst:rsync, permettre de spécifier un + hôte différent. Cette option est ignorée pour les autres méthodes de + déploiement. Si host vaut localhost, un déploiement local avec ssh est + effectué. Si host vaut '.', un déploiement local *sans passer par ssh* + est effectué, comme si seul le chemin avait été spécifié. + Cette option initialise la valeur destdir_override_userhost + -S, --ssh ssh + Avec la méthode de déploiement uinst:rsync, spécifier le programme à + utiliser pour la connection par ssh. Cette option initialise la valeur + destdir_ssh + --force-remote + Avec la méthode de déploiement uinst:rsync, si un hôte est spécifié dans + la valeur de destdir, forcer le déploiement distant avec ssh+rsync, même + si l'hôte et l'utilisateur correspondent aux valeurs courantes. Cette + option initialise la valeur destdir_force_remote + -a, --auto + Si la source n'est pas spécifiée, déterminer le répertoire à déployer + automatiquement (c'est la valeur par défaut) + --no-auto + Ne pas déterminer automatiquement le répertoire à déployer. + --prefix + Corriger les chemins srcdir et destdir qui commencent par des préfixes + valides (c'est la valeur par défaut). Utiliser 'uprefix -l' pour avoir + une liste de préfixes valides + --no-prefix + Ne jamais corriger un chemin. + --include-vcs + Inclure les fichiers de VCS dans les fichiers copiés. Par défaut, les + fichiers de VCS sont exclus. + -l, --local-profiles + Installer les profils locaux comme tels + --shared-profiles + Installer les profils locaux comme des profils partagés. C'est la valeur + par défaut pour compatibilité. + -C Configurer un répertoire pour le déploiement avec uinst + Ajouter l'option --force pour forcer la reconfiguration +~~~ + +-*- 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/uinst.sh.twp b/doc/uinst.sh.twp index 9fa8d2a..3ef8b7e 100644 --- a/doc/uinst.sh.twp +++ b/doc/uinst.sh.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:20 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -19,20 +19,43 @@ OPTIONS liste de préfixes valides. Utiliser 'udir --help-vars' pour avoir une liste de variables valides pour uinst.sh. -d /path/to/destdir - Spécifier le répertoire destination. Equivalent à l'option - destdir="/path/to/destdir" - -a (par défaut) Si la source n'est pas spécifiée, déterminer le répertoire - à déployer automatiquement. + Spécifier le répertoire destination, exactement comme si la valeur + destdir avait été spécifiée, i.e destdir="/path/to/destdir" + -h, --host [user@]host + Avec la méthode de déploiement uinst:rsync, permettre de spécifier un + hôte différent. Cette option est ignorée pour les autres méthodes de + déploiement. Si host vaut localhost, un déploiement local avec ssh est + effectué. Si host vaut '.', un déploiement local *sans passer par ssh* + est effectué, comme si seul le chemin avait été spécifié. + Cette option initialise la valeur destdir_override_userhost + -S, --ssh ssh + Avec la méthode de déploiement uinst:rsync, spécifier le programme à + utiliser pour la connection par ssh. Cette option initialise la valeur + destdir_ssh + --force-remote + Avec la méthode de déploiement uinst:rsync, si un hôte est spécifié dans + la valeur de destdir, forcer le déploiement distant avec ssh+rsync, même + si l'hôte et l'utilisateur correspondent aux valeurs courantes. Cette + option initialise la valeur destdir_force_remote + -a, --auto + Si la source n'est pas spécifiée, déterminer le répertoire à déployer + automatiquement (c'est la valeur par défaut) --no-auto Ne pas déterminer automatiquement le répertoire à déployer. --prefix - (par défaut) Corriger les chemins srcdir et destdir qui commencent par - des préfixes valides. Utiliser 'uprefix -l' pour avoir une liste de - préfixes valides. + Corriger les chemins srcdir et destdir qui commencent par des préfixes + valides (c'est la valeur par défaut). Utiliser 'uprefix -l' pour avoir + une liste de préfixes valides --no-prefix Ne jamais corriger un chemin. --include-vcs Inclure les fichiers de VCS dans les fichiers copiés. Par défaut, les fichiers de VCS sont exclus. + -l, --local-profiles + Installer les profils locaux comme tels + --shared-profiles + Installer les profils locaux comme des profils partagés. C'est la valeur + par défaut pour compatibilité. -C Configurer un répertoire pour le déploiement avec uinst + Ajouter l'option --force pour forcer la reconfiguration }}} diff --git a/doc/uinst.twp b/doc/uinst.twp index 5ac8655..e2f3338 100644 --- a/doc/uinst.twp +++ b/doc/uinst.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:20 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -19,20 +19,43 @@ OPTIONS liste de préfixes valides. Utiliser 'udir --help-vars' pour avoir une liste de variables valides pour uinst. -d /path/to/destdir - Spécifier le répertoire destination. Equivalent à l'option - destdir="/path/to/destdir" - -a (par défaut) Si la source n'est pas spécifiée, déterminer le répertoire - à déployer automatiquement. + Spécifier le répertoire destination, exactement comme si la valeur + destdir avait été spécifiée, i.e destdir="/path/to/destdir" + -h, --host [user@]host + Avec la méthode de déploiement uinst:rsync, permettre de spécifier un + hôte différent. Cette option est ignorée pour les autres méthodes de + déploiement. Si host vaut localhost, un déploiement local avec ssh est + effectué. Si host vaut '.', un déploiement local *sans passer par ssh* + est effectué, comme si seul le chemin avait été spécifié. + Cette option initialise la valeur destdir_override_userhost + -S, --ssh ssh + Avec la méthode de déploiement uinst:rsync, spécifier le programme à + utiliser pour la connection par ssh. Cette option initialise la valeur + destdir_ssh + --force-remote + Avec la méthode de déploiement uinst:rsync, si un hôte est spécifié dans + la valeur de destdir, forcer le déploiement distant avec ssh+rsync, même + si l'hôte et l'utilisateur correspondent aux valeurs courantes. Cette + option initialise la valeur destdir_force_remote + -a, --auto + Si la source n'est pas spécifiée, déterminer le répertoire à déployer + automatiquement (c'est la valeur par défaut) --no-auto Ne pas déterminer automatiquement le répertoire à déployer. --prefix - (par défaut) Corriger les chemins srcdir et destdir qui commencent par - des préfixes valides. Utiliser 'uprefix -l' pour avoir une liste de - préfixes valides. + Corriger les chemins srcdir et destdir qui commencent par des préfixes + valides (c'est la valeur par défaut). Utiliser 'uprefix -l' pour avoir + une liste de préfixes valides --no-prefix Ne jamais corriger un chemin. --include-vcs Inclure les fichiers de VCS dans les fichiers copiés. Par défaut, les fichiers de VCS sont exclus. + -l, --local-profiles + Installer les profils locaux comme tels + --shared-profiles + Installer les profils locaux comme des profils partagés. C'est la valeur + par défaut pour compatibilité. -C Configurer un répertoire pour le déploiement avec uinst + Ajouter l'option --force pour forcer la reconfiguration }}} diff --git a/doc/ujava.md b/doc/ujava.md new file mode 100644 index 0000000..c982d66 --- /dev/null +++ b/doc/ujava.md @@ -0,0 +1,26 @@ +# ujava + +~~~ +ujava: Lancer un script après avoir sélectionné une version de java + +USAGE + ujava [options] version [args...] + +OPTIONS + -b, --bits 32|64|auto + --32 + --64 + Sélectionner une version 32 ou 64 bits de java + -e, --exact + Sélectionner la version *exacte* de java demandée, au lieu de la version + minimum correspondant à la version demandée. + Si la version requise de java n'est pas trouvée, retourner avec le code + d'erreur 254. + +La version de java attendue peut-être exprimée de l'une des façons suivantes: +1.4 1.4+ 1.5 1.5+ 1.6 1.6+ 1.7 1.7+ +Si args n'est pas spécifié, un shell est lancé dans lequel les variables +JAVA_HOME, JAVA, JAVAC et PATH sont mis à jour. +~~~ + +-*- 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/ujava.twp b/doc/ujava.twp index c4f0cbe..828dec2 100644 --- a/doc/ujava.twp +++ b/doc/ujava.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:20 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -14,6 +14,8 @@ USAGE OPTIONS -b, --bits 32|64|auto + --32 + --64 Sélectionner une version 32 ou 64 bits de java -e, --exact Sélectionner la version *exacte* de java demandée, au lieu de la version diff --git a/doc/uldap.md b/doc/uldap.md new file mode 100644 index 0000000..1f4c914 --- /dev/null +++ b/doc/uldap.md @@ -0,0 +1,223 @@ +# uldap + +~~~ +uldap: Shell pour accéder à un serveur ldap + +USAGE + uldap [options] + +OPTIONS + -C profile + Sélectionner un profil de connexion. Par défaut, si l'option -H n'est + pas spécifiée, le premier profil est sélectionné. + -x Ne pas tenter de faire une connexion sur le profil par défaut si aucun + profil n'est sélectionné. + -f script + Lire les commandes depuis le script spécifié. + -n Avec un script donné en ligne de commande ou lu depuis un fichier, ne pas + ajouter automatiquement la commande print à la fin + -i Si un script est spécifié, passer en mode interactif après l'exécution + du script. + -e Forcer l'arrêt du script si une erreur se produit. C'est l'option par + défaut pour un script spécifié avec -f. + -l input.ldif + Charger le fichier input.ldif comme espace de travail initial + -H ldapuri + -D binddn + -w password + -b searchbase + -v var=value + +COMMANDES + $ cmd + Passer directement une commande au shell. + set [options] [var=value...] + Changer des options ou des variables. set sans argument affiche la liste + des variables définies. + [set] plain + Passer en mode 'plain': indiquer que l'espace de travail contient des + données brutes. Les pré-traitements et post-traitements (uncut_on_load, + decode_on_load, encode_on_save, cut_on_save) ne sont pas appliqués sur + cet espace de travail + [set] ldif + Passer en mode 'ldif': indiquer que l'espace de travail contient des + données ldif. Les pré-traitements et post-traitements sont appliqués + normalement sur cet espace de travail + [set] append + Pour certaines opérations, spécifier si le résultat de la *prochaine* + opération remplace le contenu de l'espace de travail courant (par + défaut), ou si le résultat est ajouté à la fin. + last + Afficher en mode édition la dernière commande. Cette commande n'est + fonctionnelle qu'avec une version de bash >=4.x + profile name + Choisir le profil 'name'. Equivalent à 'set profile=name'. Sans + argument, afficher la liste des profils valides. + auth anonymous|binddn [password] + Spécifier le compte à utiliser pour se connecter. Equivalent à + 'set binddn=binddn; set password=password' + clear [-k] + Vider l'espace de travail et passer en mode 'plain'. + Avec l'option -k, supprimer aussi tout l'historique d'annulation. + load [-k] input + Charger un fichier dans l'espace de travail. Si l'extension du fichier + est .ldif, passer en mode 'ldif' + En mode append, rajouter le contenu du fichier à l'espace de travail, + puis repasser en mode replace. + Le code de retour est 0 si le fichier a été chargé, 1 sinon. + save [-a] output + Sauvegarder l'espace de travail dans un fichier. + Avec l'option -a, rajouter au fichier au lieu de l'écraser + print + Afficher l'espace de travail + alias a=rdn... + Définir un alias pour la commande cd. 'a' est l'alias, 'rdn' est le dn + correspondant, exprimé par rapport à $suffix. Sans argument, afficher + la liste des aliases définis. + cd rdn + Changer searchbase. Par défaut, il s'agit d'un rdn relatif à $searchbase + - Certains aliases sont supportés: .. pour l'objet parent, ~ pour + $suffix, / pour la racine. 'cd' sans argument équivaut à 'cd ~' + - Si le dn commence par '~/', il s'agit d'un rdn relatif à $suffix. + - Si le dn commence par /, searchbase reçoit la valeur rdn sans + modifications (sauf bien sûr enlever le '/' de tête si nécessaire). Il + faut alors que ce soit un dn absolu. + ls [-b searchbase] [filter [attrs...]] + search [-b searchbase] [filter [attrs...]] + Utiliser ldapsearch pour faire la recherche, et copier le résultat dans + l'espace de travail. 'ls' est équivalent à 'search -s one'. Si ce n'est + pas déjà le cas, passer en mode 'ldif'. + L'option -b prend une valeur avec la même syntaxe que la commande cd, + sauf que les alias ne sont pas supportés. En particulier, la valeur est + relative au $searchbase courant. Pour faire une recherche par rapport à + $suffix, il faut utiliser la syntaxe ~/searchbase. + En mode append, rajouter le résultat de la recherche à l'espace de + travail, puis repasser en mode replace. + Le code de retour est 1 si aucun enregistrement n'a été trouvé, sinon + le code de retour est celui de la commande ldapsearch. + cut Couper les lignes trop longues. Cette action est en principe effectuée + automatiquement lors de la sauvegarde. Il n'est pas conseillé + d'appliquer des méthodes de transformation après avoir utilisé cette + action. + uncut + Fusionner les lignes coupées. Cette action est en principe effectuée + automatiquement lors du chargement ou après la recherche. + encode [attrs...] + Encoder en base64 les valeurs des attributs mentionnés. + decode [attrs...] + Décoder les valeurs des attributs mentionnés si nécessaire (c'est à dire + s'ils sont encodés en base64) + keepattr attrs... + Garder uniquement les lignes des attributs mentionnés. Ensuite, + supprimer les objets ayant uniquement la ligne dn: (en d'autres termes, + keepattr sans argument supprime *tout* l'espace de travail) + keepval attr patterns... + Pour l'attribut attr, garder uniquement les lignes pour lesquelles les + valeurs correspondent aux expressions régulières. Les autres attributs + ne sont pas modifiés. Ensuite, supprimer les objets ayant uniquement la + ligne dn: + exclude attrs... + Supprimer les lignes des attributs mentionnés. Ensuite, supprimer les + objets ayant uniquement la ligne dn: + excludeval attr patterns... + Pour l'attribut attr, supprimer les lignes pour lesquelles les + valeurs correspondent aux expressions régulières. Les autres attributs + ne sont pas modifiés. Ensuite, supprimer les objets ayant uniquement la + ligne dn: + keepvalentry attr patterns... + Pour l'attribut attr, vérifier si *au moins une* valeur correspond à + l'une des expressions régulières. Si c'est le cas, garder l'entrée + entière, sinon supprimer l'entrée. + excludevalentry attr patterns... + Pour l'attribut attr, vérifier si *aucune* des valeurs ne correspond à + l'une des expressions régulières. Si c'est le cas, garder l'entrée + entière, sinon supprimer l'entrée. + setval attr values... + Remplacer toutes les valeurs de l'attribut attr par les valeurs + spécifiées. + addval attr values... + Ajouter un nouvel attribut avec les valeurs spécifiées. Si l'attribut + existe déjà, les nouvelles valeurs sont ajoutées à la fin. + sed args + Modifier l'espace de travail avec le résultat de la commande sed. + note: aucun argument n'est filtré, mais il ne faut pas utiliser les + options de sed qui provoquent la modification en place du fichier, + comme par exemple l'option -i + awk args + Modifier l'espace de travail avec le résultat de la commande awk. + grep args + Modifier l'espace de travail avec le résultat de la commande grep. + format [options] attrs... + Formater l'espace de travail en données tabulaires, et passer en mode + 'plain'. + --show-headers + Afficher les en-têtes + -F FSEP + Spécifier le séparateur pour les attributs. Par défaut, il s'agit du + caractère de tabulation. + -R VSEP + Spécifier le séparateur pour les valeurs des attributs. Par défaut, il + s'agit du point-virgule ';' + -e Retourner les valeurs comme des variables shell. Les options -F et -R + sont ignorées. Les attributs multivalués sont écrits sous forme de + tableaux. Par exemple: + attributes=('mail' 'givenName') + index=0 + mail='user@domain.fr' + givenName=('peter' 'gabriel') + --bc + Dans le mode -e, spécifier une commande à insérer avant le premier + enregistrement. Quand cette commande est lancée, index==-1 + -c Dans le mode -e, spécifier une commande à insérer après chaque + enregistrement + --ec + Dans le mode -e, spécifier une commande à insérer après le dernier + enregistrement + sort [args] + Modifier l'espace de travail avec le résultat de la commande sort. + edit + Lancer un éditeur pour modifier l'espace de travail. + diff [options] + Afficher les différences entre l'espace de travail et la version + précédente + ifok cmd + iferror cmd + Si le dernier code de retour est 0 (resp. !=0), lancer la commande cmd + skip n + Sauter les n prochaines commandes. A utiliser avec ifok et iferror + undo + Annuler la dernière modification effectuée sur l'espace de travail + +Les directives suivantes prennent le contenu de l'espace de travail, et le +transforment en une suite de commandes de modifications pour ldapmodify: + + A Créer un objet de toutes pièces avec les attributs donnés et leurs + valeurs. + a Ajouter les valeurs spécifiée à l'attribut + r Remplacer les valeurs de l'attribut par celles spécifiées + d Supprimer les valeurs spécifiées de l'attribut + D Supprimer l'attribut + delentry + Supprimer l'objet + ldapmodify + Utiliser ldapmodify pour modifier les objets sur le serveur. Il faut + utiliser au préalable l'une des méthodes de transformation parmi A, a, + r, d, D, delentry. + Le code de retour est celui de la commande ldapmodify. + ldapadd + Utiliser ldapadd pour créer les objets situés dans l'espace de travail. + Le code de retour est celui de la commande ldapadd. + ldapdelete + Utiliser ldapdelete pour supprimer la liste des dns situés dans l'espace + de travail. + Le code de retour est celui de la commande ldapdelete. + +Notes: +- les expressions régulières sont celles reconnues par awk. +- pour spécifier plusieurs actions sur une même ligne, les séparer par // +- le code de retour est 0 si ok, 255 si une erreur s'est produite (erreur de + syntaxe, de connexion, de lecture/écriture de fichier, etc.). sinon, les + opérations ldap{search,modify,delete,add} ont leur code de retour respectifs +~~~ + +-*- 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/uldap.twp b/doc/uldap.twp index a4c0b96..269fd8f 100644 --- a/doc/uldap.twp +++ b/doc/uldap.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:20 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -130,6 +130,14 @@ COMMANDES valeurs correspondent aux expressions régulières. Les autres attributs ne sont pas modifiés. Ensuite, supprimer les objets ayant uniquement la ligne dn: + keepvalentry attr patterns... + Pour l'attribut attr, vérifier si *au moins une* valeur correspond à + l'une des expressions régulières. Si c'est le cas, garder l'entrée + entière, sinon supprimer l'entrée. + excludevalentry attr patterns... + Pour l'attribut attr, vérifier si *aucune* des valeurs ne correspond à + l'une des expressions régulières. Si c'est le cas, garder l'entrée + entière, sinon supprimer l'entrée. setval attr values... Remplacer toutes les valeurs de l'attribut attr par les valeurs spécifiées. diff --git a/doc/ulib.md b/doc/ulib.md new file mode 100644 index 0000000..e55c67d --- /dev/null +++ b/doc/ulib.md @@ -0,0 +1,70 @@ +# ulib + +## Liste des librairies de ulib +* [ulib/apache](ulib_apache) +* [ulib/apache.tools](ulib_apache.tools) +* [ulib/auto](ulib_auto) +* [ulib/awk](ulib_awk) +* [ulib/base](ulib_base) +* [ulib/base.args](ulib_base.args) +* [ulib/base.array](ulib_base.array) +* [ulib/base.bool](ulib_base.bool) +* [ulib/base.compat](ulib_base.compat) +* [ulib/base.core](ulib_base.core) +* [ulib/base.init](ulib_base.init) +* [ulib/base.num](ulib_base.num) +* [ulib/base.quote](ulib_base.quote) +* [ulib/base.split](ulib_base.split) +* [ulib/base.string](ulib_base.string) +* [ulib/base.tools](ulib_base.tools) +* [ulib/base.ulib](ulib_base.ulib) +* [ulib/bash](ulib_bash) +* [ulib/cgi](ulib_cgi) +* [ulib/cgisupport](ulib_cgisupport) +* [ulib/compat](ulib_compat) +* [ulib/conf](ulib_conf) +* [ulib/crontab](ulib_crontab) +* [ulib/debian](ulib_debian) +* [ulib/DEFAULTS](ulib_DEFAULTS) +* [ulib/install](ulib_install) +* [ulib/ipcalc](ulib_ipcalc) +* [ulib/java](ulib_java) +* [ulib/javaproperties](ulib_javaproperties) +* [ulib/json](ulib_json) +* [ulib/ldap](ulib_ldap) +* [ulib/ldif](ulib_ldif) +* [ulib/legacy](ulib_legacy) +* [ulib/macosx](ulib_macosx) +* [ulib/mkcrypt](ulib_mkcrypt) +* [ulib/modeline](ulib_modeline) +* [ulib/network-manager-service](ulib_network-manager-service) +* [ulib/password](ulib_password) +* [ulib/prefixes](ulib_prefixes) +* [ulib/PREFIXES-DEFAULTS](ulib_PREFIXES-DEFAULTS) +* [ulib/pretty](ulib_pretty) +* [ulib/ptools](ulib_ptools) +* [ulib/redhat](ulib_redhat) +* [ulib/runs](ulib_runs) +* [ulib/runsmod](ulib_runsmod) +* [ulib/runsmod.defaults](ulib_runsmod.defaults) +* [ulib/semver](ulib_semver) +* [ulib/service](ulib_service) +* [ulib/sysinfos](ulib_sysinfos) +* [ulib/template](ulib_template) +* [ulib/tiddlywiki](ulib_tiddlywiki) +* [ulib/udir](ulib_udir) +* [ulib/uenv](ulib_uenv) +* [ulib/uenv_update](ulib_uenv_update) +* [ulib/uinc](ulib_uinc) +* [ulib/uinst](ulib_uinst) +* [ulib/ulib](ulib_ulib) +* [ulib/ulibsh](ulib_ulibsh) +* [ulib/vcs](ulib_vcs) +* [ulib/virsh](ulib_virsh) +* [ulib/webobjects](ulib_webobjects) +* [ulib/woinst](ulib_woinst) +* [ulib/wondermonitor](ulib_wondermonitor) +* [ulib/wosign](ulib_wosign) +* [ulib/wotaskd](ulib_wotaskd) + +-*- 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.twp b/doc/ulib.twp index 498060d..014e28a 100644 --- a/doc/ulib.twp +++ b/doc/ulib.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 02/06/2012 09:54 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -8,8 +8,25 @@ !Liste des librairies de ulib * [[ulib/apache]] +* [[ulib/apache.tools]] +* [[ulib/auto]] +* [[ulib/awk]] * [[ulib/base]] +* [[ulib/base.args]] +* [[ulib/base.array]] +* [[ulib/base.bool]] +* [[ulib/base.compat]] +* [[ulib/base.core]] +* [[ulib/base.init]] +* [[ulib/base.num]] +* [[ulib/base.quote]] +* [[ulib/base.split]] +* [[ulib/base.string]] +* [[ulib/base.tools]] +* [[ulib/base.ulib]] * [[ulib/bash]] +* [[ulib/cgi]] +* [[ulib/cgisupport]] * [[ulib/compat]] * [[ulib/conf]] * [[ulib/crontab]] @@ -19,6 +36,7 @@ * [[ulib/ipcalc]] * [[ulib/java]] * [[ulib/javaproperties]] +* [[ulib/json]] * [[ulib/ldap]] * [[ulib/ldif]] * [[ulib/legacy]] @@ -26,12 +44,19 @@ * [[ulib/mkcrypt]] * [[ulib/modeline]] * [[ulib/network-manager-service]] -* [[ulib/pkg]] +* [[ulib/password]] * [[ulib/prefixes]] +* [[ulib/PREFIXES-DEFAULTS]] * [[ulib/pretty]] +* [[ulib/ptools]] +* [[ulib/redhat]] * [[ulib/runs]] +* [[ulib/runsmod]] +* [[ulib/runsmod.defaults]] +* [[ulib/semver]] * [[ulib/service]] * [[ulib/sysinfos]] +* [[ulib/template]] * [[ulib/tiddlywiki]] * [[ulib/udir]] * [[ulib/uenv]] diff --git a/doc/ulib_DEFAULTS.md b/doc/ulib_DEFAULTS.md new file mode 100644 index 0000000..a33111c --- /dev/null +++ b/doc/ulib_DEFAULTS.md @@ -0,0 +1,4 @@ +# ulib/DEFAULTS + + +-*- 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_PREFIXES-DEFAULTS.md b/doc/ulib_PREFIXES-DEFAULTS.md new file mode 100644 index 0000000..8806896 --- /dev/null +++ b/doc/ulib_PREFIXES-DEFAULTS.md @@ -0,0 +1,6 @@ +# ulib/PREFIXES-DEFAULTS + +## `compute_all_prefixes` +## `recompute_all_prefixes` + +-*- 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_PREFIXES-DEFAULTS.twp b/doc/ulib_PREFIXES-DEFAULTS.twp new file mode 100644 index 0000000..4450490 --- /dev/null +++ b/doc/ulib_PREFIXES-DEFAULTS.twp @@ -0,0 +1,10 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: ulib/PREFIXES-DEFAULTS + +!! {{{compute_all_prefixes}}} +!! {{{recompute_all_prefixes}}} diff --git a/doc/ulib_apache.md b/doc/ulib_apache.md new file mode 100644 index 0000000..e660ba3 --- /dev/null +++ b/doc/ulib_apache.md @@ -0,0 +1,30 @@ +# ulib/apache + +## `get_default_apachebin_prefix` +## `get_default_apacheversion_prefix` +## `get_default_apachectl_prefix` +## `get_default_apachelogdir_prefix` +## `get_default_apachesslcertsdir_prefix` +## `get_default_apachesslkeysdir_prefix` +## `get_default_apacheconfdir_prefix` +## `get_default_apacheconf_prefix` +## `get_default_apacheavsitesdir_prefix` +## `get_default_apachesitesdir_prefix` +## `get_default_htdocsdir_prefix` +## `get_default_cgibindir_prefix` +## `compute_apache_prefixes` +## `recompute_apache_prefixes` +## `get_APACHEBIN_prefix` +## `get_APACHEVERSION_prefix` +## `get_APACHECTL_prefix` +## `get_APACHELOGDIR_prefix` +## `get_APACHESSLCERTSDIR_prefix` +## `get_APACHESSLKEYSDIR_prefix` +## `get_APACHECONFDIR_prefix` +## `get_APACHECONF_prefix` +## `get_APACHEAVSITESDIR_prefix` +## `get_APACHESITESDIR_prefix` +## `get_HTDOCSDIR_prefix` +## `get_CGIBINDIR_prefix` + +-*- 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_apache.tools.md b/doc/ulib_apache.tools.md new file mode 100644 index 0000000..7040a06 --- /dev/null +++ b/doc/ulib_apache.tools.md @@ -0,0 +1,13 @@ +# ulib/apache.tools + +## `apache_resolvecert` +~~~ +Calculer l'emplacement des certificats correspondant aux arguments $1 et +$2 (qui correspondent aux options --conf et --dir de apache_addcert()), +puis initialiser les variables $3(=cert), $4(=key) et $5(=ca) +~~~ +## `apache_addcert` +## `apache_autoconf` +## `apache_autoconf_localhosts` + +-*- 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_apache.tools.twp b/doc/ulib_apache.tools.twp new file mode 100644 index 0000000..e5ed841 --- /dev/null +++ b/doc/ulib_apache.tools.twp @@ -0,0 +1,17 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: ulib/apache.tools + +!! {{{apache_resolvecert}}} +{{{ +Calculer l'emplacement des certificats correspondant aux arguments $1 et +$2 (qui correspondent aux options --conf et --dir de apache_addcert()), +puis initialiser les variables $3(=cert), $4(=key) et $5(=ca) +}}} +!! {{{apache_addcert}}} +!! {{{apache_autoconf}}} +!! {{{apache_autoconf_localhosts}}} diff --git a/doc/ulib_apache.twp b/doc/ulib_apache.twp index 059e25f..5d7e122 100644 --- a/doc/ulib_apache.twp +++ b/doc/ulib_apache.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:15 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -32,10 +32,3 @@ !! {{{get_APACHESITESDIR_prefix}}} !! {{{get_HTDOCSDIR_prefix}}} !! {{{get_CGIBINDIR_prefix}}} -!! {{{apache_resolvecert}}} -{{{ -Calculer l'emplacement des certificats correspondant aux arguments $1 et -$2 (qui correspondent aux options --conf et --dir de apache_addcert()), -puis initialiser les variables $3(=cert), $4(=key) et $5(=ca) -}}} -!! {{{apache_addcert}}} diff --git a/doc/ulib_auto.md b/doc/ulib_auto.md new file mode 100644 index 0000000..78ee145 --- /dev/null +++ b/doc/ulib_auto.md @@ -0,0 +1,4 @@ +# ulib/auto + + +-*- 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_auto.twp b/doc/ulib_auto.twp new file mode 100644 index 0000000..c83c9d5 --- /dev/null +++ b/doc/ulib_auto.twp @@ -0,0 +1,8 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: ulib/auto + diff --git a/doc/ulib_awk.md b/doc/ulib_awk.md new file mode 100644 index 0000000..39eba35 --- /dev/null +++ b/doc/ulib_awk.md @@ -0,0 +1,43 @@ +# ulib/awk + +## `parseheaders` +## `printheaders` +## `resetheaders` +## `copyall` +## `lawkcsv` +## `cawkcsv` +## `awkcsv` +## `lgrepcsv` +## `cgrepcsv` +## `grepcsv` +## `lawkfsv2csv` +## `cawkfsv2csv` +## `awkfsv2csv` +## `lmergecsv` +~~~ +Fusionner sur la sortie standard les deux fichiers csv $1 et $2. La clé du +fichier $1 est spécifiée par l'option --lkey et vaut 1 par défaut. La clé +du fichier $2 est spécifiée par l'option --rkey et vaut 1 par défaut. Les +valeurs des clés ne doivent pas faire plus de 64 caractères de long. +~~~ +## `readleft` +## `readright` +## `right2left` +## `cmergecsv` +## `mergecsv` +## `lsortcsv` +~~~ +Trier le fichier csv $1. La clé du tri est spécifiée par l'option -k et +vaut 1 par défaut. Les valeurs des clés ne doivent pas faire plus de 64 +caractères de long. +~~~ +## `csortcsv` +## `sortcsv` +## `ldumpcsv` +## `cdumpcsv` +## `dumpcsv` +## `lprintcsv` +## `cprintcsv` +## `printcsv` + +-*- 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_awk.twp b/doc/ulib_awk.twp new file mode 100644 index 0000000..9c144a0 --- /dev/null +++ b/doc/ulib_awk.twp @@ -0,0 +1,47 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: ulib/awk + +!! {{{parseheaders}}} +!! {{{printheaders}}} +!! {{{resetheaders}}} +!! {{{copyall}}} +!! {{{lawkcsv}}} +!! {{{cawkcsv}}} +!! {{{awkcsv}}} +!! {{{lgrepcsv}}} +!! {{{cgrepcsv}}} +!! {{{grepcsv}}} +!! {{{lawkfsv2csv}}} +!! {{{cawkfsv2csv}}} +!! {{{awkfsv2csv}}} +!! {{{lmergecsv}}} +{{{ +Fusionner sur la sortie standard les deux fichiers csv $1 et $2. La clé du +fichier $1 est spécifiée par l'option --lkey et vaut 1 par défaut. La clé +du fichier $2 est spécifiée par l'option --rkey et vaut 1 par défaut. Les +valeurs des clés ne doivent pas faire plus de 64 caractères de long. +}}} +!! {{{readleft}}} +!! {{{readright}}} +!! {{{right2left}}} +!! {{{cmergecsv}}} +!! {{{mergecsv}}} +!! {{{lsortcsv}}} +{{{ +Trier le fichier csv $1. La clé du tri est spécifiée par l'option -k et +vaut 1 par défaut. Les valeurs des clés ne doivent pas faire plus de 64 +caractères de long. +}}} +!! {{{csortcsv}}} +!! {{{sortcsv}}} +!! {{{ldumpcsv}}} +!! {{{cdumpcsv}}} +!! {{{dumpcsv}}} +!! {{{lprintcsv}}} +!! {{{cprintcsv}}} +!! {{{printcsv}}} diff --git a/doc/ulib_base.args.md b/doc/ulib_base.args.md new file mode 100644 index 0000000..dc84f89 --- /dev/null +++ b/doc/ulib_base.args.md @@ -0,0 +1,60 @@ +# ulib/base.args + +## `parse_opts` +~~~ +Analyser des arguments. Cette fonction doit être appelée avec une description +des options à analyser, suivie des arguments proprement dits. En fonction des +options rencontrées, certaines variables sont mises à jour. +Les arguments de cette fonction sont donc de la forme 'optdescs -- args' +~~~ +## `parse_args_check` +~~~ +Simplifier l'utilisation de parse_opts(). En entrée, le tableau args doit être +initialisé avec la liste des options. En sortie, ce tableau contient la liste +des arguments restant sur la ligne de commande. En cas d'erreur, retourner 1. +Exemple d'utilisation: +args=(...) +parse_args_check "$@" || return; set -- "${args[@]}" +~~~ +## `parse_args` +~~~ +Simplifier l'utilisation de parse_opts(). En entrée, le tableau args doit être +initialisé avec la liste des options. En sortie, ce tableau contient la liste +des arguments restant sur la ligne de commande. En cas d'erreur, quitter le +script avec die() +Exemple d'utilisation: +args=(...) +parse_args_check "$@"; set -- "${args[@]}" +~~~ +## `genparse` +~~~ +Afficher une ligne de commande à évaluer pour simplifier l'utilisation de +parse_opts(). Une fonction display_help() par défaut est définie et les +options appropriées de parse_opts sont utilisées pour reconnaître les options +spécifiées par les arguments. +Cette fonction peut être utilisée de cette manière: +HELP_DESC=... +HELP_ARG_DESC=... # pour chaque arg +eval "$(genparse [args...])" +D'autres variables peuvent être définies: HELP_USAGE, HELP_OPTIONS, +HELP_ARG_OPTION. Consulter le source pour connaitre leur utilisation +Les arguments de cette fonction sont de la forme 'sansarg' pour une option +simple qui ne prend pas d'argument ou 'avecarg=[default-value]' pour une +option qui prend un argument. Les options générées sont des options +longues. En l'occurence, les options générées sont respectivement '--sansarg' +et '--avecarg:' +Les variables et les options sont toujours en minuscule. Pour les variables, +le caractère '-' est remplacé par '_'. Si une option contient une lettre en +majuscule, l'option courte correspondante à cette lettre sera aussi reconnue. +Par exemple, la commande suivante: +genparse Force enCoding=utf-8 input= long-Option= +affichera ceci: +function display_help() { +[ -n "$HELP_USAGE" ] || HELP_USAGE="USAGE +$scriptname [options]" +[ -n "$HELP_OPTIONS" ] || HELP_OPTIONS="OPTIONS +${HELP_FORCE_OPTION:- -f, --force${HELP_FORCE_DESC:+ +$HELP_FORCE_DESC}} +~~~ + +-*- 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.args.twp b/doc/ulib_base.args.twp new file mode 100644 index 0000000..10a399a --- /dev/null +++ b/doc/ulib_base.args.twp @@ -0,0 +1,64 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: ulib/base.args + +!! {{{parse_opts}}} +{{{ +Analyser des arguments. Cette fonction doit être appelée avec une description +des options à analyser, suivie des arguments proprement dits. En fonction des +options rencontrées, certaines variables sont mises à jour. +Les arguments de cette fonction sont donc de la forme 'optdescs -- args' +}}} +!! {{{parse_args_check}}} +{{{ +Simplifier l'utilisation de parse_opts(). En entrée, le tableau args doit être +initialisé avec la liste des options. En sortie, ce tableau contient la liste +des arguments restant sur la ligne de commande. En cas d'erreur, retourner 1. +Exemple d'utilisation: +args=(...) +parse_args_check "$@" || return; set -- "${args[@]}" +}}} +!! {{{parse_args}}} +{{{ +Simplifier l'utilisation de parse_opts(). En entrée, le tableau args doit être +initialisé avec la liste des options. En sortie, ce tableau contient la liste +des arguments restant sur la ligne de commande. En cas d'erreur, quitter le +script avec die() +Exemple d'utilisation: +args=(...) +parse_args_check "$@"; set -- "${args[@]}" +}}} +!! {{{genparse}}} +{{{ +Afficher une ligne de commande à évaluer pour simplifier l'utilisation de +parse_opts(). Une fonction display_help() par défaut est définie et les +options appropriées de parse_opts sont utilisées pour reconnaître les options +spécifiées par les arguments. +Cette fonction peut être utilisée de cette manière: +HELP_DESC=... +HELP_ARG_DESC=... # pour chaque arg +eval "$(genparse [args...])" +D'autres variables peuvent être définies: HELP_USAGE, HELP_OPTIONS, +HELP_ARG_OPTION. Consulter le source pour connaitre leur utilisation +Les arguments de cette fonction sont de la forme 'sansarg' pour une option +simple qui ne prend pas d'argument ou 'avecarg=[default-value]' pour une +option qui prend un argument. Les options générées sont des options +longues. En l'occurence, les options générées sont respectivement '--sansarg' +et '--avecarg:' +Les variables et les options sont toujours en minuscule. Pour les variables, +le caractère '-' est remplacé par '_'. Si une option contient une lettre en +majuscule, l'option courte correspondante à cette lettre sera aussi reconnue. +Par exemple, la commande suivante: +genparse Force enCoding=utf-8 input= long-Option= +affichera ceci: +function display_help() { +[ -n "$HELP_USAGE" ] || HELP_USAGE="USAGE +$scriptname [options]" +[ -n "$HELP_OPTIONS" ] || HELP_OPTIONS="OPTIONS +${HELP_FORCE_OPTION:- -f, --force${HELP_FORCE_DESC:+ +$HELP_FORCE_DESC}} +}}} diff --git a/doc/ulib_base.array.md b/doc/ulib_base.array.md new file mode 100644 index 0000000..b0098d0 --- /dev/null +++ b/doc/ulib_base.array.md @@ -0,0 +1,4 @@ +# ulib/base.array + + +-*- 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.array.twp b/doc/ulib_base.array.twp new file mode 100644 index 0000000..aa8e645 --- /dev/null +++ b/doc/ulib_base.array.twp @@ -0,0 +1,8 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: ulib/base.array + diff --git a/doc/ulib_base.bool.md b/doc/ulib_base.bool.md new file mode 100644 index 0000000..73ccb19 --- /dev/null +++ b/doc/ulib_base.bool.md @@ -0,0 +1,34 @@ +# ulib/base.bool + +## `is_yes` +~~~ +retourner vrai si $1 est une valeur "oui" +~~~ +## `is_no` +~~~ +retourner vrai si $1 est une valeur "non" +~~~ +## `yesval` +~~~ +normaliser une valeur vraie: si $1 est une valeur "oui", afficher 1, sinon +afficher une chaine vide +~~~ +## `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 +valeur "" +note: en principe, la syntaxe est 'setb var cmd args...'. cependant, la +syntaxe 'setb var=cmd args...' est supportée aussi +~~~ +## `evalb` +~~~ +Lancer la commande $@ avec evalx() en supprimant la sortie standard. Si la +commande retourne vrai, afficher 1. Sinon, afficher "" +~~~ +## `setxb` +~~~ +équivalent à setx $1 evalb $2..@ +~~~ + +-*- 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.bool.twp b/doc/ulib_base.bool.twp new file mode 100644 index 0000000..4cbfbee --- /dev/null +++ b/doc/ulib_base.bool.twp @@ -0,0 +1,38 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: ulib/base.bool + +!! {{{is_yes}}} +{{{ +retourner vrai si $1 est une valeur "oui" +}}} +!! {{{is_no}}} +{{{ +retourner vrai si $1 est une valeur "non" +}}} +!! {{{yesval}}} +{{{ +normaliser une valeur vraie: si $1 est une valeur "oui", afficher 1, sinon +afficher une chaine vide +}}} +!! {{{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 +valeur "" +note: en principe, la syntaxe est 'setb var cmd args...'. cependant, la +syntaxe 'setb var=cmd args...' est supportée aussi +}}} +!! {{{evalb}}} +{{{ +Lancer la commande $@ avec evalx() en supprimant la sortie standard. Si la +commande retourne vrai, afficher 1. Sinon, afficher "" +}}} +!! {{{setxb}}} +{{{ +équivalent à setx $1 evalb $2..@ +}}} diff --git a/doc/ulib_base.compat.md b/doc/ulib_base.compat.md new file mode 100644 index 0000000..65901ec --- /dev/null +++ b/doc/ulib_base.compat.md @@ -0,0 +1,18 @@ +# ulib/base.compat + +## `setx2` +## `rawecho` +## `rawecho_` +## `quote_arg` +## `quoted_arg` +## `quoted_args` +## `set_var` +## `set_var_cmd` +## `set_var_literal` +## `quote_awk` +## `quoted_awk` +## `quote_seds` +## `quote_form` +## `quoted_form` + +-*- 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.compat.twp b/doc/ulib_base.compat.twp new file mode 100644 index 0000000..cae5079 --- /dev/null +++ b/doc/ulib_base.compat.twp @@ -0,0 +1,22 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: ulib/base.compat + +!! {{{setx2}}} +!! {{{rawecho}}} +!! {{{rawecho_}}} +!! {{{quote_arg}}} +!! {{{quoted_arg}}} +!! {{{quoted_args}}} +!! {{{set_var}}} +!! {{{set_var_cmd}}} +!! {{{set_var_literal}}} +!! {{{quote_awk}}} +!! {{{quoted_awk}}} +!! {{{quote_seds}}} +!! {{{quote_form}}} +!! {{{quoted_form}}} diff --git a/doc/ulib_base.core.md b/doc/ulib_base.core.md new file mode 100644 index 0000000..4e56d34 --- /dev/null +++ b/doc/ulib_base.core.md @@ -0,0 +1,146 @@ +# ulib/base.core + +## `echo_` +~~~ +afficher la valeur $* sans passer à la ligne +~~~ +## `recho` +~~~ +afficher une valeur brute. contrairement à la commande echo, ne reconnaitre +aucune option (i.e. -e, -E, -n ne sont pas signifiants) +~~~ +## `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) +~~~ +## `should_quote` +~~~ +Tester si la chaine $* doit être mise entre quotes +~~~ +## `qval` +~~~ +Afficher la chaine $* quotée avec " +~~~ +## `qvalm` +~~~ +Afficher la chaine $* quotée si nécessaire avec " +~~~ +## `qvalr` +~~~ +Afficher la chaine $* quotée si nécessaire avec ", sauf si elle est vide +~~~ +## `qvals` +~~~ +Afficher chaque argument de cette fonction quotée le cas échéant avec " +Chaque valeur est séparée par un espace. +~~~ +## `qwc` +~~~ +Dans la chaine $*, remplacer \ par \\, " par \", $ par \$, ` par \`, puis +quoter la chaine avec ", sauf les wildcards * et ? +Cela permet de quoter une chaine permettant de glober des fichiers, e.g +eval "ls $(qwc "$value")" +Note: la protection de ! n'est pas effectuée, parce que le comportement du +shell est incohérent entre le shell interactif et les scripts. Pour une +version plus robuste, il est nécessaire d'utiliser un programme externe tel +que sed ou awk +~~~ +## `qlines` +~~~ +Traiter chaque ligne de l'entrée standard pour en faire des chaines quotées +avec ' +~~~ +## `setv` +~~~ +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 +~~~ +## `echo_setv` +~~~ +Afficher la commande qui serait lancée par setv "$@" +~~~ +## `setx` +~~~ +syntaxe 1: setx var cmd +initialiser la variable $1 avec le résultat de la commande "$2..@" +note: en principe, la syntaxe est 'setx var cmd args...'. cependant, la +syntaxe 'setx var=cmd args...' est supportée aussi +syntaxe 2: setx -a array cmd +initialiser le tableau $1 avec le résultat de la commande "$2..@", chaque +ligne du résultat étant un élément du tableau +note: en principe, la syntaxe est 'setx -a array cmd args...'. cependant, la +syntaxe 'setx -a array=cmd args...' est supportée aussi +~~~ +## `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)))" +Retourner le dernier code d'erreur non nul, ou 0 si toutes les commandes se +sont exécutées sans erreur. +~~~ +## `setxx` +~~~ +équivalent à setx $1 evalx $2..@ +~~~ +## `evalp` +~~~ +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 +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 +de bash. +~~~ +## `setxp` +~~~ +équivalent à setx $1 evalp $2..@ +~~~ +## `testx` +~~~ +Faire un test unaire avec la commande [ sur une valeur calculée avec evalx. +Utiliser la syntaxe 'testx op cmds...' e.g. +testx -z cmd1 // cmd2 +~~~ +## `test2x` +~~~ +Faire une test binaire avec la commande [ entre une valeur spécifiée et une +valeur calculée avec evalx. Utiliser la syntaxe 'test2x value op cmds...' e.g. +test2x value == cmd1 // cmd2 +~~~ +## `testrx` +~~~ +Faire une test binaire avec la commande [[ entre une valeur spécifiée et une +valeur calculée avec evalx. Utiliser la syntaxe 'testrx value op cmds...' e.g. +testrx value == cmd1 // cmd2 +~~~ +## `testp` +~~~ +Faire un test unaire avec la commande [ sur une valeur calculée avec evalp. +Utiliser la syntaxe 'testp op cmds...' e.g. +testp -z cmd1 // cmd2 +~~~ +## `test2p` +~~~ +Faire une test binaire avec la commande [ entre une valeur spécifiée et une +valeur calculée avec evalp. Utiliser la syntaxe 'test2p value op cmds...' e.g. +test2p value == cmd1 // cmd2 +~~~ +## `testrp` +~~~ +Faire une test binaire avec la commande [[ entre une valeur spécifiée et une +valeur calculée avec evalp. Utiliser la syntaxe 'testrp value op cmds...' e.g. +testrp value == cmd1 // cmd2 +~~~ +## `err2out` +~~~ +lancer la commande $@ en redirigeant la sortie d'erreur sur la sortie standard +~~~ + +-*- 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.twp b/doc/ulib_base.core.twp new file mode 100644 index 0000000..36d82cb --- /dev/null +++ b/doc/ulib_base.core.twp @@ -0,0 +1,150 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: ulib/base.core + +!! {{{echo_}}} +{{{ +afficher la valeur $* sans passer à la ligne +}}} +!! {{{recho}}} +{{{ +afficher une valeur brute. contrairement à la commande echo, ne reconnaitre +aucune option (i.e. -e, -E, -n ne sont pas signifiants) +}}} +!! {{{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) +}}} +!! {{{should_quote}}} +{{{ +Tester si la chaine $* doit être mise entre quotes +}}} +!! {{{qval}}} +{{{ +Afficher la chaine $* quotée avec " +}}} +!! {{{qvalm}}} +{{{ +Afficher la chaine $* quotée si nécessaire avec " +}}} +!! {{{qvalr}}} +{{{ +Afficher la chaine $* quotée si nécessaire avec ", sauf si elle est vide +}}} +!! {{{qvals}}} +{{{ +Afficher chaque argument de cette fonction quotée le cas échéant avec " +Chaque valeur est séparée par un espace. +}}} +!! {{{qwc}}} +{{{ +Dans la chaine $*, remplacer \ par \\, " par \", $ par \$, ` par \`, puis +quoter la chaine avec ", sauf les wildcards * et ? +Cela permet de quoter une chaine permettant de glober des fichiers, e.g +eval "ls $(qwc "$value")" +Note: la protection de ! n'est pas effectuée, parce que le comportement du +shell est incohérent entre le shell interactif et les scripts. Pour une +version plus robuste, il est nécessaire d'utiliser un programme externe tel +que sed ou awk +}}} +!! {{{qlines}}} +{{{ +Traiter chaque ligne de l'entrée standard pour en faire des chaines quotées +avec ' +}}} +!! {{{setv}}} +{{{ +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 +}}} +!! {{{echo_setv}}} +{{{ +Afficher la commande qui serait lancée par setv "$@" +}}} +!! {{{setx}}} +{{{ +syntaxe 1: setx var cmd +initialiser la variable $1 avec le résultat de la commande "$2..@" +note: en principe, la syntaxe est 'setx var cmd args...'. cependant, la +syntaxe 'setx var=cmd args...' est supportée aussi +syntaxe 2: setx -a array cmd +initialiser le tableau $1 avec le résultat de la commande "$2..@", chaque +ligne du résultat étant un élément du tableau +note: en principe, la syntaxe est 'setx -a array cmd args...'. cependant, la +syntaxe 'setx -a array=cmd args...' est supportée aussi +}}} +!! {{{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)))" +Retourner le dernier code d'erreur non nul, ou 0 si toutes les commandes se +sont exécutées sans erreur. +}}} +!! {{{setxx}}} +{{{ +équivalent à setx $1 evalx $2..@ +}}} +!! {{{evalp}}} +{{{ +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 +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 +de bash. +}}} +!! {{{setxp}}} +{{{ +équivalent à setx $1 evalp $2..@ +}}} +!! {{{testx}}} +{{{ +Faire un test unaire avec la commande [ sur une valeur calculée avec evalx. +Utiliser la syntaxe 'testx op cmds...' e.g. +testx -z cmd1 // cmd2 +}}} +!! {{{test2x}}} +{{{ +Faire une test binaire avec la commande [ entre une valeur spécifiée et une +valeur calculée avec evalx. Utiliser la syntaxe 'test2x value op cmds...' e.g. +test2x value == cmd1 // cmd2 +}}} +!! {{{testrx}}} +{{{ +Faire une test binaire avec la commande [[ entre une valeur spécifiée et une +valeur calculée avec evalx. Utiliser la syntaxe 'testrx value op cmds...' e.g. +testrx value == cmd1 // cmd2 +}}} +!! {{{testp}}} +{{{ +Faire un test unaire avec la commande [ sur une valeur calculée avec evalp. +Utiliser la syntaxe 'testp op cmds...' e.g. +testp -z cmd1 // cmd2 +}}} +!! {{{test2p}}} +{{{ +Faire une test binaire avec la commande [ entre une valeur spécifiée et une +valeur calculée avec evalp. Utiliser la syntaxe 'test2p value op cmds...' e.g. +test2p value == cmd1 // cmd2 +}}} +!! {{{testrp}}} +{{{ +Faire une test binaire avec la commande [[ entre une valeur spécifiée et une +valeur calculée avec evalp. Utiliser la syntaxe 'testrp value op cmds...' e.g. +testrp value == cmd1 // cmd2 +}}} +!! {{{err2out}}} +{{{ +lancer la commande $@ en redirigeant la sortie d'erreur sur la sortie standard +}}} diff --git a/doc/ulib_base.init.md b/doc/ulib_base.init.md new file mode 100644 index 0000000..78998a5 --- /dev/null +++ b/doc/ulib_base.init.md @@ -0,0 +1,4 @@ +# ulib/base.init + + +-*- 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.init.twp b/doc/ulib_base.init.twp new file mode 100644 index 0000000..6c03356 --- /dev/null +++ b/doc/ulib_base.init.twp @@ -0,0 +1,8 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: ulib/base.init + diff --git a/doc/ulib_base.md b/doc/ulib_base.md new file mode 100644 index 0000000..cf27957 --- /dev/null +++ b/doc/ulib_base.md @@ -0,0 +1,1272 @@ +# ulib/base + +## `setyesval` +~~~ +mettre la valeur normalisée de la valeur "oui" de $2 dans la variable $1 +~~~ +## `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 +~~~ +## `normyesvals` +~~~ +remplacer les valeur des variables $1..* par les valeurs normalisées +respectives de leur valeur "oui" +~~~ +## `quote_in` +~~~ +Comme quote_arg pour une chaine lue sur stdin +~~~ +## `quote_sin` +~~~ +Pour la chaine lue sur stdin, remplacer ' par '\''. Cela permet de protéger une +chaine à mettre entre quotes +~~~ +## `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é +~~~ +## `quoted_sarg` +~~~ +Dans la chaine $1, remplacer ' par '\'', et afficher la chaine entourée de +quotes +~~~ +## `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 +~~~ +## `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 +~~~ +## `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 +~~~ +## `array_count` +~~~ +retourner le nombre d'éléments du tableau $1 +~~~ +## `array_isempty` +~~~ +tester si le tableau $1 est vide +~~~ +## `array_new` +~~~ +créer un tableau vide dont le nom est $1 +~~~ +## `array_add` +~~~ +ajouter les valeurs $2..@ au tableau dont le nom est $1 +~~~ +## `array_ins` +~~~ +insérer les valeurs $2..@ au début du tableau dont le nom est $1 +~~~ +## `array_del` +~~~ +supprimer *les* valeurs $2 du tableau dont le nom est $1 +~~~ +## `array_addu` +~~~ +ajouter la valeur $2 au tableau dont le nom est $1, si la valeur n'y est pas +déjà. Retourner vrai si la valeur a été ajoutée +~~~ +## `array_set` +## `array_insu` +~~~ +insérer la valeur $2 au début du tableau tableau dont le nom est $1, si la +valeur n'y est pas déjà. Retourner vrai si la valeur a été ajoutée. +~~~ +## `array_fillrange` +~~~ +Initialiser le tableau $1 avec les nombres de $2(=1) à $3(=10) avec un step de $4(=1) +~~~ +## `array_eq` +~~~ +tester l'égalité des tableaux $1 et $2 +~~~ +## `array_contains` +~~~ +tester si le tableau dont le nom est $1 contient la valeur $2 +~~~ +## `array_icontains` +~~~ +tester si le tableau dont le nom est $1 contient la valeur $2, sans tenir +compte de la casse +~~~ +## `array_find` +~~~ +si le tableau $1 contient la valeur $2, retourner l'index de la valeur. Si le +tableau $3 est spécifié, retourner la valeur à l'index dans ce tableau +~~~ +## `array_reverse` +~~~ +Inverser l'ordre des élément du tableau $1 +~~~ +## `array_replace` +~~~ +dans le tableau $1, remplacer toutes les occurences de $2 par $3..* +~~~ +## `array_each` +~~~ +Pour chacune des valeurs 'v' du tableau $1, appeler la fonction $2 avec les +arguments '$v $3..$n' +~~~ +## `array_map` +~~~ +Pour chacune des valeurs 'v' du tableau $1, appeler la fonction $2 avec les +arguments '$v $3..$n', et remplacer la valeur par le résultat de la fonction +~~~ +## `first_value` +~~~ +retourner la première valeur du tableau $1 +~~~ +## `last_value` +~~~ +retourner la dernière valeur du tableau $1 +~~~ +## `array_copy` +~~~ +copier le contenu du tableau $2 dans le tableau $1 +~~~ +## `array_copy_firsts` +~~~ +copier tous les valeurs du tableau $2(=$1) dans le tableau $1, excepté la dernière +~~~ +## `array_del_last` +## `array_copy_lasts` +~~~ +copier tous les valeurs du tableau $2(=$1) dans le tableau $1, excepté la première +~~~ +## `array_del_first` +## `array_extend` +~~~ +ajouter le contenu du tableau $2 au tableau $1 +~~~ +## `array_extendu` +~~~ +ajouter chacune des valeurs du tableau $2 au tableau $1, si ces valeurs n'y +sont pas déjà. Retourner vrai si au moins une valeur a été ajoutée +~~~ +## `array_extend_firsts` +~~~ +ajouter toutes les valeurs du tableau $2 dans le tableau $1, excepté la dernière +~~~ +## `array_extend_lasts` +~~~ +ajouter toutes les valeurs du tableau $2 dans le tableau $1, excepté la première +~~~ +## `array_xsplit` +~~~ +créer le tableau $1 avec chaque élément de $2 (un ensemble d'éléments séparés +par $3, qui vaut ':' par défaut). +~~~ +## `array_split` +~~~ +créer le tableau $1 avec chaque élément de $2 (un ensemble d'éléments séparés +par $3, qui vaut ':' par défaut). Les éléments vides sont ignorés. par exemple +"a::b" est équivalent à "a:b" +~~~ +## `array_from_path` +## `array_from_xlines` +~~~ +créer le tableau $1 avec chaque ligne de $2. +~~~ +## `array_from_lines` +~~~ +créer le tableau $1 avec chaque ligne de $2. Les lignes vides sont ignorés. +~~~ +## `array_join` +~~~ +afficher le contenu du tableau dont le nom est $1 sous forme d'une liste de +valeurs séparées par $2 (par défaut, une virgule) +Si $1=="@", alors les éléments du tableaux sont les arguments de la fonction à +partir de $3 +Si $1!="@" et que le tableau est vide, afficher $3 +Si $1!="@", $4 et $5 sont des préfixes et suffixes à rajouter à chaque élément +~~~ +## `array_mapjoin` +~~~ +map le tableau $1 avec la fonction $2, puis afficher le résultat en séparant +chaque élément par $3. Les arguments et la sémantique sont les mêmes que pour +array_join en tenant compte de l'argument supplémentaire $2 qui est la +fonction pour array_map (les autres arguments sont décalés en conséquence) +~~~ +## `array_to_lines` +~~~ +afficher le tableau dont le nom est $1 sous forme de lignes +~~~ +## `array_to_path` +~~~ +afficher le tableau dont le nom est $1 sous forme d'une liste de chemins +séparés par ':') +~~~ +## `array_fix_paths` +~~~ +Corriger les valeurs du tableau $1. Les valeurs contenant le séparateur +$2(=':') sont séparées en plusieurs valeurs. Par exemple avec le tableau +input=(a b:c), le résultat est input=(a b c) +~~~ +## `get_date_rfc822` +## `get_date_fr` +## `get_time_fr` +## `parse_date` +## `udelpath` +~~~ +supprimer le chemin $1 de $2(=PATH) +~~~ +## `uaddpath` +~~~ +Ajouter le chemin $1 à la fin, dans $2(=PATH), s'il n'y existe pas déjà +~~~ +## `uinspathm` +~~~ +Ajouter le chemin $1 au début, dans $2(=PATH), s'il n'y existe pas déjà +~~~ +## `uinspath` +~~~ +S'assurer que le chemin $1 soit au début de $2(=PATH) +~~~ +## `withpath` +~~~ +tester si le chemin est relatif à . ou à .., ou est absolu. i.e 'withpath a/b' +renvoie faux alors que 'withpath ./a/b' renvoie vrai +~~~ +## `withext` +~~~ +tester si le fichier a une extension +~~~ +## `normpath` +~~~ +normaliser le chemin $1, qui est soit absolu, soit relatif à $2 (qui vaut +$(pwd) par défaut) +~~~ +## `abspath` +~~~ +Retourner un chemin absolu vers $1. Si $2 est non nul et si $1 est un chemin +relatif, alors $1 est exprimé par rapport à $2, sinon il est exprimé par +rapport au répertoire courant. +Si le chemin n'existe pas, il n'est PAS normalisé. Sinon, les meilleurs +efforts sont faits pour normaliser le chemin. +~~~ +## `parentdirs` +~~~ +Obtenir la liste de tous les parents du répertoire $2 dans le tableau $1, du +répertoire $2 vers la racine. Si $3 commence par 'r' (comme reverse), l'ordre +est inversé: le tableau contient les répertoire de la racine vers $2. +~~~ +## `ppath` +~~~ +Dans un chemin *absolu*, remplacer "$HOME" par "~" et "$(pwd)/" par "", afin +que le chemin soit plus facile à lire. Le répertoire courant est spécifié par +$2 ou $(pwd) si $2 est vide +~~~ +## `relpath` +~~~ +Afficher le chemin relatif de $1 par rapport à $2. Si $2 n'est pas spécifié, +on prend le répertoire courant. Si $1 ou $2 ne sont pas des chemins absolus, +il sont transformés en chemins absolus par rapport à $3. Si $1==$2, retourner +une chaine vide +~~~ +## `relpathx` +~~~ +Comme relpath, mais pour un chemin vers un exécutable qu'il faut lancer: +s'assurer qu'il y a une spécification de chemin, e.g. ./script +~~~ +## `withinpath` +~~~ +Tester si le chemin absolu $2 se trouve dans le chemin absolu "$1" (appelée +barrière). Soit un chemin P, on considère que P est dans P. Si ce comportement +n'est pas souhaité, $3(=N) doit valoir O, auquel cas P est dans Q implique que +P != Q. +~~~ +## `safe_abspath` +~~~ +Afficher le chemin absolu de $1, par rapport à $2, si et seulement si le +chemin résultat ne se trouve pas en dehors de la barrière $3. Si $2 n'est pas +spécifié, prendre le répertoire courant. S'il est relatif, l'exprimer par +rapport au répertoire courant. Si $3 est relatif, l'exprimer par rapport à $2. +Si le chemin résultat est sité en dehors de la barrière, ne rien afficher et +retourner un code d'erreur. +Si le chemin $1 n'existe pas, il n'est PAS normalisé. Sinon, les meilleurs +efforts sont faits pour normaliser le chemin résultat. +~~~ +## `safe_relpath` +~~~ +Afficher le chemin relatif de $1 par rapport à $2 si et seulement si le chemin +résultat ne se trouve pas en dehors de la barrière $3. Si $2 n'est pas +spécifié, prendre le répertoire courant. S'il est relatif, l'exprimer par +rapport au répertoire courant. Si $3 est relatif, l'exprimer par rapport à $2. +Si le chemin résultat est sité en dehors de la barrière, ne rien afficher et +retourner un code d'erreur. +~~~ +## `splitwcs` +~~~ +Découper un nom de chemin $1 entre la partie sans wildcards, qui est placée dans +la variables $2(=basedir), et la partie avec wildcards, qui est placée dans la +variable $3(=filespec) +~~~ +## `deref` +~~~ +Retourner un chemin absolu vers le fichier $1, dans lequel toutes les +composantes "lien symbolique" ont été supprimées. +DEPRECATED: Cette fonction est dépréciée. Utiliser à la place readlinkm() +~~~ +## `readlinka` +~~~ +Afficher un chemin absolu vers la destination du fichier $1. Si $1 n'est pas +un lien, afficher simplement le chemin du fichier +~~~ +## `readlinkm` +~~~ +Retourner un chemin absolu vers le fichier $1, dans lequel toutes les +composantes "lien symbolique" ont été supprimées. Il n'est pas requis que les +composantes du chemin existent. +~~~ +## `path_if_test` +~~~ +afficher un chemin si le fichier $2 existe (en utilisant l'opérateur $1) dans +l'un des chemins absolus $4..n. si $3==relative, afficher le chemin relatif, +sinon le chemin absolu. note: $3 peut être de la forme relative:path, auquel +cas le chemin affiché est exprimé relativement à path +~~~ +## `update_link` +~~~ +mettre à jour le lien $2 pour qu'il pointe vers le fichier $1 +~~~ +## `update_links` +~~~ +Mettre à jour les liens $2..@ pour qu'ils pointent vers la nouvelle +destination $1 +~~~ +## `move_link` +~~~ +Déplacer le lien $1 vers $2, et mettre à jour la destination du lien si +elle est exprimée de façon relative +Si $1 n'est pas un lien, le déplacer normalement avec mv +~~~ +## `copy_link` +~~~ +Copier le lien $1 vers $2, et mettre à jour la destination du lien si +elle est exprimée de façon relative +Si $1 n'est pas un lien, le copier normalement avec cp +~~~ +## `array_find_links` +~~~ +Chercher dans le répertoire $3 (qui est par défaut le répertoire courant) +les liens vers le fichier $2, et ajouter leurs chemins absolus dans le +tableau $1 +~~~ +## `list_links` +~~~ +Chercher dans le répertoire $2 les liens vers le fichier $1, et les +afficher, un par ligne. +~~~ +## `move_file` +~~~ +Déplacer le fichier $1 vers $2, et mettre à jour les liens $3..@ pour +qu'ils pointent vers la nouvelle destination +~~~ +## `get_nblines` +~~~ +Afficher le nombre de lignes d'un fichier +~~~ +## `mktempf` +~~~ +générer un fichier temporaire et retourner son nom +~~~ +## `mktempd` +~~~ +générer un répertoire temporaire et retourner son nom +~~~ +## `mkdirof` +~~~ +Créer le répertoire correspondant à un fichier +~~~ +## `cp_a` +~~~ +copier des fichiers en gardant le maximum de propriétés +~~~ +## `cp_R` +~~~ +copier des fichiers récursivement, en suivant les liens symboliques +~~~ +## `quietgrep` +~~~ +tester la présence d'un pattern dans un fichier +~~~ +## `quietdiff` +~~~ +tester si deux fichiers sont identiques +~~~ +## `testsame` +~~~ +tester si deux fichiers sont identiques/différents +~~~ +## `testdiff` +## `testupdated` +~~~ +test si $2 n'existe pas ou si $1 est différent de $2 +~~~ +## `testnewer` +~~~ +test si $2 n'existe pas ou si $1 est plus récent que $2 +~~~ +## `ps_all` +~~~ +afficher tous les processus avec le maximum d'informations +~~~ +## `progexists` +~~~ +tester l'existence d'un programme dans le PATH +~~~ +## `has_python` +~~~ +tester la présence de python +~~~ +## `has_gawk` +~~~ +tester la présence de gnuawk +~~~ +## `is_root` +~~~ +tester si on est root +~~~ +## `source_ifexists` +~~~ +sourcer un fichier s'il existe +~~~ +## `is_running` +~~~ +tester si un programme dont on donne le PID tourne +~~~ +## `sedi` +~~~ +Lancer sed sur un fichier en le modifiant en place +~~~ +## `csort` +~~~ +Lancer sort avec LANG=C pour éviter les problèmes avec la locale. en effet, +avec LANG!=C, sort utilise les règles de la locale pour le tri, et par +exemple, avec LANG=fr_FR.UTF-8, la locale indique que les ponctuations doivent +être ignorées. +~~~ +## `lsort` +## `cgrep` +~~~ +Lancer grep avec LANG=C pour éviter les problèmes avec la locale. cf csort +pour une explication. +~~~ +## `lgrep` +## `csed` +~~~ +Lancer sed avec LANG=C pour éviter les problèmes avec la locale. cf csort pour +une explication. +~~~ +## `lsed` +## `cawk` +~~~ +Lancer awk avec LANG=C pour éviter les problèmes avec la locale. cf csort pour +une explication. +~~~ +## `lawk` +## `cdiff` +~~~ +Lancer diff avec LANG=C pour éviter les problèmes avec la locale. cf csort +pour une explication. +~~~ +## `ldiff` +## `fix_mode` +~~~ +Si le fichier $1 n'est pas writable, le rendre writable temporairement. Si +nécessaire, le fichier est créé. +Cette fonction s'utilise de cette façon: +mode="$(fix_mode file)" +... +unfix_mode file "$mode" +~~~ +## `unfix_mode` +~~~ +Restaurer le mode $2 du fichier $1 traité par fix_mode +~~~ +## `get_mode` +~~~ +Obtenir le mode du fichier $1, en le créant si nécessaire. A utiliser avec +unfix_mode pour restaurer le mode d'un fichier qui a été traité avec un +fichier temporaire intermédiaire +~~~ +## `rm_maybe` +~~~ +Supprimer les fichiers dont on donne la liste. Si aucun fichier n'est +spécifié, cette fonction est un NOP +~~~ +## `cpdir` +~~~ +copier un fichier dans un répertoire, ou le contenu d'un répertoire dans un +autre répertoire, que le répertoire source soit un lien symbolique ou +non. Cette fonction existe parce que le comportement de "cp_a src dest" n'est +pas consistant selon les plateformes, surtout si src est un lien symbolique +sur un répertoire: parfois on copie le lien, parfois on copie le contenu du +répertoire, parfois on copie le répertoire... +La copie est faite avec rsync si possible. Les options du tableau +__CPDIR_RSYNC_ARGS sont rajoutées aux options standard de rsync. +~~~ +## `cpnovcs` +~~~ +copier le fichier/répertoire $1 *dans* le *répertoire* $2 avec rsync. Les +options du tableau __CPNOVCS_RSYNC_ARGS sont rajoutées aux options standard +de rsync. +Si $1 est un répertoire, la copie est faite en ignorant les sous-répertoires +de VCS (.svn, CVS). En ce qui concerne les répertoire de VCS, git aussi est +supporté, mais uniquement s'il est à la racine du transfert. +Si $1 se termine par un '/', c'est le contenu du répertoire qui est copié, pas +le répertoire lui-même. Si rsync n'est pas trouvé sur le système, alors on +fait une copie standard qui inclue les répertoires de VCS. +~~~ +## `cpvcs` +~~~ +comme cpnovcs, mais ne pas ignorer les répertoires de VCS +~~~ +## `cpdirnovcs` +~~~ +Le pendant de cpdir, mais en ignorant les sous-répertoires de VCS: copier le +contenu du répertoire $1 dans le répertoire $2 +~~~ +## `doinplace` +~~~ +Filtrer le fichier $1 à travers la commande $2..$*, puis remplacer le fichier +s'il n'y a pas eu d'erreur. Retourner le code d'erreur de la commande. Si $1 +n'est pas spécifié ou vaut -, filtrer l'entrée standard vers la sortie +standard. +La variante doinplacef remplace le fichier quelque soit le code de retour de +la commande. A utiliser avec des commandes comme grep qui peuvent retourner +FAUX s'ils ne trouvent pas le motif +~~~ +## `doinplacef` +## `stripnl` +~~~ +Supprimer les caractères de fin de ligne de la chaine en entrée +~~~ +## `nl2lf` +## `nl2crlf` +## `nl2cr` +## `list_all` +~~~ +Lister les fichiers ou répertoires du répertoire $1, un par ligne +Les répertoires . et .. sont enlevés de la liste +$1=un répertoire dont le contenu doit être listé +$2..@=un ensemble de patterns pour le listage +~~~ +## `list_files` +~~~ +Lister les fichiers du répertoire $1, un par ligne +$1=un répertoire dont le contenu doit être listé. +$2..@=un ensemble de patterns pour le listage +~~~ +## `list_dirs` +~~~ +Lister les répertoires du répertoire $1, un par ligne +Les répertoires . et .. sont enlevés de la liste +$1=un répertoire dont le contenu doit être listé. +$2..@=un ensemble de patterns pour le listage +~~~ +## `array_lsall` +~~~ +Lister les fichiers avec `list_all $2 $3...`, et les mettre dans le +tableau $1. Le tableau contient les chemins complets, par seulement les +noms comme avec list_all +~~~ +## `array_lsdirs` +~~~ +Lister les fichiers avec `list_dirs $2 $3...`, et les mettre dans le +tableau $1. Le tableau contient les chemins complets, par seulement les +noms comme avec list_dirs +~~~ +## `array_lsfiles` +~~~ +Lister les fichiers avec `list_files $2 $3...`, et les mettre dans le +tableau $1. Le tableau contient les chemins complets, par seulement les +noms comme avec list_files +~~~ +## `filter_empty` +~~~ +Filtrer l'entrée standard en enlevant les lignes vides +~~~ +## `filter_vcspath` +~~~ +L'entrée standard étant une liste de chemins, filtrer les fichiers et +répertoire qui ont un rapport avec subversion ou git +~~~ +## `merge_contlines` +~~~ +Avec les lignes lues sur stdin, fusionner celles qui se terminent par \ avec +les suivantes. +~~~ +## `filter_comment` +~~~ +Filtrer un fichier de configuration lu sur stdin en enlevant les commentaires +et les lignes vides. +Avec $1==-m, fusionner les lignes qui se terminent par \ avec les suivantes +Comme filter_conf(), les commentaires doivent être sur une ligne à part. +Contrairement à filter_conf, il n'est pas nécessaire que le caractère '#' soit +en début de ligne: il peut apparaitre après des espaces et des tabulations. De +même, une ligne qui ne contient que des espaces et des tabulations est +considérée comme vide. +~~~ +## `filter_conf` +~~~ +filtrer un fichier de configuration lu sur stdin en enlevant les commentaires +et les lignes vides. Une ligne n'est considérée commentaire que si '#' est un +première position. Utiliser filter_comment() si les commentaire peuvent +commencer par des caractères espace et tabulation. +Si $1==-m, fusionner les lignes qui se terminent par \ avec les suivantes +~~~ +## `is_archive` +~~~ +tester si l'extension d'un fichier indique que c'est une archive +~~~ +## `extract_archive` +~~~ +Extraire le contenu de l'archive $1 dans le répertoire ${2:-.} +~~~ +## `get_archive_basename` +~~~ +Obtenir le nom de base de l'archive $1 +~~~ +## `get_archive_appname` +~~~ +Obtenir le nom probable de l'application ou du framework contenu dans +l'archive $1, e.g: +get_archive_versionsuffix app-0.1.tgz +--> app +~~~ +## `get_archive_versionsuffix` +~~~ +Obtenir la valeur probable de la version de l'application ou du framework +contenu dans l'archive $1, avec le caractère de séparation, e.g: +get_archive_versionsuffix app-0.1.tgz +--> -0.1 +~~~ +## `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 +--> 0.1 +~~~ +## `dump_usernames` +~~~ +Placer dans le tableau $1 la liste des utilisateurs du système +Cette implémentation consulte /etc/passwd et liste tous les utilisateurs dont +le homedir se trouve dans /home, et dont l'uid est >=500 +~~~ +## `resolv_ips` +~~~ +Placer dans le tableau $1(=ips) la liste des adresses ip correspondant à +l'hôte $2. La résolution est effectuée avec la commande host. +~~~ +## `resolv_hosts` +~~~ +Placer dans le tableau $1(=hosts) la liste des hôtes correspondant à +l'adresse ip $2. La résolution est effectuée avec la commande host. +~~~ +## `runscript_as` +~~~ +Utiliser bash pour lancer le script $2 avec les arguments $3..$n afin qu'il +tourne avec les droits d'un autre user $1(=root). Si $2=exec, utiliser exec +pour lancer le script et ses arguments qui commencent à partir de $3, ce qui +fait que cette fonction ne retourne pas. +Attention! cette fonction ne teste pas avec si on est déjà le user $1. Il y a +donc un risque de boucle infinie si on ne teste pas le user courant. +~~~ +## `runscript_as_root` +~~~ +Utiliser bash pour lancer le script $1 avec les arguments $2..$* avec les +droits de root. Si on est déjà en root, le script est simplement lancé. Sinon, +utiliser runscript_as pour lancer le script avec les droits de root. +~~~ +## `run_as` +~~~ +Relancer le script courant afin qu'il tourne avec les droits d'un autre user +$1(=root) +Attention! cette fonction ne teste pas avec si on est déjà ce user. Il y a +donc un risque de boucle infinie si on ne teste pas le user courant. +Il faut lancer cette fonction avec les arguments du script en cours. Par +exemple:: +run_as root "$@" +Si $2=--noexec, on n'utilise pas la fonction exec, ce qui fait que la fonction +retourne. Sinon, on peut considérer que cette fonction ne retourne jamais +~~~ +## `run_as_root` +~~~ +relancer le script courant afin qu'il tourne en root si on est pas en déjà +root. Sinon, cette fonction est un nop. +~~~ +## `check_user` +~~~ +Vérifier si le user courant est l'un des users $1..* +~~~ +## `ensure_user` +~~~ +Vérifier si le user courant est l'un des users $1..N où N est la position du +premier "--". Si ce n'est pas le cas et que l'on est root, relancer le script +avec ce user grâce à la fonction run_as() +Retourner 1 si ce n'était pas le bon user. Retourner 10 si ce n'était pas le +bon user et que l'on n'est pas root (donc impossible à priori de relancer le +script avec le bon user). Retourner 11 si l'utilisateur a choisi de ne pas +lancer le script avec le bon utilisateur +A utiliser de cette manière: +if ensure_user users... -- args; then +# ... on est avec le bon user; faire les opérations +else +# ... ce code n'est exécuté que si une erreur s'est produite, ou si ce +# n'était pas le bon user et que l'option --noexec est utilisée +fi +~~~ +## `check_hostname` +~~~ +Vérifier si le hostname courant est l'un des hôtes $1..* +localhost matche toujours +~~~ +## `check_userhostname` +~~~ +Vérifier si le hostname et éventuellement le user courant sont l'un des +arguments $1..* +Chaque argument est de la forme [user@]host, mais le test ne tient compte que +du nom de l'hôte, sans tenir compte du domaine. Si le user n'est pas spécifié, +le test ne porte que sur hostname. +~~~ +## `ensure_hostname` +~~~ +Vérifier si le hostname et le user courant sont l'un des arguments $1..* +Chaque argument est de la forme [user@]host, mais le test ne tient compte que +du nom de l'hôte, sans tenir compte du domaine. +Si user est spécifié: +- Si on est sur le bon hôte mais pas le bon user, ensure_user est lancé avec +l'argument approprié pour relancer le script +Si l'argument était de la forme userhost:path, le répertoire courant est +changé avant de lancer le script avec le bon utilisateur. +Sinon (si user n'est pas spécifié): +- Si on n'est pas sur le bon hôte, après confirmation le script est lancé avec +ssh sur l'hôte distant avec le user spécifié (qui vaut par défaut root). Ce +script DOIT exister sur l'hôte distant avec le même chemin. +Si l'argument était de la forme userhost:path, le répertoire courant distant +est changé avant de lancer le script +Si on est avec le bon user sur le bon hôte, le répertoire courant n'est jamais +changé. +Retourner 1 si ce n'était pas le bon user. Retourner 10 si ce n'était pas le +bon user et que l'on n'est pas root (donc impossible à priori de relancer le +script avec le bon user). Retourner 11 si l'utilisateur a choisi de ne pas +lancer le script sur l'hôte distant. Retourner 12 si une erreur s'est produite +avec ssh. +A utiliser de cette manière: +if ensure_hostname user@host... -- args; then +# ... on est [avec le bon user] sur le bon hôte; faire les opérations +else +# ... ce code n'est exécuté que si une erreur s'est produite, ou si ce +# n'était pas le bon user et que l'option --noexec est utilisée +fi +~~~ +## `sqvals` +## `quoted_values` +## `formatcsv` +## `awkdef` +~~~ +Afficher un script à insérer au début d'un script awk. Ce script définit dans +une section BEGIN{} les variables donnés en arguments, et avec l'option -f, +des fonctions utiles. Si une valeur ne ressemble pas à une définition de +variable, l'analyse des variables s'arrête et le reste des arguments est +inséré tel quel. Cette fonction peut être utilisée de cette manière: +awk "$(awkdef -f var=value... 'script awk')" +Normalement, les variables définies sont scalaires, avec une syntaxe de la +forme var[:type]=value. type peut valoir str ou int, pour forcer le type de la +variable créée dans awk. +Il est possible d'utiliser la syntaxe awk_array[@]=bash_array ou array[@] (qui +est équivalente à array[@]=array) pour initialiser le tableau awk_array, qui +contiendra toute les valeurs du tableau nommé bash_array, avec les indices de +1 à N, N étant le nombre d'éléments du tableau bash_array. La variable +awk_array_count est aussi initialisée, et contient le nombre d'éléments du +tableau +La syntaxe "awk_array[@]=<\n..." permet de spécifier les valeurs du tableau, +une par ligne, e.g: +$'values[@]=<\nvalue1\nvalue2' +pour un tableau values qui contiendra deux valeurs: value1 et value2 +Avec l'option -f, des fonctions supplémentaires sont définies. Elles sont +décrites dans le module awk. +~~~ +## `lawkrun` +~~~ +wrapper pour lancer awk avec un script préparé par awkdef. Les définitions et +les arguments sont séparés par --, e.g. +awkrun var0=value0 var1=value1 script -- input0 input1 +~~~ +## `cawkrun` +## `awkrun` +## `lf_trylock` +~~~ +USAGE +lf_trylock [-h max_hours] /path/to/lockfile +OPTIONS +lockfile +fichier qui doit contenir le verrou +-h max_hours +Nombre d'heures (par défaut 4) au bout duquel afficher stale +Sinon, afficher locked +Retourne 0 si le verrou a été placé correctement. Il ne faut pas oublier de +supprimer le fichier. Le mieux est de le faire supprimer automatiquement par +autoclean: +lockfile=... +case "$(lf_trylock "$lockfile")" in +locked) ...;; +stale) ...;; +esac +autoclean "$lockfile" +Sinon, retourner 1 et afficher l'une des deux valeurs suivantes: +- stale si le verrou a déjà été placé, depuis au moins max_hours heures +- locked si le verrou a déjà été placé +- retry si une erreur s'est produite pendant la pose du verrou ou sa +lecture. Cela peut se produire si les droits ne sont pas suffisants pour +écrire dans le répertoire destination, ou si le fichier a été supprimé +avant sa lecture (race-condition). Dans ce dernier cas, reessayer permettra +d'acquérir le verrou +~~~ +## `pidfile_set` +~~~ +USAGE +pidfile_set [-p pid] /path/to/pidfile +OPTIONS +pidfile +fichier qui doit contenir le pid du script +-p pid +spécifier le pid. par défaut, utiliser $$ +-r si pidfile existe mais que le processus ne tourne plus, faire +comme si le fichier n'existe pas. +Retourner 0 si le pid a été correctement écrit dans le fichier. Ce fichier +sera supprimé automatiquement en fin de script +Retourner 1 si le fichier existe déjà et que le processus est en train de +tourner. +Retourner 2 si le fichier existe déjà mais que le processus ne tourne plus. +Retourner 10 si autre erreur grave s'est produite (par exemple, s'il manque le +chemin vers pidfile, ou si le fichier n'est pas accessible en écriture.) +~~~ +## `pidfile_check` +~~~ +USAGE +pidfile_check /path/to/pidfile +OPTIONS +pidfile +fichier qui doit contenir le pid d'un processus +Cette fonction permet de vérifier si le processus associé à un fichier de pid +est en train de tourner. +Retourner 0 si le fichier de pid existe et que le process du pid spécifié est +en train de tourner. Retourner 1 sinon. +Retourner 10 si erreur grave s'est produite (par exemple, s'il manque le +chemin vers pidfile, ou si le fichier n'est pas accessible en lecture.) +~~~ +## `page_maybe` +~~~ +Utiliser less, si possible, pour afficher le flux en entrée. Si le terminal +n'est pas interactif ou si le nombre de lignes en entrée est inférieur au +nombre de lignes du terminal, afficher simplement le flux. +Les arguments de cette fonction sont passés à less +~~~ +## `utools_local` +~~~ +Afficher les commandes pour rendre locales certaines variables en fonction des +arguments: +- opts rend locale args, pour utiliser parse_opts() à l'intérieur d'une +fonction. +- verbosity et interaction rendent respectivement locales __verbosity et +__interaction. Ceci est utile pour pouvoir appeler sans risque de pollution +de l'environnement une fonction qui utilise parse_opts() avec les +définitions de PRETTYOPTS. +Si aucun arguments n'est fourni, toutes les définitions sont affichées. +~~~ +## `stdredir` +~~~ +Lancer la commande $4..@ en redirigeant stdin depuis $1, stdout vers $2, +stderr vers $3. Si $1 est vide ou vaut /dev/stdin, la redirection n'est +pas faite. Si $2 est vide ou vaut /dev/stdout, la redirection n'est pas +faite. Si $3 est vide ou vaut /dev/stderr, la redirection n'est pas faite. +Cette fonction existe parce que sur certaines versions de bash, il semble +que les redirections /dev/std* ne sont pas traitées de façon particulière. +De plus, sur des technologies telles que OpenVZ, les chemins /dev/std* ne +sont pas créés (parce que /proc/self/fd/* n'est pas accessible). Donc, +dans de rares cas où le script tourne sur OpenVZ avec une version de bash +qui est buggée, la redirection n'est pas faite correctement. +~~~ +## `isatty` +~~~ +tester si STDOUT n'est pas une redirection +~~~ +## `in_isatty` +~~~ +tester si STDIN n'est pas une redirection +~~~ +## `out_isatty` +~~~ +tester si STDOUT n'est pas une redirection +~~~ +## `err_isatty` +~~~ +tester si STDERR n'est pas une redirection +~~~ +## `die` +## `die_unless` +~~~ +Afficher $-1 et quitter le script avec die() si la commande $1..-2 retourne +FAUX +~~~ +## `eerror_unless` +~~~ +Afficher $-1 avec eerror() et retourner $? si la commande $1..-2 retourne FAUX +~~~ +## `die_if` +~~~ +Afficher $-1 et quitter le script avec die() si la commande $1..-2 retourne +VRAI +~~~ +## `eerror_if` +~~~ +Afficher $-1 avec eerror() et retourner le code d'erreur 1 si la commande +$1..-2 retourne VRAI +~~~ +## `noerror` +~~~ +lancer la commande "$@" et masquer son code de retour +~~~ +## `noout` +~~~ +lancer la commande "$@" en supprimant sa sortie standard +~~~ +## `noerr` +~~~ +lancer la commande "$@" en supprimant sa sortie d'erreur +~~~ +## `tooenc` +~~~ +Transformer la valeur $1 de l'encoding $2(=$OENC) vers l'encoding de sortie +$3=($UTOOLS_OUTPUT_ENCODING) +~~~ +## `uecho` +## `tooenc_` +~~~ +Transformer la valeur $1 de l'encoding $2(=$OENC) vers l'encoding de sortie +$3=($UTOOLS_OUTPUT_ENCODING) +~~~ +## `uecho_` +## `toienc` +~~~ +Transformer la valeur $1 de $2(=$IENC) vers l'encoding d'entrée +$3(=$UTOOLS_INPUT_ENCODING) +~~~ +## `uread` +~~~ +Lire une valeur sur stdin et la placer dans la variable $1. On assume que la +valeur en entrée est encodée dans l'encoding d'entrée par défaut +~~~ +## `stooenc` +~~~ +Transformer la valeur lue sur stdin de $OENC vers l'encoding de sortie par +défaut ($UTOOLS_OUTPUT_ENCODING) +~~~ +## `stoienc` +~~~ +Transformer la valeur lue sur stdin de $IENC vers l'encoding d'entrée par +défaut ($UTOOLS_INPUT_ENCODING) +~~~ +## `elogto` +~~~ +Activer UTOOLS_EDATE et rediriger STDOUT et STDERR vers le fichier $1 +Si deux fichiers sont spécifiés, rediriger STDOUT vers $1 et STDERR vers $2 +Si aucun fichier n'est spécifié, ne pas faire de redirection +Si la redirection est activée, forcer l'utilisation de l'encoding UTF8 +Si UTOOLS_ELOG_OVERWRITE=1, alors le fichier en sortie est écrasé. Sinon, les +lignes en sortie lui sont ajoutées +~~~ +## `set_verbosity` +## `set_interaction` +## `show_error` +~~~ +tester respectivement si on doit afficher les messages d'erreur, +d'avertissement, d'information, de debug +~~~ +## `show_warn` +## `show_info` +## `show_verbose` +## `show_debug` +## `check_verbosity` +## `get_verbosity_option` +## `check_interaction` +## `is_interaction` +## `get_interaction_option` +## `eflush` +~~~ +Afficher les messages en attente +~~~ +## `eclearp` +~~~ +Supprimer les message en attente +~~~ +## `eerror` +~~~ +Afficher un message d'erreur +~~~ +## `ewarn` +~~~ +Afficher un message d'avertissement +~~~ +## `enote` +~~~ +Afficher un message d'information de même niveau qu'un avertissement +~~~ +## `ebanner` +~~~ +Afficher un message très important encadré, puis attendre 5 secondes +~~~ +## `eimportant` +~~~ +Afficher un message très important +~~~ +## `eattention` +~~~ +Afficher un message important +~~~ +## `einfo` +~~~ +Afficher un message d'information +~~~ +## `eecho` +~~~ +Afficher un message d'information sans préfixe +~~~ +## `eecho_` +## `edebug` +~~~ +Afficher un message de debug +~~~ +## `trace` +~~~ +Afficher la commande $1..@, la lancer, puis afficher son code d'erreur si une +erreur se produit +~~~ +## `trace_error` +~~~ +Lancer la commande $1..@, puis afficher son code d'erreur si une erreur se +produit. La différence avec trace() est que la commande n'est affichée que si +une erreur se produit. +~~~ +## `etitle` +~~~ +Afficher le titre $1, qui est le début éventuel d'une section. Les section +imbriquées sont affichées indentées. La section n'est pas terminée, et il faut +la terminer explicitement avec eend, sauf dans certains cas précis: +- Si $2..$* est spécifié, c'est une commande. Lancer la commande dans le +contexte de la section. Puis, la section est automatiquement terminée sauf si +l'option -s est spécifiée, auquel cas la section reste ouverte. Si l'option -p +est spécifiée, eclearp() est appelé pour purger les messages en attente +- Dans le cas contraire, l'option -s est ignorée: la section doit toujours +être terminée explicitement. +La fonction etitled() est comme etitle(), mais le titre n'est pas affiché +immédiatement. L'affichage effectif est effectué dès qu'une fonction e* est +utilisée. Ceci permet, avec la fonction eclearp(), de ne pas afficher de titre +pour une section vide. +~~~ +## `etitled` +## `estep` +~~~ +Afficher la description d'une opération. Cette fonction est particulièrement +appropriée dans le contexte d'un etitle. +Les variantes e (error), w (warning), n (note), i (info) permettent d'afficher +des couleurs différentes, mais toutes sont du niveau info. +~~~ +## `estepe` +## `estepw` +## `estepn` +## `estepi` +## `estep_` +## `estepe_` +## `estepw_` +## `estepn_` +## `estepi_` +## `ebegin` +~~~ +Afficher le message $1, qui décrit le début d'une opération. Cette fonction +débute une section, qu'il faut terminer avec eend. +Si $2..$* est spécifié, c'est une commande. Lancer la commande dans le +contexte de la section. Puis, la section est terminée automatiquement, sauf si +l'option -s est spécifiée, auquel cas la section reste ouverte. +~~~ +## `edot` +~~~ +Afficher une étape d'une opération, matérialisée par un point '.' ou une +croix 'x' en cas de succès ou d'erreur. Cette fonction est particulièrement +appropriée dans le contexte d'un ebegin. +~~~ +## `edotw` +~~~ +Afficher un avertissement comme étape d'une opération, matérialisée par une +lettre 'w' (typiquement de couleur jaune). Cette fonction est particulièrement +appropriée dans le contexte d'un ebegin. +~~~ +## `ewait` +~~~ +Afficher les étapes d'une opération qui dure, matérialisées par des '+' toutes +les secondes tant que le processus $1 tourne. +A utiliser de cette manière: +ebegin "msg" +cmd & +ewait $! +eend +~~~ +## `eend` +~~~ +Terminer une section. +Avec l'option -c, remettre à zéro toutes les informations de section +Si la section en cours est un ebegin, afficher la fin de l'opération: [ok] ou +[error] en fonction du code de retour de la dernière commande (ou de $1 si +cette valeur est donnée) +Si la section en cours est un etitle, marquer la fin de la section concernée +par le titre. +~~~ +## `elinedots` +~~~ +Afficher un message comme avec ebegin "$1", puis afficher un point '.' pour +chaque ligne lue sur stdin. Cela permet de suivre une opération. En mode +DEBUG, afficher la ligne affichée plutôt qu'un point. +Si $2..$* sont spécifiés, lancer la commande et suivre sa sortie. Ainsi, +'elinedots msg cmd args' est un raccourci pour 'cmd args | elinedots msg' +~~~ +## `ask_yesno` +~~~ +Afficher le message $1 suivi de [oN] ou [On] suivant que $2 vaut O ou N, puis +lire la réponse. Retourner 0 si la réponse est vrai, 1 sinon. +Si $1 est une option, elle est utilisée avec check_interaction pour savoir si +on est en mode interactif ou non. A ce moment-là, les valeurs sont décalées +($2=message, $3=default) +Si $2 vaut C, la valeur par défaut est N si on est interactif, O sinon +Si $2 vaut X, la valeur par défaut est O si on est interactif, N sinon +~~~ +## `read_value` +~~~ +Afficher le message $1 suivi de la valeur par défaut [$3] si elle est non +vide, puis lire la valeur donnée par l'utilisateur. Cette valeur doit être non +vide si $4(=O) est vrai. La valeur saisie est placée dans la variable +$2(=value) +Si $1 est une option, elle est utilisée avec check_interaction pour savoir si +on est en mode interactif ou non. A ce moment-là, les valeurs sont décalées +($2=message, $3=variable, $4=default, $5=required) +En mode non interactif, c'est la valeur par défaut qui est sélectionnée. Si +l'utilisateur requière que la valeur soit non vide et que la valeur par défaut +est vide, afficher un message d'erreur et retourner faux +read_password() est comme read_value(), mais la valeur saisie n'est pas +affichée, ce qui la rend appropriée pour la lecture d'un mot de passe. +~~~ +## `read_password` +## `simple_menu` +~~~ +Afficher un menu simple dont les éléments sont les valeurs du tableau +$2(=options). L'option choisie est placée dans la variable $1(=option) +-t TITLE: spécifier le titre du menu +-m YOUR_CHOICE: spécifier le message d'invite pour la sélection de l'option +-d DEFAULT: spécifier l'option par défaut. Par défaut, prendre la valeur +actuelle de la variable $1(=option) +~~~ +## `actions_menu` +~~~ +Afficher un menu dont les éléments sont les valeurs du tableau $4(=options), +et une liste d'actions tirées du tableau $3(=actions). L'option choisie est +placée dans la variable $2(=option). L'action choisie est placée dans la +variable $1(=action) +Un choix est saisi sous la forme [action]num_option +-t TITLE: spécifier le titre du menu +-m OPT_YOUR_CHOICE: spécifier le message d'invite pour la sélection de +l'action et de l'option +-M ACT_YOUR_CHOICE: spécifier le message d'invite dans le cas où aucune option +n'est disponible. Dans ce cas, seules les actions vides sont possibles. +-e VOID_ACTION: spécifier qu'une action est vide, c'est à dire qu'elle ne +requière pas d'être associée à une option. Par défaut, la dernière action +est classée dans cette catégorie puisque c'est l'action "quitter" +-d DEFAULT_ACTION: choisir l'action par défaut. par défaut, c'est la première +action. +-q QUIT_ACTION: choisir l'option "quitter" qui provoque la sortie du menu sans +choix. par défaut, c'est la dernière action. +-o DEFAULT_OPTION: choisir l'option par défaut. par défaut, prendre la valeur +actuelle de la variable $2(=option) +~~~ +## `autoclean` +~~~ +Ajouter $1..$n à la liste des fichiers à supprimer à la fin du programme +~~~ +## `ac_cleanall` +~~~ +Supprimer *tous* les fichiers temporaires gérés par autoclean tout de suite. +~~~ +## `ac_clean` +~~~ +Supprimer les fichier temporaires $1..$* si et seulement s'ils ont été générés +par ac_set_tmpfile ou ac_set_tmpdir +~~~ +## `ac_set_tmpfile` +~~~ +Créer un fichier temporaire avec le motif $2, l'ajouter à la liste des +fichiers à supprimer en fin de programme, et mettre sa valeur dans la +variable $1 +En mode debug, si ($5 est vide ou ${!5} est une valeur vraie), et si $3 n'est +pas vide, prendre ce fichier au lieu de générer un nouveau fichier +temporaire. Si $4==keep, ne pas écraser le fichier $3 s'il existe. +~~~ +## `ac_set_tmpdir` +~~~ +Créer un répertoire temporaire avec le motif $2, l'ajouter à la liste des +fichiers à supprimer en fin de programme, et mettre sa valeur dans la +variable $1 +En mode debug, si ($4 est vide ou ${!4} est une valeur vraie), et si $3 n'est +pas vide, prendre ce nom de répertoire au lieu de créer un nouveau répertoire +temporaire +~~~ +## `debug_tee` +~~~ +En mode debug, passer le flux à travers la commande 'tee "$@"'. Sinon, le flux +est passé inchangé. +~~~ +## `get_user_defaults_file` +~~~ +Afficher le chemin vers le fichier utilisateur à éditer pour qu'il soit chargé +par 'set_defaults $1'. Ce fichier n'existe pas forcément; il faut peut-être le +créer. +~~~ +## `get_defaults_files` +~~~ +Initialiser le tableau $1(=defaults) avec la liste des fichiers qui seraient +chargés par la commande 'set_defaults $2..N' +~~~ +## `set_defaults` +~~~ +Pour chaque argument, sourcer /etc/default/$arg *et* (en priorité +~/etc/default.$HOSTNAME/$arg ou à défaut ~/etc/default/$arg) si ceux-ci +existent. *Sinon*, lire $scriptdir/lib/default/$arg si ce fichier existe +~~~ +## `myhost` +~~~ +Afficher le nom d'hôte pleinement qualifié, en faisant appel à la commande +hostname. Par comparaison, $MYHOST est fourni par bash. +~~~ +## `myhostname` +~~~ +Afficher le nom d'hôte sans domaine, en faisant appel à la commande +hostname. Par comparaison, $MYHOSTNAME est fourni par bash. +~~~ + +-*- 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.num.md b/doc/ulib_base.num.md new file mode 100644 index 0000000..cfbd9e0 --- /dev/null +++ b/doc/ulib_base.num.md @@ -0,0 +1,17 @@ +# ulib/base.num + +## `isnum` +~~~ +retourner vrai si $1 est une valeur numérique entière (positive ou négative) +~~~ +## `ispnum` +~~~ +retourner vrai si $1 est une valeur numérique entière positive +~~~ +## `isrnum` +~~~ +retourner vrai si $1 est une valeur numérique réelle (positive ou négative) +le séparateur décimal peut être . ou , +~~~ + +-*- 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.num.twp b/doc/ulib_base.num.twp new file mode 100644 index 0000000..c1bd6b7 --- /dev/null +++ b/doc/ulib_base.num.twp @@ -0,0 +1,21 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: ulib/base.num + +!! {{{isnum}}} +{{{ +retourner vrai si $1 est une valeur numérique entière (positive ou négative) +}}} +!! {{{ispnum}}} +{{{ +retourner vrai si $1 est une valeur numérique entière positive +}}} +!! {{{isrnum}}} +{{{ +retourner vrai si $1 est une valeur numérique réelle (positive ou négative) +le séparateur décimal peut être . ou , +}}} diff --git a/doc/ulib_base.quote.md b/doc/ulib_base.quote.md new file mode 100644 index 0000000..c25e2cb --- /dev/null +++ b/doc/ulib_base.quote.md @@ -0,0 +1,21 @@ +# ulib/base.quote + +## `qawk` +~~~ +Dans la chaine $*, remplacer \ par \\ et " par \" et afficher la chaine +entourée de guillemets. Ceci est utile pour quoter des valeur à insérer dans +un script awk +~~~ +## `qseds` +~~~ +Quoter la chaine $*, qui doit être utilisée comme chaine de recherche ou de +remplacement de grep, sed ou awk +~~~ +## `qform` +~~~ +Dans la chaine $* qui est de la forme "name=value", remplacer dans name et +dans value '%' par '%25', '+' par '%2B', '&' par '%26', '=' par '%3D', ' ' par +'+' +~~~ + +-*- 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.quote.twp b/doc/ulib_base.quote.twp new file mode 100644 index 0000000..bbe1974 --- /dev/null +++ b/doc/ulib_base.quote.twp @@ -0,0 +1,25 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: ulib/base.quote + +!! {{{qawk}}} +{{{ +Dans la chaine $*, remplacer \ par \\ et " par \" et afficher la chaine +entourée de guillemets. Ceci est utile pour quoter des valeur à insérer dans +un script awk +}}} +!! {{{qseds}}} +{{{ +Quoter la chaine $*, qui doit être utilisée comme chaine de recherche ou de +remplacement de grep, sed ou awk +}}} +!! {{{qform}}} +{{{ +Dans la chaine $* qui est de la forme "name=value", remplacer dans name et +dans value '%' par '%25', '+' par '%2B', '&' par '%26', '=' par '%3D', ' ' par +'+' +}}} diff --git a/doc/ulib_base.split.md b/doc/ulib_base.split.md new file mode 100644 index 0000000..3c2a605 --- /dev/null +++ b/doc/ulib_base.split.md @@ -0,0 +1,75 @@ +# ulib/base.split + +## `splitfsep` +~~~ +Découper $1 de la forme "first[SEPsecond]" entre first, qui est placé dans la +variable $3(=first) et second, qui est placée dans la variable $4(=second). $2 +est la valeur SEP. Le découpage est faite sur la *première* occurence de SEP. +~~~ +## `splitfsep2` +~~~ +Découper $1 de la forme "[firstSEP]second" entre first, qui est placé dans la +variable $3(=first) et second, qui est placée dans la variable $4(=second). $2 +est la valeur SEP. Le découpage est faite sur la *première* occurence de SEP. +~~~ +## `splitlsep` +~~~ +Découper $1 de la forme "first[SEPsecond]" entre first, qui est placé dans la +variable $3(=first) et second, qui est placée dans la variable $4(=second). $2 +est la valeur SEP. Le découpage est faite sur la *dernière* occurence de SEP. +~~~ +## `splitlsep2` +~~~ +Découper $1 de la forme "[firstSEP]second" entre first, qui est placé dans la +variable $3(=first) et second, qui est placée dans la variable $4(=second). $2 +est la valeur SEP. Le découpage est faite sur la *dernière* occurence de SEP. +~~~ +## `splitvar` +~~~ +Découper $1 de la forme name[=value] entre le nom, qui est placé dans la +variable $2(=name) et la valeur, qui est placée dans la variable $3(=value) +~~~ +## `splitpath` +~~~ +Découper $1 de la forme [dir/]name entre le répertoire, qui est placé dans la +variable $2(=dir), et le nom du fichier, qui est placé dans la variable +$3(=name) +~~~ +## `splitname` +~~~ +Découper $1 de la forme basename[.ext] entre le nom de base du fichier, qui +est placé dans la variable $2(=basename) et l'extension, qui est placée dans +la variable $3(=ext) +Attention, si $1 est un chemin, le résultat risque d'être faussé. Par exemple, +'splitname a.b/c' ne donne pas le résultat escompté. +~~~ +## `splithost` +~~~ +Découper $1 de la forme hostname[.domain] entre le nom d'hôte, qui est placé +dans la variable $2(=hostname) et le domaine, qui est placée dans la variable +$3(=domain) +~~~ +## `splituserhost` +~~~ +Découper $1 de la forme [user@]host entre le nom de l'utilisateur, qui est placé +dans la variable $2(=user) et le nom d'hôte, qui est placée dans la variable +$3(=host) +~~~ +## `splitpair` +~~~ +Découper $1 de la forme first[:second] entre la première valeur, qui est placé +dans la variable $2(=src) et la deuxième valeur, qui est placée dans la variable +$3(=dest) +~~~ +## `splitproxy` +~~~ +Découper $1 de la forme http://[user:password@]host[:port]/ entre les valeurs +$2(=host), $3(=port), $4(=user), $5(=password) +~~~ +## `spliturl` +~~~ +Découper $1 de la forme scheme://[user:password@]host[:port]/path entre les +valeurs $2(=scheme), $3(=user), $4(=password), $5(=host), $6(=port), $7(=path) +~~~ + +-*- 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.split.twp b/doc/ulib_base.split.twp new file mode 100644 index 0000000..6d9c395 --- /dev/null +++ b/doc/ulib_base.split.twp @@ -0,0 +1,79 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: ulib/base.split + +!! {{{splitfsep}}} +{{{ +Découper $1 de la forme "first[SEPsecond]" entre first, qui est placé dans la +variable $3(=first) et second, qui est placée dans la variable $4(=second). $2 +est la valeur SEP. Le découpage est faite sur la *première* occurence de SEP. +}}} +!! {{{splitfsep2}}} +{{{ +Découper $1 de la forme "[firstSEP]second" entre first, qui est placé dans la +variable $3(=first) et second, qui est placée dans la variable $4(=second). $2 +est la valeur SEP. Le découpage est faite sur la *première* occurence de SEP. +}}} +!! {{{splitlsep}}} +{{{ +Découper $1 de la forme "first[SEPsecond]" entre first, qui est placé dans la +variable $3(=first) et second, qui est placée dans la variable $4(=second). $2 +est la valeur SEP. Le découpage est faite sur la *dernière* occurence de SEP. +}}} +!! {{{splitlsep2}}} +{{{ +Découper $1 de la forme "[firstSEP]second" entre first, qui est placé dans la +variable $3(=first) et second, qui est placée dans la variable $4(=second). $2 +est la valeur SEP. Le découpage est faite sur la *dernière* occurence de SEP. +}}} +!! {{{splitvar}}} +{{{ +Découper $1 de la forme name[=value] entre le nom, qui est placé dans la +variable $2(=name) et la valeur, qui est placée dans la variable $3(=value) +}}} +!! {{{splitpath}}} +{{{ +Découper $1 de la forme [dir/]name entre le répertoire, qui est placé dans la +variable $2(=dir), et le nom du fichier, qui est placé dans la variable +$3(=name) +}}} +!! {{{splitname}}} +{{{ +Découper $1 de la forme basename[.ext] entre le nom de base du fichier, qui +est placé dans la variable $2(=basename) et l'extension, qui est placée dans +la variable $3(=ext) +Attention, si $1 est un chemin, le résultat risque d'être faussé. Par exemple, +'splitname a.b/c' ne donne pas le résultat escompté. +}}} +!! {{{splithost}}} +{{{ +Découper $1 de la forme hostname[.domain] entre le nom d'hôte, qui est placé +dans la variable $2(=hostname) et le domaine, qui est placée dans la variable +$3(=domain) +}}} +!! {{{splituserhost}}} +{{{ +Découper $1 de la forme [user@]host entre le nom de l'utilisateur, qui est placé +dans la variable $2(=user) et le nom d'hôte, qui est placée dans la variable +$3(=host) +}}} +!! {{{splitpair}}} +{{{ +Découper $1 de la forme first[:second] entre la première valeur, qui est placé +dans la variable $2(=src) et la deuxième valeur, qui est placée dans la variable +$3(=dest) +}}} +!! {{{splitproxy}}} +{{{ +Découper $1 de la forme http://[user:password@]host[:port]/ entre les valeurs +$2(=host), $3(=port), $4(=user), $5(=password) +}}} +!! {{{spliturl}}} +{{{ +Découper $1 de la forme scheme://[user:password@]host[:port]/path entre les +valeurs $2(=scheme), $3(=user), $4(=password), $5(=host), $6(=port), $7(=path) +}}} diff --git a/doc/ulib_base.string.md b/doc/ulib_base.string.md new file mode 100644 index 0000000..6c13f8d --- /dev/null +++ b/doc/ulib_base.string.md @@ -0,0 +1,98 @@ +# ulib/base.string + +## `straddp` +~~~ +ajouter le préfixe $1 à $2* +~~~ +## `strdelp` +~~~ +enlever le préfixe $1 à $2* +~~~ +## `strdelp2` +~~~ +enlever le préfixe $1 le plus long à $2* +~~~ +## `stradds` +~~~ +ajouter le suffixe $1 à $2* +~~~ +## `strdels` +~~~ +enlever le suffixe $1 à $2* +~~~ +## `strdels2` +~~~ +enlever le suffixe le plus long $1 à $2* +~~~ +## `strlower` +~~~ +afficher en minuscule la valeur $* +~~~ +## `strlower1` +~~~ +afficher la valeur $* après avoir converti la première lettre en minuscule +~~~ +## `strlowers` +~~~ +afficher les valeurs $1..* après avoir converti leur première lettre en +minuscule +~~~ +## `strupper` +~~~ +afficher en majuscule la valeur $* +~~~ +## `strupper1` +~~~ +afficher la valeur $* après avoir converti la première lettre en majuscule +~~~ +## `struppers` +~~~ +afficher les valeurs $1..* après avoir converti leur première lettre en +majuscule +~~~ +## `strmid` +~~~ +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 +par l'un des caractères /, #, % pour indiquer le type de recherche +~~~ +## `first_char` +~~~ +retourner le premier caractère de la chaine $* +~~~ +## `last_char` +~~~ +retourner le dernier caractère de la chaine $* +~~~ +## `first_chars` +~~~ +retourner tous les caractères de la chaine $*, excepté le dernier +~~~ +## `last_chars` +~~~ +retourner tous les caractères de la chaine $*, excepté le premier +~~~ +## `first_char_is` +~~~ +Tester si le premier caractère de la chaine $1 est $2 +~~~ +## `last_char_is` +~~~ +Tester si le dernier caractère de la chaine $1 est $2 +~~~ +## `beginswith` +~~~ +Tester si la chaine $1 commence par le wildcard $2 +~~~ +## `endswith` +~~~ +Tester si la chaine $1 se termine par le wildcard $2 +~~~ + +-*- 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.twp b/doc/ulib_base.string.twp new file mode 100644 index 0000000..855c53f --- /dev/null +++ b/doc/ulib_base.string.twp @@ -0,0 +1,102 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: ulib/base.string + +!! {{{straddp}}} +{{{ +ajouter le préfixe $1 à $2* +}}} +!! {{{strdelp}}} +{{{ +enlever le préfixe $1 à $2* +}}} +!! {{{strdelp2}}} +{{{ +enlever le préfixe $1 le plus long à $2* +}}} +!! {{{stradds}}} +{{{ +ajouter le suffixe $1 à $2* +}}} +!! {{{strdels}}} +{{{ +enlever le suffixe $1 à $2* +}}} +!! {{{strdels2}}} +{{{ +enlever le suffixe le plus long $1 à $2* +}}} +!! {{{strlower}}} +{{{ +afficher en minuscule la valeur $* +}}} +!! {{{strlower1}}} +{{{ +afficher la valeur $* après avoir converti la première lettre en minuscule +}}} +!! {{{strlowers}}} +{{{ +afficher les valeurs $1..* après avoir converti leur première lettre en +minuscule +}}} +!! {{{strupper}}} +{{{ +afficher en majuscule la valeur $* +}}} +!! {{{strupper1}}} +{{{ +afficher la valeur $* après avoir converti la première lettre en majuscule +}}} +!! {{{struppers}}} +{{{ +afficher les valeurs $1..* après avoir converti leur première lettre en +majuscule +}}} +!! {{{strmid}}} +{{{ +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 +par l'un des caractères /, #, % pour indiquer le type de recherche +}}} +!! {{{first_char}}} +{{{ +retourner le premier caractère de la chaine $* +}}} +!! {{{last_char}}} +{{{ +retourner le dernier caractère de la chaine $* +}}} +!! {{{first_chars}}} +{{{ +retourner tous les caractères de la chaine $*, excepté le dernier +}}} +!! {{{last_chars}}} +{{{ +retourner tous les caractères de la chaine $*, excepté le premier +}}} +!! {{{first_char_is}}} +{{{ +Tester si le premier caractère de la chaine $1 est $2 +}}} +!! {{{last_char_is}}} +{{{ +Tester si le dernier caractère de la chaine $1 est $2 +}}} +!! {{{beginswith}}} +{{{ +Tester si la chaine $1 commence par le wildcard $2 +}}} +!! {{{endswith}}} +{{{ +Tester si la chaine $1 se termine par le wildcard $2 +}}} diff --git a/doc/ulib_base.tools.md b/doc/ulib_base.tools.md new file mode 100644 index 0000000..59d870d --- /dev/null +++ b/doc/ulib_base.tools.md @@ -0,0 +1,24 @@ +# ulib/base.tools + +## `base_umove` +~~~ +Outil de haut niveau pour déplacer un fichier ou un lien. Si c'est un lien qui +est déplacé, la destination du lien est mise à jour si elle est relative. +l'option '-d UPDATEDIR' permet de spécifier un répertoire dans lequel tous les +liens qui pointent vers le fichier déplacé sont mis à jour si le déplacement +du fichier se fait avec succès. +~~~ +## `base_udelete` +~~~ +Outil de haut niveau pour supprimer un fichier ou un lien. Si on doit +supprimer un fichier, et que l'option '-d UPDATEDIR' est spécifiée, et que des +liens du répertoire UPDATEDIR pointent vers le fichier supprimé, ces liens +sont supprimés aussi. +~~~ +## `base_ucopy` +~~~ +Outil de haut niveau pour copier un fichier ou un lien. Si c'est un lien qui +est copié, la destination du lien est mise à jour si elle est relative. +~~~ + +-*- 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.tools.twp b/doc/ulib_base.tools.twp new file mode 100644 index 0000000..177fd56 --- /dev/null +++ b/doc/ulib_base.tools.twp @@ -0,0 +1,28 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: ulib/base.tools + +!! {{{base_umove}}} +{{{ +Outil de haut niveau pour déplacer un fichier ou un lien. Si c'est un lien qui +est déplacé, la destination du lien est mise à jour si elle est relative. +l'option '-d UPDATEDIR' permet de spécifier un répertoire dans lequel tous les +liens qui pointent vers le fichier déplacé sont mis à jour si le déplacement +du fichier se fait avec succès. +}}} +!! {{{base_udelete}}} +{{{ +Outil de haut niveau pour supprimer un fichier ou un lien. Si on doit +supprimer un fichier, et que l'option '-d UPDATEDIR' est spécifiée, et que des +liens du répertoire UPDATEDIR pointent vers le fichier supprimé, ces liens +sont supprimés aussi. +}}} +!! {{{base_ucopy}}} +{{{ +Outil de haut niveau pour copier un fichier ou un lien. Si c'est un lien qui +est copié, la destination du lien est mise à jour si elle est relative. +}}} diff --git a/doc/ulib_base.twp b/doc/ulib_base.twp index c8fbf6d..9075f49 100644 --- a/doc/ulib_base.twp +++ b/doc/ulib_base.twp @@ -1,63 +1,24 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 02/06/2012 09:54 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: ##@title: ulib/base -!! {{{isnum}}} -{{{ -retourner vrai si $1 est une valeur numérique entière (positive ou négative) -}}} -!! {{{ispnum}}} -{{{ -retourner vrai si $1 est une valeur numérique entière positive -}}} -!! {{{isrnum}}} -{{{ -retourner vrai si $1 est une valeur numérique réelle (positive ou négative) -le séparateur décimal peut être . ou , -}}} -!! {{{is_yes}}} -{{{ -retourner vrai si $1 est une valeur "oui" -}}} -!! {{{norm_yes}}} -{{{ -normaliser une valeur vraie: si $1 est une valeur "oui", afficher 1, sinon -afficher une chaine vide -}}} -!! {{{set_yesval}}} +!! {{{setyesval}}} {{{ mettre la valeur normalisée de la valeur "oui" de $2 dans la variable $1 }}} -!! {{{is_no}}} +!! {{{normyesval}}} {{{ -retourner vrai si $1 est une valeur "non" +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 }}} -!! {{{rawecho}}} +!! {{{normyesvals}}} {{{ -afficher une valeur brute. contrairement à echo, ne pas reconnaitre les -options -e, -E, -n. -cette fonction est nécessaire pour pouvoir splitter et afficher des options de -ligne de commande. -}}} -!! {{{rawecho_}}} -!! {{{quote_arg}}} -{{{ -Dans la chaine $1, remplacer \ par \\, " par \", $ par \$, ` par \` -Cela permet de quoter une chaine à mettre entre guillements -note: la protection de ! n'est pas effectuée, parce que le comportement du -shell est incohérent entre le shell interactif et les scripts. Pour une -version plus robuste, utiliser plutôt quote_sarg(), qui est malheureusement -plus lent, parce qu'il utilise un programme externe -}}} -!! {{{should_quote}}} -!! {{{quoted_arg}}} -{{{ -Dans la chaine $1, remplacer \ par \\, " par \" et $ par \$, et afficher la -chaine entourée de guillemets, si nécessaire +remplacer les valeur des variables $1..* par les valeurs normalisées +respectives de leur valeur "oui" }}} !! {{{quote_in}}} {{{ @@ -78,114 +39,11 @@ puisque le shell a des difficultés à faire le rechercher/remplacer approprié Dans la chaine $1, remplacer ' par '\'', et afficher la chaine entourée de quotes }}} -!! {{{quoted_args}}} -{{{ -Comme quoted_arg, mais tous les arguments sont quotés et affichés entourés de -guillemets, ce qui permet de construire des arguments d'une ligne de commande -}}} !! {{{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 }}} -!! {{{quote_awk}}} -{{{ -dans la chaine $1, remplacer \ par \\ et " par \". ceci est utile pour quoter -des valeur à insérer dans un script awk -}}} -!! {{{quoted_awk}}} -{{{ -dans la chaine $1, remplacer \ par \\ et " par \" et afficher la -chaine entourée de guillemets. ceci est utile pour quoter -des valeur à insérer dans un script awk -}}} -!! {{{quote_seds}}} -{{{ -Quoter la chaine $1, qui doit être utilisée comme chaine de recherche ou de -remplacement de grep, sed ou awk -}}} -!! {{{quote_form}}} -{{{ -Dans la chaine $1, remplacer '%' par '%25', '+' par '%2B', '&' par '%26', '=' -par '%3D', ' ' par '+' -}}} -!! {{{quoted_form}}} -{{{ -Dans la chaine $1 qui est de la forme "name=value", remplacer dans name et -dans value '%' par '%25', '+' par '%2B', '&' par '%26', '=' par '%3D', ' ' par -'+' -}}} -!! {{{first_char}}} -{{{ -retourner le premier caractère de la chaine $1 -}}} -!! {{{last_char}}} -{{{ -retourner le dernier caractère de la chaine $1 -}}} -!! {{{first_chars}}} -{{{ -retourner tous les caractères de la chaine $1, excepté le dernier -}}} -!! {{{last_chars}}} -{{{ -retourner tous les caractères de la chaine $1, excepté le premier -}}} -!! {{{first_char_is}}} -{{{ -Tester si le premier caractère de la chaine $1 est $2 -}}} -!! {{{last_char_is}}} -{{{ -Tester si le dernier caractère de la chaine $1 est $2 -}}} -!! {{{beginswith}}} -{{{ -Tester si la chaine $1 commence par le wildcard $2 -}}} -!! {{{endswith}}} -{{{ -Tester si la chaine $1 se termine par le wildcard $2 -}}} -!! {{{splitvar}}} -{{{ -Découper $1 de la forme name[=value] entre le nom, qui est placé dans la -variable $2(=name) et la valeur, qui est placée dans la variable $3(=value) -}}} -!! {{{splitname}}} -{{{ -Découper $1 de la forme basename[.ext] entre le nom de base du fichier, qui -est placé dans la variable $2(=basename) et l'extension, qui est placée dans -la variable $3(=ext) -Attention, si $1 est un chemin, le résultat risque d'être faussé. Par exemple, -'splitname a.b/c' ne donne pas le résultat escompté. -}}} -!! {{{splithost}}} -{{{ -Découper $1 de la forme hostname[.domain] entre le nom d'hôte, qui est placé -dans la variable $2(=hostname) et le domaine, qui est placée dans la variable -$3(=domain) -}}} -!! {{{splituserhost}}} -{{{ -Découper $1 de la forme [user@]host entre le nom de l'utilisateur, qui est placé -dans la variable $2(=user) et le nom d'hôte, qui est placée dans la variable -$3(=host) -}}} -!! {{{splitpair}}} -{{{ -Découper $1 de la forme first[:second] entre la première valeur, qui est placé -dans la variable $2(=src) et la deuxième valeur, qui est placée dans la variable -$3(=dest) -}}} -!! {{{splitproxy}}} -{{{ -Découper $1 de la forme http://[user:password@]host[:port]/ entre les valeurs -$2(=host), $3(=port), $4(=user), $5(=password) -}}} -!! {{{set_var_cmd}}} -!! {{{set_var}}} -!! {{{set_var_literal}}} !! {{{set_array_cmd}}} {{{ Afficher la commande permettant d'initialiser le tableau $1 avec les valeurs: @@ -215,11 +73,11 @@ créer un tableau vide dont le nom est $1 }}} !! {{{array_add}}} {{{ -ajouter la valeur $2 au tableau dont le nom est $1 +ajouter les valeurs $2..@ au tableau dont le nom est $1 }}} !! {{{array_ins}}} {{{ -insérer la valeur $2 au début du tableau dont le nom est $1 +insérer les valeurs $2..@ au début du tableau dont le nom est $1 }}} !! {{{array_del}}} {{{ @@ -240,10 +98,19 @@ valeur n'y est pas déjà. Retourner vrai si la valeur a été ajoutée. {{{ Initialiser le tableau $1 avec les nombres de $2(=1) à $3(=10) avec un step de $4(=1) }}} +!! {{{array_eq}}} +{{{ +tester l'égalité des tableaux $1 et $2 +}}} !! {{{array_contains}}} {{{ tester si le tableau dont le nom est $1 contient la valeur $2 }}} +!! {{{array_icontains}}} +{{{ +tester si le tableau dont le nom est $1 contient la valeur $2, sans tenir +compte de la casse +}}} !! {{{array_find}}} {{{ si le tableau $1 contient la valeur $2, retourner l'index de la valeur. Si le @@ -306,6 +173,11 @@ ajouter toutes les valeurs du tableau $2 dans le tableau $1, excepté la derniè {{{ ajouter toutes les valeurs du tableau $2 dans le tableau $1, excepté la première }}} +!! {{{array_xsplit}}} +{{{ +créer le tableau $1 avec chaque élément de $2 (un ensemble d'éléments séparés +par $3, qui vaut ':' par défaut). +}}} !! {{{array_split}}} {{{ créer le tableau $1 avec chaque élément de $2 (un ensemble d'éléments séparés @@ -313,6 +185,10 @@ par $3, qui vaut ':' par défaut). Les éléments vides sont ignorés. par exemp "a::b" est équivalent à "a:b" }}} !! {{{array_from_path}}} +!! {{{array_from_xlines}}} +{{{ +créer le tableau $1 avec chaque ligne de $2. +}}} !! {{{array_from_lines}}} {{{ créer le tableau $1 avec chaque ligne de $2. Les lignes vides sont ignorés. @@ -360,10 +236,14 @@ supprimer le chemin $1 de $2(=PATH) {{{ Ajouter le chemin $1 à la fin, dans $2(=PATH), s'il n'y existe pas déjà }}} -!! {{{uinspath}}} +!! {{{uinspathm}}} {{{ Ajouter le chemin $1 au début, dans $2(=PATH), s'il n'y existe pas déjà }}} +!! {{{uinspath}}} +{{{ +S'assurer que le chemin $1 soit au début de $2(=PATH) +}}} !! {{{withpath}}} {{{ tester si le chemin est relatif à . ou à .., ou est absolu. i.e 'withpath a/b' @@ -383,7 +263,7 @@ $(pwd) par défaut) Retourner un chemin absolu vers $1. Si $2 est non nul et si $1 est un chemin relatif, alors $1 est exprimé par rapport à $2, sinon il est exprimé par rapport au répertoire courant. -Si le chemin n'existe pas, il n'est pas normalisé. Sinon, les meilleurs +Si le chemin n'existe pas, il n'est PAS normalisé. Sinon, les meilleurs efforts sont faits pour normaliser le chemin. }}} !! {{{parentdirs}}} @@ -400,10 +280,42 @@ $2 ou $(pwd) si $2 est vide }}} !! {{{relpath}}} {{{ -Retourner le chemin relatif de $1 par rapport à $2. Si $2 n'est pas spécifié, -on prend le répertoire courant. Si $1 ou $2 ne sont pas des chemins -absolus, il sont transformés en chemins absolus par rapport à $3. Si $1==$2, -retourner une chaine vide +Afficher le chemin relatif de $1 par rapport à $2. Si $2 n'est pas spécifié, +on prend le répertoire courant. Si $1 ou $2 ne sont pas des chemins absolus, +il sont transformés en chemins absolus par rapport à $3. Si $1==$2, retourner +une chaine vide +}}} +!! {{{relpathx}}} +{{{ +Comme relpath, mais pour un chemin vers un exécutable qu'il faut lancer: +s'assurer qu'il y a une spécification de chemin, e.g. ./script +}}} +!! {{{withinpath}}} +{{{ +Tester si le chemin absolu $2 se trouve dans le chemin absolu "$1" (appelée +barrière). Soit un chemin P, on considère que P est dans P. Si ce comportement +n'est pas souhaité, $3(=N) doit valoir O, auquel cas P est dans Q implique que +P != Q. +}}} +!! {{{safe_abspath}}} +{{{ +Afficher le chemin absolu de $1, par rapport à $2, si et seulement si le +chemin résultat ne se trouve pas en dehors de la barrière $3. Si $2 n'est pas +spécifié, prendre le répertoire courant. S'il est relatif, l'exprimer par +rapport au répertoire courant. Si $3 est relatif, l'exprimer par rapport à $2. +Si le chemin résultat est sité en dehors de la barrière, ne rien afficher et +retourner un code d'erreur. +Si le chemin $1 n'existe pas, il n'est PAS normalisé. Sinon, les meilleurs +efforts sont faits pour normaliser le chemin résultat. +}}} +!! {{{safe_relpath}}} +{{{ +Afficher le chemin relatif de $1 par rapport à $2 si et seulement si le chemin +résultat ne se trouve pas en dehors de la barrière $3. Si $2 n'est pas +spécifié, prendre le répertoire courant. S'il est relatif, l'exprimer par +rapport au répertoire courant. Si $3 est relatif, l'exprimer par rapport à $2. +Si le chemin résultat est sité en dehors de la barrière, ne rien afficher et +retourner un code d'erreur. }}} !! {{{splitwcs}}} {{{ @@ -415,6 +327,18 @@ variable $3(=filespec) {{{ Retourner un chemin absolu vers le fichier $1, dans lequel toutes les composantes "lien symbolique" ont été supprimées. +DEPRECATED: Cette fonction est dépréciée. Utiliser à la place readlinkm() +}}} +!! {{{readlinka}}} +{{{ +Afficher un chemin absolu vers la destination du fichier $1. Si $1 n'est pas +un lien, afficher simplement le chemin du fichier +}}} +!! {{{readlinkm}}} +{{{ +Retourner un chemin absolu vers le fichier $1, dans lequel toutes les +composantes "lien symbolique" ont été supprimées. Il n'est pas requis que les +composantes du chemin existent. }}} !! {{{path_if_test}}} {{{ @@ -423,6 +347,43 @@ l'un des chemins absolus $4..n. si $3==relative, afficher le chemin relatif, sinon le chemin absolu. note: $3 peut être de la forme relative:path, auquel cas le chemin affiché est exprimé relativement à path }}} +!! {{{update_link}}} +{{{ +mettre à jour le lien $2 pour qu'il pointe vers le fichier $1 +}}} +!! {{{update_links}}} +{{{ +Mettre à jour les liens $2..@ pour qu'ils pointent vers la nouvelle +destination $1 +}}} +!! {{{move_link}}} +{{{ +Déplacer le lien $1 vers $2, et mettre à jour la destination du lien si +elle est exprimée de façon relative +Si $1 n'est pas un lien, le déplacer normalement avec mv +}}} +!! {{{copy_link}}} +{{{ +Copier le lien $1 vers $2, et mettre à jour la destination du lien si +elle est exprimée de façon relative +Si $1 n'est pas un lien, le copier normalement avec cp +}}} +!! {{{array_find_links}}} +{{{ +Chercher dans le répertoire $3 (qui est par défaut le répertoire courant) +les liens vers le fichier $2, et ajouter leurs chemins absolus dans le +tableau $1 +}}} +!! {{{list_links}}} +{{{ +Chercher dans le répertoire $2 les liens vers le fichier $1, et les +afficher, un par ligne. +}}} +!! {{{move_file}}} +{{{ +Déplacer le fichier $1 vers $2, et mettre à jour les liens $3..@ pour +qu'ils pointent vers la nouvelle destination +}}} !! {{{get_nblines}}} {{{ Afficher le nombre de lignes d'un fichier @@ -460,6 +421,10 @@ tester si deux fichiers sont identiques tester si deux fichiers sont identiques/différents }}} !! {{{testdiff}}} +!! {{{testupdated}}} +{{{ +test si $2 n'existe pas ou si $1 est différent de $2 +}}} !! {{{testnewer}}} {{{ test si $2 n'existe pas ou si $1 est plus récent que $2 @@ -496,6 +461,38 @@ tester si un programme dont on donne le PID tourne {{{ Lancer sed sur un fichier en le modifiant en place }}} +!! {{{csort}}} +{{{ +Lancer sort avec LANG=C pour éviter les problèmes avec la locale. en effet, +avec LANG!=C, sort utilise les règles de la locale pour le tri, et par +exemple, avec LANG=fr_FR.UTF-8, la locale indique que les ponctuations doivent +être ignorées. +}}} +!! {{{lsort}}} +!! {{{cgrep}}} +{{{ +Lancer grep avec LANG=C pour éviter les problèmes avec la locale. cf csort +pour une explication. +}}} +!! {{{lgrep}}} +!! {{{csed}}} +{{{ +Lancer sed avec LANG=C pour éviter les problèmes avec la locale. cf csort pour +une explication. +}}} +!! {{{lsed}}} +!! {{{cawk}}} +{{{ +Lancer awk avec LANG=C pour éviter les problèmes avec la locale. cf csort pour +une explication. +}}} +!! {{{lawk}}} +!! {{{cdiff}}} +{{{ +Lancer diff avec LANG=C pour éviter les problèmes avec la locale. cf csort +pour une explication. +}}} +!! {{{ldiff}}} !! {{{fix_mode}}} {{{ Si le fichier $1 n'est pas writable, le rendre writable temporairement. Si @@ -528,11 +525,14 @@ non. Cette fonction existe parce que le comportement de "cp_a src dest" n'est pas consistant selon les plateformes, surtout si src est un lien symbolique sur un répertoire: parfois on copie le lien, parfois on copie le contenu du répertoire, parfois on copie le répertoire... +La copie est faite avec rsync si possible. Les options du tableau +__CPDIR_RSYNC_ARGS sont rajoutées aux options standard de rsync. }}} !! {{{cpnovcs}}} {{{ copier le fichier/répertoire $1 *dans* le *répertoire* $2 avec rsync. Les -options du tableau CPNOVCS_OPTS sont rajoutées aux options standard de rsync. +options du tableau __CPNOVCS_RSYNC_ARGS sont rajoutées aux options standard +de rsync. Si $1 est un répertoire, la copie est faite en ignorant les sous-répertoires de VCS (.svn, CVS). En ce qui concerne les répertoire de VCS, git aussi est supporté, mais uniquement s'il est à la racine du transfert. @@ -540,6 +540,10 @@ Si $1 se termine par un '/', c'est le contenu du répertoire qui est copié, pas le répertoire lui-même. Si rsync n'est pas trouvé sur le système, alors on fait une copie standard qui inclue les répertoires de VCS. }}} +!! {{{cpvcs}}} +{{{ +comme cpnovcs, mais ne pas ignorer les répertoires de VCS +}}} !! {{{cpdirnovcs}}} {{{ Le pendant de cpdir, mais en ignorant les sous-répertoires de VCS: copier le @@ -565,19 +569,21 @@ Supprimer les caractères de fin de ligne de la chaine en entrée !! {{{nl2cr}}} !! {{{list_all}}} {{{ -lister les fichiers ou répertoires du répertoire $1, un par ligne +Lister les fichiers ou répertoires du répertoire $1, un par ligne +Les répertoires . et .. sont enlevés de la liste $1=un répertoire dont le contenu doit être listé $2..@=un ensemble de patterns pour le listage }}} !! {{{list_files}}} {{{ -lister les fichiers du répertoire $1, un par ligne +Lister les fichiers du répertoire $1, un par ligne $1=un répertoire dont le contenu doit être listé. $2..@=un ensemble de patterns pour le listage }}} !! {{{list_dirs}}} {{{ -lister les répertoires du répertoire $1, un par ligne +Lister les répertoires du répertoire $1, un par ligne +Les répertoires . et .. sont enlevés de la liste $1=un répertoire dont le contenu doit être listé. $2..@=un ensemble de patterns pour le listage }}} @@ -599,6 +605,15 @@ Lister les fichiers avec `list_files $2 $3...`, et les mettre dans le tableau $1. Le tableau contient les chemins complets, par seulement les noms comme avec list_files }}} +!! {{{filter_empty}}} +{{{ +Filtrer l'entrée standard en enlevant les lignes vides +}}} +!! {{{filter_vcspath}}} +{{{ +L'entrée standard étant une liste de chemins, filtrer les fichiers et +répertoire qui ont un rapport avec subversion ou git +}}} !! {{{merge_contlines}}} {{{ Avec les lignes lues sur stdin, fusionner celles qui se terminent par \ avec @@ -631,10 +646,30 @@ tester si l'extension d'un fichier indique que c'est une archive {{{ Extraire le contenu de l'archive $1 dans le répertoire ${2:-.} }}} +!! {{{get_archive_basename}}} +{{{ +Obtenir le nom de base de l'archive $1 +}}} !! {{{get_archive_appname}}} {{{ Obtenir le nom probable de l'application ou du framework contenu dans -l'archive $1 +l'archive $1, e.g: +get_archive_versionsuffix app-0.1.tgz +--> app +}}} +!! {{{get_archive_versionsuffix}}} +{{{ +Obtenir la valeur probable de la version de l'application ou du framework +contenu dans l'archive $1, avec le caractère de séparation, e.g: +get_archive_versionsuffix app-0.1.tgz +--> -0.1 +}}} +!! {{{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 +--> 0.1 }}} !! {{{dump_usernames}}} {{{ @@ -644,8 +679,13 @@ le homedir se trouve dans /home, et dont l'uid est >=500 }}} !! {{{resolv_ips}}} {{{ -Placer dans le tableau $1 la liste des adresses ip correspondant à l'hôte -$2. Utiliser la commande host pour faire la résolution +Placer dans le tableau $1(=ips) la liste des adresses ip correspondant à +l'hôte $2. La résolution est effectuée avec la commande host. +}}} +!! {{{resolv_hosts}}} +{{{ +Placer dans le tableau $1(=hosts) la liste des hôtes correspondant à +l'adresse ip $2. La résolution est effectuée avec la commande host. }}} !! {{{runscript_as}}} {{{ @@ -679,6 +719,74 @@ retourne. Sinon, on peut considérer que cette fonction ne retourne jamais relancer le script courant afin qu'il tourne en root si on est pas en déjà root. Sinon, cette fonction est un nop. }}} +!! {{{check_user}}} +{{{ +Vérifier si le user courant est l'un des users $1..* +}}} +!! {{{ensure_user}}} +{{{ +Vérifier si le user courant est l'un des users $1..N où N est la position du +premier "--". Si ce n'est pas le cas et que l'on est root, relancer le script +avec ce user grâce à la fonction run_as() +Retourner 1 si ce n'était pas le bon user. Retourner 10 si ce n'était pas le +bon user et que l'on n'est pas root (donc impossible à priori de relancer le +script avec le bon user). Retourner 11 si l'utilisateur a choisi de ne pas +lancer le script avec le bon utilisateur +A utiliser de cette manière: +if ensure_user users... -- args; then +# ... on est avec le bon user; faire les opérations +else +# ... ce code n'est exécuté que si une erreur s'est produite, ou si ce +# n'était pas le bon user et que l'option --noexec est utilisée +fi +}}} +!! {{{check_hostname}}} +{{{ +Vérifier si le hostname courant est l'un des hôtes $1..* +localhost matche toujours +}}} +!! {{{check_userhostname}}} +{{{ +Vérifier si le hostname et éventuellement le user courant sont l'un des +arguments $1..* +Chaque argument est de la forme [user@]host, mais le test ne tient compte que +du nom de l'hôte, sans tenir compte du domaine. Si le user n'est pas spécifié, +le test ne porte que sur hostname. +}}} +!! {{{ensure_hostname}}} +{{{ +Vérifier si le hostname et le user courant sont l'un des arguments $1..* +Chaque argument est de la forme [user@]host, mais le test ne tient compte que +du nom de l'hôte, sans tenir compte du domaine. +Si user est spécifié: +- Si on est sur le bon hôte mais pas le bon user, ensure_user est lancé avec +l'argument approprié pour relancer le script +Si l'argument était de la forme userhost:path, le répertoire courant est +changé avant de lancer le script avec le bon utilisateur. +Sinon (si user n'est pas spécifié): +- Si on n'est pas sur le bon hôte, après confirmation le script est lancé avec +ssh sur l'hôte distant avec le user spécifié (qui vaut par défaut root). Ce +script DOIT exister sur l'hôte distant avec le même chemin. +Si l'argument était de la forme userhost:path, le répertoire courant distant +est changé avant de lancer le script +Si on est avec le bon user sur le bon hôte, le répertoire courant n'est jamais +changé. +Retourner 1 si ce n'était pas le bon user. Retourner 10 si ce n'était pas le +bon user et que l'on n'est pas root (donc impossible à priori de relancer le +script avec le bon user). Retourner 11 si l'utilisateur a choisi de ne pas +lancer le script sur l'hôte distant. Retourner 12 si une erreur s'est produite +avec ssh. +A utiliser de cette manière: +if ensure_hostname user@host... -- args; then +# ... on est [avec le bon user] sur le bon hôte; faire les opérations +else +# ... ce code n'est exécuté que si une erreur s'est produite, ou si ce +# n'était pas le bon user et que l'option --noexec est utilisée +fi +}}} +!! {{{sqvals}}} +!! {{{quoted_values}}} +!! {{{formatcsv}}} !! {{{awkdef}}} {{{ Afficher un script à insérer au début d'un script awk. Ce script définit dans @@ -688,44 +796,29 @@ variable, l'analyse des variables s'arrête et le reste des arguments est inséré tel quel. Cette fonction peut être utilisée de cette manière: awk "$(awkdef -f var=value... 'script awk')" Normalement, les variables définies sont scalaires, avec une syntaxe de la -forme var=var. +forme var[:type]=value. type peut valoir str ou int, pour forcer le type de la +variable créée dans awk. Il est possible d'utiliser la syntaxe awk_array[@]=bash_array ou array[@] (qui est équivalente à array[@]=array) pour initialiser le tableau awk_array, qui contiendra toute les valeurs du tableau nommé bash_array, avec les indices de 1 à N, N étant le nombre d'éléments du tableau bash_array. La variable awk_array_count est aussi initialisée, et contient le nombre d'éléments du tableau -Avec l'option -f, les fonctions suivantes sont définies: -- quote_value(s) permet de quoter une valeur pour le shell. la valeur est -entourée de quotes, e.g: -quote_value("here, \"there\" and 'everywhere'.") ---> 'here, "there" and '\''everywhere'\''.' -- quote_grep(s) permet de quoter une valeur pour un pattern *simple* de -grep. Les caractères suivants sont mis en échappement: \ . [ ^ $ * -- quote_egrep(s) permet de quoter une valeur pour un pattern *étendu* de -grep. Les caractères suivants sont mis en échappement: \ . [ ^ $ ? + * ( ) | { -- mkindices(values, indices) créer le tableau indices qui contient les -indices du tableau values, de 1 à N, et retourner la valeur N. Il faudra -utiliser les valeurs de cette manière: -count = mkindices(values, indices) -for (i = 1; i <= count; i++) { -value = values[indices[i]] -... -} +La syntaxe "awk_array[@]=<\n..." permet de spécifier les valeurs du tableau, +une par ligne, e.g: +$'values[@]=<\nvalue1\nvalue2' +pour un tableau values qui contiendra deux valeurs: value1 et value2 +Avec l'option -f, des fonctions supplémentaires sont définies. Elles sont +décrites dans le module awk. }}} -!! {{{awkrun}}} +!! {{{lawkrun}}} {{{ wrapper pour lancer awk avec un script préparé par awkdef. Les définitions et les arguments sont séparés par --, e.g. -awkrun var0=value0 var1=value1 -- input0 input1 -}}} -!! {{{parse_opts}}} -{{{ -Analyser des arguments. Cette fonction doit être appelée avec une description -des options à analyser, suivie des arguments proprement dits. En fonction des -options rencontrées, certaines variables sont mises à jour. -Les arguments de cette fonction sont donc de la forme 'optdescs -- args' +awkrun var0=value0 var1=value1 script -- input0 input1 }}} +!! {{{cawkrun}}} +!! {{{awkrun}}} !! {{{lf_trylock}}} {{{ USAGE @@ -766,7 +859,7 @@ spécifier le pid. par défaut, utiliser $$ -r si pidfile existe mais que le processus ne tourne plus, faire comme si le fichier n'existe pas. Retourner 0 si le pid a été correctement écrit dans le fichier. Ce fichier -sera supprimmé automatiquement en fin de script +sera supprimé automatiquement en fin de script Retourner 1 si le fichier existe déjà et que le processus est en train de tourner. Retourner 2 si le fichier existe déjà mais que le processus ne tourne plus. @@ -785,9 +878,40 @@ est en train de tourner. Retourner 0 si le fichier de pid existe et que le process du pid spécifié est en train de tourner. Retourner 1 sinon. Retourner 10 si erreur grave s'est produite (par exemple, s'il manque le -chemin vers pidfile, ou si le fichier n'est pas accessible en écriture.) +chemin vers pidfile, ou si le fichier n'est pas accessible en lecture.) +}}} +!! {{{page_maybe}}} +{{{ +Utiliser less, si possible, pour afficher le flux en entrée. Si le terminal +n'est pas interactif ou si le nombre de lignes en entrée est inférieur au +nombre de lignes du terminal, afficher simplement le flux. +Les arguments de cette fonction sont passés à less +}}} +!! {{{utools_local}}} +{{{ +Afficher les commandes pour rendre locales certaines variables en fonction des +arguments: +- opts rend locale args, pour utiliser parse_opts() à l'intérieur d'une +fonction. +- verbosity et interaction rendent respectivement locales __verbosity et +__interaction. Ceci est utile pour pouvoir appeler sans risque de pollution +de l'environnement une fonction qui utilise parse_opts() avec les +définitions de PRETTYOPTS. +Si aucun arguments n'est fourni, toutes les définitions sont affichées. +}}} +!! {{{stdredir}}} +{{{ +Lancer la commande $4..@ en redirigeant stdin depuis $1, stdout vers $2, +stderr vers $3. Si $1 est vide ou vaut /dev/stdin, la redirection n'est +pas faite. Si $2 est vide ou vaut /dev/stdout, la redirection n'est pas +faite. Si $3 est vide ou vaut /dev/stderr, la redirection n'est pas faite. +Cette fonction existe parce que sur certaines versions de bash, il semble +que les redirections /dev/std* ne sont pas traitées de façon particulière. +De plus, sur des technologies telles que OpenVZ, les chemins /dev/std* ne +sont pas créés (parce que /proc/self/fd/* n'est pas accessible). Donc, +dans de rares cas où le script tourne sur OpenVZ avec une version de bash +qui est buggée, la redirection n'est pas faite correctement. }}} -!! {{{echo_}}} !! {{{isatty}}} {{{ tester si STDOUT n'est pas une redirection @@ -805,6 +929,37 @@ tester si STDOUT n'est pas une redirection tester si STDERR n'est pas une redirection }}} !! {{{die}}} +!! {{{die_unless}}} +{{{ +Afficher $-1 et quitter le script avec die() si la commande $1..-2 retourne +FAUX +}}} +!! {{{eerror_unless}}} +{{{ +Afficher $-1 avec eerror() et retourner $? si la commande $1..-2 retourne FAUX +}}} +!! {{{die_if}}} +{{{ +Afficher $-1 et quitter le script avec die() si la commande $1..-2 retourne +VRAI +}}} +!! {{{eerror_if}}} +{{{ +Afficher $-1 avec eerror() et retourner le code d'erreur 1 si la commande +$1..-2 retourne VRAI +}}} +!! {{{noerror}}} +{{{ +lancer la commande "$@" et masquer son code de retour +}}} +!! {{{noout}}} +{{{ +lancer la commande "$@" en supprimant sa sortie standard +}}} +!! {{{noerr}}} +{{{ +lancer la commande "$@" en supprimant sa sortie d'erreur +}}} !! {{{tooenc}}} {{{ Transformer la valeur $1 de l'encoding $2(=$OENC) vers l'encoding de sortie @@ -846,6 +1001,8 @@ Si la redirection est activée, forcer l'utilisation de l'encoding UTF8 Si UTOOLS_ELOG_OVERWRITE=1, alors le fichier en sortie est écrasé. Sinon, les lignes en sortie lui sont ajoutées }}} +!! {{{set_verbosity}}} +!! {{{set_interaction}}} !! {{{show_error}}} {{{ tester respectivement si on doit afficher les messages d'erreur, @@ -853,9 +1010,13 @@ d'avertissement, d'information, de debug }}} !! {{{show_warn}}} !! {{{show_info}}} +!! {{{show_verbose}}} !! {{{show_debug}}} !! {{{check_verbosity}}} +!! {{{get_verbosity_option}}} !! {{{check_interaction}}} +!! {{{is_interaction}}} +!! {{{get_interaction_option}}} !! {{{eflush}}} {{{ Afficher les messages en attente @@ -901,6 +1062,17 @@ Afficher un message d'information sans préfixe {{{ Afficher un message de debug }}} +!! {{{trace}}} +{{{ +Afficher la commande $1..@, la lancer, puis afficher son code d'erreur si une +erreur se produit +}}} +!! {{{trace_error}}} +{{{ +Lancer la commande $1..@, puis afficher son code d'erreur si une erreur se +produit. La différence avec trace() est que la commande n'est affichée que si +une erreur se produit. +}}} !! {{{etitle}}} {{{ Afficher le titre $1, qui est le début éventuel d'une section. Les section @@ -974,6 +1146,14 @@ cette valeur est donnée) Si la section en cours est un etitle, marquer la fin de la section concernée par le titre. }}} +!! {{{elinedots}}} +{{{ +Afficher un message comme avec ebegin "$1", puis afficher un point '.' pour +chaque ligne lue sur stdin. Cela permet de suivre une opération. En mode +DEBUG, afficher la ligne affichée plutôt qu'un point. +Si $2..$* sont spécifiés, lancer la commande et suivre sa sortie. Ainsi, +'elinedots msg cmd args' est un raccourci pour 'cmd args | elinedots msg' +}}} !! {{{ask_yesno}}} {{{ Afficher le message $1 suivi de [oN] ou [On] suivant que $2 vaut O ou N, puis @@ -1009,27 +1189,80 @@ $2(=options). L'option choisie est placée dans la variable $1(=option) -d DEFAULT: spécifier l'option par défaut. Par défaut, prendre la valeur actuelle de la variable $1(=option) }}} +!! {{{actions_menu}}} +{{{ +Afficher un menu dont les éléments sont les valeurs du tableau $4(=options), +et une liste d'actions tirées du tableau $3(=actions). L'option choisie est +placée dans la variable $2(=option). L'action choisie est placée dans la +variable $1(=action) +Un choix est saisi sous la forme [action]num_option +-t TITLE: spécifier le titre du menu +-m OPT_YOUR_CHOICE: spécifier le message d'invite pour la sélection de +l'action et de l'option +-M ACT_YOUR_CHOICE: spécifier le message d'invite dans le cas où aucune option +n'est disponible. Dans ce cas, seules les actions vides sont possibles. +-e VOID_ACTION: spécifier qu'une action est vide, c'est à dire qu'elle ne +requière pas d'être associée à une option. Par défaut, la dernière action +est classée dans cette catégorie puisque c'est l'action "quitter" +-d DEFAULT_ACTION: choisir l'action par défaut. par défaut, c'est la première +action. +-q QUIT_ACTION: choisir l'option "quitter" qui provoque la sortie du menu sans +choix. par défaut, c'est la dernière action. +-o DEFAULT_OPTION: choisir l'option par défaut. par défaut, prendre la valeur +actuelle de la variable $2(=option) +}}} !! {{{autoclean}}} {{{ Ajouter $1..$n à la liste des fichiers à supprimer à la fin du programme }}} +!! {{{ac_cleanall}}} +{{{ +Supprimer *tous* les fichiers temporaires gérés par autoclean tout de suite. +}}} +!! {{{ac_clean}}} +{{{ +Supprimer les fichier temporaires $1..$* si et seulement s'ils ont été générés +par ac_set_tmpfile ou ac_set_tmpdir +}}} !! {{{ac_set_tmpfile}}} {{{ Créer un fichier temporaire avec le motif $2, l'ajouter à la liste des fichiers à supprimer en fin de programme, et mettre sa valeur dans la variable $1 +En mode debug, si ($5 est vide ou ${!5} est une valeur vraie), et si $3 n'est +pas vide, prendre ce fichier au lieu de générer un nouveau fichier +temporaire. Si $4==keep, ne pas écraser le fichier $3 s'il existe. }}} !! {{{ac_set_tmpdir}}} {{{ Créer un répertoire temporaire avec le motif $2, l'ajouter à la liste des fichiers à supprimer en fin de programme, et mettre sa valeur dans la variable $1 +En mode debug, si ($4 est vide ou ${!4} est une valeur vraie), et si $3 n'est +pas vide, prendre ce nom de répertoire au lieu de créer un nouveau répertoire +temporaire +}}} +!! {{{debug_tee}}} +{{{ +En mode debug, passer le flux à travers la commande 'tee "$@"'. Sinon, le flux +est passé inchangé. +}}} +!! {{{get_user_defaults_file}}} +{{{ +Afficher le chemin vers le fichier utilisateur à éditer pour qu'il soit chargé +par 'set_defaults $1'. Ce fichier n'existe pas forcément; il faut peut-être le +créer. +}}} +!! {{{get_defaults_files}}} +{{{ +Initialiser le tableau $1(=defaults) avec la liste des fichiers qui seraient +chargés par la commande 'set_defaults $2..N' }}} !! {{{set_defaults}}} {{{ -Pour chaque argument, sourcer /etc/default/$arg *et* ~/etc/default/$arg si -ceux-ci existent. *Sinon*, lire $scriptdir/lib/default/$arg si ce fichier -existe +Pour chaque argument, sourcer /etc/default/$arg *et* (en priorité +~/etc/default.$HOSTNAME/$arg ou à défaut ~/etc/default/$arg) si ceux-ci +existent. *Sinon*, lire $scriptdir/lib/default/$arg si ce fichier existe }}} !! {{{myhost}}} {{{ diff --git a/doc/ulib_base.ulib.md b/doc/ulib_base.ulib.md new file mode 100644 index 0000000..3e3e8f2 --- /dev/null +++ b/doc/ulib_base.ulib.md @@ -0,0 +1,4 @@ +# ulib/base.ulib + + +-*- 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.ulib.twp b/doc/ulib_base.ulib.twp new file mode 100644 index 0000000..064b5ad --- /dev/null +++ b/doc/ulib_base.ulib.twp @@ -0,0 +1,8 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: ulib/base.ulib + diff --git a/doc/ulib_bash.md b/doc/ulib_bash.md new file mode 100644 index 0000000..6a991f6 --- /dev/null +++ b/doc/ulib_bash.md @@ -0,0 +1,4 @@ +# ulib/bash + + +-*- 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_cgi.md b/doc/ulib_cgi.md new file mode 100644 index 0000000..f7f27ff --- /dev/null +++ b/doc/ulib_cgi.md @@ -0,0 +1,50 @@ +# ulib/cgi + +## `is_cgi` +~~~ +Tester si on est lancé comme un script CGI +~~~ +## `ctype_header` +~~~ +Générer une en-tête Content-Type: avec la valeur $1[=text/html] +~~~ +## `cdisp_header` +~~~ +Générer une en-tête Content-Disposition: avec le type $2[=attachment] et +le nom de fichier $1[=result] +~~~ +## `nocache_header` +~~~ +Générer des en-têtes qui désactivent la mise en cache du contenu +~~~ +## `cgicontent` +~~~ +Générer les en-têtes nécessaire avant de servir le contenu. +$1(=text/html) est le type de contenu. S'il faut servir le contenu avec +une disposition "attachment", $2 est le nom de fichier à proposer à +l'utilisateur. Si $3 est spécifié, c'est le chemin vers le fichier dont le +contenu doit être servi. +$4..* sont des en-têtes supplémentaires à rajouter +~~~ +## `cgicontent_nocache` +~~~ +Générer les en-têtes nécessaire avant de servir le contenu. Rajouter les +entêtes pour désactiver la mise en cache. +$1(=text/html) est le type de contenu. S'il faut servir le contenu avec +une disposition "attachment", $2 est le nom de fichier à proposer à +l'utilisateur. Si $3 est spécifié, c'est le chemin vers le fichier dont le +contenu doit être servi. +$4..* sont des en-têtes supplémentaires à rajouter +~~~ +## `cgierror` +~~~ +Afficher les en-têtes pour désactiver la mise en cache, puis afficher un +message d'erreur puis arrêter le script +~~~ +## `cgiredirect` +~~~ +Afficher les en-têtes pour rediriger le client vers la page $1 puis +arrêter le script +~~~ + +-*- 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_cgi.twp b/doc/ulib_cgi.twp new file mode 100644 index 0000000..e890043 --- /dev/null +++ b/doc/ulib_cgi.twp @@ -0,0 +1,54 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: ulib/cgi + +!! {{{is_cgi}}} +{{{ +Tester si on est lancé comme un script CGI +}}} +!! {{{ctype_header}}} +{{{ +Générer une en-tête Content-Type: avec la valeur $1[=text/html] +}}} +!! {{{cdisp_header}}} +{{{ +Générer une en-tête Content-Disposition: avec le type $2[=attachment] et +le nom de fichier $1[=result] +}}} +!! {{{nocache_header}}} +{{{ +Générer des en-têtes qui désactivent la mise en cache du contenu +}}} +!! {{{cgicontent}}} +{{{ +Générer les en-têtes nécessaire avant de servir le contenu. +$1(=text/html) est le type de contenu. S'il faut servir le contenu avec +une disposition "attachment", $2 est le nom de fichier à proposer à +l'utilisateur. Si $3 est spécifié, c'est le chemin vers le fichier dont le +contenu doit être servi. +$4..* sont des en-têtes supplémentaires à rajouter +}}} +!! {{{cgicontent_nocache}}} +{{{ +Générer les en-têtes nécessaire avant de servir le contenu. Rajouter les +entêtes pour désactiver la mise en cache. +$1(=text/html) est le type de contenu. S'il faut servir le contenu avec +une disposition "attachment", $2 est le nom de fichier à proposer à +l'utilisateur. Si $3 est spécifié, c'est le chemin vers le fichier dont le +contenu doit être servi. +$4..* sont des en-têtes supplémentaires à rajouter +}}} +!! {{{cgierror}}} +{{{ +Afficher les en-têtes pour désactiver la mise en cache, puis afficher un +message d'erreur puis arrêter le script +}}} +!! {{{cgiredirect}}} +{{{ +Afficher les en-têtes pour rediriger le client vers la page $1 puis +arrêter le script +}}} diff --git a/doc/ulib_cgisupport.md b/doc/ulib_cgisupport.md new file mode 100644 index 0000000..8303d3a --- /dev/null +++ b/doc/ulib_cgisupport.md @@ -0,0 +1,7 @@ +# ulib/cgisupport + +## `cgiparams` +## `cgilsxml` +## `cgiupload` + +-*- 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_cgisupport.twp b/doc/ulib_cgisupport.twp new file mode 100644 index 0000000..b2896cf --- /dev/null +++ b/doc/ulib_cgisupport.twp @@ -0,0 +1,11 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: ulib/cgisupport + +!! {{{cgiparams}}} +!! {{{cgilsxml}}} +!! {{{cgiupload}}} diff --git a/doc/ulib_compat.md b/doc/ulib_compat.md new file mode 100644 index 0000000..a9991aa --- /dev/null +++ b/doc/ulib_compat.md @@ -0,0 +1,4 @@ +# ulib/compat + + +-*- 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 new file mode 100644 index 0000000..3179749 --- /dev/null +++ b/doc/ulib_conf.md @@ -0,0 +1,192 @@ +# ulib/conf + +## `conf_enable` +~~~ +Dans le fichier de configuration $1, activer les paramètres $2..* +Chaque argument de cette fonction correspond à une directive du fichier de +configuration et doit être de la forme name[=value] +Dans tous les cas, toutes les directives de ce nom sont recherchées et +décommentées. Si value est précisée, les directives sont mises à jour. Si +la directive ne figure pas dans le fichier, elle y est rajoutée à la fin +avec la valeur spécifiée. +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. +~~~ +## `conf_disable` +~~~ +Dans le fichier de configuration $1, désactiver les paramètres $2..* +Chaque argument de cette fonction correspond à une directive du fichier de +configuration et doit être de la forme name[=value] +Toutes les directives de ce noms sont recherchées et commentées. La valeur +si elle est spécifiée, est ignorée. Si la directive ne figure pas dans le +fichier, c'est un NOP. +Retourner 0 si une modification a été faite dans le fichier, 1 sinon +~~~ +## `conf_append` +~~~ +Dans le fichier de configuration $1, augmenter les valeurs des variables +correspondant aux paramètres $2..* +Chaque argument de cette fonction correspond à une variable du fichier de +configuration, et doit être de la forme name=value +Une ligne 'name="${name:+$name:}$value"' est générée à la fin du fichier +de configuration. +Par défaut, le séparateur CONF_APPEND_SEP vaut ':', mais il est possible +de changer cette valeur, de façon globale +Retourner 0 si une modification a été faite dans le fichier, 1 sinon +~~~ +## `conf_array_append` +~~~ +Dans le fichier de configuration $1, augmenter les valeurs des variables +de tableau correspondant aux paramètres $2..* +Chaque argument de cette fonction correspond à une variable du fichier de +configuration, et doit être de la forme name=value +Une ligne name=("${name[@]}" "$value") est générée à la fin du fichier de +configuration +Retourner 0 si une modification a été faite dans le fichier, 1 sinon +~~~ +## `conf_check` +~~~ +Dans le fichier de configuration $1, tester si tous les paramètres $2..* +sont présents. +Chaque argument de cette fonction correspond à une variable du fichier de +configuration, et doit être de la forme name[=value] +Si une valeur est spécifiée, vérifier que le fichier contient la valeur +correspondante. Sinon, tester uniquement la présence de la directive. +~~~ +## `aconf_enable` +~~~ +Dans le fichier de configuration $1, activer les paramètres $2..* +Chaque argument de cette fonction correspond à une directive du fichier de +configuration et doit être de la forme name[=value] +Toutes les directives de ce nom sont recherchées et décommentées, et la +valeur mise à jour. Si la directive ne figure pas dans le fichier, elle y +est rajoutée à la fin. A cause du mode opératoire, cette fonction ne +convient pas pour les directives dont le nom peut apparaitre plusieurs +fois dans le fichier +Retourner 0 si une modification a été faite dans le fichier, 1 sinon +~~~ +## `aconf_disable` +~~~ +Dans le fichier de configuration $1, désactiver les paramètres $2..* +Chaque argument de cette fonction correspond à une directive du fichier de +configuration et doit être de la forme name[=value] +Si la valeur est précisée, la directive correspondant à ce nom et cette +valeur est recherchée et commentée. Sinon, toutes les directives de ce +noms sont recherchées et commentées. Si la directive ne figure pas dans le +fichier, c'est un NOP. +Retourner 0 si une modification a été faite dans le fichier, 1 sinon +~~~ +## `aconf_append` +~~~ +Dans le fichier de configuration $1, ajouter des directives correspondant +aux paramètres $2..* +Chaque argument de cette fonction correspond à une directive du fichier de +configuration et doit être de la forme name=value +Une ligne '$name $value' est ajoutée à la fin du fichier de configuration +Retourner 0 si une modification a été faite dans le fichier, 1 sinon +~~~ +## `aconf_array_append` +## `aconf_check` +~~~ +Dans le fichier de configuration $1, tester si tous les paramètres $2..* +sont présents. +Chaque argument de cette fonction correspond à une variable du fichier de +configuration, et doit être de la forme name[=value] +Si une valeur est spécifiée, vérifier que le fichier contient la valeur +correspondante. Sinon, tester uniquement la présence de la directive. +~~~ +## `mconf_enable` +~~~ +Dans le fichier de configuration $1, activer les paramètres $3..* de la +section $2 +Chaque argument de cette fonction correspond à une directive du fichier de +configuration et doit être de la forme name[=value] +Toutes les directives de ce nom sont recherchées et décommentées, et la +valeur mise à jour. Si la directive ne figure pas dans le fichier, elle y +est rajoutée à la fin. A cause du mode opératoire, cette fonction ne +convient pas pour les directives dont le nom peut apparaitre plusieurs +fois dans le fichier +Retourner 0 si une modification a été faite dans le fichier, 1 sinon +Cette fonction nécessite gawk et ignore la locale +~~~ +## `mconf_disable` +~~~ +Dans le fichier de configuration $1, désactiver les paramètres $3..* de la +section $2. +Chaque argument de cette fonction correspond à une directive du fichier de +configuration et doit être de la forme name[=value] +Si la valeur est précisée, la directive correspondant à ce nom et cette +valeur est recherchée et commentée. Sinon, toutes les directives de ce +noms sont recherchées et commentées. Si la directive ne figure pas dans le +fichier, c'est un NOP. +Retourner 0 si une modification a été faite dans le fichier, 1 sinon +Cette fonction nécessite gawk et ignore la locale +~~~ +## `mconf_append` +~~~ +Dans le fichier de configuration $1, ajouter des directives correspondant +aux paramètres $3..* dans la section $2 +Chaque argument de cette fonction correspond à une directive du fichier de +configuration et doit être de la forme name=value +Une ligne '$name = $value' est ajoutée à la fin de la section, qui est +créée si nécessaire à la fin du fichier de configuration +Retourner 0 si une modification a été faite dans le fichier, 1 sinon +Cette fonction nécessite gawk et ignore la locale +~~~ +## `mconf_array_append` +## `mconf_check` +~~~ +Dans le fichier de configuration $1, tester si tous les paramètres $3..* +sont présents dans la section $2 +Chaque argument de cette fonction correspond à une variable du fichier de +configuration, et doit être de la forme name[=value] +Si une valeur est spécifiée, vérifier que le fichier contient la valeur +correspondante. Sinon, tester uniquement la présence de la directive. +Cette fonction nécessite gawk et ignore la locale +~~~ +## `gconf_addline` +~~~ +USAGE +gconf_addline configfile -a BEGIN -z END NEWLINE +Dans le fichier de configuration $1, ajouter la ligne NEWLINE entre les lignes +BEGIN et END. +-a BEGIN +Spécifier une expression pour matcher une ligne de type BEGIN. Si +cette option n'est pas spécifiée, on considère que le début de fichier +matche la ligne BEGIN: la ligne NEWLINE est ajoutée dès que possible. +Les lignes sont matchées dans l'ordre, i.e. avec '-a 1 -a 2', il faut +d'abord trouver la ligne 1 puis la ligne 2, sinon, le test n'est pas +concluant. +-t LINE +Si après avoir matché toutes les lignes BEGIN, la ligne LINE est +rencontrée, alors considérer que la ligne à rajouter existe déjà et +qu'il ne faut pas la rajouter de nouveau +-r LINE +Si après avoir matché toutes les lignes BEGIN, la ligne LINE est +rencontrée, alors considérer que la ligne à rajouter existe et qu'il +faut la mettre à jour. Supprimer la ligne existante et la remplacer +par la nouvelle ligne. +-z END +Spécifier une expression pour matcher la ligne de type END. Que cette +option soit ou non spécifiée, on considère toujours que la fin de +fichier matche la ligne END. Ainsi, si END n'est pas trouvée, la ligne +NEWLINE est ajoutée à la fin du fichier. +Dès que la ligne END est rencontrée, et si aucun des tests -t ou -r +n'est concluant, alors ajouter la nouvelle ligne avant celle-ci +-n MAX[=1] +Ajouter au plus MAX occurences de NEWLINE. Après avoir matché END, le +cycle recommence, au plus MAX-1 fois. Utiliser MAX=-1 pour désactiver +la limite +Cette fonction nécessite gawk et ignore la locale +Retourner 0 si l'ajout s'est fait correctement. Retourner 1 si BEGIN n'a +pas été trouvé, et donc aucun ajout n'a été effectué. Retourner 2 si une +erreur quelconque s'est produite +~~~ +## `writelines_maybe` + +-*- 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.twp b/doc/ulib_conf.twp index a801678..7befa96 100644 --- a/doc/ulib_conf.twp +++ b/doc/ulib_conf.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:15 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -118,7 +118,7 @@ est rajoutée à la fin. A cause du mode opératoire, cette fonction ne convient pas pour les directives dont le nom peut apparaitre plusieurs fois dans le fichier Retourner 0 si une modification a été faite dans le fichier, 1 sinon -Cette fonction nécessite gawk +Cette fonction nécessite gawk et ignore la locale }}} !! {{{mconf_disable}}} {{{ @@ -131,7 +131,7 @@ valeur est recherchée et commentée. Sinon, toutes les directives de ce noms sont recherchées et commentées. Si la directive ne figure pas dans le fichier, c'est un NOP. Retourner 0 si une modification a été faite dans le fichier, 1 sinon -Cette fonction nécessite gawk +Cette fonction nécessite gawk et ignore la locale }}} !! {{{mconf_append}}} {{{ @@ -142,7 +142,7 @@ configuration et doit être de la forme name=value Une ligne '$name = $value' est ajoutée à la fin de la section, qui est créée si nécessaire à la fin du fichier de configuration Retourner 0 si une modification a été faite dans le fichier, 1 sinon -Cette fonction nécessite gawk +Cette fonction nécessite gawk et ignore la locale }}} !! {{{mconf_array_append}}} !! {{{mconf_check}}} @@ -153,5 +153,44 @@ Chaque argument de cette fonction correspond à une variable du fichier de configuration, et doit être de la forme name[=value] Si une valeur est spécifiée, vérifier que le fichier contient la valeur correspondante. Sinon, tester uniquement la présence de la directive. -Cette fonction nécessite gawk +Cette fonction nécessite gawk et ignore la locale }}} +!! {{{gconf_addline}}} +{{{ +USAGE +gconf_addline configfile -a BEGIN -z END NEWLINE +Dans le fichier de configuration $1, ajouter la ligne NEWLINE entre les lignes +BEGIN et END. +-a BEGIN +Spécifier une expression pour matcher une ligne de type BEGIN. Si +cette option n'est pas spécifiée, on considère que le début de fichier +matche la ligne BEGIN: la ligne NEWLINE est ajoutée dès que possible. +Les lignes sont matchées dans l'ordre, i.e. avec '-a 1 -a 2', il faut +d'abord trouver la ligne 1 puis la ligne 2, sinon, le test n'est pas +concluant. +-t LINE +Si après avoir matché toutes les lignes BEGIN, la ligne LINE est +rencontrée, alors considérer que la ligne à rajouter existe déjà et +qu'il ne faut pas la rajouter de nouveau +-r LINE +Si après avoir matché toutes les lignes BEGIN, la ligne LINE est +rencontrée, alors considérer que la ligne à rajouter existe et qu'il +faut la mettre à jour. Supprimer la ligne existante et la remplacer +par la nouvelle ligne. +-z END +Spécifier une expression pour matcher la ligne de type END. Que cette +option soit ou non spécifiée, on considère toujours que la fin de +fichier matche la ligne END. Ainsi, si END n'est pas trouvée, la ligne +NEWLINE est ajoutée à la fin du fichier. +Dès que la ligne END est rencontrée, et si aucun des tests -t ou -r +n'est concluant, alors ajouter la nouvelle ligne avant celle-ci +-n MAX[=1] +Ajouter au plus MAX occurences de NEWLINE. Après avoir matché END, le +cycle recommence, au plus MAX-1 fois. Utiliser MAX=-1 pour désactiver +la limite +Cette fonction nécessite gawk et ignore la locale +Retourner 0 si l'ajout s'est fait correctement. Retourner 1 si BEGIN n'a +pas été trouvé, et donc aucun ajout n'a été effectué. Retourner 2 si une +erreur quelconque s'est produite +}}} +!! {{{writelines_maybe}}} diff --git a/doc/ulib_crontab.md b/doc/ulib_crontab.md new file mode 100644 index 0000000..624ef75 --- /dev/null +++ b/doc/ulib_crontab.md @@ -0,0 +1,17 @@ +# ulib/crontab + +## `add_to_crontab` +## `remove_from_crontab` +## `disable_in_crontab` +## `enable_in_crontab` +## `ctnow` +~~~ +date +"%-M %-H %-d %-m %u" +~~~ +## `ctresolve` +## `get_default_crontabdir_prefix` +## `compute_crontab_prefixes` +## `recompute_crontab_prefixes` +## `get_CRONTABDIR_prefix` + +-*- 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_crontab.twp b/doc/ulib_crontab.twp index 7fe7d5c..e765538 100644 --- a/doc/ulib_crontab.twp +++ b/doc/ulib_crontab.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:15 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -8,3 +8,14 @@ !! {{{add_to_crontab}}} !! {{{remove_from_crontab}}} +!! {{{disable_in_crontab}}} +!! {{{enable_in_crontab}}} +!! {{{ctnow}}} +{{{ +date +"%-M %-H %-d %-m %u" +}}} +!! {{{ctresolve}}} +!! {{{get_default_crontabdir_prefix}}} +!! {{{compute_crontab_prefixes}}} +!! {{{recompute_crontab_prefixes}}} +!! {{{get_CRONTABDIR_prefix}}} diff --git a/doc/ulib_debian.md b/doc/ulib_debian.md new file mode 100644 index 0000000..1eb92f9 --- /dev/null +++ b/doc/ulib_debian.md @@ -0,0 +1,175 @@ +# ulib/debian + +## `pkg_check` +~~~ +Vérifier que les packages sont installés sur le système +~~~ +## `pkg_update` +~~~ +Mettre à jour la liste des packages silencieusement sans confirmation +~~~ +## `pkg_upgrade` +~~~ +Mettre à jour la liste des packages silencieusement sans confirmation +~~~ +## `pkg_install` +~~~ +Installer les packages silencieusement et sans confirmation +~~~ +## `pkg_installm` +~~~ +Installer les packages silencieusement et sans confirmation +Retourner 0 si au moins un des packages a été installé. Sinon, les +packages n'ont pas été installés, soit parce qu'ils sont déjà installé, +soit parce qu'il y a eu une erreur. +~~~ +## `pkg_check_install` +~~~ +Si le programme $1 n'existe pas, alors installer les packages $2..$@ +S'il n'y a pas d'arguments $2..$@ utiliser $1 comme nom de package +Retourner 0 si au moins un des packages a été installé +~~~ +## `service_disable` +~~~ +Désactiver le service $1 pour qu'il ne se lance pas automatiquement au +démarrage +~~~ +## `service_enable` +~~~ +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 +interfaces du tableau $2(=ifaces) est faite dans le fichier +$3(=/etc/network/interfaces) +~~~ +## `network_interfaces_check_confip` +~~~ +Vérifier que la configuration de l'interface $1, avec la passerelle $2, +avec les adresses IP du tabbleau $3(=ipsuffixes) est faite dans le fichier +$4(=/etc/network/interfaces) +~~~ +## `network_interfaces_remove_iface` +~~~ +Supprimer dans le fichier $2(=/etc/network/interfaces) toute la +configuration qui concerne l'interface $1 +~~~ +## `network_interfaces_remove_ifaces` +~~~ +Supprimer dans le fichier $2(=/etc/network/interfaces) toute la +configuration qui concerne les interfaces du tableau $1=(ifaces) +~~~ +## `network_interfaces_remove_confbr` +~~~ +Supprimer dans le fichier $3(=/etc/network/interfaces) toute la +configuration qui concerne le bridge $1, et dont les interfaces sont +listées dans le tableau $2(=ifaces) +~~~ +## `network_interfaces_add_confip` +~~~ +ajouter dans le fichier $4(=/etc/network/interfaces) la configuration pour +l'interface $1, avec éventuellement la passerelle $2, et les adresses ips +telles qu'elles sont définies dans le table $3(=ipsuffixes) +~~~ +## `network_interfaces_add_confbr` +~~~ +ajouter dans le fichier $4(=/etc/network/interfaces) la configuration pour +le bridge $1, avec la liste des interfaces dans le tableau $2(=ifaces) et +la liste des configurations des adresses des interfaces dans le tableau +$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. +$1 (host) est le nom d'hôte. +$2 (confips) est le nom d'un tableau contenant la configuration des +adresses ips pour les interfaces. +$3 (confbrs) est le nom d'un tableau contenant la configuration des +bridges à créer/mettre à jour. +$4 (mainiface) est le nom de l'interface principale, c'est à dire +l'interface qui est sélectionnée si une adresse ip n'est pas préfixée de +son interface. En principe, l'interface principale est le premier bridge +défini ou la première interface définie. +$5 (reset_interfaces) spécifie de ne pas chercher à mettre à jour le +fichier /etc/network/interfaces, mais de le recréer depuis zéro. +$6 (oldhost) est le nom d'hôte actuel, avant la modification +Si un des arguments n'est pas spécifié, il est ignoré. +Le tableau confips doit contenir des définitions d'une des formes +suivantes: +[[iface][//gateway]:]address[/suffix],... +[iface:]dhcp +La deuxième forme est pour spécifier qu'une interface est configurée par +DHCP. iface vaut par défaut eth0, sauf si une définition de bridge +existe, auquel cas il s'agit du premier bridge défini. Pour chaque +interface, seule la première spécification d'adresse IP tient compte de +l'argument gateway. Les autres spécifications définissent des adresses IP +supplémentaires pour l'interface. +Le tableau brs doit contenir des définitions de la forme suivante: +br:ifaces,... +br est le nom du bridge, e.g. br0. ifaces est une liste d'interfaces +séparées par une virgule. e.g. br0:eth0,eth1 +Bien que ce soit techniquement possible, ce script interdit que l'on +définisse une adresse IP pour une interface faisant partie d'un bridge. +~~~ + +-*- 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_debian.twp b/doc/ulib_debian.twp index 1e8816b..76f13f0 100644 --- a/doc/ulib_debian.twp +++ b/doc/ulib_debian.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 30/03/2012 04:43 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -26,9 +26,15 @@ Installer les packages silencieusement et sans confirmation {{{ Installer les packages silencieusement et sans confirmation Retourner 0 si au moins un des packages a été installé. Sinon, les -packages n'ont pas été instllés, soit parce qu'ils sont déjà installé, +packages n'ont pas été installés, soit parce qu'ils sont déjà installé, soit parce qu'il y a eu une erreur. }}} +!! {{{pkg_check_install}}} +{{{ +Si le programme $1 n'existe pas, alors installer les packages $2..$@ +S'il n'y a pas d'arguments $2..$@ utiliser $1 comme nom de package +Retourner 0 si au moins un des packages a été installé +}}} !! {{{service_disable}}} {{{ Désactiver le service $1 pour qu'il ne se lance pas automatiquement au @@ -38,12 +44,136 @@ démarrage {{{ Activer le service $1 pour qu'il se lance automatiquement au démarrage }}} -!! {{{create_bridge}}} +!! {{{network_parse_confbr}}} {{{ -Créer un nouveau pont nommé $1 avec les paramètres $2 -Si $2 est vide, sa valeur par défaut est -bridge_ports none -bridge_stp off -bridge_fd 2 -bridge_maxwait 0 +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 +interfaces du tableau $2(=ifaces) est faite dans le fichier +$3(=/etc/network/interfaces) +}}} +!! {{{network_interfaces_check_confip}}} +{{{ +Vérifier que la configuration de l'interface $1, avec la passerelle $2, +avec les adresses IP du tabbleau $3(=ipsuffixes) est faite dans le fichier +$4(=/etc/network/interfaces) +}}} +!! {{{network_interfaces_remove_iface}}} +{{{ +Supprimer dans le fichier $2(=/etc/network/interfaces) toute la +configuration qui concerne l'interface $1 +}}} +!! {{{network_interfaces_remove_ifaces}}} +{{{ +Supprimer dans le fichier $2(=/etc/network/interfaces) toute la +configuration qui concerne les interfaces du tableau $1=(ifaces) +}}} +!! {{{network_interfaces_remove_confbr}}} +{{{ +Supprimer dans le fichier $3(=/etc/network/interfaces) toute la +configuration qui concerne le bridge $1, et dont les interfaces sont +listées dans le tableau $2(=ifaces) +}}} +!! {{{network_interfaces_add_confip}}} +{{{ +ajouter dans le fichier $4(=/etc/network/interfaces) la configuration pour +l'interface $1, avec éventuellement la passerelle $2, et les adresses ips +telles qu'elles sont définies dans le table $3(=ipsuffixes) +}}} +!! {{{network_interfaces_add_confbr}}} +{{{ +ajouter dans le fichier $4(=/etc/network/interfaces) la configuration pour +le bridge $1, avec la liste des interfaces dans le tableau $2(=ifaces) et +la liste des configurations des adresses des interfaces dans le tableau +$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. +$1 (host) est le nom d'hôte. +$2 (confips) est le nom d'un tableau contenant la configuration des +adresses ips pour les interfaces. +$3 (confbrs) est le nom d'un tableau contenant la configuration des +bridges à créer/mettre à jour. +$4 (mainiface) est le nom de l'interface principale, c'est à dire +l'interface qui est sélectionnée si une adresse ip n'est pas préfixée de +son interface. En principe, l'interface principale est le premier bridge +défini ou la première interface définie. +$5 (reset_interfaces) spécifie de ne pas chercher à mettre à jour le +fichier /etc/network/interfaces, mais de le recréer depuis zéro. +$6 (oldhost) est le nom d'hôte actuel, avant la modification +Si un des arguments n'est pas spécifié, il est ignoré. +Le tableau confips doit contenir des définitions d'une des formes +suivantes: +[[iface][//gateway]:]address[/suffix],... +[iface:]dhcp +La deuxième forme est pour spécifier qu'une interface est configurée par +DHCP. iface vaut par défaut eth0, sauf si une définition de bridge +existe, auquel cas il s'agit du premier bridge défini. Pour chaque +interface, seule la première spécification d'adresse IP tient compte de +l'argument gateway. Les autres spécifications définissent des adresses IP +supplémentaires pour l'interface. +Le tableau brs doit contenir des définitions de la forme suivante: +br:ifaces,... +br est le nom du bridge, e.g. br0. ifaces est une liste d'interfaces +séparées par une virgule. e.g. br0:eth0,eth1 +Bien que ce soit techniquement possible, ce script interdit que l'on +définisse une adresse IP pour une interface faisant partie d'un bridge. }}} diff --git a/doc/ulib_install.md b/doc/ulib_install.md new file mode 100644 index 0000000..5705144 --- /dev/null +++ b/doc/ulib_install.md @@ -0,0 +1,42 @@ +# ulib/install + +## `ensure_exists` +~~~ +Créer le fichier vide "$1" s'il n'existe pas déjà, avec les permissions +$2(=644). retourner vrai si le fichier a été créé sans erreur +~~~ +## `copy_replace` +~~~ +Copier de façon inconditionnelle le fichier $1 vers le fichier $2, en +réinitialisation les permissions à la valeur $3 +~~~ +## `copy_new` +~~~ +Copier le fichier "$1" vers le fichier "$2", avec les permissions $3(=644) +Ne pas écraser le fichier destination s'il existe déjà +Retourner vrai si le fichier a été copié sans erreur +~~~ +## `copy_update` +~~~ +Copier le fichier "$1" vers le fichier "$2", si $2 n'existe pas, ou si $1 +a été modifié par rapport à $2. Réinitialiser le cas échéant les +permissions à la valeur $3 +Retourner vrai si le fichier a été copié sans erreur. +~~~ +## `copy_update_ask` +~~~ +Copier ou mettre à jour le fichier $1 vers le fichier $2. +Si le fichier existe déjà, la différence est affichée, et une confirmation +est demandée pour l'écrasement du fichier. +Retourner vrai si le fichier a été copié sans erreur. +~~~ +## `copy_tree` +~~~ +Copier de façon inconditionnelle l'arborescence $1 dans l'arborescence $2 +~~~ +## `link_new` +~~~ +Si $2 n'existe pas, créer le lien symbolique $2 pointant vers $1 +~~~ + +-*- 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_install.twp b/doc/ulib_install.twp index 7faaa12..e453709 100644 --- a/doc/ulib_install.twp +++ b/doc/ulib_install.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:15 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -8,23 +8,25 @@ !! {{{ensure_exists}}} {{{ -créer le fichier vide "$1" s'il n'existe pas déjà. retourner vrai si le -fichier a été créé sans erreur +Créer le fichier vide "$1" s'il n'existe pas déjà, avec les permissions +$2(=644). retourner vrai si le fichier a été créé sans erreur }}} !! {{{copy_replace}}} {{{ -Copier de façon inconditionnelle le fichier $1 vers le fichier $2 +Copier de façon inconditionnelle le fichier $1 vers le fichier $2, en +réinitialisation les permissions à la valeur $3 }}} !! {{{copy_new}}} {{{ -copier le fichier "$1" vers le fichier "$2" +Copier le fichier "$1" vers le fichier "$2", avec les permissions $3(=644) Ne pas écraser le fichier destination s'il existe déjà Retourner vrai si le fichier a été copié sans erreur }}} !! {{{copy_update}}} {{{ -copier le fichier "$1" vers le fichier "$2", si $2 n'existe pas, ou si $1 -a été modifié par rapport à $2. +Copier le fichier "$1" vers le fichier "$2", si $2 n'existe pas, ou si $1 +a été modifié par rapport à $2. Réinitialiser le cas échéant les +permissions à la valeur $3 Retourner vrai si le fichier a été copié sans erreur. }}} !! {{{copy_update_ask}}} @@ -40,5 +42,5 @@ Copier de façon inconditionnelle l'arborescence $1 dans l'arborescence $2 }}} !! {{{link_new}}} {{{ -S'il $2 n'existe pas, créer le lien symbolique $2 pointant vers $1 +Si $2 n'existe pas, créer le lien symbolique $2 pointant vers $1 }}} diff --git a/doc/ulib_ipcalc.md b/doc/ulib_ipcalc.md new file mode 100644 index 0000000..2b28287 --- /dev/null +++ b/doc/ulib_ipcalc.md @@ -0,0 +1,68 @@ +# ulib/ipcalc + +## `get_random_kvm_macaddr` +~~~ +Obtenir une adresse mac au hasard commençant par 52:54:00 pour KVM +~~~ +## `ipcalc_splitipmask` +~~~ +Découper $1 de la forme ip[/mask] entre l'adresse ip, qui est placé dans +la variable $2(=ip) et le masque, qui est placée dans la variable +$3(=mask) +~~~ +## `ipcalc_checkip` +~~~ +Vérifier l'adresse ip $1 pour voir si elle est valide. Si l'adresse est +valide, l'afficher. Sinon, retourner 1 +~~~ +## `ipcalc_checkmask` +~~~ +vérifier le masque de sous-réseau $1 pour voir si elle est valide. Si oui, +afficher le suffixe (0, 8, 16, 24, 32) associé. Sinon retourner 1 +~~~ +## `ipcalc_netmask` +~~~ +à partir d'un suffixe (0, 8, 16, 24, 32) ou d'un masque de sous-réseau, +afficher le masque de sous-réseau. si le suffixe ou le masque ne sont pas +reconnus, retourner 1 +~~~ +## `ipcalc_broadcast` +~~~ +Calculer l'adresse de broadcast correspondant à l'adresse ip $1. Le masque +de sous-réseau peut-être indiqué dans l'adresse ip avec le suffixe /n ou +/x.x.x.x ou donné dans l'argument $2. Seuls les suffixes 0, 8, 16, 24, 32 +sont supportés. +Retourner 1 si un erreur s'est produite, par exemple si l'adresse ou le +suffixe sont invalides ou non supportés. +~~~ +## `ipcalc_gateway` +~~~ +Calculer l'adresse du gateway correspondant à l'adresse ip $1, en +considérant que le gateway est la première adresse du réseau. Le masque de +sous-réseau peut-être indiqué dans l'adresse ip avec le suffixe /n ou +/x.x.x.x ou donné dans l'argument $2. Seuls les suffixes 0, 8, 16, 24, 32 +sont supportés. +Retourner 1 si un erreur s'est produite, par exemple si l'adresse ou le +suffixe sont invalides ou non supportés. +~~~ +## `ipcalc_match` +~~~ +Vérifier si l'adresse $1 correspond au modèle $2, e.g.: +ipcalc_match 10.75.0.23 10/8 --> TRUE +ipcalc_match 10.75.0.23 10.75.0.0/24 --> TRUE +ipcalc_match 10.75.0.23 10.75.0.28 --> FALSE +~~~ +## `ipcalc_fqdn` +~~~ +Calculer si possible le nom pleinement qualifié correspondant à l'hôte $1. +Dans tous les cas, afficher l'hôte, mais retourner 1 si la calcul n'a pas +pu être effectué. +~~~ +## `ipcalc_fqdn_maybe` +~~~ +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. +~~~ + +-*- 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_ipcalc.twp b/doc/ulib_ipcalc.twp index 9414ee7..0fee9e0 100644 --- a/doc/ulib_ipcalc.twp +++ b/doc/ulib_ipcalc.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:15 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -26,6 +26,12 @@ valide, l'afficher. Sinon, retourner 1 vérifier le masque de sous-réseau $1 pour voir si elle est valide. Si oui, afficher le suffixe (0, 8, 16, 24, 32) associé. Sinon retourner 1 }}} +!! {{{ipcalc_netmask}}} +{{{ +à partir d'un suffixe (0, 8, 16, 24, 32) ou d'un masque de sous-réseau, +afficher le masque de sous-réseau. si le suffixe ou le masque ne sont pas +reconnus, retourner 1 +}}} !! {{{ipcalc_broadcast}}} {{{ Calculer l'adresse de broadcast correspondant à l'adresse ip $1. Le masque @@ -52,3 +58,15 @@ ipcalc_match 10.75.0.23 10/8 --> TRUE ipcalc_match 10.75.0.23 10.75.0.0/24 --> TRUE ipcalc_match 10.75.0.23 10.75.0.28 --> FALSE }}} +!! {{{ipcalc_fqdn}}} +{{{ +Calculer si possible le nom pleinement qualifié correspondant à l'hôte $1. +Dans tous les cas, afficher l'hôte, mais retourner 1 si la calcul n'a pas +pu être effectué. +}}} +!! {{{ipcalc_fqdn_maybe}}} +{{{ +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. +}}} diff --git a/doc/ulib_java.md b/doc/ulib_java.md new file mode 100644 index 0000000..2fdab33 --- /dev/null +++ b/doc/ulib_java.md @@ -0,0 +1,32 @@ +# ulib/java + +## `select_java` +~~~ +sélectionner la version *minimum* de java correspondant à $1 +$1== 1.3|1.3+|1.4|1.4+|1.5|1.5+|1.6|1.6+|1.7|1.7+|1.8|1.8+ +Si $2 est défini, il peut s'agit de 32 ou 64 selon que l'on requière la +version 32bits ou 64 bits +~~~ +## `select_java_exact` +~~~ +sélectionner la version *exacte* de java correspondant à $1 +$1== 1.3|1.4|1.5|1.6|1.7|1.8 pour une correspondance exacte +$1== 1.3+|1.4+|1.5+|1.6+|1.7+|1.8+ pour une version minimum +Si $2 est défini, il peut s'agit de 32 ou 64 selon que l'on requière la +version 32bits ou 64 bits +~~~ +## `select_java_any` +~~~ +Sélectionner la version exacte de java correspondant aux arguments, dans +l'ordre, jusqu'à ce qu'un argument corresponde. DEFAULT correspond à la +valeur actuelle de JAVA_HOME, si elle est définie. +Si aucun argument n'est défini, on assume "DEFAULT 5 6 7 8 1.4" +~~~ +## `get_default_javahome_prefix` +## `get_javaextensions_prefix` +## `compute_java_prefixes` +## `recompute_java_prefixes` +## `get_JAVA_HOME_prefix` +## `get_JAVAEXTENSIONS_prefix` + +-*- 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_java.twp b/doc/ulib_java.twp index 9c58dc6..631b35a 100644 --- a/doc/ulib_java.twp +++ b/doc/ulib_java.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:15 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -9,18 +9,25 @@ !! {{{select_java}}} {{{ sélectionner la version *minimum* de java correspondant à $1 -$1== 1.3|1.3+|1.4|1.4+|1.5|1.5+|1.6|1.6+|1.7|1.7+ +$1== 1.3|1.3+|1.4|1.4+|1.5|1.5+|1.6|1.6+|1.7|1.7+|1.8|1.8+ Si $2 est défini, il peut s'agit de 32 ou 64 selon que l'on requière la version 32bits ou 64 bits }}} !! {{{select_java_exact}}} {{{ -sélectionner la version *exacte* de javac correspondant à $1 -$1== 1.3|1.4|1.5|1.6|1.7 pour une correspondance exacte -$1== 1.3+|1.4+|1.5+|1.6+|1.7+ pour une version minimum +sélectionner la version *exacte* de java correspondant à $1 +$1== 1.3|1.4|1.5|1.6|1.7|1.8 pour une correspondance exacte +$1== 1.3+|1.4+|1.5+|1.6+|1.7+|1.8+ pour une version minimum Si $2 est défini, il peut s'agit de 32 ou 64 selon que l'on requière la version 32bits ou 64 bits }}} +!! {{{select_java_any}}} +{{{ +Sélectionner la version exacte de java correspondant aux arguments, dans +l'ordre, jusqu'à ce qu'un argument corresponde. DEFAULT correspond à la +valeur actuelle de JAVA_HOME, si elle est définie. +Si aucun argument n'est défini, on assume "DEFAULT 5 6 7 8 1.4" +}}} !! {{{get_default_javahome_prefix}}} !! {{{get_javaextensions_prefix}}} !! {{{compute_java_prefixes}}} diff --git a/doc/ulib_javaproperties.md b/doc/ulib_javaproperties.md new file mode 100644 index 0000000..2783e34 --- /dev/null +++ b/doc/ulib_javaproperties.md @@ -0,0 +1,31 @@ +# ulib/javaproperties + +## `read_property` +~~~ +Lire la propriété $2 dans le fichier $1, et placer la valeur dans la +variable $3. Si la propriété n'existe pas, prendre la valeur par défaut +$4. Si $3=="", elle est construite à partir de $2 en remplaçant les '.' +par '_' +Retourner 1 si une erreur s'est produite (par exemple si le fichier +n'existe pas ou n'est pas accessible en lecture) +~~~ +## `write_property` +~~~ +Ecrire la propriété $2 dans le fichier $1 avec la valeur $3. +Retourner 1 si une erreur s'est produite (par exemple si le fichier +n'existe pas ou n'est pas accessible en écriture) +~~~ +## `write_properties` +~~~ +Ecrire les propriétés $2..* dans le fichier $1. Les propriétés sont de la +forme "name=value" +~~~ +## `norm_properties` +~~~ +Normaliser un fichier de propriété: Les commentaires sont supprimés, les +valeurs sont triées par ordre alphabétique, les caractères accentués sont +remplacés par des caractères unicode \\uxxxx, les séquences unicodes sont +transformées en minuscule. +~~~ + +-*- 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_javaproperties.twp b/doc/ulib_javaproperties.twp index 8b87417..0a82e0e 100644 --- a/doc/ulib_javaproperties.twp +++ b/doc/ulib_javaproperties.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:15 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -26,3 +26,10 @@ n'existe pas ou n'est pas accessible en écriture) Ecrire les propriétés $2..* dans le fichier $1. Les propriétés sont de la forme "name=value" }}} +!! {{{norm_properties}}} +{{{ +Normaliser un fichier de propriété: Les commentaires sont supprimés, les +valeurs sont triées par ordre alphabétique, les caractères accentués sont +remplacés par des caractères unicode \\uxxxx, les séquences unicodes sont +transformées en minuscule. +}}} diff --git a/doc/ulib_json.md b/doc/ulib_json.md new file mode 100644 index 0000000..9a2f98f --- /dev/null +++ b/doc/ulib_json.md @@ -0,0 +1,10 @@ +# ulib/json + +## `json_filter` +~~~ +traiter un flux json pour que chaque valeur soit sur une ligne séparée, +facilitant le traitement par un script bash +~~~ +## `awkjson` + +-*- 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_json.twp b/doc/ulib_json.twp new file mode 100644 index 0000000..e2b6f2e --- /dev/null +++ b/doc/ulib_json.twp @@ -0,0 +1,14 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: ulib/json + +!! {{{json_filter}}} +{{{ +traiter un flux json pour que chaque valeur soit sur une ligne séparée, +facilitant le traitement par un script bash +}}} +!! {{{awkjson}}} diff --git a/doc/ulib_ldap.md b/doc/ulib_ldap.md new file mode 100644 index 0000000..a3dae7a --- /dev/null +++ b/doc/ulib_ldap.md @@ -0,0 +1,76 @@ +# ulib/ldap + +## `get_default_ldapconfdir_prefix` +~~~ +Calculer et afficher la valeur par défaut de LDAPCONFDIR, ou une chaine +vide si l'on n'a pas pu le détecter automatiquement. +~~~ +## `get_default_ldapowner_prefix` +~~~ +Calculer et afficher la valeur par défaut de LDAPOWNER, ou une chaine +vide si l'on n'a pas pu le détecter automatiquement. +~~~ +## `compute_ldap_prefixes` +## `recompute_ldap_prefixes` +## `get_LDAPCONFDIR_prefix` +## `get_LDAPOWNER_prefix` +## `split_ldapuri` +~~~ +spliter le ldapuri $1 en $2(=proto), $3(=host) et $4(=port) +~~~ +## `get_suffixes` +~~~ +obtenir les suffixes de connexion du serveur avec l'uri $1, un par ligne +retourner 1 si la valeur n'a pas pu être obtenue +~~~ +## `get_anysuffix` +~~~ +obtenir le *premier* suffixe du serveur avec l'uri $1 +retourner 1 si la valeur n'a pas pu être obtenue +~~~ +## `get_dcsuffix` +~~~ +obtenir le *premier* suffixe du serveur avec l'uri $1 qui se termine par +dc=TLD où TLD est une valeur quelconque. A priori, c'est un suffixe d'une +base de donnée non administrative. +retourner 1 si la valeur n'a pas pu être obtenue +~~~ +## `get_suffix` +~~~ +obtenir le *premier* suffixe du serveur avec l'uri $1 qui se termine si +possible par dc=TLD où TLD est une valeur quelconque. Dans le cas normal, +le suffixe affiché est celui d'une base non administrative. +retourner 1 si la valeur n'a pas pu être obtenue +~~~ +## `reldn` +## `absdn` +~~~ +obtenir le dn absolu correspondant au dn $1, le dn de base étant +$2(=$SUFFIX) +~~~ +## `subof` +~~~ +tester si le dn absolu $1 est $2 ou un enfant de $2 +~~~ +## `rabsdn` +~~~ +comme absdn, mais tient compte de la valeur de $3(=$SEARCHBASE) +Si le dn commence par "~/", le dn est relatif à $2(=$SUFFIX) +Si le dn commence par "/", le dn est absolu +Sinon, le dn est relatif à $3 +~~~ +## `pdn` +~~~ +corriger pour *affichage* un dn *absolu*. pour la racine "", afficher +'/'. pour $2(=$SUFFIX), afficher '~'. sinon, afficher le dn relativement à +$2 +~~~ +## `filter_slapdconf` +~~~ +Traiter un fichier de configuration slapd.conf en fusionnant les lignes +qui sont découpées. Ceci permet de faire des traitements sur le contenu. +Ce filtre s'utilisera normalement avec filter_conf, e.g.: +result.conf +~~~ + +-*- 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_ldap.twp b/doc/ulib_ldap.twp index ad2ca5a..27953f6 100644 --- a/doc/ulib_ldap.twp +++ b/doc/ulib_ldap.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:15 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -29,11 +29,25 @@ spliter le ldapuri $1 en $2(=proto), $3(=host) et $4(=port) obtenir les suffixes de connexion du serveur avec l'uri $1, un par ligne retourner 1 si la valeur n'a pas pu être obtenue }}} -!! {{{get_suffix}}} +!! {{{get_anysuffix}}} {{{ obtenir le *premier* suffixe du serveur avec l'uri $1 retourner 1 si la valeur n'a pas pu être obtenue }}} +!! {{{get_dcsuffix}}} +{{{ +obtenir le *premier* suffixe du serveur avec l'uri $1 qui se termine par +dc=TLD où TLD est une valeur quelconque. A priori, c'est un suffixe d'une +base de donnée non administrative. +retourner 1 si la valeur n'a pas pu être obtenue +}}} +!! {{{get_suffix}}} +{{{ +obtenir le *premier* suffixe du serveur avec l'uri $1 qui se termine si +possible par dc=TLD où TLD est une valeur quelconque. Dans le cas normal, +le suffixe affiché est celui d'une base non administrative. +retourner 1 si la valeur n'a pas pu être obtenue +}}} !! {{{reldn}}} !! {{{absdn}}} {{{ diff --git a/doc/ulib_ldif.md b/doc/ulib_ldif.md new file mode 100644 index 0000000..e8f5fdc --- /dev/null +++ b/doc/ulib_ldif.md @@ -0,0 +1,64 @@ +# ulib/ldif + +## `def_match_attr` +## `def_match_value` +## `uncut_lines` +~~~ +reformer les lignes qui sont coupées +~~~ +## `cut_lines` +~~~ +couper les lignes trop longues +~~~ +## `ensure_complete_objects` +~~~ +S'assurer que le ldif ne contient que des objets complets (éliminant ainsi +les groupes ayant seulement dn:) +~~~ +## `delete_marked_objects` +~~~ +Supprimer les objets marqués avec --DELETE--: +~~~ +## `dump_ldif` +## `tl_addattr` +## `tl_modifyattr` +## `tl_deleteattr` +## `tl_deleteentry` +## `tl_touchentry` +## `tl_keepattr` +## `tl_keepval` +## `tl_excludeattr` +## `tl_excludeval` +## `tl_keepvalentry` +## `tl_excludevalentry` +## `tl_replval` +## `tl_addval` +## `tl_defval` +## `print_values` +## `tl_ensureval` +## `print_ensure_values` +## `tl_decode` +## `tl_encode` +## `tl_format` +## `dump_headers` +## `tl_formatcsv` +## `tl_parsecsv` +## `tl_parsecsvmod` +## `get_transform_cmd` +~~~ +Créer une liste de commandes bash à évaluer en fonction des arguments: une +suite de commandes séparées par // +Les variables suivantes peuvent être définies en entrée: +_T_inputfile: +Si cette variable est non vide, lire à partir du fichier $_T_inputfile +au lieu de stdin +_T_uncut_before: +faut-il fusionner automatiquement les lignes *avant* de lancer les +commandes. +_T_cut_after: +faut-il découper automatiquement les lignes *après* avoir lancé les +commandes. +~~~ +## `transform` + +-*- 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_ldif.twp b/doc/ulib_ldif.twp index 4d10f8f..a0db719 100644 --- a/doc/ulib_ldif.twp +++ b/doc/ulib_ldif.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 02/06/2012 09:54 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -30,6 +30,7 @@ Supprimer les objets marqués avec --DELETE--: !! {{{tl_modifyattr}}} !! {{{tl_deleteattr}}} !! {{{tl_deleteentry}}} +!! {{{tl_touchentry}}} !! {{{tl_keepattr}}} !! {{{tl_keepval}}} !! {{{tl_excludeattr}}} @@ -38,10 +39,17 @@ Supprimer les objets marqués avec --DELETE--: !! {{{tl_excludevalentry}}} !! {{{tl_replval}}} !! {{{tl_addval}}} +!! {{{tl_defval}}} +!! {{{print_values}}} +!! {{{tl_ensureval}}} +!! {{{print_ensure_values}}} !! {{{tl_decode}}} !! {{{tl_encode}}} !! {{{tl_format}}} !! {{{dump_headers}}} +!! {{{tl_formatcsv}}} +!! {{{tl_parsecsv}}} +!! {{{tl_parsecsvmod}}} !! {{{get_transform_cmd}}} {{{ Créer une liste de commandes bash à évaluer en fonction des arguments: une diff --git a/doc/ulib_legacy.md b/doc/ulib_legacy.md new file mode 100644 index 0000000..65328fa --- /dev/null +++ b/doc/ulib_legacy.md @@ -0,0 +1,46 @@ +# ulib/legacy + +## `file_get_vars` +~~~ +lire les variables dans un fichier +~~~ +## `file_set_vars` +~~~ +écrire les variables dans un fichier. Le fichier *doit exister* +~~~ +## `write_all_remaining_vars` +## `file_get_properties` +~~~ +lire les propriétés d'un fichier de propriété java ou xml +~~~ +## `file_set_properties` +~~~ +écrire les propriétés d'un fichier de propriété java ou xml +~~~ +## `file_get_java_properties` +~~~ +lire les propriétés d'un fichier de propriétés java. note: les noms de +propriété java peuvent contenir le caractère "." mais pas les noms de +variable bash. La conversion est faite automatiquement. Par exemple:: +file_get_properties build.properties path.to.package "default value" +charge la valeur de la propriété dans la variable path_to_package +~~~ +## `file_set_java_properties` +~~~ +écrire des propriétés dans un fichier de propriétés java. +~~~ +## `write_all_remaining_vars` +## `file_get_xml_properties` +~~~ +lire les propriétés d'un fichier de propriétés xml. Limitation: les +propriétés ne doivent pas être continuées sur plusieurs lignes. Les +propriétés doivent être écrites sous la forme:: +propvalue +~~~ +## `file_set_xml_properties` +~~~ +écrire des propriétés dans un fichier de propriétés java. +~~~ +## `write_all_remaining_vars` + +-*- 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_macosx.md b/doc/ulib_macosx.md new file mode 100644 index 0000000..6be3a3d --- /dev/null +++ b/doc/ulib_macosx.md @@ -0,0 +1,20 @@ +# ulib/macosx + +## `local_shellfix` +~~~ +Modifier le compte local $1 pour qu'il utilise bash au lieu de sh +~~~ +## `local_usercheck` +~~~ +Vérifier si le user local $1 existe +~~~ +## `local_useradd` +~~~ +Créer le user local $1 +USAGE: local_useradd username [gecos [passwd]] +OPTIONS +-s Créer l'utilisateur avec les droits d'administrateur +-m Créer le home directory +~~~ + +-*- 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_mkcrypt.md b/doc/ulib_mkcrypt.md new file mode 100644 index 0000000..a50de0e --- /dev/null +++ b/doc/ulib_mkcrypt.md @@ -0,0 +1,5 @@ +# ulib/mkcrypt + +## `mkcrypt` + +-*- 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_modeline.md b/doc/ulib_modeline.md new file mode 100644 index 0000000..faf687f --- /dev/null +++ b/doc/ulib_modeline.md @@ -0,0 +1,6 @@ +# ulib/modeline + +## `printml` +## `addml` + +-*- 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_network-manager-service.md b/doc/ulib_network-manager-service.md new file mode 100644 index 0000000..c0e28a3 --- /dev/null +++ b/doc/ulib_network-manager-service.md @@ -0,0 +1,14 @@ +# ulib/network-manager-service + +## `SERVICE_OVERRIDE_network_manager_stopx` +~~~ +désactiver network-manager avant de l'arrêter, ce qui permet de s'assurer +que chaque chaque connexion est arrêtée proprement +~~~ +## `SERVICE_OVERRIDE_network_manager_startx` +~~~ +cette fonction est le pendant de stopx: penser à relancer network-manager +après avoir démarré le service +~~~ + +-*- 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_password.md b/doc/ulib_password.md new file mode 100644 index 0000000..e03cea9 --- /dev/null +++ b/doc/ulib_password.md @@ -0,0 +1,20 @@ +# ulib/password + +## `random_index` +~~~ +Afficher un index au hasard dans le tableau $1 +~~~ +## `random_value` +~~~ +Afficher une valeur au hasard dans le tableau $1 +~~~ +## `random_char` +~~~ +Afficher un caractère au hasard dans la chaine $1 +~~~ +## `genpass` +~~~ +Générer un mot de passe au hasard avec les paramètres GENPASS_* +~~~ + +-*- 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_password.twp b/doc/ulib_password.twp new file mode 100644 index 0000000..676ca5b --- /dev/null +++ b/doc/ulib_password.twp @@ -0,0 +1,24 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: ulib/password + +!! {{{random_index}}} +{{{ +Afficher un index au hasard dans le tableau $1 +}}} +!! {{{random_value}}} +{{{ +Afficher une valeur au hasard dans le tableau $1 +}}} +!! {{{random_char}}} +{{{ +Afficher un caractère au hasard dans la chaine $1 +}}} +!! {{{genpass}}} +{{{ +Générer un mot de passe au hasard avec les paramètres GENPASS_* +}}} diff --git a/doc/ulib_prefixes.md b/doc/ulib_prefixes.md new file mode 100644 index 0000000..03cd690 --- /dev/null +++ b/doc/ulib_prefixes.md @@ -0,0 +1,10 @@ +# ulib/prefixes + +## `get_USER_prefix` +## `get_HOME_prefix` +## `has_prefix` +## `expand_prefix` +## `list_prefixes` +## `dump_prefixes` + +-*- 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_prefixes.twp b/doc/ulib_prefixes.twp index 0e59fc1..5ce1ae0 100644 --- a/doc/ulib_prefixes.twp +++ b/doc/ulib_prefixes.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:15 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -8,6 +8,7 @@ !! {{{get_USER_prefix}}} !! {{{get_HOME_prefix}}} +!! {{{has_prefix}}} !! {{{expand_prefix}}} !! {{{list_prefixes}}} !! {{{dump_prefixes}}} diff --git a/doc/ulib_pretty.md b/doc/ulib_pretty.md new file mode 100644 index 0000000..77de196 --- /dev/null +++ b/doc/ulib_pretty.md @@ -0,0 +1,17 @@ +# ulib/pretty + +## `get_color` +## `set_verbosity` +## `set_interaction` +## `show_error` +## `show_warn` +## `show_info` +## `show_verbose` +## `show_debug` +## `check_verbosity` +## `get_verbosity_option` +## `check_interaction` +## `is_interaction` +## `get_interaction_option` + +-*- 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_pretty.twp b/doc/ulib_pretty.twp index 4e6ec94..d10a426 100644 --- a/doc/ulib_pretty.twp +++ b/doc/ulib_pretty.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:15 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -12,8 +12,10 @@ !! {{{show_error}}} !! {{{show_warn}}} !! {{{show_info}}} +!! {{{show_verbose}}} !! {{{show_debug}}} !! {{{check_verbosity}}} !! {{{get_verbosity_option}}} !! {{{check_interaction}}} +!! {{{is_interaction}}} !! {{{get_interaction_option}}} diff --git a/doc/ulib_ptools.md b/doc/ulib_ptools.md new file mode 100644 index 0000000..1ae177c --- /dev/null +++ b/doc/ulib_ptools.md @@ -0,0 +1,14 @@ +# ulib/ptools + +## `is_any_branch` +## `is_master_branch` +## `is_develop_branch` +## `is_release_branch` +## `is_hotfix_branch` +## `is_feature_branch` +## `list_release_branches` +## `list_hotfix_branches` +## `list_feature_branches` +## `pver` + +-*- 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_ptools.twp b/doc/ulib_ptools.twp new file mode 100644 index 0000000..147394e --- /dev/null +++ b/doc/ulib_ptools.twp @@ -0,0 +1,18 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: ulib/ptools + +!! {{{is_any_branch}}} +!! {{{is_master_branch}}} +!! {{{is_develop_branch}}} +!! {{{is_release_branch}}} +!! {{{is_hotfix_branch}}} +!! {{{is_feature_branch}}} +!! {{{list_release_branches}}} +!! {{{list_hotfix_branches}}} +!! {{{list_feature_branches}}} +!! {{{pver}}} diff --git a/doc/ulib_redhat.md b/doc/ulib_redhat.md new file mode 100644 index 0000000..e04e426 --- /dev/null +++ b/doc/ulib_redhat.md @@ -0,0 +1,40 @@ +# ulib/redhat + +## `pkg_check` +~~~ +Vérifier que les packages sont installés sur le système +~~~ +## `pkg_update` +~~~ +Mettre à jour la liste des packages silencieusement sans confirmation +~~~ +## `pkg_upgrade` +~~~ +Mettre à jour la liste des packages silencieusement sans confirmation +~~~ +## `pkg_install` +~~~ +Installer les packages silencieusement et sans confirmation +~~~ +## `pkg_installm` +~~~ +Installer les packages silencieusement et sans confirmation +Retourner 0 si au moins un des packages a été installé. Sinon, les +packages n'ont pas été instllés, soit parce qu'ils sont déjà installé, +soit parce qu'il y a eu une erreur. +~~~ +## `service_disable` +~~~ +Désactiver le service $1 pour qu'il ne se lance pas automatiquement au +démarrage +~~~ +## `service_enable` +~~~ +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 +~~~ + +-*- 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.twp b/doc/ulib_redhat.twp new file mode 100644 index 0000000..600ac67 --- /dev/null +++ b/doc/ulib_redhat.twp @@ -0,0 +1,44 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: ulib/redhat + +!! {{{pkg_check}}} +{{{ +Vérifier que les packages sont installés sur le système +}}} +!! {{{pkg_update}}} +{{{ +Mettre à jour la liste des packages silencieusement sans confirmation +}}} +!! {{{pkg_upgrade}}} +{{{ +Mettre à jour la liste des packages silencieusement sans confirmation +}}} +!! {{{pkg_install}}} +{{{ +Installer les packages silencieusement et sans confirmation +}}} +!! {{{pkg_installm}}} +{{{ +Installer les packages silencieusement et sans confirmation +Retourner 0 si au moins un des packages a été installé. Sinon, les +packages n'ont pas été instllés, soit parce qu'ils sont déjà installé, +soit parce qu'il y a eu une erreur. +}}} +!! {{{service_disable}}} +{{{ +Désactiver le service $1 pour qu'il ne se lance pas automatiquement au +démarrage +}}} +!! {{{service_enable}}} +{{{ +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 +}}} diff --git a/doc/ulib_runs.md b/doc/ulib_runs.md new file mode 100644 index 0000000..97e6775 --- /dev/null +++ b/doc/ulib_runs.md @@ -0,0 +1,238 @@ +# ulib/runs + +## `runs_initdir` +~~~ +Initialiser le répertoire d'hôte. $1 est un nom d'hôte pleinement +qualifié, et les fichiers sont créés dans le premier répertoire de +RUNSHOSTSDIRS qui convient: si un fichier .udir existe avec un tableau +runs_domains qui contient le domaine de l'hôte spécifié, alors c'est ce +répertoire qui est sélectionné. Sinon, on prend le premier répertoire de +RUNSHOSTSDIRS. +$2 spécifie si le fichier doit être créé avec de l'aide (yes) ou avec le +script minimum (no) +$3 est le contenu à placer dans le fichier sysinfos.conf, s'il n'a pas +déjà été provisionné. +Il faut lancer __runs_setpath avant d'utiliser cette fonction et +RUNSHOSTDIRS ne doit pas être vide +~~~ +## `runs_create_rscript` +~~~ +Créer un modèle de script. Si $2 est spécifié, c'est un nom d'hôte +pleinement qualifié. Le répertoire d'hôte correspondant *doit* exister. +$3 spécifie si le fichier doit être créé avec de l'aide (yes) ou avec le +script minimum (no) +Si $2!="", il faut lancer __runs_setpath avant d'utiliser cette fonction +et RUNSHOSTDIRS ne doit pas être vide +Le chemin du nouveau script est ajouté au tableau new_rscripts +~~~ +## `runs_unsupported_system` +~~~ +Afficher un message d'erreur indiquant que le système actuel n'est pas +supporté, et quitter le script +~~~ +## `runs_require_sysinfos` +~~~ +Vérifier le système actuel avec check_sysinfos(), et afficher un message +d'erreur avec runs_unsupported_system() s'il ne correspond pas à la +requête +~~~ +## `runs_find_host` +## `runs_add_domain` +~~~ +Si $1 est nom d'hôte pleinement qualifié, retourner cette valeur +Sinon, lui rajouter le domaine RUNSDOMAIN +~~~ +## `runs_find_hostfile` +~~~ +Trouver et afficher le fichier d'hôte $1 dans les répertoires du tableau +$3(=RUNSHOSTSDIRS), pour l'hôte $2(=$RUNSHOST). Retourner 0 en cas de +succès, 1 en cas d'échec. +Si host=$2 est une valeur non vide, la recherche est effectuée dans +{$RUNSHOSTSDIRS}/$host et {$RUNSHOSTSDIRS}/$domain/$hostname. Sinon, +retourner 1, car il faut spécifier un nom d'hôte. +~~~ +## `runs_find_datafile` +~~~ +Trouver et afficher le fichier de données $1 dans le répertoire $3 s'il +est non vide puis dans les répertoires des tableaux $4(=RUNSSCRIPTSDIRS), +$5(=RUNSMODULESDIRS) et $6(=RUNSHOSTSDIRS), pour l'hôte +$2(=$RUNSHOST). Retourner 0 en cas de succès, 1 en cas d'échec. +- D'abord, si $1 *n'est pas* de la forme "./path" ou "../path", chercher +dans $3. +- Puis si l'hôte est spécifié, chercher dans {$RUNSHOSTSDIRS}/$host et +{$RUNSHOSTSDIRS}/$domain/$hostname. +- Puis chercher dans {$RUNSSCRIPTSDIRS} puis {$RUNSMODULESDIRS}. +- Puis, si $1 est de la forme "./path" ou "../path", chercher dans $3. +- Sinon, retourner 1 +~~~ +## `runs_initvars` +~~~ +Initialiser les variables RUNSDIR, RUNSSCRIPT, RUNSDIRPATH, +RUNSSCRIPTPATH, RUNSSCRIPTDIR et RUNSSCRIPTNAME pour le script $1. +Les valeurs sont initialisées comme suit: +RUNSSCRIPT="$(abspath "$1")" +RUNSDIR="$2" (le répertoire de $RUNS*PATH dans lequel a été trouvé le +script) +Si $3!="", RUNSDIRPATH="$3" et RUNSSCRIPTPATH="$4" +Sinon, RUNSDIRPATH="$RUNSSCRIPTDIR" et RUNSSCRIPTPATH="$RUNSSCRIPTNAME" +~~~ +## `runs_find_scriptfile` +~~~ +Trouver sans l'afficher le script $1 dans les répertoires des tableaux +$3(=RUNSSCRIPTSDIRS), $4(=RUNSMODULESDIRS) et $5(=RUNSHOSTSDIRS), en +considérant que le script sera lancé sur l'hôte $2(=$RUNSHOST), et +initialiser les variables RUNSDIR, RUNSSCRIPT, RUNSSCRIPTDIR, +RUNSSCRIPTNAME, RUNSDIRPATH et RUNSSCRIPTPATH. Retourner 0 en cas de +succès, 1 en cas d'échec. +$6 vaut ".rs" par défaut est c'est une extension à rajouter au nom +spécifié si le fichier sans l'extension n'existe pas +RUNSDIR est le répertoire dans lequel a été trouvé le script (parmi les +valeurs fournies dans les tableaux RUNSSCRIPTSDIRS, RUNSMODULESDIRS, +RUNSHOSTSDIRS), RUNSDIRPATH est le répertoire à partir duquel est exprimé +le chemin du script (i.e RUNSDIRPATH + RUNSSCRIPTPATH == RUNSSCRIPT), +RUNSSCRIPT contient le chemin absolu vers le script, RUNSSCRIPTPATH +contient le chemin du script dans RUNSDIRPATH, RUNSSCRIPTDIR le répertoire +du script, et RUNSSCRIPTNAME le nom du script. +D'abord, si l'hôte est spécifié, chercher dans {$RUNSHOSTSDIRS}/$host et +{$RUNSHOSTSDIRS}/$domain/$hostname. Puis chercher dans {$RUNSSCRIPTSDIRS} +~~~ +## `runs_find_scriptfile_reverse` +~~~ +Soit le fichier de script $1, exprimée de façon absolue, trouver le +fichier parmi les tableaux $3(=RUNSSCRIPTSDIRS), $4(=RUNSMODULESDIRS) +et $5(=RUNSHOSTSDIRS), en considérant que le script sera lancé sur l'hôte +$2(=$RUNSHOST), puis initialiser les variables RUNSDIR, RUNSSCRIPT, +RUNSSCRIPTDIR, RUNSSCRIPTNAME, RUNSDIRPATH et RUNSSCRIPTPATH. Retourner 0 +en cas de succès, 1 en cas d'échec. +~~~ +## `runs_rscript` +~~~ +Lancer le fichier $1 comme un script avec les arguments $2..$*. Retourner +la valeur de retour du script. +~~~ +## `runs_recipe` +~~~ +Lancer les scripts de la recette contenue dans le fichier $1. Arrêter au +premier script qui est en erreur +~~~ +## `runs_rscriptpath` +~~~ +Lancer le script $1 avec les arguments $2..$*. Le script est cherché dans +les répertoires de RUNSSCRIPTSPATH. Retourner 123 si le script n'est pas +trouvé, sinon retourner la valeur de retour du script. +~~~ +## `runs_recipepath` +~~~ +Lancer la recette $1. Le fichier de recette est cherché dans les +répertoires de RUNSSCRIPTSPATH. Retourner 123 si le fichier de recette n'a +pas été trouvé, sinon retourner la valeur de retour de runs_recipe() +~~~ +## `runs_init` +## `runs_initdomains` +~~~ +Si ce n'est pas déjà le cas, initialiser RUNSDOMAINS en fonction de +/etc/resolv.conf +~~~ +## `runs_inithost` +## `runs_initsysinfos` +## `runs_initworkdir` +## `runs_after_export` +~~~ +après l'export, initialiser varsfile avec les valeurs qu'il faut garder +entre le déploiement local et le déploiement distant. +~~~ +## `runs_check_runsscript` +## `runs_var` +~~~ +Initialiser les variables selon les directives données en ligne de +commande. +Les arguments peuvent être une suite de définitions de la forme +'scalar=value', 'scalar!=name', 'array+=value', 'array-=value' ou +'array@=name'. +Sinon, le *dernier* argument peut-être de l'une des formes suivantes: +'array value0 [value1...]' pour initialiser un tableau, +'array+ value0 [value1...]' pour ajouter des valeurs à un tableau, +'array- value0 [value1...]' pour enlever des valeurs à un tableau. +Les formes 'scalar!=value' et 'array@=value' sont des indirections et +permettent d'initialiser la variable avec la valeur d'une autre +variable. L'avantage est que la résolution de la valeur est faite +uniquement lors de l'appel de cette fonction, ce qui est utile avec des +fonction comme 'after -r' +~~~ +## `runs_conf` +~~~ +Activer les flags $* +~~~ +## `runs_indref` +~~~ +fonction de convenance pour créer des références $3..* avec le fichier de +configuration $1 et les variables $2 +~~~ +## `runs_refcerts` +~~~ +fonction de convenance pour créer une référence à un répertoire contenant +des certificats mentionnés dans le fichier de configuration $1. Si les +références $2..* ne sont pas mentionnées, la variable certsdir dans le +fichier de configuration est utilisée. +~~~ +## `runs_refapacheconfig` +~~~ +fonction de convenance pour créer les références à un répertoire de +configuration pour apache. +USAGE: refapacheconfig autoconfdir=path/to/autoconfdir [certsdir=[path/to/certsdir]] +- autoconfdir= est requis et permet de définir à la fois la variable qui +contiendra la référence ainsi que le répertoire à référencer. +- certsdir= est optionel. Si cet argument est spécifié sous la forme +certsdir=path/to/certsdir, il permet de définir à la fois la variable qui +contiendra la référence ainsi que le répertoire à référencer. Si +l'argument est spécifié sous la forme certsdir=, il permet de définir la +variable qui contiendra la référence. C'est cette variable qui sera lue +dans les fichiers de configuration. Si l'argument n'est pas spécifié, on +considère que l'argument 'certsdir=' a été utilisé. +~~~ +## `runs_set_lang` +~~~ +Charger la valeur de LANG depuis l'environnement. La variable LANG est +initialisée +~~~ +## `runs_set_proxy` +~~~ +Charger la valeur du proxy depuis l'environnement. Les variables +http_proxy, ftp_proxy et no_proxy sont initialisées +~~~ +## `runs_check_confs` +~~~ +Vérifier l'état courant par rapport aux flags +~~~ +## `runs_after` +~~~ +Vérifier que ce script est lancé après le scriptpath $1, par rapport à +RUNSSTORY +~~~ +## `runs_clvars` +~~~ +Traiter les spécifications de variables données en ligne de commande ou +dans un fichier de recettes +~~~ +## `runs_indvars` +~~~ +Résoudre les valeurs effectives des variables qui sont des indirections +~~~ +## `runs_clvars_cmd` +~~~ +écrire la ligne de recette correspondant au script $1 et aux variables +$2..$* +~~~ +## `runs_loadconfs` +## `runs_clearvars` +## `runs_action_desc` +## `runs_action_dump` +## `runs_action_run` +## `runs_action_export` +## `shouldrun` +## `checkdone` +## `requiredone` +## `setdone` +## `resetdone` + +-*- 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_runs.twp b/doc/ulib_runs.twp index 84da791..a3fd072 100644 --- a/doc/ulib_runs.twp +++ b/doc/ulib_runs.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 02/06/2012 09:54 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -90,6 +90,8 @@ considérant que le script sera lancé sur l'hôte $2(=$RUNSHOST), et initialiser les variables RUNSDIR, RUNSSCRIPT, RUNSSCRIPTDIR, RUNSSCRIPTNAME, RUNSDIRPATH et RUNSSCRIPTPATH. Retourner 0 en cas de succès, 1 en cas d'échec. +$6 vaut ".rs" par défaut est c'est une extension à rajouter au nom +spécifié si le fichier sans l'extension n'existe pas RUNSDIR est le répertoire dans lequel a été trouvé le script (parmi les valeurs fournies dans les tableaux RUNSSCRIPTSDIRS, RUNSMODULESDIRS, RUNSHOSTSDIRS), RUNSDIRPATH est le répertoire à partir duquel est exprimé @@ -167,6 +169,33 @@ fonction comme 'after -r' {{{ Activer les flags $* }}} +!! {{{runs_indref}}} +{{{ +fonction de convenance pour créer des références $3..* avec le fichier de +configuration $1 et les variables $2 +}}} +!! {{{runs_refcerts}}} +{{{ +fonction de convenance pour créer une référence à un répertoire contenant +des certificats mentionnés dans le fichier de configuration $1. Si les +références $2..* ne sont pas mentionnées, la variable certsdir dans le +fichier de configuration est utilisée. +}}} +!! {{{runs_refapacheconfig}}} +{{{ +fonction de convenance pour créer les références à un répertoire de +configuration pour apache. +USAGE: refapacheconfig autoconfdir=path/to/autoconfdir [certsdir=[path/to/certsdir]] +- autoconfdir= est requis et permet de définir à la fois la variable qui +contiendra la référence ainsi que le répertoire à référencer. +- certsdir= est optionel. Si cet argument est spécifié sous la forme +certsdir=path/to/certsdir, il permet de définir à la fois la variable qui +contiendra la référence ainsi que le répertoire à référencer. Si +l'argument est spécifié sous la forme certsdir=, il permet de définir la +variable qui contiendra la référence. C'est cette variable qui sera lue +dans les fichiers de configuration. Si l'argument n'est pas spécifié, on +considère que l'argument 'certsdir=' a été utilisé. +}}} !! {{{runs_set_lang}}} {{{ Charger la valeur de LANG depuis l'environnement. La variable LANG est diff --git a/doc/ulib_runsmod.defaults.md b/doc/ulib_runsmod.defaults.md new file mode 100644 index 0000000..03c6f1d --- /dev/null +++ b/doc/ulib_runsmod.defaults.md @@ -0,0 +1,4 @@ +# ulib/runsmod.defaults + + +-*- 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_runsmod.defaults.twp b/doc/ulib_runsmod.defaults.twp new file mode 100644 index 0000000..09ea60a --- /dev/null +++ b/doc/ulib_runsmod.defaults.twp @@ -0,0 +1,8 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: ulib/runsmod.defaults + diff --git a/doc/ulib_runsmod.md b/doc/ulib_runsmod.md new file mode 100644 index 0000000..b848629 --- /dev/null +++ b/doc/ulib_runsmod.md @@ -0,0 +1,30 @@ +# ulib/runsmod + +## `runsmod_checkenv` +~~~ +vérifier l'environement. créer les répertoires nécessaires. +~~~ +## `runsmod_should_update_repolists` +~~~ +tester s'il faut mettre à jour au moins un des fichiers contenant les +listes des dépôts +~~~ +## `runsmod_update_repolists` +~~~ +mettre à jour si nécessaire les fichiers contenant les listes des dépôts. +Si $1 n'est pas vide, forcer la mise à jour de tous les fichiers +~~~ +## `runsmod_setup_vars` +~~~ +récupérer configuration statique pour la mettre à jour +~~~ +## `runsmod_clone_or_pull` +~~~ +Chercher les modules $3..@, pour l'hôte $1 qui est le mode d'hôte: none, +all, self ou one pour un hôte spécifique $2. Ajouter les chemins dans le +tableau REPO_DIRS. Mettre à jour les tableaux SCRIPTS_DIRS, MODULES_DIRS +et HOSTS_DIRS +~~~ +## `runsmod_teardown_vars` + +-*- 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_runsmod.twp b/doc/ulib_runsmod.twp new file mode 100644 index 0000000..20a4f62 --- /dev/null +++ b/doc/ulib_runsmod.twp @@ -0,0 +1,34 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: ulib/runsmod + +!! {{{runsmod_checkenv}}} +{{{ +vérifier l'environement. créer les répertoires nécessaires. +}}} +!! {{{runsmod_should_update_repolists}}} +{{{ +tester s'il faut mettre à jour au moins un des fichiers contenant les +listes des dépôts +}}} +!! {{{runsmod_update_repolists}}} +{{{ +mettre à jour si nécessaire les fichiers contenant les listes des dépôts. +Si $1 n'est pas vide, forcer la mise à jour de tous les fichiers +}}} +!! {{{runsmod_setup_vars}}} +{{{ +récupérer configuration statique pour la mettre à jour +}}} +!! {{{runsmod_clone_or_pull}}} +{{{ +Chercher les modules $3..@, pour l'hôte $1 qui est le mode d'hôte: none, +all, self ou one pour un hôte spécifique $2. Ajouter les chemins dans le +tableau REPO_DIRS. Mettre à jour les tableaux SCRIPTS_DIRS, MODULES_DIRS +et HOSTS_DIRS +}}} +!! {{{runsmod_teardown_vars}}} diff --git a/doc/ulib_semver.md b/doc/ulib_semver.md new file mode 100644 index 0000000..268e795 --- /dev/null +++ b/doc/ulib_semver.md @@ -0,0 +1,33 @@ +# ulib/semver + +## `semver_parse` +## `semver_incmajor` +## `semver_incminor` +## `semver_incpatchlevel` +## `semver_setversion` +## `semver_setprelease` +## `semver_compare_prelease` +## `semver_setmetadata` +## `semver_addmetadata` +## `semver_compare_metadata` +~~~ +même algo que pour prelease +~~~ +## `semver_copy` +## `semver_build` +## `semver_setvar` +## `psemver_parse` +## `psemver_incmajor` +## `psemver_incminor` +## `psemver_incpatchlevel` +## `psemver_setversion` +## `psemver_setprelease` +## `psemver_compare_prelease` +## `psemver_setmetadata` +## `psemver_addmetadata` +## `psemver_compare_metadata` +## `psemver_copy` +## `psemver_build` +## `psemver_setvar` + +-*- 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_semver.twp b/doc/ulib_semver.twp new file mode 100644 index 0000000..2289d1e --- /dev/null +++ b/doc/ulib_semver.twp @@ -0,0 +1,37 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: ulib/semver + +!! {{{semver_parse}}} +!! {{{semver_incmajor}}} +!! {{{semver_incminor}}} +!! {{{semver_incpatchlevel}}} +!! {{{semver_setversion}}} +!! {{{semver_setprelease}}} +!! {{{semver_compare_prelease}}} +!! {{{semver_setmetadata}}} +!! {{{semver_addmetadata}}} +!! {{{semver_compare_metadata}}} +{{{ +même algo que pour prelease +}}} +!! {{{semver_copy}}} +!! {{{semver_build}}} +!! {{{semver_setvar}}} +!! {{{psemver_parse}}} +!! {{{psemver_incmajor}}} +!! {{{psemver_incminor}}} +!! {{{psemver_incpatchlevel}}} +!! {{{psemver_setversion}}} +!! {{{psemver_setprelease}}} +!! {{{psemver_compare_prelease}}} +!! {{{psemver_setmetadata}}} +!! {{{psemver_addmetadata}}} +!! {{{psemver_compare_metadata}}} +!! {{{psemver_copy}}} +!! {{{psemver_build}}} +!! {{{psemver_setvar}}} diff --git a/doc/ulib_service.md b/doc/ulib_service.md new file mode 100644 index 0000000..32a183b --- /dev/null +++ b/doc/ulib_service.md @@ -0,0 +1,29 @@ +# ulib/service + +## `service` +## `service_start` +~~~ +démarrer le service $1 de façon inconditionnelle +~~~ +## `service_startm` +~~~ +démarrer le service $1 s'il n'est pas déjà démarré +~~~ +## `service_stop` +~~~ +arrêter le service $1 de façon inconditionnelle +~~~ +## `service_stopm` +~~~ +arrêter le service $1 s'il n'est pas déjà arrêté +~~~ +## `service_reload` +~~~ +recharger le service $1 +~~~ +## `service_status` +~~~ +tester/afficher le status du service $1 +~~~ + +-*- 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 new file mode 100644 index 0000000..d0bfa1b --- /dev/null +++ b/doc/ulib_sysinfos.md @@ -0,0 +1,62 @@ +# ulib/sysinfos + +## `read_data` +## `dump_data` +## `compute_local_sysinfos` +## `compute_remote_sysinfos` +## `ensure_sysinfos` +~~~ +Essayer de déterminer les valeurs des variables $1(=SYSNAME), $2(=SYSDIST) +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 +~~~ +## `get_sysinfos_desc` +~~~ +Afficher une chaine de la forme SYSNAME/SYSDIST/SYSVER qui décrit le +système actuel +~~~ +## `check_sysinfos` +~~~ +Tester si le système courant ($MYSYSNAME, $MYSYSDIST, $MYSYSVER, $MYBITS) +correspond à au moins un des arguments. +Il est possible de spécifier des variables différentes pour tester le +système courant avec l'option --vars qui doit être spécifiée en premier: +check_sysinfos --vars sysname sysdist sysver bits -d debian +Les options -s, -d, -v, -b permettent respectivement de vérifier le +système, la distribution, la version et le nombre de bits. Il est possible +de spécifier plusieurs tests à effectuer, e.g.: +check_sysinfos -d debian ubuntu -b 64 +pour tester si l'on est sur une distribution debian ou ubuntu *et* sur un +système 64 bits +Note: avec l'option --vars, il peut arriver que sysname, sysdist ou sysver +ne soient pas des tableaux mais des variables scalaires, surtout si elles +sont fournies par l'utilisateur. Il est conseillé dans ce cas de tester +toutes les possibilités quand on vérifie une valeur, e.g.: +check_sysinfos --vars sysname sysdist sysver bits -s linux64 linux32 linux +pour tester si on est sur un système linux +Avec l'option -v, il est possible de suffixer la valeur avec + ou - selon +que l'on veut toutes les versions situées après ou avant la version +spécifiée. Attention, à cause d'une limitation de l'implémentation, il +faut alors impérativement filtrer aussi sur la distribution, e.g: +check_sysinfo -d debian -v lenny+ +pour tester si on est en lenny ou en squeeze. +De même, l'option -d accepte aussi de suffixer la valeur avec + ou -, mais +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+ +~~~ +## `on_debian` +~~~ +Tester si on est sur debian. charger le module debian si c'est le cas. +Si une commande $1..@ est spécifiée, la lancer, mais il n'est alors plus +possible de lancer des tests plus spécifiques avec __on_debian() +~~~ +## `on_debian:` +## `on_stretch` +## `on_jessie` +## `on_wheezy` +## `on_squeeze` +## `on_default` + +-*- 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.twp b/doc/ulib_sysinfos.twp index 0f8d379..00fa623 100644 --- a/doc/ulib_sysinfos.twp +++ b/doc/ulib_sysinfos.twp @@ -1,11 +1,15 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:15 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: ##@title: ulib/sysinfos +!! {{{read_data}}} +!! {{{dump_data}}} +!! {{{compute_local_sysinfos}}} +!! {{{compute_remote_sysinfos}}} !! {{{ensure_sysinfos}}} {{{ Essayer de déterminer les valeurs des variables $1(=SYSNAME), $2(=SYSDIST) @@ -13,16 +17,30 @@ 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 }}} +!! {{{get_sysinfos_desc}}} +{{{ +Afficher une chaine de la forme SYSNAME/SYSDIST/SYSVER qui décrit le +système actuel +}}} !! {{{check_sysinfos}}} {{{ Tester si le système courant ($MYSYSNAME, $MYSYSDIST, $MYSYSVER, $MYBITS) correspond à au moins un des arguments. +Il est possible de spécifier des variables différentes pour tester le +système courant avec l'option --vars qui doit être spécifiée en premier: +check_sysinfos --vars sysname sysdist sysver bits -d debian Les options -s, -d, -v, -b permettent respectivement de vérifier le système, la distribution, la version et le nombre de bits. Il est possible de spécifier plusieurs tests à effectuer, e.g.: check_sysinfos -d debian ubuntu -b 64 pour tester si l'on est sur une distribution debian ou ubuntu *et* sur un système 64 bits +Note: avec l'option --vars, il peut arriver que sysname, sysdist ou sysver +ne soient pas des tableaux mais des variables scalaires, surtout si elles +sont fournies par l'utilisateur. Il est conseillé dans ce cas de tester +toutes les possibilités quand on vérifie une valeur, e.g.: +check_sysinfos --vars sysname sysdist sysver bits -s linux64 linux32 linux +pour tester si on est sur un système linux Avec l'option -v, il est possible de suffixer la valeur avec + ou - selon que l'on veut toutes les versions situées après ou avant la version spécifiée. Attention, à cause d'une limitation de l'implémentation, il @@ -34,3 +52,15 @@ 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+ }}} +!! {{{on_debian}}} +{{{ +Tester si on est sur debian. charger le module debian si c'est le cas. +Si une commande $1..@ est spécifiée, la lancer, mais il n'est alors plus +possible de lancer des tests plus spécifiques avec __on_debian() +}}} +!! {{{on_debian:}}} +!! {{{on_stretch}}} +!! {{{on_jessie}}} +!! {{{on_wheezy}}} +!! {{{on_squeeze}}} +!! {{{on_default}}} diff --git a/doc/ulib_template.md b/doc/ulib_template.md new file mode 100644 index 0000000..8936382 --- /dev/null +++ b/doc/ulib_template.md @@ -0,0 +1,97 @@ +# ulib/template + +## `template_list` +~~~ +Soit $N le séparateur --, lister les fichiers des répertoires sources +$2..$(N-1) qui seraient fusionnés avec template_merge() ou supprimés avec +template_unmerge() du répertoire destination $1. Si des chemins sont spécifiés +avec les arguments $(N+1)..@, ne traiter que les fichiers qui correspondent à +ces spécifications. Exemple: +template_list destdir srcdirs... -- specs... +~~~ +## `template_merge` +~~~ +Soit $N le séparateur --, copier dans le répertoire destination $1 les +fichiers des répertoires sources $2..$(N-1) correspondant aux spécifications +$(N+1)..@, si ces fichiers n'ont pas été modifiés dans le répertoire de +destination. +Les fichiers sources ayant l'extension .template sont ignorés par défaut, sauf +s'ils sonts demandés explicitement. Exemple: +template_merge destdir srcdirs... -- specs... +~~~ +## `template_unmerge` +~~~ +Soit $N le séparateur --, supprimer du répertoire destination $1 les fichiers +provenant des répertoires sources $2..$(N-1) et qui n'ont pas été modifiés. Si +des chemins sont spécifiés avec les arguments $(N+1)..@, ne traiter que les +fichiers qui correspondent à ces spécifications. Exemple: +template_unmerge destdir srcdirs... -- specs... +~~~ +## `template_cleandest` +~~~ +Supprimer dans le répertoire de destination $1 tous les répertoires vides. +Cette fonction est habituellement utilisée après template_unmerge() +Ignorer les chemins qui contiennent .git/ et .svn/ +~~~ +## `template_diff` +~~~ +Afficher les différences entre les fichiers du répertoire de destination $1 et +les fichiers des répertoires sources $2..@ +~~~ +## `template_srcdir` +~~~ +Obtenir le chemin vers le répertoire source de templates $1, situé dans +ULIBDIR/templates +~~~ +## `templatectl_config` +~~~ +Obtenir le chemin vers le fichier de configuration pour le répertoire $1 +Si $2==nohideconfig, utiliser le nom CONFIG.conf, sinon utiliser par défaut +.CONFIG sauf si le fichier CONFIG.conf existe +~~~ +## `templatectl_loadvars` +~~~ +Charger les valeurs des variables depuis le fichier $1 +Les variables suivantes doivent être définies: +- Le tableau TEMPLATECTL_DEFAULTS permet de donner une valeur par défaut aux +variables mentionnées dans TEMPLATE_STATIC_VARS. C'est une liste de valeurs +de la forme 'name=value' +- Le tableau TEMPLATECTL_VARS contient des variables supplémentaires +spécifiées par l'utilisateur. C'est une liste de valeurs de la forme +'name=value' +- TEMPLATE_STATIC_VARS doit contenir une liste de noms de variables qui +peuvent être remplacés dans les fichiers de template. +- TEMPLATE_DYNAMIC_VARS contient une liste de noms de variables valides, mais +qui ne doivent pas être remplacés, en effet, ils sont utilisés pour le +déploiement des fichiers. +- TEMPLATE_NOWRITE_VARS contient une liste de noms de variables qui ne +devraient pas être écrits dans le fichier des variables, sauf si elles +reçoivent une valeur explicite de la part de l'utilisateur. Ce tableau est +mis à jour lors de l'analyse du tableau TEMPLATECTL_VARS +~~~ +## `templatectl_writevars` +~~~ +Ecrire les variables dans le fichier $1 +~~~ +## `templatectl_list_vars` +~~~ +Afficher les valeurs des variables +~~~ +## `templatectl` +~~~ +Fonction de haut niveau qui facilite l'utilisation des fonctions template_* +définir la fonction __display_templatectl_help() pour l'affichage de l'aide +- Le tableau TEMPLATECTL_SRCDIRS doit contenir la liste des répertoires +sources pour les templates. Alternativement, il est possible de définir la +variable TEMPLATECTL_SRCDIR s'il n'y a qu'un seul répertoire source pour le +template +- TEMPLATECTL_CONFIG est le nom de base du fichier à partir duquel sont +chargées les variables et dans lequel sont écrites les variables avec +l'option --write-vars +Si le nom de base est CONFIG, le fichier s'appelera .CONFIG si l'option +--hide-config est utilisée (par défaut) ou CONFIG.conf si l'option +--no-hide-config est utilisée +Les variables de template_loadvars() sont aussi prises en compte +~~~ + +-*- 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_template.twp b/doc/ulib_template.twp new file mode 100644 index 0000000..af28d99 --- /dev/null +++ b/doc/ulib_template.twp @@ -0,0 +1,101 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: ulib/template + +!! {{{template_list}}} +{{{ +Soit $N le séparateur --, lister les fichiers des répertoires sources +$2..$(N-1) qui seraient fusionnés avec template_merge() ou supprimés avec +template_unmerge() du répertoire destination $1. Si des chemins sont spécifiés +avec les arguments $(N+1)..@, ne traiter que les fichiers qui correspondent à +ces spécifications. Exemple: +template_list destdir srcdirs... -- specs... +}}} +!! {{{template_merge}}} +{{{ +Soit $N le séparateur --, copier dans le répertoire destination $1 les +fichiers des répertoires sources $2..$(N-1) correspondant aux spécifications +$(N+1)..@, si ces fichiers n'ont pas été modifiés dans le répertoire de +destination. +Les fichiers sources ayant l'extension .template sont ignorés par défaut, sauf +s'ils sonts demandés explicitement. Exemple: +template_merge destdir srcdirs... -- specs... +}}} +!! {{{template_unmerge}}} +{{{ +Soit $N le séparateur --, supprimer du répertoire destination $1 les fichiers +provenant des répertoires sources $2..$(N-1) et qui n'ont pas été modifiés. Si +des chemins sont spécifiés avec les arguments $(N+1)..@, ne traiter que les +fichiers qui correspondent à ces spécifications. Exemple: +template_unmerge destdir srcdirs... -- specs... +}}} +!! {{{template_cleandest}}} +{{{ +Supprimer dans le répertoire de destination $1 tous les répertoires vides. +Cette fonction est habituellement utilisée après template_unmerge() +Ignorer les chemins qui contiennent .git/ et .svn/ +}}} +!! {{{template_diff}}} +{{{ +Afficher les différences entre les fichiers du répertoire de destination $1 et +les fichiers des répertoires sources $2..@ +}}} +!! {{{template_srcdir}}} +{{{ +Obtenir le chemin vers le répertoire source de templates $1, situé dans +ULIBDIR/templates +}}} +!! {{{templatectl_config}}} +{{{ +Obtenir le chemin vers le fichier de configuration pour le répertoire $1 +Si $2==nohideconfig, utiliser le nom CONFIG.conf, sinon utiliser par défaut +.CONFIG sauf si le fichier CONFIG.conf existe +}}} +!! {{{templatectl_loadvars}}} +{{{ +Charger les valeurs des variables depuis le fichier $1 +Les variables suivantes doivent être définies: +- Le tableau TEMPLATECTL_DEFAULTS permet de donner une valeur par défaut aux +variables mentionnées dans TEMPLATE_STATIC_VARS. C'est une liste de valeurs +de la forme 'name=value' +- Le tableau TEMPLATECTL_VARS contient des variables supplémentaires +spécifiées par l'utilisateur. C'est une liste de valeurs de la forme +'name=value' +- TEMPLATE_STATIC_VARS doit contenir une liste de noms de variables qui +peuvent être remplacés dans les fichiers de template. +- TEMPLATE_DYNAMIC_VARS contient une liste de noms de variables valides, mais +qui ne doivent pas être remplacés, en effet, ils sont utilisés pour le +déploiement des fichiers. +- TEMPLATE_NOWRITE_VARS contient une liste de noms de variables qui ne +devraient pas être écrits dans le fichier des variables, sauf si elles +reçoivent une valeur explicite de la part de l'utilisateur. Ce tableau est +mis à jour lors de l'analyse du tableau TEMPLATECTL_VARS +}}} +!! {{{templatectl_writevars}}} +{{{ +Ecrire les variables dans le fichier $1 +}}} +!! {{{templatectl_list_vars}}} +{{{ +Afficher les valeurs des variables +}}} +!! {{{templatectl}}} +{{{ +Fonction de haut niveau qui facilite l'utilisation des fonctions template_* +définir la fonction __display_templatectl_help() pour l'affichage de l'aide +- Le tableau TEMPLATECTL_SRCDIRS doit contenir la liste des répertoires +sources pour les templates. Alternativement, il est possible de définir la +variable TEMPLATECTL_SRCDIR s'il n'y a qu'un seul répertoire source pour le +template +- TEMPLATECTL_CONFIG est le nom de base du fichier à partir duquel sont +chargées les variables et dans lequel sont écrites les variables avec +l'option --write-vars +Si le nom de base est CONFIG, le fichier s'appelera .CONFIG si l'option +--hide-config est utilisée (par défaut) ou CONFIG.conf si l'option +--no-hide-config est utilisée +Les variables de template_loadvars() sont aussi prises en compte +}}} diff --git a/doc/ulib_tiddlywiki.md b/doc/ulib_tiddlywiki.md new file mode 100644 index 0000000..5000bb5 --- /dev/null +++ b/doc/ulib_tiddlywiki.md @@ -0,0 +1,111 @@ +# ulib/tiddlywiki + +## `twget_version` +~~~ +lire le numéro de version dans le fichier $1 +~~~ +## `twdump_header` +~~~ +lire et afficher le contenu avant-storeArea du tiddlywiki $1 +~~~ +## `twdump_footer` +~~~ +lire et afficher le contenu après-storeArea du tiddlywiki $1 +~~~ +## `twdump_storeArea` +~~~ +lire et afficher le storeArea dans le tiddlywiki $1 +~~~ +## `twreplace_storeArea` +~~~ +dans le tiddlywiki $1, remplacer le storeArea par le fichier $2 (par défaut, lu sur stdin) +~~~ +## `twupgrade` +~~~ +mettre à jour le tiddlywiki $1 sur la base du tiddlywiki plus récent $2 +~~~ +## `twdate_curtwp` +~~~ +obtenir la date courante dans le format "dd/mm/YYYY HH:MM" exprimée dans +l'heure locale +$1 est éventuellement la date exprimée en nombre de secondes depuis +l'epoch, exprimée dans l'heure locale +~~~ +## `twdate_tid2twp` +~~~ +Transformer $1, une date de la forme "YYYYmmddHHMM" exprimée dans le +timezone UTC en une chaine "dd/mm/YYYY HH:MM" exprimée dans l'heure locale +Si $1 n'est pas dans le bon format, ne rien afficher +~~~ +## `twdate_curtid` +~~~ +obtenir la date courante dans le format "YYYYmmddHHMM" exprimée dans le +timezone UTC +$1 est éventuellement la date exprimée en nombre de secondes depuis +l'epoch, exprimée dans l'heure locale +~~~ +## `twdate_twp2tid` +~~~ +Transformer $1, une date de la forme "dd/mm/YYYY HH:MM" exprimée en heure +locale en une chaine "YYYYmmddHHMM" exprimée dans le timezone UTC +Si $1 n'est pas dans le bon format, ne rien afficher +~~~ +## `twdump_tiddlers` +~~~ +dumper les tiddlers du fichier $1 généré avec twdump_storeArea() sous +forme d'une liste d'appel de fonction '__tiddler_data title creator +modifier created modified tags changecount content' +Les arguments de la fonction sont les valeurs brutes du tiddler, qui ont +simplement été corrigées avec unquote_html() +~~~ +## `dump_tiddler` +## `twdump_twpage` +~~~ +Dumper le contenu de la twpage $1 sous forme d'un appel à une function +'__twpage_data title creator modifier created modified tags changecount +content' +Les arguments de la fonction sont les valeurs brutes de la twpage, sauf +que le champ modified contient toujours la date de dernière modification +du fichier. +~~~ +## `twwrite_tiddler` +~~~ +Ecrire sur STDOUT le tiddler correspondant aux paramètres sont spécifiés +sur la ligne de commande. Les arguments sont les valeurs brutes prises de +la twpage, telles qu'elles sont générées par twdump_twpage() +~~~ +## `twcheck_twpage_modified` +~~~ +Vérifier si la twpage $1 peut être écrasée par un tiddler dont la date de +modification est $2, de format "YYYYmmddHHMM" exprimée dans le timezone +UTC +C'est le cas si le fichier $1 n'existe pas, ou a une date de modification +antérieure à $2 +~~~ +## `twcheck_twpage_newtwpage` +~~~ +Vérifier si la twpage $1 peut être écrasée par la twpage $2 +C'est le cas si le fichier $1 n'existe pas, ou a une date de modification +antérieure à $2 +~~~ +## `twwrite_twpage` +~~~ +Ecrire dans le répertoire courant le fichier correspondant au tiddler dont +les paramètres sont spécifiés sur la ligne de commande. Les arguments sont +les valeurs brutes prises du tiddler, telles qu'elles sont générées par +twdump_tiddlers() +Retourner 0 si le fichier a été écrasé, 1 s'il n'a pas été écrasé parce +qu'il n'a pas été modifié, 2 s'il n'a pas été écrasé parce qu'il est plus +récent. +Si TW_VERBOSE=1, afficher un message informatif lors de l'export +~~~ +## `export_to_twpages` +~~~ +Exporter tous les tiddlers du tiddlywiki $1 dans le répertoire $2 +~~~ +## `import_from_twpages` +~~~ +Remplacer les tiddlers du tiddlywiki $1 par les twpages du répertoire $2 +~~~ + +-*- 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_udir.md b/doc/ulib_udir.md new file mode 100644 index 0000000..59b0ca3 --- /dev/null +++ b/doc/ulib_udir.md @@ -0,0 +1,57 @@ +# ulib/udir + +## `udir_check` +~~~ +Vérifier si le fichier $1 existe +Si $1 est un répertoire, prendre $1/.udir +~~~ +## `udir_create_maybe` +~~~ +Si le fichier $1 n'existe pas, le créer comme un template .udir +Si $1 est un répertoire, prendre $1/.udir +~~~ +## `udir_dump` +~~~ +Dumper toutes les variables définies pour le fichier $1 +Si $1 est un répertoire, prendre $1/.udir +~~~ +## `udir_eval` +~~~ +Evaluer la commande "$2..$*" dans le contexte des variables définies pour +le répertoire $1. La commande est évaluée dans un sous-shell pour ne pas +polluer l'espace de noms courant. +~~~ +## `udir_dump_all` +~~~ +Dumper toutes les variables définies pour le répertoire $1 et *tous ses +parents* jusqu'à la racine +~~~ +## `udir_eval_all` +~~~ +Evaluer la commande "$2..$*" dans le contexte des variables définies pour +le répertoire $1 et *tous ses parents* jusqu'à la racine +~~~ +## `udir_parse` +~~~ +Dans le fichier $1, lire les noms des variables +Si $1 est un répertoire, prendre $1/.udir +Les noms des variables sont placés dans le tableau $2(=UDIR_VARS), et les noms +des tableaux sont placés dans le tableau $3(=UDIR_ARRAYS) +note: les regex qui sont entre "" au lieu de // le sont à cause d'un bug +de awk sous macosx +~~~ +## `udir_update` +~~~ +Dans le fichier $1, mettre à jour les variables $2..* +Si $1 est un répertoire, prendre $1/.udir +Chaque argument de cette fonction est de la forme name[=value] +Si value n'est pas précisée, la variable obtient une valeur nulle +(i.e. var=) +Si la variable ne figure pas dans le fichier, elle est rajoutée à la fin +du fichier. +Cette fonction nécessite gawk. +~~~ +## `write_unseen` +## `udir_edit` + +-*- 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_uenv.md b/doc/ulib_uenv.md new file mode 100644 index 0000000..4493c28 --- /dev/null +++ b/doc/ulib_uenv.md @@ -0,0 +1,4 @@ +# ulib/uenv + + +-*- 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_uenv_update.md b/doc/ulib_uenv_update.md new file mode 100644 index 0000000..84cb748 --- /dev/null +++ b/doc/ulib_uenv_update.md @@ -0,0 +1,25 @@ +# ulib/uenv_update + +## `uenv_update_dir` +~~~ +Mettre à jour l'ordre de chargement pour le répertoire $1 qui contient des +fichiers de profil pour le shell. L'ordre dans lequel le fichiers de +profil doivent être chargé est écrit dans le fichier $1/.source_in_order +Si $2 est spécifié, il s'agit d'un fichier temporaire utilisé pour les +calculs de l'ordre des chargements. +$3(=$1) est le répertoire de destination. Si $1 est un répertoire de +préparation temporaire, on peut spécifier grâce à $3 quel est le +répertoire final après préparation. +S'ils sont spécifiés, les arguments $4..* sont des répertoires contenant +des fichiers de profils supplémentaires qu'il faut considérer aussi. Dans +ce cas, $3 est ignoré. +~~~ +## `uenv_set_destdirs` +## `uenv_sourced_in` +~~~ +vérifier que l'un des fichiers $2..$* est sourcé dans $1 +~~~ +## `uenv_configure_profiles` +## `uenv_install_profiles` + +-*- 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_uenv_update.twp b/doc/ulib_uenv_update.twp index c85a44d..954c69f 100644 --- a/doc/ulib_uenv_update.twp +++ b/doc/ulib_uenv_update.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:15 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -16,6 +16,9 @@ calculs de l'ordre des chargements. $3(=$1) est le répertoire de destination. Si $1 est un répertoire de préparation temporaire, on peut spécifier grâce à $3 quel est le répertoire final après préparation. +S'ils sont spécifiés, les arguments $4..* sont des répertoires contenant +des fichiers de profils supplémentaires qu'il faut considérer aussi. Dans +ce cas, $3 est ignoré. }}} !! {{{uenv_set_destdirs}}} !! {{{uenv_sourced_in}}} diff --git a/doc/ulib_uinc.md b/doc/ulib_uinc.md new file mode 100644 index 0000000..3934716 --- /dev/null +++ b/doc/ulib_uinc.md @@ -0,0 +1,5 @@ +# ulib/uinc + +## `uinc` + +-*- 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_uinst.md b/doc/ulib_uinst.md new file mode 100644 index 0000000..6f5399a --- /dev/null +++ b/doc/ulib_uinst.md @@ -0,0 +1,15 @@ +# ulib/uinst + +## `uinst` +~~~ +lancer uinst en déclarant les variables locales, de façon à ne pas polluer +l'environnement de l'appelant. +~~~ +## `uinst_nolocal` +~~~ +Interface en mode ligne de commande pour uinst. Appeler cette fonction +avec les paramètres de la ligne de commande, e.g.: +uinst_nolocal "$@" +~~~ + +-*- 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_uinst.twp b/doc/ulib_uinst.twp index a514ce2..baa25be 100644 --- a/doc/ulib_uinst.twp +++ b/doc/ulib_uinst.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:15 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -15,5 +15,5 @@ l'environnement de l'appelant. {{{ Interface en mode ligne de commande pour uinst. Appeler cette fonction avec les paramètres de la ligne de commande, e.g.: -uinst_clui "$@" +uinst_nolocal "$@" }}} diff --git a/doc/ulib_ulib.md b/doc/ulib_ulib.md new file mode 100644 index 0000000..87c874e --- /dev/null +++ b/doc/ulib_ulib.md @@ -0,0 +1,37 @@ +# ulib/ulib + +## `eerror` +## `die` +## `uprovided` +~~~ +Tester si le module $1 a déjà été chargé par urequire +~~~ +## `uprovide` +~~~ +Spécifier que le module $1 a été sourcée, ou prétendre que c'est le cas. +Retourner 1 si le module était déjà pourvu, 0 si c'est la première fois +qu'on le pourvoit +~~~ +## `urequire` +~~~ +Sourcer un module recherché dans ULIBDIRS +Le module DEFAULTS est traité de façon particulière: si le fichier associé +n'est pas trouvé, charger base, pretty, sysinfos et compat à la place +Si un module n'est pas trouvé, quitter le script avec die() +~~~ +## `ulibadd` +~~~ +Ajouter $1 au chemin de recherche de urequire +~~~ +## `ulibsync` +~~~ +Synchroniser les modules de ulib dans le répertoire $1 +~~~ +## `ulibver` +~~~ +Vérifier que la version actuelle de ulib est au moins à la version $1 +(inclue) et éventuellement au plus à la version $2 (exclue) +~~~ +## `ulibver_require` + +-*- 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_ulib.twp b/doc/ulib_ulib.twp index d20e5c8..33986f8 100644 --- a/doc/ulib_ulib.twp +++ b/doc/ulib_ulib.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:15 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -10,24 +10,32 @@ !! {{{die}}} !! {{{uprovided}}} {{{ -Tester si la ulibrairie $1 a déjà été chargé par urequire +Tester si le module $1 a déjà été chargé par urequire }}} !! {{{uprovide}}} {{{ -Spécifier que la ulibrairie $1 a été sourcée, ou prétendre que c'est le -cas. +Spécifier que le module $1 a été sourcée, ou prétendre que c'est le cas. +Retourner 1 si le module était déjà pourvu, 0 si c'est la première fois +qu'on le pourvoit }}} !! {{{urequire}}} {{{ -Sourcer un fichier recherché dans ULIBDIRS -Si le fichier est DEFAULTS, charger base, pretty, sysinfos et compat à la -place +Sourcer un module recherché dans ULIBDIRS +Le module DEFAULTS est traité de façon particulière: si le fichier associé +n'est pas trouvé, charger base, pretty, sysinfos et compat à la place +Si un module n'est pas trouvé, quitter le script avec die() }}} -!! {{{ulib_add}}} +!! {{{ulibadd}}} {{{ Ajouter $1 au chemin de recherche de urequire }}} -!! {{{ulib_sync}}} +!! {{{ulibsync}}} {{{ -Synchroniser les librairies ulib dans le répertoire $1 +Synchroniser les modules de ulib dans le répertoire $1 }}} +!! {{{ulibver}}} +{{{ +Vérifier que la version actuelle de ulib est au moins à la version $1 +(inclue) et éventuellement au plus à la version $2 (exclue) +}}} +!! {{{ulibver_require}}} diff --git a/doc/ulib_ulibsh.md b/doc/ulib_ulibsh.md new file mode 100644 index 0000000..f87d9a1 --- /dev/null +++ b/doc/ulib_ulibsh.md @@ -0,0 +1,13 @@ +# ulib/ulibsh + +## `eerror` +## `die` +## `uprovided` +## `uprovide` +## `urequire` +## `ulibadd` +## `ulibsync` +## `ulibver` +## `ulibver_require` + +-*- 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_ulibsh.twp b/doc/ulib_ulibsh.twp index 7253c50..5ac59be 100644 --- a/doc/ulib_ulibsh.twp +++ b/doc/ulib_ulibsh.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:15 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -11,5 +11,7 @@ !! {{{uprovided}}} !! {{{uprovide}}} !! {{{urequire}}} -!! {{{ulib_add}}} -!! {{{ulib_sync}}} +!! {{{ulibadd}}} +!! {{{ulibsync}}} +!! {{{ulibver}}} +!! {{{ulibver_require}}} diff --git a/doc/ulib_vcs.md b/doc/ulib_vcs.md new file mode 100644 index 0000000..f65731a --- /dev/null +++ b/doc/ulib_vcs.md @@ -0,0 +1,157 @@ +# ulib/vcs + +## `vcs_getvcs_help` +## `vcs_getvcs` +## `vcs_getroot_help` +## `vcs_getroot` +## `vcs_getrepos_help` +## `vcs_getrepos` +## `vcs_geturl_help` +## `vcs_geturl` +## `vcs_vcs_help` +## `vcs_vcs` +## `vcs_add_help` +## `vcs_add` +~~~ +le répertoire de référence est le répertoire du premier fichier ajouté +~~~ +## `vcs_remove_help` +## `vcs_remove` +~~~ +le répertoire de référence est le répertoire du premier fichier supprimé +~~~ +## `vcs_copy_help` +## `vcs_copy` +~~~ +le répertoire de référence est le répertoire de destination +~~~ +## `vcs_move_help` +## `vcs_move` +~~~ +le répertoire de référence est le répertoire de destination +~~~ +## `vcs_mkdir_help` +## `vcs_mkdir` +~~~ +le répertoire de référence est le répertoire du premier répertoire créé +~~~ +## `vcs_commit_help` +## `vcs_commit` +## `vcs_status_help` +## `vcs_status` +## `vcs_update_help` +## `vcs_update` +## `vcs_push_help` +## `vcs_push` +## `vcs_diff_help` +## `vcs_diff` +## `vcs_tag_help` +## `vcs_tag` +## `git_getrepos` +## `git_geturl` +## `git_have_annex` +## `git_add` +## `git_remove` +## `git_copy` +## `git_move` +## `git_mkdir` +## `git_commit` +## `git_status` +## `git_update` +## `git_push` +## `git_diff` +## `git_tag` +## `git_check_gitvcs` +## `git_ensure_gitvcs` +## `git_list_branches` +## `git_list_rbranches` +## `git_list_pbranches` +~~~ +lister les branches locales et celles qui existent dans l'origine +$1(=origin) et qui pourraient devenir une branche locale avec la commande +git checkout -b +~~~ +## `git_have_branch` +## `git_have_rbranch` +## `git_get_branch` +## `git_get_branch_remote` +## `git_get_branch_merge` +## `git_get_branch_rbranch` +## `git_is_branch` +## `git_have_remote` +## `git_track_branch` +## `git_ensure_branch` +~~~ +retourner 0 si la branche a été créée, 1 si elle existait déjà, 2 en cas d'erreur +~~~ +## `git_check_cleancheckout` +~~~ +vérifier qu'il n'y a pas de modification locales dans le dépôt +correspondant au répertoire courant. +~~~ +## `git_ensure_cleancheckout` +## `git_is_ancestor` +~~~ +vérifier que la branche $1 est un ancêtre direct de la branche $2, qui +vaut par défaut refs/remotes/${3:-origin}/$1 +note: cette fonction retourne vrai si $1 et $2 identifient le même commit +~~~ +## `git_should_ff` +~~~ +vérifier si la branche $1 devrait être fast-forwardée à partir de la +branche d'origine $2, qui vaut par défaut refs/remotes/${3:-origin}/$1 +note: cette fonction est similaire à git_is_ancestor(), mais retourne +false si $1 et $2 identifient le même commit +~~~ +## `git_should_push` +~~~ +vérifier si la branche $1 devrait être poussée vers la branche de même nom +dans l'origine $2(=origin), parce que l'origin peut-être fast-forwardée à +partir de cette branche. +~~~ +## `git_fast_forward` +~~~ +vérifier que la branche courante est bien $1, puis tester s'il faut la +fast-forwarder à partir de la branche d'origine $2, puis le faire si c'est +nécessaire. la branche d'origine $2 vaut par défaut refs/remotes/origin/$1 +~~~ +## `git_is_merged` +~~~ +vérifier que les branches $1 et $2 ont un ancêtre commun, et que la +branche $1 a été complètement fusionnée dans la branche destination $2 +~~~ +## `git_annex_initial` +~~~ +sur le dépôt $1 fraichement cloné, vérifier s'il faut faire git annex +init. Si oui, l'initialiser avec le nom d'hôte, et récupérer tous les +fichiers annexés +retourner 1 si une erreur s'est produite +~~~ +## `svn_getrepos` +## `svn_geturl` +## `svn_add` +## `svn_remove` +## `svn_copy` +## `svn_move` +## `svn_mkdir` +## `svn_commit` +## `svn_status` +## `svn_update` +## `svn_push` +## `svn_diff` +## `svn_tag` +## `cvs_getrepos` +## `cvs_geturl` +## `cvs_add` +## `cvs_remove` +## `cvs_copy` +## `cvs_move` +## `cvs_mkdir` +## `cvs_commit` +## `cvs_status` +## `cvs_update` +## `cvs_push` +## `cvs_diff` +## `cvs_tag` + +-*- 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_vcs.twp b/doc/ulib_vcs.twp index 42c8ab6..fba8f5e 100644 --- a/doc/ulib_vcs.twp +++ b/doc/ulib_vcs.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:15 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -47,12 +47,15 @@ le répertoire de référence est le répertoire du premier répertoire créé !! {{{vcs_status}}} !! {{{vcs_update_help}}} !! {{{vcs_update}}} +!! {{{vcs_push_help}}} +!! {{{vcs_push}}} !! {{{vcs_diff_help}}} !! {{{vcs_diff}}} !! {{{vcs_tag_help}}} !! {{{vcs_tag}}} !! {{{git_getrepos}}} !! {{{git_geturl}}} +!! {{{git_have_annex}}} !! {{{git_add}}} !! {{{git_remove}}} !! {{{git_copy}}} @@ -61,8 +64,75 @@ le répertoire de référence est le répertoire du premier répertoire créé !! {{{git_commit}}} !! {{{git_status}}} !! {{{git_update}}} +!! {{{git_push}}} !! {{{git_diff}}} !! {{{git_tag}}} +!! {{{git_check_gitvcs}}} +!! {{{git_ensure_gitvcs}}} +!! {{{git_list_branches}}} +!! {{{git_list_rbranches}}} +!! {{{git_list_pbranches}}} +{{{ +lister les branches locales et celles qui existent dans l'origine +$1(=origin) et qui pourraient devenir une branche locale avec la commande +git checkout -b +}}} +!! {{{git_have_branch}}} +!! {{{git_have_rbranch}}} +!! {{{git_get_branch}}} +!! {{{git_get_branch_remote}}} +!! {{{git_get_branch_merge}}} +!! {{{git_get_branch_rbranch}}} +!! {{{git_is_branch}}} +!! {{{git_have_remote}}} +!! {{{git_track_branch}}} +!! {{{git_ensure_branch}}} +{{{ +retourner 0 si la branche a été créée, 1 si elle existait déjà, 2 en cas d'erreur +}}} +!! {{{git_check_cleancheckout}}} +{{{ +vérifier qu'il n'y a pas de modification locales dans le dépôt +correspondant au répertoire courant. +}}} +!! {{{git_ensure_cleancheckout}}} +!! {{{git_is_ancestor}}} +{{{ +vérifier que la branche $1 est un ancêtre direct de la branche $2, qui +vaut par défaut refs/remotes/${3:-origin}/$1 +note: cette fonction retourne vrai si $1 et $2 identifient le même commit +}}} +!! {{{git_should_ff}}} +{{{ +vérifier si la branche $1 devrait être fast-forwardée à partir de la +branche d'origine $2, qui vaut par défaut refs/remotes/${3:-origin}/$1 +note: cette fonction est similaire à git_is_ancestor(), mais retourne +false si $1 et $2 identifient le même commit +}}} +!! {{{git_should_push}}} +{{{ +vérifier si la branche $1 devrait être poussée vers la branche de même nom +dans l'origine $2(=origin), parce que l'origin peut-être fast-forwardée à +partir de cette branche. +}}} +!! {{{git_fast_forward}}} +{{{ +vérifier que la branche courante est bien $1, puis tester s'il faut la +fast-forwarder à partir de la branche d'origine $2, puis le faire si c'est +nécessaire. la branche d'origine $2 vaut par défaut refs/remotes/origin/$1 +}}} +!! {{{git_is_merged}}} +{{{ +vérifier que les branches $1 et $2 ont un ancêtre commun, et que la +branche $1 a été complètement fusionnée dans la branche destination $2 +}}} +!! {{{git_annex_initial}}} +{{{ +sur le dépôt $1 fraichement cloné, vérifier s'il faut faire git annex +init. Si oui, l'initialiser avec le nom d'hôte, et récupérer tous les +fichiers annexés +retourner 1 si une erreur s'est produite +}}} !! {{{svn_getrepos}}} !! {{{svn_geturl}}} !! {{{svn_add}}} @@ -73,6 +143,7 @@ le répertoire de référence est le répertoire du premier répertoire créé !! {{{svn_commit}}} !! {{{svn_status}}} !! {{{svn_update}}} +!! {{{svn_push}}} !! {{{svn_diff}}} !! {{{svn_tag}}} !! {{{cvs_getrepos}}} @@ -85,5 +156,6 @@ le répertoire de référence est le répertoire du premier répertoire créé !! {{{cvs_commit}}} !! {{{cvs_status}}} !! {{{cvs_update}}} +!! {{{cvs_push}}} !! {{{cvs_diff}}} !! {{{cvs_tag}}} diff --git a/doc/ulib_virsh.md b/doc/ulib_virsh.md new file mode 100644 index 0000000..c5bd705 --- /dev/null +++ b/doc/ulib_virsh.md @@ -0,0 +1,18 @@ +# ulib/virsh + +## `virsh_filter` +~~~ +filtrer une sortie liste de virsh. En pratique, ne prendre que les lignes +non vides à partir de la ligne "----*" +~~~ +## `virsh_list` +## `virsh_pool_list` +## `guess_vm_type` +~~~ +Afficher hn, kvm, vmware, virtualbox ou openvz suivant que l'on est +*probablement* respectivement sur une machine physique, une machine +virtuelle kvm, vmware, virtualbox, openvz +XXX pour le moment, seuls openvz, kvm et hn sont supportés +~~~ + +-*- 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_webobjects.md b/doc/ulib_webobjects.md new file mode 100644 index 0000000..79d26e4 --- /dev/null +++ b/doc/ulib_webobjects.md @@ -0,0 +1,176 @@ +# ulib/webobjects + +## `compute_webobjects_prefixes` +## `recompute_webobjects_prefixes` +## `get_NEXT_ROOT_prefix` +## `get_WOROOT_prefix` +## `get_LOCALROOT_prefix` +## `get_SYSTEMFRAMEWORKS_prefix` +## `get_WOEXTENSIONS_prefix` +## `get_WOFRAMEWORKS_prefix` +## `get_WOAPPLICATIONS_prefix` +## `get_WOCONFIGURATION_prefix` +## `get_WOAUTOSTART_prefix` +## `get_WOLOGS_prefix` +## `get_WOVERSION_prefix` +## `is_wobundle` +~~~ +Tester si $1 a un nom de bundle valide, c'est à dire avec l'extension .woa +ou .framework +~~~ +## `is_woappdir` +~~~ +Tester si $1 est un répertoire d'application webobjects. Le test est +effectué sur le contenu du bundle, pas sur le nom (utiliser is_wobundle() +pour cela) +~~~ +## `is_wofwkdir` +~~~ +Tester si $1 est un répertoire de framework webobjects. Le test est +effectué sur le contenu du bundle, pas sur le nom (utiliser is_wobundle() +pour cela) +~~~ +## `get_app_winclspth` +~~~ +calculer la valeur de Contents/Windows/CLSSPATH.txt pour l'application $1 +~~~ +## `get_infofile` +~~~ +Obtenir le chemin vers le fichier Info.plist dans le répertoire de +resource du bundle $1 +~~~ +## `read_infofile` +~~~ +Lire la version et le numéro de release dans le fichier $1 (chemin vers +Info.plist) et les placer dans les variables $2(=version) et $3(=release) +Retourner 1 si un erreur s'est produite, par exemple si le fichier $1 +n'existe pas ou n'est pas accessible en lecture +~~~ +## `write_infofile` +~~~ +Ecrire $2 (la version) et $3 (le numéro de release) dans le fichier $1 +(chemin vers Info.plist) +Retourner 1 si un erreur s'est produite, par exemple si le fichier $1 +n'existe pas +~~~ +## `get_jawotoolsfile` +~~~ +Obtenir le chemin vers le fichier jawotools.properties dans le bundle $1 +~~~ +## `read_jawotoolsfile` +~~~ +lire le fichier de propriété $1 et placer les valeurs dans les variables +$2(=version), $3(=releaseDate), $4(=description) +~~~ +## `save_jawotoolsfile` +~~~ +écrire le fichier de propriété $1 avec les valeurs version ($2), +releaseDate ($3) et description ($4) +~~~ +## `get_versionfile` +~~~ +Obtenir le chemin vers le fichier VERSION.txt dans le répertoire de +resource du bundle $1 +~~~ +## `get_configfile` +~~~ +obtenir le chemin vers le fichier de configuration du répertoire de +resource du bundle +$1=bundle ou resdir (appdir/Contents/Resources ou fwkdir/Resources) +~~~ +## `searchreplace_classpath` +~~~ +Dans les fichiers classpath de l'application $1, remplacer $2 par $3. Si +$3 est vide, la ligne est supprimée +~~~ +## `dump_jars` +~~~ +Afficher les jars des frameworks utilisés par l'application $1 +~~~ +## `dump_frameworks` +~~~ +Afficher les frameworks utilisés par l'application $1 +~~~ +## `remove_framework` +~~~ +supprimer le framework $2 (nom de base) des fichiers de classpath du +bundle d'application $1 +~~~ +## `add_framework` +~~~ +s'il n'y existe pas déjà, ajouter le framework $2 (nom de base ou chemin +absolu) aux fichiers de classpath du bundle d'application $1 +~~~ +## `fix_jars_case` +~~~ +Vérifier que la casse des jars de tous les frameworks utilisés par +l'application $1 est conforme au système de fichier +~~~ +## `verifix_bundle` +~~~ +vérifier et corriger le bundle $1. Pour une application, on vérifie que le +script est exécutable. Pour un framework, on vérifie que le framework est +conforme au modèle des framework générés par WebObjects. +~~~ +## `compute_fapps` +~~~ +Placer dans le tableau $1(=fappnames) la liste des noms de bundle +d'applications qui dépendent du framework $2 +Cette opération est faite à partir des informations sur le système de +fichier. Elle ne peut donc concerner qu'une installation locale. +~~~ +## `woraurl` +~~~ +Faire une requête avec la méthode $1 sur l'url $2 avec le payload $3 (par +exemple pour la méthode POST). la réponse est disponible dans le fichier +$WORAURL_DATA, $4(=http_code) contient le code de réponse. +Retourner 0 en cas de succès, ou une valeur différente de zéro si un +erreur se produit (typiquement, 3 pour une erreur du serveur, 1 pour une +réponse applicative, comme par exemple si l'application n'existe pas) +Les codes de réponse 2xx et 417 sont des succès +Les autres codes (à priori 4xx ou 5xx) sont des erreurs +note: le code 417 est utilisé par le moniteur pour répondre "Non", par +opposition à 200 utilisé pour répondre "OUI" +~~~ +## `wogeturl` +## `splitins` +~~~ +Analyser le nom $1, qui peut être de forme '', 'Name.woa', +'Name.framework', 'App' ou 'Instance-N' (où N est un nombre), et +initialiser les variables $2(=type) et $3(=name) +Si $1=="", type=all et name="" +Si $1==Name.woa, type=woa et name=Name.woa +Si $1==Name.framework, type=fwk et name=Name.framework +Si $1==App, type=app et name=App +si $1==App-N, type=ins et name=App-N +~~~ +## `create_wodirs_maybe` +## `check_autostart` +~~~ +vérifier la présence du fichier $WOAUTOSTART. Si ce n'est pas le cas, le +créer avec le contenu du tableau $1 +~~~ +## `get_autostart_order` +~~~ +Initialiser le tableau $1 avec la liste donnée dans le fichier +$WOAUTOSTART +~~~ +## `apply_autostart_order` +~~~ +Réordonner les valeurs $3..* selon la liste donnée dans le tableau $2, +puis placer le résultat dans le tableau $1. $2 doit être construit avec +get_autostart_order(). Si $2 n'est pas spécifié, la liste est construite +localement. +Si le tableau contient des lignes de délai @N, replacer les délais après +les applications appropriées +~~~ +## `wotaskd_stop` +## `wotaskd_start` +## `javamonitor_stop` +## `womonitor_stop` +## `javamonitor_start` +## `womonitor_start` +## `woservices_stop` +## `woservices_start` + +-*- 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_woinst.md b/doc/ulib_woinst.md new file mode 100644 index 0000000..dbb9859 --- /dev/null +++ b/doc/ulib_woinst.md @@ -0,0 +1,8 @@ +# ulib/woinst + +## `date2version` +## `woconf` +## `wotag` +## `woinst` + +-*- 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_wondermonitor.md b/doc/ulib_wondermonitor.md new file mode 100644 index 0000000..f49ad36 --- /dev/null +++ b/doc/ulib_wondermonitor.md @@ -0,0 +1,215 @@ +# ulib/wondermonitor + +## `wom__statistics` +~~~ +Afficher les statistiques pour le serveur $1, avec éventuellement le mot +de passe $2 +~~~ +## `wom__info` +~~~ +Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe +$3, et afficher des informations sur l'application $1 (par défaut, all) +~~~ +## `wom__info_filter` +~~~ +filtrer le résultat de wom__info en ne gardant que les tags +name, state, activeSessions, autoRecover, deaths, host, port +~~~ +## `wom_info` +~~~ +Contacter le moniteur sur l'hôte $3, avec éventuellement le mot de passe +$4, et initialiser le tableau $1 avec une liste de valeurs quotés de la +forme: +"'name' 'state' 'activeSessions' 'autoRecover' 'deaths' 'host' 'port'" +concernant l'application $2 (par défaut, toutes les applications). Notez +qu'il y a une ligne par instance d'application +Ces valeurs peuvent être utilisées comme arguments d'une fonction. par +exemple: +wom_info appinfos "" host pw +for args in "${appinfos[@]}"; do +eval "userfunc $args" +done +~~~ +## `wom_getValidAndRunning` +~~~ +Placer la liste des applications valides dans le tableau $1(=valid_apps) +et la liste des applications qui tournent dans le tableau +$2=(running_apps), en contactant le moniteur sur l'hôte $3, avec +éventuellement le mot de passe $4. +~~~ +## `show_appinfo` +~~~ +Afficher des informations sur une application. Les arguments doivent être +le résultat de la fonction wom_info() +~~~ +## `wom_running` +~~~ +Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe +$3, et tester si l'application $1 (par défaut, all) tourne actuellement +~~~ +## `wom_start` +~~~ +Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe +$3, et démarrer l'application $1 (par défaut, all) +~~~ +## `wom_stopped` +~~~ +Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe +$3, et tester si l'application $1 (par défaut, all) est actuellement arrêtée +~~~ +## `wom_stop` +~~~ +Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe +$3, et arrêter l'application $1 (par défaut, all) +~~~ +## `wom_forceQuit` +~~~ +Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe +$3, et forcer l'arrêt de l'application $1 (par défaut, all) +~~~ +## `wom_turnScheduledOn` +~~~ +Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe +$3, et activer le flag scheduled sur l'application $1 (par défaut, all) +~~~ +## `wom_turnScheduledOff` +~~~ +Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe +$3, et désactiver le flag scheduled sur l'application $1 (par défaut, all) +~~~ +## `wom_turnRefuseNewSessionOn` +~~~ +Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe +$3, et activer le flag refuseNewSession sur l'application $1 (par défaut, +all) +~~~ +## `wom_turnRefuseNewSessionOff` +~~~ +Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe +$3, et désactiver le flag refuseNewSession sur l'application $1 (par +défaut, all) +~~~ +## `wom_turnAutoRecoverOn` +~~~ +Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe +$3, et activer le flag autoRecover sur l'application $1 (par défaut, all) +~~~ +## `wom_turnAutoRecoverOff` +~~~ +Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe +$3, et désactiver le flag autoRecover sur l'application $1 (par défaut, +all) +~~~ +## `wom_bounce` +~~~ +Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe +$3, et redémarrer l'application $1 (par défaut, all) en mode bounce +~~~ +## `wom_clearDeaths` +~~~ +Contacter le moniteur sur l'hôte $2, avec éventuellement le mot de passe +$3, et effacer le compte des morts suspectes pour l'application $1 (par +défaut, all) +~~~ +## `wom__getApplications` +~~~ +Obtenir des information sur la définition de l'application $1 (ou de +toutes les applications si $1=="") en contactant le moniteur sur l'hôte $2 +avec éventuellement le mot de passe $3. Le résultat est un flux xml, +chaque application étant défini dans un tag . Si un erreur +se produit, l'erreur est dans un tag +~~~ +## `wom__getApplications_filter` +~~~ +filtrer le résultat de wom__getApplications en ne gardant que les tags +name, unixPath, macPath, winPath +~~~ +## `wom_getApplications` +~~~ +Obtenir la liste des applications définies en contactant le moniteur sur +l'hôte $3 avec éventuellement le mot de passe $4, et initialiser le +tableau $1 avec une liste de valeurs quotées de la forme: +"'name' 'unixPath' 'macPath' 'winPath'" +concernant l'application $2 (par défaut, toutes les applications) +Ces valeurs peuvent être utilisées comme arguments d'une fonction. par +exemple: +wom_getApplications appinfos "" host pw +for args in "${appinfos[@]}"; do +eval "userfunc $args" +done +~~~ +## `wom_addApplication` +~~~ +Ajouter une application nommée $1 en contactant le moniteur sur l'hôte $2, +avec éventuellement le mot de passe $3. +Soit le nom Name, par défaut l'exécutable se trouve dans +WOAPPLICATIONS/Name.woa/Name et les logs dans /var/log/WebObjects, et le +flag autoRecover est activé +XXX supporter la possibilité de modifier les valeurs par défaut +~~~ +## `wom_addInstance` +~~~ +Ajouter une instance sur localhost pour l'application nommée $1 en +contactant le moniteur sur l'hôte $2, avec éventuellement le mot de passe +$3. +XXX supporter la possibilité de modifier les valeurs par défaut +~~~ +## `check_compute_apps_localhost` +~~~ +si les arguments de compute_apps contiennent des bundles de framework, il +faut avoir accès au système de fichier local. vérifier si l'un des +arguments $2..* est un framework. si c'est le cas, vérifier que l'hôte $1 +est localhost. +retourner 0 si c'est ok, 1 s'il y a des frameworks et que host n'est pas +localhost +~~~ +## `compute_apps` +~~~ +Remplir le tableau $1(=apps) avec la liste des applications correspondant +aux arguments $3...* +Un bundle de framework (Name.framework) est remplacé par la liste des +bundles d'applications qui dépendent de ce framework. Cette information +est obtenue en consultant le système de fichier local. +Un bundle d'application est remplacé par la liste des applications qui +sont définies pour ce bundle. Cette information est obtenue en consultant +le tableau généré par wom_getApplications(), dont le nom est $2 +Les arguments de la forme @N sont ignorés, ils correspondent à des délais +à respecter lors du démarrage de l'application +~~~ +## `get_error_msg` +## `start_apps` +~~~ +Démarrer les applications $3..$* en contactant le moniteur sur l'hôte $1 +avec le mot de passe éventuel $2 +Les variables globales enable_autorecover et force_enable_autorecover +permettent respectivement d'activer l'autoRecover après le démarrage de +l'application et de forcer l'activation de l'autoRecover même si +l'instance tournait déjà. +Un argument de la forme @N provoque une attente de N secondes. Ceci permet +de placer un temps d'attente entre le démarrage de certaines applications. +~~~ +## `stop_apps` +~~~ +Arrêter les applications $3..$* en contactant le moniteur sur l'hôte $1 +avec le mot de passe éventuel $2 +Les variables globales disable_autorecover et force_disable_autorecover +permettent respectivement de désactiver l'autoRecover après l'arrêt de +l'application et de forcer la désactivation de l'autoRecover même si +l'instance ne tournait pas. +L'option {-a ARRAY} permet de remplir ARRAY avec la liste des applications +qui ont été effectivement arrêtées. Cette option si elle est spécifiée +doit être en premier +Pour compatibilité avec start_apps, les arguments de la forme @N sont +ignorés. Il n'y a pas de temps d'attente entre les applications lors de +l'arrêt. +~~~ +## `bounce_apps` +~~~ +Redémarrer les applications $3..$* en mode bounce en contactant le +moniteur sur l'hôte $1 avec le mot de passe éventuel $2 +Pour compatibilité avec start_apps, les arguments de la forme @N sont +ignorés. Il n'y a pas de temps d'attente entre les applications lors du +redémarrage. +~~~ + +-*- 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_wosign.md b/doc/ulib_wosign.md new file mode 100644 index 0000000..eca6ced --- /dev/null +++ b/doc/ulib_wosign.md @@ -0,0 +1,15 @@ +# ulib/wosign + +## `wosign_setup_maybe` +## `wosign_jar` +## `wosignable` +## `wosign` +~~~ +Signer un bundle, les jars d'un répertoire, ou un jar +L'option -f force la resignature des jars d'un répertoire ou d'un +bundle. Elle force aussi la signature d'un jar, même s'il semble qu'il +soit la version signée d'un autre jar +on présuppose que wosignable a retourné true +~~~ + +-*- 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_wotaskd.md b/doc/ulib_wotaskd.md new file mode 100644 index 0000000..6ca0990 --- /dev/null +++ b/doc/ulib_wotaskd.md @@ -0,0 +1,8 @@ +# ulib/wotaskd + +## `wot_config` +~~~ +Afficher la configuration de wotaskd +~~~ + +-*- 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/ulink.md b/doc/ulink.md new file mode 100644 index 0000000..dd05c5f --- /dev/null +++ b/doc/ulink.md @@ -0,0 +1,20 @@ +# ulink + +~~~ +ulink: déplacer, supprimer, copier un fichier ou un lien + +Quand on déplace ou qu'on copie un lien, la destination du lien est mise à jour + +USAGE + ulink mv files... dest + ulink cp files... dest + ulink rm files... + +OPTIONS + -d UPDATEDIR + Chercher dans UPDATEDIR tous les liens qui pointent vers le fichier + concerné, et mettre à jour ces liens après avoir déplacé le fichier, ou + supprimer ces liens si le fichier est supprimé. +~~~ + +-*- 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/ulink.twp b/doc/ulink.twp new file mode 100644 index 0000000..89734a8 --- /dev/null +++ b/doc/ulink.twp @@ -0,0 +1,24 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: ulink + +{{{ +ulink: déplacer, supprimer, copier un fichier ou un lien + +Quand on déplace ou qu'on copie un lien, la destination du lien est mise à jour + +USAGE + ulink mv files... dest + ulink cp files... dest + ulink rm files... + +OPTIONS + -d UPDATEDIR + Chercher dans UPDATEDIR tous les liens qui pointent vers le fichier + concerné, et mettre à jour ces liens après avoir déplacé le fichier, ou + supprimer ces liens si le fichier est supprimé. +}}} diff --git a/doc/umatch.md b/doc/umatch.md new file mode 100644 index 0000000..e4df819 --- /dev/null +++ b/doc/umatch.md @@ -0,0 +1,51 @@ +# umatch + +~~~ +umatch: Afficher le résultat d'une recherche par regexp et compter +éventuellement leurs occurences + +USAGE + umatch [options] [regexp] + +Chaque ligne *entière* de stdin est mise en correspondance avec l'expression +regulière qui doit avoir la syntaxe de awk. S'il y a correspondance, afficher +soit toute l'expression matchée, soit chaque groupe s'il y a des expressions +parenthésées, chacun des groupes étant séparé par le caractère sep. + +Si l'expression régulière n'est pas spécifiée, elle vaut par défaut '.*' ce qui +fait que toutes les lignes correspondent. Ceci peut être utile avec les options +-s et -c. + +Certaines expressions régulières sont prédéfinies. regexp peut avoir l'une des +valeurs prédéfinies suivantes: + + ip --> [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+ + +OPTIONS + -F sep + Spécifier le caractère séparateur en sortie s'il faut afficher des + champs multiples. Par défaut, utiliser le caractère ':' + Si un séparateur vide est spécifié, le séparateur standard de awk est + utilisé. + -s Trier le résultat + -C FIELDNUM + -c, --count + Compter les occurences successives de la valeur du champ FIELDNUM, et + afficher une ligne de la forme 'countlast_line' pour chaque groupe, + last_line étant la dernière occurence du groupe. L'option -c correspond + à '-C 0', c'est à dire compter les occurences successives de toute les + lignes. + Le séparateur utilisé pour calculer le numéro de champ est sep, spécifié + avec l'option -F. + -a, --all-lines + Avec les options -c/-C, afficher toutes les lignes des occurences + successives au lieu de seulement la ligne de la dernière occurence. Ceci + est utile surtout avec l'option -C, pour voir les différences avec les + différentes lignes. + -m, --multiple + Avec les options -c/-C, n'afficher que les lignes dont le compte est + supérieur à 1. Avec l'option -a, les groupes contigus sont séparés par + une ligne '--' +~~~ + +-*- 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/umatch.twp b/doc/umatch.twp index 49add79..01fef0f 100644 --- a/doc/umatch.twp +++ b/doc/umatch.twp @@ -1,29 +1,55 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:20 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: ##@title: umatch {{{ -umatch: Afficher le résultat d'une recherche par regexp +umatch: Afficher le résultat d'une recherche par regexp et compter +éventuellement leurs occurences USAGE - umatch [options] + umatch [options] [regexp] -Chaque ligne de stdin est matchée pas rapport à l'expression regulière avec la -syntaxe de awk. S'il y a correspondance, afficher soit toute l'expression -matchée, soit chaque groupe s'il y a des expressions parenthésées, chacun des -groupes étant séparé par le caractère sep. +Chaque ligne *entière* de stdin est mise en correspondance avec l'expression +regulière qui doit avoir la syntaxe de awk. S'il y a correspondance, afficher +soit toute l'expression matchée, soit chaque groupe s'il y a des expressions +parenthésées, chacun des groupes étant séparé par le caractère sep. -regexp peut avoir l'une des valeurs suivantes, qui correspondent à des -expressions régulières prédéfinies: +Si l'expression régulière n'est pas spécifiée, elle vaut par défaut '.*' ce qui +fait que toutes les lignes correspondent. Ceci peut être utile avec les options +-s et -c. -ip --> [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+ +Certaines expressions régulières sont prédéfinies. regexp peut avoir l'une des +valeurs prédéfinies suivantes: + + ip --> [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+ OPTIONS -F sep - Spécifier le caractère séparateur s'il y a des champs multiples. Par - défaut, utiliser le caractère ':' + Spécifier le caractère séparateur en sortie s'il faut afficher des + champs multiples. Par défaut, utiliser le caractère ':' + Si un séparateur vide est spécifié, le séparateur standard de awk est + utilisé. + -s Trier le résultat + -C FIELDNUM + -c, --count + Compter les occurences successives de la valeur du champ FIELDNUM, et + afficher une ligne de la forme 'countlast_line' pour chaque groupe, + last_line étant la dernière occurence du groupe. L'option -c correspond + à '-C 0', c'est à dire compter les occurences successives de toute les + lignes. + Le séparateur utilisé pour calculer le numéro de champ est sep, spécifié + avec l'option -F. + -a, --all-lines + Avec les options -c/-C, afficher toutes les lignes des occurences + successives au lieu de seulement la ligne de la dernière occurence. Ceci + est utile surtout avec l'option -C, pour voir les différences avec les + différentes lignes. + -m, --multiple + Avec les options -c/-C, n'afficher que les lignes dont le compte est + supérieur à 1. Avec l'option -a, les groupes contigus sont séparés par + une ligne '--' }}} diff --git a/doc/umirror.md b/doc/umirror.md new file mode 100644 index 0000000..609b7e6 --- /dev/null +++ b/doc/umirror.md @@ -0,0 +1,14 @@ +# umirror + +~~~ +umirror: faire un miroir d'un site web + +USAGE + umirror [options] url [wget_options] + +OPTIONS + -l + Convertir les liens pour consultation locale +~~~ + +-*- 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/umirror.twp b/doc/umirror.twp index 82014d2..effcaab 100644 --- a/doc/umirror.twp +++ b/doc/umirror.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:20 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -13,5 +13,6 @@ USAGE umirror [options] url [wget_options] OPTIONS - -l Convertir les liens pour consultation locale + -l + Convertir les liens pour consultation locale }}} diff --git a/doc/upassword.md b/doc/upassword.md new file mode 100644 index 0000000..8c271f3 --- /dev/null +++ b/doc/upassword.md @@ -0,0 +1,66 @@ +# upassword + +~~~ +USAGE: + upassword -p [-f aeskeyfile] [clear [salts...]] + upassword -p [-f aeskeyfile] -j JKEY codetu [salts...] + upassword -p -f aeskeyfile -k crypted [salts...] + upassword -f aeskeyfile -G [password [salt]] + upassword -f aeskeyfile -s + upassword -f aeskeyfile -e clear + upassword -f aeskeyfile -d crypted + upassword --batch + +OPTIONS + -p, --hash-password + Crypter un mot de passe (option par défaut). Si le mot de passe en clair + et/ou le salt ne sont pas spécifiés, ils sont choisis au hasard. + -j, --clear-is-codetu JKEY + Indiquer que l'argument clear est un numéro d'étudiant, à partir duquel + il faut générer le mot de passe. Cette option n'est valide qu'avec -p + -k, --clear-is-crypted + Indiquer que l'argument clear doit d'abord être décrypté avec la clé AES + spécifiée avant utilisation. Cette option n'est valide qu'avec -p + -G, --aes-genkey + Générer une clé AES pour utilisation avec les options -s, -e, -d + -s, --aes-showkey + Afficher encodée en base64 la clé AES contenue dans le fichier spécifié + -e, --aes-encrypt + Crypter un mot de passe avec la clé AES spécifiée + -d, --aes-decrypt + Décrypter un mot de passe avec la clé AES spécifiée + -f, --aes-keyfile + Spécifier le fichier contenant la clé AES. Cette option est obligatoire + avec les options -G, -s, -e et -d + --shell + Afficher les valeurs pour évaluation par le shell + +MODE BATCH +Utiliser l'option --batch active le mode batch. Dans ce mode, chaque ligne est +un ensemble d'arguments, comme si on avait lancé le script à plusieurs reprises. +L'analyseur est limité: le découpage des arguments est fait sur les espaces. +Les lignes commençant par # sont ignorées. +Si une ligne commence par --batch-after, alors cette ligne est affichée après +chaque résultat. Ceci permet de générer un script qui peut être évalué. + +Voici un exemple: + upassword --batch <"$content" + else + >"$content" + fi +} + +function write_mdpage() { + local oldcontent="$1" title="$2" newcontent="$3" mdpage="$4" + if testdiff "$oldcontent" "$newcontent"; then + local created="$(date +"%d/%m/%Y %H:%M")" + echo "# $title" >"$mdpage" + cat "$newcontent" >>"$mdpage" + echo -n " +-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary" >>"$mdpage" + fi +} + +auto=1 +tools= +ulib= +force= +parse_opts "${PRETTYOPTS[@]}" \ + --help '$exit_with display_help' \ + -t '$auto=; tools=1' \ + -l '$auto=; ulib=1' \ + --force force=1 \ + @ args -- "$@" && set -- "${args[@]}" || die "$args" + +[ -n "$auto" ] && { + tools=1 + ulib=1 +} +ac_set_tmpfile oldcontent +ac_set_tmpfile newcontent +cd "$scriptdir" + +if [ -n "$tools" ]; then + if [ -n "$*" ]; then + cmds=("$@") + else + array_lsfiles cmds .. + fi + + for cmd in "${cmds[@]}"; do + cmdname="$(basename "$cmd")" + mdpage="$cmdname.md" + [ -x "$cmd" ] || continue + estep "$cmdname" + + dump_content "$mdpage" "$oldcontent" + echo " +~~~ +$("$cmd" --help) +~~~" >"$newcontent" + + write_mdpage "$oldcontent" "$cmdname" "$newcontent" "$mdpage" + done +fi + +if [ -n "$ulib" ]; then + array_from_lines ulibnames "$(list_files ../lib/ulib)" + # faire l'entête + dump_content ulib.md "$oldcontent" + echo " +## Liste des librairies de ulib" >"$newcontent" + for ulibname in "${ulibnames[@]}"; do + echo "* [ulib/$ulibname](ulib_$ulibname)" >>"$newcontent" + done + write_mdpage "$oldcontent" ulib "$newcontent" ulib.md + # faire les pages + for ulibname in "${ulibnames[@]}"; do + ulib="../lib/ulib/$ulibname" + mdpage="ulib_$ulibname.md" + title="ulib/$ulibname" + dump_content "$mdpage" "$oldcontent" + awkrun 'BEGIN { + in_func = 0 + dump_doc = 0 + dumped_doc = 0 + print +} +!in_func && $0 ~ /^function / { + if (match($0, /function +([^ ]+)\(\)/, vs)) { + funcname = vs[1] + if (funcname !~ /^_/) { + in_func = 1 + dump_doc = 1 + dumped_doc = 0 + print "## `" funcname "`" + if ($0 ~ /}$/) { + in_func = 0 + dump_doc = 0 + dumped_doc = 0 + } + next + } + } +} +in_func && dump_doc && $0 !~ /^ *#/ { + dump_doc = 0 +} +in_func && dump_doc && $0 ~ /^ *#/ { + if (!dumped_doc) print "~~~" + gsub(/^ *#+ */, "") + print + dumped_doc = 1 +} +in_func && $0 ~ /}$/ { + if (dumped_doc) print "~~~" + in_func = 0 + dump_doc = 0 + dumped_doc = 0 +} +END { if (in_func) print "~~~" } +' <"$ulib" >"$newcontent" + write_mdpage "$oldcontent" "$title" "$newcontent" "$mdpage" + done +fi diff --git a/doc/update-nutools.md b/doc/update-nutools.md new file mode 100644 index 0000000..517410d --- /dev/null +++ b/doc/update-nutools.md @@ -0,0 +1,7 @@ +# update-nutools + +~~~ +update-nutools: mettre à jour nutools +~~~ + +-*- 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/update-nutools.twp b/doc/update-nutools.twp new file mode 100644 index 0000000..df35959 --- /dev/null +++ b/doc/update-nutools.twp @@ -0,0 +1,11 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: update-nutools + +{{{ +update-nutools: mettre à jour nutools +}}} diff --git a/doc/update.sh b/doc/update-twp similarity index 100% rename from doc/update.sh rename to doc/update-twp diff --git a/doc/uprefix.md b/doc/uprefix.md new file mode 100644 index 0000000..8d29d24 --- /dev/null +++ b/doc/uprefix.md @@ -0,0 +1,18 @@ +# uprefix + +~~~ +uprefix: Afficher les préfixes valides pour uinst + +USAGE + uprefix -l|--dump|prefix... + +OPTIONS + -l + Afficher la liste des préfixes valides + --dump + Afficher la liste des préfixes valides et leurs valeurs + prefix + Afficher la valeur du préfixe spécifié +~~~ + +-*- 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/uprefix.twp b/doc/uprefix.twp index 89b1fc1..bbef41f 100644 --- a/doc/uprefix.twp +++ b/doc/uprefix.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:20 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -13,7 +13,8 @@ USAGE uprefix -l|--dump|prefix... OPTIONS - -l Afficher la liste des préfixes valides + -l + Afficher la liste des préfixes valides --dump Afficher la liste des préfixes valides et leurs valeurs prefix diff --git a/doc/uproject.md b/doc/uproject.md new file mode 100644 index 0000000..15555c3 --- /dev/null +++ b/doc/uproject.md @@ -0,0 +1,121 @@ +# uproject + +~~~ +uproject: Outil pour gérer des projets + +USAGE + uproject cmd [args] + +COMMANDS + getvcs [dir] + Afficher le type de VCS pour dir. + getroot [dir] + Si dir est un répertoire versionné, retourner le répertoire racine du + projet versionné. + getrepos [dir] + Si dir est un répertoire versionné, retourner l'url du repository du + projet versionné. + geturl [dir] + Si dir est un répertoire versionné, retourner son url dans le + repository. + fold [dir] + unfold [dir] + Utiliser uinc pour défaire (resp. refaire) toutes les inclusions des + fichiers de dir. Cela nécessite qu'un fichier .udir soit configuré à la + racine du projet avec uinc=true + vcs [args] + Appeler le gestionnaire de gestion approprié avec les arguments donnés. + add files... + Ajouter les fichiers files dans le gestionnaire de version. + remove files... + Supprimer les fichiers versionnés files. + copy from to + Copier le fichier versionné from vers le fichier to. + move from to + Renommer le fichier versionné from vers le fichier to. + mkdir dir + Créer un nouveau répertoire versionné. + commit message [files...] + Enregistrer les modifications (par défaut sur tous les fichiers + modifiés) avec le commentaire message. + status + Afficher l'état des fichiers versionnés et non versionnés. + update [-x] + Mettre à jour la copie locale avec la copie sur le serveur. + -x Ne pas mettre à jour les références externes (si appliquable) + -n, --no-autoff + Ne pas faire de fast-forward automatique pour toutes les branches + traquées. Par défaut, s'il n'y a pas de modifications locales, + essayer de fast-fowarder toutes les branches locales traquées. + diff [options] + Afficher les différences. + -l Afficher les différences non commitées (par défaut) + -c Afficher les différences en passe d'être commitées (si appliquable) + -r REV + Afficher les différences depuis la révision REV. + -R Afficher les modifications effectuées depuis la dernière release. + + clone git@host:path/to/repo [destdir] + Cloner un dépôt distant. 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] + Créer un dépôt distant sur gitolite, puis le cloner + + develop + release + hotfix + Démarrer le travail sur une branche respectivement de développement, de + release, ou de correction de bugs. Lancer chaque commande avec --help + pour les détails. Nécessite git. + + archive + Créer une archive du projet courant. Nécessite git. + + annex [args] + Lancer git annex avec les arguments spécifiés. + xadd + xunlock + xdrop + xwhereis + xwebapp + Chacune de ces commandes est un raccourci vers la commande + correspondante de git annex, sans le préfixe 'x' + xsync + Sur un dépot où git-annex est activé, lancer 'git annex sync' si on est + en mode indirect ou 'git annex sync --content' si on est en mode direct. + Sur un dépôt où git-annex n'est pas activé, faire l'équivalent des + commandes 'git add -A && git commit && git pull && git push' + xcopy + xmove + xget + Comme ci-dessus, mais si la commande s'exécute sans erreur, lancer + aussi 'git annex sync' + xinitial + Sur un dépôt fraichement cloné, initialiser le dépôt avec 'annex init' + s'il contient des fichiers annexés. Récupérer aussi ces fichiers avec + 'annex get' + xconfig-export [dir] + Installer des hooks pour qu'un dépôt puisse être utilisé pour servir des + fichiers, par exemple avec un serveur web. Plus précisément, un hook + post-receive est créé avec la commande 'git annex merge', et un hook + post-update est créé avec la commande 'git update-server-info' + + printml [-t TYPE] + Afficher le modeline pour un fichier du type spécifié + addml [-t TYPE] file + Ajouter un modele pour le fichier spécifié, s'il n'en a pas déjà un. + Si nécessaire, forcer le type du fichier au lieu de l'autodétecter + new [options] file [template options] + Créer un nouveau fichier à partir d'un modèle. + Avant le nom du fichier, les options suivantes sont valides: + -t TEMPLATE + Spécifier le modèle de fichier à utiliser. Par défaut, le modèle + à utiliser est déduit de l'extension ou du nom du fichier. + -e Editer le fichier après l'avoir créé. + Après le nom du fichier, toutes les options sont spécifiques au modèle + utilisé pour créer le nouveau fichier. Utiliser l'option --help pour + avoir une description des options disponibles. +~~~ + +-*- 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/uproject.twp b/doc/uproject.twp index 86c4b11..3a5abfe 100644 --- a/doc/uproject.twp +++ b/doc/uproject.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:20 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -27,9 +27,8 @@ COMMANDS fold [dir] unfold [dir] Utiliser uinc pour défaire (resp. refaire) toutes les inclusions des - fichiers de dir. Cela ne fonctionne que si un fichier .uir est configuré - à la racine du projet avec inc=true (ou un fichier .uinst.conf avec - update_inc=true + fichiers de dir. Cela nécessite qu'un fichier .udir soit configuré à la + racine du projet avec uinc=true vcs [args] Appeler le gestionnaire de gestion approprié avec les arguments donnés. add files... @@ -50,6 +49,10 @@ COMMANDS update [-x] Mettre à jour la copie locale avec la copie sur le serveur. -x Ne pas mettre à jour les références externes (si appliquable) + -n, --no-autoff + Ne pas faire de fast-forward automatique pour toutes les branches + traquées. Par défaut, s'il n'y a pas de modifications locales, + essayer de fast-fowarder toutes les branches locales traquées. diff [options] Afficher les différences. -l Afficher les différences non commitées (par défaut) @@ -57,6 +60,53 @@ COMMANDS -r REV Afficher les différences depuis la révision REV. -R Afficher les modifications effectuées depuis la dernière release. + + clone git@host:path/to/repo [destdir] + Cloner un dépôt distant. 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] + Créer un dépôt distant sur gitolite, puis le cloner + + develop + release + hotfix + Démarrer le travail sur une branche respectivement de développement, de + release, ou de correction de bugs. Lancer chaque commande avec --help + pour les détails. Nécessite git. + + archive + Créer une archive du projet courant. Nécessite git. + + annex [args] + Lancer git annex avec les arguments spécifiés. + xadd + xunlock + xdrop + xwhereis + xwebapp + Chacune de ces commandes est un raccourci vers la commande + correspondante de git annex, sans le préfixe 'x' + xsync + Sur un dépot où git-annex est activé, lancer 'git annex sync' si on est + en mode indirect ou 'git annex sync --content' si on est en mode direct. + Sur un dépôt où git-annex n'est pas activé, faire l'équivalent des + commandes 'git add -A && git commit && git pull && git push' + xcopy + xmove + xget + Comme ci-dessus, mais si la commande s'exécute sans erreur, lancer + aussi 'git annex sync' + xinitial + Sur un dépôt fraichement cloné, initialiser le dépôt avec 'annex init' + s'il contient des fichiers annexés. Récupérer aussi ces fichiers avec + 'annex get' + xconfig-export [dir] + Installer des hooks pour qu'un dépôt puisse être utilisé pour servir des + fichiers, par exemple avec un serveur web. Plus précisément, un hook + post-receive est créé avec la commande 'git annex merge', et un hook + post-update est créé avec la commande 'git update-server-info' + printml [-t TYPE] Afficher le modeline pour un fichier du type spécifié addml [-t TYPE] file diff --git a/doc/uscrontab.md b/doc/uscrontab.md new file mode 100644 index 0000000..c5a579b --- /dev/null +++ b/doc/uscrontab.md @@ -0,0 +1,288 @@ +# uscrontab + +~~~ +uscrontab: lancer une suite de commande en respectant une planification de type cron + +USAGE + uscrontab [options] [/path/to/uscrontab] [var=value...] + uscrontab -e [/path/to/uscrontab] + uscrontab -l + +La première forme du script doit normalement être lancé toutes les minutes par +une tâche cron. Utiliser l'option --install pour ajouter automatique la ligne +dans la crontab de l'utilisateur. + +Avec la première forme du script, le fichier spécifié est traité. Si aucun +fichier n'est spécifié, fusionner s'il existe le fichier + /var/local/uscrontab/users/jclain +avec chacun des fichiers du répertoire + /var/local/uscrontab/users.d/jclain +dans un fichier temporaire, puis exécuter le fichier résultat avec le nom +virtuel + /var/local/uscrontab/jclain +note: le nom virtuel est utilisé pour le verrouillage avec --lock + +A chaque lancement de ce script, le fichier /path/to/uscrontab spécifié est +examiné pour déterminer quels commandes doivent être exécutées. Ce fichier est +composé de lignes dans un format particulier, qui sont analysées et traitées +dans l'ordre. + +Quelles que soient les lignes qui sont sélectionnées pour l'exécution, elles +sont garanties de s'exécuter dans l'ordre du fichier, l'une après l'autre. + +Les définitions var=value mentionnées sur la ligne de commande sont des +définitions de variables à effectuer avant de lancer les commandes. + +Les lignes commençant par # sont des commentaires et sont ignorées + +== Définitions de variables et exécution de commandes == + + Les lignes de la forme suivante sont des définitions de variable: + + [export] var="valeur de la variable" + + Ces lignes sont des définitions de variable bash qui sont exécutées telles + quelles. Il n'est donc pas autorisé de mettre des espaces autour de =. Par + exemple, les lignes suivantes sont des erreurs de syntaxe: + + var = bad + var=pas de quotes autour de la valeur + + alors que celles-ci sont correctes: + + var=ok + var="valeur avec des espaces" + var='on peut utiliser des quotes aussi' + + Il est possible de manipuler les variables de type PATH avec une syntaxe + particulière de l'opérateur d'assignation. Les opérateurs += et %= utilisent + uaddpath(), #= utilise uinspath() et -= utilise udelpath(). Par exemple, les + lignes suivantes ajoutent respectivement /usr/local/nutools puis enlèvent + /opt/rogue au PATH: + + PATH+=/usr/local/nutools + PATH-=/opt/rogue + + Bien sûr, il ne faut pas oublier de quoter les espaces: + + PATH+="/path/to/dir with spaces" + + La syntaxe ?= permet de définir la valeur d'une variable si elle n'est pas + déjà définie: + + var?=default + + Les lignes de la forme suivante permettent d'exécuter une commande qui est + exécutée systématiquement et ignore la planification: + + $one-line-command + + Une variante permet de spécifier des commandes sur plusieurs lignes. + ATTENTION! ${ et $} doivent être tous seuls sur la ligne. + + ${ + several + commands + ... + $} + + Ces commandes sont exécutées systématiquement et ignorent la planification. + On peut s'en servir notamment pour lire un fichier de configuration qui + définit des variables ou des fonctions: + + $source path/to/file + + Le code d'erreur de ces commandes est ignoré, contrairement à ce qui se + passe pour les commandes qui font l'objet d'une planification. + +== Planification de commandes == + + Les autres lignes doivent être au format d'une ligne de crontab: + + minutes hours days months dows command-line + + command-line peut être n'importe quelle ligne de commande bash, pourvu + qu'elle soit sur une seule ligne. + + Certaines extensions par rapport à la syntaxe de crontab sont autorisées. Il + est en particulier possible de spécifier plusieurs planifications pour une + seule commande. Par exemple, les lignes suivantes permettent d'exécuter + 'command' toutes les heures ET à 1h05: + + 0 * * * * + 5 1 * * * command + + Il est aussi possible d'utiliser la même planification pour plusieurs + commandes sans devoir répéter la définition de la planification. Les lignes + suivantes planifient command1 et command2 toutes les heures: + + 0 * * * * command1 + command2 + + Pour être prise en compte, la ligne command2 doit commencer par au moins un + espace ou une tabulation. Pour la lisibilité, la syntaxe suivante est + supportée aussi: + + 0 * * * * + command1 + command2 + + Les deux formats peuvent être utilisés ensemble. Par exemple les lignes + suivantes exécutent command1 et command2 toutes les heures ET à 1h05: + + 0 * * * * + 5 1 * * * command1 + command2 + + Par défaut, le script s'arrête à la première commande planifiée qui retourne + avec un code d'erreur. Il est possible d'ignorer le code d'erreur d'une + commande avec nostop, e.g: + + 0 * * * * nostop command + + Cf aussi l'option --continuous pour modifier le comportement par défaut + +== Fonctions disponibles == + + La fonction check_pidfile() est disponible, et permet de vérifier qu'une + opération n'est pas déjà en cours. Si cette fonction est utilisée, il ne + faut pas modifier la valeur de -k. Par exemple: + + 0 1 * * * + check_pidfile /path/to/pid [args] + long-running-script + + check_pidfile() doit être utilisée toute seule sur la ligne et s'utilise + avec les argument suivants: + + check_pidfile PIDFILE [DESC] [BARRIER] + + - PIDFILE est le fichier de PID qui est vérifié + - DESC est la description du traitement qui est effectué. La valeur par + défaut est "Une synchronisation". Si le fichier de PID est présent, le + message suivant est affiché: + DESC est en cours. + Si vous pensez que c'est une erreur, veuillez vérifier le process de pid PID + puis supprimez le cas échéant le fichier PIDFILE + - BARRIER est un fichier qui est créé avec le contenu 'PID' s'il n'existe + pas encore, et si la vérification du fichier de PID est faite avec succès. + La présence de ce fichier peut-être vérifiée par un processus externe pour + empêcher par exemple de mettre à jour les scripts pendant qu'il sont en + train de tourner. + Son contenu peut être examiné pour connaître le PID du processus qui l'a + créé initialement. Le fichier est automatiquement supprimé à la fin de ce + script. + Attention: ce fichier n'est pas un verrou, il peut être supprimé à tout + moment. Notamment, si deux scripts sont configurés pour créer le même + fichier barrière, le premier script supprimera le fichier barrière avant + la fin de l'exécution du second script. + + La fonction remove_pidfile() permet de supprimer un fichier de pid pour + spécifier qu'une opération est terminée. Considérons l'exemple suivant: + + 0 1 * * * + check_pidfile /path/to/pid + script1 + script2 + remove_pidfile /path/to/pid + script3 + + Dans cet exemple, il ne faut pas qu'une autre occurence de script1 tourne + pendant que script2 tourne. Par contre, plusieurs occurences de script3 + peuvent tourner en parallèle. + + La fonction elogto() permet de spécifier un fichier vers lequel toutes les + sorties sont redirigées. + +OPTIONS + -A, --install + Installer une planification toutes les minutes du script dans la crontab + de l'utilisateur. Si l'argument /path/to/uscrontab n'est pas spécifié, + c'est une planification générique qui exécute les fichiers par défaut + qui est installée. + -R, --uninstall + Désinstaller la planification toutes les minutes du script de la crontab + de l'utilisateur. Si l'argument /path/to/uscrontab est spécifié, cette + instance est désinstallée. Sinon, ne désinstaller que la planification + générique. + -d, --disable-only + Avec l'option -R, désactiver la planification au lieu de la supprimer. + -e, --edit + Lancer un editeur pour modifier l'uscrontab spécifiée. Si aucun fichier + n'est spécifié, éditer /var/local/uscrontab/users/jclain + -a, --add + Installer un script uscrontab dans le répertoire approprié. L'argument + doit être de la forme [name:]/path/to/uscrontab + Si name n'est pas spécifié, le nom de base du fichier spécifié est + utilisé. Si name est vide ou vaut $USER (soit jclain en l'occurence), + copier le fichier spécifié vers le chemin /var/local/uscrontab/users/jclain + Sinon, copier le fichier spécifié vers /var/local/uscrontab/users.d/jclain/name + -r, --remove + Supprimer le script uscrontab spécifié. L'argument doit être le nom du + script à supprimer. Si l'argument n'est pas spécifié ou vaut $USER + (soit jclain en l'occurence), supprimer le fichier /var/local/uscrontab/users/jclain + s'il existe + -l, --list + Si l'argument /path/to/crontab est spécifié, afficher le contenu de ce + fichier. Sinon, lister les contenus des fichiers crontab qui sont + exécutés avec la planification actuelle. Si une planification générique + est installée, ou si aucune planification n'est en cours, afficher le + contenu du fichier + /var/local/uscrontab/users/jclain + et chacun des fichiers du répertoire + /var/local/uscrontab/users.d/jclain + -n, --fake + Afficher au lieu de les exécuter les commandes qui doivent être lancées + -P, --pause-for NBMINS + Désactiver les planifications pendant NBMINS minutes. Utiliser -1 pour + désactiver les planifications sans limite de durée. Pendant la période + de pause, toutes les invocations de uscrontab n'ont aucun effet, sauf si + on utilise l'option --force + -Y, --unpause + Réactiver les planifications après une mise en pause + -p, --pause + Désactiver les planifications pendant 1 journée. Equivalent à -P 1440 + -f, --force + Forcer l'exécution de la planification, même si elle a été mise en pause + avec l'option --pause + +OPTIONS AVANCEES + --lock LOCKFILE + Inscrire dans le fichier spécifié des informations permettant d'éviter + les invocations simultanées de ce script. Si selon ce fichier, le script + tourne depuis plus de 8 heures, un message d'erreur + est consigné et un message d'avertissement est affiché au plus une fois. + Utiliser --lock '' pour désactiver cette fonctionnalité + Par défaut, si ce script est lancé en root, le fichier utilisé pour le + verrouillage est de la forme /var/run/uscrontab/abspath/to/crontab + Si le script est lancé avec un compte utilisateur, aucun verrouillage + n'est effectué. + --lockdelay LOCKDELAY[=8] + Changer le nombre d'heures pendant lesquelles on autorise le script a + verrouiller l'exécution avant d'afficher un avertissement. + -c, --continuous + Par défaut, ce script s'arrête à la première commande planifiée qui + retourne avec un code d'erreur. Notez que les codes d'erreur des + commandes sans planification sont toujours ignorés. Avec cette option, + ce script ne s'arrête jamais, bien qu'il retourne toujours un code + d'erreur si une erreur s'est produite. Il est possible d'ignorer le + code d'erreur pour une commande en particulier avec le préfixe nostop + -k, --stopec EXITCODE[=101] + Spécifier un code d'erreur spécial qui arrête ce script sans erreur, ou + '' pour désactiver cette fonctionnalité. Ceci permet en début de script + de faire des tests par exemple sur l'environnement avant de lancer les + scripts planifiés. Si l'environnement ne convient pas, il suffit au + script de contrôle de retourner le code d'erreur spécifique pour arrêter + le traitement. + --show-ctnow + Afficher l'heure de référence au format crontab 'min hou day mon dow' + Cette valeur peut être utilisée avec l'option --force-ctnow dans des + tests pour reproduire une condition spécifique. + --force-ctnow 'min hou day mon dow' + 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. +~~~ + +-*- 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/uscrontab.twp b/doc/uscrontab.twp new file mode 100644 index 0000000..1e166e0 --- /dev/null +++ b/doc/uscrontab.twp @@ -0,0 +1,292 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: uscrontab + +{{{ +uscrontab: lancer une suite de commande en respectant une planification de type cron + +USAGE + uscrontab [options] [/path/to/uscrontab] [var=value...] + uscrontab -e [/path/to/uscrontab] + uscrontab -l + +La première forme du script doit normalement être lancé toutes les minutes par +une tâche cron. Utiliser l'option --install pour ajouter automatique la ligne +dans la crontab de l'utilisateur. + +Avec la première forme du script, le fichier spécifié est traité. Si aucun +fichier n'est spécifié, fusionner s'il existe le fichier + /var/local/uscrontab/users/jclain +avec chacun des fichiers du répertoire + /var/local/uscrontab/users.d/jclain +dans un fichier temporaire, puis exécuter le fichier résultat avec le nom +virtuel + /var/local/uscrontab/jclain +note: le nom virtuel est utilisé pour le verrouillage avec --lock + +A chaque lancement de ce script, le fichier /path/to/uscrontab spécifié est +examiné pour déterminer quels commandes doivent être exécutées. Ce fichier est +composé de lignes dans un format particulier, qui sont analysées et traitées +dans l'ordre. + +Quelles que soient les lignes qui sont sélectionnées pour l'exécution, elles +sont garanties de s'exécuter dans l'ordre du fichier, l'une après l'autre. + +Les définitions var=value mentionnées sur la ligne de commande sont des +définitions de variables à effectuer avant de lancer les commandes. + +Les lignes commençant par # sont des commentaires et sont ignorées + +== Définitions de variables et exécution de commandes == + + Les lignes de la forme suivante sont des définitions de variable: + + [export] var="valeur de la variable" + + Ces lignes sont des définitions de variable bash qui sont exécutées telles + quelles. Il n'est donc pas autorisé de mettre des espaces autour de =. Par + exemple, les lignes suivantes sont des erreurs de syntaxe: + + var = bad + var=pas de quotes autour de la valeur + + alors que celles-ci sont correctes: + + var=ok + var="valeur avec des espaces" + var='on peut utiliser des quotes aussi' + + Il est possible de manipuler les variables de type PATH avec une syntaxe + particulière de l'opérateur d'assignation. Les opérateurs += et %= utilisent + uaddpath(), #= utilise uinspath() et -= utilise udelpath(). Par exemple, les + lignes suivantes ajoutent respectivement /usr/local/nutools puis enlèvent + /opt/rogue au PATH: + + PATH+=/usr/local/nutools + PATH-=/opt/rogue + + Bien sûr, il ne faut pas oublier de quoter les espaces: + + PATH+="/path/to/dir with spaces" + + La syntaxe ?= permet de définir la valeur d'une variable si elle n'est pas + déjà définie: + + var?=default + + Les lignes de la forme suivante permettent d'exécuter une commande qui est + exécutée systématiquement et ignore la planification: + + $one-line-command + + Une variante permet de spécifier des commandes sur plusieurs lignes. + ATTENTION! ${ et $} doivent être tous seuls sur la ligne. + + ${ + several + commands + ... + $} + + Ces commandes sont exécutées systématiquement et ignorent la planification. + On peut s'en servir notamment pour lire un fichier de configuration qui + définit des variables ou des fonctions: + + $source path/to/file + + Le code d'erreur de ces commandes est ignoré, contrairement à ce qui se + passe pour les commandes qui font l'objet d'une planification. + +== Planification de commandes == + + Les autres lignes doivent être au format d'une ligne de crontab: + + minutes hours days months dows command-line + + command-line peut être n'importe quelle ligne de commande bash, pourvu + qu'elle soit sur une seule ligne. + + Certaines extensions par rapport à la syntaxe de crontab sont autorisées. Il + est en particulier possible de spécifier plusieurs planifications pour une + seule commande. Par exemple, les lignes suivantes permettent d'exécuter + 'command' toutes les heures ET à 1h05: + + 0 * * * * + 5 1 * * * command + + Il est aussi possible d'utiliser la même planification pour plusieurs + commandes sans devoir répéter la définition de la planification. Les lignes + suivantes planifient command1 et command2 toutes les heures: + + 0 * * * * command1 + command2 + + Pour être prise en compte, la ligne command2 doit commencer par au moins un + espace ou une tabulation. Pour la lisibilité, la syntaxe suivante est + supportée aussi: + + 0 * * * * + command1 + command2 + + Les deux formats peuvent être utilisés ensemble. Par exemple les lignes + suivantes exécutent command1 et command2 toutes les heures ET à 1h05: + + 0 * * * * + 5 1 * * * command1 + command2 + + Par défaut, le script s'arrête à la première commande planifiée qui retourne + avec un code d'erreur. Il est possible d'ignorer le code d'erreur d'une + commande avec nostop, e.g: + + 0 * * * * nostop command + + Cf aussi l'option --continuous pour modifier le comportement par défaut + +== Fonctions disponibles == + + La fonction check_pidfile() est disponible, et permet de vérifier qu'une + opération n'est pas déjà en cours. Si cette fonction est utilisée, il ne + faut pas modifier la valeur de -k. Par exemple: + + 0 1 * * * + check_pidfile /path/to/pid [args] + long-running-script + + check_pidfile() doit être utilisée toute seule sur la ligne et s'utilise + avec les argument suivants: + + check_pidfile PIDFILE [DESC] [BARRIER] + + - PIDFILE est le fichier de PID qui est vérifié + - DESC est la description du traitement qui est effectué. La valeur par + défaut est "Une synchronisation". Si le fichier de PID est présent, le + message suivant est affiché: + DESC est en cours. + Si vous pensez que c'est une erreur, veuillez vérifier le process de pid PID + puis supprimez le cas échéant le fichier PIDFILE + - BARRIER est un fichier qui est créé avec le contenu 'PID' s'il n'existe + pas encore, et si la vérification du fichier de PID est faite avec succès. + La présence de ce fichier peut-être vérifiée par un processus externe pour + empêcher par exemple de mettre à jour les scripts pendant qu'il sont en + train de tourner. + Son contenu peut être examiné pour connaître le PID du processus qui l'a + créé initialement. Le fichier est automatiquement supprimé à la fin de ce + script. + Attention: ce fichier n'est pas un verrou, il peut être supprimé à tout + moment. Notamment, si deux scripts sont configurés pour créer le même + fichier barrière, le premier script supprimera le fichier barrière avant + la fin de l'exécution du second script. + + La fonction remove_pidfile() permet de supprimer un fichier de pid pour + spécifier qu'une opération est terminée. Considérons l'exemple suivant: + + 0 1 * * * + check_pidfile /path/to/pid + script1 + script2 + remove_pidfile /path/to/pid + script3 + + Dans cet exemple, il ne faut pas qu'une autre occurence de script1 tourne + pendant que script2 tourne. Par contre, plusieurs occurences de script3 + peuvent tourner en parallèle. + + La fonction elogto() permet de spécifier un fichier vers lequel toutes les + sorties sont redirigées. + +OPTIONS + -A, --install + Installer une planification toutes les minutes du script dans la crontab + de l'utilisateur. Si l'argument /path/to/uscrontab n'est pas spécifié, + c'est une planification générique qui exécute les fichiers par défaut + qui est installée. + -R, --uninstall + Désinstaller la planification toutes les minutes du script de la crontab + de l'utilisateur. Si l'argument /path/to/uscrontab est spécifié, cette + instance est désinstallée. Sinon, ne désinstaller que la planification + générique. + -d, --disable-only + Avec l'option -R, désactiver la planification au lieu de la supprimer. + -e, --edit + Lancer un editeur pour modifier l'uscrontab spécifiée. Si aucun fichier + n'est spécifié, éditer /var/local/uscrontab/users/jclain + -a, --add + Installer un script uscrontab dans le répertoire approprié. L'argument + doit être de la forme [name:]/path/to/uscrontab + Si name n'est pas spécifié, le nom de base du fichier spécifié est + utilisé. Si name est vide ou vaut $USER (soit jclain en l'occurence), + copier le fichier spécifié vers le chemin /var/local/uscrontab/users/jclain + Sinon, copier le fichier spécifié vers /var/local/uscrontab/users.d/jclain/name + -r, --remove + Supprimer le script uscrontab spécifié. L'argument doit être le nom du + script à supprimer. Si l'argument n'est pas spécifié ou vaut $USER + (soit jclain en l'occurence), supprimer le fichier /var/local/uscrontab/users/jclain + s'il existe + -l, --list + Si l'argument /path/to/crontab est spécifié, afficher le contenu de ce + fichier. Sinon, lister les contenus des fichiers crontab qui sont + exécutés avec la planification actuelle. Si une planification générique + est installée, ou si aucune planification n'est en cours, afficher le + contenu du fichier + /var/local/uscrontab/users/jclain + et chacun des fichiers du répertoire + /var/local/uscrontab/users.d/jclain + -n, --fake + Afficher au lieu de les exécuter les commandes qui doivent être lancées + -P, --pause-for NBMINS + Désactiver les planifications pendant NBMINS minutes. Utiliser -1 pour + désactiver les planifications sans limite de durée. Pendant la période + de pause, toutes les invocations de uscrontab n'ont aucun effet, sauf si + on utilise l'option --force + -Y, --unpause + Réactiver les planifications après une mise en pause + -p, --pause + Désactiver les planifications pendant 1 journée. Equivalent à -P 1440 + -f, --force + Forcer l'exécution de la planification, même si elle a été mise en pause + avec l'option --pause + +OPTIONS AVANCEES + --lock LOCKFILE + Inscrire dans le fichier spécifié des informations permettant d'éviter + les invocations simultanées de ce script. Si selon ce fichier, le script + tourne depuis plus de 8 heures, un message d'erreur + est consigné et un message d'avertissement est affiché au plus une fois. + Utiliser --lock '' pour désactiver cette fonctionnalité + Par défaut, si ce script est lancé en root, le fichier utilisé pour le + verrouillage est de la forme /var/run/uscrontab/abspath/to/crontab + Si le script est lancé avec un compte utilisateur, aucun verrouillage + n'est effectué. + --lockdelay LOCKDELAY[=8] + Changer le nombre d'heures pendant lesquelles on autorise le script a + verrouiller l'exécution avant d'afficher un avertissement. + -c, --continuous + Par défaut, ce script s'arrête à la première commande planifiée qui + retourne avec un code d'erreur. Notez que les codes d'erreur des + commandes sans planification sont toujours ignorés. Avec cette option, + ce script ne s'arrête jamais, bien qu'il retourne toujours un code + d'erreur si une erreur s'est produite. Il est possible d'ignorer le + code d'erreur pour une commande en particulier avec le préfixe nostop + -k, --stopec EXITCODE[=101] + Spécifier un code d'erreur spécial qui arrête ce script sans erreur, ou + '' pour désactiver cette fonctionnalité. Ceci permet en début de script + de faire des tests par exemple sur l'environnement avant de lancer les + scripts planifiés. Si l'environnement ne convient pas, il suffit au + script de contrôle de retourner le code d'erreur spécifique pour arrêter + le traitement. + --show-ctnow + Afficher l'heure de référence au format crontab 'min hou day mon dow' + Cette valeur peut être utilisée avec l'option --force-ctnow dans des + tests pour reproduire une condition spécifique. + --force-ctnow 'min hou day mon dow' + 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. +}}} diff --git a/doc/ussh.md b/doc/ussh.md new file mode 100644 index 0000000..c7065b0 --- /dev/null +++ b/doc/ussh.md @@ -0,0 +1,76 @@ +# ussh + +~~~ +ussh: se connecter par ssh à un ou plusieurs hôtes + +USAGE + ussh [options] hosts + ussh [options] @hostsfile + ussh -r hosts + ussh --parse hosts + +OPTIONS + hosts + @hostsfile + Spécifier un ou plusieurs hôtes distants sur lequels faire la connexion. + Pour spécifier plusieurs hôtes, il faut les séparer 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 + 'root@{host1,host2}.univ.run' + La forme @hostsfile permet de lire la liste des hôtes depuis le fichier + hostsfile, à raison d'un hôte par ligne. + +Toutes les options de ssh sont reconnues. Les options longues suivantes sont +reconnues comme alias de certaines options courtes de ssh: + --quiet + alias de -q, activer le mode non verbeux + --tty + alias de -t, forcer l'allocation d'un TTY + --login USER + alias de -l, spécifier le user avec lequel se connecter + --port PORT + alias de -p, spécifier le port sur lequel se connecter + +Les options suivantes sont exclusives à ce script: + -d, --domain DOMAIN + Spécifier un domaine par défaut pour les hôtes qui sont spécifiés sans + domaine. + -z, --ssh SSH + Spécifier l'exécutable à utiliser pour lancer ssh. + -r, --remove + Lancer 'ssh-keygen -R' pour chacun des hôtes spécifiés avant de s'y + connecter. Par exemple: + ussh -r host.tld + est équivalent à: + ssh-keygen -R host.tld + ssh-keygen -R host + ssh-keygen -R 10.10.1.5 + ssh host.tld + si l'adresse ip de host.tld est 10.10.1.5 + Quand cette option est spécifié, l'option -j est reconnue et permet de + NE PAS se reconnecter à l'hôte juste après avoir nettoyé les clés. Avec + l'option -j, TOUS les arguments sont des noms d'hôte puisqu'aucune + connexion n'est effectuée. + --exec + --no-exec + Avec --exec, si un seul hôte est spécifié, lancer le processus ssh avec + exec, pour éviter d'encombrer la mémoire. C'est l'option par défaut. + Avec --no-exec, ne jamais utiliser exec pour lancer ssh. + --parse + Afficher la définition des variables ssh, options, hosts et args qui + permettent d'effectuer la connexion à partir d'un autre script. Exemple: + eval "$(ussh --parse args...)" + for host in "${hosts[@]}"; do + ${exec:+exec} "$ssh" "${options[@]}" "$host" "${args[@]}" + done + --cc + Assumer que nutools est installé sur l'hôte distant, et y lancer uwatch + avec l'option --cc, pour permettre de garder la connexion active dans le + cadre d'une redirection de port. + +Si la variable UTOOLS_USSH_RSYNC_SUPPORT contient une valeur non vide, l'analyse +des arguments s'arrête à la première valeur qui n'est pas une option, afin de +permettre l'utilisation de ce script avec l'option -e de rsync. +~~~ + +-*- 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/ussh.twp b/doc/ussh.twp new file mode 100644 index 0000000..1644e2c --- /dev/null +++ b/doc/ussh.twp @@ -0,0 +1,80 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: ussh + +{{{ +ussh: se connecter par ssh à un ou plusieurs hôtes + +USAGE + ussh [options] hosts + ussh [options] @hostsfile + ussh -r hosts + ussh --parse hosts + +OPTIONS + hosts + @hostsfile + Spécifier un ou plusieurs hôtes distants sur lequels faire la connexion. + Pour spécifier plusieurs hôtes, il faut les séparer 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 + 'root@{host1,host2}.univ.run' + La forme @hostsfile permet de lire la liste des hôtes depuis le fichier + hostsfile, à raison d'un hôte par ligne. + +Toutes les options de ssh sont reconnues. Les options longues suivantes sont +reconnues comme alias de certaines options courtes de ssh: + --quiet + alias de -q, activer le mode non verbeux + --tty + alias de -t, forcer l'allocation d'un TTY + --login USER + alias de -l, spécifier le user avec lequel se connecter + --port PORT + alias de -p, spécifier le port sur lequel se connecter + +Les options suivantes sont exclusives à ce script: + -d, --domain DOMAIN + Spécifier un domaine par défaut pour les hôtes qui sont spécifiés sans + domaine. + -z, --ssh SSH + Spécifier l'exécutable à utiliser pour lancer ssh. + -r, --remove + Lancer 'ssh-keygen -R' pour chacun des hôtes spécifiés avant de s'y + connecter. Par exemple: + ussh -r host.tld + est équivalent à: + ssh-keygen -R host.tld + ssh-keygen -R host + ssh-keygen -R 10.10.1.5 + ssh host.tld + si l'adresse ip de host.tld est 10.10.1.5 + Quand cette option est spécifié, l'option -j est reconnue et permet de + NE PAS se reconnecter à l'hôte juste après avoir nettoyé les clés. Avec + l'option -j, TOUS les arguments sont des noms d'hôte puisqu'aucune + connexion n'est effectuée. + --exec + --no-exec + Avec --exec, si un seul hôte est spécifié, lancer le processus ssh avec + exec, pour éviter d'encombrer la mémoire. C'est l'option par défaut. + Avec --no-exec, ne jamais utiliser exec pour lancer ssh. + --parse + Afficher la définition des variables ssh, options, hosts et args qui + permettent d'effectuer la connexion à partir d'un autre script. Exemple: + eval "$(ussh --parse args...)" + for host in "${hosts[@]}"; do + ${exec:+exec} "$ssh" "${options[@]}" "$host" "${args[@]}" + done + --cc + Assumer que nutools est installé sur l'hôte distant, et y lancer uwatch + avec l'option --cc, pour permettre de garder la connexion active dans le + cadre d'une redirection de port. + +Si la variable UTOOLS_USSH_RSYNC_SUPPORT contient une valeur non vide, l'analyse +des arguments s'arrête à la première valeur qui n'est pas une option, afin de +permettre l'utilisation de ce script avec l'option -e de rsync. +}}} diff --git a/doc/usysinfos.md b/doc/usysinfos.md new file mode 100644 index 0000000..9e2b4dd --- /dev/null +++ b/doc/usysinfos.md @@ -0,0 +1,15 @@ +# usysinfos + +~~~ +usysinfos: Afficher les informations sur le système + +USAGE + usysinfos [query] + +Si la requête est spécifiée, tester si le système courant correspond à la +requête. Voir la doc de check_sysinfos() pour le format de la requête. + +Sinon, afficher les informations sur le système courant. +~~~ + +-*- 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/utempl.md b/doc/utempl.md new file mode 100644 index 0000000..3e989a4 --- /dev/null +++ b/doc/utempl.md @@ -0,0 +1,24 @@ +# utempl + +~~~ +utempl: Créer un nouveau fichier à partir d'un modèle + +USAGE + utempl [options] file [template options] + +OPTIONS +Avant le nom du nouveau fichier, les options suivantes peuvent être utilisées: + -t TEMPLATE + Spécifier le modèle de fichier à utiliser. Par défaut, le modèle + à utiliser est déduit de l'extension ou du nom du fichier. + -e, --edit + Editer le fichier après l'avoir créé + -g, --no-edit + Ne pas éditer le fichier après l'avoir créé + +Après le nom du fichier, toutes les options sont spécifiques au modèle +utilisé pour créer le nouveau fichier. Utiliser l'option --help pour +avoir une description des options disponibles. +~~~ + +-*- 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/utempl.twp b/doc/utempl.twp new file mode 100644 index 0000000..4854620 --- /dev/null +++ b/doc/utempl.twp @@ -0,0 +1,28 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: utempl + +{{{ +utempl: Créer un nouveau fichier à partir d'un modèle + +USAGE + utempl [options] file [template options] + +OPTIONS +Avant le nom du nouveau fichier, les options suivantes peuvent être utilisées: + -t TEMPLATE + Spécifier le modèle de fichier à utiliser. Par défaut, le modèle + à utiliser est déduit de l'extension ou du nom du fichier. + -e, --edit + Editer le fichier après l'avoir créé + -g, --no-edit + Ne pas éditer le fichier après l'avoir créé + +Après le nom du fichier, toutes les options sont spécifiques au modèle +utilisé pour créer le nouveau fichier. Utiliser l'option --help pour +avoir une description des options disponibles. +}}} diff --git a/doc/utrigger.md b/doc/utrigger.md new file mode 100644 index 0000000..59932ed --- /dev/null +++ b/doc/utrigger.md @@ -0,0 +1,49 @@ +# utrigger + +~~~ +utrigger: lancer une commande en différé + +USAGE + utrigger [options] -- command [args] + +La commande est lancée après un certain temps, sauf si ce script est rappelé +(auquel cas le compte est réinitialisé), ou si l'opération est annulée. +Attention! La commande est lancée en tâche de fond, et son entrée standard est +connectée à un fichier qui peut être provisionné avec l'option -a + +note: ce script ne fonctionne que sous Linux puisqu'il utilise la commande flock + +OPTIONS + -n, --name NAME + Spécifier un nom identifiant la tâche. Par défaut, le nom est généré à + partir des détails de la tâche à lancer. Ce nom est utilisé pour + identifier les invocations successives. + -f, --cmdfile CMDFILE + Spécifier un fichier contenant les commandes à lancer. Le fichier est + sourcé dans un sous-shell. Utiliser - pour lire les commandes depuis + l'entrée standard. + --rundelay RUNDELAY[=5] + Nombre de secondes au bout desquelles la commande est lancée. Si ce + script est relancé avant la fin de ce décompte, le compte est remis à + zéro. + Utiliser --rundelay '' pour désactiver cette fonctionnalité, auquel cas + la commande est lancée immédiatement. + -s, --sudo + Forcer l'exécution de la commande avec l'utilisateur root si ce n'est + pas déjà le cas + -a, --datafile DATAFILE + Accumuler des données à fournir à la commande. Les informations du + fichier DATAFILE (utiliser - pour l'entrée standard) sont ajoutées à un + fichier temporaires, et sont fournies en une seule fois à la commande + sur son entrée standard. + -A, --data DATA + Variante de --datafile où les données sont fournies sur la ligne de + commande au lieu d'un fichier externe. Si les deux options -a et -A sont + spécifiées, les données sont accumulées dans l'ordre --datafile puis + --data + -k, --cancel + Annuler le lancement planifié d'une commande. Si la commande est déjà en + train de tourner, cette option n'a aucun effet. +~~~ + +-*- 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/utrigger.twp b/doc/utrigger.twp new file mode 100644 index 0000000..2050029 --- /dev/null +++ b/doc/utrigger.twp @@ -0,0 +1,53 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: utrigger + +{{{ +utrigger: lancer une commande en différé + +USAGE + utrigger [options] -- command [args] + +La commande est lancée après un certain temps, sauf si ce script est rappelé +(auquel cas le compte est réinitialisé), ou si l'opération est annulée. +Attention! La commande est lancée en tâche de fond, et son entrée standard est +connectée à un fichier qui peut être provisionné avec l'option -a + +note: ce script ne fonctionne que sous Linux puisqu'il utilise la commande flock + +OPTIONS + -n, --name NAME + Spécifier un nom identifiant la tâche. Par défaut, le nom est généré à + partir des détails de la tâche à lancer. Ce nom est utilisé pour + identifier les invocations successives. + -f, --cmdfile CMDFILE + Spécifier un fichier contenant les commandes à lancer. Le fichier est + sourcé dans un sous-shell. Utiliser - pour lire les commandes depuis + l'entrée standard. + --rundelay RUNDELAY[=5] + Nombre de secondes au bout desquelles la commande est lancée. Si ce + script est relancé avant la fin de ce décompte, le compte est remis à + zéro. + Utiliser --rundelay '' pour désactiver cette fonctionnalité, auquel cas + la commande est lancée immédiatement. + -s, --sudo + Forcer l'exécution de la commande avec l'utilisateur root si ce n'est + pas déjà le cas + -a, --datafile DATAFILE + Accumuler des données à fournir à la commande. Les informations du + fichier DATAFILE (utiliser - pour l'entrée standard) sont ajoutées à un + fichier temporaires, et sont fournies en une seule fois à la commande + sur son entrée standard. + -A, --data DATA + Variante de --datafile où les données sont fournies sur la ligne de + commande au lieu d'un fichier externe. Si les deux options -a et -A sont + spécifiées, les données sont accumulées dans l'ordre --datafile puis + --data + -k, --cancel + Annuler le lancement planifié d'une commande. Si la commande est déjà en + train de tourner, cette option n'a aucun effet. +}}} diff --git a/doc/uwatch.md b/doc/uwatch.md new file mode 100644 index 0000000..5dc425c --- /dev/null +++ b/doc/uwatch.md @@ -0,0 +1,31 @@ +# uwatch + +~~~ +uwatch: afficher l'heure + +USAGE + uwatch [options] + +OPTIONS + -t, --time + Afficher l'heure (par défaut) + -c, --count + Afficher le temps écoulé depuis le lancement de ce script + -u, --units + Avec l'option --count, afficher l'unité: sec., min. ou heures + -o, --offset NBSEC + Avec l'option --count, spécifier un nombre de secondes à partir duquel + compter + -s, --step NBSECS[=1] + Spécifier la période de rafraichissement de l'affichage + -a, --prefix PREFIX + Spécifier une chaine à afficher avant l'heure + -z, --suffix SUFFIX + Spécifier une chaine à afficher après l'heure + --cc + Equivalent à -c -s 5 -a 'Connecté sur $MYHOST depuis ' -z '...' + Permet de garantir une activité sur une connexion SSH utilisée + uniquement pour faire une redirection de port +~~~ + +-*- 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/uwatch.twp b/doc/uwatch.twp new file mode 100644 index 0000000..dafc8c4 --- /dev/null +++ b/doc/uwatch.twp @@ -0,0 +1,35 @@ +# -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +##@creator: jclain +##@created: 27/04/2016 03:19 +##@modifier: jclain +##@changecount: 1 +##@tags: +##@title: uwatch + +{{{ +uwatch: afficher l'heure + +USAGE + uwatch [options] + +OPTIONS + -t, --time + Afficher l'heure (par défaut) + -c, --count + Afficher le temps écoulé depuis le lancement de ce script + -u, --units + Avec l'option --count, afficher l'unité: sec., min. ou heures + -o, --offset NBSEC + Avec l'option --count, spécifier un nombre de secondes à partir duquel + compter + -s, --step NBSECS[=1] + Spécifier la période de rafraichissement de l'affichage + -a, --prefix PREFIX + Spécifier une chaine à afficher avant l'heure + -z, --suffix SUFFIX + Spécifier une chaine à afficher après l'heure + --cc + Equivalent à -c -s 5 -a 'Connecté sur $MYHOST depuis ' -z '...' + Permet de garantir une activité sur une connexion SSH utilisée + uniquement pour faire une redirection de port +}}} diff --git a/doc/vzusage.md b/doc/vzusage.md new file mode 100644 index 0000000..2d4003f --- /dev/null +++ b/doc/vzusage.md @@ -0,0 +1,21 @@ +# vzusage + +~~~ +vzusage: afficher des informations sur une machine virtuelle OpenVZ + +USAGE + vzusage [options] [params...]d + +OPTIONS + -b Afficher les informations de /proc/user_beancounters + -f N'afficher que les valeurs pour lesquelles failcnt > 0. + Implique -b + -z coef + Afficher les instructions à utiliser pour augmenter de coef% les + valeurs pour lesquelles failcnt > 0. Implique -f + -c config|veid + Afficher les informations du fichier de configuration plutôt que les + beancounters +~~~ + +-*- 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/woArchive.md b/doc/woArchive.md new file mode 100644 index 0000000..4c0a09a --- /dev/null +++ b/doc/woArchive.md @@ -0,0 +1,17 @@ +# woArchive + +~~~ +woArchive: créer une archive de la distribution WebObjects en cours +USAGE + woArchive [-n name] [-f files] + +OPTIONS + -n NAME + Nom de base de l'archive. Par défaut il s'agit de WebObjects- + + -f FILES + Nom de la liste des fichiers de l'archives. Par défaut il s'agit de + $NAME.files +~~~ + +-*- 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/woSwitch.md b/doc/woSwitch.md new file mode 100644 index 0000000..1700f3f --- /dev/null +++ b/doc/woSwitch.md @@ -0,0 +1,29 @@ +# woSwitch + +~~~ +woSwitch: Changer la version de WebObjects pour le système en cours +USAGE + woSwitch [-f from.files] to-archive.tar.gz + +OPTIONS + -f from.files + Spécifier la liste des fichiers pour la version de WebObjects + installée. Par défaut, il s'agit de WebObjects-.files + La liste doit correspondre à la version en cours. + + -F Forcer l'installation, même si la version en cours ne correspond pas à ce + qui est inscrit dans from.files + + to-archive.tar.gz + Nom de l'archive qui contient la version à installer. + +Ce script ne fonctionne que sur MacOS X +Le contenu des répertoires suivants est sauvegardé avant le changement: + /Library/WebObject/Applications + /Library/WebObject/Configuration + /Library/WebObject/Extensions +Ensuite, les répertoires Applications et Configuration sont restaurés. Il faudra +restaurer Extensions manuellement. +~~~ + +-*- 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/woctl.md b/doc/woctl.md new file mode 100644 index 0000000..ebe1682 --- /dev/null +++ b/doc/woctl.md @@ -0,0 +1,56 @@ +# woctl + +~~~ +woctl: Contrôler des applications WebObjects + +USAGE + woctl [options] action args + wostart args... + wostop args... + wobounce args... + worestart args... + +OPTIONS + -h HOST + Spécifier l'hôte qui fait tourner le moniteur sous la forme host[:port] + -p PASSWORD + Spécifier le mot de passe pour le moniteur + +ACTIONS + Dans les arguments des actions ci-dessous, une application peut être + spécifiée sous la forme App ou App.woa. Spécifier une application revient à + spécifier toutes les instances configurées pour cette application. + Si on spécifie un framework sous la forme Fwk.framework, cela revient à + spécifier toutes les applications qui dépendent de ce framework. + Sinon, une instance individuelle est de la forme App-N, où N est un entier + positif. + + status + afficher l'état des instances qui tournent actuellement + version + afficher la version de WebObjects installée + wotaskd + javamonitor + woservices + piloter wotaskd/javamonitor + _create + créer une instance par défaut dans javamonitor + configure + configurer un bundle + tag + ajouter une information de version à un bundle + run + lancer une application localement en mode debug + download + télécharger une application ou un framework + start apps... + démarrer une ou plusieurs applications + stop apps... + arrêter une ou plusieurs applications + restart apps... + relancer une ou plusieurs applications + bounce apps... + relancer une ou plusieurs applications en mode bounce +~~~ + +-*- 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/woctl.twp b/doc/woctl.twp index 46d7cbc..a775af2 100644 --- a/doc/woctl.twp +++ b/doc/woctl.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:20 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -39,6 +39,8 @@ ACTIONS javamonitor woservices piloter wotaskd/javamonitor + _create + créer une instance par défaut dans javamonitor configure configurer un bundle tag diff --git a/doc/woinst.md b/doc/woinst.md new file mode 100644 index 0000000..68e77a0 --- /dev/null +++ b/doc/woinst.md @@ -0,0 +1,25 @@ +# woinst + +~~~ +woinst: Déployer un bundle (application ou framework) de WebObjects + +USAGE + woinst [options] ... + +OPTIONS + PREFIX=value + Spécifier une valeur pour un préfixe, plutôt que de laisser uprefix + l'autodétecter. Utiliser uprefix -l pour une liste de préfixes valides. + -b Redémarrer les instances en mode bounce. + Par défaut, les instances sont arrêtées avant le déploiement, et + redémarrées après + -W Ne déployer que les resources web. Implique -n + -n Ne pas tagger les bundles déployés avec un numéro de version. Par + défaut, l'utilisateur est invité à compléter des informations telles + que n° de version et date de release si ces informations ne sont pas + disponible. + -x CMD + Exécuter la commande CMD après avoir effectué le déploiement +~~~ + +-*- 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/wosign.md b/doc/wosign.md new file mode 100644 index 0000000..a87e788 --- /dev/null +++ b/doc/wosign.md @@ -0,0 +1,20 @@ +# wosign + +~~~ +wosign: signer les jars d'un bundle + +USAGE + wosign + +OPTIONS + -f Forcer la (re)signature des jars + -d Enlever la signature des jars originaux + -s Signer les jar du bundle [PAR DEFAUT] + --init + Initialiser les fichiers de configuration pour la signature des bundles. + --sudo + Si le répertoire de destination des fichiers de configuration n'est + accessible en écriture, relancer le script en root. +~~~ + +-*- 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/wosign.twp b/doc/wosign.twp index 3ad2a2b..bfd6e7e 100644 --- a/doc/wosign.twp +++ b/doc/wosign.twp @@ -1,6 +1,6 @@ # -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@creator: jclain -##@created: 15/03/2012 22:20 +##@created: 27/04/2016 03:19 ##@modifier: jclain ##@changecount: 1 ##@tags: @@ -10,7 +10,7 @@ wosign: signer les jars d'un bundle USAGE - wosign + wosign OPTIONS -f Forcer la (re)signature des jars @@ -18,4 +18,7 @@ OPTIONS -s Signer les jar du bundle [PAR DEFAUT] --init Initialiser les fichiers de configuration pour la signature des bundles. + --sudo + Si le répertoire de destination des fichiers de configuration n'est + accessible en écriture, relancer le script en root. }}} diff --git a/lib/reptyr/reptyr.c b/lib/reptyr/reptyr.c index e6dc4d1..57cdcd3 100644 --- a/lib/reptyr/reptyr.c +++ b/lib/reptyr/reptyr.c @@ -152,17 +152,18 @@ void do_proxy(int pty) { } } -void usage(char *me) { - fprintf(stderr, "Usage: %s [-s] PID\n", me); - fprintf(stderr, " %s -l|-L [COMMAND [ARGS]]\n", me); - fprintf(stderr, " -l Create a new pty pair and print the name of the slave.\n"); - fprintf(stderr, " if there are command-line arguments after -l\n"); - fprintf(stderr, " they are executed with REPTYR_PTY set to path of pty.\n"); - fprintf(stderr, " -L Like '-l', but also redirect the child's stdio to the slave.\n"); - fprintf(stderr, " -s Attach fds 0-2 on the target, even if it is not attached to a tty.\n"); - fprintf(stderr, " -h Print this help message and exit.\n"); - fprintf(stderr, " -v Print the version number and exit.\n"); - fprintf(stderr, " -V Print verbose debug output.\n"); +void usage(char *me, FILE* out) { + if (out == NULL) out = stderr; + fprintf(out, "Usage: %s [-s] PID\n", me); + fprintf(out, " %s -l|-L [COMMAND [ARGS]]\n", me); + fprintf(out, " -l Create a new pty pair and print the name of the slave.\n"); + fprintf(out, " if there are command-line arguments after -l\n"); + fprintf(out, " they are executed with REPTYR_PTY set to path of pty.\n"); + fprintf(out, " -L Like '-l', but also redirect the child's stdio to the slave.\n"); + fprintf(out, " -s Attach fds 0-2 on the target, even if it is not attached to a tty.\n"); + fprintf(out, " -h Print this help message and exit.\n"); + fprintf(out, " -v Print the version number and exit.\n"); + fprintf(out, " -V Print verbose debug output.\n"); } void check_yama_ptrace_scope(void) { @@ -194,13 +195,16 @@ int main(int argc, char **argv) { int unattached_script_redirection = 0; if (argc < 2) { - usage(argv[0]); + usage(argv[0], NULL); return 2; + } else if (argc == 2 && !strcmp(argv[1], "--help")) { + usage(argv[0], stdout); + return 0; } if (argv[arg][0] == '-') { switch(argv[arg][1]) { case 'h': - usage(argv[0]); + usage(argv[0], stdout); return 0; case 'l': do_attach = 0; @@ -223,14 +227,14 @@ int main(int argc, char **argv) { verbose = 1; break; default: - usage(argv[0]); + usage(argv[0], NULL); return 1; } } if (do_attach && arg >= argc) { fprintf(stderr, "%s: No pid specified to attach\n", argv[0]); - usage(argv[0]); + usage(argv[0], NULL); return 1; } diff --git a/noerr b/noerr index 195a26d..93e5ab8 100755 --- a/noerr +++ b/noerr @@ -1,4 +1,8 @@ #!/bin/bash # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +if [ $# -eq 1 -a "$1" == --help ]; then + echo "noerr: lancer une commande en supprimant la sortie d'erreur" + exit 0 +fi [ $# -gt 0 ] || exit 0 "$@" 2>/dev/null diff --git a/noerror b/noerror index 547dc1b..03850ec 100755 --- a/noerror +++ b/noerror @@ -1,4 +1,8 @@ #!/bin/bash # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +if [ $# -eq 1 -a "$1" == --help ]; then + echo "noerror: lancer une commande en masquant son code de retour. le code de retour est toujours 0" + exit 0 +fi [ $# -gt 0 ] || set : "$@" || exit 0 diff --git a/noout b/noout index 8f5b5d9..12ae251 100755 --- a/noout +++ b/noout @@ -1,4 +1,8 @@ #!/bin/bash # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +if [ $# -eq 1 -a "$1" == --help ]; then + echo "noout: lancer une commande en supprimant la sortie standard" + exit 0 +fi [ $# -gt 0 ] || exit 0 "$@" >/dev/null diff --git a/reptyr.cgo b/reptyr.cgo index f28ba59..bed81f0 100755 --- a/reptyr.cgo +++ b/reptyr.cgo @@ -1520,17 +1520,18 @@ void do_proxy(int pty) { } } -void usage(char *me) { - fprintf(stderr, "Usage: %s [-s] PID\n", me); - fprintf(stderr, " %s -l|-L [COMMAND [ARGS]]\n", me); - fprintf(stderr, " -l Create a new pty pair and print the name of the slave.\n"); - fprintf(stderr, " if there are command-line arguments after -l\n"); - fprintf(stderr, " they are executed with REPTYR_PTY set to path of pty.\n"); - fprintf(stderr, " -L Like '-l', but also redirect the child's stdio to the slave.\n"); - fprintf(stderr, " -s Attach fds 0-2 on the target, even if it is not attached to a tty.\n"); - fprintf(stderr, " -h Print this help message and exit.\n"); - fprintf(stderr, " -v Print the version number and exit.\n"); - fprintf(stderr, " -V Print verbose debug output.\n"); +void usage(char *me, FILE* out) { + if (out == NULL) out = stderr; + fprintf(out, "Usage: %s [-s] PID\n", me); + fprintf(out, " %s -l|-L [COMMAND [ARGS]]\n", me); + fprintf(out, " -l Create a new pty pair and print the name of the slave.\n"); + fprintf(out, " if there are command-line arguments after -l\n"); + fprintf(out, " they are executed with REPTYR_PTY set to path of pty.\n"); + fprintf(out, " -L Like '-l', but also redirect the child's stdio to the slave.\n"); + fprintf(out, " -s Attach fds 0-2 on the target, even if it is not attached to a tty.\n"); + fprintf(out, " -h Print this help message and exit.\n"); + fprintf(out, " -v Print the version number and exit.\n"); + fprintf(out, " -V Print verbose debug output.\n"); } void check_yama_ptrace_scope(void) { @@ -1562,13 +1563,16 @@ int main(int argc, char **argv) { int unattached_script_redirection = 0; if (argc < 2) { - usage(argv[0]); + usage(argv[0], NULL); return 2; + } else if (argc == 2 && !strcmp(argv[1], "--help")) { + usage(argv[0], stdout); + return 0; } if (argv[arg][0] == '-') { switch(argv[arg][1]) { case 'h': - usage(argv[0]); + usage(argv[0], stdout); return 0; case 'l': do_attach = 0; @@ -1591,14 +1595,14 @@ int main(int argc, char **argv) { verbose = 1; break; default: - usage(argv[0]); + usage(argv[0], NULL); return 1; } } if (do_attach && arg >= argc) { fprintf(stderr, "%s: No pid specified to attach\n", argv[0]); - usage(argv[0]); + usage(argv[0], NULL); return 1; } diff --git a/update-nutools b/update-nutools index 4cf3ace..f939e82 100755 --- a/update-nutools +++ b/update-nutools @@ -8,6 +8,11 @@ PUB_REPO=http://vcs.univ-reunion.fr/anongit/modules/nutools.git NAME=nutools ################################################################################ +if [ $# -eq 1 -a "$1" == --help ]; then + echo "update-nutools: mettre à jour nutools" + exit 0 +fi + [ -z "$update_nutools_use_proxy" ] && export http_proxy= CURL="$(which curl 2>/dev/null)"