alertruletemplates

package
v0.20240710.1075622 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 10, 2024 License: MPL-2.0 Imports: 14 Imported by: 0

README

github.com/hashicorp/go-azure-sdk/resource-manager/securityinsights/2024-03-01/alertruletemplates Documentation

The alertruletemplates SDK allows for interaction with the Azure Resource Manager Service securityinsights (API Version 2024-03-01).

This readme covers example usages, but further information on using this SDK can be found in the project root.

Import Path

import "github.com/hashicorp/go-azure-sdk/resource-manager/securityinsights/2024-03-01/alertruletemplates"

Client Initialization

client := alertruletemplates.NewAlertRuleTemplatesClientWithBaseURI("https://management.azure.com")
client.Client.Authorizer = authorizer

Example Usage: AlertRuleTemplatesClient.Get

ctx := context.TODO()
id := alertruletemplates.NewAlertRuleTemplateID("12345678-1234-9876-4563-123456789012", "example-resource-group", "workspaceValue", "alertRuleTemplateIdValue")

read, err := client.Get(ctx, id)
if err != nil {
	// handle the error
}
if model := read.Model; model != nil {
	// do something with the model/response object
}

Example Usage: AlertRuleTemplatesClient.List

ctx := context.TODO()
id := alertruletemplates.NewWorkspaceID("12345678-1234-9876-4563-123456789012", "example-resource-group", "workspaceValue")

// alternatively `client.List(ctx, id)` can be used to do batched pagination
items, err := client.ListComplete(ctx, id)
if err != nil {
	// handle the error
}
for _, item := range items {
	// do something
}

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func PossibleValuesForAlertProperty

func PossibleValuesForAlertProperty() []string

func PossibleValuesForAlertRuleKind

func PossibleValuesForAlertRuleKind() []string

func PossibleValuesForAlertSeverity

func PossibleValuesForAlertSeverity() []string

func PossibleValuesForAttackTactic

func PossibleValuesForAttackTactic() []string

func PossibleValuesForEntityMappingType

func PossibleValuesForEntityMappingType() []string

func PossibleValuesForEventGroupingAggregationKind

func PossibleValuesForEventGroupingAggregationKind() []string

func PossibleValuesForMicrosoftSecurityProductName

func PossibleValuesForMicrosoftSecurityProductName() []string

func PossibleValuesForTemplateStatus

func PossibleValuesForTemplateStatus() []string

func PossibleValuesForTriggerOperator

func PossibleValuesForTriggerOperator() []string

func ValidateAlertRuleTemplateID

func ValidateAlertRuleTemplateID(input interface{}, key string) (warnings []string, errors []error)

ValidateAlertRuleTemplateID checks that 'input' can be parsed as a Alert Rule Template ID

func ValidateWorkspaceID

func ValidateWorkspaceID(input interface{}, key string) (warnings []string, errors []error)

ValidateWorkspaceID checks that 'input' can be parsed as a Workspace ID

Types

type AlertDetailsOverride

type AlertDetailsOverride struct {
	AlertDescriptionFormat  *string                 `json:"alertDescriptionFormat,omitempty"`
	AlertDisplayNameFormat  *string                 `json:"alertDisplayNameFormat,omitempty"`
	AlertDynamicProperties  *[]AlertPropertyMapping `json:"alertDynamicProperties,omitempty"`
	AlertSeverityColumnName *string                 `json:"alertSeverityColumnName,omitempty"`
	AlertTacticsColumnName  *string                 `json:"alertTacticsColumnName,omitempty"`
}

type AlertProperty

type AlertProperty string
const (
	AlertPropertyAlertLink            AlertProperty = "AlertLink"
	AlertPropertyConfidenceLevel      AlertProperty = "ConfidenceLevel"
	AlertPropertyConfidenceScore      AlertProperty = "ConfidenceScore"
	AlertPropertyExtendedLinks        AlertProperty = "ExtendedLinks"
	AlertPropertyProductComponentName AlertProperty = "ProductComponentName"
	AlertPropertyProductName          AlertProperty = "ProductName"
	AlertPropertyProviderName         AlertProperty = "ProviderName"
	AlertPropertyRemediationSteps     AlertProperty = "RemediationSteps"
	AlertPropertyTechniques           AlertProperty = "Techniques"
)

