Skip to content

Instantly share code, notes, and snippets.

@av-gantimurov
Created June 26, 2025 09:20
Show Gist options
  • Select an option

  • Save av-gantimurov/4b61ff9dc7244ec0224e5c89c409b624 to your computer and use it in GitHub Desktop.

Select an option

Save av-gantimurov/4b61ff9dc7244ec0224e5c89c409b624 to your computer and use it in GitHub Desktop.
Rofi shell script for Virtualbox VM run/stop
#!/usr/bin/env bash
# rofi-virtualbox: manage virtualbox machines with rofi
# Originally by Oliver Kraitschy <[email protected]> (https://github.com/okraits/rofi-tools)
# With modifications by Alexander Pushkov <[email protected]>
TMPFILE="/tmp/$USER-rofi-vbox.tmp"
TMPFILE_ERR="/tmp/$USER-rofi-vbox.err"
OPTIONS_OFF="Start machine\nStart headless\nStart separate\nRestore last snapshot"
OPTIONS_RUNNING="Show machine\nSend ACPI shutdown signal\nSave state\nPause machine\nReset\nReboot"
OPTIONS_PAUSED="Show machine\nSend ACPI shutdown signal\nSave state\nResume machine\nReset\nReboot"
OPTIONS_DEF="Start machine\nStart headless\nSend ACPI shutdown\nSave state\nPause machine"
kb_start="Control-Return"
args=(
-dmenu
-kb-custom-1 "${kb_start}"
-kb-accept-custom ""
)
declare -i SELECTED
while true; do
# select machine to control
vm=$(vboxmanage list vms | awk -F '"' '{print $2}' | grep -v '^<' | rofi "${args[@]}" -mesg 'Select machine:' -selected-row "${SELECTED}")
rofi_exit=$?
if [[ $rofi_exit -eq 1 ]]; then
exit
fi
case "${rofi_exit}" in
0) # default
# just pass through to the menu
;;
10) # -kb-custom-1
vboxmanage startvm --type separate "$vm"
exit
;;
esac
# vmstate=$(vboxmanahe showvminfo "$vm" --machinereadable | cut -d '"' -f 2)
vmstate=$(vboxmanage showvminfo "$vm" --machinereadable | grep 'VMState=' | cut -d '"' -f 2)
[ -n "$vmstate" ] || continue
case "$vmstate" in
"poweroff")
OPTIONS="$OPTIONS_OFF"
;;
"aborted")
OPTIONS="$OPTIONS_OFF"
;;
"running")
OPTIONS="$OPTIONS_RUNNING"
;;
"paused")
OPTIONS="$OPTIONS_PAUSED"
;;
*)
OPTIONS="$OPTIONS_DEF"
;;
esac
# select action to be executed
# option=$(echo -e $OPTIONS | rofi "${args[@]}" "Select action for '$vm' ($vmstate)")
option=$(echo -e $OPTIONS | rofi "${args[@]}" -mesg "Select action for '$vm' ($vmstate)")
rofi_exit=$?
SELECTED="$vm"
if [[ $rofi_exit -eq 1 ]]; then
# exit
continue
fi
:> "$TMPFILE"
:> "$TMPFILE_ERR"
case "$option" in
"Start machine")
vboxmanage startvm "$vm" > "$TMPFILE" 2> "$TMPFILE_ERR"
;;
"Start headless")
vboxmanage startvm "$vm" --type headless > "$TMPFILE" 2> "$TMPFILE_ERR"
;;
"Start separate")
vboxmanage startvm "$vm" --type separate > "$TMPFILE" 2> "$TMPFILE_ERR"
;;
"Show machine")
vboxmanage startvm --type separate "$vm" > "$TMPFILE" 2> "$TMPFILE_ERR"
;;
"Send ACPI shutdown signal")
vboxmanage controlvm "$vm" acpipowerbutton --type headless > "$TMPFILE" 2> "$TMPFILE_ERR"
;;
"Save state")
vboxmanage controlvm "$vm" savestate --type headless > "$TMPFILE" 2> "$TMPFILE_ERR"
;;
"Reset")
vboxmanage controlvm "$vm" reset --type headless > "$TMPFILE" 2> "$TMPFILE_ERR"
;;
"Reboot")
vboxmanage controlvm "$vm" reboot --type headless > "$TMPFILE" 2> "$TMPFILE_ERR"
;;
"Resume machine")
vboxmanage controlvm "$vm" resume > "$TMPFILE" 2> "$TMPFILE_ERR"
;;
"Restore last snapshot")
vboxmanage snapshot "$vm" restorecurrent --type headless > "$TMPFILE" 2> "$TMPFILE_ERR"
;;
"Clone machine")
vboxmanage clonevm "$vm" --mode machine --register --options keepallmacs > "$TMPFILE" 2> "$TMPFILE_ERR"
;;
"Delete machine")
vboxmanage unregistervm "$vm" --delete > "$TMPFILE" 2> "$TMPFILE_ERR"
;;
"Pause machine")
vboxmanage controlvm "$vm" pause --type headless > "$TMPFILE" 2> "$TMPFILE_ERR"
;;
*)
exit 1
;;
esac
RESULT=$?
# notify-send -a "virtualbox" "$(cat $TMPFILE)" "$(cat $TMPFILE_ERR)"
NOTIFY_ARGS="--app-name='virtualbox'"
MSG=""
vmstate=$(vboxmanage showvminfo "$vm" --machinereadable | grep 'VMState=' | cut -d '"' -f 2)
if [ -s "$TMPFILE_ERR" ]; then
NOTIFY_ARGS="--wait $NOTIFY_ARGS"
MSG="$(cat $TMPFILE_ERR)"
elif [ -s "$TMPFILE" ]; then
MSG="$(cat $TMPFILE)"
else
if $RESULT; then
NOTIFY_ARGS="--wait $NOTIFY_ARGS"
MSG="Error\nState: $vmstate"
else
MSG="Success\nState: $vmstate"
fi
fi
notify-send $NOTIFY_ARGS "$option '$vm'" "$MSG"
# notify-send $NOTIFY_ARGS "$option '$vm'" "State $vmstate"
if [[ $rofi_exit -eq 0 ]]; then
exit
fi
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment