go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/providers/os/resources/packages/detect.go (about) 1 // Copyright (c) Mondoo, Inc. 2 // SPDX-License-Identifier: BUSL-1.1 3 4 package packages 5 6 import ( 7 "fmt" 8 9 "github.com/rs/zerolog/log" 10 "go.mondoo.com/cnquery/providers-sdk/v1/upstream/mvd" 11 "go.mondoo.com/cnquery/providers/os/connection/shared" 12 ) 13 14 func Detect(conn shared.Connection) ([]Package, map[string]PackageUpdate, error) { 15 // find suitable package manager 16 pm, err := ResolveSystemPkgManager(conn) 17 if pm == nil || err != nil { 18 return nil, nil, err 19 } 20 21 // retrieve all system packages 22 packages, err := pm.List() 23 if err != nil { 24 log.Debug().Err(err).Msg("mql[packages]> could not retrieve package list") 25 return nil, nil, fmt.Errorf("could not retrieve package list for platform") 26 } 27 log.Debug().Int("packages", len(packages)).Msg("mql[packages]> installed packages") 28 29 // TODO: do we really need to make this a blocking call, we could update available updates async 30 // we try to retrieve the available updates 31 availableList, err := pm.Available() 32 if err != nil { 33 log.Debug().Err(err).Msg("mql[packages]> could not retrieve available updates") 34 availableList = map[string]PackageUpdate{} 35 } 36 log.Debug().Int("updates", len(availableList)).Msg("mql[packages]> available updates") 37 38 return packages, availableList, nil 39 } 40 41 func ConvertParserPackages(pkgs []Package, updates map[string]PackageUpdate) []*mvd.Package { 42 apiPkgs := []*mvd.Package{} 43 44 for _, d := range pkgs { 45 46 available := "" 47 update, ok := updates[d.Name] 48 if ok { 49 available = update.Available 50 } 51 52 apiPkgs = append(apiPkgs, &mvd.Package{ 53 Name: d.Name, 54 Version: d.Version, 55 Available: available, 56 Arch: d.Arch, 57 Origin: d.Origin, 58 Format: d.Format, 59 }) 60 } 61 62 return apiPkgs 63 }