exec_post_hook.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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. provider mirrorProvider
  17. // exec on success or on failure
  18. execOn uint8
  19. // command
  20. command []string
  21. }
  22. func newExecPostHook(provider mirrorProvider, execOn uint8, command string) (*execPostHook, error) {
  23. cmd, err := shlex.Split(command, true)
  24. if err != nil {
  25. // logger.Errorf("Failed to create exec-post-hook for command: %s", command)
  26. return nil, err
  27. }
  28. if execOn != execOnSuccess && execOn != execOnFailure {
  29. return nil, fmt.Errorf("Invalid option for exec-on: %d", execOn)
  30. }
  31. return &execPostHook{
  32. provider: provider,
  33. execOn: execOn,
  34. command: cmd,
  35. }, nil
  36. }
  37. func (h *execPostHook) postSuccess() error {
  38. if h.execOn == execOnSuccess {
  39. return h.Do()
  40. }
  41. return nil
  42. }
  43. func (h *execPostHook) postFail() error {
  44. if h.execOn == execOnFailure {
  45. return h.Do()
  46. }
  47. return nil
  48. }
  49. func (h *execPostHook) Do() error {
  50. p := h.provider
  51. exitStatus := ""
  52. if h.execOn == execOnSuccess {
  53. exitStatus = "success"
  54. } else {
  55. exitStatus = "failure"
  56. }
  57. env := map[string]string{
  58. "TUNASYNC_MIRROR_NAME": p.Name(),
  59. "TUNASYNC_WORKING_DIR": p.WorkingDir(),
  60. "TUNASYNC_UPSTREAM_URL": p.Upstream(),
  61. "TUNASYNC_LOG_FILE": p.LogFile(),
  62. "TUNASYNC_JOB_EXIT_STATUS": exitStatus,
  63. }
  64. session := sh.NewSession()
  65. for k, v := range env {
  66. session.SetEnv(k, v)
  67. }
  68. var cmd string
  69. args := []interface{}{}
  70. if len(h.command) == 1 {
  71. cmd = h.command[0]
  72. } else if len(h.command) > 1 {
  73. cmd = h.command[0]
  74. for _, arg := range h.command[1:] {
  75. args = append(args, arg)
  76. }
  77. } else {
  78. return errors.New("Invalid Command")
  79. }
  80. return session.Command(cmd, args...).Run()
  81. }