internal/stack/config.go (80 lines of code) (raw):

// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one // or more contributor license agreements. Licensed under the Elastic License; // you may not use this file except in compliance with the Elastic License. package stack import ( "encoding/json" "errors" "fmt" "os" "path/filepath" "github.com/elastic/elastic-package/internal/profile" ) var configFileName = "config.json" type Config struct { Provider string `json:"provider,omitempty"` Parameters map[string]string `json:"parameters,omitempty"` ElasticsearchAPIKey string `json:"elasticsearch_api_key,omitempty"` ElasticsearchHost string `json:"elasticsearch_host,omitempty"` ElasticsearchUsername string `json:"elasticsearch_username,omitempty"` ElasticsearchPassword string `json:"elasticsearch_password,omitempty"` KibanaHost string `json:"kibana_host,omitempty"` CACertFile string `json:"ca_cert_file,omitempty"` OutputID string `json:"output_id,omitempty"` FleetServerID string `json:"fleet_server_id,omitempty"` // EnrollmentToken is the token used during initialization, it can expire, // so don't persist it, it won't be reused. EnrollmentToken string `json:"-"` // FleetServiceToken is the service token used during initialization when // a local Fleet Server is needed. FleetServiceToken string `json:"-"` } func configPath(profile *profile.Profile) string { return profile.Path(ProfileStackPath, configFileName) } func defaultConfig() Config { return Config{ Provider: DefaultProvider, // Hard-coded default values for backwards-compatibility. ElasticsearchHost: "https://127.0.0.1:9200", ElasticsearchUsername: elasticsearchUsername, ElasticsearchPassword: elasticsearchPassword, KibanaHost: "https://127.0.0.1:5601", } } func LoadConfig(profile *profile.Profile) (Config, error) { d, err := os.ReadFile(configPath(profile)) if errors.Is(err, os.ErrNotExist) { config := defaultConfig() caCertFile := profile.Path(CACertificateFile) // Use CA file in the profile only if it exists. if _, err := os.Stat(caCertFile); err == nil { config.CACertFile = caCertFile } return config, nil } if err != nil { return Config{}, fmt.Errorf("failed to read stack config: %w", err) } var config Config err = json.Unmarshal(d, &config) if err != nil { return Config{}, fmt.Errorf("failed to decode stack config: %w", err) } return config, nil } func storeConfig(profile *profile.Profile, config Config) error { d, err := json.Marshal(config) if err != nil { return fmt.Errorf("failed to encode stack config: %w", err) } err = os.MkdirAll(filepath.Dir(configPath(profile)), 0755) if err != nil { return fmt.Errorf("failed to create parent directory: %w", err) } err = os.WriteFile(configPath(profile), d, 0644) if err != nil { return fmt.Errorf("failed to write stack config: %s", err) } return nil } func printUserConfig(printer Printer, config Config) { if printer == nil { return } printer.Printf("Elasticsearch host: %s\n", config.ElasticsearchHost) printer.Printf("Kibana host: %s\n", config.KibanaHost) printer.Printf("Username: %s\n", config.ElasticsearchUsername) printer.Printf("Password: %s\n", config.ElasticsearchPassword) }