From 6e176034306026b922c1df4231a1807f36cbe460 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20B=C3=BCtow?= Date: Sat, 22 Feb 2020 12:06:09 +0000 Subject: can start commands in background and also cancel those via drun command --- internal/server/background/background.go | 52 +++++++++++++++----------------- 1 file changed, 24 insertions(+), 28 deletions(-) (limited to 'internal/server/background/background.go') diff --git a/internal/server/background/background.go b/internal/server/background/background.go index 537ccbb..05a502f 100644 --- a/internal/server/background/background.go +++ b/internal/server/background/background.go @@ -2,10 +2,8 @@ package background import ( "context" - "fmt" + "errors" "sync" - - "github.com/mimecast/dtail/internal/io/logger" ) type job struct { @@ -13,27 +11,44 @@ type job struct { done <-chan struct{} } +// Background specifies a job or command run in background on server side. +// This does not require an active DTail client SSH connection/session. type Background struct { - mutex sync.Mutex + mutex *sync.Mutex jobs map[string]job } -func NewBackground() *Background { - return &Background{ - jobs: make(map[string]job), +// New returns a new background manager. +func New() Background { + return Background{ + jobs: make(map[string]job), + mutex: &sync.Mutex{}, } } +// Add a background job. func (b Background) Add(name string, cancel context.CancelFunc, done <-chan struct{}) error { b.mutex.Lock() defer b.mutex.Unlock() if _, ok := b.jobs[name]; ok { - return fmt.Errorf("job '%s' already exists", name) + return errors.New("job already exists") } - logger.Debug("background", name, "adding job") b.jobs[name] = job{cancel, done} + return nil +} + +// Cancel a background job. +func (b Background) Cancel(name string) error { + job, ok := b.get(name) + if !ok { + return errors.New("no job to cancel") + } + + job.cancel() + <-job.done + b.delete(name) return nil } @@ -52,22 +67,3 @@ func (b Background) delete(name string) { delete(b.jobs, name) } - -func (b Background) Stop(name string) { - logger.Debug("background", name, "stopping job") - job, ok := b.get(name) - - if !ok { - logger.Debug("background", name, "no such job") - return - } - - logger.Debug("background", name, "canceling job") - job.cancel() - - logger.Debug("background", name, "waiting for job to complete") - <-job.done - - logger.Debug("background", name, "deleting job") - b.delete(name) -} -- cgit v1.2.3