#
# 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.
#-----------------------------------------------------------------------------
Function PrintUsage
{
    echo @"
usage: cassandra.ps1 [-f] [-h] [-q] [-a] [-p pidfile] [-H dumpfile] [-D arg] [-E errorfile] [-install | -uninstall] [-help]
    -f              Run cassandra in foreground
    -install        install cassandra as a service
    -uninstall      remove cassandra service
    -p              pidfile tracked by server and removed on close (defaults to pid.txt)
    -H              change JVM HeapDumpPath
    -D              items to append to JVM_OPTS
    -E              change JVM ErrorFile
    -v              Print cassandra version and exit
    -s              Show detailed jvm environment information during launch
    -a              Aggressive startup. Skip VerifyPorts check. For use in dev environments.
    -q              Quiet output. Does not print stdout/stderr to console (when run without -f)
    -help           print this message

    NOTE: installing cassandra as a service requires Commons Daemon Service Runner
        available at http://commons.apache.org/proper/commons-daemon/"
"@
    exit
}

#-----------------------------------------------------------------------------
Function Main
{
    ValidateArguments

    # support direct run of .ps1 file w/out batch file
    if ($env:CASSANDRA_HOME -eq $null)
    {
        $scriptDir = Split-Path $script:MyInvocation.MyCommand.Path
        $env:CASSANDRA_HOME = (Get-Item $scriptDir).parent.FullName
    }
    . "$env:CASSANDRA_HOME\bin\source-conf.ps1"

    $conf = Find-Conf
    if ($s)
    {
        echo "Sourcing cassandra config file: $conf"
    }
    . $conf

    SetCassandraEnvironment
    if ($v)
    {
        PrintVersion
        exit
    }
    $pidfile = "$env:CASSANDRA_HOME\$pidfile"

    # Other command line params
    if ($H)
    {
        $env:JVM_OPTS = $env:JVM_OPTS + " -XX:HeapDumpPath=$H"
    }
    if ($E)
    {
        $env:JVM_OPTS = $env:JVM_OPTS + " -XX:ErrorFile=$E"
    }
    if ($p)
    {
        $pidfile = "$p"
        $env:CASSANDRA_PARAMS = $env:CASSANDRA_PARAMS + ' -Dcassandra-pidfile="' + "$pidfile" + '"'
    }

    # Parse -D and -X JVM_OPTS
    for ($i = 0; $i -lt $script:args.Length; ++$i)
    {
        if ($script:args[$i].StartsWith("-D") -Or $script:args[$i].StartsWith("-X"))
        {
            $env:JVM_OPTS = "$env:JVM_OPTS " + $script:args[$i]
        }
    }

    if ($install -or $uninstall)
    {
        HandleInstallation
    }
    else
    {
        VerifyPortsAreAvailable
        RunCassandra($f)
    }
}

