@REM
@REM Licensed to the Apache Software Foundation (ASF) under one
@REM or more contributor license agreements.  See the NOTICE file
@REM distributed with this work for additional information
@REM regarding copyright ownership.  The ASF licenses this file
@REM to you under the Apache License, Version 2.0 (the
@REM "License"); you may not use this file except in compliance
@REM with the License.  You may obtain a copy of the License at
@REM
@REM     http://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@REM KIND, either express or implied.  See the License for the
@REM specific language governing permissions and limitations
@REM under the License.
@REM

@echo off
@REM set cmd format
powershell -NoProfile -Command "$v=(Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion').CurrentMajorVersionNumber; if($v -gt 6) { cmd /c 'chcp 65001' }"

title IoTDB ConfigNode

echo ```````````````````````````
echo Starting IoTDB ConfigNode
echo ```````````````````````````

set PATH="%JAVA_HOME%\bin\";%PATH%
set "FULL_VERSION="
set "MAJOR_VERSION="
set "MINOR_VERSION="


for /f tokens^=2-5^ delims^=.-_+^" %%j in ('java -fullversion 2^>^&1') do (
	set "FULL_VERSION=%%j-%%k-%%l-%%m"
	IF "%%j" == "1" (
	    set "MAJOR_VERSION=%%k"
	    set "MINOR_VERSION=%%l"
	) else (
	    set "MAJOR_VERSION=%%j"
	    set "MINOR_VERSION=%%k"
	)
)

set JAVA_VERSION=%MAJOR_VERSION%

@REM we do not check jdk that version less than 1.8 because they are too stale...
IF "%JAVA_VERSION%" == "6" (
	echo IoTDB only supports jdk >= 8, please check your java version.
	goto finally
)
IF "%JAVA_VERSION%" == "7" (
	echo IoTDB only supports jdk >= 8, please check your java version.
	goto finally
)

if "%OS%" == "Windows_NT" setlocal

pushd %~dp0..\..
if NOT DEFINED CONFIGNODE_HOME set CONFIGNODE_HOME=%cd%
popd

set CONFIGNODE_CONF=%CONFIGNODE_HOME%\conf
set CONFIGNODE_LOGS=%CONFIGNODE_HOME%\logs

@setlocal ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS
set is_conf_path=false
for %%i in (%*) do (
	IF "%%i" == "-c" (
		set is_conf_path=true
	) ELSE IF "!is_conf_path!" == "true" (
		set is_conf_path=false
		set CONFIGNODE_CONF=%%i
	)
)

IF EXIST "%CONFIGNODE_CONF%\windows\confignode-env.bat" (
    CALL "%CONFIGNODE_CONF%\windows\confignode-env.bat" %1
    ) ELSE (
    echo "Can't find %CONFIGNODE_CONF%\windows\confignode-env.bat"
    )

@REM CHECK THE PORT USAGES
@REM SET CONFIG FILE
IF EXIST "%CONFIGNODE_CONF%\iotdb-system.properties" (
  set CONFIG_FILE="%CONFIGNODE_CONF%\iotdb-system.properties"
) ELSE IF EXIST "%CONFIGNODE_HOME%\conf\iotdb-system.properties" (
  set CONFIG_FILE="%CONFIGNODE_HOME%\conf\iotdb-system.properties"
) ELSE IF EXIST "%CONFIGNODE_CONF%\iotdb-confignode.properties" (
  set CONFIG_FILE="%CONFIGNODE_CONF%\iotdb-confignode.properties"
) ELSE IF EXIST "%CONFIGNODE_HOME%\conf\iotdb-confignode.properties" (
  set CONFIG_FILE="%CONFIGNODE_HOME%\conf\iotdb-confignode.properties"
) ELSE (
  set CONFIG_FILE=
)

IF DEFINED CONFIG_FILE (
  for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i "^cn_internal_port"
    "%CONFIG_FILE%"') do (
      set cn_internal_port=%%i
  )
  for /f  "eol=# tokens=2 delims==" %%i in ('findstr /i "^cn_consensus_port"
    "%CONFIG_FILE%"') do (
      set cn_consensus_port=%%i
  )
) ELSE (
  echo "Can't find iotdb-system.properties or iotdb-confignode.properties, check the default ports"
  set cn_internal_port=10710
  set cn_consensus_port=10720
)

