Files
trivy/pkg/utils/utils.go
Ken Herner 2d512c5e47 Allow user specified cache directory (#12)
* 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>
2019-05-17 07:13:43 +09:00

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
}