#-----------------------------------------------------------------------------
Function HandleInstallation
{
    $SERVICE_JVM = """cassandra"""
    $PATH_PRUNSRV = "$env:CASSANDRA_HOME\bin\daemon"
    $PR_LOGPATH = $serverPath

    if (-Not (Test-Path $PATH_PRUNSRV\prunsrv.exe))
    {
        Write-Warning "Cannot find $PATH_PRUNSRV\prunsrv.exe.  Please download package from https://downloads.apache.org/commons/daemon/binaries/windows/ to install as a service."
        Break
    }

    If (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
    {
        Write-Warning "Cannot perform installation without admin credentials.  Please re-run as administrator."
        Break
    }
    if (!$env:PRUNSRV)
    {
        $env:PRUNSRV="$PATH_PRUNSRV\prunsrv"
    }

    $regPath = "HKLM:\SYSTEM\CurrentControlSet\services\Tcpip\Parameters\"

    echo "Attempting to delete existing $SERVICE_JVM service..."
    Start-Sleep -s 2
    $proc = Start-Process -FilePath "$env:PRUNSRV" -ArgumentList "//DS//$SERVICE_JVM" -PassThru -WindowStyle Hidden

    echo "Reverting to default TCP keepalive settings (2 hour timeout)"
    Remove-ItemProperty -Path $regPath -Name KeepAliveTime -EA SilentlyContinue

    # Quit out if this is uninstall only
    if ($uninstall)
    {
        return
    }

    echo "Installing [$SERVICE_JVM]."
    Start-Sleep -s 2
    $proc = Start-Process -FilePath "$env:PRUNSRV" -ArgumentList "//IS//$SERVICE_JVM" -PassThru -WindowStyle Hidden

    echo "Setting launch parameters for [$SERVICE_JVM]"
    Start-Sleep -s 2

    $args = @"
//US//$SERVICE_JVM
 --Jvm=auto --StdOutput auto --StdError auto
 --Classpath=$env:CLASSPATH
 --StartMode=jvm --StartClass=$env:CASSANDRA_MAIN --StartMethod=main
 --StopMode=jvm --StopClass=$env:CASSANDRA_MAIN  --StopMethod=stop
 --PidFile "$pidfile"
"@

    # Include cassandra params
    $prunArgs = "$env:CASSANDRA_PARAMS $env:JVM_OPTS"

    # Change to semicolon delim as we can't split on space due to potential spaces in directory names
    $prunArgs = $prunArgs -replace " -", ";-"

    # JvmOptions w/multiple semicolon delimited items isn't working correctly.  storagedir and logdir were
    # both being ignored / failing to parse on startup.  See CASSANDRA-8115
    $split_opts = $prunArgs.Split(";")
    foreach ($arg in $split_opts)
    {
        $args += " ++JvmOptions=$arg"
    }

    $args = $args -replace [Environment]::NewLine, ""
    $proc = Start-Process -FilePath "$env:PRUNSRV" -ArgumentList $args -PassThru -WindowStyle Hidden

    echo "Setting KeepAliveTimer to 5 minutes for TCP keepalive"
    Set-ItemProperty -Path $regPath -Name KeepAliveTime -Value 300000

    echo "Installation of [$SERVICE_JVM] is complete"
}

#-----------------------------------------------------------------------------
Function PrintVersion()
{
    Write-Host "Cassandra Version: " -NoNewLine
    $pinfo = New-Object System.Diagnostics.ProcessStartInfo
    $pinfo.FileName = "$env:JAVA_BIN"
    $pinfo.UseShellExecute = $false
    $pinfo.Arguments = "-Dlogback.configurationFile=logback-tools.xml -cp $env:CLASSPATH org.apache.cassandra.tools.GetVersion"
    $p = New-Object System.Diagnostics.Process
    $p.StartInfo = $pinfo
    $p.Start() | Out-Null
    $p.WaitForExit()
}

#-----------------------------------------------------------------------------
Function RunCassandra([string]$foreground)
{
    $cmd = @"
$env:JAVA_BIN
"@
    $arg1 = $env:CASSANDRA_PARAMS
    $arg2 = $env:JVM_OPTS
    $arg3 = "-cp $env:CLASSPATH"
    $arg4 = @"
"$env:CASSANDRA_MAIN"
"@

    $proc = $null

    if ($s)
    {
        echo "Running cassandra with: [$cmd $arg1 $arg2 $arg3 $arg4]"
    }

    if ($foreground)
    {
        $cygwin = $false
        try
        {
            $uname = uname -o
            if ($uname.CompareTo("Cygwin") -eq 0)
            {
                $cygwin = $true
            }
        }
        catch
        {
            # Failed at uname call, not in cygwin
        }

        if ($cygwin)
        {
            # if running on cygwin, we cannot capture ctrl+c signals as mintty traps them and then
            # SIGKILLs processes, so we'll need to record our $pidfile file for future
            # stop-server usage
            if (!$p)
            {
                echo "Detected cygwin runtime environment.  Adding -Dcassandra-pidfile=$pidfile to JVM params as control+c trapping on mintty is inconsistent"
                $arg2 = $arg2 + " -Dcassandra-pidfile=$pidfile"
            }
        }

        $arg2 = $arg2 + " -Dcassandra-foreground=yes"

        $pinfo = New-Object System.Diagnostics.ProcessStartInfo
        $pinfo.FileName = "$env:JAVA_BIN"
        $pinfo.RedirectStandardInput = $true
        $pinfo.UseShellExecute = $false
        $pinfo.Arguments = $arg1,$arg2,$arg3,$arg4
        $p = New-Object System.Diagnostics.Process
        $p.StartInfo = $pinfo
        $p.Start() | Out-Null
        echo $p.Id > $pidfile
        $p.WaitForExit()
    }
    else
    {
        if ($q)
        {
            $proc = Start-Process -FilePath "$cmd" -ArgumentList $arg1,$arg2,$arg3,$arg4 -PassThru -WindowStyle Hidden
        }
        else
        {
            $proc = Start-Process -FilePath "$cmd" -ArgumentList $arg1,$arg2,$arg3,$arg4 -PassThru -NoNewWindow
        }

        $exitCode = $?

        try
        {
            echo $proc.Id > $pidfile
        }
        catch
        {
            echo @"
WARNING! Failed to write pidfile to $pidfile.  stop-server.bat and
    startup protection will not be available.
"@
            echo $_.Exception.Message
            exit 1
        }

        if (-Not $exitCode)
        {
            exit 1
        }
    }
}

#-----------------------------------------------------------------------------
Function VerifyPortsAreAvailable
{
    if ($a)
    {
        return
    }
    # Need to confirm 5 different ports are available or die if any are currently bound
    # From cassandra.yaml:
    #   storage_port
    #   ssl_storage_port
    #   native_transport_port
    #   rpc_port, which we'll match to rpc_address
    # and from env: JMX_PORT which we cache in our environment during SetCassandraEnvironment for this check
    $yamlRegex = "storage_port:|ssl_storage_port:|native_transport_port:|rpc_port"
    $yaml = Get-Content "$env:CASSANDRA_CONF\cassandra.yaml"
    $portRegex = ":$env:JMX_PORT |"

    foreach ($line in $yaml)
    {
        if ($line -match $yamlRegex)
        {
            $sa = $line.Split(":")
            $portRegex = $portRegex + ":" + ($sa[1] -replace " ","") + " |"
        }
    }
    $portRegex = $portRegex.Substring(0, $portRegex.Length - 2)

    $netstat = netstat -an

    foreach ($line in $netstat)
    {
        if ($line -match "TCP" -and $line -match $portRegex)
        {
            Write-Error "Found a port already in use. Aborting startup"
            Write-Error $line
            Exit
        }
    }
}

#-----------------------------------------------------------------------------
Function ValidateArguments
{
    if ($install -and $uninstall)
    {
        echo "Cannot install and uninstall"
        exit
    }
    if ($help)
    {
        PrintUsage
    }
}

#-----------------------------------------------------------------------------
Function CheckEmptyParam($param)
{
    if ([String]::IsNullOrEmpty($param))
    {
        echo "Invalid parameter: empty value"
        PrintUsage
    }
}

#-----------------------------------------------------------------------------
# Populate arguments
for ($i = 0; $i -lt $args.count; $i++)
{
    # Skip JVM args
    if ($args[$i].StartsWith("-D") -Or $args[$i].StartsWith("-X"))
    {
        continue;
    }
    Switch($args[$i])
    {
        "-install"          { $install = $True }
        "-uninstall"        { $uninstall = $True }
        "-help"             { PrintUsage }
        "-?"                { PrintUsage }
        "--help"            { PrintUsage }
        "-v"                { $v = $True }
        "-f"                { $f = $True }
        "-s"                { $s = $True }
        "-p"                { $p = $args[++$i]; CheckEmptyParam($p) }
        "-H"                { $H = $args[++$i]; CheckEmptyParam($H) }
        "-E"                { $E = $args[++$i]; CheckEmptyParam($E) }
        "-a"                { $a = $True }
        "-q"                { $q = $True }
        default
        {
            "Invalid argument: " + $args[$i];
            if (-Not $args[$i].startsWith("-"))
            {
                echo "Note: All options require -"
            }
            exit
        }
    }
}
$pidfile = "pid.txt"

Main