func (*AlertProperty) UnmarshalJSON

func (s *AlertProperty) UnmarshalJSON(bytes []byte) error

type AlertPropertyMapping

type AlertPropertyMapping struct {
	AlertProperty *AlertProperty `json:"alertProperty,omitempty"`
	Value         *string        `json:"value,omitempty"`
}

type AlertRuleKind

type AlertRuleKind string
const (
	AlertRuleKindFusion                            AlertRuleKind = "Fusion"
	AlertRuleKindMicrosoftSecurityIncidentCreation AlertRuleKind = "MicrosoftSecurityIncidentCreation"
	AlertRuleKindScheduled                         AlertRuleKind = "Scheduled"
)

func (*AlertRuleKind) UnmarshalJSON

func (s *AlertRuleKind) UnmarshalJSON(bytes []byte) error

type AlertRuleTemplate

type AlertRuleTemplate interface {
}

type AlertRuleTemplateDataSource

type AlertRuleTemplateDataSource struct {
	ConnectorId *string   `json:"connectorId,omitempty"`
	DataTypes   *[]string `json:"dataTypes,omitempty"`
}

type AlertRuleTemplateId

type AlertRuleTemplateId struct {
	SubscriptionId      string
	ResourceGroupName   string
	WorkspaceName       string
	AlertRuleTemplateId string
}

AlertRuleTemplateId is a struct representing the Resource ID for a Alert Rule Template

func NewAlertRuleTemplateID

func NewAlertRuleTemplateID(subscriptionId string, resourceGroupName string, workspaceName string, alertRuleTemplateId string) AlertRuleTemplateId

NewAlertRuleTemplateID returns a new AlertRuleTemplateId struct

func ParseAlertRuleTemplateID

func ParseAlertRuleTemplateID(input string) (*AlertRuleTemplateId, error)

ParseAlertRuleTemplateID parses 'input' into a AlertRuleTemplateId

func ParseAlertRuleTemplateIDInsensitively

func ParseAlertRuleTemplateIDInsensitively(input string) (*AlertRuleTemplateId, error)

ParseAlertRuleTemplateIDInsensitively parses 'input' case-insensitively into a AlertRuleTemplateId note: this method should only be used for API response data and not user input

func (*AlertRuleTemplateId) FromParseResult

func (id *AlertRuleTemplateId) FromParseResult(input resourceids.ParseResult) error

func (AlertRuleTemplateId) ID

func (id AlertRuleTemplateId) ID() string

ID returns the formatted Alert Rule Template ID

func (AlertRuleTemplateId) Segments

func (id AlertRuleTemplateId) Segments() []resourceids.Segment

Segments returns a slice of Resource ID Segments which comprise this Alert Rule Template ID

func (AlertRuleTemplateId) String

func (id AlertRuleTemplateId) String() string

String returns a human-readable description of this Alert Rule Template ID

type AlertRuleTemplateOperationPredicate

type AlertRuleTemplateOperationPredicate struct {
}

func (AlertRuleTemplateOperationPredicate) Matches

type AlertRuleTemplatesClient

type AlertRuleTemplatesClient struct {
	Client *resourcemanager.Client
}

func NewAlertRuleTemplatesClientWithBaseURI

func NewAlertRuleTemplatesClientWithBaseURI(sdkApi sdkEnv.Api) (*AlertRuleTemplatesClient, error)

func (AlertRuleTemplatesClient) Get

Get ...

func (AlertRuleTemplatesClient) List

List ...

func (AlertRuleTemplatesClient) ListComplete

ListComplete retrieves all the results into a single object

func (AlertRuleTemplatesClient) ListCompleteMatchingPredicate

func (c AlertRuleTemplatesClient) ListCompleteMatchingPredicate(ctx context.Context, id WorkspaceId, predicate AlertRuleTemplateOperationPredicate) (result ListCompleteResult, err error)

ListCompleteMatchingPredicate retrieves all the results and then applies the predicate

type AlertSeverity

type AlertSeverity string
const (
	AlertSeverityHigh          AlertSeverity = "High"
	AlertSeverityInformational AlertSeverity = "Informational"
	AlertSeverityLow           AlertSeverity = "Low"
	AlertSeverityMedium        AlertSeverity = "Medium"
)

