cscli config show: avoid globals, use yaml v3 (#2863)
* cscli config show: avoid globals, use yaml v3 * lint (whitespace/errors)
This commit is contained in:
parent
718d1c54b2
commit
c64332d30a
8 changed files with 60 additions and 47 deletions
|
@ -4,6 +4,7 @@ import (
|
|||
"context"
|
||||
"encoding/csv"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"net/url"
|
||||
"os"
|
||||
|
@ -204,6 +205,7 @@ func (cli *cliAlerts) NewCommand() *cobra.Command {
|
|||
if err != nil {
|
||||
return fmt.Errorf("parsing api url %s: %w", apiURL, err)
|
||||
}
|
||||
|
||||
cli.client, err = apiclient.NewClient(&apiclient.Config{
|
||||
MachineID: cfg.API.Client.Credentials.Login,
|
||||
Password: strfmt.Password(cfg.API.Client.Credentials.Password),
|
||||
|
@ -211,7 +213,6 @@ func (cli *cliAlerts) NewCommand() *cobra.Command {
|
|||
URL: apiURL,
|
||||
VersionPrefix: "v1",
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return fmt.Errorf("new api client: %w", err)
|
||||
}
|
||||
|
@ -229,7 +230,7 @@ func (cli *cliAlerts) NewCommand() *cobra.Command {
|
|||
}
|
||||
|
||||
func (cli *cliAlerts) NewListCmd() *cobra.Command {
|
||||
var alertListFilter = apiclient.AlertsListOpts{
|
||||
alertListFilter := apiclient.AlertsListOpts{
|
||||
ScopeEquals: new(string),
|
||||
ValueEquals: new(string),
|
||||
ScenarioEquals: new(string),
|
||||
|
@ -363,7 +364,7 @@ func (cli *cliAlerts) NewDeleteCmd() *cobra.Command {
|
|||
delAlertByID string
|
||||
)
|
||||
|
||||
var alertDeleteFilter = apiclient.AlertsDeleteOpts{
|
||||
alertDeleteFilter := apiclient.AlertsDeleteOpts{
|
||||
ScopeEquals: new(string),
|
||||
ValueEquals: new(string),
|
||||
ScenarioEquals: new(string),
|
||||
|
@ -391,7 +392,7 @@ cscli alerts delete -s crowdsecurity/ssh-bf"`,
|
|||
*alertDeleteFilter.ScenarioEquals == "" && *alertDeleteFilter.IPEquals == "" &&
|
||||
*alertDeleteFilter.RangeEquals == "" && delAlertByID == "" {
|
||||
_ = cmd.Usage()
|
||||
return fmt.Errorf("at least one filter or --all must be specified")
|
||||
return errors.New("at least one filter or --all must be specified")
|
||||
}
|
||||
|
||||
return nil
|
||||
|
@ -478,7 +479,7 @@ func (cli *cliAlerts) NewInspectCmd() *cobra.Command {
|
|||
cfg := cli.cfg()
|
||||
if len(args) == 0 {
|
||||
printHelp(cmd)
|
||||
return fmt.Errorf("missing alert_id")
|
||||
return errors.New("missing alert_id")
|
||||
}
|
||||
for _, alertID := range args {
|
||||
id, err := strconv.Atoi(alertID)
|
||||
|
|
|
@ -10,13 +10,15 @@ import (
|
|||
"github.com/sanity-io/litter"
|
||||
log "github.com/sirupsen/logrus"
|
||||
"github.com/spf13/cobra"
|
||||
"gopkg.in/yaml.v2"
|
||||
"gopkg.in/yaml.v3"
|
||||
|
||||
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
||||
"github.com/crowdsecurity/crowdsec/pkg/exprhelpers"
|
||||
)
|
||||
|
||||
func showConfigKey(key string) error {
|
||||
func (cli *cliConfig) showKey(key string) error {
|
||||
cfg := cli.cfg()
|
||||
|
||||
type Env struct {
|
||||
Config *csconfig.Config
|
||||
}
|
||||
|
@ -30,15 +32,15 @@ func showConfigKey(key string) error {
|
|||
return err
|
||||
}
|
||||
|
||||
output, err := expr.Run(program, Env{Config: csConfig})
|
||||
output, err := expr.Run(program, Env{Config: cfg})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
switch csConfig.Cscli.Output {
|
||||
switch cfg.Cscli.Output {
|
||||
case "human", "raw":
|
||||
// Don't use litter for strings, it adds quotes
|
||||
// that we didn't have before
|
||||
// that would break compatibility with previous versions
|
||||
switch output.(type) {
|
||||
case string:
|
||||
fmt.Println(output)
|
||||
|
@ -51,13 +53,14 @@ func showConfigKey(key string) error {
|
|||
return fmt.Errorf("failed to marshal configuration: %w", err)
|
||||
}
|
||||
|
||||
fmt.Printf("%s\n", string(data))
|
||||
fmt.Println(string(data))
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
var configShowTemplate = `Global:
|
||||
func (cli *cliConfig) template() string {
|
||||
return `Global:
|
||||
|
||||
{{- if .ConfigPaths }}
|
||||
- Configuration Folder : {{.ConfigPaths.ConfigDir}}
|
||||
|
@ -182,19 +185,11 @@ Central API:
|
|||
{{- end }}
|
||||
{{- end }}
|
||||
`
|
||||
}
|
||||
|
||||
func (cli *cliConfig) show(key string) error {
|
||||
func (cli *cliConfig) show() error {
|
||||
cfg := cli.cfg()
|
||||
|
||||
if err := cfg.LoadAPIClient(); err != nil {
|
||||
log.Errorf("failed to load API client configuration: %s", err)
|
||||
// don't return, we can still show the configuration
|
||||
}
|
||||
|
||||
if key != "" {
|
||||
return showConfigKey(key)
|
||||
}
|
||||
|
||||
switch cfg.Cscli.Output {
|
||||
case "human":
|
||||
// The tests on .Enable look funny because the option has a true default which has
|
||||
|
@ -205,7 +200,7 @@ func (cli *cliConfig) show(key string) error {
|
|||
"ValueBool": func(b *bool) bool { return b != nil && *b },
|
||||
}
|
||||
|
||||
tmp, err := template.New("config").Funcs(funcs).Parse(configShowTemplate)
|
||||
tmp, err := template.New("config").Funcs(funcs).Parse(cli.template())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -220,14 +215,14 @@ func (cli *cliConfig) show(key string) error {
|
|||
return fmt.Errorf("failed to marshal configuration: %w", err)
|
||||
}
|
||||
|
||||
fmt.Printf("%s\n", string(data))
|
||||
fmt.Println(string(data))
|
||||
case "raw":
|
||||
data, err := yaml.Marshal(cfg)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to marshal configuration: %w", err)
|
||||
}
|
||||
|
||||
fmt.Printf("%s\n", string(data))
|
||||
fmt.Println(string(data))
|
||||
}
|
||||
|
||||
return nil
|
||||
|
@ -243,7 +238,16 @@ func (cli *cliConfig) newShowCmd() *cobra.Command {
|
|||
Args: cobra.ExactArgs(0),
|
||||
DisableAutoGenTag: true,
|
||||
RunE: func(_ *cobra.Command, _ []string) error {
|
||||
return cli.show(key)
|
||||
if err := cli.cfg().LoadAPIClient(); err != nil {
|
||||
log.Errorf("failed to load API client configuration: %s", err)
|
||||
// don't return, we can still show the configuration
|
||||
}
|
||||
|
||||
if key != "" {
|
||||
return cli.showKey(key)
|
||||
}
|
||||
|
||||
return cli.show()
|
||||
},
|
||||
}
|
||||
|
||||
|
|
|
@ -4,9 +4,11 @@ import (
|
|||
"context"
|
||||
"encoding/csv"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"net/url"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/fatih/color"
|
||||
|
@ -36,7 +38,7 @@ func NewCLIConsole(cfg configGetter) *cliConsole {
|
|||
}
|
||||
|
||||
func (cli *cliConsole) NewCommand() *cobra.Command {
|
||||
var cmd = &cobra.Command{
|
||||
cmd := &cobra.Command{
|
||||
Use: "console [action]",
|
||||
Short: "Manage interaction with Crowdsec console (https://app.crowdsec.net)",
|
||||
Args: cobra.MinimumNArgs(1),
|
||||
|
@ -203,7 +205,7 @@ Enable given information push to the central API. Allows to empower the console`
|
|||
log.Infof("All features have been enabled successfully")
|
||||
} else {
|
||||
if len(args) == 0 {
|
||||
return fmt.Errorf("you must specify at least one feature to enable")
|
||||
return errors.New("you must specify at least one feature to enable")
|
||||
}
|
||||
if err := cli.setConsoleOpts(args, true); err != nil {
|
||||
return err
|
||||
|
@ -288,11 +290,11 @@ func (cli *cliConsole) newStatusCmd() *cobra.Command {
|
|||
}
|
||||
|
||||
rows := [][]string{
|
||||
{csconfig.SEND_MANUAL_SCENARIOS, fmt.Sprintf("%t", *consoleCfg.ShareManualDecisions)},
|
||||
{csconfig.SEND_CUSTOM_SCENARIOS, fmt.Sprintf("%t", *consoleCfg.ShareCustomScenarios)},
|
||||
{csconfig.SEND_TAINTED_SCENARIOS, fmt.Sprintf("%t", *consoleCfg.ShareTaintedScenarios)},
|
||||
{csconfig.SEND_CONTEXT, fmt.Sprintf("%t", *consoleCfg.ShareContext)},
|
||||
{csconfig.CONSOLE_MANAGEMENT, fmt.Sprintf("%t", *consoleCfg.ConsoleManagement)},
|
||||
{csconfig.SEND_MANUAL_SCENARIOS, strconv.FormatBool(*consoleCfg.ShareManualDecisions)},
|
||||
{csconfig.SEND_CUSTOM_SCENARIOS, strconv.FormatBool(*consoleCfg.ShareCustomScenarios)},
|
||||
{csconfig.SEND_TAINTED_SCENARIOS, strconv.FormatBool(*consoleCfg.ShareTaintedScenarios)},
|
||||
{csconfig.SEND_CONTEXT, strconv.FormatBool(*consoleCfg.ShareContext)},
|
||||
{csconfig.CONSOLE_MANAGEMENT, strconv.FormatBool(*consoleCfg.ConsoleManagement)},
|
||||
}
|
||||
for _, row := range rows {
|
||||
err = csvwriter.Write(row)
|
||||
|
|
|
@ -9,7 +9,6 @@ import (
|
|||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
|
||||
/*help to copy the file, ioutil doesn't offer the feature*/
|
||||
|
||||
func copyFileContents(src, dst string) (err error) {
|
||||
|
@ -69,6 +68,7 @@ func CopyFile(sourceSymLink, destinationFile string) error {
|
|||
if !(destinationFileStat.Mode().IsRegular()) {
|
||||
return fmt.Errorf("copyFile: non-regular destination file %s (%q)", destinationFileStat.Name(), destinationFileStat.Mode().String())
|
||||
}
|
||||
|
||||
if os.SameFile(sourceFileStat, destinationFileStat) {
|
||||
return err
|
||||
}
|
||||
|
@ -80,4 +80,3 @@ func CopyFile(sourceSymLink, destinationFile string) error {
|
|||
|
||||
return err
|
||||
}
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@ import (
|
|||
"context"
|
||||
"encoding/csv"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"net/url"
|
||||
"os"
|
||||
|
@ -346,7 +347,7 @@ cscli decisions add --scope username --value foobar
|
|||
addScope = types.Range
|
||||
} else if addValue == "" {
|
||||
printHelp(cmd)
|
||||
return fmt.Errorf("missing arguments, a value is required (--ip, --range or --scope and --value)")
|
||||
return errors.New("missing arguments, a value is required (--ip, --range or --scope and --value)")
|
||||
}
|
||||
|
||||
if addReason == "" {
|
||||
|
@ -371,7 +372,7 @@ cscli decisions add --scope username --value foobar
|
|||
Scenario: &addReason,
|
||||
ScenarioVersion: &empty,
|
||||
Simulated: &simulated,
|
||||
//setting empty scope/value broke plugins, and it didn't seem to be needed anymore w/ latest papi changes
|
||||
// setting empty scope/value broke plugins, and it didn't seem to be needed anymore w/ latest papi changes
|
||||
Source: &models.Source{
|
||||
AsName: empty,
|
||||
AsNumber: empty,
|
||||
|
@ -411,7 +412,7 @@ cscli decisions add --scope username --value foobar
|
|||
}
|
||||
|
||||
func (cli *cliDecisions) newDeleteCmd() *cobra.Command {
|
||||
var delFilter = apiclient.DecisionsDeleteOpts{
|
||||
delFilter := apiclient.DecisionsDeleteOpts{
|
||||
ScopeEquals: new(string),
|
||||
ValueEquals: new(string),
|
||||
TypeEquals: new(string),
|
||||
|
@ -448,7 +449,7 @@ cscli decisions delete --origin lists --scenario list_name
|
|||
*delFilter.RangeEquals == "" && *delFilter.ScenarioEquals == "" &&
|
||||
*delFilter.OriginEquals == "" && delDecisionID == "" {
|
||||
cmd.Usage()
|
||||
return fmt.Errorf("at least one filter or --all must be specified")
|
||||
return errors.New("at least one filter or --all must be specified")
|
||||
}
|
||||
|
||||
return nil
|
||||
|
|
|
@ -5,6 +5,7 @@ import (
|
|||
"bytes"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
|
@ -81,7 +82,7 @@ func (cli *cliDecisions) runImport(cmd *cobra.Command, args []string) error {
|
|||
}
|
||||
|
||||
if defaultDuration == "" {
|
||||
return fmt.Errorf("--duration cannot be empty")
|
||||
return errors.New("--duration cannot be empty")
|
||||
}
|
||||
|
||||
defaultScope, err := flags.GetString("scope")
|
||||
|
@ -90,7 +91,7 @@ func (cli *cliDecisions) runImport(cmd *cobra.Command, args []string) error {
|
|||
}
|
||||
|
||||
if defaultScope == "" {
|
||||
return fmt.Errorf("--scope cannot be empty")
|
||||
return errors.New("--scope cannot be empty")
|
||||
}
|
||||
|
||||
defaultReason, err := flags.GetString("reason")
|
||||
|
@ -99,7 +100,7 @@ func (cli *cliDecisions) runImport(cmd *cobra.Command, args []string) error {
|
|||
}
|
||||
|
||||
if defaultReason == "" {
|
||||
return fmt.Errorf("--reason cannot be empty")
|
||||
return errors.New("--reason cannot be empty")
|
||||
}
|
||||
|
||||
defaultType, err := flags.GetString("type")
|
||||
|
@ -108,7 +109,7 @@ func (cli *cliDecisions) runImport(cmd *cobra.Command, args []string) error {
|
|||
}
|
||||
|
||||
if defaultType == "" {
|
||||
return fmt.Errorf("--type cannot be empty")
|
||||
return errors.New("--type cannot be empty")
|
||||
}
|
||||
|
||||
batchSize, err := flags.GetInt("batch")
|
||||
|
@ -136,7 +137,7 @@ func (cli *cliDecisions) runImport(cmd *cobra.Command, args []string) error {
|
|||
}
|
||||
|
||||
if format == "" {
|
||||
return fmt.Errorf("unable to guess format from file extension, please provide a format with --format flag")
|
||||
return errors.New("unable to guess format from file extension, please provide a format with --format flag")
|
||||
}
|
||||
|
||||
if input == "-" {
|
||||
|
@ -235,7 +236,6 @@ func (cli *cliDecisions) runImport(cmd *cobra.Command, args []string) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
|
||||
func (cli *cliDecisions) newImportCmd() *cobra.Command {
|
||||
cmd := &cobra.Command{
|
||||
Use: "import [options]",
|
||||
|
|
|
@ -39,8 +39,10 @@ id: %s
|
|||
title: %s
|
||||
---
|
||||
`
|
||||
|
||||
name := filepath.Base(filename)
|
||||
base := strings.TrimSuffix(name, filepath.Ext(name))
|
||||
|
||||
return fmt.Sprintf(header, base, strings.ReplaceAll(base, "_", " "))
|
||||
}
|
||||
|
||||
|
|
|
@ -83,7 +83,7 @@ tail -n 5 myfile.log | cscli explain --type nginx -f -
|
|||
PersistentPreRunE: func(_ *cobra.Command, _ []string) error {
|
||||
fileInfo, _ := os.Stdin.Stat()
|
||||
if cli.flags.logFile == "-" && ((fileInfo.Mode() & os.ModeCharDevice) == os.ModeCharDevice) {
|
||||
return fmt.Errorf("the option -f - is intended to work with pipes")
|
||||
return errors.New("the option -f - is intended to work with pipes")
|
||||
}
|
||||
|
||||
return nil
|
||||
|
@ -160,18 +160,22 @@ func (cli *cliExplain) run() error {
|
|||
} else if logFile == "-" {
|
||||
reader := bufio.NewReader(os.Stdin)
|
||||
errCount := 0
|
||||
|
||||
for {
|
||||
input, err := reader.ReadBytes('\n')
|
||||
if err != nil && errors.Is(err, io.EOF) {
|
||||
break
|
||||
}
|
||||
|
||||
if len(input) > 1 {
|
||||
_, err = f.Write(input)
|
||||
}
|
||||
|
||||
if err != nil || len(input) <= 1 {
|
||||
errCount++
|
||||
}
|
||||
}
|
||||
|
||||
if errCount > 0 {
|
||||
log.Warnf("Failed to write %d lines to %s", errCount, tmpFile)
|
||||
}
|
||||
|
@ -207,7 +211,7 @@ func (cli *cliExplain) run() error {
|
|||
}
|
||||
|
||||
if dsn == "" {
|
||||
return fmt.Errorf("no acquisition (--file or --dsn) provided, can't run cscli test")
|
||||
return errors.New("no acquisition (--file or --dsn) provided, can't run cscli test")
|
||||
}
|
||||
|
||||
cmdArgs := []string{"-c", ConfigFilePath, "-type", logType, "-dsn", dsn, "-dump-data", dir, "-no-api"}
|
||||
|
|
Loading…
Reference in a new issue