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