#!/bin/bash
# -----------------------------------------------------------------------------
# Packages ONOS distributable into onos.tar.gz and onos.zip
# -----------------------------------------------------------------------------

[ ! -d "$ONOS_ROOT" ] && echo "ONOS_ROOT is not defined" >&2 && exit 1
. $ONOS_ROOT/tools/build/envDefaults

# Bail on any errors
set -e

rm -fr $ONOS_STAGE # Remove this when package script is completed

# Make sure we have the original apache karaf bits first
[ ! -d $M2_REPO ] && echo "M2 repository $M2_REPO not found" && exit 1
[ -d $ONOS_STAGE ] && echo "ONOS stage $ONOS_STAGE already exists" && exit 1

# Create the stage directory and warp into it
mkdir -p $ONOS_STAGE
cd $ONOS_STAGE

# Check if Apache Karaf bits are available and if not, fetch them.
if [ ! -f $KARAF_ZIP -a ! -f $KARAF_TAR ]; then
    echo "Downloading $KARAF_TAR..."
    curl -sL http://downloads.onosproject.org/third-party/apache-karaf-$KARAF_VERSION.tar.gz > $KARAF_TAR
fi
[ ! -f $KARAF_ZIP -a ! -f $KARAF_TAR ] && \
    echo "Apache Karaf bits $KARAF_ZIP or $KARAF_TAR not found" && exit 1

# Unroll the Apache Karaf bits, prune them and make ONOS top-level directories.
[ -f $KARAF_ZIP ] && unzip -q $KARAF_ZIP && rm -rf $KARAF_DIST/demos
[ -f $KARAF_TAR ] && tar zxf $KARAF_TAR && rm -rf $KARAF_DIST/demos
mkdir bin

# Stage the ONOS admin scripts and patch in Karaf service wrapper extras
cp -r $ONOS_ROOT/tools/package/bin .
cp -r $ONOS_ROOT/tools/package/debian $ONOS_STAGE/debian
cp -r $ONOS_ROOT/tools/package/etc/* $ONOS_STAGE/$KARAF_DIST/etc

# Patch-in proper Karaf version into the startup script.
sed "s/\$KARAF_VERSION/$KARAF_VERSION/g" \
    $ONOS_ROOT/tools/package/bin/onos-service > bin/onos-service
sed "s/\$KARAF_VERSION/$KARAF_VERSION/g" \
    $ONOS_ROOT/tools/package/bin/onos > bin/onos

# Stage the ONOS bundles, but only those that match the version
mkdir -p $KARAF_DIST/system/org/onosproject
# cp -r $M2_REPO/org/onosproject/ $KARAF_DIST/system/org/
find $M2_REPO/org/onosproject/ -type d -name $ONOS_POM_VERSION | while read line; do
    path=${line#*/onosproject/}
    artifact=${path%/$ONOS_POM_VERSION}
    mkdir -p $KARAF_DIST/system/org/onosproject/$artifact
    cp -r $M2_REPO/org/onosproject/$artifact/$ONOS_POM_VERSION \
        $KARAF_DIST/system/org/onosproject/$artifact/$ONOS_POM_VERSION
done

# ONOS Patching ----------------------------------------------------------------

# Patch the Apache Karaf distribution file to add ONOS features repository
perl -pi.old -e "s|^(featuresRepositories=.*)|\1,mvn:org.onosproject/onos-features/$ONOS_POM_VERSION/xml/features|" \
    $ONOS_STAGE/$KARAF_DIST/etc/org.apache.karaf.features.cfg 

# Patch the Apache Karaf distribution file to load ONOS features
export ONOS_FEATURES="webconsole,onos-api,onos-core,onos-cli,onos-rest,onos-gui,onos-openflow"
perl -pi.old -e "s|^(featuresBoot=.*)|\1,$ONOS_FEATURES|" \
    $ONOS_STAGE/$KARAF_DIST/etc/org.apache.karaf.features.cfg

# Patch the Apache Karaf distribution with ONOS branding bundle
cp $M2_REPO/org/onosproject/onos-branding/$ONOS_POM_VERSION/onos-branding-*.jar \
    $ONOS_STAGE/$KARAF_DIST/lib

# Patch in the ONOS version file
echo $ONOS_VERSION > $ONOS_STAGE/VERSION

# Now package up the ONOS tar file
cd $ONOS_STAGE_ROOT
COPYFILE_DISABLE=1 tar zcf $ONOS_TAR $ONOS_BITS
which zip >/dev/null && zip -rq $ONOS_ZIP $ONOS_BITS
ls -l $ONOS_TAR $ONOS_ZIP 2>/dev/null
rm -r $ONOS_STAGE
