/
pull.go
88 lines (73 loc) · 2.37 KB
/
pull.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package commands
import (
"errors"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
"github.com/spf13/viper"
"github.com/anchore/grype-db/cmd/grype-db/application"
"github.com/anchore/grype-db/cmd/grype-db/cli/options"
"github.com/anchore/grype-db/internal/log"
"github.com/anchore/grype-db/pkg/process"
"github.com/anchore/grype-db/pkg/provider"
"github.com/anchore/grype-db/pkg/provider/providers"
"github.com/anchore/grype-db/pkg/provider/providers/vunnel"
)
var _ options.Interface = &pullConfig{}
type pullConfig struct {
options.Pull `yaml:"pull" json:"pull" mapstructure:"pull"`
options.Provider `yaml:"provider" json:"provider" mapstructure:"provider"`
}
func (o *pullConfig) AddFlags(flags *pflag.FlagSet) {
options.AddAllFlags(flags, &o.Pull, &o.Provider)
}
func (o *pullConfig) BindFlags(flags *pflag.FlagSet, v *viper.Viper) error {
return options.BindAllFlags(flags, v, &o.Pull, &o.Provider)
}
func Pull(app *application.Application) *cobra.Command {
cfg := pullConfig{
Pull: options.DefaultPull(),
Provider: options.DefaultProvider(),
}
cmd := &cobra.Command{
Use: "pull",
Short: "pull and process all upstream vulnerability data",
Args: cobra.NoArgs,
PreRunE: app.Setup(&cfg),
RunE: func(cmd *cobra.Command, _ []string) error {
return app.Run(cmd.Context(), async(func() error {
return runPull(cfg)
}))
},
}
commonConfiguration(app, cmd, &cfg)
return cmd
}
func runPull(cfg pullConfig) error {
ps, err := providers.New(cfg.Root, vunnel.Config{
Config: cfg.Vunnel.Config,
Executor: cfg.Vunnel.Executor,
DockerTag: cfg.Vunnel.DockerTag,
DockerImage: cfg.Vunnel.DockerImage,
GenerateConfigs: cfg.Vunnel.GenerateConfigs,
ExcludeProviders: cfg.Vunnel.ExcludeProviders,
Env: cfg.Vunnel.Env,
}, cfg.Provider.Configs...)
if err != nil {
if errors.Is(err, providers.ErrNoProviders) {
log.Error("configure a provider via the application config or use -g to generate a list of configs from vunnel")
}
return err
}
if len(cfg.Provider.IncludeFilter) > 0 {
log.WithFields("keep-only", cfg.Provider.IncludeFilter).Debug("filtering providers by name")
ps = ps.Filter(cfg.Provider.IncludeFilter...)
}
c := process.PullConfig{
Parallelism: cfg.Parallelism,
Collection: provider.Collection{
Root: cfg.Root,
Providers: ps,
},
}
return process.Pull(c)
}