func (*AlertSeverity) UnmarshalJSON

func (s *AlertSeverity) UnmarshalJSON(bytes []byte) error

type AttackTactic

type AttackTactic string
const (
	AttackTacticCollection              AttackTactic = "Collection"
	AttackTacticCommandAndControl       AttackTactic = "CommandAndControl"
	AttackTacticCredentialAccess        AttackTactic = "CredentialAccess"
	AttackTacticDefenseEvasion          AttackTactic = "DefenseEvasion"
	AttackTacticDiscovery               AttackTactic = "Discovery"
	AttackTacticExecution               AttackTactic = "Execution"
	AttackTacticExfiltration            AttackTactic = "Exfiltration"
	AttackTacticImpact                  AttackTactic = "Impact"
	AttackTacticImpairProcessControl    AttackTactic = "ImpairProcessControl"
	AttackTacticInhibitResponseFunction AttackTactic = "InhibitResponseFunction"
	AttackTacticInitialAccess           AttackTactic = "InitialAccess"
	AttackTacticLateralMovement         AttackTactic = "LateralMovement"
	AttackTacticPersistence             AttackTactic = "Persistence"
	AttackTacticPreAttack               AttackTactic = "PreAttack"
	AttackTacticPrivilegeEscalation     AttackTactic = "PrivilegeEscalation"
	AttackTacticReconnaissance          AttackTactic = "Reconnaissance"
	AttackTacticResourceDevelopment     AttackTactic = "ResourceDevelopment"
)

func (*AttackTactic) UnmarshalJSON

func (s *AttackTactic) UnmarshalJSON(bytes []byte) error

type EntityMapping

type EntityMapping struct {
	EntityType    *EntityMappingType `json:"entityType,omitempty"`
	FieldMappings *[]FieldMapping    `json:"fieldMappings,omitempty"`
}

type EntityMappingType

type EntityMappingType string
const (
	EntityMappingTypeAccount          EntityMappingType = "Account"
	EntityMappingTypeAzureResource    EntityMappingType = "AzureResource"
	EntityMappingTypeCloudApplication EntityMappingType = "CloudApplication"
	EntityMappingTypeDNS              EntityMappingType = "DNS"
	EntityMappingTypeFile             EntityMappingType = "File"
	EntityMappingTypeFileHash         EntityMappingType = "FileHash"
	EntityMappingTypeHost             EntityMappingType = "Host"
	EntityMappingTypeIP               EntityMappingType = "IP"
	EntityMappingTypeMailCluster      EntityMappingType = "MailCluster"
	EntityMappingTypeMailMessage      EntityMappingType = "MailMessage"
	EntityMappingTypeMailbox          EntityMappingType = "Mailbox"
	EntityMappingTypeMalware          EntityMappingType = "Malware"
	EntityMappingTypeProcess          EntityMappingType = "Process"
	EntityMappingTypeRegistryKey      EntityMappingType = "RegistryKey"
	EntityMappingTypeRegistryValue    EntityMappingType = "RegistryValue"
	EntityMappingTypeSecurityGroup    EntityMappingType = "SecurityGroup"
	EntityMappingTypeSubmissionMail   EntityMappingType = "SubmissionMail"
	EntityMappingTypeURL              EntityMappingType = "URL"
)

func (*EntityMappingType) UnmarshalJSON

func (s *EntityMappingType) UnmarshalJSON(bytes []byte) error

type EventGroupingAggregationKind

type EventGroupingAggregationKind string
const (
	EventGroupingAggregationKindAlertPerResult EventGroupingAggregationKind = "AlertPerResult"
	EventGroupingAggregationKindSingleAlert    EventGroupingAggregationKind = "SingleAlert"
)

func (*EventGroupingAggregationKind) UnmarshalJSON

func (s *EventGroupingAggregationKind) UnmarshalJSON(bytes []byte) error

type EventGroupingSettings

type EventGroupingSettings struct {
	AggregationKind *EventGroupingAggregationKind `json:"aggregationKind,omitempty"`
}

type FieldMapping

type FieldMapping struct {
	ColumnName *string `json:"columnName,omitempty"`
	Identifier *string `json:"identifier,omitempty"`
}

type FusionAlertRuleTemplate

