Call the rdns script with 3 users
[ganneffutils.git] / kvm-shell
index 884f140..278b151 100644 (file)
--- a/kvm-shell
+++ b/kvm-shell
 #    GNU General Public License for more details.
 #
 # INSTALL:
-# 1) create these entries for your users in /etc/sudoers (use visudo) :
+# 1) create these entries for your users in /etc/sudoers (use visudo)
+#    (in Debian its even better to use /etc/sudoers.d/kvm-shell, run
+#    visudo -f /etc/sudoers.d/kvm-shell):
 #    User_Alias   KVMUSERS = vuser1,vuser2
 #    Cmnd_Alias   KVM      = /usr/bin/virsh
 #    KVMUSERS     ALL      = NOPASSWD: KVM
-# 2) Create /usr/local/etc/kvm-shell-users (see config variable below) :
+# 2) Create /etc/kvm-shell/users (or whatever name you set USERSFILE
+#    to below):
 #    Format:
-#      <username> <vm1, vm2, ....>
+#      <username> <vm1 vm2 ...>
 #    Example:
 #      vuser1 vm1
 #      vuser2 vm1 vm2 vm3
@@ -35,11 +38,13 @@ PROGRAM="kvm-shell"
 
 # configuration
 USERSFILE=/etc/kvm-shell/users
+# What do we run for sudo?
 SUDO=/usr/bin/sudo
+# Where is virsh
 VIRSH=/usr/bin/virsh
 # After how many seconds without input do we exit the dialogbox?
 TIMEOUTSECS=120
-MYEXIT=0
+# A tempdir. Whatever is in the environment before has precedence.
 TMPDIR=${TMPDIR:-"/tmp"}
 # Set to no if you do not want people to edit DNS information
 DO_RDNS="yes"
@@ -56,12 +61,15 @@ RDNS=/etc/kvm-shell/rdns
 # is done. It gets two arguments:
 # 1 - the original file
 # 2 - the new edit from the user
+# 3 - the calling username (can be used for logging. Nice for sudo users)
 RDNSSCRIPT="${SUDO} /usr/local/bin/dodns"
 
 ########################################################################
 # Helper functions                                                     #
 ########################################################################
 # Simple function to cleanup whenever we exit.
+# This goes through all variable names in TEMPFILES and deletes the files
+# that those variables point to.
 function cleanup() {
     ERRVAL=$?
     trap - ERR EXIT TERM HUP INT QUIT
@@ -100,17 +108,17 @@ function revdns() {
         TEMPFILES="${TEMPFILES} dnsedit"
         set +e
         dialog --backtitle "KVM Shell ${VERSION}" \
-            --title "User $USER - Edit reverse DNS for VM ${VM}" \
+            --title "User ${USER} - Edit reverse DNS for VM ${VM}" \
             --cancel-label "Cancel, don't save" --ok-label "Apply" \
             --timeout ${TIMEOUTSECS} \
             --editbox ${dnsfile} 22 78 2>${dnsedit}
         ret=$?
         set -e
-        case $ret in
+        case ${ret} in
             0)
                 # Clean exit, means we have something to do
                 echo "Applying changes, please be patient..."
-                ${RDNSSCRIPT} "${dnsfile}" "${dnsedit}"
+                ${RDNSSCRIPT} "${dnsfile}" "${dnsedit}" "${USER}"
                 ;;
             *)
                 # Anything else means we send em to the shredder...
@@ -125,7 +133,7 @@ function revdns() {
 function helpbox() {
     set +e
     dialog --stdout --backtitle "KVM Shell ${VERSION}" \
-        --title "User $USER - Help" \
+        --title "User ${USER} - Help" \
         --msgbox "                         KVM Shell ${VERSION}
 
 This is the KVM Shell Version ${VERSION}, written by Joerg Jaspert,
@@ -148,101 +156,109 @@ menu options given to you.
 }
 
 ########################################################################
-# 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)
+    local AVAILABLEVMS=$(egrep "^${USER} " "${USERSFILE}")
+    # Only end up with the VMs, not the username too
     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 virsh got us nothing we replace it with "unknown"
+        STATE=${STATE:-"unknown"}
+        # dialog is picky-picky-annoying, so we want to ensure there isnt a space anywhere in STATE
+        STATE=${STATE// /-}
         if [ "${ret}" = 0 ]; then
-            NEWAVAILABLEVMS="${NEWAVAILABLEVMS} ${vm}"
-            COUNTER=$((COUNTER+1))
+            COUNTER=$(( COUNTER+1 ))
             MENUITEMS="${MENUITEMS} ${vm} ${STATE}"
         fi
     done
-    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" \
+        --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=$?
     set -e
-    local selectedvm=$(cat "${dialogout}")
+    local selvm=$(cat "${dialogout}")
     rm -f "${dialogout}"
     case $ret in
         0)
-            # Clean exit, means selected a VM
-            select_action ${selectedvm}
-            MYEXIT=0
+            # Clean exit, means selected a VM, lets call its action menu
+            select_action ${selvm}
             ;;
         2)
+            # Hoowah, help? Go away.
             helpbox
             ;;
         *)
             # Anything else means we send em to the shredder...
-            MYEXIT=1;;
+            exit
+            ;;
     esac
 }
 
+# Deal with a VM directly, do whatever (console, dominfo, ...)
+# Takes on argument, the VM name
 function select_action {
     local selvm=${1:-""}
     if [ -z "${selvm}" ]; then
         return 2
     fi
     set +e
-    STATE=$(${SUDO} ${VIRSH} domstate $selvm 2>/dev/null)
-    if [ $? -ne 0 ]; then
+    STATE=$(${SUDO} ${VIRSH} domstate ${selvm} 2>/dev/null)
+    ret=$?
+    set -e
+    if [ ${ret} -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})" \
+            --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}
+            --menu "Available actions for VM ${selvm} ($STATE):" 15 65 10 \
+            "dominfo"  "Information about your VM" \
+            "console"  "Serial console access" \
+            "start"    "Boot a stopped VM" \
+            "shutdown" "Stop a running VM" \
+            "reboot"   "Reboot a running VM" \
+            "destroy"  "Kill a VM (as if power cable pulled)" \
+            "rdns"     "Edit reverse DNS of IPs for the VM" \
+            "mainmenu" "Back to main menu" 2>${dialogout}
         ret=$?
         set -e
-        local selectedaction=$(cat "${dialogout}")
+        local selact=$(cat "${dialogout}")
         rm -f "${dialogout}"
         clear
         case ${ret} in
             0)
-                case ${selectedaction} in
+                case ${selact} 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}
+                        ${SUDO} ${VIRSH} ${selact} ${selvm}
                         ;;
                     dominfo|start|shutdown|reboot|destroy)
-                               set +e
-                        ${SUDO} ${VIRSH} ${selectedaction} ${selvm}
-                               set -e
+                        set +e
+                        ${SUDO} ${VIRSH} ${selact} ${selvm}
+                        set -e
+                        ;;
                     rdns)
                         if [ "${DO_RDNS}" = "yes" ]; then
                             revdns ${selvm}
@@ -255,23 +271,21 @@ function select_action {
                         return
                         ;;
                 esac
-                sleep 1
                 read -p "[Hit Return]" x
                 ;;
+            2)
+                helpbox
+                ;;
                *)
-                MYEXIT=2
                 return
                 ;;
         esac
     done
 }
 
-
-
 trap cleanup EXIT TERM HUP INT QUIT
 
-
-while [ $MYEXIT -ne 1 ]; do
+while :; do
     main_menu
 done