echo Check whether the ports are occupied....
set occupied=0
set cn_internal_port_occupied=0
set cn_consensus_port_occupied=0
for /f  "tokens=1,3,7 delims=: " %%i in ('netstat /ano') do (
    if %%i==TCP (
       if %%j==%cn_internal_port% (
         if !cn_internal_port_occupied!==0 (
           echo The cn_internal_port %cn_internal_port% is already occupied, pid:%%k
           set occupied=1
           set cn_internal_port_occupied=1
         )
       ) else if %%j==%cn_consensus_port% (
         if !cn_consensus_port_occupied!==0 (
           echo The cn_consensus_port %cn_consensus_port% is already occupied, pid:%%k
           set occupied=1
           set cn_consensus_port_occupied=1
         )
       )
    )
)

if %occupied%==1 (
  echo There exists occupied port, please change the configuration.
  TIMEOUT /T 10 /NOBREAK
  exit 0
)

set CONF_PARAMS=-s
if NOT DEFINED MAIN_CLASS set MAIN_CLASS=org.apache.iotdb.confignode.service.ConfigNode
if NOT DEFINED JAVA_HOME goto :err

@REM -----------------------------------------------------------------------------
@REM JVM Opts we'll use in legacy run or installation
set JAVA_OPTS=-ea^
 -Dlogback.configurationFile="%CONFIGNODE_CONF%\logback-confignode.xml"^
 -DCONFIGNODE_HOME="%CONFIGNODE_HOME%"^
 -DCONFIGNODE_CONF="%CONFIGNODE_CONF%"^
 -Dsun.jnu.encoding=UTF-8^
 -Dfile.encoding=UTF-8

@REM ***** CLASSPATH library setting *****
@REM Ensure that any user defined CLASSPATH variables are not used on startup
if EXIST "%CONFIGNODE_HOME%\lib" (set CLASSPATH="%CONFIGNODE_HOME%\lib\*") else set CLASSPATH="%CONFIGNODE_HOME%\..\lib\*"
set CLASSPATH=%CLASSPATH%;iotdb.ConfigNode
goto okClasspath

:append
set CLASSPATH=%CLASSPATH%;%1

goto :eof

@REM -----------------------------------------------------------------------------
:okClasspath

rem echo CLASSPATH: %CLASSPATH%

@REM SET PARA

@REM Before v0.14, iotdb-server runs in foreground by default
@REM set foreground=0
set foreground=yes

:checkPara
set COMMANSLINE=%*
@REM setlocal ENABLEDELAYEDEXPANSION
:STR_VISTOR
for /f "tokens=1* delims= " %%a in ("%COMMANSLINE%") do (
@REM -----more para-----
for /f "tokens=1* delims==" %%1 in ("%%a") do (
@REM echo 1=%%1 "|||" 2=%%2
if "%%1"=="-v" ( java %JAVA_OPTS% -Dlogback.configurationFile="%CONFIGNODE_CONF%/logback-tool.xml" -cp %CLASSPATH% org.apache.iotdb.db.service.GetVersion & goto finally )
if "%%1"=="-f" ( set foreground=yes)
if "%%1"=="-d" ( set foreground=0)
)
set COMMANSLINE=%%b
goto STR_VISTOR
)

@REM ----------------------------------------------------------------------------
@REM START
:start
if %foreground%==yes (
	java %ILLEGAL_ACCESS_PARAMS% %JAVA_OPTS% %CONFIGNODE_HEAP_OPTS% -cp %CLASSPATH% %CONFIGNODE_JMX_OPTS% %MAIN_CLASS% %CONF_PARAMS%
	) ELSE (
	start javaw %ILLEGAL_ACCESS_PARAMS% %JAVA_OPTS% %CONFIGNODE_HEAP_OPTS% -cp %CLASSPATH% %CONFIGNODE_JMX_OPTS% %MAIN_CLASS% %CONF_PARAMS%
	)
goto finally

:err
echo JAVA_HOME environment variable must be set!
pause

:finally
@ENDLOCAL
pause