type FusionAlertRuleTemplate struct {
	Properties *FusionAlertRuleTemplateProperties `json:"properties,omitempty"`

	// Fields inherited from AlertRuleTemplate
	Id         *string                `json:"id,omitempty"`
	Name       *string                `json:"name,omitempty"`
	SystemData *systemdata.SystemData `json:"systemData,omitempty"`
	Type       *string                `json:"type,omitempty"`
}

func (FusionAlertRuleTemplate) MarshalJSON

func (s FusionAlertRuleTemplate) MarshalJSON() ([]byte, error)

type FusionAlertRuleTemplateProperties

type FusionAlertRuleTemplateProperties struct {
	AlertRulesCreatedByTemplateCount *int64                         `json:"alertRulesCreatedByTemplateCount,omitempty"`
	CreatedDateUTC                   *string                        `json:"createdDateUTC,omitempty"`
	Description                      *string                        `json:"description,omitempty"`
	DisplayName                      *string                        `json:"displayName,omitempty"`
	LastUpdatedDateUTC               *string                        `json:"lastUpdatedDateUTC,omitempty"`
	RequiredDataConnectors           *[]AlertRuleTemplateDataSource `json:"requiredDataConnectors,omitempty"`
	Severity                         *AlertSeverity                 `json:"severity,omitempty"`
	Status                           *TemplateStatus                `json:"status,omitempty"`
	Tactics                          *[]AttackTactic                `json:"tactics,omitempty"`
	Techniques                       *[]string                      `json:"techniques,omitempty"`
}

func (*FusionAlertRuleTemplateProperties) GetCreatedDateUTCAsTime

func (o *FusionAlertRuleTemplateProperties) GetCreatedDateUTCAsTime() (*time.Time, error)

func (*FusionAlertRuleTemplateProperties) GetLastUpdatedDateUTCAsTime

func (o *FusionAlertRuleTemplateProperties) GetLastUpdatedDateUTCAsTime() (*time.Time, error)

func (*FusionAlertRuleTemplateProperties) SetCreatedDateUTCAsTime

func (o *FusionAlertRuleTemplateProperties) SetCreatedDateUTCAsTime(input time.Time)

func (*FusionAlertRuleTemplateProperties) SetLastUpdatedDateUTCAsTime

func (o *FusionAlertRuleTemplateProperties) SetLastUpdatedDateUTCAsTime(input time.Time)

type GetOperationResponse

type GetOperationResponse struct {
	HttpResponse *http.Response
	OData        *odata.OData
	Model        *AlertRuleTemplate
}

type ListCompleteResult

type ListCompleteResult struct {
	LatestHttpResponse *http.Response
	Items              []AlertRuleTemplate
}

type ListCustomPager added in v0.20240628.1153531

type ListCustomPager struct {
	NextLink *odata.Link `json:"nextLink"`
}
func (p *ListCustomPager) NextPageLink() *odata.Link

type ListOperationResponse

type ListOperationResponse struct {
	HttpResponse *http.Response
	OData        *odata.OData
	Model        *[]AlertRuleTemplate
}

type MicrosoftSecurityIncidentCreationAlertRuleTemplate

type MicrosoftSecurityIncidentCreationAlertRuleTemplate struct {
	Properties *MicrosoftSecurityIncidentCreationAlertRuleTemplateProperties `json:"properties,omitempty"`

	// Fields inherited from AlertRuleTemplate
	Id         *string                `json:"id,omitempty"`
	Name       *string                `json:"name,omitempty"`
	SystemData *systemdata.SystemData `json:"systemData,omitempty"`
	Type       *string                `json:"type,omitempty"`
}

func (MicrosoftSecurityIncidentCreationAlertRuleTemplate) MarshalJSON

type MicrosoftSecurityIncidentCreationAlertRuleTemplateProperties

