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" |