Intégration de la branche release-6.2.0

This commit is contained in:
Jephté Clain 2017-03-13 11:28:16 +04:00
commit 35c98a2f8e
67 changed files with 3090 additions and 27248 deletions

View File

@ -1,3 +1,38 @@
## Version 6.2.0 du 13/03/2017-11:27
* `4a7b14b` ajouter un argument force à testupdated et testnewer
* `8a6678c` ruinst et rwoinst: piloter l'interaction distante à partir du paramétrage local
* `e9b574d` rwoinst: intégrer des fonctionnalités de ruinst; support préliminaire de deploy
* `2561f67` ruinst: utiliser la configuration ruinst par défaut pour deploy
* `38f21aa` ruinst: support de deploy pour calculer l'hôte pour le déploiement
* `d5846ba` deploy: possibilité de filtrer les variables à afficher. en cas d'échec, afficher false pour faciliter l'utilisation avec eval()
* `8fa58e2` quelques corrections sur deploy
* `20df6c4` support du depot deploy
* `3a24e83` régression dans set_array_cmd()
* `31fb39d` réorganiser certaines fonctions
* `528d579` ajout des fonctions seta(), _seta(), echo_seta()
* `a43359c` maj doc
* `2177e6a` cesser d'utiliser des fonctions obsolètes
* `9a777b3` cosmetic
* `a5fcf78` ajout de evali()
* `af3bb37` ajout de evals()
* `fbad986` corriger un problème potentiel avec should_quote()
* `f570438` bug avec recho -n; maj doc
* `3d1b826` cosmetic
* `e800376` cosmetic
* `0805f4f` SVirtualBox: ajout de l'option -r pour relancer avec restauration du snapshot
* `225060c` utempl/www: correction des options et modification cosmétique
* `ad88c99` Intégration de la branche update-templates
* `532d21d` support de la génération de pages html avec bootstrap
* `c52031b` maj de la description
* `ca4de19` Intégration de la branche update-apacheconfig
* `02f52af` afficher un menu si plusieurs répertoires de templates sont disponibles
* `6192c0a` description des modifications à apporter
* `f2b6381` SVirtualBox: démarrer en mode separate par défaut
* `7a38535` support des hôtes de l'université
* `b6b7fa9` uscrontab: support de l'option -G pour les tests
* `e58ff74` maj du template pour runs
## Version 6.1.0 du 13/02/2017-17:06 ## Version 6.1.0 du 13/02/2017-17:06
* `748c2f7` Intégration de la branche update-network * `748c2f7` Intégration de la branche update-network

View File

