func getNewTargetURL(targetParser *client.URL, name string) string { match, _ := filepath.Match("*.s3*.amazonaws.com", targetParser.Host) if match { targetParser.Path = string(targetParser.Separator) + name } else { targetParser.Path = string(targetParser.Separator) + path2Bucket(targetParser) + string(targetParser.Separator) + name } return targetParser.String() }
// If the host key does not have http(s), fix it. func fixConfigV6ForHosts() { if !isMcConfigExists() { return } brokenMcCfgV6, err := quick.Load(mustGetMcConfigPath(), newConfigV6()) fatalIf(err.Trace(), "Unable to load config.") if brokenMcCfgV6.Version() != "6" { return } newCfgV6 := newConfigV6() isMutated := false // Copy aliases. for k, v := range brokenMcCfgV6.Data().(*configV6).Aliases { newCfgV6.Aliases[k] = v } url := new(client.URL) // Copy hosts. for host, hostCfgV6 := range brokenMcCfgV6.Data().(*configV6).Hosts { // Already fixed - Copy and move on. if strings.HasPrefix(host, "https") || strings.HasPrefix(host, "http") { newCfgV6.Hosts[host] = hostCfgV6 continue } // If host entry does not contain "http(s)", introduce a new entry and delete the old one. if host == "s3.amazonaws.com" || host == "storage.googleapis.com" || host == "localhost:9000" || host == "127.0.0.1:9000" || host == "play.minio.io:9000" || host == "dl.minio.io:9000" { console.Infoln("Found broken host entries, replacing " + host + " with https://" + host + ".") url.Host = host url.Scheme = "https" url.SchemeSeparator = "://" newCfgV6.Hosts[url.String()] = hostCfgV6 isMutated = true continue } } if isMutated { // Save the new config back to the disk. mcCfgV6, err := quick.New(newCfgV6) fatalIf(err.Trace(), "Unable to initialize quick config for config version ‘v6’.") err = mcCfgV6.Save(mustGetMcConfigPath()) fatalIf(err.Trace(), "Unable to save config version ‘v6’.") } }
// prepareCastURLsTypeC - C: func prepareCastURLsTypeC(sourceURL string, targetURLs []string) <-chan castURLs { castURLsCh := make(chan castURLs) go func() { defer close(castURLsCh) if !isURLRecursive(sourceURL) { // Source is not of recursive type. castURLsCh <- castURLs{Error: NewIodine(iodine.New(errSourceNotRecursive{URL: sourceURL}, nil))} return } // add `/` after trimming off `...` to emulate directories sourceURL = stripRecursiveURL(sourceURL) sourceClient, sourceContent, err := url2Stat(sourceURL) // Source exist? if err != nil { // Source does not exist or insufficient privileges. castURLsCh <- castURLs{Error: NewIodine(iodine.New(err, nil))} return } if !sourceContent.Type.IsDir() { // Source is not a dir. castURLsCh <- castURLs{Error: NewIodine(iodine.New(errSourceIsNotDir{URL: sourceURL}, nil))} return } for sourceContent := range sourceClient.List(true) { if sourceContent.Err != nil { // Listing failed. castURLsCh <- castURLs{Error: NewIodine(iodine.New(sourceContent.Err, nil))} continue } if !sourceContent.Content.Type.IsRegular() { // Source is not a regular file. Skip it for cast. continue } // All OK.. We can proceed. Type B: source is a file, target is a directory and exists. sourceURLParse, err := client.Parse(sourceURL) if err != nil { castURLsCh <- castURLs{Error: NewIodine(iodine.New(errInvalidSource{URL: sourceURL}, nil))} continue } var newTargetURLs []string var sourceContentParse *client.URL for _, targetURL := range targetURLs { targetURLParse, err := client.Parse(targetURL) if err != nil { castURLsCh <- castURLs{Error: NewIodine(iodine.New(errInvalidTarget{URL: targetURL}, nil))} continue } sourceURLDelimited := sourceURLParse.String()[:strings.LastIndex(sourceURLParse.String(), string(sourceURLParse.Separator))+1] sourceContentName := sourceContent.Content.Name sourceContentURL := sourceURLDelimited + sourceContentName sourceContentParse, err = client.Parse(sourceContentURL) if err != nil { castURLsCh <- castURLs{Error: NewIodine(iodine.New(errInvalidSource{URL: sourceContentName}, nil))} continue } // Construct target path from recursive path of source without its prefix dir. newTargetURLParse := *targetURLParse newTargetURLParse.Path = filepath.Join(newTargetURLParse.Path, sourceContentName) newTargetURLs = append(newTargetURLs, newTargetURLParse.String()) } castURLsCh <- prepareCastURLsTypeA(sourceContentParse.String(), newTargetURLs) } }() return castURLsCh }