go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/_motor/discovery/os/os.go (about) 1 // Copyright (c) Mondoo, Inc. 2 // SPDX-License-Identifier: BUSL-1.1 3 4 package os 5 6 import ( 7 "context" 8 9 "github.com/rs/zerolog/log" 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/motorid/hostname" 14 "go.mondoo.com/cnquery/motor/providers" 15 "go.mondoo.com/cnquery/motor/providers/os" 16 "go.mondoo.com/cnquery/motor/providers/resolver" 17 "go.mondoo.com/cnquery/motor/vault" 18 ) 19 20 type Resolver struct{} 21 22 func (r *Resolver) Name() string { 23 return "OS Resolver" 24 } 25 26 func (r *Resolver) AvailableDiscoveryTargets() []string { 27 return []string{common.DiscoveryAuto, common.DiscoveryAll} 28 } 29 30 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) { 31 assetObj := &asset.Asset{ 32 Name: root.Name, 33 Connections: []*providers.Config{tc}, 34 State: asset.State_STATE_ONLINE, 35 } 36 37 if len(assetObj.Connections[0].Credentials) == 0 { 38 cred, err := sfn(assetObj) 39 if err != nil { 40 log.Debug().Err(err).Msg("could not determine credential for asset") 41 return nil, err 42 } 43 if cred != nil { 44 assetObj.Connections[0].Credentials = append(assetObj.Connections[0].Credentials, cred) 45 } 46 } 47 48 m, err := resolver.NewMotorConnection(ctx, tc, credsResolver) 49 if err != nil { 50 return nil, err 51 } 52 defer m.Close() 53 54 // determine platform information 55 p, err := m.Platform() 56 if err == nil { 57 assetObj.Platform = p 58 } 59 60 fingerprint, err := motorid.IdentifyPlatform(m.Provider, p, userIdDetectors) 61 if err != nil { 62 return nil, err 63 } 64 assetObj.PlatformIds = fingerprint.PlatformIDs 65 if fingerprint.Name != "" { 66 assetObj.Name = fingerprint.Name 67 } 68 69 if fingerprint.Runtime != "" { 70 p.Runtime = fingerprint.Runtime 71 } 72 73 if fingerprint.Kind != providers.Kind_KIND_UNKNOWN { 74 p.Kind = fingerprint.Kind 75 } 76 77 for _, pf := range fingerprint.RelatedAssets { 78 assetObj.RelatedAssets = append(assetObj.RelatedAssets, &asset.Asset{ 79 Name: pf.Name, 80 PlatformIds: pf.PlatformIDs, 81 }) 82 } 83 84 // use hostname as asset name 85 if p != nil && assetObj.Name == "" { 86 osProvider, isOSProvider := m.Provider.(os.OperatingSystemProvider) 87 if isOSProvider { 88 // retrieve hostname 89 hostname, err := hostname.Hostname(osProvider, p) 90 if err == nil && len(hostname) > 0 { 91 assetObj.Name = hostname 92 } 93 } 94 } 95 96 // use hostname as name if asset name was not explicitly provided 97 if assetObj.Name == "" { 98 assetObj.Name = tc.Host 99 } 100 101 return []*asset.Asset{assetObj}, nil 102 }