Public/New-EUCMonitoringConfig.ps1

function New-EUCMonitoringConfig {
    <#
.SYNOPSIS
    Generates a JSON file for EUC Monitoring based on default values
.DESCRIPTION
    This is a helper utility to create a JSON file for the EUCMonitoring
    platform. It uses standard ports for defaults.
.INPUTS
    None
.OUTPUTS
    Creates an eucmonitoring.json file in either current working directory, or
    via the path supplied.
.NOTES
    Current Version: 1.0
    Creation Date: 26/03/2018
.CHANGE CONTROL
    Name Version Date Change Detail
    Adam Yarborough 1.5.1 26/03/2018 Creation
.PARAMETER MonitorPath
    Path to EUC Monitoring directory.
.PARAMETER OutFile
    Path to JSON file for output, manually overriding default.
.PARAMETER Force
    Overwrite the config file for the Monitor
.EXAMPLE
    None Required
#>

    [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = "High")]
        
    param (
        [parameter(Mandatory = $false, ValueFromPipeline = $true)]$MonitorPath,
        [parameter(Mandatory = $false, ValueFromPipeline = $true)]$OutFile,
        [parameter(Mandatory = $false, ValueFromPipeline = $true)][switch]$Force
    )

    Write-Verbose "New-EUCMonitoringConfig Parameter Initialization"
    if ($null -eq $MonitorPath) {
        $MonitorPath = "$(get-location)"
    }
            
    $TemplateFileLocation = "$($MonitorPath)\euc-monitoring.json.template"
    Write-Verbose "Loading template from $($TemplateFileLocation)"
    if (test-path $TemplateFileLocation) {
        $MyJSONConfig = Get-Content -Raw -Path $TemplateFileLocation | ConvertFrom-Json
    }
    else {
        Write-Error "Not a valid path to the EUCMonitoring folder. Run Set-EUCMonitoring to get started."
        Return 
    }

    if ($null -eq $OutFile) {
        $OutFile = "$($MonitorPath)\euc-monitoring.json"
    }
    Write-Verbose "OutFile set to $($Outfile)"

    if (test-path $OutFile) {
        if ($Force -ne $true) {
            Write-Error "The Output File $($OutFile) already exists."
            Write-Error "Please run again with -Force, or specify a specific file with -Outfile <filename>"
            return 
        }
    }
    
    #
    # WebData Section.
    #
    Write-Verbose "Using default output location of $($MyJSONConfig.WebData.outputlocation)"
    Write-Verbose "Using default html output file of $($MyJSONConfig.WebData.htmloutputfile)"
    
    <#
    This is the actual start of the tests. I'd like it to validate each section for testiing,
    verify basic connectivity to each host being tested, and leave the default values alone.
    
    This is a quick config, so we should be having reasonable defaults.
    #>

    
    #
    # Citrix Section
    #
    $TestCitrix = Read-Host -Prompt 'Would you like to test Citrix (yes/no)'
    if ($TestCitrix -match "y") { 
        $MyJSONConfig.Citrix.global.test = "yes" 
        Write-Verbose "Enabling Citrix monitoring."


        # Citrix / Global Section
    
        # Get the default Broker Servers.
        $XDBrokerPrimary = Read-host -Prompt "Primary XenDesktop Broker"
        if ((Connect-Server $XDBrokerPrimary) -ne "Successful") {  
            $Response = Read-Host -Prompt "Unable to connect to $XDBrokerPrimary. Do you want to continue (yes/no)"
            if ($Response -notmatch "y") { return }
        } 
        $MyJSONConfig.Citrix.Global.XDBrokerPrimary = $XDBrokerPrimary

        $XDBrokerFailover = Read-host -Prompt "Failover XenDesktop Broker"
        if ((Connect-Server $XDBrokerFailover) -ne "Successful") {  
            $Response = Read-Host -Prompt "Unable to connect to $XDBrokerFailover. Do you want to continue (yes/no)"
            if ($Response -notmatch "y") { return }
        } 
        $MyJSONConfig.Citrix.Global.XDBrokerFailover = $XDBrokerFailover
        
        # We're going to assume default workloads. Currently server and desktop.
        Write-Verbose "Citrix monitoring configured for default workloads."
        # We're going to assume reasonable thresholds for those workloads are configured.
        Write-Verbose "Citrix monitoring configured for default thresholds."


        # Citrix / Xenserver Section
        $TestXenServer = Read-Host -Prompt 'Would you like to monitor Citrix Xenserver (yes/no)'
        if ($TestXenServer -match "y") { 
            $MyJSONConfig.Citrix.Xenserver.test = "yes" 
            Write-Verbose "Enabling Citrix Xenserver monitoring."

            $Poolmasters = (Read-host -Prompt 'Please specify which XenServer pool masters (comma separated)').Replace(' ','')
            $Poolmasters = @($Poolmasters.Split(','))

            foreach ($Poolmaster in $Poolmasters) { 
                if ((Connect-Server $Poolmaster) -ne "Successful") {  
                    $Response = Read-Host -Prompt "Unable to connect to $Poolmaster. Do you want to continue? (yes/no)"
                    if ($Response -notmatch "y") { return }
                } 
            }
            $MyJSONConfig.Citrix.Xenserver.poolmasters = $Poolmasters

            # Should we prompt for username / password in a quick config? For now, no.
            Write-Verbose "Citrix Xenserver monitoring configured using default values."
            Write-Warning "You need to manually edit $Outfile to put in your username and password."
        }
        else { $MyJSONConfig.Citrix.Xenserver.test = "no" } 


        # Citrix / Storefront Section
        $TestStorefront = Read-Host -Prompt 'Would you like to monitor Citrix Storefront (yes/no)'
        if ($TestStorefront -match "y") { 
            $MyJSONConfig.Citrix.Storefront.test = "yes" 
            Write-Verbose "Enabling Citrix Storefront monitoring"

            $StoreFrontServers = (Read-host -Prompt 'Please specify which Citrix Storefront servers (comma separated)').Replace(' ','')
            $StoreFrontServers = @($StoreFrontServers.Split(','))

            foreach ($StoreFrontServer in $StoreFrontServers) { 
                if ((Connect-Server $StoreFrontServer) -ne "Successful") {  
                    $Response = Read-Host -Prompt "Unable to connect to $StoreFrontServer. Do you want to continue? (yes/no)"
                    if ($Response -notmatch "y") { return }
                } 
            }
            $MyJSONConfig.Citrix.Storefront.StorefrontServers = $StoreFrontServers
            Write-Verbose "Citrix Storefront monitoring configured using default values."
        } 
        else { $MyJSONConfig.Citrix.Storefront.test = "no" }


        # Citrix / Licensing Section
        $TestLicensing = Read-Host -Prompt '[Citrix] Would you like to test Licensing (yes/no)'
        if ($TestLicensing -match "y") { 
            $MyJSONConfig.Citrix.Licensing.test = "yes" 
            Write-Verbose "Enabling Citrix Licensing Monitoring."
            $LicenseServers = (Read-host -Prompt 'Please specify which Citrix License Servers (comma separated)').Replace(' ','')
            $LicenseServers = @($LicenseServers.Split(','))

            foreach ($Licenseserver in $LicenseServers) { 
                if ((Connect-Server $LicenseServer) -ne "Successful") {  
                    $Response = Read-Host -Prompt "Unable to connect to $LicenseServer. Do you want to continue (yes/no)"
                    if ($Response -notmatch "y") { return }
                } 
            }
            $MyJSONConfig.Citrix.Licensing.LicenseServers = $LicenseServers
            Write-Verbose "Citrix Licensing configured using default values."
        }
        else { $MyJSONConfig.Citrix.Licensing.Test = "no" }
    

        # Citrix / Director Section
        $TestDirector = Read-Host -Prompt 'Would you like to monitor Citrix Director (yes/no)'
        if ($TestDirector -match "y") { 
            $MyJSONConfig.Citrix.Director.Test = "yes" 
            Write-Verbose "Enabling Citrix Director monitoring."
            $DirectorServers = (Read-host -Prompt 'Please specify which Citrix Director Servers (comma separated)').Replace(' ','')
            $DirectorServers = @($DirectorServers.Split(','))

            foreach ($DirectorServer in $DirectorServers) { 
                if ((Connect-Server $DirectorServer) -ne "Successful") {  
                    $Response = Read-Host -Prompt "Unable to connect to $DirectorServer. Do you want to continue (yes/no)"
                    if ($Response -notmatch "y") { return }
                } 
            }
            $MyJSONConfig.Citrix.Director.DirectorServers = $DirectorServers
            Write-Verbose "Citrix Director monitoring configured using default values."
        }
        else { $MyJSONConfig.Citrix.Director.test = "no" }
    

        # Citrix / Controllers Section
        $TestController = Read-Host -Prompt 'Would you like to monitor Citrix Controllers (yes/no)'
        if ($TestController -match "y") { 
            $MyJSONConfig.Citrix.Controllers.Test = "yes" 
            Write-Verbose "Enabling Citrix Controller monitoring."
            $ControllerServers = (Read-host -Prompt 'Please specify which Citrix Controllers (comma separated)').Replace(' ','')
            $ControllerServers = @($ControllerServers.Split(','))

            foreach ($ControllerServer in $ControllerServers) { 
                if ((Connect-Server $ControllerServer) -ne "Successful") {  
                    $Response = Read-Host -Prompt "Unable to connect to $ControllerServer. Do you want to continue (yes/no)"
                    if ($Response -notmatch "y") { return }
                } 
            }
            $MyJSONConfig.Citrix.Controllers.ControllerServers = $ControllerServers
            Write-Verbose "Citrix Controller monitoring configured using default values."
        }
        else { $MyJSONConfig.Citrix.Controllers.test = "no" }
 

        # Citrix / Netscaler Section
        $TestNetscaler = Read-Host -Prompt 'Would you like to monitor Citrix Netscalers (yes/no)'
        if ($TestNetscaler -match "y") { 
            $MyJSONConfig.Citrix.Netscalers.Test = "yes" 
            Write-Verbose "Enabling Citrix Netscaler monitoring."
            $Netscalers = (Read-host -Prompt 'Please specify which Citrix Netscalers by IP (comma separated)').Replace(' ','')
            $Netscalers = @($Netscalers.Split(','))

            foreach ($Netscaler in $Netscalers) { 
                if ((Connect-Server $Netscaler) -ne "Successful") {  
                    $Response = Read-Host -Prompt "Unable to connect to $Netscaler. Do you want to continue (yes/no)"
                    if ($Response -notmatch "y") { return }
                } 
            }
            $MyJSONConfig.Citrix.Netscalers.Netscalers = $Netscalers
            Write-Verbose "Citrix Netscaler monitoring configured using default values."
            Write-Warning "You need to manually edit $Outfile to put in your username and password."
        }
        else { $MyJSONConfig.Citrix.Netscalers.test = "no" }


        # Citrix / Netscaler Gateway Section
        $TestNetscalerGateway = Read-Host -Prompt 'Would you like to monitor the Citrix Netscaler Gateway (yes/no)'
        if ($TestNetscalerGateway -match "y") { 
            $MyJSONConfig.Citrix.NetscalerGateway.Test = "yes" 
            Write-Verbose "Enabling Citrix Netscaler Gateway monitoring."
            $NetscalerGateway = Read-host -Prompt 'Please specify which Citrix Netscaler Gateway by IP'
            
            if ((Connect-Server $NetscalerGateway) -ne "Successful") {  
                $Response = Read-Host -Prompt "Unable to connect to $NetscalerGateway. Do you want to continue (yes/no)"
                if ($Response -notmatch "y") { return }
            } 
            
            $MyJSONConfig.Citrix.NetscalerGateway.NetscalerHostingGateway = $NetscalerGateway
            Write-Verbose "Citrix Netscaler Gateway monitoring configured using default values."
        }
        else { $MyJSONConfig.Citrix.NetscalerGateway.test = "no" }


        # Citrix / Provisioning Server Section
        $TestProvisioningServer = Read-Host -Prompt 'Would you like to monitor Citrix Provisioning Servers (yes/no)'
        if ($TestProvisioningServer -match "y") { 
            $MyJSONConfig.Citrix.ProvisioningServers.Test = "yes" 
            Write-Verbose "Enabling Citrix Provisioning Server monitoring."
            $ProvisioningServers = (Read-host -Prompt 'Please specify which Citrix Provisioning Servers (comma separated)').Replace(' ','')
            $ProvisioningServers = @($ProvisioningServers.Split(','))

            foreach ($ProvisioningServer in $ProvisioningServers) { 
                if ((Connect-Server $ProvisioningServer) -ne "Successful") {  
                    $Response = Read-Host -Prompt "Unable to connect to $ProvisioningServer. Do you want to continue (yes/no)"
                    if ($Response -notmatch "y") { return }
                } 
            }
            $MyJSONConfig.Citrix.ProvisioningServers.ProvisioningServers = $ProvisioningServers
            Write-Verbose "Citrix Provisioning Server monitoring configured using default values."
            Write-Warning "You need to manually edit $Outfile to put in your farm and site names."
        }
        else { $MyJSONConfig.Citrix.ProvisioningServers.test = "no" }


        # Citrix / WEM Section
        $TestWEM = Read-Host -Prompt 'Would you like to monitor Citrix WEM Servers (yes/no)'
        if ($TestWEM -match "y") { 
            $MyJSONConfig.Citrix.WEM.Test = "yes" 
            Write-Verbose "Enabling Citrix WEM Server monitoring."
            $WEMServers = (Read-host -Prompt 'Please specify which Citrix WEM Servers (comma separated)').Replace(' ','')
            $WEMServers = @($WEMServers.Split(','))

            foreach ($WEMServer in $WEMServers) { 
                if ((Connect-Server $WEMServer) -ne "Successful") {  
                    $Response = Read-Host -Prompt "Unable to connect to $WEMServer. Do you want to continue (yes/no)"
                    if ($Response -notmatch "y") { return }
                } 
            }
            $MyJSONConfig.Citrix.WEM.WEMServers = $WEMServers
            Write-Verbose "Citrix WEM Servers monitoring configured using default values."
        }
        else { $MyJSONConfig.Citrix.WEM.test = "no" }


        # Citrix / UPS Section
        $TestUPS = Read-Host -Prompt 'Would you like to monitor Citrix UPS Servers (yes/no)'
        if ($TestUPS -match "y") { 
            $MyJSONConfig.Citrix.UPS.Test = "yes" 
            Write-Verbose "Enabling Citrix UPS Server monitoring."
            $UPSServers = (Read-host -Prompt 'Please specify which Citrix UPS Servers (comma separated)').Replace(' ','')
            $UPSServers = @($UPSServers.Split(','))

            foreach ($UPSServer in $UPSServers) { 
                if ((Connect-Server $UPSServer) -ne "Successful") {  
                    $Response = Read-Host -Prompt "Unable to connect to $UPSServer. Do you want to continue (yes/no)"
                    if ($Response -notmatch "y") { return }
                } 
            }
            $MyJSONConfig.Citrix.UPS.UPSServers = $UPSServers
            Write-Verbose "Citrix UPS Servers monitoring configured using default values."
        }
        else { $MyJSONConfig.Citrix.UPS.test = "no" }


        # Citrix / FAS Section
        $TestFAS = Read-Host -Prompt 'Would you like to monitor Citrix FAS Servers (yes/no)'
        if ($TestFAS -match "y") { 
            $MyJSONConfig.Citrix.FAS.Test = "yes" 
            Write-Verbose "Enabling Citrix FAS Server monitoring."
            $FASServers = (Read-host -Prompt 'Please specify which Citrix FAS Servers (comma separated)').Replace(' ','')
            $FASServers = @($FASServers.Split(','))

            foreach ($FASServer in $FAServers) { 
                if ((Connect-Server $FASServer) -ne "Successful") {  
                    $Response = Read-Host -Prompt "Unable to connect to $FASServer. Do you want to continue (yes/no)"
                    if ($Response -notmatch "y") { return }
                } 
            }
            $MyJSONConfig.Citrix.FAS.FASServers = $FASServers
            Write-Verbose "Citrix FAS Servers monitoring configured using default values."
        }
        else { $MyJSONConfig.Citrix.FAS.test = "no" }


        # Citrix / CC Section
        $TestCC = Read-Host -Prompt 'Would you like to monitor Citrix Cloud Connectors (yes/no)'
        if ($TestCC -match "y") { 
            $MyJSONConfig.Citrix.CC.Test = "yes" 
            Write-Verbose "Enabling Citrix Cloud Connector monitoring."
            $CCServers = (Read-host -Prompt 'Please specify which Citrix Cloud Connectors (comma separated)').Replace(' ','')
            $CCServers = @($CCServers.Split(','))

            foreach ($CCServer in $CCServers) { 
                if ((Connect-Server $CCServer) -ne "Successful") {  
                    $Response = Read-Host -Prompt "Unable to connect to $CCServer. Do you want to continue (yes/no)"
                    if ($Response -notmatch "y") { return }
                } 
            }
            $MyJSONConfig.Citrix.CC.CCServers = $CCServers
            Write-Verbose "Citrix CC Servers monitoring configured using default values."
        }
        else { $MyJSONConfig.Citrix.CC.test = "no" }


        # Citrix / Studio Checks Section
        if ($TestCC -notmatch "y") {
            # This isn't even an option with Cloud Connectors
            $TestEnvChecks = Read-Host -Prompt 'Would you like to monitor Studio Checks health (yes/no)'
            if ($TestEnvChecks -match "y") {
                $MyJSONConfig.Citrix.EnvChecks.Test = "yes"
                Write-Verbose "Citrix Studio Checks configured using default values."
            }
            else { $MyJSONConfig.Citrix.EnvChecks.test = "no" }
        }


    }
    else { $MyJSONConfig.Citrix.global.test = "no" }


    #
    # Microsoft Section.
    #
    $TestMicrosoft = Read-Host -Prompt 'Would you like to monitor your Microsoft Resources (yes/no)'
    if ($TestMicrosoft -match "y") { 
        $MyJSONConfig.Microsoft.global.test = "yes" 
        Write-Verbose "Enabling Microsoft Monitoring" 


        # Microsoft / AD
        $TestAD = Read-Host -Prompt 'Would you like to monitor Active Directory (yes/no)'
        if ($TestAD -match "y") { 
            $MyJSONConfig.Microsoft.AD.Test = "yes" 
            Write-Verbose "Enabling Microsoft Active Directory monitoring."
            
            
            # Since this is Quickconfig, let's query based on current scope.
            # This requires Active Directory module loaded. Figure out the checks
            <# If module activedirectory available, or loaded#>
            if ( $false ) {
                Write-Verbose "Querying User's domain controllers"
                Import-Module activedirectory
                $ADServers = Get-ADDomainController -filter * | Select-Object -ExpandProperty hostname
            }    
            <# If not... #>
            else {
                $ADServers = (Read-host -Prompt 'Please specify which Domain Controllers (comma separated)').Replace(' ', '')
                $ADServers = @($ADServers.Split(','))

                foreach ($ADServer in $ADServers) { 
                    if ((Connect-Server $ADServer) -ne "Successful") {  
                        $Response = Read-Host -Prompt "Unable to connect to $ADServer. Do you want to continue (yes/no)"
                        if ($Response -notmatch "y") { return }
                    } 
                }
            }
            $MyJSONConfig.Microsoft.AD.ADServers = $ADServers
            Write-Verbose "Microsoft Active Directory monitoring configured using default values."
        }
        else { $MyJSONConfig.Microsoft.AD.test = "no" }

        
        # Microsoft / SQL
        $TestSQL = Read-Host -Prompt 'Would you like to monitor Microsoft MSSQL Servers (yes/no)'
        if ($TestSQL -match "y") { 
            $MyJSONConfig.Microsoft.SQL.Test = "yes" 
            Write-Verbose "Enabling Microsoft MSSQL monitoring."
            $SQLServers = (Read-host -Prompt 'Please specify which MSSQL Servers (comma separated)').Replace(' ','')
            $SQLServers = @($SQLServers.Split(','))

            foreach ($SQLServer in $SQLServers) { 
                if ((Connect-Server $SQLServer) -ne "Successful") {  
                    $Response = Read-Host -Prompt "Unable to connect to $SQLServer. Do you want to continue (yes/no)"
                    if ($Response -notmatch "y") { return }
                } 
            }
            $MyJSONConfig.Microsoft.SQL.SQLServers = $SQLServers
            Write-Verbose "Microsoft SQL Servers monitoring configured using default values."
        }
        else { $MyJSONConfig.Microsoft.SQL.test = "no" }
        
        # Microsoft / AppV
        $TestAppV = Read-Host -Prompt 'Would you like to monitor Microsoft AppV Servers (yes/no)'
        if ($TestAppV -match "y") { 
            $MyJSONConfig.Microsoft.AppV.Test = "yes" 
            Write-Verbose "Enabling Microsoft AppV monitoring."
            $AppVServers = (Read-host -Prompt 'Please specify which AppV Servers (comma separated)').Replace(' ','')
            $AppVServers = @($AppVServers.Split(','))

            foreach ($AppVServer in $AppVServers) { 
                if ((Connect-Server $AppVServer) -ne "Successful") {  
                    $Response = Read-Host -Prompt "Unable to connect to $AppVServer. Do you want to continue (yes/no)"
                    if ($Response -notmatch "y") { return }
                } 
            }
            $MyJSONConfig.Microsoft.AppV.AppVServers = $AppVServers
            $AppVPort = (Read-host -Prompt 'Please specify AppV Publishing Servers port').Replace(' ','')
            $MyJSONConfig.Microsoft.AppV.AppvPort =  $AppVPort

            Write-Verbose "Microsoft AppV Servers monitoring configured using default values."
        }
        else { $MyJSONConfig.Microsoft.AppV.test = "no" }
    }
    else { $MyJSONConfig.Microsoft.global.test = "no" }


      
    # Just a final confirmation so that we will fully run through the configuration before deleting someone's files.
    if ( (test-path $OutFile) -and ($Force -eq $true) ) {  
        Remove-Item $OutFile
    }

    # Actually output the file.
    ConvertTo-Json $MyJSONConfig -Depth 4 | Out-File $OutFile

    # This is outputting arrays as space delimited
    Write-Verbose "All values can be further customized at $($Outfile)"
    Write-Verbose "Done."
}