@ -10,19 +10,38 @@ USAGE
$scriptname [options] vmName $scriptname [options] vmName
OPTIONS OPTIONS
-n Ne rien faire excepté s'assurer que les modules VirtualBox sont chargés -n, --nop
-l Lister les machines virtuelles Ne rien faire excepté s'assurer que les modules VirtualBox sont chargés
-s Démarrer la machine virtuelle (par défaut) -l, --list
Lister les machines virtuelles
-s, --start
Démarrer la machine virtuelle. C'est l'action par défaut.
Si le nom de la machine virtuelle n'est pas spécifiée, un menu est Si le nom de la machine virtuelle n'est pas spécifiée, un menu est
affiché affiché
-b Démarrer la VM sans interface graphique. Cette option n'est valide -x, --gui
qu'avec -s -b, --headless
-k Arrêter la machine virtuelle (par ACPI) --separate
-p Mettre en veille la machine virtuelle (par ACPI) Ces options ne sont valides qu'avec -s et permettent de spécifier le
-H Arrêter sauvagement la machine virtuelle type de démarrage: 'gui' permet d'afficher une fenêtre complète dans
-R Redémarrer sauvagement la machine virtuelle laquelle l'accélération graphique est supportée, headless démarre la
-S Enregistrer l'état de la machine virtuelle machine en tâche de fond, et separate affiche une fenêtre qui attaque la
-g Afficher le gestionnaire de machines virtuelle" machine démarrée en tâche de fond. --separate est l'option par défaut.
-k, -t, --stop
Arrêter la machine virtuelle. Les options -p, -H, -R, -S et -r
permettent de spécifier le type d'arrêt de la machine virtuelle
-p, --sleep
Mettre en veille la machine virtuelle (par ACPI)
-H, --poweroff
Arrêter sauvagement la machine virtuelle
-R, --reset
Redémarrer sauvagement la machine virtuelle
-S, --savestate
Enregistrer l'état de la machine virtuelle
-r, --rrestart
Arrêter la machine, restaurer l'état du dernier snapshot puis la
relancer.
-g, --gui
Afficher le gestionnaire de machines virtuelle"
} }
function build_arrays() { function build_arrays() {
@ -62,20 +81,24 @@ function start_virtualbox() {
} }
action=start action=start
type=separate
stopaction=acpipowerbutton stopaction=acpipowerbutton
headless= restore=
parse_opts + "${PRETTYOPTS[@]}" \ parse_opts + "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \ --help '$exit_with display_help' \
-n action=nop \ -n,--nop action=nop \
-l,--list action=list \ -l,--list action=list \
-s,--start action=start \ -s,--start action=start \
-b,--background,--headless headless=1 \ -x,--gui type=gui \
-b,--background,--headless type=headless \
--separate type=separate \
-k,-t,--stop '$action=stop; stopaction=acpipowerbutton' \ -k,-t,--stop '$action=stop; stopaction=acpipowerbutton' \
-p,--sleep '$action=stop; stopaction=acpisleepbutton' \ -p,--sleep '$action=stop; stopaction=acpisleepbutton' \
-H '$action=stop; stopaction=poweroff' \ -H,--poweroff '$action=stop; stopaction=poweroff' \
-R '$action=stop; stopaction=reset' \ -R,--reset '$action=stop; stopaction=reset' \
-S '$action=stop; stopaction=savestate' \ -S,--savestate '$action=stop; stopaction=savestate' \
-g action=gui \ -r,--rrestart '$action=stop; restore=1' \
-g,--gui action=gui \
@ args -- "$@" && set -- "${args[@]}" || die "$args" @ args -- "$@" && set -- "${args[@]}" || die "$args"
"$scriptdir/EnsureVM" virtualbox || die "$scriptdir/EnsureVM" virtualbox || die
@ -110,8 +133,8 @@ $(array_join rvms "
fi fi
if [ -n "$vm" ]; then if [ -n "$vm" ]; then
estep "Démarrage de $vm${headless:+ en tâche de fond}" estep "Démarrage de $vm de type $type"
VBoxManage -q startvm ${headless:+--type headless} "$vm" "$@" VBoxManage -q startvm --type "$type" "$vm" "$@"
else else
ewarn "Aucune VM à démarrer n'a été trouvée" ewarn "Aucune VM à démarrer n'a été trouvée"
fi fi
@ -120,10 +143,23 @@ elif [ "$action" == stop ]; then
if [ -z "$vm" -a "${rvms[*]}" ]; then if [ -z "$vm" -a "${rvms[*]}" ]; then
select_vm rvms vm "Choisissez la VM à arrêter avec la méthode $stopaction" select_vm rvms vm "Choisissez la VM à arrêter avec la méthode $stopaction"
fi fi
[ -n "$vm" ] || die
if [ -n "$vm" ]; then
estep "Arrêt de $vm avec la méthode $stopaction" estep "Arrêt de $vm avec la méthode $stopaction"
VBoxManage -q controlvm "$vm" "$stopaction" VBoxManage -q controlvm "$vm" "$stopaction" || die
if [ -n "$restore" ]; then
ebegin "Attente de l'arrêt"
while true; do
build_arrays
array_contains svms "$vm" && break
edot 0
sleep 1
done
eend
estep "Restauration du snapshot"
VBoxManage -q snapshot "$vm" restorecurrent || die
estep "Démarrage"
VBoxManage -q startvm --type "$type" "$vm"
fi fi
elif [ "$action" == gui ]; then elif [ "$action" == gui ]; then

View File

@ -1 +1 @@
6.1.0 6.2.0

View File

@ -220,6 +220,28 @@ elif [ "$action" == deploy -o "$action" == localhosts ]; then
elif [ "$action" == new-site ]; then elif [ "$action" == new-site ]; then
host="$site_host" host="$site_host"
templdir="$site_templdir" templdir="$site_templdir"
if [ -z "$templdir" -a -d "$destdir/templates" ]; then
# si on ne précise pas le template à utiliser, alors afficher
# éventuellement un menu si plusieurs templates sont disponibles
templdirs=()
if [ -n "$(list_all "$destdir/templates" "*SITE*")" ]; then
array_add templdirs templates
templdir=templates
fi
array_from_lines stempldirs "$(list_dirs "$destdir/templates" | grep -v SITE)"
for stempldir in "${stempldirs[@]}"; do
if [ -n "$(list_all "$destdir/templates/$stempldir" "*SITE*")" ]; then
array_add templdirs "templates/$stempldir"
[ -n "$templdir" ] || templdir="templates/$stempldir"
fi
done
if [ ${#templdirs[*]} -gt 1 ]; then
simple_menu templdir templdirs -t "Choix du répertoire des modèles" -m "Veuillez choisir le modèle à utiliser"
fi
templdir="$destdir/$templdir"
fi
if [[ "$templdir" != */* ]] && [ -d "$destdir/templates/$templdir" ]; then if [[ "$templdir" != */* ]] && [ -d "$destdir/templates/$templdir" ]; then
templdir="$destdir/templates/$templdir" templdir="$destdir/templates/$templdir"
elif [ -z "$templdir" ]; then elif [ -z "$templdir" ]; then

View File

@ -161,11 +161,11 @@ $(qvals "./$scriptname" ${pkstring:+-s "$pkstring"} ${luser:+-l} "$user")" >"$wo
estep "Exécution du script" estep "Exécution du script"
"${ssh[@]}" "$remoteuser@$host" "\ "${ssh[@]}" "$remoteuser@$host" "\
__estack=$(quoted_arg "$__estack") __estack=$(qval "$__estack")
__tlevel=$(quoted_arg "$__tlevel") __tlevel=$(qval "$__tlevel")
export __estack __tlevel export __estack __tlevel
${UTOOLS_LANG:+UTOOLS_LANG='$UTOOLS_LANG'; export UTOOLS_LANG ${UTOOLS_LANG:+UTOOLS_LANG='$UTOOLS_LANG'; export UTOOLS_LANG
}$(quoted_args "./$archivename" ${tmproot:+--tmproot "$tmproot"})" }$(qvals "./$archivename" ${tmproot:+--tmproot "$tmproot"})"
r=$? r=$?
ac_clean "$workdir" ac_clean "$workdir"

2
cssh
View File

@ -23,7 +23,7 @@ vars="$("$scriptdir/ussh" --parse "$@")" || die
eval "$vars" eval "$vars"
[ "${#hosts[*]}" -gt 0 ] || die "Vous devez spécifier l'hôte sur lequel se connecter" [ "${#hosts[*]}" -gt 0 ] || die "Vous devez spécifier l'hôte sur lequel se connecter"
cmd="'$(quoted_args "${args[@]}") cmd="'$(qvals "${args[@]}")
"' "'
function __ask() { function __ask() {
local r local r

View File

@ -7,19 +7,38 @@ USAGE
SVirtualBox [options] vmName SVirtualBox [options] vmName
OPTIONS OPTIONS
-n Ne rien faire excepté s'assurer que les modules VirtualBox sont chargés -n, --nop
-l Lister les machines virtuelles Ne rien faire excepté s'assurer que les modules VirtualBox sont chargés
-s Démarrer la machine virtuelle (par défaut) -l, --list
Lister les machines virtuelles
-s, --start
Démarrer la machine virtuelle. C'est l'action par défaut.
Si le nom de la machine virtuelle n'est pas spécifiée, un menu est Si le nom de la machine virtuelle n'est pas spécifiée, un menu est
affiché affiché
-b Démarrer la VM sans interface graphique. Cette option n'est valide -x, --gui
qu'avec -s -b, --headless
-k Arrêter la machine virtuelle (par ACPI) --separate
-p Mettre en veille la machine virtuelle (par ACPI) Ces options ne sont valides qu'avec -s et permettent de spécifier le
-H Arrêter sauvagement la machine virtuelle type de démarrage: 'gui' permet d'afficher une fenêtre complète dans
-R Redémarrer sauvagement la machine virtuelle laquelle l'accélération graphique est supportée, headless démarre la
-S Enregistrer l'état de la machine virtuelle machine en tâche de fond, et separate affiche une fenêtre qui attaque la
-g Afficher le gestionnaire de machines virtuelle machine démarrée en tâche de fond. --separate est l'option par défaut.
-k, -t, --stop
Arrêter la machine virtuelle. Les options -p, -H, -R, -S et -r
permettent de spécifier le type d'arrêt de la machine virtuelle
-p, --sleep
Mettre en veille la machine virtuelle (par ACPI)
-H, --poweroff
Arrêter sauvagement la machine virtuelle
-R, --reset
Redémarrer sauvagement la machine virtuelle
-S, --savestate
Enregistrer l'état de la machine virtuelle
-r, --rrestart
Arrêter la machine, restaurer l'état du dernier snapshot puis la
relancer.
-g, --gui
Afficher le gestionnaire de machines virtuelle
~~~ ~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

29
doc/tools/create-user.md Normal file
View File

@ -0,0 +1,29 @@
# create-user
~~~
create-user: créer un utilisateur sudoer et lui installer une clé publique ssh
USAGE
create-user user [-p pubkey]
OPTIONS
-p, --pkfile PKFILE
Installer la clé publique ssh contenue dans le fichier spécifié. Par
défaut, prendre le fichier ~/.ssh/id_rsa.pub de l'utilisateur courant.
-s, --pkstring PUBKEY
Installer la clé publique ssh spécifiée. Cette option avancée n'est pas
utilisée en temps normal. Elle a la priorité sur l'option --pkfile
-l, --luser
Ne pas donner à l'utilisateur le droit de sudoer.
-h, --host [USER@]HOST
Créer l'utilisateur sur l'hôte distant spécifié. Si l'utilisateur
distant n'est pas root, il doit être sudoer.
-T, --tmproot TMPROOT
Spécifier le répertoire temporaire sur l'hôte distant, comme par exemple
/var/tmp. Cette option est utile pour certains serveurs, qui ont un /tmp
minuscule.
-S, --ssh SSH
Spécifier le programme à utiliser pour la connection par ssh.
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

45
doc/tools/netconfig.md Normal file
View File

@ -0,0 +1,45 @@
# netconfig
~~~
netconfig: gérer la configuration du réseau
USAGE
netconfig -c network.conf
netconfig [iface:]ip[/suffix]...
OPTIONS
-P, --partial
Activer le mode de configuration partielle. C'est la valeur par défaut.
Dans ce mode, la configuration courante n'est pas modifiée. Seules de
nouvelles adresses ips sont configurées le cas échéant.
-F, --full
Activer le mode de configuration complète. Dans ce mode, le nom d'hôte
ainsi que toutes les interfaces, pont et adresses sont configurés.
-z, --reset
En mode full, recréer le fichier /etc/network/interfaces au lieu
d'essayer de le mettre à jour.
-l, --inline
Prendre la configuration depuis la ligne de commande. C'est la valeur
par défaut, sauf si un fichier network.conf existe dans le répertoire
courant.
Dans ce mode, chaque argument est une spécification d'adresse IP à
configurer. Les autres paramètres i.e les ponts, le nom d'hôte et le
contenu du fichier /etc/networks sont spécifiés avec les options -b,
-h et -e
-c, --config CONFIG
Spécifier le fichier de configuration à utiliser pour la configuration
du réseau. Cette option est automatiquement activée si le répertoire
courant contient un fichier network.conf
-w, --write
Ecrire la configuration actuelle dans le fichier network.conf
Note: comme ce script demande les droits de root, le fichier sera écrit
avec le propriétaire root.
-b, --bridge BR:IFACES
En mode inline, spécifier une liste de ponts à configurer.
-h, --host HOST
En mode inline, spécifier le nom d'hôte pleinement qualifié
-e, --etc-networks CONTENT
Spécifier un contenu pour remplacer le fichier /etc/networks
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -6,13 +6,24 @@ umountr: démonter un système de fichier récursivement
USAGE USAGE
umountr mountpoint umountr mountpoint
Démonter tous les systèmes de fichiers qui sont montés en-dessous de mountpoint
puis démonter mountpoint. Démonter aussi tous les systèmes de fichiers
bind-montés à partir d'un sous-répertoire de mountpoint.
OPTION OPTION
-c, --continuous -c, --continuous
Continuer même en cas d'erreur Continuer même en cas d'erreur
-r, --recursive
-1, --no-recursive
Spécifier le type de démontage:
Avec -1, un démontage simple est effectué, comme avec umount. Ce type de
démontage est automatiquement sélectionné pour les systèmes de fichier
montés sous le répertoire /media
Avec -r, le démontage est récursif: tous les systèmes de fichiers qui
sont montés en-dessous de mountpoint sont démontés puis mountpoint est
démonté. Tous les systèmes de fichiers bind-montés à partir d'un sous-
répertoire de mountpoint sont démontés aussi.
-o, --poweroff
-k, --no-poweroff
Après avoir démonté le système de fichier mountpoint, éteindre le
périphérique qui y correspond. --poweroff est automatiquement activé
pour les systèmes de fichier montés sous le répertoire /media
~~~ ~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -56,11 +56,13 @@ COMMANDS
-R Afficher les modifications effectuées depuis la dernière release. -R Afficher les modifications effectuées depuis la dernière release.
clone git@host:path/to/repo [destdir] clone git@host:path/to/repo [destdir]
clone http://host/gituser/path/to/repo [destdir]
Cloner un dépôt distant. Basculer sur la branche develop si elle existe. Cloner un dépôt distant. Basculer sur la branche develop si elle existe.
Initialiser git annex si le dépôt contient des fichiers annexés. Initialiser git annex si le dépôt contient des fichiers annexés.
Récupérer aussi ces fichiers avec 'git annex get' Récupérer aussi ces fichiers avec 'git annex get'
crone git@host:path/to/repo [destdir] crone git@host:path/to/repo [destdir]
crone http://host/gituser/path/to/repo [destdir]
Créer un dépôt distant sur gitolite, puis le cloner Créer un dépôt distant sur gitolite, puis le cloner
develop develop

View File

@ -283,6 +283,12 @@ OPTIONS AVANCEES
référence. Il faut respecter le format, sinon les résultats ne sont pas 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 garantis. Le mieux est de reprendre le résultat de l'option --show-ctnow
en le modifiant un peu si nécessaire. en le modifiant un peu si nécessaire.
-G, --any-ctnow
Pour le développement ou des tests, lancer toutes les commandes dans
l'ordre sans tenir compte de l'heure de référence. Cette commande ne
devrait pas être utilisée en temps normal, mais elle existe pour
simplifier les tests avec --show-ctnow + --force-ctnow dans les cas
simples.
~~~ ~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -77,8 +77,9 @@ syntaxe 'setx -a array=cmd args...' est supportée aussi
~~~ ~~~
Implémenter une syntaxe lisible et naturelle permettant d'enchainer des Implémenter une syntaxe lisible et naturelle permettant d'enchainer des
traitements sur une valeur. Par exemple, la commande traitements sur une valeur. Par exemple, la commande
evalx cmd1... // cmd2... // cmd3... evalx cmd1 [args1...] // cmd2 [args2...] // cmd3 [args3...]
affiche le résultat de la commande "$(cmd3 $(cmd2 $(cmd1)))" est équivalente à la commande
cmd3 args3 "$(cmd2 args2 "$(cmd1 args1)")"
Retourner le dernier code d'erreur non nul, ou 0 si toutes les commandes se Retourner le dernier code d'erreur non nul, ou 0 si toutes les commandes se
sont exécutées sans erreur. sont exécutées sans erreur.
~~~ ~~~
@ -92,7 +93,7 @@ Implémenter une syntaxe alternative permettant d'enchainer des traitements sur
un flux de données. Par exemple, la commande un flux de données. Par exemple, la commande
evalp cmd1... // cmd2... // cmd3... evalp cmd1... // cmd2... // cmd3...
affiche le résultat de la commande "$(cmd1 | cmd2 | cmd3)" affiche le résultat de la commande "$(cmd1 | cmd2 | cmd3)"
Typiquement, cette fonction permet de faciliter la construction d'un Typiquement, cette fonction permet de faciliter la *construction* d'un
enchainement de commandes par programme, ou de faciliter l'utilisation de la 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 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 cas, il est plus simple et naturel d'écrire les enchainements avec la syntaxe

View File

@ -13,5 +13,9 @@ retourner vrai si $1 est une valeur numérique entière positive
retourner vrai si $1 est une valeur numérique réelle (positive ou négative) retourner vrai si $1 est une valeur numérique réelle (positive ou négative)
le séparateur décimal peut être . ou , le séparateur décimal peut être . ou ,
~~~ ~~~
## `evali`
~~~
Evaluer une expression numérique
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -2,27 +2,27 @@
## `straddp` ## `straddp`
~~~ ~~~
ajouter le préfixe $1 à $2* ajouter le préfixe $1 à $2..*
~~~ ~~~
## `strdelp` ## `strdelp`
~~~ ~~~
enlever le préfixe $1 à $2* enlever le préfixe $1 à $2..*
~~~ ~~~
## `strdelp2` ## `strdelp2`
~~~ ~~~
enlever le préfixe $1 le plus long à $2* enlever le préfixe $1 le plus long à $2..*
~~~ ~~~
## `stradds` ## `stradds`
~~~ ~~~
ajouter le suffixe $1 à $2* ajouter le suffixe $1 à $2..*
~~~ ~~~
## `strdels` ## `strdels`
~~~ ~~~
enlever le suffixe $1 à $2* enlever le suffixe $1 à $2..*
~~~ ~~~
## `strdels2` ## `strdels2`
~~~ ~~~
enlever le suffixe le plus long $1 à $2* enlever le suffixe le plus long $1 à $2..*
~~~ ~~~
## `strlower` ## `strlower`
~~~ ~~~
@ -52,14 +52,14 @@ majuscule
~~~ ~~~
## `strmid` ## `strmid`
~~~ ~~~
Afficher la plage $1 de la valeur $2*. La plage peut être d'une des formes Afficher la plage $1 de la valeur $2..*. La plage peut être d'une des formes
'start', '[start]:length'. Si start est négatif, le compte est effectué à '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 partir de la fin de la chaine. Si length est négatif, il est rajouté à la
longueur de la chaine à partir de start longueur de la chaine à partir de start
~~~ ~~~
## `strrepl` ## `strrepl`
~~~ ~~~
Remplacer dans la valeur $3* le motif $1 par la chaine $2. $1 peut commencer Remplacer dans la valeur $3..* le motif $1 par la chaine $2. $1 peut commencer
par l'un des caractères /, #, % pour indiquer le type de recherche par l'un des caractères /, #, % pour indiquer le type de recherche
~~~ ~~~
## `strops` ## `strops`
@ -122,5 +122,46 @@ Tester si la chaine $1 commence par le wildcard $2
~~~ ~~~
Tester si la chaine $1 se termine par le wildcard $2 Tester si la chaine $1 se termine par le wildcard $2
~~~ ~~~
## `strsplitf`
~~~
Cette fonction doit être appelée avec N arguments (avec N>1). Elle analyse et
découpe l'argument $N comme avec une ligne de commande du shell. Ensuite, elle
appelle la fonction $1 avec les arguments de $2 à ${N-1}, suivi des arguments
obtenus lors de l'analyse de l'argument $N. Par exemple, la commande suivante:
strsplitf cmd arg1 "long arg2" "arg3 'long arg4'"
est équivalente à:
cmd arg1 "long arg2" arg3 "long arg4"
Retourner le code 127 si la fonction à appeler n'est pas spécifiée. Retourner
le code 126 si une erreur s'est produite lors de l'analyse de l'argument $N
~~~
## `strecho`
## `strqvals`
~~~
Afficher chaque argument à part avec des quotes. A chainer avec strsplitf()
~~~
## `strqlines`
~~~
Afficher chaque ligne des fichiers spécifiés comme un argument. A chainer avec
strsplitf()
~~~
## `strqarray`
~~~
Afficher chaque valeur des tableaux $@ comme un argument. A chainer avec
strsplitf()
~~~
## `evals`
~~~
Enchainer des traitements sur des chaines de caractères, comme pour la fonction
evalx(). Il y a cependant quelques différences:
- Seules certains fonctions spécifiques peuvent être utilisées: elles sont
reconnaissables à leur préfixe 'str'. En effet, lors de l'utilisation d'une
commande par evals(), le préfixe 'str' est systématiquement ajouté.
- La fonction strsplitf() est traitée de façon particulière pour lancer une
commande avec le préfixe 'str'
Ainsi, la commande suivante:
evals cmd1 // splitf cmd2
est équivalente à la commande:
strplitf strcmd2 "$(strcmd1)"
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -13,9 +13,9 @@ Retourner 0 si une modification a été faite dans le fichier, 1 sinon
~~~ ~~~
## `conf_enableq` ## `conf_enableq`
~~~ ~~~
Comme conf_enable(), mais s'assure que les valeurs sont quotées dans le Comme conf_enable(), mais s'assure que les valeurs sont quotées si
fichier. Ceci permet de stocker des valeurs avec des espaces ou des nécessaire dans le fichier. Ceci permet de stocker des valeurs avec des
caractères spéciaux. espaces ou des caractères spéciaux.
~~~ ~~~
## `conf_disable` ## `conf_disable`
~~~ ~~~

View File

@ -38,60 +38,6 @@ démarrage
~~~ ~~~
Activer le service $1 pour qu'il se lance automatiquement au démarrage Activer le service $1 pour qu'il se lance automatiquement au démarrage
~~~ ~~~
## `network_parse_confbr`
~~~
network_parse_confbr "$confbr" br ifaces
~~~
## `network_format_confbr`
~~~
network_format_confbr "$br" ifaces --> "br:ifaces"
~~~
## `network_parse_confip`
~~~
network_parse_confip "$confip" iface gateway ipsuffixes
~~~
## `network_parse_ipsuffix`
~~~
network_parse_ipsuffix "$ipsuffix" ip suffix
~~~
## `network_format_confip`
~~~
network_format_confip "$iface" "$gateway" ipsuffixes --> "iface//gateway:ipsuffixes"
~~~
## `network_format_ipsuffix`
~~~
network_format_ipsuffix "$ip" "$suffix" --> "ip/suffix"
~~~
## `network_fix_confbrs`
~~~
normaliser le tableau $1(=confbrs): fusionner les doublons
~~~
## `network_fix_confips`
~~~
normaliser le tableau $1(=confips): fusionner les doublons, spécifier le
suffixe /24 par défaut, etc. $2 est le cas échéant l'interface associée
aux adresses ip non qualifiées
~~~
## `network_fix_mainiface`
~~~
A partir des valeurs des tableaux $1(=confbrs) et $2(=confips), et de
l'interface principale $3, déterminer l'interface principale. Si $3 est
spécifié, c'est la valeur sélectionnée. Sinon, si un bridge existe, c'est
le premier bridge qui est sélectionné. Sinon, la première interface est
sélectionnée. Sinon, on prend eth0.
Ensuite, réorganiser les tableaux de façon que confips[0] devienne la
configuration ip de l'interface principale.
~~~
## `network_fix_confs`
## `network_set_confbrs`
~~~
initialiser $1(=confbrs) avec l'état des bridges sur le système courant
~~~
## `network_set_confips`
~~~
initialiser le tableau $1(=confips) avec l'état des interfaces sur le
système courant
~~~
## `network_interfaces_check_confbr` ## `network_interfaces_check_confbr`
~~~ ~~~
Vérifier que la configuration du bridge $1, dont les membres sont les Vérifier que la configuration du bridge $1, dont les membres sont les
@ -135,9 +81,6 @@ $3(=confips)
~~~ ~~~
## `network_fix_hostname` ## `network_fix_hostname`
## `network_fix_mailname` ## `network_fix_mailname`
## `network_fix_exim4`
## `network_fix_postfix`
## `network_fix_hosts`
## `network_config` ## `network_config`
~~~ ~~~
(Re)configurer le réseau sur l'hôte courant. Des efforts sont faits pour (Re)configurer le réseau sur l'hôte courant. Des efforts sont faits pour

View File

@ -73,5 +73,62 @@ Si $1 *semble* déjà être un nom d'hôte pleinement qualifié, l'afficher tel
quel. Sinon utiliser ipcalc_fqdn() pour afficher le nom d'hôte pleinement quel. Sinon utiliser ipcalc_fqdn() pour afficher le nom d'hôte pleinement
qualifié correspondant. qualifié correspondant.
~~~ ~~~
## `network_parse_confbr`
~~~
network_parse_confbr "$confbr" br ifaces
~~~
## `network_format_confbr`
~~~
network_format_confbr "$br" ifaces --> "br:ifaces"
~~~
## `network_parse_confip`
~~~
network_parse_confip "$confip" iface gateway ipsuffixes
~~~
## `network_parse_ipsuffix`
~~~
network_parse_ipsuffix "$ipsuffix" ip suffix
~~~
## `network_format_confip`
~~~
network_format_confip "$iface" "$gateway" ipsuffixes --> "iface//gateway:ipsuffixes"
~~~
## `network_format_ipsuffix`
~~~
network_format_ipsuffix "$ip" "$suffix" --> "ip/suffix"
~~~
## `network_fix_confbrs`
~~~
normaliser le tableau $1(=confbrs): fusionner les doublons
~~~
## `network_fix_confips`
~~~
normaliser le tableau $1(=confips): fusionner les doublons, spécifier le
suffixe /24 par défaut, etc. $2 est le cas échéant l'interface associée
aux adresses ip non qualifiées
~~~
## `network_fix_mainiface`
~~~
A partir des valeurs des tableaux $1(=confbrs) et $2(=confips), et de
l'interface principale $3, déterminer l'interface principale. Si $3 est
spécifié, c'est la valeur sélectionnée. Sinon, si un bridge existe, c'est
le premier bridge qui est sélectionné. Sinon, la première interface est
sélectionnée. Sinon, on prend eth0.
Ensuite, réorganiser les tableaux de façon que confips[0] devienne la
configuration ip de l'interface principale.
~~~
## `network_fix_confs`
## `network_set_confbrs`
~~~
initialiser $1(=confbrs) avec l'état des bridges sur le système courant
~~~
## `network_set_confips`
~~~
initialiser le tableau $1(=confips) avec l'état des interfaces sur le
système courant
~~~
## `network_fix_exim4`
## `network_fix_postfix`
## `network_fix_hosts`
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -32,9 +32,6 @@ démarrage
~~~ ~~~
Activer le service $1 pour qu'il se lance automatiquement au démarrage Activer le service $1 pour qu'il se lance automatiquement au démarrage
~~~ ~~~
## `create_bridge` ## `network_fix_hostname`
~~~
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 -*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -11,6 +11,11 @@ et $3(=SYSVER) en fonction des valeurs des autres. Cette fonction est à
utiliser quand on récupère cette information de la part de l'utilisateur, utiliser quand on récupère cette information de la part de l'utilisateur,
et qu'il faut compléter et qu'il faut compléter
~~~ ~~~
## `dump_sysinfos`
~~~
Afficher les valeurs de SYSNAME, SYSDIST, SYSVER qui décrivent le système
actuel
~~~
## `get_sysinfos_desc` ## `get_sysinfos_desc`
~~~ ~~~
Afficher une chaine de la forme SYSNAME/SYSDIST/SYSVER qui décrit le Afficher une chaine de la forme SYSNAME/SYSDIST/SYSVER qui décrit le
@ -46,6 +51,16 @@ cela n'a actuellement de sens qu'avec les version de MacOS X. Il faut
aussi impérativement filtrer sur le système, e.g: aussi impérativement filtrer sur le système, e.g:
check_sysinfos -s macosx -d 10.5+ check_sysinfos -s macosx -d 10.5+
~~~ ~~~
## `unsupported_system`
~~~
Afficher un message d'erreur indiquant que le système actuel n'est pas
supporté, et quitter le script
~~~
## `require_sysinfos`
~~~
Vérifier le système actuel avec check_sysinfos(), et afficher un message
d'erreur avec unsupported_system() s'il ne correspond pas à la requête
~~~
## `on_debian` ## `on_debian`
~~~ ~~~
Tester si on est sur debian. charger le module debian si c'est le cas. Tester si on est sur debian. charger le module debian si c'est le cas.

View File

@ -224,7 +224,7 @@ found_element && $0 ~ /<\/element/ {
local instance notfirst= local instance notfirst=
for instance in "$@"; do for instance in "$@"; do
script="$script${notfirst:+|| }name == \"$(quote_awk "$instance")\"" script="$script${notfirst:+|| }name == $(qawk "$instance")"
notfirst=1 notfirst=1
done done
script="$script"') { script="$script"') {
@ -304,7 +304,7 @@ found_element && $0 ~ /<\/element/ {
local instance notfirst= local instance notfirst=
for instance in "$@"; do for instance in "$@"; do
script="$script${notfirst:+|| }name == \"$(quote_awk "$instance")\"" script="$script${notfirst:+|| }name == $(qawk "$instance")"
notfirst=1 notfirst=1
done done
script="$script"') { script="$script"') {

4
lib/default/deploy Normal file
View File

@ -0,0 +1,4 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
# Emplacement où se trouve le dépôt source pour deploy
#DEPLOY_SRCDIR=~/wop/deploy

View File

@ -19,7 +19,42 @@ OPTIONS
-f, --overwrite -f, --overwrite
Ecraser le fichier s'il existe déjà Ecraser le fichier s'il existe déjà
-E, --encoding ENCODING -E, --encoding ENCODING
Spécifier l'encoding à utiliser pour la génération du fichier" Spécifier l'encoding à utiliser pour la génération du fichier
--doctype DOCTYPE
-4, --html4
-5, --html5
Spécifier le type de document. Les options -4 et -5 sont équivalentes à
--doctype html4 et --doctype html5, respectivement.
-b, --baseurl BASEURL
Spécifier le chemin à partir de la racine qui contient les resources
blueprint et bootstrap
-B, --bspath, --bppath CLPATH
Spécifier le chemin sous BASEURL à partir duquel charger bootstrap ou
blueprint. La valeur par défaut est 'bootstrap' pour l'option --bs,
'blueprint' pour l'option --bp
-s, --bs, --bootstrap
Activer le support de bootstrap. L'option --bs est automatiquement
activée si l'option --bspath n'est pas utilisée et le répertoire
[BASEURL/]bootstrap/ existe
-p, --bp, --blueprint
Activer le support de blueprint. L'option --bp est automatiquement
activée si l'option --bppath n'est pas utilisée et le répertoire
[BASEURL/]blueprint/ existe
-n, --nobs, --no-bootstrap, --nobp, --no-blueprint
Désactiver le support de bootstrap et blueprint
-j, --jquery
-k, --no-jquery
Activer (resp. désactiver) le chargement de jQuery à partir de BASEURL
pour les pages nues et avec blueprint. Avec bootstrap, le chargement de
jQuery est toujours effectué et cette option est ignorée.
--hl, --titlehl TITLEHL
Spécifier le tag à utiliser pour le titre. Vaut par défaut 'h1' pour les
templates HTML et PHP, 'h2' pour les templates overview et package
-T, --title TITLE
Spécifier le titre du document.
--head-title HTITLE
Spécifier le titre pour le tag <title> dans la section <head>. La valeur
par défaut est celle de l'option --title."
} }
NAME=www NAME=www
@ -74,28 +109,114 @@ function __generate_html() {
local dir="$(dirname "$file")" local dir="$(dirname "$file")"
local nobpsuppl nobplocal nobpmobile local nobpsuppl nobplocal nobpmobile
if [ "$blueprint" == auto ]; then if [ "$csslib" == auto ]; then
if [ -d "$dir/blueprint" ]; then if [ -n "$clpath" ]; then
blueprint=1 if [ "$clpath" == bootstrap -o -z "${clpath##*/bootstrap}" ]; then
[ -f "$dir/bpsuppl.css" ] || nobpsuppl=1 csslib=bootstrap
[ -f "$dir/bplocal.css" ] || nobplocal=1 elif [ "$clpath" == blueprint -o -z "${clpath##*/blueprint}" ]; then
[ -f "$dir/bpmobile.css" ] || nobpmobile=1 csslib=blueprint
else else
blueprint= csslib=
fi
elif [ -d "$dir/${baseurl#/}bootstrap" ]; then
csslib=bootstrap
elif [ -d "$dir/${baseurl#/}blueprint" ]; then
csslib=blueprint
else
csslib=
fi fi
fi fi
if [ "$csslib" == bootstrap ]; then
[ -n "$clpath" ] || clpath=bootstrap
elif [ "$csslib" == blueprint ]; then
[ -n "$clpath" ] || clpath=blueprint
[ -f "$dir/${baseurl#/}bpsuppl.css" ] || nobpsuppl=1
[ -f "$dir/${baseurl#/}bplocal.css" ] || nobplocal=1
[ -f "$dir/${baseurl#/}bpmobile.css" ] || nobpmobile=1
fi
clpath="$baseurl$clpath"
[ "${clpath:$((-1)):1}" == / ] || clpath="$clpath/"
local jquerymin local jquerymin
if [ "$jquery" == auto ]; then if [ "$jquery" == auto ]; then
if [ -f "$dir/jquery.min.js" ]; then if [ "$csslib" == bootstrap ]; then
jquery=
elif [ -f "$dir/${baseurl#/}jquery.min.js" ]; then
jquery=1 jquery=1
jquerymin=1 jquerymin=1
elif [ -d "$dir/jquery.js" ]; then elif [ -f "$dir/${baseurl#/}jquery.js" ]; then
jquery=1 jquery=1
else else
jquery= jquery=
fi fi
fi fi
if [ "$doctype" == auto ]; then
if [ "$csslib" == bootstrap ]; then
doctype=html5
else
doctype=html4
fi
fi
head='<head>'
if [ "$doctype" == html5 ]; then
head="$head
"'<meta charset="'"$encoding"'" />'
else
head="$head
"'<meta http-equiv="Content-Type" content="text/html; charset='"$encoding"'" />'
fi
if [ "$csslib" == bootstrap ]; then
head="$head
"'<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="shortcut" href="'"$clpath"'favicon.ico" />
<link rel="icon apple-touch-icon" href="'"$clpath"'icon.png" />'
csslib='<link href="'"$clpath"'bootstrap/css/bootstrap.min.css" rel="stylesheet"/>
<script src="'"$clpath"'jquery.min.js" type="text/javascript"></script>
<script src="'"$clpath"'bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
<!--[if lt IE 9]>
<script src="'"$clpath"'html5shiv/html5shiv.js"></script>
<script src="'"$clpath"'respond/respond.min.js"></script>
<![endif]-->'
startcl='<div class="container">'
endcl='</div>'
elif [ "$csslib" == blueprint ]; then
head="$head
"'<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="shortcut" href="'"$baseurl"'favicon.ico" />
<link rel="icon apple-touch-icon" href="'"$baseurl"'icon.png" />'
csslib='<link rel="stylesheet" href="'"$clpath"'screen.css" type="text/css" media="screen, projection" />
<link rel="stylesheet" href="'"$clpath"'print.css" type="text/css" media="print" />
<!--[if lt IE 8]>
<link rel="stylesheet" href="'"$clpath"'ie.css" type="text/css" media="screen, projection" />
<![endif]-->
<'"${nobpsuppl:+!--}"'link rel="stylesheet" href="'"$baseurl"'bpsuppl.css" type="text/css" media="screen, projection" /'"${nobpsuppl:+--}"'>
<'"${nobplocal:+!--}"'link rel="stylesheet" href="'"$baseurl"'bplocal.css" type="text/css" media="screen, projection" /'"${nobplocal:+--}"'>
<'"${nobpmobile:+!--}"'link rel="stylesheet" href="'"$baseurl"'bpmobile.css" type="text/css" media="handheld, only screen and (max-device-width: 480px)" /'"${nobpmobile:+--}"'>'
startcl='<div class="container">'
endcl='</div>'
else
# pas de csslib ou csslib non supporté
head="$head
"'<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="shortcut" href="'"$baseurl"'favicon.ico" />
<link rel="icon apple-touch-icon" href="'"$baseurl"'icon.png" />'
csslib=
startcl=
endcl=
fi
if [ -n "$jquery" ]; then
jquery='<script src="'"${baseurl}jquery${jquerymin:+.min}.js"'"></script>'
fi
start='<title>'"$head_title"'</title>
</head>
<body>'
end='</body>
</html>'
case "$doctype" in case "$doctype" in
html4) html4)
doctype='<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">' doctype='<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">'
@ -110,27 +231,6 @@ function __generate_html() {
html='<html>' html='<html>'
;; ;;
esac esac
head='<head>
<meta http-equiv="Content-Type" content="text/html; charset='"$encoding"'" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="shortcut" href="'"$baseurl"'favicon.ico" />
<link rel="icon apple-touch-icon" href="'"$baseurl"'icon.png" />'
[ -n "$blueprint" ] && blueprint='<link rel="stylesheet" href="'"$bpurl"'screen.css" type="text/css" media="screen, projection" />
<link rel="stylesheet" href="'"$bpurl"'print.css" type="text/css" media="print" />
<!--[if lt IE 8]>
<link rel="stylesheet" href="'"$bpurl"'ie.css" type="text/css" media="screen, projection" />
<![endif]-->
<'"${nobpsuppl:+!--}"'link rel="stylesheet" href="bpsuppl.css" type="text/css" media="screen, projection" /'"${nobpsuppl:+--}"'>
<'"${nobplocal:+!--}"'link rel="stylesheet" href="bplocal.css" type="text/css" media="screen, projection" /'"${nobplocal:+--}"'>
<'"${nobpmobile:+!--}"'link rel="stylesheet" href="bpmobile.css" type="text/css" media="handheld, only screen and (max-device-width: 480px)" /'"${nobpmobile:+--}"'>'
[ -n "$jquery" ] && jquery='<script src="'"${baseurl}jquery${jquerymin:+.min}.js"'"></script>'
start='<title>'"$head_title"'</title>
</head>
<body>'
startbp='<div class="container">'
endbp='</div>'
end='</body>
</html>'
} }
function __before_write_html() { function __before_write_html() {
doctype="$doctype<!-- -*- coding: $encoding ${mode:+mode: $mode }-*- vim:sw=4:sts=4:et:ai:si:sta:fenc=$encoding doctype="$doctype<!-- -*- coding: $encoding ${mode:+mode: $mode }-*- vim:sw=4:sts=4:et:ai:si:sta:fenc=$encoding
@ -142,12 +242,12 @@ function __write_html() {
estep "$(ppath "$file")" estep "$(ppath "$file")"
echo >"$file" "$doctype$html echo >"$file" "$doctype$html
$head $head
${blueprint:+$blueprint ${csslib:+$csslib
}${jquery:+$jquery }${jquery:+$jquery
}$start }$start
${blueprint:+$startbp ${csslib:+$startcl
}${title:+<$titlehl>$title</$titlehl> }${title:+<$titlehl>$title</$titlehl>
}${blueprint:+$endbp }${csslib:+$endcl
}$end" }$end"
} }
@ -160,9 +260,9 @@ function generate_html() {
__update_title __update_title
local doctype="$doctype" local doctype="$doctype"
local blueprint="$blueprint" local csslib="$csslib"
local jquery="$jquery" local jquery="$jquery"
local html head start startbp endbp end local html head start startcl endcl end
__generate_html __generate_html
__before_write_html __before_write_html
__write_html __write_html
@ -184,9 +284,7 @@ function generate_javadoc_package() {
title="Package: $title" title="Package: $title"
local doctype="$doctype" local doctype="$doctype"
local blueprint= local csslib bootstrap jquery html head start startcl endcl end
local jquery=
local html head start startbp endbp end
__generate_html __generate_html
__before_write_html __before_write_html
__write_html __write_html
@ -208,9 +306,7 @@ function generate_javadoc_overview() {
title="Projet: $title" title="Projet: $title"
local doctype="$doctype" local doctype="$doctype"
local blueprint= local csslib bootstrap jquery html head start startcl endcl end
local jquery=
local html head start startbp endbp end
__generate_html __generate_html
__before_write_html __before_write_html
__write_html __write_html
@ -228,9 +324,9 @@ function generate_php() {
__update_title __update_title
local doctype="$doctype" local doctype="$doctype"
local blueprint="$blueprint" local csslib="$csslib"
local jquery="$jquery" local jquery="$jquery"
local html head start startbp endbp end local html head start startcl endcl end
__generate_html __generate_html
doctype="<?php # -*- coding: $encoding ${mode:+mode: $mode }-*- vim:sw=2:sts=2:et:ai:si:sta:fenc=$encoding doctype="<?php # -*- coding: $encoding ${mode:+mode: $mode }-*- vim:sw=2:sts=2:et:ai:si:sta:fenc=$encoding
?>${doctype:+$doctype ?>${doctype:+$doctype
@ -283,12 +379,11 @@ template=
edit=1 edit=1
overwrite= overwrite=
encoding= encoding=
#executable= doctype=auto
baseurl=/ baseurl=/
doctype=html4 clpath=
blueprint=auto csslib=auto
jquery=auto jquery=auto
bpurl=
titlehl= titlehl=
title= title=
head_title= head_title=
@ -302,24 +397,20 @@ parse_opts "${PRETTYOPTS[@]}" \
--doctype: doctype= \ --doctype: doctype= \
-4,--html4 doctype=html4 \ -4,--html4 doctype=html4 \
-5,--html5 doctype=html5 \ -5,--html5 doctype=html5 \
-U:,--baseurl: baseurl= \ -b:,--baseurl: baseurl= \
-b,--blueprint,--bp blueprint=1 \ -B:,--bspath:,--bppath: clpath= \
-n,--no-blueprint,--noblueprint,--nobp blueprint= \ -s,--bootstrap,--bs csslib=bootstrap \
-p,--blueprint,--bp csslib=blueprint \
-n,--no-bootstrap,--nobootstrap,--nobs,--no-blueprint,--noblueprint,--nobp csslib= \
-j,--jquery jquery=1 \ -j,--jquery jquery=1 \
-k,--no-jquery,--nojquery jquery= \ -k,--no-jquery,--nojquery jquery= \
-B:,--bpurl: bpurl= \
--titlehl:,--hl: titlehl= \ --titlehl:,--hl: titlehl= \
-T:,--title: title= \ -T:,--title: title= \
--head-title: head_title= \ --head-title: head_title= \
@ args -- "$@" && set -- "${args[@]}" || die "$args" @ args -- "$@" && set -- "${args[@]}" || die "$args"
# à rajouter ci-dessus si les fichiers peuvent être exécutables:
#-x,--executable executable=1 \
#-n,--no-executable executable= \
[ -n "$encoding" ] || encoding=utf-8 [ -n "$encoding" ] || encoding=utf-8
[ -z "$baseurl" -o "${baseurl:$((-1)):1}" == / ] || baseurl="$baseurl/" [ -z "$baseurl" -o "${baseurl:$((-1)):1}" == / ] || baseurl="$baseurl/"
[ -n "$bpurl" ] || bpurl="${baseurl}blueprint/"
[ "${bpurl:$((-1)):1}" == / ] || bpurl="$bpurl/"
files2edit=() files2edit=()
r=0 r=0

View File

@ -63,8 +63,8 @@ fi
# identification du système # identification du système
echo "##@before *" >lib/profile.d/0nutools echo "##@before *" >lib/profile.d/0nutools
set_var_cmd UNAME_SYSTEM "$UNAME_SYSTEM" >>lib/profile.d/0nutools echo_setv UNAME_SYSTEM "$UNAME_SYSTEM" >>lib/profile.d/0nutools
set_var_cmd UNAME_MACHINE "$UNAME_MACHINE" >>lib/profile.d/0nutools echo_setv UNAME_MACHINE "$UNAME_MACHINE" >>lib/profile.d/0nutools
# installer les profils # installer les profils
destdir="@@dest@@" destdir="@@dest@@"

View File

@ -1 +1 @@
014001000 014002000

View File

@ -8,8 +8,8 @@ uprovide apache.tools
urequire base sysinfos template apache urequire base sysinfos template apache
function __apache_rc_destdir() { function __apache_rc_destdir() {
[ -z "$3" ] && set_var "${1:-certsdir}" "$(get_APACHESSLCERTSDIR_prefix)" [ -z "$3" ] && setv "${1:-certsdir}" "$(get_APACHESSLCERTSDIR_prefix)"
[ -z "$4" ] && set_var "${2:-keysdir}" "$(get_APACHESSLKEYSDIR_prefix)" [ -z "$4" ] && setv "${2:-keysdir}" "$(get_APACHESSLKEYSDIR_prefix)"
} }
function __apache_rc_loadconf() { function __apache_rc_loadconf() {
@ -134,9 +134,9 @@ function apache_resolvecert() {
__apache_rc_loadconf __apache_rc_loadconf
__apache_rc_resolveprefix "$__certsdir" "$__keysdir" __apache_rc_resolveprefix "$__certsdir" "$__keysdir"
__apache_rc_checkvars "$__certsdir" "$__keysdir" || return 1 __apache_rc_checkvars "$__certsdir" "$__keysdir" || return 1
set_var "${3:-cert}" "$__rc_cert" setv "${3:-cert}" "$__rc_cert"
set_var "${4:-key}" "$__rc_key" setv "${4:-key}" "$__rc_key"
set_var "${5:-ca}" "$__rc_ca" setv "${5:-ca}" "$__rc_ca"
} }
function apache_addcert() { function apache_addcert() {

View File

@ -40,101 +40,12 @@ fi
##@include base.args ##@include base.args
##@include base.tools ##@include base.tools
##@include base.compat ##@include base.compat
##@include base.deprecated
uprovide base uprovide base
urequire base.init base.core base.string base.num base.bool base.array base.quote base.split base.args base.tools base.compat urequire base.init base.core base.string base.num base.bool base.array base.quote base.split base.args base.tools base.compat
urequire base.deprecated
## Informations sur l'hôte sur lequel tourne ce script
# Type de système
UNAME_SYSTEM=`uname -s`
[ "${UNAME_SYSTEM#CYGWIN}" != "$UNAME_SYSTEM" ] && UNAME_SYSTEM=Cygwin
[ "${UNAME_SYSTEM#MINGW32}" != "$UNAME_SYSTEM" ] && UNAME_SYSTEM=Mingw
UNAME_MACHINE=`uname -m`
if [ -n "$UTOOLS_CHROOT" ]; then
# Dans un chroot, il est possible de forcer les valeurs
[ -n "$UTOOLS_UNAME_SYSTEM" ] && eval "UNAME_SYSTEM=$UTOOLS_UNAME_SYSTEM"
[ -n "$UTOOLS_UNAME_MACHINE" ] && eval "UNAME_MACHINE=$UTOOLS_UNAME_MACHINE"
fi
## valeurs
function setyesval() {
# mettre la valeur normalisée de la valeur "oui" de $2 dans la variable $1
is_yes "$2" && set_var "$1" 1 || set_var "$1" ""
}
function normyesval() {
# remplacer la valeur de la variable $1 par la valeur normalisée de sa valeur "oui"
# Si $2 est non vide, prendre cette valeur plutôt que la valeur de la variable $1
is_yes "${2:-"${!1}"}" && set_var "$1" 1 || set_var "$1" ""
}
function normyesvals() {
# remplacer les valeur des variables $1..* par les valeurs normalisées
# respectives de leur valeur "oui"
local __nyv_yesvar
for __nyv_yesvar in "$@"; do
is_yes "${!__nyv_yesvar}" && set_var "$__nyv_yesvar" 1 || set_var "$__nyv_yesvar" ""
done
}
function quote_in() {
# Comme quote_arg pour une chaine lue sur stdin
sed 's/\\/\\\\/g
s/"/\\"/g
s/\$/\\$/g
s/`/\\`/g'
}
function quote_sin() {
# Pour la chaine lue sur stdin, remplacer ' par '\''. Cela permet de protéger une
# chaine à mettre entre quotes
sed "s/'/'\\\\''/g"
}
function quote_sarg() {
# Dans la chaine $1, remplacer ' par '\''. Cette fonction utilise quote_sin,
# puisque le shell a des difficultés à faire le rechercher/remplacer approprié
quote_sin <<<"$1"
}
function quoted_sarg() {
# Dans la chaine $1, remplacer ' par '\'', et afficher la chaine entourée de
# quotes
echo "'$(quote_sarg "$1")'"
}
function quoted_sargs() {
# Comme quoted_sarg, mais tous les arguments sont quotés et affichés entourés de
# quotes, ce qui permet de construire des arguments d'une ligne de commande
local a s
for a in "$@"; do
s="${s:+$s }$(quoted_sarg "$a")"
done
rawecho "$s"
}
## variables tableaux ## variables tableaux
function set_array_cmd() {
# Afficher la commande permettant d'initialiser le tableau $1 avec les valeurs:
# soit du tableau $2, soit de $3..$n si $2=="@"
# S'il n'y a que l'argument $1, alors afficher la commande permettant de
# recréer le tableau $1
[ $# -eq 1 ] && set -- "$1" "$1"
local __sac_s __sac_v __sac_f
__sac_s="$1=("; shift
if [ "$1" == "@" ]; then
shift
else
eval "set -- \"\${$1[@]}\""
fi
__sac_f=1
for __sac_v in "$@"; do
[ -n "$__sac_f" ] && __sac_f= || __sac_s="$__sac_s "
__sac_s="$__sac_s$(quoted_arg "$__sac_v")"
done
__sac_s="$__sac_s)"
echo "$__sac_s"
}
function set_array() {
# Soit $1 un tableau à créer. Si $2=="@", créer le tableau $1 avec les valeurs
# $3..$n. Sinon, créer le tableau $1 avec les valeurs du tableau $2.
# Cette fonction n'existe que comme un pendant de set_var(), mais le véritable
# intérêt est la fonction set_array_cmd(). cf array_copy() pour une version plus
# efficace de la copie de tableaux
eval "$(set_array_cmd "$@")"
}
function array_count() { function array_count() {
# retourner le nombre d'éléments du tableau $1 # retourner le nombre d'éléments du tableau $1
eval "echo \${#$1[*]}" eval "echo \${#$1[*]}"
@ -151,20 +62,20 @@ function array_add() {
# ajouter les valeurs $2..@ au tableau dont le nom est $1 # ajouter les valeurs $2..@ au tableau dont le nom est $1
local __aa_a="$1"; shift local __aa_a="$1"; shift
eval "$__aa_a=(\"\${$__aa_a[@]}\" \"\$@\")" eval "$__aa_a=(\"\${$__aa_a[@]}\" \"\$@\")"
#eval "$1=(\"\${$1[@]}\" \"$(quote_arg "$2")\")" #eval "$1=(\"\${$1[@]}\" $(qval "$2"))"
} }
function array_ins() { function array_ins() {
# insérer les valeurs $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
local __aa_a="$1"; shift local __aa_a="$1"; shift
eval "$__aa_a=(\"\$@\" \"\${$__aa_a[@]}\")" eval "$__aa_a=(\"\$@\" \"\${$__aa_a[@]}\")"
#eval "$1=(\"$(quote_arg "$2")\" \"\${$1[@]}\")" #eval "$1=($(qval "$2") \"\${$1[@]}\")"
} }
function array_del() { function array_del() {
# supprimer *les* valeurs $2 du tableau dont le nom est $1 # supprimer *les* valeurs $2 du tableau dont le nom est $1
local __ad_v local __ad_v
local -a __ad_vs local -a __ad_vs
eval 'for __ad_v in "${'"$1"'[@]}"; do eval 'for __ad_v in "${'"$1"'[@]}"; do
if [ "$__ad_v" != '"$(quoted_arg "$2")"' ]; then if [ "$__ad_v" != '"$(qval "$2")"' ]; then
array_add __ad_vs "$__ad_v" array_add __ad_vs "$__ad_v"
fi fi
done' done'
@ -175,7 +86,7 @@ function array_addu() {
# déjà. Retourner vrai si la valeur a été ajoutée # déjà. Retourner vrai si la valeur a été ajoutée
local __as_v local __as_v
eval 'for __as_v in "${'"$1"'[@]}"; do eval 'for __as_v in "${'"$1"'[@]}"; do
if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then if [ "$__as_v" == '"$(qval "$2")"' ]; then
return 1 return 1
fi fi
done' done'
@ -190,7 +101,7 @@ function array_insu() {
# valeur n'y est pas déjà. Retourner vrai si la valeur a été ajoutée. # valeur n'y est pas déjà. Retourner vrai si la valeur a été ajoutée.
local __as_v local __as_v
eval 'for __as_v in "${'"$1"'[@]}"; do eval 'for __as_v in "${'"$1"'[@]}"; do
if [ "$__as_v" == '"$(quoted_arg "$2")"' ]; then if [ "$__as_v" == '"$(qval "$2")"' ]; then
return 1 return 1
fi fi
done' done'
@ -224,7 +135,7 @@ function array_contains() {
# tester si le tableau dont le nom est $1 contient la valeur $2 # tester si le tableau dont le nom est $1 contient la valeur $2
local __ac_v local __ac_v
eval 'for __ac_v in "${'"$1"'[@]}"; do eval 'for __ac_v in "${'"$1"'[@]}"; do
if [ "$__ac_v" == '"$(quoted_arg "$2")"' ]; then if [ "$__ac_v" == '"$(qvalm "$2")"' ]; then
return 0 return 0
fi fi
done' done'
@ -235,7 +146,7 @@ function array_icontains() {
# compte de la casse # compte de la casse
local __ac_v local __ac_v
eval 'for __ac_v in "${'"$1"'[@]}"; do eval 'for __ac_v in "${'"$1"'[@]}"; do
if [ "$(strlower "$__ac_v")" == '"$(strlower "$(quoted_arg "$2")")"' ]; then if [ "$(strlower "$__ac_v")" == '"$(strlower "$(qval "$2")")"' ]; then
return 0 return 0
fi fi
done' done'
@ -247,7 +158,7 @@ function array_find() {
local __af_i __af_v local __af_i __af_v
__af_i=0 __af_i=0
eval 'for __af_v in "${'"$1"'[@]}"; do eval 'for __af_v in "${'"$1"'[@]}"; do
if [ "$__af_v" == '"$(quoted_arg "$2")"' ]; then if [ "$__af_v" == '"$(qval "$2")"' ]; then
if [ -n "$3" ]; then if [ -n "$3" ]; then
echo "${'"$3"'[$__af_i]}" echo "${'"$3"'[$__af_i]}"
else else
@ -313,11 +224,11 @@ function array_map() {
} }
function first_value() { function first_value() {
# retourner la première valeur du tableau $1 # retourner la première valeur du tableau $1
eval "rawecho \"\${$1[@]:0:1}\"" eval "recho \"\${$1[@]:0:1}\""
} }
function last_value() { function last_value() {
# retourner la dernière valeur du tableau $1 # retourner la dernière valeur du tableau $1
eval "rawecho \"\${$1[@]:\$((-1)):1}\"" eval "recho \"\${$1[@]:\$((-1)):1}\""
} }
function array_copy() { function array_copy() {
# copier le contenu du tableau $2 dans le tableau $1 # copier le contenu du tableau $2 dans le tableau $1
@ -418,9 +329,9 @@ function array_join() {
__aj_j="${__aj_j:+$__aj_j'"$__aj_s"'}$__aj_pf$__aj_l$__aj_sf" __aj_j="${__aj_j:+$__aj_j'"$__aj_s"'}$__aj_pf$__aj_l$__aj_sf"
done' done'
if [ -n "$__aj_j" ]; then if [ -n "$__aj_j" ]; then
rawecho "$__aj_j" recho "$__aj_j"
elif [ "$__aj_an" != "\$@" -a -n "$3" ]; then elif [ "$__aj_an" != "\$@" -a -n "$3" ]; then
rawecho "$3" recho "$3"
fi fi
} }
function array_mapjoin() { function array_mapjoin() {
@ -482,26 +393,21 @@ function parse_date() {
local value="$1" type="${2:-date}" local value="$1" type="${2:-date}"
local now="$(awk 'BEGIN { print mktime(strftime("%Y %m %d 00 00 00 +0400")) }')" local now="$(awk 'BEGIN { print mktime(strftime("%Y %m %d 00 00 00 +0400")) }')"
case "$value" in case "$value" in
+*) +*) value="$(($now + ${value#+} * 86400))";;
value="$(($now + ${value#+} * 86400))" *) value="$(<<<"$value" awk -F/ '{
;;
*)
value="$(<<<"$value" awk -F/ '{
nd = strftime("%d"); nm = strftime("%m"); ny = strftime("%Y") nd = strftime("%d"); nm = strftime("%m"); ny = strftime("%Y")
d = $1 + 0; if (d < 1) d = nd; d = $1 + 0; if (d < 1) d = nd;
m = $2 + 0; if (m < 1) m = nm; m = $2 + 0; if (m < 1) m = nm;
if ($3 == "") y = ny; if ($3 == "") y = ny;
else { y = $3 + 0; if (y < 100) y = y + 2000; } else { y = $3 + 0; if (y < 100) y = y + 2000; }
print mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d)); print mktime(sprintf("%04i %02i %02i 00 00 00 +0400", y, m, d));
}')" }')";;
esac esac
case "$type" in case "$type" in
d|date) awk '{ print strftime("%d/%m/%Y", $0 + 0) }' <<<"$value";; d|date) awk '{ print strftime("%d/%m/%Y", $0 + 0) }' <<<"$value";;
l|ldap) awk '{ print strftime("%Y%m%d%H%M%S+0400", $0 + 0) }' <<<"$value";; l|ldap) awk '{ print strftime("%Y%m%d%H%M%S+0400", $0 + 0) }' <<<"$value";;
m|mysql) awk '{ print strftime("%Y-%m-%d", $0 + 0) }' <<<"$value";; m|mysql) awk '{ print strftime("%Y-%m-%d", $0 + 0) }' <<<"$value";;
*) *) recho "$value";;
rawecho "$value"
;;
esac esac
} }
@ -563,7 +469,7 @@ function normpath() {
ap="$ap$part" ap="$ap$part"
fi fi
done done
rawecho "$ap" recho "$ap"
} }
function abspath() { function abspath() {
# Retourner un chemin absolu vers $1. Si $2 est non nul et si $1 est un chemin # Retourner un chemin absolu vers $1. Si $2 est non nul et si $1 est un chemin
@ -640,7 +546,7 @@ function ppath() {
[ "$cwd" != "/" -a "$cwd" != "$HOME" ] && path="${path#$cwd/}" [ "$cwd" != "/" -a "$cwd" != "$HOME" ] && path="${path#$cwd/}"
[ "${path#$HOME/}" != "$path" ] && path="~${path#$HOME}" [ "${path#$HOME/}" != "$path" ] && path="~${path#$HOME}"
rawecho "$path" recho "$path"
} }
function relpath() { function relpath() {
# Afficher le chemin relatif de $1 par rapport à $2. Si $2 n'est pas spécifié, # Afficher le chemin relatif de $1 par rapport à $2. Si $2 n'est pas spécifié,
@ -656,7 +562,7 @@ function relpath() {
if [ "$p" == "$cwd" ]; then if [ "$p" == "$cwd" ]; then
echo "" echo ""
elif [ "${p#$cwd/}" != "$p" ]; then elif [ "${p#$cwd/}" != "$p" ]; then
rawecho "${p#$cwd/}" recho "${p#$cwd/}"
else else
local rp local rp
while [ -n "$cwd" -a "${p#$cwd/}" == "$p" ]; do while [ -n "$cwd" -a "${p#$cwd/}" == "$p" ]; do
@ -752,8 +658,8 @@ function splitwcs() {
fi fi
done done
[ "${__sw_p#/}" != "$__sw_p" ] && __sw_d="/$__sw_d" [ "${__sw_p#/}" != "$__sw_p" ] && __sw_d="/$__sw_d"
set_var "$__sw_dd" "$__sw_d" _setv "$__sw_dd" "$__sw_d"
set_var "$__sw_df" "$__sw_f" _setv "$__sw_df" "$__sw_f"
} }
function deref() { function deref() {
# Retourner un chemin absolu vers le fichier $1, dans lequel toutes les # Retourner un chemin absolu vers le fichier $1, dans lequel toutes les
@ -824,9 +730,9 @@ function path_if_test() {
local basedir="$1" local basedir="$1"
if [ $op "$basedir/$file" ]; then if [ $op "$basedir/$file" ]; then
if [ -n "$rel" ]; then if [ -n "$rel" ]; then
rawecho "$reldir$file" recho "$reldir$file"
else else
rawecho "$basedir/$file" recho "$basedir/$file"
fi fi
break break
fi fi
@ -990,15 +896,17 @@ function testdiff() {
! quietdiff "$@" ! quietdiff "$@"
} }
function testupdated() { function testupdated() {
# test si $2 n'existe pas ou si $1 est différent de $2 # tester si $2 n'existe pas ou si $1 est différent de $2. Si $3 est non vide,
if [ -f "$2" ]; then # la valeur de retour est fixée à 0 (forcer à considérer le test comme vrai)
testdiff "$1" "$2" if [ -n "$3" ]; then return 0
else elif [ -f "$2" ]; then testdiff "$1" "$2"
return 0 else return 0
fi fi
} }
function testnewer() { function testnewer() {
# test si $2 n'existe pas ou si $1 est plus récent que $2 # test si $2 n'existe pas ou si $1 est plus récent que $2. Si $3 est non vide,
# la valeur de retour est fixée à 0 (forcer à considérer le test comme vrai)
[ -n "$3" ] && return 0
test ! -e "$2" -o "$1" -nt "$2" test ! -e "$2" -o "$1" -nt "$2"
} }
function ps_all() { function ps_all() {
@ -1338,7 +1246,7 @@ function list_all() {
cd "$b" 2>/dev/null || return cd "$b" 2>/dev/null || return
eval "$(__la_cmd "$@")" | while read f; do eval "$(__la_cmd "$@")" | while read f; do
[ "$f" == "." -o "$f" == ".." ] && continue [ "$f" == "." -o "$f" == ".." ] && continue
rawecho "$f" recho "$f"
done done
cd "$curdir" cd "$curdir"
} }
@ -1363,7 +1271,7 @@ function list_files() {
cd "$b" 2>/dev/null || return cd "$b" 2>/dev/null || return
eval "$(__la_cmd "$@")" | while read f; do eval "$(__la_cmd "$@")" | while read f; do
[ -f "$f" ] && rawecho "$f" [ -f "$f" ] && recho "$f"
done done
cd "$curdir" cd "$curdir"
} }
@ -1379,7 +1287,7 @@ function list_dirs() {
cd "$b" 2>/dev/null || return cd "$b" 2>/dev/null || return
eval "$(__la_cmd "$@")" | while read f; do eval "$(__la_cmd "$@")" | while read f; do
[ "$f" == "." -o "$f" == ".." ] && continue [ "$f" == "." -o "$f" == ".." ] && continue
[ -d "$f" ] && rawecho "$f" [ -d "$f" ] && recho "$f"
done done
cd "$curdir" cd "$curdir"
} }
@ -1528,7 +1436,7 @@ function get_archive_basename() {
function get_archive_appname() { function get_archive_appname() {
# Obtenir le nom probable de l'application ou du framework contenu dans # Obtenir le nom probable de l'application ou du framework contenu dans
# l'archive $1, e.g: # l'archive $1, e.g:
# get_archive_versionsuffix app-0.1.tgz # get_archive_appname app-0.1.tgz
# --> app # --> app
local appname="$(basename -- "$1")" local appname="$(basename -- "$1")"
# supprimer l'extension # supprimer l'extension
@ -1575,7 +1483,7 @@ function get_archive_versionsuffix() {
function get_archive_version() { function get_archive_version() {
# Obtenir la valeur probable de la version de l'application ou du framework # Obtenir la valeur probable de la version de l'application ou du framework
# contenu dans l'archive $1, e.g: # contenu dans l'archive $1, e.g:
# get_archive_versionsuffix app-0.1.tgz # get_archive_version app-0.1.tgz
# --> 0.1 # --> 0.1
local basename="$(get_archive_basename "$1")" local basename="$(get_archive_basename "$1")"
echo "$basename" | awk '{ echo "$basename" | awk '{
@ -1631,10 +1539,10 @@ function runscript_as() {
local cmd local cmd
cmd="\ cmd="\
__estack=$(quoted_arg "$__estack") __estack=$(qval "$__estack")
__tlevel=$(quoted_args "$__tlevel") __tlevel=$(qval "$__tlevel")
export __estack __tlevel export __estack __tlevel
exec ${BASH:-/bin/sh} $(quoted_args "$@")" exec ${BASH:-/bin/sh} $(qvals "$@")"
if is_yes "$UTOOLS_USES_SU" || ! progexists sudo; then if is_yes "$UTOOLS_USES_SU" || ! progexists sudo; then
eecho "Entrez le mot de passe de root" eecho "Entrez le mot de passe de root"
@ -1818,8 +1726,8 @@ En l'occurence, ce script est accédé par le chemin $script et ce chemin doit e
estep "Lancement de la commande sur l'hôte distant $user@$host" estep "Lancement de la commande sur l'hôte distant $user@$host"
local cmd local cmd
[ -n "$path" ] && cmd="$(quoted_args cd "$path"); " [ -n "$path" ] && cmd="$(qvals cd "$path"); "
cmd="$cmd$(quoted_args "$script" "$@")" cmd="$cmd$(qvals "$script" "$@")"
ssh -qt "${UTOOLS_ENSURE_HOSTNAME_SSH_OPTS[@]}" "$user@$host" "$cmd" ssh -qt "${UTOOLS_ENSURE_HOSTNAME_SSH_OPTS[@]}" "$user@$host" "$cmd"
[ $? -eq 255 ] && return 12 [ $? -eq 255 ] && return 12
return 1 return 1
@ -2506,15 +2414,15 @@ function awkdef() {
__ad_value="${1:$__ad_vpos}" __ad_value="${1:$__ad_vpos}"
if [ -n "$__ad_int" ]; then if [ -n "$__ad_int" ]; then
# valeur entière # valeur entière
echo "$__ad_name = int($(quoted_awk "$__ad_value") + 0)" echo "$__ad_name = int($(qawk "$__ad_value") + 0)"
elif [ -n "$__ad_str" ]; then elif [ -n "$__ad_str" ]; then
# valeur chaine # valeur chaine
echo "$__ad_name = $(quoted_awk "$__ad_value")" echo "$__ad_name = $(qawk "$__ad_value")"
elif [ ${#__ad_value} -lt 256 ] && isnum "$__ad_value"; then elif [ ${#__ad_value} -lt 256 ] && isnum "$__ad_value"; then
# considérer qu'une nombre fait moins de 256 chiffres # considérer qu'une nombre fait moins de 256 chiffres
echo "$__ad_name = $__ad_value" echo "$__ad_name = $__ad_value"
else else
echo "$__ad_name = $(quoted_awk "$__ad_value")" echo "$__ad_name = $(qawk "$__ad_value")"
fi fi
else else
# fin de l'analyse des définitions de variable # fin de l'analyse des définitions de variable
@ -2530,7 +2438,7 @@ function awkdef() {
local __ad_i=1 local __ad_i=1
echo "$__ad_name[0] = 0; delete $__ad_name" echo "$__ad_name[0] = 0; delete $__ad_name"
for __ad_arg in "${!__ad_value}"; do for __ad_arg in "${!__ad_value}"; do
echo "$__ad_name[$__ad_i]=$(quoted_awk "$__ad_arg")" echo "$__ad_name[$__ad_i]=$(qawk "$__ad_arg")"
__ad_i=$(($__ad_i + 1)) __ad_i=$(($__ad_i + 1))
done done
eval "echo \"\${__ad_name}_count = \${#$__ad_value}\"" eval "echo \"\${__ad_name}_count = \${#$__ad_value}\""
@ -2539,7 +2447,7 @@ function awkdef() {
done done
echo "}" echo "}"
for __ad_arg in "$@"; do for __ad_arg in "$@"; do
rawecho "$__ad_arg" recho "$__ad_arg"
done done
fi fi
@ -2967,7 +2875,7 @@ function tooenc() {
# $3=($UTOOLS_OUTPUT_ENCODING) # $3=($UTOOLS_OUTPUT_ENCODING)
local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}"
if [ "$from" == "$to" ]; then if [ "$from" == "$to" ]; then
rawecho "$src" recho "$src"
else else
iconv -f "$from" -t "$to" <<<"$src" iconv -f "$from" -t "$to" <<<"$src"
fi fi
@ -2980,9 +2888,9 @@ function tooenc_() {
# $3=($UTOOLS_OUTPUT_ENCODING) # $3=($UTOOLS_OUTPUT_ENCODING)
local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}" local src="$1" from="${2:-$OENC}" to="${3:-$UTOOLS_OUTPUT_ENCODING}"
if [ "$from" == "$to" ]; then if [ "$from" == "$to" ]; then
rawecho_ "$src" recho_ "$src"
else else
rawecho_ "$src" | iconv -f "$from" -t "$to" recho_ "$src" | iconv -f "$from" -t "$to"
fi fi
} }
function uecho_() { function uecho_() {
@ -2993,7 +2901,7 @@ function toienc() {
# $3(=$UTOOLS_INPUT_ENCODING) # $3(=$UTOOLS_INPUT_ENCODING)
local __tie_var="$1" __tie_to="${2:-$IENC}" __tie_from="${3:-$UTOOLS_INPUT_ENCODING}" local __tie_var="$1" __tie_to="${2:-$IENC}" __tie_from="${3:-$UTOOLS_INPUT_ENCODING}"
if [ "$__tie_from" != "$__tie_to" ]; then if [ "$__tie_from" != "$__tie_to" ]; then
set_var "$__tie_var" "$(iconv -f "$__tie_from" -t "$__tie_to" <<<"${!__tie_var}")" _setv "$__tie_var" "$(iconv -f "$__tie_from" -t "$__tie_to" <<<"${!__tie_var}")"
fi fi
} }
function uread() { function uread() {
@ -3075,7 +2983,7 @@ function __indent() {
/}" != "$1" ]; then /}" != "$1" ]; then
sed "2,\$s/^/${__tlevel}/g" <<<"$1" sed "2,\$s/^/${__tlevel}/g" <<<"$1"
else else
rawecho "$1" recho "$1"
fi fi
} }
# fonctions à surcharger pour modifier la façon dont les messages sont affichés # fonctions à surcharger pour modifier la façon dont les messages sont affichés
@ -3163,7 +3071,7 @@ function get_interaction_option() { :;}
__epending= __epending=
function eflush() { function eflush() {
# Afficher les messages en attente # Afficher les messages en attente
if [ -n "$__epending" ]; then rawecho "$__epending" 1>&2; __epending=; fi if [ -n "$__epending" ]; then recho "$__epending" 1>&2; __epending=; fi
} }
function eclearp() { function eclearp() {
# Supprimer les message en attente # Supprimer les message en attente
@ -3211,7 +3119,7 @@ function edebug() {
function trace() { function trace() {
# Afficher la commande $1..@, la lancer, puis afficher son code d'erreur si une # Afficher la commande $1..@, la lancer, puis afficher son code d'erreur si une
# erreur se produit # erreur se produit
local r cmd="$(quoted_args "$@")" local r cmd="$(qvals "$@")"
show_info && { eflush; __eecho "\$ $cmd" 1>&2; } show_info && { eflush; __eecho "\$ $cmd" 1>&2; }
"$@"; r=$? "$@"; r=$?
if [ $r -ne 0 ]; then if [ $r -ne 0 ]; then
@ -3230,7 +3138,7 @@ function trace_error() {
local r local r
"$@"; r=$? "$@"; r=$?
if [ $r -ne 0 ]; then if [ $r -ne 0 ]; then
local cmd="$(quoted_args "$@")" local cmd="$(qvals "$@")"
show_error && { eflush; __eecho "^ $cmd [EC #$r]" 1>&2; } show_error && { eflush; __eecho "^ $cmd [EC #$r]" 1>&2; }
fi fi
return $r return $r
@ -3649,7 +3557,7 @@ function __rv_read() {
OENC="$UTF8" eerror "La valeur par défaut de $__rv_v doit être non vide" OENC="$UTF8" eerror "La valeur par défaut de $__rv_v doit être non vide"
return 1 return 1
fi fi
set_var "$__rv_v" "$__rv_d" _setv "$__rv_v" "$__rv_d"
return 0 return 0
fi fi
@ -3678,7 +3586,7 @@ function __rv_read() {
fi fi
__rv_r="${__rv_r:-$__rv_d}" __rv_r="${__rv_r:-$__rv_d}"
if [ -n "$__rv_r" ] || ! is_yes "$__rv_re"; then if [ -n "$__rv_r" ] || ! is_yes "$__rv_re"; then
set_var "$__rv_v" "$__rv_r" _setv "$__rv_v" "$__rv_r"
return 0 return 0
fi fi
done done
@ -3755,7 +3663,7 @@ function simple_menu() {
__sm_c=0 __sm_c=0
fi fi
done done
set_var "$__sm_option_var" "$__sm_option" _setv "$__sm_option_var" "$__sm_option"
} }
function actions_menu() { function actions_menu() {
@ -3801,8 +3709,8 @@ function actions_menu() {
eerror_unless [ ${#__am_action_descs[*]} -gt 0 ] "Vous devez spécifier le tableau des actions" || return eerror_unless [ ${#__am_action_descs[*]} -gt 0 ] "Vous devez spécifier le tableau des actions" || return
__actions_menu || return 1 __actions_menu || return 1
setv "${1:-action}" "$__am_select_action" _setv "${1:-action}" "$__am_select_action"
setv "${2:-option}" "$__am_select_option" _setv "${2:-option}" "$__am_select_option"
} }
function __actions_menu() { function __actions_menu() {
local title="$__am_title" local title="$__am_title"
@ -4091,12 +3999,12 @@ function ac_set_tmpfile() {
fi fi
fi fi
if [ -n "$__acst_d" -a -n "$3" ]; then if [ -n "$__acst_d" -a -n "$3" ]; then
set_var "$1" "$3" _setv "$1" "$3"
[ -f "$3" -a "$4" == keep ] || >"$3" [ -f "$3" -a "$4" == keep ] || >"$3"
else else
local __acst_t="$(mktempf "$2")" local __acst_t="$(mktempf "$2")"
autoclean "$__acst_t" autoclean "$__acst_t"
set_var "$1" "$__acst_t" _setv "$1" "$__acst_t"
fi fi
} }
function ac_set_tmpdir() { function ac_set_tmpdir() {
@ -4115,12 +4023,12 @@ function ac_set_tmpdir() {
fi fi
fi fi
if [ -n "$__acst_d" -a -n "$3" ]; then if [ -n "$__acst_d" -a -n "$3" ]; then
set_var "$1" "$3" _setv "$1" "$3"
mkdir -p "$3" mkdir -p "$3"
else else
local __acst_t="$(mktempd "$2")" local __acst_t="$(mktempd "$2")"
autoclean "$__acst_t" autoclean "$__acst_t"
set_var "$1" "$__acst_t" _setv "$1" "$__acst_t"
fi fi
} }
function debug_tee() { function debug_tee() {

View File

@ -29,6 +29,24 @@ function yesval() {
is_yes "$1" && echo 1 is_yes "$1" && echo 1
} }
function setyesval() {
# mettre la valeur normalisée de la valeur "oui" de $2 dans la variable $1
is_yes "$2" && _setv "$1" 1 || _setv "$1" ""
}
function normyesval() {
# remplacer la valeur de la variable $1 par la valeur normalisée de sa valeur "oui"
# Si $2 est non vide, prendre cette valeur plutôt que la valeur de la variable $1
is_yes "${2:-"${!1}"}" && _setv "$1" 1 || _setv "$1" ""
}
function normyesvals() {
# remplacer les valeur des variables $1..* par les valeurs normalisées
# respectives de leur valeur "oui"
local __nyv_yesvar
for __nyv_yesvar in "$@"; do
is_yes "${!__nyv_yesvar}" && _setv "$__nyv_yesvar" 1 || _setv "$__nyv_yesvar" ""
done
}
function setb() { function setb() {
# Lancer la commande $2..@ en supprimant la sortie standard. Si la commande # 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 # retourne vrai, assigner la valeur 1 à la variable $1. Sinon, lui assigner la

View File

@ -2,15 +2,15 @@
## Fonctions de base: support des fonctions obsolètes et des versions de bash < 4.x ## Fonctions de base: support des fonctions obsolètes et des versions de bash < 4.x
##@cooked nocomments ##@cooked nocomments
##@include base.core ##@include base.core
##@include base.num
##@include base.bool
##@include base.quote ##@include base.quote
##@include base.string
##@include base.bool
uprovide base.compat uprovide base.compat
urequire base.core base.num base.bool base.quote
## Fonctions obsolètes ## Fonctions obsolètes
# base.core # base.core
urequire base.core
function setx2() { setxx "$@"; } function setx2() { setxx "$@"; }
function rawecho() { recho "$@"; } function rawecho() { recho "$@"; }
function rawecho_() { recho_ "$@"; } function rawecho_() { recho_ "$@"; }
@ -22,16 +22,39 @@ function set_var_cmd() { echo_setv "$@"; }
function set_var_literal() { eval "$1=$2"; } function set_var_literal() { eval "$1=$2"; }
# base.quote # base.quote
urequire base.quote
function quote_awk() { _qawk "$@"; } function quote_awk() { _qawk "$@"; }
function quoted_awk() { qawk "$@"; } function quoted_awk() { qawk "$@"; }
function quote_seds() { qseds "$@"; } function quote_seds() { qseds "$@"; }
function quote_form() { _qform "$@"; } function quote_form() { _qform "$@"; }
function quoted_form() { qform "$@"; } function quoted_form() { qform "$@"; }
## Fonctions dépréciées
function set_array_cmd() {
# Afficher la commande permettant d'initialiser le tableau $1 avec les valeurs:
# soit du tableau $2, soit de $3..$n si $2=="@"
# S'il n'y a que l'argument $1, alors afficher la commande permettant de
# recréer le tableau $1
if [ $# -eq 1 ]; then echo_seta "$1"
elif [ "$2" == @ ]; then echo_seta "$1" "${@:3}"
else eval "echo_seta \"\$1\" \"\${$2[@]}\""
fi
}
function set_array() {
# Soit $1 un tableau à créer. Si $2=="@", créer le tableau $1 avec les valeurs
# $3..$n. Sinon, créer le tableau $1 avec les valeurs du tableau $2.
# Cette fonction n'existe que comme un pendant de set_var(), mais le véritable
# intérêt est la fonction set_array_cmd(). cf array_copy() pour une version plus
# efficace de la copie de tableaux
eval "$(set_array_cmd "$@")"
}
## Compatibilité avec bash >=2.x ## Compatibilité avec bash >=2.x
if [ -n "$BASH_VERSINFO" -a "${BASH_VERSINFO[0]}" -lt 4 ]; then if [ -n "$BASH_VERSINFO" -a "${BASH_VERSINFO[0]}" -lt 4 ]; then
# base.string # base.string
urequire base.string
function strlower() { tr A-Z a-z <<<"$*"; } function strlower() { tr A-Z a-z <<<"$*"; }
function strlower1() { function strlower1() {
local str="$*" local str="$*"
@ -60,6 +83,7 @@ if [ -n "$BASH_VERSINFO" -a "${BASH_VERSINFO[0]}" -lt 4 ]; then
} }
# base.bool # base.bool
urequire base.bool
function is_yes() { function is_yes() {
case "$1" in case "$1" in
o|oui|y|yes|v|vrai|t|true|on) return 0;; o|oui|y|yes|v|vrai|t|true|on) return 0;;

View File

@ -11,9 +11,9 @@ function recho() {
# afficher une valeur brute. contrairement à la commande echo, ne reconnaitre # afficher une valeur brute. contrairement à la commande echo, ne reconnaitre
# aucune option (i.e. -e, -E, -n ne sont pas signifiants) # aucune option (i.e. -e, -E, -n ne sont pas signifiants)
if [[ "${1:0:2}" == -[eEn] ]]; then if [[ "${1:0:2}" == -[eEn] ]]; then
echo -n -
local first="${1:1}"; shift local first="${1:1}"; shift
echo "$first$@" echo -n -
echo "$first" "$@"
else else
echo "$@" echo "$@"
fi fi
@ -22,9 +22,9 @@ function recho_() {
# afficher une valeur brute, sans passer à la ligne. contrairement à la commande # 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) # echo, ne reconnaitre aucune option (i.e. -e, -E, -n ne sont pas signifiants)
if [[ "${1:0:2}" == -[eEn] ]]; then if [[ "${1:0:2}" == -[eEn] ]]; then
echo -n -
local first="${1:1}"; shift local first="${1:1}"; shift
echo -n "$first$@" echo -n -
echo -n "$first" "$@"
else else
echo -n "$@" echo -n "$@"
fi fi
@ -45,11 +45,12 @@ function _qval() {
} }
function should_quote() { function should_quote() {
# Tester si la chaine $* doit être mise entre quotes # Tester si la chaine $* doit être mise entre quotes
local l="${#1}" local s="$*"
local l="${#s}"
# pour optimiser, toujours mettre entre quotes une chaine vide ou de plus de 80 caractères # pour optimiser, toujours mettre entre quotes une chaine vide ou de plus de 80 caractères
[ $l -eq 0 -o $l -gt 80 ] && return 0 [ $l -eq 0 -o $l -gt 80 ] && return 0
# sinon, tester si la chaine contient des caractères spéciaux # sinon, tester si la chaine contient des caractères spéciaux
local s="${*//[a-zA-Z0-9]/}" s="${s//[a-zA-Z0-9]/}"
s="${s//,/}" s="${s//,/}"
s="${s//./}" s="${s//./}"
s="${s//+/}" s="${s//+/}"
@ -165,7 +166,7 @@ function qlines() {
sed "s/'/'\\\\''/g; s/.*/'&'/g" sed "s/'/'\\\\''/g; s/.*/'&'/g"
} }
function setv() { function setv() {
# initialiser la variable $1 avec la valeur $2* # initialiser la variable $1 avec la valeur $2..*
# note: en principe, la syntaxe est 'setv var values...'. cependant, la # note: en principe, la syntaxe est 'setv var values...'. cependant, la
# syntaxe 'setv var=values...' est supportée aussi # syntaxe 'setv var=values...' est supportée aussi
local __s_var="$1"; shift local __s_var="$1"; shift
@ -190,6 +191,45 @@ function echo_setv() {
fi fi
echo "$__s_var=$(qvalr "$*")" echo "$__s_var=$(qvalr "$*")"
} }
function seta() {
# initialiser le tableau $1 avec les valeurs $2..@
# note: en principe, la syntaxe est 'seta array values...'. cependant, la
# syntaxe 'seta array=values...' est supportée aussi
local __s_array="$1"; shift
if [[ "$__s_array" == *=* ]]; then
set -- "${__s_array#*=}" "$@"
__s_array="${__s_array%%=*}"
fi
eval "$__s_array=(\"\$@\")"
}
function _seta() {
# Comme la fonction seta() mais ne supporte que la syntaxe '_seta array values...'
# Cette fonction est légèrement plus rapide que seta()
local __s_array="$1"; shift
eval "$__s_array=(\"\$@\")"
}
function echo_seta() {
# Afficher la commande qui serait lancée par seta "$@"
local __s_var="$1"; shift
if [[ "$__s_var" == *=* ]]; then
set -- "${__s_var#*=}" "$@"
__s_var="${__s_var%%=*}"
fi
echo "$__s_var=($(qvals "$@"))"
}
function echo_seta2() {
# Afficher la commande qui recrée le tableau $1
# Si des arguments sont spécifiés, cette fonction se comporte comme
# echo_seta()
local __s_var="$1"; shift
if [[ "$__s_var" == *=* ]]; then
set -- "${__s_var#*=}" "$@"
__s_var="${__s_var%%=*}"
elif [ $# -eq 0 ]; then
eval "set -- \"\${$__s_var[@]}\""
fi
echo "$__s_var=($(qvals "$@"))"
}
function setx() { function setx() {
# syntaxe 1: setx var cmd # syntaxe 1: setx var cmd
# initialiser la variable $1 avec le résultat de la commande "$2..@" # initialiser la variable $1 avec le résultat de la commande "$2..@"
@ -234,8 +274,9 @@ function _setax() {
function evalx() { function evalx() {
# Implémenter une syntaxe lisible et naturelle permettant d'enchainer des # Implémenter une syntaxe lisible et naturelle permettant d'enchainer des
# traitements sur une valeur. Par exemple, la commande # traitements sur une valeur. Par exemple, la commande
# evalx cmd1... // cmd2... // cmd3... # evalx cmd1 [args1...] // cmd2 [args2...] // cmd3 [args3...]
# affiche le résultat de la commande "$(cmd3 $(cmd2 $(cmd1)))" # est équivalente à la commande
# cmd3 args3 "$(cmd2 args2 "$(cmd1 args1)")"
# Retourner le dernier code d'erreur non nul, ou 0 si toutes les commandes se # Retourner le dernier code d'erreur non nul, ou 0 si toutes les commandes se
# sont exécutées sans erreur. # sont exécutées sans erreur.
local __e_val __e_arg __e_r=0 local __e_val __e_arg __e_r=0
@ -285,7 +326,7 @@ function evalp() {
# un flux de données. Par exemple, la commande # un flux de données. Par exemple, la commande
# evalp cmd1... // cmd2... // cmd3... # evalp cmd1... // cmd2... // cmd3...
# affiche le résultat de la commande "$(cmd1 | cmd2 | cmd3)" # affiche le résultat de la commande "$(cmd1 | cmd2 | cmd3)"
# Typiquement, cette fonction permet de faciliter la construction d'un # Typiquement, cette fonction permet de faciliter la *construction* d'un
# enchainement de commandes par programme, ou de faciliter l'utilisation de la # 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 # 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 # cas, il est plus simple et naturel d'écrire les enchainements avec la syntaxe

59
lib/ulib/base.deprecated Normal file
View File

@ -0,0 +1,59 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Fonctions dépréciées
##@cooked nocomments
uprovide base.deprecated
# base.array
function set_array_cmd() {
# Afficher la commande permettant d'initialiser le tableau $1 avec les valeurs:
# soit du tableau $2, soit de $3..$n si $2=="@"
# S'il n'y a que l'argument $1, alors afficher la commande permettant de
# recréer le tableau $1
if [ $# -eq 1 ]; then echo_seta2 "$1"
elif [ "$2" == @ ]; then echo_seta "$1" "${@:3}"
else eval "echo_seta \"\$1\" \"\${$2[@]}\""
fi
}
function set_array() {
# Soit $1 un tableau à créer. Si $2=="@", créer le tableau $1 avec les valeurs
# $3..$n. Sinon, créer le tableau $1 avec les valeurs du tableau $2.
# Cette fonction n'existe que comme un pendant de set_var(), mais le véritable
# intérêt est la fonction set_array_cmd(). cf array_copy() pour une version plus
# efficace de la copie de tableaux
eval "$(set_array_cmd "$@")"
}
# base.misc
function quote_in() {
# Comme quote_arg pour une chaine lue sur stdin
sed 's/\\/\\\\/g
s/"/\\"/g
s/\$/\\$/g
s/`/\\`/g'
}
function quote_sin() {
# Pour la chaine lue sur stdin, remplacer ' par '\''. Cela permet de protéger une
# chaine à mettre entre quotes
sed "s/'/'\\\\''/g"
}
function quote_sarg() {
# Dans la chaine $1, remplacer ' par '\''. Cette fonction utilise quote_sin,
# puisque le shell a des difficultés à faire le rechercher/remplacer approprié
quote_sin <<<"$1"
}
function quoted_sarg() {
# Dans la chaine $1, remplacer ' par '\'', et afficher la chaine entourée de
# quotes
echo "'$(quote_sarg "$1")'"
}
function quoted_sargs() {
# Comme quoted_sarg, mais tous les arguments sont quotés et affichés entourés de
# quotes, ce qui permet de construire des arguments d'une ligne de commande
local a s
for a in "$@"; do
s="${s:+$s }$(quoted_sarg "$a")"
done
recho "$s"
}

View File

@ -33,10 +33,17 @@ export TMPDIR="${TMPDIR:-${TMP:-${TEMP:-/tmp}}}"
[ -z "$USER" -a -n "$LOGNAME" ] && export USER="$LOGNAME" [ -z "$USER" -a -n "$LOGNAME" ] && export USER="$LOGNAME"
# Le fichier nutoolsrc doit être chargé systématiquement # Le fichier nutoolsrc doit être chargé systématiquement
# note: ajouter 'true' après le chargement de *nutoolsrc pour éviter que le
# module se termine sur une erreur si ces fichiers n'existent pas, ce qui
# empêcherait de le charger avec urequire()
[ -f /etc/debian_chroot ] && UTOOLS_CHROOT=1 [ -f /etc/debian_chroot ] && UTOOLS_CHROOT=1
[ -f /etc/nutoolsrc ] && . /etc/nutoolsrc [ -f /etc/nutoolsrc ] && . /etc/nutoolsrc
[ -f ~/.nutoolsrc ] && . ~/.nutoolsrc [ -f ~/.nutoolsrc ] && . ~/.nutoolsrc
true
# Type de système sur lequel tourne le script
UNAME_SYSTEM=`uname -s`
[ "${UNAME_SYSTEM#CYGWIN}" != "$UNAME_SYSTEM" ] && UNAME_SYSTEM=Cygwin
[ "${UNAME_SYSTEM#MINGW32}" != "$UNAME_SYSTEM" ] && UNAME_SYSTEM=Mingw
UNAME_MACHINE=`uname -m`
if [ -n "$UTOOLS_CHROOT" ]; then
# Dans un chroot, il est possible de forcer les valeurs
[ -n "$UTOOLS_UNAME_SYSTEM" ] && eval "UNAME_SYSTEM=$UTOOLS_UNAME_SYSTEM"
[ -n "$UTOOLS_UNAME_MACHINE" ] && eval "UNAME_MACHINE=$UTOOLS_UNAME_MACHINE"
fi

View File

@ -27,3 +27,8 @@ function isrnum() {
v="${v//[0-9]/}" v="${v//[0-9]/}"
[ -z "$v" ] [ -z "$v" ]
} }
function evali() {
# Evaluer une expression numérique
echo "$(($*))"
}

View File

@ -1,5 +1,5 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 ##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Fonctions de base: gestion des valeurs scalaires ## Fonctions de base: gestion des valeurs chaines scalaires
##@cooked nocomments ##@cooked nocomments
# Note: contient du code spécifique à bash 4. Le module base.compat réimplémente # Note: contient du code spécifique à bash 4. Le module base.compat réimplémente
# les fonctions concernées pour les rendre compatible avec bash >= 2.x # les fonctions concernées pour les rendre compatible avec bash >= 2.x
@ -11,35 +11,35 @@ urequire base.core
# il faut d'abord le traiter avec _qval() # il faut d'abord le traiter avec _qval()
function straddp() { function straddp() {
# ajouter le préfixe $1 à $2* # ajouter le préfixe $1 à $2..*
local p="$1"; shift local p="$1"; shift
echo "$p$*" echo "$p$*"
} }
function strdelp() { function strdelp() {
# enlever le préfixe $1 à $2* # enlever le préfixe $1 à $2..*
local p="$1"; shift local p="$1"; shift
local str="$*" local str="$*"
echo "${str#$p}" echo "${str#$p}"
} }
function strdelp2() { function strdelp2() {
# enlever le préfixe $1 le plus long à $2* # enlever le préfixe $1 le plus long à $2..*
local p="$1"; shift local p="$1"; shift
local str="$*" local str="$*"
echo "${str##$p}" echo "${str##$p}"
} }
function stradds() { function stradds() {
# ajouter le suffixe $1 à $2* # ajouter le suffixe $1 à $2..*
local s="$1"; shift local s="$1"; shift
echo "$*$s" echo "$*$s"
} }
function strdels() { function strdels() {
# enlever le suffixe $1 à $2* # enlever le suffixe $1 à $2..*
local s="$1"; shift local s="$1"; shift
local str="$*" local str="$*"
echo "${str%$s}" echo "${str%$s}"
} }
function strdels2() { function strdels2() {
# enlever le suffixe le plus long $1 à $2* # enlever le suffixe le plus long $1 à $2..*
local s="$1"; shift local s="$1"; shift
local str="$*" local str="$*"
echo "${str%%$s}" echo "${str%%$s}"
@ -76,7 +76,7 @@ function struppers() {
echo "${*^}" echo "${*^}"
} }
function strmid() { function strmid() {
# Afficher la plage $1 de la valeur $2*. La plage peut être d'une des formes # Afficher la plage $1 de la valeur $2..*. La plage peut être d'une des formes
# 'start', '[start]:length'. Si start est négatif, le compte est effectué à # '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 # partir de la fin de la chaine. Si length est négatif, il est rajouté à la
# longueur de la chaine à partir de start # longueur de la chaine à partir de start
@ -100,7 +100,7 @@ function strmid() {
eval 'echo "${str:'" $range"'}"' eval 'echo "${str:'" $range"'}"'
} }
function strrepl() { function strrepl() {
# Remplacer dans la valeur $3* le motif $1 par la chaine $2. $1 peut commencer # Remplacer dans la valeur $3..* le motif $1 par la chaine $2. $1 peut commencer
# par l'un des caractères /, #, % pour indiquer le type de recherche # par l'un des caractères /, #, % pour indiquer le type de recherche
local pattern="$1"; shift local pattern="$1"; shift
local repl="$1"; shift local repl="$1"; shift
@ -217,3 +217,97 @@ function endswith() {
local str="$1" pattern="$2" local str="$1" pattern="$2"
eval '[ "${str%$pattern}" != "$str" ]' eval '[ "${str%$pattern}" != "$str" ]'
} }
function strsplitf() {
# Cette fonction doit être appelée avec N arguments (avec N>1). Elle analyse et
# découpe l'argument $N comme avec une ligne de commande du shell. Ensuite, elle
# appelle la fonction $1 avec les arguments de $2 à ${N-1}, suivi des arguments
# obtenus lors de l'analyse de l'argument $N. Par exemple, la commande suivante:
# strsplitf cmd arg1 "long arg2" "arg3 'long arg4'"
# est équivalente à:
# cmd arg1 "long arg2" arg3 "long arg4"
# Retourner le code 127 si la fonction à appeler n'est pas spécifiée. Retourner
# le code 126 si une erreur s'est produite lors de l'analyse de l'argument $N
[ $# -gt 0 ] || return 127
local func count
func="$1"; shift
count=$#
if [ $count -gt 0 ]; then
eval 'set -- "${@:1:$(($count-1))}" '"${!count}" || return 126
fi
"$func" "$@"
}
function strecho() { recho "$@"; }
function strqvals() {
# Afficher chaque argument à part avec des quotes. A chainer avec strsplitf()
qvals "$@"
}
function strqlines() {
# Afficher chaque ligne des fichiers spécifiés comme un argument. A chainer avec
# strsplitf()
local -a lines
_setax lines cat "$@"
qvals "${lines[@]}"
}
function strqarray() {
# Afficher chaque valeur des tableaux $@ comme un argument. A chainer avec
# strsplitf()
local __a __s="qvals"
for __a in "$@"; do __s="$__s \"\${$__a[@]}\""; done
eval "$__s"
}
function evals() {
# Enchainer des traitements sur des chaines de caractères, comme pour la fonction
# evalx(). Il y a cependant quelques différences:
# - Seules certains fonctions spécifiques peuvent être utilisées: elles sont
# reconnaissables à leur préfixe 'str'. En effet, lors de l'utilisation d'une
# commande par evals(), le préfixe 'str' est systématiquement ajouté.
# - La fonction strsplitf() est traitée de façon particulière pour lancer une
# commande avec le préfixe 'str'
# Ainsi, la commande suivante:
# evals cmd1 // splitf cmd2
# est équivalente à la commande:
# strplitf strcmd2 "$(strcmd1)"
local __e_val __e_arg __e_r=0
local __e_firstcmd __e_firstarg __e_splitf
local -a __e_cmd
__e_firstcmd=1
while [ $# -gt 0 ]; do
__e_cmd=()
__e_firstarg=1 # premier argument
__e_splitf= # premier argument après splitf
while [ $# -gt 0 ]; do
__e_arg="$1"; shift
[ "$__e_arg" == // ] && break
if [ "${__e_arg%//}" != "$__e_arg" ]; then
local __e_tmp="${__e_arg%//}"
if [ -z "${__e_tmp//\\/}" ]; then
__e_arg="${__e_arg#\\}"
__e_cmd=("${__e_cmd[@]}" "$__e_arg")
continue
fi
fi
if [ -n "$__e_firstarg" ]; then
__e_cmd=("str$__e_arg")
__e_firstarg=
[ "$__e_arg" == "splitf" ] && __e_splitf=1
elif [ -n "$__e_splitf" ]; then
__e_cmd=("${__e_cmd[@]}" "str$__e_arg")
__e_splitf=
else
__e_cmd=("${__e_cmd[@]}" "$__e_arg")
fi
done
if [ -n "$__e_firstcmd" ]; then
__e_val="$("${__e_cmd[@]}")" || __e_r=$?
else
__e_val="$("${__e_cmd[@]}" "$__e_val")" || __e_r=$?
fi
__e_firstcmd=
done
[ -n "$__e_val" ] && echo "$__e_val"
return $__e_r
}

View File

@ -270,7 +270,7 @@ if check_sysinfos -s macosx; then
done done
args=("${args[@]}" "$@") args=("${args[@]}" "$@")
fi fi
quoted_args "${options[@]}" -- "${args[@]}" qvals "${options[@]}" -- "${args[@]}"
return 0 return 0
} }

View File

@ -47,7 +47,7 @@ function conf_enable() {
fi fi
if [ "$name" != "$param" ]; then if [ "$name" != "$param" ]; then
# Ensuite, mettre à jour le fichier avec la valeur spécifiée # Ensuite, mettre à jour le fichier avec la valeur spécifiée
to="$(quote_seds "$value")" to="$(qseds "$value")"
sedi "\ sedi "\
/^[ $TAB]*export[ $TAB]*$name[ $TAB]*=/s/^\([ $TAB]*export[ $TAB]*$name[ $TAB]*=[ $TAB]*\).*\$/\\1$to/ /^[ $TAB]*export[ $TAB]*$name[ $TAB]*=/s/^\([ $TAB]*export[ $TAB]*$name[ $TAB]*=[ $TAB]*\).*\$/\\1$to/
/^[ $TAB]*$name[ $TAB]*=/s/^\([ $TAB]*$name[ $TAB]*=[ $TAB]*\).*\$/\\1$to/ /^[ $TAB]*$name[ $TAB]*=/s/^\([ $TAB]*$name[ $TAB]*=[ $TAB]*\).*\$/\\1$to/
@ -61,14 +61,14 @@ function conf_enable() {
} }
function conf_enableq() { function conf_enableq() {
# Comme conf_enable(), mais s'assure que les valeurs sont quotées dans le # Comme conf_enable(), mais s'assure que les valeurs sont quotées si
# fichier. Ceci permet de stocker des valeurs avec des espaces ou des # nécessaire dans le fichier. Ceci permet de stocker des valeurs avec des
# caractères spéciaux. # espaces ou des caractères spéciaux.
local args arg name value local args arg name value
args=("$1"); shift args=("$1"); shift
for arg in "$@"; do for arg in "$@"; do
splitvar "$arg" name value splitvar "$arg" name value
array_add args "$name=$(quoted_arg "$value")" array_add args "$name=$(qvalm "$value")"
done done
conf_enable "${args[@]}" conf_enable "${args[@]}"
} }
@ -94,8 +94,8 @@ function conf_disable() {
from0="^[ $TAB]*export[ $TAB]*$name[ $TAB]*=" from0="^[ $TAB]*export[ $TAB]*$name[ $TAB]*="
from1="^[ $TAB]*$name[ $TAB]*=" from1="^[ $TAB]*$name[ $TAB]*="
if [ "$name" != "$param" ]; then if [ "$name" != "$param" ]; then
from0="$from0$(quote_seds "$value")\$" from0="$from0$(qseds "$value")\$"
from1="$from1$(quote_seds "$value")\$" from1="$from1$(qseds "$value")\$"
fi fi
if quietgrep "$from" "$conf"; then if quietgrep "$from" "$conf"; then
sedi "\ sedi "\
@ -131,7 +131,7 @@ function conf_append() {
local param name value from local param name value from
for param in "$@"; do for param in "$@"; do
splitvar "$param" name value splitvar "$param" name value
echo "$name=\"\${$name:+\$$name$CONF_APPEND_SEP}$(quote_arg "$value")\"" >>"$conf" echo "$name=\"\${$name:+\$$name$CONF_APPEND_SEP}$(_qval "$value")\"" >>"$conf"
modified=0 modified=0
done done
@ -160,11 +160,11 @@ function conf_array_append() {
if quietgrep "^[ $TAB]*\(export[ $TAB]*\)\?$name=(" "$conf"; then if quietgrep "^[ $TAB]*\(export[ $TAB]*\)\?$name=(" "$conf"; then
# variable déjà existante # variable déjà existante
[ "$name" != "$param" ] || continue [ "$name" != "$param" ] || continue
echo "$name=(\"\${$name[@]}\" $(quoted_arg "$value"))" >>"$conf" echo "$name=(\"\${$name[@]}\" $(qvalm "$value"))" >>"$conf"
else else
# nouvelle variable # nouvelle variable
if [ "$name" != "$param" ]; then if [ "$name" != "$param" ]; then
echo "$name=($(quoted_arg "$value"))" >>"$conf" echo "$name=($(qvalm "$value"))" >>"$conf"
else else
echo "$name=()" >>"$conf" echo "$name=()" >>"$conf"
fi fi
@ -191,7 +191,7 @@ function conf_check() {
splitvar "$param" name value splitvar "$param" name value
from="^[ $TAB]*\(export[ $TAB]*\)\?$name[ $TAB]*=" from="^[ $TAB]*\(export[ $TAB]*\)\?$name[ $TAB]*="
if [ "$name" != "$param" ]; then if [ "$name" != "$param" ]; then
from="$from$(quote_seds "$value")\$" from="$from$(qseds "$value")\$"
fi fi
quietgrep "$from" "$conf" || return 1 quietgrep "$from" "$conf" || return 1
done done
@ -232,7 +232,7 @@ function aconf_enable() {
fi fi
if [ "$name" != "$param" ]; then if [ "$name" != "$param" ]; then
# Ensuite, mettre à jour le fichier avec la valeur spécifiée # Ensuite, mettre à jour le fichier avec la valeur spécifiée
to="$(quote_seds "$value")" to="$(qseds "$value")"
sedi "\ sedi "\
/^[ $TAB]*$name[ $TAB][ $TAB]*/s/^\([ $TAB]*$name[ $TAB]*\).*$/\\1$to/ /^[ $TAB]*$name[ $TAB][ $TAB]*/s/^\([ $TAB]*$name[ $TAB]*\).*$/\\1$to/
/^[ $TAB]*$name\$/s/^\([ $TAB]*$name\)\$/\\1 $to/" "$conf" /^[ $TAB]*$name\$/s/^\([ $TAB]*$name\)\$/\\1 $to/" "$conf"
@ -265,7 +265,7 @@ function aconf_disable() {
# Essayer simplement de commenter la valeur dans le fichier # Essayer simplement de commenter la valeur dans le fichier
from="^[ $TAB]*$name[ $TAB]*" from="^[ $TAB]*$name[ $TAB]*"
if [ "$name" != "$param" ]; then if [ "$name" != "$param" ]; then
from="$from$(quote_seds "$value")\$" from="$from$(qseds "$value")\$"
fi fi
if quietgrep "$from" "$conf"; then if quietgrep "$from" "$conf"; then
sedi "/$from/"'s/^/#/g' "$conf" sedi "/$from/"'s/^/#/g' "$conf"
@ -317,7 +317,7 @@ function aconf_check() {
splitvar "$param" name value splitvar "$param" name value
from="^[ $TAB]*$name[ $TAB]*" from="^[ $TAB]*$name[ $TAB]*"
if [ "$name" != "$param" ]; then if [ "$name" != "$param" ]; then
from="$from$(quote_seds "$value")\$" from="$from$(qseds "$value")\$"
fi fi
quietgrep "$from" "$conf" || return 1 quietgrep "$from" "$conf" || return 1
done done
@ -350,17 +350,17 @@ function mconf_enable() {
local script i param name value local script i param name value
script="BEGIN { script="BEGIN {
modified = 1 modified = 1
section = $(quoted_awk "$section") section = $(qawk "$section")
in_section = 0" in_section = 0"
i=0 i=0
for param in "$@"; do for param in "$@"; do
splitvar "$param" name value splitvar "$param" name value
script="$script script="$script
names[$i] = $(quoted_awk "$name")" names[$i] = $(qawk "$name")"
if [ "$name" != "$param" ]; then if [ "$name" != "$param" ]; then
script="$script script="$script
hasvalues[$i] = 1 hasvalues[$i] = 1
values[$i] = $(quoted_awk "$value")" values[$i] = $(qawk "$value")"
else else
script="$script script="$script
hasvalues[$i] = 0 hasvalues[$i] = 0
@ -445,7 +445,7 @@ function mconf_disable() {
local script match local script match
script="BEGIN { script="BEGIN {
modified = 1 modified = 1
section = $(quoted_awk "$section") section = $(qawk "$section")
in_section = 0 in_section = 0
" "
local param name value local param name value
@ -453,7 +453,7 @@ function mconf_disable() {
splitvar "$param" name value splitvar "$param" name value
match="${match:+$match || }\$0 ~ /^[ $TAB]*$name[ $TAB]*=" match="${match:+$match || }\$0 ~ /^[ $TAB]*$name[ $TAB]*="
if [ "$name" != "$param" ]; then if [ "$name" != "$param" ]; then
match="$match[ $TAB]*$(quote_seds "$value")\$" match="$match[ $TAB]*$(qseds "$value")\$"
fi fi
match="$match/" match="$match/"
done done
@ -501,15 +501,15 @@ function mconf_append() {
local script match local script match
script="BEGIN { script="BEGIN {
modified = 1 modified = 1
section=$(quoted_awk "$section") section=$(qawk "$section")
in_section=0 in_section=0
" "
i=0 i=0
for param in "$@"; do for param in "$@"; do
splitvar "$param" name value splitvar "$param" name value
script="$script script="$script
names[$i] = $(quoted_awk "$name") names[$i] = $(qawk "$name")
values[$i] = $(quoted_awk "$value") values[$i] = $(qawk "$value")
seen[$i] = 0" seen[$i] = 0"
let i=$i+1 let i=$i+1
done done
@ -569,14 +569,14 @@ function mconf_check() {
local script i param name value local script i param name value
script="BEGIN { script="BEGIN {
section = $(quoted_awk "$section") section = $(qawk "$section")
in_section = 0" in_section = 0"
i=0 i=0
for param in "$@"; do for param in "$@"; do
splitvar "$param" name value splitvar "$param" name value
script="$script script="$script
names[$i] = $(quoted_awk "$name") names[$i] = $(qawk "$name")
values[$i] = $(quoted_awk "$value") values[$i] = $(qawk "$value")
seen[$i] = 0" seen[$i] = 0"
let i=$i+1 let i=$i+1
done done
@ -593,7 +593,7 @@ function mconf_check() {
script="$script script="$script
in_section && \$0 ~ /^[ $TAB]*$name[ $TAB]*=" in_section && \$0 ~ /^[ $TAB]*$name[ $TAB]*="
if [ "$name" != "$param" ]; then if [ "$name" != "$param" ]; then
script="$script$(quote_seds "$value")\$" script="$script$(qseds "$value")\$"
fi fi
script="$script/ { script="$script/ {
seen[$i] = 1 seen[$i] = 1

View File

@ -112,7 +112,9 @@ __CTRESOLVE_CTNOW=""
# eval "$(ctresolve <crontab)" # eval "$(ctresolve <crontab)"
function ctresolve() { function ctresolve() {
local -a ctnow local -a ctnow
if [ -n "$__CTRESOLVE_CTNOW" ]; then if [ "$__CTRESOLVE_CTNOW" == "**ANY**" ]; then
ctnow=("$__CTRESOLVE_CTNOW")
elif [ -n "$__CTRESOLVE_CTNOW" ]; then
eval "ctnow=($__CTRESOLVE_CTNOW)" eval "ctnow=($__CTRESOLVE_CTNOW)"
else else
eval "ctnow=($(ctnow))" eval "ctnow=($(ctnow))"
@ -153,6 +155,8 @@ function ctmatch_one(ctval, ref, parts, part, i, j, start, end, ste
return ok return ok
} }
function ctmatch_all(M, H, dom, mon, dow, refM, refH, refdom, refmon, refdow, Mok, Hok, domok, monok, dowok) { function ctmatch_all(M, H, dom, mon, dow, refM, refH, refdom, refmon, refdow, Mok, Hok, domok, monok, dowok) {
if (refM == "**ANY**") return 1
gsub(/\*/, "0-59", M) gsub(/\*/, "0-59", M)
Mok = ctmatch_one(M, refM) Mok = ctmatch_one(M, refM)

485
lib/ulib/deploy Normal file
View File

@ -0,0 +1,485 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Fonction de support pour gérer le déploiement d'artifacts
##@cooked nocomments
################################################################################
# API publique
function deploy_query() {
# Afficher le résultat d'une requête
local alv
eval "set -- $(getopt -ov: -lallow-vars: -- "$@")"
while [ -n "$1" ]; do
case "$1" in
-v|--allow-vars)
array_split alv "$2" ,
shift; shift
;;
--) shift; break;;
*) break;;
esac
done
local qtype="$1" otype="$2" ltype="$3" profile="$4" format="${5:-shell}" term="$6"
local -a vs; local object type link
case "$qtype" in
DEST|SOURCE)
if [ -n "$otype" ]; then
deploy_is_type "$otype" || {
qvals false "$otype: invalid type"
return 2
}
fi
;;
*)
if [ -n "$qtype" ]; then
deploy_is_type "$qtype" || {
qvals false "$qtype: invalid type"
return 3
}
fi
;;
esac
if [ -n "$ltype" ]; then
deploy_is_link "$ltype" || {
qvals false "$ltype: invalid link type"
return 4
}
fi
[ -n "$term" ] || {
qvals false "search term required"
return 5
}
case "$qtype" in
DEST)
edebug "=== search type DEST"
edebug "term=$term, otype=$otype"
deploy_search_artifact object type "$term" "$otype" host || {
qvals false "artifact not found"
return 1
}
edebug "object=$object, type=$type"
deploy_search_link link "$type" "$ltype" || {
qvals false "link not found"
return 1
}
deploy_show_values object object "$format" shell alv
deploy_show_values type otype "$format" shell alv
deploy_show_values link ltype "$format" shell alv
deploy_show_links "$object" "$link" "$profile" "$format" "" alv
return 0
;;
SOURCE)
# XXX implémenter
return 0
;;
*)
if deploy_search_artifact object type "$term" "$qtype"; then
deploy_copy_object_values vs "$object" "$type"
deploy_show_values object object "$format" shell alv
deploy_show_values type otype "$format" shell alv
deploy_show_values vs "$type" "$format" "" alv
deploy_show_attrs "$object" "$type" "$format" alv
return 0
fi
qvals false "artifact not found"
return 1
;;
esac
}
function deploy_setconf() {
local confname="$1" confdir="$2"
if [ -n "$confdir" ]; then
confdir="$(abspath "$confdir")"
if [[ "$confname" == */* ]] || [[ "$confname" == *.* ]]; then
local d="$(abspath "$(dirname -- "$confname")")"
if [ "$d" != "$confdir" ]; then
CONFNAME="$confname"
SFILE="$CONFNAME"
DFILE="${CONFNAME%.conf}.vars"
return
fi
confname="$(basename -- "$confname" .conf)"
fi
CONFNAME="${confname:-deploy}"
IFILE="$confdir/init.conf"
SFILE="$confdir/$CONFNAME.conf"
else
CONFNAME="${confname:-deploy}"
IFILE=
SFILE=
fi
if is_root; then
DFILE="/var/local/deploy/$CONFNAME.vars"
else
DFILE="$HOME/etc/deploy/$CONFNAME.vars"
fi
}
function deploy_loadconf() {
# charger la configuration. deploy_setconf() DOIT être appelé avant
if [ "$1" != --no-auto-update ]; then (
# mettre à jour le cas échéant le fichier des variables
DEPLOY_SRCDIR=; set_defaults deploy
[ -n "$DEPLOY_SRCDIR" ] || DEPLOY_SRCDIR=~/wop/deploy
[ -x "$DEPLOY_SRCDIR/query" ] && "$DEPLOY_SRCDIR/query" --nop -c "$CONFNAME"
); fi
[ -f "$DFILE" ] && source "$DFILE" || return 1
}
function deploy_search_artifact() {
local do="$1" dt="$2" term="$3" type="$4" nottype="$5"
local -a ts os vs; local t o v object
deploy_copy_types ts
for t in "${ts[@]}"; do
[ -n "$type" -a "$t" != "$type" ] && continue
[ -n "$nottype" -a "$t" == "$nottype" ] && continue
object=
if deploy_is_object "$term" "$t"; then
# on a déjà le bon identifiant
object="$term"
else
# chercher un identifiant correspondant à la valeur
deploy_copy_objects os "$t"
for o in "${os[@]}"; do
deploy_copy_object_values vs "$o" "$t"
if array_contains vs "$term"; then
object="$o"
break
fi
if [[ "$term" != *.* ]]; then
for v in "${vs[@]}"; do
if [ "${v%%.*}" == "$term" ]; then
object="$o"
break
fi
done
fi
done
if [ -z "$object" ]; then
# essayer sans tenir compte de la casse
for o in "${os[@]}"; do
if [ "${o,,}" == "${term,,}" ]; then
object="$o"
break
fi
deploy_copy_object_values vs "$o" "$t"
for v in "${vs[@]}"; do
if [ "${v,,}" == "${term,,}" ]; then
object="$o"
break
fi
done
if [[ "$term" != *.* ]]; then
for v in "${vs[@]}"; do
v="${v%%.*}"
if [ "${v,,}" == "${term,,}" ]; then
object="$o"
break
fi
done
fi
done
fi
fi
if [ -n "$object" ]; then
upvars "$do" "$object" "$dt" "$t"
return 0
fi
done
return 1
}
function deploy_search_link() {
local dl="$1" type="$2" link="$3"
local -a ls ts; local l
deploy_copy_links ls
for l in "${ls[@]}"; do
[ -n "$link" -a "$l" != "$link" ] && continue
deploy_copy_link_types ts "$l"
if array_contains ts "$type"; then
upvar "$dl" "$l"
return 0
fi
done
return 1
}
function deploy_show_values() {
if [ -n "$5" ]; then
if ! array_isempty "$5"; then
array_contains "$5" "$2" || return
fi
fi
local -a __sv_vs; array_copy __sv_vs "$1"
local -a vs; array_copy vs __sv_vs
local t="$2" f="${3:-shell}" ff="$4"
[ -n "$ff" -a "$f" != "$ff" ] && return
case "$f" in
shell)
[ -n "$5" ] && echo "$t=()"
deploy_dump_values "$t" vs
;;
line) array_to_lines vs;;
*) array_join vs "$f";;
esac
}
function deploy_show_attrs() {
if [ -n "$4" ]; then
local -a __dsa_alv; array_copy __dsa_alv "$4"
local -a alv; array_copy alv __dsa_alv
fi
local o="$1" t="$2" f="${3:-shell}" ff=shell
[ -n "$ff" -a "$f" != "$ff" ] && return
local -a ons gns ans vs; local an
deploy_prepare_copy_attrs ons gns "$o" "$t"
deploy_copy_attr_names ans "$o" "$t" ons gns
for an in "${ans[@]}"; do
if [ -n "$4" ]; then
if ! array_isempty "$4"; then
array_contains alv "$an" || continue
fi
[ "$f" == shell ] && echo "$an=()"
fi
deploy_copy_attr_values vs "$an" "$o" "$t" ons
deploy_dump_values "$an" vs
done
}
function deploy_show_links() {
if [ -n "$6" ]; then
local -a __dsl_alv; array_copy __dsl_alv "$6"
local -a alv; array_copy alv __dsl_alv
fi
local o="$1" l="$2" profile="$3" f="${4:-shell}" ff="$5"
local -a ps pons pgns ons gns ans ovs os; local p an av o
[ -n "$ff" -a "$f" != "$ff" ] && return
deploy_copy_profiles ps 1
for p in "${ps[@]}"; do
[ -n "$profile" -a "$p" != "$profile" ] && continue
deploy_show_values p profile "$format" shell alv
deploy_prepare_copy_link_attrs pons pgns ons gns "$o" "$l" "$p"
deploy_copy_link_attr_names ans "$o" "$l" "$p" pons pgns ons gns
for an in "${ans[@]}"; do
deploy_copy_link_attr_values avs "$an" "$o" "$l" "$p" pons pgns ons gns
if [ "$an" == host ]; then
# toujours montrer host
#deploy_show_values avs "$an" "$f" "$ff"
ovs=()
for av in "${avs[@]}"; do
deploy_copy_object_values os "$av" host
array_extendu ovs os
done
deploy_show_values ovs host "$f" "$ff" alv
else
deploy_show_values avs "$an" "$f" shell alv
fi
done
done
}
################################################################################
# Fonctions bas niveau
function deploy_is_profile() {
# tester si $1 est un profil valide
[ -z "$1" ] && return 0 # pas de profil == profil valide
array_contains LISTOF_PROFILES "$1"
}
function deploy_copy_profiles() {
# copier la liste des profils valides dans le tableau $1
# si LISTOF_PROFILES est vide et que $2!="", alors mettre une chaine vide
# dans le tableau $1
array_upvar "$1" "${LISTOF_PROFILES[@]}"
if array_isempty "$1" && [ -n "$2" ]; then
array_add "$1" ""
fi
}
function deploy_is_type() {
# tester si $1 est un type valide
array_contains LISTOF_TYPES "$1"
}
function deploy_copy_types() {
# copier la liste des types valides dans le tableau $1
array_upvar "$1" "${LISTOF_TYPES[@]}"
}
function deploy_is_object() {
# tester si $1 est un objet valide de type $2
local o="$1" t="${2:-host}"
array_contains "LISTOF_${t}s" "$o"
}
function deploy_copy_objects() {
# copier la liste des objets valides de type $2 dans le tableau $1
local d="$1" t="${2:-host}"
local -a os
array_copy os "LISTOF_${t}s"
array_upvar "$d" "${os[@]}"
}
function deploy_copy_object_values() {
local d="$1" o="$2" t="${3:-host}"
local -a vs
array_copy vs "${o}_${t}"
array_upvar "$d" "${vs[@]}"
}
function deploy_prepare_copy_attrs() {
local dons="$1" dgns="$2" o="$3" t="${4:-host}"
local -a ons gns
array_copy ons "LISTOF_${o}_${t}_vars"
array_copy gns "LISTOF_${t}_vars"
upvars \
-a${#ons[*]} "$dons" "${ons[@]}" \
-a${#gns[*]} "$dgns" "${gns[@]}"
}
function deploy_copy_attr_names() {
local d="$1" o="$2" t="${3:-host}" __pca_ons="$4" __pca_gns="$5"
local -a ns
if [ -n "$__pca_ons" -a -n "$__pca_gns" ]; then
# variables ons et gns déjà préparées par deploy_prepare_copy_attrs()
array_copy ns "$__pca_ons"
array_extendu ns "$__pca_gns"
else
local -a ons gns
array_copy ons "LISTOF_${o}_${t}_vars"
array_copy gns "LISTOF_${t}_vars"
array_copy ns ons
array_extendu ns gns
fi
array_upvar "$d" "${ns[@]}"
}
function deploy_copy_attr_values() {
local d="$1" n="$2" o="$3" t="${4:-host}" __pca_ons="$5"
local -a vs ns
local n
if [ -n "$__pca_ons" ]; then
# variables ons déjà préparée par deploy_prepare_copy_attrs()
if array_contains "$__pca_ons" "$n"; then
array_copy vs "${o}_${t}_${n}"
else
array_copy vs "${t}_${n}"
fi
else
local -a ons gns
array_copy ons "LISTOF_${o}_${t}_vars"
array_copy gns "LISTOF_${t}_vars"
if array_contains ons "$n"; then
array_copy vs "${o}_${t}_${n}"
else
array_copy vs "${t}_${n}"
fi
fi
array_upvar "$d" "${vs[@]}"
}
function deploy_is_link() {
# tester si $1 est un type de lien valide
array_contains LISTOF_LINKS "$1"
}
function deploy_copy_links() {
array_upvar "$1" "${LISTOF_LINKS[@]}"
}
function deploy_copy_link_types() {
local d="$1" l="${2:-deploy}"
local -a ts
array_copy ts "LISTOF_${l}_LINKTO"
array_upvar "$d" "${ts[@]}"
}
function deploy_prepare_copy_link_attrs() {
local dpons="$1" dpgns="$2" dons="$3" dgns="$4" o="$5" l="${6:-deploy}" p="$7"
local -a pons pgns ons gns
if [ -n "$p" ]; then
array_copy pons "LISTOF_${p}__${o}_${l}_vars"
array_copy pgns "LISTOF_${p}__${l}_vars"
fi
array_copy ons "LISTOF_${o}_${l}_vars"
array_copy gns "LISTOF_${l}_vars"
upvars \
-a${#pons[*]} "$dpons" "${pons[@]}" \
-a${#pgns[*]} "$dpgns" "${pgns[@]}" \
-a${#ons[*]} "$dons" "${ons[@]}" \
-a${#gns[*]} "$dgns" "${gns[@]}"
}
function deploy_copy_link_attr_names() {
local d="$1" o="$2" l="${3:-deploy}" p="$4"
local __pca_pons="$5" __pca_pgns="$6" __pca_ons="$7" __pca_gns="$8"
local -a ns
if [ -n "$__pca_pons" -a -n "$__pca_pgns" -a -n "$__pca_ons" -a -n "$__pca_gns" ]; then
# variables pons, pgns, ons et gns déjà préparées par la fonction
# deploy_prepare_copy_link_attrs()
array_copy ns "$__pca_pons"
array_extendu ns "$__pca_pgns"
array_extendu ns "$__pca_ons"
array_extendu ns "$__pca_gns"
else
local -a pons pgns ons gns
if [ -n "$p" ]; then
array_copy pons "LISTOF_${p}__${o}_${l}_vars"
array_copy pgns "LISTOF_${p}__${l}_vars"
fi
array_copy ons "LISTOF_${o}_${l}_vars"
array_copy gns "LISTOF_${l}_vars"
array_copy ns pons
array_extendu ns pgns
array_extendu ns ons
array_extendu ns gns
fi
array_upvar "$d" "${ns[@]}"
}
function deploy_copy_link_attr_values() {
local d="$1" n="$2" o="$3" l="${4:-deploy}" p="$5"
local __pca_pons="$6" __pca_pgns="$7" __pca_ons="$8" __pca_gns="$9"
local -a vs ns
local n
if [ -n "$__pca_pons" -a -n "$__pca_pgns" -a -n "$__pca_ons" -a -n "$__pca_gns" ]; then
# variables pons et ons déjà préparées par la fonction
# deploy_prepare_copy_link_attrs()
if array_contains "$__pca_pons" "$n"; then
array_copy vs "${p}__${o}_${l}_${n}"
elif array_contains "$__pca_pgns" "$n"; then
array_copy vs "${p}__${l}_${n}"
elif array_contains "$__pca_ons" "$n"; then
array_copy vs "${o}_${l}_${n}"
else
array_copy vs "${l}_${n}"
fi
else
local -a pons pgns ons gns
if [ -n "$p" ]; then
array_copy pons "LISTOF_${p}__${o}_${l}_vars"
array_copy pgns "LISTOF_${p}__${l}_vars"
fi
array_copy ons "LISTOF_${o}_${l}_vars"
array_copy gns "LISTOF_${l}_vars"
if array_contains pons "$n"; then
array_copy vs "${p}__${o}_${l}_${n}"
elif array_contains pgns "$n"; then
array_copy vs "${p}__${l}_${n}"
elif array_contains ons "$n"; then
array_copy vs "${o}_${l}_${n}"
else
array_copy vs "${l}_${n}"
fi
fi
array_upvar "$d" "${vs[@]}"
}
function deploy_dump_values() {
local -a __dv_vs; array_copy __dv_vs "$2"; local -a vs; array_copy vs __dv_vs
local n="$1" indent="$3"
case ${#vs[*]} in
0) echo "$indent$n=";;
1) echo "$indent$n=$(qvalr "$vs")";;
*) echo "$indent$n=($(qvals "${vs[@]}"))";;
esac
}

View File

@ -15,11 +15,11 @@ function ipcalc_splitipmask() {
# la variable $2(=ip) et le masque, qui est placée dans la variable # la variable $2(=ip) et le masque, qui est placée dans la variable
# $3(=mask) # $3(=mask)
if [[ "$1" == */* ]]; then if [[ "$1" == */* ]]; then
set_var "${2:-ip}" "${1%%/*}" _setv "${2:-ip}" "${1%%/*}"
set_var "${3:-mask}" "${1#*/}" _setv "${3:-mask}" "${1#*/}"
else else
set_var "${2:-ip}" "$1" _setv "${2:-ip}" "$1"
set_var "${3:-mask}" _setv "${3:-mask}"
fi fi
} }
@ -241,7 +241,7 @@ function network_parse_confbr() {
local __npc_destbr; local -a __npc_destifaces local __npc_destbr; local -a __npc_destifaces
__network_parse_confbr "$1" __network_parse_confbr "$1"
set_var "${2:-br}" "$__npc_destbr" _setv "${2:-br}" "$__npc_destbr"
array_copy "${3:-ifaces}" __npc_destifaces array_copy "${3:-ifaces}" __npc_destifaces
} }
@ -265,8 +265,8 @@ function network_parse_confip() {
local __npc_destiface __npc_destgateway; local -a __npc_destipsuffixes local __npc_destiface __npc_destgateway; local -a __npc_destipsuffixes
__network_parse_confip "$1" __network_parse_confip "$1"
set_var "${2:-iface}" "$__npc_destiface" _setv "${2:-iface}" "$__npc_destiface"
set_var "${3:-gateway}" "$__npc_destgateway" _setv "${3:-gateway}" "$__npc_destgateway"
array_copy "${4:-ipsuffixes}" __npc_destipsuffixes array_copy "${4:-ipsuffixes}" __npc_destipsuffixes
} }
@ -339,7 +339,7 @@ function __network_fix_confips() {
eval "local ${iface}_gateway $network; local -a ${iface}_ipsuffixes" eval "local ${iface}_gateway $network; local -a ${iface}_ipsuffixes"
fi fi
if [ -z "${!network}" -a -n "${ipsuffixes[0]}" ]; then if [ -z "${!network}" -a -n "${ipsuffixes[0]}" ]; then
setv "$network" "$(ipcalc_network "${ipsuffixes[0]}")" _setv "$network" "$(ipcalc_network "${ipsuffixes[0]}")"
fi fi
fi fi
done done
@ -390,7 +390,7 @@ function __network_fix_confips() {
# spécifier la passerelle: elle sera fournie par le serveur DHCP. # spécifier la passerelle: elle sera fournie par le serveur DHCP.
# Utiliser le marqueur "none" pour que la valeur ne soit pas modifiée. # Utiliser le marqueur "none" pour que la valeur ne soit pas modifiée.
[ "${ipsuffixes[0]}" == "dhcp" ] && gateway=none [ "${ipsuffixes[0]}" == "dhcp" ] && gateway=none
set_var "${iface}_gateway" "$gateway" _setv "${iface}_gateway" "$gateway"
done done
# puis construire le tableau final # puis construire le tableau final
array_new confips array_new confips

View File

@ -44,9 +44,9 @@ function read_property() {
__rp_name="${2//./_}" __rp_name="${2//./_}"
fi fi
if [ -n "$__rp_found" ]; then if [ -n "$__rp_found" ]; then
set_var "$__rp_name" "$(tooenc "$__rp_value" "$LATIN1")" _setv "$__rp_name" "$(tooenc "$__rp_value" "$LATIN1")"
else else
set_var "$__rp_name" "$4" _setv "$__rp_name" "$4"
fi fi
} }

View File

@ -77,33 +77,33 @@ function split_ldapuri() {
local ldapuri="$1" protoname="${2:-proto}" hostname="${3:-host}" portname="${4:-port}" local ldapuri="$1" protoname="${2:-proto}" hostname="${3:-host}" portname="${4:-port}"
local tmp local tmp
if [ -z "$ldapuri" ]; then if [ -z "$ldapuri" ]; then
set_var "$protoname" "" _setv "$protoname" ""
set_var "$hostname" "" _setv "$hostname" ""
set_var "$portname" "" _setv "$portname" ""
return 0 return 0
fi fi
tmp="$ldapuri" tmp="$ldapuri"
if [ "${tmp#ldap://}" != "$tmp" ]; then if [ "${tmp#ldap://}" != "$tmp" ]; then
set_var "$protoname" ldap _setv "$protoname" ldap
tmp="${tmp#ldap://}" tmp="${tmp#ldap://}"
elif [ "${tmp#ldaps://}" != "$tmp" ]; then elif [ "${tmp#ldaps://}" != "$tmp" ]; then
set_var "$protoname" ldaps _setv "$protoname" ldaps
tmp="${tmp#ldaps://}" tmp="${tmp#ldaps://}"
elif [ "${tmp#ldapi://}" != "$tmp" ]; then elif [ "${tmp#ldapi://}" != "$tmp" ]; then
set_var "$protoname" ldapi _setv "$protoname" ldapi
tmp="${tmp#ldapi://}" tmp="${tmp#ldapi://}"
else else
set_var "$protoname" "" _setv "$protoname" ""
set_var "$hostname" "" _setv "$hostname" ""
set_var "$portname" "" _setv "$portname" ""
eerror "invalid ldapuri: $ldapuri" eerror "invalid ldapuri: $ldapuri"
return 1 return 1
fi fi
tmp="${tmp%%/*}" tmp="${tmp%%/*}"
local tmphost="${tmp%%:*}" local tmphost="${tmp%%:*}"
set_var "$hostname" "$tmphost" _setv "$hostname" "$tmphost"
tmp="${tmp#$tmphost}" tmp="${tmp#$tmphost}"
set_var "$portname" "${tmp#:}" _setv "$portname" "${tmp#:}"
return 0 return 0
} }

View File

@ -422,7 +422,7 @@ BEGIN {
let i=0 let i=0
for value in "$@"; do for value in "$@"; do
script="$script script="$script
values[$i] = $(quoted_awk "$value")" values[$i] = $(qawk "$value")"
let i=$i+1 let i=$i+1
done done
script="$script script="$script
@ -450,13 +450,13 @@ function print_values() {
} }
BEGIN { BEGIN {
add=0 add=0
attr=fix_attr($(quoted_awk "$attr")) attr=fix_attr($(qawk "$attr"))
count=$#" count=$#"
local i value local i value
let i=0 let i=0
for value in "$@"; do for value in "$@"; do
script="$script script="$script
values[$i] = $(quoted_awk "$value")" values[$i] = $(qawk "$value")"
let i=$i+1 let i=$i+1
done done
script="$script script="$script
@ -505,13 +505,13 @@ function print_values() {
BEGIN { BEGIN {
add = 0 add = 0
found = 0 found = 0
attr = fix_attr($(quoted_awk "$attr")) attr = fix_attr($(qawk "$attr"))
count = $#" count = $#"
local i value local i value
let i=0 let i=0
for value in "$@"; do for value in "$@"; do
script="$script script="$script
values[$i] = $(quoted_awk "$value")" values[$i] = $(qawk "$value")"
let i=$i+1 let i=$i+1
done done
script="$script script="$script
@ -539,13 +539,13 @@ function tl_ensureval() {
local script="$(def_match_attr "$attr") local script="$(def_match_attr "$attr")
BEGIN { BEGIN {
resetp() resetp()
attr = fix_attr($(quoted_awk "$attr")) attr = fix_attr($(qawk "$attr"))
ensure_count = $#" ensure_count = $#"
local i value local i value
let i=0 let i=0
for value in "$@"; do for value in "$@"; do
script="$script script="$script
ensure_values[$i] = $(quoted_awk "$value")" ensure_values[$i] = $(qawk "$value")"
let i=$i+1 let i=$i+1
done done
script="$script script="$script
@ -1330,7 +1330,7 @@ function get_transform_cmd() {
shift shift
continue continue
fi fi
cmd="${cmd:+"$cmd "}$(quoted_arg "$1")" cmd="${cmd:+"$cmd "}$(qvalm "$1")"
shift shift
done done
[ -n "$cmd" ] && cmds=("${cmds[@]}" "$cmd") [ -n "$cmd" ] && cmds=("${cmds[@]}" "$cmd")
@ -1427,7 +1427,7 @@ function get_transform_cmd() {
;; ;;
esac esac
[ -n "$auto_uncut" ] && dest="${dest:+"$dest | "}"'uncut_lines' [ -n "$auto_uncut" ] && dest="${dest:+"$dest | "}"'uncut_lines'
dest="${dest:+"$dest | "}$(quoted_args "${cmdparts[@]}")" dest="${dest:+"$dest | "}$(qvals "${cmdparts[@]}")"
[ -n "$xempty" ] && dest="${dest:+"$dest | "}"'ensure_complete_objects' [ -n "$xempty" ] && dest="${dest:+"$dest | "}"'ensure_complete_objects'
[ -n "$xdel" ] && dest="${dest:+"$dest | "}"'delete_marked_objects' [ -n "$xdel" ] && dest="${dest:+"$dest | "}"'delete_marked_objects'
first= first=

View File

@ -45,7 +45,7 @@ function file_get_vars() {
while [ -n "$1" ]; do while [ -n "$1" ]; do
var_="$1"; shift var_="$1"; shift
vars_="${vars_:+$vars_ }$var_" vars_="${vars_:+$vars_ }$var_"
set_var "$var_" "$1"; shift _setv "$var_" "$1"; shift
done done
# puis parcourir le fichier pour initialiser la valeur définitive des # puis parcourir le fichier pour initialiser la valeur définitive des
@ -258,13 +258,13 @@ function file_get_java_properties() {
awkre_var_="${var_//./\\.}" # nom de la variable pour une expression régulière awk awkre_var_="${var_//./\\.}" # nom de la variable pour une expression régulière awk
# initialiser la valeur par défaut # initialiser la valeur par défaut
set_var "$sh_var_" "$1"; shift _setv "$sh_var_" "$1"; shift
# et créer le script qui affichera sa valeur # et créer le script qui affichera sa valeur
script="$script"' script="$script"'
$0 ~ "^[ \t]*'"$(quote_awk "$awkre_var_")"'=" { $0 ~ "^[ \t]*'"$(_qawk "$awkre_var_")"'=" {
# enlever les caractères de début # enlever les caractères de début
sub("^[ \t]*'"$(quote_awk "$awkre_var_")"'=", "") sub("^[ \t]*'"$(_qawk "$awkre_var_")"'=", "")
value = $0 value = $0
# éventuellement ajouter les lignes de continuation # éventuellement ajouter les lignes de continuation
while (substr(value, length(value), 1) == "\\") { while (substr(value, length(value), 1) == "\\") {
@ -439,7 +439,7 @@ function file_get_xml_properties() {
awkre_var_="${var_//./\\.}" # nom de la variable pour une expression régulière awk awkre_var_="${var_//./\\.}" # nom de la variable pour une expression régulière awk
# initialiser la valeur par défaut # initialiser la valeur par défaut
set_var "$sh_var_" "$1"; shift _setv "$sh_var_" "$1"; shift
# et créer le script qui affichera sa valeur # et créer le script qui affichera sa valeur
script="$script"' script="$script"'

View File

@ -9,6 +9,10 @@ urequire base
# Configuration # Configuration
function __runs_initt() { function __runs_initt() {
# Ne pas oublier de mettre à jour templates/runsconfig si les modèles de
# cette fonction sont modifiés. XXX utiliser le module template pour
# utiliser le contenu du template sur le système de fichiers au lieu de
# dupliquer l'information.
if is_yes "$verbose"; then if is_yes "$verbose"; then
rscriptt="# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 rscriptt="# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
desc \"CHANGEME: Description du script $rscriptname\" desc \"CHANGEME: Description du script $rscriptname\"
@ -50,7 +54,11 @@ $sysinfos_data"
# Ce fichier contient la liste des script à lancer avec le compte root pour # Ce fichier contient la liste des script à lancer avec le compte root pour
# configurer $host # configurer $host
# Chaque ligne contient le nom du script suivi des arguments éventuels # Chaque ligne contient le nom du script suivi des arguments éventuels
#generic-base #---Ne garder que la ligne correspondant au type d'hôte. ur=1 pour les hôtes de l'université
#jessie-base ur=1
#ol6-base ur=1
#ol7-base ur=1
#---
#@services #@services
#@config" #@config"
configt="# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 configt="# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
@ -902,7 +910,7 @@ function runs_initworkdir() {
cp "$RUNSSRCDIR/uinst" "$RUNSEXPORTDIR" cp "$RUNSSRCDIR/uinst" "$RUNSEXPORTDIR"
# faire les scripts # faire les scripts
args_def="args=($(quoted_args ./runs --runsscriptspath "$RUNSSCRIPTSPATH" --runsmodulespath "$RUNSMODULESPATH" --runshostspath "$RUNSHOSTSPATH" --runsexportdir . --runsvarsfile varsfile -h "$RUNSHOST" ${RUNSRESET:+-z}))" args_def="args=($(qvals ./runs --runsscriptspath "$RUNSSCRIPTSPATH" --runsmodulespath "$RUNSMODULESPATH" --runshostspath "$RUNSHOSTSPATH" --runsexportdir . --runsvarsfile varsfile -h "$RUNSHOST" ${RUNSRESET:+-z}))"
echo '#!/bin/bash echo '#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
cd "$(dirname "$0")" cd "$(dirname "$0")"
@ -931,7 +939,7 @@ exit 0
array_from_path runsdirs "${!runspath}" array_from_path runsdirs "${!runspath}"
array_map runsdirs abspath array_map runsdirs abspath
array_map runsdirs __runs_add_runsroot array_map runsdirs __runs_add_runsroot
set_var "$runspath" "$(array_join runsdirs :)" _setv "$runspath" "$(array_join runsdirs :)"
done done
# XXX quelles autres variables doivent être corrigées? # XXX quelles autres variables doivent être corrigées?
# XXX ==> il faut rajouter rscripts et recipes # XXX ==> il faut rajouter rscripts et recipes
@ -987,11 +995,11 @@ function __runs_check_notref() {
} }
function __runs_splitref() { function __runs_splitref() {
if [[ "$1" == *=* ]]; then if [[ "$1" == *=* ]]; then
set_var "${2:-__name}" "${1%%=*}" _setv "${2:-__name}" "${1%%=*}"
set_var "${3:-__value}" "${1#*=}" _setv "${3:-__value}" "${1#*=}"
else else
set_var "${2:-__name}" "$1" _setv "${2:-__name}" "$1"
set_var "${3:-__value}" "$1" _setv "${3:-__value}" "$1"
fi fi
} }
@ -1038,7 +1046,7 @@ function runs_var() {
array_set RUNSVARS "$__name" array_set RUNSVARS "$__name"
array_del RUNSARRAYS "$__name" array_del RUNSARRAYS "$__name"
array_set RUNSVARSINDIRECT "$__name" array_set RUNSVARSINDIRECT "$__name"
set_var "$__name" "$__value" _setv "$__name" "$__value"
fi fi
elif [[ "$1" == *@=* ]]; then elif [[ "$1" == *@=* ]]; then
__name="${1%%@=*}" __name="${1%%@=*}"
@ -1047,7 +1055,7 @@ function runs_var() {
array_set RUNSVARS "$__name" array_set RUNSVARS "$__name"
array_set RUNSARRAYS "$__name" array_set RUNSARRAYS "$__name"
array_set RUNSVARSINDIRECT "$__name" array_set RUNSVARSINDIRECT "$__name"
set_var "$__name" "$__value" _setv "$__name" "$__value"
fi fi
elif [[ "$1" == *=* ]]; then elif [[ "$1" == *=* ]]; then
__name="${1%%=*}" __name="${1%%=*}"
@ -1056,12 +1064,12 @@ function runs_var() {
array_set RUNSVARS "$__name" array_set RUNSVARS "$__name"
array_del RUNSARRAYS "$__name" array_del RUNSARRAYS "$__name"
array_del RUNSVARSINDIRECT "$__name" array_del RUNSVARSINDIRECT "$__name"
set_var "$__name" "$__value" _setv "$__name" "$__value"
fi fi
else else
break break
fi fi
[ -n "$RUNSVARDESC" ] && set_var "RUNSVARDESC_$__name" "$RUNSVARDESC" [ -n "$RUNSVARDESC" ] && _setv "RUNSVARDESC_$__name" "$RUNSVARDESC"
shift shift
done done
# variables tableau # variables tableau
@ -1141,12 +1149,12 @@ function runs_set_lang() {
if check_sysinfos -d debianlike; then if check_sysinfos -d debianlike; then
eval "$(LANG= eval "$(LANG=
source_ifexists /etc/default/locale source_ifexists /etc/default/locale
set_var_cmd LANG "$LANG" echo_setv LANG "$LANG"
)" )"
elif check_sysinfos -d redhatlike; then elif check_sysinfos -d redhatlike; then
eval "$(LANG= eval "$(LANG=
source_ifexists /etc/locale.conf source_ifexists /etc/locale.conf
set_var_cmd LANG "$LANG" echo_setv LANG "$LANG"
)" )"
fi fi
export LANG export LANG
@ -1160,9 +1168,9 @@ function runs_set_proxy() {
if check_sysinfos -d debianlike; then if check_sysinfos -d debianlike; then
eval "$(http_proxy=; ftp_proxy=; no_proxy= eval "$(http_proxy=; ftp_proxy=; no_proxy=
source_ifexists /etc/environment source_ifexists /etc/environment
set_var_cmd http_proxy "$http_proxy" echo_setv http_proxy "$http_proxy"
set_var_cmd ftp_proxy "$ftp_proxy" echo_setv ftp_proxy "$ftp_proxy"
set_var_cmd no_proxy "$no_proxy" echo_setv no_proxy "$no_proxy"
)" )"
fi fi
export http_proxy ftp_proxy no_proxy export http_proxy ftp_proxy no_proxy
@ -1215,7 +1223,7 @@ function runs_after() {
if array_contains RUNSARRAYS "$__var"; then if array_contains RUNSARRAYS "$__var"; then
eval "array_copy __tmp $__var; local -a $__var; array_copy $__var __tmp" eval "array_copy __tmp $__var; local -a $__var; array_copy $__var __tmp"
else else
eval "set_var __tmp \"\${!__var}\"; local $__var; $__var=\"\$__tmp\"" eval "_setv __tmp \"\${!__var}\"; local $__var; $__var=\"\$__tmp\""
fi fi
done done
runs_clvars "${RUNSCLVARS[@]}" runs_clvars "${RUNSCLVARS[@]}"
@ -1229,7 +1237,7 @@ function runs_after() {
if [[ "$__arg" == *!=* ]]; then if [[ "$__arg" == *!=* ]]; then
__name="${__arg%%!=*}" __name="${__arg%%!=*}"
__value="${__arg#*!=}" __value="${__arg#*!=}"
__args=("${__args[@]}" "$__name=$(quoted_arg "${!__value}")") __args=("${__args[@]}" "$__name=$(qvalm "${!__value}")")
elif [[ "$__arg" == *@=* ]]; then elif [[ "$__arg" == *@=* ]]; then
__name="${__arg%%@=*}" __name="${__arg%%@=*}"
__value="${__arg#*@=}[@]" __value="${__arg#*@=}[@]"
@ -1293,7 +1301,7 @@ function runs_indvars() {
else else
# variable scalaire # variable scalaire
__ind="${!__var}" __ind="${!__var}"
set_var "$__var" "${!__ind}" _setv "$__var" "${!__ind}"
fi fi
done done
RUNSVARSINDIRECT=() RUNSVARSINDIRECT=()
@ -1306,7 +1314,7 @@ function runs_clvars_cmd() {
__vars=() __vars=()
while [ -n "$1" ]; do while [ -n "$1" ]; do
if [ "$1" == ";" ]; then if [ "$1" == ";" ]; then
echo "$__prefix$(quoted_args "${__vars[@]}")" echo "$__prefix$(qvals "${__vars[@]}")"
__vars=() __vars=()
__prefix=" " __prefix=" "
else else
@ -1314,7 +1322,7 @@ function runs_clvars_cmd() {
fi fi
shift shift
done done
[ -n "${__vars[*]}" ] && echo "$__prefix$(quoted_args "${__vars[@]}")" [ -n "${__vars[*]}" ] && echo "$__prefix$(qvals "${__vars[@]}")"
} }
function runs_loadconfs() { function runs_loadconfs() {
@ -1450,10 +1458,10 @@ function runs_action_dump() {
eval "__count=\"\${#$__var[@]}\"" eval "__count=\"\${#$__var[@]}\""
if [ "$__count" -eq 1 ]; then if [ "$__count" -eq 1 ]; then
# variable scalaire # variable scalaire
eecho "$__var=$(quoted_args "${!__values}")" eecho "$__var=$(qvals "${!__values}")"
else else
# variable tableau # variable tableau
eecho "$__var=($(quoted_args "${!__values}"))" eecho "$__var=($(qvals "${!__values}"))"
fi fi
done done
exit 0 exit 0
@ -1527,7 +1535,7 @@ function runs_action_run() {
# configuration dans le fichier $__shellconf # configuration dans le fichier $__shellconf
__runs_check_varname "$__refvarname" || die __runs_check_varname "$__refvarname" || die
set_var "$__refvarname" "" _setv "$__refvarname" ""
splitwcs "$__shellconf" __tmpconf __wildconf splitwcs "$__shellconf" __tmpconf __wildconf
if [ -n "$__wildconf" ]; then if [ -n "$__wildconf" ]; then
@ -1630,7 +1638,7 @@ function runs_action_run() {
runs_indvars runs_indvars
for __name in "${RUNSVARS[@]}"; do for __name in "${RUNSVARS[@]}"; do
__value="$(array_join "$__name" ":")" __value="$(array_join "$__name" ":")"
__vars=("${__vars[@]}" "$(set_var_cmd "$__name" "$__value")") __vars=("${__vars[@]}" "$(echo_setv "$__name" "$__value")")
done done
if [ -n "$RUNS_REMOTE_SET_Y" ]; then if [ -n "$RUNS_REMOTE_SET_Y" ]; then
@ -1716,7 +1724,7 @@ function runs_action_export() {
# configuration dans le fichier $__shellconf # configuration dans le fichier $__shellconf
__runs_check_varname "$__refvarname" || die __runs_check_varname "$__refvarname" || die
set_var "$__refvarname" "" _setv "$__refvarname" ""
splitwcs "$__shellconf" __tmpconf __wildconf splitwcs "$__shellconf" __tmpconf __wildconf
if [ -n "$__wildconf" ]; then if [ -n "$__wildconf" ]; then
@ -1826,7 +1834,7 @@ function runs_action_export() {
for __shellvar in "${__shellvars[@]}"; do for __shellvar in "${__shellvars[@]}"; do
# s'assurer que la variables sont vides # s'assurer que la variables sont vides
# avant de sourcer $__shellconf # avant de sourcer $__shellconf
set_var "$__shellvar" _setv "$__shellvar"
done done
source "$__shellconf" source "$__shellconf"
for __shellvar in "${__shellvars[@]}"; do for __shellvar in "${__shellvars[@]}"; do

File diff suppressed because it is too large Load Diff

View File

@ -270,8 +270,8 @@ function __fix_sysinfos_upward() {
array_copy sysvers_ "${sysdist_}_SYSVERS" array_copy sysvers_ "${sysdist_}_SYSVERS"
for sysver_ in "${sysvers_[@]}"; do for sysver_ in "${sysvers_[@]}"; do
if [ "$sysver_" == "${!sysvervar_}" ]; then if [ "$sysver_" == "${!sysvervar_}" ]; then
set_var "$sysdistvar_" "$sysdist_" _setv "$sysdistvar_" "$sysdist_"
set_var "$sysnamevar_" "$sysname_" _setv "$sysnamevar_" "$sysname_"
return return
fi fi
done done
@ -284,7 +284,7 @@ function __fix_sysinfos_upward() {
array_copy sysdists_ "${sysname_}_SYSDISTS" array_copy sysdists_ "${sysname_}_SYSDISTS"
for sysdist_ in "${sysdists_[@]}"; do for sysdist_ in "${sysdists_[@]}"; do
if [ "$sysdist_" == "${!sysdistvar_}" ]; then if [ "$sysdist_" == "${!sysdistvar_}" ]; then
set_var "$sysnamevar_" "$sysname_" _setv "$sysnamevar_" "$sysname_"
return return
fi fi
done done
@ -301,7 +301,7 @@ function __fix_sysinfos_downward() {
# essayer de déterminer !sysdistvar_ à partir de !sysnamevar_ # essayer de déterminer !sysdistvar_ à partir de !sysnamevar_
array_copy sysdists_ "${!sysnamevar_}_SYSDISTS" array_copy sysdists_ "${!sysnamevar_}_SYSDISTS"
for sysdist_ in "${sysdists_[@]}"; do for sysdist_ in "${sysdists_[@]}"; do
set_var "$sysdistvar_" "$sysdist_" _setv "$sysdistvar_" "$sysdist_"
break break
done done
fi fi
@ -311,7 +311,7 @@ function __fix_sysinfos_downward() {
# essayer de déterminer !sysvervar_ à partir de !sysdistvar_ # essayer de déterminer !sysvervar_ à partir de !sysdistvar_
array_copy sysvers_ "${sysdistvar_}_SYSVERS" array_copy sysvers_ "${sysdistvar_}_SYSVERS"
for sysver_ in "${sysvers_[@]}"; do for sysver_ in "${sysvers_[@]}"; do
set_var "$sysvervar_" "$sysver_" _setv "$sysvervar_" "$sysver_"
break break
done done
fi fi
@ -325,8 +325,8 @@ function ensure_sysinfos() {
local sysnamevar_="${1:-SYSNAME}" local sysnamevar_="${1:-SYSNAME}"
local sysdistvar_="${2:-SYSDIST}" local sysdistvar_="${2:-SYSDIST}"
local sysvervar_="${3:-SYSVER}" local sysvervar_="${3:-SYSVER}"
[ -n "${!sysdistvar_}" ] && set_var "$sysdistvar_" "$(__get_sysdist_alias "${!sysdistvar_}")" [ -n "${!sysdistvar_}" ] && _setv "$sysdistvar_" "$(__get_sysdist_alias "${!sysdistvar_}")"
[ -n "${!sysvervar_}" ] && set_var "$sysvervar_" "$(__get_sysver_alias "${!sysvervar_}")" [ -n "${!sysvervar_}" ] && _setv "$sysvervar_" "$(__get_sysver_alias "${!sysvervar_}")"
__fix_sysinfos_upward __fix_sysinfos_upward
__fix_sysinfos_downward __fix_sysinfos_downward
} }

View File

@ -2,6 +2,10 @@
# Ce fichier contient la liste des script à lancer avec le compte root pour # Ce fichier contient la liste des script à lancer avec le compte root pour
# configurer @@host@@ # configurer @@host@@
# Chaque ligne contient le nom du script suivi des arguments éventuels # Chaque ligne contient le nom du script suivi des arguments éventuels
#generic-base #---Ne garder que la ligne correspondant au type d'hôte. ur=1 pour les hôtes de l'université
#jessie-base ur=1
#ol6-base ur=1
#ol7-base ur=1
#---
#@services #@services
#@config #@config

View File

@ -35,8 +35,8 @@ function udir_dump() {
local udirf="$(abspath "${1:-.}")" local udirf="$(abspath "${1:-.}")"
[ -d "$udirf" ] && udirf="$udirf/.udir" [ -d "$udirf" ] && udirf="$udirf/.udir"
if [ -f "$udirf" ]; then if [ -f "$udirf" ]; then
set_var_cmd udir "$(dirname "$udirf")" echo_setv udir "$(dirname "$udirf")"
set_var_cmd udirf "$udirf" echo_setv udirf "$udirf"
<"$udirf" filter_comment -m <"$udirf" filter_comment -m
fi fi
} }
@ -140,11 +140,11 @@ function udir_update() {
for param in "$@"; do for param in "$@"; do
name="${param%%=*}" name="${param%%=*}"
script="$script script="$script
names[$i] = $(quoted_awk "$name")" names[$i] = $(qawk "$name")"
if [ "$name" != "$param" ]; then if [ "$name" != "$param" ]; then
value="${param#*=}" value="${param#*=}"
script="$script script="$script
values[$i] = $(quoted_awk "$value")" values[$i] = $(qawk "$value")"
else else
script="$script script="$script
values[$i] = \"\"" values[$i] = \"\""

View File

@ -290,7 +290,7 @@ Utilisez 'udir -e $(ppath "$srcdir")' pour modifier les paramètres qui ont ét
__uinst_migrate_legacy "$srcdir" __uinst_migrate_legacy "$srcdir"
__uinst_varcmds=() __uinst_varcmds=()
for __uinst_v in "${UDIR_VARS[@]}"; do for __uinst_v in "${UDIR_VARS[@]}"; do
__uinst_varcmds=("${__uinst_varcmds[@]}" "$(set_var_cmd "$__uinst_v" "${!__uinst_v}")") __uinst_varcmds=("${__uinst_varcmds[@]}" "$(echo_setv "$__uinst_v" "${!__uinst_v}")")
done done
for __uinst_a in "${UDIR_ARRAYS[@]}"; do for __uinst_a in "${UDIR_ARRAYS[@]}"; do
__uinst_varcmds=("${__uinst_varcmds[@]}" "$(set_array_cmd "$__uinst_a")") __uinst_varcmds=("${__uinst_varcmds[@]}" "$(set_array_cmd "$__uinst_a")")
@ -310,7 +310,7 @@ Utilisez 'udir -e $(ppath "$srcdir")' pour modifier les paramètres qui ont ét
local udir_desc udir_note udir_types local udir_desc udir_note udir_types
local profiles conf rootconf ulibsync copy_files local profiles conf rootconf ulibsync copy_files
eval "$(udir_eval "$srcdir" 'set_var_cmd udir_desc "$udir_desc"; set_var_cmd udir_note "$udir_note"')" eval "$(udir_eval "$srcdir" 'echo_setv udir_desc "$udir_desc"; echo_setv udir_note "$udir_note"')"
etitle "Description du projet" etitle "Description du projet"
check_interaction -c && estepn "La description courte de l'objet de ce projet est affichée avec udir -i" check_interaction -c && estepn "La description courte de l'objet de ce projet est affichée avec udir -i"
@ -319,7 +319,7 @@ Utilisez 'udir -e $(ppath "$srcdir")' pour modifier les paramètres qui ont ét
Elle peut être utilisée pour diriger le visiteur vers des informations importantes." Elle peut être utilisée pour diriger le visiteur vers des informations importantes."
read_value "Entrez une note associée au répertoire de ce projet" udir_note "$udir_note" N read_value "Entrez une note associée au répertoire de ce projet" udir_note "$udir_note" N
eend eend
udir_update "$srcdir" "udir_desc=$(quoted_arg "$udir_desc")" "udir_note=$(quoted_arg "$udir_note")" udir_update "$srcdir" "udir_desc=$(qval "$udir_desc")" "udir_note=$(qval "$udir_note")"
estepn "La configuration par défaut permet de créer un projet qui utilise les outils et librairies de nutools. estepn "La configuration par défaut permet de créer un projet qui utilise les outils et librairies de nutools.
Ce projet pourra ensuite être installé avec uinst" Ce projet pourra ensuite être installé avec uinst"
@ -351,7 +351,7 @@ Ce projet pourra ensuite être installé avec uinst"
mkdirof "$genfile" mkdirof "$genfile"
[ -f "$genfile" ] || echo '# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 [ -f "$genfile" ] || echo '# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
__uaddpath "@@dest@@" PATH' >"$genfile" __uaddpath "@@dest@@" PATH' >"$genfile"
udir_update "$srcdir" "configure_dest_for=($(quoted_arg "${genfile#"$srcdir/"}"))" udir_update "$srcdir" "configure_dest_for=($(qvalm "${genfile#"$srcdir/"}"))"
fi fi
if [ -n "$conf" ]; then if [ -n "$conf" ]; then
genfile="$srcdir/lib/uinst/conf" genfile="$srcdir/lib/uinst/conf"
@ -525,12 +525,12 @@ function __uinst_addvarnf() {
eerror "La variable $1 est protégée" eerror "La variable $1 est protégée"
return 1 return 1
else else
array_add UINST_CONFIG_VARCMDS "$(set_var_cmd "$1" "$2")" array_add UINST_CONFIG_VARCMDS "$(echo_setv "$1" "$2")"
set_var "$1" "$2" _setv "$1" "$2"
if [ "$1" == "MYHOST" ]; then if [ "$1" == "MYHOST" ]; then
# cas particulier: initialiser aussi MYHOSTNAME # cas particulier: initialiser aussi MYHOSTNAME
set_var "MYHOSTNAME" "${2%%.*}" _setv "MYHOSTNAME" "${2%%.*}"
array_add UINST_CONFIG_VARCMDS "$(set_var_cmd "MYHOSTNAME" "$MYHOSTNAME")" array_add UINST_CONFIG_VARCMDS "$(echo_setv "MYHOSTNAME" "$MYHOSTNAME")"
fi fi
return 0 return 0
fi fi
@ -683,7 +683,7 @@ function __uinst_prepare_conf() {
# prepare_name=$srcdir # prepare_name=$srcdir
# srcdir est un chemin relatif à $UINST_PREPARE_DIR (si la source était une # srcdir est un chemin relatif à $UINST_PREPARE_DIR (si la source était une
# archive, il est possible que ce chemin soit en plusieurs parties # archive, il est possible que ce chemin soit en plusieurs parties
set_var_cmd prepare_name "$(relpath "$srcdir" "$UINST_PREPARE_DIR")" >"$UINST_PREPARE_CONF" echo_setv prepare_name "$(relpath "$srcdir" "$UINST_PREPARE_DIR")" >"$UINST_PREPARE_CONF"
} }
################################################################################ ################################################################################
@ -796,28 +796,28 @@ function __uinst_udir2s() {
__uinst_config="$__uinst_configdir/config" __uinst_config="$__uinst_configdir/config"
__uinst_abort="$__uinst_configdir/abort" __uinst_abort="$__uinst_configdir/abort"
__uinst_updateconfig="$__uinst_configdir/updateconfig" __uinst_updateconfig="$__uinst_configdir/updateconfig"
set_var_cmd ABORT "$__uinst_abort" >>"$__uinst_config" echo_setv ABORT "$__uinst_abort" >>"$__uinst_config"
set_var_cmd CONFIG "$__uinst_updateconfig" >>"$__uinst_config" echo_setv CONFIG "$__uinst_updateconfig" >>"$__uinst_config"
set_var_cmd __verbosity "$__verbosity" >>"$__uinst_config" echo_setv __verbosity "$__verbosity" >>"$__uinst_config"
set_var_cmd __interaction "$__interaction" >>"$__uinst_config" echo_setv __interaction "$__interaction" >>"$__uinst_config"
for __uinst_var in "${__uinst_vars[@]}"; do for __uinst_var in "${__uinst_vars[@]}"; do
set_var_cmd "$__uinst_var" "${!__uinst_var}" >>"$__uinst_config" echo_setv "$__uinst_var" "${!__uinst_var}" >>"$__uinst_config"
done done
for __uinst_var in "${__uinst_arrays[@]}"; do for __uinst_var in "${__uinst_arrays[@]}"; do
set_array_cmd "$__uinst_var" >>"$__uinst_config" set_array_cmd "$__uinst_var" >>"$__uinst_config"
done done
set_var_cmd "UINST_LOCAL_PROFILES" "$UINST_LOCAL_PROFILES" >>"$__uinst_config" echo_setv "UINST_LOCAL_PROFILES" "$UINST_LOCAL_PROFILES" >>"$__uinst_config"
set_var_cmd "UINST_ISTMPDIR" "$UINST_ISTMPDIR" >>"$__uinst_config" echo_setv "UINST_ISTMPDIR" "$UINST_ISTMPDIR" >>"$__uinst_config"
set_var_cmd "UINST_ORIGSRC" "$UINST_ORIGSRC" >>"$__uinst_config" echo_setv "UINST_ORIGSRC" "$UINST_ORIGSRC" >>"$__uinst_config"
set_var_cmd "UINST_SRCDIR" "$UINST_SRCDIR" >>"$__uinst_config" echo_setv "UINST_SRCDIR" "$UINST_SRCDIR" >>"$__uinst_config"
set_var_cmd "ULIBDIR" "$ULIBDIR" >>"$__uinst_config" echo_setv "ULIBDIR" "$ULIBDIR" >>"$__uinst_config"
set_var_cmd "UINST" "$UINST" >>"$__uinst_config" echo_setv "UINST" "$UINST" >>"$__uinst_config"
# ulib recalcule systématiquement la valeur de ULIBDIR. Pareil pour # ulib recalcule systématiquement la valeur de ULIBDIR. Pareil pour
# pyulib/pyulib. Mais cela ne fonctionne pas si nous déployons sur une # pyulib/pyulib. Mais cela ne fonctionne pas si nous déployons sur une
# machine avec bash 2.x. Il faut donc forcer l'utilisation de la valeur # machine avec bash 2.x. Il faut donc forcer l'utilisation de la valeur
# calculée. # calculée.
set_var_cmd "FORCED_ULIBDIR" "$ULIBDIR" >>"$__uinst_config" echo_setv "FORCED_ULIBDIR" "$ULIBDIR" >>"$__uinst_config"
set_var_cmd "FORCED_PYULIBDIR" "$PYULIBDIR" >>"$__uinst_config" echo_setv "FORCED_PYULIBDIR" "$PYULIBDIR" >>"$__uinst_config"
## Lancer les scripts de préconfiguration ## Lancer les scripts de préconfiguration
function __uinst_preconfig_scripts() { function __uinst_preconfig_scripts() {
@ -1241,13 +1241,13 @@ function __uinst_python() {
local __uinst_config __uinst_var local __uinst_config __uinst_var
ac_set_tmpfile __uinst_config ac_set_tmpfile __uinst_config
for __uinst_var in srcdir; do for __uinst_var in srcdir; do
set_var_cmd "$__uinst_var" "${!__uinst_var}" >>"$__uinst_config" echo_setv "$__uinst_var" "${!__uinst_var}" >>"$__uinst_config"
done done
set_var_cmd "UINST_ISTMPDIR" "$UINST_ISTMPDIR" >>"$__uinst_config" echo_setv "UINST_ISTMPDIR" "$UINST_ISTMPDIR" >>"$__uinst_config"
set_var_cmd "UINST_ORIGSRC" "$UINST_ORIGSRC" >>"$__uinst_config" echo_setv "UINST_ORIGSRC" "$UINST_ORIGSRC" >>"$__uinst_config"
set_var_cmd "UINST_SRCDIR" "$UINST_SRCDIR" >>"$__uinst_config" echo_setv "UINST_SRCDIR" "$UINST_SRCDIR" >>"$__uinst_config"
set_var_cmd "ULIBDIR" "$ULIBDIR" >>"$__uinst_config" echo_setv "ULIBDIR" "$ULIBDIR" >>"$__uinst_config"
set_var_cmd "UINST" "$UINST" >>"$__uinst_config" echo_setv "UINST" "$UINST" >>"$__uinst_config"
runscript_as_root "$uinst2s" "$__uinst_config" runscript_as_root "$uinst2s" "$__uinst_config"
} }
@ -1354,16 +1354,16 @@ function __uinst_file() {
local __uinst_config __uinst_var local __uinst_config __uinst_var
ac_set_tmpfile __uinst_config ac_set_tmpfile __uinst_config
for __uinst_var in copy_files destdir srcdir owner modes; do for __uinst_var in copy_files destdir srcdir owner modes; do
set_var_cmd "$__uinst_var" "${!__uinst_var}" >>"$__uinst_config" echo_setv "$__uinst_var" "${!__uinst_var}" >>"$__uinst_config"
done done
for __uinst_var in files modes; do for __uinst_var in files modes; do
set_array_cmd "$__uinst_var" >>"$__uinst_config" set_array_cmd "$__uinst_var" >>"$__uinst_config"
done done
set_var_cmd "UINST_ISTMPDIR" "$UINST_ISTMPDIR" >>"$__uinst_config" echo_setv "UINST_ISTMPDIR" "$UINST_ISTMPDIR" >>"$__uinst_config"
set_var_cmd "UINST_ORIGSRC" "$UINST_ORIGSRC" >>"$__uinst_config" echo_setv "UINST_ORIGSRC" "$UINST_ORIGSRC" >>"$__uinst_config"
set_var_cmd "UINST_SRCDIR" "$UINST_SRCDIR" >>"$__uinst_config" echo_setv "UINST_SRCDIR" "$UINST_SRCDIR" >>"$__uinst_config"
set_var_cmd "ULIBDIR" "$ULIBDIR" >>"$__uinst_config" echo_setv "ULIBDIR" "$ULIBDIR" >>"$__uinst_config"
set_var_cmd "UINST" "$UINST" >>"$__uinst_config" echo_setv "UINST" "$UINST" >>"$__uinst_config"
runscript_as_root "$uinst2s" "$__uinst_config" runscript_as_root "$uinst2s" "$__uinst_config"
} }

View File

@ -177,8 +177,8 @@ function read_infofile() {
# Retourner 1 si un erreur s'est produite, par exemple si le fichier $1 # Retourner 1 si un erreur s'est produite, par exemple si le fichier $1
# n'existe pas ou n'est pas accessible en lecture # n'existe pas ou n'est pas accessible en lecture
[ -f "$1" -a -r "$1" ] || return 1 [ -f "$1" -a -r "$1" ] || return 1
set_var "${2:-version}" "$(grep -A 1 CFBundleShortVersionString "$1" | tail -1 | sed 's/^.*<string>\(.*\)<\/string>.*$/\1/')" _setv "${2:-version}" "$(grep -A 1 CFBundleShortVersionString "$1" | tail -1 | sed 's/^.*<string>\(.*\)<\/string>.*$/\1/')"
set_var "${3:-release}" "$(grep -A 1 CFBundleVersion "$1" | tail -1 | sed 's/^.*<string>\(.*\)<\/string>.*$/\1/')" _setv "${3:-release}" "$(grep -A 1 CFBundleVersion "$1" | tail -1 | sed 's/^.*<string>\(.*\)<\/string>.*$/\1/')"
} }
function write_infofile() { function write_infofile() {
@ -525,7 +525,7 @@ function woraurl() {
5*) _status=3;; 5*) _status=3;;
*) _status=11;; *) _status=11;;
esac esac
set_var "${4:-http_code}" "$_http_code" _setv "${4:-http_code}" "$_http_code"
return $_status return $_status
} }
function wogeturl() { woraurl GET "$@"; } function wogeturl() { woraurl GET "$@"; }
@ -540,28 +540,28 @@ function splitins() {
# Si $1==App, type=app et name=App # Si $1==App, type=app et name=App
# si $1==App-N, type=ins et name=App-N # si $1==App-N, type=ins et name=App-N
if [ -z "$1" ]; then if [ -z "$1" ]; then
set_var "${2:-type}" all _setv "${2:-type}" all
set_var "${3:-name}" _setv "${3:-name}"
elif [ "${1%.woa}" != "$1" ]; then elif [ "${1%.woa}" != "$1" ]; then
set_var "${2:-type}" woa _setv "${2:-type}" woa
set_var "${3:-name}" "$1" _setv "${3:-name}" "$1"
elif [ "${1%.framework}" != "$1" ]; then elif [ "${1%.framework}" != "$1" ]; then
set_var "${2:-type}" fwk _setv "${2:-type}" fwk
set_var "${3:-name}" "$1" _setv "${3:-name}" "$1"
elif [[ "$1" == *-* ]]; then elif [[ "$1" == *-* ]]; then
local __si_name __si_num local __si_name __si_num
__si_name="${1%-*}" __si_name="${1%-*}"
__si_num="${1##*-}" __si_num="${1##*-}"
if [ -z "${__si_num//[0-9]/}" ]; then if [ -z "${__si_num//[0-9]/}" ]; then
set_var "${2:-type}" ins _setv "${2:-type}" ins
set_var "${3:-name}" "$1" _setv "${3:-name}" "$1"
else else
set_var "${2:-type}" app _setv "${2:-type}" app
set_var "${3:-name}" "$1" _setv "${3:-name}" "$1"
fi fi
elif [ -n "$1" ]; then elif [ -n "$1" ]; then
set_var "${2:-type}" app _setv "${2:-type}" app
set_var "${3:-name}" "$1" _setv "${3:-name}" "$1"
fi fi
} }

View File

@ -102,7 +102,7 @@ COMMANDES
while [ -n "$1" ]; do while [ -n "$1" ]; do
if [ "$1" == // ]; then if [ "$1" == // ]; then
if [ -n "${cmd[*]}" ]; then if [ -n "${cmd[*]}" ]; then
cmds=("${cmds[@]}" "$(quoted_args "${cmd[@]}")") cmds=("${cmds[@]}" "$(qvals "${cmd[@]}")")
fi fi
cmd=() cmd=()
else else
@ -111,7 +111,7 @@ COMMANDES
shift shift
done done
if [ -n "${cmd[*]}" ]; then if [ -n "${cmd[*]}" ]; then
cmds=("${cmds[@]}" "$(quoted_args "${cmd[@]}")") cmds=("${cmds[@]}" "$(qvals "${cmd[@]}")")
fi fi
fi fi
@ -458,7 +458,7 @@ OPTIONS
if [[ "$src" == *=* ]]; then if [[ "$src" == *=* ]]; then
splitvar "$src" name value splitvar "$src" name value
array_add variables "$name" array_add variables "$name"
set_var "$name" "$value" _setv "$name" "$value"
else else
src="$(abspath "$src")" src="$(abspath "$src")"
valid= valid=
@ -543,14 +543,14 @@ dans NEXT_ROOT = ${NEXT_ROOT:-/}
local configfile variable local configfile variable
ac_set_tmpfile configfile ac_set_tmpfile configfile
for variable in "${variables[@]}" bounce webinst ULIBDIR __estack __tlevel; do for variable in "${variables[@]}" bounce webinst ULIBDIR __estack __tlevel; do
set_var_cmd "$variable" "${!variable}" >>"$configfile" echo_setv "$variable" "${!variable}" >>"$configfile"
done done
for array in variables scripts applications frameworks; do for array in variables scripts applications frameworks; do
set_array_cmd "$array" >>"$configfile" set_array_cmd "$array" >>"$configfile"
done done
# pour les serveurs qui ont une vieille version de bash, forcer la valeur de # pour les serveurs qui ont une vieille version de bash, forcer la valeur de
# ULIBDIR # ULIBDIR
set_var_cmd "FORCED_ULIBDIR" "$ULIBDIR" >>"$configfile" echo_setv "FORCED_ULIBDIR" "$ULIBDIR" >>"$configfile"
runscript_as_root "$ULIBDIR/support/woinst2s" "$configfile" runscript_as_root "$ULIBDIR/support/woinst2s" "$configfile"

View File

@ -18,9 +18,9 @@ function wosign_setup_maybe() {
storepass= storepass=
keyalias= keyalias=
source "$WOSIGN_CONF" source "$WOSIGN_CONF"
set_var_cmd WOSIGN_KEYSTORE "$keystore" echo_setv WOSIGN_KEYSTORE "$keystore"
set_var_cmd WOSIGN_STOREPASS "$storepass" echo_setv WOSIGN_STOREPASS "$storepass"
set_var_cmd WOSIGN_KEYALIAS "$keyalias" echo_setv WOSIGN_KEYALIAS "$keyalias"
)" )"
[ -n "$WOSIGN_XTMPDIR" ] || ac_set_tmpdir WOSIGN_XTMPDIR [ -n "$WOSIGN_XTMPDIR" ] || ac_set_tmpdir WOSIGN_XTMPDIR

View File

@ -132,7 +132,7 @@ if [ "$password" != "--NOT-SET--" ]; then
fi fi
if [ -z "$query" -a -n "$input" -a "$input" != "-" ]; then if [ -z "$query" -a -n "$input" -a "$input" != "-" ]; then
mysqlcmd="<$(quoted_arg "$input") $mysqlcmd" mysqlcmd="<$(qval "$input") $mysqlcmd"
fi fi
eval "$mysqlcmd" | eval "$mysqlcmd" |

View File

@ -340,7 +340,7 @@ if [ "$method" == load ]; then
[ -n "$truncate" ] && echo "$truncate" [ -n "$truncate" ] && echo "$truncate"
echo "$loadcsv" echo "$loadcsv"
echo "-- Commande à lancer pour importer la table dans MySQL:" echo "-- Commande à lancer pour importer la table dans MySQL:"
echo "-- $(quoted_args "${cmd[@]}")" echo "-- $(qvals "${cmd[@]}")"
else else
"${cmd[@]}"; r=$? "${cmd[@]}"; r=$?
fi fi

2
pdev
View File

@ -298,7 +298,7 @@ if [ "$action" == delete ]; then
eimportant "\ eimportant "\
La branche $origin/$feature n'a plus lieu d'être, mais la configuration actuelle interdit de la supprimer. La branche $origin/$feature n'a plus lieu d'être, mais la configuration actuelle interdit de la supprimer.
Veuillez le faire manuellement avec la commande suivante: Veuillez le faire manuellement avec la commande suivante:
$(quoted_args git push "$origin" ":$feature")" $(qvals git push "$origin" ":$feature")"
fi fi
fi fi
fi fi

6
rruns
View File

@ -419,11 +419,11 @@ for userhost in "${hosts[@]}"; do
if scp -S "$SSH" "$archive" "$user@$host:"; then if scp -S "$SSH" "$archive" "$user@$host:"; then
estep "Lancement du script de déploiement" estep "Lancement du script de déploiement"
"$SSH" -qt "$user@$host" "\ "$SSH" -qt "$user@$host" "\
__estack=$(quoted_arg "$__estack") __estack=$(qval "$__estack")
__tlevel=$(quoted_arg "$__tlevel") __tlevel=$(qval "$__tlevel")
export __estack __tlevel export __estack __tlevel
${UTOOLS_LANG:+UTOOLS_LANG='$UTOOLS_LANG'; export UTOOLS_LANG ${UTOOLS_LANG:+UTOOLS_LANG='$UTOOLS_LANG'; export UTOOLS_LANG
}$(quoted_args "./$archivename" ${tmproot:+--tmproot "$tmproot"})" }$(qvals "./$archivename" ${tmproot:+--tmproot "$tmproot"})"
if [ -n "$init_sysinfos" ]; then if [ -n "$init_sysinfos" ]; then
estep "Calcul des informations de l'hôte distant" estep "Calcul des informations de l'hôte distant"
sysinfos_script=' sysinfos_script='

62
ruinst
View File

@ -14,7 +14,9 @@ pas contenir d'espaces ni de caractères spéciaux. L'échappement de ces
caractères n'est pas garanti. caractères n'est pas garanti.
OPTIONS OPTIONS
-C Ne pas faire le déploiement. Configurer uniquement la connexion par clé -C, --configure-user
--configure USER [--uses-su]
Ne pas faire le déploiement. Configurer uniquement la connexion par clé
sur les hôtes distants spécifiés pour le user spécifié. Il faut pouvoir 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é. 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 Si l'on veut configurer la connexion par clé pour le user root, mais que
@ -26,14 +28,14 @@ OPTIONS
Si l'hôte distant n'a pas sudo ou si sudo n'est pas configuré, il faut 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: rajouter l'option --uses-su, e.g:
$scriptname -h user@host --configure root --uses-su $scriptname -h user@host --configure root --uses-su
-T tmproot -T, --tmproot TMPROOT
Spécifier le répertoire temporaire sur l'hôte distant, comme par exemple 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 /var/tmp. Cette option est utile pour les vservers, qui ont par défaut
un /tmp minuscule de 16 Mo. un /tmp minuscule de 16 Mo.
-S, --ssh ssh -S, --ssh SSH
Spécifier le programme à utiliser pour la connection par ssh. Spécifier le programme à utiliser pour la connection par ssh.
-h hosts -h, --host hosts
-h @hostsfile -h, --host @hostsfile
Spécifier un ou plusieurs hôtes sur lequels faire le déploiement. Pour 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 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 l'option -h, ou spécifier en une seule fois plusieurs hôtes en les
@ -45,7 +47,17 @@ OPTIONS
root. Il est possible de spécifier un autre utilisateur avec la syntaxe 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 La forme @hostsfile permet de lire la liste des hôtes depuis le fichier
hostsfile, à raison d'un hôte par ligne." hostsfile, à raison d'un hôte par ligne.
--deploy
--no-deploy
Autoriser (respectivement interdire) l'utilisation de la configuration
locale de déploiement pour identifier la destination si aucun hôte n'est
spécifié.
Par défaut, si aucun hôte n'est spécifié, la configuration locale de
déploiement est interrogée pour avoir cette information.
-c, --deploy-config CONFNAME
Cette option permet de spécifier le nom de la configuration à utiliser
pour effectuer la requête. Par défaut, utiliser le nom 'ruinst'"
} }
set_defaults pubkeys set_defaults pubkeys
@ -54,18 +66,23 @@ action=deploy
confuser= confuser=
uses_su= uses_su=
tmproot= tmproot=
hosts=()
SSH= SSH=
force_make_archive= force_make_archive=
hosts=()
deploy_enable=1
deploy_confname=ruinst
parse_opts "${PRETTYOPTS[@]}" \ parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \ --help '$exit_with display_help' \
-C action=configure \ -C,--configure-user action=configure \
--configure: '$set@ confuser;action=configure' \ --configure: '$set@ confuser;action=configure' \
--uses-su uses_su=1 \ --uses-su uses_su=1 \
-T:,--tmproot: tmproot= \ -T:,--tmproot: tmproot= \
-S:,--ssh: SSH= \ -S:,--ssh: SSH= \
--force-make-archive force_make_archive=1 \ --force-make-archive force_make_archive=1 \
-h:,-H:,--host: hosts \ -h:,-H:,--host: hosts \
--deploy deploy_enable=1 \
--no-deploy deploy_enable= \
-c:,--deploy-config deploy_confname= \
@ args -- "$@" && set -- "${args[@]}" || die "$args" @ args -- "$@" && set -- "${args[@]}" || die "$args"
: "${SSH:=ssh}" : "${SSH:=ssh}"
@ -181,7 +198,7 @@ if [ "$action" == "configure" ]; then
}$(<"$sshdir/$pubkey")" }$(<"$sshdir/$pubkey")"
done done
fi fi
[ -n "$PUBKEYS" ] || die "La connexion sur les hôtes distants ne peut se faire que par mot de passe parce que vous n'avez pas de clé publique configurée. Modifiez le fichier ~/etc/default.pubkeys si ce message est erroné." [ -n "$PUBKEYS" ] || die "La connexion sur les hôtes distants ne peut se faire que par mot de passe parce que vous n'avez pas de clé publique configurée. Modifiez le fichier ~/etc/default/pubkeys si ce message est erroné."
[ -n "${hosts[*]}" ] || hosts=("$@") [ -n "${hosts[*]}" ] || hosts=("$@")
[ -n "${hosts[*]}" ] || die "Vous devez spécifier la liste des hôtes à configurer" [ -n "${hosts[*]}" ] || die "Vous devez spécifier la liste des hôtes à configurer"
@ -214,6 +231,19 @@ else
fi fi
## Hôtes sur lesquels faire le déploiement ## Hôtes sur lesquels faire le déploiement
if array_isempty hosts && [ -n "$deploy_enable" ]; then
urequire deploy
deploy_setconf "$deploy_confname"
if deploy_loadconf; then
setxx module=abspath "$src" // basename --
if eval "$(deploy_query -v host DEST module ruinst_deploy "" shell "$module")"; then
check_interaction -c && einfo "Ce module sera déployé vers les hôtes suivants:
$(array_to_lines host "" " ")"
ask_any "Voulez-vous continuer?" Oq || die
array_copy hosts host
fi
fi
fi
array_isempty hosts && read_value "Entrez une liste d'hôtes séparés par ':'" hosts "localhost" array_isempty hosts && read_value "Entrez une liste d'hôtes séparés par ':'" hosts "localhost"
fix_hosts fix_hosts
@ -240,6 +270,11 @@ if [ -n "$make_archive" ]; then
fi fi
## Déploiement ## Déploiement
# sur l'hôte distant, ne rendre interactif qu'à partir de -yy
rinteraction=$__interaction
[ $rinteraction -lt 2 ] && rinteraction=$(($rinteraction + 1))
for host in "${hosts[@]}"; do for host in "${hosts[@]}"; do
if [ "$host" == "localhost" ]; then if [ "$host" == "localhost" ]; then
etitle -s "Déploiement sur l'hôte local" etitle -s "Déploiement sur l'hôte local"
@ -258,11 +293,12 @@ for host in "${hosts[@]}"; do
scp -S "$SSH" "$archive" "$user@$host:" || die scp -S "$SSH" "$archive" "$user@$host:" || die
estep "Lancement du script de déploiement" estep "Lancement du script de déploiement"
"$SSH" -qt "$user@$host" "\ "$SSH" -qt "$user@$host" "\
__estack=$(quoted_arg "$__estack") __interaction=$rinteraction
__tlevel=$(quoted_arg "$__tlevel") __estack=$(qval "$__estack")
export __estack __tlevel __tlevel=$(qval "$__tlevel")
export __interaction __estack __tlevel
${UTOOLS_LANG:+UTOOLS_LANG='$UTOOLS_LANG'; export UTOOLS_LANG ${UTOOLS_LANG:+UTOOLS_LANG='$UTOOLS_LANG'; export UTOOLS_LANG
}$(quoted_args "./$archivename" ${tmproot:+--tmproot "$tmproot"} -- MYHOST="$host" "$@")" }$(qvals "./$archivename" ${tmproot:+--tmproot "$tmproot"} -- MYHOST="$host" "$@")"
eend eend
fi fi
done done

147
rwoinst
View File

@ -10,7 +10,9 @@ USAGE
$scriptname [-H host] [-T tmproot] <file|archive|dir>... [-- options de woinst] $scriptname [-H host] [-T tmproot] <file|archive|dir>... [-- options de woinst]
OPTIONS OPTIONS
-C Ne pas faire le déploiement. Configurer uniquement la connexion par clé -C, --configure-user
--configure USER [--uses-su]
Ne pas faire le déploiement. Configurer uniquement la connexion par clé
sur les hôtes distants spécifiés pour le user spécifié. Il faut pouvoir 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é. 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 Si l'on veut configurer la connexion par clé pour le user root, mais que
@ -19,53 +21,135 @@ OPTIONS
il est possible de faire la configuration avec '--configure root'. La il est possible de faire la configuration avec '--configure root'. La
commande serait alors commande serait alors
$scriptname -H user@host --configure root $scriptname -H user@host --configure root
-T tmproot Si l'hôte distant n'a pas sudo ou si sudo n'est pas configuré, il faut
rajouter l'option --uses-su, e.g:
$scriptname -h user@host --configure root --uses-su
-T, --tmproot TMPROOT
Spécifier le répertoire temporaire sur l'hôte distant, comme par exemple 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 /var/tmp. Cette option est utile pour les vservers, qui ont par défaut
un /tmp minuscule de 16 Mo. un /tmp minuscule de 16 Mo.
-S ssh -S, --ssh SSH
Spécifier le programme à utiliser pour la connection par ssh. Spécifier le programme à utiliser pour la connection par ssh.
-h, --host hosts
-h, --host @hostsfile
-H host -H host
Spécifier un hôte distant sur lequel faire le déploiement. Plusieurs Spécifier un ou plusieurs hôtes sur lequels faire le déploiement. Pour
options -H peuvent être spécifiées, ou alors on peut séparer plusieurs spécifier plusieurs hôtes, il est possible d'utiliser plusieurs fois
hôtes par ':', e.g. -H host1:host2 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 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 root. Il est possible de spécifier un autre utilisateur avec la syntaxe
user@host, e.g -H user@host" user@host, e.g -h user@host
La forme @hostsfile permet de lire la liste des hôtes depuis le fichier
hostsfile, à raison d'un hôte par ligne.
--deploy
--no-deploy
Autoriser (respectivement interdire) l'utilisation de la configuration
locale de déploiement pour identifier la destination si aucun hôte n'est
spécifié.
Par défaut, si aucun hôte n'est spécifié, la configuration locale de
déploiement est interrogée pour avoir cette information.
-c, --deploy-config CONFNAME
Cette option permet de spécifier le nom de la configuration à utiliser
pour effectuer la requête. Par défaut, utiliser le nom 'rwoinst'"
} }
set_defaults pubkeys set_defaults pubkeys
action=deploy action=deploy
confuser= confuser=
uses_su=
tmproot= tmproot=
hosts=()
SSH= SSH=
hosts=()
deploy_enable=1
deploy_confname=rwoinst
parse_opts "${PRETTYOPTS[@]}" \ parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \ --help '$exit_with display_help' \
-C action=configure \ -C,--configure-user action=configure \
--configure: '$set@ confuser;action=configure' \ --configure: '$set@ confuser;action=configure' \
--uses-su uses_su=1 \
-T:,--tmproot: tmproot= \ -T:,--tmproot: tmproot= \
-S: SSH= \ -S:,--ssh: SSH= \
-h:,-H:,--host: hosts \ -h:,-H:,--host: hosts \
--deploy deploy_enable=1 \
--no-deploy deploy_enable= \
-c:,--deploy-config deploy_confname= \
@ args -- "$@" && set -- "${args[@]}" || die "$args" @ args -- "$@" && set -- "${args[@]}" || die "$args"
function _dot_is_localhost() { SSH="${SSH:-ssh}"
[ "$1" == "." ] && echo "localhost" || echo "$1"
__PARSED_HOSTS=()
__PARSED_FILES=()
function parse_hostsfile() {
# Lire chacun des fichiers $* et initialiser __PARSED_HOSTS avec la liste
# des hôtes mentionnés dans les fichiers.
local inputfile basedir inputs input
for inputfile in "$@"; do
inputfile="$(abspath "$inputfile")"
array_contains __PARSED_FILES "$inputfile" && {
ewarn "$(ppath "$inputfile"): inclusion récursive"
continue
}
array_add __PARSED_FILES "$inputfile"
basedir="$(dirname "$inputfile")"
array_from_lines inputs "$(<"$inputfile" filter_conf)" || {
ewarn "$inputfile: fichier ingnoré"
continue
}
for input in "${inputs[@]}"; do
if [ "${input#@}" != "$input" ]; then
# fichier inclus
parse_hostsfile "$(abspath "${input#@}" "$basedir")"
else
array_addu __PARSED_HOSTS "$input"
fi
done
done
} }
function __expand_braces() {
if [[ "$1" == *{* ]] && [[ "$1" == *}* ]]; then
eval "echo $1"
else
echo "$1"
fi
}
function __dot_is_localhost() { [ "$1" == "." ] && echo "localhost" || echo "$1"; }
function fix_hosts() { function fix_hosts() {
# Si hosts contient des éléments multiple, comme a:b, séparés ces # Si hosts contient des éléments multiple, comme a:b, séparer ces
# éléments. i.e (a b:c) --> (a b c) # éléments. i.e (a b:c) --> (a b c)
# remplacer aussi les '.' par 'localhost' # Supporter la syntaxe @hostsfile qui permet de charger la liste des hôtes
array_fix_paths hosts # depuis un fichier.
array_map hosts _dot_is_localhost # Remplacer aussi les '.' par 'localhost'
array_map hosts __expand_braces
array_fix_paths hosts ":"
array_fix_paths hosts " "
local -a _hosts _tmphosts host
for host in "${hosts[@]}"; do
host="${host%/}"
if [ "${host#@}" != "$host" ]; then
__PARSED_HOSTS=()
parse_hostsfile "${host#@}"
array_fix_paths __PARSED_HOSTS
array_extendu _hosts __PARSED_HOSTS
else
array_addu _hosts "$host"
fi
done
array_copy hosts _hosts
array_map hosts __dot_is_localhost
} }
################################################################################ ################################################################################
# Configuration de l'accès par clé aux hôtes # Configuration de l'accès par clé aux hôtes
if [ "$action" == "configure" ]; then if [ "$action" == "configure" ]; then
args=(${confuser:+--configure "$confuser"}) args=(${confuser:+--configure "$confuser"} ${uses_su:+--uses-su} -S "$SSH")
for host in "${hosts[@]}"; do for host in "${hosts[@]}"; do
args=("${args[@]}" -H "$host") args=("${args[@]}" -H "$host")
done done
@ -75,8 +159,6 @@ fi
################################################################################ ################################################################################
# Déploiement # Déploiement
SSH="${SSH:-ssh}"
## Bundle à déployer ## Bundle à déployer
if [ -z "$1" ] || [[ "$1" == -* ]] || [[ "$1" == *=* ]]; then if [ -z "$1" ] || [[ "$1" == -* ]] || [[ "$1" == *=* ]]; then
# pas d'argument, ou c'est une option (qui fait donc partie des arguments de # pas d'argument, ou c'est une option (qui fait donc partie des arguments de
@ -85,6 +167,19 @@ if [ -z "$1" ] || [[ "$1" == -* ]] || [[ "$1" == *=* ]]; then
fi fi
## Hôtes sur lesquels faire le déploiement ## Hôtes sur lesquels faire le déploiement
if array_isempty hosts && [ -n "$deploy_enable" ]; then
urequire deploy
deploy_setconf "$deploy_confname"
if deploy_loadconf; then
setxx wobundle=abspath "$1" // basename --
if eval "$(deploy_query -v host DEST wobundle rwoinst_bundle "" shell "$wobundle")"; then
check_interaction -c && einfo "Ce bundle sera déployé vers les hôtes suivants:
$(array_to_lines host "" " ")"
ask_any "Voulez-vous continuer?" Oq || die
array_copy hosts host
fi
fi
fi
array_isempty hosts && read_value "Entrez une liste d'hôtes séparés par ':'" hosts "localhost" array_isempty hosts && read_value "Entrez une liste d'hôtes séparés par ':'" hosts "localhost"
fix_hosts fix_hosts
@ -147,6 +242,11 @@ etitle "Création de l'archive pour le déploiement" \
"$scriptdir/mkusfx" --bare --tmp-archive -o "$archive" "$workdir" -- ./woinst --is-tmpdir "${bundles[@]}" || die "$scriptdir/mkusfx" --bare --tmp-archive -o "$archive" "$workdir" -- ./woinst --is-tmpdir "${bundles[@]}" || die
## Déploiement ## Déploiement
# sur l'hôte distant, ne rendre interactif qu'à partir de -yy
rinteraction=$__interaction
[ $rinteraction -lt 2 ] && rinteraction=$(($rinteraction + 1))
for host in "${hosts[@]}"; do for host in "${hosts[@]}"; do
if [ "$host" == "localhost" ]; then if [ "$host" == "localhost" ]; then
etitle "Déploiement sur l'hôte local" \ etitle "Déploiement sur l'hôte local" \
@ -164,11 +264,12 @@ for host in "${hosts[@]}"; do
scp -S "$SSH" "$archive" "$user@$host:" || die scp -S "$SSH" "$archive" "$user@$host:" || die
estep "Lancement du script de déploiement" estep "Lancement du script de déploiement"
"$SSH" -qt "$user@$host" "\ "$SSH" -qt "$user@$host" "\
__estack=$(quoted_arg "$__estack") __interaction=$rinteraction
__tlevel=$(quoted_arg "$__tlevel") __estack=$(qval "$__estack")
export __estack __tlevel __tlevel=$(qval "$__tlevel")
export __interaction __estack __tlevel
${UTOOLS_LANG:+UTOOLS_LANG='$UTOOLS_LANG'; export UTOOLS_LANG ${UTOOLS_LANG:+UTOOLS_LANG='$UTOOLS_LANG'; export UTOOLS_LANG
}$(quoted_args "./$archivename" ${tmproot:+--tmproot "$tmproot"} -- MYHOST="$host" "$@")" }$(qvals "./$archivename" ${tmproot:+--tmproot "$tmproot"} -- MYHOST="$host" "$@")"
eend eend
fi fi
done done

View File

@ -349,7 +349,7 @@ Voulez-vous continuer?" O || return 1
if [ -n "$edit" -a -n "$DWCOMMIT" ]; then if [ -n "$edit" -a -n "$DWCOMMIT" ]; then
__commit "$dwdir" "newpage $title --> $ns$name" newfiles modfiles || return __commit "$dwdir" "newpage $title --> $ns$name" newfiles modfiles || return
else else
estepi "dwci $(quoted_args "dwci newpage $title --> $ns$name")" estepi "dwci $(qvals "dwci newpage $title --> $ns$name")"
fi fi
return 0 return 0
} }
@ -453,7 +453,7 @@ function edit_cmd() {
if [ -n "$DWCOMMIT" ]; then if [ -n "$DWCOMMIT" ]; then
__commit "$dwdir" "edit ${page//\//:}" newfiles modfiles || return __commit "$dwdir" "edit ${page//\//:}" newfiles modfiles || return
else else
estepi "dwci $(quoted_args "edit ${page//\//:}")" estepi "dwci $(qvals "edit ${page//\//:}")"
fi fi
return 0 return 0
} }
@ -780,7 +780,7 @@ print tolower($0)
if [ -n "$DWCOMMIT" ]; then if [ -n "$DWCOMMIT" ]; then
__commit "$dwdir" "generate $srcdir" newfiles modfiles __commit "$dwdir" "generate $srcdir" newfiles modfiles
else else
estepi "dwci $(quoted_args "generate $srcdir")" estepi "dwci $(qvals "generate $srcdir")"
fi fi
) )
} }

View File

@ -237,7 +237,7 @@ function init_cmd() {
read_value "URL du site MediaWiki" MWSITEURL http://localhost/mediawiki read_value "URL du site MediaWiki" MWSITEURL http://localhost/mediawiki
local var local var
for var in MWDBHOST MWDBPORT MWDBUSER MWDBPASS MWDBNAME MWPREFIX MWSITEURL; do for var in MWDBHOST MWDBPORT MWDBUSER MWDBPASS MWDBNAME MWPREFIX MWSITEURL; do
set_var_cmd "$var" "${!var}" >>"$mwdir/.mediawiki" echo_setv "$var" "${!var}" >>"$mwdir/.mediawiki"
done done
fi fi
@ -351,7 +351,7 @@ Voulez-vous continuer?" N || return 1
if [ -n "$edit" -a -n "$MWCOMMIT" ]; then if [ -n "$edit" -a -n "$MWCOMMIT" ]; then
__commit "$mwdir" "newpage $title --> $name" newfiles modfiles || return __commit "$mwdir" "newpage $title --> $name" newfiles modfiles || return
else else
estepi "mwci $(quoted_args "mwci newpage $title --> $name")" estepi "mwci $(qvals "mwci newpage $title --> $name")"
fi fi
return 0 return 0
} }
@ -440,7 +440,7 @@ function edit_cmd() {
if [ -n "$MWCOMMIT" ]; then if [ -n "$MWCOMMIT" ]; then
__commit "$mwdir" "edit ${page//\//:}" newfiles modfiles || return __commit "$mwdir" "edit ${page//\//:}" newfiles modfiles || return
else else
estepi "mwci $(quoted_args "edit ${page//\//:}")" estepi "mwci $(qvals "edit ${page//\//:}")"
fi fi
return 0 return 0
} }
@ -926,7 +926,7 @@ print tolower($0)
if [ -n "$MWCOMMIT" ]; then if [ -n "$MWCOMMIT" ]; then
__commit "$mwdir" "generate $srcdir" newfiles modfiles __commit "$mwdir" "generate $srcdir" newfiles modfiles
else else
estepi "mwci $(quoted_args "generate $srcdir")" estepi "mwci $(qvals "generate $srcdir")"
fi fi
) )
} }

27105
ucrontab

File diff suppressed because it is too large Load Diff

10
udist
View File

@ -237,10 +237,10 @@ function __load_udist_nolocal() { (
[ -d "$udistf" ] && udistf="$udistf/.udist" [ -d "$udistf" ] && udistf="$udistf/.udist"
source "$udistf" source "$udistf"
set_var_cmd "${2}VERSION" "$VERSION" echo_setv "${2}VERSION" "$VERSION"
set_array_cmd "${2}VERSIONS" VERSIONS set_array_cmd "${2}VERSIONS" VERSIONS
set_array_cmd "${2}TAGS" TAGS set_array_cmd "${2}TAGS" TAGS
set_var_cmd "${2}ORIGIN" "$ORIGIN" echo_setv "${2}ORIGIN" "$ORIGIN"
set_array_cmd "${2}LOCALS" LOCALS set_array_cmd "${2}LOCALS" LOCALS
); } ); }
@ -264,10 +264,10 @@ function __save_udist() {
splitpair "$__su_dest" __su_dest __su_varname splitpair "$__su_dest" __su_dest __su_varname
[ -n "$__su_varname" ] || __su_varname="$__su_dest" [ -n "$__su_varname" ] || __su_varname="$__su_dest"
case "$__su_dest" in case "$__su_dest" in
VERSION) array_add __su_cmd "$(set_var_cmd VERSION "${!__su_varname}")";; VERSION) array_add __su_cmd "$(echo_setv VERSION "${!__su_varname}")";;
VERSIONS) array_add __su_cmd "$(set_array_cmd VERSIONS "${__su_varname}")";; VERSIONS) array_add __su_cmd "$(set_array_cmd VERSIONS "${__su_varname}")";;
TAGS) array_add __su_cmd "$(set_array_cmd TAGS "${__su_varname}")";; TAGS) array_add __su_cmd "$(set_array_cmd TAGS "${__su_varname}")";;
ORIGIN) array_add __su_cmd "$(set_var_cmd ORIGIN "${!__su_varname}")";; ORIGIN) array_add __su_cmd "$(echo_setv ORIGIN "${!__su_varname}")";;
LOCALS) array_add __su_cmd "$(set_array_cmd LOCALS "${__su_varname}")";; LOCALS) array_add __su_cmd "$(set_array_cmd LOCALS "${__su_varname}")";;
esac esac
done done
@ -1306,7 +1306,7 @@ function local_put_cmd() {
local script= local script=
for localfile in "${localfiles[@]}"; do for localfile in "${localfiles[@]}"; do
[ -n "$script" ] && script="$script; " [ -n "$script" ] && script="$script; "
script="$script$(quoted_args chown "$owner" "$destdir/$localfile")" script="$script$(qvals chown "$owner" "$destdir/$localfile")"
done done
"${ssh:-ssh}" -qt "$userhost:$destdir" "$script" "${ssh:-ssh}" -qt "$userhost:$destdir" "$script"
fi fi

12
uldap
View File

@ -41,7 +41,7 @@ function split_cmds() {
fi fi
done done
if [ -n "$__sc_addtocmd" ]; then if [ -n "$__sc_addtocmd" ]; then
__sc_cmd="${__sc_cmd:+$__sc_cmd }$(quoted_arg "$__sc_arg")" __sc_cmd="${__sc_cmd:+$__sc_cmd }$(qvalm "$__sc_arg")"
__sc_arg= __sc_arg=
fi fi
if [ -n "$__sc_foundsep" ]; then if [ -n "$__sc_foundsep" ]; then
@ -150,7 +150,7 @@ function set_values() {
if array_contains VARIABLES "$uname" || array_contains SPECIAL_VARIABLES "$uname"; then if array_contains VARIABLES "$uname" || array_contains SPECIAL_VARIABLES "$uname"; then
"set_$lname" "$value" || s=1 "set_$lname" "$value" || s=1
elif ! array_contains PROTECTED_VARIABLES "$name"; then elif ! array_contains PROTECTED_VARIABLES "$name"; then
set_var "$name" "$value" _setv "$name" "$value"
else else
s=1 s=1
fi fi
@ -321,7 +321,7 @@ function __push() {
local __varcmd __name local __varcmd __name
for __name in "$@"; do for __name in "$@"; do
__varcmd="${__varcmd:+$__varcmd __varcmd="${__varcmd:+$__varcmd
}$(set_var_cmd "$__name" "${!__name}")" }$(echo_setv "$__name" "${!__name}")"
done done
WSSTACK=("${WSSTACK[@]}" "$__varcmd") WSSTACK=("${WSSTACK[@]}" "$__varcmd")
} }
@ -1349,7 +1349,7 @@ function uldap_undo() {
function uldap_ifok() { function uldap_ifok() {
if [ "$EXITCODE" -eq 0 ]; then if [ "$EXITCODE" -eq 0 ]; then
eval_cmdline "$(quoted_args "$@")" eval_cmdline "$(qvals "$@")"
else else
return 0 return 0
fi fi
@ -1357,7 +1357,7 @@ function uldap_ifok() {
function uldap_iferror() { function uldap_iferror() {
if [ "$EXITCODE" -ne 0 ]; then if [ "$EXITCODE" -ne 0 ]; then
eval_cmdline "$(quoted_args "$@")" eval_cmdline "$(qvals "$@")"
else else
return 0 return 0
fi fi
@ -1464,7 +1464,7 @@ if [ -n "$*" ]; then
INTERACTIVE= INTERACTIVE=
[ "$EXIT_ON_ERROR" == auto ] && set_values exit_on_error=true [ "$EXIT_ON_ERROR" == auto ] && set_values exit_on_error=true
# splitter sur les lignes # splitter sur les lignes
array_from_lines lcmds "$(quoted_args "$@")" array_from_lines lcmds "$(qvals "$@")"
[ -n "$AUTOPRINT" ] && array_add lcmds print [ -n "$AUTOPRINT" ] && array_add lcmds print
elif [ -n "$lscriptfile" ]; then elif [ -n "$lscriptfile" ]; then
[ -f "$lscriptfile" ] || die "$lscriptfile: fichier introuvable" [ -f "$lscriptfile" ] || die "$lscriptfile: fichier introuvable"

10
ulib
View File

@ -343,18 +343,18 @@ if ! grep -q '$scriptdir/profile' ~/.bash_profile; then
fi fi
# Modifier le PATH. Ajouter aussi le chemin vers les uapps python # Modifier le PATH. Ajouter aussi le chemin vers les uapps python
PATH=$(quoted_args "$scriptdir:$scriptdir/lib/pyulib/src/uapps:$PATH") PATH=$(qval "$scriptdir:$scriptdir/lib/pyulib/src/uapps:$PATH")
if [ -n '$DEFAULT_PS1' ]; then if [ -n '$DEFAULT_PS1' ]; then
DEFAULT_PS1=$(quoted_args "[ulibshell] $DEFAULT_PS1") DEFAULT_PS1=$(qval "[ulibshell] $DEFAULT_PS1")
else else
if [ -z '$PS1' ]; then if [ -z '$PS1' ]; then
PS1='\\u@\\h \\w \\$ ' PS1='\\u@\\h \\w \\$ '
fi fi
PS1=\"[ulibshell] \$PS1\" PS1=\"[ulibshell] \$PS1\"
fi fi
$(quoted_args source "$scriptdir/lib/ulib/ulib") $(qvals source "$scriptdir/lib/ulib/ulib")
__ULIB_FORCE_RELOAD=$(quoted_args "$__ULIB_FORCE_RELOAD") __ULIB_FORCE_RELOAD=$(qval "$__ULIB_FORCE_RELOAD")
urequire DEFAULTS" >"$bashrc" urequire DEFAULTS" >"$bashrc"
array_fix_paths modules array_fix_paths modules
@ -362,7 +362,7 @@ urequire DEFAULTS" >"$bashrc"
etitle "Chargement des modules" etitle "Chargement des modules"
for module in "${modules[@]}"; do for module in "${modules[@]}"; do
estep "$module" estep "$module"
quoted_args urequire "$module" >>"$bashrc" qvals urequire "$module" >>"$bashrc"
done done
eend eend
fi fi

8
umatch
View File

@ -120,14 +120,14 @@ case "$regexp" in
ip) regexp='[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+';; ip) regexp='[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+';;
esac esac
cmd="$(quoted_args match "$regexp" "$sep")" cmd="$(qvals match "$regexp" "$sep")"
[ -n "$sort" ] && cmd="$cmd | sort" [ -n "$sort" ] && cmd="$cmd | sort"
[ -n "$count" ] && cmd="$cmd | $(quoted_args count "$count" "$sep" "$all_lines")" [ -n "$count" ] && cmd="$cmd | $(qvals count "$count" "$sep" "$all_lines")"
if [ -n "$multiple" ]; then if [ -n "$multiple" ]; then
if [ -n "$all_lines" ]; then if [ -n "$all_lines" ]; then
cmd="$cmd | $(quoted_args grep -v -B 1 "^1$sep")" cmd="$cmd | $(qvals grep -v -B 1 "^1$sep")"
else else
cmd="$cmd | $(quoted_args grep -v "^1$sep")" cmd="$cmd | $(qvals grep -v "^1$sep")"
fi fi
fi fi

View File

@ -285,7 +285,13 @@ OPTIONS AVANCEES
Pour le développement ou des tests, forcer la valeur de l'heure de 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 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 garantis. Le mieux est de reprendre le résultat de l'option --show-ctnow
en le modifiant un peu si nécessaire." en le modifiant un peu si nécessaire.
-G, --any-ctnow
Pour le développement ou des tests, lancer toutes les commandes dans
l'ordre sans tenir compte de l'heure de référence. Cette commande ne
devrait pas être utilisée en temps normal, mais elle existe pour
simplifier les tests avec --show-ctnow + --force-ctnow dans les cas
simples."
} }
function set_usercrontabs() { function set_usercrontabs() {
@ -361,6 +367,7 @@ parse_opts "${PRETTYOPTS[@]}" \
-k:,--stop: USCRONTAB_STOPEC= \ -k:,--stop: USCRONTAB_STOPEC= \
--show-ctnow action=show-ctnow \ --show-ctnow action=show-ctnow \
--force-ctnow: __CTRESOLVE_CTNOW= \ --force-ctnow: __CTRESOLVE_CTNOW= \
-G,--any-ctnow __CTRESOLVE_CTNOW="**ANY**" \
@ args -- "$@" && set -- "${args[@]}" || die "$args" @ args -- "$@" && set -- "${args[@]}" || die "$args"
uscrontab="$1"; shift uscrontab="$1"; shift
@ -477,12 +484,12 @@ fi
if [ "$action" == "install" ]; then if [ "$action" == "install" ]; then
ctline="$USCRONTAB_CTLINE" ctline="$USCRONTAB_CTLINE"
[ -n "$uscrontab" ] && ctline="$ctline $(quoted_arg "$uscrontab")" [ -n "$uscrontab" ] && ctline="$ctline $(qvalm "$uscrontab")"
enable_in_crontab "$ctline" && estep "add_to_crontab $ctline" enable_in_crontab "$ctline" && estep "add_to_crontab $ctline"
elif [ "$action" == "uninstall" ]; then elif [ "$action" == "uninstall" ]; then
ctline="$USCRONTAB_CTLINE" ctline="$USCRONTAB_CTLINE"
[ -n "$uscrontab" ] && ctline="$ctline $(quoted_arg "$uscrontab")" [ -n "$uscrontab" ] && ctline="$ctline $(qvalm "$uscrontab")"
if [ -n "$disable_only" ]; then if [ -n "$disable_only" ]; then
disable_in_crontab "$ctline" && estep "disable_in_crontab $ctline" disable_in_crontab "$ctline" && estep "disable_in_crontab $ctline"
else else
@ -648,7 +655,7 @@ puis supprimez le cas échéant le fichier $pidfile"
for __var in "$@"; do for __var in "$@"; do
splitvar "$__var" __name __value splitvar "$__var" __name __value
edebug "$__name=$__value" edebug "$__name=$__value"
set_var "$__name" "$__value" _setv "$__name" "$__value"
done done
eval "$__ctscript" eval "$__ctscript"
ac_cleanall ac_cleanall

6
ussh
View File

@ -369,13 +369,13 @@ function show_vars() {
local -a sshopts local -a sshopts
[ "${#hosts[*]}" -gt 1 ] && exec= [ "${#hosts[*]}" -gt 1 ] && exec=
set_array_cmd hosts set_array_cmd hosts
set_var_cmd ssh "$SSH" echo_setv ssh "$SSH"
set_var_cmd exec "$exec" echo_setv exec "$exec"
set_array_cmd args @ "$@" set_array_cmd args @ "$@"
for host in "${hosts[@]}"; do for host in "${hosts[@]}"; do
array_copy sshopts SSHOPTS array_copy sshopts SSHOPTS
__update_sshopts "$host" "$@" __update_sshopts "$host" "$@"
set_var_cmd host "$host" echo_setv host "$host"
set_array_cmd options sshopts set_array_cmd options sshopts
done done
} }