From 274555d84f3e0c8268eb79f30d3cfaddfae8ffc9 Mon Sep 17 00:00:00 2001 From: Javier Marcos <1271349+javuto@users.noreply.github.com> Date: Sun, 16 Oct 2022 23:51:51 +0300 Subject: [PATCH] Better errors in osctrl-cli --- cli/carve.go | 20 +++++++------- cli/environment.go | 4 +-- cli/main.go | 8 ++++++ cli/node.go | 14 +++++----- cli/query.go | 67 +++++++++++++++++++++++++++++----------------- cli/settings.go | 34 +++++++++++++++-------- cli/user.go | 26 ++++++++++-------- 7 files changed, 110 insertions(+), 63 deletions(-) diff --git a/cli/carve.go b/cli/carve.go index 04c367db..4375d9c1 100644 --- a/cli/carve.go +++ b/cli/carve.go @@ -62,7 +62,7 @@ func listCarves(c *cli.Context) error { } env := c.String("env") if env == "" { - fmt.Println("Environment is required") + fmt.Println("❌ environment is required") os.Exit(1) } // Retrieve data @@ -125,12 +125,12 @@ func completeCarve(c *cli.Context) error { // Get values from flags name := c.String("name") if name == "" { - fmt.Println("Query name is required") + fmt.Println("❌ carve name is required") os.Exit(1) } env := c.String("env") if env == "" { - fmt.Println("Environment is required") + fmt.Println("❌ environment is required") os.Exit(1) } if dbFlag { @@ -149,12 +149,12 @@ func deleteCarve(c *cli.Context) error { // Get values from flags name := c.String("name") if name == "" { - fmt.Println("Query name is required") + fmt.Println("❌ carve name is required") os.Exit(1) } env := c.String("env") if env == "" { - fmt.Println("Environment is required") + fmt.Println("❌ environment is required") os.Exit(1) } if dbFlag { @@ -173,17 +173,17 @@ func runCarve(c *cli.Context) error { // Get values from flags path := c.String("path") if path == "" { - fmt.Println("Path is required") + fmt.Println("❌ path is required") os.Exit(1) } env := c.String("env") if env == "" { - fmt.Println("Environment is required") + fmt.Println("❌ environment is required") os.Exit(1) } uuid := c.String("uuid") if uuid == "" { - fmt.Println("UUID is required") + fmt.Println("❌ UUID is required") os.Exit(1) } if dbFlag { @@ -222,7 +222,9 @@ func runCarve(c *cli.Context) error { if err != nil { return err } - fmt.Printf("✅ Carve %s created successfully", c.Name) + if !silentFlag { + fmt.Printf("✅ carve %s created successfully", c.Name) + } } return nil } diff --git a/cli/environment.go b/cli/environment.go index 5abd33b7..f306b1fa 100644 --- a/cli/environment.go +++ b/cli/environment.go @@ -25,13 +25,13 @@ func addEnvironment(c *cli.Context) error { // Get environment name envName := c.String("name") if envName == "" { - fmt.Println("Environment name is required") + fmt.Println("❌ Environment name is required") os.Exit(1) } // Get environment hostname envHost := c.String("hostname") if envHost == "" { - fmt.Println("Environment hostname is required") + fmt.Println("❌ Environment hostname is required") os.Exit(1) } // Get certificate diff --git a/cli/main.go b/cli/main.go index a3dd4a5c..7dd5a5ab 100644 --- a/cli/main.go +++ b/cli/main.go @@ -58,6 +58,7 @@ var ( jsonFlag bool csvFlag bool prettyFlag bool + silentFlag bool insecureFlag bool dbConfigFile string apiConfigFile string @@ -197,6 +198,13 @@ func init() { Usage: "Print output in pretty format (table)", Destination: &prettyFlag, }, + &cli.BoolFlag{ + Name: "silent", + Aliases: []string{"s"}, + Value: false, + Usage: "Silent mode", + Destination: &prettyFlag, + }, } // Initialize CLI flags commands commands = []*cli.Command{ diff --git a/cli/node.go b/cli/node.go index f7f58a95..05d20586 100644 --- a/cli/node.go +++ b/cli/node.go @@ -53,7 +53,7 @@ func listNodes(c *cli.Context) error { } env := c.String("env") if env == "" { - fmt.Println("Environment is required") + fmt.Println("❌ environment is required") os.Exit(1) } // Retrieve data @@ -111,12 +111,12 @@ func deleteNode(c *cli.Context) error { // Get values from flags uuid := c.String("uuid") if uuid == "" { - fmt.Println("uuid is required") + fmt.Println("❌ uuid is required") os.Exit(1) } env := c.String("name") if env == "" { - fmt.Println("Environment is required") + fmt.Println("❌ environment is required") os.Exit(1) } if dbFlag { @@ -126,7 +126,9 @@ func deleteNode(c *cli.Context) error { } else if apiFlag { } - fmt.Println("✅ Node has been deleted") + if !silentFlag { + fmt.Println("✅ node was deleted successfully") + } return nil } @@ -134,12 +136,12 @@ func showNode(c *cli.Context) error { // Get values from flags uuid := c.String("uuid") if uuid == "" { - fmt.Println("UUID is required") + fmt.Println("❌ UUID is required") os.Exit(1) } env := c.String("env") if env == "" { - fmt.Println("Environment is required") + fmt.Println("❌ environment is required") os.Exit(1) } var node nodes.OsqueryNode diff --git a/cli/query.go b/cli/query.go index 51150c3c..f4336745 100644 --- a/cli/query.go +++ b/cli/query.go @@ -65,7 +65,7 @@ func listQueries(c *cli.Context) error { } env := c.String("env") if env == "" { - fmt.Println("Environment is required") + fmt.Println("❌ environment is required") os.Exit(1) } // Retrieve data @@ -73,16 +73,16 @@ func listQueries(c *cli.Context) error { if dbFlag { e, err := envs.Get(env) if err != nil { - return err + return fmt.Errorf("❌ error env get - %s", err) } qs, err = queriesmgr.GetQueries(target, e.ID) if err != nil { - return err + return fmt.Errorf("❌ error get queries - %s", err) } } else if apiFlag { qs, err = osctrlAPI.GetQueries(env) if err != nil { - return err + return fmt.Errorf("❌ error get queries - %s", err) } } header := []string{ @@ -101,14 +101,14 @@ func listQueries(c *cli.Context) error { if jsonFlag { jsonRaw, err := json.Marshal(qs) if err != nil { - return err + return fmt.Errorf("❌ error json marshal - %s", err) } fmt.Println(string(jsonRaw)) } else if csvFlag { data := queriesToData(qs, header) w := csv.NewWriter(os.Stdout) if err := w.WriteAll(data); err != nil { - return err + return fmt.Errorf("❌ error csv writeall - %s", err) } } else if prettyFlag { table := tablewriter.NewWriter(os.Stdout) @@ -129,22 +129,29 @@ func completeQuery(c *cli.Context) error { // Get values from flags name := c.String("name") if name == "" { - fmt.Println("Query name is required") + fmt.Println("❌ query name is required") os.Exit(1) } env := c.String("env") if env == "" { - fmt.Println("Environment is required") + fmt.Println("❌ environment is required") os.Exit(1) } if dbFlag { e, err := envs.Get(env) if err != nil { - return err + return fmt.Errorf("❌ error env get - %s", err) + } + if err := queriesmgr.Complete(name, e.ID); err != nil { + return fmt.Errorf("❌ error query complete - %s", err) } - return queriesmgr.Complete(name, e.ID) } else if apiFlag { - return osctrlAPI.CompleteQuery(env, name) + if err := osctrlAPI.CompleteQuery(env, name); err != nil { + return fmt.Errorf("❌ error complete query - %s", err) + } + } + if !silentFlag { + fmt.Printf("✅ query %s completed successfully", name) } return nil } @@ -153,12 +160,12 @@ func deleteQuery(c *cli.Context) error { // Get values from flags name := c.String("name") if name == "" { - fmt.Println("Query name is required") + fmt.Println("❌ query name is required") os.Exit(1) } env := c.String("env") if env == "" { - fmt.Println("Environment is required") + fmt.Println("❌ environment is required") os.Exit(1) } if dbFlag { @@ -166,9 +173,16 @@ func deleteQuery(c *cli.Context) error { if err != nil { return err } - return queriesmgr.Delete(name, e.ID) + if err := queriesmgr.Delete(name, e.ID); err != nil { + return fmt.Errorf("❌ error %s", err) + } } else if apiFlag { - return osctrlAPI.DeleteQuery(env, name) + if err := osctrlAPI.DeleteQuery(env, name); err != nil { + return fmt.Errorf("❌ error %s", err) + } + } + if !silentFlag { + fmt.Printf("✅ query %s deleted successfully", name) } return nil } @@ -177,24 +191,24 @@ func runQuery(c *cli.Context) error { // Get values from flags query := c.String("query") if query == "" { - fmt.Println("Query is required") + fmt.Println("❌ query is required") os.Exit(1) } env := c.String("env") if env == "" { - fmt.Println("Environment is required") + fmt.Println("❌ environment is required") os.Exit(1) } uuid := c.String("uuid") if uuid == "" { - fmt.Println("UUID is required") + fmt.Println("❌ UUID is required") os.Exit(1) } hidden := c.Bool("hidden") if dbFlag { e, err := envs.Get(env) if err != nil { - return err + return fmt.Errorf("❌ error env get - %s", err) } queryName := queries.GenQueryName() newQuery := queries.DistributedQuery{ @@ -211,23 +225,28 @@ func runQuery(c *cli.Context) error { EnvironmentID: e.ID, } if err := queriesmgr.Create(newQuery); err != nil { - return err + return fmt.Errorf("❌ error query create - %s", err) } if (uuid != "") && nodesmgr.CheckByUUID(uuid) { if err := queriesmgr.CreateTarget(queryName, queries.QueryTargetUUID, uuid); err != nil { - return err + return fmt.Errorf("❌ error create target - %s", err) } } if err := queriesmgr.SetExpected(queryName, 1, e.ID); err != nil { - return err + return fmt.Errorf("❌ error set expected - %s", err) + } + if !silentFlag { + fmt.Printf("✅ query %s created successfully", queryName) } return nil } else if apiFlag { q, err := osctrlAPI.RunQuery(env, uuid, query, hidden) if err != nil { - return err + return fmt.Errorf("❌ error run query - %s", err) + } + if !silentFlag { + fmt.Printf("✅ query %s created successfully", q.Name) } - fmt.Printf("✅ Query %s created successfully", q.Name) } return nil } diff --git a/cli/settings.go b/cli/settings.go index bff4f086..3982d4cf 100644 --- a/cli/settings.go +++ b/cli/settings.go @@ -51,17 +51,17 @@ func addSetting(c *cli.Context) error { // Get values from flags name := c.String("name") if name == "" { - fmt.Println("name is required") + fmt.Println("❌ name is required") os.Exit(1) } service := c.String("service") if service == "" { - fmt.Println("service is required") + fmt.Println("❌ service is required") os.Exit(1) } typeValue := c.String("type") if typeValue == "" { - fmt.Println("type is required") + fmt.Println("❌ type is required") os.Exit(1) } switch typeValue { @@ -79,17 +79,17 @@ func updateSetting(c *cli.Context) error { // Get values from flags name := c.String("name") if name == "" { - fmt.Println("name is required") + fmt.Println("❌ name is required") os.Exit(1) } service := c.String("service") if service == "" { - fmt.Println("service is required") + fmt.Println("❌ service is required") os.Exit(1) } typeValue := c.String("type") if typeValue == "" { - fmt.Println("type is required") + fmt.Println("❌ type is required") os.Exit(1) } info := c.String("info") @@ -103,25 +103,37 @@ func updateSetting(c *cli.Context) error { err = settingsmgr.SetString(c.String("string"), service, name, false) } if err != nil { - return err + return fmt.Errorf("❌ error set type - %s", err) } if info != "" { err = settingsmgr.SetInfo(info, service, name) } - return err + if err != nil { + return fmt.Errorf("❌ error set info - %s", err) + } + if !silentFlag { + fmt.Println("✅ setting deleted successfully") + } + return nil } func deleteSetting(c *cli.Context) error { // Get values from flags name := c.String("name") if name == "" { - fmt.Println("name is required") + fmt.Println("❌ name is required") os.Exit(1) } service := c.String("service") if service == "" { - fmt.Println("service is required") + fmt.Println("❌ service is required") os.Exit(1) } - return settingsmgr.DeleteValue(service, name) + if err := settingsmgr.DeleteValue(service, name); err != nil { + return fmt.Errorf("❌ error get queries - %s", err) + } + if !silentFlag { + fmt.Println("✅ setting deleted successfully") + } + return nil } diff --git a/cli/user.go b/cli/user.go index 8ea86245..a7b9ee61 100644 --- a/cli/user.go +++ b/cli/user.go @@ -50,12 +50,12 @@ func addUser(c *cli.Context) error { // Get values from flags username := c.String("username") if username == "" { - fmt.Println("username is required") + fmt.Println("❌ username is required") os.Exit(1) } defaultEnv := c.String("environment") if defaultEnv == "" { - fmt.Println("environment is required") + fmt.Println("❌ environment is required") os.Exit(1) } env, err := envs.Get(defaultEnv) @@ -80,7 +80,9 @@ func addUser(c *cli.Context) error { if err := adminUsers.CreatePermissions(perms); err != nil { return err } - fmt.Printf("Created user %s successfully", username) + if !silentFlag { + fmt.Printf("✅ created user %s successfully", username) + } return nil } @@ -88,7 +90,7 @@ func editUser(c *cli.Context) error { // Get values from flags username := c.String("username") if username == "" { - fmt.Println("username is required") + fmt.Println("❌ username is required") os.Exit(1) } password := c.String("password") @@ -127,7 +129,9 @@ func editUser(c *cli.Context) error { return err } } - fmt.Printf("Edited user %s successfully", username) + if !silentFlag { + fmt.Printf("✅ user %s edited successfully", username) + } return nil } @@ -135,7 +139,7 @@ func deleteUser(c *cli.Context) error { // Get values from flags username := c.String("username") if username == "" { - fmt.Println("username is required") + fmt.Println("❌ username is required") os.Exit(1) } return adminUsers.Delete(username) @@ -196,7 +200,7 @@ func showUser(c *cli.Context) error { // Get values from flags username := c.String("username") if username == "" { - fmt.Println("username is required") + fmt.Println("❌ username is required") os.Exit(1) } // Retrieve data @@ -248,7 +252,7 @@ func permissionsUser(c *cli.Context) error { // Get values from flags username := c.String("username") if username == "" { - fmt.Println("username is required") + fmt.Println("❌ username is required") os.Exit(1) } show := c.Bool("show") @@ -289,7 +293,7 @@ func permissionsUser(c *cli.Context) error { } envName := c.String("environment") if envName == "" { - fmt.Println("environment is required") + fmt.Println("❌ environment is required") os.Exit(1) } env, err := envs.Get(envName) @@ -317,7 +321,7 @@ func permissionsUser(c *cli.Context) error { if err := adminUsers.CreatePermissions(perms); err != nil { return err } - fmt.Printf("Permissions reset for user %s successfully", username) + fmt.Printf("✅ permissions reset for user %s successfully", username) } else { if user { if err := adminUsers.SetEnvUser(username, env.UUID, user); err != nil { @@ -339,7 +343,7 @@ func permissionsUser(c *cli.Context) error { return err } } - fmt.Printf("Permissions changed for user %s successfully", username) + fmt.Printf("✅ permissions changed for user %s successfully", username) } return nil }