Milton D. Miller II | 0e77514 | 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 | 25a5022 | 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 | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 52 | rwfs=$(findmtd rwfs) |
53 | |||||
Milton Miller | ba65b7b | 2016-02-05 12:07:53 -0600 | [diff] [blame] | 54 | rwdev=/dev/mtdblock${rwfs#mtd} |
Milton Miller | ba65b7b | 2016-02-05 12:07:53 -0600 | [diff] [blame] | 55 | rwopts=rw |
56 | rorwopts=ro${rwopts#rw} | ||||
57 | |||||
Milton D. Miller II | c3697de | 2016-02-28 16:07:46 -0600 | [diff] [blame] | 58 | rwdir=/run/initramfs/rw |
Milton Miller | ba65b7b | 2016-02-05 12:07:53 -0600 | [diff] [blame] | 59 | upper=$rwdir/cow |
Milton D. Miller II | fa8316d | 2016-02-29 10:32:58 -0600 | [diff] [blame] | 60 | save=/run/save/${upper##*/} |
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 61 | |
Milton D. Miller II | a987d62 | 2016-02-29 21:34:43 -0600 | [diff] [blame^] | 62 | mounted= |
Milton D. Miller II | d0b0c6a | 2016-02-28 16:32:14 -0600 | [diff] [blame] | 63 | doclean= |
Milton D. Miller II | ecf68d5 | 2016-02-29 23:11:27 -0600 | [diff] [blame] | 64 | dosave=y |
65 | dorestore=y | ||||
Milton D. Miller II | d0b0c6a | 2016-02-28 16:32:14 -0600 | [diff] [blame] | 66 | |
Milton D. Miller II | ee91f8d | 2016-02-29 11:39:11 -0600 | [diff] [blame] | 67 | whitelist=/run/initramfs/whitelist |
68 | image=/run/initramfs/image- | ||||
69 | |||||
Milton D. Miller II | d0b0c6a | 2016-02-28 16:32:14 -0600 | [diff] [blame] | 70 | while test "$1" != "${1#-}" |
71 | do | ||||
72 | case "$1" in | ||||
73 | --no-clean-saved-files) | ||||
74 | doclean= | ||||
75 | shift ;; | ||||
76 | --clean-saved-files) | ||||
77 | doclean=y | ||||
78 | shift ;; | ||||
Milton D. Miller II | ecf68d5 | 2016-02-29 23:11:27 -0600 | [diff] [blame] | 79 | --no-save-files) |
80 | dosave= | ||||
81 | shift ;; | ||||
82 | --save-files) | ||||
83 | dosave=y | ||||
84 | shift ;; | ||||
85 | --no-restore-files) | ||||
86 | dorestore= | ||||
87 | shift ;; | ||||
88 | --restore-files) | ||||
89 | dorestore=y | ||||
90 | shift ;; | ||||
Milton D. Miller II | d0b0c6a | 2016-02-28 16:32:14 -0600 | [diff] [blame] | 91 | *) |
92 | echo 2>&1 "Unknown option $1" | ||||
93 | exit 1 ;; | ||||
94 | esac | ||||
95 | done | ||||
96 | |||||
Milton D. Miller II | a987d62 | 2016-02-29 21:34:43 -0600 | [diff] [blame^] | 97 | if test "x$dosave" = xy |
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 98 | then |
Milton D. Miller II | a987d62 | 2016-02-29 21:34:43 -0600 | [diff] [blame^] | 99 | if test ! -d $upper -a -n "$rwfs" |
100 | then | ||||
101 | mkdir -p $rwdir | ||||
102 | mount $rwdev $rwdir -t $(probe_fs_type $rwdev) -o $rorwopts | ||||
103 | mounted=$rwdir | ||||
104 | fi | ||||
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 105 | |
106 | while read f | ||||
107 | do | ||||
Milton Miller | ba65b7b | 2016-02-05 12:07:53 -0600 | [diff] [blame] | 108 | if ! test -e $upper/$f |
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 109 | then |
110 | continue | ||||
111 | fi | ||||
Milton Miller | ba65b7b | 2016-02-05 12:07:53 -0600 | [diff] [blame] | 112 | d="$save/$f" |
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 113 | mkdir -p "${d%/*}" |
Milton Miller | ba65b7b | 2016-02-05 12:07:53 -0600 | [diff] [blame] | 114 | cp -rp $upper/$f "${d%/*}/" |
Milton D. Miller II | ee91f8d | 2016-02-29 11:39:11 -0600 | [diff] [blame] | 115 | done < $whitelist |
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 116 | |
Milton D. Miller II | a987d62 | 2016-02-29 21:34:43 -0600 | [diff] [blame^] | 117 | if test -n "$mounted" |
118 | then | ||||
119 | umount $mounted | ||||
120 | fi | ||||
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 121 | fi |
122 | |||||
Milton Miller | 36d336c | 2016-02-05 11:19:58 -0600 | [diff] [blame] | 123 | for f in $image* |
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 124 | do |
Milton Miller | 36d336c | 2016-02-05 11:19:58 -0600 | [diff] [blame] | 125 | m=$(findmtd ${f#$image}) |
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 126 | if test -z "$m" |
127 | then | ||||
Milton Miller | ba65b7b | 2016-02-05 12:07:53 -0600 | [diff] [blame] | 128 | echo 1>&2 "Unable to find mtd partiton for ${f##*/}." |
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 129 | exec /bin/sh |
130 | fi | ||||
131 | done | ||||
132 | |||||
Milton Miller | 36d336c | 2016-02-05 11:19:58 -0600 | [diff] [blame] | 133 | for f in $image* |
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 134 | do |
Milton Miller | 36d336c | 2016-02-05 11:19:58 -0600 | [diff] [blame] | 135 | m=$(findmtd ${f#$image}) |
136 | echo "Updating ${f#$image}..." | ||||
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 137 | # flasheraseall /dev/$m && dd if=$f of=/dev/$m |
138 | flashcp -v $f /dev/$m | ||||
139 | done | ||||
140 | |||||
Milton D. Miller II | ecf68d5 | 2016-02-29 23:11:27 -0600 | [diff] [blame] | 141 | if test -d $save -a "x$dorestore" = xy |
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 142 | then |
Milton D. Miller II | facb718 | 2016-02-28 16:20:19 -0600 | [diff] [blame] | 143 | odir=$rwdir |
144 | rwdir=/run/rw | ||||
145 | upper=$rwdir${upper#$odir} | ||||
146 | |||||
147 | mkdir -p $rwdir | ||||
Andrew Jeffery | 25a5022 | 2016-02-23 23:47:23 +1030 | [diff] [blame] | 148 | mount $rwdev $rwdir -t $(probe_fs_type $rwdev) -o $rwopts |
Milton D. Miller II | ba2b7c9 | 2016-02-28 18:17:02 -0600 | [diff] [blame] | 149 | mkdir -p $upper |
Milton Miller | ba65b7b | 2016-02-05 12:07:53 -0600 | [diff] [blame] | 150 | cp -rp $save/. $upper/ |
151 | umount $rwdir | ||||
Milton D. Miller II | facb718 | 2016-02-28 16:20:19 -0600 | [diff] [blame] | 152 | rmdir $rwdir |
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 153 | fi |
154 | |||||
Milton D. Miller II | d0b0c6a | 2016-02-28 16:32:14 -0600 | [diff] [blame] | 155 | if test "x$doclean" = xy |
156 | then | ||||
157 | rm -rf $save | ||||
158 | fi | ||||
159 | |||||
Milton Miller | dbacf10 | 2016-02-05 13:56:18 -0600 | [diff] [blame] | 160 | exit |
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 161 | |
Milton Miller | dbacf10 | 2016-02-05 13:56:18 -0600 | [diff] [blame] | 162 | # NOT REACHED without edit |
163 | # NOT REACHED without edit | ||||
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 164 | |
Milton Miller | dbacf10 | 2016-02-05 13:56:18 -0600 | [diff] [blame] | 165 | echo "Flash completed. Inspect, cleanup and reboot -f to continue." |
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 166 | |
167 | export PS1=update-sh#\ | ||||
168 | exec /bin/sh |