// Copyright 2012-present Oliver Eilhard. All rights reserved. // Use of this source code is governed by a MIT-license. // See http://olivere.mit-license.org/license.txt for details. package config import ( "fmt" "net/url" "strconv" "strings" ) // Config represents an Elasticsearch configuration. type Config struct { URL string Index string Username string Password string Shards int Replicas int Sniff *bool Healthcheck *bool Infolog string Errorlog string Tracelog string } // Parse returns the Elasticsearch configuration by extracting it // from the URL, its path, and its query string. // // Example: // http://127.0.0.1:9200/store-blobs?shards=1&replicas=0&sniff=false&tracelog=elastic.trace.log // // The code above will return a URL of http://127.0.0.1:9200, an index name // of store-blobs, and the related settings from the query string. func Parse(elasticURL string) (*Config, error) { cfg := &Config{ Shards: 1, Replicas: 0, Sniff: nil, } uri, err := url.Parse(elasticURL) if err != nil { return nil, fmt.Errorf("error parsing elastic parameter %q: %v", elasticURL, err) } index := strings.TrimSuffix(strings.TrimPrefix(uri.Path, "/"), "/") if uri.User != nil { cfg.Username = uri.User.Username() cfg.Password, _ = uri.User.Password() } uri.User = nil if i, err := strconv.Atoi(uri.Query().Get("shards")); err == nil { cfg.Shards = i } if i, err := strconv.Atoi(uri.Query().Get("replicas")); err == nil { cfg.Replicas = i } if s := uri.Query().Get("sniff"); s != "" { if b, err := strconv.ParseBool(s); err == nil { cfg.Sniff = &b } } if s := uri.Query().Get("healthcheck"); s != "" { if b, err := strconv.ParseBool(s); err == nil { cfg.Healthcheck = &b } } if s := uri.Query().Get("infolog"); s != "" { cfg.Infolog = s } if s := uri.Query().Get("errorlog"); s != "" { cfg.Errorlog = s } if s := uri.Query().Get("tracelog"); s != "" { cfg.Tracelog = s } uri.Path = "" uri.RawQuery = "" cfg.URL = uri.String() cfg.Index = index return cfg, nil }