#!/usr/bin/env bash ## SPDX-License-Identifier: GPL-2.0-only ## Copyright (C) 2020 - Dreemurrs Embedded Labs / DanctNIX # Clear screen clear declare -A config if [ ! -f /plr/config-plr.cfg ] ; then echo "Pineloader config not found! Please debug the issue via telnet" echo "$IP" loop_forever else . /plr/config-plr.cfg fi # Renders a text based list of options that can be selected by the # user using up, down and enter keys and returns the chosen option. # # Arguments : list of options, maximum of 256 # "opt1" "opt2" ... # Return value: selected index (0 for opt1, 1 for opt2 ...) function select_option { # little helpers for terminal print control and key input ESC=$( printf "\033") cursor_blink_on() { printf "$ESC[?25h"; } cursor_blink_off() { printf "$ESC[?25l"; } cursor_to() { printf "$ESC[$1;${2:-1}H"; } print_option() { printf " $1 "; } print_selected() { printf " -> $ESC[7m $1 $ESC[27m"; } get_cursor_row() { IFS=';' read -sdR -p $'\E[6n' ROW COL; echo ${ROW#*[}; } key_input() { read -s -n3 key 2>/dev/null >&2 if [[ $key = $ESC[A ]]; then echo up; fi if [[ $key = $ESC[B ]]; then echo down; fi if [[ $key = "" ]]; then echo enter; fi; } # initially print empty new lines (scroll down if at bottom of screen) for opt; do printf "\n"; done # determine current screen position for overwriting the options local lastrow=`get_cursor_row` local startrow=$(($lastrow - $#)) # ensure cursor and input echoing back on upon a ctrl+c during read -s trap "cursor_blink_on; stty echo; printf '\n'; exit" 2 cursor_blink_off local selected=0 while true; do # print options by overwriting the last lines local idx=0 for opt; do cursor_to $(($startrow + $idx)) if [ $idx -eq $selected ]; then print_selected "$opt" else print_option "$opt" fi ((idx++)) done # user key control case `key_input` in enter) break;; up) ((selected--)); if [ $selected -lt 0 ]; then selected=$(($# - 1)); fi;; down) ((selected++)); if [ $selected -ge $# ]; then selected=0; fi;; esac done # cursor position back to normal cursor_to $lastrow printf "\n" cursor_blink_on return $selected } function select_opt { select_option "$@" 1>&2 local result=$? echo $result return $result } echo "Welcome to PineLoader!" echo "Copyright 2020 - Dreemurrs Embedded Labs / DanctNIX." echo echo "[VOLUME_UP/VOLUME_DOWN to select. POWER is OK.]" echo declare -a choices for path in "${!config[@]}"; do choices+=( "$path" ) done i=$(select_opt "${choices[@]}") key="${choices[$i]}" value="${config[$key]}" if [ -z "$value" ]; then echo "ERROR: The selected boot variables are blank, please debug the issue by telnet to:" echo "$IP" else mount -o ro $BOOTPART /mnt echo "Loading kernel and ramdisk to memory..." kexec -l --initrd="$INITRD" --command-line="$CMDLINE" $KERNEL echo "Starting kernel..." kexec -e fi