go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/explorer/scan/reporter.go (about)

     1  // Copyright (c) Mondoo, Inc.
     2  // SPDX-License-Identifier: BUSL-1.1
     3  
     4  package scan
     5  
     6  import (
     7  	"go.mondoo.com/cnquery/explorer"
     8  	"go.mondoo.com/cnquery/providers-sdk/v1/inventory"
     9  	"go.mondoo.com/cnquery/utils/multierr"
    10  )
    11  
    12  type Reporter interface {
    13  	AddReport(asset *inventory.Asset, results *AssetReport)
    14  	AddScanError(asset *inventory.Asset, err error)
    15  }
    16  
    17  type AssetReport struct {
    18  	Mrn      string
    19  	Bundle   *explorer.Bundle
    20  	Report   *explorer.Report
    21  	Resolved *explorer.ResolvedPack
    22  }
    23  
    24  type AggregateReporter struct {
    25  	assets       map[string]*explorer.Asset
    26  	assetReports map[string]*explorer.Report
    27  	assetErrors  map[string]error
    28  	bundle       *explorer.Bundle
    29  	resolved     map[string]*explorer.ResolvedPack
    30  }
    31  
    32  func NewAggregateReporter(assetList []*inventory.Asset) *AggregateReporter {
    33  	assets := make(map[string]*explorer.Asset, len(assetList))
    34  	for i := range assetList {
    35  		cur := assetList[i]
    36  		assets[cur.Mrn] = &explorer.Asset{
    37  			Mrn:  cur.Mrn,
    38  			Name: cur.Name,
    39  		}
    40  	}
    41  
    42  	return &AggregateReporter{
    43  		assets:       assets,
    44  		assetReports: map[string]*explorer.Report{},
    45  		assetErrors:  map[string]error{},
    46  		resolved:     map[string]*explorer.ResolvedPack{},
    47  	}
    48  }
    49  
    50  func (r *AggregateReporter) AddReport(asset *inventory.Asset, results *AssetReport) {
    51  	r.assetReports[asset.Mrn] = results.Report
    52  	r.resolved[asset.Mrn] = results.Resolved
    53  	r.bundle = results.Bundle
    54  }
    55  
    56  func (r *AggregateReporter) AddScanError(asset *inventory.Asset, err error) {
    57  	r.assetErrors[asset.Mrn] = err
    58  }
    59  
    60  func (r *AggregateReporter) Reports() *explorer.ReportCollection {
    61  	errors := make(map[string]*explorer.ErrorStatus, len(r.assetErrors))
    62  	for k, v := range r.assetErrors {
    63  		errors[k] = explorer.NewErrorStatus(v)
    64  	}
    65  
    66  	return &explorer.ReportCollection{
    67  		Assets:   r.assets,
    68  		Reports:  r.assetReports,
    69  		Errors:   errors,
    70  		Bundle:   r.bundle,
    71  		Resolved: r.resolved,
    72  	}
    73  }
    74  
    75  func (r *AggregateReporter) Error() error {
    76  	var err multierr.Errors
    77  	for _, curError := range r.assetErrors {
    78  		err.Add(curError)
    79  	}
    80  	return err.Deduplicate()
    81  }