error reporting (#1501)
* unified error reporting, removed redundancy, tests
This commit is contained in:
parent
bf3ea71630
commit
131ed1b0a7
|
@ -18,6 +18,7 @@ import (
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/models"
|
"github.com/crowdsecurity/crowdsec/pkg/models"
|
||||||
"github.com/go-openapi/strfmt"
|
"github.com/go-openapi/strfmt"
|
||||||
"github.com/olekukonko/tablewriter"
|
"github.com/olekukonko/tablewriter"
|
||||||
|
"github.com/pkg/errors"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"gopkg.in/yaml.v2"
|
"gopkg.in/yaml.v2"
|
||||||
|
@ -197,20 +198,14 @@ func NewAlertsCmd() *cobra.Command {
|
||||||
Short: "Manage alerts",
|
Short: "Manage alerts",
|
||||||
Args: cobra.MinimumNArgs(1),
|
Args: cobra.MinimumNArgs(1),
|
||||||
DisableAutoGenTag: true,
|
DisableAutoGenTag: true,
|
||||||
PersistentPreRun: func(cmd *cobra.Command, args []string) {
|
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
|
||||||
var err error
|
var err error
|
||||||
if err := csConfig.LoadAPIClient(); err != nil {
|
if err := csConfig.LoadAPIClient(); err != nil {
|
||||||
log.Fatalf("loading api client: %s", err.Error())
|
return errors.Wrap(err, "loading api client")
|
||||||
}
|
|
||||||
if csConfig.API.Client == nil {
|
|
||||||
log.Fatalln("There is no configuration on 'api_client:'")
|
|
||||||
}
|
|
||||||
if csConfig.API.Client.Credentials == nil {
|
|
||||||
log.Fatalf("Please provide credentials for the API in '%s'", csConfig.API.Client.CredentialsFilePath)
|
|
||||||
}
|
}
|
||||||
apiURL, err := url.Parse(csConfig.API.Client.Credentials.URL)
|
apiURL, err := url.Parse(csConfig.API.Client.Credentials.URL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("parsing api url: %s", apiURL)
|
return errors.Wrapf(err, "parsing api url %s", apiURL)
|
||||||
}
|
}
|
||||||
Client, err = apiclient.NewClient(&apiclient.Config{
|
Client, err = apiclient.NewClient(&apiclient.Config{
|
||||||
MachineID: csConfig.API.Client.Credentials.Login,
|
MachineID: csConfig.API.Client.Credentials.Login,
|
||||||
|
@ -221,8 +216,9 @@ func NewAlertsCmd() *cobra.Command {
|
||||||
})
|
})
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("new api client: %s", err.Error())
|
return errors.Wrap(err, "new api client")
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@ import (
|
||||||
"github.com/go-openapi/strfmt"
|
"github.com/go-openapi/strfmt"
|
||||||
"github.com/jszwec/csvutil"
|
"github.com/jszwec/csvutil"
|
||||||
"github.com/olekukonko/tablewriter"
|
"github.com/olekukonko/tablewriter"
|
||||||
|
"github.com/pkg/errors"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
@ -147,20 +148,14 @@ func NewDecisionsCmd() *cobra.Command {
|
||||||
/*TBD example*/
|
/*TBD example*/
|
||||||
Args: cobra.MinimumNArgs(1),
|
Args: cobra.MinimumNArgs(1),
|
||||||
DisableAutoGenTag: true,
|
DisableAutoGenTag: true,
|
||||||
PersistentPreRun: func(cmd *cobra.Command, args []string) {
|
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
|
||||||
if err := csConfig.LoadAPIClient(); err != nil {
|
if err := csConfig.LoadAPIClient(); err != nil {
|
||||||
log.Fatalf(err.Error())
|
return errors.Wrap(err, "loading api client")
|
||||||
}
|
|
||||||
if csConfig.API.Client == nil {
|
|
||||||
log.Fatalln("There is no configuration on 'api_client:'")
|
|
||||||
}
|
|
||||||
if csConfig.API.Client.Credentials == nil {
|
|
||||||
log.Fatalf("Please provide credentials for the API in '%s'", csConfig.API.Client.CredentialsFilePath)
|
|
||||||
}
|
}
|
||||||
password := strfmt.Password(csConfig.API.Client.Credentials.Password)
|
password := strfmt.Password(csConfig.API.Client.Credentials.Password)
|
||||||
apiurl, err := url.Parse(csConfig.API.Client.Credentials.URL)
|
apiurl, err := url.Parse(csConfig.API.Client.Credentials.URL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("parsing api url ('%s'): %s", csConfig.API.Client.Credentials.URL, err)
|
return errors.Wrapf(err, "parsing api url %s", csConfig.API.Client.Credentials.URL)
|
||||||
}
|
}
|
||||||
Client, err = apiclient.NewClient(&apiclient.Config{
|
Client, err = apiclient.NewClient(&apiclient.Config{
|
||||||
MachineID: csConfig.API.Client.Credentials.Login,
|
MachineID: csConfig.API.Client.Credentials.Login,
|
||||||
|
@ -170,8 +165,9 @@ func NewDecisionsCmd() *cobra.Command {
|
||||||
VersionPrefix: "v1",
|
VersionPrefix: "v1",
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("creating api client : %s", err)
|
return errors.Wrap(err, "creating api client")
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,7 @@ import (
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cwversion"
|
"github.com/crowdsecurity/crowdsec/pkg/cwversion"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/models"
|
"github.com/crowdsecurity/crowdsec/pkg/models"
|
||||||
"github.com/go-openapi/strfmt"
|
"github.com/go-openapi/strfmt"
|
||||||
|
"github.com/pkg/errors"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"gopkg.in/yaml.v2"
|
"gopkg.in/yaml.v2"
|
||||||
|
@ -29,13 +30,7 @@ func NewLapiCmd() *cobra.Command {
|
||||||
DisableAutoGenTag: true,
|
DisableAutoGenTag: true,
|
||||||
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
|
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
|
||||||
if err := csConfig.LoadAPIClient(); err != nil {
|
if err := csConfig.LoadAPIClient(); err != nil {
|
||||||
return fmt.Errorf("loading api client: %s", err.Error())
|
return errors.Wrap(err, "loading api client")
|
||||||
}
|
|
||||||
if csConfig.API.Client == nil {
|
|
||||||
log.Fatalln("There is no API->client configuration")
|
|
||||||
}
|
|
||||||
if csConfig.API.Client.Credentials == nil {
|
|
||||||
log.Fatalf("no configuration for Local API (LAPI) in '%s'", *csConfig.FilePath)
|
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
|
|
|
@ -183,6 +183,6 @@ It is meant to allow you to manage bans, parsers/scenarios/etc, api and generall
|
||||||
rootCmd.AddCommand(NewHubTestCmd())
|
rootCmd.AddCommand(NewHubTestCmd())
|
||||||
rootCmd.AddCommand(NewNotificationsCmd())
|
rootCmd.AddCommand(NewNotificationsCmd())
|
||||||
if err := rootCmd.Execute(); err != nil {
|
if err := rootCmd.Execute(); err != nil {
|
||||||
log.Fatalf("While executing root command : %s", err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ import (
|
||||||
func initAPIServer(cConfig *csconfig.Config) (*apiserver.APIServer, error) {
|
func initAPIServer(cConfig *csconfig.Config) (*apiserver.APIServer, error) {
|
||||||
apiServer, err := apiserver.NewServer(cConfig.API.Server)
|
apiServer, err := apiserver.NewServer(cConfig.API.Server)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("unable to run local API: %s", err)
|
return nil, errors.Wrap(err, "unable to run local API")
|
||||||
}
|
}
|
||||||
|
|
||||||
if hasPlugins(cConfig.API.Server.Profiles) {
|
if hasPlugins(cConfig.API.Server.Profiles) {
|
||||||
|
|
|
@ -42,7 +42,7 @@ func runPour(input chan types.Event, holders []leaky.BucketFactory, buckets *lea
|
||||||
//here we can bucketify with parsed
|
//here we can bucketify with parsed
|
||||||
poured, err := leaky.PourItemToHolders(parsed, holders, buckets)
|
poured, err := leaky.PourItemToHolders(parsed, holders, buckets)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("bucketify failed for: %v", parsed)
|
log.Errorf("bucketify failed for: %v", parsed)
|
||||||
return fmt.Errorf("process of event failed : %v", err)
|
return fmt.Errorf("process of event failed : %v", err)
|
||||||
}
|
}
|
||||||
if poured {
|
if poured {
|
||||||
|
|
|
@ -51,7 +51,11 @@ func StartRunSvc() {
|
||||||
|
|
||||||
if exitCode, err := Serve(cConfig); err != nil {
|
if exitCode, err := Serve(cConfig); err != nil {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf(err.Error())
|
// this method of logging a fatal error does not
|
||||||
|
// trigger a program exit (as stated by the authors, it
|
||||||
|
// is not going to change in logrus to keep backward
|
||||||
|
// compatibility), and allows us to report coverage.
|
||||||
|
log.NewEntry(log.StandardLogger()).Log(log.FatalLevel, err)
|
||||||
if !bincoverTesting {
|
if !bincoverTesting {
|
||||||
os.Exit(exitCode)
|
os.Exit(exitCode)
|
||||||
}
|
}
|
||||||
|
|
|
@ -94,7 +94,7 @@ func NewServer(config *csconfig.LocalApiServerCfg) (*APIServer, error) {
|
||||||
var flushScheduler *gocron.Scheduler
|
var flushScheduler *gocron.Scheduler
|
||||||
dbClient, err := database.NewClient(config.DbConfig)
|
dbClient, err := database.NewClient(config.DbConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return &APIServer{}, fmt.Errorf("unable to init database client: %s", err)
|
return &APIServer{}, errors.Wrap(err, "unable to init database client")
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.DbConfig.Flush != nil {
|
if config.DbConfig.Flush != nil {
|
||||||
|
|
|
@ -289,7 +289,7 @@ func TestWithWrongDBConfig(t *testing.T) {
|
||||||
apiServer, err := NewServer(config.API.Server)
|
apiServer, err := NewServer(config.API.Server)
|
||||||
|
|
||||||
assert.Equal(t, apiServer, &APIServer{})
|
assert.Equal(t, apiServer, &APIServer{})
|
||||||
assert.Equal(t, "unable to init database client: unknown database type", err.Error())
|
assert.Equal(t, "unable to init database client: unknown database type 'test'", err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestWithWrongFlushConfig(t *testing.T) {
|
func TestWithWrongFlushConfig(t *testing.T) {
|
||||||
|
|
|
@ -58,18 +58,20 @@ func (l *LocalApiClientCfg) Load() error {
|
||||||
patcher := yamlpatch.NewPatcher(l.CredentialsFilePath, ".local")
|
patcher := yamlpatch.NewPatcher(l.CredentialsFilePath, ".local")
|
||||||
fcontent, err := patcher.MergedPatchContent()
|
fcontent, err := patcher.MergedPatchContent()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrapf(err, "failed to read api client credential configuration file '%s'", l.CredentialsFilePath)
|
return err
|
||||||
}
|
}
|
||||||
err = yaml.UnmarshalStrict(fcontent, &l.Credentials)
|
err = yaml.UnmarshalStrict(fcontent, &l.Credentials)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrapf(err, "failed unmarshaling api client credential configuration file '%s'", l.CredentialsFilePath)
|
return errors.Wrapf(err, "failed unmarshaling api client credential configuration file '%s'", l.CredentialsFilePath)
|
||||||
}
|
}
|
||||||
|
if l.Credentials == nil || l.Credentials.URL == "" {
|
||||||
|
return fmt.Errorf("no credentials or URL found in api client configuration '%s'", l.CredentialsFilePath)
|
||||||
|
}
|
||||||
|
|
||||||
if l.Credentials != nil && l.Credentials.URL != "" {
|
if l.Credentials != nil && l.Credentials.URL != "" {
|
||||||
if !strings.HasSuffix(l.Credentials.URL, "/") {
|
if !strings.HasSuffix(l.Credentials.URL, "/") {
|
||||||
l.Credentials.URL = l.Credentials.URL + "/"
|
l.Credentials.URL = l.Credentials.URL + "/"
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
log.Warningf("no credentials or URL found in api client configuration '%s'", l.CredentialsFilePath)
|
|
||||||
}
|
}
|
||||||
if l.InsecureSkipVerify == nil {
|
if l.InsecureSkipVerify == nil {
|
||||||
apiclient.InsecureSkipVerify = false
|
apiclient.InsecureSkipVerify = false
|
||||||
|
@ -177,13 +179,13 @@ func (c *Config) LoadAPIServer() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Config) LoadAPIClient() error {
|
func (c *Config) LoadAPIClient() error {
|
||||||
if c.API != nil && c.API.Client != nil && c.API.Client.CredentialsFilePath != "" && !c.DisableAgent {
|
if c.API == nil || c.API.Client == nil || c.API.Client.CredentialsFilePath == "" || c.DisableAgent {
|
||||||
if err := c.API.Client.Load(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return fmt.Errorf("no API client section in configuration")
|
return fmt.Errorf("no API client section in configuration")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := c.API.Client.Load(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,9 +18,9 @@ func TestNormalLoad(t *testing.T) {
|
||||||
|
|
||||||
_, err = NewConfig("./tests/xxx.yaml", false, false)
|
_, err = NewConfig("./tests/xxx.yaml", false, false)
|
||||||
if runtime.GOOS != "windows" {
|
if runtime.GOOS != "windows" {
|
||||||
assert.EqualError(t, err, "while reading ./tests/xxx.yaml: open ./tests/xxx.yaml: no such file or directory")
|
assert.EqualError(t, err, "while reading yaml file: open ./tests/xxx.yaml: no such file or directory")
|
||||||
} else {
|
} else {
|
||||||
assert.EqualError(t, err, "while reading ./tests/xxx.yaml: open ./tests/xxx.yaml: The system cannot find the file specified.")
|
assert.EqualError(t, err, "while reading yaml file: open ./tests/xxx.yaml: The system cannot find the file specified.")
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = NewConfig("./tests/simulation.yaml", false, false)
|
_, err = NewConfig("./tests/simulation.yaml", false, false)
|
||||||
|
|
|
@ -89,7 +89,7 @@ func TestSimulationLoading(t *testing.T) {
|
||||||
},
|
},
|
||||||
Crowdsec: &CrowdsecServiceCfg{},
|
Crowdsec: &CrowdsecServiceCfg{},
|
||||||
},
|
},
|
||||||
err: fmt.Sprintf("while reading %s: open %s: The system cannot find the file specified.", testXXFullPath, testXXFullPath),
|
err: fmt.Sprintf("while reading yaml file: open %s: The system cannot find the file specified.", testXXFullPath),
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
tests = append(tests, struct {
|
tests = append(tests, struct {
|
||||||
|
@ -106,7 +106,7 @@ func TestSimulationLoading(t *testing.T) {
|
||||||
},
|
},
|
||||||
Crowdsec: &CrowdsecServiceCfg{},
|
Crowdsec: &CrowdsecServiceCfg{},
|
||||||
},
|
},
|
||||||
err: fmt.Sprintf("while reading %s: open %s: no such file or directory", testXXFullPath, testXXFullPath),
|
err: fmt.Sprintf("while reading yaml file: open %s: no such file or directory", testXXFullPath),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -100,7 +100,7 @@ func NewClient(config *csconfig.DatabaseCfg) (*Client, error) {
|
||||||
}
|
}
|
||||||
client = ent.NewClient(ent.Driver(drv), entOpt)
|
client = ent.NewClient(ent.Driver(drv), entOpt)
|
||||||
default:
|
default:
|
||||||
return &Client{}, fmt.Errorf("unknown database type")
|
return &Client{}, fmt.Errorf("unknown database type '%s'", config.Type)
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.LogLevel != nil && *config.LogLevel >= log.DebugLevel {
|
if config.LogLevel != nil && *config.LogLevel >= log.DebugLevel {
|
||||||
|
|
|
@ -2,6 +2,7 @@ package types
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
@ -10,6 +11,9 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestDownladFile(t *testing.T) {
|
func TestDownladFile(t *testing.T) {
|
||||||
|
examplePath := "./example.txt"
|
||||||
|
defer os.Remove(examplePath)
|
||||||
|
|
||||||
httpmock.Activate()
|
httpmock.Activate()
|
||||||
defer httpmock.DeactivateAndReset()
|
defer httpmock.DeactivateAndReset()
|
||||||
//OK
|
//OK
|
||||||
|
@ -23,16 +27,16 @@ func TestDownladFile(t *testing.T) {
|
||||||
"https://example.com/x",
|
"https://example.com/x",
|
||||||
httpmock.NewStringResponder(404, "not found"),
|
httpmock.NewStringResponder(404, "not found"),
|
||||||
)
|
)
|
||||||
err := downloadFile("https://example.com/xx", "./example.txt")
|
err := downloadFile("https://example.com/xx", examplePath)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
content, err := ioutil.ReadFile("./example.txt")
|
content, err := ioutil.ReadFile(examplePath)
|
||||||
assert.Equal(t, "example content oneoneone", string(content))
|
assert.Equal(t, "example content oneoneone", string(content))
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
//bad uri
|
//bad uri
|
||||||
err = downloadFile("https://zz.com", "./example.txt")
|
err = downloadFile("https://zz.com", examplePath)
|
||||||
assert.Error(t, err)
|
assert.Error(t, err)
|
||||||
//404
|
//404
|
||||||
err = downloadFile("https://example.com/x", "./example.txt")
|
err = downloadFile("https://example.com/x", examplePath)
|
||||||
assert.Error(t, err)
|
assert.Error(t, err)
|
||||||
//bad target
|
//bad target
|
||||||
err = downloadFile("https://example.com/xx", "")
|
err = downloadFile("https://example.com/xx", "")
|
||||||
|
|
|
@ -29,7 +29,7 @@ func readYAML(filePath string) ([]byte, error) {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
if content, err = os.ReadFile(filePath); err != nil {
|
if content, err = os.ReadFile(filePath); err != nil {
|
||||||
return nil, errors.Wrapf(err, "while reading %s", filePath)
|
return nil, errors.Wrap(err, "while reading yaml file")
|
||||||
}
|
}
|
||||||
|
|
||||||
var yamlMap map[interface{}]interface{}
|
var yamlMap map[interface{}]interface{}
|
||||||
|
|
|
@ -26,14 +26,14 @@ declare stderr
|
||||||
|
|
||||||
#----------
|
#----------
|
||||||
|
|
||||||
@test "$FILE cscli - usage" {
|
@test "${FILE} cscli - usage" {
|
||||||
run -0 cscli
|
run -0 cscli
|
||||||
assert_output --partial "Usage:"
|
assert_output --partial "Usage:"
|
||||||
assert_output --partial "cscli [command]"
|
assert_output --partial "cscli [command]"
|
||||||
assert_output --partial "Available Commands:"
|
assert_output --partial "Available Commands:"
|
||||||
}
|
}
|
||||||
|
|
||||||
@test "$FILE cscli version" {
|
@test "${FILE} cscli version" {
|
||||||
run -0 cscli version
|
run -0 cscli version
|
||||||
assert_output --partial "version:"
|
assert_output --partial "version:"
|
||||||
assert_output --partial "Codename:"
|
assert_output --partial "Codename:"
|
||||||
|
@ -51,7 +51,7 @@ declare stderr
|
||||||
assert_output --partial "version:"
|
assert_output --partial "version:"
|
||||||
}
|
}
|
||||||
|
|
||||||
@test "$FILE cscli help" {
|
@test "${FILE} cscli help" {
|
||||||
run -0 cscli help
|
run -0 cscli help
|
||||||
assert_line "Available Commands:"
|
assert_line "Available Commands:"
|
||||||
assert_line --regexp ".* help .* Help about any command"
|
assert_line --regexp ".* help .* Help about any command"
|
||||||
|
@ -62,7 +62,7 @@ declare stderr
|
||||||
assert_line "Available Commands:"
|
assert_line "Available Commands:"
|
||||||
}
|
}
|
||||||
|
|
||||||
@test "$FILE cscli alerts list: at startup returns at least one entry: community pull" {
|
@test "${FILE} cscli alerts list: at startup returns at least one entry: community pull" {
|
||||||
is_db_postgres && skip
|
is_db_postgres && skip
|
||||||
# it should have been received while preparing the fixture
|
# it should have been received while preparing the fixture
|
||||||
run -0 cscli alerts list -o json
|
run -0 cscli alerts list -o json
|
||||||
|
@ -80,7 +80,7 @@ declare stderr
|
||||||
# refute_output 0
|
# refute_output 0
|
||||||
}
|
}
|
||||||
|
|
||||||
@test "$FILE cscli capi status" {
|
@test "${FILE} cscli capi status" {
|
||||||
run -0 cscli capi status
|
run -0 cscli capi status
|
||||||
assert_output --partial "Loaded credentials from"
|
assert_output --partial "Loaded credentials from"
|
||||||
assert_output --partial "Trying to authenticate with username"
|
assert_output --partial "Trying to authenticate with username"
|
||||||
|
@ -88,7 +88,7 @@ declare stderr
|
||||||
assert_output --partial "You can successfully interact with Central API (CAPI)"
|
assert_output --partial "You can successfully interact with Central API (CAPI)"
|
||||||
}
|
}
|
||||||
|
|
||||||
@test "$FILE cscli config show -o human" {
|
@test "${FILE} cscli config show -o human" {
|
||||||
run -0 cscli config show -o human
|
run -0 cscli config show -o human
|
||||||
assert_output --partial "Global:"
|
assert_output --partial "Global:"
|
||||||
assert_output --partial "Crowdsec:"
|
assert_output --partial "Crowdsec:"
|
||||||
|
@ -96,7 +96,7 @@ declare stderr
|
||||||
assert_output --partial "Local API Server:"
|
assert_output --partial "Local API Server:"
|
||||||
}
|
}
|
||||||
|
|
||||||
@test "$FILE cscli config show -o json" {
|
@test "${FILE} cscli config show -o json" {
|
||||||
run -0 cscli config show -o json
|
run -0 cscli config show -o json
|
||||||
assert_output --partial '"API":'
|
assert_output --partial '"API":'
|
||||||
assert_output --partial '"Common":'
|
assert_output --partial '"Common":'
|
||||||
|
@ -109,7 +109,7 @@ declare stderr
|
||||||
assert_output --partial '"Prometheus":'
|
assert_output --partial '"Prometheus":'
|
||||||
}
|
}
|
||||||
|
|
||||||
@test "$FILE cscli config show -o raw" {
|
@test "${FILE} cscli config show -o raw" {
|
||||||
run -0 cscli config show -o raw
|
run -0 cscli config show -o raw
|
||||||
assert_line "api:"
|
assert_line "api:"
|
||||||
assert_line "common:"
|
assert_line "common:"
|
||||||
|
@ -121,45 +121,112 @@ declare stderr
|
||||||
assert_line "prometheus:"
|
assert_line "prometheus:"
|
||||||
}
|
}
|
||||||
|
|
||||||
@test "$FILE cscli config show --key" {
|
@test "${FILE} cscli config show --key" {
|
||||||
run -0 cscli config show --key Config.API.Server.ListenURI
|
run -0 cscli config show --key Config.API.Server.ListenURI
|
||||||
assert_output "127.0.0.1:8080"
|
assert_output "127.0.0.1:8080"
|
||||||
}
|
}
|
||||||
|
|
||||||
@test "$FILE cscli config backup" {
|
@test "${FILE} cscli config backup" {
|
||||||
backupdir=$(TMPDIR="${BATS_TEST_TMPDIR}" mktemp -u)
|
backupdir=$(TMPDIR="${BATS_TEST_TMPDIR}" mktemp -u)
|
||||||
run -0 cscli config backup "${backupdir}"
|
run -0 cscli config backup "${backupdir}"
|
||||||
assert_output --partial "Starting configuration backup"
|
assert_output --partial "Starting configuration backup"
|
||||||
run -1 --separate-stderr cscli config backup "${backupdir}"
|
run -1 --separate-stderr cscli config backup "${backupdir}"
|
||||||
|
|
||||||
run -0 echo "$stderr"
|
run -0 echo "${stderr}"
|
||||||
assert_output --partial "Failed to backup configurations"
|
assert_output --partial "Failed to backup configurations"
|
||||||
assert_output --partial "file exists"
|
assert_output --partial "file exists"
|
||||||
rm -rf -- "${backupdir:?}"
|
rm -rf -- "${backupdir:?}"
|
||||||
}
|
}
|
||||||
|
|
||||||
@test "$FILE cscli lapi status" {
|
@test "${FILE} cscli lapi status" {
|
||||||
if is_db_postgres; then sleep 4; fi
|
if is_db_postgres; then sleep 4; fi
|
||||||
run -0 --separate-stderr cscli lapi status
|
run -0 --separate-stderr cscli lapi status
|
||||||
|
|
||||||
run -0 echo "$stderr"
|
run -0 echo "${stderr}"
|
||||||
assert_output --partial "Loaded credentials from"
|
assert_output --partial "Loaded credentials from"
|
||||||
assert_output --partial "Trying to authenticate with username"
|
assert_output --partial "Trying to authenticate with username"
|
||||||
assert_output --partial " on http://127.0.0.1:8080/"
|
assert_output --partial " on http://127.0.0.1:8080/"
|
||||||
assert_output --partial "You can successfully interact with Local API (LAPI)"
|
assert_output --partial "You can successfully interact with Local API (LAPI)"
|
||||||
}
|
}
|
||||||
|
|
||||||
@test "$FILE cscli metrics" {
|
@test "${FILE} cscli - missing LAPI credentials file" {
|
||||||
|
LOCAL_API_CREDENTIALS=$(config_yq '.api.client.credentials_path')
|
||||||
|
rm -f "${LOCAL_API_CREDENTIALS}"
|
||||||
|
run -1 --separate-stderr cscli lapi status
|
||||||
|
run -0 echo "${stderr}"
|
||||||
|
assert_output --partial "loading api client: while reading yaml file: open ${LOCAL_API_CREDENTIALS}: no such file or directory"
|
||||||
|
|
||||||
|
run -1 --separate-stderr cscli alerts list
|
||||||
|
run -0 echo "${stderr}"
|
||||||
|
assert_output --partial "loading api client: while reading yaml file: open ${LOCAL_API_CREDENTIALS}: no such file or directory"
|
||||||
|
|
||||||
|
run -1 --separate-stderr cscli decisions list
|
||||||
|
run -0 echo "${stderr}"
|
||||||
|
assert_output --partial "loading api client: while reading yaml file: open ${LOCAL_API_CREDENTIALS}: no such file or directory"
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "${FILE} cscli - empty LAPI credentials file" {
|
||||||
|
LOCAL_API_CREDENTIALS=$(config_yq '.api.client.credentials_path')
|
||||||
|
truncate -s 0 "${LOCAL_API_CREDENTIALS}"
|
||||||
|
run -1 --separate-stderr cscli lapi status
|
||||||
|
run -0 echo "${stderr}"
|
||||||
|
assert_output --partial "no credentials or URL found in api client configuration '${LOCAL_API_CREDENTIALS}'"
|
||||||
|
|
||||||
|
run -1 --separate-stderr cscli alerts list
|
||||||
|
run -0 echo "${stderr}"
|
||||||
|
assert_output --partial "no credentials or URL found in api client configuration '${LOCAL_API_CREDENTIALS}'"
|
||||||
|
|
||||||
|
run -1 --separate-stderr cscli decisions list
|
||||||
|
run -0 echo "${stderr}"
|
||||||
|
assert_output --partial "no credentials or URL found in api client configuration '${LOCAL_API_CREDENTIALS}'"
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "${FILE} cscli - missing LAPI client settings" {
|
||||||
|
yq e 'del(.api.client)' -i "${CONFIG_YAML}"
|
||||||
|
run -1 --separate-stderr cscli lapi status
|
||||||
|
run -0 echo "${stderr}"
|
||||||
|
assert_output --partial "loading api client: no API client section in configuration"
|
||||||
|
|
||||||
|
run -1 --separate-stderr cscli alerts list
|
||||||
|
run -0 echo "${stderr}"
|
||||||
|
assert_output --partial "loading api client: no API client section in configuration"
|
||||||
|
|
||||||
|
run -1 --separate-stderr cscli decisions list
|
||||||
|
run -0 echo "${stderr}"
|
||||||
|
assert_output --partial "loading api client: no API client section in configuration"
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "${FILE} cscli - malformed LAPI url" {
|
||||||
|
LOCAL_API_CREDENTIALS=$(config_yq '.api.client.credentials_path')
|
||||||
|
yq e '.url="https://127.0.0.1:-80"' -i "${LOCAL_API_CREDENTIALS}"
|
||||||
|
|
||||||
|
run -1 --separate-stderr cscli lapi status
|
||||||
|
run -0 echo "${stderr}"
|
||||||
|
assert_output --partial 'parsing api url'
|
||||||
|
assert_output --partial 'invalid port \":-80\" after host'
|
||||||
|
|
||||||
|
run -1 --separate-stderr cscli alerts list
|
||||||
|
run -0 echo "${stderr}"
|
||||||
|
assert_output --partial 'parsing api url'
|
||||||
|
assert_output --partial 'invalid port ":-80" after host'
|
||||||
|
|
||||||
|
run -1 --separate-stderr cscli decisions list
|
||||||
|
run -0 echo "${stderr}"
|
||||||
|
assert_output --partial 'parsing api url'
|
||||||
|
assert_output --partial 'invalid port ":-80" after host'
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "${FILE} cscli metrics" {
|
||||||
run -0 cscli lapi status
|
run -0 cscli lapi status
|
||||||
run -0 --separate-stderr cscli metrics
|
run -0 --separate-stderr cscli metrics
|
||||||
assert_output --partial "ROUTE"
|
assert_output --partial "ROUTE"
|
||||||
assert_output --partial '/v1/watchers/login'
|
assert_output --partial '/v1/watchers/login'
|
||||||
|
|
||||||
run -0 echo "$stderr"
|
run -0 echo "${stderr}"
|
||||||
assert_output --partial "Local Api Metrics:"
|
assert_output --partial "Local Api Metrics:"
|
||||||
}
|
}
|
||||||
|
|
||||||
@test "$FILE 'cscli completion' with or without configuration file" {
|
@test "${FILE} 'cscli completion' with or without configuration file" {
|
||||||
run -0 cscli completion bash
|
run -0 cscli completion bash
|
||||||
assert_output --partial "# bash completion for cscli"
|
assert_output --partial "# bash completion for cscli"
|
||||||
run -0 cscli completion zsh
|
run -0 cscli completion zsh
|
||||||
|
@ -172,7 +239,7 @@ declare stderr
|
||||||
assert_output --partial "# zsh completion for cscli"
|
assert_output --partial "# zsh completion for cscli"
|
||||||
}
|
}
|
||||||
|
|
||||||
@test "$FILE cscli hub list" {
|
@test "${FILE} cscli hub list" {
|
||||||
# we check for the presence of some objects. There may be others when we
|
# we check for the presence of some objects. There may be others when we
|
||||||
# use $PACKAGE_TESTING, so the order is not important.
|
# use $PACKAGE_TESTING, so the order is not important.
|
||||||
|
|
||||||
|
|
36
tests/bats/06_crowdsec.bats
Executable file
36
tests/bats/06_crowdsec.bats
Executable file
|
@ -0,0 +1,36 @@
|
||||||
|
#!/usr/bin/env bats
|
||||||
|
# vim: ft=bats:list:ts=8:sts=4:sw=4:et:ai:si:
|
||||||
|
|
||||||
|
set -u
|
||||||
|
|
||||||
|
setup_file() {
|
||||||
|
load "../lib/setup_file.sh"
|
||||||
|
}
|
||||||
|
|
||||||
|
teardown_file() {
|
||||||
|
load "../lib/teardown_file.sh"
|
||||||
|
}
|
||||||
|
|
||||||
|
setup() {
|
||||||
|
load "../lib/setup.sh"
|
||||||
|
./instance-data load
|
||||||
|
}
|
||||||
|
|
||||||
|
teardown() {
|
||||||
|
./instance-crowdsec stop
|
||||||
|
}
|
||||||
|
|
||||||
|
# to silence shellcheck
|
||||||
|
declare stderr
|
||||||
|
|
||||||
|
#----------
|
||||||
|
|
||||||
|
@test "${FILE} crowdsec - print error on exit" {
|
||||||
|
# errors that cause program termination are printed to stderr, not only logs
|
||||||
|
yq e '.db_config.type="meh"' -i "${CONFIG_YAML}"
|
||||||
|
run -1 --separate-stderr "${BIN_DIR}/crowdsec"
|
||||||
|
refute_output
|
||||||
|
run -0 echo "${stderr}"
|
||||||
|
assert_output --partial "api server init: unable to run local API: unable to init database client: unknown database type 'meh'"
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue