From df4815c6a188a02c3e13a01caafcaa26e67d3adf Mon Sep 17 00:00:00 2001 From: Razvan Deaconescu Date: Sun, 11 Apr 2010 17:21:43 +0300 Subject: [PATCH] add support (command line options) for OpenVZ containers --- scripts/admin/clusterctl | 132 ++++++++++++++++++++++++++++----------- 1 file changed, 95 insertions(+), 37 deletions(-) diff --git a/scripts/admin/clusterctl b/scripts/admin/clusterctl index e0ef70d..76eeff3 100755 --- a/scripts/admin/clusterctl +++ b/scripts/admin/clusterctl @@ -18,19 +18,25 @@ add_keyfile="" delete_expr="" remoteuser="all" remotehost="all" -vzcontainer="all" +vzct_expr="all" list=0 empty=0 +# vz variables +vzsize=0 +declare -a vzhosts +declare -a vzports + list_keys() { this_user=$1 this_host=$2 - echo "$this_user@$this_host keys" + this_port=$3 + echo "$this_user@$this_host:$this_port keys" if test $verbose -eq 1; then - ssh -l root $this_host "cat ~$this_user/.ssh/authorized_keys" | sed 's/ [^ =]\+\([^ =]\{10\}=\+\)/ ...\1/g' | sed 's/^/ * /g' + ssh -l root $this_host -p $this_port "cat ~$this_user/.ssh/authorized_keys" | sed 's/ [^ =]\+\([^ =]\{10\}=\+\)/ ...\1/g' | sed 's/^/ * /g' else - ssh -l root $this_host "cat ~$this_user/.ssh/authorized_keys" | sed 's/ [^ =]*=\+//g' | sed 's/^/ * /g' + ssh -l root $this_host -p $this_port "cat ~$this_user/.ssh/authorized_keys" | sed 's/ [^ =]*=\+//g' | sed 's/^/ * /g' fi echo } @@ -40,8 +46,9 @@ clear_empty() { this_user=$1 this_host=$2 - echo "cleaning $this_user@$this_host keys" - ssh -l root $this_host "\ + this_port=$3 + echo "cleaning $this_user@$this_host:$this_port keys" + ssh -l root $this_host -p $this_port "\ sed -i.bak '/^[ \t]*$/d' ~$this_user/.ssh/authorized_keys ;\ ( grep 'ssh' ~$this_user/.ssh/authorized_keys > /dev/null 2>&1 ||\ cp ~$this_user/.ssh/authorized_keys.bak ~$this_user/.ssh/authorized_keys) ;\ @@ -54,9 +61,10 @@ delete_keys() { this_user=$1 this_host=$2 - this_expr=$3 - echo "delete $this_user@$this_host keys that match '$this_expr'" - ssh -l root $this_host "\ + this_port=$3 + this_expr=$4 + echo "delete $this_user@$this_host:$this_port keys that match '$this_expr'" + ssh -l root $this_host -p $this_port "\ sed -i.bak '/$this_expr/d' ~$this_user/.ssh/authorized_keys ;\ ( grep 'ssh' ~$this_user/.ssh/authorized_keys > /dev/null 2>&1 ||\ cp ~$this_user/.ssh/authorized_keys.bak ~$this_user/.ssh/authorized_keys) ;\ @@ -69,9 +77,10 @@ get_key() { this_user=$1 this_host=$2 - this_expr=$3 - echo "get first $this_user@$this_host keys that matches '$this_expr'" - ssh -l root $this_host "\ + this_port=$3 + this_expr=$4 + echo "get first $this_user@$this_host:$this_port keys that matches '$this_expr'" + ssh -l root $this_host -p $this_port "\ grep '$this_expr' ~$this_user/.ssh/authorized_keys | head -n 1 " } @@ -81,28 +90,53 @@ add_key() { this_user=$1 this_host=$2 - this_key=$3 - echo "add $this_key to $this_user@$this_host" - cat $this_key | ssh -l root $this_host "\ + this_port=$3 + this_key=$4 + echo "add $this_key to $this_user@$this_host:$this_port" + cat $this_key | ssh -l root $this_host -p $this_port "\ cat >> ~$this_user/.ssh/authorized_keys " } +# get list of OpenVZ VEs (virtual enviroments, containers) on host +get_vzlist() +{ + this_host=$1 + this_expr=$2 + + if test "$this_expr" == "all" -o "$this_expr" == "vzall"; then + this_expr="." + fi + + velist=$(ssh -l root $this_host "\ + vzlist 2>&1 | grep '^[ \t]*[0-9]' |\ + awk '"'$1'" ~ /$this_expr/ {print "'$1'";}' + ") + vzhosts=() + vzports=() + for i in $velist; do + vzhosts+=("$this_host") + vzports+=("${i}22") + done + vzsize=${#vzhosts[*]} +} + wrapper() { this_user=$1 this_host=$2 + this_port=$3 if test ! -z "$add_keyfile"; then - add_key "$this_user" "$this_host" "$add_keyfile" + add_key "$this_user" "$this_host" "$this_port" "$add_keyfile" elif test ! -z "$delete_expr"; then - delete_keys "$this_user" "$this_host" "$delete_expr" + delete_keys "$this_user" "$this_host" "$this_port" "$delete_expr" elif test ! -z "$get_expr"; then - get_key "$this_user" "$this_host" "$get_expr" + get_key "$this_user" "$this_host" "$this_port" "$get_expr" elif test $empty -eq 1; then - clear_empty "$this_user" "$this_host" + clear_empty "$this_user" "$this_host" "$this_port" elif test $list -eq 1; then - list_keys "$this_user" "$this_host" + list_keys "$this_user" "$this_host" "$this_port" fi } @@ -110,11 +144,11 @@ usage() { echo "Usage:" >&2 echo -e "\t$0 -h" >&2 - echo -e "\t$0 [-v] [-r remotehost] [-c vzcontainer] [-u user] -a key" >&2 - echo -e "\t$0 [-v] [-r remotehost] [-c vzcontainer] [-u user] -d string" >&2 - echo -e "\t$0 [-v] [-r remotehost] [-c vzcontainer] [-u user] -g string" >&2 - echo -e "\t$0 [-v] [-r remotehost] [-c vzcontainer] [-u user] -l" >&2 - echo -e "\t$0 [-v] [-r remotehost] [-c vzcontainer] [-u user] -e" >&2 + echo -e "\t$0 [-v] [-r remotehost] [-c vzct_expr] [-u user] -a key" >&2 + echo -e "\t$0 [-v] [-r remotehost] [-c vzct_expr] [-u user] -d string" >&2 + echo -e "\t$0 [-v] [-r remotehost] [-c vzct_expr] [-u user] -g string" >&2 + echo -e "\t$0 [-v] [-r remotehost] [-c vzct_expr] [-u user] -l" >&2 + echo -e "\t$0 [-v] [-r remotehost] [-c vzct_expr] [-u user] -e" >&2 } while getopts "hvr:c:u:a:d:g:le" option; do @@ -123,7 +157,7 @@ while getopts "hvr:c:u:a:d:g:le" option; do remotehost="$OPTARG" ;; c) - vzcontainer="$OPTARG" + vzct_expr="$OPTARG" ;; u) remoteuser="$OPTARG" @@ -160,22 +194,46 @@ done if test ! -z "$add_keyfile" -o ! -z "$delete_expr" -o ! -z "$get_expr" -o "$empty" -eq 1 -o "$list" -eq 1; then if test "$remotehost" == "all"; then for host in ${remote_hosts[*]}; do + if test "$vzct_expr" == "all" -o "$vzct_expr" == "base" -o "$vzct_expr" == "0"; then + if test "$remoteuser" == "all"; then + for user in ${remote_users[*]}; do + wrapper "$user" "$host" 22 + done + else + wrapper "$remoteuser" "$host" 22 + fi + fi + get_vzlist "$host" "$vzct_expr" + for ((i = 0; i < $vzsize; i++)); do + if test "$remoteuser" == "all"; then + for user in ${remote_users[*]}; do + wrapper "$user" "${vzhosts[$i]}" "${vzports[$i]}" + done + else + wrapper "$remoteuser" "${vzhosts[$i]}" "${vzports[$i]}" + fi + done + done + else + if test "$vzct_expr" == "all" -o "$vzct_expr" == "base" -o "$vzct_expr" == "0"; then if test "$remoteuser" == "all"; then for user in ${remote_users[*]}; do - wrapper $user $host + wrapper "$user" "$remotehost" 22 done - continue + else + wrapper "$remoteuser" "$remotehost" 22 fi - wrapper $remoteuser $host - done - else - if test "$remoteuser" == "all"; then - for user in ${remote_users[*]}; do - wrapper $user $remotehost - done - else - wrapper $remoteuser $remotehost fi + get_vzlist "$remotehost" "$vzct_expr" + for ((i = 0; i < $vzsize; i++)); do + if test "$remoteuser" == "all"; then + for user in ${remote_users[*]}; do + wrapper "$user" "${vzhosts[$i]}" "${vzports[$i]}" + done + else + wrapper "$remoteuser" "${vzhosts[$i]}" "${vzports[$i]}" + fi + done fi fi -- 2.20.1