2
0

exec_post_hook.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package worker
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/anmitsu/go-shlex"
  6. "github.com/codeskyblue/go-sh"
  7. )
  8. // hook to execute command after syncing
  9. // typically setting timestamp, etc.
  10. const (
  11. execOnSuccess uint8 = iota
  12. execOnFailure
  13. )
  14. type execPostHook struct {
  15. emptyHook
  16. // exec on success or on failure
  17. execOn uint8
  18. // command
  19. command []string
  20. }
  21. func newExecPostHook(provider mirrorProvider, execOn uint8, command string) (*execPostHook, error) {
  22. cmd, err := shlex.Split(command, true)
  23. if err != nil {
  24. // logger.Errorf("Failed to create exec-post-hook for command: %s", command)
  25. return nil, err
  26. }
  27. if execOn != execOnSuccess && execOn != execOnFailure {
  28. return nil, fmt.Errorf("Invalid option for exec-on: %d", execOn)
  29. }
  30. return &execPostHook{
  31. emptyHook: emptyHook{
  32. provider: provider,
  33. },
  34. execOn: execOn,
  35. command: cmd,
  36. }, nil
  37. }
  38. func (h *execPostHook) postSuccess() error {
  39. if h.execOn == execOnSuccess {
  40. return h.Do()
  41. }
  42. return nil
  43. }
  44. func (h *execPostHook) postFail() error {
  45. if h.execOn == execOnFailure {
  46. return h.Do()
  47. }
  48. return nil
  49. }
  50. func (h *execPostHook) Do() error {
  51. p := h.provider
  52. exitStatus := ""
  53. if h.execOn == execOnSuccess {
  54. exitStatus = "success"
  55. } else {
  56. exitStatus = "failure"
  57. }
  58. env := map[string]string{
  59. "TUNASYNC_MIRROR_NAME": p.Name(),
  60. "TUNASYNC_WORKING_DIR": p.WorkingDir(),
  61. "TUNASYNC_UPSTREAM_URL": p.Upstream(),
  62. "TUNASYNC_LOG_DIR": p.LogDir(),
  63. "TUNASYNC_LOG_FILE": p.LogFile(),
  64. "TUNASYNC_JOB_EXIT_STATUS": exitStatus,
  65. }
  66. session := sh.NewSession()
  67. for k, v := range env {
  68. session.SetEnv(k, v)
  69. }
  70. var cmd string
  71. args := []interface{}{}
  72. if len(h.command) == 1 {
  73. cmd = h.command[0]
  74. } else if len(h.command) > 1 {
  75. cmd = h.command[0]
  76. for _, arg := range h.command[1:] {
  77. args = append(args, arg)
  78. }
  79. } else {
  80. return errors.New("Invalid Command")
  81. }
  82. return session.Command(cmd, args...).Run()
  83. }