2015-02-08 11:54:21 +01:00
/ *
config/main: Re-write config files - add to new config v3
- New config format.
```
{
"version": "3",
"address": ":9000",
"backend": {
"type": "fs",
"disk": "/path"
},
"credential": {
"accessKey": "WLGDGYAQYIGI833EV05A",
"secretKey": "BYvgJM101sHngl2uzjXS/OBF/aMxAN06JrJ3qJlF"
},
"region": "us-east-1",
"logger": {
"file": {
"enable": false,
"fileName": "",
"level": "error"
},
"syslog": {
"enable": false,
"address": "",
"level": "debug"
},
"console": {
"enable": true,
"level": "fatal"
}
}
}
```
New command lines in lieu of supporting XL.
Minio initialize filesystem backend.
~~~
$ minio init fs <path>
~~~
Minio initialize XL backend.
~~~
$ minio init xl <url1>...<url16>
~~~
For 'fs' backend it starts the server.
~~~
$ minio server
~~~
For 'xl' backend it waits for servers to join.
~~~
$ minio server
... [PROGRESS BAR] of servers connecting
~~~
Now on other servers execute 'join' and they connect.
~~~
....
minio join <url1> -- from <url2> && minio server
minio join <url1> -- from <url3> && minio server
...
...
minio join <url1> -- from <url16> && minio server
~~~
2016-02-13 00:27:10 +01:00
* Minio Cloud Storage , ( C ) 2015 , 2016 Minio , Inc .
2015-02-08 11:54:21 +01: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 .
* /
2015-01-14 20:29:04 +01:00
package main
2015-01-26 02:15:18 +01:00
import (
2015-04-02 21:48:22 +02:00
"fmt"
2015-01-29 04:52:30 +01:00
"os"
2016-02-11 01:40:09 +01:00
"sort"
2015-01-29 01:07:53 +01:00
2015-08-23 03:34:00 +02:00
"github.com/minio/cli"
2016-03-04 10:50:59 +01:00
"github.com/minio/mc/pkg/console"
2016-05-10 01:18:56 +02:00
"github.com/pkg/profile"
2016-03-25 01:20:49 +01:00
)
var (
// global flags for minio.
minioFlags = [ ] cli . Flag {
cli . BoolFlag {
Name : "help, h" ,
Usage : "Show help." ,
} ,
}
2015-01-26 02:15:18 +01:00
)
2015-11-21 17:57:38 +01:00
// Help template for minio.
var minioHelpTemplate = ` NAME :
{ { . Name } } - { { . Usage } }
DESCRIPTION :
{ { . Description } }
USAGE :
minio { { if . Flags } } [ flags ] { { end } } command { { if . Flags } } { { end } } [ arguments ... ]
COMMANDS :
{ { range . Commands } } { { join . Names ", " } } { { "\t" } } { { . Usage } }
{ { end } } { { if . Flags } }
FLAGS :
{ { range . Flags } } { { . } }
{ { end } } { { end } }
VERSION :
` + minioVersion +
2016-05-16 23:31:28 +02:00
` {{ "\n" }} `
2015-11-21 17:57:38 +01:00
2016-02-15 13:26:56 +01:00
// init - check the environment before main starts
2015-04-02 21:48:22 +02:00
func init ( ) {
2015-11-07 01:46:04 +01:00
// Check if minio was compiled using a supported version of Golang.
2016-02-15 13:26:56 +01:00
checkGoVersion ( )
2015-11-07 01:46:04 +01:00
2016-05-20 03:30:05 +02:00
// Set global trace flag.
globalTrace = os . Getenv ( "MINIO_TRACE" ) == "1"
2015-03-25 04:33:36 +01:00
}
2015-10-20 09:33:53 +02:00
func migrate ( ) {
// Migrate config file
migrateConfig ( )
config/main: Re-write config files - add to new config v3
- New config format.
```
{
"version": "3",
"address": ":9000",
"backend": {
"type": "fs",
"disk": "/path"
},
"credential": {
"accessKey": "WLGDGYAQYIGI833EV05A",
"secretKey": "BYvgJM101sHngl2uzjXS/OBF/aMxAN06JrJ3qJlF"
},
"region": "us-east-1",
"logger": {
"file": {
"enable": false,
"fileName": "",
"level": "error"
},
"syslog": {
"enable": false,
"address": "",
"level": "debug"
},
"console": {
"enable": true,
"level": "fatal"
}
}
}
```
New command lines in lieu of supporting XL.
Minio initialize filesystem backend.
~~~
$ minio init fs <path>
~~~
Minio initialize XL backend.
~~~
$ minio init xl <url1>...<url16>
~~~
For 'fs' backend it starts the server.
~~~
$ minio server
~~~
For 'xl' backend it waits for servers to join.
~~~
$ minio server
... [PROGRESS BAR] of servers connecting
~~~
Now on other servers execute 'join' and they connect.
~~~
....
minio join <url1> -- from <url2> && minio server
minio join <url1> -- from <url3> && minio server
...
...
minio join <url1> -- from <url16> && minio server
~~~
2016-02-13 00:27:10 +01:00
// Migrate other configs here.
}
func enableLoggers ( ) {
// Enable all loggers here.
enableConsoleLogger ( )
2016-04-24 09:36:00 +02:00
enableFileLogger ( )
config/main: Re-write config files - add to new config v3
- New config format.
```
{
"version": "3",
"address": ":9000",
"backend": {
"type": "fs",
"disk": "/path"
},
"credential": {
"accessKey": "WLGDGYAQYIGI833EV05A",
"secretKey": "BYvgJM101sHngl2uzjXS/OBF/aMxAN06JrJ3qJlF"
},
"region": "us-east-1",
"logger": {
"file": {
"enable": false,
"fileName": "",
"level": "error"
},
"syslog": {
"enable": false,
"address": "",
"level": "debug"
},
"console": {
"enable": true,
"level": "fatal"
}
}
}
```
New command lines in lieu of supporting XL.
Minio initialize filesystem backend.
~~~
$ minio init fs <path>
~~~
Minio initialize XL backend.
~~~
$ minio init xl <url1>...<url16>
~~~
For 'fs' backend it starts the server.
~~~
$ minio server
~~~
For 'xl' backend it waits for servers to join.
~~~
$ minio server
... [PROGRESS BAR] of servers connecting
~~~
Now on other servers execute 'join' and they connect.
~~~
....
minio join <url1> -- from <url2> && minio server
minio join <url1> -- from <url3> && minio server
...
...
minio join <url1> -- from <url16> && minio server
~~~
2016-02-13 00:27:10 +01:00
2016-07-24 07:51:12 +02:00
// Adding new bucket notification related loggers.
enableAMQPLogger ( )
enableElasticLogger ( )
2016-07-26 02:53:55 +02:00
enableRedisLogger ( )
2016-07-24 07:51:12 +02:00
config/main: Re-write config files - add to new config v3
- New config format.
```
{
"version": "3",
"address": ":9000",
"backend": {
"type": "fs",
"disk": "/path"
},
"credential": {
"accessKey": "WLGDGYAQYIGI833EV05A",
"secretKey": "BYvgJM101sHngl2uzjXS/OBF/aMxAN06JrJ3qJlF"
},
"region": "us-east-1",
"logger": {
"file": {
"enable": false,
"fileName": "",
"level": "error"
},
"syslog": {
"enable": false,
"address": "",
"level": "debug"
},
"console": {
"enable": true,
"level": "fatal"
}
}
}
```
New command lines in lieu of supporting XL.
Minio initialize filesystem backend.
~~~
$ minio init fs <path>
~~~
Minio initialize XL backend.
~~~
$ minio init xl <url1>...<url16>
~~~
For 'fs' backend it starts the server.
~~~
$ minio server
~~~
For 'xl' backend it waits for servers to join.
~~~
$ minio server
... [PROGRESS BAR] of servers connecting
~~~
Now on other servers execute 'join' and they connect.
~~~
....
minio join <url1> -- from <url2> && minio server
minio join <url1> -- from <url3> && minio server
...
...
minio join <url1> -- from <url16> && minio server
~~~
2016-02-13 00:27:10 +01:00
// Add your logger here.
2015-10-20 09:33:53 +02:00
}
2015-09-18 01:44:31 +02:00
func findClosestCommands ( command string ) [ ] string {
var closestCommands [ ] string
for _ , value := range commandsTree . PrefixMatch ( command ) {
closestCommands = append ( closestCommands , value . ( string ) )
}
2016-02-11 01:40:09 +01: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
if DamerauLevenshteinDistance ( command , value . ( string ) ) < 2 {
closestCommands = append ( closestCommands , value . ( string ) )
}
}
2015-09-18 01:44:31 +02:00
return closestCommands
}
2015-08-20 22:05:47 +02:00
func registerApp ( ) * cli . App {
config/main: Re-write config files - add to new config v3
- New config format.
```
{
"version": "3",
"address": ":9000",
"backend": {
"type": "fs",
"disk": "/path"
},
"credential": {
"accessKey": "WLGDGYAQYIGI833EV05A",
"secretKey": "BYvgJM101sHngl2uzjXS/OBF/aMxAN06JrJ3qJlF"
},
"region": "us-east-1",
"logger": {
"file": {
"enable": false,
"fileName": "",
"level": "error"
},
"syslog": {
"enable": false,
"address": "",
"level": "debug"
},
"console": {
"enable": true,
"level": "fatal"
}
}
}
```
New command lines in lieu of supporting XL.
Minio initialize filesystem backend.
~~~
$ minio init fs <path>
~~~
Minio initialize XL backend.
~~~
$ minio init xl <url1>...<url16>
~~~
For 'fs' backend it starts the server.
~~~
$ minio server
~~~
For 'xl' backend it waits for servers to join.
~~~
$ minio server
... [PROGRESS BAR] of servers connecting
~~~
Now on other servers execute 'join' and they connect.
~~~
....
minio join <url1> -- from <url2> && minio server
minio join <url1> -- from <url3> && minio server
...
...
minio join <url1> -- from <url16> && minio server
~~~
2016-02-13 00:27:10 +01:00
// Register all commands.
2015-08-20 22:05:47 +02:00
registerCommand ( serverCmd )
registerCommand ( versionCmd )
2015-10-18 00:03:46 +02:00
registerCommand ( updateCmd )
2015-08-20 22:05:47 +02:00
config/main: Re-write config files - add to new config v3
- New config format.
```
{
"version": "3",
"address": ":9000",
"backend": {
"type": "fs",
"disk": "/path"
},
"credential": {
"accessKey": "WLGDGYAQYIGI833EV05A",
"secretKey": "BYvgJM101sHngl2uzjXS/OBF/aMxAN06JrJ3qJlF"
},
"region": "us-east-1",
"logger": {
"file": {
"enable": false,
"fileName": "",
"level": "error"
},
"syslog": {
"enable": false,
"address": "",
"level": "debug"
},
"console": {
"enable": true,
"level": "fatal"
}
}
}
```
New command lines in lieu of supporting XL.
Minio initialize filesystem backend.
~~~
$ minio init fs <path>
~~~
Minio initialize XL backend.
~~~
$ minio init xl <url1>...<url16>
~~~
For 'fs' backend it starts the server.
~~~
$ minio server
~~~
For 'xl' backend it waits for servers to join.
~~~
$ minio server
... [PROGRESS BAR] of servers connecting
~~~
Now on other servers execute 'join' and they connect.
~~~
....
minio join <url1> -- from <url2> && minio server
minio join <url1> -- from <url3> && minio server
...
...
minio join <url1> -- from <url16> && minio server
~~~
2016-02-13 00:27:10 +01:00
// Set up app.
2015-01-29 04:52:30 +01:00
app := cli . NewApp ( )
2015-10-16 20:26:01 +02:00
app . Name = "Minio"
2015-03-25 04:33:36 +01:00
app . Author = "Minio.io"
2016-06-02 10:49:46 +02: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-03-25 01:20:49 +01:00
app . Flags = append ( minioFlags , globalFlags ... )
2015-04-23 06:31:29 +02:00
app . Commands = commands
2015-11-21 17:57:38 +01:00
app . CustomAppHelpTemplate = minioHelpTemplate
2015-08-04 03:01:18 +02:00
app . CommandNotFound = func ( ctx * cli . Context , command string ) {
2016-03-04 10:50:59 +01:00
msg := fmt . Sprintf ( "‘ %s’ is not a minio sub-command. See ‘ minio --help’ ." , command )
2015-09-18 01:44:31 +02:00
closestCommands := findClosestCommands ( command )
if len ( closestCommands ) > 0 {
msg += fmt . Sprintf ( "\n\nDid you mean one of these?\n" )
for _ , cmd := range closestCommands {
msg += fmt . Sprintf ( " ‘ %s’ \n" , cmd )
}
}
2016-03-04 10:50:59 +01:00
console . Fatalln ( msg )
2015-08-04 03:01:18 +02:00
}
2015-08-20 22:05:47 +02:00
return app
}
2015-12-06 23:31:20 +01:00
func checkMainSyntax ( c * cli . Context ) {
configPath , err := getConfigPath ( )
if err != nil {
2016-03-04 10:50:59 +01:00
console . Fatalf ( "Unable to obtain user's home directory. \nError: %s\n" , err )
2015-12-06 23:31:20 +01:00
}
if configPath == "" {
2016-03-25 01:20:49 +01:00
console . Fatalln ( "Config folder cannot be empty, please specify --config-dir <foldername>." )
2015-12-06 23:31:20 +01:00
}
}
2015-08-20 22:05:47 +02:00
func main ( ) {
app := registerApp ( )
2015-09-09 21:46:20 +02:00
app . Before = func ( c * cli . Context ) error {
2015-12-06 23:31:20 +01:00
// Sets new config folder.
2016-03-25 01:20:49 +01:00
setGlobalConfigPath ( c . GlobalString ( "config-dir" ) )
2015-12-06 23:31:20 +01:00
// Valid input arguments to main.
checkMainSyntax ( c )
// Migrate any old version of config / state files to newer format.
2015-10-20 09:33:53 +02:00
migrate ( )
2015-12-06 23:31:20 +01:00
config: Migrate to the new version. Remove backend details.
Migrate to new config format v4.
```
{
"version": "4",
"credential": {
"accessKey": "WLGDGYAQYIGI833EV05A",
"secretKey": "BYvgJM101sHngl2uzjXS/OBF/aMxAN06JrJ3qJlF"
},
"region": "us-east-1",
"logger": {
"console": {
"enable": true,
"level": "fatal"
},
"file": {
"enable": false,
"fileName": "",
"level": "error"
},
"syslog": {
"enable": false,
"address": "",
"level": "debug"
}
}
}
```
This patch also updates [minio cli spec](./minio.md)
2016-04-02 04:19:44 +02:00
// Initialize config.
err := initConfig ( )
2016-05-16 23:31:28 +02:00
fatalIf ( err , "Unable to initialize minio config." )
config: Migrate to the new version. Remove backend details.
Migrate to new config format v4.
```
{
"version": "4",
"credential": {
"accessKey": "WLGDGYAQYIGI833EV05A",
"secretKey": "BYvgJM101sHngl2uzjXS/OBF/aMxAN06JrJ3qJlF"
},
"region": "us-east-1",
"logger": {
"console": {
"enable": true,
"level": "fatal"
},
"file": {
"enable": false,
"fileName": "",
"level": "error"
},
"syslog": {
"enable": false,
"address": "",
"level": "debug"
}
}
}
```
This patch also updates [minio cli spec](./minio.md)
2016-04-02 04:19:44 +02:00
config/main: Re-write config files - add to new config v3
- New config format.
```
{
"version": "3",
"address": ":9000",
"backend": {
"type": "fs",
"disk": "/path"
},
"credential": {
"accessKey": "WLGDGYAQYIGI833EV05A",
"secretKey": "BYvgJM101sHngl2uzjXS/OBF/aMxAN06JrJ3qJlF"
},
"region": "us-east-1",
"logger": {
"file": {
"enable": false,
"fileName": "",
"level": "error"
},
"syslog": {
"enable": false,
"address": "",
"level": "debug"
},
"console": {
"enable": true,
"level": "fatal"
}
}
}
```
New command lines in lieu of supporting XL.
Minio initialize filesystem backend.
~~~
$ minio init fs <path>
~~~
Minio initialize XL backend.
~~~
$ minio init xl <url1>...<url16>
~~~
For 'fs' backend it starts the server.
~~~
$ minio server
~~~
For 'xl' backend it waits for servers to join.
~~~
$ minio server
... [PROGRESS BAR] of servers connecting
~~~
Now on other servers execute 'join' and they connect.
~~~
....
minio join <url1> -- from <url2> && minio server
minio join <url1> -- from <url3> && minio server
...
...
minio join <url1> -- from <url16> && minio server
~~~
2016-02-13 00:27:10 +01:00
// Enable all loggers by now.
enableLoggers ( )
2016-04-29 10:29:09 +02:00
// Initialize name space lock.
initNSLock ( )
2016-05-16 23:31:28 +02:00
// Set global quiet flag.
globalQuiet = c . Bool ( "quiet" ) || c . GlobalBool ( "quiet" )
2016-03-25 01:20:49 +01:00
// Do not print update messages, if quiet flag is set.
if ! globalQuiet {
// Do not print any errors in release update function.
noError := true
updateMsg := getReleaseUpdate ( minioUpdateStableURL , noError )
if updateMsg . Update {
console . Println ( updateMsg )
}
}
2015-09-09 21:46:20 +02:00
return nil
}
2016-05-19 23:50:54 +02:00
2016-05-23 07:11:39 +02:00
// Set ``MINIO_PROFILE_DIR`` to the directory where profiling information should be persisted
profileDir := os . Getenv ( "MINIO_PROFILE_DIR" )
2016-05-20 03:30:05 +02:00
// Enable profiler if ``MINIO_PROFILER`` is set. Supported options are [cpu, mem, block].
switch os . Getenv ( "MINIO_PROFILER" ) {
case "cpu" :
2016-05-23 07:11:39 +02:00
defer profile . Start ( profile . CPUProfile , profile . ProfilePath ( profileDir ) ) . Stop ( )
2016-05-20 03:30:05 +02:00
case "mem" :
2016-05-23 07:11:39 +02:00
defer profile . Start ( profile . MemProfile , profile . ProfilePath ( profileDir ) ) . Stop ( )
2016-05-20 03:30:05 +02:00
case "block" :
2016-05-23 07:11:39 +02:00
defer profile . Start ( profile . BlockProfile , profile . ProfilePath ( profileDir ) ) . Stop ( )
2016-05-20 03:30:05 +02:00
}
2016-05-19 23:50:54 +02:00
2016-03-25 01:20:49 +01:00
// Run the app - exit on error.
2015-04-06 00:52:31 +02:00
app . RunAndExitOnError ( )
2015-01-14 20:29:04 +01:00
}