diff --git a/rruns b/rruns index 5b9c656..f169314 100755 --- a/rruns +++ b/rruns @@ -1,14 +1,16 @@ #!/bin/bash # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +source "$(dirname "$0")/ulib/ulib" || exit 1 +urequire DEFAULTS runs function display_help() { uecho "$scriptname: Déploiement distant avec runs USAGE - $scriptname [-h host] [-T tmproot] rscriptname name=value... - $scriptname [-h host] [-T tmproot] @recipe name=value... - $scriptname [-h host] [-T tmproot] -f rscript name=value... - $scriptname [-h host] [-T tmproot] -r recipe name=value... + $scriptname [-h hosts] [-T tmproot] rscriptname name=value... + $scriptname [-h hosts] [-T tmproot] @recipe name=value... + $scriptname [-h hosts] [-T tmproot] -f rscript name=value... + $scriptname [-h hosts] [-T tmproot] -r recipe name=value... Lancer ce script sans argument (hors options) est équivalent à le lancer avec l'argument @default @@ -31,12 +33,16 @@ OPTIONS Spécifier le programme à utiliser pour la connection par ssh. -h host -h @hostsfile - 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. Si cette option n'est pas spécifiée, et que le répertoire courant est @@ -68,10 +74,6 @@ OPTIONS argument (hors options)." } -source "$(dirname "$0")/ulib/ulib" && -urequire DEFAULTS runs || -exit 1 - set_defaults runs action=deploy @@ -142,6 +144,13 @@ function parse_hostsfile() { 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éparer ces @@ -149,7 +158,10 @@ function fix_hosts() { # Supporter la syntaxe @hostsfile qui permet de charger la liste des hôtes # depuis un fichier. # Remplacer aussi les '.' par 'localhost' - array_fix_paths hosts + 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%/}" diff --git a/ruinst b/ruinst index 937557a..6c52ca1 100755 --- a/ruinst +++ b/ruinst @@ -1,5 +1,7 @@ #!/bin/bash # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +source "$(dirname "$0")/ulib/ulib" || exit 1 +urequire DEFAULTS nutools/pyulib function display_help() { uecho "$scriptname: Déploiement distant avec uinst @@ -27,11 +29,15 @@ OPTIONS un /tmp minuscule de 16 Mo. -S ssh Spécifier le programme à utiliser pour la connection par ssh. - -h host + -h hosts -h @hostsfile - 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 @@ -39,10 +45,6 @@ OPTIONS hostsfile, à raison d'un hôte par ligne." } -source "$(dirname "$0")/ulib/ulib" && -urequire DEFAULTS nutools/pyulib || -exit 1 - set_defaults pubkeys action=deploy @@ -92,6 +94,13 @@ function parse_hostsfile() { 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éparer ces @@ -99,7 +108,10 @@ function fix_hosts() { # Supporter la syntaxe @hostsfile qui permet de charger la liste des hôtes # depuis un fichier. # Remplacer aussi les '.' par 'localhost' - array_fix_paths hosts + 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%/}" diff --git a/ussh b/ussh index 8bf9daa..45f2509 100755 --- a/ussh +++ b/ussh @@ -10,10 +10,13 @@ USAGE $scriptname -R hosts... OPTIONS - host + hosts @hostsfile - Spécifier un hôte distant sur lequel faire la connexion. Plusieurs - hôtes peuvent être spécifiées, en les séparant par ':', e.g. host1:host2 + Spécifier un ou plusieurs hôtes distants sur lequels faire la connexion. + Pour spécifier plusieurs hôtes, il faut les séparer par un espace ou le + caractère ':', e.g. 'host1 host2' ou 'host1:host2'. Si la spécification + contient les caractères { et }, l'expansion est effectuée, e.g + 'root@{host1,host2}.univ.run' La forme @hostsfile permet de lire la liste des hôtes depuis le fichier hostsfile, à raison d'un hôte par ligne. [options] @@ -28,6 +31,8 @@ argument): Forcer l'allocation d'un TTY -l, --login USER Spécifier le user avec lequel se connecter + -p, --port PORT + Spécifier le port sur lequel se connecter -o OPTION Ajouter une option de SSH Les options suivantes *doivent* se trouver *AVANT* le premier argument: @@ -82,14 +87,24 @@ function parse_hostsfile() { 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éparer ces - # éléments. i.e (a b:c) --> (a b c) + # éléments. i.e (a b:c "d e") --> (a b c d e) # Supporter la syntaxe @hostsfile qui permet de charger la liste des hôtes # depuis un fichier. # Remplacer aussi les '.' par 'localhost' - array_fix_paths hosts + 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%/}" @@ -107,7 +122,7 @@ function fix_hosts() { } function ussh() { - args=(${quiet:+-q} ${tty:+-t} ${login:+-l "$login"}) + args=(${quiet:+-q} ${tty:+-t} ${login:+-l "$login"} ${port:+-p "$port"}) for option in "${options[@]}"; do args=("${args[@]}" -o "$option") done @@ -166,6 +181,7 @@ action=ssh quiet= tty= login="$USSH_USER" +port= options=() domain="$USSH_DOMAIN" ssh= @@ -175,7 +191,8 @@ parse_opts + "${PRETTYOPTS[@]}" \ -q,--quiet quiet=1 \ -t,--tty tty=1 \ -l:,--login: login= \ - -o options \ + -p:,--port: port= \ + -o: options \ -d:,--domain: domain= \ -S:,--ssh ssh= \ -R,--remove action=remove \