Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1065)

Unified Diff: src/scripts/image_to_live.sh

Issue 512003: Create a method to push an image to a live running Chromium OS machine (Closed)
Patch Set: <=80 cols Created 11 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/scripts/image_to_live.sh
diff --git a/src/scripts/image_to_live.sh b/src/scripts/image_to_live.sh
new file mode 100755
index 0000000000000000000000000000000000000000..17c15146567b4a5e68630201181d74df48f91286
--- /dev/null
+++ b/src/scripts/image_to_live.sh
@@ -0,0 +1,204 @@
+#!/bin/bash
+
+# Copyright (c) 2009 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.
+
+# Script to convert the output of build_image.sh to a usb image.
petkov 2009/12/23 02:00:39 Please change description.
+
+# Load common constants. This should be the first executable line.
+# The path to common.sh should be relative to your script's location.
+. "$(dirname "$0")/common.sh"
+
+assert_outside_chroot
+
+cd $(dirname "$0")
+
+DEFAULT_PRIVATE_KEY="$SRC_ROOT/platform/testing/testing_rsa"
+
+DEFINE_string ip "" "IP address of running Chromium OS instance"
+DEFINE_boolean ignore_version $FLAGS_TRUE \
+ "Ignore existing version on running instance and always update"
+DEFINE_boolean ignore_hostname $FLAGS_TRUE \
+ "Ignore existing AU hostname on running instance use this hostname"
+DEFINE_string private_key "$DEFAULT_PRIVATE_KEY" \
+ "Private key of root account on instance"
+
+FLAGS "$@" || exit 1
+eval set -- "${FLAGS_ARGV}"
+
+set -e
+
+if [ -z "$FLAGS_ip" ]; then
+ echo "Please specify the IP of the Chromium OS instance"
+ exit 1
+fi
+
+TMP=$(mktemp -d /tmp/image_to_live.XXXX)
+TMP_PRIVATE_KEY=$TMP/private_key
+TMP_KNOWN_HOSTS=$TMP/known_hosts
+
+function kill_all_devservers {
+ ! pkill -f 'python devserver.py'
+}
+
+function cleanup {
+ kill_all_devservers
+ rm -rf $TMP
+}
+
+trap cleanup EXIT
+
+function remote_sh {
+ # Disable strict host checking so that we don't prompt the user when
+ # the host key file is removed and just go ahead and add it.
+ REMOTE_OUT=$(ssh -o StrictHostKeyChecking=no -o \
+ UserKnownHostsFile=$TMP_KNOWN_HOSTS root@$FLAGS_ip "$@")
+ return ${PIPESTATUS[0]}
+}
+
+function remote_reboot_sh {
petkov 2009/12/23 02:00:39 A bit confusing name because the routine has nothi
+ rm -f $TMP_KNOWN_HOSTS
+ remote_sh "$@"
+}
+
+function set_up_remote_access {
+ if [ -z "$SSH_AGENT_PID" ]; then
+ eval `ssh-agent`
+ fi
+ cp $FLAGS_private_key $TMP_PRIVATE_KEY
+ chmod 0400 $TMP_PRIVATE_KEY
+ ssh-add $TMP_PRIVATE_KEY
+
+ # Verify the client is reachable before continuing
+ remote_sh "true"
+}
+
+function start_dev_server {
+ kill_all_devservers
+ sudo -v
+ ./enter_chroot.sh "cd ../platform/dev; ./start-devserver.sh>/dev/null 2>&1" &
+ echo -n "Waiting on devserver to start"
+ until netstat -anp 2>&1 | grep 8080 > /dev/null; do
+ sleep .5
+ echo -n "."
+ done
+ echo ""
+}
+
+function prepare_update_metadata {
+ remote_sh "mount -norw,remount /"
+
+ if [ $FLAGS_ignore_version -eq $FLAGS_TRUE ]; then
+ echo "Forcing update independent of the current version"
petkov 2009/12/23 02:00:39 This change adds an -f flag to force update. http:
+ remote_sh "cat /etc/lsb-release |\
+ grep -v CHROMEOS_RELEASE_VERSION > /etc/lsb-release~;\
+ mv /etc/lsb-release~ /etc/lsb-release; \
+ echo 'CHROMEOS_RELEASE_VERSION=0.0.0.0' >> /etc/lsb-release"
+ fi
+
+ if [ $FLAGS_ignore_hostname -eq $FLAGS_TRUE ]; then
+ echo "Forcing update from $HOSTNAME"
+ remote_sh "cat /etc/lsb-release |\
+ grep -v '^CHROMEOS_AUSERVER=' |\
+ grep -v '^CHROMEOS_DEVSERVER=' > /etc/lsb-release~;\
+ mv /etc/lsb-release~ /etc/lsb-release; \
+ echo 'CHROMEOS_AUSERVER=http://$HOSTNAME:8080/update' >> \
+ /etc/lsb-release; \
+ echo 'CHROMEOS_DEVSERVER=http://$HOSTNAME:8080' >> /etc/lsb-release"
+ fi
+
+ remote_sh "mount -noro,remount /"
+}
+
+function run_auto_update {
+ echo "Starting update and clear away prior"
+ UPDATE_FILE=/var/log/softwareupdate.log
+ # Clear it out so we don't see a prior run and make sure it
+ # exists so the first tail below can't fail if it races the
+ # memento updater first write and wins.
+ remote_sh "rm -f $UPDATE_FILE; touch $UPDATE_FILE; \
+ /opt/google/memento_updater/memento_updater.sh</dev/null>&/dev/null&"
+
+ local update_error
+ local output_file
+ local progress
+
+ update_error=1
+ output_file=$TMP/output
+
+ while true; do
+ # The softwareupdate.log gets pretty bit with download progress
petkov 2009/12/23 02:00:39 s/bit/big/
+ # lines so only look in the last 100 lines for status.
+ remote_sh "tail -100 $UPDATE_FILE"
+ echo "$REMOTE_OUT" > $output_file
+ progress=$(tail -4 $output_file | grep 0K | head -1)
+ if [ -n "$progress" ]; then
+ echo "Image fetching progress: $progress"
+ fi
+ if grep -q 'updatecheck status="noupdate"' $output_file; then
+ echo "devserver is claiming there is no update available."
+ echo "Consider setting --ignore_version."
+ break
+ fi
+ if grep -q 'Autoupdate applied. You should now reboot' $output_file; then
+ echo "Autoupdate was successful."
+ update_error=0
+ fi
+ if grep -q 'Memento AutoUpdate terminating' $output_file; then
+ break
+ fi
+ # Sleep for a while so that ssh handling doesn't slow down the install
+ sleep 2
+ done
+
+ return $update_error
+}
+
+function remote_reboot {
+ echo "Rebooting."
+ remote_sh "touch /tmp/awaiting_reboot; reboot"
+ local output_file
+ output_file=$TMP/output
+
+ while true; do
+ REMOTE_OUT=""
+ # This may fail while the machine is done so generate output and a
petkov 2009/12/23 02:00:39 The "right" way to do this is to babysit the boot
+ # boolean result to distinguish between down/timeout and real failure
+ ! remote_reboot_sh "echo 0; [ -e /tmp/awaiting_reboot ] && echo '1'; true"
+ echo "$REMOTE_OUT" > $output_file
+ if grep -q "0" $output_file; then
+ if grep -q "1" $output_file; then
+ echo "Not yet rebooted"
+ else
+ echo "Rebooted and responding"
+ break
+ fi
+ fi
+ sleep .5
+ done
+}
+
+set_up_remote_access
+
+if remote_sh [ -e /tmp/memento_autoupdate_completed ]; then
+ echo "Machine has been updated but not yet rebooted. Rebooting it now."
+ echo "Rerun this script if you still wish to update it."
+ remote_reboot
+ exit 1
+fi
+
+start_dev_server
+
+prepare_update_metadata
+
+if ! run_auto_update; then
+ echo "Update was not successful."
+ exit
+fi
+
+remote_reboot
+
+remote_sh "grep ^CHROMEOS_RELEASE_DESCRIPTION= /etc/lsb-release"
+RELEASE_DESCRIPTION=$(echo $REMOTE_OUT | cut -d '=' -f 2)
+echo "Update was successful and rebooted to $RELEASE_DESCRIPTION"
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698