Public/Set-LMRole.ps1

<#
.SYNOPSIS
Updates a LogicMonitor role configuration.

.DESCRIPTION
The Set-LMRole function modifies an existing role in LogicMonitor, including its permissions and privileges.

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

.PARAMETER Name
Specifies the current name of the role.

.PARAMETER NewName
Specifies the new name for the role.

.PARAMETER CustomHelpLabel
Specifies the custom help label for the role.

.PARAMETER CustomHelpURL
Specifies the custom help URL for the role.

.PARAMETER Description
Specifies the description for the role.

.PARAMETER RequireEULA
Indicates whether to require EULA acceptance.

.PARAMETER TwoFARequired
Indicates whether to require two-factor authentication.

.PARAMETER RoleGroupId
Specifies the role group ID.

.PARAMETER CustomPrivilegesObject
Specifies custom privileges for the role.

.PARAMETER DashboardsPermission
Specifies dashboard permissions. Valid values: "view", "manage", "none".

.PARAMETER ResourcePermission
Specifies resource permissions. Valid values: "view", "manage", "none".

.PARAMETER SettingsPermission
Specifies settings permissions. Valid values: "view", "manage", "none", "manage-collectors", "view-collectors".

.EXAMPLE
Set-LMRole -Id 123 -NewName "Updated Role" -Description "New description" -DashboardsPermission "view"
Updates the role with new name, description, and dashboard permissions.

.INPUTS
None.

.OUTPUTS
Returns a LogicMonitor.Role object containing the updated role configuration.

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

