@@ -8,27 +8,30 @@ package daemon
8
8
// ////////////////////////////////////////////////////////////////////////////////// //
9
9
10
10
import (
11
+ "fmt"
11
12
"os"
12
13
"runtime"
13
- "strings"
14
14
"time"
15
15
16
- "github.com/essentialkaos/ek/v12/cache"
17
- "github.com/essentialkaos/ek/v12/fmtc"
18
- "github.com/essentialkaos/ek/v12/knf"
19
- "github.com/essentialkaos/ek/v12/log"
20
- "github.com/essentialkaos/ek/v12/options"
21
- "github.com/essentialkaos/ek/v12/signal"
22
- "github.com/essentialkaos/ek/v12/support"
23
- "github.com/essentialkaos/ek/v12/support/deps"
24
- "github.com/essentialkaos/ek/v12/terminal"
25
- "github.com/essentialkaos/ek/v12/terminal/tty"
26
- "github.com/essentialkaos/ek/v12/usage"
27
-
28
- knfv "github.com/essentialkaos/ek/v12/knf/validators"
29
- knff "github.com/essentialkaos/ek/v12/knf/validators/fs"
30
- knfn "github.com/essentialkaos/ek/v12/knf/validators/network"
31
- knfr "github.com/essentialkaos/ek/v12/knf/validators/regexp"
16
+ "github.com/essentialkaos/ek/v13/cache"
17
+ "github.com/essentialkaos/ek/v13/cache/memory"
18
+ "github.com/essentialkaos/ek/v13/errutil"
19
+ "github.com/essentialkaos/ek/v13/fmtc"
20
+ "github.com/essentialkaos/ek/v13/knf"
21
+ "github.com/essentialkaos/ek/v13/log"
22
+ "github.com/essentialkaos/ek/v13/options"
23
+ "github.com/essentialkaos/ek/v13/signal"
24
+ "github.com/essentialkaos/ek/v13/support"
25
+ "github.com/essentialkaos/ek/v13/support/deps"
26
+ "github.com/essentialkaos/ek/v13/support/services"
27
+ "github.com/essentialkaos/ek/v13/terminal"
28
+ "github.com/essentialkaos/ek/v13/terminal/tty"
29
+ "github.com/essentialkaos/ek/v13/usage"
30
+
31
+ knfv "github.com/essentialkaos/ek/v13/knf/validators"
32
+ knff "github.com/essentialkaos/ek/v13/knf/validators/fs"
33
+ knfn "github.com/essentialkaos/ek/v13/knf/validators/network"
34
+ knfr "github.com/essentialkaos/ek/v13/knf/validators/regexp"
32
35
33
36
"github.com/essentialkaos/go-badge"
34
37
@@ -42,7 +45,7 @@ import (
42
45
// Basic service info
43
46
const (
44
47
APP = "UpDownBadgeServer"
45
- VER = "1.3.2 "
48
+ VER = "1.4.0 "
46
49
DESC = "Service for generating badges for updown.io checks"
47
50
)
48
51
@@ -97,7 +100,7 @@ var optMap = options.Map{
97
100
98
101
var udAPI * api.API
99
102
var server * fasthttp.Server
100
- var badgeCache * cache.Cache
103
+ var badgeCache cache.Cache
101
104
var badgeGen * badge.Generator
102
105
var badgeStyle string
103
106
var redirectURL string
@@ -125,22 +128,41 @@ func Run(gomod []byte) {
125
128
case options .GetB (OPT_VERB_VER ):
126
129
support .Collect (APP , VER ).
127
130
WithDeps (deps .Extract (gomod )).
131
+ WithServices (services .Collect ("updown-badge-server" )).
128
132
Print ()
129
133
os .Exit (0 )
130
134
case options .GetB (OPT_HELP ):
131
135
genUsage ().Print ()
132
136
os .Exit (0 )
133
137
}
134
138
135
- loadConfig ()
136
- validateConfig ()
137
- configureRuntime ()
138
- registerSignalHandlers ()
139
- setupLogger ()
139
+ err := errutil .Chain (
140
+ loadConfig ,
141
+ validateConfig ,
142
+ configureRuntime ,
143
+ setupSignalHandlers ,
144
+ setupLogger ,
145
+ )
140
146
141
- log .Aux (strings .Repeat ("-" , 80 ))
147
+ if err != nil {
148
+ terminal .Error (err )
149
+ os .Exit (1 )
150
+ }
151
+
152
+ log .Divider ()
142
153
log .Aux ("%s %s starting…" , APP , VER )
143
154
155
+ err = errutil .Chain (
156
+ setupCache ,
157
+ setupGenerator ,
158
+ setupAPIClient ,
159
+ )
160
+
161
+ if err != nil {
162
+ log .Crit (err .Error ())
163
+ os .Exit (1 )
164
+ }
165
+
144
166
start ()
145
167
}
146
168
@@ -159,31 +181,32 @@ func configureUI() {
159
181
}
160
182
161
183
// loadConfig reads and parses configuration file
162
- func loadConfig () {
184
+ func loadConfig () error {
163
185
err := knf .Global (options .GetS (OPT_CONFIG ))
164
186
165
187
if err != nil {
166
- log .Crit (err .Error ())
167
- os .Exit (1 )
188
+ return fmt .Errorf ("Can't load configuration: %w" , err )
168
189
}
190
+
191
+ return nil
169
192
}
170
193
171
194
// validateConfig validates configuration file values
172
- func validateConfig () {
195
+ func validateConfig () error {
173
196
errs := knf .Validate ([]* knf.Validator {
174
- {UPDOWN_API_KEY , knfv .Empty , nil },
175
- {SERVER_PORT , knfv .Empty , nil },
197
+ {UPDOWN_API_KEY , knfv .Set , nil },
198
+ {SERVER_PORT , knfv .Set , nil },
176
199
177
200
{MAIN_MAX_PROCS , knfv .TypeNum , nil },
178
201
{CACHE_PERIOD , knfv .TypeNum , nil },
179
202
{SERVER_PORT , knfv .TypeNum , nil },
180
203
181
204
{BADGE_FONT , knff .Perms , "FRS" },
182
- {BADGE_STYLE , knfv .NotContains , []string {
205
+ {BADGE_STYLE , knfv .SetToAny , []string {
183
206
STYLE_PLASTIC , STYLE_FLAT , STYLE_FLAT_SQUARE ,
184
207
}},
185
208
186
- {UPDOWN_API_KEY , knfv .NotLen , 23 },
209
+ {UPDOWN_API_KEY , knfv .LenEquals , 23 },
187
210
{UPDOWN_API_KEY , knfr .Regexp , "^ro-[0-9A-Za-z]{20}$" },
188
211
189
212
{MAIN_MAX_PROCS , knfv .Less , MIN_PROCS },
@@ -201,57 +224,75 @@ func validateConfig() {
201
224
{LOG_DIR , knff .Perms , "DW" },
202
225
{LOG_DIR , knff .Perms , "DX" },
203
226
204
- {LOG_LEVEL , knfv .NotContains , []string {
227
+ {LOG_LEVEL , knfv .SetToAnyIgnoreCase , []string {
205
228
"debug" , "info" , "warn" , "error" , "crit" ,
206
229
}},
207
230
})
208
231
209
232
if len (errs ) != 0 {
210
- for _ , err := range errs {
211
- log .Crit (err .Error ())
212
- }
213
-
214
- os .Exit (1 )
233
+ return errs [0 ]
215
234
}
235
+
236
+ return nil
216
237
}
217
238
218
239
// configureRuntime configures runtime
219
- func configureRuntime () {
240
+ func configureRuntime () error {
220
241
if ! knf .HasProp (MAIN_MAX_PROCS ) {
221
- return
242
+ return nil
222
243
}
223
244
224
245
runtime .GOMAXPROCS (knf .GetI (MAIN_MAX_PROCS ))
246
+
247
+ return nil
225
248
}
226
249
227
- // registerSignalHandlers registers signal handlers
228
- func registerSignalHandlers () {
250
+ // setupSignalHandlers registers signal handlers
251
+ func setupSignalHandlers () error {
229
252
signal.Handlers {
230
253
signal .TERM : termSignalHandler ,
231
254
signal .INT : intSignalHandler ,
232
255
signal .HUP : hupSignalHandler ,
233
256
}.TrackAsync ()
257
+
258
+ return nil
234
259
}
235
260
236
261
// setupLogger configures logger subsystems
237
- func setupLogger () {
262
+ func setupLogger () error {
238
263
err := log .Set (knf .GetS (LOG_FILE ), knf .GetM (LOG_MODE , 0644 ))
239
264
240
265
if err != nil {
241
- log .Crit (err .Error ())
242
- os .Exit (1 )
266
+ return fmt .Errorf ("Can't setup logger: %w" , err )
243
267
}
244
268
245
269
err = log .MinLevel (knf .GetS (LOG_LEVEL ))
246
270
247
271
if err != nil {
248
- log .Crit (err .Error ())
249
- os .Exit (1 )
272
+ return fmt .Errorf ("Can't setup logger: %w" , err )
250
273
}
274
+
275
+ return nil
251
276
}
252
277
253
- // start configures and starts all subsystems
254
- func start () {
278
+ // setupCache configures in-memory cache
279
+ func setupCache () error {
280
+ var err error
281
+
282
+ badgeCache , err = memory .New (memory.Config {
283
+ DefaultExpiration : knf .GetD (CACHE_PERIOD , knf .Second ),
284
+ CleanupInterval : 15 * time .Second ,
285
+ })
286
+
287
+ if err != nil {
288
+ return fmt .Errorf ("Can't configure in-memory cache: %w" , err )
289
+ }
290
+
291
+ return nil
292
+ }
293
+
294
+ // setupGenerator configurates badge generator
295
+ func setupGenerator () error {
255
296
var err error
256
297
257
298
badgeStyle = knf .GetS (BADGE_STYLE , "flat" )
@@ -260,21 +301,32 @@ func start() {
260
301
badgeGen , err = badge .NewGenerator (knf .GetS (BADGE_FONT ), 11 )
261
302
262
303
if err != nil {
263
- log .Crit ("Can't load font for badges: %v" , err )
264
- shutdown (1 )
304
+ return fmt .Errorf ("Can't create badge generator: %w" , err )
265
305
}
266
306
307
+ return nil
308
+ }
309
+
310
+ // setupAPIClient configures updown.io API client
311
+ func setupAPIClient () error {
267
312
udAPI = api .NewClient (knf .GetS (UPDOWN_API_KEY ))
268
313
udAPI .SetUserAgent (APP , VER )
269
314
270
- badgeCache = cache .New (knf .GetD (CACHE_PERIOD , knf .Second ), time .Minute )
315
+ return nil
316
+ }
271
317
272
- err = startHTTPServer (knf .GetS (SERVER_IP ), knf .GetS (SERVER_PORT ))
318
+ // start configures and starts all subsystems
319
+ func start () error {
320
+ err := startHTTPServer (
321
+ knf .GetS (SERVER_IP ),
322
+ knf .GetS (SERVER_PORT ),
323
+ )
273
324
274
325
if err != nil {
275
- log .Crit ("Can't start HTTP server: %v" , err )
276
- shutdown (1 )
326
+ return fmt .Errorf ("Can't start HTTP server: %w" , err )
277
327
}
328
+
329
+ return nil
278
330
}
279
331
280
332
// intSignalHandler is INT signal handler
@@ -306,6 +358,7 @@ func shutdown(code int) {
306
358
}
307
359
}
308
360
361
+ log .Flush ()
309
362
os .Exit (code )
310
363
}
311
364
0 commit comments