Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package minio-client for openSUSE:Factory checked in at 2025-07-20 15:29:07 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/minio-client (Old) and /work/SRC/openSUSE:Factory/.minio-client.new.8875 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "minio-client" Sun Jul 20 15:29:07 2025 rev:114 rq:1294516 version:20250716T153503Z Changes: -------- --- /work/SRC/openSUSE:Factory/minio-client/minio-client.changes 2025-05-26 18:38:24.338653992 +0200 +++ /work/SRC/openSUSE:Factory/.minio-client.new.8875/minio-client.changes 2025-07-20 15:30:15.179001598 +0200 @@ -1,0 +2,15 @@ +Fri Jul 18 23:58:42 UTC 2025 - Marcus Rueckert <mrueck...@suse.de> + +- Update to version 20250716T153503Z: + * fix: redact sse key in debug logs (#5231) + * mv:support set tag and checksum (#5133) + * ping: support ping a specified node and remove duplicate port printing (#5132) + * feat: add `--storage-class` option to `mc put` subcommand (#5228) + * mirror and cp support set the maximum number of threads (#5220) + * Some paths like url2Stat will send resource with backslashes on windows (#5226) + * Include ARN in "replicate list" output (#5215) + * Update build version (#5218) + * fix: add checks for nil HTTP in admin-trace matches func (#5216) + * remove fips 'mc' container Dockerfile + +------------------------------------------------------------------- Old: ---- minio-client-20250521T015954Z.obscpio vendor.tar.gz New: ---- minio-client-20250716T153503Z.obscpio vendor.tar.zst ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ minio-client.spec ++++++ --- /var/tmp/diff_new_pack.1xfSYP/_old 2025-07-20 15:30:16.319048774 +0200 +++ /var/tmp/diff_new_pack.1xfSYP/_new 2025-07-20 15:30:16.319048774 +0200 @@ -17,15 +17,16 @@ Name: minio-client -Version: 20250521T015954Z +Version: 20250716T153503Z Release: 0 Summary: Client for MinIO License: AGPL-3.0-only URL: https://github.com/minio/mc -Source: %{name}-%{version}.tar.gz -Source1: vendor.tar.gz +Source: %{name}-%{version}.tar.zst +Source1: vendor.tar.zst Source2: README.SUSE BuildRequires: go1.23 +BuildRequires: zstd # obsolete some other package we had in the past Provides: minio-mc = %{version}-%{release} Obsoletes: minio-mc < %{version}-%{release} ++++++ _service ++++++ --- /var/tmp/diff_new_pack.1xfSYP/_old 2025-07-20 15:30:16.363050595 +0200 +++ /var/tmp/diff_new_pack.1xfSYP/_new 2025-07-20 15:30:16.367050761 +0200 @@ -5,7 +5,7 @@ <param name="exclude">.git</param> <param name="changesgenerate">enable</param> <param name="versionformat">@PARENT_TAG@</param> - <param name="revision">RELEASE.2025-05-21T01-59-54Z</param> + <param name="revision">RELEASE.2025-07-16T15-35-03Z</param> <param name="match-tag">RELEASE.*</param> <param name="versionrewrite-pattern">RELEASE\.(.*)-(.*)-(.*)-(.*)-(.*)</param> <param name="versionrewrite-replacement">\1\2\3\4\5</param> @@ -14,13 +14,14 @@ <service name="set_version" mode="manual"> </service> <service name="go_modules" mode="manual"> + <param name="compression">zst</param> </service> <!-- services below are running at buildtime --> <service name="tar" mode="buildtime"> </service> <service name="recompress" mode="buildtime"> <param name="file">*.tar</param> - <param name="compression">gz</param> + <param name="compression">zst</param> </service> </services> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.1xfSYP/_old 2025-07-20 15:30:16.383051423 +0200 +++ /var/tmp/diff_new_pack.1xfSYP/_new 2025-07-20 15:30:16.387051588 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/minio/mc</param> - <param name="changesrevision">f71ad84bcf0fd4369691952af5d925347837dcec</param></service></servicedata> + <param name="changesrevision">2676e50bc1b9e71d4afe2549d34b8b0245d7a370</param></service></servicedata> (No newline at EOF) ++++++ minio-client-20250521T015954Z.obscpio -> minio-client-20250716T153503Z.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minio-client-20250521T015954Z/Dockerfile.release.fips new/minio-client-20250716T153503Z/Dockerfile.release.fips --- old/minio-client-20250521T015954Z/Dockerfile.release.fips 2025-05-21 03:59:54.000000000 +0200 +++ new/minio-client-20250716T153503Z/Dockerfile.release.fips 1970-01-01 01:00:00.000000000 +0100 @@ -1,24 +0,0 @@ -FROM registry.access.redhat.com/ubi9/ubi-minimal:latest AS build - -RUN microdnf update --nodocs --assumeyes && microdnf install ca-certificates --nodocs --assumeyes - -FROM registry.access.redhat.com/ubi9/ubi-micro:latest - -ARG TARGETARCH -ARG RELEASE - -LABEL maintainer="MinIO Inc <d...@min.io>" - -# On RHEL the certificate bundle is located at: -# - /etc/pki/tls/certs/ca-bundle.crt (RHEL 6) -# - /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem (RHEL 7) -COPY --from=build /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem /etc/pki/ca-trust/extracted/pem/ - -COPY CREDITS /licenses/CREDITS -COPY LICENSE /licenses/LICENSE - -ADD https://dl.minio.io/client/mc/release/linux-${TARGETARCH}/archive/mc.${RELEASE}.fips /usr/bin/mc - -RUN chmod +x /usr/bin/mc - -ENTRYPOINT ["mc"] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minio-client-20250521T015954Z/cmd/admin-trace.go new/minio-client-20250716T153503Z/cmd/admin-trace.go --- old/minio-client-20250521T015954Z/cmd/admin-trace.go 2025-05-21 03:59:54.000000000 +0200 +++ new/minio-client-20250716T153503Z/cmd/admin-trace.go 2025-07-16 17:35:03.000000000 +0200 @@ -411,12 +411,10 @@ } } - if opts.requestSize > 0 && traceInfo.Trace.HTTP.CallStats.InputBytes < int(opts.requestSize) { - return false - } - - if opts.responseSize > 0 && traceInfo.Trace.HTTP.CallStats.OutputBytes < int(opts.responseSize) { - return false + if traceInfo.Trace.HTTP != nil { + if (opts.requestSize > 0 && traceInfo.Trace.HTTP.CallStats.InputBytes < int(opts.requestSize)) || (opts.responseSize > 0 && traceInfo.Trace.HTTP.CallStats.OutputBytes < int(opts.responseSize)) { + return false + } } return true diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minio-client-20250521T015954Z/cmd/client-s3-trace_v4.go new/minio-client-20250716T153503Z/cmd/client-s3-trace_v4.go --- old/minio-client-20250521T015954Z/cmd/client-s3-trace_v4.go 2025-05-21 03:59:54.000000000 +0200 +++ new/minio-client-20250716T153503Z/cmd/client-s3-trace_v4.go 2025-07-16 17:35:03.000000000 +0200 @@ -38,6 +38,7 @@ // Request - Trace HTTP Request func (t traceV4) Request(req *http.Request) (err error) { origAuth := req.Header.Get("Authorization") + sseKey := req.Header.Get("X-Amz-Server-Side-Encryption-Customer-Key") printTrace := func() error { reqTrace, rerr := httputil.DumpRequestOut(req, false) // Only display header @@ -47,6 +48,11 @@ return rerr } + if strings.TrimSpace(sseKey) != "" { + // Stripe out SSE-C key from: X-Amz-Server-Side-Encryption-Customer-Key=<key> + req.Header.Set("X-Amz-Server-Side-Encryption-Customer-Key", "**REDACTED**") + } + if strings.TrimSpace(origAuth) != "" { // Authorization (S3 v4 signature) Format: // Authorization: AWS4-HMAC-SHA256 Credential=AKIAJNACEGBGMXBHLEZA/20150524/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=bbfaa693c626021bcb5f911cd898a1a30206c1fad6bad1e0eb89e282173bd24c diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minio-client-20250521T015954Z/cmd/cp-main.go new/minio-client-20250716T153503Z/cmd/cp-main.go --- old/minio-client-20250521T015954Z/cmd/cp-main.go 2025-05-21 03:59:54.000000000 +0200 +++ new/minio-client-20250716T153503Z/cmd/cp-main.go 2025-07-16 17:35:03.000000000 +0200 @@ -97,6 +97,10 @@ Name: "zip", Usage: "Extract from remote zip file (MinIO server source only)", }, + cli.IntFlag{ + Name: "max-workers", + Usage: "maximum number of concurrent copies (default: autodetect)", + }, checksumFlag, } ) @@ -366,7 +370,7 @@ quitCh := make(chan struct{}) statusCh := make(chan URLs) - parallel := newParallelManager(statusCh) + parallel := newParallelManager(statusCh, cli.Int("max-workers")) go func() { gracefulStop := func() { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minio-client-20250521T015954Z/cmd/encryption-methods.go new/minio-client-20250716T153503Z/cmd/encryption-methods.go --- old/minio-client-20250521T015954Z/cmd/encryption-methods.go 2025-05-21 03:59:54.000000000 +0200 +++ new/minio-client-20250716T153503Z/cmd/encryption-methods.go 2025-07-16 17:35:03.000000000 +0200 @@ -22,6 +22,7 @@ "encoding/base64" "encoding/hex" "fmt" + "path/filepath" "sort" "strings" @@ -60,6 +61,7 @@ // get SSE Key if object prefix matches with given resource. func getSSE(resource string, encKeys []prefixSSEPair) encrypt.ServerSide { + resource = filepath.ToSlash(resource) for _, k := range encKeys { if strings.HasPrefix(resource, k.Prefix) { return k.SSE diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minio-client-20250521T015954Z/cmd/mirror-main.go new/minio-client-20250716T153503Z/cmd/mirror-main.go --- old/minio-client-20250521T015954Z/cmd/mirror-main.go 2025-05-21 03:59:54.000000000 +0200 +++ new/minio-client-20250716T153503Z/cmd/mirror-main.go 2025-07-16 17:35:03.000000000 +0200 @@ -144,6 +144,10 @@ Name: "skip-errors", Usage: "skip any errors when mirroring", }, + cli.IntFlag{ + Name: "max-workers", + Usage: "maximum number of concurrent copies (default: autodetect)", + }, checksumFlag, } ) @@ -907,7 +911,7 @@ watcher: NewWatcher(UTCNow()), } - mj.parallel = newParallelManager(mj.statusCh) + mj.parallel = newParallelManager(mj.statusCh, opts.maxWorkers) // we'll define the status to use here, // do we want the quiet status? or the progressbar @@ -1025,6 +1029,7 @@ userMetadata: userMetadata, encKeyDB: encKeyDB, activeActive: isActiveActive, + maxWorkers: cli.Int("max-workers"), } // If we are not using active/active and we are not removing diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minio-client-20250521T015954Z/cmd/mirror-url.go new/minio-client-20250716T153503Z/cmd/mirror-url.go --- old/minio-client-20250521T015954Z/cmd/mirror-url.go 2025-05-21 03:59:54.000000000 +0200 +++ new/minio-client-20250716T153503Z/cmd/mirror-url.go 2025-07-16 17:35:03.000000000 +0200 @@ -278,6 +278,7 @@ userMetadata map[string]string checksum minio.ChecksumType sourceListingOnly bool + maxWorkers int } // Prepares urls that need to be copied or removed based on requested options. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minio-client-20250521T015954Z/cmd/mv-main.go new/minio-client-20250716T153503Z/cmd/mv-main.go --- old/minio-client-20250521T015954Z/cmd/mv-main.go 2025-05-21 03:59:54.000000000 +0200 +++ new/minio-client-20250716T153503Z/cmd/mv-main.go 2025-07-16 17:35:03.000000000 +0200 @@ -59,6 +59,11 @@ Name: "disable-multipart", Usage: "disable multipart upload feature", }, + cli.StringFlag{ + Name: "tags", + Usage: "apply one or more tags to the uploaded objects", + }, + checksumFlag, } ) @@ -112,23 +117,29 @@ 09. Move a list of objects from local file system to MinIO cloud storage with specified metadata, separated by ";" {{.Prompt}} {{.HelpName}} --attr "key1=value1;key2=value2" Music/*.mp4 play/mybucket/ - 10. Move a folder recursively from MinIO cloud storage to Amazon S3 cloud storage with Cache-Control and custom metadata, separated by ";". + 10. Move a list of objects from local file system to MinIO cloud storage and set tags to the uploaded objects + {{.Prompt}} {{.HelpName}} --tag "key1=value1" Music/*.mp4 play/mybucket/ + + 11. Move a folder recursively from MinIO cloud storage to Amazon S3 cloud storage with Cache-Control and custom metadata, separated by ";". {{.Prompt}} {{.HelpName}} --attr "Cache-Control=max-age=90000,min-fresh=9000;key1=value1;key2=value2" --recursive play/mybucket/myfolder/ s3/mybucket/ - 11. Move a text file to an object storage and assign REDUCED_REDUNDANCY storage-class to the uploaded object. + 12. Move a text file to an object storage and assign REDUCED_REDUNDANCY storage-class to the uploaded object. {{.Prompt}} {{.HelpName}} --storage-class REDUCED_REDUNDANCY myobject.txt play/mybucket - 12. Move a text file to an object storage and preserve the file system attribute as metadata. + 13. Move a text file to an object storage and preserve the file system attribute as metadata. {{.Prompt}} {{.HelpName}} -a myobject.txt play/mybucket - 13. Move a text file to an object storage and disable multipart upload feature. + 14. Move a text file to an object storage and disable multipart upload feature. {{.Prompt}} {{.HelpName}} --disable-multipart myobject.txt play/mybucket - 14. Move a folder using client provided encryption keys from Amazon S3 to MinIO cloud storage. + 15. Move a folder using client provided encryption keys from Amazon S3 to MinIO cloud storage. {{.Prompt}} {{.HelpName}} --r --enc-c "s3/documents/=MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MBB" --enc-c "myminio/documents/=MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDA" s3/documents/ myminio/documents/ - 15. Move a folder using specific server managed encryption keys from Amazon S3 to MinIO cloud storage. + 16. Move a folder using specific server managed encryption keys from Amazon S3 to MinIO cloud storage. {{.Prompt}} {{.HelpName}} --r --enc-s3 "s3/documents" --enc-s3 "myminio/documents" s3/documents/ myminio/documents/ + + 17. Add SHA256 checksum to move a text file to MinIO cloud storage. + {{.Prompt}} {{.HelpName}} --checksum SHA256 myobject.txt play/mybucket `, } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minio-client-20250521T015954Z/cmd/parallel-manager.go new/minio-client-20250716T153503Z/cmd/parallel-manager.go --- old/minio-client-20250521T015954Z/cmd/parallel-manager.go 2025-05-21 03:59:54.000000000 +0200 +++ new/minio-client-20250716T153503Z/cmd/parallel-manager.go 2025-07-16 17:35:03.000000000 +0200 @@ -76,11 +76,18 @@ // The maximum memory to use maxMem uint64 + + // The maximum workers will be created + maxWorkers int } // addWorker creates a new worker to process tasks func (p *ParallelManager) addWorker() { - if atomic.LoadUint32(&p.workersNum) >= maxParallelWorkers { + maxWorkers := maxParallelWorkers + if p.maxWorkers > 0 { + maxWorkers = p.maxWorkers + } + if int(atomic.LoadUint32(&p.workersNum)) >= maxWorkers { // Number of maximum workers is reached, no need to // to create a new one. return @@ -266,7 +273,7 @@ } // newParallelManager starts new workers waiting for executing tasks -func newParallelManager(resultCh chan URLs) *ParallelManager { +func newParallelManager(resultCh chan URLs, maxWorkers int) *ParallelManager { p := &ParallelManager{ wg: &sync.WaitGroup{}, workersNum: 0, @@ -274,6 +281,7 @@ queueCh: make(chan task), resultCh: resultCh, maxMem: availableMemory(), + maxWorkers: maxWorkers, } // Start with runtime.NumCPU(). diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minio-client-20250521T015954Z/cmd/ping.go new/minio-client-20250716T153503Z/cmd/ping.go --- old/minio-client-20250521T015954Z/cmd/ping.go 2025-05-21 03:59:54.000000000 +0200 +++ new/minio-client-20250716T153503Z/cmd/ping.go 2025-07-16 17:35:03.000000000 +0200 @@ -58,6 +58,10 @@ Name: "distributed, a", Usage: "ping all the servers in the cluster, use it when you have direct access to nodes/pods", }, + cli.StringFlag{ + Name: "node", + Usage: "ping the specified node", + }, } // return latency and liveness probe. @@ -116,11 +120,11 @@ } // PingDist is the template for ping result in distributed mode -const PingDist = `{{$x := .Counter}}{{range .EndPointsStats}}{{if eq "0 " .CountErr}}{{colorWhite $x}}{{colorWhite ": "}}{{colorWhite .Endpoint.Scheme}}{{colorWhite "://"}}{{colorWhite .Endpoint.Host}}{{if ne "" .Endpoint.Port}}{{colorWhite ":"}}{{colorWhite .Endpoint.Port}}{{end}}{{"\t"}}{{ colorWhite "min="}}{{colorWhite .Min}}{{"\t"}}{{colorWhite "max="}}{{colorWhite .Max}}{{"\t"}}{{colorWhite "average="}}{{colorWhite .Average}}{{"\t"}}{{colorWhite "errors="}}{{colorWhite .CountErr}}{{" "}}{{colorWhite "roundtrip="}}{{colorWhite .Roundtrip}}{{else}}{{colorRed $x}}{{colorRed ": "}}{{colorRed .Endpoint.Scheme}}{{colorRed "://"}}{{colorRed .Endpoint.Host}}{{if ne "" .Endpoint.Port}}{{colorRed ":"}}{{colorRed .Endpoint.Port}}{{end}}{{"\t"}}{{ colorRed "min="}}{{colorRed .Min}}{{"\t"}}{{colorRed "max="}}{{colorRed .Max}}{{"\t"}}{{colorRed "average="}}{{colorRed .Average}}{{"\t"}}{{colorRed "errors="}}{{colorRed .CountErr}}{{" "}}{{colorRed "roundtrip="}}{{colorRed .Roundtrip}}{{end}} +const PingDist = `{{$x := .Counter}}{{range .EndPointsStats}}{{if eq "0 " .CountErr}}{{colorWhite $x}}{{colorWhite ": "}}{{colorWhite .Endpoint.Scheme}}{{colorWhite "://"}}{{colorWhite .Endpoint.Host}}{{"\t"}}{{ colorWhite "min="}}{{colorWhite .Min}}{{"\t"}}{{colorWhite "max="}}{{colorWhite .Max}}{{"\t"}}{{colorWhite "average="}}{{colorWhite .Average}}{{"\t"}}{{colorWhite "errors="}}{{colorWhite .CountErr}}{{" "}}{{colorWhite "roundtrip="}}{{colorWhite .Roundtrip}}{{else}}{{colorRed $x}}{{colorRed ": "}}{{colorRed .Endpoint.Scheme}}{{colorRed "://"}}{{colorRed .Endpoint.Host}}{{if ne "" .Endpoint.Port}}{{colorRed ":"}}{{colorRed .Endpoint.Port}}{{end}}{{"\t"}}{{ colorRed "min="}}{{colorRed .Min}}{{"\t"}}{{colorRed "max="}}{{colorRed .Max}}{{"\t"}}{{colorRed "average="}}{{colorRed .Average}}{{"\t"}}{{colorRed "errors="}}{{colorRed .CountErr}}{{" "}}{{colorRed "roundtrip="}}{{colorRed .Roundtrip}}{{end}} {{end}}` // Ping is the template for ping result -const Ping = `{{$x := .Counter}}{{range .EndPointsStats}}{{if eq "0 " .CountErr}}{{colorWhite $x}}{{colorWhite ": "}}{{colorWhite .Endpoint.Scheme}}{{colorWhite "://"}}{{colorWhite .Endpoint.Host}}{{if ne "" .Endpoint.Port}}{{colorWhite ":"}}{{colorWhite .Endpoint.Port}}{{end}}{{"\t"}}{{ colorWhite "min="}}{{colorWhite .Min}}{{"\t"}}{{colorWhite "max="}}{{colorWhite .Max}}{{"\t"}}{{colorWhite "average="}}{{colorWhite .Average}}{{"\t"}}{{colorWhite "errors="}}{{colorWhite .CountErr}}{{" "}}{{colorWhite "roundtrip="}}{{colorWhite .Roundtrip}}{{else}}{{colorRed $x}}{{colorRed ": "}}{{colorRed .Endpoint.Scheme}}{{colorRed "://"}}{{colorRed .Endpoint.Host}}{{if ne "" .Endpoint.Port}}{{colorRed ":"}}{{colorRed .Endpoint.Port}}{{end}}{{"\t"}}{{ colorRed "min="}}{{colorRed .Min}}{{"\t"}}{{colorRed "max="}}{{colorRed .Max}}{{"\t"}}{{colorRed "average="}}{{colorRed .Average}}{{"\t"}}{{colorRed "errors="}}{{colorRed .CountErr}}{{" "}}{{colorRed "roundtrip="}}{{colorRed .Roundtrip}}{{end}}{{en d}}` +const Ping = `{{$x := .Counter}}{{range .EndPointsStats}}{{if eq "0 " .CountErr}}{{colorWhite $x}}{{colorWhite ": "}}{{colorWhite .Endpoint.Scheme}}{{colorWhite "://"}}{{colorWhite .Endpoint.Host}}{{"\t"}}{{ colorWhite "min="}}{{colorWhite .Min}}{{"\t"}}{{colorWhite "max="}}{{colorWhite .Max}}{{"\t"}}{{colorWhite "average="}}{{colorWhite .Average}}{{"\t"}}{{colorWhite "errors="}}{{colorWhite .CountErr}}{{" "}}{{colorWhite "roundtrip="}}{{colorWhite .Roundtrip}}{{else}}{{colorRed $x}}{{colorRed ": "}}{{colorRed .Endpoint.Scheme}}{{colorRed "://"}}{{colorRed .Endpoint.Host}}{{if ne "" .Endpoint.Port}}{{colorRed ":"}}{{colorRed .Endpoint.Port}}{{end}}{{"\t"}}{{ colorRed "min="}}{{colorRed .Min}}{{"\t"}}{{colorRed "max="}}{{colorRed .Max}}{{"\t"}}{{colorRed "average="}}{{colorRed .Average}}{{"\t"}}{{colorRed "errors="}}{{colorRed .CountErr}}{{" "}}{{colorRed "roundtrip="}}{{colorRed .Roundtrip}}{{end}}{{end}}` // PingTemplateDist - captures ping template var PingTemplateDist = template.Must(template.New("ping-list").Funcs(colorMap).Parse(PingDist)) @@ -201,10 +205,28 @@ } } +func filterAdminInfo(admClnt *madmin.AdminClient, nodeName string) (madmin.InfoMessage, error) { + admInfo, e := fetchAdminInfo(admClnt) + if e != nil { + return madmin.InfoMessage{}, e + } + if len(admInfo.Servers) <= 0 || nodeName == "" { + return admInfo, nil + } + for _, server := range admInfo.Servers { + if server.Endpoint == nodeName { + admInfo.Servers = []madmin.ServerProperties{server} + return admInfo, nil + } + } + fatalIf(errInvalidArgument().Trace(), "Node "+nodeName+" not exist") + return madmin.InfoMessage{}, e +} + func ping(ctx context.Context, cliCtx *cli.Context, anonClient *madmin.AnonymousClient, admInfo madmin.InfoMessage, endPointMap map[string]serverStats, index int) { var endPointStats []EndPointStats var servers []madmin.ServerProperties - if cliCtx.Bool("distributed") { + if cliCtx.Bool("distributed") || cliCtx.IsSet("node") { servers = admInfo.Servers } allOK := true @@ -356,6 +378,11 @@ admInfo, e = fetchAdminInfo(admClient) fatalIf(probe.NewError(e).Trace(aliasedURL), "Unable to get server info") } + if cliCtx.IsSet("node") { + var e error + admInfo, e = filterAdminInfo(admClient, cliCtx.String("node")) + fatalIf(probe.NewError(e).Trace(aliasedURL), "Unable to get server info") + } // map to contain server stats for all the servers serverMap := make(map[string]serverStats) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minio-client-20250521T015954Z/cmd/put-main.go new/minio-client-20250716T153503Z/cmd/put-main.go --- old/minio-client-20250521T015954Z/cmd/put-main.go 2025-05-21 03:59:54.000000000 +0200 +++ new/minio-client-20250716T153503Z/cmd/put-main.go 2025-07-16 17:35:03.000000000 +0200 @@ -51,6 +51,10 @@ Name: "disable-multipart", Usage: "disable multipart upload feature", }, + cli.StringFlag{ + Name: "storage-class, sc", + Usage: "set storage class for new object on target", + }, } ) @@ -90,7 +94,10 @@ {{.Prompt}} {{.HelpName}} --enc-c "play/mybucket/object=MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDA" path-to/object play/mybucket/object 5. Put an object to MinIO storage using sse-kms encryption - {{.Prompt}} {{.HelpName}} --enc-kms path-to/object play/mybucket/object + {{.Prompt}} {{.HelpName}} --enc-kms path-to/object play/mybucket/object + + 6. Put an object to MinIO storage and assign REDUCED_REDUNDANCY storage-class to the uploaded object. + {{.Prompt}} {{.HelpName}} --storage-class REDUCED_REDUNDANCY myobject.txt play/mybucket `, } @@ -133,6 +140,10 @@ if len(args) < 2 { fatalIf(errInvalidArgument().Trace(args...), "Invalid number of arguments.") } + + // Check and handle storage class if passed in command line args + storageClass := cliCtx.String("sc") + // get source and target sourceURLs := args[:len(args)-1] targetURL := args[len(args)-1] @@ -162,6 +173,9 @@ putURLsCh <- putURLs break } + if storageClass != "" { + putURLs.TargetContent.StorageClass = storageClass + } putURLs.checksum = checksum putURLs.MD5 = md5 totalBytes += putURLs.SourceContent.Size diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minio-client-20250521T015954Z/cmd/replicate-list.go new/minio-client-20250716T153503Z/cmd/replicate-list.go --- old/minio-client-20250521T015954Z/cmd/replicate-list.go 2025-05-21 03:59:54.000000000 +0200 +++ new/minio-client-20250716T153503Z/cmd/replicate-list.go 2025-07-16 17:35:03.000000000 +0200 @@ -111,6 +111,7 @@ sb.WriteString(fmt.Sprintf(" Rule ID: %s\n", console.Colorize("Val", r.ID))) sb.WriteString(fmt.Sprintf(" Priority: %s\n", console.Colorize("Val", r.Priority))) + sb.WriteString(fmt.Sprintf(" ARN: %s\n", console.Colorize("Val", r.Destination.Bucket))) if r.Filter.And.Prefix != "" { sb.WriteString(fmt.Sprintf(" Prefix: %s\n", console.Colorize("Val", r.Filter.And.Prefix))) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/minio-client-20250521T015954Z/go.mod new/minio-client-20250716T153503Z/go.mod --- old/minio-client-20250521T015954Z/go.mod 2025-05-21 03:59:54.000000000 +0200 +++ new/minio-client-20250716T153503Z/go.mod 2025-07-16 17:35:03.000000000 +0200 @@ -2,7 +2,7 @@ go 1.23.0 -toolchain go1.23.6 +toolchain go1.23.10 require ( github.com/charmbracelet/bubbles v0.20.0 ++++++ minio-client.obsinfo ++++++ --- /var/tmp/diff_new_pack.1xfSYP/_old 2025-07-20 15:30:16.659062845 +0200 +++ /var/tmp/diff_new_pack.1xfSYP/_new 2025-07-20 15:30:16.659062845 +0200 @@ -1,5 +1,5 @@ name: minio-client -version: 20250521T015954Z -mtime: 1747792794 -commit: f71ad84bcf0fd4369691952af5d925347837dcec +version: 20250716T153503Z +mtime: 1752680103 +commit: 2676e50bc1b9e71d4afe2549d34b8b0245d7a370