go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/_motor/discovery/terraform/terraform.go (about) 1 // Copyright (c) Mondoo, Inc. 2 // SPDX-License-Identifier: BUSL-1.1 3 4 package terraform 5 6 import ( 7 "context" 8 "path/filepath" 9 10 "go.mondoo.com/cnquery/motor/asset" 11 "go.mondoo.com/cnquery/motor/discovery/common" 12 "go.mondoo.com/cnquery/motor/motorid" 13 "go.mondoo.com/cnquery/motor/providers" 14 "go.mondoo.com/cnquery/motor/providers/resolver" 15 "go.mondoo.com/cnquery/motor/vault" 16 ) 17 18 type Resolver struct{} 19 20 func (r *Resolver) Name() string { 21 return "Terraform Static Analysis Resolver" 22 } 23 24 func (r *Resolver) AvailableDiscoveryTargets() []string { 25 return []string{common.DiscoveryAuto, common.DiscoveryAll} 26 } 27 28 func (r *Resolver) Resolve(ctx context.Context, root *asset.Asset, tc *providers.Config, credsResolver vault.Resolver, sfn common.QuerySecretFn, userIdDetectors ...providers.PlatformIdDetector) ([]*asset.Asset, error) { 29 name := "" 30 if tc.Options["path"] != "" { 31 // manifest parent directory name 32 name = common.ProjectNameFromPath(tc.Options["path"]) 33 } 34 35 assetObj := &asset.Asset{ 36 Name: root.Name, 37 Connections: []*providers.Config{tc}, 38 State: asset.State_STATE_ONLINE, 39 Labels: map[string]string{}, 40 } 41 42 if assetObj.Name == "" { 43 assetObj.Name = "Terraform Static Analysis " + name 44 } 45 46 // we have 3 different asset types for terraform: hcl, plan and state 47 // platform name will differ: terraform-hcl, terraform-plan, terraform-state 48 // platform family will be terraform 49 50 path, ok := tc.Options["path"] 51 if ok { 52 absPath, _ := filepath.Abs(path) 53 assetObj.Labels["path"] = absPath 54 } 55 56 m, err := resolver.NewMotorConnection(ctx, tc, credsResolver) 57 if err != nil { 58 return nil, err 59 } 60 defer m.Close() 61 62 // determine platform information 63 p, err := m.Platform() 64 if err == nil { 65 assetObj.Platform = p 66 } 67 68 fingerprint, err := motorid.IdentifyPlatform(m.Provider, p, userIdDetectors) 69 if err != nil { 70 return nil, err 71 } 72 assetObj.PlatformIds = fingerprint.PlatformIDs 73 if fingerprint.Name != "" { 74 assetObj.Name = fingerprint.Name 75 } 76 77 return []*asset.Asset{assetObj}, nil 78 }