mirror of
https://github.com/hashicorp/packer.git
synced 2026-02-03 20:39:29 -05:00
The hcp-sbom provisioner is a provisioner that acts essentially like a download-only file provisioner, which also verifies the file downloaded is a SPDX/CycloneDX JSON-encoded SBOM file, and sets up its upload to HCP Packer later on.
190 lines
6.1 KiB
Go
190 lines
6.1 KiB
Go
//
|
|
// This file is automatically generated by scripts/generate-plugins.go -- Do not edit!
|
|
//
|
|
|
|
package command
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"regexp"
|
|
"strings"
|
|
|
|
packersdk "github.com/hashicorp/packer-plugin-sdk/packer"
|
|
"github.com/hashicorp/packer-plugin-sdk/plugin"
|
|
|
|
filebuilder "github.com/hashicorp/packer/builder/file"
|
|
nullbuilder "github.com/hashicorp/packer/builder/null"
|
|
hcppackerartifactdatasource "github.com/hashicorp/packer/datasource/hcp-packer-artifact"
|
|
hcppackerimagedatasource "github.com/hashicorp/packer/datasource/hcp-packer-image"
|
|
hcppackeriterationdatasource "github.com/hashicorp/packer/datasource/hcp-packer-iteration"
|
|
hcppackerversiondatasource "github.com/hashicorp/packer/datasource/hcp-packer-version"
|
|
httpdatasource "github.com/hashicorp/packer/datasource/http"
|
|
nulldatasource "github.com/hashicorp/packer/datasource/null"
|
|
artificepostprocessor "github.com/hashicorp/packer/post-processor/artifice"
|
|
checksumpostprocessor "github.com/hashicorp/packer/post-processor/checksum"
|
|
compresspostprocessor "github.com/hashicorp/packer/post-processor/compress"
|
|
manifestpostprocessor "github.com/hashicorp/packer/post-processor/manifest"
|
|
shelllocalpostprocessor "github.com/hashicorp/packer/post-processor/shell-local"
|
|
breakpointprovisioner "github.com/hashicorp/packer/provisioner/breakpoint"
|
|
fileprovisioner "github.com/hashicorp/packer/provisioner/file"
|
|
hcpsbomprovisioner "github.com/hashicorp/packer/provisioner/hcp-sbom"
|
|
powershellprovisioner "github.com/hashicorp/packer/provisioner/powershell"
|
|
shellprovisioner "github.com/hashicorp/packer/provisioner/shell"
|
|
shelllocalprovisioner "github.com/hashicorp/packer/provisioner/shell-local"
|
|
sleepprovisioner "github.com/hashicorp/packer/provisioner/sleep"
|
|
windowsrestartprovisioner "github.com/hashicorp/packer/provisioner/windows-restart"
|
|
windowsshellprovisioner "github.com/hashicorp/packer/provisioner/windows-shell"
|
|
)
|
|
|
|
type ExecuteCommand struct {
|
|
Meta
|
|
}
|
|
|
|
var Builders = map[string]packersdk.Builder{
|
|
"file": new(filebuilder.Builder),
|
|
"null": new(nullbuilder.Builder),
|
|
}
|
|
|
|
var Provisioners = map[string]packersdk.Provisioner{
|
|
"breakpoint": new(breakpointprovisioner.Provisioner),
|
|
"file": new(fileprovisioner.Provisioner),
|
|
"hcp-sbom": new(hcpsbomprovisioner.Provisioner),
|
|
"powershell": new(powershellprovisioner.Provisioner),
|
|
"shell": new(shellprovisioner.Provisioner),
|
|
"shell-local": new(shelllocalprovisioner.Provisioner),
|
|
"sleep": new(sleepprovisioner.Provisioner),
|
|
"windows-restart": new(windowsrestartprovisioner.Provisioner),
|
|
"windows-shell": new(windowsshellprovisioner.Provisioner),
|
|
}
|
|
|
|
var PostProcessors = map[string]packersdk.PostProcessor{
|
|
"artifice": new(artificepostprocessor.PostProcessor),
|
|
"checksum": new(checksumpostprocessor.PostProcessor),
|
|
"compress": new(compresspostprocessor.PostProcessor),
|
|
"manifest": new(manifestpostprocessor.PostProcessor),
|
|
"shell-local": new(shelllocalpostprocessor.PostProcessor),
|
|
}
|
|
|
|
var Datasources = map[string]packersdk.Datasource{
|
|
"hcp-packer-artifact": new(hcppackerartifactdatasource.Datasource),
|
|
"hcp-packer-image": new(hcppackerimagedatasource.Datasource),
|
|
"hcp-packer-iteration": new(hcppackeriterationdatasource.Datasource),
|
|
"hcp-packer-version": new(hcppackerversiondatasource.Datasource),
|
|
"http": new(httpdatasource.Datasource),
|
|
"null": new(nulldatasource.Datasource),
|
|
}
|
|
|
|
var pluginRegexp = regexp.MustCompile("packer-(builder|post-processor|provisioner|datasource)-(.+)")
|
|
|
|
type ExecuteArgs struct {
|
|
UseProtobuf bool
|
|
CommandType string
|
|
}
|
|
|
|
func (ea *ExecuteArgs) AddFlagSets(flags *flag.FlagSet) {
|
|
flags.BoolVar(&ea.UseProtobuf, "protobuf", false, "Use protobuf for serialising data over the wire instead of gob")
|
|
}
|
|
|
|
func (c *ExecuteCommand) ParseArgs(args []string) (*ExecuteArgs, int) {
|
|
var cfg ExecuteArgs
|
|
flags := c.Meta.FlagSet("")
|
|
flags.Usage = func() { c.Ui.Say(c.Help()) }
|
|
cfg.AddFlagSets(flags)
|
|
if err := flags.Parse(args); err != nil {
|
|
return &cfg, 1
|
|
}
|
|
|
|
args = flags.Args()
|
|
if len(args) != 1 {
|
|
flags.Usage()
|
|
return &cfg, 1
|
|
}
|
|
cfg.CommandType = args[0]
|
|
return &cfg, 0
|
|
}
|
|
|
|
func (c *ExecuteCommand) Run(args []string) int {
|
|
cfg, ret := c.ParseArgs(args)
|
|
if ret != 0 {
|
|
return ret
|
|
}
|
|
|
|
return c.RunContext(cfg)
|
|
}
|
|
|
|
func (c *ExecuteCommand) RunContext(args *ExecuteArgs) int {
|
|
// Plugin will match something like "packer-builder-amazon-ebs"
|
|
parts := pluginRegexp.FindStringSubmatch(args.CommandType)
|
|
if len(parts) != 3 {
|
|
c.Ui.Error(c.Help())
|
|
return 1
|
|
}
|
|
pluginType := parts[1] // capture group 1 (builder|post-processor|provisioner)
|
|
pluginName := parts[2] // capture group 2 (.+)
|
|
|
|
server, err := plugin.Server()
|
|
if err != nil {
|
|
c.Ui.Error(fmt.Sprintf("Error starting plugin server: %s", err))
|
|
return 1
|
|
}
|
|
|
|
if args.UseProtobuf {
|
|
server.UseProto = true
|
|
}
|
|
|
|
switch pluginType {
|
|
case "builder":
|
|
builder, found := Builders[pluginName]
|
|
if !found {
|
|
c.Ui.Error(fmt.Sprintf("Could not load builder: %s", pluginName))
|
|
return 1
|
|
}
|
|
server.RegisterBuilder(builder)
|
|
case "provisioner":
|
|
provisioner, found := Provisioners[pluginName]
|
|
if !found {
|
|
c.Ui.Error(fmt.Sprintf("Could not load provisioner: %s", pluginName))
|
|
return 1
|
|
}
|
|
server.RegisterProvisioner(provisioner)
|
|
case "post-processor":
|
|
postProcessor, found := PostProcessors[pluginName]
|
|
if !found {
|
|
c.Ui.Error(fmt.Sprintf("Could not load post-processor: %s", pluginName))
|
|
return 1
|
|
}
|
|
server.RegisterPostProcessor(postProcessor)
|
|
case "datasource":
|
|
datasource, found := Datasources[pluginName]
|
|
if !found {
|
|
c.Ui.Error(fmt.Sprintf("Could not load datasource: %s", pluginName))
|
|
return 1
|
|
}
|
|
server.RegisterDatasource(datasource)
|
|
}
|
|
|
|
server.Serve()
|
|
|
|
return 0
|
|
}
|
|
|
|
func (*ExecuteCommand) Help() string {
|
|
helpText := `
|
|
Usage: packer execute [options] PLUGIN
|
|
|
|
Runs an internally-compiled version of a plugin from the packer binary.
|
|
|
|
NOTE: this is an internal command and you should not call it yourself.
|
|
|
|
Options:
|
|
|
|
--protobuf: use protobuf for serialising data over-the-wire instead of gob.
|
|
`
|
|
|
|
return strings.TrimSpace(helpText)
|
|
}
|
|
|
|
func (c *ExecuteCommand) Synopsis() string {
|
|
return "internal plugin command"
|
|
}
|