| 
									
										
										
										
											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/>.
 | 
					
						
							| 
									
										
										
										
											2018-10-10 05:00:01 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | package cmd | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"bytes" | 
					
						
							|  |  |  | 	"context" | 
					
						
							|  |  |  | 	"errors" | 
					
						
							| 
									
										
										
										
											2022-09-20 02:05:16 +08:00
										 |  |  | 	"io" | 
					
						
							| 
									
										
										
										
											2021-02-06 01:57:30 +08:00
										 |  |  | 	"net/http" | 
					
						
							| 
									
										
										
										
											2018-10-10 05:00:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-02 05:59:40 +08:00
										 |  |  | 	"github.com/minio/minio/internal/hash" | 
					
						
							| 
									
										
										
										
											2018-10-10 05:00:01 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var errConfigNotFound = errors.New("config file not found") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-26 03:36:57 +08:00
										 |  |  | func readConfigWithMetadata(ctx context.Context, store objectIO, configFile string, opts ObjectOptions) ([]byte, ObjectInfo, error) { | 
					
						
							| 
									
										
										
										
											2023-04-18 03:16:37 +08:00
										 |  |  | 	r, err := store.GetObjectNInfo(ctx, minioMetaBucket, configFile, nil, http.Header{}, opts) | 
					
						
							| 
									
										
										
										
											2021-02-06 01:57:30 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2018-10-10 05:00:01 +08:00
										 |  |  | 		if isErrObjectNotFound(err) { | 
					
						
							| 
									
										
										
										
											2021-12-12 01:03:39 +08:00
										 |  |  | 			return nil, ObjectInfo{}, errConfigNotFound | 
					
						
							| 
									
										
										
										
											2018-10-10 05:00:01 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-12 01:03:39 +08:00
										 |  |  | 		return nil, ObjectInfo{}, err | 
					
						
							| 
									
										
										
										
											2018-10-10 05:00:01 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-02-06 01:57:30 +08:00
										 |  |  | 	defer r.Close() | 
					
						
							| 
									
										
										
										
											2018-10-10 05:00:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-20 02:05:16 +08:00
										 |  |  | 	buf, err := io.ReadAll(r) | 
					
						
							| 
									
										
										
										
											2021-02-06 01:57:30 +08:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2021-12-12 01:03:39 +08:00
										 |  |  | 		return nil, ObjectInfo{}, err | 
					
						
							| 
									
										
										
										
											2021-02-06 01:57:30 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	if len(buf) == 0 { | 
					
						
							| 
									
										
										
										
											2021-12-12 01:03:39 +08:00
										 |  |  | 		return nil, ObjectInfo{}, errConfigNotFound | 
					
						
							| 
									
										
										
										
											2018-10-10 05:00:01 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2021-12-12 01:03:39 +08:00
										 |  |  | 	return buf, r.ObjInfo, nil | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-04 02:22:58 +08:00
										 |  |  | func readConfig(ctx context.Context, store objectIO, configFile string) ([]byte, error) { | 
					
						
							| 
									
										
										
										
											2022-10-26 03:36:57 +08:00
										 |  |  | 	buf, _, err := readConfigWithMetadata(ctx, store, configFile, ObjectOptions{}) | 
					
						
							| 
									
										
										
										
											2021-12-12 01:03:39 +08:00
										 |  |  | 	return buf, err | 
					
						
							| 
									
										
										
										
											2018-10-10 05:00:01 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-11 00:18:19 +08:00
										 |  |  | type objectDeleter interface { | 
					
						
							|  |  |  | 	DeleteObject(ctx context.Context, bucket, object string, opts ObjectOptions) (ObjectInfo, error) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func deleteConfig(ctx context.Context, objAPI objectDeleter, configFile string) error { | 
					
						
							| 
									
										
										
										
											2021-09-18 10:34:48 +08:00
										 |  |  | 	_, err := objAPI.DeleteObject(ctx, minioMetaBucket, configFile, ObjectOptions{ | 
					
						
							| 
									
										
										
										
											2023-08-10 07:30:22 +08:00
										 |  |  | 		DeletePrefix:       true, | 
					
						
							|  |  |  | 		DeletePrefixObject: true, // use prefix delete on exact object (this is an optimization to avoid fan-out calls)
 | 
					
						
							| 
									
										
										
										
											2021-09-18 10:34:48 +08:00
										 |  |  | 	}) | 
					
						
							| 
									
										
										
										
											2020-04-17 07:22:34 +08:00
										 |  |  | 	if err != nil && isErrObjectNotFound(err) { | 
					
						
							|  |  |  | 		return errConfigNotFound | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return err | 
					
						
							| 
									
										
										
										
											2018-10-13 02:32:18 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-26 03:36:57 +08:00
										 |  |  | func saveConfigWithOpts(ctx context.Context, store objectIO, configFile string, data []byte, opts ObjectOptions) error { | 
					
						
							| 
									
										
										
										
											2023-09-19 01:00:54 +08:00
										 |  |  | 	hashReader, err := hash.NewReader(ctx, bytes.NewReader(data), int64(len(data)), "", getSHA256Hash(data), int64(len(data))) | 
					
						
							| 
									
										
										
										
											2018-10-10 05:00:01 +08:00
										 |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-26 03:36:57 +08:00
										 |  |  | 	_, err = store.PutObject(ctx, minioMetaBucket, configFile, NewPutObjReader(hashReader), opts) | 
					
						
							| 
									
										
										
										
											2018-10-10 05:00:01 +08:00
										 |  |  | 	return err | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-26 03:36:57 +08:00
										 |  |  | func saveConfig(ctx context.Context, store objectIO, configFile string, data []byte) error { | 
					
						
							|  |  |  | 	return saveConfigWithOpts(ctx, store, configFile, data, ObjectOptions{MaxParity: true}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-10 05:00:01 +08:00
										 |  |  | func checkConfig(ctx context.Context, objAPI ObjectLayer, configFile string) error { | 
					
						
							|  |  |  | 	if _, err := objAPI.GetObjectInfo(ctx, minioMetaBucket, configFile, ObjectOptions{}); err != nil { | 
					
						
							|  |  |  | 		// Treat object not found as config not found.
 | 
					
						
							|  |  |  | 		if isErrObjectNotFound(err) { | 
					
						
							|  |  |  | 			return errConfigNotFound | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return nil | 
					
						
							|  |  |  | } |