#!/bin/bash

#
# Copyright 2015-present Open Networking Foundation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# -----------------------------------------------------------------------------
# Tool to manage ONOS applications using REST API.
# -----------------------------------------------------------------------------

ONOS_WEB_USER=${ONOS_WEB_USER:-onos}  # ONOS WEB User defaults to 'onos'
ONOS_WEB_PASS=${ONOS_WEB_PASS:-rocks} # ONOS WEB Password defaults to 'rocks'

. $(dirname $0)/_find-node

node=$(find_node $1)
cmd=${2:-list}
app=${3}

export URL=http://$node:8181/onos/v1/applications
export HDR="-HContent-Type:application/octet-stream"
export HAJ="-HContent-Type:application/json"
export curl="curl -sS --user $ONOS_WEB_USER:$ONOS_WEB_PASS --noproxy localhost "

# Prints usage help
function usage {
    echo "usage: onos-app <node-ip> list" >&2
    echo "       onos-app <node-ip> {install|install!} <app-file>" >&2
    echo "       onos-app <node-ip> {reinstall|reinstall!} [<app-name>] <app-file>" >&2
    echo "       onos-app <node-ip> {activate|deactivate|uninstall} <app-name>" >&2
    exit 1
}

# Extract app name from the specified *.oar file
function appName {
    aux=/tmp/aux$$.jar
    cp $1 $aux
    pushd /tmp >/dev/null
    jar xf $aux app.xml && grep name= app.xml | cut -d\" -f2
    rm -f $aux /tmp/app.xml
    popd >/dev/null
}

[ -z $node -o "$node" = "-h" -o "$node" = "--help" -o "$node" = "-?" ] && usage

case $cmd in
    list) $curl -X GET $URL;;
    installUrl!|installUrl)
        activate="false"
        [ $cmd = "installUrl!" ] && activate="true"
        [ $# -lt 3 ] && usage
        appurl=$3
        $curl -X POST $HAJ -d '{"url" : "'"$appurl"'", "activate" : "'$activate'" }' $URL
        ;;
    install!|install)
        [ $cmd = "install!" ] && activate="?activate=true"
        [ $# -lt 3 -o ! -f $app ] && usage
        $curl -X POST $HDR $URL$activate --data-binary @$app
        ;;

    reinstall!|reinstall)
        [ $cmd = "reinstall!" ] && activate="?activate=true"
        [ $# -lt 4 -a ! -f "$3" ] && usage
        [ $# -eq 4 -a ! -f "$4" ] && usage
        oar=$4
        [ $# -lt 4 ] && oar=$3 && app=$(appName $oar)
        $curl -X DELETE $URL/$app
        $curl -X POST $HDR $URL$activate --data-binary @$oar
        ;;

    uninstall)
        [ $# -lt 3 ] && usage
        $curl -X DELETE $URL/$app
        ;;
    activate)
        [ $# -lt 3 ] && usage
        $curl -X POST $URL/$app/active
        ;;
    deactivate)
        [ $# -lt 3 ] && usage
        $curl -X DELETE $URL/$app/active
        ;;

    *) usage;;
esac


status=$?
echo # new line for prompt
exit $status
