Index: src/scripts/image_to_live.sh |
diff --git a/src/scripts/image_to_live.sh b/src/scripts/image_to_live.sh |
index 17c15146567b4a5e68630201181d74df48f91286..72f8ddacea2c3824681a652156ae51807bbd2829 100755 |
--- a/src/scripts/image_to_live.sh |
+++ b/src/scripts/image_to_live.sh |
@@ -4,39 +4,20 @@ |
# 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. |
+# Script to update an image onto a live running ChromiumOS instance. |
# 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 |
+. "$(dirname $0)/common.sh" |
+. "$(dirname $0)/remote_access.sh" |
-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 \ |
+DEFINE_boolean ignore_version ${FLAGS_TRUE} \ |
"Ignore existing version on running instance and always update" |
-DEFINE_boolean ignore_hostname $FLAGS_TRUE \ |
+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 |
+DEFINE_boolean update_known_hosts ${FLAGS_FALSE} \ |
+ "Update your known_hosts with the new remote instance's key" |
function kill_all_devservers { |
! pkill -f 'python devserver.py' |
@@ -44,36 +25,14 @@ function kill_all_devservers { |
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]} |
+ rm -rf "${TMP}" |
} |
function remote_reboot_sh { |
- rm -f $TMP_KNOWN_HOSTS |
+ 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 |
@@ -89,7 +48,7 @@ function start_dev_server { |
function prepare_update_metadata { |
remote_sh "mount -norw,remount /" |
- if [ $FLAGS_ignore_version -eq $FLAGS_TRUE ]; then |
+ if [[ ${FLAGS_ignore_version} -eq ${FLAGS_TRUE} ]]; then |
echo "Forcing update independent of the current version" |
remote_sh "cat /etc/lsb-release |\ |
grep -v CHROMEOS_RELEASE_VERSION > /etc/lsb-release~;\ |
@@ -97,8 +56,8 @@ function prepare_update_metadata { |
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" |
+ 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~;\ |
@@ -112,12 +71,12 @@ function prepare_update_metadata { |
} |
function run_auto_update { |
- echo "Starting update and clear away prior" |
- UPDATE_FILE=/var/log/softwareupdate.log |
+ echo "Starting update" |
+ local 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; \ |
+ remote_sh "rm -f ${update_file}; touch ${update_file}; \ |
/opt/google/memento_updater/memento_updater.sh</dev/null>&/dev/null&" |
local update_error |
@@ -125,50 +84,52 @@ function run_auto_update { |
local progress |
update_error=1 |
- output_file=$TMP/output |
+ output_file="${TMP}/output" |
while true; do |
# The softwareupdate.log gets pretty bit with download progress |
# 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" |
+ 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 |
+ 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 |
+ 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 |
+ 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 |
+ return ${update_error} |
} |
function remote_reboot { |
echo "Rebooting." |
remote_sh "touch /tmp/awaiting_reboot; reboot" |
local output_file |
- output_file=$TMP/output |
+ output_file="${TMP}/output" |
while true; do |
REMOTE_OUT="" |
# This may fail while the machine is done so generate output and a |
# 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 |
+ ! remote_sh_allow_changed_host_key \ |
+ "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" |
@@ -179,26 +140,54 @@ function remote_reboot { |
done |
} |
-set_up_remote_access |
+function main() { |
+ assert_outside_chroot |
-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 |
+ cd $(dirname "$0") |
-start_dev_server |
+ FLAGS "$@" || exit 1 |
+ eval set -- "${FLAGS_ARGV}" |
-prepare_update_metadata |
+ set -e |
-if ! run_auto_update; then |
- echo "Update was not successful." |
- exit |
-fi |
+ trap cleanup EXIT |
-remote_reboot |
+ TMP=$(mktemp -d /tmp/image_to_live.XXXX) |
+ |
+ remote_access_init |
+ |
+ 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 |
+ |
+ if [[ ${FLAGS_update_hostkey} -eq ${FLAGS_TRUE} ]]; then |
+ local known_hosts="${HOME}/.ssh/known_hosts" |
+ cp "${known_hosts}" "${known_hosts}~" |
+ grep -v "^${FLAGS_remote} " "${known_hosts}" > "${TMP}/new_known_hosts" |
+ cat "${TMP}/new_known_hosts" "${TMP_KNOWN_HOSTS}" > "${known_hosts}" |
+ chmod 0640 "${known_hosts}" |
+ echo "New updated in ${known_hosts}, backup made." |
+ fi |
+ |
+ remote_sh "grep ^CHROMEOS_RELEASE_DESCRIPTION= /etc/lsb-release" |
+ local release_description=$(echo $REMOTE_OUT | cut -d '=' -f 2) |
+ echo "Update was successful and rebooted to $release_description" |
+ |
+ return 0 |
+} |
-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" |
+main $@ |