| #!/bin/sh |
| # Copyright (c) 2011 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 script performs following tasks to prepare a wiping process at reboot: |
| # - install "wiping" splash image and tag file |
| # - enable release partition and disable factory release partition |
| # - (legacy firmware) perform "postinst" to configure legacy boot loaders |
| # - rollback if anything goes wrong |
| # To assign additional wiping tags, use FACTORY_WIPE_TAGS envinronment variable. |
| # Ex: FACTORY_WIPE_TAGS="fast" gft_prepare_wipe.sh /dev/sda5 |
| |
| . "$(dirname "$0")/common.sh" || exit 1 |
| set -e |
| |
| # Kernel activation parameters |
| ENABLED_KERNEL_PRIORITY="3" |
| |
| # Variables for cleaning up |
| NEED_ROLLBACK="" |
| |
| # Location for splash and tag files |
| SCRIPT_DIR="$(dirname $0)" |
| STATEFUL_PARTITION="/mnt/stateful_partition" |
| WIPE_TAG_FILE="$STATEFUL_PARTITION/factory_install_reset" |
| SPLASH_FILE="$STATEFUL_PARTITION/wipe_splash.png" |
| SPLASH_SOURCE="$SCRIPT_DIR/wipe_splash.png" |
| TAGS="factory" |
| |
| # usage: enable_kernel partition_no |
| enable_kernel() { |
| alert "Enabling kernel on $CGPT_DEVICE #$1 ..." |
| cgpt add -i "$1" -P "$ENABLED_KERNEL_PRIORITY" -S 1 -T 0 "$CGPT_DEVICE" |
| cgpt prioritize -i "$1" -P "$ENABLED_KERNEL_PRIORITY" "$CGPT_DEVICE" |
| } |
| |
| # usage: disable_kernel partition_no |
| disable_kernel() { |
| alert "Disabling kernel on $CGPT_DEVICE #$1 ..." |
| cgpt add -i "$1" -P 0 -S 0 -T 0 "$CGPT_DEVICE" |
| } |
| |
| rollback_changes() { |
| # don't stop, even if we encounter any issues |
| local failure_msg="WARNING: Failed to rollback some changes..." |
| alert "WARNING: Rolling back changes." |
| rm -f "$WIPE_TAG_FILE" 2>/dev/null || alert "$failure_msg" |
| if [ -n "$CGPT_CONFIG" ]; then |
| cgpt_restore_status "$CGPT_DEVICE" "$CGPT_CONFIG" || alert "$failure_msg" |
| fi |
| } |
| |
| cleanup() { |
| if [ -n "$NEED_ROLLBACK" ]; then |
| rollback_changes |
| fi |
| } |
| |
| install_splash() { |
| if [ ! -f "$SPLASH_SOURCE" ]; then |
| die "Missing splash file for wiping: $SPLASH_SOURCE" |
| fi |
| cp -f "$SPLASH_SOURCE" "$SPLASH_FILE" || |
| die "Failed to install splash file: $SPLASH_SOURCE => $SPLASH_FILE" |
| alert "Splash file $SPLASH_FILE installed." |
| } |
| |
| install_wipe_tag() { |
| # FACTORY_WIPE_TAGS is an environment variable. |
| if [ -n "$FACTORY_WIPE_TAGS" ]; then |
| TAGS="$TAGS $FACTORY_WIPE_TAGS" |
| fi |
| echo "$TAGS" >"$WIPE_TAG_FILE" || |
| die "Failed to create tag file: $WIPE_TAG_FILE" |
| alert "Tag file $WIPE_TAG_FILE created: [$TAGS]." |
| } |
| |
| main() { |
| if [ "$#" != "1" ]; then |
| alert "Usage: [FACTORY_WIPE_TAGS=fast] $0 release_rootfs" |
| exit 1 |
| fi |
| |
| local release_rootfs="$1" |
| local factory_rootfs="$(echo "$release_rootfs" | tr '35' '53')" |
| [ "$release_rootfs" != "$factory_rootfs" ] || |
| die "Unknown type of device: $release_rootfs" |
| cgpt_init "$(device_remove_partno "$release_rootfs")" || |
| die "Failed to initialize device: $release_rootfs" |
| |
| local release_partno="$(echo "$release_rootfs" | sed -r 's/.*([0-9])$/\1/')" |
| local factory_partno="$(echo "$factory_rootfs" | sed -r 's/.*([0-9])$/\1/')" |
| [ -n "$release_partno" -a -n "$factory_partno" ] || |
| die "Failed to identify release/factory partition numbers: $release_rootfs" |
| |
| NEED_ROLLBACK="YES" |
| install_splash |
| install_wipe_tag |
| if chromeos_is_legacy_firmware; then |
| # When booting with legacy firmware, we need to update the legacy boot |
| # loaders to activate new kernel; on a real ChromeOS firmware, only CGPT |
| # header is used, and postinst is already performed in gft_verify_rootfs. |
| alert "Running on legacy system, invoke postinst." |
| chromeos_invoke_postinst "$release_rootfs" |
| fi |
| disable_kernel "$(( factory_partno - 1 ))" |
| enable_kernel "$(( release_partno - 1 ))" |
| alert "Syncing disks..." |
| sync |
| sleep 3 # For sync to take place. |
| NEED_ROLLBACK="" |
| alert "Complete." |
| } |
| |
| trap cleanup EXIT |
| main "$@" |