update prometheus dependencies (#5520)
Signed-off-by: junot <junotxiang@kubesphere.io>
This commit is contained in:
162
vendor/github.com/prometheus/common/config/http_config.go
generated
vendored
162
vendor/github.com/prometheus/common/config/http_config.go
generated
vendored
@@ -21,10 +21,11 @@ import (
|
||||
"crypto/x509"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"net"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
@@ -80,7 +81,7 @@ func (tv *TLSVersion) UnmarshalYAML(unmarshal func(interface{}) error) error {
|
||||
}
|
||||
|
||||
func (tv *TLSVersion) MarshalYAML() (interface{}, error) {
|
||||
if tv != nil || *tv == 0 {
|
||||
if tv == nil || *tv == 0 {
|
||||
return []byte("null"), nil
|
||||
}
|
||||
for s, v := range TLSVersions {
|
||||
@@ -106,7 +107,7 @@ func (tv *TLSVersion) UnmarshalJSON(data []byte) error {
|
||||
|
||||
// MarshalJSON implements the json.Marshaler interface for TLSVersion.
|
||||
func (tv *TLSVersion) MarshalJSON() ([]byte, error) {
|
||||
if tv != nil || *tv == 0 {
|
||||
if tv == nil || *tv == 0 {
|
||||
return []byte("null"), nil
|
||||
}
|
||||
for s, v := range TLSVersions {
|
||||
@@ -117,6 +118,19 @@ func (tv *TLSVersion) MarshalJSON() ([]byte, error) {
|
||||
return nil, fmt.Errorf("unknown TLS version: %d", tv)
|
||||
}
|
||||
|
||||
// String implements the fmt.Stringer interface for TLSVersion.
|
||||
func (tv *TLSVersion) String() string {
|
||||
if tv == nil || *tv == 0 {
|
||||
return ""
|
||||
}
|
||||
for s, v := range TLSVersions {
|
||||
if *tv == v {
|
||||
return s
|
||||
}
|
||||
}
|
||||
return fmt.Sprintf("%d", tv)
|
||||
}
|
||||
|
||||
// BasicAuth contains basic HTTP authentication credentials.
|
||||
type BasicAuth struct {
|
||||
Username string `yaml:"username" json:"username"`
|
||||
@@ -235,6 +249,30 @@ func (a *OAuth2) SetDirectory(dir string) {
|
||||
a.TLSConfig.SetDirectory(dir)
|
||||
}
|
||||
|
||||
// LoadHTTPConfig parses the YAML input s into a HTTPClientConfig.
|
||||
func LoadHTTPConfig(s string) (*HTTPClientConfig, error) {
|
||||
cfg := &HTTPClientConfig{}
|
||||
err := yaml.UnmarshalStrict([]byte(s), cfg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return cfg, nil
|
||||
}
|
||||
|
||||
// LoadHTTPConfigFile parses the given YAML file into a HTTPClientConfig.
|
||||
func LoadHTTPConfigFile(filename string) (*HTTPClientConfig, []byte, error) {
|
||||
content, err := os.ReadFile(filename)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
cfg, err := LoadHTTPConfig(string(content))
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
cfg.SetDirectory(filepath.Dir(filepath.Dir(filename)))
|
||||
return cfg, content, nil
|
||||
}
|
||||
|
||||
// HTTPClientConfig configures an HTTP client.
|
||||
type HTTPClientConfig struct {
|
||||
// The HTTP basic authentication credentials for the targets.
|
||||
@@ -251,6 +289,11 @@ type HTTPClientConfig struct {
|
||||
BearerTokenFile string `yaml:"bearer_token_file,omitempty" json:"bearer_token_file,omitempty"`
|
||||
// HTTP proxy server to use to connect to the targets.
|
||||
ProxyURL URL `yaml:"proxy_url,omitempty" json:"proxy_url,omitempty"`
|
||||
// ProxyConnectHeader optionally specifies headers to send to
|
||||
// proxies during CONNECT requests. Assume that at least _some_ of
|
||||
// these headers are going to contain secrets and use Secret as the
|
||||
// value type instead of string.
|
||||
ProxyConnectHeader Header `yaml:"proxy_connect_header,omitempty" json:"proxy_connect_header,omitempty"`
|
||||
// TLSConfig to use to connect to the targets.
|
||||
TLSConfig TLSConfig `yaml:"tls_config,omitempty" json:"tls_config,omitempty"`
|
||||
// FollowRedirects specifies whether the client should follow HTTP 3xx redirects.
|
||||
@@ -276,7 +319,8 @@ func (c *HTTPClientConfig) SetDirectory(dir string) {
|
||||
}
|
||||
|
||||
// Validate validates the HTTPClientConfig to check only one of BearerToken,
|
||||
// BasicAuth and BearerTokenFile is configured.
|
||||
// BasicAuth and BearerTokenFile is configured. It also validates that ProxyURL
|
||||
// is set if ProxyConnectHeader is set.
|
||||
func (c *HTTPClientConfig) Validate() error {
|
||||
// Backwards compatibility with the bearer_token field.
|
||||
if len(c.BearerToken) > 0 && len(c.BearerTokenFile) > 0 {
|
||||
@@ -334,6 +378,9 @@ func (c *HTTPClientConfig) Validate() error {
|
||||
return fmt.Errorf("at most one of oauth2 client_secret & client_secret_file must be configured")
|
||||
}
|
||||
}
|
||||
if len(c.ProxyConnectHeader) > 0 && (c.ProxyURL.URL == nil || c.ProxyURL.String() == "") {
|
||||
return fmt.Errorf("if proxy_connect_header is configured proxy_url must also be configured")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -462,6 +509,7 @@ func NewRoundTripperFromConfig(cfg HTTPClientConfig, name string, optFuncs ...HT
|
||||
// It is applied on request. So we leave out any timings here.
|
||||
var rt http.RoundTripper = &http.Transport{
|
||||
Proxy: http.ProxyURL(cfg.ProxyURL.URL),
|
||||
ProxyConnectHeader: cfg.ProxyConnectHeader.HTTPHeader(),
|
||||
MaxIdleConns: 20000,
|
||||
MaxIdleConnsPerHost: 1000, // see https://github.com/golang/go/issues/13801
|
||||
DisableKeepAlives: !opts.keepAlivesEnabled,
|
||||
@@ -527,7 +575,7 @@ func NewRoundTripperFromConfig(cfg HTTPClientConfig, name string, optFuncs ...HT
|
||||
return newRT(tlsConfig)
|
||||
}
|
||||
|
||||
return NewTLSRoundTripper(tlsConfig, cfg.TLSConfig.CAFile, newRT)
|
||||
return NewTLSRoundTripper(tlsConfig, cfg.TLSConfig.CAFile, cfg.TLSConfig.CertFile, cfg.TLSConfig.KeyFile, newRT)
|
||||
}
|
||||
|
||||
type authorizationCredentialsRoundTripper struct {
|
||||
@@ -571,7 +619,7 @@ func NewAuthorizationCredentialsFileRoundTripper(authType, authCredentialsFile s
|
||||
|
||||
func (rt *authorizationCredentialsFileRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
|
||||
if len(req.Header.Get("Authorization")) == 0 {
|
||||
b, err := ioutil.ReadFile(rt.authCredentialsFile)
|
||||
b, err := os.ReadFile(rt.authCredentialsFile)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("unable to read authorization credentials file %s: %s", rt.authCredentialsFile, err)
|
||||
}
|
||||
@@ -609,7 +657,7 @@ func (rt *basicAuthRoundTripper) RoundTrip(req *http.Request) (*http.Response, e
|
||||
}
|
||||
req = cloneRequest(req)
|
||||
if rt.passwordFile != "" {
|
||||
bs, err := ioutil.ReadFile(rt.passwordFile)
|
||||
bs, err := os.ReadFile(rt.passwordFile)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("unable to read basic auth password file %s: %s", rt.passwordFile, err)
|
||||
}
|
||||
@@ -651,7 +699,7 @@ func (rt *oauth2RoundTripper) RoundTrip(req *http.Request) (*http.Response, erro
|
||||
)
|
||||
|
||||
if rt.config.ClientSecretFile != "" {
|
||||
data, err := ioutil.ReadFile(rt.config.ClientSecretFile)
|
||||
data, err := os.ReadFile(rt.config.ClientSecretFile)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("unable to read oauth2 client secret file %s: %s", rt.config.ClientSecretFile, err)
|
||||
}
|
||||
@@ -696,7 +744,7 @@ func (rt *oauth2RoundTripper) RoundTrip(req *http.Request) (*http.Response, erro
|
||||
if len(rt.config.TLSConfig.CAFile) == 0 {
|
||||
t, _ = tlsTransport(tlsConfig)
|
||||
} else {
|
||||
t, err = NewTLSRoundTripper(tlsConfig, rt.config.TLSConfig.CAFile, tlsTransport)
|
||||
t, err = NewTLSRoundTripper(tlsConfig, rt.config.TLSConfig.CAFile, rt.config.TLSConfig.CertFile, rt.config.TLSConfig.KeyFile, tlsTransport)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -766,6 +814,13 @@ func NewTLSConfig(cfg *TLSConfig) (*tls.Config, error) {
|
||||
tlsConfig := &tls.Config{
|
||||
InsecureSkipVerify: cfg.InsecureSkipVerify,
|
||||
MinVersion: uint16(cfg.MinVersion),
|
||||
MaxVersion: uint16(cfg.MaxVersion),
|
||||
}
|
||||
|
||||
if cfg.MaxVersion != 0 && cfg.MinVersion != 0 {
|
||||
if cfg.MaxVersion < cfg.MinVersion {
|
||||
return nil, fmt.Errorf("tls_config.max_version must be greater than or equal to tls_config.min_version if both are specified")
|
||||
}
|
||||
}
|
||||
|
||||
// If a CA cert is provided then let's read it in so we can validate the
|
||||
@@ -813,6 +868,8 @@ type TLSConfig struct {
|
||||
InsecureSkipVerify bool `yaml:"insecure_skip_verify" json:"insecure_skip_verify"`
|
||||
// Minimum TLS version.
|
||||
MinVersion TLSVersion `yaml:"min_version,omitempty" json:"min_version,omitempty"`
|
||||
// Maximum TLS version.
|
||||
MaxVersion TLSVersion `yaml:"max_version,omitempty" json:"max_version,omitempty"`
|
||||
}
|
||||
|
||||
// SetDirectory joins any relative file paths with dir.
|
||||
@@ -825,18 +882,45 @@ func (c *TLSConfig) SetDirectory(dir string) {
|
||||
c.KeyFile = JoinDir(dir, c.KeyFile)
|
||||
}
|
||||
|
||||
// UnmarshalYAML implements the yaml.Unmarshaler interface.
|
||||
func (c *TLSConfig) UnmarshalYAML(unmarshal func(interface{}) error) error {
|
||||
type plain TLSConfig
|
||||
return unmarshal((*plain)(c))
|
||||
}
|
||||
|
||||
// readCertAndKey reads the cert and key files from the disk.
|
||||
func readCertAndKey(certFile, keyFile string) ([]byte, []byte, error) {
|
||||
certData, err := os.ReadFile(certFile)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
keyData, err := os.ReadFile(keyFile)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
return certData, keyData, nil
|
||||
}
|
||||
|
||||
// getClientCertificate reads the pair of client cert and key from disk and returns a tls.Certificate.
|
||||
func (c *TLSConfig) getClientCertificate(*tls.CertificateRequestInfo) (*tls.Certificate, error) {
|
||||
cert, err := tls.LoadX509KeyPair(c.CertFile, c.KeyFile)
|
||||
func (c *TLSConfig) getClientCertificate(_ *tls.CertificateRequestInfo) (*tls.Certificate, error) {
|
||||
certData, keyData, err := readCertAndKey(c.CertFile, c.KeyFile)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("unable to read specified client cert (%s) & key (%s): %s", c.CertFile, c.KeyFile, err)
|
||||
}
|
||||
|
||||
cert, err := tls.X509KeyPair(certData, keyData)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("unable to use specified client cert (%s) & key (%s): %s", c.CertFile, c.KeyFile, err)
|
||||
}
|
||||
|
||||
return &cert, nil
|
||||
}
|
||||
|
||||
// readCAFile reads the CA cert file from disk.
|
||||
func readCAFile(f string) ([]byte, error) {
|
||||
data, err := ioutil.ReadFile(f)
|
||||
data, err := os.ReadFile(f)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("unable to load specified CA cert %s: %s", f, err)
|
||||
}
|
||||
@@ -856,23 +940,30 @@ func updateRootCA(cfg *tls.Config, b []byte) bool {
|
||||
// tlsRoundTripper is a RoundTripper that updates automatically its TLS
|
||||
// configuration whenever the content of the CA file changes.
|
||||
type tlsRoundTripper struct {
|
||||
caFile string
|
||||
caFile string
|
||||
certFile string
|
||||
keyFile string
|
||||
|
||||
// newRT returns a new RoundTripper.
|
||||
newRT func(*tls.Config) (http.RoundTripper, error)
|
||||
|
||||
mtx sync.RWMutex
|
||||
rt http.RoundTripper
|
||||
hashCAFile []byte
|
||||
tlsConfig *tls.Config
|
||||
mtx sync.RWMutex
|
||||
rt http.RoundTripper
|
||||
hashCAFile []byte
|
||||
hashCertFile []byte
|
||||
hashKeyFile []byte
|
||||
tlsConfig *tls.Config
|
||||
}
|
||||
|
||||
func NewTLSRoundTripper(
|
||||
cfg *tls.Config,
|
||||
caFile string,
|
||||
caFile, certFile, keyFile string,
|
||||
newRT func(*tls.Config) (http.RoundTripper, error),
|
||||
) (http.RoundTripper, error) {
|
||||
t := &tlsRoundTripper{
|
||||
caFile: caFile,
|
||||
certFile: certFile,
|
||||
keyFile: keyFile,
|
||||
newRT: newRT,
|
||||
tlsConfig: cfg,
|
||||
}
|
||||
@@ -882,7 +973,7 @@ func NewTLSRoundTripper(
|
||||
return nil, err
|
||||
}
|
||||
t.rt = rt
|
||||
_, t.hashCAFile, err = t.getCAWithHash()
|
||||
_, t.hashCAFile, t.hashCertFile, t.hashKeyFile, err = t.getTLSFilesWithHash()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -890,25 +981,36 @@ func NewTLSRoundTripper(
|
||||
return t, nil
|
||||
}
|
||||
|
||||
func (t *tlsRoundTripper) getCAWithHash() ([]byte, []byte, error) {
|
||||
b, err := readCAFile(t.caFile)
|
||||
func (t *tlsRoundTripper) getTLSFilesWithHash() ([]byte, []byte, []byte, []byte, error) {
|
||||
b1, err := readCAFile(t.caFile)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
return nil, nil, nil, nil, err
|
||||
}
|
||||
h := sha256.Sum256(b)
|
||||
return b, h[:], nil
|
||||
h1 := sha256.Sum256(b1)
|
||||
|
||||
var h2, h3 [32]byte
|
||||
if t.certFile != "" {
|
||||
b2, b3, err := readCertAndKey(t.certFile, t.keyFile)
|
||||
if err != nil {
|
||||
return nil, nil, nil, nil, err
|
||||
}
|
||||
h2, h3 = sha256.Sum256(b2), sha256.Sum256(b3)
|
||||
}
|
||||
|
||||
return b1, h1[:], h2[:], h3[:], nil
|
||||
}
|
||||
|
||||
// RoundTrip implements the http.RoundTrip interface.
|
||||
func (t *tlsRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
|
||||
b, h, err := t.getCAWithHash()
|
||||
caData, caHash, certHash, keyHash, err := t.getTLSFilesWithHash()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
t.mtx.RLock()
|
||||
equal := bytes.Equal(h[:], t.hashCAFile)
|
||||
equal := bytes.Equal(caHash[:], t.hashCAFile) &&
|
||||
bytes.Equal(certHash[:], t.hashCertFile) &&
|
||||
bytes.Equal(keyHash[:], t.hashKeyFile)
|
||||
rt := t.rt
|
||||
t.mtx.RUnlock()
|
||||
if equal {
|
||||
@@ -917,8 +1019,10 @@ func (t *tlsRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
|
||||
}
|
||||
|
||||
// Create a new RoundTripper.
|
||||
// The cert and key files are read separately by the client
|
||||
// using GetClientCertificate.
|
||||
tlsConfig := t.tlsConfig.Clone()
|
||||
if !updateRootCA(tlsConfig, b) {
|
||||
if !updateRootCA(tlsConfig, caData) {
|
||||
return nil, fmt.Errorf("unable to use specified CA cert %s", t.caFile)
|
||||
}
|
||||
rt, err = t.newRT(tlsConfig)
|
||||
@@ -929,7 +1033,9 @@ func (t *tlsRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
|
||||
|
||||
t.mtx.Lock()
|
||||
t.rt = rt
|
||||
t.hashCAFile = h[:]
|
||||
t.hashCAFile = caHash[:]
|
||||
t.hashCertFile = certHash[:]
|
||||
t.hashKeyFile = keyHash[:]
|
||||
t.mtx.Unlock()
|
||||
|
||||
return rt.RoundTrip(req)
|
||||
|
||||
Reference in New Issue
Block a user