Intégration de la branche release-6.2.0
This commit is contained in:
		
						commit
						35c98a2f8e
					
				
							
								
								
									
										35
									
								
								CHANGES.md
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								CHANGES.md
									
									
									
									
									
								
							| @ -1,3 +1,38 @@ | ||||
| ## Version 6.2.0 du 13/03/2017-11:27 | ||||
| 
 | ||||
| * `4a7b14b` ajouter un argument force à testupdated et testnewer | ||||
| * `8a6678c` ruinst et rwoinst: piloter l'interaction distante à partir du paramétrage local | ||||
| * `e9b574d` rwoinst: intégrer des fonctionnalités de ruinst; support préliminaire de deploy | ||||
| * `2561f67` ruinst: utiliser la configuration ruinst par défaut pour deploy | ||||
| * `38f21aa` ruinst: support de deploy pour calculer l'hôte pour le déploiement | ||||
| * `d5846ba` deploy: possibilité de filtrer les variables à afficher. en cas d'échec, afficher false pour faciliter l'utilisation avec eval() | ||||
| * `8fa58e2` quelques corrections sur deploy | ||||
| * `20df6c4` support du depot deploy | ||||
| * `3a24e83` régression dans set_array_cmd() | ||||
| * `31fb39d` réorganiser certaines fonctions | ||||
| * `528d579` ajout des fonctions seta(), _seta(), echo_seta() | ||||
| * `a43359c` maj doc | ||||
| * `2177e6a` cesser d'utiliser des fonctions obsolètes | ||||
| * `9a777b3` cosmetic | ||||
| * `a5fcf78` ajout de evali() | ||||
| * `af3bb37` ajout de evals() | ||||
| * `fbad986` corriger un problème potentiel avec should_quote() | ||||
| * `f570438` bug avec recho -n; maj doc | ||||
| * `3d1b826` cosmetic | ||||
| * `e800376` cosmetic | ||||
| * `0805f4f` SVirtualBox: ajout de l'option -r pour relancer avec restauration du snapshot | ||||
| * `225060c` utempl/www: correction des options et modification cosmétique | ||||
| * `ad88c99` Intégration de la branche update-templates | ||||
|   * `532d21d` support de la génération de pages html avec bootstrap | ||||
|   * `c52031b` maj de la description | ||||
| * `ca4de19` Intégration de la branche update-apacheconfig | ||||
|   * `02f52af` afficher un menu si plusieurs répertoires de templates sont disponibles | ||||
|   * `6192c0a` description des modifications à apporter | ||||
|   * `f2b6381` SVirtualBox: démarrer en mode separate par défaut | ||||
| * `7a38535` support des hôtes de l'université | ||||
| * `b6b7fa9` uscrontab: support de l'option -G pour les tests | ||||
| * `e58ff74` maj du template pour runs | ||||
| 
 | ||||
| ## Version 6.1.0 du 13/02/2017-17:06 | ||||
| 
 | ||||
| * `748c2f7` Intégration de la branche update-network | ||||
|  | ||||
							
								
								
									
										82
									
								
								SVirtualBox
									
									
									
									
									
								
							
							
						
						
									
										82
									
								
								SVirtualBox
									
									
									
									
									
								
							| @ -10,19 +10,38 @@ USAGE | ||||
|     $scriptname [options] vmName | ||||
| 
 | ||||
| OPTIONS | ||||
|     -n  Ne rien faire excepté s'assurer que les modules VirtualBox sont chargés | ||||
|     -l  Lister les machines virtuelles | ||||
|     -s  Démarrer la machine virtuelle (par défaut) | ||||
|     -n, --nop | ||||
|         Ne rien faire excepté s'assurer que les modules VirtualBox sont chargés | ||||
|     -l, --list | ||||
|         Lister les machines virtuelles | ||||
|     -s, --start | ||||
|         Démarrer la machine virtuelle. C'est l'action par défaut. | ||||
|         Si le nom de la machine virtuelle n'est pas spécifiée, un menu est | ||||
|         affiché | ||||
|     -b  Démarrer la VM sans interface graphique. Cette option n'est valide | ||||
|         qu'avec -s | ||||
|     -k  Arrêter la machine virtuelle (par ACPI) | ||||
|     -p  Mettre en veille la machine virtuelle (par ACPI) | ||||
|     -H  Arrêter sauvagement la machine virtuelle | ||||
|     -R  Redémarrer sauvagement la machine virtuelle | ||||
|     -S  Enregistrer l'état de la machine virtuelle | ||||
|     -g  Afficher le gestionnaire de machines virtuelle" | ||||
|     -x, --gui | ||||
|     -b, --headless | ||||
|     --separate | ||||
|         Ces options ne sont valides qu'avec -s et permettent de spécifier le | ||||
|         type de démarrage: 'gui' permet d'afficher une fenêtre complète dans | ||||
|         laquelle l'accélération graphique est supportée, headless démarre la | ||||
|         machine en tâche de fond, et separate affiche une fenêtre qui attaque la | ||||
|         machine démarrée en tâche de fond. --separate est l'option par défaut. | ||||
|     -k, -t, --stop | ||||
|         Arrêter la machine virtuelle. Les options -p, -H, -R, -S et -r | ||||
|         permettent de spécifier le type d'arrêt de la machine virtuelle | ||||
|     -p, --sleep | ||||
|         Mettre en veille la machine virtuelle (par ACPI) | ||||
|     -H, --poweroff | ||||
|         Arrêter sauvagement la machine virtuelle | ||||
|     -R, --reset | ||||
|         Redémarrer sauvagement la machine virtuelle | ||||
|     -S, --savestate | ||||
|         Enregistrer l'état de la machine virtuelle | ||||
|     -r, --rrestart | ||||
|         Arrêter la machine, restaurer l'état du dernier snapshot puis la | ||||
|         relancer. | ||||
|     -g, --gui | ||||
|         Afficher le gestionnaire de machines virtuelle" | ||||
| } | ||||
| 
 | ||||
