blob: f0ca989d26b9fbfd03239900c81e76700f2f8d01 [file] [log] [blame]
Milton D. Miller IId89d5e02016-01-20 14:57:54 -06001#!/bin/sh
2
3echo update: "$@"
4
Milton D. Miller IId89d5e02016-01-20 14:57:54 -06005cd /
6if ! test -r /proc/mounts || ! test -f /proc/mounts
7then
8 mkdir -p /proc
9 mount -t proc proc proc
10fi
11if ! test -d /sys/class
12then
13 mkdir -p /sys
14 mount -t sysfs sys sys
15fi
16if ! test -c /dev/null
17then
18 mkdir -p /dev
19 mount -t devtmpfs dev dev
20fi
Milton Millerc88f9272016-05-23 16:00:19 -050021
22if grep mtd /proc/mounts
23then
Milton D. Miller IId89d5e02016-01-20 14:57:54 -060024 echo 1>&2 "Error: A mtd device is mounted."
Milton Millerc88f9272016-05-23 16:00:19 -050025 exit 1
26fi
Milton D. Miller IId89d5e02016-01-20 14:57:54 -060027
28findmtd() {
29 m=$(grep -xl "$1" /sys/class/mtd/*/name)
30 m=${m%/name}
31 m=${m##*/}
32 echo $m
33}
34
Andrew Jefferyacc2c852016-02-23 23:47:23 +103035blkid_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
44probe_fs_type() {
45 fst=$(blkid_fs_type $1)
46 echo ${fst:=jffs2}
47}
48
Milton D. Miller IId89d5e02016-01-20 14:57:54 -060049rwfs=$(findmtd rwfs)
50
Milton Miller54d882e2016-02-05 12:07:53 -060051rwdev=/dev/mtdblock${rwfs#mtd}
Milton Miller54d882e2016-02-05 12:07:53 -060052rwopts=rw
53rorwopts=ro${rwopts#rw}
54
Milton D. Miller II8ad2be52016-02-28 16:07:46 -060055rwdir=/run/initramfs/rw
Milton Miller54d882e2016-02-05 12:07:53 -060056upper=$rwdir/cow
Milton D. Miller II07b26cd2016-02-29 10:32:58 -060057save=/run/save/${upper##*/}
Milton D. Miller IId89d5e02016-01-20 14:57:54 -060058
Milton D. Miller II01fe1342016-02-29 21:34:43 -060059mounted=
Milton D. Miller II30ef9632016-02-28 16:32:14 -060060doclean=
Milton D. Miller II08afa532016-02-29 23:11:27 -060061dosave=y
62dorestore=y
Milton D. Miller II20b647e2016-02-29 21:44:22 -060063toram=
Milton D. Miller II30ef9632016-02-28 16:32:14 -060064
Milton D. Miller II1790e042016-02-29 11:39:11 -060065whitelist=/run/initramfs/whitelist
66image=/run/initramfs/image-
67
Milton D. Miller II30ef9632016-02-28 16:32:14 -060068while test "$1" != "${1#-}"
69do
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 II08afa532016-02-29 23:11:27 -060077 --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 II20b647e2016-02-29 21:44:22 -060089 --copy-files)
90 toram=y
91 shift ;;
Milton D. Miller II30ef9632016-02-28 16:32:14 -060092 *)
93 echo 2>&1 "Unknown option $1"
94 exit 1 ;;
95 esac
96done
97
Milton D. Miller II01fe1342016-02-29 21:34:43 -060098if test "x$dosave" = xy
Milton D. Miller IId89d5e02016-01-20 14:57:54 -060099then
Milton D. Miller II01fe1342016-02-29 21:34:43 -0600100 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 IId89d5e02016-01-20 14:57:54 -0600106
107 while read f
108 do
Milton Miller54d882e2016-02-05 12:07:53 -0600109 if ! test -e $upper/$f
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600110 then
111 continue
112 fi
Milton Miller54d882e2016-02-05 12:07:53 -0600113 d="$save/$f"
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600114 mkdir -p "${d%/*}"
Milton Miller54d882e2016-02-05 12:07:53 -0600115 cp -rp $upper/$f "${d%/*}/"
Milton D. Miller II1790e042016-02-29 11:39:11 -0600116 done < $whitelist
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600117
Milton D. Miller II01fe1342016-02-29 21:34:43 -0600118 if test -n "$mounted"
119 then
120 umount $mounted
121 fi
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600122fi
123
Milton Millerd93b48e2016-02-05 11:19:58 -0600124for f in $image*
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600125do
Milton Millerd93b48e2016-02-05 11:19:58 -0600126 m=$(findmtd ${f#$image})
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600127 if test -z "$m"
128 then
Milton Miller54d882e2016-02-05 12:07:53 -0600129 echo 1>&2 "Unable to find mtd partiton for ${f##*/}."
Milton Millerc88f9272016-05-23 16:00:19 -0500130 exit 1
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600131 fi
132done
133
Milton Millerd93b48e2016-02-05 11:19:58 -0600134for f in $image*
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600135do
Milton D. Miller IIe8393022016-02-28 16:53:53 -0600136 if test ! -s $f
137 then
138 echo "Skipping empty update of ${f#$image}."
139 rm $f
140 continue
141 fi
Milton Millerd93b48e2016-02-05 11:19:58 -0600142 m=$(findmtd ${f#$image})
143 echo "Updating ${f#$image}..."
Milton D. Miller II2d2cf5b2016-02-29 07:55:49 -0600144 flashcp -v $f /dev/$m && rm $f
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600145done
146
Milton Miller02104482016-05-23 18:35:21 -0500147if test -d $save -a "x$toram" = xy
Milton D. Miller II20b647e2016-02-29 21:44:22 -0600148then
149 mkdir -p $upper
150 cp -rp $save/. $upper/
151fi
152
Milton D. Miller II08afa532016-02-29 23:11:27 -0600153if test -d $save -a "x$dorestore" = xy
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600154then
Milton D. Miller IId6e25842016-02-28 16:20:19 -0600155 odir=$rwdir
156 rwdir=/run/rw
157 upper=$rwdir${upper#$odir}
158
159 mkdir -p $rwdir
Andrew Jefferyacc2c852016-02-23 23:47:23 +1030160 mount $rwdev $rwdir -t $(probe_fs_type $rwdev) -o $rwopts
Milton D. Miller II10aee812016-02-28 18:17:02 -0600161 mkdir -p $upper
Milton Miller54d882e2016-02-05 12:07:53 -0600162 cp -rp $save/. $upper/
163 umount $rwdir
Milton D. Miller IId6e25842016-02-28 16:20:19 -0600164 rmdir $rwdir
Milton D. Miller IId89d5e02016-01-20 14:57:54 -0600165fi
166
Milton D. Miller II30ef9632016-02-28 16:32:14 -0600167if test "x$doclean" = xy
168then
169 rm -rf $save
170fi
171
Milton Miller39b6faa2016-02-05 13:56:18 -0600172exit