
This patch fixes an issue in iniset where backslash (\) characters are removed from the config value. This patch ensures that backslash characters (\) are escaped in addition to the ampersand (&) character that was already being escaped. Closes-Bug: #2120180 Signed-off-by: Douglas Mendizábal <dmendiza@redhat.com> Change-Id: Ica53ed42269931d151daf815d2e2c10c1f9e29a8
459 lines
12 KiB
Bash
459 lines
12 KiB
Bash
#!/bin/bash
|
|
#
|
|
# **inc/ini-config** - Configuration/INI functions
|
|
#
|
|
# Support for manipulating INI-style configuration files
|
|
#
|
|
# These functions have no external dependencies and no side-effects
|
|
|
|
# Save trace setting
|
|
INC_CONF_TRACE=$(set +o | grep xtrace)
|
|
set +o xtrace
|
|
|
|
|
|
# Config Functions
|
|
# ================
|
|
|
|
# Append a new option in an ini file without replacing the old value
|
|
# iniadd [-sudo] config-file section option value1 value2 value3 ...
|
|
function iniadd {
|
|
local xtrace
|
|
xtrace=$(set +o | grep xtrace)
|
|
set +o xtrace
|
|
local sudo=""
|
|
if [ $1 == "-sudo" ]; then
|
|
sudo="-sudo "
|
|
shift
|
|
fi
|
|
local file=$1
|
|
local section=$2
|
|
local option=$3
|
|
shift 3
|
|
|
|
local values
|
|
values="$(iniget_multiline $file $section $option) $@"
|
|
iniset_multiline $sudo $file $section $option $values
|
|
$xtrace
|
|
}
|
|
|
|
# Comment an option in an INI file
|
|
# inicomment [-sudo] config-file section option
|
|
function inicomment {
|
|
local xtrace
|
|
xtrace=$(set +o | grep xtrace)
|
|
set +o xtrace
|
|
local sudo=""
|
|
if [ $1 == "-sudo" ]; then
|
|
sudo="sudo "
|
|
shift
|
|
fi
|
|
local file=$1
|
|
local section=$2
|
|
local option=$3
|
|
|
|
$sudo sed -i -e "/^\[$section\]/,/^\[.*\]/ s|^\($option[ \t]*=.*$\)|#\1|" "$file"
|
|
$xtrace
|
|
}
|
|
|
|
# Get an option from an INI file
|
|
# iniget config-file section option
|
|
function iniget {
|
|
local xtrace
|
|
xtrace=$(set +o | grep xtrace)
|
|
set +o xtrace
|
|
local file=$1
|
|
local section=$2
|
|
local option=$3
|
|
local line
|
|
|
|
line=$(sed -ne "/^\[$section\]/,/^\[.*\]/ { /^$option[ \t]*=/ p; }" "$file")
|
|
echo ${line#*=}
|
|
$xtrace
|
|
}
|
|
|
|
# Get a multiple line option from an INI file
|
|
# iniget_multiline config-file section option
|
|
function iniget_multiline {
|
|
local xtrace
|
|
xtrace=$(set +o | grep xtrace)
|
|
set +o xtrace
|
|
local file=$1
|
|
local section=$2
|
|
local option=$3
|
|
local values
|
|
|
|
values=$(sed -ne "/^\[$section\]/,/^\[.*\]/ { s/^$option[ \t]*=[ \t]*//gp; }" "$file")
|
|
echo ${values}
|
|
$xtrace
|
|
}
|
|
|
|
# Determinate is the given option present in the INI file
|
|
# ini_has_option [-sudo] config-file section option
|
|
function ini_has_option {
|
|
local xtrace
|
|
xtrace=$(set +o | grep xtrace)
|
|
set +o xtrace
|
|
local sudo=""
|
|
if [ $1 == "-sudo" ]; then
|
|
sudo="sudo "
|
|
shift
|
|
fi
|
|
local file=$1
|
|
local section=$2
|
|
local option=$3
|
|
local line
|
|
|
|
line=$($sudo sed -ne "/^\[$section\]/,/^\[.*\]/ { /^$option[ \t]*=/ p; }" "$file")
|
|
$xtrace
|
|
[ -n "$line" ]
|
|
}
|
|
|
|
# Add another config line for a multi-line option.
|
|
# It's normally called after iniset of the same option and assumes
|
|
# that the section already exists.
|
|
#
|
|
# Note that iniset_multiline requires all the 'lines' to be supplied
|
|
# in the argument list. Doing that will cause incorrect configuration
|
|
# if spaces are used in the config values.
|
|
#
|
|
# iniadd_literal [-sudo] config-file section option value
|
|
function iniadd_literal {
|
|
local xtrace
|
|
xtrace=$(set +o | grep xtrace)
|
|
set +o xtrace
|
|
local sudo=""
|
|
if [ $1 == "-sudo" ]; then
|
|
sudo="sudo "
|
|
shift
|
|
fi
|
|
local file=$1
|
|
local section=$2
|
|
local option=$3
|
|
local value=$4
|
|
|
|
if [[ -z $section || -z $option ]]; then
|
|
$xtrace
|
|
return
|
|
fi
|
|
|
|
# Add it
|
|
$sudo sed -i -e "/^\[$section\]/ a\\
|
|
$option = $value
|
|
" "$file"
|
|
|
|
$xtrace
|
|
}
|
|
|
|
# Remove an option from an INI file
|
|
# inidelete [-sudo] config-file section option
|
|
function inidelete {
|
|
local xtrace
|
|
xtrace=$(set +o | grep xtrace)
|
|
set +o xtrace
|
|
local sudo=""
|
|
if [ $1 == "-sudo" ]; then
|
|
sudo="sudo "
|
|
shift
|
|
fi
|
|
local file=$1
|
|
local section=$2
|
|
local option=$3
|
|
|
|
if [[ -z $section || -z $option ]]; then
|
|
$xtrace
|
|
return
|
|
fi
|
|
|
|
# Remove old values
|
|
$sudo sed -i -e "/^\[$section\]/,/^\[.*\]/ { /^$option[ \t]*=/ d; }" "$file"
|
|
|
|
$xtrace
|
|
}
|
|
|
|
# Set an option in an INI file
|
|
# iniset [-sudo] config-file section option value
|
|
# - if the file does not exist, it is created
|
|
function iniset {
|
|
local xtrace
|
|
xtrace=$(set +o | grep xtrace)
|
|
set +o xtrace
|
|
local sudo=""
|
|
local sudo_option=""
|
|
if [ $1 == "-sudo" ]; then
|
|
sudo="sudo "
|
|
sudo_option="-sudo "
|
|
shift
|
|
fi
|
|
local file=$1
|
|
local section=$2
|
|
local option=$3
|
|
local value=$4
|
|
|
|
# Escape the ampersand (&) and backslash (\) characters for sed
|
|
# Order of substitution matters: we escape backslashes first before
|
|
# adding more backslashes to escape ampersands
|
|
value=$(echo $value | sed -e 's/\\/\\\\/g' -e 's/&/\\&/g')
|
|
|
|
if [[ -z $section || -z $option ]]; then
|
|
$xtrace
|
|
return
|
|
fi
|
|
|
|
if ! $sudo grep -q "^\[$section\]" "$file" 2>/dev/null; then
|
|
# Add section at the end
|
|
echo -e "\n[$section]" | $sudo tee --append "$file" > /dev/null
|
|
fi
|
|
if ! ini_has_option $sudo_option "$file" "$section" "$option"; then
|
|
# Add it
|
|
$sudo sed -i -e "/^\[$section\]/ a\\
|
|
$option = $value
|
|
" "$file"
|
|
else
|
|
local sep
|
|
sep=$(echo -ne "\x01")
|
|
# Replace it
|
|
$sudo sed -i -e '/^\['${section}'\]/,/^\[.*\]/ s'${sep}'^\('"${option}"'[ \t]*=[ \t]*\).*$'${sep}'\1'"${value}"${sep} "$file"
|
|
fi
|
|
$xtrace
|
|
}
|
|
|
|
# Set a multiple line option in an INI file
|
|
# iniset_multiline [-sudo] config-file section option value1 value2 value3 ...
|
|
function iniset_multiline {
|
|
local xtrace
|
|
xtrace=$(set +o | grep xtrace)
|
|
set +o xtrace
|
|
local sudo=""
|
|
if [ $1 == "-sudo" ]; then
|
|
sudo="sudo "
|
|
shift
|
|
fi
|
|
local file=$1
|
|
local section=$2
|
|
local option=$3
|
|
|
|
shift 3
|
|
local values
|
|
for v in $@; do
|
|
# The later sed command inserts each new value in the line next to
|
|
# the section identifier, which causes the values to be inserted in
|
|
# the reverse order. Do a reverse here to keep the original order.
|
|
values="$v ${values}"
|
|
done
|
|
if ! $sudo grep -q "^\[$section\]" "$file"; then
|
|
# Add section at the end
|
|
echo -e "\n[$section]" | $sudo tee --append "$file" > /dev/null
|
|
else
|
|
# Remove old values
|
|
$sudo sed -i -e "/^\[$section\]/,/^\[.*\]/ { /^$option[ \t]*=/ d; }" "$file"
|
|
fi
|
|
# Add new ones
|
|
for v in $values; do
|
|
$sudo sed -i -e "/^\[$section\]/ a\\
|
|
$option = $v
|
|
" "$file"
|
|
done
|
|
$xtrace
|
|
}
|
|
|
|
# Uncomment an option in an INI file
|
|
# iniuncomment config-file section option
|
|
function iniuncomment {
|
|
local xtrace
|
|
xtrace=$(set +o | grep xtrace)
|
|
set +o xtrace
|
|
local sudo=""
|
|
if [ $1 == "-sudo" ]; then
|
|
sudo="sudo "
|
|
shift
|
|
fi
|
|
local file=$1
|
|
local section=$2
|
|
local option=$3
|
|
$sudo sed -i -e "/^\[$section\]/,/^\[.*\]/ s|[^ \t]*#[ \t]*\($option[ \t]*=.*$\)|\1|" "$file"
|
|
$xtrace
|
|
}
|
|
|
|
# Get list of sections from an INI file
|
|
# iniget_sections config-file
|
|
function iniget_sections {
|
|
local xtrace
|
|
xtrace=$(set +o | grep xtrace)
|
|
set +o xtrace
|
|
local file=$1
|
|
|
|
echo $(sed -ne "s/^\[\(.*\)\]/\1/p" "$file")
|
|
$xtrace
|
|
}
|
|
|
|
# Set a localrc var
|
|
function localrc_set {
|
|
local file=$1
|
|
local group="local"
|
|
local conf="localrc"
|
|
local section=""
|
|
local option=$2
|
|
local value=$3
|
|
localconf_set "$file" "$group" "$conf" "$section" "$option" "$value"
|
|
}
|
|
|
|
# Check if local.conf has section.
|
|
function localconf_has_section {
|
|
local file=$1
|
|
local group=$2
|
|
local conf=$3
|
|
local section=$4
|
|
local sep
|
|
sep=$(echo -ne "\x01")
|
|
local line
|
|
line=$(sed -ne "\\${sep}^\[\[${group}|${conf}\]\]${sep},\\${sep}\[\[.*\]\]${sep}{
|
|
/\[${section}\]/p
|
|
}" "$file")
|
|
[ -n "$line" ]
|
|
}
|
|
|
|
# Check if local.conf has option.
|
|
function localconf_has_option {
|
|
local file=$1
|
|
local group=$2
|
|
local conf=$3
|
|
local section=$4
|
|
local option=$5
|
|
local sep
|
|
sep=$(echo -ne "\x01")
|
|
local line
|
|
if [[ -z "$section" ]]; then
|
|
line=$(sed -ne "\\${sep}^\[\[${group}|${conf}\]\]${sep},\\${sep}\[\[.*\]\]${sep}{
|
|
/${option}[ \t]*=.*$/p
|
|
}" "$file")
|
|
else
|
|
line=$(sed -ne "\\${sep}^\[\[${group}|${conf}\]\]${sep},\\${sep}\[\[.*\]\]${sep}{
|
|
/\[${section}\]/,/\[\[.*\]\]\|\[.*\]/{
|
|
/${option}[ \t]*=.*$/p}
|
|
}" "$file")
|
|
fi
|
|
[ -n "$line" ]
|
|
}
|
|
|
|
# Update option in local.conf.
|
|
function localconf_update_option {
|
|
local sudo=$1
|
|
local file=$2
|
|
local group=$3
|
|
local conf=$4
|
|
local section=$5
|
|
local option=$6
|
|
local value=$7
|
|
local sep
|
|
sep=$(echo -ne "\x01")
|
|
if [[ -z "$section" ]]; then
|
|
$sudo sed -i -e "\\${sep}^\[\[${group}|${conf}\]\]${sep},\\${sep}\[\[.*\]\]${sep}{
|
|
s${sep}^\(${option}[ \t]*=[ \t]*\).*\$${sep}\1${value}${sep}
|
|
}" "$file"
|
|
else
|
|
$sudo sed -i -e "\\${sep}^\[\[${group}|${conf}\]\]${sep},\\${sep}\[\[.*\]\]${sep}{
|
|
/\[${section}\]/,/\[\[.*\]\]\|\[.*\]/s${sep}^\(${option}[ \t]*=[ \t]*\).*\$${sep}\1${value}${sep}
|
|
}" "$file"
|
|
fi
|
|
}
|
|
|
|
# Add option in local.conf.
|
|
function localconf_add_option {
|
|
local sudo=$1
|
|
local file=$2
|
|
local group=$3
|
|
local conf=$4
|
|
local section=$5
|
|
local option=$6
|
|
local value=$7
|
|
local sep
|
|
sep=$(echo -ne "\x01")
|
|
if [[ -z "$section" ]]; then
|
|
$sudo sed -i -e "\\${sep}^\[\[${group}|${conf}\]\]${sep} a $option=$value" "$file"
|
|
else
|
|
$sudo sed -i -e "\\${sep}^\[\[${group}|${conf}\]\]${sep},\\${sep}\[\[.*\]\]${sep}{
|
|
/\[${section}\]/ a $option=$value
|
|
}" "$file"
|
|
fi
|
|
}
|
|
|
|
# Add section and option in local.conf.
|
|
function localconf_add_section_and_option {
|
|
local sudo=$1
|
|
local file=$2
|
|
local group=$3
|
|
local conf=$4
|
|
local section=$5
|
|
local option=$6
|
|
local value=$7
|
|
local sep
|
|
sep=$(echo -ne "\x01")
|
|
$sudo sed -i -e "\\${sep}^\[\[${group}|${conf}\]\]${sep} {
|
|
a [$section]
|
|
a $option=$value
|
|
}" "$file"
|
|
}
|
|
|
|
# Set an option in a local.conf file.
|
|
# localconf_set [-sudo] config-file group conf-name section option value
|
|
# - if the file does not exist, it is created
|
|
function localconf_set {
|
|
local xtrace
|
|
xtrace=$(set +o | grep xtrace)
|
|
set +o xtrace
|
|
local sep
|
|
sep=$(echo -ne "\x01")
|
|
local sudo=""
|
|
if [ $1 == "-sudo" ]; then
|
|
sudo="sudo "
|
|
shift
|
|
fi
|
|
local file=$1
|
|
local group=$2
|
|
local conf=$3
|
|
local section=$4
|
|
local option=$5
|
|
local value=$6
|
|
|
|
if [[ -z $group || -z $conf || -z $option || -z $value ]]; then
|
|
$xtrace
|
|
return
|
|
fi
|
|
|
|
if ! grep -q "^\[\[${group}|${conf}\]\]" "$file" 2>/dev/null; then
|
|
# Add meta section at the end if it does not exist
|
|
echo -e "\n[[${group}|${conf}]]" | $sudo tee --append "$file" > /dev/null
|
|
# Add section at the end
|
|
if [[ -n "$section" ]]; then
|
|
echo -e "[$section]" | $sudo tee --append "$file" > /dev/null
|
|
fi
|
|
# Add option at the end
|
|
echo -e "$option=$value" | $sudo tee --append "$file" > /dev/null
|
|
elif [[ -z "$section" ]]; then
|
|
if ! localconf_has_option "$file" "$group" "$conf" "$section" "$option"; then
|
|
# Add option
|
|
localconf_add_option "$sudo" "$file" "$group" "$conf" "$section" "$option" "$value"
|
|
else
|
|
# Replace it
|
|
localconf_update_option "$sudo" "$file" "$group" "$conf" "$section" "$option" "$value"
|
|
fi
|
|
elif ! localconf_has_section "$file" "$group" "$conf" "$section"; then
|
|
# Add section and option in specified meta section
|
|
localconf_add_section_and_option "$sudo" "$file" "$group" "$conf" "$section" "$option" "$value"
|
|
elif ! localconf_has_option "$file" "$group" "$conf" "$section" "$option"; then
|
|
# Add option
|
|
localconf_add_option "$sudo" "$file" "$group" "$conf" "$section" "$option" "$value"
|
|
else
|
|
# Replace it
|
|
localconf_update_option "$sudo" "$file" "$group" "$conf" "$section" "$option" "$value"
|
|
fi
|
|
$xtrace
|
|
}
|
|
|
|
# Restore xtrace
|
|
$INC_CONF_TRACE
|
|
|
|
# Local variables:
|
|
# mode: shell-script
|
|
# End:
|