From 60533a95910ecfe90ab2fb67ed82e718514540c1 Mon Sep 17 00:00:00 2001 From: RoyUP9 <87927115+RoyUP9@users.noreply.github.com> Date: Thu, 5 Aug 2021 14:23:16 +0300 Subject: [PATCH] added allowed set flag (#169) --- cli/cmd/tap.go | 2 +- cli/errormessage/errormessage.go | 11 +++++++---- cli/mizu/config.go | 23 +++++++++++++++++++---- cli/mizu/configStruct.go | 7 +++++++ cli/mizu/configStructs/tapConfig.go | 2 ++ cli/mizu/sliceUtils.go | 11 +++++++++++ 6 files changed, 47 insertions(+), 9 deletions(-) create mode 100644 cli/mizu/sliceUtils.go diff --git a/cli/cmd/tap.go b/cli/cmd/tap.go index 9aa040134..3f4e56370 100644 --- a/cli/cmd/tap.go +++ b/cli/cmd/tap.go @@ -70,5 +70,5 @@ func init() { tapCmd.Flags().String(configStructs.HumanMaxEntriesDBSizeTapName, defaultTapConfig.HumanMaxEntriesDBSize, "override the default max entries db size of 200mb") tapCmd.Flags().String(configStructs.DirectionTapName, defaultTapConfig.Direction, "Record traffic that goes in this direction (relative to the tapped pod): in/any") tapCmd.Flags().Bool(configStructs.DryRunTapName, defaultTapConfig.DryRun, "Preview of all pods matching the regex, without tapping them") - tapCmd.Flags().String(configStructs.EnforcePolicyFile, "", "Yaml file with policy rules") + tapCmd.Flags().String(configStructs.EnforcePolicyFile, defaultTapConfig.EnforcePolicyFile, "Yaml file with policy rules") } diff --git a/cli/errormessage/errormessage.go b/cli/errormessage/errormessage.go index 657562dbf..da0185dc5 100644 --- a/cli/errormessage/errormessage.go +++ b/cli/errormessage/errormessage.go @@ -3,6 +3,9 @@ package errormessage import ( "errors" "fmt" + + "github.com/up9inc/mizu/cli/mizu" + regexpsyntax "regexp/syntax" k8serrors "k8s.io/apimachinery/pkg/api/errors" @@ -13,11 +16,11 @@ import ( func FormatError(err error) error { var errorNew error if k8serrors.IsForbidden(err) { - errorNew = fmt.Errorf("Insufficient permissions: %w. "+ - "Supply the required permission or control Mizu's access to namespaces by setting MizuResourcesNamespace "+ - "in the config file or setting the tapped namespace with --set mizu-resources-namespace=.", err) + errorNew = fmt.Errorf("insufficient permissions: %w. "+ + "supply the required permission or control Mizu's access to namespaces by setting MizuResourcesNamespace "+ + "in the config file or setting the tapped namespace with --%s %s=", err, mizu.SetCommandName, mizu.MizuResourcesNamespaceConfigName) } else if syntaxError, isSyntaxError := asRegexSyntaxError(err); isSyntaxError { - errorNew = fmt.Errorf("Regex %s is invalid: %w", syntaxError.Expr, err) + errorNew = fmt.Errorf("regex %s is invalid: %w", syntaxError.Expr, err) } else { errorNew = err } diff --git a/cli/mizu/config.go b/cli/mizu/config.go index f96f5b37b..52335f85d 100644 --- a/cli/mizu/config.go +++ b/cli/mizu/config.go @@ -13,6 +13,7 @@ import ( "github.com/creasty/defaults" "github.com/spf13/cobra" "github.com/spf13/pflag" + "github.com/up9inc/mizu/cli/mizu/configStructs" "github.com/up9inc/mizu/cli/uiUtils" "gopkg.in/yaml.v3" ) @@ -22,13 +23,22 @@ const ( SetCommandName = "set" ) +var allowedSetFlags = []string{ + AgentImageConfigName, + MizuResourcesNamespaceConfigName, + TelemetryConfigName, + DumpLogsConfigName, + configStructs.AnalysisDestinationTapName, + configStructs.SleepIntervalSecTapName, +} + var Config = ConfigStruct{} func (config *ConfigStruct) Validate() error { if config.IsNsRestrictedMode() { if config.Tap.AllNamespaces || len(config.Tap.Namespaces) != 1 || config.Tap.Namespaces[0] != config.MizuResourcesNamespace { return fmt.Errorf("Not supported mode. Mizu can't resolve IPs in other namespaces when running in namespace restricted mode.\n" + - "You can use the same namespace for --namespace and --mizu-resources-namespace") + "You can use the same namespace for --%s and --%s", configStructs.NamespacesTapName, MizuResourcesNamespaceConfigName) } } @@ -95,7 +105,7 @@ func initFlag(f *pflag.Flag) { if f.Name == SetCommandName { if setError := mergeSetFlag(sliceValue.GetSlice()); setError != nil { - Log.Infof(uiUtils.Red, "Invalid set argument") + Log.Warningf(uiUtils.Red, fmt.Sprintf("%v", setError)) } return } @@ -117,6 +127,11 @@ func mergeSetFlag(setValues []string) error { } argumentKey, argumentValue := split[0], split[1] + + if !Contains(allowedSetFlags, argumentKey) { + return errors.New(fmt.Sprintf("invalid set flag name %s, allowed set flag names: \"%s\"", argumentKey, strings.Join(allowedSetFlags, "\", \""))) + } + mergeFlagValue(configElem, argumentKey, argumentValue) } @@ -141,7 +156,7 @@ func mergeFlagValue(currentElem reflect.Value, flagKey string, flagValue string) parsedValue, err := getParsedValue(flagValueKind, flagValue) if err != nil { - Log.Warningf(uiUtils.Red, fmt.Sprintf("Invalid value %v for key %s, expected %s", flagValue, flagKey, flagValueKind)) + Log.Warningf(uiUtils.Red, fmt.Sprintf("Invalid value %v for flag name %s, expected %s", flagValue, flagKey, flagValueKind)) return } @@ -169,7 +184,7 @@ func mergeFlagValues(currentElem reflect.Value, flagKey string, flagValues []str for _, flagValue := range flagValues { parsedValue, err := getParsedValue(flagValueKind, flagValue) if err != nil { - Log.Warningf(uiUtils.Red, fmt.Sprintf("Invalid value %v for key %s, expected %s", flagValue, flagKey, flagValueKind)) + Log.Warningf(uiUtils.Red, fmt.Sprintf("Invalid value %v for flag name %s, expected %s", flagValue, flagKey, flagValueKind)) return } diff --git a/cli/mizu/configStruct.go b/cli/mizu/configStruct.go index da426caa0..6b45fc579 100644 --- a/cli/mizu/configStruct.go +++ b/cli/mizu/configStruct.go @@ -6,6 +6,13 @@ import ( "github.com/up9inc/mizu/cli/mizu/configStructs" ) +const ( + AgentImageConfigName = "agent-image" + MizuResourcesNamespaceConfigName = "mizu-resources-namespace" + TelemetryConfigName = "telemetry" + DumpLogsConfigName = "dump-logs" +) + type ConfigStruct struct { Tap configStructs.TapConfig `yaml:"tap"` Fetch configStructs.FetchConfig `yaml:"fetch"` diff --git a/cli/mizu/configStructs/tapConfig.go b/cli/mizu/configStructs/tapConfig.go index 2ac9352cd..1f8923667 100644 --- a/cli/mizu/configStructs/tapConfig.go +++ b/cli/mizu/configStructs/tapConfig.go @@ -10,6 +10,8 @@ import ( ) const ( + AnalysisDestinationTapName = "dest" + SleepIntervalSecTapName = "upload-interval" GuiPortTapName = "gui-port" NamespacesTapName = "namespaces" AnalysisTapName = "analysis" diff --git a/cli/mizu/sliceUtils.go b/cli/mizu/sliceUtils.go new file mode 100644 index 000000000..551e12603 --- /dev/null +++ b/cli/mizu/sliceUtils.go @@ -0,0 +1,11 @@ +package mizu + +func Contains(slice []string, containsValue string) bool { + for _, sliceValue := range slice { + if sliceValue == containsValue { + return true + } + } + + return false +}