gsu improvements.
authorAndre Noll <maan@systemlinux.org>
Fri, 3 Apr 2009 08:45:53 +0000 (10:45 +0200)
committerAndre Noll <maan@tuebingen.mpg.de>
Fri, 29 Aug 2014 19:36:07 +0000 (21:36 +0200)
Support config files from within gsu. Untested.

funcs/gsu

index 37092a3985ee835768dbfc5ec7d4fd2fcd68f572..9611b30a7c6cafa4ee41f312dac1ca092a5b8a23 100644 (file)
--- a/funcs/gsu
+++ b/funcs/gsu
@@ -1,12 +1,15 @@
+#!/bin/sh
 # gsu -- the global subcommand utility
-# (C) 2006-2007 Andre Noll
+# (C) 2006-2009 Andre Noll
 
-gsu_init_errors()
+_gsu_init_errors()
 {
        gsu_errors="
 GSU_SUCCESS                    success
 E_GSU_BAD_COMMAND              invalid command
 E_GSU_NOT_A_NUMBER             not a number
+E_GSU_SOURCE                   error in config file
+E_GSU_CONFIG                   bad/missing config file option
 $gsu_errors
 "
        local a b i=0
@@ -22,7 +25,7 @@ $gsu_errors
        $gsu_errors
 EOF
 }
-export -f gsu_init_errors
+export -f _gsu_init_errors
 
 # check if $1 is a number
 gsu_is_a_number()
@@ -44,19 +47,19 @@ export -f gsu_short_msg
 
 gsu_msg()
 {
-       gsu_short_msg "$gsu_self: $1"
+       gsu_short_msg "$_gsu_self: $1"
 }
 export -f gsu_msg
 
 gsu_date_msg()
 {
-       gsu_short_msg "$gsu_self $(date): $1"
+       gsu_short_msg "$_gsu_self $(date): $1"
 }
 export -f gsu_date_msg
 
-gsu_banner_msg()
+_gsu_banner_msg()
 {
-       local txt="*** $gsu_self --"
+       local txt="*** $_gsu_self --"
        if test -z "$gsu_banner_txt"; then
                txt="$txt set \$gsu_banner_txt to customize this message"
        else
@@ -64,7 +67,7 @@ gsu_banner_msg()
        fi
        gsu_short_msg "$txt ***"
 }
-export -f gsu_banner_msg
+export -f _gsu_banner_msg
 
 gsu_err_msg()
 {
@@ -89,13 +92,13 @@ gsu_err_msg()
 }
 export -f gsu_err_msg
 
-gsu_usage()
+_gsu_usage()
 {
-       gsu_short_msg "Usage: $gsu_self command [options]"
+       gsu_short_msg "Usage: $_gsu_self command [options]"
 }
-export -f gsu_usage
+export -f _gsu_usage
 
-gsu_available_commands()
+_gsu_available_commands()
 {
        result="$( (printf "help\nman\n"; grep "^com_[a-z_]\+()" $0) \
                | sed -e 's/^com_//' -e 's/()//' \
@@ -103,9 +106,9 @@ gsu_available_commands()
                | tr '\n' ' ')"
        ret=$GSU_SUCCESS
 }
-export -f gsu_available_commands
+export -f _gsu_available_commands
 
-gsu_print_available_commands()
+_gsu_print_available_commands()
 {(
        local i count
        gsu_short_msg "Available commands:"
@@ -124,7 +127,7 @@ gsu_print_available_commands()
        echo
 ) 2>&1
 }
-export -f gsu_print_available_commands
+export -f _gsu_print_available_commands
 
 export gsu_man_txt="
 Print the manual.
@@ -137,24 +140,24 @@ com_man()
        local minus_signs="--------------------------------------------------"
         local com num
 
