func checkAccessSyntax(ctx *cli.Context) { if !ctx.Args().Present() || ctx.Args().First() == "help" { cli.ShowCommandHelpAndExit(ctx, "access", 1) // last argument is exit code } if len(ctx.Args()) < 2 { cli.ShowCommandHelpAndExit(ctx, "access", 1) // last argument is exit code } switch ctx.Args().Get(0) { case "set": if len(ctx.Args().Tail()) < 2 { cli.ShowCommandHelpAndExit(ctx, "access", 1) // last argument is exit code } perms := accessPerms(ctx.Args().Tail().Get(0)) if !perms.isValidAccessPERM() { fatalIf(errDummy().Trace(), "Unrecognized permission ‘"+perms.String()+"’. Allowed values are [private, public, readonly].") } for _, arg := range ctx.Args().Tail().Tail() { if strings.TrimSpace(arg) == "" { fatalIf(errInvalidArgument().Trace(), "Unable to validate empty argument.") } } case "get": if len(ctx.Args().Tail()) < 1 { cli.ShowCommandHelpAndExit(ctx, "access", 1) // last argument is exit code } } }
// checkPolicySyntax check for incoming syntax. func checkPolicySyntax(ctx *cli.Context) { argsLength := len(ctx.Args()) // Always print a help message when we have extra arguments if argsLength > 2 { cli.ShowCommandHelpAndExit(ctx, "policy", 1) // last argument is exit code. } // Always print a help message when no arguments specified if argsLength < 1 { cli.ShowCommandHelpAndExit(ctx, "policy", 1) } firstArg := ctx.Args().Get(0) // More syntax checking switch accessPerms(firstArg) { case accessNone, accessDownload, accessUpload, accessPublic: // Always expect two arguments when a policy permission is provided if argsLength != 2 { cli.ShowCommandHelpAndExit(ctx, "policy", 1) } case "list": // Always expect an argument after list cmd if argsLength != 2 { cli.ShowCommandHelpAndExit(ctx, "policy", 1) } default: if argsLength == 2 { fatalIf(errDummy().Trace(), "Unrecognized permission ‘"+string(firstArg)+"’. Allowed values are [none, download, upload, public].") } } }
func checkConfigAliasSyntax(ctx *cli.Context) { // show help if nothing is set if !ctx.Args().Present() || ctx.Args().First() == "help" { cli.ShowCommandHelpAndExit(ctx, "alias", 1) // last argument is exit code } if strings.TrimSpace(ctx.Args().First()) == "" { cli.ShowCommandHelpAndExit(ctx, "alias", 1) // last argument is exit code } if len(ctx.Args().Tail()) > 2 { fatalIf(errDummy().Trace(), "Incorrect number of arguments to alias command") } switch strings.TrimSpace(ctx.Args().Get(0)) { case "add": if len(ctx.Args().Tail()) != 2 { fatalIf(errInvalidArgument().Trace(), "Incorrect number of arguments for add alias command.") } case "remove": if len(ctx.Args().Tail()) != 1 { fatalIf(errInvalidArgument().Trace(), "Incorrect number of arguments for remove alias command.") } case "list": default: cli.ShowCommandHelpAndExit(ctx, "alias", 1) // last argument is exit code } }
func checkShareDownloadSyntax(ctx *cli.Context) { args := ctx.Args() if !args.Present() || args.First() == "help" { cli.ShowCommandHelpAndExit(ctx, "download", 1) // last argument is exit code } if len(args) > 2 { cli.ShowCommandHelpAndExit(ctx, "download", 1) // last argument is exit code } }
func runAccessCmd(ctx *cli.Context) { if !ctx.Args().Present() || ctx.Args().First() == "help" { cli.ShowCommandHelpAndExit(ctx, "access", 1) // last argument is exit code } config := mustGetMcConfig() acl := bucketACL(ctx.Args().First()) if !acl.isValidBucketACL() { console.Fatalf("Valid types are [private, public, readonly]. %s\n", errInvalidACL{acl: acl.String()}) } for _, arg := range ctx.Args().Tail() { targetURL, err := getExpandedURL(arg, config.Aliases) if err != nil { switch e := iodine.ToError(err).(type) { case errUnsupportedScheme: console.Fatalf("Unknown type of URL %s. %s\n", e.url, err) default: console.Fatalf("Unable to parse argument %s. %s\n", arg, err) } } msg, err := doUpdateAccessCmd(targetURL, acl) if err != nil { console.Fatalln(msg) } console.Infoln(msg) } }
func controllerMain(c *cli.Context) { if c.Args().Present() && c.Args().First() != "keys" { cli.ShowCommandHelpAndExit(c, "controller", 1) } if c.Args().First() == "keys" { conf, err := getAuth() fatalIf(err.Trace(), "Failed to fetch keys for minio controller.", nil) if conf != nil { for _, user := range conf.Users { if globalJSONFlag { Println(accessKeys{user}.JSON()) } else { Println(accessKeys{user}) } } } return } err := firstTimeAuth() fatalIf(err.Trace(), "Failed to generate keys for minio.", nil) err = startController(getControllerConfig(c)) fatalIf(err.Trace(), "Failed to start minio controller.", nil) }
func runController(c *cli.Context) { if len(c.Args()) < 2 || c.Args().First() == "help" { cli.ShowCommandHelpAndExit(c, "controller", 1) // last argument is exit code } switch c.Args().First() { case "mem": memstats, err := controller.GetMemStats(c.Args().Tail().First()) if err != nil { Fatalln(err) } Println(string(memstats)) case "sysinfo": sysinfo, err := controller.GetSysInfo(c.Args().Tail().First()) if err != nil { Fatalln(err) } Println(string(sysinfo)) case "auth": keys, err := controller.GetAuthKeys(c.Args().Tail().First()) if err != nil { Fatalln(err) } Println(string(keys)) } }
func runDonut(c *cli.Context) { u, err := user.Current() if err != nil { Fatalf("Unable to determine current user. Reason: %s\n", err) } if len(c.Args()) < 1 { cli.ShowCommandHelpAndExit(c, "donut", 1) // last argument is exit code } // supporting multiple paths var paths []string if strings.TrimSpace(c.Args().First()) == "" { p := filepath.Join(u.HomeDir, "minio-storage", "donut") paths = append(paths, p) } else { for _, arg := range c.Args() { paths = append(paths, strings.TrimSpace(arg)) } } apiServerConfig := getAPIServerConfig(c) donutDriver := server.DonutFactory{ Config: apiServerConfig, Paths: paths, } apiServer := donutDriver.GetStartServerFunc() // webServer := getWebServerConfigFunc(c) servers := []server.StartServerFunc{apiServer} //, webServer} server.StartMinio(servers) }
func mainConfigVersion(ctx *cli.Context) { if ctx.Args().First() == "help" { cli.ShowCommandHelpAndExit(ctx, "version", 1) // last argument is exit code } config, err := newConfig() fatalIf(err.Trace(), "Failed to initialize ‘quick’ configuration data structure.") configPath := mustGetMcConfigPath() err = config.Load(configPath) fatalIf(err.Trace(configPath), "Unable to load config path") // convert interface{} back to its original struct newConf := config.Data().(*configV5) type Version struct { Value string `json:"value"` } if globalJSONFlag { tB, e := json.Marshal( struct { Version Version `json:"version"` }{Version: Version{newConf.Version}}, ) fatalIf(probe.NewError(e), "Unable to construct version string.") console.Println(string(tB)) return } console.Println(newConf.Version) }
func mainVersion(ctx *cli.Context) { if ctx.Args().First() == "help" { cli.ShowCommandHelpAndExit(ctx, "version", 1) // last argument is exit code } t, _ := time.Parse(time.RFC3339Nano, Version) if t.IsZero() { console.Println("") return } type Version struct { Value time.Time `json:"value"` Format string `json:"format"` } if globalJSONFlag { tB, e := json.Marshal( struct { Version Version `json:"version"` }{Version: Version{t, "RFC3339Nano"}}, ) fatalIf(probe.NewError(e), "Unable to construct version string.") console.Println(string(tB)) return } console.Println(t.Format(http.TimeFormat)) }
// runMakeBucketCmd is the handler for mc mb command func runMakeBucketCmd(ctx *cli.Context) { if !ctx.Args().Present() || ctx.Args().First() == "help" { cli.ShowCommandHelpAndExit(ctx, "mb", 1) // last argument is exit code } if !isMcConfigExists() { console.Fatalf("Please run \"mc config generate\". %s\n", errNotConfigured{}) } config := mustGetMcConfig() for _, arg := range ctx.Args() { targetURL, err := getExpandedURL(arg, config.Aliases) if err != nil { switch e := iodine.ToError(err).(type) { case errUnsupportedScheme: console.Fatalf("Unknown type of URL %s. %s\n", e.url, err) default: console.Fatalf("Unable to parse argument %s. %s\n", arg, err) } } msg, err := doMakeBucketCmd(targetURL) if err != nil { console.Fatalln(msg) } console.Infoln(msg) } }
func mainConfigVersion(ctx *cli.Context) { if ctx.Args().First() == "help" { cli.ShowCommandHelpAndExit(ctx, "version", 1) // last argument is exit code } config, err := loadConfigV2() fatalIf(err.Trace(), "Unable to load config", nil) // convert interface{} back to its original struct newConf := config type Version struct { Value string `json:"value"` } if globalJSONFlag { tB, e := json.Marshal( struct { Version Version `json:"version"` }{Version: Version{newConf.Version}}, ) fatalIf(probe.NewError(e), "Unable to construct version string.", nil) Println(string(tB)) return } Println(newConf.Version) }
func mainVersion(ctx *cli.Context) { if ctx.Args().First() == "help" { cli.ShowCommandHelpAndExit(ctx, "version", 1) // last argument is exit code } setVersionPalette(ctx.GlobalString("colors")) if globalJSONFlag { tB, e := json.Marshal( struct { Version struct { Value string `json:"value"` Format string `json:"format"` } `json:"version"` }{ Version: struct { Value string `json:"value"` Format string `json:"format"` }{ Value: mcVersion, Format: "RFC2616", }, }, ) fatalIf(probe.NewError(e), "Unable to construct version string.") console.Println(string(tB)) return } msg := console.Colorize("Version", fmt.Sprintf("Version: %s\n", mcVersion)) msg += console.Colorize("Version", fmt.Sprintf("Release-Tag: %s", mcReleaseTag)) console.Println(msg) }
func runCatCmd(ctx *cli.Context) { if !ctx.Args().Present() || ctx.Args().First() == "help" { cli.ShowCommandHelpAndExit(ctx, "cat", 1) // last argument is exit code } if !isMcConfigExists() { console.Fatalf("Please run \"mc config generate\". %s\n", errNotConfigured{}) } config := mustGetMcConfig() // Convert arguments to URLs: expand alias, fix format... for _, arg := range ctx.Args() { sourceURL, err := getExpandedURL(arg, config.Aliases) if err != nil { switch e := iodine.ToError(err).(type) { case errUnsupportedScheme: console.Fatalf("Unknown type of URL %s. %s\n", e.url, err) default: console.Fatalf("Unable to parse argument %s. %s\n", arg, err) } } errorMsg, err := doCatCmd(sourceURL) if err != nil { console.Fatalln(errorMsg) } } }
// "minio control lock" entry point. func lockControl(c *cli.Context) { if len(c.Args()) != 1 { cli.ShowCommandHelpAndExit(c, "lock", 1) } parsedURL, err := url.Parse(c.Args()[0]) fatalIf(err, "Unable to parse URL.") authCfg := &authConfig{ accessKey: serverConfig.GetCredential().AccessKeyID, secretKey: serverConfig.GetCredential().SecretAccessKey, address: parsedURL.Host, path: path.Join(reservedBucket, controlPath), loginMethod: "Controller.LoginHandler", } client := newAuthClient(authCfg) args := &GenericArgs{} reply := &SystemLockState{} err = client.Call("Controller.LockInfo", args, reply) // logs the error and returns if err != nil. fatalIf(err, "RPC Controller.LockInfo call failed") // print the lock info on the console. b, err := json.MarshalIndent(*reply, "", " ") fatalIf(err, "Failed to parse the RPC lock info response") fmt.Print(string(b)) }
// checkShareDownloadSyntax - validate command-line args. func checkShareDownloadSyntax(ctx *cli.Context) { args := ctx.Args() if !args.Present() { cli.ShowCommandHelpAndExit(ctx, "download", 1) // last argument is exit code. } // Parse expiry. expiry := shareDefaultExpiry expireArg := ctx.String("expire") if expireArg != "" { var e error expiry, e = time.ParseDuration(expireArg) fatalIf(probe.NewError(e), "Unable to parse expire=‘"+expireArg+"’.") } // Validate expiry. if expiry.Seconds() < 1 { fatalIf(errDummy().Trace(expiry.String()), "Expiry cannot be lesser than 1 second.") } if expiry.Seconds() > 604800 { fatalIf(errDummy().Trace(expiry.String()), "Expiry cannot be larger than 7 days.") } for _, url := range ctx.Args() { _, _, err := url2Stat(url) fatalIf(err.Trace(url), "Unable to stat ‘"+url+"’.") } }
// runListCmd - is a handler for mc ls command func runListCmd(ctx *cli.Context) { args := ctx.Args() if globalAliasFlag { if !ctx.Args().Present() { args = []string{"."} } } else if !ctx.Args().Present() || ctx.Args().First() == "help" { cli.ShowCommandHelpAndExit(ctx, "ls", 1) // last argument is exit code } config := mustGetMcConfig() for _, arg := range args { targetURL, err := getExpandedURL(arg, config.Aliases) if err != nil { switch e := iodine.ToError(err).(type) { case errUnsupportedScheme: console.Fatalf("Unknown type of URL %s. %s\n", e.url, err) default: console.Fatalf("Unable to parse argument %s. %s\n", arg, err) } } // if recursive strip off the "..." newTargetURL := stripRecursiveURL(targetURL) err = doListCmd(newTargetURL, isURLRecursive(targetURL)) if err != nil { console.Fatalf("Failed to list : %s. %s\n", targetURL, err) } } }
func checkDiffSyntax(ctx *cli.Context) { if len(ctx.Args()) != 2 { cli.ShowCommandHelpAndExit(ctx, "diff", 1) // last argument is exit code } for _, arg := range ctx.Args() { if strings.TrimSpace(arg) == "" { fatalIf(errInvalidArgument().Trace(ctx.Args()...), "Unable to validate empty argument.") } } URLs := ctx.Args() firstURL := URLs[0] secondURL := URLs[1] // Diff only works between two directories, verify them below. // Verify if firstURL is accessible. _, firstContent, err := url2Stat(firstURL) if err != nil { fatalIf(err.Trace(firstURL), fmt.Sprintf("Unable to stat '%s'.", firstURL)) } // Verify if its a directory. if !firstContent.Type.IsDir() { fatalIf(errInvalidArgument().Trace(firstURL), fmt.Sprintf("‘%s’ is not a folder.", firstURL)) } // Verify if secondURL is accessible. _, secondContent, err := url2Stat(secondURL) if err != nil { fatalIf(err.Trace(secondURL), fmt.Sprintf("Unable to stat '%s'.", secondURL)) } // Verify if its a directory. if !secondContent.Type.IsDir() { fatalIf(errInvalidArgument().Trace(secondURL), fmt.Sprintf("‘%s’ is not a folder.", secondURL)) } }
func runMinioInstall(ctx *cli.Context) { if ctx.Args().First() == "help" { cli.ShowCommandHelpAndExit(ctx, "install", 1) // last argument is exit code } minioGenerate := command{exec.Command("godep", "go", "generate", "./..."), &bytes.Buffer{}, &bytes.Buffer{}} minioBuild := command{exec.Command("godep", "go", "build", "-a", "./..."), &bytes.Buffer{}, &bytes.Buffer{}} minioTest := command{exec.Command("godep", "go", "test", "-race", "./..."), &bytes.Buffer{}, &bytes.Buffer{}} minioInstall := command{exec.Command("godep", "go", "install", "-a", "github.com/minio/minio"), &bytes.Buffer{}, &bytes.Buffer{}} minioGenerateErr := minioGenerate.runCommand() if minioGenerateErr != nil { fmt.Print(minioGenerate) os.Exit(1) } fmt.Print(minioGenerate) minioBuildErr := minioBuild.runCommand() if minioBuildErr != nil { fmt.Print(minioBuild) os.Exit(1) } fmt.Print(minioBuild) minioTestErr := minioTest.runCommand() if minioTestErr != nil { fmt.Println(minioTest) os.Exit(1) } fmt.Print(minioTest) minioInstallErr := minioInstall.runCommand() if minioInstallErr != nil { fmt.Println(minioInstall) os.Exit(1) } fmt.Print(minioInstall) }
// Validate command line arguments. func checkRmSyntax(ctx *cli.Context) { args := ctx.Args() ishelp := ctx.GlobalBool("help") isForce := ctx.Bool("force") if !args.Present() || ishelp { exitCode := 1 cli.ShowCommandHelpAndExit(ctx, "rm", exitCode) } URLs, err := args2URLs(args) fatalIf(err.Trace(ctx.Args()...), "Unable to parse arguments.") // If input validation fails then provide context sensitive help without displaying generic help message. // The context sensitive help is shown per argument instead of all arguments to keep the help display // as well as the code simple. Also most of the times there will be just one arg for _, url := range URLs { u := client.NewURL(url) if strings.HasSuffix(url, string(u.Separator)) { fatalIf(errDummy().Trace(), "‘"+url+"’ is a folder. To remove this folder recursively, please try ‘"+url+"...’ as argument.") } if isURLRecursive(url) && !isForce { fatalIf(errDummy().Trace(), "Recursive removal requires --force option. Please review carefully before performing this operation.") } } }
func checkShareUploadSyntax(ctx *cli.Context) { args := ctx.Args() if !args.Present() || args.First() == "help" { cli.ShowCommandHelpAndExit(ctx, "upload", 1) // last argument is exit code } if len(args) > 3 { cli.ShowCommandHelpAndExit(ctx, "upload", 1) // last argument is exit code } url := stripRecursiveURL(strings.TrimSpace(args.Get(0))) if !isObjectKeyPresent(url) { fatalIf(errDummy().Trace(), fmt.Sprintf("Upload location needs object key ‘%s’.", strings.TrimSpace(args.Get(0)))) } if strings.HasSuffix(strings.TrimSpace(args.Get(0)), "/") { fatalIf(errDummy().Trace(), fmt.Sprintf("Upload location cannot end with ‘/’. Did you mean ‘%s’.", url+recursiveSeparator)) } }
func checkShareSyntax(ctx *cli.Context) { if !ctx.Args().Present() || ctx.Args().First() == "help" || len(ctx.Args()) > 2 { cli.ShowCommandHelpAndExit(ctx, "share", 1) // last argument is exit code } if len(ctx.Args()) > 2 { cli.ShowCommandHelpAndExit(ctx, "share", 1) // last argument is exit code } if ctx.Args().Get(0) == "list" { if len(ctx.Args()) >= 2 { cli.ShowCommandHelpAndExit(ctx, "share", 1) // last argument is exit code } } if strings.TrimSpace(ctx.Args().Get(0)) == "" { fatalIf(errInvalidArgument().Trace(), "Unable to validate empty argument.") } }
// Validate command-line input args. func checkConfigHostSyntax(ctx *cli.Context) { // show help if nothing is set if !ctx.Args().Present() { cli.ShowCommandHelpAndExit(ctx, "host", 1) // last argument is exit code } switch strings.TrimSpace(ctx.Args().First()) { case "add": checkConfigHostAddSyntax(ctx) case "remove": checkConfigHostRemoveSyntax(ctx) case "list": default: cli.ShowCommandHelpAndExit(ctx, "host", 1) // last argument is exit code } }
func controllerMain(c *cli.Context) { if c.Args().Present() { cli.ShowCommandHelpAndExit(c, "controller", 1) } err := startController(getControllerConfig(c)) errorIf(err.Trace(), "Failed to start minio controller.", nil) }
// checkEventsRemoveSyntax - validate all the passed arguments func checkEventsRemoveSyntax(ctx *cli.Context) { if len(ctx.Args()) == 0 || len(ctx.Args()) > 2 { cli.ShowCommandHelpAndExit(ctx, "remove", 1) // last argument is exit code } if len(ctx.Args()) == 1 && !ctx.Bool("force") { fatalIf(probe.NewError(errors.New("")), "--force flag needs to be passed to remove all bucket notifications") } }
// checkCastSyntax(URLs []string) func checkCastSyntax(ctx *cli.Context) { if len(ctx.Args()) < 2 || ctx.Args().First() == "help" { cli.ShowCommandHelpAndExit(ctx, "cast", 1) // last argument is exit code. } // extract URLs. URLs, err := args2URLs(ctx.Args()) if err != nil { console.Fatalf("One or more unknown URL types found %s. %s\n", ctx.Args(), NewIodine(iodine.New(err, nil))) } srcURL := URLs[0] tgtURLs := URLs[1:] /****** Generic rules *******/ // Source cannot be a folder (except when recursive) if !isURLRecursive(srcURL) { _, srcContent, err := url2Stat(srcURL) // Source exist?. if err != nil { console.Fatalf("Unable to stat source ‘%s’. %s\n", srcURL, NewIodine(iodine.New(err, nil))) } if !srcContent.Type.IsRegular() { if srcContent.Type.IsDir() { console.Fatalf("Source ‘%s’ is a folder. Please use ‘%s...’ to recursively copy this folder and its contents.\n", srcURL, srcURL) } console.Fatalf("Source ‘%s’ is not a regular file.\n", srcURL) } } // Recursive URLs are not allowed in target. for _, tgtURL := range tgtURLs { if isURLRecursive(tgtURL) { console.Fatalf("Target ‘%s’ cannot be recursive. %s\n", tgtURL, NewIodine(iodine.New(errInvalidArgument{}, nil))) } } for _, tgtURL := range tgtURLs { url, err := client.Parse(tgtURL) if err != nil { console.Fatalf("Unable to parse target ‘%s’ argument. %s\n", tgtURL, NewIodine(iodine.New(err, nil))) } if url.Host != "" { if url.Path == string(url.Separator) { console.Fatalf("Bucket creation detected for %s, cloud storage URL's should use ‘mc mb’ to create buckets\n", tgtURL) } } } switch guessCastURLType(srcURL, tgtURLs) { case castURLsTypeA: // File -> File. checkCastSyntaxTypeA(srcURL, tgtURLs) case castURLsTypeB: // File -> Folder. checkCastSyntaxTypeB(srcURL, tgtURLs) case castURLsTypeC: // Folder -> Folder. checkCastSyntaxTypeC(srcURL, tgtURLs) default: console.Fatalln("Invalid arguments. Unable to determine how to cast. Please report this issue at https://github.com/minio/mc/issues") } }
func checkUpdateSyntax(ctx *cli.Context) { if ctx.Args().First() == "help" || !ctx.Args().Present() { cli.ShowCommandHelpAndExit(ctx, "update", 1) // last argument is exit code } arg := strings.TrimSpace(ctx.Args().First()) if arg != "release" && arg != "experimental" { fatalIf(errInvalidArgument().Trace(arg), "Unrecognized argument provided.") } }
// checkCastSyntax(URLs []string) func checkCastSyntax(ctx *cli.Context) { if len(ctx.Args()) < 2 || ctx.Args().First() == "help" { cli.ShowCommandHelpAndExit(ctx, "cast", 1) // last argument is exit code. } // extract URLs. URLs, err := args2URLs(ctx.Args()) if err != nil { console.Fatalf("One or more unknown URL types found %s. %s\n", ctx.Args(), iodine.New(err, nil)) } srcURL := URLs[0] tgtURLs := URLs[1:] /****** Generic rules *******/ // Source cannot be a directory (except when recursive) if !isURLRecursive(srcURL) { _, srcContent, err := url2Stat(srcURL) // Source exist?. if err != nil { console.Fatalf("Unable to stat source ‘%s’. %s\n", srcURL, iodine.New(err, nil)) } if !srcContent.Type.IsRegular() { if srcContent.Type.IsDir() { console.Fatalf("Source ‘%s’ is a directory. Please use ‘%s...’ to recursively copy this directory and its contents.\n", srcURL, srcURL) } console.Fatalf("Source ‘%s’ is not a regular file.\n", srcURL) } } // Recursive URLs are not allowed in target. for _, tgtURL := range tgtURLs { if isURLRecursive(tgtURL) { console.Fatalf("Target ‘%s’ cannot be recursive. %s\n", tgtURL, iodine.New(err, nil)) } } switch guessCastURLType(srcURL, tgtURLs) { case castURLsTypeA: // Source is already a regular file. // case castURLsTypeB: // Source is already a regular file. // case castURLsTypeC: srcURL = stripRecursiveURL(srcURL) _, srcContent, err := url2Stat(srcURL) // Source exist?. if err != nil { console.Fatalf("Unable to stat source ‘%s’. %s\n", srcURL, iodine.New(err, nil)) } if srcContent.Type.IsRegular() { // Ellipses is supported only for directories. console.Fatalf("Source ‘%s’ is not a directory. %s\n", stripRecursiveURL(srcURL), iodine.New(err, nil)) } default: console.Fatalln("Invalid arguments. Unable to determine how to cast. Please report this issue at https://github.com/minio/mc/issues") } }
func mainVersion(ctx *cli.Context) { if len(ctx.Args()) != 0 { cli.ShowCommandHelpAndExit(ctx, "version", 1) } console.Println("Version: " + Version) console.Println("Release-Tag: " + ReleaseTag) console.Println("Commit-ID: " + CommitID) }
func serverMain(c *cli.Context) { if c.Args().Present() { cli.ShowCommandHelpAndExit(c, "server", 1) } apiServerConfig := getServerConfig(c) err := startServer(apiServerConfig) errorIf(err.Trace(), "Failed to start the minio server.", nil) }