#!/bin/bash
# -----------------------------------------------------------------------------
# Runs the custom version of Buck required by ONOS.
# -----------------------------------------------------------------------------

set -e

BUCK_URL="http://repo1.maven.org/maven2/org/onosproject/onos-buck/v2018.02.09.01/buck-v2018.02.09.01.zip"
BUCK_SHA="45d8bd28f441991257babf89f7a317edb3a2b536"

# onos-yang-tools buck plugin version
YANG_VER="2.4.7"
ONOS_PLUGIN_VER="1.0.3"
MAVEN_BASE="https://repo1.maven.org/maven2"
MAVEN_ONOSPROJECT="$MAVEN_BASE/org/onosproject"

[  "-U" = "$1" ] && shift && FORCE_UPDATE=True

ROOT_DIR=${ONOS_ROOT:-"$( cd "$( dirname "${BASH_SOURCE[0]}" )/../.." && pwd )"}

mkdir -p $ROOT_DIR/bin
pushd $ROOT_DIR/bin > /dev/null

if [ -n "$FORCE_UPDATE" ] || [ ! -f "buck" ] || [ "$BUCK_SHA" != "$(cat .buck_sha)" ]; then
    echo "Updating Buck..." >&2
    rm -fr .buck_version .buck_sha buck plugins
    mkdir -p cache
    BUCK_FILE=$(basename $BUCK_URL)
    # Check the local cache; download to cache if required
    [ -f "cache/$BUCK_FILE" ] || curl -o cache/$BUCK_FILE -L $BUCK_URL
    if [ -n "$(which shasum)" ]; then
        SHA=$(shasum cache/$BUCK_FILE | cut -d' ' -f1)
        if [ "$SHA" != "$BUCK_SHA" ]; then
           echo "ERROR: Downloaded SHA ($SHA) does not match expected SHA ($BUCK_SHA)" &&
           rm -f cache/$BUCK_FILE && exit 1
        else
           echo "$SHA" > .buck_sha
        fi
    else
        echo "SHA cannot be verified"
    fi
    unzip -qq cache/$BUCK_FILE
    # Kill buckd
    ps -ef | egrep buckd | grep -v egrep | cut -c7-11 | xargs kill 2>/dev/null || :
    rm -rf $ROOT_DIR/buck-out
    printf "Successfully updated Buck in $ROOT_DIR/bin/buck to $BUCK_FILE\n\n"
fi

# Fetch & install onos yang tools buck plugin
YANG_PLUGIN_CACHE="cache/onos-yang-compiler-buck-plugin-$YANG_VER.jar"
if hash mvn 2>/dev/null; then
  if [[ $YANG_VER = *"-SNAPSHOT" ]] || [ ! -f "$YANG_PLUGIN_CACHE" ]; then
    echo "Updating Yang plugin $YANG_VER..." >&2
    ARTIFACT="org.onosproject:onos-yang-compiler-buck-plugin:$YANG_VER"
    mvn org.apache.maven.plugins:maven-dependency-plugin:3.0.2:copy \
        -Dartifact=$ARTIFACT \
        -Dtransitive=false -Dmdep.overWriteSnapshots=true \
        -DoutputDirectory=cache > /dev/null
  fi
else
  if [ ! -f "$YANG_PLUGIN_CACHE" ]; then
    echo "Updating Yang plugin $YANG_VER..." >&2
    if [[ $YANG_VER = *"-SNAPSHOT" ]]; then
      echo "mvn command must be installed to handle SNAPSHOT version"
      exit 1
    fi

    curl -o "$YANG_PLUGIN_CACHE" \
      -L $MAVEN_ONOSPROJECT/onos-yang-compiler-buck-plugin/$YANG_VER/onos-yang-compiler-buck-plugin-$YANG_VER.jar
  fi

  if [[ $YANG_VER != *"-SNAPSHOT" ]] && hash shasum 2>/dev/null; then
    SHA=$(shasum $YANG_PLUGIN_CACHE | cut -d' ' -f1)
    if [ ! -f "$YANG_PLUGIN_CACHE".sha1 ]; then
      curl -o "$YANG_PLUGIN_CACHE".sha1 \
        -L $MAVEN_ONOSPROJECT/onos-yang-compiler-buck-plugin/$YANG_VER/onos-yang-compiler-buck-plugin-$YANG_VER.jar.sha1
    fi
    YANG_PLUGIN_SHA=$(cat "$YANG_PLUGIN_CACHE".sha1)
    if [ "$SHA" != "$YANG_PLUGIN_SHA" ]; then
       echo "ERROR: Downloaded SHA ($SHA) did not match expected SHA ($YANG_PLUGIN_SHA)" &&
       rm -f $YANG_PLUGIN_CACHE $YANG_PLUGIN_CACHE.sha1 && exit 1
     fi
  else
    echo "SHA verification skipped"
  fi
fi
install -Cv "$YANG_PLUGIN_CACHE" plugins/yang.jar >/dev/null

# Fetch & install onos buck plugin

ONOS_PLUGIN_CACHE="cache/onos-buck-plugin-$ONOS_PLUGIN_VER.jar"

if [ ! -f "$ONOS_PLUGIN_CACHE" ]; then
  echo "Updating ONOS plugin $ONOS_PLUGIN_VER..." >&2
  curl -o "$ONOS_PLUGIN_CACHE" \
    -L $MAVEN_ONOSPROJECT/onos-buck-plugin/$ONOS_PLUGIN_VER/onos-buck-plugin-$ONOS_PLUGIN_VER.jar
fi


if hash shasum 2>/dev/null; then
  SHA=$(shasum $ONOS_PLUGIN_CACHE | cut -d' ' -f1)
  if [ ! -f "$ONOS_PLUGIN_CACHE".sha1 ]; then
    curl -o "$ONOS_PLUGIN_CACHE".sha1 \
         -L $MAVEN_ONOSPROJECT/onos-buck-plugin/$ONOS_PLUGIN_VER/onos-buck-plugin-$ONOS_PLUGIN_VER.jar.sha1
  fi
  ONOS_PLUGIN_SHA=$(cat "$ONOS_PLUGIN_CACHE".sha1)
  if [ "$SHA" != "$ONOS_PLUGIN_SHA" ]; then
    echo "ERROR: Downloaded SHA ($SHA) did not match expected SHA ($ONOS_PLUGIN_SHA)" &&
      rm -f $ONOS_PLUGIN_CACHE $ONOS_PLUGIN_CACHE.sha1 && exit 1
  fi
else
    echo "SHA verification skipped"
fi
install -Cv "$ONOS_PLUGIN_CACHE" plugins/onos.jar >/dev/null

popd > /dev/null

BUCK=$ROOT_DIR/bin/buck

if [ "${ONOS_NO_BUCKD:-1}" == "1" ]; then
  export NO_BUCKD=1
fi

# HACK: Clean-up frequent problem-causers from buck-out
#rm -fr \
#    $ONOS_ROOT/buck-out/bin/lib/.netty \
#    $ONOS_ROOT/buck-out/bin/lib/.KRYO

# Finally, run the Buck command...
$BUCK "$@"
