Magellan Linux

Contents of /trunk/mage/usr/lib/mage/etc-update

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1544 - (show annotations) (download)
Tue Dec 27 09:06:04 2011 UTC (12 years, 4 months ago) by niro
File size: 10545 byte(s)
-fixed header
1 #!/bin/bash
2 # $Id$
3 #
4 # Copyright 1999-2004 Gentoo Foundation
5 # Distributed under the terms of the GNU General Public License v2
6 # $Header: /home/cvsd/magellan-cvs/magellan-src/mage/usr/lib/mage/etc-update,v 1.7 2005-10-26 08:11:30 niro Exp $
7
8 # Author Brandon Low <lostlogic@gentoo.org>
9 #
10 # Previous version (from which I've borrowed a few bits) by:
11 # Jochem Kossen <j.kossen@home.nl>
12 # Leo Lipelis <aeoo@gentoo.org>
13 # Karl Trygve Kalleberg <karltk@gentoo.org>
14 #
15
16 # Modified by Niels Rogalla <niro@magellan-linux.de> to use this with Magellan-Linux
17 # version: 0.4.0-r8
18
19 export PORTAGE_CALLER="etc-update"
20
21 function get_config() {
22 item=$1
23
24 # First strip off comment lines, then grab the configuration
25 # item. If there's more than one of the same configuration item,
26 # then allow the last setting to take precedence.
27 cut -d'#' -f1-1 /etc/etc-update.conf | \
28 sed -ne "s/^ *$item *= *\([\"']\{0,1\}\)\(.*\)\1/\2/p" |sed -e '$p;d'
29 }
30
31 function scan() {
32
33 echo "Scanning Configuration files..."
34 rm -rf ${TMP}/files > /dev/null 2>&1
35 mkdir ${TMP}/files || die "Failed mkdir command!" 1
36 count=0
37 input=0
38
39 for path in ${CONFIG_PROTECT}; do if [ -d ${path} ]; then
40 ofile=""
41 for file in `find ${path}/ -iname "._cfg????_*" |
42 sed -e "s:\(^.*/\)\(\._cfg[0-9]*_\)\(.*$\):\1\2\3\%\2\%\3:" |
43 sort -t'%' -k3 -k2 | LANG=POSIX LC_ALL=POSIX cut -f1 -d'%'`; do
44 rpath=`echo "${file/\/\///}" | sed -e "s:/[^/]*$::"`
45 rfile=`echo "${file/\/\///}" | sed -e "s:^.*/::"`
46 for mpath in ${CONFIG_PROTECT_MASK}; do
47 if [[ "${rpath}" == "${mpath}"* ]]; then
48 mv ${rpath}/${rfile} ${rpath}/${rfile:10}
49 break
50 fi
51 done
52 [ ! -f ${file} ] && continue
53
54
55 if [[ "${ofile:10}" != "${rfile:10}" ]] ||
56 [[ ${opath} != ${rpath} ]]; then
57 MATCHES=0
58 if [[ "${EU_AUTOMERGE}" == "yes" ]]; then
59 if [ ! -e "${rpath}/${rfile}" ] || [ ! -e "${rpath}/${rfile:10}" ]; then
60 MATCHES=0
61 else
62 diff -Bbua ${rpath}/${rfile} ${rpath}/${rfile:10} | egrep '^[+-]' | egrep -v '^[+-][\t ]*#|^--- |^\+\+\+ ' | egrep -qv '^[-+][\t ]*$'
63 MATCHES=$?
64 fi
65 elif [[ -z `diff -Nua ${rpath}/${rfile} ${rpath}/${rfile:10}|
66 grep "^[+-][^+-]"|grep -v '# .Header:.*'` ]]; then
67 MATCHES=1
68 fi
69 if [[ "${MATCHES}" == "1" ]]; then
70 echo "Automerging trivial changes in: ${rfile:10}"
71 mv ${rpath}/${rfile} ${rpath}/${rfile:10}
72 continue
73 else
74 count=${count}+1
75 echo "${rpath}/${rfile:10}" > ${TMP}/files/${count}
76 echo "${rpath}/${rfile}" >> ${TMP}/files/${count}
77 ofile="${rfile}"
78 opath="${rpath}"
79 continue
80 fi
81 fi
82
83 if [[ -z `diff -Nua ${rpath}/${rfile} ${rpath}/${ofile}|
84 grep "^[+-][^+-]"|grep -v '# .Header:.*'` ]]; then
85 mv ${rpath}/${rfile} ${rpath}/${ofile}
86 continue
87 else
88 echo "${rpath}/${rfile}" >> ${TMP}/files/${count}
89 ofile="${rfile}"
90 opath="${rpath}"
91 fi
92 done
93 fi; done
94
95 }
96
97 function sel_file() {
98 local -i isfirst=0
99 until [ -f ${TMP}/files/${input} ] || [ ${input} == -1 ] || [ ${input} == -3 ]; do
100 for file in `ls ${TMP}/files|sort -n`; do
101 if (( ${isfirst} == 0 )); then
102 isfirst=${file}
103 fi
104 echo -n "${file}${PAR} "
105 if (( ${mode} == 0 )); then
106 for word in `cat ${TMP}/files/${file}`; do
107 echo ${word}
108 done
109 else
110 head -n1 ${TMP}/files/${file}
111 fi
112 done > ${TMP}/menuitems
113
114 if [ "${OVERWRITE_ALL}" == "yes" ]; then
115 input=0
116 else
117 if (( ${mode} == 0 )); then
118 echo "The following is the list of files which need updating, each
119 configuration file is followed by a list of possible replacement files."
120 else
121 local my_title="Please select a file to update"
122 fi
123
124 if (( ${mode} == 0 )); then
125 cat ${TMP}/menuitems
126 echo "Please select a file to edit by entering the corresponding number."
127 echo " (don't use -3 or -5 if you're unsure what to do)"
128 echo " (-1 to exit) (-3 to auto merge all remaining files)"
129 echo -n " (-5 to auto-merge AND not use 'mv -i'): "
130 read input
131 else
132 dialog --title "${title}" --menu "${my_title}" \
133 0 0 0 `echo "-1 Exit";cat ${TMP}/menuitems` \
134 2> ${TMP}/input
135 input=`cat ${TMP}/input`
136 fi
137 if (( ${input} == -5 )); then
138 input=-3
139 export mv_opts=""
140 fi
141 if (( ${input} == -3 )); then
142 input=0
143 export OVERWRITE_ALL="yes"
144 fi
145 fi # -3 automerge
146 if (( ${input} == 0 )); then
147 input=${isfirst}
148 fi
149 done
150 }
151
152 function do_file() {
153 echo
154 local -i my_input
155 local -i fcount=0
156 until (( `cat ${TMP}/files/${input}|wc -l` < 2 )); do
157 my_input=0
158 if (( `cat ${TMP}/files/${input}|wc -l` == 2 )); then
159 my_input=1
160 fi
161 until (( ${my_input} > 0 )) && (( ${my_input} < `cat ${TMP}/files/${input}|wc -l` )); do
162 fcount=0
163
164 if [ "${OVERWRITE_ALL}" == "yes" ]; then
165 my_input=0
166 else
167 for line in `cat ${TMP}/files/${input}`; do
168 if (( ${fcount} > 0 )); then
169 echo -n "${fcount}${PAR} "
170 echo "${line}"
171 else
172 if (( ${mode} == 0 )); then
173 echo "Below are the new config files for ${line}:"
174 else
175 local my_title="Please select a file to process for ${line}"
176 fi
177 fi
178 fcount=${fcount}+1
179 done > ${TMP}/menuitems
180
181 if (( ${mode} == 0 )); then
182 cat ${TMP}/menuitems
183 echo -n "Please select a file to process (-1 to exit this file): "
184 read my_input
185 else
186 dialog --title "${title}" --menu "${my_title}" \
187 0 0 0 `cat ${TMP}/menuitems;echo "${fcount} Exit"` \
188 2> ${TMP}/input
189 my_input=`cat ${TMP}/input`
190 fi
191 fi # OVERWRITE_ALL
192
193 if (( ${my_input} == 0 )); then
194 my_input=1
195 elif (( ${my_input} == -1 )); then
196 input=0
197 return
198 elif (( ${my_input} == ${fcount} )); then
199 break
200 fi
201 done
202 if (( ${my_input} == ${fcount} )); then
203 break
204 fi
205
206 fcount=${my_input}+1
207
208 file=`cat ${TMP}/files/${input} | sed -e "${fcount}p;d"`
209 ofile=`head -n1 ${TMP}/files/${input}`
210
211 do_cfg "${file}" "${ofile}"
212
213 cat ${TMP}/files/${input}|sed -e "${fcount}!p;d" > ${TMP}/files/sed
214 mv ${TMP}/files/sed ${TMP}/files/${input}
215
216 if (( ${my_input} == -1 )); then
217 break
218 fi
219 done
220 echo
221 rm ${TMP}/files/${input}
222 count=${count}-1
223 }
224
225 function do_cfg() {
226
227 local file="${1}"
228 local ofile="${2}"
229 local -i my_input=0
230
231 until (( ${my_input} == -1 )) || [ ! -f ${file} ]; do
232 if [ "${OVERWRITE_ALL}" == "yes" ]; then
233 my_input=1
234 else
235 showdiffcmd=$(echo "${diff_command}" |
236 sed -e "s:%file1:${ofile}:" -e "s:%file2:${file}:")
237
238 if [ "${using_editor}" == 0 ]; then
239 (
240 echo "Showing differences between ${ofile} and ${file}"
241 ${showdiffcmd}
242 ) | ${pager}
243 else
244 echo "Beginning of differences between ${ofile} and ${file}"
245 ${showdiffcmd}
246 echo "End of differences between ${ofile} and ${file}"
247 fi
248 if [ -L "${file}" ]; then
249 echo
250 echo "-------------------------------------------------------------"
251 echo "NOTE: File is a symlink to another file. REPLACE recommended."
252 echo " The original file may simply have moved. Please review."
253 echo "-------------------------------------------------------------"
254 echo
255 fi
256 echo -n "1) Replace original with update
257 2) Delete update, keeping original as is
258 3) Interactively merge original with update
259 4) Show differences again
260 Please select from the menu above (-1 to ignore this update): "
261 read my_input
262 fi
263
264 case ${my_input} in
265 1) echo "Replacing ${ofile} with ${file}"
266 mv ${mv_opts} ${file} ${ofile}
267 my_input=-1
268 continue
269 ;;
270 2) echo "Deleting ${file}"
271 rm ${rm_opts} ${file}
272 continue
273 ;;
274 3) do_merge "${file}" "${ofile}"
275 my_input=${?}
276 # [ ${my_input} == 255 ] && my_input=-1
277 continue
278 ;;
279 4) continue
280 ;;
281 *) continue
282 ;;
283 esac
284 done
285 }
286
287 function do_merge() {
288
289 local file="${1}"
290 local ofile="${2}"
291 local mfile="${2}.merged"
292 local -i my_input=0
293 echo "${file} ${ofile} ${mfile}"
294
295 if [ -e ${mfile} ] ; then
296 echo "A previous version of the merged file exists, cleaning..."
297 rm ${rm_opts} ${mfile}
298 fi
299
300 until (( ${my_input} == -1 )); do
301 echo "Merging ${file} and ${ofile}"
302 `echo "${merge_command}" |
303 sed -e "s:%merged:${mfile}:g" \
304 -e "s:%orig:${ofile}:g" \
305 -e "s:%new:${file}:g"`
306 until (( ${my_input} == -1 )); do
307 echo -n "1) Replace ${ofile} with merged file
308 2) Show differences between merged file and original
309 3) Remerge original with update
310 4) Edit merged file
311 5) Return to the previous menu
312 Please select from the menu above (-1 to exit, losing this merge): "
313 read my_input
314 case ${my_input} in
315 1) echo "Replacing ${ofile} with ${mfile}"
316 chmod --reference=${ofile} ${mfile}
317 mv ${mv_opts} ${mfile} ${ofile}
318 rm ${rm_opts} ${file}
319 return 255
320 ;;
321 2) ( echo "Showing differences between ${ofile} and ${mfile}"
322 `echo "${diff_command}" | \
323 sed -e "s:%file1:${ofile}:" \
324 -e "s:%file2:${mfile}:"` ) | ${pager}
325 continue
326 ;;
327 3) break
328 ;;
329 4) ${EDITOR:-nano -w} "${mfile}"
330 continue
331 ;;
332 5) rm ${rm_opts} ${mfile}
333 return 0
334 ;;
335 *) continue
336 ;;
337 esac
338 done
339 done
340 rm ${rm_opts} ${mfile}
341 return 255
342 }
343
344 function die() {
345 trap "" term
346 trap "" kill
347 echo "Exiting: ${1}"
348 rm -rf ${TMP}
349 exit ${2}
350 }
351
352 #
353 # Run the script
354 #
355 scriptname=`basename $0`
356
357 trap die term
358
359 TMP="/tmp/$$"
360 rm -rf ${TMP} 2> /dev/null
361 mkdir ${TMP} || die "failed mkdir command!" 1
362
363 # I need the CONFIG_PROTECT value
364 #CONFIG_PROTECT=$(/usr/lib/portage/bin/portageq config_protect)
365 #CONFIG_PROTECT_MASK=$(/usr/lib/portage/bin/portageq config_protect_mask)
366 source /etc/profile
367
368 # load etc-config's configuration
369 EU_AUTOMERGE=`get_config eu_automerge`
370 rm_opts=`get_config rm_opts`
371 mv_opts=`get_config mv_opts`
372 cp_opts=`get_config cp_opts`
373 pager=`get_config pager`
374 diff_command=`get_config diff_command`
375 using_editor=`get_config using_editor`
376 merge_command=`get_config merge_command`
377 declare -i mode=`get_config mode`
378 [ -z ${mode} ] && mode=0
379 [ -z "${pager}" ] && pager="cat"
380
381 #echo "rm_opts: $rm_opts, mv_opts: $mv_opts, cp_opts: $cp_opts"
382 #echo "pager: $pager, diff_command: $diff_command, merge_command: $merge_command"
383
384 if (( ${mode} == 0 )); then
385 PAR=")"
386 else
387 PAR=""
388 fi
389
390 declare -i count=0
391 declare -i input=0
392 declare title="Gentoolkit's etc-update tool!"
393
394 scan
395
396 until (( ${input} == -1 )); do
397 if (( ${count} == 0 )); then
398 die "Nothing left to do; exiting. :)" 0
399 fi
400 sel_file
401 if (( ${input} != -1 )); then
402 do_file
403 fi
404 done
405
406 die "User termination!" 0

Properties

Name Value
svn:executable *