summaryrefslogtreecommitdiff
path: root/internal/server
diff options
context:
space:
mode:
authorPaul Bütow <pbuetow@mimecast.com>2020-02-11 13:10:26 +0000
committerPaul Bütow <pbuetow@mimecast.com>2020-02-11 13:10:26 +0000
commitecf7c86bc2f64068e6256ac1b9738c712a9858e9 (patch)
tree1ed536ad81a3c87c21eebd1438792ee91ce969e0 /internal/server
parent410ca88465f065f244f88c1d4089cb0fa4a45799 (diff)
more on scheduled jobs and ssh callbacks
Diffstat (limited to 'internal/server')
-rw-r--r--internal/server/scheduler.go78
1 files changed, 78 insertions, 0 deletions
diff --git a/internal/server/scheduler.go b/internal/server/scheduler.go
new file mode 100644
index 0000000..3cf55ce
--- /dev/null
+++ b/internal/server/scheduler.go
@@ -0,0 +1,78 @@
+package server
+
+import (
+ "context"
+ "fmt"
+ "math/rand"
+ "time"
+
+ "github.com/mimecast/dtail/internal/clients"
+ "github.com/mimecast/dtail/internal/config"
+ "github.com/mimecast/dtail/internal/io/logger"
+ "github.com/mimecast/dtail/internal/omode"
+
+ gossh "golang.org/x/crypto/ssh"
+)
+
+const authLength = 64
+const authCharset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@£$%^&*()_+[]"
+
+type scheduler struct {
+ authPayload string
+}
+
+func newScheduler() *scheduler {
+ seededRand := rand.New(rand.NewSource(time.Now().UnixNano()))
+
+ b := make([]byte, authLength)
+ for i := range b {
+ b[i] = authCharset[seededRand.Intn(len(authCharset))]
+ }
+
+ return &scheduler{
+ authPayload: string(b),
+ }
+}
+
+func (s *scheduler) start(ctx context.Context) {
+ for {
+ select {
+ case <-time.After(time.Second * 10):
+ s.runJobs(ctx)
+ return
+ case <-time.After(time.Minute):
+ s.runJobs(ctx)
+ case <-ctx.Done():
+ return
+ }
+ }
+}
+
+func (s *scheduler) runJobs(ctx context.Context) {
+ for _, scheduled := range config.Server.Schedule {
+ args := clients.Args{
+ ConnectionsPerCPU: scheduled.ConnectionsPerCPU,
+ Discovery: scheduled.Discovery,
+ ServersStr: scheduled.Servers,
+ What: scheduled.Files,
+ Mode: omode.MapClient,
+ UserName: config.ScheduledUser,
+ }
+ args.SSHAuthMethods = append(args.SSHAuthMethods, gossh.Password(s.authPayload))
+
+ client, err := clients.NewMaprClient(args, scheduled.Query)
+ if err != nil {
+ logger.Error(fmt.Sprintf("Unable to create scheduled job %s", scheduled.Name), err)
+ continue
+ }
+
+ logger.Info(fmt.Sprintf("Starting scheduled job %s", scheduled.Name))
+ status := client.Start(ctx)
+ logMessage := fmt.Sprintf("Scheduled job %s exited with status %d", scheduled.Name, status)
+ if status != 0 {
+ logger.Warn(logMessage)
+ continue
+ }
+ logger.Info(logMessage)
+ }
+}