74 lines
1.2 KiB
Go
74 lines
1.2 KiB
Go
package hook
|
|
|
|
import (
|
|
"io/ioutil"
|
|
"os"
|
|
"os/exec"
|
|
"path/filepath"
|
|
|
|
"github.com/metrue/fx/utils"
|
|
)
|
|
|
|
// Hooker defines hook interface
|
|
type Hooker interface {
|
|
Run() error
|
|
}
|
|
|
|
// Hook to run
|
|
type Hook struct {
|
|
name string
|
|
script string
|
|
}
|
|
|
|
// New a hook
|
|
func New(name string, script string, workdir string) *Hook {
|
|
return &Hook{
|
|
name: name,
|
|
script: script,
|
|
}
|
|
}
|
|
|
|
// Run execute a hook
|
|
func (h *Hook) Run(workdir string) error {
|
|
var script string
|
|
if !utils.IsRegularFile(h.script) {
|
|
hookScript, err := ioutil.TempFile(os.TempDir(), "fx-hook-script-")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer os.Remove(hookScript.Name())
|
|
|
|
content := []byte(h.script)
|
|
if _, err = hookScript.Write(content); err != nil {
|
|
return err
|
|
}
|
|
if err := hookScript.Close(); err != nil {
|
|
return err
|
|
}
|
|
script = hookScript.Name()
|
|
} else {
|
|
absScript, err := filepath.Abs(h.script)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
script = absScript
|
|
}
|
|
|
|
cmd := exec.Command("/bin/sh", script)
|
|
cmd.Stdout = os.Stdout
|
|
cmd.Stderr = os.Stderr
|
|
if workdir != "" {
|
|
cmd.Dir = workdir
|
|
}
|
|
|
|
if err := cmd.Run(); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Name hook name
|
|
func (h *Hook) Name() string {
|
|
return h.name
|
|
}
|