package lxd import ( "bytes" "fmt" "github.com/mitchellh/multistep" "github.com/mitchellh/packer/packer" "log" "os/exec" "strings" ) type stepPublish struct{} func (s *stepPublish) Run(state multistep.StateBag) multistep.StepAction { config := state.Get("config").(*Config) ui := state.Get("ui").(packer.Ui) name := config.ContainerName commands := [][]string{ {"lxc", "stop", "--force", name}, {"lxc", "publish", name, "--alias", config.OutputImage}, } ui.Say("Publishing container...") for _, command := range commands { err := s.SudoCommand(command...) if err != nil { err := fmt.Errorf("Error publishing container: %s", err) state.Put("error", err) ui.Error(err.Error()) return multistep.ActionHalt } } return multistep.ActionContinue } func (s *stepPublish) Cleanup(state multistep.StateBag) {} func (s *stepPublish) SudoCommand(args ...string) error { var stdout, stderr bytes.Buffer log.Printf("Executing sudo command: %#v", args) cmd := exec.Command("sudo", args...) cmd.Stdout = &stdout cmd.Stderr = &stderr err := cmd.Run() stdoutString := strings.TrimSpace(stdout.String()) stderrString := strings.TrimSpace(stderr.String()) if _, ok := err.(*exec.ExitError); ok { err = fmt.Errorf("Sudo command error: %s", stderrString) } log.Printf("stdout: %s", stdoutString) log.Printf("stderr: %s", stderrString) return err }