#!/bin/bash

############################################################
##  AUD 서버 설치 / 운영   Server 설정 값을  예시와 같이 등록후 진단
##  AUD 서버 설치 이전인 경우 해당 점검 단계는 Skip할 수 있음
##   ( 초기값 미등록 상태로  진단 실행 시   진단 과정에서  입력받아 진행 가능 )

############################################################
##  s-check.conf 파일로 부터  AUD Server 진단 Util 실행 정보 설정
source ./s-check.conf

## 제품 설치 위치   
contextRootPath=${contextRootPath}

## Reports Directory 위치 
reportsPath=${reportsPath}

## Repository DB IP/Port 
ipAddress=${ipAddress}
portNumber=${portNumber}

## Server Domain 주소  
dnsName=${dnsName}

## 환경구성/Test page
checkPage=${checkPage}

## 점검 범위  INSTALL / OPERATION
checkFlag=${checkFlag}


############################################################
##  AUD Server  설치에 필요한  최소/권장  Spec Define  
##  정된 값을 기준으로 진단 결과를 표시.  Site 별 최소 사양은 조정 가능

##   System 권장  CPU Core수.  Default 4
cpuCount=4

##   System  권장  Memory size (GB). Default 16
memorySize=16

##   System 권장  물리  Disk Size (GB).  Default 100 
##  reports 폴더 포함
diskSize=100

##  WAS 구동 JVM Version  1.8 이상 
javaVersion=1.8

## Reports 지정 Directory의 물리 Disk Size (GB).  Default 50
##  이중화 서버의 경우 Mount된 NAS 크기
reportsSize=50

############################################################
####    AUD Platform 서버   기본 환경 구성 값
current_date=$(date +"%Y-%m-%d")
current_time=$(date +"%H:%M:%S")
##  진단 결과를 출력할 파일 명 
##   Reports 경로를 지정한 경우 reports/svrCheckResult 폴더 생성 날짜별 생성
##   Reports 경로가 없는 경우 현재 Directory 하위에 svrCheckResult 폴더 생성 날짜별 생성
##  output_file="check_result/$current_date.txt"
output_dir=
outout_file=

clear

############################################################
## 진단 시작  ## 화면 Clear
clear

file_name=$checkFlag"_"$current_date.txt
if [ -z "$reportsPath" ]; then
  output_dir=svrCheckResult
  if [ ! -d "$output_dir" ]; then
    mkdir -p "$output_dir"
  fi
  output_file="$output_dir/$file_name"
else
  output_dir=$reportsPath/svrCheckResult
  if [ ! -d "$output_dir" ]; then
    echo "Directory does not exist. Creating directory..."
    mkdir -p "$output_dir"
  fi
  output_file="$output_dir/$file_name"
fi





############################################################
## Remote Server Connection Test  공통 Function Begin 
remoteServerConnectionTest() {

  chkCnt=0
  echo "  *  $1 Server Connection Infor  IP:Port :  [$2:$3] "

  printf "\n"
  if [ -z "$3" ]; then
    printf "  ::::$1 Server  Connect Ping check Start ["
  else
    printf "  ::::$1 Server  Connect Firewall check Start ["
  fi
  for i in {1..47}
  do
    printf "-"
    sleep 0.01
  done

  printf "]\n\n"

  if [ -z "$3" ]; then
    ping -c 1 "$2" > /dev/null

    if [ $? -eq 0 ]; then
      printf "    ==> $1 Server  [Ping check Success] : Connection to $2  is Reachable. \n"
    else
      var=$((chkCnt + 1))
      chkCnt=$var
      var=$((remoteFailCnt + 1))
      remoteFailCnt=$var
      printf "    ==> $1 Server  [Ping check Error] : Connection to $2  is Unreachable. \n"
    fi
  else 
    ## nc -z -v -w5 $2 $3
    nc -z -w5 $2 $3

    if [ $? -eq 0 ]; then
      printf "    ==> $1 Server  [Connection check Success] : Connection to $2 on port $3 is possible. \n"
    else
      var=$((chkCnt + 1))
      chkCnt=$var
      var=$((remoteFWFailCnt + 1))
      remoteFWFailCnt=$var
      printf "    ==> $1 Server [Connection check Error] : Connection to $2 on port $3 is not possible. \n"
    fi
  fi

  echo ""

  if [ -z "$3" ]; then
    if [ $chkCnt -gt 0 ]; then
      printf "  * Fail : 입력하신 $1 Server  접속에 문제가 있습니다.  \n"
      printf "     망 내에 해당 IP가 없거나 Network 문제 등으로 대상 서버가 확인되지 않습니다. \n"
      printf "     Remote Server의 IP 정보를 다시한번 확인해 보시기 바랍니다. \n"
    else
      printf "  *** Success : $1 Server Connection Check complete \n"
    fi
  else
    if [ $chkCnt -gt 0 ]; then
      printf "  * Fail : 입력하신 $1 Server  접속에 문제가 있습니다.  \n"
      printf "     해당 서버 IP/Port 정보를 다시한번 확인해 보시고 이상 없다면  \n"
      printf "     AUD Server <--> $1 Server 간 방화벽을 확인해 보시기 바랍니다. \n"
    else
      printf "  *** Success : $1 Server Connection & Firewall  Check complete \n"
    fi
  fi


  for i in {1..2}
  do
    printf "\n"
    sleep 0.1
  done

}
##  Function End 
############################################################




