1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- package worker
- import (
- "time"
- "github.com/anmitsu/go-shlex"
- )
- type cmdConfig struct {
- name string
- upstreamURL, command string
- workingDir, logDir, logFile string
- interval time.Duration
- env map[string]string
- }
- type cmdProvider struct {
- baseProvider
- cmdConfig
- command []string
- }
- func newCmdProvider(c cmdConfig) (*cmdProvider, error) {
- // TODO: check config options
- provider := &cmdProvider{
- baseProvider: baseProvider{
- name: c.name,
- ctx: NewContext(),
- interval: c.interval,
- },
- cmdConfig: c,
- }
- provider.ctx.Set(_WorkingDirKey, c.workingDir)
- provider.ctx.Set(_LogDirKey, c.logDir)
- provider.ctx.Set(_LogFileKey, c.logFile)
- cmd, err := shlex.Split(c.command, true)
- if err != nil {
- return nil, err
- }
- provider.command = cmd
- return provider, nil
- }
- func (p *cmdProvider) Run() error {
- if err := p.Start(); err != nil {
- return err
- }
- return p.Wait()
- }
- func (p *cmdProvider) Start() error {
- env := map[string]string{
- "TUNASYNC_MIRROR_NAME": p.Name(),
- "TUNASYNC_WORKING_DIR": p.WorkingDir(),
- "TUNASYNC_UPSTREAM_URL": p.upstreamURL,
- "TUNASYNC_LOG_FILE": p.LogFile(),
- }
- for k, v := range p.env {
- env[k] = v
- }
- p.cmd = newCmdJob(p.command, p.WorkingDir(), env)
- if err := p.prepareLogFile(); err != nil {
- return err
- }
- if err := p.cmd.Start(); err != nil {
- return err
- }
- p.isRunning.Store(true)
- return nil
- }
|