OLD | NEW |
1 #!/bin/bash | 1 #!/bin/bash |
2 | 2 |
3 # Copyright (c) 2009 The Chromium OS Authors. All rights reserved. | 3 # Copyright (c) 2009 The Chromium OS Authors. All rights reserved. |
4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
6 | 6 |
7 # Script to generate a factory install partition set and miniomaha.conf | 7 # Script to generate a factory install partition set and miniomaha.conf |
8 # file from a release image and a factory image. This creates a server | 8 # file from a release image and a factory image. This creates a server |
9 # configuration that can be installed using a factory install shim. | 9 # configuration that can be installed using a factory install shim. |
10 # | 10 # |
(...skipping 16 matching lines...) Expand all Loading... |
27 # Flags | 27 # Flags |
28 DEFINE_string board "${DEFAULT_BOARD}" "Board for which the image was built" | 28 DEFINE_string board "${DEFAULT_BOARD}" "Board for which the image was built" |
29 DEFINE_string factory "" \ | 29 DEFINE_string factory "" \ |
30 "Directory and file containing factory image: /path/chromiumos_test_image.bin" | 30 "Directory and file containing factory image: /path/chromiumos_test_image.bin" |
31 DEFINE_string firmware_updater "" \ | 31 DEFINE_string firmware_updater "" \ |
32 "If set, include the firmware shellball into the server configuration" | 32 "If set, include the firmware shellball into the server configuration" |
33 DEFINE_string release "" \ | 33 DEFINE_string release "" \ |
34 "Directory and file containing release image: /path/chromiumos_image.bin" | 34 "Directory and file containing release image: /path/chromiumos_image.bin" |
35 DEFINE_string subfolder "" \ | 35 DEFINE_string subfolder "" \ |
36 "If set, the name of the subfolder to put the payload items inside" | 36 "If set, the name of the subfolder to put the payload items inside" |
| 37 DEFINE_string diskimg "" \ |
| 38 "If set, the name of the diskimage file to output" |
| 39 DEFINE_boolean preserve ${FLAGS_FALSE} \ |
| 40 "If set, reuse the diskimage file, if available" |
| 41 DEFINE_integer sectors 31277232 "Size of image in sectors" |
37 | 42 |
38 # Parse command line | 43 # Parse command line |
39 FLAGS "$@" || exit 1 | 44 FLAGS "$@" || exit 1 |
40 eval set -- "${FLAGS_ARGV}" | 45 eval set -- "${FLAGS_ARGV}" |
41 | 46 |
42 if [ ! -f "${FLAGS_release}" ]; then | 47 if [ ! -f "${FLAGS_release}" ]; then |
43 echo "Cannot find image file ${FLAGS_release}" | 48 echo "Cannot find image file ${FLAGS_release}" |
44 exit 1 | 49 exit 1 |
45 fi | 50 fi |
46 | 51 |
(...skipping 26 matching lines...) Expand all Loading... |
73 sudo -v | 78 sudo -v |
74 echo "Done" | 79 echo "Done" |
75 fi | 80 fi |
76 | 81 |
77 # Use this image as the source image to copy | 82 # Use this image as the source image to copy |
78 RELEASE_DIR="$(dirname "${FLAGS_release}")" | 83 RELEASE_DIR="$(dirname "${FLAGS_release}")" |
79 FACTORY_DIR="$(dirname "${FLAGS_factory}")" | 84 FACTORY_DIR="$(dirname "${FLAGS_factory}")" |
80 RELEASE_IMAGE="$(basename "${FLAGS_release}")" | 85 RELEASE_IMAGE="$(basename "${FLAGS_release}")" |
81 FACTORY_IMAGE="$(basename "${FLAGS_factory}")" | 86 FACTORY_IMAGE="$(basename "${FLAGS_factory}")" |
82 | 87 |
| 88 prepare_img() { |
| 89 local outdev="$FLAGS_diskimg" |
| 90 local sectors="$FLAGS_sectors" |
| 91 local force_full="true" |
| 92 |
| 93 # We'll need some code to put in the PMBR, for booting on legacy BIOS. |
| 94 echo "Fetch PMBR" |
| 95 local pmbrcode="$(mktemp -d)/gptmbr.bin" |
| 96 sudo dd bs=512 count=1 if="${FLAGS_release}" of="${pmbrcode}" status=noxfer |
| 97 |
| 98 echo "Prepare base disk image" |
| 99 # Create an output file if requested, or if none exists. |
| 100 if [ -b "${outdev}" ] ; then |
| 101 echo "Using block device ${outdev}" |
| 102 elif [ ! -e "${outdev}" -o \ |
| 103 "$(stat -c %s ${outdev})" != "$(( ${sectors} * 512 ))" -o \ |
| 104 "$FLAGS_preserve" = "$FLAGS_FALSE" ]; then |
| 105 echo "Generating empty image file" |
| 106 image_dump_partial_file /dev/zero 0 "${sectors}" | |
| 107 dd of="${outdev}" bs=8M |
| 108 else |
| 109 echo "Reusing $outdev" |
| 110 fi |
| 111 |
| 112 # Create GPT partition table. |
| 113 install_gpt "${outdev}" 0 0 "${pmbrcode}" 0 "${force_full}" |
| 114 # Activate the correct partition. |
| 115 cgpt add -i 2 -S 1 -P 1 "${outdev}" |
| 116 } |
83 | 117 |
84 prepare_omaha() { | 118 prepare_omaha() { |
85 sudo rm -rf "${OMAHA_DATA_DIR}/rootfs-test.gz" | 119 sudo rm -rf "${OMAHA_DATA_DIR}/rootfs-test.gz" |
86 sudo rm -rf "${OMAHA_DATA_DIR}/rootfs-release.gz" | 120 sudo rm -rf "${OMAHA_DATA_DIR}/rootfs-release.gz" |
87 rm -rf "${OMAHA_DATA_DIR}/efi.gz" | 121 rm -rf "${OMAHA_DATA_DIR}/efi.gz" |
88 rm -rf "${OMAHA_DATA_DIR}/oem.gz" | 122 rm -rf "${OMAHA_DATA_DIR}/oem.gz" |
89 rm -rf "${OMAHA_DATA_DIR}/state.gz" | 123 rm -rf "${OMAHA_DATA_DIR}/state.gz" |
90 if [ ! -d "${OMAHA_DATA_DIR}" ]; then | 124 if [ ! -d "${OMAHA_DATA_DIR}" ]; then |
91 mkdir -p "${OMAHA_DATA_DIR}" | 125 mkdir -p "${OMAHA_DATA_DIR}" |
92 fi | 126 fi |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
138 local output_file="$3" | 172 local output_file="$3" |
139 | 173 |
140 if [ -n "${IMAGE_IS_UNPACKED}" ]; then | 174 if [ -n "${IMAGE_IS_UNPACKED}" ]; then |
141 compress_and_hash_file "part_$part_num" "$output_file" | 175 compress_and_hash_file "part_$part_num" "$output_file" |
142 else | 176 else |
143 image_dump_partition "$input_file" "$part_num" | | 177 image_dump_partition "$input_file" "$part_num" | |
144 compress_and_hash_file "" "$output_file" | 178 compress_and_hash_file "" "$output_file" |
145 fi | 179 fi |
146 } | 180 } |
147 | 181 |
148 # Clean up stale config and data files. | |
149 prepare_omaha | |
150 | |
151 # Decide if we should unpack partition | 182 # Decide if we should unpack partition |
152 if image_has_part_tools; then | 183 if image_has_part_tools; then |
153 IMAGE_IS_UNPACKED= | 184 IMAGE_IS_UNPACKED= |
154 else | 185 else |
155 #TODO(hungte) Currently we run unpack_partitions.sh if part_tools are not | 186 #TODO(hungte) Currently we run unpack_partitions.sh if part_tools are not |
156 # found. If the format of unpack_partitions.sh is reliable, we can prevent | 187 # found. If the format of unpack_partitions.sh is reliable, we can prevent |
157 # creating temporary files. See image_part_offset for more information. | 188 # creating temporary files. See image_part_offset for more information. |
158 echo "WARNING: cannot find partition tools. Using unpack_partitions.sh." >&2 | 189 echo "WARNING: cannot find partition tools. Using unpack_partitions.sh." >&2 |
159 IMAGE_IS_UNPACKED=1 | 190 IMAGE_IS_UNPACKED=1 |
160 fi | 191 fi |
161 | 192 |
162 # Get the release image. | 193 generate_img() { |
163 pushd "${RELEASE_DIR}" >/dev/null | 194 local outdev="$FLAGS_diskimg" |
164 echo "Generating omaha release image from ${FLAGS_release}" | 195 local sectors="$FLAGS_sectors" |
165 echo "Generating omaha factory image from ${FLAGS_factory}" | |
166 echo "Output omaha image to ${OMAHA_DATA_DIR}" | |
167 echo "Output omaha config to ${OMAHA_CONF}" | |
168 | 196 |
169 prepare_dir | 197 prepare_img |
170 | 198 |
171 if [ -n "${IMAGE_IS_UNPACKED}" ]; then | 199 # Get the release image. |
172 echo "Unpacking image ${RELEASE_IMAGE} ..." >&2 | 200 pushd "${RELEASE_DIR}" >/dev/null |
173 sudo ./unpack_partitions.sh "${RELEASE_IMAGE}" 2>/dev/null | |
174 fi | |
175 | 201 |
176 release_hash="$(compress_and_hash_memento_image "${RELEASE_IMAGE}")" | 202 echo "Release Kernel" |
177 sudo chmod a+rw update.gz | 203 image_partition_copy "${RELEASE_IMAGE}" 2 "${outdev}" 4 |
178 mv update.gz rootfs-release.gz | |
179 mv rootfs-release.gz "${OMAHA_DATA_DIR}" | |
180 echo "release: ${release_hash}" | |
181 | 204 |
182 oem_hash="$(compress_and_hash_partition "${RELEASE_IMAGE}" 8 "oem.gz")" | 205 echo "Release Rootfs" |
183 mv oem.gz "${OMAHA_DATA_DIR}" | 206 image_partition_copy "${RELEASE_IMAGE}" 3 "${outdev}" 5 |
184 echo "oem: ${oem_hash}" | |
185 | 207 |
186 efi_hash="$(compress_and_hash_partition "${RELEASE_IMAGE}" 12 "efi.gz")" | 208 echo "OEM parition" |
187 mv efi.gz "${OMAHA_DATA_DIR}" | 209 image_partition_copy "${RELEASE_IMAGE}" 8 "${outdev}" 8 |
188 echo "efi: ${efi_hash}" | |
189 | 210 |
190 popd >/dev/null | 211 popd >/dev/null |
191 | 212 |
192 # Go to retrieve the factory test image. | 213 # Go to retrieve the factory test image. |
193 pushd "${FACTORY_DIR}" >/dev/null | 214 pushd "${FACTORY_DIR}" >/dev/null |
194 prepare_dir | |
195 | 215 |
196 if [ -n "${IMAGE_IS_UNPACKED}" ]; then | 216 echo "Factory Kernel" |
197 echo "Unpacking image ${FACTORY_IMAGE} ..." >&2 | 217 image_partition_copy "${FACTORY_IMAGE}" 2 "${outdev}" 2 |
198 sudo ./unpack_partitions.sh "${FACTORY_IMAGE}" 2>/dev/null | 218 echo "Factory Rootfs" |
199 fi | 219 image_partition_copy "${FACTORY_IMAGE}" 3 "${outdev}" 3 |
| 220 echo "Factory Stateful" |
| 221 image_partition_copy "${FACTORY_IMAGE}" 1 "${outdev}" 1 |
| 222 echo "EFI Partition" |
| 223 image_partition_copy "${FACTORY_IMAGE}" 12 "${outdev}" 12 |
200 | 224 |
201 test_hash="$(compress_and_hash_memento_image "${FACTORY_IMAGE}")" | 225 echo "Generated Image at $outdev." |
202 sudo chmod a+rw update.gz | 226 echo "Done" |
203 mv update.gz rootfs-test.gz | 227 } |
204 mv rootfs-test.gz "${OMAHA_DATA_DIR}" | |
205 echo "test: ${test_hash}" | |
206 | 228 |
207 state_hash="$(compress_and_hash_partition "${FACTORY_IMAGE}" 1 "state.gz")" | 229 generate_omaha() { |
208 mv state.gz "${OMAHA_DATA_DIR}" | 230 # Clean up stale config and data files. |
209 echo "state: ${state_hash}" | 231 prepare_omaha |
210 | 232 |
211 popd >/dev/null | 233 # Get the release image. |
| 234 pushd "${RELEASE_DIR}" >/dev/null |
| 235 echo "Generating omaha release image from ${FLAGS_release}" |
| 236 echo "Generating omaha factory image from ${FLAGS_factory}" |
| 237 echo "Output omaha image to ${OMAHA_DATA_DIR}" |
| 238 echo "Output omaha config to ${OMAHA_CONF}" |
212 | 239 |
213 if [ -n "${FLAGS_firmware_updater}" ]; then | 240 prepare_dir |
214 SHELLBALL="${FLAGS_firmware_updater}" | 241 |
215 if [ ! -f "$SHELLBALL" ]; then | 242 if [ -n "${IMAGE_IS_UNPACKED}" ]; then |
216 echo "Failed to find firmware updater: $SHELLBALL." | 243 echo "Unpacking image ${RELEASE_IMAGE} ..." >&2 |
217 exit 1 | 244 sudo ./unpack_partitions.sh "${RELEASE_IMAGE}" 2>/dev/null |
218 fi | 245 fi |
219 | 246 |
220 firmware_hash="$(compress_and_hash_file "$SHELLBALL" "firmware.gz")" | 247 release_hash="$(compress_and_hash_memento_image "${RELEASE_IMAGE}")" |
221 mv firmware.gz "${OMAHA_DATA_DIR}" | 248 sudo chmod a+rw update.gz |
222 echo "firmware: ${firmware_hash}" | 249 mv update.gz rootfs-release.gz |
223 fi | 250 mv rootfs-release.gz "${OMAHA_DATA_DIR}" |
| 251 echo "release: ${release_hash}" |
224 | 252 |
225 # If the file does exist and we are using the subfolder flag we are going to | 253 oem_hash="$(compress_and_hash_partition "${RELEASE_IMAGE}" 8 "oem.gz")" |
226 # append another config. | 254 mv oem.gz "${OMAHA_DATA_DIR}" |
227 if [ -n "${FLAGS_subfolder}" ] && | 255 echo "oem: ${oem_hash}" |
228 [ -f "${OMAHA_CONF}" ]; then | |
229 # Remove the ']' from the last line of the file so we can add another config. | |
230 while [ -s "${OMAHA_CONF}" ]; do | |
231 # If the last line is null | |
232 if [ -z "$(tail -1 "${OMAHA_CONF}")" ]; then | |
233 sed -i '$d' "${OMAHA_CONF}" | |
234 elif [ "$(tail -1 "${OMAHA_CONF}")" != ']' ]; then | |
235 sed -i '$d' "${OMAHA_CONF}" | |
236 else | |
237 break | |
238 fi | |
239 done | |
240 | 256 |
241 # Remove the last ] | 257 popd >/dev/null |
242 if [ "$(tail -1 "${OMAHA_CONF}")" = ']' ]; then | 258 |
243 sed -i '$d' "${OMAHA_CONF}" | 259 # Go to retrieve the factory test image. |
| 260 pushd "${FACTORY_DIR}" >/dev/null |
| 261 prepare_dir |
| 262 |
| 263 if [ -n "${IMAGE_IS_UNPACKED}" ]; then |
| 264 echo "Unpacking image ${FACTORY_IMAGE} ..." >&2 |
| 265 sudo ./unpack_partitions.sh "${FACTORY_IMAGE}" 2>/dev/null |
244 fi | 266 fi |
245 | 267 |
246 # If the file is empty, create it from scratch | 268 test_hash="$(compress_and_hash_memento_image "${FACTORY_IMAGE}")" |
247 if [ ! -s "${OMAHA_CONF}" ]; then | 269 sudo chmod a+rw update.gz |
| 270 mv update.gz rootfs-test.gz |
| 271 mv rootfs-test.gz "${OMAHA_DATA_DIR}" |
| 272 echo "test: ${test_hash}" |
| 273 |
| 274 state_hash="$(compress_and_hash_partition "${FACTORY_IMAGE}" 1 "state.gz")" |
| 275 mv state.gz "${OMAHA_DATA_DIR}" |
| 276 echo "state: ${state_hash}" |
| 277 |
| 278 efi_hash="$(compress_and_hash_partition "${FACTORY_IMAGE}" 12 "efi.gz")" |
| 279 mv efi.gz "${OMAHA_DATA_DIR}" |
| 280 echo "efi: ${efi_hash}" |
| 281 |
| 282 popd >/dev/null |
| 283 |
| 284 if [ -n "${FLAGS_firmware_updater}" ]; then |
| 285 SHELLBALL="${FLAGS_firmware_updater}" |
| 286 if [ ! -f "$SHELLBALL" ]; then |
| 287 echo "Failed to find firmware updater: $SHELLBALL." |
| 288 exit 1 |
| 289 fi |
| 290 |
| 291 firmware_hash="$(compress_and_hash_file "$SHELLBALL" "firmware.gz")" |
| 292 mv firmware.gz "${OMAHA_DATA_DIR}" |
| 293 echo "firmware: ${firmware_hash}" |
| 294 fi |
| 295 |
| 296 # If the file does exist and we are using the subfolder flag we are going to |
| 297 # append another config. |
| 298 if [ -n "${FLAGS_subfolder}" ] && |
| 299 [ -f "${OMAHA_CONF}" ]; then |
| 300 # Remove the ']' from the last line of the file |
| 301 # so we can add another config. |
| 302 while [ -s "${OMAHA_CONF}" ]; do |
| 303 # If the last line is null |
| 304 if [ -z "$(tail -1 "${OMAHA_CONF}")" ]; then |
| 305 sed -i '$d' "${OMAHA_CONF}" |
| 306 elif [ "$(tail -1 "${OMAHA_CONF}")" != ']' ]; then |
| 307 sed -i '$d' "${OMAHA_CONF}" |
| 308 else |
| 309 break |
| 310 fi |
| 311 done |
| 312 |
| 313 # Remove the last ] |
| 314 if [ "$(tail -1 "${OMAHA_CONF}")" = ']' ]; then |
| 315 sed -i '$d' "${OMAHA_CONF}" |
| 316 fi |
| 317 |
| 318 # If the file is empty, create it from scratch |
| 319 if [ ! -s "${OMAHA_CONF}" ]; then |
| 320 echo "config = [" >"${OMAHA_CONF}" |
| 321 fi |
| 322 else |
248 echo "config = [" >"${OMAHA_CONF}" | 323 echo "config = [" >"${OMAHA_CONF}" |
249 fi | 324 fi |
250 else | |
251 echo "config = [" >"${OMAHA_CONF}" | |
252 fi | |
253 | 325 |
254 if [ -n "${FLAGS_subfolder}" ]; then | 326 if [ -n "${FLAGS_subfolder}" ]; then |
255 subfolder="${FLAGS_subfolder}/" | 327 subfolder="${FLAGS_subfolder}/" |
256 fi | 328 fi |
257 | 329 |
258 echo -n "{ | 330 echo -n "{ |
259 'qual_ids': set([\"${FLAGS_board}\"]), | 331 'qual_ids': set([\"${FLAGS_board}\"]), |
260 'factory_image': '${subfolder}rootfs-test.gz', | 332 'factory_image': '${subfolder}rootfs-test.gz', |
261 'factory_checksum': '${test_hash}', | 333 'factory_checksum': '${test_hash}', |
262 'release_image': '${subfolder}rootfs-release.gz', | 334 'release_image': '${subfolder}rootfs-release.gz', |
263 'release_checksum': '${release_hash}', | 335 'release_checksum': '${release_hash}', |
264 'oempartitionimg_image': '${subfolder}oem.gz', | 336 'oempartitionimg_image': '${subfolder}oem.gz', |
265 'oempartitionimg_checksum': '${oem_hash}', | 337 'oempartitionimg_checksum': '${oem_hash}', |
266 'efipartitionimg_image': '${subfolder}efi.gz', | 338 'efipartitionimg_image': '${subfolder}efi.gz', |
267 'efipartitionimg_checksum': '${efi_hash}', | 339 'efipartitionimg_checksum': '${efi_hash}', |
268 'stateimg_image': '${subfolder}state.gz', | 340 'stateimg_image': '${subfolder}state.gz', |
269 'stateimg_checksum': '${state_hash}'," >>"${OMAHA_CONF}" | 341 'stateimg_checksum': '${state_hash}'," >>"${OMAHA_CONF}" |
270 | 342 |
271 if [ -n "${FLAGS_firmware_updater}" ] ; then | 343 if [ -n "${FLAGS_firmware_updater}" ] ; then |
272 echo -n " | 344 echo -n " |
273 'firmware_image': '${subfolder}firmware.gz', | 345 'firmware_image': '${subfolder}firmware.gz', |
274 'firmware_checksum': '${firmware_hash}'," >>"${OMAHA_CONF}" | 346 'firmware_checksum': '${firmware_hash}'," >>"${OMAHA_CONF}" |
275 fi | 347 fi |
276 | 348 |
277 echo -n " | 349 echo -n " |
278 }, | 350 }, |
279 ] | 351 ] |
280 " >>"${OMAHA_CONF}" | 352 " >>"${OMAHA_CONF}" |
281 | 353 |
282 echo "The miniomaha server lives in src/platform/dev. | 354 echo "The miniomaha server lives in src/platform/dev. |
283 To validate the configutarion, run: | 355 To validate the configutarion, run: |
284 python2.6 devserver.py --factory_config miniomaha.conf \ | 356 python2.6 devserver.py --factory_config miniomaha.conf \ |
285 --validate_factory_config | 357 --validate_factory_config |
286 To run the server: | 358 To run the server: |
287 python2.6 devserver.py --factory_config miniomaha.conf" | 359 python2.6 devserver.py --factory_config miniomaha.conf" |
| 360 } |
| 361 |
| 362 # Main |
| 363 if [ -n "$FLAGS_diskimg" ]; then |
| 364 generate_img |
| 365 else |
| 366 generate_omaha |
| 367 fi |
OLD | NEW |