exec &> >(tee -a "$output_file")
echo ""
echo "#######################################################################################################"
echo "# "
echo "# AUD Platform 7   Server Env Check Utility  [ $checkFlag 환경 ]  진단 시작   "
echo "# "
##echo "#  * Created by BIMATRIX Co. Ldt "
##echo "#  * Diagnosis date : "$current_date  $current_time
##echo "#  * 진단 결과 파일 출력 위치 : $output_file"
##echo "# "
echo "#######################################################################################################"
echo ""


totalFailCnt=0
osFailCnt=0
jvmFailCnt=0
dbFailCnt=0
remoteFailCnt=0
reportsFailCnt=0
contextFailCnt=0
remoteFWFailCnt=0
systemInfoFailCnt=0

############################################################
## OS의 기본 사양을 확인하여 AUD Platform 최소 설치사양 점검 

echo "[Step1]. ***** AUD Platform 7 설치가능한  서버 자원을 점검  ***** "

for i in {1..1}; do
  echo ""
  sleep 0.3
done

############################################################
## CPU 갯수  확인

printf "  ::::CPU Check Start ["
for i in {1..47}
do
  printf "-"
  sleep 0.01
done

printf "]\n\n"


cpu_count=$(grep -c '^processor' /proc/cpuinfo)

logical_cpus=$(grep ^processor /proc/cpuinfo | tail -n1 | awk '{print $3+1}')

cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2+$4}')


echo "   :: CPU Core count : ${cpu_count} (논리Process : ${logical_cpus} "
echo "   :: CPU 사용율  : ${cpu_usage} %"

echo ""

## CPU 갯수가 4개 이상이면 OK, 그렇지 않으면 Fail 표시
if [ $cpu_count -ge $cpuCount ]; then
  printf "    ==> CPU Check Success: CPU count is $cpu_count core \n"
  printf "        설치 최소 권장 사양( $cpuCount Core or more )을 만족 합니다. \n"
else
  var=$(($osFailCnt + 1))
  osFailCnt=$var
  printf "    ==> CPU Check Error: CPU count is $cpu_count core \n"
  printf "        설치 최소 권장 사양( $cpuCount Core or more )에 부족합니다. \n"
fi

for i in {1..2}
do
  printf "\n"
  sleep 0.1
done


############################################################
## 메모리 용량 확인

printf "  ::::Memory Check Start ["
for i in {1..43}
do
  printf "-"
  sleep 0.01
done

printf "]\n\n"


total_mem=$(free -b | grep 'Mem:' | awk '{print $2}')
used_mem=$(free -b | grep 'Mem:' | awk '{print $3}')
free_mem=$(free -b | grep 'Mem:' | awk '{print $4}')
aval_mem=$(free -b | grep 'Mem:' | awk '{print $7}')


total_mem_gb=$(echo "scale=2; $total_mem/1024/1024/1024" | bc)
used_mem_gb=$(echo "scale=2; $used_mem/1024/1024/1024" | bc)
free_mem_gb=$(echo "scale=2; $free_mem/1024/1024/1024" | bc)
aval_mem_gb=$(echo "scale=2; $aval_mem/1024/1024/1024" | bc)

echo "   :: Total memory size : ${total_mem_gb} GB"
echo "   :: Free memory size : ${free_mem_gb} GB"
echo "   :: Used memory size : ${used_mem_gb} GB"
echo "   :: Availavle memory size : ${aval_mem_gb} GB"


echo ""


## 메모리 용량이 16G 이상이면 OK, 그렇지 않으면 Fail 표시
##if [ $free_mem_gb -ge $memorySize ]; then

if [ $(echo "scale=0; $aval_mem_gb/1" | bc) -ge $memorySize ]; then

  printf "    ==> Memory Check Success: Availavle Memory size is  ${aval_mem_gb}GB \n"
  printf "        설치 최소 권장 사양 ( $memorySize GB or more )를 만족 합니다. \n"
else
  var=$(($osFailCnt + 1))
  osFailCnt=$var
  printf "    ==> Menory Check Error: Memory size is ${mem_total}MB (${mem_total_gb}GB) \n"
  printf "       설치 최소 권장 사양( $memorySize GB or more )에 부족합니다. \n"
fi


for i in {1..2}
do
  printf "\n"
  sleep 0.1
done


############################################################
## 현재 Directory에  마운트된 디스크 확인
mount_point=$(df . | awk 'NR==2 {print $6}')

## 현재 마운트된 디스크의 Size 확인
##disk_size=$(df -h $mount_point | awk 'NR==2 {print $3}' | sed 's/G//')
## disk_size=$(df -B 1G . | awk '/^\/dev/{print $2}')
 
printf "  ::::Disk Check Start [" 
for i in {1..46}
do
  printf "-"
  sleep 0.01
done

printf "]\n\n"



