#!/bin/sh
# Copyright (c) 2011 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.
#
# This script downloads and installs the basic packages that the user needs
# in developer mode. It also takes care of some configuration details
# that arise from not havin write access to the root filesystem.

# Constant definitions.
P_CONFIG_CROS=/etc/portage
P_CONFIG_DEVELOPER=/usr/local/etc/portage
EMERGE_PACKAGES="${P_CONFIG_CROS}/bootstrap.packages"

# Global variables.
BINHOST=
CHROMEOS_DEVSERVER=
CHROMEOS_RELEASE_BOARD=

# Process flags.
. /usr/share/misc/shflags || exit 1
DEFINE_string binhost "" \
  "URL of the binhost that emerge will use." b
DEFINE_string binhost_version "" \
  "Version number to use instead of the one in /etc/lsb-release."
DEFINE_boolean reinstall "${FLAGS_FALSE}" \
  "Remove all installed packages and re-bootstrap emerge."
DEFINE_boolean uninstall "${FLAGS_FALSE}" \
  "Remove all installed packages."
DEFINE_boolean yes "${FLAGS_FALSE}" \
  "Do not prompt for input. Assumes yes's to all responses." y

FLAGS "$@" || exit 1

set -e

# Get the portage configuration variables.
. "${P_CONFIG_CROS}/make.profile/make.defaults"

# Echo's args to stderr and prefixes with ERROR(dev_install).
error() {
  echo "ERROR(dev_install): $*" >&2
}

# Reads the user's reply and returns 0 if the user responds with y.
# Accepts input like echo for the user prompt i.e. $@.
yes_or_no() {
  [ ${FLAGS_yes} -eq ${FLAGS_TRUE} ] && return 0
  local reply
  read -p "$*? (y/N) " reply
  [ "${reply}" = "y" ]
}

# Returns value of variable $2 from /etc/lsb-like file $1.
# $1 - Path to the /etc/lsb-like file.
# $2 - Variable name.
# Returns value or an empty string.
get_lsb_var() {
  sed -n "s/^$2=//p" "$1"
}

# Here we simply wipe /usr/local/* since that it's the only directory in which
# packages are installed to.
remove_installed_packages() {
  if yes_or_no "Remove all installed packages now"; then
    rm -rf --one-file-system /usr/local/*
    echo "Removed all installed packages."
  else
    echo "Operation cancelled."
    exit 0
  fi
}

# Parses flags to return the binhost or if none set, use the default binhost
# set up from installation.
get_binhost() {
  if [ -n "${FLAGS_binhost}" ]; then
    BINHOST="${FLAGS_binhost}"
  elif [ -n "${CHROMEOS_DEVSERVER}" ]; then
    echo "Devserver URL set to:  ${CHROMEOS_DEVSERVER}"
    if yes_or_no "Use it as the binhost"; then
      local packages_path="static/pkgroot/${CHROMEOS_RELEASE_BOARD}/packages"
      BINHOST="${CHROMEOS_DEVSERVER}/${packages_path}"
    fi
  fi
  if [ -z "${BINHOST}" ]; then
    local release_number
    # Get prefix for binhost.
    . "${P_CONFIG_CROS}/repository.conf"

    if [ -n "${FLAGS_binhost_version}" ]; then
      release_number="${FLAGS_binhost_version}"
    else
      # Get the release number.
      local cr_version="$(/opt/google/chrome/chrome --version)"
      # Chrome version looks like (Google Chrome/Chromium) branch.0.a.b
      local cr_branch="$(echo "${cr_version}" |
          sed -r 's/.*[[:space:]]([0-9]+)\..*/\1/')"
      local version="$(get_lsb_var /etc/lsb-release CHROMEOS_RELEASE_VERSION)"
      release_number="R${cr_branch}-${version}"
    fi
    BINHOST="${PREFIX_BINHOST}canary-${release_number}/packages"
  fi
}

# Get the static Python binary and portage (emerge script and python modules).
download_bootstrap_packages() {
  # Download packages that python/emerge require into /usr/local/bootsrap.
  while read line; do
    local package_url="${BINHOST}/${line}.tbz2"
    local directory="$(echo "${line}" | cut -d "/" -f 1)"
    local package_file="${PKGDIR}/${line}.tbz2"
    mkdir -p -m 0755 "${PKGDIR}/${directory}"
    echo "Downloading ${package_url}"
    if ! curl --fail -o "${package_file}" "${package_url}"; then
      error "Could not download package."
      error "Command curl --fail -o ${package_file} ${package_url} failed."
      return 1
    fi
    echo "Extracting ${package_file}"
    # TODO(sosa): pipeline our download/unpack cycles.
    # Ignore std error output about trailing garbage after EOF.
    if ! tar -C /usr/local/ -xjkf "${package_file}" 2>/dev/null; then
      error "Could not extract package."
      error "Command tar -C /usr/local -xjf ${package_file} failed."
      return 1
    fi
  done < "${EMERGE_PACKAGES}"
}

