#!/bin/bash
# -----------------------------------------------------------------------------
# Remotely configures & starts ONOS for the first time.
# -----------------------------------------------------------------------------

function _usage () {
cat << _EOF_
usage:
 $(basename $0) [node]

options:
- [node] : The node to configure

summary:
 Remotely configures and starts ONOS for the first time.

 The procedure for configuring a node includes determining base features,
 applications to load at startup, and clustering and logical network view
 configurations, among others.

 If [node] isn't specified, the default target becomes \$OCI.

_EOF_
}

[ "$1" = "-h" ] && _usage && exit 0

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

node=${1:-$OCI}
remote=$ONOS_USER@$node

# ONOS boot features
export ONOS_BOOT_FEATURES="${ONOS_BOOT_FEATURES:-webconsole,onos-api,onos-core,onos-incubator,onos-cli,onos-rest,onos-gui}"

# ONOS builtin apps and providers ignited by default
export ONOS_APPS="${ONOS_APPS:-drivers,openflow}"

ssh -tt $remote "
    echo \"onos.ip = \$(sudo ifconfig | grep $ONOS_NIC | cut -d: -f2 | cut -d\\  -f1)\" \
        >> $ONOS_INSTALL_DIR/$KARAF_DIST/etc/system.properties

    # Drop copycat related log level for the console
    echo "log4j.logger.net.kuujo.copycat= INFO" \
        >> $ONOS_INSTALL_DIR/$KARAF_DIST/etc/org.ops4j.pax.logging.cfg

    # Patch the Apache Karaf distribution file to load ONOS boot features
    perl -pi.old -e \"s|^(featuresBoot=.*,management)(,webconsole,.*)|\1,$ONOS_BOOT_FEATURES|\" \
        $ONOS_INSTALL_DIR/$KARAF_DIST/etc/org.apache.karaf.features.cfg

    # Customize which builtin apps should be ignited
    for app in $(echo $ONOS_APPS | tr ',' ' '); do
        if  [ -d \"$ONOS_INSTALL_DIR/apps/org.onosproject.\$app/\" ]; then
            touch $ONOS_INSTALL_DIR/apps/org.onosproject.\$app/active
        elif [ -d \"$ONOS_INSTALL_DIR/apps/\$app\" ]; then
            touch $ONOS_INSTALL_DIR/apps/\$app/active
        else
            echo \"[WARN] Don\'t know how to activate \$app\"
        fi
    done
"

# Generate a default cluster.json from the ON* environment variables
if [[ -z "${ONOS_STC_FORM_START}" ]]; then
    CDEF_FILE=/tmp/${remote}.cluster.json
    onos-gen-partitions $CDEF_FILE
    scp -q $CDEF_FILE $remote:$ONOS_INSTALL_DIR/config/cluster.json
fi

# Copy tools/package/config/ to remote
scp -qr ${ONOS_ROOT}/tools/package/config/ $remote:$ONOS_INSTALL_DIR/

# Copy the desired initial network configuration to remote if needed
[ -n "$ONOS_CFG" -a -f "$ONOS_CFG" -a "${1:-$OCI}" = "$OC1" ] && \
    scp $ONOS_CFG $remote:$ONOS_INSTALL_DIR/config/network-cfg.json || true
