Browse code

Add -sudo option to ini setting options

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

Ian Wienand authored on 2015/07/22 09:34:47
Showing 2 changed files
... ...
@@ -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