diff options
| author | Paul Bütow <pbuetow@mimecast.com> | 2020-02-11 13:10:26 +0000 |
|---|---|---|
| committer | Paul Bütow <pbuetow@mimecast.com> | 2020-02-11 13:10:26 +0000 |
| commit | ecf7c86bc2f64068e6256ac1b9738c712a9858e9 (patch) | |
| tree | 1ed536ad81a3c87c21eebd1438792ee91ce969e0 /internal/server | |
| parent | 410ca88465f065f244f88c1d4089cb0fa4a45799 (diff) | |
more on scheduled jobs and ssh callbacks
Diffstat (limited to 'internal/server')
| -rw-r--r-- | internal/server/scheduler.go | 78 |
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) + } +} |
