internal/worker: get rid of vulncheck
Makes imports mode private. Now, ModeGovulncheck will store imports
vulnerability numbers in a separate row with modeImports as ScanMode.
This is possible since govulncheck returns all vulnerabilities, imported
or called.
Also, save only called vulnerabilities for ModeGovulncheck.
Change-Id: I5839c4a1b3f4c958f0b996ea3a6193d47ef8e209
Reviewed-on: https://go-review.googlesource.com/c/pkgsite-metrics/+/475255
Reviewed-by: Jonathan Amsterdam <jba@google.com>
Run-TryBot: Zvonimir Pavlinovic <zpavlinovic@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
diff --git a/cmd/vulncheck_sandbox/vulncheck_sandbox.go b/cmd/vulncheck_sandbox/vulncheck_sandbox.go
index a3a5eba..eae5f2b 100644
--- a/cmd/vulncheck_sandbox/vulncheck_sandbox.go
+++ b/cmd/vulncheck_sandbox/vulncheck_sandbox.go
@@ -12,18 +12,14 @@
import (
"context"
- "encoding/json"
"errors"
"flag"
"fmt"
"io"
- "log"
"os"
"os/exec"
- "golang.org/x/pkgsite-metrics/internal/load"
"golang.org/x/pkgsite-metrics/internal/worker"
- "golang.org/x/vuln/vulncheck"
)
// vulnDBDir should contain a local copy of the vuln DB, with a LAST_MODIFIED
@@ -42,42 +38,26 @@
fmt.Fprintln(w)
}
- if len(args) != 2 {
- fail(errors.New("need two args: mode, and module dir or binary"))
+ if len(args) != 3 {
+ fail(errors.New("need three args: govulncheck path, mode, and module dir or binary"))
return
}
- mode := args[0]
+ mode := args[1]
if !worker.IsValidVulncheckMode(mode) {
fail(fmt.Errorf("%q is not a valid mode", mode))
return
}
- var b []byte
- var err error
- if mode == worker.ModeImports {
- res, err := runImportsAnalysis(context.Background(), args[1], vulnDBDir)
- if err != nil {
- fail(err)
- return
- }
- b, err = json.MarshalIndent(res, "", "\t")
- if err != nil {
- fail(fmt.Errorf("json.MarshalIndent: %v", err))
- return
- }
- } else {
- b, err = runGovulncheck(context.Background(), args[1], mode, vulnDBDir)
- if err != nil {
- fail(err)
- return
- }
+ b, err := runGovulncheck(context.Background(), args[0], mode, args[2], vulnDBDir)
+ if err != nil {
+ fail(err)
+ return
}
-
w.Write(b)
fmt.Println()
}
-func runGovulncheck(ctx context.Context, filePath, mode, vulnDBDir string) ([]byte, error) {
+func runGovulncheck(ctx context.Context, govulncheckPath, mode, filePath, vulnDBDir string) ([]byte, error) {
pattern := "./..."
dir := ""
if mode == worker.ModeBinary {
@@ -86,41 +66,9 @@
dir = filePath
}
- govulncheckCmd := exec.Command("/binaries/govulncheck", "-json", pattern)
+ govulncheckCmd := exec.Command(govulncheckPath, "-json", pattern)
govulncheckCmd.Dir = dir
govulncheckCmd.Env = append(govulncheckCmd.Environ(), "GOVULNDB=file://"+vulnDBDir)
return govulncheckCmd.Output()
}
-
-func runImportsAnalysis(ctx context.Context, moduleDir, vulnDBDir string) (*vulncheck.Result, error) {
- dbClient, err := NewLocalLMTClient(vulnDBDir)
- if err != nil {
- return nil, fmt.Errorf("NewLocalLMTClient: %v", err)
- }
- vcfg := &vulncheck.Config{
- Client: dbClient,
- ImportsOnly: true,
- }
-
- // Load all the packages in moduleDir.
- cfg := load.DefaultConfig()
- cfg.Dir = moduleDir
- cfg.Logf = log.Printf
- pkgs, pkgErrors, err := load.Packages(cfg, "./...")
- if err == nil && len(pkgErrors) > 0 {
- err = fmt.Errorf("%v", pkgErrors)
- }
- if err != nil {
- return nil, fmt.Errorf("loading packages: %v", err)
- }
- if len(pkgs) == 0 {
- return nil, fmt.Errorf("no packages in %s", moduleDir)
- }
-
- res, err := vulncheck.Source(ctx, vulncheck.Convert(pkgs), vcfg)
- if err != nil {
- return nil, err
- }
- return res, nil
-}