github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/resource/context/utils.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package context
     5  
     6  import (
     7  	"io"
     8  	"os"
     9  
    10  	"github.com/juju/errors"
    11  	charmresource "gopkg.in/juju/charm.v6/resource"
    12  )
    13  
    14  // TODO(ericsnow) Move FingerprintMatcher to charm/resource (or even utils/hash)?
    15  
    16  // FingerprintMatcher supports verifying a file's fingerprint.
    17  type FingerprintMatcher struct {
    18  	// Open opens the identified file. It defaults to os.Open.
    19  	Open func(filename string) (io.ReadCloser, error)
    20  
    21  	// GenerateFingerprint produces the fingerprint that corresponds
    22  	// to the content of the provided reader. It defaults to
    23  	// charmresource.GenerateFingerprint.
    24  	GenerateFingerprint func(io.Reader) (charmresource.Fingerprint, error)
    25  }
    26  
    27  // FingerprintMatches determines whether or not the identified file's
    28  // fingerprint matches the expected fingerprint.
    29  func (fpm FingerprintMatcher) FingerprintMatches(filename string, expected charmresource.Fingerprint) (bool, error) {
    30  	open := fpm.Open
    31  	if open == nil {
    32  		open = func(filename string) (io.ReadCloser, error) { return os.Open(filename) }
    33  	}
    34  	generateFingerprint := fpm.GenerateFingerprint
    35  	if generateFingerprint == nil {
    36  		generateFingerprint = charmresource.GenerateFingerprint
    37  	}
    38  
    39  	file, err := open(filename)
    40  	if os.IsNotExist(errors.Cause(err)) {
    41  		return false, nil
    42  	}
    43  	if err != nil {
    44  		return false, errors.Trace(err)
    45  	}
    46  	defer file.Close()
    47  
    48  	fp, err := generateFingerprint(file)
    49  	if err != nil {
    50  		return false, errors.Trace(err)
    51  	}
    52  	matches := (fp.String() == expected.String())
    53  	return matches, nil
    54  }