-       echo "$gsu_self (_${gsu_banner_txt}_) manual"
-       echo "${equal_signs:0:${#gsu_self} + ${#gsu_banner_txt} + 16}"
+       echo "$_gsu_self (_${gsu_banner_txt}_) manual"
+       echo "${equal_signs:0:${#_gsu_self} + ${#gsu_banner_txt} + 16}"
        echo
 
         sed -e '1,/^#\{70,\}/d' -e '/^#\{70,\}/,$d' $0 -e 's/^# *//'
        echo "----"
         echo
-       echo "$gsu_self usage"
-       echo "${minus_signs:0:${#gsu_self} + 6}"
+       echo "$_gsu_self usage"
+       echo "${minus_signs:0:${#_gsu_self} + 6}"
        printf "\t"
-       gsu_usage 2>&1
+       _gsu_usage 2>&1
        echo "Each command has its own set of options as described below."
        echo
        echo "----"
        echo
        echo "Available commands:"
 
-       gsu_available_commands
+       _gsu_available_commands
         for com in $result; do
                num=${#com}
                if test $num -lt 4; then
@@ -182,8 +185,8 @@ com_help()
 {
        local a b
        if test -z "$1"; then
-               gsu_banner_msg 2>&1
-               gsu_usage 2>&1
+               _gsu_banner_msg 2>&1
+               _gsu_usage 2>&1
                # sed is magic, baby
                (printf "com_help()\n$gsu_help_txt" | head -n 4; echo "--"
                printf "com_man()\n$gsu_man_txt" | head -n 4; echo "--"
@@ -204,7 +207,7 @@ com_help()
                                echo "$b"
                         done
                echo
-               echo "Try $gsu_self help <command> for info on <command>."
+               echo "Try $_gsu_self help <command> for info on <command>."
                ret=$GSU_SUCCESS
                return
        fi
@@ -223,23 +226,70 @@ com_help()
                sed -e "1,/com_$1()/d" -e '/^{/,$d' -e 's/^## *//' $0
                return
        fi
-       gsu_print_available_commands
+       _gsu_print_available_commands
        result="$1"
        ret=-$E_GSU_BAD_COMMAND
 }
 export -f com_help
 
+_gsu_init_config()
+{
+       local name val default_val required ty comment
+
+       # set default values
+       while read name default_val required ty comment; do
+               if test -z "$name"; then
+                       continue
+               fi
+               eval ${gsu_self}_$name="$default_val"
+       done << EOF
+       $gsu_config_vars
+EOF
+       result="$HOME/.${gsu_self}rc"
+       # overwrite by custom configuration
+       if [ -r "$result" ]; then
+               ret=-$E_GSU_SOURCE
+               if ! . "$result"; then
+                       gsu_err_msg
+                       exit 1
+               fi
+       fi
+       while read name default_val required ty comment; do
+               [ -z "$name" ] && continue
+               eval val="\$$name"
+               # abort if any required config var remains unset
+               ret=-$_E_GSU_CONFIG
+               if [ "$val" = "-" -a "$required" = "required" ]; then
+                       result="$name"
+                       gsu_err_msg
+                       exit 1
+               fi
+               if [ $ty == "number" ]; then
+                       gsu_is_a_number "$val"
+                       if [ $ret -lt 0];  then
+                               gsu_err_msg
+                               exit 1
+                       fi
+               fi
+               eval export ${gsu_self}_$name
+       done << EOF
+       $config_vars
+EOF
+}
+export -f _gsu_init_config
+
 gsu()
 {
        local i
 
-       gsu_self="$(basename $0)"
-       gsu_init_errors
-       gsu_available_commands
+       _gsu_self="$(basename $0)"
+       _gsu_init_errors
+       _gsu_init_config
+       _gsu_available_commands
        gsu_cmds="$result"
        if test $# -eq 0; then
-               gsu_usage
-               gsu_print_available_commands
+               _gsu_usage
+               _gsu_print_available_commands
                exit 1
        fi
        arg="$1"
@@ -257,7 +307,7 @@ gsu()
        ret=-$E_GSU_BAD_COMMAND
        result="$arg"
        gsu_err_msg
-       gsu_print_available_commands
+       _gsu_print_available_commands
        exit 1
 }
-# no need to export this
+export -f gsu