summaryrefslogtreecommitdiff
path: root/internal/server/background/background.go
diff options
context:
space:
mode:
authorPaul Bütow <pbuetow@mimecast.com>2020-02-22 12:06:09 +0000
committerPaul Bütow <pbuetow@mimecast.com>2020-02-22 12:06:09 +0000
commit6e176034306026b922c1df4231a1807f36cbe460 (patch)
tree96405450466b12240302d306938c7af9b19f21ba /internal/server/background/background.go
parent4d2ab8e6dd645d345fa26d8a067ad6dc14fc1fce (diff)
can start commands in background and also cancel those via drun command
Diffstat (limited to 'internal/server/background/background.go')
-rw-r--r--internal/server/background/background.go52
1 files changed, 24 insertions, 28 deletions
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)
-}