lotsa changes
authorJoerg Jaspert <joerg@debian.org>
Sun, 11 Dec 2011 14:02:55 +0000 (15:02 +0100)
committerJoerg Jaspert <joerg@debian.org>
Sun, 11 Dec 2011 14:02:55 +0000 (15:02 +0100)
do away with CURRENTUSER, use USER which the shell sets for us
add TIMEOUTSECS to have dialog end after a while of non-input
define a TMPDIR (which could be overwritten in the environment)
rename select_vm to main_menu to better show what it is
add helper function cleanup to deal with TEMPFILES
add a little help info box

Signed-off-by: Joerg Jaspert <joerg@debian.org>
kvm-shell

index 7348af4..830bc32 100644 (file)
--- a/kvm-shell
+++ b/kvm-shell
@@ -34,96 +34,180 @@ VERSION="2.0"
 PROGRAM="kvm-shell"
 
 # configuration
 PROGRAM="kvm-shell"
 
 # configuration
-CURRENTUSER=${USER:-""}
-if [-z ${CURRENTUSER} ]; then
-    echo "Unknown user"
-    exit 1
-fi
 USERSFILE=/etc/kvm-shell/users
 SUDO=/usr/bin/sudo
 VIRSH=/usr/bin/virsh
 USERSFILE=/etc/kvm-shell/users
 SUDO=/usr/bin/sudo
 VIRSH=/usr/bin/virsh
+# After how many seconds without input do we exit the dialogbox?
+TIMEOUTSECS=120
 MYEXIT=0
 MYEXIT=0
+TMPDIR=${TMPDIR:-"/tmp"}
 
 
-function select_vm {
-# PARAMETERS: none
-# DESCRIPTION: extract the vms which the current user is allowed to control and display them in a little menu
-    AVAILABLEVMS=$(egrep "^$CURRENTUSER " $USERSFILE | sed -e "s/$CURRENTUSER\(.*\)/\1/g")
-    MENUITEMS=""
-    COUNTER=0
-    NEWAVAILABLEVMS=""
-    for i in $AVAILABLEVMS; do
-           set +e
-        $SUDO $VIRSH domstate $i 2>/dev/null
-           foo=$?
-           set -e
-        if [ "$foo" = "0" ]; then
-            NEWAVAILABLEVMS="${NEWAVAILABLEVMS} ${i}"
+########################################################################
+# Helper functions                                                     #
+########################################################################
+# Simple function to cleanup whenever we exit.
+function cleanup() {
+    ERRVAL=$?
+    trap - ERR EXIT TERM HUP INT QUIT
+
+    for TEMPFILE in ${TEMPFILES}; do
+        DELF=${!TEMPFILE:-""}
+        if [ -n "${DELF}" ] && [ -f "${DELF}" ]; then
+            rm -f "${DELF}"
+        fi
+    done
+    exit $ERRVAL
+}
+# Define TEMPFILES so we are always sure it is there
+TEMPFILES=""
+
+########################################################################
+########################################################################
+
+function helpbox() {
+    set +e
+    dialog --stdout --backtitle "KVM Shell ${VERSION}" \
+        --title "User $USER - Help" \
+        --msgbox "                         KVM Shell ${VERSION}
+
+This is the KVM Shell Version ${VERSION}, written by Joerg Jaspert,
+based on an initial version from Michael Kress.
+
+KVM Shell allows you to manage your domains daily operations
+such as using its serial console, starting or stopping it.
+
+You may also, if configured, change the reverse DNS for the
+IP addresses associated with your VM.
+
+Simply select the VM you want to manage and then follow the
+menu options given to you.
+
+[This text could be extended. Want to write it?]
+" 20 70
+    set -e
+    return 0
+
+}
+
+########################################################################
+# Main functions come here                                             #
+########################################################################
+
+
+# main_menu: Find the VMs for the current user and display a menu to
+#            select from
+# No arguments
+function main_menu {
+    local AVAILABLEVMS=$(egrep "^$USER " $USERSFILE)
+    AVAILABLEVMS=${AVAILABLEVMS#* }
+    local MENUITEMS=""
+    local COUNTER=0
+    local NEWAVAILABLEVMS=""
+    for vm in ${AVAILABLEVMS}; do
+        set +e
+        local STATE=$(${SUDO} ${VIRSH} domstate $vm 2>/dev/null)
+        STATE=${STATE:-"unknown"}
+        STATE=${STATE// /-}
+        local ret=$?
+        set -e
+        if [ "${ret}" = 0 ]; then
+            NEWAVAILABLEVMS="${NEWAVAILABLEVMS} ${vm}"
             COUNTER=$((COUNTER+1))
             COUNTER=$((COUNTER+1))
-            STATE=`$SUDO $VIRSH domstate $i|grep -v "^$" | sed -e "s/ /_/g"`
-            MENUITEMS="$MENUITEMS $i $STATE"
+            MENUITEMS="${MENUITEMS} ${vm} ${STATE}"
         fi
     done
         fi
     done
-    AVAILABLEVMS=$NEWAVAILABLEVMS
-    selectedvm=`dialog --stdout --title "User $CURRENTUSER - please select your VM to manage" --menu "Available VMs:" 15 55 $COUNTER $MENUITEMS`
+    AVAILABLEVMS=${NEWAVAILABLEVMS}
+    dialogout=$(mktemp -p "${TMPDIR}" kvmshell.XXXXXXXX)
+    TEMPFILES="${TEMPFILES} dialogout"
+    set +e
+    dialog --backtitle "KVM Shell ${VERSION}" \
+        --title "User $USER - Select VM to manage" \
+        --cancel-label "Exit" --ok-label "Select VM" \
+        --help-button --timeout ${TIMEOUTSECS} \
+        --menu 'Available VMs:' 15 55 ${COUNTER} ${MENUITEMS} 2>${dialogout}
     ret=$?
     ret=$?
+    set -e
+    local selectedvm=$(cat "${dialogout}")
+    rm -f "${dialogout}"
     case $ret in
     case $ret in
-           0)
-            while [ $MYEXIT -ne 2 ];
-            do
-                select_action
-            done
+        0)
+            # Clean exit, means selected a VM
+            select_action ${selectedvm}
             MYEXIT=0
             ;;
             MYEXIT=0
             ;;
-           1)
-            MYEXIT=1;;
-           255)
+        2)
+            helpbox
+            ;;
+        *)
+            # Anything else means we send em to the shredder...
             MYEXIT=1;;
     esac
 }
 
             MYEXIT=1;;
     esac
 }
 
