URI:
       Rearrange functions - qmenu - manage qubes os via dmenu (drkhsh fork)
  HTML git clone git://git.drkhsh.at/qmenu.git
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 57919fffa89cd936a892ca1c1c024b03a5385afd
   DIR parent 74ceed1e27e29c04f543befa438177880fb60068
  HTML Author: sine3o14nnae <3o14@pm.me>
       Date:   Tue, 22 Oct 2019 17:42:47 +0200
       
       Rearrange functions
       
       Diffstat:
         M qmenu-dm                            |      39 ++++++++++++++-----------------
         M qmenu-vm                            |    1578 +++++++++++++++----------------
       
       2 files changed, 779 insertions(+), 838 deletions(-)
       ---
   DIR diff --git a/qmenu-dm b/qmenu-dm
       @@ -1,5 +1,22 @@
        #!/bin/sh
        
       +get_qube_label() {
       +
       + qube_label=$(echo "$qube_list" | grep -w "$target_qube" | awk '{print $2}')
       +
       + # Change some to a more readable color if needed.
       + case $qube_label in
       +
       +   black) qube_label='#373737';;
       +
       +   orange) qube_label='#f57900';;
       +
       +   yellow) qube_label='#edd400';;
       +
       +   green) qube_label='#73d216'
       + esac
       +}
       +
        rearrange_qube_list() {
        
         qube_list=$(echo "$qube_list" |\
       @@ -13,28 +30,6 @@ rearrange_qube_list() {
        }
        
        
       -get_qube_label() {
       -
       - qube_label=$(echo "$qube_list" | grep -w "$target_qube" | awk '{print $2}')
       -
       - # Change some to a more readable color if needed.
       - if [ "$qube_label" = "black" ]; then
       -
       -   qube_label='#373737'
       -
       - elif [ "$qube_label" = "orange" ]; then
       -
       -   qube_label='#f57900'
       -
       - elif [ "$qube_label" = "yellow" ]; then
       -
       -   qube_label='#edd400'
       -
       - elif [ "$qube_label" = "green" ]; then
       -
       -   qube_label='#73d216'
       - fi
       -}
        
        
        
   DIR diff --git a/qmenu-vm b/qmenu-vm
       @@ -1,598 +1,341 @@
        #!/bin/sh
        
       -fqvm_preferences() (
       +fdom0_preferences() (
       +
       + dmenu_d0="-f -m 0 -nb #d3d3d3 -nf #000000 -sb #ffffff -sf #000000"
        
         property=0
        
         while [ -n "$property" ]; do
        
       -   property=$(qvm-prefs "$target_qube" |\
       -     dmenu -l 45 -p "$target_qube:" $dmenu_fmc |\
       +   property=$(qubes-prefs |\
       +     dmenu -l 16 -p "Global Preferences:" $dmenu_d0 |\
             awk '{print $1}')
        
       -   if [ -n "$property" ]; then
       +   case $property in
        
       -     case $property in
       +     check_updates_vm)
        
       -       autostart)
       +       value_selected=$(printf "False\nTrue" |\
       +         dmenu -i -p "Should the system periodically check for domU updates?"\
       +         $dmenu_d0)
        
       -         value_selected=$(printf "False\nTrue" |\
       -           dmenu -i -p "Set autostart of $target_qube to:" $dmenu_fmc)
       +       if [ -n "$value_selected" ]; then
        
       -         if [ -n "$value_selected" ]; then
       +         qubes-prefs --set "$property" "$value_selected"; fi;;
        
       -           qvm-prefs --set "$target_qube" "$property" "$value_selected"; fi;;
       +     clockvm)
        
       +       # List netvm's via 'qvm-ls'.
       +       value_selected=$(printf "$(qvm-ls --raw-data --fields NAME,FLAGS |\
       +         grep '|...N....$' | cut -d '|' -f1)" |\
       +         dmenu -l 50 -p "Select new ClockVM" $dmenu_d0)
        
       -       debug)
       +       if [ -n "$value_selected" ]; then
        
       -         value_selected=$(printf "False\nTrue" |\
       -           dmenu -i -p "Set debug mode of $target_qube to:" $dmenu_fmc)
       +         qubes-prefs --set "$property" "$value_selected"; fi;;
        
       -         if [ -n "$value_selected" ]; then
       +     default_dispvm)
        
       -           qvm-prefs --set "$target_qube" "$property" "$value_selected"; fi;;
       +       if [ -n "$LIST_OF_DISPTEMP" ]; then unset LIST_OF_DISPTEMP; fi
        
       +       # [mediocre] Look up disposable templates.
       +       for n in $(qvm-ls --raw-data -O NAME,FLAGS |\
       +         grep '|a.......$' | cut -d '|' -f1); do
        
       -       default_dispvm)
       +         if qvm-prefs --get "$n" template_for_dispvms |\
       +           grep True > /dev/null 2>&1; then
        
       -         if [ -n "$LIST_OF_DISPTEMP" ]; then unset LIST_OF_DISPTEMP; fi
       +           LIST_OF_DISPTEMP="$LIST_OF_DISPTEMP\n$n"
       +         fi
       +       done
        
       -         # [mediocre] Look up disposable templates.
       -         for n in $(qvm-ls --raw-data -O NAME,FLAGS |\
       -           grep '|a.......$' | cut -d '|' -f1); do
       +       value_selected=$(printf "(None)$LIST_OF_DISPTEMP" |\
       +         dmenu -l 50 -p "Select default dispvm"\
       +         $dmenu_d0)
        
       -           if qvm-prefs --get "$n" template_for_dispvms |\
       -             grep True > /dev/null 2>&1; then
       +       if [ "$value_selected" = "(None)" ]; then
        
       -             LIST_OF_DISPTEMP="$LIST_OF_DISPTEMP\n$n"
       -           fi
       -         done
       +         value_selected="none"
       +       fi
        
       -         value_selected=$(printf "(Default)\n(None)$LIST_OF_DISPTEMP" |\
       -           dmenu -l 50 -p "Select default dispvm for $target_qube" $dmenu_fmc)
       +       if [ -n "$value_selected" ]; then
        
       -         if [ "$value_selected" = "(None)" ]; then
       +         qubes-prefs --set "$property" "$value_selected"; fi;;
        
       -           value_selected="None"
       +     default_kernel)
        
       -         elif [ "$value_selected" = "(Default)" ]; then
       +       value_selected=$(true |\
       +         dmenu -p "Enter the kernel that is to be used as default"\
       +         $dmenu_d0)
        
       -           value_selected="--default"
       -         fi
       +       if [ -n "$value_selected" ]; then
        
       -         if [ -n "$value_selected" ]; then
       +         answer_selected=$(printf "No\nYes" |\
       +           dmenu -i -p "Set default kernel to $value_selected?"\
       +           $dmenu_d0)
        
       -           qvm-prefs --set "$target_qube" "$property" "$value_selected"; fi;;
       +         if [ "$answer_selected" = "Yes" ]; then
        
       +           qubes-prefs --set "$property" "$value_selected"
       +         fi
       +       fi;;
        
       -       default_user)
       +     default_netvm)
        
       -         value_selected=$(echo "--default" |\
       -           dmenu -p "Enter the name of the default user for $target_qube"\
       -           $dmenu_fmc)
       +       # List netvm's via 'qvm-ls'.
       +       value_selected=$(printf "$(qvm-ls --raw-data --fields NAME,FLAGS |\
       +         grep '|...N....$' | cut -d '|' -f1)" |\
       +         dmenu -l 50 -p "Select netvm for $target_qube" $dmenu_d0)
        
       -         if [ -n "$value_selected" ]; then
       +       if [ -n "$value_selected" ]; then
        
       -           qvm-prefs --set "$target_qube" "$property" "$value_selected"; fi;;
       +         qubes-prefs --set "$property" "$value_selected"; fi;;
        
       +     default_pool)
        
       -       include_in_backups)
       +       value_selected=$(qvm-pool --list | sed '1d' |\
       +         dmenu -i -l 30 -p "Select default storage pool" \
       +         $dmenu_d0 | awk '{print $1}')
        
       -         value_selected=$(printf "False\nTrue" |\
       -           dmenu -i -p "Include $target_qube in backups?" $dmenu_fmc)
       +       if [ -n "$value_selected" ]; then
        
       -         if [ -n "$value_selected" ]; then
       +         qubes-prefs --set "$property" "$value_selected"; fi;;
        
       -           qvm-prefs --set "$target_qube" "$property" "$value_selected"; fi;;
       +     default_pool_kernel)
        
       +       value_selected=$(qvm-pool --list | sed '1d' |\
       +         dmenu -i -l 30 -p "Select default storage pool for kernel volumes" \
       +         $dmenu_d0 | awk '{print $1}')
        
       -       kernel)
       +       if [ -n "$value_selected" ]; then
        
       -         value_selected=$(echo "--default" |\
       -           dmenu -p "Enter kernel to be used by $target_qube" $dmenu_fmc)
       +         qubes-prefs --set "$property" "$value_selected"; fi;;
        
       -         if [ -n "$value_selected" ]; then
       +     default_pool_private)
        
       -           answer_selected=$(printf "No\nYes" |\
       -             dmenu -i -p "Set kernel of $target_qube to $value_selected?"\
       -             $dmenu_fmc)
       +       value_selected=$(qvm-pool --list | sed '1d' |\
       +         dmenu -i -l 30 -p "Select default storage pool for private volumes" \
       +         $dmenu_d0 | awk '{print $1}')
        
       -           if [ "$answer_selected" = "Yes" ]; then
       +       if [ -n "$value_selected" ]; then
        
       -             qvm-prefs --set "$target_qube" "$property" "$value_selected"
       -           fi
       -         fi;;
       +         qubes-prefs --set "$property" "$value_selected"; fi;;
        
       +     default_pool_root)
        
       -       kernelopts)
       +       value_selected=$(qvm-pool --list | sed '1d' |\
       +         dmenu -i -l 30 -p "Select default storage pool for root volumes" \
       +         $dmenu_d0 | awk '{print $1}')
        
       -         value_selected=$(echo "--default" |\
       -           dmenu -p "Enter kernel options for $target_qube" $dmenu_fmc)
       +       if [ -n "$value_selected" ]; then
        
       -         if [ -n "$value_selected" ]; then
       +         qubes-prefs --set "$property" "$value_selected"; fi;;
        
       -           answer_selected=$(printf "No\nYes" |\
       -             dmenu -i -p "Set kernel options for $target_qube to \"$value_selected\"?"\
       -             $dmenu_fmc)
       +     default_pool_volatile)
        
       -           if [ "$answer_selected" = "Yes" ]; then
       +       value_selected=$(qvm-pool --list | sed '1d' |\
       +         dmenu -i -l 30 -p "Select default storage pool for volatile volumes" \
       +         $dmenu_d0 | awk '{print $1}')
        
       -             qvm-prefs --set "$target_qube" "$property" "$value_selected"
       -           fi
       -         fi;;
       +       if [ -n "$value_selected" ]; then
        
       +         qubes-prefs --set "$property" "$value_selected"; fi;;
        
       -       label)
       +     default_qrexec_timeout)
        
       -         if qvm-check --running "$target_qube" > /dev/null 2>&1; then
       +       value_selected=$(qubes-prefs --get default_qrexec_timeout |\
       +         dmenu -p "Enter the time in seconds, after which qrexec connection attempts are deemed a failure"\
       +         $dmenu_d0)
        
       -           echo "Go back..." |\
       -             dmenu -p "$target_qube needs to be powered off, in order to change its label"\
       -             $dmenu_fmc > /dev/null 2>&1
       -         else
       +       if [ -n "$value_selected" ]; then
        
       -           value_selected=$(printf "Purple\nBlue\nGreen\nYellow\nOrange\nRed\nGray\nBlack" |\
       -             dmenu -i -l 8 -p "Select label for $target_qube" $dmenu_fmc |\
       -             awk '{print tolower($0)}')
       +         qubes-prefs --set "$property" "$value_selected"; fi;;
        
       -           if [ -n "$value_selected" ]; then
       +     default_shutdown_timeout)
        
       -             qvm-prefs --set "$target_qube" "$property" "$value_selected"
       -           fi
       -         fi;;
       +       value_selected=$(qubes-prefs --get default_shutdown_timeout |\
       +         dmenu -p "Enter the default time in seconds for vm shutdowns to complete"\
       +         $dmenu_d0)
        
       +       if [ -n "$value_selected" ]; then
        
       -       mac)
       +         qubes-prefs --set "$property" "$value_selected"; fi;;
        
       -         value_selected=$(echo "--default" |\
       -           dmenu -p "Enter new MAC address for $target_qube" $dmenu_fmc)
       +     default_template)
        
       -         if [ -n "$value_selected" ]; then
       +       # List templatevm's via 'qvm-ls'.
       +       value_selected=$(qvm-ls --raw-data --fields NAME,FLAGS |\
       +         grep '|t.......$' | cut -d '|' -f1 |\
       +         dmenu -l 50 -p "Select default template for" $dmenu_d0)
        
       -           answer_selected=$(printf "No\nYes" |\
       -             dmenu -i -p "Set MAC address of $target_qube to $value_selected?"\
       -             $dmenu_fmc)
       +       if [ -n "$value_selected" ]; then
        
       -           if [ "$answer_selected" = "Yes" ]; then
       +         qubes-prefs --set "$property" "$value_selected"; fi;;
        
       -             if ! qvm-prefs --set "$target_qube" "$property" "$value_selected"; then
       +     management_dispvm)
        
       -               echo "Go back..." |\
       -                 dmenu -p "Error: Could not set MAC address to '$value_selected'!"\
       -                 $dmenu_fmc > /dev/null 2>&1
       -             fi
       -           fi
       -         fi;;
       +       if [ -n "$LIST_OF_DISPTEMP" ]; then unset LIST_OF_DISPTEMP; fi
        
       +         # [mediocre] Look up disposable templates.
       +         for n in $(qvm-ls --raw-data -O NAME,FLAGS |\
       +           grep '|a.......$' | cut -d '|' -f1); do
        
       -       maxmem)
       +           if qvm-prefs --get "$n" template_for_dispvms |\
       +             grep True > /dev/null 2>&1; then
        
       -         value_selected=$(echo "--default" |\
       -           dmenu -p "Enter the maximum amount of memory in MB to be allocated to $target_qube. Setting it to 0 will disable dynamic memory balancing."\
       -           $dmenu_fmc)
       +             if [ -z "$LIST_OF_DISPTEMP" ]
        
       -         if [ -n "$value_selected" ]; then
       +               then LIST_OF_DISPTEMP=$n
        
       -           answer_selected=$(printf "No\nYes" |\
       -             dmenu -i -p "Set maximum memory of $target_qube to $value_selected MB?"\
       -             $dmenu_fmc)
       +               else LIST_OF_DISPTEMP="$LIST_OF_DISPTEMP\n$n"
       +             fi
       +           fi
       +         done
        
       -           if [ "$answer_selected" = "Yes" ]; then
       +         value_selected=$(printf "$LIST_OF_DISPTEMP" |\
       +           dmenu -l 50 -p "Select management dispvm"\
       +           $dmenu_d0)
        
       -             qvm-prefs --set "$target_qube" "$property" "$value_selected"
       -           fi
       -         fi;;
       +         if [ -n "$value_selected" ]; then
        
       +         qubes-prefs --set "$property" "$value_selected"; fi;;
        
       -       memory)
       +     stats_interval)
        
       -         value_selected=$(echo "--default" |\
       -           dmenu -p "Enter the amount of initial memory in MB to be allocated to $target_qube"\
       -           $dmenu_fmc)
       +       value_selected=$(true  |\
       +         dmenu -p "Enter interval in seconds for VM stats reporting" $dmenu_d0)
        
       -         if [ -n "$value_selected" ]; then
       +       if [ -n "$value_selected" ]; then
        
       -           answer_selected=$(printf "No\nYes" |\
       -             dmenu -i -p "Set initial memory of $target_qube to $value_selected MB?" $dmenu_fmc)
       +         qubes-prefs --set "$property" "$value_selected"; fi;;
        
       -           if [ "$answer_selected" = "Yes" ]; then
       +     updatevm)
        
       -             qvm-prefs --set "$target_qube" "$property" "$value_selected"
       -           fi
       -         fi;;
       +       # List netvm's via 'qvm-ls'.
       +       value_selected=$(printf "$(qvm-ls --raw-data --fields NAME,FLAGS |\
       +         grep '|...N....$' | cut -d '|' -f1)" |\
       +         dmenu -l 50 -p "Select new UpdateVM" $dmenu_d0)
        
       +       if [ -n "$value_selected" ]; then
        
       -       netvm)
       +         if qvm-check --running "$value_selected" > /dev/null 2>&1; then
        
       -         # List netvm's via 'qvm-ls'.
       -         value_selected=$(printf "(Default)\n(None)\n$(qvm-ls --raw-data --fields NAME,FLAGS |\
       -           grep '|...N....$' | cut -d '|' -f1)" |\
       -           dmenu -l 50 -p "Select netvm for $target_qube" $dmenu_fmc)
       -
       -         if [ "$value_selected" = "(None)" ]; then
       -
       -           value_selected="None"
       -
       -         elif [ "$value_selected" = "(Default)" ]; then
       -
       -           value_selected="--default"
       -         fi
       -
       -         if [ -n "$value_selected" ]; then
       -
       -           qvm-prefs --set "$target_qube" "$property" "$value_selected"; fi;;
       -
       -
       -       provides_network)
       -
       -         value_selected=$(printf "False\nTrue" |\
       -           dmenu -i -p "Should $target_qube provide networking for other qubes?"\
       -           $dmenu_fmc)
       -
       -         if [ -n "$value_selected" ]; then
       -
       -           qvm-prefs --set "$target_qube" "$property" "$value_selected"; fi;;
       -
       -
       -       qrexec_timeout)
       -
       -         value_selected=$(echo "--default" |\
       -           dmenu -p "Enter the time in seconds, after which qrexec attempt is deemed a failure for $target_qube"\
       -           $dmenu_fmc)
       -
       -         if [ -n "$value_selected" ]; then
       -
       -           answer_selected=$(printf "No\nYes" |\
       -             dmenu -i -p "Set qrexec timeout for $target_qube to $value_selected seconds?"\
       -             $dmenu_fmc)
       -
       -           if [ "$answer_selected" = "Yes" ]; then
       -
       -             qvm-prefs --set "$target_qube" "$property" "$value_selected"
       -           fi
       -         fi;;
       -
       -
       -       shutdown_timeout)
       -
       -         value_selected=$(echo "--default" |\
       -           dmenu -p "Enter the time in seconds for shutdown, after which $target_qube may be forcefully powered off"\
       -           $dmenu_fmc)
       -
       -         if [ -n "$value_selected" ]; then
       -
       -           answer_selected=$(printf "No\nYes" |\
       -             dmenu -i -p "Set shutdown timeout for $target_qube to $value_selected seconds?"\
       -             $dmenu_fmc)
       -
       -           if [ "$answer_selected" = "Yes" ]; then
       -
       -             qvm-prefs --set "$target_qube" "$property" "$value_selected"
       -           fi
       -         fi;;
       -
       -
       -       template)
       -
       -         if qvm-check --running "$target_qube" > /dev/null 2>&1; then
       -
       -           echo "Go back..." |\
       -             dmenu -p "$target_qube needs to be powered off, in order to change its template"\
       -             $dmenu_fmc > /dev/null 2>&1
       +           qubes-prefs --set "$property" "$value_selected"
                 else
        
       -           # List templatevm's via 'qvm-ls'.
       -           value_selected=$(printf "(Default)\n$(qvm-ls --raw-data --fields NAME,FLAGS |\
       -             grep '|t.......$' | cut -d '|' -f1)" |\
       -             dmenu -l 50 -p "Select template for $target_qube" $dmenu_fmc)
       -
       -           if [ "$value_selected" = "(Default)" ]; then
       -
       -             value_selected="--default"
       -           fi
       -
       -           if [ -n "$value_selected" ]; then
       -
       -             qvm-prefs --set "$target_qube" "$property" "$value_selected"
       -           fi
       -         fi;;
       -
       -
       -       template_for_dispvms)
       -
       -         value_selected=$(printf "False\nTrue" |\
       -           dmenu -i -p "Should $target_qube be used as a template for disposable qubes?"\
       -           $dmenu_fmc)
       -
       -         if [ -n "$value_selected" ]; then
       -
       -           qvm-prefs --set "$target_qube" "$property" "$value_selected"; fi;;
       -
       -
       -       vcpus)
       -
       -         value_selected=$(echo "--default" |\
       -           dmenu -p "Enter the number of CPU cores that should be made available to $target_qube"\
       -           $dmenu_fmc)
       -
       -         if [ -n "$value_selected" ]; then
       -
       -           answer_selected=$(printf "No\nYes" |\
       -             dmenu -i -p "Set number of CPU cores available to $target_qube to $value_selected?"\
       -             $dmenu_fmc)
       -
       -           if [ "$answer_selected" = "Yes" ]; then
       -
       -             qvm-prefs --set "$target_qube" "$property" "$value_selected"
       -           fi
       -         fi;;
       -
       -
       -       virt_mode)
       -
       -         value_selected=$(printf "PVH\nHVM\nPV" |\
       -           dmenu -i -l 3 -p "Select virtualisation mode for $target_qube"\
       -           $dmenu_fmc)
       -
       -         if [ -n "$value_selected" ]; then
       -
       -           qvm-prefs --set "$target_qube" "$property" "$value_selected"; fi;;
       -
       -
       -       *)
       -     esac
       -   fi
       - done
       -)
       -
       -
       -fqvm_pci() (
       -
       - if qvm-check --running "$target_qube" > /dev/null 2>&1; then
       -
       -   echo "Go back..." |\
       -     dmenu -p "$target_qube needs to be powered off, in order to attach or detach PCI devices"\
       -     $dmenu_fmc > /dev/null 2>&1
       - else
       -
       -   list_pci=$(qvm-pci)
       -
       -   if ! qvm-prefs --get "$target_qube" maxmem | grep -w 0 > /dev/null 2>&1; then
       -
       -     answer_memorybalancing=$(printf "Continue anyways\nDisable dynamic memory balancing" |\
       -       dmenu -l 2 -i -p "Dynamic memory balancing is enabled in $target_qube, some devices might not work!"\
       -       $dmenu_fmc | awk '{print $1}')
       -
       -     if [ "$answer_memorybalancing" = "Disable" ]; then
       -
       -       qvm-prefs --set "$target_qube" maxmem 0
       -     fi
       -   fi
       -
       -   if qvm-prefs --get "$target_qube" virt_mode |\
       -     grep -w pvh > /dev/null 2>&1; then
       -
       -     answer_virtmode=$(printf "Continue anyways\nSelect another virtualisation mode" |\
       -       dmenu -l 2 -i -p "$target_qube is using PVH for its virtualisation mode, which does not support PCI passthrough!"\
       -       $dmenu_fmc | awk '{print $1}')
       -
       -     if [ "$answer_virtmode" = "Select" ]; then
       -
       -       virtmode_selected=$(printf "HVM\nPV" |\
       -         dmenu -l 2 -i -p "Select virtualisation mode for $target_qube" $dmenu_fmc)
       -
       -       if [ -n "$virtmode_selected" ]; then
       -
       -         qvm-prefs --set "$target_qube" virt_mode "$virtmode_selected"
       -       fi
       -     fi
       -   fi
       -
       -   device_selected=0
       -
       -   while [ -n "$device_selected" ]; do
       -
       -     device_selected=$(echo "$list_pci" |\
       -       dmenu -l 30 -p "$target_qube:" $dmenu_fmc)
       -
       -     if [ -n "$device_selected" ]; then
       -
       -       device_src=$(echo "$device_selected" | awk '{print $1}' | sed 's/:.*//')
       -       device_bdf=$(echo "$device_selected" | awk '{print $1}' | sed 's/.*://')
       -
       -       if echo "$device_selected" | grep -w "$target_qube"; then
       -
       -         answer=$(printf "No\nYes" |\
       -           dmenu -i -p "Detach \"$device_bdf\" from $target_qube?" $dmenu_fmc)
       -
       -         if [ "$answer" = "Yes" ]; then
       -
       -           if ! test_qvm-pci detach "$target_qube" "$device_src":"$device_bdf"; then
       -
       -             echo "Go back..." |\
       -               dmenu -p "Error: Failed to detach \"$device_bdf\" from $target_qube!"\
       -               $dmenu_fmc > /dev/null 2>&1
       -           fi
       -
       -           list_pci=$(qvm-pci)
       -         fi
       -       else
       -
       -         answer=$(printf "No\nYes" |\
       -           dmenu -i -p "Attach \"$device_bdf\" to $target_qube?" $dmenu_fmc)
       -
       -         if [ "$answer" = "Yes" ]; then
       -
       -           # Check if there is more than one function
       -           # that belongs to the same device.
       -           bdf_count=$(echo "$list_pci" | awk '{print $1}' |\
       -             grep $(echo "$device_bdf" | sed 's/\..*//') | wc -l) 
       -
       -           if [ "$bdf_count" -gt 1 ]; then
       -
       -             if [ -n "$pci_option" ]; then unset pci_option; fi
       -
       -               answer_nsrt=$(printf "No\nYes" |\
       -                 dmenu -i -p "\"$device_bdf\" is most likely to be attached with the option 'no-strict-reset' enabled. Please be aware of the security implications! Do you want to attach \"$device_bdf\" with the option 'no-strict-reset' set to true?"\
       -                 $dmenu_fmc)
       -
       -             if [ "$answer_nsrt" = "Yes" ]; then
       -
       -               pci_option="-o no-strict-reset=True"
       -             fi
       -           fi
       -
       -           if ! qvm-pci attach --persistent $pci_option "$target_qube" "$device_src:$device_bdf"; then
       -
       -             echo "Go back..." |\
       -               dmenu -p "Error: Failed to attach \"$device_bdf\" to $target_qube!"\
       -               $dmenu_fmc > /dev/null 2>&1
       -           fi
       -
       -           list_pci=$(qvm-pci)
       -         fi
       -       fi
       -     fi
       -   done
       - fi
       -)
       -
       -
       -fqvm_firewall() (
       -
       - rulenumber_selected=0
       -
       - while [ -n "$rulenumber_selected" ]; do
       -
       -   rulenumber_selected=$(qvm-firewall $target_qube list |\
       -     dmenu -l 50 -p "$target_qube:" $dmenu_fmc | awk '{print $1}')
       -
       -   if [ -n "$rulenumber_selected" ]; then
       -
       -     # This will equal "NO" if the user selects the top row,
       -     # instead of any existing rule.
       -     if [ "$rulenumber_selected" != "NO" ]; then
       -
       -       option=$(printf "Add new rule above rule $rulenumber_selected\nRemove rule $rulenumber_selected" |\
       -         dmenu -i -l 2 -p "$target_qube:" $dmenu_fmc | awk '{print $1}')
       -     else
       -
       -       option="Add"
       -     fi
       -
       -     if [ "$option" = "Remove" ]; then
       -
       -       answer=$(printf "No\nYes" |\
       -         dmenu -i -p "Remove rule $rulenumber_selected?" $dmenu_fmc)
       +           echo "Go back..." |\
       +             dmenu -p "$value_selected needs to be running!"\
       +             $dmenu_d0 > /dev/null 2>&1
       +         fi
       +       fi;;
        
       -       if [ "$answer" = "Yes" ]; then
       +     *)
       +   esac
       + done
       +)
        
       -         qvm-firewall "$target_qube" del --rule-no "$rulenumber_selected"
       -       fi
       +fqvm_applications() (
        
       -     elif [ "$option" = "Add" ]; then
       + option=0
        
       -       if [ -n "$RULEARGS" ]; then unset RULEARGS; fi
       + while [ -n "$option" ]; do
        
       -       action=$(printf "Accept\nDrop" |\
       -         dmenu -i -l 2 -p "Select action for the new firewall rule" $dmenu_fmc |\
       -         awk '{print tolower($0)}')
       +   option=$(printf "Available\nSelected" |\
       +     dmenu -i -l 2 -p "$target_qube:" $dmenu_fmc)
        
       -       if [ -n "$action" ]; then
       +   if [ "$option" = "Available" ]; then
        
       -         RULEARGS="$action"
       +     application=0
        
       -         specialtarget=$(true |\
       -           dmenu -p "ACTION=$RULEARGS <specialtarget>" $dmenu_fmc)
       +     while [ -n "$application" ]; do
        
       -         if [ -n "$specialtarget" ]; then
       +       # Only show applications that arent already selected for $target_qube via 'grep -v'.
       +       application=$(qvm-appmenus --get-available --i-understand-format-is-unstable "$target_qube" |\
       +         grep -v "$(qvm-appmenus --get-whitelist --i-understand-format-is-unstable "$target_qube")" |\
       +         dmenu -l 50 -p "$target_qube:" $dmenu_fmc | awk '{print $1}')
        
       -           RULEARGS="$RULEARGS SPECIALTARGET=$specialtarget"
       -         fi
       +       if [ -n "$application" ]; then
        
       -         dsthost=$(true |\
       -           dmenu -p "ACTION=$RULEARGS <dsthost>" $dmenu_fmc)
       +         # Check validity of input.
       +         if qvm-appmenus --get-available --i-understand-format-is-unstable "$target_qube" |\
       +           awk '{print $1}' | grep -w "$application" > /dev/null 2>&1; then
        
       -         if [ -n "$dsthost" ]; then
       +           printf "\n\n$application" >> "$HOME"/.local/share/qubes-appmenus/"$target_qube"/whitelisted-appmenus.list
        
       -           RULEARGS="$RULEARGS DSTHOST=$dsthost"
       +           applications_modified=1
                 fi
       +       fi
       +     done
        
       -         proto=$(true |\
       -           dmenu -p "ACTION=$RULEARGS <proto>" $dmenu_fmc)
       -
       -         if [ -n "$proto" ]; then
       +   elif [ "$option" = "Selected" ]; then
        
       -           RULEARGS="$RULEARGS PROTO=$proto"
       -         fi
       +     application=0
        
       -         if [ "$proto" = "tcp" ] || [ "$proto" = "udp" ]; then
       +     while [ -n "$application" ]; do
        
       -           dstports=$(true |\
       -             dmenu -p "ACTION=$RULEARGS <dstports>" $dmenu_fmc)
       +       # Show complete application and .desktop names via 'grep'.
       +       application=$(qvm-appmenus --get-available --i-understand-format-is-unstable "$target_qube" |\
       +         grep "$(qvm-appmenus --get-whitelist --i-understand-format-is-unstable "$target_qube")" |\
       +         dmenu -l 50 -p "$target_qube:" $dmenu_fmc | awk '{print $1}')
        
       -           if [ -n "$dstports" ]; then
       +       if [ -n "$application" ]; then
        
       -             RULEARGS="$RULEARGS DSTPORTS=$dstports"
       -           fi
       +         # Look up linenumber above $application in /whitelisted-appmenus.list and delete whitespace.
       +         whitespace_app=$(cat "$HOME"/.local/share/qubes-appmenus/"$target_qube"/whitelisted-appmenus.list |\
       +           grep -n "$application" | cut -c 1)
        
       -         elif [ "$proto" = "icmp" ]; then
       +         whitespace_app=$((whitespace_app - 1))
        
       -           icmptype=$(true |\
       -             dmenu -p "ACTION=$RULEARGS <icmptype>" $dmenu_fmc)
       +         sed -i "${whitespace_app}{/^$/d;}" "$HOME"/.local/share/qubes-appmenus/"$target_qube"/whitelisted-appmenus.list
       +         sed -i "/$application/d" "$HOME"/.local/share/qubes-appmenus/"$target_qube"/whitelisted-appmenus.list
        
       -           if [ -n "$icmptype" ]; then
       +         applications_modified=1
       +       fi
       +     done
       +   fi
        
       -             RULEARGS="$RULEARGS ICMPTYPE=$icmptype"
       -           fi
       -         fi
       +   if [ -n "$applications_modified" ]; then
        
       -         expire=$(true |\
       -           dmenu -p "ACTION=$RULEARGS <expire>" $dmenu_fmc)
       +     qvm-appmenus --update "$target_qube" > /dev/null 2>&1
        
       -         if [ -n "$expire" ]; then
       +     unset applications_modified
       +   fi
       + done
       +)
        
       -           RULEARGS="EXPIRE=$expire"
       -         fi
       +fqvm_clone() (
        
       -         comment=$(true |\
       -           dmenu -p "ACTION=$RULEARGS <comment>" $dmenu_fmc)
       + clone_name=$(true |\
       +   dmenu -p "Enter the name for the clone of $target_qube" $dmenu_fmc)
        
       -         if [ -n "$comment" ]; then
       + if [ -n "$clone_name" ]; then
        
       -           RULEARGS="$RULEARGS COMMENT=$comment"
       -         fi
       +   option=0
        
       -         answer=$(printf "No\nYes" |\
       -           dmenu -i -p "Add the following rule to $target_qube? {{ ACTION=$RULEARGS }}"\
       -           $dmenu_fmc)
       +   while [ -n "$option" ]; do
        
       -         if [ "$answer" = "Yes" ]; then
       +     option=$(printf "Create the clone\nPool" |\
       +       dmenu -i -l 2 -p "$target_qube:" $dmenu_fmc | awk '{print $1}')
        
       -           if [ -n "$beforerule" ]; then unset beforerule; fi
       +     if [ "$option" = "Pool" ]; then
        
       -           if [ "$rulenumber_selected" != "NO" ]; then
       +       pool=$(qvm-pool --list | sed '1d' |\
       +         dmenu -i -l 10 -p "Select the pool for the new clone of $target_qube"\
       +         $dmenu_fmc | awk '{print $1}')
        
       -             beforerule=$(echo --before "$rulenumber_selected")
       -           fi
       +       if [ -n "$pool" ]; then  pool="-P $pool"; fi
        
       -           RULEARGS=$(echo "$RULEARGS" | awk '{print tolower($0)}')
       +     elif [ "$option" = "Create" ]; then
        
       -           if ! qvm-firewall "$target_qube" add $beforerule $RULEARGS; then
       +       unset option
        
       -             echo "Go back..." | dmenu $dmenu_fmc\
       -               -p "Error: Failed to add firewall rule! See 'qvm-firewall --help' for more information."\
       -               > /dev/null 2>&1
       -           fi
       -         fi
       -       fi
       +       qvm-clone $pool "$target_qube" "$clone_name"&
             fi
       -   fi
       - done
       +   done
       + fi
        )
        
       -
        fqvm_devices() (
        
         if ! qvm-check --running "$target_qube" > /dev/null 2>&1; then
       @@ -657,153 +400,30 @@ fqvm_devices() (
        
             elif [ "$holds_qube" = "$target_qube" ]; then
        
       -       answer=$(printf "No\nYes" |\
       -         dmenu -i -p "Detach $device_name from $target_qube?"\
       -         $dmenu_fmc)
       -
       -       if [ "$answer" = "Yes" ]; then
       -
       -         qvm-$device_type detach "$holds_qube" "$device_id"&
       -       fi
       -     else
       -
       -       answer=$(printf "No\nYes" |\
       -         dmenu -i -p "Detach $device_name from $holds_qube and attach it to $target_qube?"\
       -         $dmenu_fmc)
       -
       -       if [ "$answer" = "Yes" ]; then
       -
       -         $(qvm-$device_type detach "$holds_qube" "$device_id" &&
       -           qvm-$device_type attach "$target_qube" "$device_id")&
       -       fi
       -     fi
       -   fi
       - fi
       -)
       -
       -
       -fqvm_applications() (
       -
       - option=0
       -
       - while [ -n "$option" ]; do
       -
       -   option=$(printf "Add\nRemove" |\
       -     dmenu -i -l 2 -p "$target_qube:" $dmenu_fmc)
       -
       -   if [ "$option" = "Add" ]; then
       -
       -     application=0
       -
       -     while [ -n "$application" ]; do
       -
       -       # Only show applications that arent already selected for $target_qube via 'grep -v'.
       -       application=$(qvm-appmenus --get-available --i-understand-format-is-unstable "$target_qube" |\
       -         grep -v "$(qvm-appmenus --get-whitelist --i-understand-format-is-unstable "$target_qube")" |\
       -         dmenu -l 50 -p "$target_qube:" $dmenu_fmc | awk '{print $1}')
       -
       -       if [ -n "$application" ]; then
       -
       -         # Check validity of input.
       -         if qvm-appmenus --get-available --i-understand-format-is-unstable "$target_qube" |\
       -           awk '{print $1}' | grep -w "$application" > /dev/null 2>&1; then
       -
       -           printf "\n\n$application" >> "$HOME"/.local/share/qubes-appmenus/"$target_qube"/whitelisted-appmenus.list
       -
       -           applications_modified=1
       -         fi
       -       fi
       -     done
       -
       -   elif [ "$option" = "Remove" ]; then
       -
       -     application=0
       -
       -     while [ -n "$application" ]; do
       -
       -       # Show complete application and .desktop names via 'grep'.
       -       application=$(qvm-appmenus --get-available --i-understand-format-is-unstable "$target_qube" |\
       -         grep "$(qvm-appmenus --get-whitelist --i-understand-format-is-unstable "$target_qube")" |\
       -         dmenu -l 50 -p "$target_qube:" $dmenu_fmc | awk '{print $1}')
       -
       -       if [ -n "$application" ]; then
       -
       -         # Look up linenumber above $application in /whitelisted-appmenus.list and delete whitespace.
       -         whitespace_app=$(cat "$HOME"/.local/share/qubes-appmenus/"$target_qube"/whitelisted-appmenus.list |\
       -           grep -n "$application" | cut -c 1)
       -
       -         whitespace_app=$((whitespace_app - 1))
       -
       -         sed -i "${whitespace_app}{/^$/d;}" "$HOME"/.local/share/qubes-appmenus/"$target_qube"/whitelisted-appmenus.list
       -         sed -i "/$application/d" "$HOME"/.local/share/qubes-appmenus/"$target_qube"/whitelisted-appmenus.list
       -
       -         applications_modified=1
       -       fi
       -     done
       -   fi
       -
       -   if [ -n "$applications_modified" ]; then
       -
       -     qvm-appmenus --update "$target_qube" > /dev/null 2>&1
       -
       -     unset applications_modified
       -   fi
       - done
       -)
       -
       -
       -fqvm_service() (
       -
       - service=0
       -
       - while [ -n "$service" ]; do
       -
       -   service=$(qvm-service "$target_qube" --list |\
       -     dmenu -l 32 -p "$target_qube:" $dmenu_fmc | awk '{print $1}')
       -
       -   if [ -n "$service" ]; then
       -
       -     # If the service has already been added to the list,
       -     # give option to unset it.
       -     if qvm-service "$target_qube" --list | grep -w "$service"; then
       -
       -        unset="\nUnset"
       -     fi
       -
       -     value=$(printf "Disable\nEnable$unset" |\
       -       dmenu -l 3 -i -p "Select value for '$service'" $dmenu_fmc)
       -
       -     if [ "$value" = "Disable" ]; then
       -
       -       if ! qvm-service "$target_qube" "$service" off; then
       -
       -         echo "Go back..." | dmenu -p "Error: Could not deactivate $service!"\
       -           $dmenu_fmc > /dev/null 2>&1
       -       fi
       -
       -     elif [ "$value" = "Enable" ]; then
       +       answer=$(printf "No\nYes" |\
       +         dmenu -i -p "Detach $device_name from $target_qube?"\
       +         $dmenu_fmc)
        
       -       if ! qvm-service "$target_qube" "$service" on; then
       +       if [ "$answer" = "Yes" ]; then
        
       -         echo "Go back..." | dmenu -p "Error: Could not activate $service!"\
       -           $dmenu_fmc > /dev/null 2>&1
       +         qvm-$device_type detach "$holds_qube" "$device_id"&
               fi
       +     else
        
       -     elif [ "$value" = "Unset" ]; then
       +       answer=$(printf "No\nYes" |\
       +         dmenu -i -p "Detach $device_name from $holds_qube and attach it to $target_qube?"\
       +         $dmenu_fmc)
        
       -       if ! qvm-service "$target_qube" "$service" --unset; then
       +       if [ "$answer" = "Yes" ]; then
        
       -         echo "Go back..." | dmenu -p "Error: Could not unset $service!"\
       -           $dmenu_fmc > /dev/null 2>&1
       +         $(qvm-$device_type detach "$holds_qube" "$device_id" &&
       +           qvm-$device_type attach "$target_qube" "$device_id")&
               fi
             fi
       -
       -     if [ -n "$unset" ]; then unset unset; fi
           fi
       - done
       + fi
        )
        
       -
        fqvm_disk() (
        
         qube_class=$(qvm-ls --raw-data -O flags "$target_qube" | cut -c 1)
       @@ -853,6 +473,138 @@ fqvm_disk() (
         fi
        )
        
       +fqvm_firewall() (
       +
       + rulenumber_selected=0
       +
       + while [ -n "$rulenumber_selected" ]; do
       +
       +   rulenumber_selected=$(qvm-firewall $target_qube list |\
       +     dmenu -l 50 -p "$target_qube:" $dmenu_fmc | awk '{print $1}')
       +
       +   if [ -n "$rulenumber_selected" ]; then
       +
       +     # This will equal "NO" if the user selects the top row,
       +     # instead of any existing rule.
       +     if [ "$rulenumber_selected" != "NO" ]; then
       +
       +       option=$(printf "Add new rule above rule $rulenumber_selected\nRemove rule $rulenumber_selected" |\
       +         dmenu -i -l 2 -p "$target_qube:" $dmenu_fmc | awk '{print $1}')
       +     else
       +
       +       option="Add"
       +     fi
       +
       +     if [ "$option" = "Remove" ]; then
       +
       +       answer=$(printf "No\nYes" |\
       +         dmenu -i -p "Remove rule $rulenumber_selected?" $dmenu_fmc)
       +
       +       if [ "$answer" = "Yes" ]; then
       +
       +         qvm-firewall "$target_qube" del --rule-no "$rulenumber_selected"
       +       fi
       +
       +     elif [ "$option" = "Add" ]; then
       +
       +       if [ -n "$RULEARGS" ]; then unset RULEARGS; fi
       +
       +       action=$(printf "Accept\nDrop" |\
       +         dmenu -i -l 2 -p "Select action for the new firewall rule" $dmenu_fmc |\
       +         awk '{print tolower($0)}')
       +
       +       if [ -n "$action" ]; then
       +
       +         RULEARGS="$action"
       +
       +         specialtarget=$(true |\
       +           dmenu -p "ACTION=$RULEARGS <specialtarget>" $dmenu_fmc)
       +
       +         if [ -n "$specialtarget" ]; then
       +
       +           RULEARGS="$RULEARGS SPECIALTARGET=$specialtarget"
       +         fi
       +
       +         dsthost=$(true |\
       +           dmenu -p "ACTION=$RULEARGS <dsthost>" $dmenu_fmc)
       +
       +         if [ -n "$dsthost" ]; then
       +
       +           RULEARGS="$RULEARGS DSTHOST=$dsthost"
       +         fi
       +
       +         proto=$(true |\
       +           dmenu -p "ACTION=$RULEARGS <proto>" $dmenu_fmc)
       +
       +         if [ -n "$proto" ]; then
       +
       +           RULEARGS="$RULEARGS PROTO=$proto"
       +         fi
       +
       +         if [ "$proto" = "tcp" ] || [ "$proto" = "udp" ]; then
       +
       +           dstports=$(true |\
       +             dmenu -p "ACTION=$RULEARGS <dstports>" $dmenu_fmc)
       +
       +           if [ -n "$dstports" ]; then
       +
       +             RULEARGS="$RULEARGS DSTPORTS=$dstports"
       +           fi
       +
       +         elif [ "$proto" = "icmp" ]; then
       +
       +           icmptype=$(true |\
       +             dmenu -p "ACTION=$RULEARGS <icmptype>" $dmenu_fmc)
       +
       +           if [ -n "$icmptype" ]; then
       +
       +             RULEARGS="$RULEARGS ICMPTYPE=$icmptype"
       +           fi
       +         fi
       +
       +         expire=$(true |\
       +           dmenu -p "ACTION=$RULEARGS <expire>" $dmenu_fmc)
       +
       +         if [ -n "$expire" ]; then
       +
       +           RULEARGS="EXPIRE=$expire"
       +         fi
       +
       +         comment=$(true |\
       +           dmenu -p "ACTION=$RULEARGS <comment>" $dmenu_fmc)
       +
       +         if [ -n "$comment" ]; then
       +
       +           RULEARGS="$RULEARGS COMMENT=$comment"
       +         fi
       +
       +         answer=$(printf "No\nYes" |\
       +           dmenu -i -p "Add the following rule to $target_qube? {{ ACTION=$RULEARGS }}"\
       +           $dmenu_fmc)
       +
       +         if [ "$answer" = "Yes" ]; then
       +
       +           if [ -n "$beforerule" ]; then unset beforerule; fi
       +
       +           if [ "$rulenumber_selected" != "NO" ]; then
       +
       +             beforerule=$(echo --before "$rulenumber_selected")
       +           fi
       +
       +           RULEARGS=$(echo "$RULEARGS" | awk '{print tolower($0)}')
       +
       +           if ! qvm-firewall "$target_qube" add $beforerule $RULEARGS; then
       +
       +             echo "Go back..." | dmenu $dmenu_fmc\
       +               -p "Error: Failed to add firewall rule! See 'qvm-firewall --help' for more information."\
       +               > /dev/null 2>&1
       +           fi
       +         fi
       +       fi
       +     fi
       +   fi
       + done
       +)
        
        fqvm_keyboard() (
        
       @@ -887,389 +639,580 @@ fqvm_keyboard() (
         fi
        )
        
       +fqvm_logs() (
        
       -fqvm_remove() (
       + entry=0
       +
       + while [ -n "$entry" ]; do
       +
       +   entry=$(printf "/var/log/xen/console/guest-$target_qube.log\n/var/log/qubes/guid.$target_qube.log\n/var/log/qubes/qrexec.$target_qube.log" |\
       +     dmenu -i -l 3 -p "$target_qube:" $dmenu_fmc)
       +
       +   if [ -n "$entry" ]; then
       +
       +     log=$(cat "$entry" | dmenu -l 20 -p "$target_qube:" $dmenu_fmc)
       +
       +     if [ -n "$log" ]; then
       +
       +       echo "$log" > /var/run/qubes/qubes-clipboard.bin
       +
       +       printf "dom0" > /var/run/qubes/qubes-clipboard.bin.source
       +     fi
       +   fi
       + done
       +)
       +
       +fqvm_pci() (
        
         if qvm-check --running "$target_qube" > /dev/null 2>&1; then
        
           echo "Go back..." |\
       -     dmenu -p "$target_qube needs to be powered off, in order to be removed"\
       +     dmenu -p "$target_qube needs to be powered off, in order to attach or detach PCI devices"\
             $dmenu_fmc > /dev/null 2>&1
         else
        
       -   confirmation=$(true |\
       -     dmenu -p "Enter the name of the qube '$target_qube' in order to remove it"\
       -     $dmenu_fmc)
       +   list_pci=$(qvm-pci)
       +
       +   if ! qvm-prefs --get "$target_qube" maxmem | grep -w 0 > /dev/null 2>&1; then
       +
       +     answer_memorybalancing=$(printf "Continue anyways\nDisable dynamic memory balancing" |\
       +       dmenu -l 2 -i -p "Dynamic memory balancing is enabled in $target_qube, some devices might not work!"\
       +       $dmenu_fmc | awk '{print $1}')
       +
       +     if [ "$answer_memorybalancing" = "Disable" ]; then
       +
       +       qvm-prefs --set "$target_qube" maxmem 0
       +     fi
       +   fi
       +
       +   if qvm-prefs --get "$target_qube" virt_mode |\
       +     grep -w pvh > /dev/null 2>&1; then
       +
       +     answer_virtmode=$(printf "Continue anyways\nSelect another virtualisation mode" |\
       +       dmenu -l 2 -i -p "$target_qube is using PVH for its virtualisation mode, which does not support PCI passthrough!"\
       +       $dmenu_fmc | awk '{print $1}')
       +
       +     if [ "$answer_virtmode" = "Select" ]; then
       +
       +       virtmode_selected=$(printf "HVM\nPV" |\
       +         dmenu -l 2 -i -p "Select virtualisation mode for $target_qube" $dmenu_fmc)
       +
       +       if [ -n "$virtmode_selected" ]; then
       +
       +         qvm-prefs --set "$target_qube" virt_mode "$virtmode_selected"
       +       fi
       +     fi
       +   fi
       +
       +   device_selected=0
       +
       +   while [ -n "$device_selected" ]; do
       +
       +     device_selected=$(echo "$list_pci" |\
       +       dmenu -l 30 -p "$target_qube:" $dmenu_fmc)
       +
       +     if [ -n "$device_selected" ]; then
       +
       +       device_src=$(echo "$device_selected" | awk '{print $1}' | sed 's/:.*//')
       +       device_bdf=$(echo "$device_selected" | awk '{print $1}' | sed 's/.*://')
       +
       +       if echo "$device_selected" | grep -w "$target_qube"; then
       +
       +         answer=$(printf "No\nYes" |\
       +           dmenu -i -p "Detach \"$device_bdf\" from $target_qube?" $dmenu_fmc)
       +
       +         if [ "$answer" = "Yes" ]; then
       +
       +           if ! test_qvm-pci detach "$target_qube" "$device_src":"$device_bdf"; then
       +
       +             echo "Go back..." |\
       +               dmenu -p "Error: Failed to detach \"$device_bdf\" from $target_qube!"\
       +               $dmenu_fmc > /dev/null 2>&1
       +           fi
       +
       +           list_pci=$(qvm-pci)
       +         fi
       +       else
       +
       +         answer=$(printf "No\nYes" |\
       +           dmenu -i -p "Attach \"$device_bdf\" to $target_qube?" $dmenu_fmc)
       +
       +         if [ "$answer" = "Yes" ]; then
       +
       +           # Check if there is more than one function
       +           # that belongs to the same device.
       +           bdf_count=$(echo "$list_pci" | awk '{print $1}' |\
       +             grep $(echo "$device_bdf" | sed 's/\..*//') | wc -l) 
       +
       +           if [ "$bdf_count" -gt 1 ]; then
       +
       +             if [ -n "$pci_option" ]; then unset pci_option; fi
        
       -   if [ "$target_qube" = "$confirmation" ]; then
       +               answer_nsrt=$(printf "No\nYes" |\
       +                 dmenu -i -p "\"$device_bdf\" is most likely to be attached with the option 'no-strict-reset' enabled. Please be aware of the security implications! Do you want to attach \"$device_bdf\" with the option 'no-strict-reset' set to true?"\
       +                 $dmenu_fmc)
        
       -     confirmation_semifinal=$(printf "No\nYes" |\
       -       dmenu -i -p "Are you sure you want to remove $target_qube permanently?"\
       -       $dmenu_fmc)
       +             if [ "$answer_nsrt" = "Yes" ]; then
        
       -     if [ "$confirmation_semifinal" = "Yes" ]; then
       +               pci_option="-o no-strict-reset=True"
       +             fi
       +           fi
        
       -       confirmation_final=$(printf "No\nYes" |
       -         dmenu -i -p "Are you really sure you want to remove $target_qube permanently?"\
       -         $dmenu_fmc)
       +           if ! qvm-pci attach --persistent $pci_option "$target_qube" "$device_src:$device_bdf"; then
        
       -       if [ "$confirmation_final" = "Yes" ]; then
       +             echo "Go back..." |\
       +               dmenu -p "Error: Failed to attach \"$device_bdf\" to $target_qube!"\
       +               $dmenu_fmc > /dev/null 2>&1
       +           fi
        
       -         qvm-remove -f "$target_qube"&
       +           list_pci=$(qvm-pci)
       +         fi
               fi
             fi
       -   fi
       +   done
         fi
        )
        
       +fqvm_preferences() (
        
       -fqvm_clone() (
       + property=0
        
       - clone_name=$(true |\
       -   dmenu -p "Enter the name for the clone of $target_qube" $dmenu_fmc)
       + while [ -n "$property" ]; do
        
       - if [ -n "$clone_name" ]; then
       +   property=$(qvm-prefs "$target_qube" |\
       +     dmenu -l 45 -p "$target_qube:" $dmenu_fmc |\
       +     awk '{print $1}')
        
       -   option=0
       +   if [ -n "$property" ]; then
        
       -   while [ -n "$option" ]; do
       +     case $property in
        
       -     option=$(printf "Create the clone\nPool" |\
       -       dmenu -i -l 2 -p "$target_qube:" $dmenu_fmc | awk '{print $1}')
       +       autostart)
        
       -     if [ "$option" = "Pool" ]; then
       +         value_selected=$(printf "False\nTrue" |\
       +           dmenu -i -p "Set autostart of $target_qube to:" $dmenu_fmc)
        
       -       pool=$(qvm-pool --list | sed '1d' |\
       -         dmenu -i -l 10 -p "Select the pool for the new clone of $target_qube"\
       -         $dmenu_fmc | awk '{print $1}')
       +         if [ -n "$value_selected" ]; then
        
       -       if [ -n "$pool" ]; then  pool="-P $pool"; fi
       +           qvm-prefs --set "$target_qube" "$property" "$value_selected"; fi;;
        
       -     elif [ "$option" = "Create" ]; then
       +       debug)
        
       -       unset option
       +         value_selected=$(printf "False\nTrue" |\
       +           dmenu -i -p "Set debug mode of $target_qube to:" $dmenu_fmc)
        
       -       qvm-clone $pool "$target_qube" "$clone_name"&
       -     fi
       -   done
       - fi
       -)
       +         if [ -n "$value_selected" ]; then
        
       +           qvm-prefs --set "$target_qube" "$property" "$value_selected"; fi;;
        
       -fqvm_logs() (
       +       default_dispvm)
        
       - entry=0
       +         if [ -n "$LIST_OF_DISPTEMP" ]; then unset LIST_OF_DISPTEMP; fi
        
       - while [ -n "$entry" ]; do
       +         # [mediocre] Look up disposable templates.
       +         for n in $(qvm-ls --raw-data -O NAME,FLAGS |\
       +           grep '|a.......$' | cut -d '|' -f1); do
        
       -   entry=$(printf "/var/log/xen/console/guest-$target_qube.log\n/var/log/qubes/guid.$target_qube.log\n/var/log/qubes/qrexec.$target_qube.log" |\
       -     dmenu -i -l 3 -p "$target_qube:" $dmenu_fmc)
       +           if qvm-prefs --get "$n" template_for_dispvms |\
       +             grep True > /dev/null 2>&1; then
        
       -   if [ -n "$entry" ]; then
       +             LIST_OF_DISPTEMP="$LIST_OF_DISPTEMP\n$n"
       +           fi
       +         done
        
       -     log=$(cat "$entry" | dmenu -l 20 -p "$target_qube:" $dmenu_fmc)
       +         value_selected=$(printf "(Default)\n(None)$LIST_OF_DISPTEMP" |\
       +           dmenu -l 50 -p "Select default dispvm for $target_qube" $dmenu_fmc)
        
       -     if [ -n "$log" ]; then
       +         if [ "$value_selected" = "(None)" ]; then
        
       -       echo "$log" > /var/run/qubes/qubes-clipboard.bin
       +           value_selected="None"
        
       -       printf "dom0" > /var/run/qubes/qubes-clipboard.bin.source
       -     fi
       -   fi
       - done
       -)
       +         elif [ "$value_selected" = "(Default)" ]; then
        
       +           value_selected="--default"
       +         fi
        
       -fqvm_run() (
       +         if [ -n "$value_selected" ]; then
        
       - commandtr=$(true |\
       -   dmenu -p "Enter the command that is to be run in $target_qube" $dmenu_fmc)
       +           qvm-prefs --set "$target_qube" "$property" "$value_selected"; fi;;
        
       - if [ -n "$commandtr" ]; then qvm-run "$target_qube" "$commandtr"& fi
       -)
       +       default_user)
        
       +         value_selected=$(echo "--default" |\
       +           dmenu -p "Enter the name of the default user for $target_qube"\
       +           $dmenu_fmc)
        
       -get_qube_label() {
       +         if [ -n "$value_selected" ]; then
        
       - qube_label=$(qvm-ls --raw-data "$target_qube" -O LABEL)
       +           qvm-prefs --set "$target_qube" "$property" "$value_selected"; fi;;
        
       - # Change some to a more readable color if needed.
       - if [ "$qube_label" = "black" ]; then
       +       include_in_backups)
        
       -   qube_label='#373737'
       +         value_selected=$(printf "False\nTrue" |\
       +           dmenu -i -p "Include $target_qube in backups?" $dmenu_fmc)
        
       - elif [ "$qube_label" = "orange" ]; then
       +         if [ -n "$value_selected" ]; then
        
       -   qube_label='#f57900'
       +           qvm-prefs --set "$target_qube" "$property" "$value_selected"; fi;;
        
       - elif [ "$qube_label" = "yellow" ]; then
       +       kernel)
        
       -   qube_label='#edd400'
       +         value_selected=$(echo "--default" |\
       +           dmenu -p "Enter kernel to be used by $target_qube" $dmenu_fmc)
        
       - elif [ "$qube_label" = "green" ]; then
       +         if [ -n "$value_selected" ]; then
        
       -   qube_label='#73d216'
       - fi
       +           answer_selected=$(printf "No\nYes" |\
       +             dmenu -i -p "Set kernel of $target_qube to $value_selected?"\
       +             $dmenu_fmc)
        
       - # Note that the '-m 0' option in 'dmenu' is important
       - # for security, as it restricts it to monitor 0.
       - dmenu_fmc="-f -m 0 -nb $theme_0 -nf $theme_1 -sb $qube_label -sf $theme_1"
       -}
       +           if [ "$answer_selected" = "Yes" ]; then
        
       +             qvm-prefs --set "$target_qube" "$property" "$value_selected"
       +           fi
       +         fi;;
        
       +       kernelopts)
        
       -fdom0_preferences() (
       +         value_selected=$(echo "--default" |\
       +           dmenu -p "Enter kernel options for $target_qube" $dmenu_fmc)
        
       - dmenu_d0="-f -m 0 -nb #d3d3d3 -nf #000000 -sb #ffffff -sf #000000"
       +         if [ -n "$value_selected" ]; then
        
       - property=0
       +           answer_selected=$(printf "No\nYes" |\
       +             dmenu -i -p "Set kernel options for $target_qube to \"$value_selected\"?"\
       +             $dmenu_fmc)
        
       - while [ -n "$property" ]; do
       +           if [ "$answer_selected" = "Yes" ]; then
        
       -   property=$(qubes-prefs |\
       -     dmenu -l 16 -p "Global Preferences:" $dmenu_d0 |\
       -     awk '{print $1}')
       +             qvm-prefs --set "$target_qube" "$property" "$value_selected"
       +           fi
       +         fi;;
        
       -   case $property in
       +       label)
        
       -     check_updates_vm)
       +         if qvm-check --running "$target_qube" > /dev/null 2>&1; then
        
       -       value_selected=$(printf "False\nTrue" |\
       -         dmenu -i -p "Should the system periodically check for domU updates?"\
       -         $dmenu_d0)
       +           echo "Go back..." |\
       +             dmenu -p "$target_qube needs to be powered off, in order to change its label"\
       +             $dmenu_fmc > /dev/null 2>&1
       +         else
        
       -       if [ -n "$value_selected" ]; then
       +           value_selected=$(printf "Purple\nBlue\nGreen\nYellow\nOrange\nRed\nGray\nBlack" |\
       +             dmenu -i -l 8 -p "Select label for $target_qube" $dmenu_fmc |\
       +             awk '{print tolower($0)}')
        
       -         qubes-prefs --set "$property" "$value_selected"; fi;;
       +           if [ -n "$value_selected" ]; then
        
       +             qvm-prefs --set "$target_qube" "$property" "$value_selected"
       +           fi
       +         fi;;
        
       -     clockvm)
       +       mac)
        
       -       # List netvm's via 'qvm-ls'.
       -       value_selected=$(printf "$(qvm-ls --raw-data --fields NAME,FLAGS |\
       -         grep '|...N....$' | cut -d '|' -f1)" |\
       -         dmenu -l 50 -p "Select new ClockVM" $dmenu_d0)
       +         value_selected=$(echo "--default" |\
       +           dmenu -p "Enter new MAC address for $target_qube" $dmenu_fmc)
        
       -       if [ -n "$value_selected" ]; then
       +         if [ -n "$value_selected" ]; then
        
       -         qubes-prefs --set "$property" "$value_selected"; fi;;
       +           answer_selected=$(printf "No\nYes" |\
       +             dmenu -i -p "Set MAC address of $target_qube to $value_selected?"\
       +             $dmenu_fmc)
        
       +           if [ "$answer_selected" = "Yes" ]; then
        
       -     default_dispvm)
       +             if ! qvm-prefs --set "$target_qube" "$property" "$value_selected"; then
        
       -       if [ -n "$LIST_OF_DISPTEMP" ]; then unset LIST_OF_DISPTEMP; fi
       +               echo "Go back..." |\
       +                 dmenu -p "Error: Could not set MAC address to '$value_selected'!"\
       +                 $dmenu_fmc > /dev/null 2>&1
       +             fi
       +           fi
       +         fi;;
        
       -       # [mediocre] Look up disposable templates.
       -       for n in $(qvm-ls --raw-data -O NAME,FLAGS |\
       -         grep '|a.......$' | cut -d '|' -f1); do
       +       maxmem)
        
       -         if qvm-prefs --get "$n" template_for_dispvms |\
       -           grep True > /dev/null 2>&1; then
       +         value_selected=$(echo "--default" |\
       +           dmenu -p "Enter the maximum amount of memory in MB to be allocated to $target_qube. Setting it to 0 will disable dynamic memory balancing."\
       +           $dmenu_fmc)
        
       -           LIST_OF_DISPTEMP="$LIST_OF_DISPTEMP\n$n"
       -         fi
       -       done
       +         if [ -n "$value_selected" ]; then
        
       -       value_selected=$(printf "(None)$LIST_OF_DISPTEMP" |\
       -         dmenu -l 50 -p "Select default dispvm"\
       -         $dmenu_d0)
       +           answer_selected=$(printf "No\nYes" |\
       +             dmenu -i -p "Set maximum memory of $target_qube to $value_selected MB?"\
       +             $dmenu_fmc)
        
       -       if [ "$value_selected" = "(None)" ]; then
       +           if [ "$answer_selected" = "Yes" ]; then
        
       -         value_selected="none"
       -       fi
       +             qvm-prefs --set "$target_qube" "$property" "$value_selected"
       +           fi
       +         fi;;
        
       -       if [ -n "$value_selected" ]; then
       +       memory)
        
       -         qubes-prefs --set "$property" "$value_selected"; fi;;
       +         value_selected=$(echo "--default" |\
       +           dmenu -p "Enter the amount of initial memory in MB to be allocated to $target_qube"\
       +           $dmenu_fmc)
        
       +         if [ -n "$value_selected" ]; then
        
       -     default_kernel)
       +           answer_selected=$(printf "No\nYes" |\
       +             dmenu -i -p "Set initial memory of $target_qube to $value_selected MB?" $dmenu_fmc)
        
       -       value_selected=$(true |\
       -         dmenu -p "Enter the kernel that is to be used as default"\
       -         $dmenu_d0)
       +           if [ "$answer_selected" = "Yes" ]; then
        
       -       if [ -n "$value_selected" ]; then
       +             qvm-prefs --set "$target_qube" "$property" "$value_selected"
       +           fi
       +         fi;;
        
       -         answer_selected=$(printf "No\nYes" |\
       -           dmenu -i -p "Set default kernel to $value_selected?"\
       -           $dmenu_d0)
       +       netvm)
       +
       +         # List netvm's via 'qvm-ls'.
       +         value_selected=$(printf "(Default)\n(None)\n$(qvm-ls --raw-data --fields NAME,FLAGS |\
       +           grep '|...N....$' | cut -d '|' -f1)" |\
       +           dmenu -l 50 -p "Select netvm for $target_qube" $dmenu_fmc)
       +
       +         if [ "$value_selected" = "(None)" ]; then
       +
       +           value_selected="None"
        
       -         if [ "$answer_selected" = "Yes" ]; then
       +         elif [ "$value_selected" = "(Default)" ]; then
        
       -           qubes-prefs --set "$property" "$value_selected"
       +           value_selected="--default"
                 fi
       -       fi;;
        
       +         if [ -n "$value_selected" ]; then
        
       -     default_netvm)
       +           qvm-prefs --set "$target_qube" "$property" "$value_selected"; fi;;
        
       -       # List netvm's via 'qvm-ls'.
       -       value_selected=$(printf "$(qvm-ls --raw-data --fields NAME,FLAGS |\
       -         grep '|...N....$' | cut -d '|' -f1)" |\
       -         dmenu -l 50 -p "Select netvm for $target_qube" $dmenu_d0)
       +       provides_network)
        
       -       if [ -n "$value_selected" ]; then
       +         value_selected=$(printf "False\nTrue" |\
       +           dmenu -i -p "Should $target_qube provide networking for other qubes?"\
       +           $dmenu_fmc)
        
       -         qubes-prefs --set "$property" "$value_selected"; fi;;
       +         if [ -n "$value_selected" ]; then
        
       +           qvm-prefs --set "$target_qube" "$property" "$value_selected"; fi;;
        
       -     default_pool)
       +       qrexec_timeout)
        
       -       value_selected=$(qvm-pool --list | sed '1d' |\
       -         dmenu -i -l 30 -p "Select default storage pool" \
       -         $dmenu_d0 | awk '{print $1}')
       +         value_selected=$(echo "--default" |\
       +           dmenu -p "Enter the time in seconds, after which qrexec attempt is deemed a failure for $target_qube"\
       +           $dmenu_fmc)
        
       -       if [ -n "$value_selected" ]; then
       +         if [ -n "$value_selected" ]; then
        
       -         qubes-prefs --set "$property" "$value_selected"; fi;;
       +           answer_selected=$(printf "No\nYes" |\
       +             dmenu -i -p "Set qrexec timeout for $target_qube to $value_selected seconds?"\
       +             $dmenu_fmc)
        
       +           if [ "$answer_selected" = "Yes" ]; then
        
       -     default_pool_kernel)
       +             qvm-prefs --set "$target_qube" "$property" "$value_selected"
       +           fi
       +         fi;;
        
       -       value_selected=$(qvm-pool --list | sed '1d' |\
       -         dmenu -i -l 30 -p "Select default storage pool for kernel volumes" \
       -         $dmenu_d0 | awk '{print $1}')
       +       shutdown_timeout)
        
       -       if [ -n "$value_selected" ]; then
       +         value_selected=$(echo "--default" |\
       +           dmenu -p "Enter the time in seconds for shutdown, after which $target_qube may be forcefully powered off"\
       +           $dmenu_fmc)
        
       -         qubes-prefs --set "$property" "$value_selected"; fi;;
       +         if [ -n "$value_selected" ]; then
        
       +           answer_selected=$(printf "No\nYes" |\
       +             dmenu -i -p "Set shutdown timeout for $target_qube to $value_selected seconds?"\
       +             $dmenu_fmc)
        
       -     default_pool_private)
       +           if [ "$answer_selected" = "Yes" ]; then
        
       -       value_selected=$(qvm-pool --list | sed '1d' |\
       -         dmenu -i -l 30 -p "Select default storage pool for private volumes" \
       -         $dmenu_d0 | awk '{print $1}')
       +             qvm-prefs --set "$target_qube" "$property" "$value_selected"
       +           fi
       +         fi;;
        
       -       if [ -n "$value_selected" ]; then
       +       template)
        
       -         qubes-prefs --set "$property" "$value_selected"; fi;;
       +         if qvm-check --running "$target_qube" > /dev/null 2>&1; then
        
       +           echo "Go back..." |\
       +             dmenu -p "$target_qube needs to be powered off, in order to change its template"\
       +             $dmenu_fmc > /dev/null 2>&1
       +         else
        
       -     default_pool_root)
       +           # List templatevm's via 'qvm-ls'.
       +           value_selected=$(printf "(Default)\n$(qvm-ls --raw-data --fields NAME,FLAGS |\
       +             grep '|t.......$' | cut -d '|' -f1)" |\
       +             dmenu -l 50 -p "Select template for $target_qube" $dmenu_fmc)
        
       -       value_selected=$(qvm-pool --list | sed '1d' |\
       -         dmenu -i -l 30 -p "Select default storage pool for root volumes" \
       -         $dmenu_d0 | awk '{print $1}')
       +           if [ "$value_selected" = "(Default)" ]; then
        
       -       if [ -n "$value_selected" ]; then
       +             value_selected="--default"
       +           fi
        
       -         qubes-prefs --set "$property" "$value_selected"; fi;;
       +           if [ -n "$value_selected" ]; then
        
       +             qvm-prefs --set "$target_qube" "$property" "$value_selected"
       +           fi
       +         fi;;
        
       -     default_pool_volatile)
       +       template_for_dispvms)
        
       -       value_selected=$(qvm-pool --list | sed '1d' |\
       -         dmenu -i -l 30 -p "Select default storage pool for volatile volumes" \
       -         $dmenu_d0 | awk '{print $1}')
       +         value_selected=$(printf "False\nTrue" |\
       +           dmenu -i -p "Should $target_qube be used as a template for disposable qubes?"\
       +           $dmenu_fmc)
        
       -       if [ -n "$value_selected" ]; then
       +         if [ -n "$value_selected" ]; then
        
       -         qubes-prefs --set "$property" "$value_selected"; fi;;
       +           qvm-prefs --set "$target_qube" "$property" "$value_selected"; fi;;
        
       +       vcpus)
        
       -     default_qrexec_timeout)
       +         value_selected=$(echo "--default" |\
       +           dmenu -p "Enter the number of CPU cores that should be made available to $target_qube"\
       +           $dmenu_fmc)
        
       -       value_selected=$(qubes-prefs --get default_qrexec_timeout |\
       -         dmenu -p "Enter the time in seconds, after which qrexec connection attempts are deemed a failure"\
       -         $dmenu_d0)
       +         if [ -n "$value_selected" ]; then
        
       -       if [ -n "$value_selected" ]; then
       +           answer_selected=$(printf "No\nYes" |\
       +             dmenu -i -p "Set number of CPU cores available to $target_qube to $value_selected?"\
       +             $dmenu_fmc)
        
       -         qubes-prefs --set "$property" "$value_selected"; fi;;
       +           if [ "$answer_selected" = "Yes" ]; then
        
       +             qvm-prefs --set "$target_qube" "$property" "$value_selected"
       +           fi
       +         fi;;
        
       -     default_shutdown_timeout)
       +       virt_mode)
        
       -       value_selected=$(qubes-prefs --get default_shutdown_timeout |\
       -         dmenu -p "Enter the default time in seconds for vm shutdowns to complete"\
       -         $dmenu_d0)
       +         value_selected=$(printf "PVH\nHVM\nPV" |\
       +           dmenu -i -l 3 -p "Select virtualisation mode for $target_qube"\
       +           $dmenu_fmc)
        
       -       if [ -n "$value_selected" ]; then
       +         if [ -n "$value_selected" ]; then
        
       -         qubes-prefs --set "$property" "$value_selected"; fi;;
       +           qvm-prefs --set "$target_qube" "$property" "$value_selected"; fi;;
       +
       +       *)
       +     esac
       +   fi
       + done
       +)
        
       +fqvm_remove() (
        
       -     default_template)
       + if qvm-check --running "$target_qube" > /dev/null 2>&1; then
        
       -       # List templatevm's via 'qvm-ls'.
       -       value_selected=$(qvm-ls --raw-data --fields NAME,FLAGS |\
       -         grep '|t.......$' | cut -d '|' -f1 |\
       -         dmenu -l 50 -p "Select default template for" $dmenu_d0)
       +   echo "Go back..." |\
       +     dmenu -p "$target_qube needs to be powered off, in order to be removed"\
       +     $dmenu_fmc > /dev/null 2>&1
       + else
        
       -       if [ -n "$value_selected" ]; then
       +   confirmation=$(true |\
       +     dmenu -p "Enter the name of the qube '$target_qube' in order to remove it"\
       +     $dmenu_fmc)
        
       -         qubes-prefs --set "$property" "$value_selected"; fi;;
       +   if [ "$target_qube" = "$confirmation" ]; then
        
       +     confirmation_semifinal=$(printf "No\nYes" |\
       +       dmenu -i -p "Are you sure you want to remove $target_qube permanently?"\
       +       $dmenu_fmc)
        
       -     management_dispvm)
       +     if [ "$confirmation_semifinal" = "Yes" ]; then
        
       -       if [ -n "$LIST_OF_DISPTEMP" ]; then unset LIST_OF_DISPTEMP; fi
       +       confirmation_final=$(printf "No\nYes" |
       +         dmenu -i -p "Are you really sure you want to remove $target_qube permanently?"\
       +         $dmenu_fmc)
        
       -         # [mediocre] Look up disposable templates.
       -         for n in $(qvm-ls --raw-data -O NAME,FLAGS |\
       -           grep '|a.......$' | cut -d '|' -f1); do
       +       if [ "$confirmation_final" = "Yes" ]; then
        
       -           if qvm-prefs --get "$n" template_for_dispvms |\
       -             grep True > /dev/null 2>&1; then
       +         qvm-remove -f "$target_qube"&
       +       fi
       +     fi
       +   fi
       + fi
       +)
        
       -             if [ -z "$LIST_OF_DISPTEMP" ]
       +fqvm_run() (
        
       -               then LIST_OF_DISPTEMP=$n
       + commandtr=$(true |\
       +   dmenu -p "Enter the command that is to be run in $target_qube" $dmenu_fmc)
        
       -               else LIST_OF_DISPTEMP="$LIST_OF_DISPTEMP\n$n"
       -             fi
       -           fi
       -         done
       + if [ -n "$commandtr" ]; then qvm-run "$target_qube" "$commandtr"& fi
       +)
        
       -         value_selected=$(printf "$LIST_OF_DISPTEMP" |\
       -           dmenu -l 50 -p "Select management dispvm"\
       -           $dmenu_d0)
       +fqvm_service() (
        
       -         if [ -n "$value_selected" ]; then
       + service=0
        
       -         qubes-prefs --set "$property" "$value_selected"; fi;;
       + while [ -n "$service" ]; do
       +
       +   service=$(qvm-service "$target_qube" --list |\
       +     dmenu -l 32 -p "$target_qube:" $dmenu_fmc | awk '{print $1}')
        
       +   if [ -n "$service" ]; then
        
       -     stats_interval)
       +     # If the service has already been added to the list,
       +     # give option to unset it.
       +     if qvm-service "$target_qube" --list | grep -w "$service"; then
        
       -       value_selected=$(true  |\
       -         dmenu -p "Enter interval in seconds for VM stats reporting" $dmenu_d0)
       +        unset="\nUnset"
       +     fi
        
       -       if [ -n "$value_selected" ]; then
       +     value=$(printf "Disable\nEnable$unset" |\
       +       dmenu -l 3 -i -p "Select value for '$service'" $dmenu_fmc)
        
       -         qubes-prefs --set "$property" "$value_selected"; fi;;
       +     if [ "$value" = "Disable" ]; then
        
       +       if ! qvm-service "$target_qube" "$service" off; then
        
       -     updatevm)
       +         echo "Go back..." | dmenu -p "Error: Could not deactivate $service!"\
       +           $dmenu_fmc > /dev/null 2>&1
       +       fi
        
       -       # List netvm's via 'qvm-ls'.
       -       value_selected=$(printf "$(qvm-ls --raw-data --fields NAME,FLAGS |\
       -         grep '|...N....$' | cut -d '|' -f1)" |\
       -         dmenu -l 50 -p "Select new UpdateVM" $dmenu_d0)
       +     elif [ "$value" = "Enable" ]; then
        
       -       if [ -n "$value_selected" ]; then
       +       if ! qvm-service "$target_qube" "$service" on; then
        
       -         if qvm-check --running "$value_selected" > /dev/null 2>&1; then
       +         echo "Go back..." | dmenu -p "Error: Could not activate $service!"\
       +           $dmenu_fmc > /dev/null 2>&1
       +       fi
        
       -           qubes-prefs --set "$property" "$value_selected"
       -         else
       +     elif [ "$value" = "Unset" ]; then
        
       -           echo "Go back..." |\
       -             dmenu -p "$value_selected needs to be running!"\
       -             $dmenu_d0 > /dev/null 2>&1
       -         fi
       -       fi;;
       +       if ! qvm-service "$target_qube" "$service" --unset; then
        
       +         echo "Go back..." | dmenu -p "Error: Could not unset $service!"\
       +           $dmenu_fmc > /dev/null 2>&1
       +       fi
       +     fi
        
       -     *)
       -   esac
       +     if [ -n "$unset" ]; then unset unset; fi
       +   fi
         done
        )
        
       +get_qube_label() {
       +
       + qube_label=$(qvm-ls --raw-data "$target_qube" -O LABEL)
       +
       + # Change some to a more readable color if needed.
       + case $qube_label in
       +
       +   black) qube_label='#373737';;
       +
       +   orange) qube_label='#f57900';;
       +
       +   yellow) qube_label='#edd400';;
        
       +   green) qube_label='#73d216'
       + esac
       +
       + # Note that the '-m 0' option in 'dmenu' is important
       + # for security, as it restricts it to monitor 0.
       + dmenu_fmc="-f -m 0 -nb $theme_0 -nf $theme_1 -sb $qube_label -sf $theme_1"
       +}
        
        rearrange_qube_list() {
        
       @@ -1284,6 +1227,9 @@ rearrange_qube_list() {
        }
        
        
       +
       +
       +
        if [ "$2" = "--light-theme" ]; then
        
          theme_0='#ffffff'