cmd_provider.go 1.5 KB

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