From 5c75737a699f5845f2195e24da05ee3e52df07e9 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Wed, 27 Jan 2016 11:23:13 +0400 Subject: [PATCH 1/6] =?UTF-8?q?ussh:=20configuration=20du=20multiplexage?= =?UTF-8?q?=20pour=20certains=20h=C3=B4tes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/default/nutools | 5 -- lib/default/ussh | 40 +++++++++++++ ussh | 133 +++++++++++++++++++++++++++++++++++++------- 3 files changed, 154 insertions(+), 24 deletions(-) create mode 100644 lib/default/ussh diff --git a/lib/default/nutools b/lib/default/nutools index e067c5b..941ceaf 100644 --- a/lib/default/nutools +++ b/lib/default/nutools @@ -6,8 +6,3 @@ # Le type d'analyse d'argument est spécifié avec un préfixe +auto (par défaut) # ou +manual #SHELL_TYPE=auto+auto - -# Utilisateur par défaut pour la commande ussh -#USSH_USER=root -# Domaine par défaut pour la commande ussh -#USSH_DOMAIN= diff --git a/lib/default/ussh b/lib/default/ussh new file mode 100644 index 0000000..5664f5d --- /dev/null +++ b/lib/default/ussh @@ -0,0 +1,40 @@ +# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +# Paramètres par défaut pour ussh. Pour compatibilité, les valeurs USSH_USER et +# USSH_DOMAIN sont valides aussi (elles sont chargées depuis le fichier de +# configuration 'nutools'), mais les valeurs disponibles ici ont la priorité. + +# Utilisateur par défaut +#DEFAULT_USER=root + +# Domaine par défaut +#DEFAULT_DOMAIN= + +# Valeur par défaut de la valeur du paramètre ControlPersist +#DEFAULT_PERSIST=5m + +# Hôtes pour lesquels ussh configure automatiquement un control master +# Chaque élément de ce tableau est une clé utilisée pour lire des valeurs par +# défaut dans des variables. +#CMHOSTS=(host) + +## Exemple de valeurs pour la clé "host" dans le tableau CMHOSTS + +# Faut-il multiplexer la connexion à l'hôte? C'est le cas par défaut puisque +# c'est l'objet de cette configuration. +#host_SHARED=1 + +# Nom d'hôtes associés à cette configuration. Typiquement, ce sont le nom +# pleinement qualifiés et les aliases de l'hôte. Par défaut, ce tableau contient +# (host.DEFAULT_DOMAIN host) +#host_HOSTS=(host.domain host) + +# Fichier utilisé pour coordonner le multiplexage. Dans cette chaine, @user, +# @host et @port sont respectivement remplacé par le compte de connexion, l'hôte +# pleinement qualifié et le port de connexion. +#host_CONTROL="$HOME/.ssh/@user@@host:@port" + +# Faut-il utiliser ControlPersist? Nécessite une version 5.6 ou ultérieure de +# OpenSSH. Avec auto, vérifier la version d'OpenSSH installée et choisir le cas +# échéant la valeur de la variable DEFAULT_PERSIST. Sinon passer la valeur sans +# modification +#host_PERSIST=auto diff --git a/ussh b/ussh index 317c628..525b5f5 100755 --- a/ussh +++ b/ussh @@ -112,7 +112,9 @@ function __expand_braces() { echo "$1" fi } -function __dot_is_localhost() { [ "$1" == "." ] && echo "localhost" || echo "$1"; } +function __dot_is_localhost() { + [ "$1" == "." ] && echo "localhost" || echo "$1" +} function __fix_domain() { local user host splituserhost "$1" user host @@ -192,15 +194,15 @@ function remove_keys() { eend } -function __have_ssh_config() { +function __parse_ssh_config() { local host="$1" config="$2" [ -f "$config" ] || return 1 awkrun host="$host" ' BEGIN { in_host = 0 - ec = 1 + found_user = 0 } -tolower($1) == "host" { +!found_user && tolower($1) == "host" { in_host = 0 for (i = 2; i <= NF; i++) { if ($i == host) { @@ -210,24 +212,111 @@ tolower($1) == "host" { } } in_host && tolower($1) == "user" { - ec = 0 - exit 0 + print "SSH_USER=\"" $2 "\"" + found_user = 1 +} +in_host && tolower($1) == "port" { + print "SSH_PORT=\"" $2 "\"" } END { - exit ec + if (found_user) print "true" + else print "false" } ' -- "$config" } -function __update_sshopts_l() { - # Ajouter l'option -l USSH_USER au tableau sshopts si aucune définition pour - # l'hôte $1 n'existe dans l'un des fichiers de configuration de ssh - if [ -n "$1" ]; then - __have_ssh_config "$1" ~/.ssh/config && return - __have_ssh_config "$1" /etc/ssh/ssh_config && return +function __update_sshopts_misc() { + # Déterminer l'utilisateur et le port de connexion et les placer dans les + # variables SSH_USER et SSH_PORT, respectivement. Analyser pour cela les + # arguments qui sont fournis dans les paramètres 2..@ + # Ajouter l'option -l DEFAULT_USER au tableau sshopts si aucune définition + # pour l'hôte $1 n'existe dans l'un des fichiers de configuration de ssh et + # si l'utilisateur n'a pas déjà spécifié un compte utilisateur. + SSH_PORT=22 + # L'utilisateur est peut-être fourni avec l'hôte + local user host + splituserhost "$1" user host; shift + if [ -n "$user" ]; then + SSH_USER="$user" + return fi - # Rajouter l'option au début pour que l'utilisateur puisse la surcharger - sshopts=(${USSH_USER:+-l "$USSH_USER"} "${sshopts[@]}") + # Analyser les configuration de ssh + eval "$(__parse_ssh_config "$1" ~/.ssh/config)" && return + eval "$(__parse_ssh_config "$1" /etc/ssh/ssh_config)" && return + # Analyser les arguments + local i=1 + while [ $i -le $# ]; do + if [ "${!i}" == -l ]; then + i=$(($i + 1)) + SSH_USER="${!i}" + elif [ "${!i}" == -p ]; then + i=$(($i + 1)) + SSH_PORT="${!i}" + fi + i=$(($i + 1)) + done + [ -n "$SSH_USER" ] && return + # Rajouter l'option -l au début. De cette façon, on laisse la possibilité à + # l'utilisateur de surcharger cette option, dans le cas où nous n'avons pas + # pu analyser les arguments correctement + SSH_USER="${DEFAULT_USER:-$USER}" + sshopts=(${DEFAULT_USER:+-l "$DEFAULT_USER"} "${sshopts[@]}") +} +function __update_sshopts_cm() { + # Rajouter le cas échéant les options pour le multiplexage des connexions au + # tableau sshopts, pour l'hôte $1 + # SSH_USER doit être défini + local user host + local found cmhost cmkey tmphost shared control persist + local -a hosts + splituserhost "$1" user host + for cmhost in "${CMHOSTS[@]}"; do + [ -n "$cmhost" ] || continue + cmkey="$cmhost"; cmkey="${cmkey//./_}"; cmkey="${cmkey//-/_}" + array_copy hosts "${cmkey}_HOSTS" + if [ -z "${hosts[0]}" ]; then + if [[ "$cmhost" == *.* ]]; then + hosts=("$cmhost" "${cmhost%%.*}") + else + hosts=("$cmhost${DEFAULT_DOMAIN:+.$DEFAULT_DOMAIN}" "$cmhost") + fi + fi + if array_contains hosts "$host"; then + found=1 + break + fi + done + [ -n "$found" ] || return + shared="${cmkey}_SHARED"; shared="${!shared}" + [ -n "$shared" ] || shared=1 # connexion multiplexée par défaut + is_yes "$shared" || return + control="${cmkey}_CONTROL"; control="${!control}" + [ -n "$control" ] || control="$HOME/.ssh/@user@@host:@port" + control="${control//@user/$SSH_USER}" + control="${control//@port/$SSH_PORT}" + control="${control//@host/${hosts[0]}}" + persist="${cmkey}_PERSIST"; persist="${!persist}" + [ -n "$persist" ] || persist=auto + + sshopts=("${sshopts[@]}" -o ControlPath="$control" -o ControlMaster=auto) + if [ "$persist" == auto ]; then + local version major minor + version="$(ssh -V 2>&1)" + version="${version#OpenSSH_}"; major="${version%%.*}" + minor="${version#$major.}"; minor="${minor:0:1}" + if [ $major -ge 6 ]; then + persist="$DEFAULT_PERSIST" + elif [ $major -eq 5 ]; then + if [ "$minor" -ge 6 ]; then + persist="$DEFAULT_PERSIST" + else + persist= + fi + elif [ $major -le 4 ]; then + persist= + fi + fi + [ -n "$persist" ] && sshopts=("${sshopts[@]}" -o ControlPersist="$persist") } function show_vars() { @@ -235,7 +324,8 @@ function show_vars() { local -a sshopts array_copy sshopts SSHOPTS - __update_sshopts_l "${hosts[0]}" + __update_sshopts_misc "${hosts[0]}" "$@" + __update_sshopts_cm "${hosts[0]}" set_var_cmd ssh "$SSH" set_var_cmd exec "$exec" @@ -257,7 +347,8 @@ function do_ssh() { [ -z "$onehost" ] && etitle "$host" array_copy sshopts SSHOPTS - __update_sshopts_l "$host" + __update_sshopts_misc "$host" "$@" + __update_sshopts_cm "$host" ${exec:+exec} "$SSH" "${sshopts[@]}" "$host" "$@" || r=$? [ -z "$onehost" ] && eend @@ -267,10 +358,14 @@ function do_ssh() { function __update_SSHOPTS() { SSHOPTS=("${SSHOPTS[@]}" "$@"); } -# charger USSH_DOMAIN et USSH_USER +# charger la configuration set_defaults nutools +set_defaults ussh +[ -n "$DEFAULT_USER" ] || DEFAULT_USER="${USSH_USER:-root}" +[ -n "$DEFAULT_DOMAIN" ] || DEFAULT_DOMAIN="$USSH_DOMAIN" +[ -n "$DEFAULT_PERSIST" ] || DEFAULT_PERSIST=5m -DOMAIN="$USSH_DOMAIN" +DOMAIN="$DEFAULT_DOMAIN" SSH= remove= remove_only= From 9992505504b6fbbac331ef9b856ac5986d84d479 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Wed, 27 Jan 2016 13:17:24 +0400 Subject: [PATCH 2/6] =?UTF-8?q?ussh:=20pas=20de=20valeur=20par=20d=C3=A9fa?= =?UTF-8?q?ut=20pour=20DEFAULT=5FUSER;=20--parse=20affiche=20toutes=20les?= =?UTF-8?q?=20options?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ussh | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/ussh b/ussh index 525b5f5..d6f2884 100755 --- a/ussh +++ b/ussh @@ -232,6 +232,7 @@ function __update_sshopts_misc() { # Ajouter l'option -l DEFAULT_USER au tableau sshopts si aucune définition # pour l'hôte $1 n'existe dans l'un des fichiers de configuration de ssh et # si l'utilisateur n'a pas déjà spécifié un compte utilisateur. + SSH_USER= SSH_PORT=22 # L'utilisateur est peut-être fourni avec l'hôte local user host @@ -259,7 +260,7 @@ function __update_sshopts_misc() { # Rajouter l'option -l au début. De cette façon, on laisse la possibilité à # l'utilisateur de surcharger cette option, dans le cas où nous n'avons pas # pu analyser les arguments correctement - SSH_USER="${DEFAULT_USER:-$USER}" + SSH_USER="$DEFAULT_USER" sshopts=(${DEFAULT_USER:+-l "$DEFAULT_USER"} "${sshopts[@]}") } function __update_sshopts_cm() { @@ -320,18 +321,19 @@ function __update_sshopts_cm() { } function show_vars() { - [ "${#hosts[*]}" -gt 1 ] && exec= - local -a sshopts - array_copy sshopts SSHOPTS - __update_sshopts_misc "${hosts[0]}" "$@" - __update_sshopts_cm "${hosts[0]}" - + [ "${#hosts[*]}" -gt 1 ] && exec= + set_array_cmd hosts set_var_cmd ssh "$SSH" set_var_cmd exec "$exec" - set_array_cmd options sshopts - set_array_cmd hosts set_array_cmd args @ "$@" + for host in "${hosts[@]}"; do + array_copy sshopts SSHOPTS + __update_sshopts_misc "$host" "$@" + __update_sshopts_cm "$host" + set_var_cmd host "$host" + set_array_cmd options sshopts + done } function do_ssh() { @@ -361,7 +363,7 @@ function __update_SSHOPTS() { SSHOPTS=("${SSHOPTS[@]}" "$@"); } # charger la configuration set_defaults nutools set_defaults ussh -[ -n "$DEFAULT_USER" ] || DEFAULT_USER="${USSH_USER:-root}" +[ -n "$DEFAULT_USER" ] || DEFAULT_USER="$USSH_USER" [ -n "$DEFAULT_DOMAIN" ] || DEFAULT_DOMAIN="$USSH_DOMAIN" [ -n "$DEFAULT_PERSIST" ] || DEFAULT_PERSIST=5m From f4537af09fc9a83fcc3aaf1295f157ec660ed478 Mon Sep 17 00:00:00 2001 From: Jephte CLAIN Date: Tue, 2 Feb 2016 11:36:42 +0400 Subject: [PATCH 3/6] ussh: bug dans l'analyse des arguments --- ussh | 101 ++++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 72 insertions(+), 29 deletions(-) diff --git a/ussh b/ussh index d6f2884..0079fc3 100755 --- a/ussh +++ b/ussh @@ -194,10 +194,10 @@ function remove_keys() { eend } -function __parse_ssh_config() { - local host="$1" config="$2" - [ -f "$config" ] || return 1 - awkrun host="$host" ' +function __parse_ssh_config_user() { + local config="$1" + if [ -f "$config" ]; then + awkrun host="$host" ' BEGIN { in_host = 0 found_user = 0 @@ -215,44 +215,37 @@ in_host && tolower($1) == "user" { print "SSH_USER=\"" $2 "\"" found_user = 1 } -in_host && tolower($1) == "port" { - print "SSH_PORT=\"" $2 "\"" -} END { if (found_user) print "true" else print "false" } ' -- "$config" + else + echo "false" + fi } - -function __update_sshopts_misc() { - # Déterminer l'utilisateur et le port de connexion et les placer dans les - # variables SSH_USER et SSH_PORT, respectivement. Analyser pour cela les - # arguments qui sont fournis dans les paramètres 2..@ - # Ajouter l'option -l DEFAULT_USER au tableau sshopts si aucune définition - # pour l'hôte $1 n'existe dans l'un des fichiers de configuration de ssh et - # si l'utilisateur n'a pas déjà spécifié un compte utilisateur. +function __update_sshopts_user() { + # Déterminer le compte utilisateur de connexion et le placer dans la + # variables SSH_USER. Analyser pour cela les arguments qui sont fournis dans + # les paramètres 2..@. Ajouter l'option -l $DEFAULT_USER au tableau sshopts + # si aucune définition pour l'hôte $1 n'existe dans l'un des fichiers de + # configuration de ssh et si l'utilisateur n'a pas déjà spécifié un compte + # utilisateur. SSH_USER= - SSH_PORT=22 # L'utilisateur est peut-être fourni avec l'hôte - local user host - splituserhost "$1" user host; shift if [ -n "$user" ]; then SSH_USER="$user" return fi # Analyser les configuration de ssh - eval "$(__parse_ssh_config "$1" ~/.ssh/config)" && return - eval "$(__parse_ssh_config "$1" /etc/ssh/ssh_config)" && return + eval "$(__parse_ssh_config_user ~/.ssh/config)" && return + eval "$(__parse_ssh_config_user /etc/ssh/ssh_config)" && return # Analyser les arguments local i=1 while [ $i -le $# ]; do if [ "${!i}" == -l ]; then i=$(($i + 1)) SSH_USER="${!i}" - elif [ "${!i}" == -p ]; then - i=$(($i + 1)) - SSH_PORT="${!i}" fi i=$(($i + 1)) done @@ -263,14 +256,59 @@ function __update_sshopts_misc() { SSH_USER="$DEFAULT_USER" sshopts=(${DEFAULT_USER:+-l "$DEFAULT_USER"} "${sshopts[@]}") } +function __parse_ssh_config_port() { + local config="$1" + if [ -f "$config" ]; then + awkrun host="$host" ' +BEGIN { + in_host = 0 + found_port = 0 +} +!found_port && tolower($1) == "host" { + in_host = 0 + for (i = 2; i <= NF; i++) { + if ($i == host) { + in_host = 1 + break + } + } +} +in_host && tolower($1) == "port" { + print "SSH_PORT=\"" $2 "\"" + found_port = 1 +} +END { + if (found_port) print "true" + else print "false" +} +' -- "$config" + else + echo "false" + fi +} +function __update_sshopts_port() { + # Déterminer le port de connexion et le placer dans la variable SSH_PORT. + # Analyser pour cela les arguments qui sont fournis dans les paramètres 2..@ + SSH_PORT=22 + # Analyser les configuration de ssh + eval "$(__parse_ssh_config_port ~/.ssh/config)" && return + eval "$(__parse_ssh_config_port /etc/ssh/ssh_config)" && return + # Analyser les arguments + local i=1 + while [ $i -le $# ]; do + if [ "${!i}" == -p ]; then + i=$(($i + 1)) + SSH_PORT="${!i}" + fi + i=$(($i + 1)) + done +} function __update_sshopts_cm() { # Rajouter le cas échéant les options pour le multiplexage des connexions au # tableau sshopts, pour l'hôte $1 # SSH_USER doit être défini - local user host local found cmhost cmkey tmphost shared control persist local -a hosts - splituserhost "$1" user host for cmhost in "${CMHOSTS[@]}"; do [ -n "$cmhost" ] || continue cmkey="$cmhost"; cmkey="${cmkey//./_}"; cmkey="${cmkey//-/_}" @@ -319,6 +357,13 @@ function __update_sshopts_cm() { fi [ -n "$persist" ] && sshopts=("${sshopts[@]}" -o ControlPersist="$persist") } +function __update_sshopts() { + local user host + splituserhost "$1" user host; shift + __update_sshopts_user "$@" + __update_sshopts_port "$@" + __update_sshopts_cm +} function show_vars() { local -a sshopts @@ -329,8 +374,7 @@ function show_vars() { set_array_cmd args @ "$@" for host in "${hosts[@]}"; do array_copy sshopts SSHOPTS - __update_sshopts_misc "$host" "$@" - __update_sshopts_cm "$host" + __update_sshopts "$host" "$@" set_var_cmd host "$host" set_array_cmd options sshopts done @@ -349,8 +393,7 @@ function do_ssh() { [ -z "$onehost" ] && etitle "$host" array_copy sshopts SSHOPTS - __update_sshopts_misc "$host" "$@" - __update_sshopts_cm "$host" + __update_sshopts "$host" "$@" ${exec:+exec} "$SSH" "${sshopts[@]}" "$host" "$@" || r=$? [ -z "$onehost" ] && eend From 3190a32228b8c8a4f8e9bcb237ffde89f7a47d17 Mon Sep 17 00:00:00 2001 From: Jephte CLAIN Date: Thu, 4 Feb 2016 13:52:09 +0400 Subject: [PATCH 4/6] cgilsxml.py: ajout de la variable script_base, qui permet de faire des urls relatives --- lib/ulib/support/cgilsxml.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/ulib/support/cgilsxml.py b/lib/ulib/support/cgilsxml.py index a9e0c68..6899bec 100755 --- a/lib/ulib/support/cgilsxml.py +++ b/lib/ulib/support/cgilsxml.py @@ -183,6 +183,7 @@ def print_files(files, fgroups=None, select_group=None, script_name=None, query_ xenv = ET.SubElement(xresult, "env") if script_name is not None: ET.SubElement(xenv, "script_name").text = _u(script_name) + ET.SubElement(xenv, "script_base").text = _u(re.sub(r'[^/]+$', '', script_name)) if query_string is not None: query_string = _u(query_string) ET.SubElement(xenv, "query_string").text = query_string From c15919bee2335a98d5f309c03a97f2bd687b8f69 Mon Sep 17 00:00:00 2001 From: Jephte CLAIN Date: Thu, 4 Feb 2016 13:52:29 +0400 Subject: [PATCH 5/6] Init changelog & version 3.1.0 --- CHANGES.txt | 8 ++++++++ VERSION.txt | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGES.txt b/CHANGES.txt index 5a0fe3c..08bd3a3 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,3 +1,11 @@ +## Version 3.1.0 du 04/02/2016-13:52 + +3190a32 cgilsxml.py: ajout de la variable script_base, qui permet de faire des urls relatives +f4537af ussh: bug dans l'analyse des arguments +9992505 ussh: pas de valeur par défaut pour DEFAULT_USER; --parse affiche toutes les options +b19059e Intégration de la branche ussh-auto-persist +5c75737 ussh: configuration du multiplexage pour certains hôtes + ## Version 3.0.1 du 31/12/2015-12:36 56c305a awk ne supporte pas \s diff --git a/VERSION.txt b/VERSION.txt index cb2b00e..fd2a018 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -3.0.1 +3.1.0 From 73569bfa98cc134179928bc7e5741907816186fc Mon Sep 17 00:00:00 2001 From: Jephte CLAIN Date: Thu, 4 Feb 2016 13:52:59 +0400 Subject: [PATCH 6/6] maj ulib --- lib/ulib/.ulibver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ulib/.ulibver b/lib/ulib/.ulibver index 6435415..d125e4d 100644 --- a/lib/ulib/.ulibver +++ b/lib/ulib/.ulibver @@ -1 +1 @@ -010000000 +010001000