Add a -sudo option to allow these functions to operate on root-owned
files. Test-case is updated, but not enabled by default as we can't
expect test-runner to have sudo access.
Change-Id: I134c3397314c7d9395996eb6c825ecb7e7fdfc69
| ... | ... |
@@ -15,30 +15,40 @@ set +o xtrace |
| 15 | 15 |
# ================ |
| 16 | 16 |
|
| 17 | 17 |
# Append a new option in an ini file without replacing the old value |
| 18 |
-# iniadd config-file section option value1 value2 value3 ... |
|
| 18 |
+# iniadd [-sudo] config-file section option value1 value2 value3 ... |
|
| 19 | 19 |
function iniadd {
|
| 20 | 20 |
local xtrace=$(set +o | grep xtrace) |
| 21 | 21 |
set +o xtrace |
| 22 |
+ local sudo="" |
|
| 23 |
+ if [ $1 == "-sudo" ]; then |
|
| 24 |
+ sudo="-sudo " |
|
| 25 |
+ shift |
|
| 26 |
+ fi |
|
| 22 | 27 |
local file=$1 |
| 23 | 28 |
local section=$2 |
| 24 | 29 |
local option=$3 |
| 25 | 30 |
shift 3 |
| 26 | 31 |
|
| 27 | 32 |
local values="$(iniget_multiline $file $section $option) $@" |
| 28 |
- iniset_multiline $file $section $option $values |
|
| 33 |
+ iniset_multiline $sudo $file $section $option $values |
|
| 29 | 34 |
$xtrace |
| 30 | 35 |
} |
| 31 | 36 |
|
| 32 | 37 |
# Comment an option in an INI file |
| 33 |
-# inicomment config-file section option |
|
| 38 |
+# inicomment [-sudo] config-file section option |
|
| 34 | 39 |
function inicomment {
|
| 35 | 40 |
local xtrace=$(set +o | grep xtrace) |
| 36 | 41 |
set +o xtrace |
| 42 |
+ local sudo="" |
|
| 43 |
+ if [ $1 == "-sudo" ]; then |
|
| 44 |
+ sudo="sudo " |
|
| 45 |
+ shift |
|
| 46 |
+ fi |
|
| 37 | 47 |
local file=$1 |
| 38 | 48 |
local section=$2 |
| 39 | 49 |
local option=$3 |
| 40 | 50 |
|
| 41 |
- sed -i -e "/^\[$section\]/,/^\[.*\]/ s|^\($option[ \t]*=.*$\)|#\1|" "$file" |
|
| 51 |
+ $sudo sed -i -e "/^\[$section\]/,/^\[.*\]/ s|^\($option[ \t]*=.*$\)|#\1|" "$file" |
|
| 42 | 52 |
$xtrace |
| 43 | 53 |
} |
| 44 | 54 |
|
| ... | ... |
@@ -95,10 +105,15 @@ function ini_has_option {
|
| 95 | 95 |
# in the argument list. Doing that will cause incorrect configuration |
| 96 | 96 |
# if spaces are used in the config values. |
| 97 | 97 |
# |
| 98 |
-# iniadd_literal config-file section option value |
|
| 98 |
+# iniadd_literal [-sudo] config-file section option value |
|
| 99 | 99 |
function iniadd_literal {
|
| 100 | 100 |
local xtrace=$(set +o | grep xtrace) |
| 101 | 101 |
set +o xtrace |
| 102 |
+ local sudo="" |
|
| 103 |
+ if [ $1 == "-sudo" ]; then |
|
| 104 |
+ sudo="sudo " |
|
| 105 |
+ shift |
|
| 106 |
+ fi |
|
| 102 | 107 |
local file=$1 |
| 103 | 108 |
local section=$2 |
| 104 | 109 |
local option=$3 |
| ... | ... |
@@ -110,7 +125,7 @@ function iniadd_literal {
|
| 110 | 110 |
fi |
| 111 | 111 |
|
| 112 | 112 |
# Add it |
| 113 |
- sed -i -e "/^\[$section\]/ a\\ |
|
| 113 |
+ $sudo sed -i -e "/^\[$section\]/ a\\ |
|
| 114 | 114 |
$option = $value |
| 115 | 115 |
" "$file" |
| 116 | 116 |
|
| ... | ... |
@@ -118,10 +133,15 @@ $option = $value |
| 118 | 118 |
} |
| 119 | 119 |
|
| 120 | 120 |
# Remove an option from an INI file |
| 121 |
-# inidelete config-file section option |
|
| 121 |
+# inidelete [-sudo] config-file section option |
|
| 122 | 122 |
function inidelete {
|
| 123 | 123 |
local xtrace=$(set +o | grep xtrace) |
| 124 | 124 |
set +o xtrace |
| 125 |
+ local sudo="" |
|
| 126 |
+ if [ $1 == "-sudo" ]; then |
|
| 127 |
+ sudo="sudo " |
|
| 128 |
+ shift |
|
| 129 |
+ fi |
|
| 125 | 130 |
local file=$1 |
| 126 | 131 |
local section=$2 |
| 127 | 132 |
local option=$3 |
| ... | ... |
@@ -132,16 +152,21 @@ function inidelete {
|
| 132 | 132 |
fi |
| 133 | 133 |
|
| 134 | 134 |
# Remove old values |
| 135 |
- sed -i -e "/^\[$section\]/,/^\[.*\]/ { /^$option[ \t]*=/ d; }" "$file"
|
|
| 135 |
+ $sudo sed -i -e "/^\[$section\]/,/^\[.*\]/ { /^$option[ \t]*=/ d; }" "$file"
|
|
| 136 | 136 |
|
| 137 | 137 |
$xtrace |
| 138 | 138 |
} |
| 139 | 139 |
|
| 140 | 140 |
# Set an option in an INI file |
| 141 |
-# iniset config-file section option value |
|
| 141 |
+# iniset [-sudo] config-file section option value |
|
| 142 | 142 |
function iniset {
|
| 143 | 143 |
local xtrace=$(set +o | grep xtrace) |
| 144 | 144 |
set +o xtrace |
| 145 |
+ local sudo="" |
|
| 146 |
+ if [ $1 == "-sudo" ]; then |
|
| 147 |
+ sudo="sudo " |
|
| 148 |
+ shift |
|
| 149 |
+ fi |
|
| 145 | 150 |
local file=$1 |
| 146 | 151 |
local section=$2 |
| 147 | 152 |
local option=$3 |
| ... | ... |
@@ -154,26 +179,31 @@ function iniset {
|
| 154 | 154 |
|
| 155 | 155 |
if ! grep -q "^\[$section\]" "$file" 2>/dev/null; then |
| 156 | 156 |
# Add section at the end |
| 157 |
- echo -e "\n[$section]" >>"$file" |
|
| 157 |
+ echo -e "\n[$section]" | $sudo tee --append "$file" > /dev/null |
|
| 158 | 158 |
fi |
| 159 | 159 |
if ! ini_has_option "$file" "$section" "$option"; then |
| 160 | 160 |
# Add it |
| 161 |
- sed -i -e "/^\[$section\]/ a\\ |
|
| 161 |
+ $sudo sed -i -e "/^\[$section\]/ a\\ |
|
| 162 | 162 |
$option = $value |
| 163 | 163 |
" "$file" |
| 164 | 164 |
else |
| 165 | 165 |
local sep=$(echo -ne "\x01") |
| 166 | 166 |
# Replace it |
| 167 |
- sed -i -e '/^\['${section}'\]/,/^\[.*\]/ s'${sep}'^\('${option}'[ \t]*=[ \t]*\).*$'${sep}'\1'"${value}"${sep} "$file"
|
|
| 167 |
+ $sudo sed -i -e '/^\['${section}'\]/,/^\[.*\]/ s'${sep}'^\('${option}'[ \t]*=[ \t]*\).*$'${sep}'\1'"${value}"${sep} "$file"
|
|
| 168 | 168 |
fi |
| 169 | 169 |
$xtrace |
| 170 | 170 |
} |
| 171 | 171 |
|
| 172 | 172 |
# Set a multiple line option in an INI file |
| 173 |
-# iniset_multiline config-file section option value1 value2 valu3 ... |
|
| 173 |
+# iniset_multiline [-sudo] config-file section option value1 value2 valu3 ... |
|
| 174 | 174 |
function iniset_multiline {
|
| 175 | 175 |
local xtrace=$(set +o | grep xtrace) |
| 176 | 176 |
set +o xtrace |
| 177 |
+ local sudo="" |
|
| 178 |
+ if [ $1 == "-sudo" ]; then |
|
| 179 |
+ sudo="sudo " |
|
| 180 |
+ shift |
|
| 181 |
+ fi |
|
| 177 | 182 |
local file=$1 |
| 178 | 183 |
local section=$2 |
| 179 | 184 |
local option=$3 |
| ... | ... |
@@ -188,14 +218,14 @@ function iniset_multiline {
|
| 188 | 188 |
done |
| 189 | 189 |
if ! grep -q "^\[$section\]" "$file"; then |
| 190 | 190 |
# Add section at the end |
| 191 |
- echo -e "\n[$section]" >>"$file" |
|
| 191 |
+ echo -e "\n[$section]" | $sudo tee --append "$file" > /dev/null |
|
| 192 | 192 |
else |
| 193 | 193 |
# Remove old values |
| 194 |
- sed -i -e "/^\[$section\]/,/^\[.*\]/ { /^$option[ \t]*=/ d; }" "$file"
|
|
| 194 |
+ $sudo sed -i -e "/^\[$section\]/,/^\[.*\]/ { /^$option[ \t]*=/ d; }" "$file"
|
|
| 195 | 195 |
fi |
| 196 | 196 |
# Add new ones |
| 197 | 197 |
for v in $values; do |
| 198 |
- sed -i -e "/^\[$section\]/ a\\ |
|
| 198 |
+ $sudo sed -i -e "/^\[$section\]/ a\\ |
|
| 199 | 199 |
$option = $v |
| 200 | 200 |
" "$file" |
| 201 | 201 |
done |
| ... | ... |
@@ -207,10 +237,15 @@ $option = $v |
| 207 | 207 |
function iniuncomment {
|
| 208 | 208 |
local xtrace=$(set +o | grep xtrace) |
| 209 | 209 |
set +o xtrace |
| 210 |
+ local sudo="" |
|
| 211 |
+ if [ $1 == "-sudo" ]; then |
|
| 212 |
+ sudo="sudo " |
|
| 213 |
+ shift |
|
| 214 |
+ fi |
|
| 210 | 215 |
local file=$1 |
| 211 | 216 |
local section=$2 |
| 212 | 217 |
local option=$3 |
| 213 |
- sed -i -e "/^\[$section\]/,/^\[.*\]/ s|[^ \t]*#[ \t]*\($option[ \t]*=.*$\)|\1|" "$file" |
|
| 218 |
+ $sudo sed -i -e "/^\[$section\]/,/^\[.*\]/ s|[^ \t]*#[ \t]*\($option[ \t]*=.*$\)|\1|" "$file" |
|
| 214 | 219 |
$xtrace |
| 215 | 220 |
} |
| 216 | 221 |
|
| ... | ... |
@@ -71,15 +71,23 @@ b=d |
| 71 | 71 |
|
| 72 | 72 |
EOF |
| 73 | 73 |
|
| 74 |
-# Test with missing arguments |
|
| 74 |
+# set TEST_SUDO to test writing to root-owned files |
|
| 75 |
+SUDO_ARG="" |
|
| 76 |
+SUDO="" |
|
| 77 |
+if [ -n "$TEST_SUDO" ]; then |
|
| 78 |
+ SUDO="sudo " |
|
| 79 |
+ SUDO_ARG="-sudo " |
|
| 80 |
+ sudo chown -R root:root ${INI_TMP_ETC_DIR}
|
|
| 81 |
+fi |
|
| 75 | 82 |
|
| 83 |
+# Test with missing arguments |
|
| 76 | 84 |
BEFORE=$(cat ${TEST_INI})
|
| 77 | 85 |
|
| 78 |
-iniset ${TEST_INI} aaa
|
|
| 86 |
+iniset ${SUDO_ARG} ${TEST_INI} aaa
|
|
| 79 | 87 |
NO_ATTRIBUTE=$(cat ${TEST_INI})
|
| 80 | 88 |
assert_equal "$BEFORE" "$NO_ATTRIBUTE" "test missing attribute argument" |
| 81 | 89 |
|
| 82 |
-iniset ${TEST_INI}
|
|
| 90 |
+iniset ${SUDO_ARG} ${TEST_INI}
|
|
| 83 | 91 |
NO_SECTION=$(cat ${TEST_INI})
|
| 84 | 92 |
assert_equal "$BEFORE" "$NO_SECTION" "missing section argument" |
| 85 | 93 |
|
| ... | ... |
@@ -87,7 +95,7 @@ assert_equal "$BEFORE" "$NO_SECTION" "missing section argument" |
| 87 | 87 |
VAL=$(iniget ${TEST_INI} aaa handlers)
|
| 88 | 88 |
assert_equal "$VAL" "aa, bb" "iniget spaces in option" |
| 89 | 89 |
|
| 90 |
-iniset ${TEST_INI} aaa handlers "11, 22"
|
|
| 90 |
+iniset ${SUDO_ARG} ${TEST_INI} aaa handlers "11, 22"
|
|
| 91 | 91 |
VAL=$(iniget ${TEST_INI} aaa handlers)
|
| 92 | 92 |
assert_equal "$VAL" "11, 22" "iniset spaces in option" |
| 93 | 93 |
|
| ... | ... |
@@ -95,7 +103,7 @@ assert_equal "$VAL" "11, 22" "iniset spaces in option" |
| 95 | 95 |
VAL=$(iniget ${TEST_INI} " ccc " spaces)
|
| 96 | 96 |
assert_equal "$VAL" "yes" "iniget with section header space" |
| 97 | 97 |
|
| 98 |
-iniset ${TEST_INI} "b b" opt_ion 42
|
|
| 98 |
+iniset ${SUDO_ARG} ${TEST_INI} "b b" opt_ion 42
|
|
| 99 | 99 |
VAL=$(iniget ${TEST_INI} "b b" opt_ion)
|
| 100 | 100 |
assert_equal "$VAL" "42" "iniset with section header space" |
| 101 | 101 |
|
| ... | ... |
@@ -103,7 +111,7 @@ assert_equal "$VAL" "42" "iniset with section header space" |
| 103 | 103 |
VAL=$(iniget ${TEST_INI} bbb handlers)
|
| 104 | 104 |
assert_equal "$VAL" "ee,ff" "iniget at EOF" |
| 105 | 105 |
|
| 106 |
-iniset ${TEST_INI} bbb handlers "33,44"
|
|
| 106 |
+iniset ${SUDO_ARG} ${TEST_INI} bbb handlers "33,44"
|
|
| 107 | 107 |
VAL=$(iniget ${TEST_INI} bbb handlers)
|
| 108 | 108 |
assert_equal "$VAL" "33,44" "inset at EOF" |
| 109 | 109 |
|
| ... | ... |
@@ -122,12 +130,12 @@ else |
| 122 | 122 |
fi |
| 123 | 123 |
|
| 124 | 124 |
# test changing empty option |
| 125 |
-iniset ${TEST_INI} ddd empty "42"
|
|
| 125 |
+iniset ${SUDO_ARG} ${TEST_INI} ddd empty "42"
|
|
| 126 | 126 |
VAL=$(iniget ${TEST_INI} ddd empty)
|
| 127 | 127 |
assert_equal "$VAL" "42" "change empty option" |
| 128 | 128 |
|
| 129 | 129 |
# test pipe in option |
| 130 |
-iniset ${TEST_INI} aaa handlers "a|b"
|
|
| 130 |
+iniset ${SUDO_ARG} ${TEST_INI} aaa handlers "a|b"
|
|
| 131 | 131 |
VAL=$(iniget ${TEST_INI} aaa handlers)
|
| 132 | 132 |
assert_equal "$VAL" "a|b" "pipe in option" |
| 133 | 133 |
|
| ... | ... |
@@ -146,23 +154,23 @@ else |
| 146 | 146 |
fi |
| 147 | 147 |
|
| 148 | 148 |
# Test comments |
| 149 |
-inicomment ${TEST_INI} aaa handlers
|
|
| 149 |
+inicomment ${SUDO_ARG} ${TEST_INI} aaa handlers
|
|
| 150 | 150 |
VAL=$(iniget ${TEST_INI} aaa handlers)
|
| 151 | 151 |
assert_empty VAL "test inicomment" |
| 152 | 152 |
|
| 153 | 153 |
# Test multiple line iniset/iniget |
| 154 |
-iniset_multiline ${TEST_INI} eee multi bar1 bar2
|
|
| 154 |
+iniset_multiline ${SUDO_ARG} ${TEST_INI} eee multi bar1 bar2
|
|
| 155 | 155 |
|
| 156 | 156 |
VAL=$(iniget_multiline ${TEST_INI} eee multi)
|
| 157 | 157 |
assert_equal "$VAL" "bar1 bar2" "iniget_multiline" |
| 158 | 158 |
|
| 159 | 159 |
# Test iniadd with exiting values |
| 160 |
-iniadd ${TEST_INI} eee multi bar3
|
|
| 160 |
+iniadd ${SUDO_ARG} ${TEST_INI} eee multi bar3
|
|
| 161 | 161 |
VAL=$(iniget_multiline ${TEST_INI} eee multi)
|
| 162 | 162 |
assert_equal "$VAL" "bar1 bar2 bar3" "iniadd with existing values" |
| 163 | 163 |
|
| 164 | 164 |
# Test iniadd with non-exiting values |
| 165 |
-iniadd ${TEST_INI} eee non-multi foobar1 foobar2
|
|
| 165 |
+iniadd ${SUDO_ARG} ${TEST_INI} eee non-multi foobar1 foobar2
|
|
| 166 | 166 |
VAL=$(iniget_multiline ${TEST_INI} eee non-multi)
|
| 167 | 167 |
assert_equal "$VAL" "foobar1 foobar2" "iniadd non-existing values" |
| 168 | 168 |
|
| ... | ... |
@@ -176,7 +184,7 @@ del_cases=" |
| 176 | 176 |
del_no_section" |
| 177 | 177 |
|
| 178 | 178 |
for x in $del_cases; do |
| 179 |
- inidelete ${TEST_INI} $x a
|
|
| 179 |
+ inidelete ${SUDO_ARG} ${TEST_INI} $x a
|
|
| 180 | 180 |
VAL=$(iniget_multiline ${TEST_INI} $x a)
|
| 181 | 181 |
assert_empty VAL "inidelete $x" |
| 182 | 182 |
if [ "$x" = "del_separate_options" -o \ |
| ... | ... |
@@ -191,6 +199,6 @@ for x in $del_cases; do |
| 191 | 191 |
fi |
| 192 | 192 |
done |
| 193 | 193 |
|
| 194 |
-rm -rf ${INI_TMP_DIR}
|
|
| 194 |
+$SUDO rm -rf ${INI_TMP_DIR}
|
|
| 195 | 195 |
|
| 196 | 196 |
report_results |