diff --git a/cmd/admin-handlers.go b/cmd/admin-handlers.go index d84703024..409c685eb 100644 --- a/cmd/admin-handlers.go +++ b/cmd/admin-handlers.go @@ -19,6 +19,7 @@ package cmd import ( "context" "crypto/subtle" + "crypto/tls" "encoding/json" "errors" "fmt" @@ -1519,7 +1520,7 @@ func fetchVaultStatus(cfg config.Config) madmin.Vault { return vault } - if err := checkConnection(kmsInfo.Endpoint); err != nil { + if err := checkConnection(kmsInfo.Endpoint, 15*time.Second); err != nil { vault.Status = "offline" } else { @@ -1563,7 +1564,7 @@ func fetchLoggerInfo(cfg config.Config) ([]madmin.Logger, []madmin.Audit) { var auditlogger []madmin.Audit for log, l := range loggerCfg.HTTP { if l.Enabled { - err := checkConnection(l.Endpoint) + err := checkConnection(l.Endpoint, 15*time.Second) if err == nil { mapLog := make(map[string]madmin.Status) mapLog[log] = madmin.Status{Status: "Online"} @@ -1578,7 +1579,7 @@ func fetchLoggerInfo(cfg config.Config) ([]madmin.Logger, []madmin.Audit) { for audit, l := range loggerCfg.Audit { if l.Enabled { - err := checkConnection(l.Endpoint) + err := checkConnection(l.Endpoint, 15*time.Second) if err == nil { mapAudit := make(map[string]madmin.Status) mapAudit[audit] = madmin.Status{Status: "Online"} @@ -1594,12 +1595,19 @@ func fetchLoggerInfo(cfg config.Config) ([]madmin.Logger, []madmin.Audit) { } // checkConnection - ping an endpoint , return err in case of no connection -func checkConnection(endpointStr string) error { +func checkConnection(endpointStr string, timeout time.Duration) error { u, pErr := xnet.ParseURL(endpointStr) if pErr != nil { return pErr } - if dErr := u.DialHTTP(); dErr != nil { + + tr := newCustomHTTPTransport( + &tls.Config{RootCAs: globalRootCAs}, + timeout, + 0, /* Default value */ + )() + + if dErr := u.DialHTTP(tr); dErr != nil { if urlErr, ok := dErr.(*url.Error); ok { // To treat "connection refused" errors as un reachable endpoint. if target.IsConnRefusedErr(urlErr.Err) { diff --git a/cmd/admin-server-info.go b/cmd/admin-server-info.go index 9916ebbb1..e6ccaf6e7 100644 --- a/cmd/admin-server-info.go +++ b/cmd/admin-server-info.go @@ -20,7 +20,6 @@ import ( "net" "net/http" "os" - "strings" "github.com/minio/minio-go/v6/pkg/set" "github.com/minio/minio/pkg/cpu" @@ -190,51 +189,49 @@ func getLocalNetworkInfo(endpointZones EndpointZones, r *http.Request) madmin.Se // getLocalServerProperty - returns ServerDrivesPerfInfo for only the // local endpoints from given list of endpoints func getLocalServerProperty(endpointZones EndpointZones, r *http.Request) madmin.ServerProperties { - var di madmin.Disk var disks []madmin.Disk addr := r.Host if globalIsDistXL { addr = GetLocalPeer(endpointZones) } network := make(map[string]string) - hosts := set.NewStringSet() for _, ep := range endpointZones { for _, endpoint := range ep.Endpoints { - - url := strings.Replace(endpoint.URL.String(), endpoint.Path, "", -1) - if url == "" { - url = r.Host + nodeName := endpoint.Host + if nodeName == "" { + nodeName = r.Host } - hosts.Add(url) - - // Only proceed for local endpoints if endpoint.IsLocal { - url = fetchAddress(url) - network[url] = "online" - if _, err := os.Stat(endpoint.Path); err != nil { - continue + // Only proceed for local endpoints + network[nodeName] = "online" + var di = madmin.Disk{ + DrivePath: endpoint.Path, + } + diInfo, err := disk.GetInfo(endpoint.Path) + if err != nil { + if os.IsNotExist(err) || isSysErrPathNotFound(err) { + di.State = madmin.DriveStateMissing + } else { + di.State = madmin.DriveStateCorrupt + } + } else { + di.State = madmin.DriveStateOk + di.DrivePath = endpoint.Path + di.TotalSpace = diInfo.Total + di.UsedSpace = diInfo.Total - diInfo.Free + di.Utilization = float64((diInfo.Total - diInfo.Free) / diInfo.Total * 100) } - - diInfo, _ := disk.GetInfo(endpoint.Path) - di.State = "ok" - di.DrivePath = endpoint.Path - di.TotalSpace = diInfo.Total - di.UsedSpace = diInfo.Total - diInfo.Free - di.Utilization = float64((diInfo.Total - diInfo.Free) / diInfo.Total * 100) disks = append(disks, di) - } - } - } - - for host := range hosts { - _, present := network[host] - if !present { - err := checkConnection(host) - host = fetchAddress(host) - if err != nil { - network[host] = "offline" } else { - network[host] = "online" + _, present := network[nodeName] + if !present { + err := IsServerResolvable(endpoint) + if err == nil { + network[nodeName] = "online" + } else { + network[nodeName] = "offline" + } + } } } } @@ -249,13 +246,3 @@ func getLocalServerProperty(endpointZones EndpointZones, r *http.Request) madmin Disks: disks, } } - -// Replaces http and https from address -func fetchAddress(address string) string { - if strings.Contains(address, "http://") { - address = strings.Replace(address, "http://", "", -1) - } else if strings.Contains(address, "https://") { - address = strings.Replace(address, "https://", "", -1) - } - return address -} diff --git a/pkg/event/target/elasticsearch.go b/pkg/event/target/elasticsearch.go index 7e2022b01..83e20ff6a 100644 --- a/pkg/event/target/elasticsearch.go +++ b/pkg/event/target/elasticsearch.go @@ -95,7 +95,7 @@ func (target *ElasticsearchTarget) ID() event.TargetID { // IsActive - Return true if target is up and active func (target *ElasticsearchTarget) IsActive() (bool, error) { - if dErr := target.args.URL.DialHTTP(); dErr != nil { + if dErr := target.args.URL.DialHTTP(nil); dErr != nil { if xnet.IsNetworkOrHostDown(dErr) { return false, errNotConnected } @@ -260,7 +260,7 @@ func NewElasticsearchTarget(id string, args ElasticsearchArgs, doneCh <-chan str } } - dErr := args.URL.DialHTTP() + dErr := args.URL.DialHTTP(nil) if dErr != nil { if store == nil { return nil, dErr diff --git a/pkg/event/target/webhook.go b/pkg/event/target/webhook.go index 5a6479b84..52e888624 100644 --- a/pkg/event/target/webhook.go +++ b/pkg/event/target/webhook.go @@ -95,7 +95,7 @@ func (target *WebhookTarget) IsActive() (bool, error) { if pErr != nil { return false, pErr } - if dErr := u.DialHTTP(); dErr != nil { + if dErr := u.DialHTTP(nil); dErr != nil { if xnet.IsNetworkOrHostDown(dErr) { return false, errNotConnected } diff --git a/pkg/net/url.go b/pkg/net/url.go index bd2e25343..f3853dcc1 100644 --- a/pkg/net/url.go +++ b/pkg/net/url.go @@ -86,14 +86,20 @@ func (u *URL) UnmarshalJSON(data []byte) (err error) { } // DialHTTP - dials the url to check the connection. -func (u URL) DialHTTP() error { - var client = &http.Client{ - Transport: &http.Transport{ +func (u URL) DialHTTP(transport *http.Transport) error { + if transport == nil { + transport = &http.Transport{ DialContext: (&net.Dialer{ Timeout: 2 * time.Second, }).DialContext, - }, + } + } + + var client = &http.Client{ + Transport: transport, + } + req, err := http.NewRequest("POST", u.String(), nil) if err != nil { return err