-
-
 function select_action {
 function select_action {
-# PARAMETERS: none
-# DESCRIPTION: display actions and execute them on the selected vm
-# REQUIRES: $selectedvm filled with a valid vm
-# actions displayed in menu:
-#   - dominfo
-#   - start
-#   - shutdown
-#   - reboot
-#   - destroy
-### TODO: Check if $selectedvm is really a valid vm (should be ok, but still ...)
-    STATE=`$SUDO $VIRSH domstate $selectedvm|grep -v "^$" | sed -e "s/ /_/g"`
-    selectedaction=`dialog --stdout --title "User $CURRENTUSER - please select action for VM $selectedvm" --menu "Available actions for VM $selectedvm ($STATE):" 15 55 5  "dominfo" "" "console" "" "start" "" "shutdown" "" "reboot" "" "destroy" ""`
-    ret=$?
-    clear
-    case $ret in
-           0)
-            #echo "$SUDO $VIRSH $selectedaction $selectedvm"
-            case $selectedaction in
-                       dominfo|console|start|shutdown|reboot|destroy)
-                           set +e
-                    $SUDO $VIRSH $selectedaction $selectedvm
-                           set -e
-                    ;;
-            esac
-            sleep 1
-            read -p "[Hit Return]" x
-            ;;
-           1)
-            MYEXIT=2
-            ;;
-           255)
-            MYEXIT=2
-            ;;
-    esac
+    local selvm=${1:-""}
+    if [ -z "${selvm}" ]; then
+        return 2
+    fi
+    set +e
+    STATE=$(${SUDO} ${VIRSH} domstate $selvm 2>/dev/null)
+    if [ $? -ne 0 ]; then
+        dialog --sleep 5 --title "User ${USER} - unknown VM Selected" --infobox "\nHeyho, you selected an unknown VM" 5 40
+        set -e
+        return
+    fi
+    set -e
+    while :; do
+        dialogout=$(mktemp -p "${TMPDIR}" kvmshell.XXXXXXXX)
+        TEMPFILES="${TEMPFILES} dialogout"
+        set +e
+        dialog --backtitle "KVM Shell ${VERSION}" \
+            --title "User $USER - please select action for VM ${selvm} (${STATE})" \
+            --cancel-label "Main Menu" --ok-label "Select Action" \
+            --help-button --timeout ${TIMEOUTSECS} \
+            --menu "Available actions for VM ${selvm} ($STATE):" 15 65 5 \
+            "dominfo" "" "console" "" "start" "" "shutdown" "" "reboot" "" "destroy" "" "mainmenu" "" 2>${dialogout}
+        ret=$?
+        set -e
+        local selectedaction=$(cat "${dialogout}")
+        rm -f "${dialogout}"
+        clear
+        case ${ret} in
+            0)
+                case ${selectedaction} in
+                    console)
+                        echo "Remember, you can leave the console with Strg+]"
+                        echo "Also, you may need to hit Enter once to see anything"
+                        echo ""
+                        ${SUDO} ${VIRSH} ${selectedaction} ${selvm}
+                        ;;
+                    dominfo|start|shutdown|reboot|destroy)
+                               set +e
+                        ${SUDO} ${VIRSH} ${selectedaction} ${selvm}
+                               set -e
+                        ;;
+                    mainmenu)
+                        return
+                        ;;
+                esac
+                sleep 1
+                read -p "[Hit Return]" x
+                ;;
+               *)
+                MYEXIT=2
+                return
+                ;;
+        esac
+    done
 }
 
 
 }
 
 
-# main loop
+
+trap cleanup EXIT TERM HUP INT QUIT
+
+
 while [ $MYEXIT -ne 1 ]; do
 while [ $MYEXIT -ne 1 ]; do
-    select_vm
+    main_menu
 done
 
 exit 0
 done
 
 exit 0