DistroHopper/q

958 lines
25 KiB
Bash
Executable File

#!/usr/bin/bash
# Author: zenobit
# Description: Uses gum to provide a simple TUI for quickemu and quickget
# License MIT
## NEEDED
define_variables() {
color=$(( RANDOM % 255 + 1 ))
progname="${progname:="${0##*/}"}"
configdir="$HOME/.config/$progname"
version='0.66'
vms=(*.conf)
if ! command -v gum >/dev/null 2>&1; then
echo 'You are missing gum! Exiting...' && exit 1
fi
if ! command -v quickemu >/dev/null 2>&1; then
gum style --foreground 1 "You are missing quickemu!"
fi
QUICKGET=$(command -v quickget)
#export BORDER="rounded"
color2=$(( RANDOM % 255 + 1 ))
export BORDERS_FOREGROUND="$color"
export GUM_CHOOSE_CURSOR_FOREGROUND="$color"
export GUM_CHOOSE_SELECTED_FOREGROUND="$color"
export GUM_CONFIRM_PROMPT_FOREGROUND=""
export GUM_CONFIRM_SELECTED_FOREGROUND="$color"
export GUM_CONFIRM_UNSELECTED_FOREGROUND=0
export GUM_FILTER_CURSOR_TEXT_FOREGROUND=""
export GUM_FILTER_HEADER_FOREGROUND=""
export GUM_FILTER_INDICATOR_FOREGROUND="$color2"
export GUM_FILTER_MATCH_FOREGROUND="$color2"
export GUM_FILTER_PROMPT_FOREGROUND="$color2"
export GUM_FILTER_SELECTED_PREFIX_FOREGROUND="$color2"
export GUM_FILTER_SELECTED_PREFIX_BORDER_FOREGROUND="$color2"
# Set traps to catch the signals and exit gracefully
trap 'exit' INT
trap 'exit' EXIT
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...!'
fi
# just for development in termux
if command -v termux-info >/dev/null 2>&1; then
echo "Running in termux!"
TMP="$(pwd)/tmp"
fi
# use configdir
if [ -f "${configdir}/border" ]; then
BORDER="$(cat "${configdir}"/border)"
else
BORDER="double"
fi
if [ -f "${configdir}/color" ]; then
BORDERS_FOREGROUND="$(cat "${configdir}"/color)"
else
BORDERS_FOREGROUND="$(( RANDOM % 255 + 1 ))"
fi
if [ -f "${configdir}/spinner" ]; then
spinner="$(cat "${configdir}"/spinner)"
else
spinner="globe"
fi
}
generate_supported(){
echo "Extracting OS Editions and Releases..."
rm -r "$configdir/distro"
mkdir -p "$configdir/distro"
"$QUICKGET" | awk 'NR==2,/zorin/' | cut -d':' -f2 | grep -o '[^ ]*' > "$configdir/supported"
while read -r get_name; do
supported=$(gum spin --spinner $spinner --title="$get_name" -- "$QUICKGET" "$get_name" | sed 1d)
echo "$get_name"
echo "$supported"
echo "$supported" > "$configdir/distro/${get_name}"
done < "$configdir/supported"
}
if_needed() {
if [ ! -f "${configdir}"/supported ]; then
generate_supported
fi
}
## HELP
show_help() {
clear
show_headers_full
gum style --padding "0 1" --border="$BORDER" --border-foreground="$BORDERS_FOREGROUND" "$title"
}
help_main() {
title=" $progname $version
Uses gum to provide a simple TUI for quickemu and quickget 'https://github.com/quickemu-project/quickemu'
'https://github.com/charmbracelet/gum'
For menus you can use arrow keys or fuzzy filtering and then ENTER
(e + ENTER for exit or b + ENTER for back to main menu)
If is posible choose more options use TAB for highliting desired and then ENTER
Config files are stored at $configdir
As temp folder is used $TMP
"
}
## MAIN
#template for functions
# title=""
# show_header
gum_choose_os() {
title="Choose OS"
show_header
os=$(gum filter < "$configdir"/supported)
choices=$("$QUICKGET" "$os" | sed 1d)
}
gum_choose_release() {
title="Choose release"
show_header
height=$()
release=$(echo "$choices" | grep 'Releases' | cut -d':' -f2 | grep -o '[^ ]*' | gum filter --sort)
}
gum_choose_edition() {
title="Choose edition"
show_header
edition=$(echo "$choices" | grep 'Editions' | cut -d':' -f2 | grep -o '[^ ]*' | gum filter --prompt='Choose edition' --sort)
}
gum_filter_os() {
os=$(gum filter < "$configdir/supported")
choices=$(cat "$configdir/distros/$os")
}
gum_filter_release() {
release=$(echo "$choices" | grep 'Releases:' | cut -d':' -f2 | grep -o '[^ ]*' | gum filter --sort)
}
gum_filter_edition() {
edition=$(echo "$choices" | grep 'Editions:' | cut -d':' -f2 | grep -o '[^ ]*' | gum filter --sort)
}
gum_choose_VM() {
if find . -maxdepth 1 -name '*.conf' >/dev/null 2>&1 ; then
chosen=$(find . -maxdepth 1 -name '*.conf' | cut -d'/' -f2 | rev | cut -d'.' -f2-9 | rev | gum filter --select-if-one)
else
gum style --foreground 1 "Can't!"
fi
}
gum_choose_VM() {
if ls | grep ".conf" ; then
height=$(ls -1 | grep ".conf" | wc -l)
title="Choose VM"
show_header
chosen=$(ls -1 | grep ".conf" | rev | cut -d'.' -f2- | rev | gum filter --height "$height")
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_filter_os
if [ -z "$os" ]; then exit 100
elif [ "$(echo "$choices" | wc -l)" = 1 ]; then
clear
gum_filter_release
clear
"$QUICKGET" "$os" "$release"
else
clear
gum_filter_release
clear
gum_filter_edition
clear
"$QUICKGET" "$os" "$release" "$edition"
fi
show_headers
}
create_VM() {
gum_choose_os
if [ -z "$os" ]; then exit 100
elif [ "$(echo "$choices" | wc -l)" = 1 ]; then
clear
gum_choose_release
#gum spin --spinner $spinner --show-output --title="Downloading $os $/release" -- "$QUICKGET" "$os" "$release"
"$QUICKGET" "$os" "$release"
if [ -f "${configdir}/default_vm_config" ]; then
echo 'Adding default values to config...'
cat "${configdir}/default_vm_config" >> "$os-$release.conf"
fi
else
clear
gum_choose_release
gum_choose_edition
gum spin --spinner $spinner --show-output --title="Downloading $os $release $edition" -- "$QUICKGET" "$os" "$release" "$edition"
if [ -f "${configdir}/default_vm_config" ]; then
echo 'Adding default values to config...'
cat "${configdir}/default_vm_config" >> "$os-$release-$edition.conf"
fi
fi
echo "
To start your new $os virtual machine use 'run' from menu"
show_headers_small
}
edit_default_VMs_config() {
title="Editing default VM's config..."
show_header
printf 'For example:\ncpu_cores="2"\nram="4G"\n'
title="CTRL+D to complete. CTRL+C and esc will cancel"
show_header
gum write > "${configdir}"/default_vm_config
}
edit_VM_config() {
if [ -z "$EDITOR" ]; then
echo "Editor not set! Can't continue!"
else
height=$(ls -1 | grep ".conf" | wc -l)
${EDITOR} "$(ls | grep ".conf" | gum filter --height "$height")"
fi
}
custom_quickemu_command() {
custom=$(echo "edit delete" | grep -o '[^ ]*' | gum choose --header='Edit or delete custom command?')
if [ "$custom" = "edit" ]; then
quickemu
printf '\nEnter quickemu custom command:\n For example:--public-dir ~/Downloads\n:'
read -r command
mkdir -p "$configdir"
echo "$command" > "${configdir}/command"
elif [ "$custom" = "delete" ]; then
rm "${configdir}/command"
fi
}
run_VM() {
title="Starting $chosen..."
show_header
if [ -f "${configdir}/command" ]; then
quickemu < "${configdir}/command" -vm "$chosen.conf"
else
quickemu -vm "$chosen.conf"
fi
show_headers
}
gum_choose_running() {
pid_files=( */*.pid )
if [ ${#pid_files[@]} -gt 0 ]; then
mapfile -t running < <(find . -name '*.pid' -printf '%P\n' | sed 's/\.pid$//')
if [ ${#running[@]} -gt 0 ]; then
selected=$(gum choose --select-if-one "${running[@]}")
else
gum style --foreground 1 "Can't!" && selected=""
fi
else
gum style --foreground 1 "Can't!" && selected=""
fi
}
# test
gum_choose_runnings() {
pid_files=( */*.pid )
if [ ${#pid_files[@]} -gt 0 ]; then
mapfile -t running < <(find . -name '*.pid' -printf '%P\n' | sed 's/\.pid$//')
if [ ${#running[@]} -gt 0 ]; then
selected=$(gum choose --select-if-one "${running[@]}")
else
gum style --foreground 1 "Can't!" && selected=""
fi
else
gum style --foreground 1 "Can't!" && selected=""
fi
}
gum_choose_VM_to_delete() {
height=$(ls -1 | grep ".conf" | wc -l)
GUM_FILTER_HEADER="Choose VM to delete"
GUM_FILTER_HEADER_FOREGROUND=""
if ls | grep ".conf" ; then
chosen=$(echo ${vms[@]%.*} | tr " " "\n" | gum filter --height "$height" --no-limit)
echo 'Removing config(s)...'
rm -r $chosen & rm $chosen.conf
else
echo "No VMs to delete"
fi
}
#gum_choose_VM_to_delete() {
#if ls | grep ".conf" ; then
#GUM_FILTER_HEADER="Choose VM to delete"
#height=$(ls -1 | grep ".conf" | wc -l)
#chosen=$(ls -1 | grep ".conf" | gum filter --height "$height" --no-limit)
#delete_VM
#else
#echo "No VMs to delete"
#fi
#}
delete_VM() {
#chosen_to_delete=$(cat $chosen | while read line; echo $line | rev | cut -d'.' -f2-5 | rev; done)
echo "#TODO"
echo $chosen | tr " " "\n" | while read line
do
echo 'Removing dir(s)...'
rm -r $(echo $line | rev | cut -d'.' -f2-5 | rev)
done
echo 'Removing config(s)...'
rm $(echo "$chosen")
}
## ADVANCED
# shellcheck disable=SC2016,2034,2153
add_new_distro() {
mkdir -p "$configdir"
echo "add new OS, all lowercase"
NAME="$(gum input --header="NAME" --placeholder="arch")"
echo "add a pretty name for new OS *only if the catch all is not suitable*"
PRETTY_NAME="$(gum input --header="PRETTY_NAME" --placeholder="Arch Linux")"
echo "add a homepage for new OS"
HOMEPAGE="$(gum input --header="HOMEPAGE" --placeholder="https://voidlinux.org/")"
echo "current supported release versions"
RELEASES="$(gum input --header="RELEASES" --placeholder="8 9")"
echo "the editions if new OS has multiple flavours/editions"
EDITIONS="$(gum input --header="EDITIONS" --placeholder="kde gnome")"
echo "base URL for ISO download"
URL="$(gum input --header="URL" --placeholder="https://ddl.bunsenlabs.org/ddl")"
echo "Name of ISO"
ISO="$(gum input --header="ISO" --placeholder="GhostBSD-${RELEASE}-XFCE.iso")"
echo "name of hash file "
CHECKSUM="$(gum input --header="CHECKSUM" --placeholder='${ISO}.sha256sum')"
cat <<EOF > "$configdir/template"
#line 58+
$NAME) PRETTY_NAME="$PRETTY_NAME";;
#line 207+
$NAME \\
#line 292+
$NAME) HOMEPAGE=$HOMEPAGE;;
#line 374+
function releases_$NAME() {
echo $RELEASES
}
function editions_$NAME() {
echo $EDITIONS
}
#line 1176+
function get_$NAME() {
local EDITION="\${1:-}"
local HASH=""
local ISO="$ISO"
local URL="$URL"
HASH="\$(wget -q -O- \${URL}/\$CHECKSUM | grep (\${ISO} | cut -d' ' -f4)"
echo "\${URL}/\${ISO}" "\${HASH}"
}
EOF
diff "$configdir/template" "quickget"
}
# shellcheck disable=SC2154
create_desktop_entry() {
cat <<EOF > "${DESKTOP_FILE}"
[Desktop Entry]
Version=$version
Type=$type
Name=$name
GenericName=$progname
Comment=$comment
Exec=$execmd
Icon=$icon
Terminal=$terminal
X-MultipleArgs=$args
Type=$type
Categories=$categories
StartupNotify=$notify
MimeType=$mime
Keywords=$keyword
EOF
}
test_ISOs_download() {
rm -r "$configdir"
mkdir -p "$configdir" && cd "$configdir" || exit
touch "$configdir/test"
#"$QUICKGET" | sed 1d | cut -d':' -f2 | grep -o '[^ ]*' > supported
os=$(gum filter < "$configdir"/supported)
choices=$("$QUICKGET" "$os" | sed 1d)
while read -r get_name; do
echo "Trying $get_name..."
mkdir -p "$configdir/_distros/$get_name" && cd "$configdir/_distros/$get_name" || exit
releases=$("$QUICKGET" "$get_name" | grep 'Releases:' | cut -d':' -f2 | sed 's/^ //' | sed 's/ *$//')
echo "$releases" > releases
editions=$("$QUICKGET" "$get_name" | grep 'Editions:' | cut -d':' -f2 | sed 's/^ //' | sed 's/ *$//')
echo "$editions" > editions
if [ -z "$editions" ]; then
for release in $releases; do
echo "$get_name" >> "$configdir/test"
timeout 10 "$QUICKGET" -t "$get_name" "${release}" >> "$configdir/test"
done
else
while read -r release; do
for edition in $editions; do
echo "$get_name" >> "$configdir/test"
timeout 10 "$QUICKGET" -t "$get_name" "${release}" "${edition}" >> "$configdir/test"
done
done < releases
fi
cd "$configdir" || exit
done < supported
printf "\nDone"
}
show_ISOs_urls(){
rm -r "$configdir"
mkdir -p "$configdir" && cd "$configdir" || exit
touch "$configdir/test"
"$QUICKGET" | sed 1d | cut -d':' -f2 | grep -o '[^ ]*' > supported
while read -r get_name; do
echo "Trying $get_name..."
mkdir -p "$configdir/_distros/$get_name" && cd "$configdir/_distros/$get_name" || exit
releases=$("$QUICKGET" "$get_name" | grep 'Releases' | cut -d':' -f2 | sed 's/^ //' | sed 's/ *$//')
echo "$releases" > releases
editions=$("$QUICKGET" "$get_name" | grep 'Editions' | cut -d':' -f2 | sed 's/^ //' | sed 's/ *$//')
echo "$editions" > editions
if [ -z "$editions" ]; then
for release in $releases; do
echo "$get_name" >> "$configdir/test"
timeout 5 "$QUICKGET" -s "$get_name" "${release}" >> "$configdir/test" #&& $(killall zsync >> /dev/null)
done
else
while read -r release; do
for edition in $editions; do
echo "$get_name" >> "$configdir/test"
timeout 5 "$QUICKGET" -s "$get_name" "${release}" "${edition}" >> "$configdir/test" #&& $(killall zsync >> /dev/null)
done
done < releases
fi
cd "$configdir" || exit
done < supported
printf "\nDone"
}
get_ssh_port() {
port=$(grep 'ssh' < "$selected".ports | cut -d',' -f2)
}
ssh_into() {
gum_choose_running
if [ -n "$selected" ]; then
get_ssh_port
username=$(gum input --prompt "$selected user? ")
ssh "$username"@localhost -o ConnectTimeout=5 -o StrictHostKeyChecking=accept-new -p "$port"
show_headers
fi
}
open_distro_homepage(){
gum_filter_os
"$QUICKGET" -o "${os}" >/dev/null 2>&1 &
}
kill_vm() {
gum_choose_running
if [ -n "$selected" ]; then
echo "${selected}"
gum confirm "Really kill $selected?" && pid=$(cat "$selected".pid) && kill "$pid"
show_headers
fi
}
# test
kill_vms() {
gum_choose_runnings
if [ -n "$selected" ]; then
for vm_name in "${selected[@]}"; do
gum confirm "Really kill $vm_name?"
pid=$(cat "${vm_name}.pid")
kill "$pid"
done
show_headers
fi
}
gum_choose_VM_to_delete() {
if [ -n "$(echo *.conf)" ]; then
chosen=$(echo "${vms[@]%.*}" | tr " " "\n" | gum choose --select-if-one)
gum confirm "Really delete $chosen" && rm -r "$chosen" && rm "$chosen".conf
show_headers
else
gum style --foreground 1 "No VMs!"
fi
}
## SETTINGS
headers_small_or() {
printf '\n\nsmall:\n'
show_headers_small
printf '\n\nfull:\n'
show_headers_full
printf '\n\ncurrent:\n'
show_headers
use_headers=$(gum choose --header " Use small headers or full?" "small" "full" "current")
echo "will use $use_headers"
show_headers
}
change_borders() {
title="Change borders style"
show_header
BORDER=$(echo "none
hidden
normal
rounded
thick
double" | gum filter --height $height)
mkdir -p ${configdir}
touch "${configdir}"/border
echo $BORDER > "${configdir}"/border
}
change_color() {
title="Define color number or choose random"
show_header
BORDER_FOREGROUND=$(echo 'random' | gum filter --height 1 --prompt="Enter custom" --no-strict)
mkdir -p ${configdir}
touch "${configdir}"/color
echo $BORDER_FOREGROUND > "${configdir}"/color
}
use_color() {
if [ -f "${configdir}/color" ]; then
BORDER_FOREGROUND=$(cat ${configdir}/color)
fi
}
change_spinner() {
spinner=$(echo "line
dot
minidot
jump
pulse
points
globe
moon
monkey
meter
hamburger" | gum filter --height 11)
mkdir -p ${configdir}
touch "${configdir}"/spinner
echo "$spinner" > "${configdir}"/spinner
}
# shellcheck disable=SC2015
icons_or() {
gum confirm " Use icons?
need Nerd Fonts" && echo "yes" > "$configdir/icons" || rm "$configdir/icons"
show_headers
}
use_icons() {
if [ -f "$configdir/icons" ]; then
icons=yes
else
icons=""
fi
}
## HEADERS
show_header() {
gum style --padding "0 1" --border="$BORDER" --border-foreground="$BORDERS_FOREGROUND" "$title"
}
show_version_qemu() {
qemu-x86_64 -version | sed 2d | cut -d' ' -f3
}
show_version_quickemu() {
quickemu --version | grep "ERROR! QEMU not found" && echo "QEMU is missing!" || quickemu --version
}
show_editor() {
if [ -z "$EDITOR" ]; then
echo ' editor Not set!'
else
echo " editor $EDITOR"
fi
}
show_vms() {
if [ ${#vms[@]} -eq 0 ]; then
gum style --foreground 1 "No VMs!"
else
echo "${vms[@]%.*}" | tr " " "\n"
fi
}
show_custom_small() {
if [ -f "${configdir}/command" ]; then
gum style --bold --foreground "$color2" "command:"
gum style "quickemu $(cat "${configdir}/command")"
fi
if [ -f "${configdir}/default_vm_config" ]; then
gum style --bold --foreground "$color2" "default config:"
gum style "$(cat "${configdir}/default_vm_config")"
fi
}
show_custom() {
show_custom_small
if [ -f "${configdir}/color" ]; then
gum style --bold --foreground "$color2" "color:"
gum style "$(cat "${configdir}/color")"
fi
if [ -f "${configdir}/border" ]; then
gum style --bold --foreground "$color2" "borders:"
gum style "$(cat "${configdir}/border")"
fi
if [ -f "${configdir}/spinner" ]; then
gum style --bold --foreground "$color2" "spinner:"
gum style "$(cat "${configdir}/spinner")"
fi
}
show_header_vms() {
pid_files=(*/*.pid)
vms=(*.conf)
vms_running=()
vms_not=()
vms_vm=$(gum style --bold --foreground "$color2" "ready:")
vms_run=""
if [ -n "$(find . -name '*.pid')" ]; then
for pid_file in "${pid_files[@]}"; do
instance_name=$(basename "$pid_file" .pid)
vms_running+=("$instance_name")
done
if [ "$icons" == yes ]; then
running_logo=$(gum style --foreground "$color" --bold ".")
else
running_logo=$(gum style --foreground "$color" --bold ">")
fi
for instance in "${vms_running[@]}"; do
vms_run+="$running_logo$instance "
done
fi
mapfile -t vms_not < <(comm -23 <(printf "%s\n" "${vms[@]}" | rev | cut -d'.' -f2-9 | rev | sort) <(printf "%s\n" "${vms_running[@]}" | sort))
vms_not_next=$(gum style --align center < <(printf '%s\n' "${vms_not[@]}"))
if [ -n "$(find . -name '*.pid')" ]; then
vms_run_next=$(echo "$vms_run" | tr " " "\n")
vms_header=$(gum join --vertical --align center "$vms_vm" "$vms_run_next" "$vms_not_next")
else
vms_header=$(gum join --vertical --align center "$vms_vm" "$vms_not_next")
fi
vms_border=$(gum style --padding "0 1" --border="$BORDER" --border-foreground $color "$vms_header")
header_vms=$(gum join --vertical --align left "$vms_border" "$tip_border")
}
show_header_tip() {
tip1=$(gum style --bold --foreground "$color2" "Tip: ")
tip2=$(gum style "try ")
tip3=$(shuf -n 1 "$configdir/supported")
tip4=$(gum style --bold --foreground="$color" "$tip3")
tip5=$(gum join "$tip1" "$tip2" "$tip4")
tip6=$("$QUICKGET" -s "$tip3")
tip7=$(gum style "$tip6")
tip8=$(gum join --vertical --align top "$tip5" "$tip7")
header_tip=$(gum style --padding "0 1" --border="$BORDER" --border-foreground $color "$tip8")
}
show_headers_small() {
logo1=$(gum style --foreground "$color2" " ▄▄▄▄
█ █
█ █
█▄▀▄")
logo2=$(gum style "v$version")
logo3=$(gum style --foreground "$color2" "▀")
logo4=$(gum join "$logo2" "$logo3")
logo5=$(gum join --vertical "$logo1" "$logo4")
header_logo=$(gum style --padding "0 1" --border=rounded --border-foreground $color "$logo5" )
show_header_vms
show_header_tip
custom1=$(gum style --bold --foreground "$color2" "workdir:")
custom2=$(gum style "$(pwd)")
custom3=$(gum join --vertical --align center "$custom1" "$custom2" "$(show_custom_small)")
header_custom=$(gum style --padding "0 1" --border="$BORDER" --border-foreground="$color" "$custom3")
header12=$(gum join --vertical "$header_tip" "$header_custom")
header34=$(gum join "$header_logo" "$header12")
gum join --align top --vertical "$header34" "$header_vms"
}
show_headers_full() {
logo0=$(gum style " simple VMs runner")
logo1=$(gum style --foreground "$color2" " ▄▄▄▄ ▄▄▄▄ ▄ ▄ ▄
█ █  █ █ █ █
█ █  █ █ █ █
█▄▀▄  █ █▄▄█ █")
logo2=$(gum style "v$version")
logo3=$(gum style --foreground "$color2" "▀")
logo4=$(gum style " for ")
logo5=$(gum style "quickemu")
logo6=$(gum join --align center --vertical "$logo0" "$logo1")
logo7=$(gum join "$logo2" "$logo3" "$logo4" "$logo5")
logo8=$(gum join --vertical "$logo6" "$logo7")
header_logo=$(gum style --align left --padding "0 1" --border=rounded --border-foreground $color "$logo8" )
header_dep=$(gum style --padding "0 1" --border="$BORDER" --border-foreground $color " qemu $(show_version_qemu)
quickemu $(show_version_quickemu)
$(show_editor)")
show_header_vms
show_header_tip
custom1=$(gum style --bold --foreground "$color2" "workdir:")
custom2=$(gum style "$(pwd)")
custom3=$(gum join --vertical --align center "$custom1" "$custom2" "$(show_custom)")
header_custom=$(gum style --padding "0 1" --border="$BORDER" --border-foreground="$color" "$custom3")
header1=$(gum join --vertical --align right "$header_logo" "$header_vms")
header2=$(gum join --vertical "$header_dep" "$header_custom" "$header_tip")
gum join --align top "$header1" "$header2"
}
show_headers() {
if [ "$use_headers" == full ]; then
show_headers_full
else
show_headers_small
fi
}
## MENU
show_menus() {
if [ "$icons" == yes ]; then
show_menu_main_icons
else
show_menu_main
fi
}
show_menu_main() {
while true
do
height=10
start=$(echo "create
run
OS homepage
ssh into
kill
delete
advanced
settings
help
exit $progname" | gum filter --height "$height")
# from choose: --selected '󰜎 run'
case $start in
create ) create_VM;;
run ) gum_choose_VM && run_VM;;
'ssh into' ) ssh_into;;
'OS homepage' ) open_distro_homepage;;
kill ) kill_vm;;
delete ) gum_choose_VM_to_delete;;
icons ) icons_or;;
'advanced' ) show_menu_advanced;;
'settings' ) show_menu_settings;;
'help' ) help_main; show_help;;
"exit $progname" ) exit 0;;
esac
done
}
show_menu_main_icons() {
while true
do
height=10
start=$(echo " create
󰜎 run
󰖟 OS homepage
 ssh into
 kill
󰆳 delete
 advanced
 settings
󰘥 help
󰩈 exit $progname" | gum filter --height "$height")
# from choose: --selected '󰜎 run'
case $start in
' create' ) create_VM;;
'󰜎 run' ) gum_choose_VM && run_VM;;
' ssh into' ) ssh_into;;
'󰖟 OS homepage' ) open_distro_homepage;;
' kill' ) kill_vm;;
'󰆳 delete' ) gum_choose_VM_to_delete;;
'󱌝 icons' ) icons_or;;
' advanced' ) show_menu_advanced_icons;;
' settings' ) show_menu_settings_icons;;
'󰘥 help' ) help_main; show_help;;
"󰩈 exit $progname" ) exit 0;;
esac
done
}
show_menu_advanced() {
while true
do
title="advanced"
show_header
height=8
start=$(echo "test ISOs download
show ISOs URLs
set default config for VMs
edit VM config
custom quickemu command
add new distro
back to main menu
EXIT $progname" | gum filter --height "$height")
case $start in
'set default config for VMs' ) edit_default_VMs_config;;
'edit VM config' ) edit_VM_config;;
'custom quickemu command' ) custom_quickemu_command;;
'add new distro' ) add_new_distro;;
'test ISOs download' ) test_ISOs_download;;
'show ISOs URLs' ) show_ISOs_urls;;
'back to main menu') clear; show_headers; break;;
"exit $progname" ) exit 0;;
esac
done
}
show_menu_advanced_icons() {
while true
do
title="advanced"
show_header
height=8
start=$(echo "󰙨 test ISOs download
 show ISOs URLs
 set default config for VMs
󱋆 edit VM config
 custom quickemu command
󰎔 add distro
 back to main menu
󰩈 exit $progname" | gum filter --height "$height")
case $start in
' set default config for VMs' ) edit_default_VMs_config;;
'󱋆 edit VM config' ) edit_VM_config;;
' custom quickemu command' ) custom_quickemu_command;;
'󰎔 add distro' ) add_new_distro;;
'󰙨 test ISOs download' ) test_ISOs_download;;
' show ISOs URLs' ) show_ISOs_urls;;
' back to main menu') clear; show_headers; break;;
"󰩈 exit $progname" ) exit 0;;
esac
done
}
show_menu_settings() {
while true
do
title="settings"
show_header
height=10
start=$(echo "update $progname
regenerate supported
icons
accent color
borders color
borders style
spinner
headers
back to main menu
EXIT $progname" | gum filter --height "$height")
case $start in
"update $progname" ) update_quicktui;;
'regenerate supported' ) generate_supported;;
'icons' ) icons_or;;
'accent color' ) change_color;;
'borders color' ) change_color;;
'borders style' ) change_borders;;
'spinner' ) change_spinner;;
'headers' ) headers_small_or;;
'back to main menu') clear; show_headers; break;;
"exit $progname" ) exit 0;;
esac
done
}
show_menu_settings_icons() {
while true
do
title="settings"
show_header
height=10
start=$(echo " update $progname
 regenerate supported
󱌝 icons
 accent color
 borders color
󰴱 borders style
 spinner
󰛼 headers
 back to main menu
󰩈 exit $progname" | gum filter --height "$height")
case $start in
" update $progname" ) update_quicktui;;
' regenerate supported' ) generate_supported;;
'󱌝 icons' ) icons_or;;
' accent color' ) change_color;;
' borders color' ) change_color_border;;
'󰴱 borders style' ) change_borders;;
' spinner' ) change_spinner;;
'󰛼 headers' ) headers_small_or;;
' back to main menu') clear; show_headers; break;;
"󰩈 exit $progname" ) exit 0;;
esac
done
}
# run
#clear
define_variables
if_needed
use_icons
show_headers
show_menus