Public/Set-LMConfigsource.ps1

<#
.SYNOPSIS
Updates a LogicMonitor config source configuration.

.DESCRIPTION
The Set-LMConfigsource function modifies an existing config source in LogicMonitor, allowing updates to its name, display name, description, applies to settings, and other properties.

.PARAMETER Id
Specifies the ID of the config source to modify. This parameter is mandatory when using the 'Id' parameter set.

.PARAMETER Name
Specifies the current name of the config source. This parameter is mandatory when using the 'Name' parameter set.

.PARAMETER NewName
Specifies the new name for the config source.

.PARAMETER DisplayName
Specifies the new display name for the config source.

.PARAMETER Description
Specifies the new description for the config source.

.PARAMETER AppliesTo
Specifies the new applies to expression for the config source.

.PARAMETER TechNotes
Specifies the new technical notes for the config source.

.PARAMETER Tags
Specifies an array of tags to associate with the config source.

.PARAMETER TagsMethod
Specifies how to handle existing tags. Valid values are "Add" or "Refresh". Default is "Refresh".

.PARAMETER PollingIntervalInSeconds
Specifies the polling interval in seconds. Valid values are "3600", "14400", "28800", "86400".

.PARAMETER ConfigChecks
Specifies the configuration checks object for the config source.

.EXAMPLE
Set-LMConfigsource -Id 123 -NewName "UpdatedSource" -Description "New description"
Updates the config source with ID 123 with a new name and description.

.INPUTS
You can pipe objects containing Id properties to this function.

.OUTPUTS
Returns a LogicMonitor.Datasource object containing the updated config source information.

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

Function Set-LMConfigsource {

    [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'None')]
    Param (
        [Parameter(Mandatory, ParameterSetName = 'Id', ValueFromPipelineByPropertyName)]
        [String]$Id,

        [Parameter(Mandatory, ParameterSetName = 'Name')]
        [String]$Name,

        [String]$NewName,

        [String]$DisplayName,

        [String]$Description,

        [String]$appliesTo,

        [String]$TechNotes,

        [String[]]$Tags,

        [ValidateSet("Add", "Refresh")] # Add will append to existing prop, Refresh will replace existing props with new
        [String]$TagsMethod = "Refresh",

        [ValidateSet("3600", "14400", "28800", "86400")]
        [String]$PollingIntervalInSeconds, #In Seconds

        [PSCustomObject]$ConfigChecks #Should be the full datapoints object from the output of Get-LMDatasource

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

            #Lookup ParentGroupName
            If ($Name) {
                $LookupResult = (Get-LMConfigSource -Name $Name).Id
                If (Test-LookupResult -Result $LookupResult -LookupString $Name) {
                    return
                }
                $Id = $LookupResult
            }

            #Get existing tags if we are adding tags
            If ($Tags -and $TagsMethod -eq "Add") {
                $Tags = [String[]](Get-LMConfigSource -Id $Id).tags + $Tags
            }
                    
            #Build header and uri
            $ResourcePath = "/setting/configsources/$Id"

            If ($PSItem) {
                $Message = "Id: $Id | Name: $($PSItem.name) | DisplayName: $($PSItem.displayName)"
            }
            Elseif ($Name) {
                $Message = "Id: $Id | Name: $Name"
            }
            Else {
                $Message = "Id: $Id"
            }

            Try {
                $Data = @{
                    name            = $NewName
                    displayName     = $DisplayName
                    description     = $Description
                    appliesTo       = $appliesTo
                    technology      = $TechNotes
                    tags            = $Tags -join ","
                    collectInterval = $PollingIntervalInSeconds
                    configChecks    = $ConfigChecks
                }

                #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)

                If ($PSCmdlet.ShouldProcess($Message, "Set Configsource")) {  
                    $Headers = New-LMHeader -Auth $Script:LMAuth -Method "PATCH" -ResourcePath $ResourcePath -Data $Data
                    $Uri = "https://$($Script:LMAuth.Portal).logicmonitor.com/santaba/rest" + $ResourcePath + "?forceUniqueIdentifier=true"

                    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.Datasource" )
                }
            }
            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 {}
}