type MicrosoftSecurityIncidentCreationAlertRuleTemplateProperties struct {
	AlertRulesCreatedByTemplateCount *int64                         `json:"alertRulesCreatedByTemplateCount,omitempty"`
	CreatedDateUTC                   *string                        `json:"createdDateUTC,omitempty"`
	Description                      *string                        `json:"description,omitempty"`
	DisplayName                      *string                        `json:"displayName,omitempty"`
	DisplayNamesExcludeFilter        *[]string                      `json:"displayNamesExcludeFilter,omitempty"`
	DisplayNamesFilter               *[]string                      `json:"displayNamesFilter,omitempty"`
	LastUpdatedDateUTC               *string                        `json:"lastUpdatedDateUTC,omitempty"`
	ProductFilter                    *MicrosoftSecurityProductName  `json:"productFilter,omitempty"`
	RequiredDataConnectors           *[]AlertRuleTemplateDataSource `json:"requiredDataConnectors,omitempty"`
	SeveritiesFilter                 *[]AlertSeverity               `json:"severitiesFilter,omitempty"`
	Status                           *TemplateStatus                `json:"status,omitempty"`
}

func (*MicrosoftSecurityIncidentCreationAlertRuleTemplateProperties) GetCreatedDateUTCAsTime

func (*MicrosoftSecurityIncidentCreationAlertRuleTemplateProperties) GetLastUpdatedDateUTCAsTime

func (o *MicrosoftSecurityIncidentCreationAlertRuleTemplateProperties) GetLastUpdatedDateUTCAsTime() (*time.Time, error)

func (*MicrosoftSecurityIncidentCreationAlertRuleTemplateProperties) SetCreatedDateUTCAsTime

func (*MicrosoftSecurityIncidentCreationAlertRuleTemplateProperties) SetLastUpdatedDateUTCAsTime

func (o *MicrosoftSecurityIncidentCreationAlertRuleTemplateProperties) SetLastUpdatedDateUTCAsTime(input time.Time)

type MicrosoftSecurityProductName

type MicrosoftSecurityProductName string
const (
	MicrosoftSecurityProductNameAzureActiveDirectoryIdentityProtection MicrosoftSecurityProductName = "Azure Active Directory Identity Protection"
	MicrosoftSecurityProductNameAzureAdvancedThreatProtection          MicrosoftSecurityProductName = "Azure Advanced Threat Protection"
	MicrosoftSecurityProductNameAzureSecurityCenter                    MicrosoftSecurityProductName = "Azure Security Center"
	MicrosoftSecurityProductNameAzureSecurityCenterForIoT              MicrosoftSecurityProductName = "Azure Security Center for IoT"
	MicrosoftSecurityProductNameMicrosoftCloudAppSecurity              MicrosoftSecurityProductName = "Microsoft Cloud App Security"
)

func (*MicrosoftSecurityProductName) UnmarshalJSON

func (s *MicrosoftSecurityProductName) UnmarshalJSON(bytes []byte) error

type RawAlertRuleTemplateImpl

type RawAlertRuleTemplateImpl struct {
	Type   string
	Values map[string]interface{}
}

RawAlertRuleTemplateImpl is returned when the Discriminated Value doesn't match any of the defined types NOTE: this should only be used when a type isn't defined for this type of Object (as a workaround) and is used only for Deserialization (e.g. this cannot be used as a Request Payload).

type ScheduledAlertRuleTemplate

type ScheduledAlertRuleTemplate struct {
	Properties *ScheduledAlertRuleTemplateProperties `json:"properties,omitempty"`

	// Fields inherited from AlertRuleTemplate
	Id         *string                `json:"id,omitempty"`
	Name       *string                `json:"name,omitempty"`
	SystemData *systemdata.SystemData `json:"systemData,omitempty"`
	Type       *string                `json:"type,omitempty"`
}

func (ScheduledAlertRuleTemplate) MarshalJSON

func (s ScheduledAlertRuleTemplate) MarshalJSON() ([]byte, error)

type ScheduledAlertRuleTemplateProperties