## 현재 위치 디스크 경로 추출
path=$(df -P . | awk 'NR==2{print $1}')

## 디스크 정보 추출
dfInfo=$(df -BG "$path")

## 전체 디스크 크기 추출 (GB)
totalGB=$(echo "$dfInfo" | awk 'NR==2{print substr($2, 1, length($2)-1)}')

## 사용 가능한 디스크 크기 추출 (GB)
freeGB=$(echo "$dfInfo" | awk 'NR==2{print substr($4, 1, length($4)-1)}')

usedGB=$(echo "$totalGB - $freeGB" | bc)

## 결과 출력
## echo "Total disk size: $totalGB GB"
## echo "Free disk space: $freeGB GB"
## echo "Used disk space: $usedGB GB"

echo "   :: Path : $path "
echo "   :: Total Disk size : $totalGB GB "
echo "   :: Free Disk size : $freeGB GB  "
echo "   :: Used Disk size : $usedGB GB "


echo ""



## Disk size가  Spec상 지정값  이상인 경우 OK, 그렇지 않으면 Fail 표시
if [ $freeGB -ge $diskSize ]; then
  printf "    ==> Disk check Success: 가용한 Disk size  ${freeGB}G \n"
  printf "        설치 최소 권장사양( $diskSize GB or more )를 만족 합니다. \n"
else
  var=$(($osFailCnt + 1))
  osFailCnt=$var
  printf "    ==> Disk check Error: Disk size is ${freeGB}G \n"
  printf "        설치 최소 권장사양( $diskSize GB or more )에 부족합니다.. \n"
fi

for i in {1..2}
do
  printf "\n"
  sleep 0.1
done


printf "  **************************************************************************************************** \n"
printf "  *\n"
if [ $osFailCnt -gt 0 ]; then
  printf "  *  OS Resource Check Error : 최소 하나 이상의 Resource  문제가 발견 되었습니다.  \n"
  printf "  *   AUD플랫폼 7을 설치하기 위한 Server 최소 사양에 부족한 항목이 점검 되었습니다. \n"
  printf "  *\n"
else
  printf "  *  OS Resource Check Success : 제품 설치 권장 사양을 만족 합니다. \n"
  printf "  *\n"
fi
printf "  **************************************************************************************************** \n"
## [Step1]. End



for i in {1..3}
do
  printf "\n"
  sleep 0.1
done



############################################################
## Runtime Java version  점검
echo "[Step2]. ***** AUD Platform 7  지원 가능 Java Version Check ***** "

for i in {1..1}; do
  echo ""
  sleep 1
done

printf "  :::Java Version Check Start ["
for i in {1..39}
do
  printf "-"
  sleep 0.01
done

printf "]\n\n"


