From 0ef0e8bd3d8ce596e8efaebde32cfcd740aee6c1 Mon Sep 17 00:00:00 2001 From: Mike Cohen Date: Mon, 28 Aug 2023 11:42:27 +1000 Subject: [PATCH] Bugfix: Include tool versions from root org (#2913) In child orgs the repository delegates to the root org's repository but tool definitions are kept in the child org's inventory. This means that it was impossible to reset the definitions because the GUI would not present the original versions. --- config/loader.go | 10 ++++++++-- docs/references/vql.yaml | 3 +++ gui/velociraptor/build/.keep | 1 + services/inventory/inventory.go | 10 +++++++++- vql/server/inventory.go | 8 +++++++- 5 files changed, 28 insertions(+), 4 deletions(-) diff --git a/config/loader.go b/config/loader.go index 305648bd852..c0a60bdc46c 100644 --- a/config/loader.go +++ b/config/loader.go @@ -8,6 +8,7 @@ import ( "io/ioutil" "os" "os/user" + "path/filepath" "regexp" "runtime" @@ -351,9 +352,14 @@ func (self *Loader) WithEmbedded(embedded_file string) *Loader { } // Ensure the "me" accessor uses this file for embedded zip. - EmbeddedFile = embedded_file + full_path, err := filepath.Abs(embedded_file) + if err != nil { + return nil, err + } + + EmbeddedFile = full_path - fd, err := os.Open(embedded_file) + fd, err := os.Open(full_path) if err != nil { return nil, err } diff --git a/docs/references/vql.yaml b/docs/references/vql.yaml index 37385673793..21d0c6d25ea 100644 --- a/docs/references/vql.yaml +++ b/docs/references/vql.yaml @@ -2694,6 +2694,9 @@ required: true - name: version type: string + - name: probe + type: bool + description: If specified we only probe the tool definition without materializing category: server metadata: permissions: SERVER_ADMIN diff --git a/gui/velociraptor/build/.keep b/gui/velociraptor/build/.keep index e69de29bb2d..8b137891791 100644 --- a/gui/velociraptor/build/.keep +++ b/gui/velociraptor/build/.keep @@ -0,0 +1 @@ + diff --git a/services/inventory/inventory.go b/services/inventory/inventory.go index f4c30636ff1..07a51c11067 100644 --- a/services/inventory/inventory.go +++ b/services/inventory/inventory.go @@ -210,6 +210,14 @@ func (self *InventoryService) addAllVersions( result.Versions = append(result.Versions, v) } + // Merge the parent's versions as well. + if self.parent != nil { + parent_tool, err := self.parent.ProbeToolInfo(ctx, config_obj, tool.Name, "") + if err == nil { + result.Versions = append(result.Versions, parent_tool.Versions...) + } + } + return result } @@ -416,7 +424,7 @@ func (self *InventoryService) UpdateVersion(tool_request *artifacts_proto.Tool) self.mu.Lock() defer self.mu.Unlock() - // Update the list of version for this tool, replacing existing + // Update the list of versions for this tool, replacing existing // definitions. versions, _ := self.versions[tool_request.Name] version_known := false diff --git a/vql/server/inventory.go b/vql/server/inventory.go index 2d0462c98a8..101ff9d56ad 100644 --- a/vql/server/inventory.go +++ b/vql/server/inventory.go @@ -146,6 +146,7 @@ func (self *InventoryAddFunction) Info( type InventoryGetFunctionArgs struct { Tool string `vfilter:"required,field=tool"` Version string `vfilter:"optional,field=version"` + Probe bool `vfilter:"optional,field=probe,doc=If specified we only probe the tool definition without materializing"` } type InventoryGetFunction struct{} @@ -179,7 +180,12 @@ func (self *InventoryGetFunction) Call(ctx context.Context, return vfilter.Null{} } - tool, err := inventory.GetToolInfo(ctx, config_obj, arg.Tool, arg.Version) + var tool *artifacts_proto.Tool + if !arg.Probe { + tool, err = inventory.GetToolInfo(ctx, config_obj, arg.Tool, arg.Version) + } else { + tool, err = inventory.ProbeToolInfo(ctx, config_obj, arg.Tool, arg.Version) + } if err != nil { scope.Log("inventory_get: %s", err.Error()) return vfilter.Null{}