| 
									
										
										
										
											2021-04-19 03:41:13 +08:00
										 |  |  | // Copyright (c) 2015-2021 MinIO, Inc.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // This file is part of MinIO Object Storage stack
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // This program is free software: you can redistribute it and/or modify
 | 
					
						
							|  |  |  | // it under the terms of the GNU Affero General Public License as published by
 | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or
 | 
					
						
							|  |  |  | // (at your option) any later version.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // This program is distributed in the hope that it will be useful
 | 
					
						
							|  |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					
						
							|  |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					
						
							|  |  |  | // GNU Affero General Public License for more details.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // You should have received a copy of the GNU Affero General Public License
 | 
					
						
							|  |  |  | // along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | package cmd | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2024-01-31 04:49:02 +08:00
										 |  |  | 	"bytes" | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | 	"context" | 
					
						
							|  |  |  | 	"encoding/gob" | 
					
						
							| 
									
										
										
										
											2024-01-20 10:27:58 +08:00
										 |  |  | 	"encoding/hex" | 
					
						
							| 
									
										
										
										
											2024-01-20 06:22:36 +08:00
										 |  |  | 	"encoding/json" | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | 	"errors" | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2019-08-19 10:56:32 +08:00
										 |  |  | 	"io" | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | 	"net/http" | 
					
						
							| 
									
										
										
										
											2024-01-20 10:27:58 +08:00
										 |  |  | 	"net/url" | 
					
						
							| 
									
										
										
										
											2019-06-07 08:46:22 +08:00
										 |  |  | 	"strconv" | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | 	"strings" | 
					
						
							| 
									
										
										
										
											2024-02-07 00:57:30 +08:00
										 |  |  | 	"sync" | 
					
						
							| 
									
										
										
										
											2021-07-28 03:55:56 +08:00
										 |  |  | 	"sync/atomic" | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | 	"time" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-28 22:36:34 +08:00
										 |  |  | 	"github.com/dustin/go-humanize" | 
					
						
							| 
									
										
										
										
											2024-01-23 04:16:36 +08:00
										 |  |  | 	"github.com/klauspost/compress/zstd" | 
					
						
							| 
									
										
										
										
											2023-06-20 08:53:08 +08:00
										 |  |  | 	"github.com/minio/madmin-go/v3" | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	"github.com/minio/minio/internal/bucket/bandwidth" | 
					
						
							| 
									
										
										
										
											2021-06-02 05:59:40 +08:00
										 |  |  | 	b "github.com/minio/minio/internal/bucket/bandwidth" | 
					
						
							|  |  |  | 	"github.com/minio/minio/internal/event" | 
					
						
							| 
									
										
										
										
											2024-01-31 04:49:02 +08:00
										 |  |  | 	"github.com/minio/minio/internal/grid" | 
					
						
							| 
									
										
										
										
											2023-11-07 06:26:08 +08:00
										 |  |  | 	xioutil "github.com/minio/minio/internal/ioutil" | 
					
						
							| 
									
										
										
										
											2021-06-02 05:59:40 +08:00
										 |  |  | 	"github.com/minio/minio/internal/logger" | 
					
						
							| 
									
										
										
										
											2022-07-06 05:45:49 +08:00
										 |  |  | 	"github.com/minio/minio/internal/pubsub" | 
					
						
							| 
									
										
										
										
											2023-01-23 19:12:47 +08:00
										 |  |  | 	"github.com/minio/mux" | 
					
						
							| 
									
										
										
										
											2024-05-25 07:05:23 +08:00
										 |  |  | 	"github.com/minio/pkg/v3/logger/message/log" | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // To abstract a node over network.
 | 
					
						
							| 
									
										
										
										
											2020-05-20 04:53:54 +08:00
										 |  |  | type peerRESTServer struct{} | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | var ( | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	// Types & Wrappers
 | 
					
						
							| 
									
										
										
										
											2024-03-09 03:08:18 +08:00
										 |  |  | 	aoBucketInfo           = grid.NewArrayOf[*BucketInfo](func() *BucketInfo { return &BucketInfo{} }) | 
					
						
							| 
									
										
										
										
											2024-03-10 17:15:15 +08:00
										 |  |  | 	aoMetricsGroup         = grid.NewArrayOf[*MetricV2](func() *MetricV2 { return &MetricV2{} }) | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	madminBgHealState      = grid.NewJSONPool[madmin.BgHealState]() | 
					
						
							| 
									
										
										
										
											2024-12-04 07:12:25 +08:00
										 |  |  | 	madminHealResultItem   = grid.NewJSONPool[madmin.HealResultItem]() | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	madminCPUs             = grid.NewJSONPool[madmin.CPUs]() | 
					
						
							|  |  |  | 	madminMemInfo          = grid.NewJSONPool[madmin.MemInfo]() | 
					
						
							|  |  |  | 	madminNetInfo          = grid.NewJSONPool[madmin.NetInfo]() | 
					
						
							|  |  |  | 	madminOSInfo           = grid.NewJSONPool[madmin.OSInfo]() | 
					
						
							|  |  |  | 	madminPartitions       = grid.NewJSONPool[madmin.Partitions]() | 
					
						
							|  |  |  | 	madminProcInfo         = grid.NewJSONPool[madmin.ProcInfo]() | 
					
						
							|  |  |  | 	madminRealtimeMetrics  = grid.NewJSONPool[madmin.RealtimeMetrics]() | 
					
						
							|  |  |  | 	madminServerProperties = grid.NewJSONPool[madmin.ServerProperties]() | 
					
						
							|  |  |  | 	madminStorageInfo      = grid.NewJSONPool[madmin.StorageInfo]() | 
					
						
							|  |  |  | 	madminSysConfig        = grid.NewJSONPool[madmin.SysConfig]() | 
					
						
							|  |  |  | 	madminSysErrors        = grid.NewJSONPool[madmin.SysErrors]() | 
					
						
							|  |  |  | 	madminSysServices      = grid.NewJSONPool[madmin.SysServices]() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Request -> Response RPC calls
 | 
					
						
							|  |  |  | 	deleteBucketMetadataRPC        = grid.NewSingleHandler[*grid.MSS, grid.NoPayload](grid.HandlerDeleteBucketMetadata, grid.NewMSS, grid.NewNoPayload).IgnoreNilConn() | 
					
						
							|  |  |  | 	deleteBucketRPC                = grid.NewSingleHandler[*grid.MSS, grid.NoPayload](grid.HandlerDeleteBucket, grid.NewMSS, grid.NewNoPayload) | 
					
						
							|  |  |  | 	deletePolicyRPC                = grid.NewSingleHandler[*grid.MSS, grid.NoPayload](grid.HandlerDeletePolicy, grid.NewMSS, grid.NewNoPayload).IgnoreNilConn() | 
					
						
							|  |  |  | 	deleteSvcActRPC                = grid.NewSingleHandler[*grid.MSS, grid.NoPayload](grid.HandlerDeleteServiceAccount, grid.NewMSS, grid.NewNoPayload).IgnoreNilConn() | 
					
						
							|  |  |  | 	deleteUserRPC                  = grid.NewSingleHandler[*grid.MSS, grid.NoPayload](grid.HandlerDeleteUser, grid.NewMSS, grid.NewNoPayload).IgnoreNilConn() | 
					
						
							|  |  |  | 	getAllBucketStatsRPC           = grid.NewSingleHandler[*grid.MSS, *BucketStatsMap](grid.HandlerGetAllBucketStats, grid.NewMSS, func() *BucketStatsMap { return &BucketStatsMap{} }) | 
					
						
							|  |  |  | 	getBackgroundHealStatusRPC     = grid.NewSingleHandler[*grid.MSS, *grid.JSON[madmin.BgHealState]](grid.HandlerBackgroundHealStatus, grid.NewMSS, madminBgHealState.NewJSON) | 
					
						
							|  |  |  | 	getBandwidthRPC                = grid.NewSingleHandler[*grid.URLValues, *bandwidth.BucketBandwidthReport](grid.HandlerGetBandwidth, grid.NewURLValues, func() *bandwidth.BucketBandwidthReport { return &bandwidth.BucketBandwidthReport{} }) | 
					
						
							|  |  |  | 	getBucketStatsRPC              = grid.NewSingleHandler[*grid.MSS, *BucketStats](grid.HandlerGetBucketStats, grid.NewMSS, func() *BucketStats { return &BucketStats{} }) | 
					
						
							|  |  |  | 	getCPUsHandler                 = grid.NewSingleHandler[*grid.MSS, *grid.JSON[madmin.CPUs]](grid.HandlerGetCPUs, grid.NewMSS, madminCPUs.NewJSON) | 
					
						
							|  |  |  | 	getLastDayTierStatsRPC         = grid.NewSingleHandler[*grid.MSS, *DailyAllTierStats](grid.HandlerGetLastDayTierStats, grid.NewMSS, func() *DailyAllTierStats { return &DailyAllTierStats{} }) | 
					
						
							|  |  |  | 	getLocksRPC                    = grid.NewSingleHandler[*grid.MSS, *localLockMap](grid.HandlerGetLocks, grid.NewMSS, func() *localLockMap { return &localLockMap{} }) | 
					
						
							|  |  |  | 	getMemInfoRPC                  = grid.NewSingleHandler[*grid.MSS, *grid.JSON[madmin.MemInfo]](grid.HandlerGetMemInfo, grid.NewMSS, madminMemInfo.NewJSON) | 
					
						
							|  |  |  | 	getMetacacheListingRPC         = grid.NewSingleHandler[*listPathOptions, *metacache](grid.HandlerGetMetacacheListing, func() *listPathOptions { return &listPathOptions{} }, func() *metacache { return &metacache{} }) | 
					
						
							|  |  |  | 	getMetricsRPC                  = grid.NewSingleHandler[*grid.URLValues, *grid.JSON[madmin.RealtimeMetrics]](grid.HandlerGetMetrics, grid.NewURLValues, madminRealtimeMetrics.NewJSON) | 
					
						
							|  |  |  | 	getNetInfoRPC                  = grid.NewSingleHandler[*grid.MSS, *grid.JSON[madmin.NetInfo]](grid.HandlerGetNetInfo, grid.NewMSS, madminNetInfo.NewJSON) | 
					
						
							|  |  |  | 	getOSInfoRPC                   = grid.NewSingleHandler[*grid.MSS, *grid.JSON[madmin.OSInfo]](grid.HandlerGetOSInfo, grid.NewMSS, madminOSInfo.NewJSON) | 
					
						
							|  |  |  | 	getPartitionsRPC               = grid.NewSingleHandler[*grid.MSS, *grid.JSON[madmin.Partitions]](grid.HandlerGetPartitions, grid.NewMSS, madminPartitions.NewJSON) | 
					
						
							| 
									
										
										
										
											2024-03-10 17:15:15 +08:00
										 |  |  | 	getPeerBucketMetricsRPC        = grid.NewSingleHandler[*grid.MSS, *grid.Array[*MetricV2]](grid.HandlerGetPeerBucketMetrics, grid.NewMSS, aoMetricsGroup.New) | 
					
						
							|  |  |  | 	getPeerMetricsRPC              = grid.NewSingleHandler[*grid.MSS, *grid.Array[*MetricV2]](grid.HandlerGetPeerMetrics, grid.NewMSS, aoMetricsGroup.New) | 
					
						
							|  |  |  | 	getResourceMetricsRPC          = grid.NewSingleHandler[*grid.MSS, *grid.Array[*MetricV2]](grid.HandlerGetResourceMetrics, grid.NewMSS, aoMetricsGroup.New) | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	getProcInfoRPC                 = grid.NewSingleHandler[*grid.MSS, *grid.JSON[madmin.ProcInfo]](grid.HandlerGetProcInfo, grid.NewMSS, madminProcInfo.NewJSON) | 
					
						
							|  |  |  | 	getSRMetricsRPC                = grid.NewSingleHandler[*grid.MSS, *SRMetricsSummary](grid.HandlerGetSRMetrics, grid.NewMSS, func() *SRMetricsSummary { return &SRMetricsSummary{} }) | 
					
						
							|  |  |  | 	getSysConfigRPC                = grid.NewSingleHandler[*grid.MSS, *grid.JSON[madmin.SysConfig]](grid.HandlerGetSysConfig, grid.NewMSS, madminSysConfig.NewJSON) | 
					
						
							|  |  |  | 	getSysErrorsRPC                = grid.NewSingleHandler[*grid.MSS, *grid.JSON[madmin.SysErrors]](grid.HandlerGetSysErrors, grid.NewMSS, madminSysErrors.NewJSON) | 
					
						
							|  |  |  | 	getSysServicesRPC              = grid.NewSingleHandler[*grid.MSS, *grid.JSON[madmin.SysServices]](grid.HandlerGetSysServices, grid.NewMSS, madminSysServices.NewJSON) | 
					
						
							|  |  |  | 	headBucketRPC                  = grid.NewSingleHandler[*grid.MSS, *VolInfo](grid.HandlerHeadBucket, grid.NewMSS, func() *VolInfo { return &VolInfo{} }) | 
					
						
							| 
									
										
										
										
											2024-12-04 07:12:25 +08:00
										 |  |  | 	healBucketRPC                  = grid.NewSingleHandler[*grid.MSS, *grid.JSON[madmin.HealResultItem]](grid.HandlerHealBucket, grid.NewMSS, madminHealResultItem.NewJSON) | 
					
						
							| 
									
										
										
										
											2024-03-09 03:08:18 +08:00
										 |  |  | 	listBucketsRPC                 = grid.NewSingleHandler[*BucketOptions, *grid.Array[*BucketInfo]](grid.HandlerListBuckets, func() *BucketOptions { return &BucketOptions{} }, aoBucketInfo.New) | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	loadBucketMetadataRPC          = grid.NewSingleHandler[*grid.MSS, grid.NoPayload](grid.HandlerLoadBucketMetadata, grid.NewMSS, grid.NewNoPayload).IgnoreNilConn() | 
					
						
							|  |  |  | 	loadGroupRPC                   = grid.NewSingleHandler[*grid.MSS, grid.NoPayload](grid.HandlerLoadGroup, grid.NewMSS, grid.NewNoPayload) | 
					
						
							|  |  |  | 	loadPolicyMappingRPC           = grid.NewSingleHandler[*grid.MSS, grid.NoPayload](grid.HandlerLoadPolicyMapping, grid.NewMSS, grid.NewNoPayload).IgnoreNilConn() | 
					
						
							|  |  |  | 	loadPolicyRPC                  = grid.NewSingleHandler[*grid.MSS, grid.NoPayload](grid.HandlerLoadPolicy, grid.NewMSS, grid.NewNoPayload).IgnoreNilConn() | 
					
						
							|  |  |  | 	loadRebalanceMetaRPC           = grid.NewSingleHandler[*grid.MSS, grid.NoPayload](grid.HandlerLoadRebalanceMeta, grid.NewMSS, grid.NewNoPayload) | 
					
						
							|  |  |  | 	loadSvcActRPC                  = grid.NewSingleHandler[*grid.MSS, grid.NoPayload](grid.HandlerLoadServiceAccount, grid.NewMSS, grid.NewNoPayload).IgnoreNilConn() | 
					
						
							|  |  |  | 	loadTransitionTierConfigRPC    = grid.NewSingleHandler[*grid.MSS, grid.NoPayload](grid.HandlerLoadTransitionTierConfig, grid.NewMSS, grid.NewNoPayload) | 
					
						
							|  |  |  | 	loadUserRPC                    = grid.NewSingleHandler[*grid.MSS, grid.NoPayload](grid.HandlerLoadUser, grid.NewMSS, grid.NewNoPayload).IgnoreNilConn() | 
					
						
							|  |  |  | 	localStorageInfoRPC            = grid.NewSingleHandler[*grid.MSS, *grid.JSON[madmin.StorageInfo]](grid.HandlerStorageInfo, grid.NewMSS, madminStorageInfo.NewJSON) | 
					
						
							|  |  |  | 	makeBucketRPC                  = grid.NewSingleHandler[*grid.MSS, grid.NoPayload](grid.HandlerMakeBucket, grid.NewMSS, grid.NewNoPayload) | 
					
						
							|  |  |  | 	reloadPoolMetaRPC              = grid.NewSingleHandler[*grid.MSS, grid.NoPayload](grid.HandlerReloadPoolMeta, grid.NewMSS, grid.NewNoPayload) | 
					
						
							|  |  |  | 	reloadSiteReplicationConfigRPC = grid.NewSingleHandler[*grid.MSS, grid.NoPayload](grid.HandlerReloadSiteReplicationConfig, grid.NewMSS, grid.NewNoPayload) | 
					
						
							|  |  |  | 	serverInfoRPC                  = grid.NewSingleHandler[*grid.MSS, *grid.JSON[madmin.ServerProperties]](grid.HandlerServerInfo, grid.NewMSS, madminServerProperties.NewJSON) | 
					
						
							|  |  |  | 	signalServiceRPC               = grid.NewSingleHandler[*grid.MSS, grid.NoPayload](grid.HandlerSignalService, grid.NewMSS, grid.NewNoPayload) | 
					
						
							|  |  |  | 	stopRebalanceRPC               = grid.NewSingleHandler[*grid.MSS, grid.NoPayload](grid.HandlerStopRebalance, grid.NewMSS, grid.NewNoPayload) | 
					
						
							|  |  |  | 	updateMetacacheListingRPC      = grid.NewSingleHandler[*metacache, *metacache](grid.HandlerUpdateMetacacheListing, func() *metacache { return &metacache{} }, func() *metacache { return &metacache{} }) | 
					
						
							| 
									
										
										
										
											2024-09-10 00:58:30 +08:00
										 |  |  | 	cleanupUploadIDCacheMetaRPC    = grid.NewSingleHandler[*grid.MSS, grid.NoPayload](grid.HandlerClearUploadID, grid.NewMSS, grid.NewNoPayload) | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// STREAMS
 | 
					
						
							|  |  |  | 	// Set an output capacity of 100 for consoleLog and listenRPC
 | 
					
						
							|  |  |  | 	// There is another buffer that will buffer events.
 | 
					
						
							| 
									
										
										
										
											2024-02-25 16:51:38 +08:00
										 |  |  | 	consoleLogRPC = grid.NewStream[*grid.MSS, grid.NoPayload, *grid.Bytes](grid.HandlerConsoleLog, grid.NewMSS, nil, grid.NewBytes).WithOutCapacity(100) | 
					
						
							|  |  |  | 	listenRPC     = grid.NewStream[*grid.URLValues, grid.NoPayload, *grid.Bytes](grid.HandlerListen, grid.NewURLValues, nil, grid.NewBytes).WithOutCapacity(100) | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | ) | 
					
						
							| 
									
										
										
										
											2019-06-07 08:46:22 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | // GetLocksHandler - returns list of lock from the server.
 | 
					
						
							|  |  |  | func (s *peerRESTServer) GetLocksHandler(_ *grid.MSS) (*localLockMap, *grid.RemoteErr) { | 
					
						
							|  |  |  | 	res := globalLockServer.DupLockMap() | 
					
						
							|  |  |  | 	return &res, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | // DeletePolicyHandler - deletes a policy on the server.
 | 
					
						
							|  |  |  | func (s *peerRESTServer) DeletePolicyHandler(mss *grid.MSS) (np grid.NoPayload, nerr *grid.RemoteErr) { | 
					
						
							| 
									
										
										
										
											2020-10-10 00:59:52 +08:00
										 |  |  | 	objAPI := newObjectLayerFn() | 
					
						
							| 
									
										
										
										
											2019-06-07 08:46:22 +08:00
										 |  |  | 	if objAPI == nil { | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 		return np, grid.NewRemoteErr(errServerNotInitialized) | 
					
						
							| 
									
										
										
										
											2019-06-07 08:46:22 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 	policyName := mss.Get(peerRESTPolicy) | 
					
						
							| 
									
										
										
										
											2019-06-07 08:46:22 +08:00
										 |  |  | 	if policyName == "" { | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 		return np, grid.NewRemoteErr(errors.New("policyName is missing")) | 
					
						
							| 
									
										
										
										
											2019-06-07 08:46:22 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 	if err := globalIAMSys.DeletePolicy(context.Background(), policyName, false); err != nil { | 
					
						
							|  |  |  | 		return np, grid.NewRemoteErr(err) | 
					
						
							| 
									
										
										
										
											2019-06-07 08:46:22 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return | 
					
						
							| 
									
										
										
										
											2019-06-07 08:46:22 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // LoadPolicyHandler - reloads a policy on the server.
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | func (s *peerRESTServer) LoadPolicyHandler(mss *grid.MSS) (np grid.NoPayload, nerr *grid.RemoteErr) { | 
					
						
							| 
									
										
										
										
											2020-10-10 00:59:52 +08:00
										 |  |  | 	objAPI := newObjectLayerFn() | 
					
						
							| 
									
										
										
										
											2019-06-07 08:46:22 +08:00
										 |  |  | 	if objAPI == nil { | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 		return np, grid.NewRemoteErr(errServerNotInitialized) | 
					
						
							| 
									
										
										
										
											2019-06-07 08:46:22 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 	policyName := mss.Get(peerRESTPolicy) | 
					
						
							| 
									
										
										
										
											2019-06-07 08:46:22 +08:00
										 |  |  | 	if policyName == "" { | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 		return np, grid.NewRemoteErr(errors.New("policyName is missing")) | 
					
						
							| 
									
										
										
										
											2019-06-07 08:46:22 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 	if err := globalIAMSys.LoadPolicy(context.Background(), objAPI, policyName); err != nil { | 
					
						
							|  |  |  | 		return np, grid.NewRemoteErr(err) | 
					
						
							| 
									
										
										
										
											2019-06-07 08:46:22 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return | 
					
						
							| 
									
										
										
										
											2019-06-07 08:46:22 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-14 04:41:06 +08:00
										 |  |  | // LoadPolicyMappingHandler - reloads a policy mapping on the server.
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | func (s *peerRESTServer) LoadPolicyMappingHandler(mss *grid.MSS) (np grid.NoPayload, nerr *grid.RemoteErr) { | 
					
						
							| 
									
										
										
										
											2020-10-10 00:59:52 +08:00
										 |  |  | 	objAPI := newObjectLayerFn() | 
					
						
							| 
									
										
										
										
											2019-08-14 04:41:06 +08:00
										 |  |  | 	if objAPI == nil { | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 		return np, grid.NewRemoteErr(errServerNotInitialized) | 
					
						
							| 
									
										
										
										
											2019-08-14 04:41:06 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 	userOrGroup := mss.Get(peerRESTUserOrGroup) | 
					
						
							| 
									
										
										
										
											2019-08-14 04:41:06 +08:00
										 |  |  | 	if userOrGroup == "" { | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 		return np, grid.NewRemoteErr(errors.New("user-or-group is missing")) | 
					
						
							| 
									
										
										
										
											2019-08-14 04:41:06 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 	userType, err := strconv.Atoi(mss.Get(peerRESTUserType)) | 
					
						
							| 
									
										
										
										
											2022-08-24 02:11:45 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 		return np, grid.NewRemoteErr(fmt.Errorf("user-type `%s` is invalid: %w", mss.Get(peerRESTUserType), err)) | 
					
						
							| 
									
										
										
										
											2022-08-24 02:11:45 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 	isGroup := mss.Get(peerRESTIsGroup) == "true" | 
					
						
							|  |  |  | 	if err := globalIAMSys.LoadPolicyMapping(context.Background(), objAPI, userOrGroup, IAMUserType(userType), isGroup); err != nil { | 
					
						
							|  |  |  | 		return np, grid.NewRemoteErr(err) | 
					
						
							| 
									
										
										
										
											2019-08-14 04:41:06 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return | 
					
						
							| 
									
										
										
										
											2019-08-14 04:41:06 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-25 03:10:09 +08:00
										 |  |  | // DeleteServiceAccountHandler - deletes a service account on the server.
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | func (s *peerRESTServer) DeleteServiceAccountHandler(mss *grid.MSS) (np grid.NoPayload, nerr *grid.RemoteErr) { | 
					
						
							| 
									
										
										
										
											2020-10-10 00:59:52 +08:00
										 |  |  | 	objAPI := newObjectLayerFn() | 
					
						
							| 
									
										
										
										
											2020-04-25 03:10:09 +08:00
										 |  |  | 	if objAPI == nil { | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 		return np, grid.NewRemoteErr(errServerNotInitialized) | 
					
						
							| 
									
										
										
										
											2020-04-25 03:10:09 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 	accessKey := mss.Get(peerRESTUser) | 
					
						
							| 
									
										
										
										
											2020-04-25 03:10:09 +08:00
										 |  |  | 	if accessKey == "" { | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 		return np, grid.NewRemoteErr(errors.New("service account name is missing")) | 
					
						
							| 
									
										
										
										
											2020-04-25 03:10:09 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 	if err := globalIAMSys.DeleteServiceAccount(context.Background(), accessKey, false); err != nil { | 
					
						
							|  |  |  | 		return np, grid.NewRemoteErr(err) | 
					
						
							| 
									
										
										
										
											2020-04-25 03:10:09 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return | 
					
						
							| 
									
										
										
										
											2020-04-25 03:10:09 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // LoadServiceAccountHandler - reloads a service account on the server.
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | func (s *peerRESTServer) LoadServiceAccountHandler(mss *grid.MSS) (np grid.NoPayload, nerr *grid.RemoteErr) { | 
					
						
							| 
									
										
										
										
											2020-10-10 00:59:52 +08:00
										 |  |  | 	objAPI := newObjectLayerFn() | 
					
						
							| 
									
										
										
										
											2020-04-25 03:10:09 +08:00
										 |  |  | 	if objAPI == nil { | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 		return np, grid.NewRemoteErr(errServerNotInitialized) | 
					
						
							| 
									
										
										
										
											2020-04-25 03:10:09 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 	accessKey := mss.Get(peerRESTUser) | 
					
						
							| 
									
										
										
										
											2020-04-25 03:10:09 +08:00
										 |  |  | 	if accessKey == "" { | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 		return np, grid.NewRemoteErr(errors.New("service account name is missing")) | 
					
						
							| 
									
										
										
										
											2020-04-25 03:10:09 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 	if err := globalIAMSys.LoadServiceAccount(context.Background(), accessKey); err != nil { | 
					
						
							|  |  |  | 		return np, grid.NewRemoteErr(err) | 
					
						
							| 
									
										
										
										
											2020-04-25 03:10:09 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return | 
					
						
							| 
									
										
										
										
											2020-04-25 03:10:09 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-07 08:46:22 +08:00
										 |  |  | // DeleteUserHandler - deletes a user on the server.
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | func (s *peerRESTServer) DeleteUserHandler(mss *grid.MSS) (np grid.NoPayload, nerr *grid.RemoteErr) { | 
					
						
							| 
									
										
										
										
											2020-10-10 00:59:52 +08:00
										 |  |  | 	objAPI := newObjectLayerFn() | 
					
						
							| 
									
										
										
										
											2019-06-07 08:46:22 +08:00
										 |  |  | 	if objAPI == nil { | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 		return np, grid.NewRemoteErr(errServerNotInitialized) | 
					
						
							| 
									
										
										
										
											2019-06-07 08:46:22 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 	accessKey := mss.Get(peerRESTUser) | 
					
						
							| 
									
										
										
										
											2019-06-07 08:46:22 +08:00
										 |  |  | 	if accessKey == "" { | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 		return np, grid.NewRemoteErr(errors.New("username is missing")) | 
					
						
							| 
									
										
										
										
											2019-06-07 08:46:22 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 	if err := globalIAMSys.DeleteUser(context.Background(), accessKey, false); err != nil { | 
					
						
							|  |  |  | 		return np, grid.NewRemoteErr(err) | 
					
						
							| 
									
										
										
										
											2019-06-07 08:46:22 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return | 
					
						
							| 
									
										
										
										
											2019-06-07 08:46:22 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // LoadUserHandler - reloads a user on the server.
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | func (s *peerRESTServer) LoadUserHandler(mss *grid.MSS) (np grid.NoPayload, nerr *grid.RemoteErr) { | 
					
						
							| 
									
										
										
										
											2020-10-10 00:59:52 +08:00
										 |  |  | 	objAPI := newObjectLayerFn() | 
					
						
							| 
									
										
										
										
											2019-06-07 08:46:22 +08:00
										 |  |  | 	if objAPI == nil { | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 		return np, grid.NewRemoteErr(errServerNotInitialized) | 
					
						
							| 
									
										
										
										
											2019-06-07 08:46:22 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 	accessKey := mss.Get(peerRESTUser) | 
					
						
							| 
									
										
										
										
											2019-06-07 08:46:22 +08:00
										 |  |  | 	if accessKey == "" { | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 		return np, grid.NewRemoteErr(errors.New("username is missing")) | 
					
						
							| 
									
										
										
										
											2019-06-07 08:46:22 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 	temp, err := strconv.ParseBool(mss.Get(peerRESTUserTemp)) | 
					
						
							| 
									
										
										
										
											2019-06-07 08:46:22 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 		return np, grid.NewRemoteErr(err) | 
					
						
							| 
									
										
										
										
											2019-06-07 08:46:22 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-03 01:15:06 +08:00
										 |  |  | 	userType := regUser | 
					
						
							| 
									
										
										
										
											2020-03-18 01:36:13 +08:00
										 |  |  | 	if temp { | 
					
						
							|  |  |  | 		userType = stsUser | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 	if err = globalIAMSys.LoadUser(context.Background(), objAPI, accessKey, userType); err != nil { | 
					
						
							|  |  |  | 		return np, grid.NewRemoteErr(err) | 
					
						
							| 
									
										
										
										
											2019-06-07 08:46:22 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return | 
					
						
							| 
									
										
										
										
											2019-06-07 08:46:22 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-03 05:25:00 +08:00
										 |  |  | // LoadGroupHandler - reloads group along with members list.
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | func (s *peerRESTServer) LoadGroupHandler(mss *grid.MSS) (np grid.NoPayload, nerr *grid.RemoteErr) { | 
					
						
							| 
									
										
										
										
											2020-10-10 00:59:52 +08:00
										 |  |  | 	objAPI := newObjectLayerFn() | 
					
						
							| 
									
										
										
										
											2019-08-03 05:25:00 +08:00
										 |  |  | 	if objAPI == nil { | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 		return np, grid.NewRemoteErr(errServerNotInitialized) | 
					
						
							| 
									
										
										
										
											2019-08-03 05:25:00 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 	group := mss.Get(peerRESTGroup) | 
					
						
							| 
									
										
										
										
											2024-02-02 11:42:56 +08:00
										 |  |  | 	if group == "" { | 
					
						
							|  |  |  | 		return np, grid.NewRemoteErr(errors.New("group is missing")) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 	err := globalIAMSys.LoadGroup(context.Background(), objAPI, group) | 
					
						
							| 
									
										
										
										
											2019-08-03 05:25:00 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 		return np, grid.NewRemoteErr(err) | 
					
						
							| 
									
										
										
										
											2019-08-03 05:25:00 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return | 
					
						
							| 
									
										
										
										
											2019-08-03 05:25:00 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | // StartProfilingHandler - Issues the start profiling command.
 | 
					
						
							|  |  |  | func (s *peerRESTServer) StartProfilingHandler(w http.ResponseWriter, r *http.Request) { | 
					
						
							|  |  |  | 	if !s.IsValid(w, r) { | 
					
						
							|  |  |  | 		s.writeErrorResponse(w, errors.New("Invalid request")) | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	vars := mux.Vars(r) | 
					
						
							| 
									
										
										
										
											2020-01-11 09:19:58 +08:00
										 |  |  | 	profiles := strings.Split(vars[peerRESTProfiler], ",") | 
					
						
							|  |  |  | 	if len(profiles) == 0 { | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | 		s.writeErrorResponse(w, errors.New("profiler name is missing")) | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-01-11 09:19:58 +08:00
										 |  |  | 	globalProfilerMu.Lock() | 
					
						
							|  |  |  | 	defer globalProfilerMu.Unlock() | 
					
						
							|  |  |  | 	if globalProfiler == nil { | 
					
						
							|  |  |  | 		globalProfiler = make(map[string]minioProfiler, 10) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-11 09:19:58 +08:00
										 |  |  | 	// Stop profiler of all types if already running
 | 
					
						
							|  |  |  | 	for k, v := range globalProfiler { | 
					
						
							|  |  |  | 		for _, p := range profiles { | 
					
						
							|  |  |  | 			if p == k { | 
					
						
							|  |  |  | 				v.Stop() | 
					
						
							|  |  |  | 				delete(globalProfiler, k) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-11 09:19:58 +08:00
										 |  |  | 	for _, profiler := range profiles { | 
					
						
							|  |  |  | 		prof, err := startProfiler(profiler) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			s.writeErrorResponse(w, err) | 
					
						
							|  |  |  | 			return | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		globalProfiler[profiler] = prof | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-11 09:19:58 +08:00
										 |  |  | // DownloadProfilingDataHandler - returns profiled data.
 | 
					
						
							|  |  |  | func (s *peerRESTServer) DownloadProfilingDataHandler(w http.ResponseWriter, r *http.Request) { | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | 	if !s.IsValid(w, r) { | 
					
						
							|  |  |  | 		s.writeErrorResponse(w, errors.New("Invalid request")) | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ctx := newContext(r, w, "DownloadProfiling") | 
					
						
							|  |  |  | 	profileData, err := getProfileData() | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		s.writeErrorResponse(w, err) | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-04-04 20:04:40 +08:00
										 |  |  | 	peersLogIf(ctx, gob.NewEncoder(w).Encode(profileData)) | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | func (s *peerRESTServer) LocalStorageInfoHandler(mss *grid.MSS) (*grid.JSON[madmin.StorageInfo], *grid.RemoteErr) { | 
					
						
							| 
									
										
										
										
											2022-12-02 06:31:35 +08:00
										 |  |  | 	objLayer := newObjectLayerFn() | 
					
						
							|  |  |  | 	if objLayer == nil { | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 		return nil, grid.NewRemoteErr(errServerNotInitialized) | 
					
						
							| 
									
										
										
										
											2022-12-02 06:31:35 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	metrics, err := strconv.ParseBool(mss.Get(peerRESTMetrics)) | 
					
						
							| 
									
										
										
										
											2023-12-22 08:56:43 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 		return nil, grid.NewRemoteErr(err) | 
					
						
							| 
									
										
										
										
											2023-12-22 08:56:43 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	info := objLayer.LocalStorageInfo(context.Background(), metrics) | 
					
						
							|  |  |  | 	return madminStorageInfo.NewJSONWith(&info), nil | 
					
						
							| 
									
										
										
										
											2022-12-02 06:31:35 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-12 06:27:03 +08:00
										 |  |  | // ServerInfoHandler - returns Server Info
 | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | func (s *peerRESTServer) ServerInfoHandler(params *grid.MSS) (*grid.JSON[madmin.ServerProperties], *grid.RemoteErr) { | 
					
						
							| 
									
										
										
										
											2024-03-22 01:19:14 +08:00
										 |  |  | 	r := http.Request{Host: globalLocalNodeName} | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	metrics, err := strconv.ParseBool(params.Get(peerRESTMetrics)) | 
					
						
							| 
									
										
										
										
											2024-02-09 11:28:46 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 		return nil, grid.NewRemoteErr(err) | 
					
						
							| 
									
										
										
										
											2024-02-09 11:28:46 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	info := getLocalServerProperty(globalEndpoints, &r, metrics) | 
					
						
							|  |  |  | 	return madminServerProperties.NewJSONWith(&info), nil | 
					
						
							| 
									
										
										
										
											2019-12-12 06:27:03 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-01 23:55:49 +08:00
										 |  |  | // GetCPUsHandler - returns CPU info.
 | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | func (s *peerRESTServer) GetCPUsHandler(_ *grid.MSS) (*grid.JSON[madmin.CPUs], *grid.RemoteErr) { | 
					
						
							| 
									
										
										
										
											2024-03-22 01:19:14 +08:00
										 |  |  | 	info := madmin.GetCPUs(context.Background(), globalLocalNodeName) | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	return madminCPUs.NewJSONWith(&info), nil | 
					
						
							| 
									
										
										
										
											2020-03-27 12:07:39 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-03 00:49:49 +08:00
										 |  |  | // GetNetInfoHandler - returns network information.
 | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | func (s *peerRESTServer) GetNetInfoHandler(_ *grid.MSS) (*grid.JSON[madmin.NetInfo], *grid.RemoteErr) { | 
					
						
							| 
									
										
										
										
											2024-03-22 01:19:14 +08:00
										 |  |  | 	info := madmin.GetNetInfo(globalLocalNodeName, globalInternodeInterface) | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	return madminNetInfo.NewJSONWith(&info), nil | 
					
						
							| 
									
										
										
										
											2023-11-03 00:49:49 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-01 23:55:49 +08:00
										 |  |  | // GetPartitionsHandler - returns disk partition information.
 | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | func (s *peerRESTServer) GetPartitionsHandler(_ *grid.MSS) (*grid.JSON[madmin.Partitions], *grid.RemoteErr) { | 
					
						
							| 
									
										
										
										
											2024-03-22 01:19:14 +08:00
										 |  |  | 	info := madmin.GetPartitions(context.Background(), globalLocalNodeName) | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	return madminPartitions.NewJSONWith(&info), nil | 
					
						
							| 
									
										
										
										
											2020-03-27 12:07:39 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-01 23:55:49 +08:00
										 |  |  | // GetOSInfoHandler - returns operating system's information.
 | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | func (s *peerRESTServer) GetOSInfoHandler(_ *grid.MSS) (*grid.JSON[madmin.OSInfo], *grid.RemoteErr) { | 
					
						
							| 
									
										
										
										
											2024-03-22 01:19:14 +08:00
										 |  |  | 	info := madmin.GetOSInfo(context.Background(), globalLocalNodeName) | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	return madminOSInfo.NewJSONWith(&info), nil | 
					
						
							| 
									
										
										
										
											2020-03-27 12:07:39 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-01 23:55:49 +08:00
										 |  |  | // GetProcInfoHandler - returns this MinIO process information.
 | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | func (s *peerRESTServer) GetProcInfoHandler(_ *grid.MSS) (*grid.JSON[madmin.ProcInfo], *grid.RemoteErr) { | 
					
						
							| 
									
										
										
										
											2024-03-22 01:19:14 +08:00
										 |  |  | 	info := madmin.GetProcInfo(context.Background(), globalLocalNodeName) | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	return madminProcInfo.NewJSONWith(&info), nil | 
					
						
							| 
									
										
										
										
											2020-03-27 12:07:39 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-01 23:55:49 +08:00
										 |  |  | // GetMemInfoHandler - returns memory information.
 | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | func (s *peerRESTServer) GetMemInfoHandler(_ *grid.MSS) (*grid.JSON[madmin.MemInfo], *grid.RemoteErr) { | 
					
						
							| 
									
										
										
										
											2024-03-22 01:19:14 +08:00
										 |  |  | 	info := madmin.GetMemInfo(context.Background(), globalLocalNodeName) | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	return madminMemInfo.NewJSONWith(&info), nil | 
					
						
							| 
									
										
										
										
											2020-03-27 12:07:39 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-06 05:45:49 +08:00
										 |  |  | // GetMetricsHandler - returns server metrics.
 | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | func (s *peerRESTServer) GetMetricsHandler(v *grid.URLValues) (*grid.JSON[madmin.RealtimeMetrics], *grid.RemoteErr) { | 
					
						
							|  |  |  | 	values := v.Values() | 
					
						
							| 
									
										
										
										
											2022-07-06 05:45:49 +08:00
										 |  |  | 	var types madmin.MetricType | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	if t, _ := strconv.ParseUint(values.Get(peerRESTMetricsTypes), 10, 64); t != 0 { | 
					
						
							| 
									
										
										
										
											2022-07-06 05:45:49 +08:00
										 |  |  | 		types = madmin.MetricType(t) | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		types = madmin.MetricsAll | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-16 22:13:49 +08:00
										 |  |  | 	diskMap := make(map[string]struct{}) | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	for _, disk := range values[peerRESTDisk] { | 
					
						
							| 
									
										
										
										
											2022-10-03 17:10:15 +08:00
										 |  |  | 		diskMap[disk] = struct{}{} | 
					
						
							| 
									
										
										
										
											2022-08-16 22:13:49 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2023-07-19 14:50:30 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	hostMap := make(map[string]struct{}) | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	for _, host := range values[peerRESTHost] { | 
					
						
							| 
									
										
										
										
											2023-07-19 14:50:30 +08:00
										 |  |  | 		hostMap[host] = struct{}{} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-03 17:10:15 +08:00
										 |  |  | 	info := collectLocalMetrics(types, collectMetricsOpts{ | 
					
						
							|  |  |  | 		disks: diskMap, | 
					
						
							| 
									
										
										
										
											2023-07-19 14:50:30 +08:00
										 |  |  | 		hosts: hostMap, | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 		jobID: values.Get(peerRESTJobID), | 
					
						
							|  |  |  | 		depID: values.Get(peerRESTDepID), | 
					
						
							| 
									
										
										
										
											2022-10-03 17:10:15 +08:00
										 |  |  | 	}) | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	return madminRealtimeMetrics.NewJSONWith(&info), nil | 
					
						
							| 
									
										
										
										
											2022-07-06 05:45:49 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-25 08:09:37 +08:00
										 |  |  | // GetSysConfigHandler - returns system config information.
 | 
					
						
							|  |  |  | // (only the config that are of concern to minio)
 | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | func (s *peerRESTServer) GetSysConfigHandler(_ *grid.MSS) (*grid.JSON[madmin.SysConfig], *grid.RemoteErr) { | 
					
						
							| 
									
										
										
										
											2024-03-22 01:19:14 +08:00
										 |  |  | 	info := madmin.GetSysConfig(context.Background(), globalLocalNodeName) | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	return madminSysConfig.NewJSONWith(&info), nil | 
					
						
							| 
									
										
										
										
											2021-08-25 08:09:37 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-13 09:58:40 +08:00
										 |  |  | // GetSysServicesHandler - returns system services information.
 | 
					
						
							|  |  |  | // (only the services that are of concern to minio)
 | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | func (s *peerRESTServer) GetSysServicesHandler(_ *grid.MSS) (*grid.JSON[madmin.SysServices], *grid.RemoteErr) { | 
					
						
							| 
									
										
										
										
											2024-03-22 01:19:14 +08:00
										 |  |  | 	info := madmin.GetSysServices(context.Background(), globalLocalNodeName) | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	return madminSysServices.NewJSONWith(&info), nil | 
					
						
							| 
									
										
										
										
											2021-08-13 09:58:40 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // GetSysErrorsHandler - returns system level errors
 | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | func (s *peerRESTServer) GetSysErrorsHandler(_ *grid.MSS) (*grid.JSON[madmin.SysErrors], *grid.RemoteErr) { | 
					
						
							| 
									
										
										
										
											2024-03-22 01:19:14 +08:00
										 |  |  | 	info := madmin.GetSysErrors(context.Background(), globalLocalNodeName) | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	return madminSysErrors.NewJSONWith(&info), nil | 
					
						
							| 
									
										
										
										
											2021-07-30 14:05:34 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | // DeleteBucketMetadataHandler - Delete in memory bucket metadata
 | 
					
						
							|  |  |  | func (s *peerRESTServer) DeleteBucketMetadataHandler(mss *grid.MSS) (np grid.NoPayload, nerr *grid.RemoteErr) { | 
					
						
							|  |  |  | 	bucketName := mss.Get(peerRESTBucket) | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | 	if bucketName == "" { | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 		return np, grid.NewRemoteErr(errors.New("Bucket name is missing")) | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-15 20:04:40 +08:00
										 |  |  | 	globalReplicationStats.Load().Delete(bucketName) | 
					
						
							| 
									
										
										
										
											2020-05-20 04:53:54 +08:00
										 |  |  | 	globalBucketMetadataSys.Remove(bucketName) | 
					
						
							| 
									
										
										
										
											2021-06-24 23:39:58 +08:00
										 |  |  | 	globalBucketTargetSys.Delete(bucketName) | 
					
						
							| 
									
										
										
										
											2022-08-24 21:42:36 +08:00
										 |  |  | 	globalEventNotifier.RemoveNotification(bucketName) | 
					
						
							| 
									
										
										
										
											2022-06-15 06:14:24 +08:00
										 |  |  | 	globalBucketConnStats.delete(bucketName) | 
					
						
							| 
									
										
										
										
											2023-06-22 00:41:59 +08:00
										 |  |  | 	globalBucketHTTPStats.delete(bucketName) | 
					
						
							| 
									
										
										
										
											2020-11-01 00:46:18 +08:00
										 |  |  | 	if localMetacacheMgr != nil { | 
					
						
							|  |  |  | 		localMetacacheMgr.deleteBucketCache(bucketName) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 	return | 
					
						
							| 
									
										
										
										
											2021-10-07 07:36:31 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-24 00:15:30 +08:00
										 |  |  | // GetAllBucketStatsHandler - fetches bucket replication stats for all buckets from this peer.
 | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | func (s *peerRESTServer) GetAllBucketStatsHandler(mss *grid.MSS) (*BucketStatsMap, *grid.RemoteErr) { | 
					
						
							| 
									
										
										
										
											2024-08-15 20:04:40 +08:00
										 |  |  | 	replicationStats := globalReplicationStats.Load().GetAll() | 
					
						
							| 
									
										
										
										
											2022-05-24 00:15:30 +08:00
										 |  |  | 	bucketStatsMap := make(map[string]BucketStats, len(replicationStats)) | 
					
						
							|  |  |  | 	for k, v := range replicationStats { | 
					
						
							|  |  |  | 		bucketStatsMap[k] = BucketStats{ | 
					
						
							|  |  |  | 			ReplicationStats: v, | 
					
						
							| 
									
										
										
										
											2024-08-15 20:04:40 +08:00
										 |  |  | 			ProxyStats:       globalReplicationStats.Load().getProxyStats(k), | 
					
						
							| 
									
										
										
										
											2022-05-24 00:15:30 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	return &BucketStatsMap{Stats: bucketStatsMap, Timestamp: time.Now()}, nil | 
					
						
							| 
									
										
										
										
											2022-05-24 00:15:30 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-05 06:34:33 +08:00
										 |  |  | // GetBucketStatsHandler - fetches current in-memory bucket stats, currently only
 | 
					
						
							| 
									
										
										
										
											2022-05-24 00:15:30 +08:00
										 |  |  | // returns BucketStats, that currently includes ReplicationStats.
 | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | func (s *peerRESTServer) GetBucketStatsHandler(vars *grid.MSS) (*BucketStats, *grid.RemoteErr) { | 
					
						
							|  |  |  | 	bucketName := vars.Get(peerRESTBucket) | 
					
						
							| 
									
										
										
										
											2021-04-05 06:34:33 +08:00
										 |  |  | 	if bucketName == "" { | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 		return nil, grid.NewRemoteErrString("Bucket name is missing") | 
					
						
							| 
									
										
										
										
											2021-04-05 06:34:33 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-08-15 20:04:40 +08:00
										 |  |  | 	st := globalReplicationStats.Load() | 
					
						
							|  |  |  | 	if st == nil { | 
					
						
							|  |  |  | 		return &BucketStats{}, nil | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-04-05 06:34:33 +08:00
										 |  |  | 	bs := BucketStats{ | 
					
						
							| 
									
										
										
										
											2024-08-15 20:04:40 +08:00
										 |  |  | 		ReplicationStats: st.Get(bucketName), | 
					
						
							|  |  |  | 		QueueStats:       ReplicationQueueStats{Nodes: []ReplQNodeStats{st.getNodeQueueStats(bucketName)}}, | 
					
						
							|  |  |  | 		ProxyStats:       st.getProxyStats(bucketName), | 
					
						
							| 
									
										
										
										
											2021-04-05 06:34:33 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	return &bs, nil | 
					
						
							| 
									
										
										
										
											2021-04-05 06:34:33 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-30 16:00:59 +08:00
										 |  |  | // GetSRMetricsHandler - fetches current in-memory replication stats at site level from this peer
 | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | func (s *peerRESTServer) GetSRMetricsHandler(mss *grid.MSS) (*SRMetricsSummary, *grid.RemoteErr) { | 
					
						
							| 
									
										
										
										
											2023-08-30 16:00:59 +08:00
										 |  |  | 	objAPI := newObjectLayerFn() | 
					
						
							|  |  |  | 	if objAPI == nil { | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 		return nil, grid.NewRemoteErr(errServerNotInitialized) | 
					
						
							| 
									
										
										
										
											2023-08-30 16:00:59 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-08-15 20:04:40 +08:00
										 |  |  | 	if st := globalReplicationStats.Load(); st != nil { | 
					
						
							|  |  |  | 		sm := st.getSRMetricsForNode() | 
					
						
							|  |  |  | 		return &sm, nil | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return &SRMetricsSummary{}, nil | 
					
						
							| 
									
										
										
										
											2023-08-30 16:00:59 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | // LoadBucketMetadataHandler - reloads in memory bucket metadata
 | 
					
						
							|  |  |  | func (s *peerRESTServer) LoadBucketMetadataHandler(mss *grid.MSS) (np grid.NoPayload, nerr *grid.RemoteErr) { | 
					
						
							|  |  |  | 	bucketName := mss.Get(peerRESTBucket) | 
					
						
							| 
									
										
										
										
											2020-05-20 04:53:54 +08:00
										 |  |  | 	if bucketName == "" { | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 		return np, grid.NewRemoteErr(errors.New("Bucket name is missing")) | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-10 00:59:52 +08:00
										 |  |  | 	objAPI := newObjectLayerFn() | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | 	if objAPI == nil { | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 		return np, grid.NewRemoteErr(errServerNotInitialized) | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-01-10 18:35:06 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 	meta, err := loadBucketMetadata(context.Background(), objAPI, bucketName) | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 		return np, grid.NewRemoteErr(err) | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-20 04:53:54 +08:00
										 |  |  | 	globalBucketMetadataSys.Set(bucketName, meta) | 
					
						
							| 
									
										
										
										
											2020-06-27 04:17:31 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if meta.notificationConfig != nil { | 
					
						
							| 
									
										
										
										
											2022-08-24 21:42:36 +08:00
										 |  |  | 		globalEventNotifier.AddRulesMap(bucketName, meta.notificationConfig.ToRulesMap()) | 
					
						
							| 
									
										
										
										
											2020-06-27 04:17:31 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-08-07 08:10:21 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if meta.bucketTargetConfig != nil { | 
					
						
							| 
									
										
										
										
											2020-10-10 11:36:00 +08:00
										 |  |  | 		globalBucketTargetSys.UpdateAllTargets(bucketName, meta.bucketTargetConfig) | 
					
						
							| 
									
										
										
										
											2020-08-07 08:10:21 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | func (s *peerRESTServer) GetMetacacheListingHandler(opts *listPathOptions) (*metacache, *grid.RemoteErr) { | 
					
						
							|  |  |  | 	resp := localMetacacheMgr.getBucket(context.Background(), opts.Bucket).findCache(*opts) | 
					
						
							|  |  |  | 	return &resp, nil | 
					
						
							| 
									
										
										
										
											2020-10-29 00:18:35 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | func (s *peerRESTServer) UpdateMetacacheListingHandler(req *metacache) (*metacache, *grid.RemoteErr) { | 
					
						
							|  |  |  | 	cache, err := localMetacacheMgr.updateCacheEntry(*req) | 
					
						
							| 
									
										
										
										
											2020-10-29 00:18:35 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 		return nil, grid.NewRemoteErr(err) | 
					
						
							| 
									
										
										
										
											2020-10-29 00:18:35 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	return &cache, nil | 
					
						
							| 
									
										
										
										
											2020-10-29 00:18:35 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | // PutBucketNotificationHandler - Set bucket policy.
 | 
					
						
							|  |  |  | func (s *peerRESTServer) PutBucketNotificationHandler(w http.ResponseWriter, r *http.Request) { | 
					
						
							|  |  |  | 	if !s.IsValid(w, r) { | 
					
						
							|  |  |  | 		s.writeErrorResponse(w, errors.New("Invalid request")) | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	vars := mux.Vars(r) | 
					
						
							|  |  |  | 	bucketName := vars[peerRESTBucket] | 
					
						
							|  |  |  | 	if bucketName == "" { | 
					
						
							|  |  |  | 		s.writeErrorResponse(w, errors.New("Bucket name is missing")) | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var rulesMap event.RulesMap | 
					
						
							|  |  |  | 	if r.ContentLength < 0 { | 
					
						
							|  |  |  | 		s.writeErrorResponse(w, errInvalidArgument) | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	err := gob.NewDecoder(r.Body).Decode(&rulesMap) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		s.writeErrorResponse(w, err) | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-24 21:42:36 +08:00
										 |  |  | 	globalEventNotifier.AddRulesMap(bucketName, rulesMap) | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-18 05:49:26 +08:00
										 |  |  | // HealthHandler - returns true of health
 | 
					
						
							|  |  |  | func (s *peerRESTServer) HealthHandler(w http.ResponseWriter, r *http.Request) { | 
					
						
							|  |  |  | 	s.IsValid(w, r) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-20 10:27:58 +08:00
										 |  |  | // VerifyBinary - verifies the downloaded binary is in-tact
 | 
					
						
							|  |  |  | func (s *peerRESTServer) VerifyBinaryHandler(w http.ResponseWriter, r *http.Request) { | 
					
						
							| 
									
										
										
										
											2019-08-29 06:04:43 +08:00
										 |  |  | 	if !s.IsValid(w, r) { | 
					
						
							|  |  |  | 		s.writeErrorResponse(w, errors.New("Invalid request")) | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-23 23:03:31 +08:00
										 |  |  | 	if r.ContentLength < 0 { | 
					
						
							|  |  |  | 		s.writeErrorResponse(w, errInvalidArgument) | 
					
						
							|  |  |  | 		return | 
					
						
							| 
									
										
										
										
											2019-08-29 06:04:43 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-07-23 23:03:31 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-20 10:27:58 +08:00
										 |  |  | 	u, err := url.Parse(r.Form.Get(peerRESTURL)) | 
					
						
							| 
									
										
										
										
											2019-08-29 06:04:43 +08:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		s.writeErrorResponse(w, err) | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-01-27 00:40:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-20 10:27:58 +08:00
										 |  |  | 	sha256Sum, err := hex.DecodeString(r.Form.Get(peerRESTSha256Sum)) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		s.writeErrorResponse(w, err) | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	releaseInfo := r.Form.Get(peerRESTReleaseInfo) | 
					
						
							| 
									
										
										
										
											2020-07-23 23:03:31 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-27 00:40:13 +08:00
										 |  |  | 	lrTime, err := releaseInfoToReleaseTime(releaseInfo) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		s.writeErrorResponse(w, err) | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if lrTime.Sub(currentReleaseTime) <= 0 { | 
					
						
							| 
									
										
										
										
											2024-10-04 19:32:32 +08:00
										 |  |  | 		s.writeErrorResponse(w, fmt.Errorf("server is running the latest version: %s", Version)) | 
					
						
							| 
									
										
										
										
											2024-01-27 00:40:13 +08:00
										 |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-23 04:16:36 +08:00
										 |  |  | 	zr, err := zstd.NewReader(r.Body) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		s.writeErrorResponse(w, err) | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	defer zr.Close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if err = verifyBinary(u, sha256Sum, releaseInfo, getMinioMode(), zr); err != nil { | 
					
						
							| 
									
										
										
										
											2022-07-26 08:49:47 +08:00
										 |  |  | 		s.writeErrorResponse(w, err) | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // CommitBinary - overwrites the current binary with the new one.
 | 
					
						
							|  |  |  | func (s *peerRESTServer) CommitBinaryHandler(w http.ResponseWriter, r *http.Request) { | 
					
						
							|  |  |  | 	if !s.IsValid(w, r) { | 
					
						
							|  |  |  | 		s.writeErrorResponse(w, errors.New("Invalid request")) | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if err := commitBinary(); err != nil { | 
					
						
							| 
									
										
										
										
											2020-07-23 23:03:31 +08:00
										 |  |  | 		s.writeErrorResponse(w, err) | 
					
						
							|  |  |  | 		return | 
					
						
							| 
									
										
										
										
											2019-08-29 06:04:43 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-24 04:02:16 +08:00
										 |  |  | var errUnsupportedSignal = fmt.Errorf("unsupported signal") | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-27 00:40:13 +08:00
										 |  |  | func waitingDrivesNode() map[string]madmin.DiskMetrics { | 
					
						
							| 
									
										
										
										
											2024-02-13 05:00:20 +08:00
										 |  |  | 	globalLocalDrivesMu.RLock() | 
					
						
							| 
									
										
										
										
											2024-07-25 07:30:33 +08:00
										 |  |  | 	localDrives := cloneDrives(globalLocalDrivesMap) | 
					
						
							| 
									
										
										
										
											2024-02-13 05:00:20 +08:00
										 |  |  | 	globalLocalDrivesMu.RUnlock() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	errs := make([]error, len(localDrives)) | 
					
						
							|  |  |  | 	infos := make([]DiskInfo, len(localDrives)) | 
					
						
							|  |  |  | 	for i, drive := range localDrives { | 
					
						
							| 
									
										
										
										
											2024-01-26 04:45:46 +08:00
										 |  |  | 		infos[i], errs[i] = drive.DiskInfo(GlobalContext, DiskInfoOptions{}) | 
					
						
							| 
									
										
										
										
											2024-01-20 06:22:36 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-01-27 00:40:13 +08:00
										 |  |  | 	infoMaps := make(map[string]madmin.DiskMetrics) | 
					
						
							| 
									
										
										
										
											2024-01-20 06:22:36 +08:00
										 |  |  | 	for i := range infos { | 
					
						
							|  |  |  | 		if infos[i].Metrics.TotalWaiting >= 1 && errors.Is(errs[i], errFaultyDisk) { | 
					
						
							| 
									
										
										
										
											2024-01-27 00:40:13 +08:00
										 |  |  | 			infoMaps[infos[i].Endpoint] = madmin.DiskMetrics{ | 
					
						
							|  |  |  | 				TotalWaiting: infos[i].Metrics.TotalWaiting, | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2024-01-20 06:22:36 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return infoMaps | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | // SignalServiceHandler - signal service handler.
 | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | func (s *peerRESTServer) SignalServiceHandler(vars *grid.MSS) (np grid.NoPayload, nerr *grid.RemoteErr) { | 
					
						
							|  |  |  | 	signalString := vars.Get(peerRESTSignal) | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | 	if signalString == "" { | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 		return np, grid.NewRemoteErrString("signal name is missing") | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-08-28 02:37:47 +08:00
										 |  |  | 	si, err := strconv.Atoi(signalString) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 		return np, grid.NewRemoteErr(err) | 
					
						
							| 
									
										
										
										
											2019-08-28 02:37:47 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-06-20 22:49:22 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Wait until the specified time before executing the signal.
 | 
					
						
							|  |  |  | 	if t := vars.Get(peerRESTExecAt); t != "" { | 
					
						
							|  |  |  | 		execAt, err := time.Parse(time.RFC3339Nano, vars.Get(peerRESTExecAt)) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			logger.LogIf(GlobalContext, "signalservice", err) | 
					
						
							|  |  |  | 			execAt = time.Now().Add(restartUpdateDelay) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if d := time.Until(execAt); d > 0 { | 
					
						
							|  |  |  | 			time.Sleep(d) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-08-28 02:37:47 +08:00
										 |  |  | 	signal := serviceSignal(si) | 
					
						
							| 
									
										
										
										
											2019-08-29 06:04:43 +08:00
										 |  |  | 	switch signal { | 
					
						
							| 
									
										
										
										
											2024-01-20 06:22:36 +08:00
										 |  |  | 	case serviceRestart, serviceStop: | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 		dryRun := vars.Get("dry-run") == "true" // This is only supported for `restart/stop`
 | 
					
						
							| 
									
										
										
										
											2024-01-20 06:22:36 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-27 00:40:13 +08:00
										 |  |  | 		waitingDisks := waitingDrivesNode() | 
					
						
							| 
									
										
										
										
											2024-01-20 06:22:36 +08:00
										 |  |  | 		if len(waitingDisks) > 0 { | 
					
						
							|  |  |  | 			buf, err := json.Marshal(waitingDisks) | 
					
						
							|  |  |  | 			if err != nil { | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 				return np, grid.NewRemoteErr(err) | 
					
						
							| 
									
										
										
										
											2024-01-20 06:22:36 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 			return np, grid.NewRemoteErrString(string(buf)) | 
					
						
							| 
									
										
										
										
											2024-01-20 06:22:36 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		if !dryRun { | 
					
						
							|  |  |  | 			globalServiceSignalCh <- signal | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2021-11-24 04:02:16 +08:00
										 |  |  | 	case serviceFreeze: | 
					
						
							|  |  |  | 		freezeServices() | 
					
						
							|  |  |  | 	case serviceUnFreeze: | 
					
						
							|  |  |  | 		unfreezeServices() | 
					
						
							| 
									
										
										
										
											2020-12-05 01:32:35 +08:00
										 |  |  | 	case serviceReloadDynamic: | 
					
						
							| 
									
										
										
										
											2021-01-23 04:09:24 +08:00
										 |  |  | 		objAPI := newObjectLayerFn() | 
					
						
							|  |  |  | 		if objAPI == nil { | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 			return np, grid.NewRemoteErr(errServerNotInitialized) | 
					
						
							| 
									
										
										
										
											2021-01-23 04:09:24 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		srvCfg, err := getValidConfig(objAPI) | 
					
						
							| 
									
										
										
										
											2020-12-05 01:32:35 +08:00
										 |  |  | 		if err != nil { | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 			return np, grid.NewRemoteErr(err) | 
					
						
							| 
									
										
										
										
											2020-12-05 01:32:35 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 		subSys := vars.Get(peerRESTSubSys) | 
					
						
							| 
									
										
										
										
											2022-05-17 07:10:51 +08:00
										 |  |  | 		// Apply dynamic values.
 | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 		ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) | 
					
						
							|  |  |  | 		defer cancel() | 
					
						
							| 
									
										
										
										
											2022-05-17 07:10:51 +08:00
										 |  |  | 		if subSys == "" { | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 			err = applyDynamicConfig(ctx, objAPI, srvCfg) | 
					
						
							| 
									
										
										
										
											2022-05-17 07:10:51 +08:00
										 |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 			err = applyDynamicConfigForSubSys(ctx, objAPI, srvCfg, subSys) | 
					
						
							| 
									
										
										
										
											2022-05-17 07:10:51 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 			return np, grid.NewRemoteErr(err) | 
					
						
							| 
									
										
										
										
											2020-12-05 01:32:35 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | 	default: | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 		return np, grid.NewRemoteErr(errUnsupportedSignal) | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	return np, nil | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-31 04:49:02 +08:00
										 |  |  | // ListenHandler sends http trace messages back to peer rest client
 | 
					
						
							|  |  |  | func (s *peerRESTServer) ListenHandler(ctx context.Context, v *grid.URLValues, out chan<- *grid.Bytes) *grid.RemoteErr { | 
					
						
							|  |  |  | 	values := v.Values() | 
					
						
							|  |  |  | 	defer v.Recycle() | 
					
						
							| 
									
										
										
										
											2019-12-17 12:30:57 +08:00
										 |  |  | 	var prefix string | 
					
						
							|  |  |  | 	if len(values[peerRESTListenPrefix]) > 1 { | 
					
						
							| 
									
										
										
										
											2024-01-31 04:49:02 +08:00
										 |  |  | 		return grid.NewRemoteErrString("invalid request (peerRESTListenPrefix)") | 
					
						
							| 
									
										
										
										
											2019-12-17 12:30:57 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-01-31 04:49:02 +08:00
										 |  |  | 	globalAPIConfig.getRequestsPoolCapacity() | 
					
						
							| 
									
										
										
										
											2019-12-17 12:30:57 +08:00
										 |  |  | 	if len(values[peerRESTListenPrefix]) == 1 { | 
					
						
							|  |  |  | 		if err := event.ValidateFilterRuleValue(values[peerRESTListenPrefix][0]); err != nil { | 
					
						
							| 
									
										
										
										
											2024-01-31 04:49:02 +08:00
										 |  |  | 			return grid.NewRemoteErr(err) | 
					
						
							| 
									
										
										
										
											2019-12-17 12:30:57 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		prefix = values[peerRESTListenPrefix][0] | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var suffix string | 
					
						
							|  |  |  | 	if len(values[peerRESTListenSuffix]) > 1 { | 
					
						
							| 
									
										
										
										
											2024-01-31 04:49:02 +08:00
										 |  |  | 		return grid.NewRemoteErrString("invalid request (peerRESTListenSuffix)") | 
					
						
							| 
									
										
										
										
											2019-12-17 12:30:57 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if len(values[peerRESTListenSuffix]) == 1 { | 
					
						
							|  |  |  | 		if err := event.ValidateFilterRuleValue(values[peerRESTListenSuffix][0]); err != nil { | 
					
						
							| 
									
										
										
										
											2024-01-31 04:49:02 +08:00
										 |  |  | 			return grid.NewRemoteErr(err) | 
					
						
							| 
									
										
										
										
											2019-12-17 12:30:57 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		suffix = values[peerRESTListenSuffix][0] | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	pattern := event.NewPattern(prefix, suffix) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var eventNames []event.Name | 
					
						
							| 
									
										
										
										
											2022-07-06 05:45:49 +08:00
										 |  |  | 	var mask pubsub.Mask | 
					
						
							| 
									
										
										
										
											2019-12-17 12:30:57 +08:00
										 |  |  | 	for _, ev := range values[peerRESTListenEvents] { | 
					
						
							|  |  |  | 		eventName, err := event.ParseName(ev) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							| 
									
										
										
										
											2024-01-31 04:49:02 +08:00
										 |  |  | 			return grid.NewRemoteErr(err) | 
					
						
							| 
									
										
										
										
											2019-12-17 12:30:57 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2022-07-06 05:45:49 +08:00
										 |  |  | 		mask.MergeMaskable(eventName) | 
					
						
							| 
									
										
										
										
											2019-12-17 12:30:57 +08:00
										 |  |  | 		eventNames = append(eventNames, eventName) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	rulesMap := event.NewRulesMap(eventNames, pattern, event.TargetID{ID: mustGetUUID()}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-13 02:01:23 +08:00
										 |  |  | 	// Listen Publisher uses nonblocking publish and hence does not wait for slow subscribers.
 | 
					
						
							|  |  |  | 	// Use buffered channel to take care of burst sends or slow w.Write()
 | 
					
						
							| 
									
										
										
										
											2023-10-06 08:16:04 +08:00
										 |  |  | 	ch := make(chan event.Event, globalAPIConfig.getRequestsPoolCapacity()) | 
					
						
							| 
									
										
										
										
											2024-01-31 04:49:02 +08:00
										 |  |  | 	err := globalHTTPListen.Subscribe(mask, ch, ctx.Done(), func(ev event.Event) bool { | 
					
						
							| 
									
										
										
										
											2020-07-21 03:52:49 +08:00
										 |  |  | 		if ev.S3.Bucket.Name != "" && values.Get(peerRESTListenBucket) != "" { | 
					
						
							|  |  |  | 			if ev.S3.Bucket.Name != values.Get(peerRESTListenBucket) { | 
					
						
							|  |  |  | 				return false | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2019-12-21 03:45:03 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-04-27 21:25:05 +08:00
										 |  |  | 		return rulesMap.MatchSimple(ev.EventName, ev.S3.Object.Key) | 
					
						
							| 
									
										
										
										
											2022-07-06 05:45:49 +08:00
										 |  |  | 	}) | 
					
						
							| 
									
										
										
										
											2022-06-06 05:29:12 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2024-01-31 04:49:02 +08:00
										 |  |  | 		return grid.NewRemoteErr(err) | 
					
						
							| 
									
										
										
										
											2022-06-06 05:29:12 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-12-13 02:01:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-31 04:49:02 +08:00
										 |  |  | 	// Process until remote disconnects.
 | 
					
						
							|  |  |  | 	// Blocks on upstream (out) congestion.
 | 
					
						
							|  |  |  | 	// We have however a dynamic downstream buffer (ch).
 | 
					
						
							|  |  |  | 	buf := bytes.NewBuffer(grid.GetByteBuffer()) | 
					
						
							|  |  |  | 	enc := json.NewEncoder(buf) | 
					
						
							|  |  |  | 	tmpEvt := struct{ Records []event.Event }{[]event.Event{{}}} | 
					
						
							| 
									
										
										
										
											2019-12-13 02:01:23 +08:00
										 |  |  | 	for { | 
					
						
							|  |  |  | 		select { | 
					
						
							| 
									
										
										
										
											2024-01-31 04:49:02 +08:00
										 |  |  | 		case <-ctx.Done(): | 
					
						
							|  |  |  | 			grid.PutByteBuffer(buf.Bytes()) | 
					
						
							|  |  |  | 			return nil | 
					
						
							| 
									
										
										
										
											2019-12-13 02:01:23 +08:00
										 |  |  | 		case ev := <-ch: | 
					
						
							| 
									
										
										
										
											2024-01-31 04:49:02 +08:00
										 |  |  | 			buf.Reset() | 
					
						
							|  |  |  | 			tmpEvt.Records[0] = ev | 
					
						
							|  |  |  | 			if err := enc.Encode(tmpEvt); err != nil { | 
					
						
							| 
									
										
										
										
											2024-04-04 20:04:40 +08:00
										 |  |  | 				peersLogOnceIf(ctx, err, "event: Encode failed") | 
					
						
							| 
									
										
										
										
											2024-01-31 04:49:02 +08:00
										 |  |  | 				continue | 
					
						
							| 
									
										
										
										
											2019-12-13 02:01:23 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2024-02-02 04:41:20 +08:00
										 |  |  | 			out <- grid.NewBytesWithCopyOf(buf.Bytes()) | 
					
						
							| 
									
										
										
										
											2019-12-13 02:01:23 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-09 06:54:41 +08:00
										 |  |  | // TraceHandler sends http trace messages back to peer rest client
 | 
					
						
							| 
									
										
										
										
											2024-01-31 04:49:02 +08:00
										 |  |  | func (s *peerRESTServer) TraceHandler(ctx context.Context, payload []byte, _ <-chan []byte, out chan<- []byte) *grid.RemoteErr { | 
					
						
							| 
									
										
										
										
											2022-07-06 05:45:49 +08:00
										 |  |  | 	var traceOpts madmin.ServiceTraceOpts | 
					
						
							| 
									
										
										
										
											2024-01-31 04:49:02 +08:00
										 |  |  | 	err := json.Unmarshal(payload, &traceOpts) | 
					
						
							| 
									
										
										
										
											2021-03-27 14:24:07 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2024-01-31 04:49:02 +08:00
										 |  |  | 		return grid.NewRemoteErr(err) | 
					
						
							| 
									
										
										
										
											2021-03-27 14:24:07 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-02-07 00:57:30 +08:00
										 |  |  | 	var wg sync.WaitGroup | 
					
						
							| 
									
										
										
										
											2019-06-09 06:54:41 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-27 13:41:12 +08:00
										 |  |  | 	// Trace Publisher uses nonblocking publish and hence does not wait for slow subscribers.
 | 
					
						
							|  |  |  | 	// Use buffered channel to take care of burst sends or slow w.Write()
 | 
					
						
							| 
									
										
										
										
											2024-01-31 04:49:02 +08:00
										 |  |  | 	err = globalTrace.SubscribeJSON(traceOpts.TraceTypes(), out, ctx.Done(), func(entry madmin.TraceInfo) bool { | 
					
						
							| 
									
										
										
										
											2022-10-29 01:55:42 +08:00
										 |  |  | 		return shouldTrace(entry, traceOpts) | 
					
						
							| 
									
										
										
										
											2024-02-07 00:57:30 +08:00
										 |  |  | 	}, &wg) | 
					
						
							| 
									
										
										
										
											2022-06-06 05:29:12 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2024-01-31 04:49:02 +08:00
										 |  |  | 		return grid.NewRemoteErr(err) | 
					
						
							| 
									
										
										
										
											2022-06-06 05:29:12 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2023-03-18 07:01:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Publish bootstrap events that have already occurred before client could subscribe.
 | 
					
						
							|  |  |  | 	if traceOpts.TraceTypes().Contains(madmin.TraceBootstrap) { | 
					
						
							| 
									
										
										
										
											2024-01-31 04:49:02 +08:00
										 |  |  | 		go globalBootstrapTracer.Publish(ctx, globalTrace) | 
					
						
							| 
									
										
										
										
											2019-06-09 06:54:41 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-02-07 00:57:30 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Wait for remote to cancel and SubscribeJSON to exit.
 | 
					
						
							|  |  |  | 	wg.Wait() | 
					
						
							| 
									
										
										
										
											2024-01-31 04:49:02 +08:00
										 |  |  | 	return nil | 
					
						
							| 
									
										
										
										
											2019-06-09 06:54:41 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | func (s *peerRESTServer) BackgroundHealStatusHandler(_ *grid.MSS) (*grid.JSON[madmin.BgHealState], *grid.RemoteErr) { | 
					
						
							|  |  |  | 	state, ok := getLocalBackgroundHealStatus(context.Background(), newObjectLayerFn()) | 
					
						
							| 
									
										
										
										
											2020-08-08 10:43:06 +08:00
										 |  |  | 	if !ok { | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 		return nil, grid.NewRemoteErr(errServerNotInitialized) | 
					
						
							| 
									
										
										
										
											2020-08-08 10:43:06 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	return madminBgHealState.NewJSONWith(&state), nil | 
					
						
							| 
									
										
										
										
											2019-06-26 07:42:24 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | // ReloadSiteReplicationConfigHandler - reloads site replication configuration from the disks
 | 
					
						
							|  |  |  | func (s *peerRESTServer) ReloadSiteReplicationConfigHandler(mss *grid.MSS) (np grid.NoPayload, nerr *grid.RemoteErr) { | 
					
						
							|  |  |  | 	objAPI := newObjectLayerFn() | 
					
						
							|  |  |  | 	if objAPI == nil { | 
					
						
							|  |  |  | 		return np, grid.NewRemoteErr(errServerNotInitialized) | 
					
						
							| 
									
										
										
										
											2022-01-11 01:07:49 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-04 20:04:40 +08:00
										 |  |  | 	peersLogIf(context.Background(), globalSiteReplicationSys.Init(context.Background(), objAPI)) | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 	return | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (s *peerRESTServer) ReloadPoolMetaHandler(mss *grid.MSS) (np grid.NoPayload, nerr *grid.RemoteErr) { | 
					
						
							| 
									
										
										
										
											2022-01-11 01:07:49 +08:00
										 |  |  | 	objAPI := newObjectLayerFn() | 
					
						
							|  |  |  | 	if objAPI == nil { | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 		return np, grid.NewRemoteErr(errServerNotInitialized) | 
					
						
							| 
									
										
										
										
											2022-01-11 01:07:49 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	pools, ok := objAPI.(*erasureServerPools) | 
					
						
							|  |  |  | 	if !ok { | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if err := pools.ReloadPoolMeta(context.Background()); err != nil { | 
					
						
							|  |  |  | 		return np, grid.NewRemoteErr(err) | 
					
						
							| 
									
										
										
										
											2022-01-11 01:07:49 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return | 
					
						
							| 
									
										
										
										
											2022-01-11 01:07:49 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-10 00:58:30 +08:00
										 |  |  | func (s *peerRESTServer) HandlerClearUploadID(mss *grid.MSS) (np grid.NoPayload, nerr *grid.RemoteErr) { | 
					
						
							|  |  |  | 	objAPI := newObjectLayerFn() | 
					
						
							|  |  |  | 	if objAPI == nil { | 
					
						
							|  |  |  | 		return np, grid.NewRemoteErr(errServerNotInitialized) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	pools, ok := objAPI.(*erasureServerPools) | 
					
						
							|  |  |  | 	if !ok { | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// No need to return errors, this is not a highly strict operation.
 | 
					
						
							|  |  |  | 	uploadID := mss.Get(peerRESTUploadID) | 
					
						
							|  |  |  | 	if uploadID != "" { | 
					
						
							|  |  |  | 		pools.ClearUploadID(uploadID) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | func (s *peerRESTServer) StopRebalanceHandler(mss *grid.MSS) (np grid.NoPayload, nerr *grid.RemoteErr) { | 
					
						
							| 
									
										
										
										
											2022-10-26 03:36:57 +08:00
										 |  |  | 	objAPI := newObjectLayerFn() | 
					
						
							|  |  |  | 	if objAPI == nil { | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 		return np, grid.NewRemoteErr(errServerNotInitialized) | 
					
						
							| 
									
										
										
										
											2022-10-26 03:36:57 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-26 03:36:57 +08:00
										 |  |  | 	pools, ok := objAPI.(*erasureServerPools) | 
					
						
							|  |  |  | 	if !ok { | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 		return np, grid.NewRemoteErr(errors.New("not a pooled setup")) | 
					
						
							| 
									
										
										
										
											2022-10-26 03:36:57 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	pools.StopRebalance() | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 	return | 
					
						
							| 
									
										
										
										
											2022-10-26 03:36:57 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | func (s *peerRESTServer) LoadRebalanceMetaHandler(mss *grid.MSS) (np grid.NoPayload, nerr *grid.RemoteErr) { | 
					
						
							| 
									
										
										
										
											2022-10-26 03:36:57 +08:00
										 |  |  | 	objAPI := newObjectLayerFn() | 
					
						
							|  |  |  | 	if objAPI == nil { | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 		return np, grid.NewRemoteErr(errServerNotInitialized) | 
					
						
							| 
									
										
										
										
											2022-10-26 03:36:57 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	pools, ok := objAPI.(*erasureServerPools) | 
					
						
							|  |  |  | 	if !ok { | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 		return np, grid.NewRemoteErr(errors.New("not a pooled setup")) | 
					
						
							| 
									
										
										
										
											2022-10-26 03:36:57 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 	startRebalance, err := strconv.ParseBool(mss.Get(peerRESTStartRebalance)) | 
					
						
							| 
									
										
										
										
											2022-10-26 03:36:57 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 		return np, grid.NewRemoteErr(err) | 
					
						
							| 
									
										
										
										
											2022-10-26 03:36:57 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 	if err := pools.loadRebalanceMeta(context.Background()); err != nil { | 
					
						
							|  |  |  | 		return np, grid.NewRemoteErr(err) | 
					
						
							| 
									
										
										
										
											2022-10-26 03:36:57 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-26 03:36:57 +08:00
										 |  |  | 	if startRebalance { | 
					
						
							|  |  |  | 		go pools.StartRebalance() | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return | 
					
						
							| 
									
										
										
										
											2022-10-26 03:36:57 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | func (s *peerRESTServer) LoadTransitionTierConfigHandler(mss *grid.MSS) (np grid.NoPayload, nerr *grid.RemoteErr) { | 
					
						
							|  |  |  | 	objAPI := newObjectLayerFn() | 
					
						
							|  |  |  | 	if objAPI == nil { | 
					
						
							|  |  |  | 		return np, grid.NewRemoteErr(errServerNotInitialized) | 
					
						
							| 
									
										
										
										
											2021-04-20 01:30:42 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-20 01:30:42 +08:00
										 |  |  | 	go func() { | 
					
						
							|  |  |  | 		err := globalTierConfigMgr.Reload(context.Background(), newObjectLayerFn()) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							| 
									
										
										
										
											2024-04-04 20:04:40 +08:00
										 |  |  | 			peersLogIf(context.Background(), fmt.Errorf("Failed to reload remote tier config %s", err)) | 
					
						
							| 
									
										
										
										
											2021-04-20 01:30:42 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	}() | 
					
						
							| 
									
										
										
										
											2024-02-02 02:47:20 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return | 
					
						
							| 
									
										
										
										
											2021-04-20 01:30:42 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-04 02:10:48 +08:00
										 |  |  | // ConsoleLogHandler sends console logs of this node back to peer rest client
 | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | func (s *peerRESTServer) ConsoleLogHandler(ctx context.Context, params *grid.MSS, out chan<- *grid.Bytes) *grid.RemoteErr { | 
					
						
							|  |  |  | 	mask, err := strconv.Atoi(params.Get(peerRESTLogMask)) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		mask = int(madmin.LogMaskAll) | 
					
						
							| 
									
										
										
										
											2019-09-04 02:10:48 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	ch := make(chan log.Info, 1000) | 
					
						
							|  |  |  | 	err = globalConsoleSys.Subscribe(ch, ctx.Done(), "", 0, madmin.LogMask(mask), nil) | 
					
						
							| 
									
										
										
										
											2022-06-06 05:29:12 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 		return grid.NewRemoteErr(err) | 
					
						
							| 
									
										
										
										
											2022-06-06 05:29:12 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	var buf bytes.Buffer | 
					
						
							|  |  |  | 	enc := json.NewEncoder(&buf) | 
					
						
							| 
									
										
										
										
											2019-09-04 02:10:48 +08:00
										 |  |  | 	for { | 
					
						
							|  |  |  | 		select { | 
					
						
							| 
									
										
										
										
											2022-11-08 02:38:08 +08:00
										 |  |  | 		case entry, ok := <-ch: | 
					
						
							|  |  |  | 			if !ok { | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 				return grid.NewRemoteErrString("console log channel closed") | 
					
						
							| 
									
										
										
										
											2019-09-04 02:10:48 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 			if !entry.SendLog("", madmin.LogMask(mask)) { | 
					
						
							|  |  |  | 				continue | 
					
						
							| 
									
										
										
										
											2022-10-29 01:55:42 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 			buf.Reset() | 
					
						
							|  |  |  | 			if err := enc.Encode(entry); err != nil { | 
					
						
							|  |  |  | 				return grid.NewRemoteErr(err) | 
					
						
							| 
									
										
										
										
											2022-05-07 03:39:58 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 			out <- grid.NewBytesWithCopyOf(buf.Bytes()) | 
					
						
							|  |  |  | 		case <-ctx.Done(): | 
					
						
							|  |  |  | 			return grid.NewRemoteErr(ctx.Err()) | 
					
						
							| 
									
										
										
										
											2019-09-04 02:10:48 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | func (s *peerRESTServer) writeErrorResponse(w http.ResponseWriter, err error) { | 
					
						
							|  |  |  | 	w.WriteHeader(http.StatusForbidden) | 
					
						
							|  |  |  | 	w.Write([]byte(err.Error())) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // IsValid - To authenticate and verify the time difference.
 | 
					
						
							|  |  |  | func (s *peerRESTServer) IsValid(w http.ResponseWriter, r *http.Request) bool { | 
					
						
							|  |  |  | 	if err := storageServerRequestValidate(r); err != nil { | 
					
						
							|  |  |  | 		s.writeErrorResponse(w, err) | 
					
						
							|  |  |  | 		return false | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return true | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-10 11:36:00 +08:00
										 |  |  | // GetBandwidth gets the bandwidth for the buckets requested.
 | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | func (s *peerRESTServer) GetBandwidth(params *grid.URLValues) (*bandwidth.BucketBandwidthReport, *grid.RemoteErr) { | 
					
						
							|  |  |  | 	buckets := params.Values().Get("buckets") | 
					
						
							|  |  |  | 	selectBuckets := b.SelectBuckets(buckets) | 
					
						
							|  |  |  | 	return globalBucketMonitor.GetReport(selectBuckets), nil | 
					
						
							| 
									
										
										
										
											2020-10-10 11:36:00 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-10 17:15:15 +08:00
										 |  |  | func (s *peerRESTServer) GetResourceMetrics(_ *grid.MSS) (*grid.Array[*MetricV2], *grid.RemoteErr) { | 
					
						
							|  |  |  | 	res := make([]*MetricV2, 0, len(resourceMetricsGroups)) | 
					
						
							|  |  |  | 	populateAndPublish(resourceMetricsGroups, func(m MetricV2) bool { | 
					
						
							| 
									
										
										
										
											2024-02-25 16:51:38 +08:00
										 |  |  | 		if m.VariableLabels == nil { | 
					
						
							|  |  |  | 			m.VariableLabels = make(map[string]string, 1) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		m.VariableLabels[serverName] = globalLocalNodeName | 
					
						
							|  |  |  | 		res = append(res, &m) | 
					
						
							|  |  |  | 		return true | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	return aoMetricsGroup.NewWith(res), nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-19 12:35:38 +08:00
										 |  |  | // GetPeerMetrics gets the metrics to be federated across peers.
 | 
					
						
							| 
									
										
										
										
											2024-03-10 17:15:15 +08:00
										 |  |  | func (s *peerRESTServer) GetPeerMetrics(_ *grid.MSS) (*grid.Array[*MetricV2], *grid.RemoteErr) { | 
					
						
							|  |  |  | 	res := make([]*MetricV2, 0, len(peerMetricsGroups)) | 
					
						
							|  |  |  | 	populateAndPublish(peerMetricsGroups, func(m MetricV2) bool { | 
					
						
							| 
									
										
										
										
											2024-02-22 04:27:35 +08:00
										 |  |  | 		if m.VariableLabels == nil { | 
					
						
							|  |  |  | 			m.VariableLabels = make(map[string]string, 1) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		m.VariableLabels[serverName] = globalLocalNodeName | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 		res = append(res, &m) | 
					
						
							| 
									
										
										
										
											2024-02-22 04:27:35 +08:00
										 |  |  | 		return true | 
					
						
							|  |  |  | 	}) | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	return aoMetricsGroup.NewWith(res), nil | 
					
						
							| 
									
										
										
										
											2021-01-19 12:35:38 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-19 13:25:12 +08:00
										 |  |  | // GetPeerBucketMetrics gets the metrics to be federated across peers.
 | 
					
						
							| 
									
										
										
										
											2024-03-10 17:15:15 +08:00
										 |  |  | func (s *peerRESTServer) GetPeerBucketMetrics(_ *grid.MSS) (*grid.Array[*MetricV2], *grid.RemoteErr) { | 
					
						
							|  |  |  | 	res := make([]*MetricV2, 0, len(bucketPeerMetricsGroups)) | 
					
						
							|  |  |  | 	populateAndPublish(bucketPeerMetricsGroups, func(m MetricV2) bool { | 
					
						
							| 
									
										
										
										
											2024-02-22 04:27:35 +08:00
										 |  |  | 		if m.VariableLabels == nil { | 
					
						
							|  |  |  | 			m.VariableLabels = make(map[string]string, 1) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		m.VariableLabels[serverName] = globalLocalNodeName | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 		res = append(res, &m) | 
					
						
							| 
									
										
										
										
											2024-02-22 04:27:35 +08:00
										 |  |  | 		return true | 
					
						
							|  |  |  | 	}) | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	return aoMetricsGroup.NewWith(res), nil | 
					
						
							| 
									
										
										
										
											2023-07-19 13:25:12 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-13 01:12:47 +08:00
										 |  |  | func (s *peerRESTServer) SpeedTestHandler(w http.ResponseWriter, r *http.Request) { | 
					
						
							| 
									
										
										
										
											2021-07-28 03:55:56 +08:00
										 |  |  | 	if !s.IsValid(w, r) { | 
					
						
							|  |  |  | 		s.writeErrorResponse(w, errors.New("invalid request")) | 
					
						
							| 
									
										
										
										
											2021-11-24 04:02:16 +08:00
										 |  |  | 		return | 
					
						
							| 
									
										
										
										
											2021-07-28 03:55:56 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	objAPI := newObjectLayerFn() | 
					
						
							|  |  |  | 	if objAPI == nil { | 
					
						
							|  |  |  | 		s.writeErrorResponse(w, errServerNotInitialized) | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-08 13:43:01 +08:00
										 |  |  | 	sizeStr := r.Form.Get(peerRESTSize) | 
					
						
							|  |  |  | 	durationStr := r.Form.Get(peerRESTDuration) | 
					
						
							|  |  |  | 	concurrentStr := r.Form.Get(peerRESTConcurrent) | 
					
						
							| 
									
										
										
										
											2021-11-30 01:05:46 +08:00
										 |  |  | 	storageClass := r.Form.Get(peerRESTStorageClass) | 
					
						
							| 
									
										
										
										
											2022-07-13 01:12:47 +08:00
										 |  |  | 	bucketName := r.Form.Get(peerRESTBucket) | 
					
						
							| 
									
										
										
										
											2023-12-30 15:56:50 +08:00
										 |  |  | 	enableSha256 := r.Form.Get(peerRESTEnableSha256) == "true" | 
					
						
							| 
									
										
										
										
											2024-05-06 17:45:10 +08:00
										 |  |  | 	enableMultipart := r.Form.Get(peerRESTEnableMultipart) == "true" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	u, ok := globalIAMSys.GetUser(r.Context(), r.Form.Get(peerRESTAccessKey)) | 
					
						
							|  |  |  | 	if !ok { | 
					
						
							|  |  |  | 		s.writeErrorResponse(w, errAuthentication) | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-07-28 03:55:56 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	size, err := strconv.Atoi(sizeStr) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		size = 64 * humanize.MiByte | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	concurrent, err := strconv.Atoi(concurrentStr) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		concurrent = 32 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	duration, err := time.ParseDuration(durationStr) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		duration = time.Second * 10 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-01 05:08:23 +08:00
										 |  |  | 	done := keepHTTPResponseAlive(w) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-13 01:12:47 +08:00
										 |  |  | 	result, err := selfSpeedTest(r.Context(), speedTestOpts{ | 
					
						
							| 
									
										
										
										
											2024-05-06 17:45:10 +08:00
										 |  |  | 		objectSize:      size, | 
					
						
							|  |  |  | 		concurrency:     concurrent, | 
					
						
							|  |  |  | 		duration:        duration, | 
					
						
							|  |  |  | 		storageClass:    storageClass, | 
					
						
							|  |  |  | 		bucketName:      bucketName, | 
					
						
							|  |  |  | 		enableSha256:    enableSha256, | 
					
						
							|  |  |  | 		enableMultipart: enableMultipart, | 
					
						
							|  |  |  | 		creds:           u.Credentials, | 
					
						
							| 
									
										
										
										
											2022-07-13 01:12:47 +08:00
										 |  |  | 	}) | 
					
						
							| 
									
										
										
										
											2021-07-28 03:55:56 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2021-09-01 05:08:23 +08:00
										 |  |  | 		result.Error = err.Error() | 
					
						
							| 
									
										
										
										
											2021-07-28 03:55:56 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-01 05:08:23 +08:00
										 |  |  | 	done(nil) | 
					
						
							| 
									
										
										
										
											2024-04-04 20:04:40 +08:00
										 |  |  | 	peersLogIf(r.Context(), gob.NewEncoder(w).Encode(result)) | 
					
						
							| 
									
										
										
										
											2021-07-28 03:55:56 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-27 06:33:10 +08:00
										 |  |  | // GetLastDayTierStatsHandler - returns per-tier stats in the last 24hrs for this server
 | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | func (s *peerRESTServer) GetLastDayTierStatsHandler(_ *grid.MSS) (*DailyAllTierStats, *grid.RemoteErr) { | 
					
						
							| 
									
										
										
										
											2022-01-27 06:33:10 +08:00
										 |  |  | 	if objAPI := newObjectLayerFn(); objAPI == nil || globalTransitionState == nil { | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 		return nil, grid.NewRemoteErr(errServerNotInitialized) | 
					
						
							| 
									
										
										
										
											2022-01-27 06:33:10 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	result := globalTransitionState.getDailyAllTierStats() | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	return &result, nil | 
					
						
							| 
									
										
										
										
											2022-01-27 06:33:10 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-02 14:38:05 +08:00
										 |  |  | func (s *peerRESTServer) DriveSpeedTestHandler(w http.ResponseWriter, r *http.Request) { | 
					
						
							|  |  |  | 	if !s.IsValid(w, r) { | 
					
						
							|  |  |  | 		s.writeErrorResponse(w, errors.New("invalid request")) | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	objAPI := newObjectLayerFn() | 
					
						
							|  |  |  | 	if objAPI == nil { | 
					
						
							|  |  |  | 		s.writeErrorResponse(w, errServerNotInitialized) | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	serial := r.Form.Get("serial") == "true" | 
					
						
							|  |  |  | 	blockSizeStr := r.Form.Get("blocksize") | 
					
						
							|  |  |  | 	fileSizeStr := r.Form.Get("filesize") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	blockSize, err := strconv.ParseUint(blockSizeStr, 10, 64) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		blockSize = 4 * humanize.MiByte // default value
 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	fileSize, err := strconv.ParseUint(fileSizeStr, 10, 64) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		fileSize = 1 * humanize.GiByte // default value
 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	opts := madmin.DriveSpeedTestOpts{ | 
					
						
							|  |  |  | 		Serial:    serial, | 
					
						
							|  |  |  | 		BlockSize: blockSize, | 
					
						
							|  |  |  | 		FileSize:  fileSize, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	done := keepHTTPResponseAlive(w) | 
					
						
							|  |  |  | 	result := driveSpeedTest(r.Context(), opts) | 
					
						
							|  |  |  | 	done(nil) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-04 20:04:40 +08:00
										 |  |  | 	peersLogIf(r.Context(), gob.NewEncoder(w).Encode(result)) | 
					
						
							| 
									
										
										
										
											2022-02-02 14:38:05 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 14:51:33 +08:00
										 |  |  | // GetReplicationMRFHandler - returns replication MRF for bucket
 | 
					
						
							|  |  |  | func (s *peerRESTServer) GetReplicationMRFHandler(w http.ResponseWriter, r *http.Request) { | 
					
						
							|  |  |  | 	if !s.IsValid(w, r) { | 
					
						
							|  |  |  | 		s.writeErrorResponse(w, errors.New("invalid request")) | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	vars := mux.Vars(r) | 
					
						
							|  |  |  | 	bucketName := vars[peerRESTBucket] | 
					
						
							|  |  |  | 	ctx := newContext(r, w, "GetReplicationMRF") | 
					
						
							| 
									
										
										
										
											2024-08-15 20:04:40 +08:00
										 |  |  | 	re, err := globalReplicationPool.Get().getMRF(ctx, bucketName) | 
					
						
							| 
									
										
										
										
											2023-07-13 14:51:33 +08:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		s.writeErrorResponse(w, err) | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	enc := gob.NewEncoder(w) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for m := range re { | 
					
						
							|  |  |  | 		if err := enc.Encode(m); err != nil { | 
					
						
							|  |  |  | 			s.writeErrorResponse(w, errors.New("Encoding mrf failed: "+err.Error())) | 
					
						
							|  |  |  | 			return | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-09 01:54:38 +08:00
										 |  |  | // DevNull - everything goes to io.Discard
 | 
					
						
							|  |  |  | func (s *peerRESTServer) DevNull(w http.ResponseWriter, r *http.Request) { | 
					
						
							|  |  |  | 	if !s.IsValid(w, r) { | 
					
						
							|  |  |  | 		s.writeErrorResponse(w, errors.New("invalid request")) | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	globalNetPerfRX.Connect() | 
					
						
							|  |  |  | 	defer globalNetPerfRX.Disconnect() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	connectTime := time.Now() | 
					
						
							|  |  |  | 	ctx := newContext(r, w, "DevNull") | 
					
						
							|  |  |  | 	for { | 
					
						
							| 
									
										
										
										
											2023-11-07 06:26:08 +08:00
										 |  |  | 		n, err := io.CopyN(xioutil.Discard, r.Body, 128*humanize.KiByte) | 
					
						
							| 
									
										
										
										
											2022-03-09 01:54:38 +08:00
										 |  |  | 		atomic.AddUint64(&globalNetPerfRX.RX, uint64(n)) | 
					
						
							|  |  |  | 		if err != nil && err != io.EOF { | 
					
						
							|  |  |  | 			// If there is a disconnection before globalNetPerfMinDuration (we give a margin of error of 1 sec)
 | 
					
						
							|  |  |  | 			// would mean the network is not stable. Logging here will help in debugging network issues.
 | 
					
						
							|  |  |  | 			if time.Since(connectTime) < (globalNetPerfMinDuration - time.Second) { | 
					
						
							| 
									
										
										
										
											2024-04-04 20:04:40 +08:00
										 |  |  | 				peersLogIf(ctx, err) | 
					
						
							| 
									
										
										
										
											2022-03-09 01:54:38 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			break | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-16 05:51:42 +08:00
										 |  |  | // NetSpeedTestHandlers - perform network speedtest
 | 
					
						
							|  |  |  | func (s *peerRESTServer) NetSpeedTestHandler(w http.ResponseWriter, r *http.Request) { | 
					
						
							| 
									
										
										
										
											2022-03-09 01:54:38 +08:00
										 |  |  | 	if !s.IsValid(w, r) { | 
					
						
							|  |  |  | 		s.writeErrorResponse(w, errors.New("invalid request")) | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	durationStr := r.Form.Get(peerRESTDuration) | 
					
						
							|  |  |  | 	duration, err := time.ParseDuration(durationStr) | 
					
						
							|  |  |  | 	if err != nil || duration.Seconds() == 0 { | 
					
						
							|  |  |  | 		duration = time.Second * 10 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	result := netperf(r.Context(), duration.Round(time.Second)) | 
					
						
							| 
									
										
										
										
											2024-04-04 20:04:40 +08:00
										 |  |  | 	peersLogIf(r.Context(), gob.NewEncoder(w).Encode(result)) | 
					
						
							| 
									
										
										
										
											2022-03-09 01:54:38 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-04 07:12:25 +08:00
										 |  |  | func (s *peerRESTServer) HealBucketHandler(mss *grid.MSS) (np *grid.JSON[madmin.HealResultItem], nerr *grid.RemoteErr) { | 
					
						
							| 
									
										
										
										
											2024-02-03 06:54:54 +08:00
										 |  |  | 	bucket := mss.Get(peerS3Bucket) | 
					
						
							|  |  |  | 	if isMinioMetaBucket(bucket) { | 
					
						
							|  |  |  | 		return np, grid.NewRemoteErr(errInvalidArgument) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	bucketDeleted := mss.Get(peerS3BucketDeleted) == "true" | 
					
						
							| 
									
										
										
										
											2024-12-04 07:12:25 +08:00
										 |  |  | 	res, err := healBucketLocal(context.Background(), bucket, madmin.HealOpts{ | 
					
						
							| 
									
										
										
										
											2024-02-03 06:54:54 +08:00
										 |  |  | 		Remove: bucketDeleted, | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return np, grid.NewRemoteErr(err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-04 07:12:25 +08:00
										 |  |  | 	return madminHealResultItem.NewJSONWith(&res), nil | 
					
						
							| 
									
										
										
										
											2024-02-03 06:54:54 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-09 03:08:18 +08:00
										 |  |  | func (s *peerRESTServer) ListBucketsHandler(opts *BucketOptions) (*grid.Array[*BucketInfo], *grid.RemoteErr) { | 
					
						
							|  |  |  | 	buckets, err := listBucketsLocal(context.Background(), *opts) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, grid.NewRemoteErr(err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	res := aoBucketInfo.New() | 
					
						
							|  |  |  | 	for i := range buckets { | 
					
						
							|  |  |  | 		bucket := buckets[i] | 
					
						
							|  |  |  | 		res.Append(&bucket) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return res, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // HeadBucketHandler implements peer BucketInfo call, returns bucket create date.
 | 
					
						
							| 
									
										
										
										
											2024-02-03 06:54:54 +08:00
										 |  |  | func (s *peerRESTServer) HeadBucketHandler(mss *grid.MSS) (info *VolInfo, nerr *grid.RemoteErr) { | 
					
						
							|  |  |  | 	bucket := mss.Get(peerS3Bucket) | 
					
						
							|  |  |  | 	if isMinioMetaBucket(bucket) { | 
					
						
							|  |  |  | 		return info, grid.NewRemoteErr(errInvalidArgument) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	bucketDeleted := mss.Get(peerS3BucketDeleted) == "true" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	bucketInfo, err := getBucketInfoLocal(context.Background(), bucket, BucketOptions{ | 
					
						
							|  |  |  | 		Deleted: bucketDeleted, | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return info, grid.NewRemoteErr(err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return &VolInfo{ | 
					
						
							|  |  |  | 		Name:    bucketInfo.Name, | 
					
						
							|  |  |  | 		Created: bucketInfo.Created, | 
					
						
							|  |  |  | 	}, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // DeleteBucketHandler implements peer delete bucket call.
 | 
					
						
							|  |  |  | func (s *peerRESTServer) DeleteBucketHandler(mss *grid.MSS) (np grid.NoPayload, nerr *grid.RemoteErr) { | 
					
						
							|  |  |  | 	bucket := mss.Get(peerS3Bucket) | 
					
						
							|  |  |  | 	if isMinioMetaBucket(bucket) { | 
					
						
							|  |  |  | 		return np, grid.NewRemoteErr(errInvalidArgument) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	forceDelete := mss.Get(peerS3BucketForceDelete) == "true" | 
					
						
							|  |  |  | 	err := deleteBucketLocal(context.Background(), bucket, DeleteBucketOptions{ | 
					
						
							|  |  |  | 		Force: forceDelete, | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return np, grid.NewRemoteErr(err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return np, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // MakeBucketHandler implements peer create bucket call.
 | 
					
						
							|  |  |  | func (s *peerRESTServer) MakeBucketHandler(mss *grid.MSS) (np grid.NoPayload, nerr *grid.RemoteErr) { | 
					
						
							|  |  |  | 	bucket := mss.Get(peerS3Bucket) | 
					
						
							|  |  |  | 	if isMinioMetaBucket(bucket) { | 
					
						
							|  |  |  | 		return np, grid.NewRemoteErr(errInvalidArgument) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	forceCreate := mss.Get(peerS3BucketForceCreate) == "true" | 
					
						
							|  |  |  | 	err := makeBucketLocal(context.Background(), bucket, MakeBucketOptions{ | 
					
						
							|  |  |  | 		ForceCreate: forceCreate, | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return np, grid.NewRemoteErr(err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return np, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | // registerPeerRESTHandlers - register peer rest router.
 | 
					
						
							| 
									
										
										
										
											2024-01-31 04:49:02 +08:00
										 |  |  | func registerPeerRESTHandlers(router *mux.Router, gm *grid.Manager) { | 
					
						
							| 
									
										
										
										
											2023-07-08 22:35:11 +08:00
										 |  |  | 	h := func(f http.HandlerFunc) http.HandlerFunc { | 
					
						
							|  |  |  | 		return collectInternodeStats(httpTraceHdrs(f)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | 	server := &peerRESTServer{} | 
					
						
							| 
									
										
										
										
											2019-11-05 01:30:59 +08:00
										 |  |  | 	subrouter := router.PathPrefix(peerRESTPrefix).Subrouter() | 
					
						
							| 
									
										
										
										
											2023-07-08 22:35:11 +08:00
										 |  |  | 	subrouter.Methods(http.MethodPost).Path(peerRESTVersionPrefix + peerRESTMethodHealth).HandlerFunc(h(server.HealthHandler)) | 
					
						
							| 
									
										
										
										
											2024-01-20 10:27:58 +08:00
										 |  |  | 	subrouter.Methods(http.MethodPost).Path(peerRESTVersionPrefix + peerRESTMethodVerifyBinary).HandlerFunc(h(server.VerifyBinaryHandler)).Queries(restQueries(peerRESTURL, peerRESTSha256Sum, peerRESTReleaseInfo)...) | 
					
						
							| 
									
										
										
										
											2023-07-08 22:35:11 +08:00
										 |  |  | 	subrouter.Methods(http.MethodPost).Path(peerRESTVersionPrefix + peerRESTMethodCommitBinary).HandlerFunc(h(server.CommitBinaryHandler)) | 
					
						
							| 
									
										
										
										
											2023-07-13 14:51:33 +08:00
										 |  |  | 	subrouter.Methods(http.MethodPost).Path(peerRESTVersionPrefix + peerRESTMethodGetReplicationMRF).HandlerFunc(httpTraceHdrs(server.GetReplicationMRFHandler)).Queries(restQueries(peerRESTBucket)...) | 
					
						
							| 
									
										
										
										
											2023-07-08 22:35:11 +08:00
										 |  |  | 	subrouter.Methods(http.MethodPost).Path(peerRESTVersionPrefix + peerRESTMethodStartProfiling).HandlerFunc(h(server.StartProfilingHandler)).Queries(restQueries(peerRESTProfiler)...) | 
					
						
							|  |  |  | 	subrouter.Methods(http.MethodPost).Path(peerRESTVersionPrefix + peerRESTMethodDownloadProfilingData).HandlerFunc(h(server.DownloadProfilingDataHandler)) | 
					
						
							|  |  |  | 	subrouter.Methods(http.MethodPost).Path(peerRESTVersionPrefix + peerRESTMethodSpeedTest).HandlerFunc(h(server.SpeedTestHandler)) | 
					
						
							|  |  |  | 	subrouter.Methods(http.MethodPost).Path(peerRESTVersionPrefix + peerRESTMethodDriveSpeedTest).HandlerFunc(h(server.DriveSpeedTestHandler)) | 
					
						
							|  |  |  | 	subrouter.Methods(http.MethodPost).Path(peerRESTVersionPrefix + peerRESTMethodNetperf).HandlerFunc(h(server.NetSpeedTestHandler)) | 
					
						
							|  |  |  | 	subrouter.Methods(http.MethodPost).Path(peerRESTVersionPrefix + peerRESTMethodDevNull).HandlerFunc(h(server.DevNull)) | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	logger.FatalIf(consoleLogRPC.RegisterNoInput(gm, server.ConsoleLogHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(deleteBucketMetadataRPC.Register(gm, server.DeleteBucketMetadataHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(deleteBucketRPC.Register(gm, server.DeleteBucketHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(deletePolicyRPC.Register(gm, server.DeletePolicyHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(deleteSvcActRPC.Register(gm, server.DeleteServiceAccountHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(deleteUserRPC.Register(gm, server.DeleteUserHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(getAllBucketStatsRPC.Register(gm, server.GetAllBucketStatsHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(getBackgroundHealStatusRPC.Register(gm, server.BackgroundHealStatusHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(getBandwidthRPC.Register(gm, server.GetBandwidth), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(getBucketStatsRPC.Register(gm, server.GetBucketStatsHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(getCPUsHandler.Register(gm, server.GetCPUsHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(getLastDayTierStatsRPC.Register(gm, server.GetLastDayTierStatsHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(getLocksRPC.Register(gm, server.GetLocksHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(getMemInfoRPC.Register(gm, server.GetMemInfoHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(getMetacacheListingRPC.Register(gm, server.GetMetacacheListingHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(getMetricsRPC.Register(gm, server.GetMetricsHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(getNetInfoRPC.Register(gm, server.GetNetInfoHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(getOSInfoRPC.Register(gm, server.GetOSInfoHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(getPartitionsRPC.Register(gm, server.GetPartitionsHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(getPeerBucketMetricsRPC.Register(gm, server.GetPeerBucketMetrics), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(getPeerMetricsRPC.Register(gm, server.GetPeerMetrics), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(getProcInfoRPC.Register(gm, server.GetProcInfoHandler), "unable to register handler") | 
					
						
							| 
									
										
										
										
											2024-02-25 16:51:38 +08:00
										 |  |  | 	logger.FatalIf(getResourceMetricsRPC.Register(gm, server.GetResourceMetrics), "unable to register handler") | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	logger.FatalIf(getSRMetricsRPC.Register(gm, server.GetSRMetricsHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(getSysConfigRPC.Register(gm, server.GetSysConfigHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(getSysErrorsRPC.Register(gm, server.GetSysErrorsHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(getSysServicesRPC.Register(gm, server.GetSysServicesHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(headBucketRPC.Register(gm, server.HeadBucketHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(healBucketRPC.Register(gm, server.HealBucketHandler), "unable to register handler") | 
					
						
							| 
									
										
										
										
											2024-03-09 03:08:18 +08:00
										 |  |  | 	logger.FatalIf(listBucketsRPC.Register(gm, server.ListBucketsHandler), "unable to register handler") | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 	logger.FatalIf(listenRPC.RegisterNoInput(gm, server.ListenHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(loadBucketMetadataRPC.Register(gm, server.LoadBucketMetadataHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(loadGroupRPC.Register(gm, server.LoadGroupHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(loadPolicyMappingRPC.Register(gm, server.LoadPolicyMappingHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(loadPolicyRPC.Register(gm, server.LoadPolicyHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(loadRebalanceMetaRPC.Register(gm, server.LoadRebalanceMetaHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(loadSvcActRPC.Register(gm, server.LoadServiceAccountHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(loadTransitionTierConfigRPC.Register(gm, server.LoadTransitionTierConfigHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(loadUserRPC.Register(gm, server.LoadUserHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(localStorageInfoRPC.Register(gm, server.LocalStorageInfoHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(makeBucketRPC.Register(gm, server.MakeBucketHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(reloadPoolMetaRPC.Register(gm, server.ReloadPoolMetaHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(reloadSiteReplicationConfigRPC.Register(gm, server.ReloadSiteReplicationConfigHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(serverInfoRPC.Register(gm, server.ServerInfoHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(signalServiceRPC.Register(gm, server.SignalServiceHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(stopRebalanceRPC.Register(gm, server.StopRebalanceHandler), "unable to register handler") | 
					
						
							|  |  |  | 	logger.FatalIf(updateMetacacheListingRPC.Register(gm, server.UpdateMetacacheListingHandler), "unable to register handler") | 
					
						
							| 
									
										
										
										
											2024-09-12 00:09:13 +08:00
										 |  |  | 	logger.FatalIf(cleanupUploadIDCacheMetaRPC.Register(gm, server.HandlerClearUploadID), "unable to register handler") | 
					
						
							| 
									
										
										
										
											2024-02-20 06:54:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-31 04:49:02 +08:00
										 |  |  | 	logger.FatalIf(gm.RegisterStreamingHandler(grid.HandlerTrace, grid.StreamHandler{ | 
					
						
							|  |  |  | 		Handle:      server.TraceHandler, | 
					
						
							|  |  |  | 		Subroute:    "", | 
					
						
							|  |  |  | 		OutCapacity: 100000, | 
					
						
							|  |  |  | 		InCapacity:  0, | 
					
						
							|  |  |  | 	}), "unable to register handler") | 
					
						
							| 
									
										
										
										
											2019-03-15 07:27:31 +08:00
										 |  |  | } |