## Java Home 경로 확인
if [ -z "$JAVA_HOME" ]; then
  printf "   :: JAVA_HOME is not set \n"
  ## JAVA_HOME이 설정되어 있지 않은 경우, 런타임에서 실행되는 Java 버전 확인
  java_version=$(java -version 2>&1 | grep "version" | awk '{print $3}' | tr -d \")
  printf "   :: Runtime Java version is $java_version \n"
  ## 실행되는 Java의 경로 확인
  java_path=$(which java)
  printf "   :: Java path is $java_path \n\n"


  ## Java 버전이 1.8 이상인지 확인
  if [[ "$java_version" < "1.8" ]]; then
    var=$(($jvmFailCnt + 1))
    jvmFailCnt=$var
    printf "    ==> Java Version check Error: 권장 사양(1.8 이상)에 맞지 않습니다. \n"
  else
    printf "    ==> Java Version check Success: 권장 사양(1.8 이상)을 만족 합니다. \n"
  fi 

else

  printf "   :: JAVA_HOME is set to $JAVA_HOME \n"
  java_version=$(java -version 2>&1 | grep "version" | awk '{print $3}' | tr -d \")
  printf "   :: Runtime Java version is $java_version \n\n"

  ## Java 버전이 1.8 이상인지 확인
  if [[ "$java_version" < "1.8" ]]; then
    var=$(($jvmFailCnt + 1))
    jvmFailCnt=$var
    printf "    ==> Java Version check Error: 권장 사양(1.8 이상)에 맞지 않습니다. \n"
  else
    printf "    ==> Java Version check Success: 권장 사양(1.8 이상)을 만족 합니다. \n"
  fi

fi

printf "\n\n"

printf "  **************************************************************************************************** \n"
printf "  *\n"
if [ $jvmFailCnt -gt 0 ]; then
  printf "  * JAVA Version Check Error :   \n"
  printf "  *   AUD플랫폼 7을 설치하기 위한 JAVA 최소 사양은 1.8 이상이어야 합니다. \n"
  printf "  *\n"
else
  printf "  * JAVA Version Check Success : 제품 설치 권장 사양을 만족 합니다. \n"
  printf "  *\n"
fi
printf "  **************************************************************************************************** \n"

##  [Step2]. End



for i in {1..3}
do
  printf "\n"
  sleep 0.1
done


############################################################
## Repository DB network 접속 Test 수행
## 명령어 수행 안될 경우 Install 우선 실행 
## CentOS : sudo yum install nc
## Ubuntu : sudo apt-get install netcat

## IP Port를 입력받아 해당 DB 접속이 가능한지 점검
echo "[Step3]. ***** Repository DB Server  Connection  Check  ***** "

for i in {1..1}; do
  echo ""
  sleep 0.5
done

if [ -z "$ipAddress" ]; then
  read -p "   ::Repository DB IP를 입력하세요 :" input
  ipAddress=$input
else 
  echo "   :: 등록된 Repository DB IP Address는 [$ipAddress] 입니다. "
fi

if [ -z "$portNumber" ]; then
  read -p "   ::Repository DB Port number 를 입력하세요 :" input
  portNumber=$input
else 
  echo "   :: 등록된 Repository DB Port number 는 [$portNumber] 입니다. "
fi

echo ""


while true
do

  if [ -z "$ipAddress" ]; then
    read -p "   ::Repository DB IP를 입력하세요 : " ipAddress
  fi

  if [ -z "$ipAddress" ]; then
    printf "\n"
    printf "   Repository DB Server  IP를 입력하지 않았습니다.  \n"
    printf "\n"
    continue
  elif [ -z "$portNumber" ]; then
    printf "\n"
    printf "   * Port 정보 미등록으로  DB Server IP로   Ping  Check만 수행 합니다. \n"
    printf "\n"
  fi

  printf "  ::::Repository DB connect Check Start ["
  for i in {1..43}
  do
    printf "-"
    sleep 0.01
  done

  printf "]\n\n"

  if [ -z "$portNumber" ]; then
    ping -c 1 "$ipAddress" > /dev/null
    if [ $? -eq 0 ]; then
      printf "    ==> DB Server ping check Success: Connection to $ipAddress  is Reachable. \n"
    else
      printf "    ==> DB Server ping check Error: Connection to $ipAddress  is Unreachable. \n"
    fi
  else 
    #nc -z -v -w5 $ipAddress $portNumber
    nc -z -w5 $ipAddress $portNumber
    if [ $? -eq 0 ]; then
      printf "    ==> DB Server connection Success: Connection to $ipAddress on port $portNumber is possible. \n"
    else
      var=$(($dbFailCnt + 1))
      dbFailCnt=$var
      printf "    ==> DB Server Connection Error: Connection to $ipAddress on port $portNumber is not possible. \n"
    fi
  fi
  break
done


printf "\n\n"

printf "  **************************************************************************************************** \n"
printf "  *\n"
if [ $dbFailCnt -gt 0 ]; then
  printf "  * Repository DB 접속에 문제가 있습니다.  \n"
  printf "  *   Repository DB Server의 IP/Port를 다시한번 확인해 보시기 바랍니다. \n"
  printf "  *   또는 WAS Server <-> DB Server 간 방화벽을 확인해 보시기 바랍니다. \n"
  printf "  *\n"
else
  printf "  * Repository DB Connection Check Success : DB 서버 연결에 성공 했습니다. \n"
  printf "  *\n"
fi
printf "  ***************************************************************************************************** \n"
##  [Step3]. End



for i in {1..3}
do
  printf "\n"
  sleep 0.1
done




############################################################
##  i-META Server, i-Olap Server, JCM Server, i-STREAM Server 등 원격지 Server network 접속 Test 수행
## IP Port를 입력받아 해당 서버 접속이 가능한지 점검
echo "[Step4]. ***** 별도 장비에 설치할 제품이 있는 경우  Server  연결 Check ***** "

for i in {1..1}; do
  echo ""
  sleep 0.5
done

if [ "${remoteSvrFlag}" = "N" ]; then
  printf "\n"
  printf "  ****  설정에 따라  원격지 Server 연결 Test를 종료합니다  ***\n"
  printf "\n"
else

  ## remoteServerConnectionTest $ServerName $ip_address $port_number

  ##############################################
  svr_name=i-META

  if [ -z "${remoteSvrMetaIP}" ]; then
    printf "\n"
    printf "  ****  i-META Server 등록 정보가 없어서  연결Test를 Skip 합니다.   ***\n"
    printf "\n\n"
  else
    remoteServerConnectionTest $svr_name ${remoteSvrMetaIP} 
  fi

  ##############################################
  svr_name=i-OLAP

  if [ -z "${remoteSvrOlapIP}" ]; then
    printf "\n"
    printf "  ****  i-OLAP Server 등록 정보가 없어서 연결Test를 Skip 합니다.  ***\n"
    printf "\n\n"
  else
    remoteServerConnectionTest $svr_name ${remoteSvrOlapIP} 
  fi

  ##############################################
   svr_name=JCM-Scheduler

  if [ -z "${remoteSvrSchedulerIP}" ]; then
    printf "\n"
    printf "  ****  JCM-Scheduler Server 등록 정보가 없어서 연결 Test를 Skip 합니다  ***\n"
    printf "\n\n"
  else
    remoteServerConnectionTest $svr_name ${remoteSvrSchedulerIP} 
  fi

  ##############################################
  svr_name=i-STREAM

  if [ -z "${remoteSvrStreamIP}" ]; then
    printf "\n"
    printf "  ****  i-STREAM Server 등록 정보가 없어서 연결 Test를 Skip 합니다 . ***\n"
    printf "\n\n"
  else
    remoteServerConnectionTest $svr_name ${remoteSvrStreamIP} 
  fi
fi



printf "  **************************************************************************************************** \n"
printf "  *\n"
if [ $remoteFailCnt -gt 0 ]; then
  printf "  *  Remote Server Connection Check Error : 최소 하나 이상의 RemoteServer 연결에 문제가 발견 되었습니다.  \n"
  printf "  *   등록 된 원격지 서버 중 하나 이상에서 Connection Test 중  연결에 실패 했습니다 . IP/Network 를 확인하세요 \n"
  printf "  *\n"
else
  printf "  *  Remote Server Connection Check  Success : 원격지 서버 연결Test를 완료 했습니다 . \n"
  printf "  *\n"
fi
printf "  **************************************************************************************************** \n"
##  [Step4]. End






#############################################################
## checkFlag=Operation  Start
#############################################################

## if  [ "$checkFlag" = "OPERATION" ]; then 

  for i in {1..3}
  do
    printf "\n"
    sleep 0.1
  done

echo "#######################################################################################################"
 echo "##  AUD Platform Server의 운영환경 설정 정보에 대한  점검 Start "

  for i in {1..2}
  do
    printf "\n"
    sleep 0.1
  done

  #############################################################
  echo "[Step5]. ***** ContextRoot 경로 Archive 구조  Check ***** "

  for i in {1..1}; do
    echo ""
    sleep 0.5
  done

  if [ -z "${contextRootPath}" ]; then
    read -p "   :: AUD플랫폼 7 서버가 설치된 ContextRoot Path의 절대 경로를 입력하세요 :" input
    contextRootPath=$input
  else 
    echo "  :: AUD플랫폼 7 서버가 설치된 ContextRoot Path는 $contextRootPath 입니다. "
  fi

  printf "\n"
  printf "  ::::ContextRoot Path Check Start ["
  for i in {1..43}
  do
    printf "-"
    sleep 0.01
  done
  printf "]\n\n"

  echo "   :: AUD플랫폼 7 서버 ContextRoot Path : $contextRootPath"
  echo ""

  # 디렉토리의 Owner 계정 정보 출력
  echo "   :: Owner of Directory  [$contextRootPath] : $(stat -c '%U' "$contextRootPath")" 
  echo ""

  # 디렉토리의 권한 정보 출력
  echo "   :: Permissions of Directory [$contextRootPath] : $(stat -c '%a' "$contextRootPath")" 
  echo ""

  # 하위 디렉토리 목록 출력
  echo "   :: Subdirectories of Directory [$contextRootPath] "
  echo "   =========================================================================="
  ls -l "$contextRootPath" | grep '^d' | sed -e 's/^/   /'
  

  for i in {1..2}
  do
    printf "\n"
    sleep 0.1
  done


  printf "\n\n"
  printf "  ::::서버 Library  Check Start ["
  for i in {1..43}
  do
    printf "-"
    sleep 0.01
  done
  printf "]\n\n"


  # 서버 Library 목록 출력
  libPath=$contextRootPath/WEB-INF/lib

  #  서버 Library 디렉토리의 Owner 계정 정보 출력
  echo "   :: Server Library : [$libPath]" 
  echo ""
  echo "   :: Owner : $(stat -c '%U' "$libPath")" 
  echo ""

  # 서버 Library 디렉토리의 권한 정보 출력
  echo "   :: Permissions : $(stat -c '%a' "$libPath")" 
  echo ""

  echo "   :: Server Library list  "
  echo "   =========================================================================="
  ls -l "$libPath"  | sed -e 's/^/   /'

  echo ""
  #  # 파일 목록 출력
  #  printf "%-30s %-10s %-10s %-20s\n" "Name" "Owner" "Permissions" "Size (bytes)"
  #  printf "-------------------------------------------------------\n"
  #
  #  for file in "$libPath"/*; do
  #    if [ -f "$file" ]; then
  #        printf "%-30s %-10s %-10s %-20s\n" "$(basename "$file")" "$(stat -c '%U' "$file")" "$(stat -c '%a' "$file")" "$(stat -c '%s' "$file")"
  #    fi
  #  done



  printf "  **************************************************************************************************** \n"
  printf "  *\n"
  if [ $contextFailCnt -gt 0 ]; then
    printf "  *  ContextRootPath Check Error : 제품 설치 경로의 폴더/파일 구조에서 문제가 발견 되었습니다  \n"
    printf "  *   설정된 ContextRootPath의 권한/폴더,파일 목록 중복 Library 등을 점검 하세요 \n"
    printf "  *\n"
  else
    printf "  *  ContextRootPath Check  Success : 제품 설치 경로의 폴더/파일 구조 점검을 완료 했습니다 \n"
    printf "  *     Library 파일의 중복여부, 이전 진단 이력이 있는 경우 변경 사항 등에 대해서 별도 점검 바랍니다  \n"
    printf "  *\n"
  fi
  printf "  **************************************************************************************************** \n"



  ##  [Step5]. 종료
  ############################################################



  for i in {1..3}
  do
    printf "\n"
    sleep 0.1
  done


  ############################################################
  # Reports 경로를 입력받아  Reports 경로의 Disk Size를 확인 
  echo "[Step6]. ***** Reports 경로로 할당된 Disk size  Check ***** "

  for i in {1..1}; do
    echo ""
    sleep 0.5
  done

  if [ -z "${reportsPath}" ]; then
    read -p "   :: 설정된 Reports Path의  절대 경로를 입력하세요 :" input
    reportsPath=$input
    echo ""
  else 
    reportPath=${reportsPath}
  fi

  echo "  * Reports Path : [$reportsPath] "


  # 현재 마운트된 디스크의 Size 확인
  rdisk_size=$(df -B 1G "$reportsPath" | awk '/^\/dev/{print $2}')
  echo ""

  printf "  ::::Reports  Disk size Check Start [" 
  for i in {1..45}
  do
    printf "-"
    sleep 0.01
  done

  printf "]\n"

  echo ""

  # Reports 경로의 Disk size가  지정된 Reports Size 이상인 경우 OK, 그렇지 않으면 Fail 표시
  if [ $rdisk_size -ge $reportsSize ]; then
    printf "   ==> Disk Size  check Success: Disk size 는 ${rdisk_size}G  입니다. \n"
    printf "       설치 최소 권장사양($reportsSize GB or more)을 만족 합니다. \n"
  else
    var=$(($reportsFailCnt + 1))
    reportsFailCnt=$var
    printf "    ==> Disk Size check Error: Disk size is ${rdisk_size}G \n"
    printf "        Reports Directory의  Disk 최소 권장사양($reportsSize GB or more)에 부족합니다. \n"
  fi


  for i in {1..2}
  do
    printf "\n"
    sleep 0.1
  done



  #  현재 접속한 Application 계정 정보 출력
  appAccount="$(whoami)"
  echo "   ==> Application Account (현재 접속 계정) : $appAccount " 
  echo ""

  #  Reports  디렉토리의 Owner 계정 정보 출력
  ownerAccount="$(stat -c '%U' "$reportsPath")"
  echo "   ==> Owner : $ownerAccount "
  echo ""

  # Reports 디렉토리의 권한 정보 출력
  echo "   ==> Permissions : $(stat -c '%a' "$reportsPath")" 
  echo ""

  # Application 계정과 Owner 계정이 상이한 경우  읽기/쓰기 권한 반드시 Check 
  if [ "$ownerAccount" = "$appAccount" ]; then 
    echo "   :: Report 폴더에 생성되는 보고서의 일기/쓰기 권한 다시한번 점검 하세요 " 
  else
    echo "   :: Report 폴더의 Owner 계정과 WAS 구동 계정이 동일한 지, 읽기/쓰기 권한이 있는지 반드시 확인 바랍니다. " 
  fi
  echo ""


  printf "  **************************************************************************************************** \n"
  printf "  *\n"
  if [ $reportsFailCnt -gt 0 ]; then
    printf "  *  Reports Directory  Check Error : Reports 경로의 Disk Size, 폴더/파일 구조에서  문제가 발견 되었습니다 \n"
    printf "  *   설정된 Reports 경로의 Disk Size, 권한 등을 점검 하세요 \n"
    printf "  *\n"
  else
    printf "  *  Reports Directory Check  Success : Reports Directory 경로의 Size, 권한 등의 점검을 완료 했습니다 \n"
    printf "  *\n"
  fi
  printf "  **************************************************************************************************** \n"


  ##  [Step6]. 종료
  #######################################################################




  
  for i in {1..3}
  do
    printf "\n"
    sleep 0.1
  done

  
  ############################################################
  #  원격 접속 서버가 있는 경우  대상 서버의 Connection Check  수행 
  echo "[Step7]. *****  Remote Server Connection Check   ***** "
  
  ## remoteServerConnectionTest $ServerName $ip_address $port_number
  echo ""
  echo "  * i-META Server, i-Olap Server, JCM Server, i-STREAM Server 등을  "
  echo "  별도의 원격지 Server에 설치하는 경우 network 접속 Test를  수행 합니다. "

  for i in {1..1}; do
    echo ""
    sleep 0.5
  done

  ##############################################
  svr_name=i-META
  
  if [ -z "${remoteSvrMetaIP}" ]; then
    printf "\n"
    printf "  ****  등록된 i-META Server 정보가 없습니다.   ***\n"
    printf "\n"
  else
    remoteServerConnectionTest $svr_name ${remoteSvrMetaIP} ${remoteSvrMetaPORT}
  fi

  ##############################################
  svr_name=i-OLAP

  if [ -z "${remoteSvrOlapIP}" ]; then
    printf "\n"
    printf "  ****  등록된 i-OLAP Server 정보가 없습니다.   ***\n"
    printf "\n"
  else
    remoteServerConnectionTest $svr_name ${remoteSvrOlapIP} ${remoteSvrOlapPORT}
  fi

  ##############################################
   svr_name=JCM-Scheduler

  if [ -z "${remoteSvrSchedulerIP}" ]; then
    printf "\n"
    printf "  ****  등록된 JCM-Scheduler Server 정보가 없습니다.   ***\n"
    printf "\n"
  else
    remoteServerConnectionTest $svr_name ${remoteSvrSchedulerIP} ${remoteSvrSchedulerPORT}
  fi


  ##############################################
  svr_name=i-STREAM

  if [ -z "${remoteSvrStreamIP}" ]; then
    printf "\n"
    printf "  ****  등록된 i-STREAM Server 정보가 없습니다.   ***\n"
    printf "\n"
  else
    remoteServerConnectionTest $svr_name ${remoteSvrStreamIP} ${remoteSvrStreamPORT}
  fi




  printf "  **************************************************************************************************** \n"
  printf "  *\n"
  if [ $remoteFWFailCnt -gt 0 ]; then
    printf "  *  Remote Server Connection Check Error : 최소 하나 이상의 RemoteServer 연결에 문제가 발견 되었습니다.  \n"
    printf "  *   등록 된 원격지 서버 중 하나 이상에서 Connection Test 중  연결에 실패 했습니다 . 방화벽을 확인하세요 \n"
    printf "  *\n"
  else
    printf "  *  Remote Server Connection Check  Success : 원격지 서버 연결Test를 완료 했습니다 . \n"
    printf "  *\n"
  fi
  printf "  **************************************************************************************************** \n"


  ##  [Step7]. 종료
  #######################################################################


  for i in {1..3}
  do
    printf "\n"
    sleep 0.1
  done

  ############################################################
  # 웹 Page를 Call 하여 System 환경정보를 표시한다. 
  echo "[Step8]. ***** AUD Platform 환경정보 조회  ***** "

  for i in {1..1}; do
    echo ""
    sleep 0.5
  done


  if [ -z "${dnsName}" ]; then
    read -p "   AUD Server 주소를 입력하세요 (ex. http://example.aud.com/aud)  :" input
    dnsName=$input
  else 
    dnsName=${dnsName}
    echo "   :: 등록 된 AUD Server 주소는 [$dnsName] 입니다. "
  fi

  if [ -z "${checkPage}" ]; then
    if [ "$checkFlag" = "OPERATION" ]; then 
      checkPage="/webquery/env.jsp?user=matrixadm&version=1"
    else 
      checkPage="/index.jsp"
    fi
  fi



  #chkUrl="$dnsName/s-check/checkEnv.jsp?user=matrixadm&flag=0"
  chkUrl="$dnsName$checkPage"
  #echo "     AUD Server 주소  : $dnsName "
  echo "     AUD Server 환경정보 Check 주소  : $chkUrl "

  printf "\n"
  printf "   ::::$1 System Information Check Start ["
  for i in {1..49}
  do
    printf "-"
    sleep 0.01
  done

  printf "]\n\n"


  # curl 명령을 사용하여 웹사이트에 접속하고 결과를 출력합니다.
  response=$(curl --write-out %{http_code} --silent --output /dev/null $chkUrl)

  # HTTP 상태 코드가 200이면 "Success"를 출력하고 그렇지 않으면 "Failure"를 출력합니다.
  if [ $response -eq 200 ]; then
    echo "    ==> Success : $dnsName  is Up and Running ! "
  else
    var=$(($systemInfoFailCnt + 1))
    systemInfoFailCnt=$var
    echo "    ==> Failure : $dnsName  is Down or page not found  with status code $response"
  fi
  
  for i in {1..1}
  do
    printf "\n"
    sleep 0.5
  done

  result=$(curl -s $chkUrl)
  #result=sed -i 's/^M//g' < $result
  echo -n "${result//$'\r'/ }"



  for i in {1..2}
  do
    printf "\n"
    sleep 0.3
  done
  
  echo ""

  printf "  **************************************************************************************************** \n"
  printf "  *\n"
  if [ $systemInfoFailCnt -gt 0 ]; then
    printf "  *  System 정보 조회 Page Check Error : System  정보 조회 Page 접근에 문제가 발견 되었습니다.  \n"
    printf "  *   등록된 Domain 정보가 정확한지, WAS 서버 정상 기동 중인지 확인하세요 \n"
    printf "  *\n"
  else
    printf "  *  System 정보 조회 Page Check  Success : System  정보 조회 Page  연결Test를 완료 했습니다 . \n"
    printf "  *\n"
  fi
  printf "  **************************************************************************************************** \n"

  ##  [Step8]. 종료
  #######################################################################

## fi

echo ""
echo ""

for i in {1..2}
do
  printf "\n"
  sleep 0.5
done




## checkFlag=Operation  End
###############################################################################################

totalFailCnt=$(($osFailCnt + $dbFailCnt + $jvmFailCnt + $remoteFailCnt + $reportsFailCnt + $contextFailCnt + $remoteFWFailCnt + $systemInfoFailCnt))

echo "#######################################################################################################"
echo "# "
echo "# AUD Platform 7  Server Env Check Utillity   [ $checkFlag  환경 ]  진단 결과 요약   "
#echo "# "

for i in {1..1}
do
  echo "#"
  sleep 0.5
done

#echo "#  ****************************************************************************************"
#
#if [ $totalFailCnt -gt 0 ]; then
#  echo "#  * AUD플랫폼 7  설치/운영   Server 점검 결과                                            *"
#  echo "#  *  최소  하나 이상의 점검대상 항목에  문제점이 발견 되었습니다.                        *"
#  echo "#  *  문제 항목에 대한  확인 및 해소 후  설치 및 기동을 진행해 주시기 바랍니다.           *"
#else
#    echo "#  * AUD플랫폼 7을 설치하기 위한 Server 점검을  모두 성공적으로 마쳤습니다.               *"
#    echo "#  *  점검 결과 AUD플랫폼 7  설치 및 운영환경 모두 정상 입니다.                           *"
#fi
#
#echo "#  ****************************************************************************************"
#echo "# "

echo "#  :: 점검중 발견된 문제항목 수 : $totalFailCnt "
echo "# "


if [ $osFailCnt -gt 0 ]; then
  echo "#   [Step1] *Fail* : System  사양이 AUD플랫폼 7 을 설치하기에 부적합한 항목이 발견 되었습니다. "
  echo "#       ==> 설치 최소사양 재점거 하시고, 부족한 Resource는 보완 후 설치/운영 바랍니다.  "
else
  echo "#   [Step1] Success : System Resource 점검 결과 권장 사양을 만족 합니다. "
fi

if [ $dbFailCnt -gt 0 ]; then
  echo "#   [Step2] *Fail* : Repository DB 서버 연결에 실패했습니다. "
  echo "#       ==> DB 서버의 IP/Port 확인하고 DB서버 기동여부, 방화벽 등을 확인 하세요. "
else
  echo "#   [Step2] Success : Repository DB 연결이 정상입니다. "
fi

if [ $jvmFailCnt -gt 0 ]; then
  echo "#   [Step3] *Fail* : JAVA 버전이 AUD플랫폼 7 을 설치하기에 부적합 합니다.  "
  echo "#       ==> JAVA 버전 1.8 이상 JRE 구성 후 WAS의 Java 실행 환경으로 설정 바랍니다. "
else
  echo "#   [Step3] Success : JAVA 버전이 AUD플랫폼 7 을 설치하기에 적합 합니다. "
fi

if [ $remoteFailCnt -gt 0 ]; then
  echo "#   [Step4] *Fail* : 등록된 점검대상 원격지 서버의 연결 Test에 실패했습니다. "
  echo "#       ==> 점검 대상 서버의 IP가 정확한지 확인하세요 "
else
  echo "#   [Step4] Success : 등록된 점검 대상 원격지 서버의 연결 Test가 모두 정상 입니다. "
fi

##if  [ "$checkFlag" = "OPERATION" ]; then 

if [ $contextFailCnt -gt 0 ]; then
  echo "#   [Step5] *Fail* : Context Root Path 점검 중 문제점이 발견 되었습니다.  "
  echo "#       ==> Context 경로의 폴더/파일/LIbrary 에 대해  계정/권한등을 점검 하세요.  "
else
  echo "#   [Step5] Success : Context 경로의 폴더/파일/LIbrary 점검결과 모두 정상 입니다. "
fi

if [ $reportsFailCnt -gt 0 ]; then
  echo "#   [Step6] *Fail* : Reports 경로로 지정된 디렉토리 점검 중 문제점이 발견 되었습니다.  "
  echo "#       ==> Reports 경로로 지정된 디렉토리의 Disk Size, 계정/권한을 검검 하세요.  "
else
  echo "#   [Step6] Success : Reports 경로로 지정된 디렉토리의 Size, 계정/권한 모두 정상 입니다. "
fi

if [ $remoteFWFailCnt -gt 0 ]; then
  echo "#   [Step7] *Fail* : 점검 대상 원격지 서버의 연결에 문제가 있습니다. 방화벽을 확인하세요 "
  echo "#       ==> 점검 대상 서버의 IP/Port, 서비스 기동 여부, 방화벽 차단 여부를 확인하세요 "
else
  echo "#   [Step7] Success : 점검 대상 원격지 서버의 방화벽 Test가 모두 정상 입니다. "
fi

if [ $systemInfoFailCnt -gt 0 ]; then
  echo "#   [Step8] *Fail* : AUD Server 연결 중 오류가 발생 했습니다 "
  echo "#       ==> WAS 정상 기동 여부, AUD Server의 방화벽 차단여부 를 확인 하세요.  "
else
  echo "#   [Step8] Success : AUD Server 연결 Test가 모두 정상 입니다. "
fi

##fi

echo "#"
echo "#  Diagnosis date : "$current_date  $current_time
echo "#"
echo "#  진단결과파일 출력위치 : $output_file"
echo "#  (날짜 별 누적 관리 됩니다.  이상 발생 시 이전 진단 결과와  비교하여 변경사항을 Check 하세요)"
echo "# "
echo "#######################################################################################################"
echo ""

exec &>-
