Milton D. Miller II | d89d5e0 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 1 | #!/bin/sh |
2 | |||||
3 | echo update: "$@" | ||||
4 | |||||
5 | export PS1=update-sh#\ | ||||
6 | # exec /bin/sh | ||||
7 | |||||
8 | cd / | ||||
9 | if ! test -r /proc/mounts || ! test -f /proc/mounts | ||||
10 | then | ||||
11 | mkdir -p /proc | ||||
12 | mount -t proc proc proc | ||||
13 | fi | ||||
14 | if ! test -d /sys/class | ||||
15 | then | ||||
16 | mkdir -p /sys | ||||
17 | mount -t sysfs sys sys | ||||
18 | fi | ||||
19 | if ! test -c /dev/null | ||||
20 | then | ||||
21 | mkdir -p /dev | ||||
22 | mount -t devtmpfs dev dev | ||||
23 | fi | ||||
24 | while grep mtd /proc/mounts | ||||
25 | do | ||||
26 | echo 1>&2 "Error: A mtd device is mounted." | ||||
27 | sulogin | ||||
28 | # exec /bin/sh | ||||
29 | done | ||||
30 | |||||
31 | findmtd() { | ||||
32 | m=$(grep -xl "$1" /sys/class/mtd/*/name) | ||||
33 | m=${m%/name} | ||||
34 | m=${m##*/} | ||||
35 | echo $m | ||||
36 | } | ||||
37 | |||||
Andrew Jeffery | acc2c85 | 2016-02-23 23:47:23 +1030 | [diff] [blame] | 38 | blkid_fs_type() { |
39 | # Emulate util-linux's `blkid -s TYPE -o value $1` | ||||
40 | # Example busybox blkid output: | ||||
41 | # # blkid /dev/mtdblock5 | ||||
42 | # /dev/mtdblock5: TYPE="squashfs" | ||||
43 | # Process output to extract TYPE value "squashfs". | ||||
44 | blkid $1 | sed -e 's/^.*TYPE="//' -e 's/".*$//' | ||||
45 | } | ||||
46 | |||||
47 | probe_fs_type() { | ||||
48 | fst=$(blkid_fs_type $1) | ||||
49 | echo ${fst:=jffs2} | ||||
50 | } | ||||
51 | |||||
Milton D. Miller II | d89d5e0 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 52 | rwfs=$(findmtd rwfs) |
53 | |||||
Milton Miller | 54d882e | 2016-02-05 12:07:53 -0600 | [diff] [blame] | 54 | rwdev=/dev/mtdblock${rwfs#mtd} |
Milton Miller | 54d882e | 2016-02-05 12:07:53 -0600 | [diff] [blame] | 55 | rwopts=rw |
56 | rorwopts=ro${rwopts#rw} | ||||
57 | |||||
Milton D. Miller II | 8ad2be5 | 2016-02-28 16:07:46 -0600 | [diff] [blame] | 58 | rwdir=/run/initramfs/rw |
Milton Miller | 54d882e | 2016-02-05 12:07:53 -0600 | [diff] [blame] | 59 | upper=$rwdir/cow |
Milton D. Miller II | 07b26cd | 2016-02-29 10:32:58 -0600 | [diff] [blame] | 60 | save=/run/save/${upper##*/} |
Milton D. Miller II | d89d5e0 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 61 | |
Milton D. Miller II | 01fe134 | 2016-02-29 21:34:43 -0600 | [diff] [blame] | 62 | mounted= |
Milton D. Miller II | 30ef963 | 2016-02-28 16:32:14 -0600 | [diff] [blame] | 63 | doclean= |
Milton D. Miller II | 08afa53 | 2016-02-29 23:11:27 -0600 | [diff] [blame] | 64 | dosave=y |
65 | dorestore=y | ||||
Milton D. Miller II | 20b647e | 2016-02-29 21:44:22 -0600 | [diff] [blame] | 66 | toram= |
Milton D. Miller II | 30ef963 | 2016-02-28 16:32:14 -0600 | [diff] [blame] | 67 | |
Milton D. Miller II | 1790e04 | 2016-02-29 11:39:11 -0600 | [diff] [blame] | 68 | whitelist=/run/initramfs/whitelist |
69 | image=/run/initramfs/image- | ||||
70 | |||||
Milton D. Miller II | 30ef963 | 2016-02-28 16:32:14 -0600 | [diff] [blame] | 71 | while test "$1" != "${1#-}" |
72 | do | ||||
73 | case "$1" in | ||||
74 | --no-clean-saved-files) | ||||
75 | doclean= | ||||
76 | shift ;; | ||||
77 | --clean-saved-files) | ||||
78 | doclean=y | ||||
79 | shift ;; | ||||
Milton D. Miller II | 08afa53 | 2016-02-29 23:11:27 -0600 | [diff] [blame] | 80 | --no-save-files) |
81 | dosave= | ||||
82 | shift ;; | ||||
83 | --save-files) | ||||
84 | dosave=y | ||||
85 | shift ;; | ||||
86 | --no-restore-files) | ||||
87 | dorestore= | ||||
88 | shift ;; | ||||
89 | --restore-files) | ||||
90 | dorestore=y | ||||
91 | shift ;; | ||||
Milton D. Miller II | 20b647e | 2016-02-29 21:44:22 -0600 | [diff] [blame] | 92 | --copy-files) |
93 | toram=y | ||||
94 | shift ;; | ||||
Milton D. Miller II | 30ef963 | 2016-02-28 16:32:14 -0600 | [diff] [blame] | 95 | *) |
96 | echo 2>&1 "Unknown option $1" | ||||
97 | exit 1 ;; | ||||
98 | esac | ||||
99 | done | ||||
100 | |||||
Milton D. Miller II | 01fe134 | 2016-02-29 21:34:43 -0600 | [diff] [blame] | 101 | if test "x$dosave" = xy |
Milton D. Miller II | d89d5e0 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 102 | then |
Milton D. Miller II | 01fe134 | 2016-02-29 21:34:43 -0600 | [diff] [blame] | 103 | if test ! -d $upper -a -n "$rwfs" |
104 | then | ||||
105 | mkdir -p $rwdir | ||||
106 | mount $rwdev $rwdir -t $(probe_fs_type $rwdev) -o $rorwopts | ||||
107 | mounted=$rwdir | ||||
108 | fi | ||||
Milton D. Miller II | d89d5e0 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 109 | |
110 | while read f | ||||
111 | do | ||||
Milton Miller | 54d882e | 2016-02-05 12:07:53 -0600 | [diff] [blame] | 112 | if ! test -e $upper/$f |
Milton D. Miller II | d89d5e0 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 113 | then |
114 | continue | ||||
115 | fi | ||||
Milton Miller | 54d882e | 2016-02-05 12:07:53 -0600 | [diff] [blame] | 116 | d="$save/$f" |
Milton D. Miller II | d89d5e0 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 117 | mkdir -p "${d%/*}" |
Milton Miller | 54d882e | 2016-02-05 12:07:53 -0600 | [diff] [blame] | 118 | cp -rp $upper/$f "${d%/*}/" |
Milton D. Miller II | 1790e04 | 2016-02-29 11:39:11 -0600 | [diff] [blame] | 119 | done < $whitelist |
Milton D. Miller II | d89d5e0 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 120 | |
Milton D. Miller II | 01fe134 | 2016-02-29 21:34:43 -0600 | [diff] [blame] | 121 | if test -n "$mounted" |
122 | then | ||||
123 | umount $mounted | ||||
124 | fi | ||||
Milton D. Miller II | d89d5e0 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 125 | fi |
126 | |||||
Milton Miller | d93b48e | 2016-02-05 11:19:58 -0600 | [diff] [blame] | 127 | for f in $image* |
Milton D. Miller II | d89d5e0 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 128 | do |
Milton Miller | d93b48e | 2016-02-05 11:19:58 -0600 | [diff] [blame] | 129 | m=$(findmtd ${f#$image}) |
Milton D. Miller II | d89d5e0 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 130 | if test -z "$m" |
131 | then | ||||
Milton Miller | 54d882e | 2016-02-05 12:07:53 -0600 | [diff] [blame] | 132 | echo 1>&2 "Unable to find mtd partiton for ${f##*/}." |
Milton D. Miller II | d89d5e0 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 133 | exec /bin/sh |
134 | fi | ||||
135 | done | ||||
136 | |||||
Milton Miller | d93b48e | 2016-02-05 11:19:58 -0600 | [diff] [blame] | 137 | for f in $image* |
Milton D. Miller II | d89d5e0 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 138 | do |
Milton D. Miller II | e839302 | 2016-02-28 16:53:53 -0600 | [diff] [blame] | 139 | if test ! -s $f |
140 | then | ||||
141 | echo "Skipping empty update of ${f#$image}." | ||||
142 | rm $f | ||||
143 | continue | ||||
144 | fi | ||||
Milton Miller | d93b48e | 2016-02-05 11:19:58 -0600 | [diff] [blame] | 145 | m=$(findmtd ${f#$image}) |
146 | echo "Updating ${f#$image}..." | ||||
Milton D. Miller II | 2d2cf5b | 2016-02-29 07:55:49 -0600 | [diff] [blame] | 147 | flashcp -v $f /dev/$m && rm $f |
Milton D. Miller II | d89d5e0 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 148 | done |
149 | |||||
Milton D. Miller II | 20b647e | 2016-02-29 21:44:22 -0600 | [diff] [blame] | 150 | if test "x$toram" = xy |
151 | then | ||||
152 | mkdir -p $upper | ||||
153 | cp -rp $save/. $upper/ | ||||
154 | fi | ||||
155 | |||||
Milton D. Miller II | 08afa53 | 2016-02-29 23:11:27 -0600 | [diff] [blame] | 156 | if test -d $save -a "x$dorestore" = xy |
Milton D. Miller II | d89d5e0 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 157 | then |
Milton D. Miller II | d6e2584 | 2016-02-28 16:20:19 -0600 | [diff] [blame] | 158 | odir=$rwdir |
159 | rwdir=/run/rw | ||||
160 | upper=$rwdir${upper#$odir} | ||||
161 | |||||
162 | mkdir -p $rwdir | ||||
Andrew Jeffery | acc2c85 | 2016-02-23 23:47:23 +1030 | [diff] [blame] | 163 | mount $rwdev $rwdir -t $(probe_fs_type $rwdev) -o $rwopts |
Milton D. Miller II | 10aee81 | 2016-02-28 18:17:02 -0600 | [diff] [blame] | 164 | mkdir -p $upper |
Milton Miller | 54d882e | 2016-02-05 12:07:53 -0600 | [diff] [blame] | 165 | cp -rp $save/. $upper/ |
166 | umount $rwdir | ||||
Milton D. Miller II | d6e2584 | 2016-02-28 16:20:19 -0600 | [diff] [blame] | 167 | rmdir $rwdir |
Milton D. Miller II | d89d5e0 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 168 | fi |
169 | |||||
Milton D. Miller II | 30ef963 | 2016-02-28 16:32:14 -0600 | [diff] [blame] | 170 | if test "x$doclean" = xy |
171 | then | ||||
172 | rm -rf $save | ||||
173 | fi | ||||
174 | |||||
Milton Miller | 39b6faa | 2016-02-05 13:56:18 -0600 | [diff] [blame] | 175 | exit |
Milton D. Miller II | d89d5e0 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 176 | |
Milton Miller | 39b6faa | 2016-02-05 13:56:18 -0600 | [diff] [blame] | 177 | # NOT REACHED without edit |
178 | # NOT REACHED without edit | ||||
Milton D. Miller II | d89d5e0 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 179 | |
Milton Miller | 39b6faa | 2016-02-05 13:56:18 -0600 | [diff] [blame] | 180 | echo "Flash completed. Inspect, cleanup and reboot -f to continue." |
Milton D. Miller II | d89d5e0 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 181 | |
182 | export PS1=update-sh#\ | ||||
183 | exec /bin/sh |