diff --git a/post-processor/checksum/post-processor.go b/post-processor/checksum/post-processor.go index 8da32d5d9..2ae6da164 100644 --- a/post-processor/checksum/post-processor.go +++ b/post-processor/checksum/post-processor.go @@ -30,37 +30,10 @@ type PostProcessor struct { config Config } -func (p *PostProcessor) Configure(raws ...interface{}) error { - err := config.Decode(&p.config, &config.DecodeOpts{ - Interpolate: true, - InterpolateFilter: &interpolate.RenderFilter{ - Exclude: []string{}, - }, - }, raws...) - if err != nil { - return err - } - - if p.config.ChecksumTypes == nil { - p.config.ChecksumTypes = []string{"md5"} - } - - if p.config.OutputPath == "" { - p.config.OutputPath = "packer_{{.BuildName}}_{{.BuilderType}}" + ".checksum" - } - - errs := new(packer.MultiError) - - if err = interpolate.Validate(p.config.OutputPath, &p.config.ctx); err != nil { - errs = packer.MultiErrorAppend( - errs, fmt.Errorf("Error parsing target template: %s", err)) - } - - if len(errs.Errors) > 0 { - return errs - } - - return nil +type outputPathTemplate struct { + BuildName string + BuilderType string + ChecksumType string } func getHash(t string) hash.Hash { @@ -82,18 +55,65 @@ func getHash(t string) hash.Hash { return h } +func (p *PostProcessor) Configure(raws ...interface{}) error { + err := config.Decode(&p.config, &config.DecodeOpts{ + Interpolate: true, + InterpolateFilter: &interpolate.RenderFilter{ + Exclude: []string{}, + }, + }, raws...) + if err != nil { + return err + } + errs := new(packer.MultiError) + + if p.config.ChecksumTypes == nil { + p.config.ChecksumTypes = []string{"md5"} + } + + for _, k := range p.config.ChecksumTypes { + if h := getHash(k); h == nil { + errs = packer.MultiErrorAppend(errs, + fmt.Errorf("Unrecognized checksum type: %s", k)) + } + } + + if p.config.OutputPath == "" { + p.config.OutputPath = "packer_{{.BuildName}}_{{.BuilderType}}_{{.ChecksumType}}.checksum" + } + + if err = interpolate.Validate(p.config.OutputPath, &p.config.ctx); err != nil { + errs = packer.MultiErrorAppend( + errs, fmt.Errorf("Error parsing target template: %s", err)) + } + + if len(errs.Errors) > 0 { + return errs + } + + return nil +} + func (p *PostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (packer.Artifact, bool, error) { files := artifact.Files() var h hash.Hash - var checksumFile string newartifact := NewArtifact(artifact.Files()) + opTpl := &outputPathTemplate{ + BuildName: p.config.PackerBuildName, + BuilderType: p.config.PackerBuilderType, + } for _, ct := range p.config.ChecksumTypes { h = getHash(ct) + opTpl.ChecksumType = ct + p.config.ctx.Data = &opTpl for _, art := range files { - checksumFile = p.config.OutputPath + checksumFile, err := interpolate.Render(p.config.OutputPath, &p.config.ctx) + if err != nil { + return nil, false, err + } if _, err := os.Stat(checksumFile); err != nil { newartifact.files = append(newartifact.files, checksumFile) diff --git a/website/source/docs/post-processors/checksum.html.md b/website/source/docs/post-processors/checksum.html.md index 855a8c375..7e72a0937 100644 --- a/website/source/docs/post-processors/checksum.html.md +++ b/website/source/docs/post-processors/checksum.html.md @@ -44,4 +44,13 @@ Optional parameters: - `checksum_types` (array of strings) - An array of strings of checksum types to compute. Allowed values are md5, sha1, sha224, sha256, sha384, sha512. -- `output` (string) - Specify filename to store checksums. +- `output` (string) - Specify filename to store checksums. This defaults to + `packer_{{.BuildName}}_{{.BuilderType}}_{{.ChecksumType}}.checksum`. For + example, if you had a builder named `database`, you might see the file + written as `packer_database_docker_md5.checksum`. The following variables are + available to use in the output template: + + * `BuildName`: The name of the builder that produced the artifact. + * `BuilderType`: The type of builder used to produce the artifact. + * `ChecksumType`: The type of checksums the file contains. This should be + used if you have more than one value in `checksum_types`.