add support (command line options) for OpenVZ containers
authorRazvan Deaconescu <razvan.deaconescu@cs.pub.ro>
Sun, 11 Apr 2010 14:21:43 +0000 (17:21 +0300)
committerRazvan Deaconescu <razvan.deaconescu@cs.pub.ro>
Sun, 11 Apr 2010 14:21:43 +0000 (17:21 +0300)
scripts/admin/clusterctl

index e0ef70d..76eeff3 100755 (executable)
@@ -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