| 1 | // SPDX-License-Identifier: GPL-3.0-or-later |
| 2 | |
| 3 | package vault |
| 4 | |
| 5 | import ( |
| 6 | "context" |
| 7 | "fmt" |
| 8 | "strings" |
| 9 | |
| 10 | "github.com/netdata/netdata/go/plugins/plugin/agent/secrets/secretstore" |
| 11 | "github.com/netdata/netdata/go/plugins/plugin/agent/secrets/secretstore/internal/httpx" |
| 12 | ) |
| 13 | |
| 14 | func (s *store) init(_ context.Context) error { |
| 15 | switch { |
| 16 | case s.Config.Timeout.Duration() < 0: |
| 17 | return fmt.Errorf("timeout cannot be negative") |
| 18 | case s.Config.Timeout.Duration() == 0: |
| 19 | s.Config.Timeout = defaultTimeout |
| 20 | } |
| 21 | s.runtime = &runtime{ |
| 22 | httpClient: httpx.VaultClient(s.Config.Timeout.Duration()), |
| 23 | httpClientInsecure: httpx.VaultInsecureClient(s.Config.Timeout.Duration()), |
| 24 | } |
| 25 | |
| 26 | published := &publishedStore{runtime: s.runtime} |
| 27 | |
| 28 | switch strings.TrimSpace(s.Config.Mode) { |
| 29 | case "token": |
| 30 | if s.Config.ModeToken == nil { |
| 31 | return fmt.Errorf("mode_token is required when mode is 'token'") |
| 32 | } |
| 33 | token := strings.TrimSpace(s.Config.ModeToken.Token) |
| 34 | if token == "" { |
| 35 | return fmt.Errorf("mode_token.token is required") |
| 36 | } |
| 37 | s.Config.Mode = "token" |
| 38 | s.Config.ModeToken.Token = token |
| 39 | s.Config.ModeTokenFile = nil |
| 40 | published.mode = s.Config.Mode |
| 41 | published.tokenValue = token |
| 42 | case "token_file": |
| 43 | if s.Config.ModeTokenFile == nil { |
| 44 | return fmt.Errorf("mode_token_file is required when mode is 'token_file'") |
| 45 | } |
| 46 | path := strings.TrimSpace(s.Config.ModeTokenFile.Path) |
| 47 | if path == "" { |
| 48 | return fmt.Errorf("mode_token_file.path is required") |
| 49 | } |
| 50 | s.Config.Mode = "token_file" |
| 51 | s.Config.ModeTokenFile.Path = path |
| 52 | s.Config.ModeToken = nil |
| 53 | published.mode = s.Config.Mode |
| 54 | published.tokenFilePath = path |
| 55 | default: |
| 56 | return fmt.Errorf("mode '%s' is invalid for kind '%s'", s.Config.Mode, secretstore.KindVault) |
| 57 | } |
| 58 | |
| 59 | addr := strings.TrimSpace(s.Config.Addr) |
| 60 | if addr == "" { |
| 61 | return fmt.Errorf("addr is required") |
| 62 | } |
| 63 | s.Config.Addr = addr |
| 64 | published.addr = addr |
| 65 | |
| 66 | s.Config.Namespace = strings.TrimSpace(s.Config.Namespace) |
| 67 | published.namespaceValue = s.Config.Namespace |
| 68 | published.tlsSkipVerify = s.Config.TLSSkipVerify |
| 69 | |
| 70 | s.published = published |
| 71 | return nil |
| 72 | } |