This repository has been archived by the owner on Mar 24, 2022. It is now read-only.
forked from cloudfoundry/bosh-agent
/
ssh.go
133 lines (107 loc) · 3.14 KB
/
ssh.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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package action
import (
"errors"
"path"
boshplatform "github.com/cloudfoundry/bosh-agent/platform"
boshsettings "github.com/cloudfoundry/bosh-agent/settings"
boshdirs "github.com/cloudfoundry/bosh-agent/settings/directories"
bosherr "github.com/cloudfoundry/bosh-utils/errors"
boshlog "github.com/cloudfoundry/bosh-utils/logger"
)
const (
sshActionLogTag = "SSH Action"
)
type SSHAction struct {
settingsService boshsettings.Service
platform boshplatform.Platform
dirProvider boshdirs.Provider
logger boshlog.Logger
}
func NewSSH(
settingsService boshsettings.Service,
platform boshplatform.Platform,
dirProvider boshdirs.Provider,
logger boshlog.Logger,
) (action SSHAction) {
action.settingsService = settingsService
action.platform = platform
action.dirProvider = dirProvider
action.logger = logger
return
}
func (a SSHAction) IsAsynchronous() bool {
return false
}
func (a SSHAction) IsPersistent() bool {
return false
}
type SSHParams struct {
UserRegex string `json:"user_regex"`
User string
Password string
PublicKey string `json:"public_key"`
}
type SSHResult struct {
Command string `json:"command"`
Status string `json:"status"`
IP string `json:"ip,omitempty"`
HostPublicKey string `json:"host_public_key,omitempty"`
}
func (a SSHAction) Run(cmd string, params SSHParams) (SSHResult, error) {
switch cmd {
case "setup":
return a.setupSSH(params)
case "cleanup":
return a.cleanupSSH(params)
}
return SSHResult{}, errors.New("Unknown command for SSH method")
}
func (a SSHAction) setupSSH(params SSHParams) (SSHResult, error) {
var result SSHResult
boshSSHPath := path.Join(a.dirProvider.BaseDir(), "bosh_ssh")
err := a.platform.CreateUser(params.User, params.Password, boshSSHPath)
if err != nil {
return result, bosherr.WrapError(err, "Creating user")
}
err = a.platform.AddUserToGroups(params.User, []string{boshsettings.VCAPUsername, boshsettings.AdminGroup, boshsettings.SudoersGroup})
if err != nil {
return result, bosherr.WrapError(err, "Adding user to groups")
}
err = a.platform.SetupSSH(params.PublicKey, params.User)
if err != nil {
return result, bosherr.WrapError(err, "Setting ssh public key")
}
settings := a.settingsService.GetSettings()
defaultIP, found := settings.Networks.DefaultIP()
if !found {
return result, errors.New("No default ip could be found")
}
publicKey, err := a.platform.GetHostPublicKey()
if err != nil {
return result, bosherr.WrapError(err, "Getting host public key")
}
result = SSHResult{
Command: "setup",
Status: "success",
IP: defaultIP,
HostPublicKey: publicKey,
}
return result, nil
}
func (a SSHAction) cleanupSSH(params SSHParams) (SSHResult, error) {
err := a.platform.DeleteEphemeralUsersMatching(params.UserRegex)
if err != nil {
return SSHResult{}, bosherr.WrapError(err, "SSH Cleanup: Deleting Ephemeral Users")
}
result := SSHResult{
Command: "cleanup",
Status: "success",
}
return result, nil
}
func (a SSHAction) Resume() (interface{}, error) {
return nil, errors.New("not supported")
}
func (a SSHAction) Cancel() error {
return errors.New("not supported")
}