Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ vendor.tgz
cmd/crowdsec-cli/cscli
cmd/crowdsec/crowdsec
cmd/notification-*/notification-*
crowdsec
crowdsec-cli
cscli

# Test cache (downloaded files)
.cache
Expand Down
9 changes: 7 additions & 2 deletions cmd/crowdsec/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,16 +66,21 @@ func LoadBuckets(cConfig *csconfig.Config, hub *cwhub.Hub) error {
}

func LoadAcquisition(ctx context.Context, cConfig *csconfig.Config, hub *cwhub.Hub) ([]acquisitionTypes.DataSource, error) {
var clientConfig *csconfig.LocalApiClientCfg
if cConfig.API != nil {
clientConfig = cConfig.API.Client
}

if flags.SingleFileType != "" && flags.OneShotDSN != "" {
flags.Labels["type"] = flags.SingleFileType

ds, err := acquisition.LoadAcquisitionFromDSN(ctx, flags.OneShotDSN, flags.Labels, flags.Transform, hub)
ds, err := acquisition.LoadAcquisitionFromDSN(ctx, flags.OneShotDSN, flags.Labels, flags.Transform, hub, clientConfig)
if err != nil {
return nil, err
}
dataSources = append(dataSources, ds)
} else {
dss, err := acquisition.LoadAcquisitionFromFiles(ctx, cConfig.Crowdsec, cConfig.Prometheus, hub)
dss, err := acquisition.LoadAcquisitionFromFiles(ctx, cConfig.Crowdsec, cConfig.Prometheus, hub, clientConfig)
if err != nil {
return nil, err
}
Expand Down
23 changes: 13 additions & 10 deletions pkg/acquisition/acquisition.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ func DataSourceConfigure(
yamlConfig []byte,
metricsLevel metrics.AcquisitionMetricsLevel,
hub *cwhub.Hub,
clientConfig *csconfig.LocalApiClientCfg,
) (types.DataSource, error) {
factory, err := registry.LookupFactory(commonConfig.Source)
if err != nil {
Expand Down Expand Up @@ -89,11 +90,9 @@ func DataSourceConfigure(
}

if lapiClientAware, ok := dataSrc.(types.LAPIClientAware); ok {
cConfig := csconfig.GetConfig()
if cConfig.API == nil {
return nil, errors.New("crowdsec configuration not loaded while initializing appsec - this is a bug, plese report")
if clientConfig != nil {
lapiClientAware.SetClientConfig(clientConfig)
}
lapiClientAware.SetClientConfig(cConfig.API.Client)
}

/* configure the actual datasource */
Expand All @@ -110,6 +109,7 @@ func LoadAcquisitionFromDSN(
labels map[string]string,
transformExpr string,
hub *cwhub.Hub,
clientConfig *csconfig.LocalApiClientCfg,
) (types.DataSource, error) {
frags := strings.Split(dsn, ":")
if len(frags) == 1 {
Expand Down Expand Up @@ -138,8 +138,9 @@ func LoadAcquisitionFromDSN(
}

if lapiClientAware, ok := dataSrc.(types.LAPIClientAware); ok {
cConfig := csconfig.GetConfig()
lapiClientAware.SetClientConfig(cConfig.API.Client)
if clientConfig != nil {
lapiClientAware.SetClientConfig(clientConfig)
}
}

dsnConf, ok := dataSrc.(types.DSNConfigurer)
Expand Down Expand Up @@ -225,7 +226,7 @@ var ErrEmptyYAMLDocument = errors.New("empty yaml document")
// - validate common fields
// - delegate per-source config validation to the appropriate module
// - compile transform expression
func ParseSourceConfig(ctx context.Context, yamlDoc []byte, metricsLevel metrics.AcquisitionMetricsLevel, hub *cwhub.Hub) (*ParsedSourceConfig, error) {
func ParseSourceConfig(ctx context.Context, yamlDoc []byte, metricsLevel metrics.AcquisitionMetricsLevel, hub *cwhub.Hub, clientConfig *csconfig.LocalApiClientCfg) (*ParsedSourceConfig, error) {
detectedType, err := detectType(bytes.NewReader(yamlDoc))
if err != nil {
return nil, err
Expand Down Expand Up @@ -287,7 +288,7 @@ func ParseSourceConfig(ctx context.Context, yamlDoc []byte, metricsLevel metrics
uniqueID := uuid.NewString()
sub.UniqueId = uniqueID

src, err := DataSourceConfigure(ctx, sub, yamlDoc, metricsLevel, hub)
src, err := DataSourceConfigure(ctx, sub, yamlDoc, metricsLevel, hub, clientConfig)
if err != nil {
return nil, fmt.Errorf("datasource of type %s: %w", sub.Source, err)
}
Expand Down Expand Up @@ -321,6 +322,7 @@ func sourcesFromFile(
acquisFile string,
metricsLevel metrics.AcquisitionMetricsLevel,
hub *cwhub.Hub,
clientConfig *csconfig.LocalApiClientCfg,
) ([]types.DataSource, error) {
var sources []types.DataSource

Expand Down Expand Up @@ -352,7 +354,7 @@ func sourcesFromFile(

loc := formatConfigLocation(acquisFile, len(documents) > 1, idx)

parsed, err := ParseSourceConfig(ctx, yamlDoc, metricsLevel, hub)
parsed, err := ParseSourceConfig(ctx, yamlDoc, metricsLevel, hub, clientConfig)

// report data source detection, it can be required to understand an error
if parsed != nil {
Expand Down Expand Up @@ -395,13 +397,14 @@ func LoadAcquisitionFromFiles(
config *csconfig.CrowdsecServiceCfg,
prom *csconfig.PrometheusCfg,
hub *cwhub.Hub,
clientConfig *csconfig.LocalApiClientCfg,
) ([]types.DataSource, error) {
var allSources []types.DataSource

metricsLevel := GetMetricsLevelFromPromCfg(prom)

for _, acquisFile := range config.AcquisitionFiles {
sources, err := sourcesFromFile(ctx, acquisFile, metricsLevel, hub)
sources, err := sourcesFromFile(ctx, acquisFile, metricsLevel, hub, clientConfig)
if err != nil {
return nil, err
}
Expand Down
6 changes: 3 additions & 3 deletions pkg/acquisition/acquisition_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ filename: foo.log
err := yaml.Unmarshal([]byte(tc.String), &common)
require.NoError(t, err)
hub := cwhub.Hub{}
ds, err := DataSourceConfigure(ctx, common, []byte(tc.String), metrics.AcquisitionMetricsLevelNone, &hub)
ds, err := DataSourceConfigure(ctx, common, []byte(tc.String), metrics.AcquisitionMetricsLevelNone, &hub, nil)
cstest.RequireErrorContains(t, err, tc.ExpectedError)

if tc.ExpectedError != "" {
Expand Down Expand Up @@ -302,7 +302,7 @@ func TestLoadAcquisitionFromFiles(t *testing.T) {
for _, tc := range tests {
t.Run(tc.TestName, func(t *testing.T) {
hub := cwhub.Hub{}
dss, err := LoadAcquisitionFromFiles(ctx, &tc.Config, nil, &hub)
dss, err := LoadAcquisitionFromFiles(ctx, &tc.Config, nil, &hub, nil)
cstest.RequireErrorContains(t, err, tc.ExpectedError)

if tc.ExpectedError != "" {
Expand Down Expand Up @@ -564,7 +564,7 @@ func TestConfigureByDSN(t *testing.T) {
for _, tc := range tests {
t.Run(tc.dsn, func(t *testing.T) {
hub := cwhub.Hub{}
source, err := LoadAcquisitionFromDSN(ctx, tc.dsn, map[string]string{"type": "test_label"}, "", &hub)
source, err := LoadAcquisitionFromDSN(ctx, tc.dsn, map[string]string{"type": "test_label"}, "", &hub, nil)
cstest.RequireErrorContains(t, err, tc.ExpectedError)

if tc.ExpectedError != "" {
Expand Down
31 changes: 29 additions & 2 deletions pkg/acquisition/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,18 @@ func TestParseSourceConfig(t *testing.T) {

if s.expectValid {
require.False(t, hasWant, "valid config must not include # wantErr: directive")
parsed, err := ParseSourceConfig(ctx, fileContent, metrics.AcquisitionMetricsLevelNone, &hub)

// Provide mock client config for appsec datasources
var clientConfig *csconfig.LocalApiClientCfg
if strings.Contains(path, "appsec") {
clientConfig = &csconfig.LocalApiClientCfg{
Credentials: &csconfig.ApiCredentialsCfg{
URL: "http://localhost:8080/",
},
}
}

parsed, err := ParseSourceConfig(ctx, fileContent, metrics.AcquisitionMetricsLevelNone, &hub, clientConfig)
require.NoError(t, err)
require.NotNil(t, parsed)
if schema != "" {
Expand All @@ -155,7 +166,23 @@ func TestParseSourceConfig(t *testing.T) {
require.True(t, hasWant, "invalid config must include '# wantErr: <exact error>'")
require.NotEmpty(t, wantErr, "wantErr directive found but empty")

parsed, err := ParseSourceConfig(ctx, fileContent, metrics.AcquisitionMetricsLevelNone, &hub)
// Provide mock client config for appsec datasources that need it
var clientConfig *csconfig.LocalApiClientCfg
if strings.Contains(path, "appsec") {
if strings.Contains(wantErr, "missing lapi client credentials") {
// For this specific test, provide clientConfig but without Credentials
clientConfig = &csconfig.LocalApiClientCfg{}
} else {
// For other appsec tests, provide full mock config
clientConfig = &csconfig.LocalApiClientCfg{
Credentials: &csconfig.ApiCredentialsCfg{
URL: "http://localhost:8080/",
},
}
}
}

parsed, err := ParseSourceConfig(ctx, fileContent, metrics.AcquisitionMetricsLevelNone, &hub, clientConfig)
require.Error(t, err, "got no error, expected %q", wantErr)
require.Nil(t, parsed)
assert.Equal(t, wantErr, err.Error())
Expand Down
3 changes: 1 addition & 2 deletions pkg/apiserver/apic_metrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import (
"github.com/crowdsecurity/go-cs-lib/trace"
"github.com/crowdsecurity/go-cs-lib/version"

"github.com/crowdsecurity/crowdsec/pkg/csconfig"
"github.com/crowdsecurity/crowdsec/pkg/fflag"
"github.com/crowdsecurity/crowdsec/pkg/models"
)
Expand Down Expand Up @@ -145,7 +144,7 @@ func (a *apic) GetUsageMetrics(ctx context.Context) (*models.AllMetrics, []int,
}

// FIXME: all of this should only be done once on startup/reload
consoleOptions := strings.Join(csconfig.GetConfig().API.Server.ConsoleConfig.EnabledOptions(), ",")
consoleOptions := strings.Join(a.consoleConfig.EnabledOptions(), ",")
allMetrics.Lapi = &models.LapiMetrics{
ConsoleOptions: models.ConsoleOptions{
consoleOptions,
Expand Down
8 changes: 0 additions & 8 deletions pkg/csconfig/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,6 @@ var defaultConfigDir = "/etc/crowdsec"
// defaultDataDir is the base path to all data files, to be overridden in the Makefile */
var defaultDataDir = "/var/lib/crowdsec/data/"

var globalConfig = Config{}

// Config contains top-level defaults -> overridden by configuration file -> overridden by CLI flags
type Config struct {
// just a path to ourselves :p
Expand Down Expand Up @@ -97,15 +95,9 @@ func NewConfig(configFile string, disableAgent bool, disableAPI bool, quiet bool
cfg.loadHub()
cfg.loadCSCLI()

globalConfig = cfg

return &cfg, configData, nil
}

func GetConfig() Config {
return globalConfig
}

func NewDefaultConfig() *Config {
commonCfg := CommonCfg{
LogLevel: log.InfoLevel,
Expand Down