From 976cbb7d1fcaec95f785890f8f4ce6a4b3954077 Mon Sep 17 00:00:00 2001 From: maxlerebourg Date: Mon, 30 Jan 2023 14:03:10 +0100 Subject: [PATCH] 81 bug stream mode stops blocking (#82) * :sparkles: fix isHealthy issue at startup * :bento: not added in first commit ? * :bento: remove unused import * :bento: fix lint * fix: lint --- bouncer.go | 18 ++++++++++-------- pkg/cache/cache.go | 8 +++++++- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/bouncer.go b/bouncer.go index 934ba84..a79564b 100644 --- a/bouncer.go +++ b/bouncer.go @@ -15,8 +15,6 @@ import ( "text/template" "time" - simpleredis "github.com/maxlerebourg/simpleredis" - cache "github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin/pkg/cache" configuration "github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin/pkg/configuration" ip "github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin/pkg/ip" @@ -35,6 +33,7 @@ const ( //nolint:gochecknoglobals var ( + isStartup = true isCrowdsecStreamHealthy = true ticker chan bool ) @@ -155,7 +154,8 @@ func New(ctx context.Context, next http.Handler, config *configuration.Config, n ticker = startTicker(config, func() { handleStreamCache(bouncer) }) - go handleStreamCache(bouncer) + handleStreamCache(bouncer) + isStartup = false } logger.Debug(fmt.Sprintf("New initialized mode:%s", config.CrowdsecMode)) @@ -193,10 +193,12 @@ func (bouncer *Bouncer) ServeHTTP(rw http.ResponseWriter, req *http.Request) { // TODO This should be simplified if bouncer.crowdsecMode != configuration.NoneMode { - isBanned, erro := bouncer.cacheClient.GetDecision(remoteIP) - if erro != nil { - logger.Debug(fmt.Sprintf("ServeHTTP:getDecision ip:%s isBanned:true %s", remoteIP, erro.Error())) - if erro.Error() == simpleredis.RedisUnreachable { + isBanned, cacheErr := bouncer.cacheClient.GetDecision(remoteIP) + if cacheErr != nil { + errString := cacheErr.Error() + logger.Debug(fmt.Sprintf("ServeHTTP:getDecision ip:%s isBanned:false %s", remoteIP, errString)) + if errString != cache.CacheMiss { + logger.Error(fmt.Sprintf("ServeHTTP:getDecision ip:%s %s", remoteIP, errString)) rw.WriteHeader(http.StatusForbidden) return } @@ -361,7 +363,7 @@ func handleStreamCache(bouncer *Bouncer) { Scheme: bouncer.crowdsecScheme, Host: bouncer.crowdsecHost, Path: bouncer.crowdsecStreamRoute, - RawQuery: fmt.Sprintf("startup=%t", !isCrowdsecStreamHealthy), + RawQuery: fmt.Sprintf("startup=%t", !isCrowdsecStreamHealthy || isStartup), } body, err := crowdsecQuery(bouncer, streamRouteURL.String(), false) if err != nil { diff --git a/pkg/cache/cache.go b/pkg/cache/cache.go index bd9ed9c..bae9e14 100644 --- a/pkg/cache/cache.go +++ b/pkg/cache/cache.go @@ -16,6 +16,9 @@ const ( cacheNoBannedValue = "f" ) +// CacheMiss error string when cache is miss. +const CacheMiss = "cache:miss" + //nolint:gochecknoglobals var ( redis simpleredis.SimpleRedis @@ -30,7 +33,7 @@ func (localCache) getDecision(clientIP string) (bool, error) { if isCached && isValid && len(bannedString) > 0 { return bannedString == cacheBannedValue, nil } - return false, fmt.Errorf("cache:miss") + return false, fmt.Errorf(CacheMiss) } func (localCache) setDecision(clientIP string, value string, duration int64) { @@ -49,6 +52,9 @@ func (redisCache) getDecision(clientIP string) (bool, error) { if err == nil && len(bannedString) > 0 { return bannedString == cacheBannedValue, nil } + if err.Error() == simpleredis.RedisMiss { + return false, fmt.Errorf(CacheMiss) + } return false, err }