diff --git a/cli/api-carve.go b/cli/api-carve.go index a7a1d2fe..fd4dc34a 100644 --- a/cli/api-carve.go +++ b/cli/api-carve.go @@ -6,6 +6,7 @@ import ( "strings" "github.com/jmpsec/osctrl/carves" + "github.com/jmpsec/osctrl/settings" "github.com/jmpsec/osctrl/types" "github.com/rs/zerolog/log" ) @@ -39,20 +40,52 @@ func (api *OsctrlAPI) GetCarve(env, name string) (carves.CarvedFile, error) { } // DeleteCarve to delete carve from osctrl -func (api *OsctrlAPI) DeleteCarve(env, identifier string) error { - return nil +func (api *OsctrlAPI) DeleteCarve(env, name string) (types.ApiGenericResponse, error) { + var r types.ApiGenericResponse + reqURL := fmt.Sprintf("%s%s%s/%s/%s/%s", api.Configuration.URL, APIPath, APICarves, env, settings.CarveDelete, name) + rawQ, err := api.PostGeneric(reqURL, nil) + if err != nil { + return r, fmt.Errorf("error api request - %v - %s", err, string(rawQ)) + } + if err := json.Unmarshal(rawQ, &r); err != nil { + return r, fmt.Errorf("can not parse body - %v", err) + } + return r, nil +} + +// ExpireCarve to expire carve from osctrl +func (api *OsctrlAPI) ExpireCarve(env, name string) (types.ApiGenericResponse, error) { + var r types.ApiGenericResponse + reqURL := fmt.Sprintf("%s%s%s/%s/%s/%s", api.Configuration.URL, APIPath, APICarves, env, settings.QueryExpire, name) + rawQ, err := api.PostGeneric(reqURL, nil) + if err != nil { + return r, fmt.Errorf("error api request - %v - %s", err, string(rawQ)) + } + if err := json.Unmarshal(rawQ, &r); err != nil { + return r, fmt.Errorf("can not parse body - %v", err) + } + return r, nil } // CompleteCarve to complete a carve from osctrl -func (api *OsctrlAPI) CompleteCarve(env, identifier string) error { - return nil +func (api *OsctrlAPI) CompleteCarve(env, name string) (types.ApiGenericResponse, error) { + var r types.ApiGenericResponse + reqURL := fmt.Sprintf("%s%s%s/%s/%s/%s", api.Configuration.URL, APIPath, APICarves, env, settings.CarveComplete, name) + rawQ, err := api.PostGeneric(reqURL, nil) + if err != nil { + return r, fmt.Errorf("error api request - %v - %s", err, string(rawQ)) + } + if err := json.Unmarshal(rawQ, &r); err != nil { + return r, fmt.Errorf("can not parse body - %v", err) + } + return r, nil } // RunCarve to initiate a carve in osctrl func (api *OsctrlAPI) RunCarve(env, uuid, path string, exp int) (types.ApiQueriesResponse, error) { c := types.ApiDistributedCarveRequest{ - UUID: uuid, - Path: path, + UUID: uuid, + Path: path, ExpHours: exp, } var r types.ApiQueriesResponse diff --git a/cli/api-query.go b/cli/api-query.go index 1eb29576..c90847dc 100644 --- a/cli/api-query.go +++ b/cli/api-query.go @@ -6,6 +6,7 @@ import ( "strings" "github.com/jmpsec/osctrl/queries" + "github.com/jmpsec/osctrl/settings" "github.com/jmpsec/osctrl/types" ) @@ -38,21 +39,45 @@ func (api *OsctrlAPI) GetQuery(env, name string) (queries.DistributedQuery, erro } // DeleteQuery to delete query from osctrl -// TODO: Implement this function -func (api *OsctrlAPI) DeleteQuery(env, identifier string) error { - return nil +func (api *OsctrlAPI) DeleteQuery(env, name string) (types.ApiGenericResponse, error) { + var r types.ApiGenericResponse + reqURL := fmt.Sprintf("%s%s%s/%s/%s/%s", api.Configuration.URL, APIPath, APIQueries, env, settings.QueryDelete, name) + rawQ, err := api.PostGeneric(reqURL, nil) + if err != nil { + return r, fmt.Errorf("error api request - %v - %s", err, string(rawQ)) + } + if err := json.Unmarshal(rawQ, &r); err != nil { + return r, fmt.Errorf("can not parse body - %v", err) + } + return r, nil } // ExpireQuery to expire query from osctrl -// TODO: Implement this function -func (api *OsctrlAPI) ExpireQuery(env, identifier string) error { - return nil +func (api *OsctrlAPI) ExpireQuery(env, name string) (types.ApiGenericResponse, error) { + var r types.ApiGenericResponse + reqURL := fmt.Sprintf("%s%s%s/%s/%s/%s", api.Configuration.URL, APIPath, APIQueries, env, settings.QueryExpire, name) + rawQ, err := api.PostGeneric(reqURL, nil) + if err != nil { + return r, fmt.Errorf("error api request - %v - %s", err, string(rawQ)) + } + if err := json.Unmarshal(rawQ, &r); err != nil { + return r, fmt.Errorf("can not parse body - %v", err) + } + return r, nil } // CompleteQuery to complete a query from osctrl -// TODO: Implement this function -func (api *OsctrlAPI) CompleteQuery(env, identifier string) error { - return nil +func (api *OsctrlAPI) CompleteQuery(env, name string) (types.ApiGenericResponse, error) { + var r types.ApiGenericResponse + reqURL := fmt.Sprintf("%s%s%s/%s/%s/%s", api.Configuration.URL, APIPath, APIQueries, env, settings.QueryComplete, name) + rawQ, err := api.PostGeneric(reqURL, nil) + if err != nil { + return r, fmt.Errorf("error api request - %v - %s", err, string(rawQ)) + } + if err := json.Unmarshal(rawQ, &r); err != nil { + return r, fmt.Errorf("can not parse body - %v", err) + } + return r, nil } // RunQuery to initiate a query in osctrl diff --git a/cli/carve.go b/cli/carve.go index e5cbf73e..7d74947e 100644 --- a/cli/carve.go +++ b/cli/carve.go @@ -136,11 +136,19 @@ func completeCarve(c *cli.Context) error { 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 completing carve - %s", err) } - return queriesmgr.Complete(name, e.ID) } else if apiFlag { - return osctrlAPI.CompleteQuery(env, name) + _, err := osctrlAPI.CompleteQuery(env, name) + if err != nil { + return fmt.Errorf("❌ error completing carve - %s", err) + } + } + if !silentFlag { + fmt.Printf("✅ carve %s completed successfully\n", name) } return nil } @@ -160,11 +168,19 @@ func deleteCarve(c *cli.Context) error { if dbFlag { e, err := envs.Get(env) if err != nil { - return err + return fmt.Errorf("❌ error env get - %s", err) + } + if err := queriesmgr.Delete(name, e.ID); err != nil { + return fmt.Errorf("❌ error deleting carve - %s", err) } - return queriesmgr.Delete(name, e.ID) } else if apiFlag { - return osctrlAPI.DeleteQuery(env, name) + _, err := osctrlAPI.DeleteQuery(env, name) + if err != nil { + return fmt.Errorf("❌ error deleting carve - %s", err) + } + } + if !silentFlag { + fmt.Printf("✅ carve %s deleted successfully\n", name) } return nil } @@ -184,11 +200,19 @@ func expireCarve(c *cli.Context) error { if dbFlag { e, err := envs.Get(env) if err != nil { - return err + return fmt.Errorf("❌ error env get - %s", err) + } + if err := queriesmgr.Expire(name, e.ID); err != nil { + return fmt.Errorf("❌ error expiring carve - %s", err) } - return queriesmgr.Expire(name, e.ID) } else if apiFlag { - return osctrlAPI.ExpireQuery(env, name) + _, err := osctrlAPI.ExpireQuery(env, name) + if err != nil { + return fmt.Errorf("❌ error expiring carve - %s", err) + } + } + if !silentFlag { + fmt.Printf("✅ carve %s expired successfully\n", name) } return nil } @@ -214,7 +238,7 @@ func runCarve(c *cli.Context) error { if dbFlag { e, err := envs.Get(env) if err != nil { - return err + return fmt.Errorf("❌ %s", err) } carveName := carves.GenCarveName() newQuery := queries.DistributedQuery{ @@ -233,21 +257,21 @@ func runCarve(c *cli.Context) error { EnvironmentID: e.ID, } if err := queriesmgr.Create(newQuery); err != nil { - return err + return fmt.Errorf("❌ %s", err) } if (uuid != "") && nodesmgr.CheckByUUID(uuid) { if err := queriesmgr.CreateTarget(carveName, queries.QueryTargetUUID, uuid); err != nil { - return err + return fmt.Errorf("❌ error creating target - %s", err) } } if err := queriesmgr.SetExpected(carveName, 1, e.ID); err != nil { - return err + return fmt.Errorf("❌ error setting expected - %s", err) } return nil } else if apiFlag { c, err := osctrlAPI.RunCarve(env, uuid, path, expHours) if err != nil { - return err + return fmt.Errorf("❌ error running carve - %s", err) } if !silentFlag { fmt.Printf("✅ carve %s created successfully\n", c.Name) diff --git a/cli/query.go b/cli/query.go index 4482b1d3..8745ae74 100644 --- a/cli/query.go +++ b/cli/query.go @@ -73,16 +73,16 @@ func listQueries(c *cli.Context) error { if dbFlag { e, err := envs.Get(env) if err != nil { - return fmt.Errorf("error env get - %s", err) + return fmt.Errorf("❌ error env get - %s", err) } qs, err = queriesmgr.GetQueries(target, e.ID) if err != nil { - return fmt.Errorf("error get queries - %s", err) + return fmt.Errorf("❌ error get queries - %s", err) } } else if apiFlag { qs, err = osctrlAPI.GetQueries(env) if err != nil { - return fmt.Errorf("error get queries - %s", err) + return fmt.Errorf("❌ error get queries - %s", err) } } header := []string{ @@ -101,14 +101,14 @@ func listQueries(c *cli.Context) error { if formatFlag == jsonFormat { jsonRaw, err := json.Marshal(qs) if err != nil { - return fmt.Errorf("error json marshal - %s", err) + return fmt.Errorf("❌ error json marshal - %s", err) } fmt.Println(string(jsonRaw)) } else if formatFlag == csvFormat { data := queriesToData(qs, header) w := csv.NewWriter(os.Stdout) if err := w.WriteAll(data); err != nil { - return fmt.Errorf("error csv writeall - %s", err) + return fmt.Errorf("❌ error csv writeall - %s", err) } } else if formatFlag == prettyFormat { table := tablewriter.NewWriter(os.Stdout) @@ -140,14 +140,15 @@ func completeQuery(c *cli.Context) error { if dbFlag { e, err := envs.Get(env) if err != nil { - return fmt.Errorf("error env get - %s", 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 fmt.Errorf("❌ error completing query - %s", err) } } else if apiFlag { - if err := osctrlAPI.CompleteQuery(env, name); err != nil { - return fmt.Errorf("error complete query - %s", err) + _, err := osctrlAPI.CompleteQuery(env, name) + if err != nil { + return fmt.Errorf("❌ error completing query - %s", err) } } if !silentFlag { @@ -171,14 +172,15 @@ func deleteQuery(c *cli.Context) error { if dbFlag { e, err := envs.Get(env) if err != nil { - return err + return fmt.Errorf("❌ error env get - %s", err) } if err := queriesmgr.Delete(name, e.ID); err != nil { - return fmt.Errorf("error %s", err) + return fmt.Errorf("❌ %s", err) } } else if apiFlag { - if err := osctrlAPI.DeleteQuery(env, name); err != nil { - return fmt.Errorf("error %s", err) + _, err := osctrlAPI.DeleteQuery(env, name) + if err != nil { + return fmt.Errorf("❌ %s", err) } } if !silentFlag { @@ -202,14 +204,15 @@ func expireQuery(c *cli.Context) error { if dbFlag { e, err := envs.Get(env) if err != nil { - return err + return fmt.Errorf("❌ error env get - %s", err) } if err := queriesmgr.Expire(name, e.ID); err != nil { - return fmt.Errorf("error %s", err) + return fmt.Errorf("❌ error expiring query - %s", err) } } else if apiFlag { - if err := osctrlAPI.DeleteQuery(env, name); err != nil { - return fmt.Errorf("error %s", err) + _, err := osctrlAPI.ExpireQuery(env, name) + if err != nil { + return fmt.Errorf("❌ error expiring query - %s", err) } } if !silentFlag { @@ -237,12 +240,13 @@ func runQuery(c *cli.Context) error { } expHours := c.Int("expiration") hidden := c.Bool("hidden") + var queryName string if dbFlag { e, err := envs.Get(env) if err != nil { - return fmt.Errorf("error env get - %s", err) + return fmt.Errorf("❌ error env get - %s", err) } - queryName := queries.GenQueryName() + queryName = queries.GenQueryName() newQuery := queries.DistributedQuery{ Query: query, Name: queryName, @@ -259,28 +263,25 @@ func runQuery(c *cli.Context) error { EnvironmentID: e.ID, } if err := queriesmgr.Create(newQuery); err != nil { - return fmt.Errorf("error query create - %s", 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 fmt.Errorf("error create target - %s", err) + return fmt.Errorf("❌ error create target - %s", err) } } if err := queriesmgr.SetExpected(queryName, 1, e.ID); err != nil { - return fmt.Errorf("error set expected - %s", err) - } - if !silentFlag { - fmt.Printf("✅ query %s created successfully\n", queryName) + return fmt.Errorf("❌ error set expected - %s", err) } - return nil } else if apiFlag { q, err := osctrlAPI.RunQuery(env, uuid, query, hidden, expHours) if err != nil { - return fmt.Errorf("error run query - %s", err) - } - if !silentFlag { - fmt.Printf("✅ query %s created successfully\n", q.Name) + return fmt.Errorf("❌ error run query - %s", err) } + queryName = q.Name + } + if !silentFlag { + fmt.Printf("✅ query %s created successfully\n", queryName) } return nil } diff --git a/settings/settings.go b/settings/settings.go index 6bfba35a..7e930703 100644 --- a/settings/settings.go +++ b/settings/settings.go @@ -75,10 +75,12 @@ const ( // Types of query/carve actions const ( - QueryDelete string = "delete" - QueryExpire string = "expire" - CarveDelete string = QueryDelete - CarveExpire string = QueryExpire + QueryDelete string = "delete" + QueryExpire string = "expire" + QueryComplete string = "complete" + CarveDelete string = QueryDelete + CarveExpire string = QueryExpire + CarveComplete string = QueryComplete ) // Types of package