func()

in providers/nvd/cve.go [271:322]


func (cf cveFile) needsUpdate(ctx context.Context, remoteMetaURL, localdir string) (*metaFile, bool, error) {
	flog.V(1).Infof("downloading meta file %q", remoteMetaURL)
	remoteMeta, err := newMetaFromURL(ctx, remoteMetaURL)
	if err != nil {
		return nil, false, err
	}
	metaFilename := filepath.Join(localdir, cf.MetaFile)
	if _, err := os.Stat(metaFilename); os.IsNotExist(err) {
		flog.V(1).Infof("meta file %q does not exist in %q, needs sync", cf.MetaFile, localdir)
		return &remoteMeta, true, nil
	}
	localMeta, err := newMetaFromFile(metaFilename)
	if err != nil {
		return nil, false, err
	}
	if !localMeta.Equal(remoteMeta) {
		flog.V(1).Infof("data file %q needs update in %q: local%+v != remote%+v", cf.DataFile, localdir, localMeta, remoteMeta)
		return &remoteMeta, true, nil
	}
	dataFilename := filepath.Join(localdir, cf.DataFile)
	fi, err := os.Stat(dataFilename)
	if err != nil {
		if os.IsNotExist(err) {
			flog.V(1).Infof("data file %q does not exist in %q, needs sync", cf.DataFile, localdir)
			return &remoteMeta, true, nil
		}
		return nil, false, err
	}
	var sizeOK bool
	var hashFunc func(filename string) (string, error)
	switch cf.compression() {
	case "gz":
		sizeOK = fi.Size() == int64(localMeta.GzSize)
		hashFunc = gunzipFileAndComputeSHA256
	case "zip":
		sizeOK = fi.Size() == int64(localMeta.ZipSize)
		hashFunc = unzipFileAndComputeSHA256
	}
	if !sizeOK {
		flog.V(1).Infof("data file %q needs update in %q: size mismatch", cf.DataFile, localdir)
		return &remoteMeta, true, nil
	}
	hash, err := hashFunc(dataFilename)
	if err != nil {
		return nil, false, err
	}
	if hash != localMeta.SHA256 {
		flog.V(1).Infof("data file %q needs update in %q: hash mismatch %q != %q", cf.DataFile, localdir, hash, localMeta.SHA256)
		return &remoteMeta, true, nil
	}
	return &remoteMeta, false, nil
}