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