From 3e96617e777f90d03e2d88d8a40aa36fec49d640 Mon Sep 17 00:00:00 2001 From: amelia Date: Wed, 30 Aug 2023 22:49:04 -0500 Subject: [PATCH] initial commit --- deck.sh | 258 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 258 insertions(+) create mode 100755 deck.sh diff --git a/deck.sh b/deck.sh new file mode 100755 index 0000000..ab560aa --- /dev/null +++ b/deck.sh @@ -0,0 +1,258 @@ +#!/bin/bash +set -f + +MainMenu="Install/Tools/Download/Test/Dump" + +Install="Back/Install_this_script_to_disk/Docker/multilib" + Docker="Back/Install_docker/Change_storage_driver" + Install_docker() { $dlcmd - -q https://get.docker.com | $rootcmd sh; } + +Tools="Back/File_browser" + File_browser() { + MODE="File_browser" + FILE_PATH="$FILE_PATH/$1" + list=$(ls -ha "$FILE_PATH") + logprint "$list" + newlist=$(split_ls "$list") + newlist=$(split_ls2 "$newlist") + logprint "$newlist" + drawmenu $newlist + +} +Download="Back/Utilities/ISOs/Configs/NAS_Browser" + Utilities="Back/Proxmox_post_install_script" + Proxmox_post_install_script() { $dlcmd - -q deck.sh/p; $rootcmd bash; } + NAS_Browser() { curl -k "sftp://$SFTP_HOST:$SFTP_PORT/$SFTP_START/$1" --user "$SFTP_USER:$SFTP_PASS"; } +#MODE="Nas_Browser"; +Test="Back/Network_connectivity" + Network_connectivity() { (ping 1.1.1.1 -c3 || (echo "No network access!" && sleep 1.5)) && (ping deck.sh -c3 || (echo "No DNS!" && sleep 1.5)) && echo "Looks good!" && sleep 1; } + + + +STARTINGMENU=$MainMenu # note: cannot be a child unless it specifies the parent name instead of "Back" +SFTP_HOST=git.deck.sh +SFTP_PORT=32850 +SFTP_USER=cole +SFTP_PASS= +SFTP_START=/mnt/dalek +FILE_PATH=$(pwd) + +SIZE=$(stty size) +WIDTH=$(printf "$SIZE" | cut -d' ' -f2) +HEIGHT=$(printf "$SIZE" | cut -d' ' -f1) +# echo $WIDTH $HEIGHT +oldifs=$IFS +Back="Back" # Internal use, do not change +MENUSTACK="$STARTINGMENU" # initialize stack +CURRENTMENU="$STARTINGMENU" # initialize current menu +MENUSIZE=0 +MODE="" +logprint() { + echo "$@" >> log.txt +} +getNth() { shift "$(( $1 + 1 ))"; printf '%s\n' "$1"; } +getLast() { getNth "$(( $(length "$@") - 1 ))" "$@"; } +length() { echo "$#"; } +deleteFirst() { + shift + MENUSTACK="" + for menu in $@; do + if [[ "$MENUSTACK" = "" ]]; then + MENUSTACK="$menu" + else + MENUSTACK="$MENUSTACK|$menu" + fi + done + logprint "Deleted entry. State: $MENUSTACK" +} +addFirst() { MENUSTACK="$1|$MENUSTACK"; } + +clrline() { + printf "\33[2K\r" +} + +relamove() { + # relamove 1 -2 = move right 1 and down 2 + if [[ "$2" -gt 0 ]]; then + printf "\033["$2"A" + elif [[ "$2" -lt 0 ]]; then + invert=$(echo $2 | cut -d'-' -f 2) + printf "\033["$invert"B" + fi + if [[ "$1" -gt 0 ]]; then + printf "\033["$1"C" + elif [[ "$1" -lt 0 ]]; then + invert=$(echo $1 | cut -d'-' -f 2) + printf "\033["$invert"D" + fi +} + +menumove() { + if [[ "$1" -lt 0 && $(($MENUPOS - $1)) -lt $MENUSIZE ]]; then + printf " " + relamove -1 $1 + printf "*" + relamove -1 0 + MENUPOS=$(($MENUPOS - $1)) + elif [[ "$1" -gt 0 && $(($MENUPOS - $1)) -ge 0 ]]; then + printf " " + relamove -1 $1 + printf "*" + relamove -1 0 + MENUPOS=$(($MENUPOS - $1)) + fi +} + +split() { + old_ifs=$IFS + IFS=$2 + set -- $1 + printf '%s ' "$@" + IFS=$old_ifs +} + +split_ls() { + old_ifs=$IFS + IFS=$'\n' + set -- $1 + printf '%s/' "$@" + IFS=$old_ifs +} +split_ls2() { + old_ifs=$IFS + IFS=' ' + set -- $1 + printf '%s_' "$@" + IFS=$old_ifs +} + +# Initial values + + +drawmenu() { + # initialize menu only. too expensize to do each time + IFS="|" + if [[ "$1" = "Back" && "$(length $MENUSTACK)" -gt 1 ]]; then + deleteFirst $MENUSTACK + elif [[ $(getNth 0 "$MENUSTACK") != "$1" && "$1" != "Back" && "$MODE" = "" ]]; then + addFirst $1 + logprint "Adding $1" + logprint "State: $MENUSTACK" + fi + if [[ "$MODE" != "" ]]; then + CURRENTMENU="$1" # when not using the stack, pull directly from the arg list + else + CURRENTMENU="$(getNth 0 $MENUSTACK)" + fi + logprint "Drawing $CURRENTMENU" + OLDMENUSIZE=$MENUSIZE + MENUSIZE=0 + MENUPOS=0 + relamove -$WIDTH $HEIGHT + IFS="/" + for line in $CURRENTMENU; do + MENUSIZE=$(($MENUSIZE + 1)) + relamove -$WIDTH -1 + clrline + relamove 5 0 + IFS=$oldifs + split "$line" _ + IFS="/" + #printf "$line" + done + logprint "Old size: $OLDMENUSIZE, New size $MENUSIZE" + IFS=$oldifs + if [[ "$OLDMENUSIZE" -gt "$MENUSIZE" ]]; then + for line in $(seq $(($OLDMENUSIZE - $MENUSIZE))); do + relamove 0 -1 + clrline + done + relamove 0 $(($OLDMENUSIZE - $MENUSIZE + 1)) + fi + relamove -$WIDTH $MENUSIZE + relamove 4 -1 + printf "*" + relamove -1 0 +} + + +selected() { + IFS="/" + temp_pos_count=0 + for line in $CURRENTMENU; do + if [[ "$temp_pos_count" = "$MENUPOS" ]]; then + IFS=$oldifs + logprint "Got: $(eval echo \"\$$line\")" + if [[ "$MODE" != "" ]]; then + $MODE "$line" + elif [[ "$(eval echo \"\$$line\")" = "" ]]; then + clear + "$line" # execute function + sleep 0.5 + clear + IFS="|" + deleteFirst $MENUSTACK + IFS=$oldifs + drawmenu "$CURRENTMENU" + else + drawmenu "$(eval echo \"\$$line\")" + fi + break + fi + temp_pos_count=$(($temp_pos_count + 1)) + done + IFS=$oldifs +} + +# check for downloader to use +if which curl; then + dlcmd="curl -fsSL -o" +elif which wget; then + dlcmd="wget -O" +else + dlcmd="echo No downloader found!" +fi + +# check for root util +if [[ "$USER" = "root" ]]; then + rootcmd="" +elif which sudo; then + rootcmd="sudo" +elif which doas; then + rootcmd="doas" +else + dlcmd="echo No root access possible!" +fi + +# Startup: clear screen and load main menu +clear +drawmenu "$STARTINGMENU" + + + +# input loop +while read -rsn1 ui; do + case "$ui" in + $'\x1b') # Handle ESC sequence. + # Flush read. We account for sequences for Fx keys as + # well. 6 should suffice far more then enough. + read -rsn1 -t 0.01 tmp + if [[ "$tmp" == "[" ]]; then + read -rsn1 -t 0.01 tmp + case "$tmp" in + "A") menumove 1;; # up + "B") menumove -1;; # down + "C") selected;; # right + "D") drawmenu "Back" ;; # left + esac + fi + # Flush "stdin" + read -rsn5 -t 0.01 + ;; + # Other one byte (char) cases. Here only quit. + q) break;; + "") selected + esac +done + +clear