type ScheduledAlertRuleTemplateProperties struct {
	AlertDetailsOverride             *AlertDetailsOverride          `json:"alertDetailsOverride,omitempty"`
	AlertRulesCreatedByTemplateCount *int64                         `json:"alertRulesCreatedByTemplateCount,omitempty"`
	CreatedDateUTC                   *string                        `json:"createdDateUTC,omitempty"`
	CustomDetails                    *map[string]string             `json:"customDetails,omitempty"`
	Description                      *string                        `json:"description,omitempty"`
	DisplayName                      *string                        `json:"displayName,omitempty"`
	EntityMappings                   *[]EntityMapping               `json:"entityMappings,omitempty"`
	EventGroupingSettings            *EventGroupingSettings         `json:"eventGroupingSettings,omitempty"`
	LastUpdatedDateUTC               *string                        `json:"lastUpdatedDateUTC,omitempty"`
	Query                            *string                        `json:"query,omitempty"`
	QueryFrequency                   *string                        `json:"queryFrequency,omitempty"`
	QueryPeriod                      *string                        `json:"queryPeriod,omitempty"`
	RequiredDataConnectors           *[]AlertRuleTemplateDataSource `json:"requiredDataConnectors,omitempty"`
	Severity                         *AlertSeverity                 `json:"severity,omitempty"`
	Status                           *TemplateStatus                `json:"status,omitempty"`
	Tactics                          *[]AttackTactic                `json:"tactics,omitempty"`
	Techniques                       *[]string                      `json:"techniques,omitempty"`
	TriggerOperator                  *TriggerOperator               `json:"triggerOperator,omitempty"`
	TriggerThreshold                 *int64                         `json:"triggerThreshold,omitempty"`
	Version                          *string                        `json:"version,omitempty"`
}

func (*ScheduledAlertRuleTemplateProperties) GetCreatedDateUTCAsTime

func (o *ScheduledAlertRuleTemplateProperties) GetCreatedDateUTCAsTime() (*time.Time, error)

func (*ScheduledAlertRuleTemplateProperties) GetLastUpdatedDateUTCAsTime

func (o *ScheduledAlertRuleTemplateProperties) GetLastUpdatedDateUTCAsTime() (*time.Time, error)

func (*ScheduledAlertRuleTemplateProperties) SetCreatedDateUTCAsTime

func (o *ScheduledAlertRuleTemplateProperties) SetCreatedDateUTCAsTime(input time.Time)

func (*ScheduledAlertRuleTemplateProperties) SetLastUpdatedDateUTCAsTime

func (o *ScheduledAlertRuleTemplateProperties) SetLastUpdatedDateUTCAsTime(input time.Time)

type TemplateStatus

type TemplateStatus string
const (
	TemplateStatusAvailable    TemplateStatus = "Available"
	TemplateStatusInstalled    TemplateStatus = "Installed"
	TemplateStatusNotAvailable TemplateStatus = "NotAvailable"
)

func (*TemplateStatus) UnmarshalJSON

func (s *TemplateStatus) UnmarshalJSON(bytes []byte) error

type TriggerOperator

type TriggerOperator string
const (
	TriggerOperatorEqual       TriggerOperator = "Equal"
	TriggerOperatorGreaterThan TriggerOperator = "GreaterThan"
	TriggerOperatorLessThan    TriggerOperator = "LessThan"
	TriggerOperatorNotEqual    TriggerOperator = "NotEqual"
)

func (*TriggerOperator) UnmarshalJSON

func (s *TriggerOperator) UnmarshalJSON(bytes []byte) error

type WorkspaceId

type WorkspaceId struct {
	SubscriptionId    string
	ResourceGroupName string
	WorkspaceName     string
}

WorkspaceId is a struct representing the Resource ID for a Workspace

func NewWorkspaceID

func NewWorkspaceID(subscriptionId string, resourceGroupName string, workspaceName string) WorkspaceId

NewWorkspaceID returns a new WorkspaceId struct

func ParseWorkspaceID

func ParseWorkspaceID(input string) (*WorkspaceId, error)

ParseWorkspaceID parses 'input' into a WorkspaceId

func ParseWorkspaceIDInsensitively

func ParseWorkspaceIDInsensitively(input string) (*WorkspaceId, error)

ParseWorkspaceIDInsensitively parses 'input' case-insensitively into a WorkspaceId note: this method should only be used for API response data and not user input

func (*WorkspaceId) FromParseResult

func (id *WorkspaceId) FromParseResult(input resourceids.ParseResult) error

func (WorkspaceId) ID

func (id WorkspaceId) ID() string

ID returns the formatted Workspace ID

func (WorkspaceId) Segments

func (id WorkspaceId) Segments() []resourceids.Segment

Segments returns a slice of Resource ID Segments which comprise this Workspace ID

func (WorkspaceId) String

func (id WorkspaceId) String() string

String returns a human-readable description of this Workspace ID

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL