From e18c8a75c22f320bfc3db31425f48fc90079369f Mon Sep 17 00:00:00 2001 From: Natanael Copa Date: Wed, 21 Mar 2012 12:48:03 +0000 Subject: libalpine: add various functions from openbsd installer isin - is element in list rmel - remove element from list ask - Ask a question and read response ask_until - repeat a question til a non-blank response ask_which - repeat a question til a listed option is entered --- libalpine.sh.in | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 119 insertions(+), 7 deletions(-) mode change 100755 => 100644 libalpine.sh.in diff --git a/libalpine.sh.in b/libalpine.sh.in old mode 100755 new mode 100644 index 8661643..4ea5201 --- a/libalpine.sh.in +++ b/libalpine.sh.in @@ -71,6 +71,16 @@ cfg_add() { [ -z "$NOCOMMIT" ] && lbu_add "$@" } +# Detect if we are running Xen +is_xen() { + test -d /proc/xen +} + +# Detect if we are running Xen Dom0 +is_xen_dom0() { + is_xen && \ + grep -q "control_d" /proc/xen/capabilities +} # from OpenBSD installer # Ask for a password, saving the input in $resp. @@ -106,13 +116,115 @@ askpassword() { IFS=$_oifs } -# Detect if we are running Xen -is_xen() { - test -d /proc/xen +# test the first argument against the remaining ones, return success on a match +isin() { + local _a=$1 _b + shift + for _b; do + [ "$_a" = "$_b" ] && return 0 + done + return 1 } -# Detect if we are running Xen Dom0 -is_xen_dom0() { - is_xen && \ - grep -q "control_d" /proc/xen/capabilities +# remove all occurrences of first argument from list formed by +# the remaining arguments +rmel() { + local _a=$1 _b + + shift + for _b; do + [ "$_a" != "$_b" ] && echo -n "$_b " + done +} + +# Issue a read into the global variable $resp. +_ask() { + local _redo=0 + + read resp + case "$resp" in + !) echo "Type 'exit' to return to setup." + sh + _redo=1 + ;; + !*) eval "${resp#?}" + _redo=1 + ;; + esac + return $_redo +} + +# Ask for user input. +# +# $1 = the question to ask the user +# $2 = the default answer +# +# Save the user input (or the default) in $resp. +# +# Allow the user to escape to shells ('!') or execute commands +# ('!foo') before entering the input. +ask() { + local _question=$1 _default=$2 + + while :; do + echo -n "$_question " + [ -z "$_default" ] || echo -n "[$_default] " + _ask && : ${resp:=$_default} && break + done } + +# Ask for user input until a non-empty reply is entered. +# +# $1 = the question to ask the user +# $2 = the default answer +# +# Save the user input (or the default) in $resp. +ask_until() { + resp= + while [ -z "$resp" ] ; do + ask "$1" "$2" + done +} + +# Ask for the user to select one value from a list, or 'done'. +# +# $1 = name of the list items (disk, cd, etc.) +# $2 = question to ask +# $3 = list of valid choices +# $4 = default choice, if it is not specified use the first item in $3 +# +# N.B.! $3 and $4 will be "expanded" using eval, so be sure to escape them +# if they contain spooky stuff +# +# At exit $resp holds selected item, or 'done' +ask_which() { + local _name=$1 _query=$2 _list=$3 _def=$4 _dynlist _dyndef + + while :; do + # Put both lines in ask prompt, rather than use a + # separate 'echo' to ensure the entire question is + # re-ask'ed after a '!' or '!foo' shell escape. + eval "_dynlist=\"$_list\"" + eval "_dyndef=\"$_def\"" + + # Clean away whitespace and determine the default + set -o noglob + set -- $_dyndef; _dyndef="$1" + set -- $_dynlist; _dynlist="$*" + set +o noglob + [ $# -lt 1 ] && resp=done && return + + : ${_dyndef:=$1} + echo "Available ${_name}s are: $_dynlist." + echo -n "Which one $_query? (or 'done') " + [ -n "$_dyndef" ] && echo -n "[$_dyndef] " + _ask || continue + [ -z "$resp" ] && resp="$_dyndef" + + # Quote $resp to prevent user from confusing isin() by + # entering something like 'a a'. + isin "$resp" $_dynlist done && break + echo "'$resp' is not a valid choice." + done +} + -- cgit v1.2.3