@@ -17,6 +17,7 @@ import (
17
17
const (
18
18
DefaultURL = "https://ntfy.sh"
19
19
DefaultPriority = 3
20
+ TokenPrefix = "tk_"
20
21
)
21
22
22
23
// AlertProvider is the configuration necessary for sending an alert using Slack
@@ -32,6 +33,20 @@ type AlertProvider struct {
32
33
33
34
// DefaultAlert is the default alert configuration to use for endpoints with an alert of the appropriate type
34
35
DefaultAlert * alert.Alert `yaml:"default-alert,omitempty"`
36
+
37
+ // Overrides is a list of Override that may be prioritized over the default configuration
38
+ Overrides []Override `yaml:"overrides,omitempty"`
39
+ }
40
+
41
+ // Override is a case under which the default integration is overridden
42
+ type Override struct {
43
+ Group string `yaml:"group"`
44
+ Topic string `yaml:"topic"`
45
+ URL string `yaml:"url"`
46
+ Priority int `yaml:"priority"`
47
+ Token string `yaml:"token"`
48
+ Email string `yaml:"email"`
49
+ Click string `yaml:"click"`
35
50
}
36
51
37
52
// IsValid returns whether the provider's configuration is valid
@@ -44,21 +59,42 @@ func (provider *AlertProvider) IsValid() bool {
44
59
}
45
60
isTokenValid := true
46
61
if len (provider .Token ) > 0 {
47
- isTokenValid = strings .HasPrefix (provider .Token , "tk_" )
62
+ isTokenValid = strings .HasPrefix (provider .Token , TokenPrefix )
63
+ }
64
+ registeredGroups := make (map [string ]bool )
65
+ if provider .Overrides != nil {
66
+ for _ , override := range provider .Overrides {
67
+ if len (override .Group ) == 0 {
68
+ return false
69
+ }
70
+ if _ , ok := registeredGroups [override .Group ]; ok {
71
+ return false
72
+ }
73
+ if len (override .Token ) > 0 && ! strings .HasPrefix (override .Token , TokenPrefix ) {
74
+ return false
75
+ }
76
+ if override .Priority < 0 || override .Priority >= 6 {
77
+ return false
78
+ }
79
+ registeredGroups [override .Group ] = true
80
+ }
48
81
}
82
+
49
83
return len (provider .URL ) > 0 && len (provider .Topic ) > 0 && provider .Priority > 0 && provider .Priority < 6 && isTokenValid
50
84
}
51
85
52
86
// Send an alert using the provider
53
87
func (provider * AlertProvider ) Send (ep * endpoint.Endpoint , alert * alert.Alert , result * endpoint.Result , resolved bool ) error {
54
- buffer := bytes .NewBuffer (provider .buildRequestBody (ep , alert , result , resolved ))
55
- request , err := http .NewRequest (http .MethodPost , provider .URL , buffer )
88
+ override := provider .getGroupOverride (ep .Group )
89
+ buffer := bytes .NewBuffer (provider .buildRequestBody (ep , alert , result , resolved , override ))
90
+ url := provider .getURL (override )
91
+ request , err := http .NewRequest (http .MethodPost , url , buffer )
56
92
if err != nil {
57
93
return err
58
94
}
59
95
request .Header .Set ("Content-Type" , "application/json" )
60
- if len ( provider .Token ) > 0 {
61
- request .Header .Set ("Authorization" , "Bearer " + provider . Token )
96
+ if token := provider .getToken ( override ); len ( token ) > 0 {
97
+ request .Header .Set ("Authorization" , "Bearer " + token )
62
98
}
63
99
if provider .DisableFirebase {
64
100
request .Header .Set ("Firebase" , "no" )
@@ -89,7 +125,7 @@ type Body struct {
89
125
}
90
126
91
127
// buildRequestBody builds the request body for the provider
92
- func (provider * AlertProvider ) buildRequestBody (ep * endpoint.Endpoint , alert * alert.Alert , result * endpoint.Result , resolved bool ) []byte {
128
+ func (provider * AlertProvider ) buildRequestBody (ep * endpoint.Endpoint , alert * alert.Alert , result * endpoint.Result , resolved bool , override * Override ) []byte {
93
129
var message , formattedConditionResults , tag string
94
130
if resolved {
95
131
tag = "white_check_mark"
@@ -112,13 +148,13 @@ func (provider *AlertProvider) buildRequestBody(ep *endpoint.Endpoint, alert *al
112
148
}
113
149
message += formattedConditionResults
114
150
body , _ := json .Marshal (Body {
115
- Topic : provider .Topic ,
151
+ Topic : provider .getTopic ( override ) ,
116
152
Title : "Gatus: " + ep .DisplayName (),
117
153
Message : message ,
118
154
Tags : []string {tag },
119
- Priority : provider .Priority ,
120
- Email : provider .Email ,
121
- Click : provider .Click ,
155
+ Priority : provider .getPriority ( override ) ,
156
+ Email : provider .getEmail ( override ) ,
157
+ Click : provider .getClick ( override ) ,
122
158
})
123
159
return body
124
160
}
@@ -127,3 +163,56 @@ func (provider *AlertProvider) buildRequestBody(ep *endpoint.Endpoint, alert *al
127
163
func (provider * AlertProvider ) GetDefaultAlert () * alert.Alert {
128
164
return provider .DefaultAlert
129
165
}
166
+
167
+ func (provider * AlertProvider ) getGroupOverride (group string ) * Override {
168
+ if provider .Overrides != nil {
169
+ for _ , override := range provider .Overrides {
170
+ if group == override .Group {
171
+ return & override
172
+ }
173
+ }
174
+ }
175
+ return nil
176
+ }
177
+
178
+ func (provider * AlertProvider ) getTopic (override * Override ) string {
179
+ if override != nil && len (override .Topic ) > 0 {
180
+ return override .Topic
181
+ }
182
+ return provider .Topic
183
+ }
184
+
185
+ func (provider * AlertProvider ) getURL (override * Override ) string {
186
+ if override != nil && len (override .URL ) > 0 {
187
+ return override .URL
188
+ }
189
+ return provider .URL
190
+ }
191
+
192
+ func (provider * AlertProvider ) getPriority (override * Override ) int {
193
+ if override != nil && override .Priority > 0 {
194
+ return override .Priority
195
+ }
196
+ return provider .Priority
197
+ }
198
+
199
+ func (provider * AlertProvider ) getToken (override * Override ) string {
200
+ if override != nil && len (override .Token ) > 0 {
201
+ return override .Token
202
+ }
203
+ return provider .Token
204
+ }
205
+
206
+ func (provider * AlertProvider ) getEmail (override * Override ) string {
207
+ if override != nil && len (override .Email ) > 0 {
208
+ return override .Email
209
+ }
210
+ return provider .Email
211
+ }
212
+
213
+ func (provider * AlertProvider ) getClick (override * Override ) string {
214
+ if override != nil && len (override .Click ) > 0 {
215
+ return override .Click
216
+ }
217
+ return provider .Click
218
+ }
0 commit comments