diff --git a/config/config.go b/config/config.go index e131c350..a4bb108f 100644 --- a/config/config.go +++ b/config/config.go @@ -15,6 +15,9 @@ package config import ( "fmt" + "io" + "net/http" + "net/url" "os" "github.com/alecthomas/kingpin/v2" @@ -35,17 +38,35 @@ type Resolver struct { // NewResolver returns a Resolver structure. func NewResolver(file string, logger log.Logger) (*Resolver, error) { flags := map[string]string{} - _ = level.Info(logger).Log("msg", fmt.Sprintf("Loading configuration file: %v", file)) - if _, err := os.Stat(file); err != nil { - return nil, err - } - b, err := os.ReadFile(file) + var fileBytes []byte + url, err := url.ParseRequestURI(file) if err != nil { return nil, err } + if url.Scheme == "http" || url.Scheme == "https" { + _ = level.Info(logger).Log("msg", fmt.Sprintf("Loading configuration file from URL: %v", file)) + resp, err := http.Get(file) + if err != nil { + return nil, err + } + defer resp.Body.Close() + fileBytes, err = io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + } else { + _ = level.Info(logger).Log("msg", fmt.Sprintf("Loading configuration file: %v", file)) + if _, err := os.Stat(file); err != nil { + return nil, err + } + fileBytes, err = os.ReadFile(file) + if err != nil { + return nil, err + } + } var rawValues map[string]interface{} - err = yaml.Unmarshal(b, &rawValues) + err = yaml.Unmarshal(fileBytes, &rawValues) if err != nil { return nil, err }