| function build_arrays() { | ||||
| @ -62,20 +81,24 @@ function start_virtualbox() { | ||||
| } | ||||
| 
 | ||||
| action=start | ||||
| type=separate | ||||
| stopaction=acpipowerbutton | ||||
| headless= | ||||
| restore= | ||||
| parse_opts + "${PRETTYOPTS[@]}" \ | ||||
|     --help '$exit_with display_help' \ | ||||
|     -n action=nop \ | ||||
|     -n,--nop action=nop \ | ||||
|     -l,--list action=list \ | ||||
|     -s,--start action=start \ | ||||
|     -b,--background,--headless headless=1 \ | ||||
|     -x,--gui type=gui \ | ||||
|     -b,--background,--headless type=headless \ | ||||
|     --separate type=separate \ | ||||
|     -k,-t,--stop '$action=stop; stopaction=acpipowerbutton' \ | ||||
|     -p,--sleep '$action=stop; stopaction=acpisleepbutton' \ | ||||
|     -H '$action=stop; stopaction=poweroff' \ | ||||
|     -R '$action=stop; stopaction=reset' \ | ||||
|     -S '$action=stop; stopaction=savestate' \ | ||||
|     -g action=gui \ | ||||
|     -H,--poweroff '$action=stop; stopaction=poweroff' \ | ||||
|     -R,--reset '$action=stop; stopaction=reset' \ | ||||
|     -S,--savestate '$action=stop; stopaction=savestate' \ | ||||
|     -r,--rrestart '$action=stop; restore=1' \ | ||||
|     -g,--gui action=gui \ | ||||
|     @ args -- "$@" && set -- "${args[@]}" || die "$args" | ||||
| 
 | ||||
| "$scriptdir/EnsureVM" virtualbox || die | ||||
| @ -110,8 +133,8 @@ $(array_join rvms " | ||||
|     fi | ||||
| 
 | ||||
|     if [ -n "$vm" ]; then | ||||
|         estep "Démarrage de $vm${headless:+ en tâche de fond}" | ||||
|         VBoxManage -q startvm ${headless:+--type headless} "$vm" "$@" | ||||
|         estep "Démarrage de $vm de type $type" | ||||
|         VBoxManage -q startvm --type "$type" "$vm" "$@" | ||||
|     else | ||||
|         ewarn "Aucune VM à démarrer n'a été trouvée" | ||||
|     fi | ||||
| @ -120,10 +143,23 @@ elif [ "$action" == stop ]; then | ||||
|     if [ -z "$vm" -a "${rvms[*]}" ]; then | ||||
|         select_vm rvms vm "Choisissez la VM à arrêter avec la méthode $stopaction" | ||||
|     fi | ||||
|     [ -n "$vm" ] || die | ||||
| 
 | ||||
|     if [ -n "$vm" ]; then | ||||
|         estep "Arrêt de $vm avec la méthode $stopaction" | ||||
|         VBoxManage -q controlvm "$vm" "$stopaction" | ||||
|     estep "Arrêt de $vm avec la méthode $stopaction" | ||||
|     VBoxManage -q controlvm "$vm" "$stopaction" || die | ||||
|     if [ -n "$restore" ]; then | ||||
|         ebegin "Attente de l'arrêt" | ||||
|         while true; do | ||||
|             build_arrays | ||||
|             array_contains svms "$vm" && break | ||||
|             edot 0 | ||||
|             sleep 1 | ||||
|         done | ||||
|         eend | ||||
|         estep "Restauration du snapshot" | ||||
|         VBoxManage -q snapshot "$vm" restorecurrent || die | ||||
|         estep "Démarrage" | ||||
|         VBoxManage -q startvm --type "$type" "$vm" | ||||
|     fi | ||||
| 
 | ||||
| elif [ "$action" == gui ]; then | ||||
|  | ||||
| @ -1 +1 @@ | ||||
| 6.1.0 | ||||
| 6.2.0 | ||||
|  | ||||
							
								
								
									
										22
									
								
								apacheconfig
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								apacheconfig
									
									
									
									
									
								
							| @ -220,6 +220,28 @@ elif [ "$action" == deploy -o "$action" == localhosts ]; then | ||||
| elif [ "$action" == new-site ]; then | ||||
|     host="$site_host" | ||||
|     templdir="$site_templdir" | ||||
| 
 | ||||
|     if [ -z "$templdir" -a -d "$destdir/templates" ]; then | ||||
|         # si on ne précise pas le template à utiliser, alors afficher | ||||
|         # éventuellement un menu si plusieurs templates sont disponibles | ||||
|         templdirs=() | ||||
|         if [ -n "$(list_all "$destdir/templates" "*SITE*")" ]; then | ||||
|             array_add templdirs templates | ||||
|             templdir=templates | ||||
|         fi | ||||
|         array_from_lines stempldirs "$(list_dirs "$destdir/templates" | grep -v SITE)" | ||||
|         for stempldir in "${stempldirs[@]}"; do | ||||
|             if [ -n "$(list_all "$destdir/templates/$stempldir" "*SITE*")" ]; then | ||||
|                 array_add templdirs "templates/$stempldir" | ||||
|                 [ -n "$templdir" ] || templdir="templates/$stempldir" | ||||
|             fi | ||||
|         done | ||||
|         if [ ${#templdirs[*]} -gt 1 ]; then | ||||
|             simple_menu templdir templdirs -t "Choix du répertoire des modèles" -m "Veuillez choisir le modèle à utiliser" | ||||
|         fi | ||||
|         templdir="$destdir/$templdir" | ||||
|     fi | ||||
| 
 | ||||
|     if [[ "$templdir" != */* ]] && [ -d "$destdir/templates/$templdir" ]; then | ||||
|         templdir="$destdir/templates/$templdir" | ||||
|     elif [ -z "$templdir" ]; then | ||||
|  | ||||
| @ -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
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								cssh
									
									
									
									
									
								
							| @ -23,7 +23,7 @@ vars="$("$scriptdir/ussh" --parse "$@")" || die | ||||
| eval "$vars" | ||||
| [ "${#hosts[*]}" -gt 0 ] || die "Vous devez spécifier l'hôte sur lequel se connecter" | ||||
| 
 | ||||
| cmd="'$(quoted_args "${args[@]}") | ||||
| cmd="'$(qvals "${args[@]}") | ||||
| "' | ||||
| function __ask() { | ||||
|     local r | ||||
|  | ||||
| @ -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
									
								
							
							
						
						
									
										29
									
								
								doc/tools/create-user.md
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										45
									
								
								doc/tools/netconfig.md
									
									
									
									
									
										Normal 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 | ||||
| @ -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 | ||||
| @ -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 | ||||
|  | ||||
| @ -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 | ||||
| @ -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 | ||||
|  | ||||
| @ -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 | ||||
| @ -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 | ||||
| @ -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` | ||||
| ~~~ | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -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 | ||||
| @ -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 | ||||
| @ -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. | ||||
|  | ||||
| @ -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
									
								
							
							
						
						
									
										4
									
								
								lib/default/deploy
									
									
									
									
									
										Normal 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 | ||||
| @ -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 | ||||
|  | ||||
| @ -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@@" | ||||
|  | ||||
| @ -1 +1 @@ | ||||
| 014001000 | ||||
| 014002000 | ||||
|  | ||||
| @ -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() { | ||||
|  | ||||
							
								
								
									
										234
									
								
								lib/ulib/base
									
									
									
									
									
								
							
							
						
						
									
										234
									
								
								lib/ulib/base
									
									
									
									
									
								
							| @ -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() { | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -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;; | ||||
|  | ||||
| @ -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
									
								
							
							
						
						
									
										59
									
								
								lib/ulib/base.deprecated
									
									
									
									
									
										Normal 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" | ||||
| } | ||||
| @ -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 | ||||
|  | ||||
| @ -27,3 +27,8 @@ function isrnum() { | ||||
|     v="${v//[0-9]/}" | ||||
|     [ -z "$v" ] | ||||
| } | ||||
| 
 | ||||
| function evali() { | ||||
| # Evaluer une expression numérique | ||||
|     echo "$(($*))" | ||||
| } | ||||
|  | ||||
| @ -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 | ||||
| } | ||||
|  | ||||
| @ -270,7 +270,7 @@ if check_sysinfos -s macosx; then | ||||
|             done | ||||
|             args=("${args[@]}" "$@") | ||||
|         fi | ||||
|         quoted_args "${options[@]}" -- "${args[@]}" | ||||
|         qvals "${options[@]}" -- "${args[@]}" | ||||
|         return 0 | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -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
									
								
							
							
						
						
									
										485
									
								
								lib/ulib/deploy
									
									
									
									
									
										Normal 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 | ||||
| } | ||||
| @ -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 | ||||
|  | ||||
| @ -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 | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -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 | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -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= | ||||
|  | ||||
| @ -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"' | ||||
|  | ||||
| @ -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
											
										
									
								
							| @ -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 | ||||
| } | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -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] = \"\"" | ||||
|  | ||||
| @ -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" | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -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 | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -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" | ||||
| 
 | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
							
								
								
									
										2
									
								
								mysqlcsv
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								mysqlcsv
									
									
									
									
									
								
							| @ -132,7 +132,7 @@ if [ "$password" != "--NOT-SET--" ]; then | ||||
| fi | ||||
| 
 | ||||
| if [ -z "$query" -a -n "$input" -a "$input" != "-" ]; then | ||||
|     mysqlcmd="<$(quoted_arg "$input") $mysqlcmd" | ||||
|     mysqlcmd="<$(qval "$input") $mysqlcmd" | ||||
| fi | ||||
| 
 | ||||
| eval "$mysqlcmd" | | ||||
|  | ||||
| @ -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
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								pdev
									
									
									
									
									
								
							| @ -298,7 +298,7 @@ if [ "$action" == delete ]; then | ||||
|             eimportant "\ | ||||
| La branche $origin/$feature n'a plus lieu d'être, mais la configuration actuelle interdit de la supprimer. | ||||
| Veuillez le faire manuellement avec la commande suivante: | ||||
|     $(quoted_args git push "$origin" ":$feature")" | ||||
|     $(qvals git push "$origin" ":$feature")" | ||||
|         fi | ||||
|     fi | ||||
| fi | ||||
|  | ||||
							
								
								
									
										6
									
								
								rruns
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								rruns
									
									
									
									
									
								
							| @ -419,11 +419,11 @@ for userhost in "${hosts[@]}"; do | ||||
|             if scp -S "$SSH" "$archive" "$user@$host:"; then | ||||
|                 estep "Lancement du script de déploiement" | ||||
|                 "$SSH" -qt "$user@$host" "\ | ||||
| __estack=$(quoted_arg "$__estack") | ||||
| __tlevel=$(quoted_arg "$__tlevel") | ||||
| __estack=$(qval "$__estack") | ||||
| __tlevel=$(qval "$__tlevel") | ||||
| export __estack __tlevel | ||||
| ${UTOOLS_LANG:+UTOOLS_LANG='$UTOOLS_LANG'; export UTOOLS_LANG | ||||
| }$(quoted_args "./$archivename" ${tmproot:+--tmproot "$tmproot"})" | ||||
| }$(qvals "./$archivename" ${tmproot:+--tmproot "$tmproot"})" | ||||
|                 if [ -n "$init_sysinfos" ]; then | ||||
|                     estep "Calcul des informations de l'hôte distant" | ||||
|                     sysinfos_script=' | ||||
|  | ||||
							
								
								
									
										62
									
								
								ruinst
									
									
									
									
									
								
							
							
						
						
									
										62
									
								
								ruinst
									
									
									
									
									
								
							| @ -14,7 +14,9 @@ pas contenir d'espaces ni de caractères spéciaux. L'échappement de ces | ||||
| caractères n'est pas garanti. | ||||
| 
 | ||||
| OPTIONS | ||||
|     -C  Ne pas faire le déploiement. Configurer uniquement la connexion par clé | ||||
|     -C, --configure-user | ||||
|     --configure USER [--uses-su] | ||||
|         Ne pas faire le déploiement. Configurer uniquement la connexion par clé | ||||
|         sur les hôtes distants spécifiés pour le user spécifié. Il faut pouvoir | ||||
|         se connecter par mot de passe pour configurer la connexion par clé. | ||||
|         Si l'on veut configurer la connexion par clé pour le user root, mais que | ||||
| @ -26,14 +28,14 @@ OPTIONS | ||||
|         Si l'hôte distant n'a pas sudo ou si sudo n'est pas configuré, il faut | ||||
|         rajouter l'option --uses-su, e.g: | ||||
|             $scriptname -h user@host --configure root --uses-su | ||||
|     -T tmproot | ||||
|     -T, --tmproot TMPROOT | ||||
|         Spécifier le répertoire temporaire sur l'hôte distant, comme par exemple | ||||
|         /var/tmp. Cette option est utile pour les vservers, qui ont par défaut | ||||
|         un /tmp minuscule de 16 Mo. | ||||
|     -S, --ssh ssh | ||||
|     -S, --ssh SSH | ||||
|         Spécifier le programme à utiliser pour la connection par ssh. | ||||
|     -h hosts | ||||
|     -h @hostsfile | ||||
|     -h, --host hosts | ||||
|     -h, --host @hostsfile | ||||
|         Spécifier un ou plusieurs hôtes sur lequels faire le déploiement. Pour | ||||
|         spécifier plusieurs hôtes, il est possible d'utiliser plusieurs fois | ||||
|         l'option -h, ou spécifier en une seule fois plusieurs hôtes en les | ||||
| @ -45,7 +47,17 @@ OPTIONS | ||||
|         root. Il est possible de spécifier un autre utilisateur avec la syntaxe | ||||
|         user@host, e.g -h user@host | ||||
|         La forme @hostsfile permet de lire la liste des hôtes depuis le fichier | ||||
|         hostsfile, à raison d'un hôte par ligne." | ||||
|         hostsfile, à raison d'un hôte par ligne. | ||||
|     --deploy | ||||
|     --no-deploy | ||||
|         Autoriser (respectivement interdire) l'utilisation de la configuration | ||||
|         locale de déploiement pour identifier la destination si aucun hôte n'est | ||||
|         spécifié. | ||||
|         Par défaut, si aucun hôte n'est spécifié, la configuration locale de | ||||
|         déploiement est interrogée pour avoir cette information. | ||||
|     -c, --deploy-config CONFNAME | ||||
|         Cette option permet de spécifier le nom de la configuration à utiliser | ||||
|         pour effectuer la requête. Par défaut, utiliser le nom 'ruinst'" | ||||
| } | ||||
| 
 | ||||
| set_defaults pubkeys | ||||
| @ -54,18 +66,23 @@ action=deploy | ||||
| confuser= | ||||
| uses_su= | ||||
| tmproot= | ||||
| hosts=() | ||||
| SSH= | ||||
| force_make_archive= | ||||
| hosts=() | ||||
| deploy_enable=1 | ||||
| deploy_confname=ruinst | ||||
| parse_opts "${PRETTYOPTS[@]}" \ | ||||
|     --help '$exit_with display_help' \ | ||||
|     -C action=configure \ | ||||
|     -C,--configure-user action=configure \ | ||||
|     --configure: '$set@ confuser;action=configure' \ | ||||
|     --uses-su uses_su=1 \ | ||||
|     -T:,--tmproot: tmproot= \ | ||||
|     -S:,--ssh: SSH= \ | ||||
|     --force-make-archive force_make_archive=1 \ | ||||
|     -h:,-H:,--host: hosts \ | ||||
|     --deploy deploy_enable=1 \ | ||||
|     --no-deploy deploy_enable= \ | ||||
|     -c:,--deploy-config deploy_confname= \ | ||||
|     @ args -- "$@" && set -- "${args[@]}" || die "$args" | ||||
| 
 | ||||
| : "${SSH:=ssh}" | ||||
| @ -181,7 +198,7 @@ if [ "$action" == "configure" ]; then | ||||
| }$(<"$sshdir/$pubkey")" | ||||
|         done | ||||
|     fi | ||||
|     [ -n "$PUBKEYS" ] || die "La connexion sur les hôtes distants ne peut se faire que par mot de passe parce que vous n'avez pas de clé publique configurée. Modifiez le fichier ~/etc/default.pubkeys si ce message est erroné." | ||||
|     [ -n "$PUBKEYS" ] || die "La connexion sur les hôtes distants ne peut se faire que par mot de passe parce que vous n'avez pas de clé publique configurée. Modifiez le fichier ~/etc/default/pubkeys si ce message est erroné." | ||||
| 
 | ||||
|     [ -n "${hosts[*]}" ] || hosts=("$@") | ||||
|     [ -n "${hosts[*]}" ] || die "Vous devez spécifier la liste des hôtes à configurer" | ||||
| @ -214,6 +231,19 @@ else | ||||
| fi | ||||
| 
 | ||||
| ## Hôtes sur lesquels faire le déploiement | ||||
| if array_isempty hosts && [ -n "$deploy_enable" ]; then | ||||
|     urequire deploy | ||||
|     deploy_setconf "$deploy_confname" | ||||
|     if deploy_loadconf; then | ||||
|         setxx module=abspath "$src" // basename -- | ||||
|         if eval "$(deploy_query -v host DEST module ruinst_deploy "" shell "$module")"; then | ||||
|             check_interaction -c && einfo "Ce module sera déployé vers les hôtes suivants: | ||||
| $(array_to_lines host "" "    ")" | ||||
|             ask_any "Voulez-vous continuer?" Oq || die | ||||
|             array_copy hosts host | ||||
|         fi | ||||
|     fi | ||||
| fi | ||||
| array_isempty hosts && read_value "Entrez une liste d'hôtes séparés par ':'" hosts "localhost" | ||||
| fix_hosts | ||||
| 
 | ||||
| @ -240,6 +270,11 @@ if [ -n "$make_archive" ]; then | ||||
| fi | ||||
| 
 | ||||
| ## Déploiement | ||||
| 
 | ||||
| # sur l'hôte distant, ne rendre interactif qu'à partir de -yy | ||||
| rinteraction=$__interaction | ||||
| [ $rinteraction -lt 2 ] && rinteraction=$(($rinteraction + 1)) | ||||
| 
 | ||||
| for host in "${hosts[@]}"; do | ||||
|     if [ "$host" == "localhost" ]; then | ||||
|         etitle -s "Déploiement sur l'hôte local" | ||||
| @ -258,11 +293,12 @@ for host in "${hosts[@]}"; do | ||||
|         scp -S "$SSH" "$archive" "$user@$host:" || die | ||||
|         estep "Lancement du script de déploiement" | ||||
|         "$SSH" -qt "$user@$host" "\ | ||||
| __estack=$(quoted_arg "$__estack") | ||||
| __tlevel=$(quoted_arg "$__tlevel") | ||||
| export __estack __tlevel | ||||
| __interaction=$rinteraction | ||||
| __estack=$(qval "$__estack") | ||||
| __tlevel=$(qval "$__tlevel") | ||||
| export __interaction __estack __tlevel | ||||
| ${UTOOLS_LANG:+UTOOLS_LANG='$UTOOLS_LANG'; export UTOOLS_LANG | ||||
| }$(quoted_args "./$archivename" ${tmproot:+--tmproot "$tmproot"} -- MYHOST="$host" "$@")" | ||||
| }$(qvals "./$archivename" ${tmproot:+--tmproot "$tmproot"} -- MYHOST="$host" "$@")" | ||||
|         eend | ||||
|     fi | ||||
| done | ||||
|  | ||||
							
								
								
									
										147
									
								
								rwoinst
									
									
									
									
									
								
							
							
						
						
									
										147
									
								
								rwoinst
									
									
									
									
									
								
							| @ -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 | ||||
|  | ||||
| @ -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 | ||||
|     ) | ||||
| } | ||||
|  | ||||
| @ -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 | ||||
|     ) | ||||
| } | ||||
|  | ||||
							
								
								
									
										10
									
								
								udist
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								udist
									
									
									
									
									
								
							| @ -237,10 +237,10 @@ function __load_udist_nolocal() { ( | ||||
|     [ -d "$udistf" ] && udistf="$udistf/.udist" | ||||
|     source "$udistf" | ||||
| 
 | ||||
|     set_var_cmd "${2}VERSION" "$VERSION" | ||||
|     echo_setv "${2}VERSION" "$VERSION" | ||||
|     set_array_cmd "${2}VERSIONS" VERSIONS | ||||
|     set_array_cmd "${2}TAGS" TAGS | ||||
|     set_var_cmd "${2}ORIGIN" "$ORIGIN" | ||||
|     echo_setv "${2}ORIGIN" "$ORIGIN" | ||||
|     set_array_cmd "${2}LOCALS" LOCALS | ||||
| ); } | ||||
| 
 | ||||
| @ -264,10 +264,10 @@ function __save_udist() { | ||||
|         splitpair "$__su_dest" __su_dest __su_varname | ||||
|         [ -n "$__su_varname" ] || __su_varname="$__su_dest" | ||||
|         case "$__su_dest" in | ||||
|         VERSION) array_add __su_cmd "$(set_var_cmd VERSION "${!__su_varname}")";; | ||||
|         VERSION) array_add __su_cmd "$(echo_setv VERSION "${!__su_varname}")";; | ||||
|         VERSIONS) array_add __su_cmd "$(set_array_cmd VERSIONS "${__su_varname}")";; | ||||
|         TAGS) array_add __su_cmd "$(set_array_cmd TAGS "${__su_varname}")";; | ||||
|         ORIGIN) array_add __su_cmd "$(set_var_cmd ORIGIN "${!__su_varname}")";; | ||||
|         ORIGIN) array_add __su_cmd "$(echo_setv ORIGIN "${!__su_varname}")";; | ||||
|         LOCALS) array_add __su_cmd "$(set_array_cmd LOCALS "${__su_varname}")";; | ||||
|         esac | ||||
|     done | ||||
| @ -1306,7 +1306,7 @@ function local_put_cmd() { | ||||
|             local script= | ||||
|             for localfile in "${localfiles[@]}"; do | ||||
|                 [ -n "$script" ] && script="$script; " | ||||
|                 script="$script$(quoted_args chown "$owner" "$destdir/$localfile")" | ||||
|                 script="$script$(qvals chown "$owner" "$destdir/$localfile")" | ||||
|             done | ||||
|             "${ssh:-ssh}" -qt "$userhost:$destdir" "$script" | ||||
|         fi | ||||
|  | ||||
							
								
								
									
										12
									
								
								uldap
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								uldap
									
									
									
									
									
								
							| @ -41,7 +41,7 @@ function split_cmds() { | ||||
|             fi | ||||
|         done | ||||
|         if [ -n "$__sc_addtocmd" ]; then | ||||
|             __sc_cmd="${__sc_cmd:+$__sc_cmd }$(quoted_arg "$__sc_arg")" | ||||
|             __sc_cmd="${__sc_cmd:+$__sc_cmd }$(qvalm "$__sc_arg")" | ||||
|             __sc_arg= | ||||
|         fi | ||||
|         if [ -n "$__sc_foundsep" ]; then | ||||
| @ -150,7 +150,7 @@ function set_values() { | ||||
|         if array_contains VARIABLES "$uname" || array_contains SPECIAL_VARIABLES "$uname"; then | ||||
|             "set_$lname" "$value" || s=1 | ||||
|         elif ! array_contains PROTECTED_VARIABLES "$name"; then | ||||
|             set_var "$name" "$value" | ||||
|             _setv "$name" "$value" | ||||
|         else | ||||
|             s=1 | ||||
|         fi | ||||
| @ -321,7 +321,7 @@ function __push() { | ||||
|     local __varcmd __name | ||||
|     for __name in "$@"; do | ||||
|         __varcmd="${__varcmd:+$__varcmd | ||||
| }$(set_var_cmd "$__name" "${!__name}")" | ||||
| }$(echo_setv "$__name" "${!__name}")" | ||||
|     done | ||||
|     WSSTACK=("${WSSTACK[@]}" "$__varcmd") | ||||
| } | ||||
| @ -1349,7 +1349,7 @@ function uldap_undo() { | ||||
| 
 | ||||
| function uldap_ifok() { | ||||
|     if [ "$EXITCODE" -eq 0 ]; then | ||||
|         eval_cmdline "$(quoted_args "$@")" | ||||
|         eval_cmdline "$(qvals "$@")" | ||||
|     else | ||||
|         return 0 | ||||
|     fi | ||||
| @ -1357,7 +1357,7 @@ function uldap_ifok() { | ||||
| 
 | ||||
| function uldap_iferror() { | ||||
|     if [ "$EXITCODE" -ne 0 ]; then | ||||
|         eval_cmdline "$(quoted_args "$@")" | ||||
|         eval_cmdline "$(qvals "$@")" | ||||
|     else | ||||
|         return 0 | ||||
|     fi | ||||
| @ -1464,7 +1464,7 @@ if [ -n "$*" ]; then | ||||
|     INTERACTIVE= | ||||
|     [ "$EXIT_ON_ERROR" == auto ] && set_values exit_on_error=true | ||||
|     # splitter sur les lignes | ||||
|     array_from_lines lcmds "$(quoted_args "$@")" | ||||
|     array_from_lines lcmds "$(qvals "$@")" | ||||
|     [ -n "$AUTOPRINT" ] && array_add lcmds print | ||||
| elif [ -n "$lscriptfile" ]; then | ||||
|     [ -f "$lscriptfile" ] || die "$lscriptfile: fichier introuvable" | ||||
|  | ||||
							
								
								
									
										10
									
								
								ulib
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								ulib
									
									
									
									
									
								
							| @ -343,18 +343,18 @@ if ! grep -q '$scriptdir/profile' ~/.bash_profile; then | ||||
| fi | ||||
| 
 | ||||
| # Modifier le PATH. Ajouter aussi le chemin vers les uapps python | ||||
| PATH=$(quoted_args "$scriptdir:$scriptdir/lib/pyulib/src/uapps:$PATH") | ||||
| PATH=$(qval "$scriptdir:$scriptdir/lib/pyulib/src/uapps:$PATH") | ||||
| 
 | ||||
| if [ -n '$DEFAULT_PS1' ]; then | ||||
|   DEFAULT_PS1=$(quoted_args "[ulibshell] $DEFAULT_PS1") | ||||
|   DEFAULT_PS1=$(qval "[ulibshell] $DEFAULT_PS1") | ||||
| else | ||||
|   if [ -z '$PS1' ]; then | ||||
|     PS1='\\u@\\h \\w \\$ ' | ||||
|   fi | ||||
|   PS1=\"[ulibshell] \$PS1\" | ||||
| fi | ||||
| $(quoted_args source "$scriptdir/lib/ulib/ulib") | ||||
| __ULIB_FORCE_RELOAD=$(quoted_args "$__ULIB_FORCE_RELOAD") | ||||
| $(qvals source "$scriptdir/lib/ulib/ulib") | ||||
| __ULIB_FORCE_RELOAD=$(qval "$__ULIB_FORCE_RELOAD") | ||||
| urequire DEFAULTS" >"$bashrc" | ||||
| 
 | ||||
|     array_fix_paths modules | ||||
| @ -362,7 +362,7 @@ urequire DEFAULTS" >"$bashrc" | ||||
|         etitle "Chargement des modules" | ||||
|         for module in "${modules[@]}"; do | ||||
|             estep "$module" | ||||
|             quoted_args urequire "$module" >>"$bashrc" | ||||
|             qvals urequire "$module" >>"$bashrc" | ||||
|         done | ||||
|         eend | ||||
|     fi | ||||
|  | ||||
							
								
								
									
										8
									
								
								umatch
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								umatch
									
									
									
									
									
								
							| @ -120,14 +120,14 @@ case "$regexp" in | ||||
| ip) regexp='[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+';; | ||||
| esac | ||||
| 
 | ||||
| cmd="$(quoted_args match "$regexp" "$sep")" | ||||
| cmd="$(qvals match "$regexp" "$sep")" | ||||
| [ -n "$sort" ] && cmd="$cmd | sort" | ||||
| [ -n "$count" ] && cmd="$cmd | $(quoted_args count "$count" "$sep" "$all_lines")" | ||||
| [ -n "$count" ] && cmd="$cmd | $(qvals count "$count" "$sep" "$all_lines")" | ||||
| if [ -n "$multiple" ]; then | ||||
|     if [ -n "$all_lines" ]; then | ||||
|         cmd="$cmd | $(quoted_args grep -v -B 1 "^1$sep")" | ||||
|         cmd="$cmd | $(qvals grep -v -B 1 "^1$sep")" | ||||
|     else | ||||
|         cmd="$cmd | $(quoted_args grep -v "^1$sep")" | ||||
|         cmd="$cmd | $(qvals grep -v "^1$sep")" | ||||
|     fi | ||||
| fi | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										15
									
								
								uscrontab
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								uscrontab
									
									
									
									
									
								
							| @ -285,7 +285,13 @@ OPTIONS AVANCEES | ||||
|         Pour le développement ou des tests, forcer la valeur de l'heure de | ||||
|         référence. Il faut respecter le format, sinon les résultats ne sont pas | ||||
|         garantis. Le mieux est de reprendre le résultat de l'option --show-ctnow | ||||
|         en le modifiant un peu si nécessaire." | ||||
|         en le modifiant un peu si nécessaire. | ||||
|     -G, --any-ctnow | ||||
|         Pour le développement ou des tests, lancer toutes les commandes dans | ||||
|         l'ordre sans tenir compte de l'heure de référence. Cette commande ne | ||||
|         devrait pas être utilisée en temps normal, mais elle existe pour | ||||
|         simplifier les tests avec --show-ctnow + --force-ctnow dans les cas | ||||
|         simples." | ||||
| } | ||||
| 
 | ||||
| function set_usercrontabs() { | ||||
| @ -361,6 +367,7 @@ parse_opts "${PRETTYOPTS[@]}" \ | ||||
|     -k:,--stop: USCRONTAB_STOPEC= \ | ||||
|     --show-ctnow action=show-ctnow \ | ||||
|     --force-ctnow: __CTRESOLVE_CTNOW= \ | ||||
|     -G,--any-ctnow __CTRESOLVE_CTNOW="**ANY**" \ | ||||
|     @ args -- "$@" && set -- "${args[@]}" || die "$args" | ||||
| 
 | ||||
| uscrontab="$1"; shift | ||||
| @ -477,12 +484,12 @@ fi | ||||
| 
 | ||||
| if [ "$action" == "install" ]; then | ||||
|     ctline="$USCRONTAB_CTLINE" | ||||
|     [ -n "$uscrontab" ] && ctline="$ctline $(quoted_arg "$uscrontab")" | ||||
|     [ -n "$uscrontab" ] && ctline="$ctline $(qvalm "$uscrontab")" | ||||
|     enable_in_crontab "$ctline" && estep "add_to_crontab $ctline" | ||||
| 
 | ||||
| elif [ "$action" == "uninstall" ]; then | ||||
|     ctline="$USCRONTAB_CTLINE" | ||||
|     [ -n "$uscrontab" ] && ctline="$ctline $(quoted_arg "$uscrontab")" | ||||
|     [ -n "$uscrontab" ] && ctline="$ctline $(qvalm "$uscrontab")" | ||||
|     if [ -n "$disable_only" ]; then | ||||
|         disable_in_crontab "$ctline" && estep "disable_in_crontab $ctline" | ||||
|     else | ||||
| @ -648,7 +655,7 @@ puis supprimez le cas échéant le fichier $pidfile" | ||||
|         for __var in "$@"; do | ||||
|             splitvar "$__var" __name __value | ||||
|             edebug "$__name=$__value" | ||||
|             set_var "$__name" "$__value" | ||||
|             _setv "$__name" "$__value" | ||||
|         done | ||||
|         eval "$__ctscript" | ||||
|         ac_cleanall | ||||
|  | ||||
							
								
								
									
										6
									
								
								ussh
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								ussh
									
									
									
									
									
								
							| @ -369,13 +369,13 @@ function show_vars() { | ||||
|     local -a sshopts | ||||
|     [ "${#hosts[*]}" -gt 1 ] && exec= | ||||
|     set_array_cmd hosts | ||||
|     set_var_cmd ssh "$SSH" | ||||
|     set_var_cmd exec "$exec" | ||||
|     echo_setv ssh "$SSH" | ||||
|     echo_setv exec "$exec" | ||||
|     set_array_cmd args @ "$@" | ||||
|     for host in "${hosts[@]}"; do | ||||
|         array_copy sshopts SSHOPTS | ||||
|         __update_sshopts "$host" "$@" | ||||
|         set_var_cmd host "$host" | ||||
|         echo_setv host "$host" | ||||
|         set_array_cmd options sshopts | ||||
|     done | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user