blob: 97d4402ee854d0239df3dcf41d6dbaf04a99142f [file] [log] [blame]
Milton D. Miller II0e775142016-01-20 14:57:54 -06001#!/bin/sh
2
3echo update: "$@"
4
Milton Millerd16a7b02016-06-15 18:47:38 -05005echoerr() {
6 echo 1>&2 "ERROR: $@"
7}
8
Milton D. Miller II0e775142016-01-20 14:57:54 -06009cd /
10if ! test -r /proc/mounts || ! test -f /proc/mounts
11then
12 mkdir -p /proc
13 mount -t proc proc proc
14fi
15if ! test -d /sys/class
16then
17 mkdir -p /sys
18 mount -t sysfs sys sys
19fi
20if ! test -c /dev/null
21then
22 mkdir -p /dev
23 mount -t devtmpfs dev dev
24fi
Milton Millere1cbebe2016-05-23 16:00:19 -050025
Milton Miller810dc702016-05-23 19:17:55 -050026# mtd number N with mtd name Name can be mounted via mtdN, or mtd:Name
27# (with a mtd aware fs) or by /dev/mtdblockN (with a mtd or block fs).
28mtdismounted() {
29 m=${1##mtd}
30 if grep -s "mtdblock$m " /proc/mounts || grep -s "mtd$m " /proc/mounts
31 then
32 return 0
33 fi
34 n=$(cat /sys/class/mtd/mtd$m/name)
35 if test -n "$n" && grep -s "mtd:$n " /proc/mounts
36 then
37 return 0
38 fi
39 return 1
40}
41
42# Detect child partitions when the whole flash is to be updated.
43# Ignore mtdNro and mtdblockN names in the class subsystem directory.
44childmtds() {
45 for m in /sys/class/mtd/$1/mtd*
46 do
47 m=${m##*/}
48 if test "${m%ro}" = "${m#mtdblock}"
49 then
50 echo $m
51 fi
52 done
53}
Milton D. Miller II0e775142016-01-20 14:57:54 -060054
Milton Miller1944aac2016-05-23 18:22:11 -050055toobig() {
56 if test $(stat -L -c "%s" "$1") -gt $(cat /sys/class/mtd/"$2"/size)
57 then
58 return 0
59 fi
60 return 1
61}
62
Milton D. Miller II0e775142016-01-20 14:57:54 -060063findmtd() {
64 m=$(grep -xl "$1" /sys/class/mtd/*/name)
65 m=${m%/name}
66 m=${m##*/}
67 echo $m
68}
69
Andrew Jeffery25a50222016-02-23 23:47:23 +103070blkid_fs_type() {
71 # Emulate util-linux's `blkid -s TYPE -o value $1`
72 # Example busybox blkid output:
73 # # blkid /dev/mtdblock5
74 # /dev/mtdblock5: TYPE="squashfs"
75 # Process output to extract TYPE value "squashfs".
76 blkid $1 | sed -e 's/^.*TYPE="//' -e 's/".*$//'
77}
78
79probe_fs_type() {
80 fst=$(blkid_fs_type $1)
81 echo ${fst:=jffs2}
82}
83
Milton D. Miller II0e775142016-01-20 14:57:54 -060084rwfs=$(findmtd rwfs)
85
Milton Millerba65b7b2016-02-05 12:07:53 -060086rwdev=/dev/mtdblock${rwfs#mtd}
Milton Millerba65b7b2016-02-05 12:07:53 -060087rwopts=rw
88rorwopts=ro${rwopts#rw}
89
Milton D. Miller IIc3697de2016-02-28 16:07:46 -060090rwdir=/run/initramfs/rw
Milton Millerba65b7b2016-02-05 12:07:53 -060091upper=$rwdir/cow
Milton D. Miller IIfa8316d2016-02-29 10:32:58 -060092save=/run/save/${upper##*/}
Milton D. Miller II0e775142016-01-20 14:57:54 -060093
Milton D. Miller IIa987d622016-02-29 21:34:43 -060094mounted=
Milton Miller4015b7a2016-05-23 17:41:34 -050095doflash=y
Milton D. Miller IId0b0c6a2016-02-28 16:32:14 -060096doclean=
Milton D. Miller IIecf68d52016-02-29 23:11:27 -060097dosave=y
98dorestore=y
Milton D. Miller II7141eb02016-02-29 21:44:22 -060099toram=
Milton Miller1944aac2016-05-23 18:22:11 -0500100checksize=y
Milton Miller810dc702016-05-23 19:17:55 -0500101checkmount=y
Milton D. Miller IId0b0c6a2016-02-28 16:32:14 -0600102
Milton D. Miller IIee91f8d2016-02-29 11:39:11 -0600103whitelist=/run/initramfs/whitelist
104image=/run/initramfs/image-
Milton Miller4e878612016-06-16 16:44:12 -0500105imglist=
Milton D. Miller IIee91f8d2016-02-29 11:39:11 -0600106
Milton D. Miller IId0b0c6a2016-02-28 16:32:14 -0600107while test "$1" != "${1#-}"
108do
109 case "$1" in
Milton Miller30137fa2016-06-15 16:02:23 -0500110 --help)
111 cat <<HERE
112Usage: $0 [options] -- Write images in /run/initramfs to flash (/dev/mtd*)
113 --help Show this message
114 --no-flash Don't attempt to write images to flash
115 --ignore-size Don't compare image size to mtd device size
116 --ignore-mount Don't check if destination is mounted
117 --save-files Copy whitelisted files to save directory in RAM
118 --no-save-files Don't copy whitelisted files to save directory
119 --copy-files Copy files from save directory to rwfs mountpoint
120 --restore-files Restore files from save directory to rwfs layer
121 --no-restore-files Don't restore saved files from ram to rwfs layer
122 --clean-saved-files Delete saved whitelisted files from RAM
123 --no-clean-saved-files Retain saved whitelisted files in RAM
124HERE
125
126 exit 0 ;;
127
Milton D. Miller IId0b0c6a2016-02-28 16:32:14 -0600128 --no-clean-saved-files)
129 doclean=
130 shift ;;
131 --clean-saved-files)
132 doclean=y
133 shift ;;
Milton D. Miller IIecf68d52016-02-29 23:11:27 -0600134 --no-save-files)
135 dosave=
136 shift ;;
137 --save-files)
138 dosave=y
139 shift ;;
140 --no-restore-files)
141 dorestore=
142 shift ;;
143 --restore-files)
144 dorestore=y
145 shift ;;
Milton Miller4015b7a2016-05-23 17:41:34 -0500146 --no-flash)
147 doflash=
148 shift ;;
Milton Miller1944aac2016-05-23 18:22:11 -0500149 --ignore-size)
150 checksize=
151 shift ;;
Milton Miller810dc702016-05-23 19:17:55 -0500152 --ignore-mount)
153 checkmount=
154 doflash=
155 shift ;;
Milton D. Miller II7141eb02016-02-29 21:44:22 -0600156 --copy-files)
157 toram=y
158 shift ;;
Milton D. Miller IId0b0c6a2016-02-28 16:32:14 -0600159 *)
Milton Miller30137fa2016-06-15 16:02:23 -0500160 echoerr "Unknown option $1. Try $0 --help."
Milton D. Miller IId0b0c6a2016-02-28 16:32:14 -0600161 exit 1 ;;
162 esac
163done
164
Milton D. Miller IIa987d622016-02-29 21:34:43 -0600165if test "x$dosave" = xy
Milton D. Miller II0e775142016-01-20 14:57:54 -0600166then
Milton D. Miller IIa987d622016-02-29 21:34:43 -0600167 if test ! -d $upper -a -n "$rwfs"
168 then
169 mkdir -p $rwdir
170 mount $rwdev $rwdir -t $(probe_fs_type $rwdev) -o $rorwopts
171 mounted=$rwdir
172 fi
Milton D. Miller II0e775142016-01-20 14:57:54 -0600173
174 while read f
175 do
Milton Millerba65b7b2016-02-05 12:07:53 -0600176 if ! test -e $upper/$f
Milton D. Miller II0e775142016-01-20 14:57:54 -0600177 then
178 continue
179 fi
Milton Millerba65b7b2016-02-05 12:07:53 -0600180 d="$save/$f"
Milton D. Miller II0e775142016-01-20 14:57:54 -0600181 mkdir -p "${d%/*}"
Milton Millerba65b7b2016-02-05 12:07:53 -0600182 cp -rp $upper/$f "${d%/*}/"
Milton D. Miller IIee91f8d2016-02-29 11:39:11 -0600183 done < $whitelist
Milton D. Miller II0e775142016-01-20 14:57:54 -0600184
Milton D. Miller IIa987d622016-02-29 21:34:43 -0600185 if test -n "$mounted"
186 then
187 umount $mounted
188 fi
Milton D. Miller II0e775142016-01-20 14:57:54 -0600189fi
190
Milton Miller4e878612016-06-16 16:44:12 -0500191imglist=$(echo $image*)
192if test "$imglist" = "$image*" -a ! -e "$imglist"
193then
194 # shell didn't expand the wildcard, so no files exist
195 echo "No images found to update."
196 imglist=
197fi
198
199for f in $imglist
Milton D. Miller II0e775142016-01-20 14:57:54 -0600200do
Milton Miller36d336c2016-02-05 11:19:58 -0600201 m=$(findmtd ${f#$image})
Milton D. Miller II0e775142016-01-20 14:57:54 -0600202 if test -z "$m"
203 then
Milton Millerd16a7b02016-06-15 18:47:38 -0500204 echoerr "Unable to find mtd partiton for ${f##*/}."
Milton Millere1cbebe2016-05-23 16:00:19 -0500205 exit 1
Milton D. Miller II0e775142016-01-20 14:57:54 -0600206 fi
Milton Miller1944aac2016-05-23 18:22:11 -0500207 if test -n "$checksize" && toobig "$f" "$m"
208 then
209 echoerr "Image ${f##*/} too big for $m."
210 exit 1
211 fi
Milton Miller810dc702016-05-23 19:17:55 -0500212 for s in $m $(childmtds $m)
213 do
214 if test -n "$checkmount" && mtdismounted $s
215 then
216 echoerr "Device $s is mounted, ${f##*/} is busy."
217 exit 1
218 fi
219 done
Milton D. Miller II0e775142016-01-20 14:57:54 -0600220done
221
Milton Miller4015b7a2016-05-23 17:41:34 -0500222if test -n "$doflash"
223then
Milton Miller4e878612016-06-16 16:44:12 -0500224 for f in $imglist
Milton Miller4015b7a2016-05-23 17:41:34 -0500225 do
226 if test ! -s $f
227 then
228 echo "Skipping empty update of ${f#$image}."
229 rm $f
230 continue
231 fi
232 m=$(findmtd ${f#$image})
233 echo "Updating ${f#$image}..."
234 flashcp -v $f /dev/$m && rm $f
235 done
236fi
Milton D. Miller II0e775142016-01-20 14:57:54 -0600237
Milton Millera67cc442016-05-23 18:35:21 -0500238if test -d $save -a "x$toram" = xy
Milton D. Miller II7141eb02016-02-29 21:44:22 -0600239then
240 mkdir -p $upper
241 cp -rp $save/. $upper/
242fi
243
Milton D. Miller IIecf68d52016-02-29 23:11:27 -0600244if test -d $save -a "x$dorestore" = xy
Milton D. Miller II0e775142016-01-20 14:57:54 -0600245then
Milton D. Miller IIfacb7182016-02-28 16:20:19 -0600246 odir=$rwdir
247 rwdir=/run/rw
248 upper=$rwdir${upper#$odir}
249
250 mkdir -p $rwdir
Andrew Jeffery25a50222016-02-23 23:47:23 +1030251 mount $rwdev $rwdir -t $(probe_fs_type $rwdev) -o $rwopts
Milton D. Miller IIba2b7c92016-02-28 18:17:02 -0600252 mkdir -p $upper
Milton Millerba65b7b2016-02-05 12:07:53 -0600253 cp -rp $save/. $upper/
254 umount $rwdir
Milton D. Miller IIfacb7182016-02-28 16:20:19 -0600255 rmdir $rwdir
Milton D. Miller II0e775142016-01-20 14:57:54 -0600256fi
257
Milton D. Miller IId0b0c6a2016-02-28 16:32:14 -0600258if test "x$doclean" = xy
259then
260 rm -rf $save
261fi
262
Milton Millerdbacf102016-02-05 13:56:18 -0600263exit