diff --git a/cmd/csaf_aggregator/config.go b/cmd/csaf_aggregator/config.go index c8a807d3..da91c2f1 100644 --- a/cmd/csaf_aggregator/config.go +++ b/cmd/csaf_aggregator/config.go @@ -18,15 +18,14 @@ import ( "sync" "time" - "github.com/BurntSushi/toml" "github.com/ProtonMail/gopenpgp/v2/crypto" "github.com/csaf-poc/csaf_distribution/v2/csaf" + "github.com/csaf-poc/csaf_distribution/v2/internal/options" "github.com/csaf-poc/csaf_distribution/v2/util" "golang.org/x/time/rate" ) const ( - defaultConfigPath = "aggregator.toml" defaultWorkers = 10 defaultFolder = "/var/www" defaultWeb = "/var/www/html" @@ -74,7 +73,8 @@ type config struct { LockFile *string `toml:"lock_file"` // Interim performs an interim scan. - Interim bool `toml:"interim"` + Interim bool `short:"i" long:"interim" description:"Perform an interim scan" toml:"interim"` + Version bool `long:"version" description:"Display version of the binary" toml:"-"` // InterimYears is numbers numbers of years to look back // for interim advisories. Less/equal zero means forever. @@ -90,11 +90,34 @@ type config struct { // 'update_interval'. UpdateInterval *string `toml:"update_interval"` + Config string `short:"c" long:"config" description:"Path to config TOML file" value-name:"TOML-FILE" toml:"-"` + keyMu sync.Mutex key *crypto.Key keyErr error } +// configPaths are the potential file locations of the config file. +var configPaths = []string{ + // TODO: Make symmetric to checker and downloader. + "aggregator.toml", +} + +// parseArgsConfig parse the command arguments and loads configuration +// from a configuration file. +func parseArgsConfig() ([]string, *config, error) { + p := options.Parser[config]{ + DefaultConfigLocations: configPaths, + ConfigLocation: func(cfg *config) string { + return cfg.Config + }, + HasVersion: func(cfg *config) bool { return cfg.Version }, + // Establish default values if not set. + EnsureDefaults: (*config).setDefaults, + } + return p.Parse() +} + // tooOldForInterims returns a function that tells if a given // time is too old for the configured interims interval. func (c *config) tooOldForInterims() func(time.Time) bool { @@ -299,27 +322,3 @@ func (c *config) check() error { return c.checkMirror() } - -func loadConfig(path string) (*config, error) { - if path == "" { - path = defaultConfigPath - } - - var cfg config - md, err := toml.DecodeFile(path, &cfg) - if err != nil { - return nil, err - } - - if undecoded := md.Undecoded(); len(undecoded) != 0 { - return nil, fmt.Errorf("could not parse %q from config.toml", undecoded) - } - - cfg.setDefaults() - - if err := cfg.check(); err != nil { - return nil, err - } - - return &cfg, nil -} diff --git a/cmd/csaf_aggregator/main.go b/cmd/csaf_aggregator/main.go index 9af87441..a5923641 100644 --- a/cmd/csaf_aggregator/main.go +++ b/cmd/csaf_aggregator/main.go @@ -11,30 +11,13 @@ package main import ( "fmt" - "log" "os" "path/filepath" - "github.com/csaf-poc/csaf_distribution/v2/util" + "github.com/csaf-poc/csaf_distribution/v2/internal/options" "github.com/gofrs/flock" - "github.com/jessevdk/go-flags" ) -type options struct { - Config string `short:"c" long:"config" description:"File name of the configuration file" value-name:"CFG-FILE" default:"aggregator.toml"` - Version bool `long:"version" description:"Display version of the binary"` - Interim bool `short:"i" long:"interim" description:"Perform an interim scan"` -} - -func errCheck(err error) { - if err != nil { - if flags.WroteHelp(err) { - os.Exit(0) - } - log.Fatalf("error: %v\n", err) - } -} - func lock(lockFile *string, fn func() error) error { if lockFile == nil { // No locking configured. @@ -60,25 +43,9 @@ func lock(lockFile *string, fn func() error) error { } func main() { - opts := new(options) - - _, err := flags.Parse(opts) - errCheck(err) - - if opts.Version { - fmt.Println(util.SemVersion) - return - } - - interim := opts.Interim - - cfg, err := loadConfig(opts.Config) - errCheck(err) - - if interim { - cfg.Interim = true - } - + _, cfg, err := parseArgsConfig() + options.ErrorCheck(err) + options.ErrorCheck(cfg.check()) p := processor{cfg: cfg} - errCheck(lock(cfg.LockFile, p.process)) + options.ErrorCheck(lock(cfg.LockFile, p.process)) } diff --git a/cmd/csaf_checker/config.go b/cmd/csaf_checker/config.go index b8148e53..a2581d9e 100644 --- a/cmd/csaf_checker/config.go +++ b/cmd/csaf_checker/config.go @@ -77,7 +77,8 @@ func parseArgsConfig() ([]string, *config, error) { ConfigLocation: func(cfg *config) string { return cfg.Config }, - Usage: "[OPTIONS] domain...", + Usage: "[OPTIONS] domain...", + HasVersion: func(cfg *config) bool { return cfg.Version }, SetDefaults: func(cfg *config) { cfg.Format = defaultFormat cfg.RemoteValidatorPresets = []string{defaultPreset} diff --git a/cmd/csaf_downloader/config.go b/cmd/csaf_downloader/config.go index 07e9de64..fdf30996 100644 --- a/cmd/csaf_downloader/config.go +++ b/cmd/csaf_downloader/config.go @@ -53,7 +53,8 @@ func parseArgsConfig() ([]string, *config, error) { ConfigLocation: func(cfg *config) string { return cfg.Config }, - Usage: "[OPTIONS] domain...", + Usage: "[OPTIONS] domain...", + HasVersion: func(cfg *config) bool { return cfg.Version }, SetDefaults: func(cfg *config) { cfg.Worker = defaultWorker cfg.RemoteValidatorPresets = []string{defaultPreset} diff --git a/docs/csaf_aggregator.md b/docs/csaf_aggregator.md index 64491f8b..edbe8e81 100644 --- a/docs/csaf_aggregator.md +++ b/docs/csaf_aggregator.md @@ -6,13 +6,12 @@ csaf_aggregator [OPTIONS] Application Options: - -c, --config=CFG-FILE File name of the configuration file (default: - aggregator.toml) - --version Display version of the binary - -i, --interim Perform an interim scan + -i, --interim Perform an interim scan + --version Display version of the binary + -c, --config=TOML-FILE Path to config TOML file Help Options: - -h, --help Show this help message + -h, --help Show this help message ``` Usage example for a single run, to test if the config is good: