mirror of
				https://github.com/oSoWoSo/DistroHopper.git
				synced 2024-08-14 22:46:53 +00:00 
			
		
		
		
	quickfzf
This commit is contained in:
		
							parent
							
								
									9b37c81eff
								
							
						
					
					
						commit
						c1e9e49854
					
				
					 1 changed files with 319 additions and 0 deletions
				
			
		
							
								
								
									
										319
									
								
								quickfzf
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										319
									
								
								quickfzf
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,319 @@ | |||
| #!/usr/bin/bash | ||||
| 
 | ||||
| # Author: zenobit | ||||
| # Description: Uses fzf to provide a simple TUI for quickemu and quickget | ||||
| # License MIT | ||||
| 
 | ||||
| tui_define_variables() { | ||||
| 	progname="${progname:="${0##*/}"}" | ||||
| 	version='0.3' | ||||
| 	#EDITOR='nano' | ||||
| 	configdir="$HOME/.config/$progname" | ||||
| 	vms=(*.conf) | ||||
| 	TMP="/tmp/$progname" | ||||
| 	# Set traps to catch the signals and exit gracefully | ||||
| 	trap 'exit' INT | ||||
| 	trap 'exit' EXIT | ||||
| 	# Dependency check: check if fzf,quickemu is installed and can be executed | ||||
| 	if ! command -v quickemu >/dev/null 2>&1; then | ||||
| 		echo 'You are missing quickemu...' && exit 1 | ||||
| 	fi | ||||
| 	QUICKGET=$(command -v quickget) || exit 2 | ||||
| 	if ! command -v fzf >/dev/null 2>&1; then | ||||
| 		echo 'You are missing fzf...' && exit 3 | ||||
| 	fi | ||||
| 	qcommand="quickemu < ${configdir}/command -vm" | ||||
| } | ||||
| 
 | ||||
| tui_display_header() { | ||||
| 	printf 'Simple TUI for quickemu\n%s: v.%s\nquickemu: v.%s\n' "$progname" "$version" "$(quickemu --version)" | ||||
| 	if [ -z "$EDITOR" ]; then | ||||
| 		echo 'editor: Not set! edit configs will not work!' | ||||
| 	else | ||||
| 		echo "editor: $EDITOR" | ||||
| 	fi | ||||
| 	printf 'Workdir:\n %s\n' "$(pwd)" | ||||
| 	if [ -f "${configdir}/command" ]; then | ||||
| 		printf '\ncustom command:\n quickemu %s\n' "$(cat "${configdir}/command")" | ||||
| 	fi | ||||
| 	if [ -f "${configdir}/vm" ]; then | ||||
| 		printf '\nVMs config:\n-------------\n%s\n' "$(cat "${configdir}/vm")" | ||||
| 	fi | ||||
| 	printf '\nPrepared VMs:\n-------------\n' | ||||
| } | ||||
| 
 | ||||
| tui_print_available_VMs() { | ||||
| 	if [ ${#vms[@]} -eq 0 ]; then | ||||
| 		echo 'No VMs found.' | ||||
| 		exit 1 | ||||
| 	else | ||||
| 		printf '%s\n' "${vms[@]%.*}" | ||||
| 		echo '-------------' | ||||
| 		printf 'Press CTRL+c anytime to kill %s' "$progname" | ||||
| 	fi | ||||
| } | ||||
| 
 | ||||
| tui_action_prompt_fzf() { | ||||
| 	start=$(printf "Do you want to... | ||||
| run VM | ||||
| create new VM | ||||
| open distro homepage | ||||
| advanced & settings" | fzf --height 10% --layout=reverse --info=inline --header-lines=1) | ||||
| 	case $start in | ||||
| 		c|'create new VM' ) todo='create';; | ||||
| 		a|'advanced & settings' ) todo='advanced';; | ||||
| 		r|'run VM' ) todo='run';; | ||||
| 		h|'open distro homepage' ) todo='homepage';; | ||||
| 	esac | ||||
| } | ||||
| 
 | ||||
| fzf_get_releases() { | ||||
| 	release=$(echo "$choices" | grep 'Releases' | cut -d':' -f2 | grep -o '[^ ]*' | fzf --cycle --header='Choose Release') | ||||
| } | ||||
| 
 | ||||
| fzf_get_editions() { | ||||
| 	edition=$(echo "$choices" | grep 'Editions' | cut -d':' -f2 | grep -o '[^ ]*' | fzf --cycle --header='Choose Edition') | ||||
| } | ||||
| 
 | ||||
