2798 lines · 83.6 KB · Go
RawDownload
// 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/>. package cmd import (	"bytes"	"encoding/json"	"fmt"	"os"	"path"	"path/filepath"	"strings"	"unicode/utf8" 	"github.com/minio/madmin-go"	"github.com/minio/minio/internal/auth"	"github.com/minio/minio/internal/config"	"github.com/minio/minio/internal/config/cache"	"github.com/minio/minio/internal/config/compress"	xldap "github.com/minio/minio/internal/config/identity/ldap"	"github.com/minio/minio/internal/config/identity/openid"	"github.com/minio/minio/internal/config/notify"	"github.com/minio/minio/internal/config/policy/opa"	"github.com/minio/minio/internal/config/storageclass"	"github.com/minio/minio/internal/event"	"github.com/minio/minio/internal/event/target"	"github.com/minio/minio/internal/kms"	"github.com/minio/minio/internal/logger"	"github.com/minio/minio/internal/logger/target/http"	xnet "github.com/minio/pkg/net"	"github.com/minio/pkg/quick") // DO NOT EDIT following message template, please open a GitHub issue to discuss instead.var configMigrateMSGTemplate = "Configuration file %s migrated from version '%s' to '%s' successfully." // Save config file to corresponding backendfunc Save(configFile string, data interface{}) error {	return quick.SaveConfig(data, configFile, globalEtcdClient)} // Load config from backendfunc Load(configFile string, data interface{}) (quick.Config, error) {	return quick.LoadConfig(configFile, globalEtcdClient, data)} // GetVersion gets config version from backendfunc GetVersion(configFile string) (string, error) {	return quick.GetVersion(configFile, globalEtcdClient)} // Migrates all config versions from "1" to "28".func migrateConfig() error {	// Purge all configs with version '1',	// this is a special case since version '1' used	// to be a filename 'fsUsers.json' not 'config.json'.	if err := purgeV1(); err != nil {		return err	} 	// Load only config version information.	version, err := GetVersion(getConfigFile())	if err != nil {		if osIsNotExist(err) || osIsPermission(err) {			return nil		}		return err	} 	// Conditional to migrate only relevant config versions.	// Upon success migration continues to the next version in sequence.	switch version {	case "2":		// Migrate version '2' to '3'.		if err = migrateV2ToV3(); err != nil {			return err		}		fallthrough	case "3":		// Migrate version '3' to '4'.		if err = migrateV3ToV4(); err != nil {			return err		}		fallthrough	case "4":		// Migrate version '4' to '5'.		if err = migrateV4ToV5(); err != nil {			return err		}		fallthrough	case "5":		// Migrate version '5' to '6.		if err = migrateV5ToV6(); err != nil {			return err		}		fallthrough	case "6":		// Migrate version '6' to '7'.		if err = migrateV6ToV7(); err != nil {			return err		}		fallthrough	case "7":		// Migrate version '7' to '8'.		if err = migrateV7ToV8(); err != nil {			return err		}		fallthrough	case "8":		// Migrate version '8' to '9'.		if err = migrateV8ToV9(); err != nil {			return err		}		fallthrough	case "9":		// Migrate version '9' to '10'.		if err = migrateV9ToV10(); err != nil {			return err		}		fallthrough	case "10":		// Migrate version '10' to '11'.		if err = migrateV10ToV11(); err != nil {			return err		}		fallthrough	case "11":		// Migrate version '11' to '12'.		if err = migrateV11ToV12(); err != nil {			return err		}		fallthrough	case "12":		// Migrate version '12' to '13'.		if err = migrateV12ToV13(); err != nil {			return err		}		fallthrough	case "13":		// Migrate version '13' to '14'.		if err = migrateV13ToV14(); err != nil {			return err		}		fallthrough	case "14":		// Migrate version '14' to '15'.		if err = migrateV14ToV15(); err != nil {			return err		}		fallthrough	case "15":		// Migrate version '15' to '16'.		if err = migrateV15ToV16(); err != nil {			return err		}		fallthrough	case "16":		// Migrate version '16' to '17'.		if err = migrateV16ToV17(); err != nil {			return err		}		fallthrough	case "17":		// Migrate version '17' to '18'.		if err = migrateV17ToV18(); err != nil {			return err		}		fallthrough	case "18":		// Migrate version '18' to '19'.		if err = migrateV18ToV19(); err != nil {			return err		}		fallthrough	case "19":		if err = migrateV19ToV20(); err != nil {			return err		}		fallthrough	case "20":		if err = migrateV20ToV21(); err != nil {			return err		}		fallthrough	case "21":		if err = migrateV21ToV22(); err != nil {			return err		}		fallthrough	case "22":		if err = migrateV22ToV23(); err != nil {			return err		}		fallthrough	case "23":		if err = migrateV23ToV24(); err != nil {			return err		}		fallthrough	case "24":		if err = migrateV24ToV25(); err != nil {			return err		}		fallthrough	case "25":		if err = migrateV25ToV26(); err != nil {			return err		}		fallthrough	case "26":		if err = migrateV26ToV27(); err != nil {			return err		}		fallthrough	case "27":		if err = migrateV27ToV28(); err != nil {			return err		}		fallthrough	case "33":		// No migration needed. this always points to current version.		err = nil	}	return err} // Version '1' is not supported anymore and deprecated, safe to delete.func purgeV1() error {	configFile := filepath.Join(globalConfigDir.Get(), "fsUsers.json") 	cv1 := &configV1{}	_, err := Load(configFile, cv1)	if osIsNotExist(err) || osIsPermission(err) {		return nil	} else if err != nil {		return fmt.Errorf("Unable to load config version ‘1’. %w", err)	}	if cv1.Version != "1" {		return fmt.Errorf("unrecognized config version ‘%s’", cv1.Version)	} 	os.RemoveAll(configFile)	logger.Info("Removed unsupported config version ‘1’.")	return nil} // Version '2' to '3' config migration adds new fields and re-orders// previous fields. Simplifies config for future additions.func migrateV2ToV3() error {	configFile := getConfigFile() 	cv2 := &configV2{}	_, err := Load(configFile, cv2)	if osIsNotExist(err) || osIsPermission(err) {		return nil	} else if err != nil {		return fmt.Errorf("Unable to load config version ‘2’. %w", err)	}	if cv2.Version != "2" {		return nil	} 	cred, err := auth.CreateCredentials(cv2.Credentials.AccessKey, cv2.Credentials.SecretKey)	if err != nil {		return fmt.Errorf("Invalid credential in V2 configuration file. %w", err)	} 	srvConfig := &configV3{}	srvConfig.Version = "3"	srvConfig.Addr = ":9000"	srvConfig.Credential = cred	srvConfig.Region = cv2.Credentials.Region	if srvConfig.Region == "" {		// Region needs to be set for AWS Signature V4.		srvConfig.Region = globalMinioDefaultRegion	}	srvConfig.Logger.Console = consoleLoggerV1{		Enable: true,		Level:  "fatal",	}	flogger := fileLoggerV1{}	flogger.Level = "error"	if cv2.FileLogger.Filename != "" {		flogger.Enable = true		flogger.Filename = cv2.FileLogger.Filename	}	srvConfig.Logger.File = flogger 	slogger := syslogLoggerV3{}	slogger.Level = "debug"	if cv2.SyslogLogger.Addr != "" {		slogger.Enable = true		slogger.Addr = cv2.SyslogLogger.Addr	}	srvConfig.Logger.Syslog = slogger 	if err = Save(configFile, srvConfig); err != nil {		return fmt.Errorf("Failed to migrate config from ‘%s’ to ‘%s’. %w", cv2.Version, srvConfig.Version, err)	} 	logger.Info(configMigrateMSGTemplate, configFile, cv2.Version, srvConfig.Version)	return nil} // Version '3' to '4' migrates config, removes previous fields related// to backend types and server address. This change further simplifies// the config for future additions.func migrateV3ToV4() error {	configFile := getConfigFile() 	cv3 := &configV3{}	_, err := Load(configFile, cv3)	if osIsNotExist(err) || osIsPermission(err) {		return nil	} else if err != nil {		return fmt.Errorf("Unable to load config version ‘3’. %w", err)	}	if cv3.Version != "3" {		return nil	} 	// Save only the new fields, ignore the rest.	srvConfig := &configV4{}	srvConfig.Version = "4"	srvConfig.Credential = cv3.Credential	srvConfig.Region = cv3.Region	if srvConfig.Region == "" {		// Region needs to be set for AWS Signature Version 4.		srvConfig.Region = globalMinioDefaultRegion	}	srvConfig.Logger.Console = cv3.Logger.Console	srvConfig.Logger.File = cv3.Logger.File	srvConfig.Logger.Syslog = cv3.Logger.Syslog 	if err = Save(configFile, srvConfig); err != nil {		return fmt.Errorf("Failed to migrate config from ‘%s’ to ‘%s’. %w", cv3.Version, srvConfig.Version, err)	} 	logger.Info(configMigrateMSGTemplate, configFile, cv3.Version, srvConfig.Version)	return nil} // Version '4' to '5' migrates config, removes previous fields related// to backend types and server address. This change further simplifies// the config for future additions.func migrateV4ToV5() error {	configFile := getConfigFile() 	cv4 := &configV4{}	_, err := Load(configFile, cv4)	if osIsNotExist(err) || osIsPermission(err) {		return nil	} else if err != nil {		return fmt.Errorf("Unable to load config version ‘4’. %w", err)	}	if cv4.Version != "4" {		return nil	} 	// Save only the new fields, ignore the rest.	srvConfig := &configV5{}	srvConfig.Version = "5"	srvConfig.Credential = cv4.Credential	srvConfig.Region = cv4.Region	if srvConfig.Region == "" {		// Region needs to be set for AWS Signature Version 4.		srvConfig.Region = globalMinioDefaultRegion	}	srvConfig.Logger.Console = cv4.Logger.Console	srvConfig.Logger.File = cv4.Logger.File	srvConfig.Logger.Syslog = cv4.Logger.Syslog	srvConfig.Logger.AMQP.Enable = false	srvConfig.Logger.ElasticSearch.Enable = false	srvConfig.Logger.Redis.Enable = false 	if err = Save(configFile, srvConfig); err != nil {		return fmt.Errorf("Failed to migrate config from ‘%s’ to ‘%s’. %w", cv4.Version, srvConfig.Version, err)	} 	logger.Info(configMigrateMSGTemplate, configFile, cv4.Version, srvConfig.Version)	return nil} // Version '5' to '6' migrates config, removes previous fields related// to backend types and server address. This change further simplifies// the config for future additions.func migrateV5ToV6() error {	configFile := getConfigFile() 	cv5 := &configV5{}	_, err := Load(configFile, cv5)	if osIsNotExist(err) || osIsPermission(err) {		return nil	} else if err != nil {		return fmt.Errorf("Unable to load config version ‘5’. %w", err)	}	if cv5.Version != "5" {		return nil	} 	// Save only the new fields, ignore the rest.	srvConfig := &configV6{}	srvConfig.Version = "6"	srvConfig.Credential = cv5.Credential	srvConfig.Region = cv5.Region	if srvConfig.Region == "" {		// Region needs to be set for AWS Signature Version 4.		srvConfig.Region = globalMinioDefaultRegion	}	srvConfig.Logger.Console = cv5.Logger.Console	srvConfig.Logger.File = cv5.Logger.File	srvConfig.Logger.Syslog = cv5.Logger.Syslog 	if cv5.Logger.AMQP.URL != "" {		var url *xnet.URL		if url, err = xnet.ParseURL(cv5.Logger.AMQP.URL); err != nil {			return err		}		srvConfig.Notify.AMQP = map[string]target.AMQPArgs{			"1": {				Enable:      cv5.Logger.AMQP.Enable,				URL:         *url,				Exchange:    cv5.Logger.AMQP.Exchange,				RoutingKey:  cv5.Logger.AMQP.RoutingKey,				Mandatory:   cv5.Logger.AMQP.Mandatory,				Immediate:   cv5.Logger.AMQP.Immediate,				Durable:     cv5.Logger.AMQP.Durable,				Internal:    cv5.Logger.AMQP.Internal,				NoWait:      cv5.Logger.AMQP.NoWait,				AutoDeleted: cv5.Logger.AMQP.AutoDeleted,			},		}	} 	if cv5.Logger.ElasticSearch.URL != "" {		var url *xnet.URL		url, err = xnet.ParseHTTPURL(cv5.Logger.ElasticSearch.URL)		if err != nil {			return err		}		srvConfig.Notify.ElasticSearch = map[string]target.ElasticsearchArgs{			"1": {				Enable: cv5.Logger.ElasticSearch.Enable,				URL:    *url,				Index:  cv5.Logger.ElasticSearch.Index,			},		}	} 	if cv5.Logger.Redis.Addr != "" {		var addr *xnet.Host		if addr, err = xnet.ParseHost(cv5.Logger.Redis.Addr); err != nil {			return err		}		srvConfig.Notify.Redis = map[string]target.RedisArgs{			"1": {				Enable:   cv5.Logger.Redis.Enable,				Addr:     *addr,				Password: cv5.Logger.Redis.Password,				Key:      cv5.Logger.Redis.Key,			},		}	} 	if err = Save(configFile, srvConfig); err != nil {		return fmt.Errorf("Failed to migrate config from ‘%s’ to ‘%s’. %w", cv5.Version, srvConfig.Version, err)	} 	logger.Info(configMigrateMSGTemplate, configFile, cv5.Version, srvConfig.Version)	return nil} // Version '6' to '7' migrates config, removes previous fields related// to backend types and server address. This change further simplifies// the config for future additions.func migrateV6ToV7() error {	configFile := getConfigFile() 	cv6 := &configV6{}	_, err := Load(configFile, cv6)	if osIsNotExist(err) || osIsPermission(err) {		return nil	} else if err != nil {		return fmt.Errorf("Unable to load config version ‘6’. %w", err)	}

Lines 1–500 of 2798.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t