OpenWrt – Diff between revs 2 and 3

Subversion Repositories:
Rev:
Show entire fileIgnore whitespace
Rev 2 Rev 3
Line 2... Line 2...
2   2  
3 . /lib/functions.sh 3 . /lib/functions.sh
Line 4... Line 4...
4 . /lib/functions/system.sh 4 . /lib/functions/system.sh
5   -  
6 # initialize defaults 5  
7 export MTD_ARGS="" 6 # initialize defaults
8 export MTD_CONFIG_ARGS="" 7 export MTD_CONFIG_ARGS=""
9 export INTERACTIVE=0 8 export INTERACTIVE=0
10 export VERBOSE=1 9 export VERBOSE=1
11 export SAVE_CONFIG=1 -  
12 export SAVE_OVERLAY=0 10 export SAVE_CONFIG=1
13 export SAVE_OVERLAY_PATH= -  
14 export SAVE_PARTITIONS=1 -  
15 export SAVE_INSTALLED_PKGS=0 11 export SAVE_OVERLAY=0
16 export SKIP_UNCHANGED=0 12 export SAVE_PARTITIONS=1
17 export CONF_IMAGE= 13 export CONF_IMAGE=
18 export CONF_BACKUP_LIST=0 14 export CONF_BACKUP_LIST=0
19 export CONF_BACKUP= 15 export CONF_BACKUP=
20 export CONF_RESTORE= 16 export CONF_RESTORE=
21 export NEED_IMAGE= 17 export NEED_IMAGE=
22 export HELP=0 18 export HELP=0
23 export FORCE=0 -  
Line 24... Line 19...
24 export TEST=0 19 export FORCE=0
25 export UMOUNT_ETCBACKUP_DIR=0 20 export TEST=0
26   21  
27 # parse options 22 # parse options
28 while [ -n "$1" ]; do 23 while [ -n "$1" ]; do
29 case "$1" in 24 case "$1" in
30 -i) export INTERACTIVE=1;; 25 -i) export INTERACTIVE=1;;
31 -v) export VERBOSE="$(($VERBOSE + 1))";; -  
32 -q) export VERBOSE="$(($VERBOSE - 1))";; 26 -v) export VERBOSE="$(($VERBOSE + 1))";;
33 -n) export SAVE_CONFIG=0;; 27 -q) export VERBOSE="$(($VERBOSE - 1))";;
34 -c) export SAVE_OVERLAY=1 SAVE_OVERLAY_PATH=/etc;; -  
35 -o) export SAVE_OVERLAY=1 SAVE_OVERLAY_PATH=/;; -  
36 -p) export SAVE_PARTITIONS=0;; 28 -n) export SAVE_CONFIG=0;;
37 -k) export SAVE_INSTALLED_PKGS=1;; 29 -c) export SAVE_OVERLAY=1;;
38 -u) export SKIP_UNCHANGED=1;; 30 -p) export SAVE_PARTITIONS=0;;
39 -b|--create-backup) export CONF_BACKUP="$2" NEED_IMAGE=1; shift;; 31 -b|--create-backup) export CONF_BACKUP="$2" NEED_IMAGE=1; shift;;
40 -r|--restore-backup) export CONF_RESTORE="$2" NEED_IMAGE=1; shift;; 32 -r|--restore-backup) export CONF_RESTORE="$2" NEED_IMAGE=1; shift;;
41 -l|--list-backup) export CONF_BACKUP_LIST=1;; 33 -l|--list-backup) export CONF_BACKUP_LIST=1; break;;
42 -f) export CONF_IMAGE="$2"; shift;; 34 -f) export CONF_IMAGE="$2"; shift;;
43 -F|--force) export FORCE=1;; 35 -F|--force) export FORCE=1;;
44 -T|--test) export TEST=1;; 36 -T|--test) export TEST=1;;
45 -h|--help) export HELP=1; break;; 37 -h|--help) export HELP=1; break;;
46 -*) 38 -*)
47 echo "Invalid option: $1" >&2 39 echo "Invalid option: $1"
48 exit 1 40 exit 1
49 ;; 41 ;;
50 *) break;; 42 *) break;;
Line 51... Line 43...
51 esac 43 esac
52 shift; 44 shift;
53 done -  
54   -  
Line 55... Line 45...
55 export CONFFILES=/tmp/sysupgrade.conffiles 45 done
Line 56... Line 46...
56 export CONF_TAR=/tmp/sysupgrade.tgz 46  
57 export ETCBACKUP_DIR=/etc/backup 47 export CONFFILES=/tmp/sysupgrade.conffiles
58 export INSTALLED_PACKAGES=${ETCBACKUP_DIR}/installed_packages.txt 48 export CONF_TAR=/tmp/sysupgrade.tgz
59   49  
Line 60... Line 50...
60 IMAGE="$1" 50 IMAGE="$1"
61   51  
62 [ -z "$IMAGE" -a -z "$NEED_IMAGE" -a $CONF_BACKUP_LIST -eq 0 -o $HELP -gt 0 ] && { 52 [ -z "$IMAGE" -a -z "$NEED_IMAGE" -o $HELP -gt 0 ] && {
63 cat <<EOF 53 cat <<EOF
64 Usage: $0 [<upgrade-option>...] <image file or URL> -  
65 $0 [-q] [-i] [-c] [-u] [-o] [-k] <backup-command> <file> -  
66   -  
67 upgrade-option: 54 Usage: $0 [<upgrade-option>...] <image file or URL>
68 -f <config> restore configuration from .tar.gz (file or url) 55 $0 [-q] [-i] <backup-command> <file>
69 -i interactive mode -  
70 -c attempt to preserve all changed files in /etc/ -  
71 -o attempt to preserve all changed files in /, except those 56  
72 from packages but including changed confs. 57 upgrade-option:
73 -u skip from backup files that are equal to those in /rom 58 -f <config> restore configuration from .tar.gz (file or url)
74 -n do not save configuration over reflash 59 -i interactive mode
75 -p do not attempt to restore the partition table after flash. 60 -c attempt to preserve all changed files in /etc/
Line 128... Line 113...
128   113  
129 echo "${csum} ${file}" | sha256sum -sc - || echo "$file" 114 echo "${csum} ${file}" | sha256sum -sc - || echo "$file"
130 done 115 done
Line 131... Line 116...
131 } 116 }
132   117  
133 add_conffiles() { 118 add_uci_conffiles() {
134 local file="$1" 119 local file="$1"
135 ( find $(sed -ne '/^[[:space:]]*$/d; /^#/d; p' \ 120 ( find $(sed -ne '/^[[:space:]]*$/d; /^#/d; p' \
136 /etc/sysupgrade.conf /lib/upgrade/keep.d/* 2>/dev/null) \ 121 /etc/sysupgrade.conf /lib/upgrade/keep.d/* 2>/dev/null) \
137 \( -type f -o -type l \) $find_filter 2>/dev/null; 122 -type f -o -type l 2>/dev/null;
138 list_changed_conffiles ) | sort -u > "$file" 123 list_changed_conffiles ) | sort -u > "$file"
Line 139... Line 124...
139 return 0 124 return 0
140 } 125 }
141   -  
142 add_overlayfiles() { -  
143 local file="$1" -  
144   -  
145 local packagesfiles=$1.packagesfiles -  
146 touch "$packagesfiles" -  
147   -  
148 if [ "$SAVE_OVERLAY_PATH" = / ]; then -  
149 local conffiles=$1.conffiles -  
150 local keepfiles=$1.keepfiles -  
151   -  
152 list_conffiles | cut -f2 -d ' ' | sort -u > "$conffiles" -  
153   -  
154 # backup files from /etc/sysupgrade.conf and /lib/upgrade/keep.d, but -  
155 # ignore those aready controlled by opkg conffiles -  
156 find $(sed -ne '/^[[:space:]]*$/d; /^#/d; p' \ -  
157 /etc/sysupgrade.conf /lib/upgrade/keep.d/* 2>/dev/null) \ -  
158 \( -type f -o -type l \) 2>/dev/null | sort -u | -  
159 grep -h -v -x -F -f $conffiles > "$keepfiles" -  
160   -  
161 # backup conffiles, but only those changed if '-u' -  
162 [ $SKIP_UNCHANGED = 1 ] && -  
163 list_changed_conffiles | sort -u > "$conffiles" -  
164   -  
165 # do not backup files from packages, except those listed -  
166 # in conffiles and keep.d 126  
167 { -  
168 find /usr/lib/opkg/info -type f -name "*.list" -exec cat {} \; -  
169 find /usr/lib/opkg/info -type f -name "*.control" -exec sed \ -  
170 -ne '/^Alternatives/{s/^Alternatives: //;s/, /\n/g;p}' {} \; | -  
171 cut -f2 -d: 127 add_overlayfiles() {
172 } | grep -v -x -F -f $conffiles | -  
173 grep -v -x -F -f $keepfiles | sort -u > "$packagesfiles" -  
174 rm -f "$keepfiles" "$conffiles" -  
175 fi -  
176   -  
177 # busybox grep bug when file is empty -  
178 [ -s "$packagesfiles" ] || echo > $packagesfiles 128 local file="$1"
179   129 find /overlay/upper/etc/ -type f -o -type l | sed \
180 ( cd /overlay/upper/; find .$SAVE_OVERLAY_PATH \( -type f -o -type l \) $find_filter | sed \ 130 -e 's,^/overlay\/upper/,/,' \
181 -e 's,^\.,,' \ -  
182 -e '\,^/etc/board.json$,d' \ -  
183 -e '\,/[^/]*-opkg$,d' \ -  
184 -e '\,^/etc/urandom.seed$,d' \ -  
185 -e "\,^$INSTALLED_PACKAGES$,d" \ -  
186 -e '\,^/usr/lib/opkg/.*,d' \ 131 -e '\,/META_[a-zA-Z0-9]*$,d' \
187 ) | grep -v -x -F -f $packagesfiles > "$file" -  
188   132 -e '\,/functions.sh$,d' \
189 rm -f "$packagesfiles" 133 -e '\,/[^/]*-opkg$,d' \
Line 190... Line 134...
190   134 > "$file"
191 return 0 135 return 0
Line 192... Line 136...
192 } 136 }
193   137  
194 # hooks 138 # hooks
195 sysupgrade_image_check="fwtool_check_signature fwtool_check_image platform_check_image" 139 sysupgrade_image_check="fwtool_check_image platform_check_image"
196   140  
197 if [ $SAVE_OVERLAY = 1 ]; then 141 if [ $SAVE_OVERLAY = 1 ]; then
198 [ ! -d /overlay/upper/etc ] && { 142 [ ! -d /overlay/upper/etc ] && {
199 echo "Cannot find '/overlay/upper/etc', required for '-c'" >&2 143 echo "Cannot find '/overlay/upper/etc', required for '-c'"
200 exit 1 -  
201 } -  
202 sysupgrade_init_conffiles="add_overlayfiles" -  
203 else -  
204 sysupgrade_init_conffiles="add_conffiles" -  
205 fi -  
206   -  
207 find_filter="" -  
208 if [ $SKIP_UNCHANGED = 1 ]; then -  
209 [ ! -d /rom/ ] && { 144 exit 1
Line 210... Line 145...
210 echo "'/rom/' is required by '-u'" 145 }
Line 211... Line 146...
211 exit 1 146 sysupgrade_init_conffiles="add_overlayfiles"
212 } 147 else
Line 213... Line 148...
213 find_filter='( ( -exec test -e /rom/{} ; -exec cmp -s /{} /rom/{} ; ) -o -print )' 148 sysupgrade_init_conffiles="add_uci_conffiles"
214 fi 149 fi
215   150  
216 include /lib/upgrade 151 include /lib/upgrade
217   152  
218 do_save_conffiles() { 153 do_save_conffiles() {
219 local conf_tar="$1" 154 local conf_tar="${1:-$CONF_TAR}"
220   155  
Line 221... Line -...
221 [ -z "$(rootfs_type)" ] && { -  
222 echo "Cannot save config while running from ramdisk." >&2 -  
223 ask_bool 0 "Abort" && exit -  
224 rm -f "$conf_tar" -  
225 return 0 -  
226 } -  
227 run_hooks "$CONFFILES" $sysupgrade_init_conffiles -  
228 ask_bool 0 "Edit config file list" && vi "$CONFFILES" -  
229   -  
230 if [ "$SAVE_INSTALLED_PKGS" -eq 1 ]; then -  
231 echo "${INSTALLED_PACKAGES}" >> "$CONFFILES" -  
232 mkdir -p "$ETCBACKUP_DIR" -  
233 # Avoid touching filesystem on each backup -  
234 RAMFS="$(mktemp -d -t sysupgrade.XXXXXX)" -  
235 mkdir -p "$RAMFS/upper" "$RAMFS/work" -  
236 mount -t overlay overlay -o lowerdir=$ETCBACKUP_DIR,upperdir=$RAMFS/upper,workdir=$RAMFS/work $ETCBACKUP_DIR && -  
237 UMOUNT_ETCBACKUP_DIR=1 || { -  
238 echo "Cannot mount '$ETCBACKUP_DIR' as tmpfs to avoid touching disk while saving the list of installed packages." >&2 -  
239 ask_bool 0 "Abort" && exit -  
240 } -  
241   -  
242 # Format: pkg-name<TAB>{rom,overlay,unkown} 156 [ -z "$(rootfs_type)" ] && {
243 # rom is used for pkgs in /rom, even if updated later 157 echo "Cannot save config while running from ramdisk."
244 find /usr/lib/opkg/info -name "*.control" \( \ 158 ask_bool 0 "Abort" && exit
245 \( -exec test -f /rom/{} \; -exec echo {} rom \; \) -o \ -  
246 \( -exec test -f /overlay/upper/{} \; -exec echo {} overlay \; \) -o \ -  
247 \( -exec echo {} unknown \; \) \ -  
248 \) | sed -e 's,.*/,,;s/\.control /\t/' > ${INSTALLED_PACKAGES} -  
249 fi -  
Line 250... Line -...
250   -  
251 v "Saving config files..." -  
252 [ "$VERBOSE" -gt 1 ] && TAR_V="v" || TAR_V="" -  
253 tar c${TAR_V}zf "$conf_tar" -T "$CONFFILES" 2>/dev/null -  
254 if [ "$?" -ne 0 ]; then 159 rm -f "$conf_tar"
255 echo "Failed to create the configuration backup." 160 return 0
Line 256... Line 161...
256 rm -f "$conf_tar" 161 }
257 exit 1 162 run_hooks "$CONFFILES" $sysupgrade_init_conffiles
258 fi -  
259   163 ask_bool 0 "Edit config file list" && vi "$CONFFILES"
260 [ "$UMOUNT_ETCBACKUP_DIR" -eq 1 ] && { 164  
261 umount "$ETCBACKUP_DIR" 165 v "Saving config files..."
262 rm -rf "$RAMFS" 166 [ "$VERBOSE" -gt 1 ] && TAR_V="v" || TAR_V=""
Line 277... Line 181...
277 exit $? 181 exit $?
278 fi 182 fi
Line 279... Line 183...
279   183  
280 if [ -n "$CONF_RESTORE" ]; then 184 if [ -n "$CONF_RESTORE" ]; then
281 if [ "$CONF_RESTORE" != "-" ] && [ ! -f "$CONF_RESTORE" ]; then 185 if [ "$CONF_RESTORE" != "-" ] && [ ! -f "$CONF_RESTORE" ]; then
282 echo "Backup archive '$CONF_RESTORE' not found." >&2 186 echo "Backup archive '$CONF_RESTORE' not found."
283 exit 1 187 exit 1
Line 284... Line 188...
284 fi 188 fi
285   189  
286 [ "$VERBOSE" -gt 1 ] && TAR_V="v" || TAR_V="" 190 [ "$VERBOSE" -gt 1 ] && TAR_V="v" || TAR_V=""
287 tar -C / -x${TAR_V}zf "$CONF_RESTORE" 191 tar -C / -x${TAR_V}zf "$CONF_RESTORE"
Line 288... Line 192...
288 exit $? 192 exit $?
289 fi 193 fi
290   194  
291 type platform_check_image >/dev/null 2>/dev/null || { 195 type platform_check_image >/dev/null 2>/dev/null || {
Line 292... Line 196...
292 echo "Firmware upgrade is not implemented for this platform." >&2 196 echo "Firmware upgrade is not implemented for this platform."
293 exit 1 -  
294 } 197 exit 1
295   198 }
296 case "$IMAGE" in 199  
297 http://*|\ 200 case "$IMAGE" in
298 https://*) 201 http://*)
Line 299... Line 202...
299 wget -O/tmp/sysupgrade.img "$IMAGE" 202 wget -O/tmp/sysupgrade.img "$IMAGE"
Line 300... Line 203...
300 IMAGE=/tmp/sysupgrade.img 203 IMAGE=/tmp/sysupgrade.img
301 ;; 204 ;;
302 esac 205 esac
303   206  
304 IMAGE="$(readlink -f "$IMAGE")" 207 IMAGE="$(readlink -f "$IMAGE")"
305   208  
306 case "$IMAGE" in 209 case "$IMAGE" in
307 '') 210 '')
Line 320... Line 223...
320 export ARGC=1 223 export ARGC=1
Line 321... Line 224...
321   224  
322 for check in $sysupgrade_image_check; do 225 for check in $sysupgrade_image_check; do
323 ( $check "$IMAGE" ) || { 226 ( $check "$IMAGE" ) || {
324 if [ $FORCE -eq 1 ]; then 227 if [ $FORCE -eq 1 ]; then
325 echo "Image check '$check' failed but --force given - will update anyway!" >&2 228 echo "Image check '$check' failed but --force given - will update anyway!"
326 break 229 break
327 else 230 else
328 echo "Image check '$check' failed." >&2 231 echo "Image check '$check' failed."
329 exit 1 232 exit 1
330 fi 233 fi
331 } 234 }
Line 332... Line 235...
332 done 235 done
333   236  
334 if [ -n "$CONF_IMAGE" ]; then 237 if [ -n "$CONF_IMAGE" ]; then
335 case "$(get_magic_word $CONF_IMAGE cat)" in 238 case "$(get_magic_word $CONF_IMAGE cat)" in
336 # .gz files 239 # .gz files
337 1f8b) ;; 240 1f8b) ;;
338 *) 241 *)
339 echo "Invalid config file. Please use only .tar.gz files" >&2 242 echo "Invalid config file. Please use only .tar.gz files"
340 exit 1 243 exit 1
341 ;; 244 ;;
342 esac 245 esac
343 get_image "$CONF_IMAGE" "cat" > "$CONF_TAR" 246 get_image "$CONF_IMAGE" "cat" > "$CONF_TAR"
344 export SAVE_CONFIG=1 247 export SAVE_CONFIG=1
345 elif ask_bool $SAVE_CONFIG "Keep config files over reflash"; then 248 elif ask_bool $SAVE_CONFIG "Keep config files over reflash"; then
346 [ $TEST -eq 1 ] || do_save_conffiles "$CONF_TAR" 249 [ $TEST -eq 1 ] || do_save_conffiles
347 export SAVE_CONFIG=1 250 export SAVE_CONFIG=1
348 else 251 else
349 [ $TEST -eq 1 ] || rm -f "$CONF_TAR" 252 [ $TEST -eq 1 ] || rm -f "$CONF_TAR"