cmd_provider.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package worker
  2. import (
  3. "errors"
  4. "time"
  5. "github.com/anmitsu/go-shlex"
  6. )
  7. type cmdConfig struct {
  8. name string
  9. upstreamURL, command string
  10. workingDir, logDir, logFile string
  11. interval time.Duration
  12. retry int
  13. env map[string]string
  14. }
  15. type cmdProvider struct {
  16. baseProvider
  17. cmdConfig
  18. command []string
  19. }
  20. func newCmdProvider(c cmdConfig) (*cmdProvider, error) {
  21. // TODO: check config options
  22. if c.retry == 0 {
  23. c.retry = defaultMaxRetry
  24. }
  25. provider := &cmdProvider{
  26. baseProvider: baseProvider{
  27. name: c.name,
  28. ctx: NewContext(),
  29. interval: c.interval,
  30. retry: c.retry,
  31. },
  32. cmdConfig: c,
  33. }
  34. provider.ctx.Set(_WorkingDirKey, c.workingDir)
  35. provider.ctx.Set(_LogDirKey, c.logDir)
  36. provider.ctx.Set(_LogFileKey, c.logFile)
  37. cmd, err := shlex.Split(c.command, true)
  38. if err != nil {
  39. return nil, err
  40. }
  41. provider.command = cmd
  42. return provider, nil
  43. }
  44. func (p *cmdProvider) Type() providerEnum {
  45. return provCommand
  46. }
  47. func (p *cmdProvider) Upstream() string {
  48. return p.upstreamURL
  49. }
  50. func (p *cmdProvider) Run() error {
  51. if err := p.Start(); err != nil {
  52. return err
  53. }
  54. return p.Wait()
  55. }
  56. func (p *cmdProvider) Start() error {
  57. p.Lock()
  58. defer p.Unlock()
  59. if p.IsRunning() {
  60. return errors.New("provider is currently running")
  61. }
  62. env := map[string]string{
  63. "TUNASYNC_MIRROR_NAME": p.Name(),
  64. "TUNASYNC_WORKING_DIR": p.WorkingDir(),
  65. "TUNASYNC_UPSTREAM_URL": p.upstreamURL,
  66. "TUNASYNC_LOG_DIR": p.LogDir(),
  67. "TUNASYNC_LOG_FILE": p.LogFile(),
  68. }
  69. for k, v := range p.env {
  70. env[k] = v
  71. }
  72. p.cmd = newCmdJob(p, p.command, p.WorkingDir(), env)
  73. if err := p.prepareLogFile(false); err != nil {
  74. return err
  75. }
  76. if err := p.cmd.Start(); err != nil {
  77. return err
  78. }
  79. p.isRunning.Store(true)
  80. return nil
  81. }