| #!/bin/bash |
| |
| # Copyright (c) 2010 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 update a running device with an optionally built package out |
| # of your build directory |
| |
| # --- BEGIN COMMON.SH BOILERPLATE --- |
| # Load common CrOS utilities. Inside the chroot this file is installed in |
| # /usr/lib/crosutils. Outside the chroot we find it relative to the script's |
| # location. |
| find_common_sh() { |
| local common_paths=(/usr/lib/crosutils "$(dirname "$(readlink -f "$0")")/..") |
| local path |
| |
| SCRIPT_ROOT= |
| for path in "${common_paths[@]}"; do |
| if [ -r "${path}/common.sh" ]; then |
| SCRIPT_ROOT=${path} |
| break |
| fi |
| done |
| } |
| |
| find_common_sh |
| . "${SCRIPT_ROOT}/common.sh" || (echo "Unable to load common.sh" && exit 1) |
| # --- END COMMON.SH BOILERPLATE --- |
| |
| . "${SCRIPT_ROOT}/remote_access.sh" || die "Unable to load remote_access.sh" |
| |
| get_default_board |
| |
| DEFINE_boolean verbose ${FLAGS_FALSE} \ |
| "Whether to output verbose information for debugging." |
| DEFINE_boolean build ${FLAGS_FALSE} "Build package before installing" |
| DEFINE_string board "$DEFAULT_BOARD" \ |
| "Board for which the package should be built/found" |
| DEFINE_string build_root "/build" \ |
| "The root location for board sysroots." |
| |
| FLAGS "$@" || exit 1 |
| |
| TMP=$(mktemp -d /tmp/cros_package_to_live.XXXX) |
| |
| function cleanup { |
| if [ "${root_mount_type}" = ro ]; then |
| remote_sh "mount -o remount,ro /" || /bin/true |
| fi |
| if [ "${var_mount_noexec}" = yes ]; then |
| remote_sh "mount -o remount,noexec /var" || /bin/true |
| fi |
| cleanup_remote_access |
| rm -rf "${TMP}" |
| } |
| |
| # Make sure we have a package name |
| if [ -z "${FLAGS_ARGV}" ]; then |
| echo "Please specify packages to install. For example:" |
| echo " $0 --remote=MyMachine flimflam" |
| exit 1 |
| fi |
| |
| if [ -z "${FLAGS_board}" ]; then |
| echo "Please specify a board using the --board=MyBoard argument" |
| exit 1 |
| fi |
| |
| set -e |
| trap cleanup EXIT |
| |
| remote_access_init |
| |
| eval set -- "${FLAGS_ARGV}" |
| |
| if [ ${FLAGS_build} -eq ${FLAGS_TRUE} ]; then |
| emerge-${FLAGS_board} $@ |
| fi |
| |
| PKGROOT="${FLAGS_build_root}/${FLAGS_board}/packages" |
| |
| # Temporarily clear read-only flag on / if it is set |
| remote_sh "grep '\S* / ' /proc/mounts | tail -1 | awk '{ print \$4 }' | |
| cut -d, -f1" |
| root_mount_type=${REMOTE_OUT} |
| if [ "${root_mount_type}" = ro ]; then |
| remote_sh "mount -o remount,rw /" |
| fi |
| |
| # Temporarily clear noexec flag on /var if it is set |
| remote_sh "grep '\S* /var ' /proc/mounts | tail -1 | awk '{ print \$4 }'" |
| if expr "${REMOTE_OUT}" : '.*noexec' >/dev/null; then |
| var_mount_noexec=yes |
| remote_sh "mount -o remount,exec /var" |
| fi |
| |
| for pkg in $@; do |
| latest_pkg=$(ls -tr $PKGROOT/*/${pkg}-[0-9]* | tail -1) |
| if [ -z "${latest_pkg}" ]; then |
| echo "Could not find latest built version of ${pkg}" |
| exit 1 |
| fi |
| pkg_dir=$(basename "$(dirname "$latest_pkg")") |
| pkg_name=$(basename "$latest_pkg") |
| echo "Installing ${latest_pkg}..." |
| |
| remote_sh "mktemp -d /tmp/cros_package_to_live.XXXX" |
| temp_dir=$REMOTE_OUT |
| remote_cp_to "${latest_pkg}" "${temp_dir}" |
| remote_sh "mkdir -p /usr/portage/packages/${pkg_dir} && |
| mv ${temp_dir}/${pkg_name} /usr/portage/packages/${pkg_dir} && |
| env FEATURES=-sandbox emerge --usepkg \ |
| /usr/portage/packages/${pkg_dir}/${pkg_name} 1>&2" |
| echo "${pkg} has been installed" |
| remote_sh "rm -rf ${temp_dir}" |
| done |