#!/bin/bash
# Copyright 2012 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# Set PROGram name
PROG=$(basename $0)
########################################################################
#+
#+ NAME
#+     $PROG - ChromeOS channel image mover
#+
#+ SYNOPSIS
#+     $PROG [-n] <version> <from-channel> <to-channel> [<board>] [<key>] \
#+ [<newkey>]
#+     $PROG [--help | -man]
#+     $PROG [--usage | -?]
#+
#+ DESCRIPTION
#+     $PROG takes an image from one channel and creates a copy (with symlinks)
#+     to be signed in a new target directory (stable,beta).
#+
#+     Run from anywhere with GS credentials
#+
#+     If you don't specify a <board>, then all boards will be processed.
#+
#+     If you specify a <key>, then only instructions matching that keyset will
#+     be processed.  Otherwise, all active keysets will be processed.  If you
#+     use a short name like "mp" or "premp", the short board name will be auto-
#+     matically prepended to it.
#+
#+     If, instead, you want to change the key used to sign the images, specify
#+     the <newkey> option.  Then any images that were signed with <key> will be
#+     changed to be signed with <newkey>.
#+
#+ EXAMPLES
#+
#+ FILES
#+
#+ SEE ALSO
#+     stdlib.sh                 -  function definitions for TimeStamp, etc.
#+
#+ BUGS/TODO
#+
#- AUTHOR & DT : djmm Wed Jul 21 15:02:45 PDT 2010
#-
########################################################################
# If NO ARGUMENTS should return *usage*, uncomment the following line:
usage=${1-yes}

# This construct allows $PROG to be a symlink or simply PATH'd to.
symlink=$(readlink $0)
# Set up basic env and standard functions.
. "$(dirname "${symlink:-$0}")"/channelsign-lib.sh || exit 1

# Set some default options.
DRYRUN=false
looseargs=()
for arg in ${LOOSEARGS}; do
  case ${arg} in
    -n) DRYRUN=true ;;
    *) looseargs+=("${arg}") ;;
  esac
done
if ${DRYRUN}; then
  echo "DRYRUN MODE: Nothing will be uploaded"
  echo
fi
if [[ ${#looseargs[@]} -lt 3 ]]; then
  exec ${PROG} -?
fi

# BEGIN script.
TimeStamp begin

VERSION=${looseargs[0]}
FROMCHANNEL=${looseargs[1]/-channel/}-channel
TOCHANNEL=${looseargs[2]/-channel/}-channel
BOARD=${looseargs[3]}

expand_key_name() {
  local key=$1

  if [[ -z ${key} ]]; then
    return
  fi

  case ${key} in
    premp | mp | mp-v[0-9]*)
      # If they specify "mp", automatically prepend the board name so
      # we get something like "stumpy-mp".
      echo "${BOARD#*-}-${key}"
      ;;
    *)
      echo "${key}"
      ;;
  esac
}
ORIG_KEY=${looseargs[4]}
ORIG_NEWKEY=${looseargs[5]}
KEY=$(expand_key_name "${ORIG_KEY}")
NEWKEY=$(expand_key_name "${ORIG_NEWKEY}")

if [[ -n ${ORIG_KEY} ]]; then
  echo "Looking for images signed by key ${KEY} (derived from ${ORIG_KEY})"
fi
if [[ -n ${ORIG_NEWKEY} ]]; then
  echo " Resigning with key ${NEWKEY} (derived from ${ORIG_NEWKEY})"
fi

GSBASE=gs://chromeos-releases
TBSBASE="${GSBASE}/tobesigned"

echo "Waiting for GoogleStorage..."
# Get list of instructions files only to process
FILELIST=$(
  gsutil ls "${GSBASE}/${FROMCHANNEL}/${BOARD:-*}/${VERSION}/C*.instructions"
)
FROMCHANNEL=$(echo ${FILELIST} | awk -F/ 'NR<2 {print $4}')

if [[ -z ${FROMCHANNEL} ]]; then
  Exit 1 "Couldn't determine source channel.  Fail."
fi

if [[ ${TOCHANNEL} == "${FROMCHANNEL}" ]]; then
  if [[ ${KEY} == "${NEWKEY}" ]]; then
    Exit 1 "Source channel = destination channel && old key == new key!  Fail."
  fi
fi

GSUTIL=$(FindGSUTIL) || Exit 1 "Unable to find gsutil executable!"

# GS copy
# Take a FROM arg and a TO arg
GSCp() {
  local lfrom=$1
  local lto=$2
  local cmd=("${GSUTIL}" cp "${lfrom}" "${lto}")

  if ${DRYRUN}; then
    if [[ ${lto} == gs:* ]]; then
      echo "DRYRUN: ${cmd[*]}"
    else
      # If source is local, we're downloading a file, so still do that.
      "${cmd[@]}"
    fi
  else
    "${cmd[@]}"
  fi
}

LOCALSIGN="/tmp/${PROG}-tbs.$$"
DumpRunTimeEnv >"${LOCALSIGN}"

# Working off of instructions files only, derive file names for all other
# operations
for f in ${FILELIST}; do
  echo

  # Set the TO filename
  TARGET=${f/${FROMCHANNEL}/${TOCHANNEL}}

  # Get a local insructions file name
  LOCALI="/tmp/$(basename ${TARGET})"
  rm -f "${LOCALI}"
  GSCp ${f} "${LOCALI}"

  # Make relevant changes to local instructions file
  sed -i "s/channel = .*/channel = ${TOCHANNEL/-channel/}/g" "${LOCALI}"
  keyset=$(awk '$1 == "keyset" { print $NF }' "${LOCALI}")
  if [[ -n ${KEY} ]]; then
    if [[ ${keyset} != ${KEY} ]]; then
      echo " - skipping instructions: ${KEY} != ${keyset}"
      continue
    fi
    if [[ -n ${NEWKEY} ]]; then
      echo " - changing keyset from ${KEY} to ${NEWKEY}"
      sed -i "/keyset *=/s:=.*:= ${NEWKEY}:g" "${LOCALI}"
    fi
  fi
  archive=$(awk '$1 == "archive" { print $NF }' "${LOCALI}")
  if [[ -z ${archive} ]]; then
    archive=${f%.instructions}.zip
  fi

  TBS_BOARD=${BOARD:-$(echo "${f}" | cut -d/ -f5)}
  if [[ ${TOCHANNEL} == "${FROMCHANNEL}" ]]; then
    # We're just changing keys in the same channel, so update the insn only.
    TARGET="${TARGET%.instructions}-${NEWKEY}.instructions"
    GSCp "${LOCALI}" "${TARGET}"
  else
    # Copy it and other bits up to TOCHANNEL
    GSCp "${LOCALI}" "${TARGET}"
    GSCp "${f%/*}/${archive}" "${TARGET%/*}/${archive}"
    GSCp "$(dirname "${f}")/ChromeOS-test*.tar.xz" \
      "$(dirname "${TARGET}")/"
    GSCp "$(dirname "${f}")/stateful.tgz" \
      "$(dirname "${TARGET}")/"
  fi

  TOBESIGNED="${TBSBASE}/30,${TOCHANNEL},${TBS_BOARD},${VERSION},${TARGET##*/}"
  GSCp "${LOCALSIGN}" "${TOBESIGNED}"
done

# Cleanup
rm -f "${LOCALI}" "${LOCALSIGN}"

# END script.
TimeStamp end
