package main import ( "context" "errors" "os" "github.com/fleetdm/fleet/v4/server/vulnerabilities/macoffice" "github.com/fleetdm/fleet/v4/server/vulnerabilities/msrc" "github.com/fleetdm/fleet/v4/server/vulnerabilities/nvd" "github.com/fleetdm/fleet/v4/server/vulnerabilities/oval" "github.com/urfave/cli/v2" ) func vulnerabilityDataStreamCommand() *cli.Command { var dir string return &cli.Command{ Name: "vulnerability-data-stream", Usage: "Download the vulnerability data stream", UsageText: ` fleetctl vulnerability-data-stream [options] Downloads (if needed) the data streams that can be used by the Fleet server to process software for vulnerabilities. `, Flags: []cli.Flag{ &cli.StringFlag{ Name: "dir", EnvVars: []string{"DIR"}, Value: "", Destination: &dir, Usage: "Directory to place the data streams in", }, configFlag(), contextFlag(), debugFlag(), }, Action: func(c *cli.Context) error { if dir == "" { return errors.New("No directory provided") } err := os.MkdirAll(dir, 0o700) if err != nil { return err } log(c, "[-] Downloading CPE database...") err = nvd.DownloadCPEDBFromGithub(dir, "") if err != nil { return err } log(c, " Done\n") log(c, "[-] Downloading CPE translations...") err = nvd.DownloadCPETranslationsFromGithub(dir, "") if err != nil { return err } log(c, " Done\n") log(c, "[-] Downloading NVD CVE feed...") err = nvd.DownloadNVDCVEFeed(dir, "") if err != nil { return err } log(c, " Done\n") log(c, "[-] Downloading EPSS feed...") err = nvd.DownloadEPSSFeed(dir) if err != nil { return err } log(c, " Done\n") log(c, "[-] Downloading CISA known exploits feed...") err = nvd.DownloadCISAKnownExploitsFeed(dir) if err != nil { return err } log(c, " Done\n") log(c, "[-] Downloading Oval definitions...") err = oval.Sync(dir, nil) if err != nil { return err } log(c, " Done\n") log(c, "[-] Downloading MSRC artifacts...") ctx := context.Background() err = msrc.SyncFromGithub(ctx, dir, nil) if err != nil { return err } log(c, " Done\n") log(c, "[-] Downloading MacOffice release notes...") err = macoffice.SyncFromGithub(ctx, dir) if err != nil { return err } log(c, " Done\n") log(c, "[+] Data streams successfully downloaded!\n") return nil }, } }