Created
June 26, 2025 09:20
-
-
Save av-gantimurov/4b61ff9dc7244ec0224e5c89c409b624 to your computer and use it in GitHub Desktop.
Rofi shell script for Virtualbox VM run/stop
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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