| OLD | NEW |
| 1 #!/bin/bash | 1 #!/bin/bash |
| 2 | 2 |
| 3 # Copyright (c) 2009-2010 The Chromium OS Authors. All rights reserved. | 3 # Copyright (c) 2009-2010 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 update an image onto a live running ChromiumOS instance. | 7 # Script to update an image onto a live running ChromiumOS instance. |
| 8 | 8 |
| 9 # Load common constants. This should be the first executable line. | 9 # Load common constants. This should be the first executable line. |
| 10 # The path to common.sh should be relative to your script's location. | 10 # The path to common.sh should be relative to your script's location. |
| 11 | 11 |
| 12 . "$(dirname $0)/common.sh" | 12 . "$(dirname $0)/common.sh" |
| 13 . "$(dirname $0)/remote_access.sh" | 13 . "$(dirname $0)/remote_access.sh" |
| 14 | 14 |
| 15 # Flags to control image_to_live. | 15 # Flags to control image_to_live. |
| 16 DEFINE_boolean ignore_hostname ${FLAGS_TRUE} \ | 16 DEFINE_boolean ignore_hostname ${FLAGS_TRUE} \ |
| 17 "Ignore existing AU hostname on running instance use this hostname." | 17 "Ignore existing AU hostname on running instance use this hostname." |
| 18 DEFINE_boolean ignore_version ${FLAGS_TRUE} \ | 18 DEFINE_boolean ignore_version ${FLAGS_TRUE} \ |
| 19 "Ignore existing version on running instance and always update." | 19 "Ignore existing version on running instance and always update." |
| 20 DEFINE_string server_log "dev_server.log" \ | 20 DEFINE_string server_log "dev_server.log" \ |
| 21 "Path to log for the devserver." | 21 "Path to log for the devserver." |
| 22 DEFINE_boolean update "${FLAGS_TRUE}" \ | 22 DEFINE_boolean update "${FLAGS_TRUE}" \ |
| 23 "Perform update of root partition." | 23 "Perform update of root partition." |
| 24 DEFINE_boolean update_known_hosts ${FLAGS_FALSE} \ | 24 DEFINE_boolean update_known_hosts ${FLAGS_FALSE} \ |
| 25 "Update your known_hosts with the new remote instance's key." | 25 "Update your known_hosts with the new remote instance's key." |
| 26 DEFINE_string update_log "update_engine.log" \ | 26 DEFINE_string update_log "update_engine.log" \ |
| 27 "Path to log for the update_engine." | 27 "Path to log for the update_engine." |
| 28 DEFINE_boolean verify ${FLAGS_TRUE} "Verify image on device after update." |
| 28 | 29 |
| 29 # Flags for devserver. | 30 # Flags for devserver. |
| 30 DEFINE_string archive_dir "" \ | 31 DEFINE_string archive_dir "" \ |
| 31 "Update using the test image in the image.zip in this directory." a | 32 "Update using the test image in the image.zip in this directory." a |
| 32 DEFINE_integer devserver_port 8080 \ | 33 DEFINE_integer devserver_port 8080 \ |
| 33 "Port to use for devserver." | 34 "Port to use for devserver." |
| 34 DEFINE_string image "" \ | 35 DEFINE_string image "" \ |
| 35 "Update with this image path that is in this source checkout." i | 36 "Update with this image path that is in this source checkout." i |
| 37 DEFINE_boolean update_stateful ${FLAGS_TRUE} \ |
| 38 "Perform update of stateful partition e.g. /var /usr/local." |
| 36 DEFINE_string update_url "" "Full url of an update image." | 39 DEFINE_string update_url "" "Full url of an update image." |
| 37 | 40 |
| 38 # Flags for stateful update. | 41 # Flags for stateful update. |
| 39 DEFINE_string stateful_update_flag "" \ | 42 DEFINE_string stateful_update_flag "" \ |
| 40 "Flag to pass to stateful update e.g. old, clean, etc." s | 43 "Flag to pass to stateful update e.g. old, clean, etc." s |
| 41 | 44 |
| 42 UPDATER_BIN='/usr/bin/update_engine_client' | 45 UPDATER_BIN="/usr/bin/update_engine_client" |
| 43 UPDATER_IDLE='UPDATE_STATUS_IDLE' | 46 UPDATER_IDLE="UPDATE_STATUS_IDLE" |
| 44 UPDATER_NEED_REBOOT='UPDATE_STATUS_UPDATED_NEED_REBOOT' | 47 UPDATER_NEED_REBOOT="UPDATE_STATUS_UPDATED_NEED_REBOOT" |
| 45 UPDATER_UPDATE_CHECK='UPDATE_STATUS_CHECKING_FOR_UPDATE' | 48 UPDATER_UPDATE_CHECK="UPDATE_STATUS_CHECKING_FOR_UPDATE" |
| 46 UPDATER_DOWNLOADING='UPDATE_STATUS_DOWNLOADING' | 49 UPDATER_DOWNLOADING="UPDATE_STATUS_DOWNLOADING" |
| 50 |
| 51 IMAGE_PATH="" |
| 47 | 52 |
| 48 function kill_all_devservers { | 53 function kill_all_devservers { |
| 49 # Using ! here to avoid exiting with set -e is insufficient, so use | 54 # Using ! here to avoid exiting with set -e is insufficient, so use |
| 50 # || true instead. | 55 # || true instead. |
| 51 sudo pkill -f devserver\.py || true | 56 sudo pkill -f devserver\.py || true |
| 52 } | 57 } |
| 53 | 58 |
| 54 function cleanup { | 59 function cleanup { |
| 55 if [ -z "${FLAGS_update_url}" ]; then | 60 if [ -z "${FLAGS_update_url}" ]; then |
| 56 kill_all_devservers | 61 kill_all_devservers |
| (...skipping 25 matching lines...) Expand all Loading... |
| 82 echo "/home/${USER}/trunk/${relative_path}" | 87 echo "/home/${USER}/trunk/${relative_path}" |
| 83 } | 88 } |
| 84 | 89 |
| 85 function start_dev_server { | 90 function start_dev_server { |
| 86 kill_all_devservers | 91 kill_all_devservers |
| 87 local devserver_flags=${FLAGS_devserver_port} | 92 local devserver_flags=${FLAGS_devserver_port} |
| 88 # Parse devserver flags. | 93 # Parse devserver flags. |
| 89 if [ -n "${FLAGS_image}" ]; then | 94 if [ -n "${FLAGS_image}" ]; then |
| 90 devserver_flags="${devserver_flags} \ | 95 devserver_flags="${devserver_flags} \ |
| 91 --image $(reinterpret_path_for_chroot ${FLAGS_image})" | 96 --image $(reinterpret_path_for_chroot ${FLAGS_image})" |
| 97 IMAGE_PATH="${FLAGS_image}" |
| 98 |
| 92 elif [ -n "${FLAGS_archive_dir}" ]; then | 99 elif [ -n "${FLAGS_archive_dir}" ]; then |
| 93 devserver_flags="${devserver_flags} \ | 100 devserver_flags="${devserver_flags} \ |
| 94 --archive_dir $(reinterpret_path_for_chroot ${FLAGS_archive_dir}) -t" | 101 --archive_dir $(reinterpret_path_for_chroot ${FLAGS_archive_dir}) -t" |
| 102 IMAGE_PATH="${FLAGS_archive_dir}/chromiumos_test_image.bin" |
| 95 fi | 103 fi |
| 96 | 104 |
| 97 info "Starting devserver with flags ${devserver_flags}" | 105 info "Starting devserver with flags ${devserver_flags}" |
| 98 ./enter_chroot.sh "sudo ./start_devserver ${devserver_flags} \ | 106 ./enter_chroot.sh "sudo ./start_devserver ${devserver_flags} \ |
| 99 --client_prefix=ChromeOSUpdateEngine > ${FLAGS_server_log} 2>&1" & | 107 --client_prefix=ChromeOSUpdateEngine > ${FLAGS_server_log} 2>&1" & |
| 100 | 108 |
| 101 echo -n "Waiting on devserver to start" | 109 echo -n "Waiting on devserver to start" |
| 102 until netstat -anp 2>&1 | grep 0.0.0.0:${FLAGS_devserver_port} > /dev/null | 110 until netstat -anp 2>&1 | grep 0.0.0.0:${FLAGS_devserver_port} > /dev/null |
| 103 do | 111 do |
| 104 sleep .5 | 112 sleep .5 |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 251 info "Not yet rebooted" | 259 info "Not yet rebooted" |
| 252 else | 260 else |
| 253 info "Rebooted and responding" | 261 info "Rebooted and responding" |
| 254 break | 262 break |
| 255 fi | 263 fi |
| 256 fi | 264 fi |
| 257 sleep .5 | 265 sleep .5 |
| 258 done | 266 done |
| 259 } | 267 } |
| 260 | 268 |
| 269 function verify_image { |
| 270 info "Verifying image." |
| 271 "${SCRIPTS_DIR}/mount_gpt_image.sh" --from "$(dirname ${IMAGE_PATH})" \ |
| 272 --image "$(basename ${IMAGE_PATH})" \ |
| 273 --read_only |
| 274 |
| 275 local lsb_release=$(cat /tmp/m/etc/lsb-release) |
| 276 info "Verifying image with release:" |
| 277 echo ${lsb_release} |
| 278 |
| 279 "${SCRIPTS_DIR}/mount_gpt_image.sh" --unmount |
| 280 |
| 281 remote_sh "cat /etc/lsb-release" |
| 282 info "Remote image reports:" |
| 283 echo ${REMOTE_OUT} |
| 284 |
| 285 if [ "${lsb_release}" = "${REMOTE_OUT}" ]; then |
| 286 info "Update was successful and image verified as ${lsb_release}." |
| 287 return 0 |
| 288 else |
| 289 warn "Image verification failed." |
| 290 return 1 |
| 291 fi |
| 292 } |
| 293 |
| 261 function main() { | 294 function main() { |
| 262 assert_outside_chroot | 295 assert_outside_chroot |
| 263 | 296 |
| 264 cd $(dirname "$0") | 297 cd $(dirname "$0") |
| 265 | 298 |
| 266 FLAGS "$@" || exit 1 | 299 FLAGS "$@" || exit 1 |
| 267 eval set -- "${FLAGS_ARGV}" | 300 eval set -- "${FLAGS_ARGV}" |
| 268 | 301 |
| 269 set -e | 302 set -e |
| 270 | 303 |
| 304 if [ ${FLAGS_verify} -eq ${FLAGS_TRUE} ] && \ |
| 305 [ -n "${FLAGS_update_url}" ]; then |
| 306 warn "Verify is not compatible with setting an update url." |
| 307 FLAGS_verify=${FLAGS_FALSE} |
| 308 fi |
| 309 |
| 271 trap cleanup EXIT | 310 trap cleanup EXIT |
| 272 | 311 |
| 273 TMP=$(mktemp -d /tmp/image_to_live.XXXX) | 312 TMP=$(mktemp -d /tmp/image_to_live.XXXX) |
| 274 | 313 |
| 275 remote_access_init | 314 remote_access_init |
| 276 | 315 |
| 277 if [ "$(get_update_var CURRENT_OP)" != "${UPDATER_IDLE}" ]; then | 316 if [ "$(get_update_var CURRENT_OP)" != "${UPDATER_IDLE}" ]; then |
| 278 warn "Machine is in a bad state. Rebooting it now." | 317 warn "Machine is in a bad state. Rebooting it now." |
| 279 remote_reboot | 318 remote_reboot |
| 280 fi | 319 fi |
| 281 | 320 |
| 282 if [ -z "${FLAGS_update_url}" ]; then | 321 if [ -z "${FLAGS_update_url}" ]; then |
| 283 # Start local devserver if no update url specified. | 322 # Start local devserver if no update url specified. |
| 284 start_dev_server | 323 start_dev_server |
| 285 fi | 324 fi |
| 286 | 325 |
| 287 if [ "${FLAGS_update}" -eq "${FLAGS_TRUE}" ] && ! run_auto_update; then | 326 if [ ${FLAGS_update} -eq ${FLAGS_TRUE} ] && ! run_auto_update; then |
| 288 die "Update was not successful." | 327 die "Update was not successful." |
| 289 fi | 328 fi |
| 290 | 329 |
| 291 if ! run_stateful_update; then | 330 if [ ${FLAGS_update_stateful} -eq ${FLAGS_TRUE} ] && \ |
| 331 ! run_stateful_update; then |
| 292 warn "Stateful update was not successful." | 332 warn "Stateful update was not successful." |
| 293 fi | 333 fi |
| 294 | 334 |
| 295 remote_reboot | 335 remote_reboot |
| 296 | 336 |
| 297 if [[ ${FLAGS_update_hostkey} -eq ${FLAGS_TRUE} ]]; then | 337 if [[ ${FLAGS_update_hostkey} -eq ${FLAGS_TRUE} ]]; then |
| 298 local known_hosts="${HOME}/.ssh/known_hosts" | 338 local known_hosts="${HOME}/.ssh/known_hosts" |
| 299 cp "${known_hosts}" "${known_hosts}~" | 339 cp "${known_hosts}" "${known_hosts}~" |
| 300 grep -v "^${FLAGS_remote} " "${known_hosts}" > "${TMP}/new_known_hosts" | 340 grep -v "^${FLAGS_remote} " "${known_hosts}" > "${TMP}/new_known_hosts" |
| 301 cat "${TMP}/new_known_hosts" "${TMP_KNOWN_HOSTS}" > "${known_hosts}" | 341 cat "${TMP}/new_known_hosts" "${TMP_KNOWN_HOSTS}" > "${known_hosts}" |
| 302 chmod 0640 "${known_hosts}" | 342 chmod 0640 "${known_hosts}" |
| 303 info "New updated in ${known_hosts}, backup made." | 343 info "New updated in ${known_hosts}, backup made." |
| 304 fi | 344 fi |
| 305 | 345 |
| 306 remote_sh "grep ^CHROMEOS_RELEASE_DESCRIPTION= /etc/lsb-release" | 346 remote_sh "grep ^CHROMEOS_RELEASE_DESCRIPTION= /etc/lsb-release" |
| 307 local release_description=$(echo ${REMOTE_OUT} | cut -d '=' -f 2) | 347 if [ ${FLAGS_verify} -eq ${FLAGS_TRUE} ]; then |
| 308 info "Update was successful and rebooted to $release_description" | 348 verify_image |
| 349 else |
| 350 local release_description=$(echo ${REMOTE_OUT} | cut -d '=' -f 2) |
| 351 info "Update was successful and rebooted to $release_description" |
| 352 fi |
| 309 | 353 |
| 310 return 0 | 354 exit 0 |
| 311 } | 355 } |
| 312 | 356 |
| 313 main $@ | 357 main $@ |
| OLD | NEW |