diff options
| author | Paul Bütow <pbuetow@mimecast.com> | 2020-01-20 18:41:05 +0000 |
|---|---|---|
| committer | Paul Bütow <pbuetow@mimecast.com> | 2020-01-21 14:35:23 +0000 |
| commit | c128865c4c7411c29a59fca9a3a2f95537686d7b (patch) | |
| tree | 193bccc70d942c8b70cc93fae2670263701e43aa /clients/handlers/basehandler.go | |
| parent | 3755a9911ecb05886577095f2b8cc8b9e4066a3a (diff) | |
Move commands to cmd/ and move internal dependencies to internal/
Diffstat (limited to 'clients/handlers/basehandler.go')
| -rw-r--r-- | clients/handlers/basehandler.go | 134 |
1 files changed, 0 insertions, 134 deletions
diff --git a/clients/handlers/basehandler.go b/clients/handlers/basehandler.go deleted file mode 100644 index ce82aa2..0000000 --- a/clients/handlers/basehandler.go +++ /dev/null @@ -1,134 +0,0 @@ -package handlers - -import ( - "dtail/logger" - "errors" - "fmt" - "io" - "strings" - "time" -) - -type baseHandler struct { - server string - shellStarted bool - commands chan string - pong chan struct{} - receiveBuf []byte - stop chan struct{} - pingTimeout int -} - -func (h *baseHandler) Server() string { - return h.server -} - -// Used to determine whether server is still responding to requests or not. -func (h *baseHandler) Ping() error { - if h.pingTimeout == 0 { - // Server ping disabled - return nil - } - - if err := h.SendCommand("ping"); err != nil { - return err - } - - select { - case <-h.pong: - return nil - case <-time.After(time.Duration(h.pingTimeout) * time.Second): - } - - return errors.New("Didn't receive any server pongs (ping replies)") -} - -func (h *baseHandler) SendCommand(command string) error { - if command == "ping" { - logger.Trace("Sending command", h.server, command) - } else { - logger.Debug("Sending command", h.server, command) - } - - select { - case h.commands <- fmt.Sprintf("%s;", command): - case <-time.After(time.Second * 5): - return errors.New("Timed out sending command " + command) - case <-h.stop: - } - - return nil -} - -// Read data from the dtail server via Writer interface. -func (h *baseHandler) Write(p []byte) (n int, err error) { - for _, b := range p { - h.receiveBuf = append(h.receiveBuf, b) - if b == '\n' { - if len(h.receiveBuf) == 0 { - continue - } - message := string(h.receiveBuf) - h.handleMessageType(message) - } - } - - return len(p), nil -} - -// Send data to the dtail server via Reader interface. -func (h *baseHandler) Read(p []byte) (n int, err error) { - select { - case command := <-h.commands: - n = copy(p, []byte(command)) - case <-h.stop: - return 0, io.EOF - } - return -} - -// Handle various message types. -func (h *baseHandler) handleMessageType(message string) { - if len(h.receiveBuf) == 0 { - return - } - // Hidden server commands starti with a dot "." - if h.receiveBuf[0] == '.' { - h.handleHiddenMessage(message) - h.receiveBuf = h.receiveBuf[:0] - return - } - - // Silent mode will only print out remote logs but not remote server - // commands. But remote server commands will be still logged to ./log/. - if logger.Mode == logger.SilentMode { - if h.receiveBuf[0] == 'R' { - logger.Raw(message) - } - h.receiveBuf = h.receiveBuf[:0] - return - } - logger.Raw(message) - h.receiveBuf = h.receiveBuf[:0] -} - -// Handle messages received from server which are not meant to be displayed -// to the end user. -func (h *baseHandler) handleHiddenMessage(message string) { - switch { - case strings.HasPrefix(message, ".pong"): - h.pong <- struct{}{} - case strings.HasPrefix(message, ".syn close connection"): - h.SendCommand("ack close connection") - } -} - -// Stop the handler. -func (h *baseHandler) Stop() { - select { - case <-h.stop: - default: - logger.Debug("Stopping base handler", h.server) - close(h.stop) - } -} |
