Files
fx-serverless/hook/hook.go
2020-02-11 20:26:46 +08:00

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
}