81 bug stream mode stops blocking (#82)

*  fix isHealthy issue at startup

* 🍱 not added in first commit ?

* 🍱 remove unused import

* 🍱 fix lint

* fix: lint
This commit is contained in:
maxlerebourg
2023-01-30 14:03:10 +01:00
committed by GitHub
parent 80726df450
commit 976cbb7d1f
2 changed files with 17 additions and 9 deletions
+10 -8
View File
@@ -15,8 +15,6 @@ import (
"text/template" "text/template"
"time" "time"
simpleredis "github.com/maxlerebourg/simpleredis"
cache "github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin/pkg/cache" cache "github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin/pkg/cache"
configuration "github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin/pkg/configuration" configuration "github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin/pkg/configuration"
ip "github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin/pkg/ip" ip "github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin/pkg/ip"
@@ -35,6 +33,7 @@ const (
//nolint:gochecknoglobals //nolint:gochecknoglobals
var ( var (
isStartup = true
isCrowdsecStreamHealthy = true isCrowdsecStreamHealthy = true
ticker chan bool ticker chan bool
) )
@@ -155,7 +154,8 @@ func New(ctx context.Context, next http.Handler, config *configuration.Config, n
ticker = startTicker(config, func() { ticker = startTicker(config, func() {
handleStreamCache(bouncer) handleStreamCache(bouncer)
}) })
go handleStreamCache(bouncer) handleStreamCache(bouncer)
isStartup = false
} }
logger.Debug(fmt.Sprintf("New initialized mode:%s", config.CrowdsecMode)) 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 // TODO This should be simplified
if bouncer.crowdsecMode != configuration.NoneMode { if bouncer.crowdsecMode != configuration.NoneMode {
isBanned, erro := bouncer.cacheClient.GetDecision(remoteIP) isBanned, cacheErr := bouncer.cacheClient.GetDecision(remoteIP)
if erro != nil { if cacheErr != nil {
logger.Debug(fmt.Sprintf("ServeHTTP:getDecision ip:%s isBanned:true %s", remoteIP, erro.Error())) errString := cacheErr.Error()
if erro.Error() == simpleredis.RedisUnreachable { 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) rw.WriteHeader(http.StatusForbidden)
return return
} }
@@ -361,7 +363,7 @@ func handleStreamCache(bouncer *Bouncer) {
Scheme: bouncer.crowdsecScheme, Scheme: bouncer.crowdsecScheme,
Host: bouncer.crowdsecHost, Host: bouncer.crowdsecHost,
Path: bouncer.crowdsecStreamRoute, Path: bouncer.crowdsecStreamRoute,
RawQuery: fmt.Sprintf("startup=%t", !isCrowdsecStreamHealthy), RawQuery: fmt.Sprintf("startup=%t", !isCrowdsecStreamHealthy || isStartup),
} }
body, err := crowdsecQuery(bouncer, streamRouteURL.String(), false) body, err := crowdsecQuery(bouncer, streamRouteURL.String(), false)
if err != nil { if err != nil {
+7 -1
View File
@@ -16,6 +16,9 @@ const (
cacheNoBannedValue = "f" cacheNoBannedValue = "f"
) )
// CacheMiss error string when cache is miss.
const CacheMiss = "cache:miss"
//nolint:gochecknoglobals //nolint:gochecknoglobals
var ( var (
redis simpleredis.SimpleRedis redis simpleredis.SimpleRedis
@@ -30,7 +33,7 @@ func (localCache) getDecision(clientIP string) (bool, error) {
if isCached && isValid && len(bannedString) > 0 { if isCached && isValid && len(bannedString) > 0 {
return bannedString == cacheBannedValue, nil return bannedString == cacheBannedValue, nil
} }
return false, fmt.Errorf("cache:miss") return false, fmt.Errorf(CacheMiss)
} }
func (localCache) setDecision(clientIP string, value string, duration int64) { 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 { if err == nil && len(bannedString) > 0 {
return bannedString == cacheBannedValue, nil return bannedString == cacheBannedValue, nil
} }
if err.Error() == simpleredis.RedisMiss {
return false, fmt.Errorf(CacheMiss)
}
return false, err return false, err
} }