Functions/Show-PRTGTemplateSummaryFromObjectTAG.ps1
function Show-PRTGTemplateSummaryFromObjectTAG { <# .Synopsis Show-PRTGTemplateRoles .DESCRIPTION Display a list of template roles found under in groups and devices under a prtg structure .NOTES Author: Andreas Bellstedt .LINK https://github.com/AndiBellstedt/PoShPRTG .EXAMPLE Show-PRTGTemplateSummaryFromObjectTAG Display list of tags witch began with "Template_" and can be found under PRTG Core Server object. This is the default set of parameters. .EXAMPLE Show-PRTGTemplateSummaryFromObjectTAG -TemplateBaseID 100 Displaya list of tags witch began with "Template_" and are based under the group or device with the object ID 100. .EXAMPLE Show-PRTGTemplateSummaryFromObjectTAG -TemplateBaseID 100 -TemplateTAGNameIdentifier "MyPersonalTemplate-" Displaya list of tags witch began with "MyPersonalTemplate-" and are based under the group or device with the object ID 100. .EXAMPLE Show-PRTGTemplateSummaryFromObjectTAG -TemplateBaseID (Get-PRTGProbe -Name "MyTemplateProbe").ObjID #> [CmdletBinding(DefaultParameterSetName='Default', SupportsShouldProcess=$false, ConfirmImpact='Low')] Param( # ID of the object to copy [Parameter(Mandatory=$false, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true, Position=0)] [ValidateNotNullOrEmpty()] [ValidateScript({$_ -gt 0})] [Alias('objID', 'ID', 'ObjectId')] [int]$TemplateBaseID = 1, [Parameter(Mandatory=$false)] [ValidateNotNullOrEmpty()] [ValidateScript({$_ -notcontains ("*","?")})] [string]$TemplateTAGNameIdentifier = "Template_", [Parameter(Mandatory=$false)] [switch]$IncludeNonMatching, # SensorTree from PRTG Server [Parameter(Mandatory=$false)] [ValidateNotNullOrEmpty()] [xml]$SensorTree = $global:PRTGSensorTree ) $Local:logscope = $MyInvocation.MyCommand.Name #Build Template Role object for comparing against devices $TemplateRoleDevices = Get-PRTGObject -ObjectID $TemplateBaseID -Recursive -Type group, device -SensorTree $SensorTree | Where-Object tags -Match ([regex]::Escape($TemplateTAGNameIdentifier)) $TemplateRoleDevicesTypeGroup = $TemplateRoleDevices | Group-Object type -NoElement | Select-Object Count, Name, @{N="Text";E={ "$($_.count) $($_.Name.tolower())$(if($_.count -ne 1){"s"})"}} #Start to create new object if($TemplateRoleDevices.tags) { [array]$TemplateRoles = $TemplateRoleDevices.tags.split(' ') | Where-Object { $_ -Match ([regex]::Escape($TemplateTAGNameIdentifier)) } | Sort-Object -Unique | ForEach-Object { New-Object -TypeName psobject -Property @{"RoleName" = $_ } } Write-Log -LogText "Found $($TemplateRoles.count) role$(if($TemplateRole.count -ne 1){"s"}) from $([string]::Join("and ",$TemplateRoleDevicesTypeGroup.Text)) in templatebase object ID $TemplateBaseID" -LogType Info -LogScope $Local:logscope -NoFileStatus -DebugOutput } else { Write-Log -LogText "No template roles found in object ID $TemplateBaseID" -LogType Warning -LogScope $Local:logscope -NoFileStatus -DebugOutput return } foreach($TemplateRole in $TemplateRoles) { Write-Log -LogText "Building object for ""$($TemplateRole.RoleName)"" from $([string]::Join("and ",$TemplateRoleDevicesTypeGroup.Text)) under templatebase object ID $TemplateBaseID" -LogType Set -LogScope $Local:logscope -NoFileStatus -DebugOutput [array]$device = $TemplateRoleDevices | Where-Object {$_.tags.split(' ') -eq $TemplateRole.RoleName} Add-Member -InputObject $TemplateRole -MemberType NoteProperty -Force -Name DeviceCount -Value ([array]($device | Where-Object objId -ne $TemplateBaseID)).count Add-Member -InputObject $TemplateRole -MemberType NoteProperty -Force -Name Device -Value ([array]($device | Where-Object objId -ne $TemplateBaseID)) if($device.sensor) { [array]$sensor = $device.sensor | Where-Object {$_.tags.split(' ') -eq $TemplateRole.RoleName} Add-Member -InputObject $TemplateRole -MemberType NoteProperty -Force -Name SensorCount -Value $sensor.count Add-Member -InputObject $TemplateRole -MemberType NoteProperty -Force -Name Sensor -Value ([array](Set-TypesNamesToPRTGObject -PRTGObject $sensor)) } else { Add-Member -InputObject $TemplateRole -MemberType NoteProperty -Force -Name SensorCount -Value 0 Add-Member -InputObject $TemplateRole -MemberType NoteProperty -Force -Name Sensor -Value $null } Remove-Variable device, sensor -Force -ErrorAction Ignore -WhatIf:$false -Confirm:$false -Verbose:$false -Debug:$false } if($IncludeNonMatching) { Write-Log -LogText "Searching for objects not matching TAG-identifier ""$($TemplateTAGNameIdentifier)"" in $([string]::Join("and ",$TemplateRoleDevicesTypeGroup.Text)) under templatebase object ID $TemplateBaseID" -LogType Query -LogScope $Local:logscope -NoFileStatus -DebugOutput [array]$device = $TemplateRoleDevices | Where-Object {$_.tags -notmatch ([regex]::Escape($TemplateTAGNameIdentifier))} [array]$sensor = $TemplateRoleDevices.sensor | Where-Object {$_.tags -notmatch ([regex]::Escape($TemplateTAGNameIdentifier))} if( ($device | Where-Object objId -ne $TemplateBaseID) -or ($sensor) ) { Write-Log -LogText "found non matching objects. Inserting an empty RoleName object." -LogType Set -LogScope $Local:logscope -NoFileStatus -DebugOutput $TemplateRoles += New-Object -TypeName psobject -Property @{ "RoleName" = "" "DeviceCount" = if($device | Where-Object objId -ne $TemplateBaseID) { ([array]($device | Where-Object objId -ne $TemplateBaseID)).count } else { 0 } "Device" = if($device | Where-Object objId -ne $TemplateBaseID) { ([array]($device | Where-Object objId -ne $TemplateBaseID)) } else { $null } "SensorCount" = if($sensor) { $sensor.Count } else { 0 } "Sensor" = if($sensor) { [array]([array](Set-TypesNamesToPRTGObject -PRTGObject $sensor)) } else { $null } } } Remove-Variable device, sensor -Force -ErrorAction Ignore -WhatIf:$false -Confirm:$false -Verbose:$false -Debug:$false } Write-Output $TemplateRoles } |