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 }