Public/Watch-P1Commands.ps1

function Watch-P1Commands {
    <#
    .Synopsis
    Watch the commands on PlannerOne server.

    .Description
    Display for one environment loaded in PlannerOne the current command, queued commands and executed commands.

    .Parameter Tenant
    The tenant to use to retrieve connection informations.

    .Parameter HostName
    The hostname to query (default localhost)

    .Parameter ServicePort
    The hostname port of REST Service (default 80)

    .Parameter Product
    The product to query (PS or RP - Default PS)

    .Parameter NameFilter
    Filter for the environment name.

    .Example
    Watch-P1ServerModel -ServicePort 8073
    #>


    [cmdletbinding()]
    param(
        [string] $Tenant,
        [string] $HostName,
        [int] $ServicePort,
        [string] $Product,
        [string] $NameFilter
    )
    Process
    {
        if ($Tenant -ne "") {
            $info = Get-TenantInfo $Tenant
            if ($info -eq $null) {
                Write-Warning "No information registered for tenant $Tenant"
                return
            }

            $HostName = $info.ServiceHost
            $ServicePort = $info.WebServicePort
        } else {
            $Tenant = "NA"
        }

        if ($HostName -eq "") {
            $HostName = "localhost"
        }

        if ($ServicePort -eq 0) {
            $ServicePort = 80
        }

        [string] $message = ""
        $state = 0
        $auto = $true
        $continue = $true
        while($continue)
        {
            clear
            echo "Tenant: $Tenant - Host: $HostName - Port: $ServicePort"
            Get-Date
            if ($state -eq 0) {
                if ($Product -ne "RP") {
                    $Product = "PS"
                    $service = "commandproduction"
                }
                else {
                    $service = "commandproject"
                }

                $escapedService = EscapeQueryData $service
                $url = 'http://' + $HostName + ':' + $ServicePort + "/Services/$escapedService/"
                $serviceUrl = FixUrl $url
                Write-Verbose $serviceUrl

                echo "Product: $Product - Filter: $NameFilter"
                if ($message -ne "") {
                    echo $message
                    $message = ""
                }

                $ids = (wget $serviceUrl).Content
                Write-Verbose $ids
                $idsObj = $ids | ConvertFrom-Json

                $filteredArray = @()
                $displayArray = @()
                if ($idsObj.Length -eq 0) {
                    Write-Output "NO COMMAND EXECUTER FOR $Product"
                } else {
                    [int] $i = 1
                    foreach ($env in $idsObj) {
                        $envName = $env.Name
                        $peak = $true
                        if ($NameFilter -ne "") {
                            if (!($envName.Contains($NameFilter))) {
                                $peak = $false
                            }
                        }

                        if ($peak) {
                            $displayObj = New-Object System.Object
                            $displayObj | Add-Member -type NoteProperty -name No -value $i
                            $displayObj | Add-Member -type NoteProperty -name Name -value $envName
                            $displayObj | Add-Member -type NoteProperty -name Group -value $env.PlanningGroupContainer

                            $displayArray += $displayObj
                            $filteredArray += $env
                        }

                        $i++
                    }

                    $displayArray | Format-Table
                }

                echo "ESCAPE: Quit | R: Refresh | 1-9: Select environment | S: PS/RP switch"

                $x = [System.Console]::ReadKey()
                [int] $select = -1
                switch ($x.key)
                {
                    # http://msdn.microsoft.com/en-us/library/system.consolekey(v=vs.110).aspx
                    Escape { $continue = $false }
                    R {}
                    S {
                        if ($Product -eq "PS") {
                            $Product = "RP"
                        } else {
                            $Product = "PS"
                        }
                    }
                    D1 {
                        $select = 0
                    }
                    D2 {
                        $select = 1
                    }
                    D3 {
                        $select = 2
                    }
                    D4 {
                        $select = 3
                    }
                    D5 {
                        $select = 4
                    }
                    D6 {
                        $select = 5
                    }
                    D7 {
                        $select = 6
                    }
                    D8 {
                        $select = 7
                    }
                    D9 {
                        $select = 8
                    }
                    NumPad1 {
                        $select = 0
                    }
                    NumPad2 {
                        $select = 1
                    }
                    NumPad3 {
                        $select = 2
                    }
                    NumPad4 {
                        $select = 3
                    }
                    NumPad5 {
                        $select = 4
                    }
                    NumPad6 {
                        $select = 5
                    }
                    NumPad7 {
                        $select = 6
                    }
                    NumPad8 {
                        $select = 7
                    }
                    NumPad9 {
                        $select = 8
                    }
                }

                if ($select -ne -1) {
                    if ($select -gt $filteredArray.Length) {
                        $message = "Selected environment does not exist"
                    } else {
                        $selectedEnv = $filteredArray[$select]
                        $state = 1
                        clear
                    }
                }
            } else {
                if ($state -eq 1 -and $continue) {
                    $escapedService = EscapeQueryData $service
                    $escapedName = EscapeQueryData $selectedEnv.Name
                    $escapedGroup = EscapeQueryData $selectedEnv.PlanningGroupContainer

                    $url = 'http://' + $HostName + ':' + $ServicePort + "/Services/" + $escapedService + "/" + $escapedName + '/' + $escapedGroup
                    $serviceUrl = FixUrl $url
                    Write-Verbose $serviceUrl

                    $headLine = "Product: $Product - Environment: " + $selectedEnv.Name + " - " + $selectedEnv.PlanningGroupContainer
                    echo $headLine
                    $commands = (wget $serviceUrl).Content
                    Write-Verbose $commands
                    $commandsObj = $commands | ConvertFrom-Json
                    $commandsObj | Format-Table

                    echo "ESCAPE: Quit | R: Refresh | L: Got back to list | A: Auto-Refresh (5s): $auto"

                    $counter = 0
                    if ($auto) {
                        while(![console]::KeyAvailable -and ($counter++ -lt 10))
                        {
                            [Threading.Thread]::Sleep( 500 )
                        }
                    }

                    if ([console]::KeyAvailable -or !$auto)
                    {
                        $x = [System.Console]::ReadKey()

                        switch ($x.key)
                        {
                            # http://msdn.microsoft.com/en-us/library/system.consolekey(v=vs.110).aspx
                            Escape { $continue = $false }
                            R {}
                            L {
                                $selectedEnv = $null
                                $state = 0
                            }
                            A { $auto = !$auto }
                        }
                    }
                }
            }
        }

        Write-Output "Watch end"
        # Write-Host must be call for ReadKey to not corrupt the console
        Write-Host
    }
}