/
commands.go
79 lines (62 loc) · 1.38 KB
/
commands.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
package sshutil
import (
"strings"
"golang.org/x/crypto/ssh"
)
type CommandOptions struct {
RequireOutput bool
StripNewLine bool
}
type CommandResult struct {
Output string
Error string
}
func (o CommandResult) IsError() bool {
return len(strings.TrimSpace(o.Error)) > 0
}
func (o CommandResult) IsOutputEmpty() bool {
return len(strings.TrimSpace(o.Output)) == 0
}
func (o CommandResult) LastString(delimiter string) string {
if o.IsOutputEmpty() {
return ""
}
parts := strings.Split(o.Output, delimiter)
return parts[len(parts)-1]
}
func (o CommandResult) FirstString(delimiter string) string {
if o.IsOutputEmpty() {
return ""
}
parts := strings.Split(o.Output, delimiter)
return parts[0]
}
// ExecuteCommand executes a command on a remote machine using SSH.
func ExecuteCommand(command string, sshClient *ssh.Client, options CommandOptions) CommandResult {
s, err := sshClient.NewSession()
if err != nil {
return CommandResult{
Error: err.Error(),
}
}
defer s.Close()
raw, err := s.CombinedOutput(command)
out := string(raw)
if err != nil {
return CommandResult{
Error: err.Error(),
Output: out,
}
}
if options.RequireOutput && len(strings.TrimSpace(out)) == 0 {
return CommandResult{
Error: ErrorCommandDidNotProduceOutput,
}
}
if options.StripNewLine {
out = strings.TrimSuffix(out, "\n")
}
return CommandResult{
Output: out,
}
}