57 lines
1.1 KiB
Go

// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1
package core
import (
"context"
"os/exec"
"github.com/hashicorp/go-hclog"
"github.com/hashicorp/vagrant/internal/config"
)
// execHook executes the given hook. This will return any errors. This ignores
// on_failure configurations so this must be processed external.
func execHook(ctx context.Context, s scope, log hclog.Logger, h *config.Hook) (err error) {
log.Debug("executing hook", "command", h.Command)
// Get our writers
ui, err := s.UI()
if err != nil {
return
}
stdout, stderr, err := ui.OutputWriters()
if err != nil {
log.Warn("error getting UI stdout/stderr", "err", err)
return err
}
// Build our command
cmd := exec.CommandContext(ctx, h.Command[0], h.Command[1:]...)
cmd.Stdout = stdout
cmd.Stderr = stderr
// Start
if err := cmd.Start(); err != nil {
log.Warn("error starting command", "err", err)
return err
}
// Wait
if err := cmd.Wait(); err != nil {
L := log
exiterr, ok := err.(*exec.ExitError)
if ok {
L = L.With("code", exiterr.ExitCode())
}
L.Warn("error running command", "err", err)
return err
}
return nil
}