| tui_create_VM() { | ||||
| 	os=$("$QUICKGET" | awk 'NR==2,/zorin/' | cut -d':' -f2 | grep -o '[^ ]*' | fzf --cycle --header='Choose OS to download') | ||||
| 	choices=$("$QUICKGET" "$os" | sed 1d) | ||||
| 	# Get the release and edition to download, if necessary | ||||
| 	if [ -z "$os" ]; then exit 100 | ||||
| 	elif [ "$(echo "$choices" | wc -l)" = 1 ]; then | ||||
| 		fzf_get_releases || exit 101 | ||||
| 		printf '\n Trying to download %s %s...\n\n' "$os" "$release" | ||||
| 		"$QUICKGET" "$os" "$release" || exit 104 | ||||
| 		cat "${configdir}/vm" >> $(ls -t | head -n1) | ||||
| 	else | ||||
| 		fzf_get_releases || exit 102 | ||||
| 		fzf_get_editions || exit 103 | ||||
| 		printf '\n Trying to download %s %s %s...\n\n' "$os" "$release" "$edition" | ||||
| 		"$QUICKGET" "$os" "$release" "$edition" || exit 105 | ||||
| 		echo "${configdir}/vm" >> ./"$(ls -t | head -n1)" | ||||
| 	fi | ||||
| } | ||||
| 
 | ||||
| tui_edit_default_VMs_config() { | ||||
| 	printf 'For example:\ncpu_cores="2"\nram="4G"\n' | ||||
| 	${EDITOR} ${configdir}/vm | ||||
| } | ||||
| 
 | ||||
| fzf_edit_VM_config() { | ||||
| 	find *.conf | fzf --cycle --header='Choose config to edit' --height 10% --layout=reverse --info=inline --preview 'cat {}' --bind 'enter:become($EDITOR {})' || exit 104 | ||||
| } | ||||
| 
 | ||||
| fzf_custom_quickemu_command() { | ||||
| 	custom=$(echo "edit delete"| grep -o '[^ ]*' | fzf --cycle --header='Edit or delete custom command?') | ||||
| } | ||||
| 
 | ||||
| tui_custom_quickemu_command() { | ||||
| 	fzf_custom_quickemu_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 | ||||
| } | ||||
| 
 | ||||
| tui_choose_VM_to_run() { | ||||
| 	chosen=$(printf '%s\n' "${vms[@]%.*}" | fzf --cycle --header='Choose VM to run' --height 50% --layout=reverse --info=inline --preview 'cat {}.conf') | ||||
| } | ||||
| 
 | ||||
| tui_run_VM() { | ||||
| 	printf '\n Starting %s...\n\n' "$chosen" | ||||
| 	if [ -f "${configdir}/command" ]; then | ||||
| 		quickemu < "${configdir}/command" -vm "$chosen".conf | ||||
| 	else | ||||
| 		quickemu -vm "$chosen".conf | ||||
| 	fi | ||||
| } | ||||
| 
 | ||||
| quickget_add_distro() { | ||||
| 	echo "for now with yad only" #TODO | ||||
| 	yad --form --field="Pretty name" "" --field="Name" "" --field="Releases" "" --field="Editions" "" --field="URL" "" --field="ISO" "" --field="Checksum file" "" > "${TMP}/template" | ||||
| 	PRETTY_NAME="$(cat "${TMP}/template" | cut -d'|' -f1)" | ||||
| 	NAME="$("${TMP}/template" > cut -d'|' -f2)" | ||||
| 	RELEASES="$(cat "${TMP}/template" | cut -d'|' -f3)" | ||||
| 	EDITIONS="$(cat "${TMP}/template" | cut -d'|' -f4)" | ||||
| 	URL="$(cat "${TMP}/template" | cut -d'|' -f5)" | ||||
| 	ISO="$(cat "${TMP}/template" | cut -d'|' -f6)" | ||||
| 	CHECKSUM_FILE="$(cat "${TMP}/template" | cut -d'|' -f7)" | ||||
| 	cat <<EOF > "${TMP}/template" | ||||
| #32 | ||||
| 
 | ||||
| $NAME)           PRETTY_NAME="$PRETTY_NAME";; | ||||
| 
 | ||||
| #line 184+ | ||||
| 
 | ||||
| $NAME \\ | ||||
| 
 | ||||
| #line 262+ | ||||
| 
 | ||||
| function releases_$NAME() { | ||||
| echo $RELEASES | ||||
| } | ||||
| 
 | ||||
| function editions_$NAME() { | ||||
| echo $EDITIONS | ||||
| } | ||||
| 
 | ||||
| #line 1052+ | ||||
| 
 | ||||
| function get_$NAME() { | ||||
| local EDITION="\${1:-}" | ||||
| local HASH="" | ||||
| local ISO="$ISO" | ||||
| local URL="$URL" | ||||
| HASH="\$(wget -q -O- \${URL}/\${CHECKSUM_FILE} | grep (\${ISO} | cut -d' ' -f4)" | ||||
| echo "\${URL}/\${ISO}" "\${HASH}" | ||||
| } | ||||
| 
 | ||||
| EOF | ||||
| 	diff "${TMP}/template" "quickget" | ||||
| } | ||||
| 
 | ||||
| function quickget_get_releases_and_editions() { | ||||
| 	result=$(quickget "$os" | sed 1d | cut -d':' -f2) | ||||
| 	releases=$(echo "$result" | head -1) | ||||
| 	editions=$(echo "$result" | tail -1) | ||||
| } | ||||
| 
 | ||||
| function desktop_entry_create() { | ||||
| 	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 | ||||
| } | ||||
| 
 | ||||
