Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 1 | #!/bin/sh |
2 | |||||
3 | echo update: "$@" | ||||
4 | |||||
Milton Miller | d16a7b0 | 2016-06-15 18:47:38 -0500 | [diff] [blame^] | 5 | echoerr() { |
6 | echo 1>&2 "ERROR: $@" | ||||
7 | } | ||||
8 | |||||
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 9 | cd / |
10 | if ! test -r /proc/mounts || ! test -f /proc/mounts | ||||
11 | then | ||||
12 | mkdir -p /proc | ||||
13 | mount -t proc proc proc | ||||
14 | fi | ||||
15 | if ! test -d /sys/class | ||||
16 | then | ||||
17 | mkdir -p /sys | ||||
18 | mount -t sysfs sys sys | ||||
19 | fi | ||||
20 | if ! test -c /dev/null | ||||
21 | then | ||||
22 | mkdir -p /dev | ||||
23 | mount -t devtmpfs dev dev | ||||
24 | fi | ||||
Milton Miller | e1cbebe | 2016-05-23 16:00:19 -0500 | [diff] [blame] | 25 | |
26 | if grep mtd /proc/mounts | ||||
27 | then | ||||
Milton Miller | d16a7b0 | 2016-06-15 18:47:38 -0500 | [diff] [blame^] | 28 | echoerr "A mtd device is mounted." |
Milton Miller | e1cbebe | 2016-05-23 16:00:19 -0500 | [diff] [blame] | 29 | exit 1 |
30 | fi | ||||
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 31 | |
32 | findmtd() { | ||||
33 | m=$(grep -xl "$1" /sys/class/mtd/*/name) | ||||
34 | m=${m%/name} | ||||
35 | m=${m##*/} | ||||
36 | echo $m | ||||
37 | } | ||||
38 | |||||
Andrew Jeffery | 25a5022 | 2016-02-23 23:47:23 +1030 | [diff] [blame] | 39 | blkid_fs_type() { |
40 | # Emulate util-linux's `blkid -s TYPE -o value $1` | ||||
41 | # Example busybox blkid output: | ||||
42 | # # blkid /dev/mtdblock5 | ||||
43 | # /dev/mtdblock5: TYPE="squashfs" | ||||
44 | # Process output to extract TYPE value "squashfs". | ||||
45 | blkid $1 | sed -e 's/^.*TYPE="//' -e 's/".*$//' | ||||
46 | } | ||||
47 | |||||
48 | probe_fs_type() { | ||||
49 | fst=$(blkid_fs_type $1) | ||||
50 | echo ${fst:=jffs2} | ||||
51 | } | ||||
52 | |||||
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 53 | rwfs=$(findmtd rwfs) |
54 | |||||
Milton Miller | ba65b7b | 2016-02-05 12:07:53 -0600 | [diff] [blame] | 55 | rwdev=/dev/mtdblock${rwfs#mtd} |
Milton Miller | ba65b7b | 2016-02-05 12:07:53 -0600 | [diff] [blame] | 56 | rwopts=rw |
57 | rorwopts=ro${rwopts#rw} | ||||
58 | |||||
Milton D. Miller II | c3697de | 2016-02-28 16:07:46 -0600 | [diff] [blame] | 59 | rwdir=/run/initramfs/rw |
Milton Miller | ba65b7b | 2016-02-05 12:07:53 -0600 | [diff] [blame] | 60 | upper=$rwdir/cow |
Milton D. Miller II | fa8316d | 2016-02-29 10:32:58 -0600 | [diff] [blame] | 61 | save=/run/save/${upper##*/} |
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 62 | |
Milton D. Miller II | a987d62 | 2016-02-29 21:34:43 -0600 | [diff] [blame] | 63 | mounted= |
Milton D. Miller II | d0b0c6a | 2016-02-28 16:32:14 -0600 | [diff] [blame] | 64 | doclean= |
Milton D. Miller II | ecf68d5 | 2016-02-29 23:11:27 -0600 | [diff] [blame] | 65 | dosave=y |
66 | dorestore=y | ||||
Milton D. Miller II | 7141eb0 | 2016-02-29 21:44:22 -0600 | [diff] [blame] | 67 | toram= |
Milton D. Miller II | d0b0c6a | 2016-02-28 16:32:14 -0600 | [diff] [blame] | 68 | |
Milton D. Miller II | ee91f8d | 2016-02-29 11:39:11 -0600 | [diff] [blame] | 69 | whitelist=/run/initramfs/whitelist |
70 | image=/run/initramfs/image- | ||||
71 | |||||
Milton D. Miller II | d0b0c6a | 2016-02-28 16:32:14 -0600 | [diff] [blame] | 72 | while test "$1" != "${1#-}" |
73 | do | ||||
74 | case "$1" in | ||||
75 | --no-clean-saved-files) | ||||
76 | doclean= | ||||
77 | shift ;; | ||||
78 | --clean-saved-files) | ||||
79 | doclean=y | ||||
80 | shift ;; | ||||
Milton D. Miller II | ecf68d5 | 2016-02-29 23:11:27 -0600 | [diff] [blame] | 81 | --no-save-files) |
82 | dosave= | ||||
83 | shift ;; | ||||
84 | --save-files) | ||||
85 | dosave=y | ||||
86 | shift ;; | ||||
87 | --no-restore-files) | ||||
88 | dorestore= | ||||
89 | shift ;; | ||||
90 | --restore-files) | ||||
91 | dorestore=y | ||||
92 | shift ;; | ||||
Milton D. Miller II | 7141eb0 | 2016-02-29 21:44:22 -0600 | [diff] [blame] | 93 | --copy-files) |
94 | toram=y | ||||
95 | shift ;; | ||||
Milton D. Miller II | d0b0c6a | 2016-02-28 16:32:14 -0600 | [diff] [blame] | 96 | *) |
Milton Miller | d16a7b0 | 2016-06-15 18:47:38 -0500 | [diff] [blame^] | 97 | echoerr "Unknown option $1" |
Milton D. Miller II | d0b0c6a | 2016-02-28 16:32:14 -0600 | [diff] [blame] | 98 | exit 1 ;; |
99 | esac | ||||
100 | done | ||||
101 | |||||
Milton D. Miller II | a987d62 | 2016-02-29 21:34:43 -0600 | [diff] [blame] | 102 | if test "x$dosave" = xy |
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 103 | then |
Milton D. Miller II | a987d62 | 2016-02-29 21:34:43 -0600 | [diff] [blame] | 104 | if test ! -d $upper -a -n "$rwfs" |
105 | then | ||||
106 | mkdir -p $rwdir | ||||
107 | mount $rwdev $rwdir -t $(probe_fs_type $rwdev) -o $rorwopts | ||||
108 | mounted=$rwdir | ||||
109 | fi | ||||
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 110 | |
111 | while read f | ||||
112 | do | ||||
Milton Miller | ba65b7b | 2016-02-05 12:07:53 -0600 | [diff] [blame] | 113 | if ! test -e $upper/$f |
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 114 | then |
115 | continue | ||||
116 | fi | ||||
Milton Miller | ba65b7b | 2016-02-05 12:07:53 -0600 | [diff] [blame] | 117 | d="$save/$f" |
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 118 | mkdir -p "${d%/*}" |
Milton Miller | ba65b7b | 2016-02-05 12:07:53 -0600 | [diff] [blame] | 119 | cp -rp $upper/$f "${d%/*}/" |
Milton D. Miller II | ee91f8d | 2016-02-29 11:39:11 -0600 | [diff] [blame] | 120 | done < $whitelist |
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 121 | |
Milton D. Miller II | a987d62 | 2016-02-29 21:34:43 -0600 | [diff] [blame] | 122 | if test -n "$mounted" |
123 | then | ||||
124 | umount $mounted | ||||
125 | fi | ||||
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 126 | fi |
127 | |||||
Milton Miller | 36d336c | 2016-02-05 11:19:58 -0600 | [diff] [blame] | 128 | for f in $image* |
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 129 | do |
Milton Miller | 36d336c | 2016-02-05 11:19:58 -0600 | [diff] [blame] | 130 | m=$(findmtd ${f#$image}) |
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 131 | if test -z "$m" |
132 | then | ||||
Milton Miller | d16a7b0 | 2016-06-15 18:47:38 -0500 | [diff] [blame^] | 133 | echoerr "Unable to find mtd partiton for ${f##*/}." |
Milton Miller | e1cbebe | 2016-05-23 16:00:19 -0500 | [diff] [blame] | 134 | exit 1 |
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 135 | fi |
136 | done | ||||
137 | |||||
Milton Miller | 36d336c | 2016-02-05 11:19:58 -0600 | [diff] [blame] | 138 | for f in $image* |
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 139 | do |
Milton D. Miller II | 5d187bf | 2016-02-28 16:53:53 -0600 | [diff] [blame] | 140 | if test ! -s $f |
141 | then | ||||
142 | echo "Skipping empty update of ${f#$image}." | ||||
143 | rm $f | ||||
144 | continue | ||||
145 | fi | ||||
Milton Miller | 36d336c | 2016-02-05 11:19:58 -0600 | [diff] [blame] | 146 | m=$(findmtd ${f#$image}) |
147 | echo "Updating ${f#$image}..." | ||||
Milton D. Miller II | ec10f89 | 2016-02-29 07:55:49 -0600 | [diff] [blame] | 148 | flashcp -v $f /dev/$m && rm $f |
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 149 | done |
150 | |||||
Milton Miller | a67cc44 | 2016-05-23 18:35:21 -0500 | [diff] [blame] | 151 | if test -d $save -a "x$toram" = xy |
Milton D. Miller II | 7141eb0 | 2016-02-29 21:44:22 -0600 | [diff] [blame] | 152 | then |
153 | mkdir -p $upper | ||||
154 | cp -rp $save/. $upper/ | ||||
155 | fi | ||||
156 | |||||
Milton D. Miller II | ecf68d5 | 2016-02-29 23:11:27 -0600 | [diff] [blame] | 157 | if test -d $save -a "x$dorestore" = xy |
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 158 | then |
Milton D. Miller II | facb718 | 2016-02-28 16:20:19 -0600 | [diff] [blame] | 159 | odir=$rwdir |
160 | rwdir=/run/rw | ||||
161 | upper=$rwdir${upper#$odir} | ||||
162 | |||||
163 | mkdir -p $rwdir | ||||
Andrew Jeffery | 25a5022 | 2016-02-23 23:47:23 +1030 | [diff] [blame] | 164 | mount $rwdev $rwdir -t $(probe_fs_type $rwdev) -o $rwopts |
Milton D. Miller II | ba2b7c9 | 2016-02-28 18:17:02 -0600 | [diff] [blame] | 165 | mkdir -p $upper |
Milton Miller | ba65b7b | 2016-02-05 12:07:53 -0600 | [diff] [blame] | 166 | cp -rp $save/. $upper/ |
167 | umount $rwdir | ||||
Milton D. Miller II | facb718 | 2016-02-28 16:20:19 -0600 | [diff] [blame] | 168 | rmdir $rwdir |
Milton D. Miller II | 0e77514 | 2016-01-20 14:57:54 -0600 | [diff] [blame] | 169 | fi |
170 | |||||
Milton D. Miller II | d0b0c6a | 2016-02-28 16:32:14 -0600 | [diff] [blame] | 171 | if test "x$doclean" = xy |
172 | then | ||||
173 | rm -rf $save | ||||
174 | fi | ||||
175 | |||||
Milton Miller | dbacf10 | 2016-02-05 13:56:18 -0600 | [diff] [blame] | 176 | exit |