Public/Invoke-LMCollectorDebugCommand.ps1
<# .SYNOPSIS Invokes a debug command on a LogicMonitor collector. .DESCRIPTION The Invoke-LMCollectorDebugCommand function is used to send a debug command to a LogicMonitor collector. It supports different parameter sets based on the type of command and the identification method used (ID or name). The function checks if the user is logged in and has valid API credentials before executing the command. .PARAMETER Id Specifies the ID of the collector. This parameter is mandatory for the 'Id-Debug', 'Id-Posh', and 'Id-Groovy' parameter sets. .PARAMETER Name Specifies the name of the collector. This parameter is mandatory for the 'Name-Debug', 'Name-Posh', and 'Name-Groovy' parameter sets. .PARAMETER DebugCommand Specifies the debug command to be executed. This parameter is mandatory for the 'Id-Debug' and 'Name-Debug' parameter sets. .PARAMETER PoshCommand Specifies the PowerShell command to be executed. This parameter is mandatory for the 'Id-Posh' and 'Name-Posh' parameter sets. .PARAMETER GroovyCommand Specifies the Groovy command to be executed. This parameter is mandatory for the 'Id-Groovy' and 'Name-Groovy' parameter sets. .PARAMETER CommandHostName Specifies the host name for the command. This parameter is optional. .PARAMETER CommandWildValue Specifies the wild value for the command. This parameter is optional. .PARAMETER IncludeResult Indicates whether to include the result of the debug command. This parameter is a switch parameter. .EXAMPLE Invoke-LMCollectorDebugCommand -Id 1234 -DebugCommand "!account" -IncludeResult Invokes a debug command on the collector with ID 1234 and includes the result. .EXAMPLE Invoke-LMCollectorDebugCommand -Name "CollectorName" -PoshCommand "Write-Host 'Hello, World!'" -IncludeResult Invokes a PowerShell command on the collector with the name "CollectorName" and includes the result. .EXAMPLE Invoke-LMCollectorDebugCommand -Id 5678 -GroovyCommand "println 'Hello, World!'" -CommandHostName "Host123" Invokes a Groovy command on the collector with ID 5678 and specifies the host name as "Host123". .NOTES LogicMonitor API credentials must be set before running this command. Use the Connect-LMAccount cmdlet to log in and set the credentials. #> Function Invoke-LMCollectorDebugCommand { [CmdletBinding()] Param ( [Parameter(Mandatory, ParameterSetName = 'Id-Debug')] [Parameter(Mandatory, ParameterSetName = 'Id-Posh')] [Parameter(Mandatory, ParameterSetName = 'Id-Groovy')] [Int]$Id, [Parameter(Mandatory, ParameterSetName = 'Name-Debug')] [Parameter(Mandatory, ParameterSetName = 'Name-Posh')] [Parameter(Mandatory, ParameterSetName = 'Name-Groovy')] [String]$Name, [Parameter(Mandatory, ParameterSetName = 'Id-Debug')] [Parameter(Mandatory, ParameterSetName = 'Name-Debug')] [String]$DebugCommand, [Parameter(Mandatory, ParameterSetName = 'Id-Posh')] [Parameter(Mandatory, ParameterSetName = 'Name-Posh')] [String]$PoshCommand, [Parameter(Mandatory, ParameterSetName = 'Id-Groovy')] [Parameter(Mandatory, ParameterSetName = 'Name-Groovy')] [String]$GroovyCommand, [String]$CommandHostName, [String]$CommandWildValue, [Switch]$IncludeResult ) #Check if we are logged in and have valid api creds Begin {} Process { If ($Script:LMAuth.Valid) { #Cannot indent or it breaks here-string format $DefaultGroovy = @" !groovy import com.santaba.agent.collector3.CollectorDb; def hostProps = [:]; def instanceProps = [:]; Try { hostProps = CollectorDb.getInstance().getHost("$CommandHostName").getProperties(); instanceProps["wildvalue"] = "$CommandWildValue"; } catch(Exception e) { }; $GroovyCommand "@ #Cannot indent or it breaks here-string format $DefaultPosh = @" !posh $PoshCommand "@ #Lookup device name If ($Name) { $LookupResult = (Get-LMCollector -Name $Name).Id If (Test-LookupResult -Result $LookupResult -LookupString $Name) { return } $Id = $LookupResult } #Build header and uri $ResourcePath = "/debug" #Build query params $QueryParams = "?collectorId=$Id" #Construct Body Switch -Wildcard ($PSCmdlet.ParameterSetName) { "*Debug" { $Data = @{ cmdline = $DebugCommand } } "*Posh" { $Data = @{ cmdline = $DefaultPosh } } "*Groovy" { $Data = @{ cmdline = $DefaultGroovy } } } $Data = ($Data | ConvertTo-Json) Try { $Headers = New-LMHeader -Auth $Script:LMAuth -Method "POST" -ResourcePath $ResourcePath -Data $Data $Uri = "https://$($Script:LMAuth.Portal).logicmonitor.com/santaba/rest" + $ResourcePath + $QueryParams Resolve-LMDebugInfo -Url $Uri -Headers $Headers[0] -Command $MyInvocation -Payload $Data #Issue request $Response = Invoke-RestMethod -Uri $Uri -Method "POST" -Headers $Headers[0] -WebSession $Headers[1] -Body $Data If ($IncludeResult) { $CommandCompleted = $false While (!$CommandCompleted) { $CommandResult = Get-LMCollectorDebugResult -SessionId $Response.sessionId -Id $Id If ($CommandResult.errorMessage -eq "Agent has fetched the task, waiting for response") { Write-LMHost "[INFO]: Agent has fetched the task, waiting for response..." -ForegroundColor green Start-Sleep -Seconds 5 } Else { $CommandCompleted = $false Return $CommandResult } } } Else { $Result = [PSCustomObject]@{ SessionId = $Response.sessionId CollectorId = $Id Message = "Submitted debug command task under session id $($Response.sessionId) for collector id: $($Id). Use Get-LMCollectorDebugResult to retrieve response or resubmit request with -IncludeResult" } Return $Result } } Catch [Exception] { $Proceed = Resolve-LMException -LMException $PSItem If (!$Proceed) { Return } } Return } Else { Write-Error "Please ensure you are logged in before running any commands, use Connect-LMAccount to login and try again." } } End {} } |