11package main
22
33import (
4+ "fmt"
45 "os"
56
7+ "dario.cat/mergo"
68 "github.com/fatih/color"
79 "github.com/spf13/cobra"
810 "github.com/stackrox/roxie/internal/deployer"
911 "github.com/stackrox/roxie/internal/logger"
12+ "github.com/stackrox/roxie/internal/xdg"
13+ "gopkg.in/yaml.v3"
1014)
1115
1216var (
@@ -23,13 +27,50 @@ var (
2327)
2428
2529func main () {
26- if err := rootCmd .Execute (); err != nil {
27- red := color .New (color .FgRed , color .Bold )
30+ globalLogger = logger .New ()
31+ red := color .New (color .FgRed , color .Bold )
32+ if err := run (); err != nil {
2833 red .Fprintf (os .Stderr , "Error: %v\n " , err )
2934 os .Exit (1 )
3035 }
3136}
3237
38+ func run () error {
39+ if err := tryApplyUserDefaults (globalLogger , & deploySettings ); err != nil {
40+ return err
41+ }
42+ return rootCmd .Execute ()
43+ }
44+
45+ // If a user config file exists, apply those user defaults on top the
46+ // current config. This essentially means, that the user config can
47+ // override values, which are already initialized in NewConfig().
48+ // Note: the user config should only contain reasonable fields, which
49+ // are not already handled by roxies smart defaulting like cluster-dependent
50+ // resource profiles.
51+ func tryApplyUserDefaults (log * logger.Logger , config * deployer.Config ) error {
52+ path , err := xdg .UserConfigPath ()
53+ if err != nil {
54+ return nil
55+ }
56+ data , err := os .ReadFile (path )
57+ if err != nil {
58+ if os .IsNotExist (err ) {
59+ return nil
60+ }
61+ return fmt .Errorf ("reading user config %q: %w" , path , err )
62+ }
63+ var userDefaults deployer.Config
64+ if err := yaml .Unmarshal (data , & userDefaults ); err != nil {
65+ return fmt .Errorf ("parsing user config %q: %w" , path , err )
66+ }
67+ if err := mergo .Merge (config , & userDefaults , mergo .WithOverride , mergo .WithoutDereference ); err != nil {
68+ return fmt .Errorf ("merging user config %q: %w" , path , err )
69+ }
70+ log .Dimf ("Applied user config from %s" , path )
71+ return nil
72+ }
73+
3374var rootCmd = & cobra.Command {
3475 Use : "roxie" ,
3576 Short : "roxie - Advanced Cluster Security Deployment Tool" ,
0 commit comments