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 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] $HostName,
        [int] $ServicePort,
        [string] $Product,
        [string] $NameFilter
    )
    Process
    {
        if ($HostName -eq "") {
            $HostName = "localhost"
        }

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

        [string] $message = ""
        $state = 0
        $auto = $true
        $continue = $true
        while($continue)
        {
            clear
            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
                        }
                    }

                    $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 $filterArray.Length) {
                        $message = "Selected environment does not exist"
                    } else {
                        $selectedEnv = $filteredArray[$select]
                        $state = 1
                    }
                }
            } 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"
    }
}