Public/Set-LMWebsite.ps1

<#
.SYNOPSIS
Updates a LogicMonitor website monitoring configuration.

.DESCRIPTION
The Set-LMWebsite function modifies an existing website monitoring configuration in LogicMonitor.

.PARAMETER Id
Specifies the ID of the website to modify.

.PARAMETER Name
Specifies the name for the website.

.PARAMETER IsInternal
Indicates whether the website is internal.

.PARAMETER Description
Specifies the description for the website.

.PARAMETER DisableAlerting
Indicates whether to disable alerting for the website.

.PARAMETER StopMonitoring
Indicates whether to stop monitoring the website.

.PARAMETER UseDefaultAlertSetting
Indicates whether to use default alert settings.

.PARAMETER UseDefaultLocationSetting
Indicates whether to use default location settings.

.PARAMETER TriggerSSLStatusAlert
Indicates whether to trigger SSL status alerts.

.PARAMETER TriggerSSLExpirationAlert
Indicates whether to trigger SSL expiration alerts.

.PARAMETER GroupId
Specifies the group ID for the website.

.PARAMETER Properties
Specifies a hashtable of custom properties for the website.

.PARAMETER PropertiesMethod
Specifies how to handle properties. Valid values: "Add", "Replace", "Refresh".

.PARAMETER PollingInterval
Specifies the polling interval. Valid values: 1-10, 30, 60.

.EXAMPLE
Set-LMWebsite -Id 123 -Name "Updated Site" -Description "New description" -DisableAlerting $false
Updates the website with new name, description, and enables alerting.

.INPUTS
None.

.OUTPUTS
Returns a LogicMonitor.Website object containing the updated configuration.

.NOTES
This function requires a valid LogicMonitor API authentication.
#>


Function Set-LMWebsite {

    [CmdletBinding(DefaultParameterSetName = "Website")]
    Param (
        [Parameter(Mandatory, ValueFromPipelineByPropertyName)]
        [String]$Id,

        [String]$Name,

        [Nullable[boolean]]$IsInternal,

        [String]$Description,

        [Nullable[boolean]]$DisableAlerting,

        [Nullable[boolean]]$StopMonitoring,

        [Nullable[boolean]]$UseDefaultAlertSetting,

        [Nullable[boolean]]$UseDefaultLocationSetting,

        [Parameter(ParameterSetName = "Website")]
        [Nullable[boolean]]$TriggerSSLStatusAlert,
        
        [Parameter(ParameterSetName = "Website")]
        [Nullable[boolean]]$TriggerSSLExpirationAlert,

        [String]$GroupId,

        [Parameter(ParameterSetName = "Ping")]
        [String]$PingAddress,

        [Parameter(ParameterSetName = "Website")]
        [String]$WebsiteDomain,

        [ValidateSet("http", "https")]
        [Parameter(ParameterSetName = "Website")]
        [String]$HttpType,

        [Parameter(ParameterSetName = "Website")]
        [String[]]$SSLAlertThresholds,
        
        [Parameter(ParameterSetName = "Ping")]
        [ValidateSet(5, 10, 15, 20, 30, 60)]
        [Nullable[Int]]$PingCount,

        [Parameter(ParameterSetName = "Ping")]
        [Nullable[Int]]$PingTimeout,

        [Parameter(ParameterSetName = "Website")]
        [Nullable[Int]]$PageLoadAlertTimeInMS,

        [Parameter(ParameterSetName = "Ping")]
        [ValidateSet(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)]
        [Nullable[Int]]$PingPercentNotReceived,

        [ValidateSet(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 30, 60)]
        [Nullable[Int]]$FailedCount,

        [ValidateSet("warn", "error", "critical")]
        [String]$OverallAlertLevel,

        [ValidateSet("warn", "error", "critical")]
        [String]$IndividualAlertLevel,

        [Hashtable]$Properties,

        [ValidateSet("Add", "Replace", "Refresh")] # Add will append to existing prop, Replace will update existing props if specified and add new props, refresh will replace existing props with new
        [String]$PropertiesMethod = "Replace",

        [ValidateSet(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)]
        [Nullable[Int]]$PollingInterval,

        [Parameter(ParameterSetName = "Website")]
        [String[]]$WebsiteSteps
    )

    Begin {}
    Process {
        #Check if we are logged in and have valid api creds
        If ($Script:LMAuth.Valid) {

            #Lookup Id by name
            If ($Name) {
                $LookupResult = (Get-LMWebsite -Name $Name).Id
                If (Test-LookupResult -Result $LookupResult -LookupString $Name) {
                    return
                }
                $Id = $LookupResult
            }

            #Build custom props hashtable
            $customProperties = @()
            If ($Properties) {
                Foreach ($Key in $Properties.Keys) {
                    $customProperties += @{name = $Key; value = $Properties[$Key] }
                }
            }
                    
            #Build header and uri
            $ResourcePath = "/website/websites/$Id"

            Try {
                $alertExpr = $null
                If ($SSLAlertThresholds) {
                    $alertExpr = "< " + $SSLAlertThresholds -join " "
                }

                $Data = @{
                    name                        = $Name
                    description                 = $Description
                    disableAlerting             = $DisableAlerting
                    isInternal                  = $IsInternal
                    properties                  = $customProperties
                    stopMonitoring              = $StopMonitoring
                    groupId                     = $GroupId
                    pollingInterval             = $PollingInterval
                    overallAlertLevel           = $OverallAlertLevel
                    individualAlertLevel        = $IndividualAlertLevel
                    useDefaultAlertSetting      = $UseDefaultAlertSetting
                    useDefaultLocationSetting   = $UseDefaultLocationSetting
                    host                        = $PingAddress
                    triggerSSLStatusAlert       = $TriggerSSLStatusAlert
                    triggerSSLExpirationAlert   = $TriggerSSLExpirationAlert
                    count                       = $PingCount
                    percentPktsNotReceiveInTime = $PingPercentNotReceived
                    timeoutInMSPktsNotReceive   = $PingTimeout
                    transition                  = $FailedCount
                    pageLoadAlertTimeInMS       = $PageLoadAlertTimeInMS
                    alertExpr                   = $alertExpr
                    schema                      = $HttpType
                    domain                      = $WebsiteDomain
                    steps                       = $WebsiteSteps

                }

            
                #Remove empty keys so we dont overwrite them
                @($Data.keys) | ForEach-Object { If ([string]::IsNullOrEmpty($Data[$_]) -and ($_ -notin @($MyInvocation.BoundParameters.Keys))) { $Data.Remove($_) } }
            
                $Data = ($Data | ConvertTo-Json)

                $Headers = New-LMHeader -Auth $Script:LMAuth -Method "PATCH" -ResourcePath $ResourcePath -Data $Data
                $Uri = "https://$($Script:LMAuth.Portal).logicmonitor.com/santaba/rest" + $ResourcePath + "?opType=$($PropertiesMethod.ToLower())"

                Resolve-LMDebugInfo -Url $Uri -Headers $Headers[0] -Command $MyInvocation -Payload $Data

                #Issue request
                $Response = Invoke-RestMethod -Uri $Uri -Method "PATCH" -Headers $Headers[0] -WebSession $Headers[1] -Body $Data

                Return (Add-ObjectTypeInfo -InputObject $Response -TypeName "LogicMonitor.Website" )
            }
            Catch [Exception] {
                $Proceed = Resolve-LMException -LMException $PSItem
                If (!$Proceed) {
                    Return
                }
            }
        }
        Else {
            Write-Error "Please ensure you are logged in before running any commands, use Connect-LMAccount to login and try again."
        }
    }
    End {}
}