diff --git a/internal/arguments/arguments.go b/internal/arguments/arguments.go index 1b88f4d..f62985e 100644 --- a/internal/arguments/arguments.go +++ b/internal/arguments/arguments.go @@ -43,10 +43,10 @@ func New() Handler { } } -func (args *Handler) CollectArgsFromStdin(availableModules string) { +func (args *Handler) CollectArgsFromStdin(availableModules string) []error { fmt.Printf(interactiveHelpText+"\n\n", availableModules) - var errors []error + errors := make([]error, 0, len(args.arguments)) for _, argument := range args.arguments { if argument.Dependency == nil { @@ -59,8 +59,12 @@ func (args *Handler) CollectArgsFromStdin(availableModules string) { continue } - errors = append(errors, fmt.Errorf("%s is not matching the needed depenency", argument.Name)) + errors = append(errors, fmt.Errorf("argument '%s' is not matching the needed depenency. Skipping... ", argument.Name)) } + + fmt.Print("\nInteractive wizard finished. Starting...\n\n") + + return errors } func (args *Handler) NewPromptStringVar(callback *string, name, defaultValue, usage string, required bool, dependency func() bool) { @@ -115,24 +119,24 @@ func (args *Handler) newStringPrompt(callback *string, defaultValue, usage strin fmt.Printf("%s - (Preselection: '%s'): ", usage, defaultValue) if args.scanner.Scan() { input := args.scanner.Text() - if input != "" { + + switch { + case input != "": *callback = input - break - } else if input == "" && defaultValue != "" { + return + case input == "" && defaultValue != "": *callback = defaultValue - break - } else if input == "" && !required { - break + return + case input == "" && !required: + return } } else { if err := args.scanner.Err(); err != nil { _, _ = fmt.Fprintln(os.Stderr, "reading standard input:", err) - break + return } } } - - return } func (args *Handler) newBoolPrompt(callback *bool, defaultValue bool, usage string) { diff --git a/main.go b/main.go index 4fd05cb..b9eaf71 100644 --- a/main.go +++ b/main.go @@ -114,6 +114,7 @@ var ( commandTimeout = 60 * time.Second startTime = time.Now() metric *metrics.Metrics + initErrors []error ) func init() { @@ -130,14 +131,14 @@ func init() { // Run specific arguments args.NewPromptStringVar(&outputFile, "output", buildFileName(), "Filename for resulting zip", true, nil) - args.NewPromptStringSliceVar(&enabledModules, "enable", moduleOrder, "Enabled modules for collection (comma seperated)", false, nil) - args.NewPromptStringSliceVar(&disabledModules, "disable", []string{}, "Explicit disabled modules for collection (comma seperated)", false, nil) + args.NewPromptStringSliceVar(&enabledModules, "enable", moduleOrder, "Enabled modules for collection (comma separated)", false, nil) + args.NewPromptStringSliceVar(&disabledModules, "disable", []string{}, "Explicit disabled modules for collection (comma separated)", false, nil) args.NewPromptBoolVar(&noDetailedCollection, "no-details", false, "Disable detailed collection including logs and more", nil) // Icinga 2 specific arguments - args.NewPromptStringVar(&icinga2.APICred.Username, "icinga2-api-user", "", "Username of global Icinga 2 API user to collect data about Icinga 2 Infrastructure", false, icinga2Enabled) - args.NewPromptStringVar(&icinga2.APICred.Password, "icinga2-api-pass", "", "Password for global Icinga 2 API user to collect data about Icinga 2 Infrastructure", false, icinga2Enabled) - args.NewPromptStringSliceVar(&icinga2.APIEndpoints, "icinga2-api-endpoints", []string{}, "Comma separated list of Icinga 2 API Endpoints (including port) to collect data from. FQDN or IP address must be reachable. (Example: i2-master01.local:5665)", false, icinga2Enabled) + args.NewPromptStringVar(&icinga2.APICred.Username, "icinga2-api-user", "", "Icinga 2: Username of global API user to collect data about Icinga 2 Infrastructure", false, icinga2Enabled) + args.NewPromptStringVar(&icinga2.APICred.Password, "icinga2-api-pass", "", "Icinga 2: Password for global API user to collect data about Icinga 2 Infrastructure", false, icinga2Enabled) + args.NewPromptStringSliceVar(&icinga2.APIEndpoints, "icinga2-api-endpoints", []string{}, "Icinga 2: Comma separated list of API Endpoints (including port) to collect data from. FQDN or IP address must be reachable. (Example: i2-master01.local:5665)", false, icinga2Enabled) flag.CommandLine.SortFlags = false @@ -160,7 +161,7 @@ func init() { // Start interactive wizard if interactive is enabled if !arguments.NonInteractive { - args.CollectArgsFromStdin(strings.Join(moduleOrder, ",")) + initErrors = args.CollectArgsFromStdin(strings.Join(moduleOrder, ",")) } // Verify enabled modules @@ -193,6 +194,13 @@ func main() { // Close collection defer closeCollection() + // Check for errors in init() + if len(initErrors) > 0 { + for _, err := range initErrors { + c.Log.Info(err) + } + } + // Initialize new metrics and defer function to save it to json metric = metrics.New(getVersion()) defer func() {