blob: 9d3c81276acbe7f3d77a9f9fc09b2ff279e900bd [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
55findmtd() {
56 m=$(grep -xl "$1" /sys/class/mtd/*/name)
57 m=${m%/name}
58 m=${m##*/}
59 echo $m
60}
61
Andrew Jefferyacc2c852016-02-23 23:47:23 +103062blkid_fs_type() {
63 # Emulate util-linux's `blkid -s TYPE -o value $1`
64 # Example busybox blkid output:
65 # # blkid /dev/mtdblock5
66 # /dev/mtdblock5: TYPE="squashfs"
67 # Process output to extract TYPE value "squashfs".
68 blkid $1 | sed -e 's/^.*TYPE="//' -e 's/".*$//'
69}
70
71probe_fs_type() {
72 fst=$(blkid_fs_type $1)
73 echo ${fst:=jffs2}
74}
75
Milton D. Miller IId89d5e02016-01-20 14:57:54 -060076rwfs=$(findmtd rwfs)
77
Milton Miller54d882e2016-02-05 12:07:53 -060078rwdev=/dev/mtdblock${rwfs#mtd}
Milton Miller54d882e2016-02-05 12:07:53 -060079rwopts=rw
80rorwopts=ro${rwopts#rw}
81
Milton D. Miller II8ad2be52016-02-28 16:07:46 -060082rwdir=/run/initramfs/rw
Milton Miller54d882e2016-02-05 12:07:53 -060083upper=$rwdir/cow
Milton D. Miller II07b26cd2016-02-29 10:32:58 -060084save=/run/save/${upper##*/}
Milton D. Miller IId89d5e02016-01-20 14:57:54 -060085
Milton D. Miller II01fe1342016-02-29 21:34:43 -060086mounted=
Milton Miller3d445402016-05-23 17:41:34 -050087doflash=y
Milton D. Miller II30ef9632016-02-28 16:32:14 -060088doclean=
Milton D. Miller II08afa532016-02-29 23:11:27 -060089dosave=y
90dorestore=y
Milton D. Miller II20b647e2016-02-29 21:44:22 -060091toram=
Milton Miller7dcd1602016-05-23 19:17:55 -050092checkmount=y
Milton D. Miller II30ef9632016-02-28 16:32:14 -060093
Milton D. Miller II1790e042016-02-29 11:39:11 -060094whitelist=/run/initramfs/whitelist
95image=/run/initramfs/image-
96
Milton D. Miller II30ef9632016-02-28 16:32:14 -060097while test "$1" != "${1#-}"
98do
99 case "$1" in
100 --no-clean-saved-files)
101 doclean=
102 shift ;;
103 --clean-saved-files)
104 doclean=y
105 shift ;;
Milton D. Miller II08afa532016-02-29 23:11:27 -0600106 --no-save-files)
107 dosave=
108 shift ;;
109 --save-files)
110 dosave=y
111 shift ;;
112 --no-restore-files)
113 dorestore=
114 shift ;;
115 --restore-files)
116 dorestore=y
117 shift ;;
Milton Miller3d445402016-05-23 17:41:34 -0500118 --no-flash)
119 doflash=
120 shift ;;
Milton Miller7dcd1602016-05-23 19:17:55 -0500121 --ignore-mount)
122 checkmount=
123 doflash=
124 shift ;;
Milton D. Miller II20b647e2016-02-29 21:44:22 -0600125 --copy-files)
126 toram=y
127 shift ;;
Milton D. Miller II30ef9632016-02-28 16:32:14 -0600128 *)
Milton Millera5d44e42016-06-15 18:47:38 -0500129 echoerr "Unknown option $1"
Milton D. Miller II30ef9632016-02-28 16:32:14 -0600130 exit 1 ;;
131 esac
132done
133
Milton D. Miller II01fe1342016-02-29 21:34:43 -0600134if test "x$dosave" = xy
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600135then
Milton D. Miller II01fe1342016-02-29 21:34:43 -0600136 if test ! -d $upper -a -n "$rwfs"
137 then
138 mkdir -p $rwdir
139 mount $rwdev $rwdir -t $(probe_fs_type $rwdev) -o $rorwopts
140 mounted=$rwdir
141 fi
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600142
143 while read f
144 do
Milton Miller54d882e2016-02-05 12:07:53 -0600145 if ! test -e $upper/$f
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600146 then
147 continue
148 fi
Milton Miller54d882e2016-02-05 12:07:53 -0600149 d="$save/$f"
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600150 mkdir -p "${d%/*}"
Milton Miller54d882e2016-02-05 12:07:53 -0600151 cp -rp $upper/$f "${d%/*}/"
Milton D. Miller II1790e042016-02-29 11:39:11 -0600152 done < $whitelist
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600153
Milton D. Miller II01fe1342016-02-29 21:34:43 -0600154 if test -n "$mounted"
155 then
156 umount $mounted
157 fi
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600158fi
159
Milton Millerd93b48e2016-02-05 11:19:58 -0600160for f in $image*
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600161do
Milton Millerd93b48e2016-02-05 11:19:58 -0600162 m=$(findmtd ${f#$image})
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600163 if test -z "$m"
164 then
Milton Millera5d44e42016-06-15 18:47:38 -0500165 echoerr "Unable to find mtd partiton for ${f##*/}."
Milton Millerc88f9272016-05-23 16:00:19 -0500166 exit 1
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600167 fi
Milton Miller7dcd1602016-05-23 19:17:55 -0500168 for s in $m $(childmtds $m)
169 do
170 if test -n "$checkmount" && mtdismounted $s
171 then
172 echoerr "Device $s is mounted, ${f##*/} is busy."
173 exit 1
174 fi
175 done
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600176done
177
Milton Miller3d445402016-05-23 17:41:34 -0500178if test -n "$doflash"
179then
180 for f in $image*
181 do
182 if test ! -s $f
183 then
184 echo "Skipping empty update of ${f#$image}."
185 rm $f
186 continue
187 fi
188 m=$(findmtd ${f#$image})
189 echo "Updating ${f#$image}..."
190 flashcp -v $f /dev/$m && rm $f
191 done
192fi
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600193
Milton Miller02104482016-05-23 18:35:21 -0500194if test -d $save -a "x$toram" = xy
Milton D. Miller II20b647e2016-02-29 21:44:22 -0600195then
196 mkdir -p $upper
197 cp -rp $save/. $upper/
198fi
199
Milton D. Miller II08afa532016-02-29 23:11:27 -0600200if test -d $save -a "x$dorestore" = xy
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600201then
Milton D. Miller IId6e25842016-02-28 16:20:19 -0600202 odir=$rwdir
203 rwdir=/run/rw
204 upper=$rwdir${upper#$odir}
205
206 mkdir -p $rwdir
Andrew Jefferyacc2c852016-02-23 23:47:23 +1030207 mount $rwdev $rwdir -t $(probe_fs_type $rwdev) -o $rwopts
Milton D. Miller II10aee812016-02-28 18:17:02 -0600208 mkdir -p $upper
Milton Miller54d882e2016-02-05 12:07:53 -0600209 cp -rp $save/. $upper/
210 umount $rwdir
Milton D. Miller IId6e25842016-02-28 16:20:19 -0600211 rmdir $rwdir
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600212fi
213
Milton D. Miller II30ef9632016-02-28 16:32:14 -0600214if test "x$doclean" = xy
215then
216 rm -rf $save
217fi
218
Milton Miller39b6faa2016-02-05 13:56:18 -0600219exit