update lint configuration (#3667)

* lint: exhaustive

* lint: nonamedreturns

* update golangci-lint

* lint
This commit is contained in:
mmetc
2025-07-22 13:15:17 +02:00
committed by GitHub
parent 43a72e210a
commit d64ee2aea4
7 changed files with 71 additions and 35 deletions
+1 -1
View File
@@ -58,6 +58,6 @@ jobs:
- name: golangci-lint
uses: golangci/golangci-lint-action@4afd733a84b1f43292c63897423277bb7f4313a9 # v8.0.0
with:
version: v2.2
version: v2.3
args: --issues-exit-code=1 --timeout 10m
only-new-issues: false
+1 -1
View File
@@ -209,6 +209,6 @@ jobs:
- name: golangci-lint
uses: golangci/golangci-lint-action@4afd733a84b1f43292c63897423277bb7f4313a9 # v8.0.0
with:
version: v2.2
version: v2.3
args: --issues-exit-code=1 --timeout 10m
only-new-issues: false
+31 -7
View File
@@ -22,13 +22,19 @@ linters:
- intrange # intrange is a linter to find places where for loops could make use of an integer range.
- funcorder
# we allow named returns (to improve readability, in the function signatures)
# but disallow implicit (or "naked") returns, to improve readability in the actual code.
#
# Implicit returns are still useful with deferred functions, in which case they can be //nolinted.
# https://go.dev/wiki/CodeReviewComments#named-result-parameters
- nonamedreturns
#
# Recommended? (easy)
#
- dogsled # Checks assignments with too many blank identifiers (e.g. x, _, _, _, := f())
- errchkjson # Checks types passed to the json encoding functions. Reports unsupported types and reports occasions, where the check for the returned error can be omitted.
- exhaustive # check exhaustiveness of enum switch statements
- godot # Check if comments end in a period
- gosec # (gas): Inspects source code for security problems
- musttag # enforce field tags in (un)marshaled structs
@@ -227,6 +233,8 @@ linters:
disabled: true
- name: empty-lines
disabled: true
- name: enforce-switch-style
disabled: true
- name: error-naming
disabled: true
- name: flag-parameter
@@ -341,12 +349,6 @@ linters:
- bodyclose
text: response body must be closed
# named/naked returns are evil, with a single exception
# https://go.dev/wiki/CodeReviewComments#named-result-parameters
- linters:
- nonamedreturns
text: named return .* with type .* found
- linters:
- revive
path: pkg/leakybucket/manager_load.go
@@ -472,6 +474,28 @@ linters:
- containedctx
path: cmd/notification-file/main.go
text: found a struct that contains a context.Context field
# migrate over time
- linters:
- noctx
text: "net.Listen must not be called"
- linters:
- noctx
text: "exec.Command must not be called"
- linters:
- noctx
text: "net.LookupAddr must not be called"
- linters:
- noctx
text: "net.Dial must not be called"
- linters:
- noctx
text: "net.LookupHost must not be called"
paths:
- pkg/yamlpatch/merge.go
- pkg/yamlpatch/merge_test.go
+1 -1
View File
@@ -36,7 +36,7 @@ func (m *crowdsec_winservice) Execute(args []string, r <-chan svc.ChangeRequest,
case <-tick:
case c := <-r:
switch c.Cmd {
switch c.Cmd { //nolint:exhaustive
case svc.Interrogate:
changes <- c.CurrentStatus
case svc.Stop, svc.Shutdown:
+25 -19
View File
@@ -7,6 +7,7 @@ import (
"fmt"
"net/url"
"regexp"
"slices"
"strconv"
"strings"
"time"
@@ -25,7 +26,6 @@ import (
"github.com/crowdsecurity/crowdsec/pkg/acquisition/configuration"
"github.com/crowdsecurity/crowdsec/pkg/types"
"slices"
)
var linesRead = prometheus.NewCounterVec(
@@ -36,18 +36,19 @@ var linesRead = prometheus.NewCounterVec(
[]string{"source"})
type DockerConfiguration struct {
CheckInterval string `yaml:"check_interval"`
FollowStdout bool `yaml:"follow_stdout"`
FollowStdErr bool `yaml:"follow_stderr"`
Until string `yaml:"until"`
Since string `yaml:"since"`
DockerHost string `yaml:"docker_host"`
ContainerName []string `yaml:"container_name"`
ContainerID []string `yaml:"container_id"`
ContainerNameRegexp []string `yaml:"container_name_regexp"`
ContainerIDRegexp []string `yaml:"container_id_regexp"`
UseContainerLabels bool `yaml:"use_container_labels"`
configuration.DataSourceCommonCfg `yaml:",inline"`
CheckInterval string `yaml:"check_interval"`
FollowStdout bool `yaml:"follow_stdout"`
FollowStdErr bool `yaml:"follow_stderr"`
Until string `yaml:"until"`
Since string `yaml:"since"`
DockerHost string `yaml:"docker_host"`
ContainerName []string `yaml:"container_name"`
ContainerID []string `yaml:"container_id"`
ContainerNameRegexp []string `yaml:"container_name_regexp"`
ContainerIDRegexp []string `yaml:"container_id_regexp"`
UseContainerLabels bool `yaml:"use_container_labels"`
}
type DockerSource struct {
@@ -350,7 +351,9 @@ func (d *DockerSource) OneShotAcquisition(ctx context.Context, out chan types.Ev
evt.Line = l
evt.Process = true
evt.Type = types.LOG
out <- evt
d.logger.Debugf("Sent line to parsing: %+v", evt.Line.Raw)
}
}
@@ -389,8 +392,8 @@ func (d *DockerSource) CanRun() error {
return nil
}
func (d *DockerSource) getContainerTTY(ctx context.Context, containerId string) bool {
containerDetails, err := d.Client.ContainerInspect(ctx, containerId)
func (d *DockerSource) getContainerTTY(ctx context.Context, containerID string) bool {
containerDetails, err := d.Client.ContainerInspect(ctx, containerID)
if err != nil {
return false
}
@@ -398,10 +401,10 @@ func (d *DockerSource) getContainerTTY(ctx context.Context, containerId string)
return containerDetails.Config.Tty
}
func (d *DockerSource) getContainerLabels(ctx context.Context, containerId string) map[string]interface{} {
containerDetails, err := d.Client.ContainerInspect(ctx, containerId)
func (d *DockerSource) getContainerLabels(ctx context.Context, containerID string) map[string]any {
containerDetails, err := d.Client.ContainerInspect(ctx, containerID)
if err != nil {
return map[string]interface{}{}
return map[string]any{}
}
return parseLabels(containerDetails.Config.Labels)
@@ -466,7 +469,7 @@ func (d *DockerSource) EvalContainer(ctx context.Context, container dockerTypes.
return nil
}
labelsTypeCast, ok := parsedLabels["labels"].(map[string]interface{})
labelsTypeCast, ok := parsedLabels["labels"].(map[string]any)
if !ok {
d.logger.Error("container has 'crowdsec.enable' label set to true but 'labels' is not a map")
return nil
@@ -539,6 +542,7 @@ func (d *DockerSource) checkContainers(ctx context.Context, monitChan chan *Cont
}
d.logger.Tracef("Reading logs from %d containers", len(d.runningContainerState))
return nil
}
@@ -669,7 +673,7 @@ func (d *DockerSource) StreamingAcquisition(ctx context.Context, out chan types.
return d.WatchContainer(ctx, monitChan, deleteChan)
}
func (d *DockerSource) Dump() interface{} {
func (d *DockerSource) Dump() any {
return d
}
@@ -677,6 +681,7 @@ func ReadTailScanner(scanner *bufio.Scanner, out chan string, t *tomb.Tomb) erro
for scanner.Scan() {
out <- scanner.Text()
}
return scanner.Err()
}
@@ -714,6 +719,7 @@ func (d *DockerSource) TailDocker(ctx context.Context, container *ContainerConfi
if line == "" {
continue
}
l := types.Line{}
l.Raw = line
l.Labels = container.Labels
+3 -3
View File
@@ -42,7 +42,7 @@ type HCLogAdapter struct {
}
func (h HCLogAdapter) Log(level hclog.Level, msg string, args ...interface{}) {
switch level {
switch level { //nolint:exhaustive
case hclog.NoLevel:
return
case hclog.Trace:
@@ -140,7 +140,7 @@ func (h HCLogAdapter) StandardWriter(opts *hclog.StandardLoggerOptions) io.Write
// level2logrus maps hclog levels to Logrus levels.
func level2logrus(level hclog.Level) logrus.Level {
switch level {
switch level { //nolint:exhaustive
case hclog.NoLevel:
// Logrus does not have NoLevel, so use Info instead.
return logrus.InfoLevel
@@ -160,7 +160,7 @@ func level2logrus(level hclog.Level) logrus.Level {
}
func level2hclog(level logrus.Level) hclog.Level {
switch level {
switch level { //nolint:exhaustive
case logrus.TraceLevel:
return hclog.Trace
case logrus.DebugLevel:
+9 -3
View File
@@ -51,7 +51,7 @@ func SetTargetByName(target string, value string, evt *types.Event) bool {
/*
** According to current Event layout we only have to handle struct and map
*/
switch iter.Kind() {
switch iter.Kind() { //nolint:exhaustive
case reflect.Map:
tmp := iter.MapIndex(reflect.ValueOf(f))
/*if we're in a map and the field doesn't exist, the user wants to add it :) */
@@ -82,7 +82,8 @@ func SetTargetByName(target string, value string, evt *types.Event) bool {
return false
}
}
//now we should have the final member :)
// now we should have the final member :)
if !iter.CanSet() {
log.Errorf("'%s' can't be set", target)
return false
@@ -119,6 +120,7 @@ func (n *Node) ProcessStatics(statics []ExtraField, event *types.Event) error {
//we have a few cases :
//(meta||key) + (static||reference||expr)
var value string
clog := n.Logger
for _, static := range statics {
@@ -131,6 +133,7 @@ func (n *Node) ProcessStatics(statics []ExtraField, event *types.Event) error {
clog.Warningf("failed to run RunTimeValue : %v", err)
continue
}
switch out := output.(type) {
case string:
value = out
@@ -151,7 +154,7 @@ func (n *Node) ProcessStatics(statics []ExtraField, event *types.Event) error {
}
if value == "" {
//allow ParseDate to have empty input
// allow ParseDate to have empty input
if static.Method != "ParseDate" {
clog.Debugf("Empty value for %s, skip.", printStaticTarget(static))
continue
@@ -180,6 +183,7 @@ func (n *Node) ProcessStatics(statics []ExtraField, event *types.Event) error {
} else {
clog.Debugf("method '%s' doesn't exist or plugin not initialized", static.Method)
}
if !processed {
clog.Debugf("method '%s' doesn't exist", static.Method)
}
@@ -202,6 +206,7 @@ func (n *Node) ProcessStatics(statics []ExtraField, event *types.Event) error {
clog.Fatal("unable to process static : unknown target")
}
}
return nil
}
@@ -253,6 +258,7 @@ func stageidx(stage string, stages []string) int {
return i
}
}
return -1
}