diff --git a/qrun b/qrun new file mode 100755 index 0000000..06837be --- /dev/null +++ b/qrun @@ -0,0 +1,153 @@ +#!/usr/bin/bash +# Author: zenobit +# Description: Uses gum to provide a simple VMs runner for quickemu and quickget +# License MIT + +_define_variables() { + progname="${progname:="${0##*/}"}" + version='0.1' + vms=(*.conf) + color=$(( RANDOM % 255 + 1 )) + #export BORDER="rounded" + export BORDERS_FOREGROUND="$color" + export GUM_FILTER_INDICATOR_FOREGROUND="$color" + export GUM_CHOOSE_CURSOR_FOREGROUND="$color" + export GUM_CHOOSE_SELECTED_FOREGROUND="$color" + export GUM_FILTER_SELECTED_PREFIX_FOREGROUND="$color" + export GUM_FILTER_SELECTED_PREFIX_BORDER_FOREGROUND="$color" + export GUM_FILTER_MATCH_FOREGROUND="$color" + export GUM_FILTER_PROMPT_FOREGROUND="$color" + + if ! command -v quickemu >/dev/null 2>&1; then + echo 'You are missing quickemu!' + fi + QUICKGET=$(command -v quickget) + if ! command -v gum >/dev/null 2>&1; then + echo 'You are missing gum! Exiting...' && exit 1 + fi +} + +_generate_supported(){ + echo "Extracting OS Editions and Releases..." + rm -rf /tmp/distros + mkdir -p /tmp/distros + "$QUICKGET" | awk 'NR==2,/zorin/' | cut -d':' -f2 | grep -o '[^ ]*' > /tmp/supported + while read -r get_name; do + supported=$($QUICKGET $get_name | sed 1d) + echo ${get_name} + echo "$supported" + echo "$supported" > "/tmp/distros/${get_name}" + done < /tmp/supported +} + +_if_needed() { + if [ ! -f /tmp/supported ]; then + _generate_supported + fi +} + +show_vms() { + if [ ${#vms[@]} -eq 0 ]; then + echo 'No VMs found.' + else + echo "${vms[@]%.*}" | tr " " "\n" + fi +} + +show_headers() { + distro=$(shuf -n 1 /tmp/supported) + homepage=$("$QUICKGET" -h "${distro}") + + header_logo=$(gum style --padding "0 1" --border=rounded --border-foreground $color " Simple VMs runner +▄▄▄▄ ▄▄▄ ▄ ▄ ▄ ▄ +█ █ █ █ █ █ █▄ █ +█ █ █▄▀ █ █ █ ▀▄█ +█▄▀▄ █ ▀▄ █▄▄█ █ █ +v$version▀ for quickemu") + + tip_header=$(gum style --bold "Tip: ") + tip_distro=$(gum style $distro) + tip_temp=$(gum join --align top "$tip_header" "$tip_distro") + tip_homepage=$(gum style $homepage) + tip=$(gum join --vertical --align top "$tip_temp" "$tip_homepage") + tip_border=$(gum style --padding "0 1" --border=rounded --border-foreground $color "$tip") + + vms_header=$(gum style --align center --bold "virtual machines:" && gum style $(echo "${vms[@]%.*}" | tr " " "\n")) + vms_border=$(gum style --padding "0 1" --border=rounded --border-foreground $color "$vms_header") + + gum join --vertical --align top "$header_logo" "$tip_border" "$vms_border" +} + +gum_choose_os() { + os=$(gum filter < /tmp/supported) + choices=$(cat "/tmp/distros/$os") +} + +gum_choose_release() { + release=$(echo "$choices" | grep 'Releases:' | cut -d':' -f2 | grep -o '[^ ]*' | gum filter --sort) +} + +gum_choose_edition() { + edition=$(echo "$choices" | grep 'Editions:' | cut -d':' -f2 | grep -o '[^ ]*' | gum filter --sort) +} + +gum_choose_VM() { + if ls | grep ".conf" ; then + chosen=$(ls -1 | grep ".conf" | rev | cut -d'.' -f2- | rev | gum filter) + else + echo "No VMs to run." + fi + #chosen=$(printf '%s\n' "${vms[@]%.conf}" | gum filter --height "$("${vms[@]%.conf}" | wc -l)" --header='Choose VM to run') +} + +create_VM() { + gum_choose_os + if [ -z "$os" ]; then exit 100 + elif [ "$(echo "$choices" | wc -l)" = 1 ]; then + clear + gum_choose_release + clear + "$QUICKGET $os $release" + else + clear + gum_choose_release + clear + gum_choose_edition + clear + "$QUICKGET $os $release $edition" + fi + show_headers +} + +run_VM() { + quickemu -vm "$chosen.conf" +} + +open_distro_homepage(){ + gum_choose_os + "$QUICKGET" -o "${os}" >/dev/null 2>&1 & +} + +# MENU +_show_menu() { + while true + do + start=$(echo "create +run +homepage +EXIT $progname" | gum choose --selected run) + case $start in + create ) create_VM;; + run ) gum_choose_VM && run_VM;; + homepage ) open_distro_homepage;; + "EXIT $progname" ) exit 0;; + esac + done +} + +# run +clear +_define_variables +_if_needed +show_headers +_show_menu