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  }