Functions/Send/Send-RSCReport.ps1

################################################
# Function - Send-RSCReport - Sending RSC Report Email with the Specified CSV
################################################
Function Send-RSCReport {

<#
.SYNOPSIS
Creates and emails HTML reports based on custom array data that you pass into the function as a parameter, allowing you to create email reports on anything you want from the RSC APIs!
 
.DESCRIPTION
Specify an array of information to report on, it then creates a HTML report based on the columns in the $Array provided and sends it to the local SMTP server with the email settings params.
 
.LINK
GraphQL schema reference: https://rubrikinc.github.io/rubrik-api-documentation/schema/reference
 
.PARAMETER Array
An array of data to report on. I.E $Array = Get-RSCUsers | Select Username,LastLoginUTC,TOTPEnabled,TOTPEnforced,HasDefaultAdminRole
.PARAMETER ReportName
The name of the report you are creating. I.E "RSC User List"
.PARAMETER EmailTo
The email address to send the report to.
.PARAMETER EmailFrom
The email address the report will be sent from.
.PARAMETER SMTPServer
Your local SMTP server which will accept a relay request from the server you are running this script on (does not send via RSC itself)
.PARAMETER SortByColumnName
The name of a single column heading in the array to sort by. I.E Username
.PARAMETER ColumnOrder
A comma seperated list of all the columns in the array in the order you want them (has to be all), otherwise it will be random. I.E "Username,LastLoginUTC,TOTPEnabled,TOTPEnforced,HasDefaultAdminRole"
.PARAMETER SSLRequired
Switch if you require SSL to send the email via SMTP locally.
 
.OUTPUTS
Logs it's actions and the result of sending the email.
 
.EXAMPLE
$Array = Get-RSCUsers | Select Username,LastLoginUTC,TOTPEnabled,TOTPEnforced,HasDefaultAdminRole
Building an array of data to report on.
 
.EXAMPLE
$Array = Send-RSCReport -Array $Array -ReportName "RSCUserList" -EmailTo "admin@lab.local" -EmailFrom "reporting@lab.local" -SMTPServer "localhost" -SortByColumnName "Username" -ColumnOrder "Username,LastLoginUTC,TOTPEnabled,TOTPEnforced,HasDefaultAdminRole"
Creates a HTML report based on a list of user information, emails it via local SMTP, and preserves the desired column order sorted by username.
 
.NOTES
Author: Joshua Stenhouse
Date: 05/11/2023
#>

################################################
# Paramater Config
################################################
[CmdletBinding(DefaultParameterSetName = "List")]
Param([Parameter(Mandatory=$true)]
      $Array,$ReportName,$EmailTo,$EmailFrom,$SMTPServer,$SortByColumnName,$ColumnOrder,[switch]$SSLRequired,[switch]$SortDescending
  )
# Note: you can only sort by 1 column, but column order can be many I.E "VM,VMID"

################################################
# Importing Module & Running Required Functions
################################################
Import-Module RSCReporting
# Getting templates
$RSCTemplates = Get-RSCReportTemplates
# Getting file path of required template
$RSCTemplatePath = $RSCTemplates | Where-Object {$_.Report -match "00-RSCReport"} | Select-Object -ExpandProperty FilePath
# Importing template
$HTMLCode = Import-RSCReportTemplate $RSCTemplatePath
# Getting the machine time
$SystemDateTime = Get-Date
# Converting column order if needed
IF($ColumnOrder -ne $null)
{
IF($ColumnOrder -match ",")
{
$ColumnOrderArray = $ColumnOrder.Split(",")
}
ELSE
{
$ColumnOrderArray = $ColumnOrder
}
}
# Logging
Write-Host "----------------------------
CreatingReport: $ReportName
----------------------------
Building HTML.."

Start-Sleep 2
##################################
# Setting file names required
##################################
IF ($IsLinux -eq $TRUE)
{
$CSVExportDir = $RSCScriptDirectory + "CSVExports/" + $ReportName + "/"
}
ELSE
{
$CSVExportDir = $RSCScriptDirectory + "CSVExports\" + $ReportName + "\"
}
##################################
# Creating export directories if not exists
##################################
$CSVExportDirTest = Test-Path $CSVExportDir
IF ($CSVExportDirTest -eq $False)
{
New-Item -Path $CSVExportDir -ItemType "directory" | Out-Null
}
##################################
# Removing nulls from the array, otherwise it breaks the CSV export
##################################
$Array = $Array | Where-Object {$_ -ne $null}
##################################
# Creating CSVs
##################################
# Creating the file names
$ObjectCSVFile = $CSVExportDir + $ReportName + "-" + $SystemDateTime.ToString("yyyy-MM-dd") + "@" + $SystemDateTime.ToString("HH-mm-ss") + ".csv"
# Exporting to CSV
$Array | Export-Csv -Path $ObjectCSVFile -NoTypeInformation -Force
# Creating email attachement
$Attachments = "$ObjectCSVFile"
# Getting csv info
$FileName = Get-ChildItem $ObjectCSVFile | Select-Object -ExpandProperty Name
$RowCount = $Array | Measure-Object | Select-Object -ExpandProperty Count
##################################
# SMTP Body - HTML Email style settings
##################################
$HTMLStart = $HTMLCode | Where-Object {$_.SectionName -eq "Header"} | Select-Object -ExpandProperty HTMLCode
$HTMLEnd = $HTMLCode | Where-Object {$_.SectionName -eq "End"} | Select-Object -ExpandProperty HTMLCode
# Updating title in HTML start
$HTMLStart = $HTMLStart.Replace("#HTMLReportTitle",$ReportName)
##################################
# Creating HTML Summary table
##################################
$HTMLSummaryTable = $HTMLCode | Where-Object {$_.SectionName -eq "SUMMARYTABLE"} | Select-Object -ExpandProperty HTMLCode
# Updating variables in HTML code
$HTMLSummaryTable = $HTMLSummaryTable.Replace("#SystemDateTime",$SystemDateTime)
$HTMLSummaryTable = $HTMLSummaryTable.Replace("#ReportName",$ReportName)
$HTMLSummaryTable = $HTMLSummaryTable.Replace("#HTMLTableObjectCount",$RowCount)
##################################
# Creating HTML Data Table Start
##################################
$HTMLDataTable = @()
# Getting start of the table
$HTMLDataTableStart = $HTMLCode | Where-Object {$_.SectionName -eq "TABLE1START"} | Select-Object -ExpandProperty HTMLCode
# Adding to HTML
$HTMLDataTable += $HTMLDataTableStart
# Getting list of columns in array
$ArrayColumns = $Array | Get-Member | Where-Object {$_.MemberType -eq "NoteProperty"} | Select-Object -ExpandProperty Name
##################################
# Sorting Order Of Columns If Specified
##################################
IF($ColumnOrderArray -ne $null)
{
$ArrayColumnsNewOrder = @()
ForEach($Column in $ColumnOrderArray){IF($ArrayColumns -contains $Column){$ArrayColumnsNewOrder += $Column}ELSE{Write-Host "ColumnInColumnOrderNotFound: $Column" -ForegroundColor Yellow}}
}
# Sorting remaining alphabetically
$ArrayColumns = $ArrayColumns | Sort-Object $_
# Adding remaning colums
ForEach($ArrayColumn in $ArrayColumns){IF($ArrayColumnsNewOrder -notcontains $ArrayColumn){$ArrayColumnsNewOrder += $ArrayColumn}}
# Overriding columns if specified with order + any remaining
IF($ColumnOrderArray -ne $null){$ArrayColumns = $ArrayColumnsNewOrder}
# Checking to see if colums contains a URL
IF($ArrayColumns -match "URL"){$ContainsURLColumn = $TRUE;$URLColumn = $ArrayColumns | Where {$_ -match "URL"}}ELSE{$ContainsURLColumn = $False;$URLColumn = $null}
# Removing URL column
IF($ContainsURLColumn -eq $TRUE){$ArrayColumns = $ArrayColumns | Where {$_ -ne "URL"}} 
##################################
# Adding Columns & Rows To Data Table
##################################
# For each array column adding to HTML table
ForEach($HTMLColumn in $ArrayColumns)
{
# Getting the column header template
$HTMLDataTableColumn = $HTMLCode | Where-Object {$_.SectionName -eq "TABLE1COLUMN"} | Select-Object -ExpandProperty HTMLCode
# Updating header
$HTMLDataTableColumn = $HTMLDataTableColumn.Replace("#HTMLColumn",$HTMLColumn)
# Adding to HTML
$HTMLDataTable += $HTMLDataTableColumn
}
# Getting end of columns
$HTMLDataTableColumnEnd = $HTMLCode | Where-Object {$_.SectionName -eq "TABLE1COLUMNEND"} | Select-Object -ExpandProperty HTMLCode
# Adding to HTML
$HTMLDataTable += $HTMLDataTableColumnEnd
# Sorting the array
IF($SortByColumnName -ne $null)
{
IF($ArrayColumns -contains $SortByColumnName){$SortByColumnNameExists = $TRUE}ELSE{$SortByColumnNameExists = $FALSE}
IF($SortByColumnNameExists -eq $TRUE)
{
# If set to sort by a specific column, doing so, and using descending switch if set
IF($SortDescending){$Array = $Array | Sort-Object $SortByColumnName -Descending}ELSE{$Array = $Array | Sort-Object $SortByColumnName}
}
}
# Selecting 1st column name
$1stColumn = $ArrayColumns | Select-Object -First 1
# For table row in the array
ForEach($Object in $Array)
{
# Getting row start
$HTMLDataTableRowStart = $HTMLCode | Where-Object {$_.SectionName -eq "TABLE1ROWSTART"} | Select-Object -ExpandProperty HTMLCode
# Adding to HTML
$HTMLDataTable += $HTMLDataTableRowStart
# Selecting URL column
$URLColumn = $ArrayColumns | Where-Object {$_ -eq "URL"}
# For each column on the object
ForEach($HTMLObjectColumn in $ArrayColumns)
{
# Selecting data
$HTMLRow = $Object | Select-Object -ExpandProperty $HTMLObjectColumn
# Getting row template
$HTMLDataTableRow = $HTMLCode | Where-Object {$_.SectionName -eq "TABLE1ROW"} | Select-Object -ExpandProperty HTMLCode
# If first column and contains URL column, updating both
IF(($ContainsURLColumn -eq $true) -and ($HTMLObjectColumn -eq $1stColumn))
{
# This is the 1st column, and a URL has been passed in the array, setting it to be a hyperlink in the table instead
$HTMLDataTableRow = $HTMLCode | Where-Object {$_.SectionName -eq "TABLE1ROW"} | Select-Object -ExpandProperty HTMLCode
$HTMLURL = $Object | Select-Object -ExpandProperty URL
$HTMLCombined = "<a href=`"" + $HTMLURL + "`" target=`"_blank`">" + $HTMLRow + "</a>"
$HTMLDataTableRow = $HTMLDataTableRow.Replace("#HTMLRow",$HTMLCombined)
}
ELSE
{
# Only need to update the column with the text for the object
$HTMLDataTableRow = $HTMLDataTableRow.Replace("#HTMLRow",$HTMLRow)
}
# Adding to HTML
$HTMLDataTable += $HTMLDataTableRow
}
# Getting row end
$HTMLDataTableRowEnd = $HTMLCode | Where-Object {$_.SectionName -eq "TABLE1ROWEND"} | Select-Object -ExpandProperty HTMLCode
# Adding to HTML
$HTMLDataTable += $HTMLDataTableRowEnd
}
# Getting table end
$HTMLDataTableEnd = $HTMLCode | Where-Object {$_.SectionName -eq "TABLE1END"} | Select-Object -ExpandProperty HTMLCode
# Adding to HTML
$HTMLDataTable += $HTMLDataTableEnd
##################################
# Creating Report
##################################
# Building HTML report:
$HTMLReport = [string]$HTMLStart + [string]$HTMLSummaryTable + [string]$HTMLDataTable + [string]$HTMLEnd
##################################
# Sending email using function
##################################
# Logging
Write-Host "----------------------------
SendingEmailTo: $EmailTo"

# Sending
Try
{
Send-RSCEmail -SMTPServer $SMTPServer -EmailTo $EmailTo -EmailFrom $EmailFrom -EmailBody $HTMLReport -EmailSubject $ReportName -Attachments $Attachments
$EmailSent = $TRUE
}
Catch
{
$EmailSent = $FALSE
$Error[0] | Format-List -Force
}

# Returning status
Return $EmailStatus
}
###############################################
# End of script
###############################################