summaryrefslogtreecommitdiff
path: root/internal/server
diff options
context:
space:
mode:
authorPaul Bütow <pbuetow@mimecast.com>2020-02-10 14:06:03 +0000
committerPaul Bütow <pbuetow@mimecast.com>2020-02-10 14:06:03 +0000
commit410ca88465f065f244f88c1d4089cb0fa4a45799 (patch)
tree5991a94cf29da0e6599e7263ba9c1cfd9e769a23 /internal/server
parent75c530dcd9fbe3376f3a3c617663af0303a935e3 (diff)
initial scheduled jobs
Diffstat (limited to 'internal/server')
-rw-r--r--internal/server/server.go19
-rw-r--r--internal/server/stats.go2
2 files changed, 15 insertions, 6 deletions
diff --git a/internal/server/server.go b/internal/server/server.go
index 42eb74c..5c46147 100644
--- a/internal/server/server.go
+++ b/internal/server/server.go
@@ -27,6 +27,8 @@ type Server struct {
catLimiterCh chan struct{}
// To control the max amount of concurrent tails
tailLimiterCh chan struct{}
+ // To run scheduled tasks (if configured)
+ sched *scheduler
}
// New returns a new server.
@@ -37,9 +39,10 @@ func New() *Server {
sshServerConfig: &gossh.ServerConfig{},
catLimiterCh: make(chan struct{}, config.Server.MaxConcurrentCats),
tailLimiterCh: make(chan struct{}, config.Server.MaxConcurrentTails),
+ sched: newScheduler(),
}
- s.sshServerConfig.PasswordCallback = s.controlUserCallback
+ s.sshServerConfig.PasswordCallback = s.backgroundUserCallback
s.sshServerConfig.PublicKeyCallback = server.PublicKeyCallback
private, err := gossh.ParsePrivateKey(server.PrivateHostKey())
@@ -62,7 +65,8 @@ func (s *Server) Start(ctx context.Context) int {
logger.FatalExit("Failed to open listening TCP socket", err)
}
- go s.stats.periodicLogServerStats(ctx)
+ go s.stats.start(ctx)
+ go s.sched.start(ctx)
for {
conn, err := listener.Accept() // Blocking
@@ -192,13 +196,18 @@ func (s *Server) handleRequests(ctx context.Context, sshConn gossh.Conn, in <-ch
return nil
}
-func (*Server) controlUserCallback(c gossh.ConnMetadata, authPayload []byte) (*gossh.Permissions, error) {
+func (s *Server) backgroundUserCallback(c gossh.ConnMetadata, authPayload []byte) (*gossh.Permissions, error) {
user := user.New(c.User(), c.RemoteAddr().String())
if user.Name == config.ControlUser && string(authPayload) == config.ControlUser {
- logger.Debug(user, "Initiating master control program")
+ logger.Debug(user, "Granting permissions to control user")
return nil, nil
}
- return nil, fmt.Errorf("Not authorized")
+ if user.Name == config.ScheduledUser && string(authPayload) == s.sched.authPayload {
+ logger.Debug(user, "Granting permissions to schedule user")
+ return nil, nil
+ }
+
+ return nil, fmt.Errorf("user %s not authorized", user)
}
diff --git a/internal/server/stats.go b/internal/server/stats.go
index 4d661f7..ac579ad 100644
--- a/internal/server/stats.go
+++ b/internal/server/stats.go
@@ -67,7 +67,7 @@ func (s *stats) serverLimitExceeded() error {
return nil
}
-func (s *stats) periodicLogServerStats(ctx context.Context) {
+func (s *stats) start(ctx context.Context) {
for {
select {
case <-time.NewTimer(time.Second * 10).C: