blob: fa46635a557209fe3da703352d4a29109c1dac28 [file] [log] [blame]
Milton D. Miller IId89d5e02016-01-20 14:57:54 -06001#!/bin/sh
2
3echo update: "$@"
4
Milton Millera5d44e42016-06-15 18:47:38 -05005echoerr() {
6 echo 1>&2 "ERROR: $@"
7}
8
Milton D. Miller IId89d5e02016-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 Millerc88f9272016-05-23 16:00:19 -050025
Milton Miller7dcd1602016-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 IId89d5e02016-01-20 14:57:54 -060054
Milton Miller7a7ee9c2016-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 IId89d5e02016-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 Jefferyacc2c852016-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 IId89d5e02016-01-20 14:57:54 -060084rwfs=$(findmtd rwfs)
85
Milton Miller54d882e2016-02-05 12:07:53 -060086rwdev=/dev/mtdblock${rwfs#mtd}
Milton Miller54d882e2016-02-05 12:07:53 -060087rwopts=rw
88rorwopts=ro${rwopts#rw}
89
Milton D. Miller II8ad2be52016-02-28 16:07:46 -060090rwdir=/run/initramfs/rw
Milton Miller54d882e2016-02-05 12:07:53 -060091upper=$rwdir/cow
Milton D. Miller II07b26cd2016-02-29 10:32:58 -060092save=/run/save/${upper##*/}
Milton D. Miller IId89d5e02016-01-20 14:57:54 -060093
Milton D. Miller II01fe1342016-02-29 21:34:43 -060094mounted=
Milton Miller3d445402016-05-23 17:41:34 -050095doflash=y
Milton D. Miller II30ef9632016-02-28 16:32:14 -060096doclean=
Milton D. Miller II08afa532016-02-29 23:11:27 -060097dosave=y
98dorestore=y
Milton D. Miller II20b647e2016-02-29 21:44:22 -060099toram=
Milton Miller7a7ee9c2016-05-23 18:22:11 -0500100checksize=y
Milton Miller7dcd1602016-05-23 19:17:55 -0500101checkmount=y
Milton D. Miller II30ef9632016-02-28 16:32:14 -0600102
Milton D. Miller II1790e042016-02-29 11:39:11 -0600103whitelist=/run/initramfs/whitelist
104image=/run/initramfs/image-
105
Milton D. Miller II30ef9632016-02-28 16:32:14 -0600106while test "$1" != "${1#-}"
107do
108 case "$1" in
109 --no-clean-saved-files)
110 doclean=
111 shift ;;
112 --clean-saved-files)
113 doclean=y
114 shift ;;
Milton D. Miller II08afa532016-02-29 23:11:27 -0600115 --no-save-files)
116 dosave=
117 shift ;;
118 --save-files)
119 dosave=y
120 shift ;;
121 --no-restore-files)
122 dorestore=
123 shift ;;
124 --restore-files)
125 dorestore=y
126 shift ;;
Milton Miller3d445402016-05-23 17:41:34 -0500127 --no-flash)
128 doflash=
129 shift ;;
Milton Miller7a7ee9c2016-05-23 18:22:11 -0500130 --ignore-size)
131 checksize=
132 shift ;;
Milton Miller7dcd1602016-05-23 19:17:55 -0500133 --ignore-mount)
134 checkmount=
135 doflash=
136 shift ;;
Milton D. Miller II20b647e2016-02-29 21:44:22 -0600137 --copy-files)
138 toram=y
139 shift ;;
Milton D. Miller II30ef9632016-02-28 16:32:14 -0600140 *)
Milton Millera5d44e42016-06-15 18:47:38 -0500141 echoerr "Unknown option $1"
Milton D. Miller II30ef9632016-02-28 16:32:14 -0600142 exit 1 ;;
143 esac
144done
145
Milton D. Miller II01fe1342016-02-29 21:34:43 -0600146if test "x$dosave" = xy
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600147then
Milton D. Miller II01fe1342016-02-29 21:34:43 -0600148 if test ! -d $upper -a -n "$rwfs"
149 then
150 mkdir -p $rwdir
151 mount $rwdev $rwdir -t $(probe_fs_type $rwdev) -o $rorwopts
152 mounted=$rwdir
153 fi
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600154
155 while read f
156 do
Milton Miller54d882e2016-02-05 12:07:53 -0600157 if ! test -e $upper/$f
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600158 then
159 continue
160 fi
Milton Miller54d882e2016-02-05 12:07:53 -0600161 d="$save/$f"
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600162 mkdir -p "${d%/*}"
Milton Miller54d882e2016-02-05 12:07:53 -0600163 cp -rp $upper/$f "${d%/*}/"
Milton D. Miller II1790e042016-02-29 11:39:11 -0600164 done < $whitelist
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600165
Milton D. Miller II01fe1342016-02-29 21:34:43 -0600166 if test -n "$mounted"
167 then
168 umount $mounted
169 fi
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600170fi
171
Milton Millerd93b48e2016-02-05 11:19:58 -0600172for f in $image*
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600173do
Milton Millerd93b48e2016-02-05 11:19:58 -0600174 m=$(findmtd ${f#$image})
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600175 if test -z "$m"
176 then
Milton Millera5d44e42016-06-15 18:47:38 -0500177 echoerr "Unable to find mtd partiton for ${f##*/}."
Milton Millerc88f9272016-05-23 16:00:19 -0500178 exit 1
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600179 fi
Milton Miller7a7ee9c2016-05-23 18:22:11 -0500180 if test -n "$checksize" && toobig "$f" "$m"
181 then
182 echoerr "Image ${f##*/} too big for $m."
183 exit 1
184 fi
Milton Miller7dcd1602016-05-23 19:17:55 -0500185 for s in $m $(childmtds $m)
186 do
187 if test -n "$checkmount" && mtdismounted $s
188 then
189 echoerr "Device $s is mounted, ${f##*/} is busy."
190 exit 1
191 fi
192 done
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600193done
194
Milton Miller3d445402016-05-23 17:41:34 -0500195if test -n "$doflash"
196then
197 for f in $image*
198 do
199 if test ! -s $f
200 then
201 echo "Skipping empty update of ${f#$image}."
202 rm $f
203 continue
204 fi
205 m=$(findmtd ${f#$image})
206 echo "Updating ${f#$image}..."
207 flashcp -v $f /dev/$m && rm $f
208 done
209fi
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600210
Milton Miller02104482016-05-23 18:35:21 -0500211if test -d $save -a "x$toram" = xy
Milton D. Miller II20b647e2016-02-29 21:44:22 -0600212then
213 mkdir -p $upper
214 cp -rp $save/. $upper/
215fi
216
Milton D. Miller II08afa532016-02-29 23:11:27 -0600217if test -d $save -a "x$dorestore" = xy
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600218then
Milton D. Miller IId6e25842016-02-28 16:20:19 -0600219 odir=$rwdir
220 rwdir=/run/rw
221 upper=$rwdir${upper#$odir}
222
223 mkdir -p $rwdir
Andrew Jefferyacc2c852016-02-23 23:47:23 +1030224 mount $rwdev $rwdir -t $(probe_fs_type $rwdev) -o $rwopts
Milton D. Miller II10aee812016-02-28 18:17:02 -0600225 mkdir -p $upper
Milton Miller54d882e2016-02-05 12:07:53 -0600226 cp -rp $save/. $upper/
227 umount $rwdir
Milton D. Miller IId6e25842016-02-28 16:20:19 -0600228 rmdir $rwdir
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600229fi
230
Milton D. Miller II30ef9632016-02-28 16:32:14 -0600231if test "x$doclean" = xy
232then
233 rm -rf $save
234fi
235
Milton Miller39b6faa2016-02-05 13:56:18 -0600236exit