Public/recon-monitoring-rules.ps1

function Edit-FalconReconAction {
    [CmdletBinding(DefaultParameterSetName = '/recon/entities/actions/v1:patch')]
    param(
        [Parameter(ParameterSetName = '/recon/entities/actions/v1:patch', Mandatory = $true,
            ValueFromPipelineByPropertyName = $true, ValueFromPipeline = $true, Position = 1)]
        [ValidatePattern('^\w{8}-\w{4}-\w{4}-\w{4}-\w{12}$')]
        [string] $Id,

        [Parameter(ParameterSetName = '/recon/entities/actions/v1:patch', Mandatory = $true, Position = 2)]
        [ValidateSet('asap', 'daily', 'weekly')]
        [string] $Frequency,

        [Parameter(ParameterSetName = '/recon/entities/actions/v1:patch', Mandatory = $true, Position = 3)]
        [ValidateScript({
            if ((Test-RegexValue $_) -eq 'email') { $true } else { throw "'$_' is not a valid email address." }
        })]
        [array] $Recipients,

        [Parameter(ParameterSetName = '/recon/entities/actions/v1:patch', Mandatory = $true, Position = 4)]
        [ValidateSet('enabled', 'muted')]
        [string] $Status

    )
    process {
        $Param = @{
            Command  = $MyInvocation.MyCommand.Name
            Endpoint = $PSCmdlet.ParameterSetName
            Inputs   = $PSBoundParameters
            Format   = @{ Body = @{ root = @('recipients', 'id', 'status', 'frequency') }}
        }
        Invoke-Falcon @Param
    }
}
function Edit-FalconReconNotification {
    [CmdletBinding(DefaultParameterSetName = '/recon/entities/notifications/v1:patch')]
    param(
        [Parameter(ParameterSetName = 'array', Mandatory = $true, Position = 1)]
        [ValidateScript({
            foreach ($Object in $_) {
                $Param = @{
                    Object   = $Object
                    Command  = 'Edit-FalconReconNotification'
                    Endpoint = '/recon/entities/notifications/v1:patch'
                    Required = @('id', 'assigned_to_uuid', 'status')
                    Pattern  = @('id', 'assigned_to_uuid')
                    Format   = @{ assigned_to_uuid = 'AssignedToUuid' }
                }
                Confirm-Parameter @Param
            }
        })]
        [array] $Array,

        [Parameter(ParameterSetName = '/recon/entities/notifications/v1:patch', Mandatory = $true,
            ValueFromPipelineByPropertyName = $true, ValueFromPipeline = $true, Position = 1)]
        [ValidatePattern('^\w{76}$')]
        [string] $Id,

        [Parameter(ParameterSetName = '/recon/entities/notifications/v1:patch', Mandatory = $true, Position = 2)]
        [ValidatePattern('^\w{8}-\w{4}-\w{4}-\w{4}-\w{12}$')]
        [string] $AssignedToUuid,

        [Parameter(ParameterSetName = '/recon/entities/notifications/v1:patch', Mandatory = $true, Position = 3)]
        [string] $Status
    )
    begin {
        $Fields = @{ AssignedToUuid = 'assigned_to_uuid' }
    }
    process {
        if ($PSBoundParameters.Array) {
            if (!$Script:Falcon.Hostname) { Request-FalconToken }
            $Param = @{
                Path    = "$($Script:Falcon.Hostname)/recon/entities/notifications/v1"
                Method  = 'patch'
                Headers = @{
                    Accept      = 'application/json'
                    ContentType = 'application/json'
                }
            }
            for ($i = 0; $i -lt ($PSBoundParameters.Array | Measure-Object).Count; $i += 500) {
                # Edit notifications in batches of 500
                $Group = $PSBoundParameters.Array[$i..($i + 499)]
                $Param['Body'] = ConvertTo-Json -InputObject @( $Group ) -Depth 8
                $Request = $Script:Falcon.Api.Invoke($Param)
                Write-Result -Request $Request
            }
        } else {
            $Param = @{
                Command  = $MyInvocation.MyCommand.Name
                Endpoint = $PSCmdlet.ParameterSetName
                Inputs   = Update-FieldName -Fields $Fields -Inputs $PSBoundParameters
                Format   = @{ Body = @{ root = @('assigned_to_uuid', 'id', 'status') }}
            }
            Invoke-Falcon @Param
        }
    }
}
function Edit-FalconReconRule {
    [CmdletBinding(DefaultParameterSetName = '/recon/entities/rules/v1:patch')]
    param(
        [Parameter(ParameterSetName = 'array', Mandatory = $true, Position = 1)]
        [ValidateScript({
            foreach ($Object in $_) {
                $Param = @{
                    Object   = $Object
                    Command  = 'Edit-FalconReconRule'
                    Endpoint = '/recon/entities/rules/v1:patch'
                    Required = @('id', 'name', 'filter', 'priority', 'permissions')
                    Content  = @('permissions', 'priority')
                    Pattern  = @('id')
                }
                Confirm-Parameter @Param
            }
        })]
        [array] $Array,

        [Parameter(ParameterSetName = '/recon/entities/rules/v1:patch', Mandatory = $true,
            ValueFromPipelineByPropertyName = $true, ValueFromPipeline = $true, Position = 1)]
        [ValidatePattern('^\w{8}-\w{4}-\w{4}-\w{4}-\w{12}$')]
        [string] $Id,

        [Parameter(ParameterSetName = '/recon/entities/rules/v1:patch', Mandatory = $true, Position = 2)]
        [string] $Name,

        [Parameter(ParameterSetName = '/recon/entities/rules/v1:patch', Mandatory = $true, Position = 3)]
        [ValidateScript({ Test-FqlStatement $_ })]
        [string] $Filter,

        [Parameter(ParameterSetName = '/recon/entities/rules/v1:patch', Mandatory = $true, Position = 4)]
        [ValidateSet('high', 'medium', 'low')]
        [string] $Priority,

        [Parameter(ParameterSetName = '/recon/entities/rules/v1:patch', Mandatory = $true, Position = 5)]
        [ValidateSet('private', 'public')]
        [string] $Permissions
    )
    process {
        if ($PSBoundParameters.Array) {
            if (!$Script:Falcon.Hostname) { Request-FalconToken }
            $Param = @{
                Path    = "$($Script:Falcon.Hostname)/recon/entities/rules/v1"
                Method  = 'patch'
                Headers = @{
                    Accept      = 'application/json'
                    ContentType = 'application/json'
                }
            }
            for ($i = 0; $i -lt ($PSBoundParameters.Array | Measure-Object).Count; $i += 500) {
                # Edit rules in batches of 500
                $Group = $PSBoundParameters.Array[$i..($i + 499)]
                $Param['Body'] = ConvertTo-Json -InputObject @( $Group ) -Depth 8
                $Request = $Script:Falcon.Api.Invoke($Param)
                Write-Result -Request $Request
            }
        } else {
            $Param = @{
                Command  = $MyInvocation.MyCommand.Name
                Endpoint = $PSCmdlet.ParameterSetName
                Inputs   = $PSBoundParameters
                Format   = @{ Body = @{ root = @('permissions', 'priority', 'name', 'id', 'filter') }}
            }
            Invoke-Falcon @Param
        }
    }
}
function Get-FalconReconAction {
    [CmdletBinding(DefaultParameterSetName = '/recon/queries/actions/v1:get')]
    param(
        [Parameter(ParameterSetName = '/recon/entities/actions/v1:get', Mandatory = $true, Position = 1)]
        [ValidatePattern('^\w{8}-\w{4}-\w{4}-\w{4}-\w{12}$')]
        [array] $Ids,

        [Parameter(ParameterSetName = '/recon/queries/actions/v1:get', Position = 1)]
        [ValidateScript({ Test-FqlStatement $_ })]
        [string] $Filter,

        [Parameter(ParameterSetName = '/recon/queries/actions/v1:get', Position = 2)]
        [string] $Query,

        [Parameter(ParameterSetName = '/recon/queries/actions/v1:get', Position = 3)]
        [string] $Sort,

        [Parameter(ParameterSetName = '/recon/queries/actions/v1:get', Position = 4)]
        [int] $Limit,

        [Parameter(ParameterSetName = '/recon/queries/actions/v1:get', Position = 5)]
        [int] $Offset,

        [Parameter(ParameterSetName = '/recon/queries/actions/v1:get')]
        [switch] $Detailed,

        [Parameter(ParameterSetName = '/recon/queries/actions/v1:get')]
        [switch] $All,

        [Parameter(ParameterSetName = '/recon/queries/actions/v1:get')]
        [switch] $Total
    )
    begin {
        $Fields = @{ Query = 'q' }
    }
    process {
        $Param = @{
            Command  = $MyInvocation.MyCommand.Name
            Endpoint = $PSCmdlet.ParameterSetName
            Inputs   = Update-FieldName -Fields $Fields -Inputs $PSBoundParameters
            Format   = @{ Query = @('limit', 'ids', 'sort', 'q', 'offset', 'filter') }
        }
        Invoke-Falcon @Param
    }
}
function Get-FalconReconNotification {
    [CmdletBinding(DefaultParameterSetName = '/recon/queries/notifications/v1:get')]
    param(
        [Parameter(ParameterSetName = '/recon/entities/notifications/v1:get', Mandatory = $true, Position = 1)]
        [Parameter(ParameterSetName = '/recon/entities/notifications-detailed/v1:get', Mandatory = $true,
            Position = 1)]
        [Parameter(ParameterSetName = '/recon/entities/notifications-translated/v1:get', Mandatory = $true,
            Position = 1)]
        [Parameter(ParameterSetName = '/recon/entities/notifications-detailed-translated/v1:get',
            Mandatory = $true,Position = 1)]
        [ValidatePattern('^\w{76}$')]
        [array] $Ids,

        [Parameter(ParameterSetName = '/recon/queries/notifications/v1:get', Position = 1)]
        [ValidateScript({ Test-FqlStatement $_ })]
        [string] $Filter,

        [Parameter(ParameterSetName = '/recon/queries/notifications/v1:get', Position = 2)]
        [string] $Query,

        [Parameter(ParameterSetName = '/recon/queries/notifications/v1:get', Position = 3)]
        [ValidateSet('created_date|asc', 'created_date|desc', 'updated_date|asc', 'updated_date|desc')]
        [string] $Sort,

        [Parameter(ParameterSetName = '/recon/queries/notifications/v1:get', Position = 4)]
        [ValidateRange(1,500)]
        [int] $Limit,

        [Parameter(ParameterSetName = '/recon/queries/notifications/v1:get', Position = 5)]
        [int] $Offset,

        [Parameter(ParameterSetName = '/recon/queries/notifications/v1:get')]
        [switch] $Detailed,

        [Parameter(ParameterSetName = '/recon/queries/notifications/v1:get')]
        [switch] $All,

        [Parameter(ParameterSetName = '/recon/queries/notifications/v1:get')]
        [switch] $Total,

        [Parameter(ParameterSetName = '/recon/entities/notifications-detailed/v1:get', Mandatory = $true)]
        [switch] $Intel,

        [Parameter(ParameterSetName = '/recon/entities/notifications-translated/v1:get', Mandatory = $true)]
        [switch] $Translate,

        [Parameter(ParameterSetName = '/recon/entities/notifications-detailed-translated/v1:get',
            Mandatory = $true)]
        [switch] $Combined
    )
    begin {
        $Fields = @{ Query = 'q' }
    }
    process {
        $Param = @{
            Command  = $MyInvocation.MyCommand.Name
            Endpoint = $PSCmdlet.ParameterSetName
            Inputs   = Update-FieldName -Fields $Fields -Inputs $PSBoundParameters
            Format   = @{ Query = @('limit', 'ids', 'sort', 'q', 'offset', 'filter') }
        }
        Invoke-Falcon @Param
    }
}
function Get-FalconReconRule {
    [CmdletBinding(DefaultParameterSetName = '/recon/queries/rules/v1:get')]
    param(
        [Parameter(ParameterSetName = '/recon/entities/rules/v1:get', Mandatory = $true, Position = 1)]
        [ValidatePattern('^\w{8}-\w{4}-\w{4}-\w{4}-\w{12}$')]
        [array] $Ids,

        [Parameter(ParameterSetName = '/recon/queries/rules/v1:get', Position = 1)]
        [ValidateScript({ Test-FqlStatement $_ })]
        [string] $Filter,

        [Parameter(ParameterSetName = '/recon/queries/rules/v1:get', Position = 2)]
        [string] $Query,

        [Parameter(ParameterSetName = '/recon/queries/rules/v1:get', Position = 3)]
        [ValidateSet('created_timestamp|asc', 'created_timestamp|desc', 'last_updated_timestamp|asc',
            'last_updated_timestamp|desc')]
        [string] $Sort,

        [Parameter(ParameterSetName = '/recon/queries/rules/v1:get', Position = 4)]
        [ValidateRange(1,500)]
        [int] $Limit,

        [Parameter(ParameterSetName = '/recon/queries/rules/v1:get', Position = 5)]
        [int] $Offset,

        [Parameter(ParameterSetName = '/recon/queries/rules/v1:get')]
        [switch] $Detailed,

        [Parameter(ParameterSetName = '/recon/queries/rules/v1:get')]
        [switch] $All,

        [Parameter(ParameterSetName = '/recon/queries/rules/v1:get')]
        [switch] $Total
    )
    begin {
        $Fields = @{ Query = 'q' }
    }
    process {
        $Param = @{
            Command  = $MyInvocation.MyCommand.Name
            Endpoint = $PSCmdlet.ParameterSetName
            Inputs   = Update-FieldName -Fields $Fields -Inputs $PSBoundParameters
            Format   = @{ Query = @('limit', 'ids', 'q', 'sort', 'offset', 'filter') }
        }
        Invoke-Falcon @Param
    }
}
function Get-FalconReconRulePreview {
    [CmdletBinding(DefaultParameterSetName = '/recon/aggregates/rules-preview/GET/v1:post')]
    param(
        [Parameter(ParameterSetName = '/recon/aggregates/rules-preview/GET/v1:post', Mandatory = $true,
            Position = 1)]
        [string] $Topic,

        [Parameter(ParameterSetName = '/recon/aggregates/rules-preview/GET/v1:post', Mandatory = $true,
            Position = 2)]
        [ValidateScript({ Test-FqlStatement $_ })]
        [string] $Filter
    )
    process {
        $Param = @{
            Command  = $MyInvocation.MyCommand.Name
            Endpoint = $PSCmdlet.ParameterSetName
            Inputs   = $PSBoundParameters
            Format   = @{ Body = @{ root = @('filter', 'topic') }}
        }
        Invoke-Falcon @Param
    }
}
function New-FalconReconAction {
    [CmdletBinding(DefaultParameterSetName = '/recon/entities/actions/v1:post')]
    param(
        [Parameter(ParameterSetName = '/recon/entities/actions/v1:post', Mandatory = $true, Position = 1)]
        [ValidatePattern('^\w{8}-\w{4}-\w{4}-\w{4}-\w{12}$')]
        [string] $RuleId,

        [Parameter(ParameterSetName = '/recon/entities/actions/v1:post', Mandatory = $true, Position = 2)]
        [ValidateSet('email')]
        [string] $Type,

        [Parameter(ParameterSetName = '/recon/entities/actions/v1:post', Mandatory = $true, Position = 3)]
        [ValidateSet('asap', 'daily', 'weekly')]
        [string] $Frequency,

        [Parameter(ParameterSetName = '/recon/entities/actions/v1:post', Mandatory = $true, Position = 4)]
        [ValidateScript({
            if ((Test-RegexValue $_) -eq 'email') { $true } else { throw "'$_' is not a valid email address." }
        })]
        [array] $Recipients
    )
    begin {
        $Fields = @{ RuleId = 'rule_id' }
    }
    process {
        $Param = @{
            Command  = $MyInvocation.MyCommand.Name
            Endpoint = $PSCmdlet.ParameterSetName
            Inputs   = Update-FieldName -Fields $Fields -Inputs $PSBoundParameters
            Format   = @{
                Body = @{
                    root    = @('rule_id')
                    actions = @('recipients', 'type', 'frequency')
                }
            }
        }
        Invoke-Falcon @Param
    }
}
function New-FalconReconRule {
    [CmdletBinding(DefaultParameterSetName = '/recon/entities/rules/v1:post')]
    param(
        [Parameter(ParameterSetName = 'array', Mandatory = $true, Position = 1)]
        [ValidateScript({
            foreach ($Object in $_) {
                $Param = @{
                    Object   = $Object
                    Command  = 'New-FalconReconRule'
                    Endpoint = '/recon/entities/rules/v1:post'
                    Required = @('name', 'topic', 'filter', 'priority', 'permissions')
                    Content  = @('permissions', 'priority', 'topic')
                }
                Confirm-Parameter @Param
            }
        })]
        [array] $Array,

        [Parameter(ParameterSetName = '/recon/entities/rules/v1:post', Mandatory = $true, Position = 1)]
        [string] $Name,

        [Parameter(ParameterSetName = '/recon/entities/rules/v1:post', Mandatory = $true, Position = 2)]
        [ValidateSet('SA_ALIAS', 'SA_AUTHOR', 'SA_BIN', 'SA_BRAND_PRODUCT', 'SA_CUSTOM', 'SA_CVE', 'SA_DOMAIN',
            'SA_EMAIL', 'SA_IP', 'SA_THIRD_PARTY', 'SA_VIP')]
        [string] $Topic,

        [Parameter(ParameterSetName = '/recon/entities/rules/v1:post', Mandatory = $true, Position = 3)]
        [ValidateScript({ Test-FqlStatement $_ })]
        [string] $Filter,

        [Parameter(ParameterSetName = '/recon/entities/rules/v1:post', Mandatory = $true, Position = 4)]
        [ValidateSet('high', 'medium', 'low')]
        [string] $Priority,

        [Parameter(ParameterSetName = '/recon/entities/rules/v1:post', Mandatory = $true, Position = 5)]
        [ValidateSet('private', 'public')]
        [string] $Permissions
    )
    process {
        if ($PSBoundParameters.Array) {
            if (!$Script:Falcon.Hostname) { Request-FalconToken }
            $Param = @{
                Path    = "$($Script:Falcon.Hostname)/recon/entities/rules/v1"
                Method  = 'post'
                Headers = @{
                    Accept      = 'application/json'
                    ContentType = 'application/json'
                }
            }
            for ($i = 0; $i -lt ($PSBoundParameters.Array | Measure-Object).Count; $i += 500) {
                # Create rules in batches of 500
                $Group = $PSBoundParameters.Array[$i..($i + 499)]
                $Param['Body'] = ConvertTo-Json -InputObject @( $Group ) -Depth 8
                $Request = $Script:Falcon.Api.Invoke($Param)
                Write-Result -Request $Request
            }
        } else {
            $Param = @{
                Command  = $MyInvocation.MyCommand.Name
                Endpoint = $PSCmdlet.ParameterSetName
                Inputs   = $PSBoundParameters
                Format   = @{ Body = @{ root = @('permissions', 'priority', 'name', 'filter', 'topic') }}
            }
            Invoke-Falcon @Param
        }
    }
}
function Remove-FalconReconAction {
    [CmdletBinding(DefaultParameterSetName = '/recon/entities/actions/v1:delete')]
    param(
        [Parameter(ParameterSetName = '/recon/entities/actions/v1:delete', Mandatory = $true,
            ValueFromPipelineByPropertyName = $true, ValueFromPipeline = $true, Position = 1)]
        [ValidatePattern('^\w{8}-\w{4}-\w{4}-\w{4}-\w{12}$')]
        [string] $Id
    )
    process {
        $Param = @{
            Command  = $MyInvocation.MyCommand.Name
            Endpoint = $PSCmdlet.ParameterSetName
            Inputs   = $PSBoundParameters
            Format   = @{ Query = @('id') }
        }
        Invoke-Falcon @Param
    }
}
function Remove-FalconReconRule {
    [CmdletBinding(DefaultParameterSetName = '/recon/entities/rules/v1:delete')]
    param(
        [Parameter(ParameterSetName = '/recon/entities/rules/v1:delete', Mandatory = $true, Position = 1)]
        [ValidatePattern('^\w{8}-\w{4}-\w{4}-\w{4}-\w{12}$')]
        [array] $Ids
    )
    process {
        $Param = @{
            Command  = $MyInvocation.MyCommand.Name
            Endpoint = $PSCmdlet.ParameterSetName
            Inputs   = $PSBoundParameters
            Format   = @{ Query = @('ids') }
        }
        Invoke-Falcon @Param
    }
}
function Remove-FalconReconNotification {
    [CmdletBinding(DefaultParameterSetName = '/recon/entities/notifications/v1:delete')]
    param(
        [Parameter(ParameterSetName = '/recon/entities/notifications/v1:delete', Mandatory = $true, Position = 1)]
        [ValidatePattern('^\w{76}$')]
        [array] $Ids
    )
    process {
        $Param = @{
            Command  = $MyInvocation.MyCommand.Name
            Endpoint = $PSCmdlet.ParameterSetName
            Inputs   = $PSBoundParameters
            Format   = @{ Query = @('ids') }
        }
        Invoke-Falcon @Param
    }
}