bash-libs/config.sh
2024-06-01 16:57:13 -05:00

112 lines
3.0 KiB
Bash

# A variable to contain the configs provided manually or via function calls
declare -A CONFIG
##########################
# Function: load_section
# Usage: This will return the section of a aggragate config file
#
# EX:
# [TEST_BEGIN]
# test=1
# test2=34
# [TEST_END]
#
# load_section /path/to/config TEST [OPT_VAR]
function load_section () {
local SECTION_NAME=${1:?"$FUNCNAME: No section name was provided"}
local FILE=${2:?"$FUNCNAME: No file was provided"}
local BUFFER_ARRAY BUFFER_STRING
local SECTION_BEGIN="\[${SECTION_NAME}_BEGIN\]"
local SECTION_END="\[${SECTION_NAME}_END\]"
if [[ $3 != "" ]]; then
local OPT_VAR_PROVIDED=1
local -n OPT_OUTPUT_VAR=$3
fi
if [[ $FILE == '-' ]]; then
FILE=/dev/stdin
elif [[ ! -f $FILE ]]; then
echo "$FUNCNAME: $FILE does not exist"
exit
fi
## Loading contents, since it will clear /dev/stdin on a read (in the case that it is being used to provide the content)
local FILE_CONTENTS=$(<$FILE)
if ! grep -q "$SECTION_BEGIN" <<< "$FILE_CONTENTS" || ! grep -q "$SECTION_END" <<< "$FILE_CONTENTS"; then
echo "$FUNCNAME: Either the begin or end $SECTION_NAME section was missing from the file ($FILE) provided"
exit
fi
mapfile -t BUFFER_ARRAY <<< "$FILE_CONTENTS"
local CAN_READ=0
for ((i=0; i < ${#BUFFER_ARRAY[@]}; i++)); do
if [[ ${BUFFER_ARRAY[$i]} =~ ^$SECTION_BEGIN ]]; then
CAN_READ=1
continue
elif [[ ${BUFFER_ARRAY[$i]} =~ ^$SECTION_END ]]; then
break
elif [[ $CAN_READ -eq 1 ]]; then
BUFFER_STRING+="\n${BUFFER_ARRAY[$i]}"
fi
done
if [[ $OPT_VAR_PROVIDED -eq 1 ]]; then
OPT_OUTPUT_VAR=$( echo -e "$BUFFER_STRING" )
else
echo -e "$BUFFER_STRING"
fi
}
##############################
# Function: load_config_ini
# Usage: You would call this function to load an ini formated config file into the global CONFIG associative array
# or into a Associative Array variable you provide as the second argument
function load_config_ini () {
local FILE=${1:?"$FUNCNAME: No file was provided"}
if [[ $2 != "" ]]; then
local -n CONFIG_VAR=${2}
else
local -n CONFIG_VAR="CONFIG"
fi
if ! declare -p ${!CONFIG_VAR} 2>/dev/null | grep -q 'declare -A'; then
echo "The output variable (${!CONFIG_VAR}) provided was either not an Associative array or was not declared."
echo "Please declare your variable correctly as 'declare -A ${!CONFIG_VAR}'"
exit
fi
if [[ ! -f $FILE ]]; then
echo "$FUNCNAME: $FILE does not exist"
exit
fi
local SECTION_REGEX='\[(\S+)\]'
local KEY_VAL_REGEX='[[:space:]]*(\S+)[[:space:]]*=[[:space:]]*(.+)'
local -a BUFFER_ARRAY
local SECTION="" KEY="" VAL=""
mapfile -t BUFFER_ARRAY <$FILE
for ((i=0; i < ${#BUFFER_ARRAY[@]}; i++)); do
LINE=${BUFFER_ARRAY[$i]}
if [[ $LINE =~ ^$SECTION_REGEX ]]; then
SECTION=${BASH_REMATCH[1],,}
elif [[ $LINE =~ ^$KEY_VAL_REGEX ]]; then
KEY=${BASH_REMATCH[1],,}
VAL=${BASH_REMATCH[2]}
if [[ $SECTION != "" ]]; then
CONFIG_VAR["$SECTION.$KEY"]=$VAL
else
CONFIG_VAR["$KEY"]=$VAL
fi
fi
done
}