#!/bin/bash
#
# Copyright (C) 2016 The Android Open Source Project
#
# 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.
#
# Version: 1.3-a11
#
set -o nounset

#
# Settings
#
JACK_HOME="${JACK_HOME:=$HOME/.jack-server}"
JACK_CLIENT_SETTING="${JACK_CLIENT_SETTING:=$HOME/.jack-settings}"
TMPDIR=${TMPDIR:=/tmp}

LAUNCHER_JAR="$JACK_HOME/launcher.jar"
LAUNCHER_NAME=com.android.jack.launcher.ServerLauncher
CURRENT_CHARSET=$(locale charmap)
if [ -z "$CURRENT_CHARSET" ]; then
  CHARSET_ARGUMENT=
else
  CHARSET_ARGUMENT=";charset=$CURRENT_CHARSET"
fi

JACK_LOGS_DIR="$JACK_HOME"/logs
JACK_OUT_ERR="$JACK_LOGS_DIR"/outputs.txt
JACK_CONNECTION_TIMEOUT=300

#
# Load client settings
#
if [ -f "$JACK_CLIENT_SETTING" ]; then
  source "$JACK_CLIENT_SETTING"
fi


usage () {
  echo "Usage : $0"
}

checkCurl() {
  CURL_COMMAND=$(which curl)

  if [ $? -ne 0 ] ; then
    echo "curl not found in PATH"
    return 255
  fi

  if ! "$CURL_COMMAND" --version >/dev/null 2>&1 ; then
    echo "Failed to execute '$CURL_COMMAND'"
    return 255
  fi

  if "$CURL_COMMAND" --version | grep -q "SecureTransport" ; then
    echo "'$CURL_COMMAND' unsupported, please use a curl not based on SecureTransport"
  fi

  if "$CURL_COMMAND" --version | grep -q "OpenSSL/1.0.0" ; then
    echo "'$CURL_COMMAND' is using a too old SSL library, please update curl and its dependencies"
  elif curl --version | grep -q "OpenSSL/0." ; then
    echo "'$CURL_COMMAND' is using a too old SSL library, please update curl and its dependencies"
  fi
}


checkJava() {
  JAVA_COMMAND=$(which java)

  if [ $? -ne 0 ] ; then
    echo "java not found in PATH"
    return 255
  fi

  if ! "$JAVA_COMMAND" -version >/dev/null 2>&1 ; then
    echo "Failed to execute '$JAVA_COMMAND'"
    return 255
  fi


  JAVA_VERSION=$("$JAVA_COMMAND" -version 2>&1 | head -1 | grep --only-matching -e \"1\\.[0-9]* | cut -c 4-)
  if [ -z "$JAVA_VERSION" ] ; then
    echo "'$JAVA_COMMAND': Failed to parse version, please ensure you're running a supported java"
    return 255
  fi

  if [ "$JAVA_VERSION" -lt 7 ] ; then
    echo "'$JAVA_COMMAND' is too old, please update to 1.7 or newer"
  fi
}


checkKeytool() {
  KEYTOOL_COMMAND=$(which keytool)

  if [ $? -ne 0 ] ; then
    echo "keytool not found in PATH"
    return 255
  fi

  if ! $KEYTOOL_COMMAND -help >/dev/null 2>&1 ; then
    echo "failed to execute '$KEYTOOL_COMMAND'"
    return 255
  fi


  if ! $KEYTOOL_COMMAND -help 2>&1 | grep -q -e "-genkeypair" ; then
    echo "'$KEYTOOL_COMMAND' unsupported, please ensure PATH allows finding keytool from a supported Java Runtime Environment ie 1.7 or newer"
  fi
}


#
# $1: port number
#
checkport() {
  PID_USING_PORT=$(lsof -F p -i TCP:$1 -sTCP:LISTEN | cut -c 2-)
  if [ -z "$PID_USING_PORT" ] ; then
    # port is free nothing to check
    return 0
  fi

  PS_OUT=$(ps -p $PID_USING_PORT -o  "pid uid args" | tail -1)
  if [ $? -ne 0 ] ; then
    # process exited before we could get any info, weird but means the port is now available
    return 0
  fi

  if ! echo $PS_OUT | grep -q $LAUNCHER_NAME  ; then
    echo "Port $1 is used by another process (pid=$(echo $PS_OUT | awk '{print $1}')), please ensure to free the port or change port configuration in '$JACK_CLIENT_SETTING' and '$JACK_HOME/config.properties'"
    return 255
  fi

  if [ "$(echo $PS_OUT | awk '{print $2}')" -ne "$(id -u)" ] ; then
    echo "Port $1 is used b a Jack server from another user uid=$(echo $PS_OUT | awk '{print $2}'), please change port configuration in '$JACK_CLIENT_SETTING' and '$JACK_HOME/config.properties'"
    return 255
  fi
}


checkBase64() {
  BASE64_COMMAND=$(which base64)

  if [ $? -ne 0 ] ; then
    echo "base64 not found in PATH"
    return 255
  fi

  BASE64_CHECK=$((echo amFjaw==;echo LXNlcnZlcg==) | "$BASE64_COMMAND" --decode 2>&1)
  if [ "$BASE64_CHECK" != jack-server ]; then
    echo "'$BASE64_COMMAND' is not a supported version"
    return 255
  fi
}

STATUS=0

if ! checkCurl ; then
  STATUS=1
fi

if ! checkJava ; then
  STATUS=1
fi
if ! checkKeytool ; then
  STATUS=1
fi

if ! checkport $SERVER_PORT_ADMIN ; then
  STATUS=1
fi
if ! checkport $SERVER_PORT_SERVICE ; then
  STATUS=1
fi

if ! checkBase64 ; then
  echo "base64 is not mandatory but installing a supported version can help with standard output and standard error problems"
fi

if [ $STATUS -eq 0 ] ; then
  echo "Diagnostic completed without error."
fi
# Exit
exit $STATUS
