modifier la méthode d'analyse de la liste des hôtes

This commit is contained in:
Jephté Clain 2014-04-15 15:18:17 +04:00
parent 8760cade72
commit f1d1248fc4
3 changed files with 70 additions and 29 deletions

38
rruns
View File

@ -1,14 +1,16 @@
#!/bin/bash #!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname "$0")/ulib/ulib" || exit 1
urequire DEFAULTS runs
function display_help() { function display_help() {
uecho "$scriptname: Déploiement distant avec runs uecho "$scriptname: Déploiement distant avec runs
USAGE USAGE
$scriptname [-h host] [-T tmproot] rscriptname name=value... $scriptname [-h hosts] [-T tmproot] rscriptname name=value...
$scriptname [-h host] [-T tmproot] @recipe name=value... $scriptname [-h hosts] [-T tmproot] @recipe name=value...
$scriptname [-h host] [-T tmproot] -f rscript name=value... $scriptname [-h hosts] [-T tmproot] -f rscript name=value...
$scriptname [-h host] [-T tmproot] -r recipe name=value... $scriptname [-h hosts] [-T tmproot] -r recipe name=value...
Lancer ce script sans argument (hors options) est équivalent à le lancer avec Lancer ce script sans argument (hors options) est équivalent à le lancer avec
l'argument @default l'argument @default
@ -31,12 +33,16 @@ OPTIONS
Spécifier le programme à utiliser pour la connection par ssh. Spécifier le programme à utiliser pour la connection par ssh.
-h host -h host
-h @hostsfile -h @hostsfile
Spécifier un hôte distant sur lequel faire le déploiement. Plusieurs Spécifier un ou plusieurs hôtes sur lequels faire le déploiement. Pour
options -h peuvent être spécifiées, ou alors on peut séparer plusieurs spécifier plusieurs hôtes, il est possible d'utiliser plusieurs fois
hôtes par ':', e.g. -h host1:host2 l'option -h, ou spécifier en une seule fois plusieurs hôtes en les
séparant par un espace ou le caractère ':', e.g. 'host1 host2' ou
'host1:host2'. Si la spécification contient les caractères { et },
l'expansion est effectuée, e.g
-h 'root@{host1,host2}.univ.run'
Par défaut, la connexion sur l'hôte distant se fait avec l'utilisateur Par défaut, la connexion sur l'hôte distant se fait avec l'utilisateur
root. Il est possible de spécifier un autre utilisateur avec la syntaxe root. Il est possible de spécifier un autre utilisateur avec la syntaxe
user@host, e.g -h $USER@host user@host, e.g -h user@host
La forme @hostsfile permet de lire la liste des hôtes depuis le fichier 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.
Si cette option n'est pas spécifiée, et que le répertoire courant est Si cette option n'est pas spécifiée, et que le répertoire courant est
@ -68,10 +74,6 @@ OPTIONS
argument (hors options)." argument (hors options)."
} }
source "$(dirname "$0")/ulib/ulib" &&
urequire DEFAULTS runs ||
exit 1
set_defaults runs set_defaults runs
action=deploy action=deploy
@ -142,6 +144,13 @@ function parse_hostsfile() {
done done
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 __dot_is_localhost() { [ "$1" == "." ] && echo "localhost" || echo "$1"; }
function fix_hosts() { function fix_hosts() {
# Si hosts contient des éléments multiple, comme a:b, séparer ces # 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 # Supporter la syntaxe @hostsfile qui permet de charger la liste des hôtes
# depuis un fichier. # depuis un fichier.
# Remplacer aussi les '.' par 'localhost' # 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 local -a _hosts _tmphosts host
for host in "${hosts[@]}"; do for host in "${hosts[@]}"; do
host="${host%/}" host="${host%/}"

30
ruinst
View File

@ -1,5 +1,7 @@
#!/bin/bash #!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname "$0")/ulib/ulib" || exit 1
urequire DEFAULTS nutools/pyulib
function display_help() { function display_help() {
uecho "$scriptname: Déploiement distant avec uinst uecho "$scriptname: Déploiement distant avec uinst
@ -27,11 +29,15 @@ OPTIONS
un /tmp minuscule de 16 Mo. un /tmp minuscule de 16 Mo.
-S ssh -S ssh
Spécifier le programme à utiliser pour la connection par ssh. Spécifier le programme à utiliser pour la connection par ssh.
-h host -h hosts
-h @hostsfile -h @hostsfile
Spécifier un hôte distant sur lequel faire le déploiement. Plusieurs Spécifier un ou plusieurs hôtes sur lequels faire le déploiement. Pour
options -h peuvent être spécifiées, ou alors on peut séparer plusieurs spécifier plusieurs hôtes, il est possible d'utiliser plusieurs fois
hôtes par ':', e.g. -h host1:host2 l'option -h, ou spécifier en une seule fois plusieurs hôtes en les
séparant par un espace ou le caractère ':', e.g. 'host1 host2' ou
'host1:host2'. Si la spécification contient les caractères { et },
l'expansion est effectuée, e.g
-h 'root@{host1,host2}.univ.run'
Par défaut, la connexion sur l'hôte distant se fait avec l'utilisateur Par défaut, la connexion sur l'hôte distant se fait avec l'utilisateur
root. Il est possible de spécifier un autre utilisateur avec la syntaxe root. Il est possible de spécifier un autre utilisateur avec la syntaxe
user@host, e.g -h user@host user@host, e.g -h user@host
@ -39,10 +45,6 @@ OPTIONS
hostsfile, à raison d'un hôte par ligne." hostsfile, à raison d'un hôte par ligne."
} }
source "$(dirname "$0")/ulib/ulib" &&
urequire DEFAULTS nutools/pyulib ||
exit 1
set_defaults pubkeys set_defaults pubkeys
action=deploy action=deploy
@ -92,6 +94,13 @@ function parse_hostsfile() {
done done
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 __dot_is_localhost() { [ "$1" == "." ] && echo "localhost" || echo "$1"; }
function fix_hosts() { function fix_hosts() {
# Si hosts contient des éléments multiple, comme a:b, séparer ces # 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 # Supporter la syntaxe @hostsfile qui permet de charger la liste des hôtes
# depuis un fichier. # depuis un fichier.
# Remplacer aussi les '.' par 'localhost' # 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 local -a _hosts _tmphosts host
for host in "${hosts[@]}"; do for host in "${hosts[@]}"; do
host="${host%/}" host="${host%/}"

31
ussh
View File

@ -10,10 +10,13 @@ USAGE
$scriptname -R hosts... $scriptname -R hosts...
OPTIONS OPTIONS
host hosts
@hostsfile @hostsfile
Spécifier un hôte distant sur lequel faire la connexion. Plusieurs Spécifier un ou plusieurs hôtes distants sur lequels faire la connexion.
hôtes peuvent être spécifiées, en les séparant par ':', e.g. host1:host2 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 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.
[options] [options]
@ -28,6 +31,8 @@ argument):
Forcer l'allocation d'un TTY Forcer l'allocation d'un TTY
-l, --login USER -l, --login USER
Spécifier le user avec lequel se connecter Spécifier le user avec lequel se connecter
-p, --port PORT
Spécifier le port sur lequel se connecter
-o OPTION -o OPTION
Ajouter une option de SSH Ajouter une option de SSH
Les options suivantes *doivent* se trouver *AVANT* le premier argument: Les options suivantes *doivent* se trouver *AVANT* le premier argument:
@ -82,14 +87,24 @@ function parse_hostsfile() {
done done
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 __dot_is_localhost() { [ "$1" == "." ] && echo "localhost" || echo "$1"; }
function fix_hosts() { function fix_hosts() {
# Si hosts contient des éléments multiple, comme a:b, séparer ces # Si hosts contient des éléments multiple, comme a:b, séparer ces
# éléments. i.e (a b:c) --> (a b c) # éléments. i.e (a b:c "d e") --> (a b c d e)
# Supporter la syntaxe @hostsfile qui permet de charger la liste des hôtes # Supporter la syntaxe @hostsfile qui permet de charger la liste des hôtes
# depuis un fichier. # depuis un fichier.
# Remplacer aussi les '.' par 'localhost' # 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 local -a _hosts _tmphosts host
for host in "${hosts[@]}"; do for host in "${hosts[@]}"; do
host="${host%/}" host="${host%/}"
@ -107,7 +122,7 @@ function fix_hosts() {
} }
function ussh() { 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 for option in "${options[@]}"; do
args=("${args[@]}" -o "$option") args=("${args[@]}" -o "$option")
done done
@ -166,6 +181,7 @@ action=ssh
quiet= quiet=
tty= tty=
login="$USSH_USER" login="$USSH_USER"
port=
options=() options=()
domain="$USSH_DOMAIN" domain="$USSH_DOMAIN"
ssh= ssh=
@ -175,7 +191,8 @@ parse_opts + "${PRETTYOPTS[@]}" \
-q,--quiet quiet=1 \ -q,--quiet quiet=1 \
-t,--tty tty=1 \ -t,--tty tty=1 \
-l:,--login: login= \ -l:,--login: login= \
-o options \ -p:,--port: port= \
-o: options \
-d:,--domain: domain= \ -d:,--domain: domain= \
-S:,--ssh ssh= \ -S:,--ssh ssh= \
-R,--remove action=remove \ -R,--remove action=remove \