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
# -*- 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%/}"

30
ruinst
View File

@ -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%/}"

31
ussh
View File

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