| quickget_test_download_ISOs() { | ||||
| 	rm -r "${TMP}" | ||||
| 	mkdir -p "$TMP" && cd "$TMP" | ||||
| 	touch "${TMP}/test" | ||||
| 	"$QUICKGET" | sed 1d | cut -d':' -f2 | grep -o '[^ ]*' > supported | ||||
| 	while read -r get_name; do | ||||
| 		echo "Trying $get_name..." | ||||
| 		mkdir -p "${TMP}/_distros/$get_name" && cd "${TMP}/_distros/$get_name" | ||||
| 		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" >> "${TMP}/test" | ||||
| 				"$QUICKGET" -t "$get_name" "${release}" >> "${TMP}/test" | ||||
| 			done | ||||
| 		else | ||||
| 			while read -r release; do | ||||
| 				for edition in $editions; do | ||||
| 					echo "$get_name" >> "${TMP}/test" | ||||
| 					"$QUICKGET" -t "$get_name" "${release}" "${edition}" >> "${TMP}/test" | ||||
| 				done | ||||
| 			done < releases | ||||
| 		fi | ||||
| 		cd "$TMP" | ||||
| 	done < supported | ||||
| 	printf "\nDone" | ||||
| } | ||||
| 
 | ||||
| quickget_show_ISOs_urls(){ | ||||
| 	rm -r "${TMP}" | ||||
| 	mkdir -p "$TMP" && cd "$TMP" | ||||
| 	touch "${TMP}/test" | ||||
| 	"$QUICKGET" | sed 1d | cut -d':' -f2 | grep -o '[^ ]*' > supported | ||||
| 	while read -r get_name; do | ||||
| 		echo "Trying $get_name..." | ||||
| 		mkdir -p "${TMP}/_distros/$get_name" && cd "${TMP}/_distros/$get_name" | ||||
| 		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" >> "${TMP}/test" | ||||
| 				timeout 3 "$QUICKGET" -s "$get_name" "${release}" >> "${TMP}/test" && $(killall zsync >> /dev/null) | ||||
| 			done | ||||
| 		else | ||||
| 			while read -r release; do | ||||
| 				for edition in $editions; do | ||||
| 					echo "$get_name" >> "${TMP}/test" | ||||
| 					timeout 3 "$QUICKGET" -s "$get_name" "${release}" "${edition}" >> "${TMP}/test" && $(killall zsync >> /dev/null) | ||||
| 				done | ||||
| 			done < releases | ||||
| 		fi | ||||
| 		cd "$TMP" | ||||
| 	done < supported | ||||
| 	printf "\nDone" | ||||
| } | ||||
| 
 | ||||
| quickget_open_distro_homepage(){ | ||||
|     os=$("$QUICKGET" | awk 'NR==2,/zorin/' | cut -d':' -f2 | grep -o '[^ ]*' | fzf --cycle --header='Choose distro homepage to open') | ||||
|     "$QUICKGET" -o "${os}" | ||||
| } | ||||
| 
 | ||||
| tui_advanced_menu() { | ||||
| 	advance=$(printf "Do you want to... | ||||
| default VMs config | ||||
| edit VM config | ||||
| quickemu custom command | ||||
| quickget add distro | ||||
| quickget test ISOs URLs | ||||
| quickget show ISOs URLs" | fzf --height 10% --layout=reverse --info=inline --header-lines=1) | ||||
| 	case $advance in | ||||
| 		'default VMs config' ) tui_edit_default_VMs_config;; | ||||
| 		'edit VM config' ) fzf_edit_VM_config;; | ||||
| 		'quickemu custom command' ) tui_custom_quickemu_command;; | ||||
| 		'quickget add distro' ) quickget_add_distro;; | ||||
| 		'quickget test ISOs URLs' ) quickget_test_download_ISOs;; | ||||
| 		'quickget show ISOs URLs' ) quickget_show_ISOs_urls;; | ||||
| 	esac | ||||
| } | ||||
| 
 | ||||
| tui_what_to_do() { | ||||
| 	if [ "$#" -eq  "1" ]; then | ||||
| 		todo="$1" | ||||
| 	fi | ||||
| 	case $todo in | ||||
| 		advanced ) tui_advanced_menu;; | ||||
| 		create ) tui_create_VM || exit 200;; | ||||
| 		edit ) tui_edit_VM_config || exit 201;; | ||||
| 		custom ) tui_custom_quickemu_command || exit 202;; | ||||
| 		homepage ) quickget_open_distro_homepage || exit 203;; | ||||
| 		run ) | ||||
| 			tui_choose_VM_to_run || exit 204 | ||||
| 			tui_run_VM || exit 205 | ||||
| 			;; | ||||
| 	esac | ||||
| } | ||||
| 
 | ||||
| tui_run() { | ||||
| 	tui_define_variables || exit 4 | ||||
| 	tui_display_header || exit 5 | ||||
| 	tui_print_available_VMs || exit 6 | ||||
| 	tui_action_prompt_fzf || exit 7 | ||||
| 	tui_what_to_do || exit 8 | ||||
| } | ||||
| 
 | ||||
| while true | ||||
| do | ||||
| 	tui_run | ||||
| 	exit 0 | ||||
| done | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue