summaryrefslogtreecommitdiff
path: root/internal/config
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2021-10-02 11:54:07 +0300
committerPaul Buetow <paul@buetow.org>2021-10-02 15:11:23 +0300
commit12c79f68bb5bda6673819d7b754820ecfe6d08ff (patch)
treea779dc77dc8bf5a2dfc2030c718ce4543bfba6c7 /internal/config
parent6e1af993924bc7bebe898b403962db5a6b3505d1 (diff)
reduce logging in serverless mode
Diffstat (limited to 'internal/config')
-rw-r--r--internal/config/args.go30
-rw-r--r--internal/config/config.go116
-rw-r--r--internal/config/initializer.go109
-rw-r--r--internal/config/setup.go17
4 files changed, 151 insertions, 121 deletions
diff --git a/internal/config/args.go b/internal/config/args.go
index 484aa8b..3e2eb1f 100644
--- a/internal/config/args.go
+++ b/internal/config/args.go
@@ -1,6 +1,7 @@
package config
import (
+ "encoding/base64"
"fmt"
"strings"
@@ -69,7 +70,32 @@ func (a *Args) String() 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", a.Quiet, a.Spartan)
+ return fmt.Sprintf("quiet=%v:spartan=%v:serverless=%v", a.Quiet, a.Spartan, a.Serverless)
}
-// NEXT: Put the DeseializeOptions function here (move it away from the internal/server package)
+// 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
+}
diff --git a/internal/config/config.go b/internal/config/config.go
index 6d4730a..09ae994 100644
--- a/internal/config/config.go
+++ b/internal/config/config.go
@@ -1,14 +1,5 @@
package config
-import (
- "encoding/json"
- "flag"
- "fmt"
- "io/ioutil"
- "os"
- "strings"
-)
-
const (
// ControlUser is used for various DTail specific operations.
ControlUser string = "DTAIL-CONTROL"
@@ -33,97 +24,18 @@ var Server *ServerConfig
// Common holds common configs of both both, client and server.
var Common *CommonConfig
-// Used to initialize the configuration.
-type configInitializer struct {
- Common *CommonConfig
- Server *ServerConfig
- Client *ClientConfig
-}
-
-func (c *configInitializer) parseConfig(args *Args) {
- if strings.ToUpper(args.ConfigFile) == "NONE" {
- return
- }
-
- if args.ConfigFile != "" {
- c.parseSpecificConfig(args.ConfigFile)
- return
- }
-
- if homeDir, err := os.UserHomeDir(); err != nil {
- var paths []string
- paths = append(paths, fmt.Sprintf("%s/.config/dtail/dtail.conf", homeDir))
- paths = append(paths, fmt.Sprintf("%s/.dtail.conf", homeDir))
- for _, configPath := range paths {
- if _, err := os.Stat(configPath); !os.IsNotExist(err) {
- c.parseSpecificConfig(configPath)
- }
- }
- }
-}
-
-func (c *configInitializer) parseSpecificConfig(configFile string) {
- fd, err := os.Open(configFile)
- if err != nil {
- panic(fmt.Sprintf("Unable to read config file: %v", err))
- }
- defer fd.Close()
-
- cfgBytes, err := ioutil.ReadAll(fd)
- if err != nil {
- panic(fmt.Sprintf("Unable to read config file %s: %v", configFile, err))
- }
-
- err = json.Unmarshal([]byte(cfgBytes), c)
- if err != nil {
- panic(fmt.Sprintf("Unable to parse config file %s: %v", configFile, err))
- }
-}
-
-func (c *configInitializer) transformConfig(args *Args, additionalArgs []string,
- client *ClientConfig, server *ServerConfig, common *CommonConfig) (*ClientConfig, *ServerConfig, *CommonConfig) {
- if args.LogDir != "" {
- common.LogDir = args.LogDir
- }
- if strings.Contains(common.LogDir, "~/") {
- homeDir, err := os.UserHomeDir()
- if err != nil {
- panic(err)
- }
- common.LogDir = strings.ReplaceAll(common.LogDir, "~/", fmt.Sprintf("%s/", homeDir))
- }
- if common.LogStrategy == "" {
- common.LogStrategy = "daily"
- }
-
- if args.LogLevel != "" {
- common.LogLevel = args.LogLevel
- }
-
- if args.SSHPort != DefaultSSHPort {
- common.SSHPort = args.SSHPort
- }
- if args.NoColor {
- client.TermColorsEnable = false
- }
-
- if args.Spartan {
- args.Quiet = true
- args.NoColor = true
- }
-
- if args.Discovery == "" && args.ServersStr == "" {
- args.Serverless = true
- }
-
- // Interpret additional args as file list.
- if args.What == "" {
- var files []string
- for _, file := range flag.Args() {
- files = append(files, file)
- }
- args.What = strings.Join(files, ",")
- }
-
- return client, server, common
+// Setup the DTail configuration.
+func Setup(args *Args, additionalArgs []string) {
+ initializer := initializer{
+ Common: newDefaultCommonConfig(),
+ Server: newDefaultServerConfig(),
+ Client: newDefaultClientConfig(),
+ }
+ initializer.parseConfig(args)
+ Client, Server, Common = initializer.transformConfig(
+ args, additionalArgs,
+ initializer.Client,
+ initializer.Server,
+ initializer.Common,
+ )
}
diff --git a/internal/config/initializer.go b/internal/config/initializer.go
new file mode 100644
index 0000000..f1a9ec4
--- /dev/null
+++ b/internal/config/initializer.go
@@ -0,0 +1,109 @@
+package config
+
+import (
+ "encoding/json"
+ "flag"
+ "fmt"
+ "io/ioutil"
+ "os"
+ "strings"
+)
+
+// Used to initialize the configuration.
+type initializer struct {
+ Common *CommonConfig
+ Server *ServerConfig
+ Client *ClientConfig
+}
+
+func (c *initializer) parseConfig(args *Args) {
+ if strings.ToUpper(args.ConfigFile) == "NONE" {
+ return
+ }
+
+ if args.ConfigFile != "" {
+ c.parseSpecificConfig(args.ConfigFile)
+ return
+ }
+
+ if homeDir, err := os.UserHomeDir(); err != nil {
+ var paths []string
+ paths = append(paths, fmt.Sprintf("%s/.config/dtail/dtail.conf", homeDir))
+ paths = append(paths, fmt.Sprintf("%s/.dtail.conf", homeDir))
+ for _, configPath := range paths {
+ if _, err := os.Stat(configPath); !os.IsNotExist(err) {
+ c.parseSpecificConfig(configPath)
+ }
+ }
+ }
+}
+
+func (c *initializer) parseSpecificConfig(configFile string) {
+ fd, err := os.Open(configFile)
+ if err != nil {
+ panic(fmt.Sprintf("Unable to read config file: %v", err))
+ }
+ defer fd.Close()
+
+ cfgBytes, err := ioutil.ReadAll(fd)
+ if err != nil {
+ panic(fmt.Sprintf("Unable to read config file %s: %v", configFile, err))
+ }
+
+ err = json.Unmarshal([]byte(cfgBytes), c)
+ if err != nil {
+ panic(fmt.Sprintf("Unable to parse config file %s: %v", configFile, err))
+ }
+}
+
+func (c *initializer) transformConfig(args *Args, additionalArgs []string,
+ client *ClientConfig, server *ServerConfig, common *CommonConfig) (*ClientConfig, *ServerConfig, *CommonConfig) {
+ if args.LogDir != "" {
+ common.LogDir = args.LogDir
+ }
+ if strings.Contains(common.LogDir, "~/") {
+ homeDir, err := os.UserHomeDir()
+ if err != nil {
+ panic(err)
+ }
+ common.LogDir = strings.ReplaceAll(common.LogDir, "~/", fmt.Sprintf("%s/", homeDir))
+ }
+ if common.LogStrategy == "" {
+ common.LogStrategy = "daily"
+ }
+
+ if args.LogLevel != "" {
+ common.LogLevel = args.LogLevel
+ } else if args.ServersStr == "" && args.Discovery == "" {
+ // We are in serverless mode. Default log level is WARN.
+ common.LogLevel = "WARN"
+ }
+
+ if args.SSHPort != DefaultSSHPort {
+ common.SSHPort = args.SSHPort
+ }
+ if args.NoColor {
+ client.TermColorsEnable = false
+ }
+
+ if args.Spartan {
+ args.Quiet = true
+ args.NoColor = true
+ }
+
+ if args.Discovery == "" && args.ServersStr == "" {
+ // We are not connecting to any servers.
+ args.Serverless = true
+ }
+
+ // Interpret additional args as file list.
+ if args.What == "" {
+ var files []string
+ for _, file := range flag.Args() {
+ files = append(files, file)
+ }
+ args.What = strings.Join(files, ",")
+ }
+
+ return client, server, common
+}
diff --git a/internal/config/setup.go b/internal/config/setup.go
deleted file mode 100644
index 7800914..0000000
--- a/internal/config/setup.go
+++ /dev/null
@@ -1,17 +0,0 @@
-package config
-
-// Setup the DTail configuration.
-func Setup(args *Args, additionalArgs []string) {
- initializer := configInitializer{
- Common: newDefaultCommonConfig(),
- Server: newDefaultServerConfig(),
- Client: newDefaultClientConfig(),
- }
- initializer.parseConfig(args)
- Client, Server, Common = initializer.transformConfig(
- args, additionalArgs,
- initializer.Client,
- initializer.Server,
- initializer.Common,
- )
-}