#!/bin/bash
# -----------------------------------------------------------------------------
# Remotely pushes bits to a remote node in preparation for install.
# -----------------------------------------------------------------------------
function _usage () {
cat << _EOF_
usage:
 $(basename $0) [node]

options:
- [node] : the target node to prime for installation

summary:
 Remotely pushes bits to a remote node in preparation for install.

 $(basename $0) is invoked as part of 'onos-install', and shouldn't be
 directly invoked for the most part.

_EOF_
}

[ $# -gt 1 ] || [ "$1" = "-h" ] && _usage && exit 0
[ ! -d "$ONOS_ROOT" ] && echo "ONOS_ROOT isn't set correctly" >&2 && exit 1
set -e
set -u
. $ONOS_ROOT/tools/build/envDefaults
[ ! -f "$ONOS_TAR" ] && echo "$ONOS_TAR does not exist - run onos-package?" >&2 && exit 1

node=${1:-$OCI}
remote=$ONOS_USER@$node
SSH_OPTIONS=" -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
 -o ControlMaster=auto -o ControlPath=~/.ssh/mux-%r@%h:%p \
 -o ControlPersist=300 "

USE_RSYNC=${USE_RSYNC:-'false'}
if [ "$USE_RSYNC" = "true" ]; then
  if ssh $remote $SSH_OPTIONS which rsync >&2 > /dev/null; then
    echo "Using rsync"
  else
    echo "Installing rsync"
    # TODO check remote OS and use proper method to install rsync
    ssh $remote sudo apt-get install -y rsync || USE_RSYNC='false'
  fi
fi

if [ "$USE_RSYNC" = "clean" ]; then
  # clean remote rsync stage directory
  ssh $remote rm -rf "/tmp/$ONOS_BITS"
fi

if [ "$USE_RSYNC" = "true" ]; then
  # local rsync stage directory
  RSYNC_STAGE=`mktemp -d -t onostar` || exit 1
  trap "rm -rf $RSYNC_STAGE" EXIT

  tar xf $ONOS_TAR -C $RSYNC_STAGE
  tar tf $ONOS_TAR > $RSYNC_STAGE/files
  touch -r $ONOS_TAR $RSYNC_STAGE/files

  # initialize remote stage with remote ONOS tar.
  # This is a workaround to benefit from onos-push-bits-through-proxy.
  # TODO would like to use tar hash to skip rsync when possible,
  # but couldn't due to tarball chksum mismatch, described below.
  ssh $remote $SSH_OPTIONS \
         "mkdir -p \"/tmp/$ONOS_BITS\" && \
          tar xzf \"/tmp/`basename ${ONOS_TAR}`\" -C \"/tmp/$ONOS_BITS\" || exit 0 "

  # sync contents of $ONOS_TAR
  rsync -az --delete --checksum --omit-dir-times --progress \
        -e "ssh $SSH_OPTIONS" \
        --rsync-path="mkdir -p /tmp/$ONOS_BITS/ && rsync" \
        $RSYNC_STAGE/ $remote:/tmp/$ONOS_BITS

  # create $ONOS_TAR equivalent tar ball remotely
  # TODO hash will not be the same as local one, probably due to different uid, etc.
  echo "Rebuilding ONOS tar on $node"
  ssh $remote $SSH_OPTIONS tar czf "/tmp/`basename ${ONOS_TAR}`" -C "/tmp/$ONOS_BITS" --no-recursion -T "/tmp/$ONOS_BITS/files"
else
  echo "Using scp"

  locHash=$(cksum $ONOS_TAR | cut -d' ' -f1,2)
  remHash=$(ssh $remote cksum $ONOS_TAR 2>/dev/null | cut -d' ' -f1,2)

  if [ -n "$locHash" ] && [ "$locHash" = "$remHash" ]; then
      echo "ONOS bits $ONOS_TAR already up-to-date on $node..."
  else
      scp -q $ONOS_TAR $remote:/tmp
  fi
fi
