// 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. Load more
// 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 backend func Save(configFile string, data interface{}) error { return quick.SaveConfig(data, configFile, globalEtcdClient) } // Load config from backend func Load(configFile string, data interface{}) (quick.Config, error) { return quick.LoadConfig(configFile, globalEtcdClient, data) } // GetVersion gets config version from backend func 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) }