/
session.go
94 lines (74 loc) · 1.87 KB
/
session.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package sshserver
import (
"log"
"github.com/gliderlabs/ssh"
"github.com/recode-sh/agent/constants"
"github.com/recode-sh/agent/internal/docker"
)
type SessionExecShellManager interface {
ManageShellInDevEnv(sshSession ssh.Session) error
ManageShellPTYInDevEnv(sshSession ssh.Session) error
ManageExecInDevEnv(sshSession ssh.Session) error
ManageShellPTY(sshSession ssh.Session) error
ManageShell(sshSession ssh.Session) error
ManageExec(sshSession ssh.Session) error
}
type Session struct {
manager SessionExecShellManager
}
func NewSession(
manager SessionExecShellManager,
) Session {
return Session{
manager: manager,
}
}
func (s Session) Start(sshSession ssh.Session) {
var sessionError error
defer func() {
if sessionError != nil {
log.Println(sessionError)
sshSession.Exit(1)
return
}
sshSession.Exit(0)
}()
dockerClient, err := docker.NewDefaultClient()
// We don't handle error here because
// we want to be able to login to instance via SSH
// even if the docker container cannot be reached
if err != nil {
log.Println(err)
}
isContainerRunning, err := docker.IsContainerRunning(
dockerClient,
constants.DevEnvDockerContainerName,
)
// Same than previous comment
if err != nil {
log.Println(err)
}
if len(sshSession.Command()) == 0 { // "shell" session
_, _, hasPTY := sshSession.Pty()
if hasPTY {
// if !isContainerRunning {
// sessionError = s.manager.ManageShellPTY(sshSession)
// return
// }
sessionError = s.manager.ManageShellPTYInDevEnv(sshSession)
return
}
// if !isContainerRunning {
// sessionError = s.manager.ManageShell(sshSession)
// return
// }
sessionError = s.manager.ManageShellInDevEnv(sshSession)
return
}
if !isContainerRunning {
sessionError = s.manager.ManageExec(sshSession)
return
}
// "exec" session
sessionError = s.manager.ManageExecInDevEnv(sshSession)
}