#!/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