2
0

cmd_provider.go 1.7 KB

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