mirror of
https://github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin.git
synced 2026-07-21 11:38:59 +02:00
Update CI following latest plugindemo version (#34)
* Update CI following latest plugindemo version * disable some linter * Disable some linter * Fix linter in redis, add error logger * 🚨 Fix lint errors in private packages * 🚨 Update lints in package and core code * 🚨 exclude unfixable lint errors * 🚨 update lint at package level and ignore necessary global variable * 🍱 fix lint qnd merge * 🚨 Fix Lint for string * 🚨 Fix lint for bouncer * 🚨 Fix error * Fix weird linter error Co-authored-by: Max Lerebourg <maxlerebourg@gmail.com>
This commit is contained in:
co-authored by
Max Lerebourg
parent
2d0bea8eec
commit
0a54f7b09f
Vendored
+23
-14
@@ -1,3 +1,5 @@
|
||||
// Package cache implements utility routines for manipulating cache.
|
||||
// It supports currently local file and redis cache.
|
||||
package cache
|
||||
|
||||
import (
|
||||
@@ -6,7 +8,7 @@ import (
|
||||
ttl_map "github.com/leprosus/golang-ttl-map"
|
||||
|
||||
logger "github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin/pkg/logger"
|
||||
simpleredis "github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin/pkg/redis"
|
||||
simpleredis "github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin/pkg/simpleredis"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -14,12 +16,14 @@ const (
|
||||
cacheNoBannedValue = "f"
|
||||
)
|
||||
|
||||
var cache = ttl_map.New()
|
||||
var redis simpleredis.SimpleRedis
|
||||
//nolint:gochecknoglobals
|
||||
var (
|
||||
cache = ttl_map.New()
|
||||
redis simpleredis.SimpleRedis
|
||||
redisEnabled = false
|
||||
)
|
||||
|
||||
var redisEnabled = false
|
||||
|
||||
// CLASSIC
|
||||
// FileSystem Cache
|
||||
|
||||
func getDecisionLocalCache(clientIP string) (bool, error) {
|
||||
banned, isCached := cache.Get(clientIP)
|
||||
@@ -38,7 +42,7 @@ func deleteDecisionLocalCache(clientIP string) {
|
||||
cache.Del(clientIP)
|
||||
}
|
||||
|
||||
// REDIS
|
||||
// Redis Cache
|
||||
|
||||
func getDecisionRedisCache(clientIP string) (bool, error) {
|
||||
banned, err := redis.Get(clientIP)
|
||||
@@ -50,14 +54,18 @@ func getDecisionRedisCache(clientIP string) (bool, error) {
|
||||
}
|
||||
|
||||
func setDecisionRedisCache(clientIP string, value string, duration int64) {
|
||||
redis.Set(clientIP, []byte(value), duration)
|
||||
if err := redis.Set(clientIP, []byte(value), duration); err != nil {
|
||||
logger.Error(fmt.Sprintf("cache:setDecisionRedisCache %s", err.Error()))
|
||||
}
|
||||
}
|
||||
|
||||
func deleteDecisionRedisCache(clientIP string) {
|
||||
redis.Del(clientIP)
|
||||
if err := redis.Del(clientIP); err != nil {
|
||||
logger.Error(fmt.Sprintf("cache:deleteDecisionRedisCache %s", err.Error()))
|
||||
}
|
||||
}
|
||||
|
||||
// DeleteDecision delete decision in cache
|
||||
// DeleteDecision delete decision in cache.
|
||||
func DeleteDecision(clientIP string) {
|
||||
if redisEnabled {
|
||||
deleteDecisionRedisCache(clientIP)
|
||||
@@ -71,15 +79,15 @@ func DeleteDecision(clientIP string) {
|
||||
func GetDecision(clientIP string) (bool, error) {
|
||||
if redisEnabled {
|
||||
return getDecisionRedisCache(clientIP)
|
||||
} else {
|
||||
return getDecisionLocalCache(clientIP)
|
||||
}
|
||||
return getDecisionLocalCache(clientIP)
|
||||
}
|
||||
|
||||
// SetDecision update the cache with the IP as key and the value banned / not banned.
|
||||
func SetDecision(clientIP string, isBanned bool, duration int64) {
|
||||
var value string
|
||||
if isBanned {
|
||||
logger.Debug(fmt.Sprintf("%v banned", clientIP))
|
||||
logger.Debug(fmt.Sprintf("cache:SetDecision ip:%v banned", clientIP))
|
||||
value = cacheBannedValue
|
||||
} else {
|
||||
value = cacheNoBannedValue
|
||||
@@ -91,8 +99,9 @@ func SetDecision(clientIP string, isBanned bool, duration int64) {
|
||||
}
|
||||
}
|
||||
|
||||
// InitRedisClient loads variables.
|
||||
func InitRedisClient(host string) {
|
||||
redisEnabled = true
|
||||
redis.Init(host)
|
||||
logger.Debug("Redis initialized")
|
||||
logger.Debug("cache:InitRedisClient redis:initialized")
|
||||
}
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
// Package ip implements utility routines for to manipulates IP and CIDR.
|
||||
// It allows to find on IP on a list, and find if an IP is part of a list of CIDR.
|
||||
package ip
|
||||
|
||||
import (
|
||||
|
||||
+16
-12
@@ -1,3 +1,5 @@
|
||||
// Package logger implements utility routines to write to stdout and stderr.
|
||||
// It supports debug, info and error level
|
||||
package logger
|
||||
|
||||
import (
|
||||
@@ -7,29 +9,31 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
loggerInfo = log.New(io.Discard, "INFO: CrowdsecBouncerTraefikPlugin: ", log.Ldate|log.Ltime)
|
||||
loggerDebug = log.New(io.Discard, "DEBUG: CrowdsecBouncerTraefikPlugin: ", log.Ldate|log.Ltime)
|
||||
loggerInfo = log.New(io.Discard, "INFO: CrowdsecBouncerTraefikPlugin: ", log.Ldate|log.Ltime) //nolint:gochecknoglobals
|
||||
loggerDebug = log.New(io.Discard, "DEBUG: CrowdsecBouncerTraefikPlugin: ", log.Ldate|log.Ltime) //nolint:gochecknoglobals
|
||||
loggerError = log.New(io.Discard, "ERROR: CrowdsecBouncerTraefikPlugin: ", log.Ldate|log.Ltime) //nolint:gochecknoglobals
|
||||
)
|
||||
|
||||
// Init Set Default log level to info in case log level to defined
|
||||
// Init Set Default log level to info in case log level to defined.
|
||||
func Init(logLevel string) {
|
||||
switch logLevel {
|
||||
case "INFO":
|
||||
loggerInfo.SetOutput(os.Stdout)
|
||||
case "DEBUG":
|
||||
loggerInfo.SetOutput(os.Stdout)
|
||||
loggerError.SetOutput(os.Stderr)
|
||||
loggerInfo.SetOutput(os.Stdout)
|
||||
if logLevel == "DEBUG" {
|
||||
loggerDebug.SetOutput(os.Stdout)
|
||||
default:
|
||||
loggerInfo.SetOutput(os.Stdout)
|
||||
}
|
||||
}
|
||||
|
||||
// Info Log info
|
||||
// Info log to Stdout.
|
||||
func Info(str string) {
|
||||
loggerInfo.Printf(str)
|
||||
}
|
||||
|
||||
// Info Log debug
|
||||
// Debug log to Stdout.
|
||||
func Debug(str string) {
|
||||
loggerDebug.Printf(str)
|
||||
}
|
||||
|
||||
// Error log to Stderr.
|
||||
func Error(str string) {
|
||||
loggerError.Printf(str)
|
||||
}
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
// Package simpleredis implements utility routines for interacting.
|
||||
// It supports currently the following operations: GET, SET, DELETE,
|
||||
// and support timetoleave for keys.
|
||||
package simpleredis
|
||||
|
||||
import (
|
||||
@@ -11,12 +14,14 @@ import (
|
||||
logger "github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin/pkg/logger"
|
||||
)
|
||||
|
||||
// Error strings for redis.
|
||||
const (
|
||||
RedisUnreachable = "redis:unreachable"
|
||||
RedisMiss = "redis:miss"
|
||||
RedisTimeout = "redis:timeout"
|
||||
RedisMiss = "redis:miss"
|
||||
RedisTimeout = "redis:timeout"
|
||||
)
|
||||
|
||||
// A RedisCmd is used to communicate with redis at low level using commands.
|
||||
type RedisCmd struct {
|
||||
Command string
|
||||
Name string
|
||||
@@ -25,6 +30,7 @@ type RedisCmd struct {
|
||||
Error error
|
||||
}
|
||||
|
||||
// A SimpleRedis is used to communicate with redis.
|
||||
type SimpleRedis struct {
|
||||
redisHost string
|
||||
}
|
||||
@@ -39,6 +45,14 @@ func genRedisArray(params ...[]byte) []byte {
|
||||
return []byte(MSG)
|
||||
}
|
||||
|
||||
func send(wr *textproto.Writer, method string, data []byte) {
|
||||
if err := wr.PrintfLine(string(data)); err != nil {
|
||||
logger.Error(fmt.Sprintf("redis:%s %s", method, err.Error()))
|
||||
} else {
|
||||
logger.Debug(fmt.Sprintf("redis:%s", method))
|
||||
}
|
||||
}
|
||||
|
||||
func askRedis(hostnamePort string, cmd RedisCmd, channel chan RedisCmd) {
|
||||
dialer := net.Dialer{Timeout: 2 * time.Second}
|
||||
conn, err := dialer.Dial("tcp", hostnamePort)
|
||||
@@ -46,24 +60,25 @@ func askRedis(hostnamePort string, cmd RedisCmd, channel chan RedisCmd) {
|
||||
channel <- RedisCmd{Error: fmt.Errorf(RedisUnreachable)}
|
||||
return
|
||||
}
|
||||
defer conn.Close()
|
||||
defer func() {
|
||||
if err := conn.Close(); err != nil {
|
||||
logger.Error(fmt.Sprintf("redis:connClose %s", err.Error()))
|
||||
}
|
||||
}()
|
||||
|
||||
writer := textproto.NewWriter(bufio.NewWriter(conn))
|
||||
reader := textproto.NewReader(bufio.NewReader(conn))
|
||||
|
||||
switch cmd.Command {
|
||||
case "SET":
|
||||
data := genRedisArray([]byte("SET"), []byte(cmd.Name), []byte(cmd.Data), []byte("EX"), []byte(fmt.Sprintf("%v", cmd.Duration)))
|
||||
writer.PrintfLine(string(data))
|
||||
logger.Debug("redis:set")
|
||||
data := genRedisArray([]byte("SET"), []byte(cmd.Name), cmd.Data, []byte("EX"), []byte(fmt.Sprintf("%d", cmd.Duration)))
|
||||
send(writer, "set", data)
|
||||
case "DEL":
|
||||
data := genRedisArray([]byte("DEL"), []byte(cmd.Name))
|
||||
writer.PrintfLine(string(data))
|
||||
logger.Debug("redis:del")
|
||||
send(writer, "del", data)
|
||||
case "GET":
|
||||
data := genRedisArray([]byte("GET"), []byte(cmd.Name))
|
||||
writer.PrintfLine(string(data))
|
||||
logger.Debug("redis:get")
|
||||
send(writer, "get", data)
|
||||
for {
|
||||
select {
|
||||
case <-time.After(time.Second * 1):
|
||||
@@ -83,10 +98,12 @@ func askRedis(hostnamePort string, cmd RedisCmd, channel chan RedisCmd) {
|
||||
}
|
||||
}
|
||||
|
||||
// Init sets the redisHost used to connect to redis.
|
||||
func (sr *SimpleRedis) Init(redisHost string) {
|
||||
sr.redisHost = redisHost
|
||||
}
|
||||
|
||||
// Get fetches the value for key name in redis.
|
||||
func (sr *SimpleRedis) Get(name string) ([]byte, error) {
|
||||
redisCmd := RedisCmd{
|
||||
Command: "GET",
|
||||
@@ -101,6 +118,7 @@ func (sr *SimpleRedis) Get(name string) ([]byte, error) {
|
||||
return resp.Data, nil
|
||||
}
|
||||
|
||||
// Set update the value for key name in redis with value data for duration.
|
||||
func (sr *SimpleRedis) Set(name string, data []byte, duration int64) error {
|
||||
redisCmd := RedisCmd{
|
||||
Command: "SET",
|
||||
@@ -112,6 +130,7 @@ func (sr *SimpleRedis) Set(name string, data []byte, duration int64) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// Del remove the key name in redis.
|
||||
func (sr *SimpleRedis) Del(name string) error {
|
||||
redisCmd := RedisCmd{
|
||||
Command: "DEL",
|
||||
Reference in New Issue
Block a user