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
* `748c2f7` Intégration de la branche update-network

View File

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

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

View File

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

2
cssh
View File

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

View File

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

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

View File

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

View File

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

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

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)
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

View File

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

View File

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

View File

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

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
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

View File

@ -32,9 +32,6 @@ démarrage
~~~
Activer le service $1 pour qu'il se lance automatiquement au démarrage
~~~
## `create_bridge`
~~~
Créer un nouveau pont nommé $1 avec les paramètres $2
~~~
## `network_fix_hostname`
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

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,
et qu'il faut compléter
~~~
## `dump_sysinfos`
~~~
Afficher les valeurs de SYSNAME, SYSDIST, SYSVER qui décrivent le système
actuel
~~~
## `get_sysinfos_desc`
~~~
Afficher une chaine de la forme SYSNAME/SYSDIST/SYSVER qui décrit le
@ -46,6 +51,16 @@ cela n'a actuellement de sens qu'avec les version de MacOS X. Il faut
aussi impérativement filtrer sur le système, e.g:
check_sysinfos -s macosx -d 10.5+
~~~
## `unsupported_system`
~~~
Afficher un message d'erreur indiquant que le système actuel n'est pas
supporté, et quitter le script
~~~
## `require_sysinfos`
~~~
Vérifier le système actuel avec check_sysinfos(), et afficher un message
d'erreur avec unsupported_system() s'il ne correspond pas à la requête
~~~
## `on_debian`
~~~
Tester si on est sur debian. charger le module debian si c'est le cas.

View File

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

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

View File

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

View File

@ -1 +1 @@
014001000
014002000

View File

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

View File

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

View File

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

View File

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

View File

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

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

View File

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

View File

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

View File

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

View File

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

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

View File

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

View File

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

View File

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

View File

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

View File

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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

2
pdev
View File

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

6
rruns
View File

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

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

147
rwoinst
View File

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

View File

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

View File

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

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

12
uldap
View File

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

10
ulib
View File

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

8
umatch
View File

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

View File

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

6
ussh
View File

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