blob: dff23d50d7dedf3817eaa883cf9291a29cfe1563 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
#!/bin/sh
echo update: "$@"
export PS1=update-sh#\
# exec /bin/sh
cd /
if ! test -r /proc/mounts || ! test -f /proc/mounts
then
mkdir -p /proc
mount -t proc proc proc
fi
if ! test -d /sys/class
then
mkdir -p /sys
mount -t sysfs sys sys
fi
if ! test -c /dev/null
then
mkdir -p /dev
mount -t devtmpfs dev dev
fi
while grep mtd /proc/mounts
do
echo 1>&2 "Error: A mtd device is mounted."
sulogin
# exec /bin/sh
done
findmtd() {
m=$(grep -xl "$1" /sys/class/mtd/*/name)
m=${m%/name}
m=${m##*/}
echo $m
}
blkid_fs_type() {
# Emulate util-linux's `blkid -s TYPE -o value $1`
# Example busybox blkid output:
# # blkid /dev/mtdblock5
# /dev/mtdblock5: TYPE="squashfs"
# Process output to extract TYPE value "squashfs".
blkid $1 | sed -e 's/^.*TYPE="//' -e 's/".*$//'
}
probe_fs_type() {
fst=$(blkid_fs_type $1)
echo ${fst:=jffs2}
}
rwfs=$(findmtd rwfs)
rwdev=/dev/mtdblock${rwfs#mtd}
rwopts=rw
rorwopts=ro${rwopts#rw}
rwdir=rw
upper=$rwdir/cow
save=save/${upper##*/}
doclean=
dosave=y
dorestore=y
while test "$1" != "${1#-}"
do
case "$1" in
--no-clean-saved-files)
doclean=
shift ;;
--clean-saved-files)
doclean=y
shift ;;
--no-save-files)
dosave=
shift ;;
--save-files)
dosave=y
shift ;;
--no-restore-files)
dorestore=
shift ;;
--restore-files)
dorestore=y
shift ;;
*)
echo 2>&1 "Unknown option $1"
exit 1 ;;
esac
done
if test "x$dosave" = xy -a -n "$rwfs" -a -s whitelist
then
mkdir -p $rwdir
mount $rwdev $rwdir -t $(probe_fs_type $rwdev) -o $rorwopts
while read f
do
if ! test -e $upper/$f
then
continue
fi
d="$save/$f"
mkdir -p "${d%/*}"
cp -rp $upper/$f "${d%/*}/"
done < whitelist
umount $rwdir
fi
image=/run/initramfs/image-
for f in $image*
do
m=$(findmtd ${f#$image})
if test -z "$m"
then
echo 1>&2 "Unable to find mtd partiton for ${f##*/}."
exec /bin/sh
fi
done
for f in $image*
do
m=$(findmtd ${f#$image})
echo "Updating ${f#$image}..."
# flasheraseall /dev/$m && dd if=$f of=/dev/$m
flashcp -v $f /dev/$m
done
if test -d $save -a "x$dorestore" = xy
then
mount $rwdev $rwdir -t $(probe_fs_type $rwdev) -o $rwopts
cp -rp $save/. $upper/
umount $rwdir
fi
if test "x$doclean" = xy
then
rm -rf $save
fi
exit
# NOT REACHED without edit
# NOT REACHED without edit
echo "Flash completed. Inspect, cleanup and reboot -f to continue."
export PS1=update-sh#\
exec /bin/sh
|