2016-08-18 19:23:42 -04:00
/ *
2018-02-28 23:13:33 -05:00
* Minio Cloud Storage , ( C ) 2015 , 2016 , 2017 , 2018 Minio , Inc .
2016-08-18 19:23:42 -04: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 02:28:45 -04:00
"path/filepath"
2016-08-18 19:23:42 -04:00
"sort"
"github.com/minio/cli"
"github.com/minio/mc/pkg/console"
2017-03-06 22:35:26 -05:00
"github.com/minio/minio/pkg/trie"
2017-03-19 17:23:05 -04:00
"github.com/minio/minio/pkg/words"
2016-08-18 19:23:42 -04:00
)
2017-03-06 22:35:26 -05:00
// global flags for minio.
var globalFlags = [ ] cli . Flag {
cli . StringFlag {
Name : "config-dir, C" ,
Value : getConfigDir ( ) ,
2018-02-28 23:13:33 -05:00
Usage : func ( ) string {
usage := "Path to configuration directory."
if getConfigDir ( ) == "" {
usage = usage + " This option must be set."
}
return usage
} ( ) ,
2017-03-06 22:35:26 -05:00
} ,
cli . BoolFlag {
Name : "quiet" ,
Usage : "Disable startup information." ,
} ,
2018-12-18 19:08:11 -05:00
cli . BoolFlag {
Name : "anonymous" ,
Usage : "Hide sensitive information from logging." ,
} ,
2018-01-17 10:24:46 -05:00
cli . BoolFlag {
Name : "json" ,
Usage : "Output server logs and startup information in json format." ,
} ,
2017-03-06 22:35:26 -05:00
}
2016-08-18 19:23:42 -04:00
// Help template for minio.
var minioHelpTemplate = ` NAME :
{ { . Name } } - { { . Usage } }
DESCRIPTION :
{ { . Description } }
USAGE :
2017-02-15 20:45:08 -05:00
{ { . HelpName } } { { if . VisibleFlags } } [ FLAGS ] { { end } } COMMAND { { if . VisibleFlags } } { { end } } [ ARGS ... ]
2016-08-18 19:23:42 -04:00
COMMANDS :
2017-02-15 05:25:38 -05:00
{ { range . VisibleCommands } } { { join . Names ", " } } { { "\t" } } { { . Usage } }
{ { end } } { { if . VisibleFlags } }
2016-08-18 19:23:42 -04:00
FLAGS :
2017-02-15 05:25:38 -05:00
{ { range . VisibleFlags } } { { . } }
2016-08-18 19:23:42 -04:00
{ { end } } { { end } }
VERSION :
` + Version +
` {{ "\n" }} `
2017-06-09 02:28:45 -04:00
func newApp ( name string ) * cli . App {
2017-03-06 22:35:26 -05:00
// Collection of minio commands currently supported are.
commands := [ ] cli . Command { }
2016-08-18 19:23:42 -04:00
2017-03-06 22:35:26 -05:00
// Collection of minio commands currently supported in a trie tree.
commandsTree := trie . NewTrie ( )
2016-08-18 19:23:42 -04:00
2017-03-06 22:35:26 -05:00
// registerCommand registers a cli command.
registerCommand := func ( command cli . Command ) {
commands = append ( commands , command )
commandsTree . Insert ( command . Name )
2016-08-18 19:23:42 -04:00
}
2017-03-06 22:35:26 -05:00
findClosestCommands := func ( command string ) [ ] string {
var closestCommands [ ] string
for _ , value := range commandsTree . PrefixMatch ( command ) {
2016-08-18 19:23:42 -04:00
closestCommands = append ( closestCommands , value . ( string ) )
}
2017-03-06 22:35:26 -05: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-19 17:23:05 -04:00
if words . DamerauLevenshteinDistance ( command , value . ( string ) ) < 2 {
2017-03-06 22:35:26 -05:00
closestCommands = append ( closestCommands , value . ( string ) )
}
}
return closestCommands
2016-08-18 19:23:42 -04:00
}
// Register all commands.
registerCommand ( serverCmd )
2017-03-16 15:21:58 -04:00
registerCommand ( gatewayCmd )
2017-11-08 16:38:53 -05:00
registerCommand ( updateCmd )
registerCommand ( versionCmd )
2016-08-18 19:23:42 -04:00
// Set up app.
2017-02-19 23:46:06 -05:00
cli . HelpFlag = cli . BoolFlag {
Name : "help, h" ,
Usage : "Show help." ,
}
2017-03-06 22:35:26 -05:00
2016-08-18 19:23:42 -04:00
app := cli . NewApp ( )
2017-06-09 02:28:45 -04:00
app . Name = name
2016-08-18 19:23:42 -04:00
app . Author = "Minio.io"
2017-02-18 16:41:33 -05:00
app . Version = Version
2016-08-18 19:23:42 -04:00
app . Usage = "Cloud Storage Server."
app . Description = ` Minio is an Amazon S3 compatible object storage server. Use it to store photos, videos, VMs, containers, log files, or any blob of data as objects. `
2016-09-01 18:12:49 -04:00
app . Flags = globalFlags
2017-02-19 23:46:06 -05:00
app . HideVersion = true // Hide `--version` flag, we already have `minio version`.
app . HideHelpCommand = true // Hide `help, h` command, we already have `minio --help`.
2016-08-18 19:23:42 -04:00
app . Commands = commands
app . CustomAppHelpTemplate = minioHelpTemplate
app . CommandNotFound = func ( ctx * cli . Context , command string ) {
2017-03-06 22:35:26 -05:00
console . Printf ( "‘ %s’ is not a minio sub-command. See ‘ minio --help’ .\n" , command )
2016-08-18 19:23:42 -04:00
closestCommands := findClosestCommands ( command )
if len ( closestCommands ) > 0 {
2017-03-06 22:35:26 -05:00
console . Println ( )
console . Println ( "Did you mean one of these?" )
2016-08-18 19:23:42 -04:00
for _ , cmd := range closestCommands {
2017-03-06 22:35:26 -05:00
console . Printf ( "\t‘ %s’ \n" , cmd )
2016-08-18 19:23:42 -04:00
}
}
2017-03-06 22:35:26 -05:00
os . Exit ( 1 )
2016-11-28 15:15:36 -05:00
}
2017-03-06 22:35:26 -05:00
return app
2016-11-28 15:15:36 -05:00
}
// Main main for minio server.
2017-03-06 22:35:26 -05:00
func Main ( args [ ] string ) {
2017-06-12 20:33:21 -04:00
// Set the minio app name.
appName := filepath . Base ( args [ 0 ] )
2016-08-18 19:23:42 -04:00
// Run the app - exit on error.
2017-06-12 20:33:21 -04:00
if err := newApp ( appName ) . Run ( args ) ; err != nil {
2017-03-06 22:35:26 -05:00
os . Exit ( 1 )
2017-01-26 18:22:41 -05:00
}
2016-08-18 19:23:42 -04:00
}