More polishing and Nerd Font

This commit is contained in:
zenobit 2023-12-16 14:27:31 +01:00
parent b50d5c2f61
commit 577756bc53

View file

@ -4,10 +4,11 @@
# License MIT
_define_variables() {
color=$(( RANDOM % 255 + 1 ))
progname="${progname:="${0##*/}"}"
configdir="$HOME/.config/$progname"
version='0.1'
vms=(*.conf)
color=$(( RANDOM % 255 + 1 ))
#export BORDER="rounded"
export BORDERS_FOREGROUND="$color"
export GUM_FILTER_INDICATOR_FOREGROUND="$color"
@ -17,7 +18,6 @@ _define_variables() {
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
@ -25,6 +25,7 @@ _define_variables() {
if ! command -v gum >/dev/null 2>&1; then
echo 'You are missing gum! Exiting...' && exit 1
fi
color2=$(( RANDOM % 255 + 1 ))
}
_generate_supported(){
@ -33,8 +34,8 @@ _generate_supported(){
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}
supported=$($QUICKGET "$get_name" | sed 1d)
echo "$get_name"
echo "$supported"
echo "$supported" > "/tmp/distros/${get_name}"
done < /tmp/supported
@ -55,63 +56,100 @@ show_vms() {
}
show_headers() {
distro=$(shuf -n 1 /tmp/supported)
homepage=$("$QUICKGET" -s "${distro}")
header_logo=$(gum style --padding "0 1" --border=rounded --border-foreground $color " Simple VMs runner
▄▄▄▄ ▄▄▄ ▄ ▄ ▄ ▄
logo_0=$(gum style " Simple VMs runner")
logo_1=$(gum style --foreground "$color2" "▄▄▄▄ ▄▄▄ ▄ ▄ ▄ ▄
█ █ █ █ █ █ █▄ █
█ █ █▄▀ █ █ █ ▀▄█
█▄▀▄ █ ▀▄ █▄▄█ █ █
v$versionfor quickemu")
█▄▀▄ █ ▀▄ █▄▄█ █ █")
logo_2=$(gum style "v$version")
logo_3=$(gum style --foreground "$color2" "▀")
logo_4=$(gum style " for quickemu")
logo_234=$(gum join "$logo_2" "$logo_3" "$logo_4")
logo=$(gum join --vertical "$logo_0" "$logo_1" "$logo_234")
logo_border=$(gum style --padding "0 1" --border=rounded --border-foreground $color "$logo" )
tip_header=$(gum style --bold "Tip: ")
distro=$(shuf -n 1 /tmp/supported)
tip_distro=$(gum style --align left "$distro")
tip_temp=$(gum join --align top "$tip_header" "$tip_distro")
homepage=$("$QUICKGET" -s "${distro}")
tip_homepage=$(gum style --align left "$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"))
pid_files=(*/*.pid)
vms=(*.conf)
vms_running=()
vms_not=()
vms_vm=$(gum style --bold "virtual machines:")
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 [ -f /tmp/icons ]; then
icons=yes
else
icons=""
fi
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
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 < <(printf '%s\n' "${vms_not[@]}"))
if [ ! -z "$(find -name '*.pid')" ]; then
vms_run_next=$(echo "$vms_run" | tr " " "\n")
vms_header=$(gum join --vertical "$vms_vm" "$vms_run_next" "$vms_not_next")
else
vms_header=$(gum join --vertical "$vms_vm" "$vms_not_next")
fi
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"
header=$(gum join --align top "$logo_border" "$vms_border")
gum join --align center --vertical "$header" "$tip_border"
}
gum_choose_os() {
gum_filter_os() {
os=$(gum filter < /tmp/supported)
choices=$(cat "/tmp/distros/$os")
}
gum_choose_release() {
gum_filter_release() {
release=$(echo "$choices" | grep 'Releases:' | cut -d':' -f2 | grep -o '[^ ]*' | gum filter --sort)
}
gum_choose_edition() {
gum_filter_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)
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 choose --select-if-one)
else
echo "No VMs to run."
gum style --foreground 1 "Can't!"
fi
#chosen=$(printf '%s\n' "${vms[@]%.conf}" | gum filter --height "$("${vms[@]%.conf}" | wc -l)" --header='Choose VM to run')
}
create_VM() {
gum_choose_os
gum_filter_os
if [ -z "$os" ]; then exit 100
elif [ "$(echo "$choices" | wc -l)" = 1 ]; then
clear
gum_choose_release
gum_filter_release
clear
"$QUICKGET" "$os" "$release"
else
clear
gum_choose_release
gum_filter_release
clear
gum_choose_edition
gum_filter_edition
clear
"$QUICKGET" "$os" "$release" "$edition"
fi
@ -120,32 +158,133 @@ create_VM() {
run_VM() {
quickemu -vm "$chosen.conf"
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
}
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
}
get_ssh_port() {
port=$(grep 'ssh' < ${selected}.ports | cut -d',' -f2)
}
ssh_into() {
gum_choose_running
if [ ! -z "$selected" ]; then
get_ssh_port
username=$(gum input --prompt "$selected user? ")
ssh ${username}@localhost -o ConnectTimeout=5 -o StrictHostKeyChecking=accept-new -p ${port}
fi
}
kill_vm() {
gum_choose_running
if [ ! -z "$selected" ]; then
echo "${selected}"
gum confirm "Really kill $selected?" && pid=$(cat ${selected}.pid) && kill "$pid"
show_headers
fi
}
kill_vms() {
gum_choose_runnings
if [ ! -z "$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
}
open_distro_homepage(){
gum_choose_os
gum_filter_os
"$QUICKGET" -o "${os}" >/dev/null 2>&1 &
}
icons_or() {
gum confirm " Use icons?
need Nerd Fonts" && echo "yes" > /tmp/icons || rm /tmp/icons
show_headers
}
# MENU
_show_menu() {
while true
do
start=$(echo "create
if [ -f /tmp/icons ]; then
icons=yes
else
icons=""
fi
if [ "$icons" == yes ]; then
start=$(echo " create
󰜎 run
󰖟 homepages
 ssh into
kill VM
󱌝 icons
󰩈 exit" | gum choose --selected '󰜎 run')
case $start in
' create' ) create_VM;;
'󰜎 run' ) gum_choose_VM && run_VM;;
' ssh into' ) ssh_into;;
'󰖟 homepages' ) open_distro_homepage;;
' kill VM' ) kill_vms;;
'󱌝 icons' ) icons_or;;
'󰩈 exit' ) exit 0;;
esac
else
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
ssh into
kill VM
icons
exit $progname" | gum choose --selected '󰜎 run')
case $start in
create ) create_VM;;
run ) gum_choose_VM && run_VM;;
'ssh into' ) ssh_into;;
homepage ) open_distro_homepage;;
'kill VM' ) kill_vm;;
icons ) icons_or;;
"exit $progname" ) exit 0;;
esac
fi
done
}
# run
clear
#clear
_define_variables
_if_needed
show_headers