diff --git a/cmd/admin-handlers.go b/cmd/admin-handlers.go index bfaaa6c3d..9d9216e46 100644 --- a/cmd/admin-handlers.go +++ b/cmd/admin-handlers.go @@ -25,12 +25,14 @@ import ( "encoding/json" "errors" "fmt" + "hash/crc32" "io" "math/rand" "net/http" "net/url" "os" "path" + "regexp" "runtime" "sort" "strconv" @@ -1605,41 +1607,163 @@ func (a adminAPIHandlers) HealthInfoHandler(w http.ResponseWriter, r *http.Reque } defer nsLock.Unlock(lkctx.Cancel) - go func() { - defer close(healthInfoCh) + hostAnonymizer := createHostAnonymizer() + // anonAddr - Anonymizes hosts in given input string. + anonAddr := func(addr string) string { + newAddr, found := hostAnonymizer[addr] + if found { + return newAddr + } - partialWrite(healthInfo) // Write first message with only version populated + // If we reach here, it means that the given addr doesn't contain any of the hosts. + // Return it as is. Can happen for drive paths in non-distributed mode + return addr + } + // anonymizedAddr - Updated the addr of the node info with anonymized one + anonymizeAddr := func(info madmin.NodeInfo) { + info.SetAddr(anonAddr(info.GetAddr())) + } + + getAndWriteCPUs := func() { if query.Get("syscpu") == "true" { - healthInfo.Sys.CPUInfo = append(healthInfo.Sys.CPUInfo, madmin.GetCPUs(deadlinedCtx, r.Host)) - healthInfo.Sys.CPUInfo = append(healthInfo.Sys.CPUInfo, globalNotificationSys.GetCPUs(deadlinedCtx)...) + localCPUInfo := madmin.GetCPUs(deadlinedCtx, globalLocalNodeName) + anonymizeAddr(&localCPUInfo) + healthInfo.Sys.CPUInfo = append(healthInfo.Sys.CPUInfo, localCPUInfo) + + peerCPUInfo := globalNotificationSys.GetCPUs(deadlinedCtx) + for _, cpuInfo := range peerCPUInfo { + anonymizeAddr(&cpuInfo) + healthInfo.Sys.CPUInfo = append(healthInfo.Sys.CPUInfo, cpuInfo) + } + partialWrite(healthInfo) } + } + getAndWritePartitions := func() { if query.Get("sysdrivehw") == "true" { - healthInfo.Sys.Partitions = append(healthInfo.Sys.Partitions, madmin.GetPartitions(deadlinedCtx, r.Host)) - healthInfo.Sys.Partitions = append(healthInfo.Sys.Partitions, globalNotificationSys.GetPartitions(deadlinedCtx)...) + localPartitions := madmin.GetPartitions(deadlinedCtx, globalLocalNodeName) + anonymizeAddr(&localPartitions) + healthInfo.Sys.Partitions = append(healthInfo.Sys.Partitions, localPartitions) + + peerPartitions := globalNotificationSys.GetPartitions(deadlinedCtx) + for _, p := range peerPartitions { + anonymizeAddr(&p) + healthInfo.Sys.Partitions = append(healthInfo.Sys.Partitions, p) + } partialWrite(healthInfo) } + } + getAndWriteOSInfo := func() { if query.Get("sysosinfo") == "true" { - healthInfo.Sys.OSInfo = append(healthInfo.Sys.OSInfo, madmin.GetOSInfo(deadlinedCtx, r.Host)) - healthInfo.Sys.OSInfo = append(healthInfo.Sys.OSInfo, globalNotificationSys.GetOSInfo(deadlinedCtx)...) + localOSInfo := madmin.GetOSInfo(deadlinedCtx, globalLocalNodeName) + anonymizeAddr(&localOSInfo) + healthInfo.Sys.OSInfo = append(healthInfo.Sys.OSInfo, localOSInfo) + + peerOSInfos := globalNotificationSys.GetOSInfo(deadlinedCtx) + for _, o := range peerOSInfos { + anonymizeAddr(&o) + healthInfo.Sys.OSInfo = append(healthInfo.Sys.OSInfo, o) + } partialWrite(healthInfo) } + } + getAndWriteMemInfo := func() { if query.Get("sysmem") == "true" { - healthInfo.Sys.MemInfo = append(healthInfo.Sys.MemInfo, madmin.GetMemInfo(deadlinedCtx, r.Host)) - healthInfo.Sys.MemInfo = append(healthInfo.Sys.MemInfo, globalNotificationSys.GetMemInfo(deadlinedCtx)...) + localMemInfo := madmin.GetMemInfo(deadlinedCtx, globalLocalNodeName) + anonymizeAddr(&localMemInfo) + healthInfo.Sys.MemInfo = append(healthInfo.Sys.MemInfo, localMemInfo) + + peerMemInfos := globalNotificationSys.GetMemInfo(deadlinedCtx) + for _, m := range peerMemInfos { + anonymizeAddr(&m) + healthInfo.Sys.MemInfo = append(healthInfo.Sys.MemInfo, m) + } partialWrite(healthInfo) } + } + anonymizeCmdLine := func(cmdLine string) string { + if !globalIsDistErasure { + // FS mode - single server - hard code to `server1` + return strings.Replace(cmdLine, globalLocalNodeName, "server1", -1) + } + + // Server start command regex groups: + // 1 - minio server + // 2 - flags e.g. `--address :9000 --certs-dir /etc/minio/certs` + // 3 - pool args e.g. `https://node{01...16}.domain/data/disk{001...204} https://node{17...32}.domain/data/disk{001...204}` + re := regexp.MustCompile(`^(.*minio\s+server\s+)(--[^\s]+\s+[^\s]+\s+)*(.*)`) + + // stays unchanged in the anonymized version + cmdLineWithoutPools := re.ReplaceAllString(cmdLine, `$1$2`) + + // to be anonymized + poolsArgs := re.ReplaceAllString(cmdLine, `$3`) + var anonPools []string + + if !(strings.Contains(poolsArgs, "{") && strings.Contains(poolsArgs, "}")) { + // No ellipses pattern. Anonymize host name from every pool arg + pools := strings.Fields(poolsArgs) + anonPools = make([]string, len(pools)) + for _, arg := range pools { + anonPools = append(anonPools, anonAddr(arg)) + } + return cmdLineWithoutPools + strings.Join(anonPools, " ") + } + + // Ellipses pattern in pool args. Regex groups: + // 1 - server prefix + // 2 - number sequence for servers + // 3 - server suffix + // 4 - drive prefix (starting with /) + // 5 - number sequence for drives + // 6 - drive suffix + re = regexp.MustCompile(`([^\s^{]*)({\d+...\d+})?([^\s^{^/]*)(/[^\s^{]*)({\d+...\d+})?([^\s]*)`) + poolsMatches := re.FindAllStringSubmatch(poolsArgs, -1) + + anonPools = make([]string, len(poolsMatches)) + idxMap := map[int]string{ + 1: "spfx", + 3: "ssfx", + } + for pi, poolsMatch := range poolsMatches { + // Replace the server prefix/suffix with anonymized ones + for idx, lbl := range idxMap { + if len(poolsMatch[idx]) > 0 { + poolsMatch[idx] = fmt.Sprintf("%s%d", lbl, crc32.ChecksumIEEE([]byte(poolsMatch[idx]))) + } + } + + // Remove the original pools args present at index 0 + anonPools[pi] = strings.Join(poolsMatch[1:], "") + } + return cmdLineWithoutPools + strings.Join(anonPools, " ") + } + + anonymizeProcInfo := func(p *madmin.ProcInfo) { + p.CmdLine = anonymizeCmdLine(p.CmdLine) + anonymizeAddr(p) + } + + getAndWriteProcInfo := func() { if query.Get("sysprocess") == "true" { - healthInfo.Sys.ProcInfo = append(healthInfo.Sys.ProcInfo, madmin.GetProcInfo(deadlinedCtx, r.Host)) - healthInfo.Sys.ProcInfo = append(healthInfo.Sys.ProcInfo, globalNotificationSys.GetProcInfo(deadlinedCtx)...) + localProcInfo := madmin.GetProcInfo(deadlinedCtx, globalLocalNodeName) + anonymizeProcInfo(&localProcInfo) + healthInfo.Sys.ProcInfo = append(healthInfo.Sys.ProcInfo, localProcInfo) + peerProcInfos := globalNotificationSys.GetProcInfo(deadlinedCtx) + for _, p := range peerProcInfos { + anonymizeProcInfo(&p) + healthInfo.Sys.ProcInfo = append(healthInfo.Sys.ProcInfo, p) + } partialWrite(healthInfo) } + } + getAndWriteMinioConfig := func() { if query.Get("minioconfig") == "true" { config, err := readServerConfig(ctx, objectAPI) if err != nil { @@ -1653,47 +1777,101 @@ func (a adminAPIHandlers) HealthInfoHandler(w http.ResponseWriter, r *http.Reque } partialWrite(healthInfo) } + } + getAndWriteDrivePerfInfo := func() { if query.Get("perfdrive") == "true" { - healthInfo.Perf.Drives = append(healthInfo.Perf.Drives, getDrivePerfInfos(deadlinedCtx, r.Host)) + localDPI := getDrivePerfInfos(deadlinedCtx, globalLocalNodeName) + anonymizeAddr(&localDPI) + healthInfo.Perf.Drives = append(healthInfo.Perf.Drives, localDPI) partialWrite(healthInfo) perfCh := globalNotificationSys.GetDrivePerfInfos(deadlinedCtx) for perfInfo := range perfCh { + anonymizeAddr(&perfInfo) healthInfo.Perf.Drives = append(healthInfo.Perf.Drives, perfInfo) partialWrite(healthInfo) } - - partialWrite(healthInfo) } + } + anonymizeNetPerfInfo := func(npi *madmin.NetPerfInfo) { + anonymizeAddr(npi) + rps := npi.RemotePeers + for idx, peer := range rps { + anonymizeAddr(&peer) + rps[idx] = peer + } + npi.RemotePeers = rps + } + + getAndWriteNetPerfInfo := func() { if globalIsDistErasure && query.Get("perfnet") == "true" { - healthInfo.Perf.Net = append(healthInfo.Perf.Net, globalNotificationSys.GetNetPerfInfo(deadlinedCtx)) + localNPI := globalNotificationSys.GetNetPerfInfo(deadlinedCtx) + anonymizeNetPerfInfo(&localNPI) + healthInfo.Perf.Net = append(healthInfo.Perf.Net, localNPI) + partialWrite(healthInfo) netInfos := globalNotificationSys.DispatchNetPerfChan(deadlinedCtx) for netInfo := range netInfos { + anonymizeNetPerfInfo(&netInfo) healthInfo.Perf.Net = append(healthInfo.Perf.Net, netInfo) partialWrite(healthInfo) } - partialWrite(healthInfo) - healthInfo.Perf.NetParallel = globalNotificationSys.GetParallelNetPerfInfo(deadlinedCtx) + ppi := globalNotificationSys.GetParallelNetPerfInfo(deadlinedCtx) + anonymizeNetPerfInfo(&ppi) + healthInfo.Perf.NetParallel = ppi partialWrite(healthInfo) } + } + + anonymizeNetwork := func(network map[string]string) map[string]string { + anonNetwork := map[string]string{} + for endpoint, status := range network { + anonEndpoint := anonAddr(endpoint) + anonNetwork[anonEndpoint] = status + } + return anonNetwork + + } + + anonymizeDrives := func(drives []madmin.Disk) []madmin.Disk { + anonDrives := []madmin.Disk{} + for _, drive := range drives { + drive.Endpoint = anonAddr(drive.Endpoint) + anonDrives = append(anonDrives, drive) + } + return anonDrives + } + + go func() { + defer close(healthInfoCh) + + partialWrite(healthInfo) // Write first message with only version populated + getAndWriteCPUs() + getAndWritePartitions() + getAndWriteOSInfo() + getAndWriteMemInfo() + getAndWriteProcInfo() + getAndWriteMinioConfig() + getAndWriteDrivePerfInfo() + getAndWriteNetPerfInfo() if query.Get("minioinfo") == "true" { infoMessage := getServerInfo(ctx, r) servers := []madmin.ServerInfo{} for _, server := range infoMessage.Servers { + anonEndpoint := anonAddr(server.Endpoint) servers = append(servers, madmin.ServerInfo{ State: server.State, - Endpoint: server.Endpoint, + Endpoint: anonEndpoint, Uptime: server.Uptime, Version: server.Version, CommitID: server.CommitID, - Network: server.Network, - Drives: server.Disks, + Network: anonymizeNetwork(server.Network), + Drives: anonymizeDrives(server.Disks), PoolNumber: server.PoolNumber, MemStats: madmin.MemStats{ Alloc: server.MemStats.Alloc, @@ -2099,3 +2277,85 @@ func (a adminAPIHandlers) InspectDataHandler(w http.ResponseWriter, r *http.Requ }) logger.LogIf(ctx, err) } + +func createHostAnonymizerForFSMode() map[string]string { + hostAnonymizer := map[string]string{ + globalLocalNodeName: "server1", + } + + apiEndpoints := getAPIEndpoints() + for _, ep := range apiEndpoints { + if len(ep) > 0 { + if url, err := xnet.ParseHTTPURL(ep); err == nil { + // In FS mode the drive names don't include the host. + // So mapping just the host should be sufficient. + hostAnonymizer[url.Host] = "server1" + } + } + } + return hostAnonymizer +} + +// anonymizeHost - Add entries related to given endpoint in the host anonymizer map +// The health report data can contain the hostname in various forms e.g. host, host:port, +// host:port/drivepath, full url (http://host:port/drivepath) +// The anonymizer map will have mappings for all these varients for efficiently replacing +// any of these strings to the anonymized versions at the time of health report generation. +func anonymizeHost(hostAnonymizer map[string]string, endpoint Endpoint, poolNum int, srvrNum int) { + if len(endpoint.Host) == 0 { + return + } + + currentURL := endpoint.String() + + // mapIfNotPresent - Maps the given key to the value only if the key is not present in the map + mapIfNotPresent := func(m map[string]string, key string, val string) { + _, found := m[key] + if !found { + m[key] = val + } + } + + _, found := hostAnonymizer[currentURL] + if !found { + // In distributed setup, anonymized addr = 'poolNum.serverNum' + newHost := fmt.Sprintf("pool%d.server%d", poolNum, srvrNum) + + // Hostname + mapIfNotPresent(hostAnonymizer, endpoint.Hostname(), newHost) + + newHostPort := newHost + if len(endpoint.Port()) > 0 { + // Host + port + newHostPort = newHost + ":" + endpoint.Port() + mapIfNotPresent(hostAnonymizer, endpoint.Host, newHostPort) + } + + newHostPortPath := newHostPort + if len(endpoint.Path) > 0 { + // Host + port + path + currentHostPortPath := endpoint.Host + endpoint.Path + newHostPortPath = newHostPort + endpoint.Path + mapIfNotPresent(hostAnonymizer, currentHostPortPath, newHostPortPath) + } + + // Full url + hostAnonymizer[currentURL] = endpoint.Scheme + "://" + newHostPortPath + } +} + +// createHostAnonymizer - Creats a map of various strings to corresponding anonymized names +func createHostAnonymizer() map[string]string { + if !globalIsDistErasure { + return createHostAnonymizerForFSMode() + } + + hostAnonymizer := map[string]string{} + + for poolIdx, pool := range globalEndpoints { + for srvrIdx, endpoint := range pool.Endpoints { + anonymizeHost(hostAnonymizer, endpoint, poolIdx+1, srvrIdx+1) + } + } + return hostAnonymizer +} diff --git a/go.mod b/go.mod index 9d4921962..8dba41f68 100644 --- a/go.mod +++ b/go.mod @@ -89,5 +89,3 @@ require ( google.golang.org/api v0.31.0 gopkg.in/yaml.v2 v2.4.0 ) - -replace google.golang.org/grpc => google.golang.org/grpc v1.29.1 diff --git a/go.sum b/go.sum index a01e4a367..9dce59930 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,5 @@ bazil.org/fuse v0.0.0-20180421153158-65cc252bf669/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.39.0/go.mod h1:rVLT6fkc8chs9sfPtFc1SBH6em7n+ZoXaG+87tDISts= @@ -227,6 +228,7 @@ github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/cockroach-go/v2 v2.0.3 h1:ZA346ACHIZctef6trOTwBAEvPVm1k0uLm/bb2Atc+S8= github.com/cockroachdb/cockroach-go/v2 v2.0.3/go.mod h1:hAuDgiVgDVkfirP9JnhXEfcXEPRKBpYdGz+l7mvYSzw= @@ -318,7 +320,11 @@ github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkg github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= @@ -526,6 +532,7 @@ github.com/goccy/go-json v0.4.8/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGF github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.0.0-20190320160742-5135e617513b/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= @@ -934,6 +941,7 @@ github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magefile/mage v1.10.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -1543,6 +1551,7 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -1648,6 +1657,7 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180816055513-1c9583448a9c/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180926160741-c2ed4eda69e7/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1755,11 +1765,13 @@ golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiT golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190221204921-83362c3779f5/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -1930,8 +1942,29 @@ google.golang.org/genproto v0.0.0-20200831141814-d751682dd103/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200901141002-b3bf27a9dbd1/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a h1:pOwg4OoaRYScjmR4LlLgdtnyoHYTSAVhhqe5uPdpII8= google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/grpc v1.29.1 h1:EC2SB8S04d2r73uptxphDSUG+kTKVgjRPF+N3xpxRB4= +google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.37.0 h1:uSZWeQJX5j11bIQ4AJoj+McDBo29cY1MCoC1wO3ts+c= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -2005,6 +2038,7 @@ gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/internal/config/config.go b/internal/config/config.go index 50a60d10c..e732c5190 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -374,9 +374,11 @@ func (c Config) RedactSensitiveInfo() Config { } } } - nc[configName] = configVals } + // Remove the server credentials altogether + nc.DelKVS(CredentialsSubSys) + return nc }