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
|
package config
import (
"encoding/base64"
"fmt"
"strings"
"github.com/mimecast/dtail/internal/omode"
gossh "golang.org/x/crypto/ssh"
)
// Args is a helper struct to summarize common client arguments.
type Args struct {
Arguments []string
ConfigFile string
ConnectionsPerCPU int
Discovery string
LogDir string
Logger string
LogLevel string
Mode omode.Mode
NoColor bool
PrivateKeyPathFile string
QueryStr string
Quiet bool
RegexInvert bool
RegexStr string
Serverless bool
ServersStr string
Spartan bool
SSHAuthMethods []gossh.AuthMethod
SSHHostKeyCallback gossh.HostKeyCallback
SSHPort int
Timeout int
TrustAllHosts bool
UserName string
What string
}
func (a *Args) String() string {
var sb strings.Builder
sb.WriteString("Args(")
sb.WriteString(fmt.Sprintf("%s:%s,", "LogDir", a.LogDir))
sb.WriteString(fmt.Sprintf("%s:%s,", "Logger", a.Logger))
sb.WriteString(fmt.Sprintf("%s:%s,", "LogLevel", a.LogLevel))
sb.WriteString(fmt.Sprintf("%s:%v,", "Arguments", a.Arguments))
sb.WriteString(fmt.Sprintf("%s:%v,", "ConfigFile", a.ConfigFile))
sb.WriteString(fmt.Sprintf("%s:%v,", "ConnectionsPerCPU", a.ConnectionsPerCPU))
sb.WriteString(fmt.Sprintf("%s:%v,", "Discovery", a.Discovery))
sb.WriteString(fmt.Sprintf("%s:%v,", "Mode", a.Mode))
sb.WriteString(fmt.Sprintf("%s:%v,", "NoColor", a.NoColor))
sb.WriteString(fmt.Sprintf("%s:%v,", "PrivateKeyPathFile", a.PrivateKeyPathFile))
sb.WriteString(fmt.Sprintf("%s:%v,", "QueryStr", a.QueryStr))
sb.WriteString(fmt.Sprintf("%s:%v,", "Quiet", a.Quiet))
sb.WriteString(fmt.Sprintf("%s:%v,", "RegexInvert", a.RegexInvert))
sb.WriteString(fmt.Sprintf("%s:%v,", "RegexStr", a.RegexStr))
sb.WriteString(fmt.Sprintf("%s:%v,", "Serverless", a.Serverless))
sb.WriteString(fmt.Sprintf("%s:%v,", "ServersStr", a.ServersStr))
sb.WriteString(fmt.Sprintf("%s:%v,", "Spartan", a.Spartan))
sb.WriteString(fmt.Sprintf("%s:%v,", "SSHAuthMethods", a.SSHAuthMethods))
sb.WriteString(fmt.Sprintf("%s:%v,", "SSHHostKeyCallback", a.SSHHostKeyCallback))
sb.WriteString(fmt.Sprintf("%s:%v,", "SSHPort", a.SSHPort))
sb.WriteString(fmt.Sprintf("%s:%v,", "Timeout", a.Timeout))
sb.WriteString(fmt.Sprintf("%s:%v,", "TrustAllHosts", a.TrustAllHosts))
sb.WriteString(fmt.Sprintf("%s:%v,", "UserName", a.UserName))
sb.WriteString(fmt.Sprintf("%s:%v", "What", a.What))
sb.WriteString(")")
return sb.String()
}
// SerializeOptions returns a string ready to be sent over the wire to the server.
func (a *Args) SerializeOptions() string {
return fmt.Sprintf("quiet=%v:spartan=%v:serverless=%v", a.Quiet, a.Spartan,
a.Serverless)
}
// DeserializeOptions deserializes the options, but into a map.
func DeserializeOptions(opts []string) (map[string]string, error) {
options := make(map[string]string, len(opts))
for _, o := range opts {
kv := strings.SplitN(o, "=", 2)
if len(kv) != 2 {
return options, fmt.Errorf("Unable to parse options: %v", kv)
}
key := kv[0]
val := kv[1]
if strings.HasPrefix(val, "base64%") {
s := strings.SplitN(val, "%", 2)
decoded, err := base64.StdEncoding.DecodeString(s[1])
if err != nil {
return options, err
}
val = string(decoded)
}
options[key] = val
}
return options, nil
}
|