| #!/bin/sh |
| |
| # Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| # This scripts performs update of stateful partition directories useful for |
| # dev_mode. |
| |
| # in order to support developers going from older images with the old shflags |
| # we'll check for both new shflags and old shflags |
| if [ -f /usr/share/misc/shflags ] ; then |
| . /usr/share/misc/shflags |
| elif [ -f /usr/lib/shflags ] ; then |
| . /usr/lib/shflags |
| else |
| echo >&2 "$0 Unable to source shflags" |
| exit 1 |
| fi |
| |
| # Constants for states. |
| CLEAN_STATE="clean" |
| OLD_STATE="old" |
| RESET_STATE="reset" |
| |
| LSB_RELEASE="/etc/lsb-release" |
| STATEFUL_DIR="/mnt/stateful_partition" |
| UPDATE_STATE_FILE=".update_available" |
| |
| DEFINE_string stateful_change "${OLD_STATE}" \ |
| "The state of the new stateful partition - used in update testing." |
| |
| FLAGS "$@" || exit 1 |
| |
| # Die on error. |
| set -e |
| |
| remove_quotes() { |
| echo "$1" | sed -e "s/^'//; s/'$//" |
| } |
| |
| download_stateful_payload(){ |
| # Download and unzip directories onto the stateful partition. |
| eval "curl --silent --max-time 300 \"${stateful_update_url}\"" | |
| tar --ignore-command-error --overwrite --directory=${STATEFUL_DIR} -xz |
| } |
| |
| update_dev_image () { |
| local base_update_url devserver_url |
| local local_payload_path |
| local path=$(remove_quotes "${FLAGS_ARGV}") |
| |
| if [ -z "${path}" ]; then |
| if [ -f "${STATEFUL_DIR}${LSB_RELEASE}" ]; then |
| devserver_url=$(grep CHROMEOS_DEVSERVER ${STATEFUL_DIR}${LSB_RELEASE} | |
| cut -f 2 -d '=') |
| fi |
| if [ -z "${devserver_url}" ]; then |
| devserver_url=$(grep CHROMEOS_DEVSERVER ${LSB_RELEASE} | cut -f 2 -d '=') |
| fi |
| # Sanity check. |
| if [ -z "${devserver_url}" ]; then |
| echo >&2 "No CHROMEOS_DEVSERVER URL found in lsb-release file." |
| exit 1 |
| fi |
| # Devserver URL should never contain "/update" |
| devserver_url=$(echo ${devserver_url} | sed -e 's#/update##') |
| base_update_url="${devserver_url}/static" |
| # Determine whether the path is local. |
| elif [ -f "${path}" ] || [ "${path}" = "-" ]; then |
| local_payload_path=${path} |
| else |
| base_update_url=${path} |
| fi |
| |
| if [ -n "${base_update_url}" ]; then |
| local stateful_update_url="${base_update_url}/stateful.tgz" |
| local download_exit_code=0 |
| for i in `seq 1 2`; do |
| if [ $i -eq 1 ]; then |
| echo >&2 "Downloading stateful payload from ${stateful_update_url}" |
| else |
| echo >&2 "Downloading failed, retrying." |
| fi |
| if download_stateful_payload; then |
| download_exit_code=$? |
| echo >&2 "Downloading command returns code ${download_exit_code}." |
| break |
| else |
| download_exit_code=$? |
| echo >&2 "Downloading command returns code ${download_exit_code}." |
| fi |
| done |
| if [ ${download_exit_code} -ne 0 ]; then |
| return ${download_exit_code} |
| fi |
| echo >&2 "Successfully downloaded update." |
| else |
| echo >&2 "Reading local payload ${local_payload_path}" |
| # Set timeout to two minutes to avoid waiting on stdin indefinitely. |
| timeout 120s tar --ignore-command-error --overwrite \ |
| --directory=${STATEFUL_DIR} -xzf ${local_payload_path} |
| echo >&2 "Successfully retrieved update." |
| fi |
| |
| if [ ! -d "${STATEFUL_DIR}/var_new" ] || |
| [ ! -d "${STATEFUL_DIR}/dev_image_new" ]; then |
| echo >&2 "Missing var or dev_image in stateful payload." |
| return 1 |
| fi |
| } |
| |
| reset_state () { |
| echo >&2 "Resetting stateful update state." |
| rm -f "${STATEFUL_DIR}/${UPDATE_STATE_FILE}" |
| rm -rf "${STATEFUL_DIR}/var_new" |
| rm -rf "${STATEFUL_DIR}/dev_image_new" |
| } |
| |
| update_old_state () { |
| echo >&2 "Performing standard stateful update." |
| echo -n "" > "${STATEFUL_DIR}/${UPDATE_STATE_FILE}" |
| } |
| |
| update_clean_state () { |
| echo >&2 "Restoring state to factory_install with dev_image." |
| echo -n "clobber" > "${STATEFUL_DIR}/${UPDATE_STATE_FILE}" |
| } |
| |
| main () { |
| if [ "${FLAGS_stateful_change}" = "${RESET_STATE}" ]; then |
| reset_state |
| elif update_dev_image; then |
| if [ "${FLAGS_stateful_change}" = "${OLD_STATE}" ]; then |
| update_old_state |
| elif [ "${FLAGS_stateful_change}" = "${CLEAN_STATE}" ]; then |
| update_clean_state |
| else |
| echo >&2 "Invalid state given to stateful update. Aborting..." |
| return 1 |
| fi |
| else |
| return 1 |
| fi |
| } |
| |
| main $@ |