#!/usr/bin/env 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.
#

#
# extracts information from the host environment that is useful for
# troubleshooting Apache Metron deployments
#
CWD="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

# extract metron version from the pom
METRON_VERSION=`cat $CWD/../../pom.xml | grep "<version>" | head -1 | sed -ne '/version/{s/.*<version>\(.*\)<\/version>.*/\1/p;q;}'`
echo "Metron $METRON_VERSION"

# is this a git repo?
IS_GIT_REPO=`git rev-parse --is-inside-work-tree`
if [ "$IS_GIT_REPO" == "true" ]; then

  # current branch
  echo "--"
  git branch | grep "*"

  # last commit
  echo "--"
  git --no-pager log -n 1

  # local changes since last commit
  echo "--"
  git --no-pager diff --stat
fi

# ansible
echo "--"
ansible --version

# vagrant
echo "--"
vagrant --version

# python
echo "--"
python --version 2>&1

# maven
echo "--"
mvn --version

# docker
echo "--"
docker --version
if docker info 2>&1  | grep -q 'Cannot connect to the Docker daemon'
then
  echo "WARNING: Docker daemon is not running"
fi

# node
echo "--"
echo "node"
node --version

# npm
echo "--"
echo "npm"
npm --version

# C++ compiler
echo "--"
if [[ $(command -v g++) && $(g++ --version 2>/dev/null) ]]; then
  g++ --version

  # check C++11 compliance
  echo "--"
  OBJFILE=/tmp/test
  CPPFILE=/tmp/test.cpp
  cat > $CPPFILE <<- EOM
#include <iostream>
using namespace std;
int main() {
    cout << "Hello World!" << endl;
    return 0;
}
EOM
  g++ -std=c++11 $CPPFILE -o $OBJFILE &>/dev/null
  if [ $? -eq 0 ]; then
      echo "Compiler is C++11 compliant"
  else
      echo "Warning: Compiler is NOT C++11 compliant"
  fi
  rm -f $CPPFILE $OBJFILE
elif [[ $(command -v g++) ]]; then
  echo "Warning: g++ not properly configured"
else
  echo "Warning: g++ not found"
fi

# operating system
echo "--"
uname -a

# system resources
echo "--"
case "${OSTYPE}" in
  linux*)
    cat /proc/meminfo  | grep -i MemTotal | awk '{print "Total System Memory = " $2/1024 " MB"}'
    cat /proc/cpuinfo | egrep 'model\ name' | uniq | cut -d: -f2 | awk '{print "Processor Model:" $0}'
    cat /proc/cpuinfo | egrep 'cpu\ MHz' | uniq | cut -d: -f2 | awk '{print "Processor Speed:" $0 " MHz"}'
    cat /proc/cpuinfo | grep -i '^processor' | wc -l | awk '{print "Total Physical Processors: " $0}'
    cat /proc/cpuinfo | grep -i cores | cut -d: -f2 | awk '{corecount+=$1} END {print "Total cores: " corecount}'
    echo "Disk information:"
    df -h | grep "^/"
    if [[ $(egrep '(vmx|svm)' /proc/cpuinfo) ]]; then
      echo "This CPU appears to support virtualization"
    else
      echo "This CPU may not support virtualization"
    fi
    ;;
  darwin*)
    sysctl hw.memsize | awk '{print "Total System Memory = " $2/1048576 " MB"}'
    sysctl machdep.cpu | grep 'machdep.cpu.brand_string' | cut -d: -f2 | cut -d\@ -f1 | awk '{print "Processor Model:" $0}'
    sysctl machdep.cpu | grep 'machdep.cpu.brand_string' | cut -d: -f2 | cut -d\@ -f2 | awk '{print "Processor Speed:" $0}'
    sysctl hw.physicalcpu | cut -d: -f2 | awk '{print "Total Physical Processors:" $0}'
    sysctl machdep.cpu | grep 'machdep.cpu.core_count' | cut -d: -f2 | cut -d\@ -f2 | awk '{print "Total cores:" $0}'
    echo "Disk information:"
    df -h | grep "^/"
    if [[ $(sysctl kern.hv_support | awk -F' ' '{print $2}') == "1" && $(sysctl -a | grep machdep.cpu.features | grep VMX) ]]; then
      echo "This CPU appears to support virtualization"
    else
      echo "This CPU may not support virtualization"
    fi
    ;;
  *)
    echo "Unable to detect system resources for ${OSTYPE}"
    ;;
esac
