menu driven build menu
This commit is contained in:
2024-03-26 07:43:47 +10:00
parent 38cbbe07b4
commit 5a12697c3e

View File

@@ -1,19 +1,478 @@
#!/usr/bin/env bash
# Okay need to get the hostname and see if this exists in our list of items.
hostname=$(hostname -f)
if [ $hostname == "nixos" ]
then
echo "This distro has not been initialised"
else
# Okay need to get the hostname and see if this exists in our list of items.
start () {
if [ $hostname == "nixos" ]
then
# no hostname defined. need to generate menu.
menuItems=(
"1. blade "
"2. W00072"
"3. W00149"
"Q. Exit "
)
menuActions=(
setupBlade
setupW00072
setupW00149
quitApp
)
menuTitle=" New nixos instance detected. Please select a build to deploy."
else
# Need to check if the nix file exists
if [[ ! -f "$hostname.nix" ]]
then
echo "Your host does not have a config"
menuItems=(
"Q. Exit"
)
menuActions=(
quitApp
)
menuTitle=" $hostname was not found in our configs. Please make one of move it into the folder."
else
echo "Performing Build"
sudo nixos-rebuild switch -I nixos-config=./$hostname.nix
menuItems=(
"1. Start Build"
"Q. Exit "
)
menuActions=(
doBuild
quitApp
)
menuTitle=" $hostname was found. Proceed with rebuild?"
fi
fi
menuFooter=" Enter=Select, Navigate via Up/Down/First number/letter"
menuWidth=60
menuLeft=25
menuHighlight=$DRAW_COL_GREEN
menuInit
menuLoop
}
setupBlade () {
hostname="blade"
doBuild
}
setupW00072 () {
hostname="w00072"
doBuild
}
setupW00149 () {
hostname="w00149"
doBuild
}
doBuild () {
sudo nixos-rebuild switch -I nixos-config=./$hostname.nix
return 0
}
quitApp () {
return 0
}
#
# Public Functions
#
# menuInit()
# menuLoop()
#
#
# Public Variables to Override
#
# Should these get passed into menuInit() rather than be set as global
# script variables?
#
# menuTop # Top row of menu (defaults to row 2)
# menuLeft # Left offset for menu item text (defaults to column 15)
# menuWidth # Width of menu (defaults to 42 columns)
# menuMargin # Left offset for menu border (defaults to column 4)
#
# menuColour # Colour of menu text (defaults to DRAW_COL_WHITE)
# menuHighlight # Highlight colour for menu (defaults to DRAW_COL_GREEN)
#
# menuTitle # Title of menu
# menuFooter # Footer text of menu
#
# menuItems # Array containing menu item text
# menuActions # Array containing functions to call upon menu item selection
#
# Ensure we are running under bash (will not work under sh or dash etc)
if [ "$BASH_SOURCE" = "" ]; then
echo "ERROR: bash-menu requires to be running under bash"
exit 1
fi
# Get script root (as we are sourced from another script, $0 will not be us)
declare -r menuScript=$(readlink -f ${BASH_SOURCE[0]})
menuRoot=$(dirname "$menuScript")
################################
# Private Variables
#
# These should not be overridden
################################
declare -a menuItems
declare -a menuActions
menuHeaderText=""
menuFooterText=""
menuBorderText=""
################################
# Setup Menu
#
# These are defaults which should
# be overridden as required.
################################
# Top of menu (row 2)
menuTop=2
# Left offset for menu items (not border)
menuLeft=15
# Width of menu
menuWidth=42
# Left offset for menu border (not menu items)
menuMargin=4
menuItems[0]="Exit"
menuActions[0]="return 0"
menuItemCount=1
menuLastItem=0
menuColour=$DRAW_COL_WHITE
menuHighlight=$DRAW_COL_GREEN
menuTitle=" Super Bash Menu System"
menuFooter=" Enter=Select, Up/Down=Prev/Next Option"
################################
# Initialise Menu
################################
menuInit() {
menuItemCount=${#menuItems[@]}
menuLastItem=$((menuItemCount-1))
# Ensure header and footer are padded appropriately
menuHeaderText=`printf "%-${menuWidth}s" "$menuTitle"`
menuFooterText=`printf "%-${menuWidth}s" "$menuFooter"`
# Menu (side) borders
local marginSpaces=$((menuMargin-1))
local menuSpaces=$((menuWidth-2))
local leftGap=`printf "%${marginSpaces}s" ""`
local midGap=`printf "%${menuSpaces}s" ""`
menuBorderText="${leftGap}x${midGap}x"
}
################################
# Show Menu
################################
menu_Display() {
local menuSize=$((menuItemCount+2))
local menuEnd=$((menuSize+menuTop+1))
drawClear
drawColour $menuColour $menuHighlight
# Menu header
drawHighlightAt $menuTop $menuMargin "$menuHeaderText" 1
# Menu (side) borders
for row in $(seq 1 $menuSize); do
drawSpecial "$menuBorderText" 1
done
# Menu footer
drawHighlightAt $menuEnd $menuMargin "$menuFooterText" 1
# Menu items
for item in $(seq 0 $menuLastItem); do
menu_ClearItem $item
done
}
################################
# Mark Menu Items
################################
# Ensure menu item is not highlighted
menu_ClearItem() {
local item=$1
local top=$((menuTop+item+2))
local menuText=${menuItems[$item]}
drawPlainAt $top $menuLeft "$menuText"
}
# Highlight menu item
menu_HighlightItem() {
local item=$1
local top=$((menuTop+item+2))
local menuText=${menuItems[$item]}
drawHighlightAt $top $menuLeft "$menuText"
}
################################
# Wait for and process user input
################################
menu_HandleInput() {
local choice=$1
local after=$((choice+1))
[[ $after -gt $menuLastItem ]] && after=0
local before=$((choice-1))
[[ $before -lt 0 ]] && before=$menuLastItem
# Clear highlight from prev/next menu items
menu_ClearItem $before
menu_ClearItem $after
# Highlight current menu item
menu_HighlightItem $choice
# Get keyboard input
local key=""
local extra=""
read -s -n1 key 2> /dev/null >&2
while read -s -n1 -t .05 extra 2> /dev/null >&2 ; do
key="$key$extra"
done
# Handle known keys
local escKey=`echo -en "\033"`
local upKey=`echo -en "\033[A"`
local downKey=`echo -en "\033[B"`
if [[ $key = $upKey ]]; then
return $before
elif [[ $key = $downKey ]]; then
return $after
elif [[ $key = $escKey ]]; then
if [[ $choice -eq $menuLastItem ]]; then
# Pressing Esc while on last menu item will trigger action
# This is a helper as we assume the last menu option is exit
key=""
else
# Jumping possibly more than 1 (next/prev) item
menu_ClearItem $choice
return $menuLastItem
fi
elif [[ ${#key} -eq 1 ]]; then
# See if we wanrt to jump to a menu item
# by entering the first character
for index in $(seq 0 $menuLastItem) ; do
local item=${menuItems[$index]}
local startChar=${item:0:1}
if [[ "$key" = "$startChar" ]]; then
# Jumping possibly more than 1 (next/prev) item
menu_ClearItem $choice
return $index
fi
done
fi
if [[ "$key" = "" ]]; then
# Notify that Enter key was pressed
return 255
fi
return $choice
}
################################
# Main Menu Loop
################################
menuLoop() {
local choice=0
local running=1
menu_Display
while [[ $running -eq 1 ]]; do
# Enable case insensitive matching
local caseMatch=`shopt -p nocasematch`
shopt -s nocasematch
menu_HandleInput $choice
local newChoice=$?
# Revert to previous case matching
$caseMatch
if [[ $newChoice -eq 255 ]]; then
# Enter pressed - run menu action
drawClear
action=${menuActions[$choice]}
$action
running=$?
# Back from action
# If we are still running, redraw menu
[[ $running -eq 1 ]] && menu_Display
elif [[ $newChoice -lt $menuItemCount ]]; then
# Update selected menu item
choice=$newChoice
fi
done
# Cleanup screen
drawClear
}
#
# Public Functions:
#
# drawClear()
# drawColour(colour = DRAW_COL_DEF, bgColour = DRAW_COL_DEF)
#
# drawPlain(text, newLine = 0)
# drawSpecial(text, newLine = 0)
# drawHighlight(text, newLine = 0)
# drawPlainAt(left, top, text, newLine = 0)
# drawHighlightAt(left, top, text, newLine = 0)
#
#
# Colours
#
# DRAW_COL_DEF # Default colour
# DRAW_COL_BLACK
# DRAW_COL_WHITE
# DRAW_COL_RED
# DRAW_COL_GREEN
# DRAW_COL_YELLOW
# DRAW_COL_BLUE
# DRAW_COL_GRAY # Light gray (grey?)
#
# Ensure we are running under bash (will not work under sh or dash etc)
if [ "$BASH_SOURCE" = "" ]; then
echo "ERROR: bash-draw requires to be running under bash"
exit 1
fi
DRAW_COL_DEF=39
DRAW_COL_BLACK=30
DRAW_COL_WHITE=97
DRAW_COL_RED=31
DRAW_COL_GREEN=32
DRAW_COL_YELLOW=33
DRAW_COL_BLUE=34
DRAW_COL_GRAY=37
# drawClear()
drawClear() {
$ESC_WRITE "\033c"
}
# drawColour(colour = DRAW_COL_DEF, bgColour = DRAW_COL_DEF)
drawColour() {
local colour=$DRAW_COL_DEF
local bgColour=$((DRAW_COL_DEF+10))
if [[ ! -z "$1" && "$1" != "" ]]; then
colour="$1"
fi
if [[ ! -z "$2" && "$2" != "" ]]; then
bgColour="$2"
fi
$ESC_ECHO "\033c\033[H\033[J\033[${colour};${bgColour}m\033[J"
}
# drawPlain(text, newLine = 0)
drawPlain() {
if [[ -z "$2" || "$2" -eq 0 ]]; then
$ESC_WRITE "$1"
else
$ESC_ECHO "$1"
fi
}
# drawSpecial(text, newLine = 0)
drawSpecial() {
[[ -z "$2" ]] && newLine=0 || newLine="$2"
draw_SetDrawMode
drawPlain "$1" "$newLine"
draw_SetWriteMode
}
# drawHighlight(text, newLine = 0)
drawHighlight() {
[[ -z "$2" ]] && newLine=0 || newLine="$2"
draw_StartHighlight
drawPlain "$1" "$newLine"
draw_EndHighlight
}
# drawPlainAt(left, top, text, newLine = 0)
drawPlainAt() {
[[ -z "$4" ]] && newLine=0 || newLine="$4"
draw_MoveTo $1 $2
drawPlain "$3" "$newLine"
}
# drawHighlightAt(left, top, text, newLine = 0)
drawHighlightAt() {
[[ -z "$4" ]] && newLine=0 || newLine="$4"
draw_StartHighlight
drawPlainAt "$1" "$2" "$3" "$newLine"
draw_EndHighlight
}
# Write escape sequence with no newline
ESC_WRITE='echo -en'
# Write escape sequence adding newline
ESC_ECHO='echo -e'
# Move cursor to specified location
draw_MoveTo() {
$ESC_WRITE "\033[${1};${2}H"
}
draw_StartHighlight() {
$ESC_WRITE "\033[7m"
}
draw_EndHighlight() {
$ESC_WRITE "\033[27m"
}
draw_SetDrawMode() {
$ESC_WRITE "\033%@\033(0"
}
draw_SetWriteMode() {
$ESC_WRITE "\033(B"
}
start;