#!/bin/bash
#####################################################################
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.
#####################################################################

# verify-ofbiz-release.sh
# Apache OFBiz release verification tool.
# Downloads and checks the given release zip file for correct md5/SHA checksums 
# and signing certificate (see https://www.apache.org/dev/release-signing.html).
# If selected, can also automatically unpack the release, init the Gradle warapper
# and perform the integration tests.
#
# Usage: $0  [-h] [-d] [-v] [-t] [-a] [apache-ofbiz-xx.xx.xx]
# Options
# -h print help and exit
# -d download release files
# -v verify release files
# -t run integration tests
# -a all of the above
#
# to log the output to a file, do something like
# ./verify-ofbiz-release.sh -a apache-ofbiz-17.12.06  2>&1 | tee verify.log

# configuration
VERSION=0.2
URL='https://dist.apache.org/repos/dist/dev/ofbiz'

# color definitions for output
RED='\033[0;31m'
GRN='\033[0;32m'
NC='\033[0m' # No Color

# Preserve original language and set en_EN
TEMPLANG=$LANG
LANG=en_EN.UTF-8

printHelp () {
cat <<EOF
Apache OFBiz release verification tool v$VERSION.

Usage: $0  [-h] [-d] [-v] [-t] [-a] [apache-ofbiz-xx.xx.xx]

Options:
   -h  print help and exit
   -d  download release files
   -v  verify release files
   -t  run integration tests
   -a  all of the above

To log the output to a file, use something like
./verify-ofbiz-release.sh -a apache-ofbiz-17.12.06  2>&1 | tee verify.log
EOF
}

# np parameters at all - print help and exit
if [[ $# -eq 0 ]] ; then
    printHelp
    exit 1
fi

# initialize switches
download=false
verify=false
runtests=false

# get options and strip from commandline
while getopts "hdvta" option
do
  case $option in
    h) printHelp; exit 0 ;;
    d) download=true ;;
    v) verify=true ;;
    t) runtests=true ;;
    a) download=true; verify=true; runtests=true ;;
    ?) echo "Error: option -$OPTARG is not implemented."; exit 1;;
  esac
done

shift $(( OPTIND - 1 ))

# no remaining argument with the release name - print help and exit
if [ -z "$1" ] ; then
    printHelp
    exit 1
fi

# remaining (last) parameter is the release name
RELEASE=$1
ZIP=$RELEASE.zip

printHelp () {
    echo "Usage: $0  [-h] [-d] [-v] [-t] [-a] [apache-ofbiz-xx.xx.xx]"
    echo "Options:"
    echo "-h print help and exit"
    echo "-d download release files"
    echo "-v verify release files"
    echo "-t run integration tests"
    echo "-a all of the above"
}

downloadFiles () {
    echo "Downloading files for $ZIP..."

    wget $URL/KEYS
    wget $URL/$ZIP
    wget $URL/$ZIP.asc
    wget $URL/$ZIP.sha512

    echo 'Done!'
    echo " "
}

verifyFiles () {
    echo "Verifying files..."

    if [ ! -f $ZIP.sha512 ];
    then
        echo -e "${RED}skipping sha check!${NC} (sha checksum file $ZIP.sha512 not found)\n"
    else
        checkSHA $ZIP
    fi

    if [ ! -f $ZIP.asc ];
    then
        echo -e "${RED}skipping signature check!${NC} (signature file $ZIP.asc not found)"
    else
        echo "GPG verification output"
        LC_MESSAGES=en_EN.UTF-8 gpg --verify $ZIP.asc $ZIP
    fi

    echo " "
}

checkSHA () {
    file1=`gpg --print-md SHA512 $ZIP`
    file2=`cut -d* -f1 $ZIP.sha512`

    echo "sha check of file: $ZIP"
    echo "Using sha file: $ZIP.sha512"
    echo $file1
    echo $file2

    if [ "$file1" != "$file2" ]
    then
        echo -e "${RED}sha sums mismatch!${NC}"
    else
        echo -e "${GRN}sha checksum OK${NC}"
    fi

    echo ""
}

runTests () {
    if [ ! -d $RELEASE ];
    then
        echo "Unpacking release file archive $ZIP..."
        unzip $ZIP
    fi
    cd $RELEASE

    echo "Initializing Gradle wrapper..."
    ./gradle/init-gradle-wrapper.sh

    echo "Running tests..."
    ./gradlew cleanAll loadAll testIntegration

    cd ..
}

echo "Processing files for release: $RELEASE..."

# downlad release files
if [ "$download" = true ]
then
    downloadFiles
fi

# verify release files
if [ "$verify" = true ]
then
    verifyFiles
fi

# unpack, init Gradle wrapper and run integration tests
if [ "$runtests" = true ]
then
    runTests
fi

# reset original language
LANG=$TEMPLANG

echo "Done processing files for release $RELEASE"

exit 0