Function Set-LMRole {

    [CmdletBinding(DefaultParameterSetName = 'Default')]
    Param (
        [Parameter(Mandatory, ParameterSetName = 'Id-Custom', ValueFromPipelineByPropertyName)]
        [Parameter(Mandatory, ParameterSetName = 'Id-Default', ValueFromPipelineByPropertyName)]
        [String]$Id,

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

        [Parameter(ParameterSetName = 'Id-Custom')]
        [Parameter(ParameterSetName = 'Id-Default')]
        [Parameter(ParameterSetName = 'Name-Custom')]
        [Parameter(ParameterSetName = 'Name-Default')]
        [String]$NewName,

        [Parameter(ParameterSetName = 'Id-Custom')]
        [Parameter(ParameterSetName = 'Id-Default')]
        [Parameter(ParameterSetName = 'Name-Custom')]
        [Parameter(ParameterSetName = 'Name-Default')]
        [String]$CustomHelpLabel,

        [Parameter(ParameterSetName = 'Id-Custom')]
        [Parameter(ParameterSetName = 'Id-Default')]
        [Parameter(ParameterSetName = 'Name-Custom')]
        [Parameter(ParameterSetName = 'Name-Default')]
        [String]$CustomHelpURL,

        [Parameter(ParameterSetName = 'Id-Custom')]
        [Parameter(ParameterSetName = 'Id-Default')]
        [Parameter(ParameterSetName = 'Name-Custom')]
        [Parameter(ParameterSetName = 'Name-Default')]
        [String]$Description,

        [Parameter(ParameterSetName = 'Id-Custom')]
        [Parameter(ParameterSetName = 'Id-Default')]
        [Parameter(ParameterSetName = 'Name-Custom')]
        [Parameter(ParameterSetName = 'Name-Default')]
        [Switch]$RequireEULA,

        [Parameter(ParameterSetName = 'Id-Custom')]
        [Parameter(ParameterSetName = 'Id-Default')]
        [Parameter(ParameterSetName = 'Name-Custom')]
        [Parameter(ParameterSetName = 'Name-Default')]
        [Switch]$TwoFARequired,

        [Parameter(ParameterSetName = 'Id-Custom')]
        [Parameter(ParameterSetName = 'Id-Default')]
        [Parameter(ParameterSetName = 'Name-Custom')]
        [Parameter(ParameterSetName = 'Name-Default')]
        [String]$RoleGroupId,

        [Parameter(ParameterSetName = 'Name-Default')]
        [Parameter(ParameterSetName = 'Id-Default')]
        [ValidateSet("view", "manage", "none")]
        [String]$DashboardsPermission = "none",

        [Parameter(ParameterSetName = 'Name-Default')]
        [Parameter(ParameterSetName = 'Id-Default')]
        [ValidateSet("view", "manage", "none")]
        [String]$ResourcePermission = "none",

        [Parameter(ParameterSetName = 'Name-Default')]
        [Parameter(ParameterSetName = 'Id-Default')]
        [ValidateSet("view", "manage", "commit", "publish", "none")]
        [String]$LMXToolBoxPermission = "none",
        
        [Parameter(ParameterSetName = 'Name-Default')]
        [Parameter(ParameterSetName = 'Id-Default')]
        [ValidateSet("view", "install", "none")]
        [String]$LMXPermission = "none",

        [Parameter(ParameterSetName = 'Name-Default')]
        [Parameter(ParameterSetName = 'Id-Default')]
        [ValidateSet("view", "manage", "none")]
        [String]$LogsPermission = "none",

        [Parameter(ParameterSetName = 'Name-Default')]
        [Parameter(ParameterSetName = 'Id-Default')]
        [ValidateSet("view", "manage", "none")]
        [String]$WebsitesPermission = "none",

        [Parameter(ParameterSetName = 'Name-Default')]
        [Parameter(ParameterSetName = 'Id-Default')]
        [ValidateSet("view", "manage", "none")]
        [String]$SavedMapsPermission = "none",

        [Parameter(ParameterSetName = 'Name-Default')]
        [Parameter(ParameterSetName = 'Id-Default')]
        [ValidateSet("view", "manage", "none")]
        [String]$ReportsPermission = "none",

        [Parameter(ParameterSetName = 'Name-Default')]
        [Parameter(ParameterSetName = 'Id-Default')]
        [ValidateSet("view", "manage", "none", "manage-collectors", "view-collectors")]
        [String]$SettingsPermission = "none",

        [Parameter(ParameterSetName = 'Name-Default')]
        [Parameter(ParameterSetName = 'Id-Default')]
        [Switch]$CreatePrivateDashboards,

        [Parameter(ParameterSetName = 'Name-Default')]
        [Parameter(ParameterSetName = 'Id-Default')]
        [Switch]$AllowWidgetSharing,

        [Parameter(ParameterSetName = 'Name-Default')]
        [Parameter(ParameterSetName = 'Id-Default')]
        [Switch]$ConfigTabRequiresManagePermission,

        [Parameter(ParameterSetName = 'Name-Default')]
        [Parameter(ParameterSetName = 'Id-Default')]
        [Switch]$AllowedToViewMapsTab,

        [Parameter(ParameterSetName = 'Name-Default')]
        [Parameter(ParameterSetName = 'Id-Default')]
        [Switch]$AllowedToManageResourceDashboards,

        [Parameter(ParameterSetName = 'Name-Default')]
        [Parameter(ParameterSetName = 'Id-Default')]
        [Switch]$ViewTraces,

        [Parameter(ParameterSetName = 'Name-Default')]
        [Parameter(ParameterSetName = 'Id-Default')]
        [Switch]$ViewSupport,

        [Parameter(ParameterSetName = 'Name-Default')]
        [Parameter(ParameterSetName = 'Id-Default')]
        [Switch]$EnableRemoteSessionForResources,

        [Parameter(Mandatory, ParameterSetName = 'Name-Custom')]
        [Parameter(Mandatory, ParameterSetName = 'Id-Custom')]
        [PSCustomObject]$CustomPrivilegesObject

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

        #Lookup Id if supplying username
        If ($Name) {
            $LookupResult = (Get-LMRole -Name $Name).Id
            If (Test-LookupResult -Result $LookupResult -LookupString $Name) {
                return
            }
            $Id = $LookupResult
        }
        
        #Build header and uri
        $ResourcePath = "/setting/roles/$Id"
        $Privileges = @()

        If (!$CustomPrivilegesObject) {

            If ($ViewTraces) {
                $Privileges += [PSCustomObject]@{
                    objectId     = "*"
                    objectName   = "*"
                    objectType   = "tracesManageTab"
                    operation    = "read"
                    subOperation = ""
                }
            }

            If ($EnableRemoteSessionForResources) {
                $Privileges += [PSCustomObject]@{
                    objectId     = "*"
                    objectName   = "*"
                    objectType   = "remoteSession"
                    operation    = "write"
                    subOperation = ""
                }
            }

            If ($AllowedToViewMapsTab) {
                $Privileges += [PSCustomObject]@{
                    objectId     = "*"
                    objectName   = "*"
                    objectType   = "resourceMapTab"
                    operation    = "read"
                    subOperation = ""
                }
            }

            If ($AllowWidgetSharing) {
                $Privileges += [PSCustomObject]@{
                    objectId     = "sharingwidget"
                    objectName   = "sharingwidget"
                    objectType   = "dashboard_group"
                    operation    = "write"
                    subOperation = ""
                }
            }

            If ($CreatePrivateDashboards) {
                $Privileges += [PSCustomObject]@{
                    objectId     = "private"
                    objectName   = "private"
                    objectType   = "dashboard_group"
                    operation    = "write"
                    subOperation = ""
                }
            }

            If ($LMXToolBoxPermission) {
                $Privileges += [PSCustomObject]@{
                    objectId   = "allinstalledmodules"
                    objectName = "All installed modules"
                    objectType = "module"
                    operation  = $LMXToolBoxPermission
                }
            }

            If ($LMXPermission) {
                $Privileges += [PSCustomObject]@{
                    objectId   = "All exchange modules"
                    objectName = "private"
                    objectType = "module"
                    operation  = $LMXPermission
                }
            }
            
            If ($ViewSupport) {
                $Privileges += [PSCustomObject]@{
                    objectId     = "chat"
                    objectName   = "help"
                    objectType   = "help"
                    operation    = "write"
                    subOperation = ""
                }
                $Privileges += [PSCustomObject]@{
                    objectId     = "*"
                    objectName   = "help"
                    objectType   = "help"
                    operation    = "read"
                    subOperation = ""
                }
            }

            If ($ConfigTabRequiresManagePermission) {
                $Privileges += [PSCustomObject]@{
                    objectId     = ""
                    objectName   = "configNeedDeviceManagePermission"
                    objectType   = "configNeedDeviceManagePermission"
                    operation    = "write"
                    subOperation = ""
                }
            }

            If ($AllowedToManageResourceDashboards) {
                $Privileges += [PSCustomObject]@{
                    objectId     = ""
                    objectName   = "deviceDashboard"
                    objectType   = "deviceDashboard"
                    operation    = "write"
                    subOperation = ""
                }
            }

            If ($DashboardsPermission -ne "none") {
                $Privileges += [PSCustomObject]@{
                    objectId     = "*"
                    objectName   = "*"
                    objectType   = "dashboard_group"
                    operation    = If ($DashboardsPermission -eq "manage") { "write" }Else { "read" }
                    subOperation = ""
                }
            }

            If ($ResourcePermission -ne "none") {
                $Privileges += [PSCustomObject]@{
                    objectId     = "*"
                    objectName   = "*"
                    objectType   = "host_group"
                    operation    = If ($ResourcePermission -eq "manage") { "write" }Else { "read" }
                    subOperation = ""
                }
            }

            If ($LogsPermission -ne "none") {
                $Privileges += [PSCustomObject]@{
                    objectId     = "*"
                    objectName   = "*"
                    objectType   = "logs"
                    operation    = If ($LogsPermission -eq "manage") { "write" }Else { "read" }
                    subOperation = ""
                }
            }

            If ($WebsitesPermission -ne "none") {
                $Privileges += [PSCustomObject]@{
                    objectId     = "*"
                    objectName   = "*"
                    objectType   = "website_group"
                    operation    = If ($WebsitesPermission -eq "manage") { "write" }Else { "read" }
                    subOperation = ""
                }
            }

            If ($SavedMapsPermission -ne "none") {
                $Privileges += [PSCustomObject]@{
                    objectId     = "*"
                    objectName   = "*"
                    objectType   = "map"
                    operation    = If ($SavedMapsPermission -eq "manage") { "write" }Else { "read" }
                    subOperation = ""
                }
            }

            If ($ReportsPermission -ne "none") {
                $Privileges += [PSCustomObject]@{
                    objectId     = "*"
                    objectName   = "*"
                    objectType   = "report_group"
                    operation    = If ($ReportsPermission -eq "manage") { "write" }Else { "read" }
                    subOperation = ""
                }
            }

            If ($SettingsPermission -ne "none") {
                If ($SettingsPermission -ne "manage-collectors" -and $SettingsPermission -ne "view-collectors") {
                    $Privileges += [PSCustomObject]@{
                        objectId     = "*"
                        objectName   = "*"
                        objectType   = "setting"
                        operation    = If ($SettingsPermission -eq "manage") { "write" }Else { "read" }
                        subOperation = ""
                    }

                    $Privileges += [PSCustomObject]@{
                        objectId     = "useraccess.*"
                        objectName   = "useraccess.*"
                        objectType   = "setting"
                        operation    = If ($ResourcePermission -eq "manage") { "write" }Else { "read" }
                        subOperation = ""
                    }
                }
                Else {
                    $Privileges += [PSCustomObject]@{
                        objectId   = "collectorgroup.*"
                        objectName = "Collectors"
                        objectType = "setting"
                        operation  = If ($SettingsPermission -eq "manage-collectors") { "write" }Else { "read" }
                    }
                }
            }
        }

        Try {
            $Data = @{
                customHelpLabel = $CustomHelpLabel
                customHelpURL   = $CustomHelpURL
                description     = $Description
                name            = $NewName
                requireEULA     = If ($RequireEULA.IsPresent) { "true" }Else { "" }
                roleGroupId     = $RoleGroupId
                twoFARequired   = If ($TwoFARequired.IsPresent) { "true" }Else { "" }
                privileges      = If ($CustomPrivilegesObject) { $CustomPrivilegesObject }Else { $Privileges }
            }

            #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

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