| 
									
										
										
										
											2016-08-19 07:23:42 +08:00
										 |  |  |  | /* | 
					
						
							| 
									
										
										
										
											2019-12-31 12:06:13 +08:00
										 |  |  |  |  * MinIO Cloud Storage, (C) 2015-2019 MinIO, Inc. | 
					
						
							| 
									
										
										
										
											2016-08-19 07:23:42 +08:00
										 |  |  |  |  * | 
					
						
							|  |  |  |  |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
					
						
							|  |  |  |  |  * you may not use this file except in compliance with the License. | 
					
						
							|  |  |  |  |  * You may obtain a copy of the License at | 
					
						
							|  |  |  |  |  * | 
					
						
							|  |  |  |  |  *     http://www.apache.org/licenses/LICENSE-2.0
 | 
					
						
							|  |  |  |  |  * | 
					
						
							|  |  |  |  |  * Unless required by applicable law or agreed to in writing, software | 
					
						
							|  |  |  |  |  * distributed under the License is distributed on an "AS IS" BASIS, | 
					
						
							|  |  |  |  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
					
						
							|  |  |  |  |  * See the License for the specific language governing permissions and | 
					
						
							|  |  |  |  |  * limitations under the License. | 
					
						
							|  |  |  |  |  */ | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | package cmd | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | import ( | 
					
						
							|  |  |  |  | 	"os" | 
					
						
							| 
									
										
										
										
											2017-06-09 14:28:45 +08:00
										 |  |  |  | 	"path/filepath" | 
					
						
							| 
									
										
										
										
											2016-08-19 07:23:42 +08:00
										 |  |  |  | 	"sort" | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	"github.com/minio/cli" | 
					
						
							| 
									
										
										
										
											2019-12-31 12:06:13 +08:00
										 |  |  |  | 	"github.com/minio/minio/pkg/console" | 
					
						
							| 
									
										
										
										
											2017-03-07 11:35:26 +08:00
										 |  |  |  | 	"github.com/minio/minio/pkg/trie" | 
					
						
							| 
									
										
										
										
											2017-03-20 05:23:05 +08:00
										 |  |  |  | 	"github.com/minio/minio/pkg/words" | 
					
						
							| 
									
										
										
										
											2016-08-19 07:23:42 +08:00
										 |  |  |  | ) | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-10 22:57:42 +08:00
										 |  |  |  | // GlobalFlags - global flags for minio.
 | 
					
						
							|  |  |  |  | var GlobalFlags = []cli.Flag{ | 
					
						
							| 
									
										
										
										
											2017-03-07 11:35:26 +08:00
										 |  |  |  | 	cli.StringFlag{ | 
					
						
							|  |  |  |  | 		Name:  "config-dir, C", | 
					
						
							| 
									
										
										
										
											2019-01-03 02:05:16 +08:00
										 |  |  |  | 		Value: defaultConfigDir.Get(), | 
					
						
							| 
									
										
										
										
											2019-05-09 09:35:40 +08:00
										 |  |  |  | 		Usage: "[DEPRECATED] path to legacy configuration directory", | 
					
						
							| 
									
										
										
										
											2019-01-03 02:05:16 +08:00
										 |  |  |  | 	}, | 
					
						
							|  |  |  |  | 	cli.StringFlag{ | 
					
						
							|  |  |  |  | 		Name:  "certs-dir, S", | 
					
						
							|  |  |  |  | 		Value: defaultCertsDir.Get(), | 
					
						
							| 
									
										
										
										
											2019-05-09 09:35:40 +08:00
										 |  |  |  | 		Usage: "path to certs directory", | 
					
						
							| 
									
										
										
										
											2017-03-07 11:35:26 +08:00
										 |  |  |  | 	}, | 
					
						
							|  |  |  |  | 	cli.BoolFlag{ | 
					
						
							|  |  |  |  | 		Name:  "quiet", | 
					
						
							| 
									
										
										
										
											2019-05-09 09:35:40 +08:00
										 |  |  |  | 		Usage: "disable startup information", | 
					
						
							| 
									
										
										
										
											2017-03-07 11:35:26 +08:00
										 |  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2018-12-19 08:08:11 +08:00
										 |  |  |  | 	cli.BoolFlag{ | 
					
						
							|  |  |  |  | 		Name:  "anonymous", | 
					
						
							| 
									
										
										
										
											2019-05-09 09:35:40 +08:00
										 |  |  |  | 		Usage: "hide sensitive information from logging", | 
					
						
							| 
									
										
										
										
											2018-12-19 08:08:11 +08:00
										 |  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2018-01-17 23:24:46 +08:00
										 |  |  |  | 	cli.BoolFlag{ | 
					
						
							|  |  |  |  | 		Name:  "json", | 
					
						
							| 
									
										
										
										
											2019-05-09 09:35:40 +08:00
										 |  |  |  | 		Usage: "output server logs and startup information in json format", | 
					
						
							|  |  |  |  | 	}, | 
					
						
							|  |  |  |  | 	cli.BoolFlag{ | 
					
						
							|  |  |  |  | 		Name:  "compat", | 
					
						
							| 
									
										
										
										
											2019-11-14 09:38:05 +08:00
										 |  |  |  | 		Usage: "enable strict S3 compatibility by turning off certain performance optimizations", | 
					
						
							| 
									
										
										
										
											2018-01-17 23:24:46 +08:00
										 |  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2017-03-07 11:35:26 +08:00
										 |  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-08-19 07:23:42 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | // Help template for minio.
 | 
					
						
							|  |  |  |  | var minioHelpTemplate = `NAME: | 
					
						
							|  |  |  |  |   {{.Name}} - {{.Usage}} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | DESCRIPTION: | 
					
						
							|  |  |  |  |   {{.Description}} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | USAGE: | 
					
						
							| 
									
										
										
										
											2017-02-16 09:45:08 +08:00
										 |  |  |  |   {{.HelpName}} {{if .VisibleFlags}}[FLAGS] {{end}}COMMAND{{if .VisibleFlags}}{{end}} [ARGS...] | 
					
						
							| 
									
										
										
										
											2016-08-19 07:23:42 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | COMMANDS: | 
					
						
							| 
									
										
										
										
											2017-02-15 18:25:38 +08:00
										 |  |  |  |   {{range .VisibleCommands}}{{join .Names ", "}}{{ "\t" }}{{.Usage}} | 
					
						
							|  |  |  |  |   {{end}}{{if .VisibleFlags}} | 
					
						
							| 
									
										
										
										
											2016-08-19 07:23:42 +08:00
										 |  |  |  | FLAGS: | 
					
						
							| 
									
										
										
										
											2017-02-15 18:25:38 +08:00
										 |  |  |  |   {{range .VisibleFlags}}{{.}} | 
					
						
							| 
									
										
										
										
											2016-08-19 07:23:42 +08:00
										 |  |  |  |   {{end}}{{end}} | 
					
						
							|  |  |  |  | VERSION: | 
					
						
							| 
									
										
										
										
											2020-02-27 01:39:08 +08:00
										 |  |  |  |   {{.Version}} | 
					
						
							| 
									
										
										
										
											2020-01-02 22:48:32 +08:00
										 |  |  |  | ` | 
					
						
							| 
									
										
										
										
											2016-08-19 07:23:42 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-09 14:28:45 +08:00
										 |  |  |  | func newApp(name string) *cli.App { | 
					
						
							| 
									
										
										
										
											2017-03-07 11:35:26 +08:00
										 |  |  |  | 	// Collection of minio commands currently supported are.
 | 
					
						
							|  |  |  |  | 	commands := []cli.Command{} | 
					
						
							| 
									
										
										
										
											2016-08-19 07:23:42 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-07 11:35:26 +08:00
										 |  |  |  | 	// Collection of minio commands currently supported in a trie tree.
 | 
					
						
							|  |  |  |  | 	commandsTree := trie.NewTrie() | 
					
						
							| 
									
										
										
										
											2016-08-19 07:23:42 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-07 11:35:26 +08:00
										 |  |  |  | 	// registerCommand registers a cli command.
 | 
					
						
							|  |  |  |  | 	registerCommand := func(command cli.Command) { | 
					
						
							|  |  |  |  | 		commands = append(commands, command) | 
					
						
							|  |  |  |  | 		commandsTree.Insert(command.Name) | 
					
						
							| 
									
										
										
										
											2016-08-19 07:23:42 +08:00
										 |  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-03-07 11:35:26 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 	findClosestCommands := func(command string) []string { | 
					
						
							|  |  |  |  | 		var closestCommands []string | 
					
						
							|  |  |  |  | 		for _, value := range commandsTree.PrefixMatch(command) { | 
					
						
							| 
									
										
										
										
											2016-08-19 07:23:42 +08:00
										 |  |  |  | 			closestCommands = append(closestCommands, value.(string)) | 
					
						
							|  |  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-03-07 11:35:26 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 		sort.Strings(closestCommands) | 
					
						
							|  |  |  |  | 		// Suggest other close commands - allow missed, wrongly added and
 | 
					
						
							|  |  |  |  | 		// even transposed characters
 | 
					
						
							|  |  |  |  | 		for _, value := range commandsTree.Walk(commandsTree.Root()) { | 
					
						
							|  |  |  |  | 			if sort.SearchStrings(closestCommands, value.(string)) < len(closestCommands) { | 
					
						
							|  |  |  |  | 				continue | 
					
						
							|  |  |  |  | 			} | 
					
						
							|  |  |  |  | 			// 2 is arbitrary and represents the max
 | 
					
						
							|  |  |  |  | 			// allowed number of typed errors
 | 
					
						
							| 
									
										
										
										
											2017-03-20 05:23:05 +08:00
										 |  |  |  | 			if words.DamerauLevenshteinDistance(command, value.(string)) < 2 { | 
					
						
							| 
									
										
										
										
											2017-03-07 11:35:26 +08:00
										 |  |  |  | 				closestCommands = append(closestCommands, value.(string)) | 
					
						
							|  |  |  |  | 			} | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 		return closestCommands | 
					
						
							| 
									
										
										
										
											2016-08-19 07:23:42 +08:00
										 |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 	// Register all commands.
 | 
					
						
							|  |  |  |  | 	registerCommand(serverCmd) | 
					
						
							| 
									
										
										
										
											2017-03-17 03:21:58 +08:00
										 |  |  |  | 	registerCommand(gatewayCmd) | 
					
						
							| 
									
										
										
										
											2016-08-19 07:23:42 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 	// Set up app.
 | 
					
						
							| 
									
										
										
										
											2017-02-20 12:46:06 +08:00
										 |  |  |  | 	cli.HelpFlag = cli.BoolFlag{ | 
					
						
							|  |  |  |  | 		Name:  "help, h", | 
					
						
							| 
									
										
										
										
											2019-05-09 09:35:40 +08:00
										 |  |  |  | 		Usage: "show help", | 
					
						
							| 
									
										
										
										
											2017-02-20 12:46:06 +08:00
										 |  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-03-07 11:35:26 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-19 07:23:42 +08:00
										 |  |  |  | 	app := cli.NewApp() | 
					
						
							| 
									
										
										
										
											2017-06-09 14:28:45 +08:00
										 |  |  |  | 	app.Name = name | 
					
						
							| 
									
										
										
										
											2019-04-10 02:39:42 +08:00
										 |  |  |  | 	app.Author = "MinIO, Inc." | 
					
						
							| 
									
										
										
										
											2020-01-02 22:48:32 +08:00
										 |  |  |  | 	app.Version = ReleaseTag | 
					
						
							| 
									
										
										
										
											2019-11-14 09:38:05 +08:00
										 |  |  |  | 	app.Usage = "High Performance Object Storage" | 
					
						
							|  |  |  |  | 	app.Description = `Build high performance data infrastructure for machine learning, analytics and application data workloads with MinIO` | 
					
						
							| 
									
										
										
										
											2019-06-10 22:57:42 +08:00
										 |  |  |  | 	app.Flags = GlobalFlags | 
					
						
							| 
									
										
										
										
											2017-02-20 12:46:06 +08:00
										 |  |  |  | 	app.HideHelpCommand = true // Hide `help, h` command, we already have `minio --help`.
 | 
					
						
							| 
									
										
										
										
											2016-08-19 07:23:42 +08:00
										 |  |  |  | 	app.Commands = commands | 
					
						
							|  |  |  |  | 	app.CustomAppHelpTemplate = minioHelpTemplate | 
					
						
							|  |  |  |  | 	app.CommandNotFound = func(ctx *cli.Context, command string) { | 
					
						
							| 
									
										
										
										
											2017-03-07 11:35:26 +08:00
										 |  |  |  | 		console.Printf("‘%s’ is not a minio sub-command. See ‘minio --help’.\n", command) | 
					
						
							| 
									
										
										
										
											2016-08-19 07:23:42 +08:00
										 |  |  |  | 		closestCommands := findClosestCommands(command) | 
					
						
							|  |  |  |  | 		if len(closestCommands) > 0 { | 
					
						
							| 
									
										
										
										
											2017-03-07 11:35:26 +08:00
										 |  |  |  | 			console.Println() | 
					
						
							|  |  |  |  | 			console.Println("Did you mean one of these?") | 
					
						
							| 
									
										
										
										
											2016-08-19 07:23:42 +08:00
										 |  |  |  | 			for _, cmd := range closestCommands { | 
					
						
							| 
									
										
										
										
											2017-03-07 11:35:26 +08:00
										 |  |  |  | 				console.Printf("\t‘%s’\n", cmd) | 
					
						
							| 
									
										
										
										
											2016-08-19 07:23:42 +08:00
										 |  |  |  | 			} | 
					
						
							|  |  |  |  | 		} | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-07 11:35:26 +08:00
										 |  |  |  | 		os.Exit(1) | 
					
						
							| 
									
										
										
										
											2016-11-29 04:15:36 +08:00
										 |  |  |  | 	} | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-07 11:35:26 +08:00
										 |  |  |  | 	return app | 
					
						
							| 
									
										
										
										
											2016-11-29 04:15:36 +08:00
										 |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // Main main for minio server.
 | 
					
						
							| 
									
										
										
										
											2017-03-07 11:35:26 +08:00
										 |  |  |  | func Main(args []string) { | 
					
						
							| 
									
										
										
										
											2017-06-13 08:33:21 +08:00
										 |  |  |  | 	// Set the minio app name.
 | 
					
						
							|  |  |  |  | 	appName := filepath.Base(args[0]) | 
					
						
							| 
									
										
										
										
											2016-08-19 07:23:42 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 	// Run the app - exit on error.
 | 
					
						
							| 
									
										
										
										
											2017-06-13 08:33:21 +08:00
										 |  |  |  | 	if err := newApp(appName).Run(args); err != nil { | 
					
						
							| 
									
										
										
										
											2017-03-07 11:35:26 +08:00
										 |  |  |  | 		os.Exit(1) | 
					
						
							| 
									
										
										
										
											2017-01-27 07:22:41 +08:00
										 |  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-08-19 07:23:42 +08:00
										 |  |  |  | } |