# Configure emerge in /usr/local.
configure_emerge() {
  # Copy emerge configuration to /usr/local.
  mkdir -p -m 0755 "${P_CONFIG_DEVELOPER}"
  cp "${P_CONFIG_CROS}/make.profile/make.conf" "${P_CONFIG_DEVELOPER}"
  # The source files might be symlinks, and we'll probably clobber/update things
  # ourselves locally, so dereference all the symlinks for our local copy.
  cp -rfL "${P_CONFIG_CROS}/make.profile" "${P_CONFIG_DEVELOPER}/make.profile"

  # Create the directories defined in the portage config files. Permissions are
  # consistent with the other directories in /usr/local, which is a bind mount
  # for /mnt/stateful_partition/dev_image.
  mkdir -p -m 0755 "${PORTDIR}"
  mkdir -p -m 0755 "${PKGDIR}"
  mkdir -p -m 0755 "${DISTDIR}"
  mkdir -p -m 0755 "${RPMDIR}"
  mkdir -p -m 0755 "${PORTAGE_TMPDIR}"
  mkdir -p -m 0755 "${BUILD_PREFIX}"
  echo "PORTAGE_BINHOST=${BINHOST}" >> "${P_CONFIG_DEVELOPER}/make.conf"

  # Add LD_LIBRARY_PATH within ebuild.sh.
  # TODO(arkaitzr): find out a cleaner way to do this.
  sed -i "3 a\export LD_LIBRARY_PATH=\"${LD_LIBRARY_PATH}\"" \
      /usr/local/lib/portage/bin/ebuild.sh

  # Check for package.provided from $BINHOST.
  local package_provided="${BINHOST}/package.provided"
  local tmp_provided="$(mktemp)"

  if ! curl --fail -o "${tmp_provided}" "${package_provided}" &&
     [ -n "${CHROMEOS_DEVSERVER}" ]; then
    echo "${package_provided} not found"

    package_provided="${CHROMEOS_DEVSERVER}/"\
"static/pkgroot/${CHROMEOS_RELEASE_BOARD}/"\
"/etc/portage/profile/package.provided"
    echo "Fall back to search ${package_provided}"

    if ! curl --fail -o "${tmp_provided}" "${package_provided}"; then
      echo "${package_provided} not found"
    fi
  fi
  if [ -s ${tmp_provided} ]; then
    mv "${tmp_provided}" \
        "${P_CONFIG_DEVELOPER}/make.profile/package.provided/gsutil_provided"
  fi
}

install_optional_packages() {
  if yes_or_no "Install chromeos-dev package now"; then
    emerge chromeos-dev
  else
    echo "You can install chromeos-dev later by typing the command:" \
         "emerge chromeos-dev"
  fi
}

import_lsb_release() {
  local override
  CHROMEOS_DEVSERVER=$(get_lsb_var /etc/lsb-release CHROMEOS_DEVSERVER)
  CHROMEOS_RELEASE_BOARD=$(get_lsb_var /etc/lsb-release CHROMEOS_RELEASE_BOARD)

  # Check local overrides.
  if [ -f /usr/local/etc/lsb-release ]; then
    override=$(get_lsb_var /usr/local/etc/lsb-release CHROMEOS_DEVSERVER)
    [ -n "${override}" ] && CHROMEOS_DEVSERVER="${override}"
    override=$(get_lsb_var /usr/local/etc/lsb-release CHROMEOS_RELEASE_BOARD)
    [ -n "${override}" ] && CHROMEOS_RELEASE_BOARD="${override}"
  fi
}

main() {
  # Check if we are root.
  if [ $(id -u) -ne 0 ]; then
    error "Can not run dev_install."
    error "You are not root or you did not use sudo."
    return 1
  fi

  # Sanity check.  People often run `su` or `sudo su` and leave off that final
  # - which means they don't get a proper environment.  Catch them here rather
  # than fail randomly midway through the process.
  case :${PATH}: in
  *:/usr/local/bin:*) ;;
  *)
    error "Your environment appears to be incomplete.  When changing to root,"
    error "did you remember to run the full command (don't forget the dash):"
    error " $ sudo su -"
    return 1
    ;;
  esac

  # This script should only run in developer mode or for developer images.
  if crossystem "cros_debug?0"; then
    error "Can not run dev_install."
    error "Chrome OS is not in developer mode."
    return 1
  fi

  if [ ${FLAGS_uninstall} -eq ${FLAGS_TRUE} \
       -o ${FLAGS_reinstall} -eq ${FLAGS_TRUE} ]; then
    remove_installed_packages
    if [ ${FLAGS_uninstall} -eq ${FLAGS_TRUE} ]; then
      if [ ${FLAGS_reinstall} -eq ${FLAGS_TRUE} ]; then
        error "Reinstall specified but ignored as uninstall was also specified."
      fi
      return 0
    else
      echo "Reinstalling emerge."
    fi
  fi

  # Check if packages are already installed.
  if [ -d "${P_CONFIG_DEVELOPER}" ]; then
    error "Directory ${P_CONFIG_DEVELOPER} exists."
    error "Did you mean dev_install --reinstall?"
    return 1
  fi

  # Create this loop so uncompressed files in /usr/local/usr/* will be reachable
  # through /usr/local*.
  # Note: /usr/local is mount-binded onto the /mnt/stateful_partition/dev_mode
  # during chromeos_startup during boot for machines in dev_mode.
  if [ ! -d /usr/local/usr ]; then
    ln -s . /usr/local/usr
  fi

  if [ ! -d /usr/local/local ]; then
    ln -s . /usr/local/local
  fi

  # TODO(sosa): Remove hack once lib dependencies are sorted in R27.
  if [ ! -d /usr/local/lib64 ]; then
    mkdir -p /usr/local/lib
    ln -s /usr/local/lib /usr/local/lib64
  fi

  echo "Starting installation of developer packages."
  echo "First, we download the necessary files."
  import_lsb_release
  get_binhost
  download_bootstrap_packages

  echo "Files downloaded, configuring emerge."
  configure_emerge

  echo "Emerge installation complete. Installing additional optional packages."
  install_optional_packages

  echo "dev_install done. Enjoy!"
}

main
