537d4025c5
fix some of the bash8 issues found in functions and lib/config, part of the long march towards fixing all the bash8 issues. Change-Id: Ia131f64870acb0f9d196fe1a9a45d633abb6fc4d
131 lines
3.3 KiB
Plaintext
131 lines
3.3 KiB
Plaintext
# lib/config - Configuration file manipulation functions
|
|
|
|
# These functions have no external dependencies and the following side-effects:
|
|
#
|
|
# CONFIG_AWK_CMD is defined, default is ``awk``
|
|
|
|
# Meta-config files contain multiple INI-style configuration files
|
|
# using a specific new section header to delimit them:
|
|
#
|
|
# [[group-name|file-name]]
|
|
#
|
|
# group-name refers to the group of configuration file changes to be processed
|
|
# at a particular time. These are called phases in ``stack.sh`` but
|
|
# group here as these functions are not DevStack-specific.
|
|
#
|
|
# file-name is the destination of the config file
|
|
|
|
# Save trace setting
|
|
C_XTRACE=$(set +o | grep xtrace)
|
|
set +o xtrace
|
|
|
|
|
|
# Allow the awk command to be overridden on legacy platforms
|
|
CONFIG_AWK_CMD=${CONFIG_AWK_CMD:-awk}
|
|
|
|
# Get the section for the specific group and config file
|
|
# get_meta_section infile group configfile
|
|
function get_meta_section() {
|
|
local file=$1
|
|
local matchgroup=$2
|
|
local configfile=$3
|
|
|
|
[[ -r $file ]] || return 0
|
|
[[ -z $configfile ]] && return 0
|
|
|
|
$CONFIG_AWK_CMD -v matchgroup=$matchgroup -v configfile=$configfile '
|
|
BEGIN { group = "" }
|
|
/^\[\[.+|.*\]\]/ {
|
|
if (group == "") {
|
|
gsub("[][]", "", $1);
|
|
split($1, a, "|");
|
|
if (a[1] == matchgroup && a[2] == configfile) {
|
|
group=a[1]
|
|
}
|
|
} else {
|
|
group=""
|
|
}
|
|
next
|
|
}
|
|
{
|
|
if (group != "")
|
|
print $0
|
|
}
|
|
' $file
|
|
}
|
|
|
|
|
|
# Get a list of config files for a specific group
|
|
# get_meta_section_files infile group
|
|
function get_meta_section_files() {
|
|
local file=$1
|
|
local matchgroup=$2
|
|
|
|
[[ -r $file ]] || return 0
|
|
|
|
$CONFIG_AWK_CMD -v matchgroup=$matchgroup '
|
|
/^\[\[.+\|.*\]\]/ {
|
|
gsub("[][]", "", $1);
|
|
split($1, a, "|");
|
|
if (a[1] == matchgroup)
|
|
print a[2]
|
|
}
|
|
' $file
|
|
}
|
|
|
|
|
|
# Merge the contents of a meta-config file into its destination config file
|
|
# If configfile does not exist it will be created.
|
|
# merge_config_file infile group configfile
|
|
function merge_config_file() {
|
|
local file=$1
|
|
local matchgroup=$2
|
|
local configfile=$3
|
|
|
|
[[ -r $configfile ]] || touch $configfile
|
|
|
|
get_meta_section $file $matchgroup $configfile | \
|
|
$CONFIG_AWK_CMD -v configfile=$configfile '
|
|
BEGIN { section = "" }
|
|
/^\[.+\]/ {
|
|
gsub("[][]", "", $1);
|
|
section=$1
|
|
next
|
|
}
|
|
/^ *\#/ {
|
|
next
|
|
}
|
|
/^.+/ {
|
|
split($0, d, " *= *")
|
|
print "iniset " configfile " " section " " d[1] " \"" d[2] "\""
|
|
}
|
|
' | while read a; do eval "$a"; done
|
|
|
|
}
|
|
|
|
|
|
# Merge all of the files specified by group
|
|
# merge_config_group infile group [group ...]
|
|
function merge_config_group() {
|
|
local localfile=$1; shift
|
|
local matchgroups=$@
|
|
|
|
[[ -r $localfile ]] || return 0
|
|
|
|
for group in $matchgroups; do
|
|
for configfile in $(get_meta_section_files $localfile $group); do
|
|
if [[ -d $(dirname $configfile) ]]; then
|
|
merge_config_file $localfile $group $configfile
|
|
fi
|
|
done
|
|
done
|
|
}
|
|
|
|
|
|
# Restore xtrace
|
|
$C_XTRACE
|
|
|
|
# Local variables:
|
|
# mode: shell-script
|
|
# End:
|