| OLD | NEW |
| (Empty) |
| 1 #!/bin/bash | |
| 2 | |
| 3 # Copyright (c) 2009 The Chromium OS Authors. All rights reserved. | |
| 4 # Use of this source code is governed by a BSD-style license that can be | |
| 5 # found in the LICENSE file. | |
| 6 | |
| 7 # Script to modify a keyfob-based chromeos system image for testability. | |
| 8 | |
| 9 # Load common constants. This should be the first executable line. | |
| 10 # The path to common.sh should be relative to your script's location. | |
| 11 . "/usr/lib/crosutils/common.sh" | |
| 12 | |
| 13 # Load functions and constants for chromeos-install | |
| 14 . "/usr/lib/installer/chromeos-common.sh" | |
| 15 | |
| 16 # We need to be in the chroot to emerge test packages. | |
| 17 assert_inside_chroot | |
| 18 | |
| 19 get_default_board | |
| 20 | |
| 21 DEFINE_string board "$DEFAULT_BOARD" "Board for which the image was built" b | |
| 22 DEFINE_boolean factory $FLAGS_FALSE \ | |
| 23 "Modify the image for manufacturing testing" f | |
| 24 DEFINE_boolean factory_install $FLAGS_FALSE \ | |
| 25 "Modify the image for factory install shim" | |
| 26 DEFINE_string image "" "Location of the rootfs raw image file" i | |
| 27 DEFINE_boolean installmask $FLAGS_TRUE \ | |
| 28 "Use INSTALL_MASK to shrink the resulting image." m | |
| 29 DEFINE_integer jobs -1 \ | |
| 30 "How many packages to build in parallel at maximum." j | |
| 31 DEFINE_string qualdb "" "Location of qualified component file" d | |
| 32 DEFINE_boolean yes $FLAGS_FALSE "Answer yes to all prompts" y | |
| 33 DEFINE_string build_root "/build" \ | |
| 34 "The root location for board sysroots." | |
| 35 DEFINE_boolean fast ${DEFAULT_FAST} "Call many emerges in parallel" | |
| 36 | |
| 37 | |
| 38 # Parse command line | |
| 39 FLAGS "$@" || exit 1 | |
| 40 eval set -- "${FLAGS_ARGV}" | |
| 41 | |
| 42 EMERGE_CMD="emerge" | |
| 43 EMERGE_BOARD_CMD="emerge-${FLAGS_board}" | |
| 44 if [ "${FLAGS_fast}" -eq "${FLAGS_TRUE}" ]; then | |
| 45 echo "Using alternate emerge" | |
| 46 EMERGE_CMD="${SCRIPTS_DIR}/parallel_emerge" | |
| 47 EMERGE_BOARD_CMD="${EMERGE_CMD} --board=${FLAGS_board}" | |
| 48 fi | |
| 49 | |
| 50 # No board, no default and no image set then we can't find the image | |
| 51 if [ -z $FLAGS_image ] && [ -z $FLAGS_board ] ; then | |
| 52 setup_board_warning | |
| 53 die "cros_mod_image_for_test failed. No board set and no image set" | |
| 54 fi | |
| 55 | |
| 56 # We have a board name but no image set. Use image at default location | |
| 57 if [ -z $FLAGS_image ] ; then | |
| 58 IMAGES_DIR="${DEFAULT_BUILD_ROOT}/images/${FLAGS_board}" | |
| 59 FILENAME="chromiumos_image.bin" | |
| 60 FLAGS_image="${IMAGES_DIR}/$(ls -t $IMAGES_DIR 2>&-| head -1)/${FILENAME}" | |
| 61 fi | |
| 62 | |
| 63 # Turn path into an absolute path. | |
| 64 FLAGS_image=`eval readlink -f ${FLAGS_image}` | |
| 65 | |
| 66 # Abort early if we can't find the image | |
| 67 if [ ! -f $FLAGS_image ] ; then | |
| 68 echo "No image found at $FLAGS_image" | |
| 69 exit 1 | |
| 70 fi | |
| 71 | |
| 72 # What cross-build are we targeting? | |
| 73 . "${FLAGS_build_root}/${FLAGS_board}/etc/make.conf.board_setup" | |
| 74 # Figure out ARCH from the given toolchain. | |
| 75 # TODO: Move to common.sh as a function after scripts are switched over. | |
| 76 TC_ARCH=$(echo "${CHOST}" | awk -F'-' '{ print $1 }') | |
| 77 case "${TC_ARCH}" in | |
| 78 arm*) | |
| 79 ARCH="arm" | |
| 80 ;; | |
| 81 *86) | |
| 82 ARCH="x86" | |
| 83 ;; | |
| 84 *) | |
| 85 error "Unable to determine ARCH from toolchain: ${CHOST}" | |
| 86 exit 1 | |
| 87 esac | |
| 88 | |
| 89 # Make sure anything mounted in the rootfs/stateful is cleaned up ok on exit. | |
| 90 cleanup_mounts() { | |
| 91 # Occasionally there are some daemons left hanging around that have our | |
| 92 # root/stateful image file system open. We do a best effort attempt to kill | |
| 93 # them. | |
| 94 PIDS=`sudo lsof -t "$1" | sort | uniq` | |
| 95 for pid in ${PIDS} | |
| 96 do | |
| 97 local cmdline=`cat /proc/$pid/cmdline` | |
| 98 echo "Killing process that has open file on the mounted directory: $cmdline" | |
| 99 sudo kill $pid || /bin/true | |
| 100 done | |
| 101 } | |
| 102 | |
| 103 cleanup() { | |
| 104 "/usr/bin/cros_mount_gpt_image.sh" -u -r "$ROOT_FS_DIR" \ | |
| 105 -s "$STATEFUL_DIR" | |
| 106 } | |
| 107 | |
| 108 # Emerges chromeos-test onto the image. | |
| 109 emerge_chromeos_test() { | |
| 110 INSTALL_MASK="" | |
| 111 if [[ $FLAGS_installmask -eq ${FLAGS_TRUE} ]]; then | |
| 112 INSTALL_MASK="$DEFAULT_INSTALL_MASK" | |
| 113 fi | |
| 114 | |
| 115 # Determine the root dir for test packages. | |
| 116 ROOT_DEV_DIR="$ROOT_FS_DIR/usr/local" | |
| 117 | |
| 118 sudo INSTALL_MASK="$INSTALL_MASK" $EMERGE_BOARD_CMD \ | |
| 119 --root="$ROOT_DEV_DIR" --root-deps=rdeps \ | |
| 120 --usepkgonly chromeos-test $EMERGE_JOBS | |
| 121 } | |
| 122 | |
| 123 | |
| 124 install_autotest() { | |
| 125 SYSROOT="${FLAGS_build_root}/${FLAGS_board}" | |
| 126 AUTOTEST_SRC="${SYSROOT}/usr/local/autotest" | |
| 127 stateful_root="${ROOT_FS_DIR}/usr/local" | |
| 128 autotest_client="/autotest" | |
| 129 | |
| 130 echo "Install autotest into stateful partition from $AUTOTEST_SRC" | |
| 131 | |
| 132 sudo mkdir -p "${stateful_root}${autotest_client}" | |
| 133 | |
| 134 # Remove excess files from stateful partition. | |
| 135 # If these aren't there, that's fine. | |
| 136 sudo rm -rf "${stateful_root}${autotest_client}/*" || true | |
| 137 sudo rm -rf "${stateful_root}/autotest-pkgs" || true | |
| 138 sudo rm -rf "${stateful_root}/lib/icedtea6" || true | |
| 139 | |
| 140 sudo rsync --delete --delete-excluded -auv \ | |
| 141 --exclude=deps/realtimecomm_playground \ | |
| 142 --exclude=tests/ltp \ | |
| 143 --exclude=site_tests/graphics_O3DSelenium \ | |
| 144 --exclude=site_tests/realtimecomm_GTalk\* \ | |
| 145 --exclude=site_tests/platform_StackProtector \ | |
| 146 --exclude=deps/chrome_test \ | |
| 147 --exclude=site_tests/desktopui_BrowserTest \ | |
| 148 --exclude=site_tests/desktopui_UITest \ | |
| 149 --exclude=.svn \ | |
| 150 ${AUTOTEST_SRC}/client/* "${stateful_root}/${autotest_client}" | |
| 151 | |
| 152 sudo chmod 755 "${stateful_root}/${autotest_client}" | |
| 153 sudo chown -R 1000:1000 "${stateful_root}/${autotest_client}" | |
| 154 } | |
| 155 | |
| 156 # main process begins here. | |
| 157 | |
| 158 # Make sure this is really what the user wants, before nuking the device | |
| 159 if [ $FLAGS_yes -ne $FLAGS_TRUE ]; then | |
| 160 read -p "Modifying image ${FLAGS_image} for test; are you sure (y/N)? " SURE | |
| 161 SURE="${SURE:0:1}" # Get just the first character | |
| 162 if [ "$SURE" != "y" ]; then | |
| 163 echo "Ok, better safe than sorry." | |
| 164 exit 1 | |
| 165 fi | |
| 166 else | |
| 167 echo "Modifying image ${FLAGS_image} for test..." | |
| 168 fi | |
| 169 | |
| 170 set -e | |
| 171 | |
| 172 IMAGE_DIR="$(dirname "$FLAGS_image")" | |
| 173 IMAGE_NAME="$(basename "$FLAGS_image")" | |
| 174 ROOT_FS_DIR="$IMAGE_DIR/rootfs" | |
| 175 STATEFUL_DIR="$IMAGE_DIR/stateful_partition" | |
| 176 | |
| 177 trap cleanup EXIT | |
| 178 | |
| 179 # Mounts gpt image and sets up var, /usr/local and symlinks. | |
| 180 "/usr/bin/cros_mount_gpt_image.sh" -i "$IMAGE_NAME" \ | |
| 181 -f "$IMAGE_DIR" -r "$ROOT_FS_DIR" -s "$STATEFUL_DIR" | |
| 182 | |
| 183 if [ ${FLAGS_factory_install} -eq ${FLAGS_TRUE} ]; then | |
| 184 # We don't want to emerge test packages on factory install, otherwise we run | |
| 185 # out of space. | |
| 186 | |
| 187 # Run factory setup script to modify the image. | |
| 188 sudo $EMERGE_BOARD_CMD --root=$ROOT_FS_DIR --usepkgonly \ | |
| 189 --root-deps=rdeps --nodeps chromeos-factoryinstall | |
| 190 | |
| 191 # Set factory server if necessary. | |
| 192 if [ "${FACTORY_SERVER}" != "" ]; then | |
| 193 sudo sed -i \ | |
| 194 "s/CHROMEOS_AUSERVER=.*$/CHROMEOS_AUSERVER=\ | |
| 195 http:\/\/${FACTORY_SERVER}:8080\/update/" \ | |
| 196 ${ROOT_FS_DIR}/etc/lsb-release | |
| 197 fi | |
| 198 else | |
| 199 emerge_chromeos_test | |
| 200 | |
| 201 MOD_TEST_ROOT="/usr/share/chromeos-installer/mod_for_test_scripts" | |
| 202 # Run test setup script to modify the image | |
| 203 sudo GCLIENT_ROOT="${GCLIENT_ROOT}" ROOT_FS_DIR="${ROOT_FS_DIR}" \ | |
| 204 STATEFUL_DIR="${STATEFUL_DIR}" ARCH="${ARCH}" "${MOD_TEST_ROOT}/test_setup
.sh" | |
| 205 | |
| 206 if [ ${FLAGS_factory} -eq ${FLAGS_TRUE} ]; then | |
| 207 install_autotest | |
| 208 | |
| 209 MOD_FACTORY_ROOT="/usr/share/chromeos-installer/mod_for_factory_scripts" | |
| 210 # Run factory setup script to modify the image | |
| 211 sudo GCLIENT_ROOT="${GCLIENT_ROOT}" ROOT_FS_DIR="${ROOT_FS_DIR}" \ | |
| 212 QUALDB="${FLAGS_qualdb}" BOARD=${FLAGS_board} \ | |
| 213 "${MOD_FACTORY_ROOT}/factory_setup.sh" | |
| 214 fi | |
| 215 fi | |
| 216 | |
| 217 # Let's have a look at the image just in case.. | |
| 218 if [ "${VERIFY}" = "true" ]; then | |
| 219 pushd "${ROOT_FS_DIR}" | |
| 220 bash | |
| 221 popd | |
| 222 fi | |
| 223 | |
| 224 cleanup | |
| 225 | |
| 226 # Now make it bootable with the flags from build_image | |
| 227 /usr/bin/cros_make_image_bootable $(dirname "${FLAGS_image}") \ | |
| 228 $(basename "${FLAGS_image}") | |
| 229 | |
| 230 print_time_elapsed | |
| 231 | |
| 232 trap - EXIT | |
| 233 | |
| OLD | NEW |