mirror of
https://github.com/aquasecurity/trivy.git
synced 2025-12-19 02:32:41 -08:00
* Added cache-dir flag The flag cache-dir allows users to specify the cache directory the database is stored in. Signed-off-by: Ken Herner <kherner@navistone.com> * Moved dbDir definition into functions Need to move dbDir definition into the calling functions as the cache directory may have been specified. With dbDir defined at package level, it would always be instantiated to the default value and would never be updated to the user specifyed value. Signed-off-by: Ken Herner <kherner@navistone.com>
123 lines
2.4 KiB
Go
123 lines
2.4 KiB
Go
package utils
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
"os"
|
|
"os/exec"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/knqyf263/trivy/pkg/log"
|
|
"golang.org/x/xerrors"
|
|
)
|
|
|
|
var cacheDir string
|
|
|
|
func CacheDir() string {
|
|
if cacheDir == "" {
|
|
var err error
|
|
cacheDir, err = os.UserCacheDir()
|
|
if err != nil {
|
|
cacheDir = os.TempDir()
|
|
}
|
|
}
|
|
dir := filepath.Join(cacheDir, "trivy")
|
|
return dir
|
|
}
|
|
|
|
func SetCacheDir(cd string) {
|
|
cacheDir = cd
|
|
}
|
|
|
|
func FileWalk(root string, targetFiles map[string]struct{}, walkFn func(r io.Reader, path string) error) error {
|
|
err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
|
|
if info.IsDir() {
|
|
return nil
|
|
}
|
|
|
|
rel, err := filepath.Rel(root, path)
|
|
if err != nil {
|
|
return xerrors.Errorf("error in filepath rel: %w", err)
|
|
}
|
|
|
|
if _, ok := targetFiles[rel]; !ok {
|
|
return nil
|
|
}
|
|
|
|
if info.Size() == 0 {
|
|
log.Logger.Debugf("invalid size: %s", path)
|
|
return nil
|
|
}
|
|
|
|
f, err := os.Open(path)
|
|
defer f.Close()
|
|
if err != nil {
|
|
return xerrors.Errorf("failed to open file: %w", err)
|
|
}
|
|
|
|
if err = walkFn(f, path); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
})
|
|
if err != nil {
|
|
return xerrors.Errorf("error in file walk: %w", err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func IsCommandAvailable(name string) bool {
|
|
cmd := exec.Command(name, "--help")
|
|
if err := cmd.Run(); err != nil {
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
func Exists(path string) (bool, error) {
|
|
_, err := os.Stat(path)
|
|
if err == nil {
|
|
return true, nil
|
|
}
|
|
if os.IsNotExist(err) {
|
|
return false, nil
|
|
}
|
|
return true, err
|
|
}
|
|
|
|
func StringInSlice(a string, list []string) bool {
|
|
for _, b := range list {
|
|
if b == a {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func Exec(command string, args []string) (string, error) {
|
|
cmd := exec.Command(command, args...)
|
|
var stdoutBuf, stderrBuf bytes.Buffer
|
|
cmd.Stdout = &stdoutBuf
|
|
cmd.Stderr = &stderrBuf
|
|
if err := cmd.Run(); err != nil {
|
|
log.Logger.Debug(stderrBuf.String())
|
|
return "", xerrors.Errorf("failed to exec: %w", err)
|
|
}
|
|
return stdoutBuf.String(), nil
|
|
}
|
|
|
|
func FilterTargets(prefixPath string, targets map[string]struct{}) (map[string]struct{}, error) {
|
|
filtered := map[string]struct{}{}
|
|
for filename := range targets {
|
|
if strings.HasPrefix(filename, prefixPath) {
|
|
rel, err := filepath.Rel(prefixPath, filename)
|
|
if err != nil {
|
|
return nil, xerrors.Errorf("error in filepath rel: %w", err)
|
|
}
|
|
filtered[rel] = struct{}{}
|
|
}
|
|
}
|
|
return filtered, nil
|
|
}
|