From aec74e90a5e93d755f3f7374d3791c8ad4c7c605 Mon Sep 17 00:00:00 2001 From: Pier-Hugues Pellerin Date: Mon, 18 Feb 2019 15:48:21 -0500 Subject: [PATCH] Initialize Paths before loading the keystore (#10706) * Initialize Paths before loading the keystore The paths were incorrectly initialized meaning that instead of creating the keystore in the data directory it was created next to the binary. The problem was the call to `paths.InitPaths()` was done after loading the keystore, this was causing a chicken and egg situation and `paths.Resolve(path.Data, "hello")` was returning "hello" instead of `data/hello`. To solve that situation we do a partial extract of the configuration, just enough to initialize the paths and we move on to the keystore and the complete unpack. (cherry picked from commit 3dbc2335a2f6be4f8f90804a98dc9709c7936a9f) --- CHANGELOG.next.asciidoc | 2 ++ libbeat/cmd/instance/beat.go | 28 +++++++++++++++++++++++----- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 7148788799b..72d7f0a8e31 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -10,6 +10,8 @@ https://github.com/elastic/beats/compare/v6.7.0...6.x[Check the HEAD diff] *Affecting all Beats* +- Initialize the Paths before the keystore and save the keystore into `data/{beatname}.keystore`. {pull}10706[10706] + *Auditbeat* *Filebeat* diff --git a/libbeat/cmd/instance/beat.go b/libbeat/cmd/instance/beat.go index 9789d91c7e2..5a0107ac649 100644 --- a/libbeat/cmd/instance/beat.go +++ b/libbeat/cmd/instance/beat.go @@ -562,6 +562,10 @@ func (b *Beat) configure(settings Settings) error { return fmt.Errorf("error loading config file: %v", err) } + if err := initPaths(cfg); err != nil { + return err + } + // We have to initialize the keystore before any unpack or merging the cloud // options. store, err := LoadKeystore(cfg, b.Info.Beat) @@ -599,11 +603,6 @@ func (b *Beat) configure(settings Settings) error { b.Info.Name = name } - err = paths.InitPaths(&b.Config.Path) - if err != nil { - return fmt.Errorf("error setting default paths: %v", err) - } - if err := configure.Logging(b.Info.Beat, b.Config.Logging); err != nil { return fmt.Errorf("error initializing logging: %v", err) } @@ -1005,3 +1004,22 @@ func LoadKeystore(cfg *common.Config, name string) (keystore.Keystore, error) { defaultPathConfig := paths.Resolve(paths.Data, fmt.Sprintf("%s.keystore", name)) return keystore.Factory(keystoreCfg, defaultPathConfig) } + +func initPaths(cfg *common.Config) error { + // To Fix the chicken-egg problem with the Keystore and the loading of the configuration + // files we are doing a partial unpack of the configuration file and only take into consideration + // the paths field. After we will unpack the complete configuration and keystore reference + // will be correctly replaced. + partialConfig := struct { + Path paths.Path `config:"path"` + }{} + + if err := cfg.Unpack(&partialConfig); err != nil { + return fmt.Errorf("error extracting default paths: %+v", err) + } + + if err := paths.InitPaths(&partialConfig.Path); err != nil { + return fmt.Errorf("error setting default paths: %+v", err) + } + return nil +}