Functions/Get-RSCSupportTunnels.ps1

################################################
# Function - Get-RSCSupportTunnels - Getting all Cluster support tunnels
################################################
Function Get-RSCSupportTunnels {

<#
.SYNOPSIS
A Rubrik Security Cloud (RSC) Reporting Module Function returns a list of all support tunnels recently open or in use across all Rubrik clusters.
 
.DESCRIPTION
Makes the required GraphQL API calls to RSC via Invoke-RestMethod to get the data as described, then creates a usable array of the returned information, removing the need for the PowerShell user to understand GraphQL in order to interact with RSC.
 
.LINK
GraphQL schema reference: https://rubrikinc.github.io/rubrik-api-documentation/schema/reference
 
.OUTPUTS
Returns an array of all the available information on the GraphQL endpoint in a uniform and usable format.
 
.EXAMPLE
Get-RSCSupportTunnels
This example returns an array of all the information returned by the GraphQL endpoint for this object type.
 
.NOTES
Author: Joshua Stenhouse
Date: 05/11/2023
#>


################################################
# Importing Module & Running Required Functions
################################################
# Importing the module is it needs other modules
Import-Module RSCReporting
# Checking connectivity, exiting function with error if not connected
Test-RSCConnection
# Getting clusters
$RSCClusters = Get-RSCClusters
################################################
# Querying RSC GraphQL API
################################################
# Creating array
$RSCSupportTunnels = [System.Collections.ArrayList]@()
# For Each Cluster Getting nodes
ForEach($RSCCluster in $RSCClusters)
{
# Setting variable
$RSCClusterID = $RSCCluster.ClusterID
$RSCClusterName = $RSCCluster.Cluster
$RSCClusterLocation = $RSCCluster.Location
$RSCClusterTimeZone = $RSCCluster.Timezone
# Creating URL
$RSCClusterSupportTunnelURL = $RSCURL + "/support_tunnel"
# Building GraphQL query
$RSCGraphQL = @{"operationName" = "ClusterNodesQuery";

"variables" = @{
"first" = 1000
"clusterUuid" = "$RSCClusterID"
};

"query" = "query ClusterNodesQuery(`$clusterUuid: String!) {
  clusterNodes(input: {clusterUuid: `$clusterUuid}) {
    total
    data {
      id
      status
      supportTunnel {
        isTunnelEnabled
        port
        enabledTime
        inactivityTimeoutInSeconds
        errorMessage
        __typename
      }
      __typename
    }
    __typename
  }
}"

}
################################################
# API Call To RSC GraphQL URI
################################################
# Querying API
$RSCResponse = Invoke-RestMethod -Method POST -Uri $RSCGraphqlURL -Body $($RSCGraphQL | ConvertTo-JSON -Depth 20) -Headers $RSCSessionHeader
# Getting node list
$RSCNodeList = $RSCResponse.data.clusterNodes.data
################################################
# Processing nodes
################################################
ForEach($RSCNode in $RSCNodeList)
{
# Setting variables
$RSCNodeID = $RSCNode.ID
$RSCSupportTunnelInfo = $RSCNode.supportTunnel
$RSCSupportTunnelEnabled = $RSCSupportTunnelInfo.isTunnelEnabled
$RSCSupportTunnelPort = $RSCSupportTunnelInfo.port
$RSCSupportTunnelEnabledTimeUNIX = $RSCSupportTunnelInfo.enabledTime
$RSCSupportTunnelInactivitySeconds = $RSCSupportTunnelInfo.inactivityTimeoutInSeconds
$RSCSupportTunnelErrorMessage = $RSCSupportTunnelInfo.errorMessage
# Converting if greater than 60
IF($RSCSupportTunnelInactivitySeconds -gt 59)
{
$RSCSupportTunnelInactivityMinutes = $RSCSupportTunnelInactivitySeconds / 60
$RSCSupportTunnelInactivityMinutes = [Math]::Round($RSCSupportTunnelInactivityMinutes)
}
ELSE
{
$RSCSupportTunnelInactivityMinutes = 0
}
# Converting time
$UTCDateTime = [System.DateTime]::UtcNow
IF($RSCSupportTunnelEnabledTimeUNIX -ne $null){$RSCSupportTunnelEnabledTimeUTC = Convert-RSCUNIXTime $RSCSupportTunnelEnabledTimeUNIX}ELSE{$RSCSupportTunnelEnabledTimeUTC = $null}
IF($RSCSupportTunnelEnabledTimeUTC -ne $null)
{
$RSCSupportTunnelTimespan = New-TimeSpan -Start $RSCSupportTunnelEnabledTimeUTC -End $UTCDateTime
$RSCSupportTunnelDays = $RSCSupportTunnelTimespan | Select-Object -ExpandProperty TotalDays
$RSCSupportTunnelDays = [Math]::Round($RSCSupportTunnelDays)
$RSCSupportTunnelHours = $RSCSupportTunnelTimespan | Select-Object -ExpandProperty TotalHours
$RSCSupportTunnelHours = [Math]::Round($RSCSupportTunnelHours)
$RSCSupportTunnelMinutes = $RSCSupportTunnelTimespan | Select-Object -ExpandProperty TotalMinutes
$RSCSupportTunnelMinutes = [Math]::Round($RSCSupportTunnelMinutes)
}
ELSE
{
$RSCSupportTunnelDays = $null
$RSCSupportTunnelHours = $null
$RSCSupportTunnelMinutes = $null
}
# Adding To Array
$Object = New-Object PSObject
$Object | Add-Member -MemberType NoteProperty -Name "RSCInstance" -Value $RSCInstance
$Object | Add-Member -MemberType NoteProperty -Name "Node" -Value $RSCNodeID
$Object | Add-Member -MemberType NoteProperty -Name "SupportTunnelEnabled" -Value $RSCSupportTunnelEnabled
$Object | Add-Member -MemberType NoteProperty -Name "Port" -Value $RSCSupportTunnelPort
$Object | Add-Member -MemberType NoteProperty -Name "EnabledTimeUTC" -Value $RSCSupportTunnelEnabledTimeUTC
$Object | Add-Member -MemberType NoteProperty -Name "TotalDaysOpen" -Value $RSCSupportTunnelDays
$Object | Add-Member -MemberType NoteProperty -Name "TotalHoursOpen" -Value $RSCSupportTunnelHours
$Object | Add-Member -MemberType NoteProperty -Name "TotalMinutesOpen" -Value $RSCSupportTunnelMinutes
$Object | Add-Member -MemberType NoteProperty -Name "TotalInactivityMinutes" -Value $RSCSupportTunnelInactivitySeconds
$Object | Add-Member -MemberType NoteProperty -Name "TotalInactivitySeconds" -Value $RSCSupportTunnelInactivityMinutes
$Object | Add-Member -MemberType NoteProperty -Name "ErrorMessage" -Value $RSCSupportTunnelErrorMessage
$Object | Add-Member -MemberType NoteProperty -Name "RubrikCluster" -Value $RSCClusterName
$Object | Add-Member -MemberType NoteProperty -Name "RubrikClusterID" -Value $RSCClusterID
$Object | Add-Member -MemberType NoteProperty -Name "Location" -Value $RSCClusterLocation
$Object | Add-Member -MemberType NoteProperty -Name "Timezone" -Value $RSCClusterTimeZone
$Object | Add-Member -MemberType NoteProperty -Name "URL" -Value $RSCClusterSupportTunnelURL
# Adding
$RSCSupportTunnels.Add($Object) | Out-Null
# End of for each node below
}
# End of for each node above
#
# End of for each cluster below
}
# End of for each cluster above

# Removing nodes with no tunnel
$RSCSupportTunnels = $RSCSupportTunnels | Where-Object {$_.SupportTunnelEnabled -ne $FALSE}

# Returning array
Return $RSCSupportTunnels
# End of function
}