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
|
package config
import (
"flag"
"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
LogLevel string
Mode omode.Mode
NoColor bool
PrivateKeyPathFile 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(")
// TODO: All commands should make use of this
sb.WriteString(fmt.Sprintf("%s:%s,", "LogDir", a.LogDir))
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,", "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()
}
// Based on the argument list, transform/manipulate some of the arguments.
func (a *Args) transformConfig(args []string, client *ClientConfig, server *ServerConfig, common *CommonConfig) (*ClientConfig, *ServerConfig, *CommonConfig) {
if a.LogDir != "" {
common.LogDir = a.LogDir
if common.LogStrategy == "" {
// TODO: Implement the other (not-daily) log strategy for the server.
common.LogStrategy = "daily"
}
}
if a.LogLevel != "" {
common.LogLevel = a.LogLevel
}
if a.SSHPort != DefaultSSHPort {
common.SSHPort = a.SSHPort
}
if a.NoColor {
client.TermColorsEnable = false
}
if a.Spartan {
a.Quiet = true
a.NoColor = true
}
if a.Discovery == "" && a.ServersStr == "" {
a.Serverless = true
}
// Interpret additional args as file list.
if a.What == "" {
var files []string
for _, file := range flag.Args() {
files = append(files, file)
}
a.What = strings.Join(files, ",")
}
return client, server, common
}
// 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", a.Quiet, a.Spartan)
}
// NEXT: Put the DeseializeOptions function here (move it away from the internal/server package)
|