2015-02-08 05:54:21 -05: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-12 18:27:10 -05:00
* Minio Cloud Storage , ( C ) 2015 , 2016 Minio , Inc .
2015-02-08 05:54:21 -05: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 14:29:04 -05:00
package main
2015-01-25 20:15:18 -05:00
import (
2015-04-02 15:48:22 -04:00
"fmt"
2015-01-28 22:52:30 -05:00
"os"
2016-02-10 19:40:09 -05:00
"sort"
2015-01-28 19:07:53 -05:00
2015-08-22 21:34:00 -04:00
"github.com/minio/cli"
2016-03-04 04:50:59 -05:00
"github.com/minio/mc/pkg/console"
2016-05-09 19:18:56 -04:00
"github.com/pkg/profile"
2016-03-24 20:20:49 -04:00
)
var (
// global flags for minio.
minioFlags = [ ] cli . Flag {
cli . BoolFlag {
Name : "help, h" ,
Usage : "Show help." ,
} ,
}
2015-01-25 20:15:18 -05:00
)
2015-11-21 11:57:38 -05: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 17:31:28 -04:00
` {{ "\n" }} `
2015-11-21 11:57:38 -05:00
2016-02-15 07:26:56 -05:00
// init - check the environment before main starts
2015-04-02 15:48:22 -04:00
func init ( ) {
2015-11-06 19:46:04 -05:00
// Check if minio was compiled using a supported version of Golang.
2016-02-15 07:26:56 -05:00
checkGoVersion ( )
2015-11-06 19:46:04 -05:00
2016-05-19 21:30:05 -04:00
// Set global trace flag.
globalTrace = os . Getenv ( "MINIO_TRACE" ) == "1"
2015-03-24 23:33:36 -04:00
}
2015-10-20 03:33:53 -04: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-12 18:27:10 -05:00
// Migrate other configs here.
}
func enableLoggers ( ) {
// Enable all loggers here.
enableConsoleLogger ( )
2016-04-24 03:36:00 -04: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-12 18:27:10 -05:00
// Add your logger here.
2015-10-20 03:33:53 -04:00
}
2015-09-17 19:44:31 -04:00
func findClosestCommands ( command string ) [ ] string {
var closestCommands [ ] string
for _ , value := range commandsTree . PrefixMatch ( command ) {
closestCommands = append ( closestCommands , value . ( string ) )
}
2016-02-10 19:40:09 -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
if DamerauLevenshteinDistance ( command , value . ( string ) ) < 2 {
closestCommands = append ( closestCommands , value . ( string ) )
}
}
2015-09-17 19:44:31 -04:00
return closestCommands
}
2015-08-20 16:05:47 -04: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-12 18:27:10 -05:00
// Register all commands.
2015-08-20 16:05:47 -04:00
registerCommand ( serverCmd )
registerCommand ( versionCmd )
2015-10-17 18:03:46 -04:00
registerCommand ( updateCmd )
2015-08-20 16:05:47 -04: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-12 18:27:10 -05:00
// Set up app.
2015-01-28 22:52:30 -05:00
app := cli . NewApp ( )
2015-10-16 14:26:01 -04:00
app . Name = "Minio"
2015-03-24 23:33:36 -04:00
app . Author = "Minio.io"
2016-06-02 04:49:46 -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-03-24 20:20:49 -04:00
app . Flags = append ( minioFlags , globalFlags ... )
2015-04-23 00:31:29 -04:00
app . Commands = commands
2015-11-21 11:57:38 -05:00
app . CustomAppHelpTemplate = minioHelpTemplate
2015-08-03 21:01:18 -04:00
app . CommandNotFound = func ( ctx * cli . Context , command string ) {
2016-03-04 04:50:59 -05:00
msg := fmt . Sprintf ( "‘ %s’ is not a minio sub-command. See ‘ minio --help’ ." , command )
2015-09-17 19:44:31 -04: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 04:50:59 -05:00
console . Fatalln ( msg )
2015-08-03 21:01:18 -04:00
}
2015-08-20 16:05:47 -04:00
return app
}
2015-12-06 17:31:20 -05:00
func checkMainSyntax ( c * cli . Context ) {
configPath , err := getConfigPath ( )
if err != nil {
2016-03-04 04:50:59 -05:00
console . Fatalf ( "Unable to obtain user's home directory. \nError: %s\n" , err )
2015-12-06 17:31:20 -05:00
}
if configPath == "" {
2016-03-24 20:20:49 -04:00
console . Fatalln ( "Config folder cannot be empty, please specify --config-dir <foldername>." )
2015-12-06 17:31:20 -05:00
}
}
2015-08-20 16:05:47 -04:00
func main ( ) {
app := registerApp ( )
2015-09-09 15:46:20 -04:00
app . Before = func ( c * cli . Context ) error {
2015-12-06 17:31:20 -05:00
// Sets new config folder.
2016-03-24 20:20:49 -04:00
setGlobalConfigPath ( c . GlobalString ( "config-dir" ) )
2015-12-06 17:31:20 -05:00
// Valid input arguments to main.
checkMainSyntax ( c )
// Migrate any old version of config / state files to newer format.
2015-10-20 03:33:53 -04:00
migrate ( )
2015-12-06 17:31:20 -05: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-01 22:19:44 -04:00
// Initialize config.
err := initConfig ( )
2016-05-16 17:31:28 -04: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-01 22:19:44 -04: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-12 18:27:10 -05:00
// Enable all loggers by now.
enableLoggers ( )
2016-04-29 04:29:09 -04:00
// Initialize name space lock.
initNSLock ( )
2016-05-16 17:31:28 -04:00
// Set global quiet flag.
globalQuiet = c . Bool ( "quiet" ) || c . GlobalBool ( "quiet" )
2016-03-24 20:20:49 -04: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 15:46:20 -04:00
return nil
}
2016-05-19 17:50:54 -04:00
2016-05-23 01:11:39 -04:00
// Set ``MINIO_PROFILE_DIR`` to the directory where profiling information should be persisted
profileDir := os . Getenv ( "MINIO_PROFILE_DIR" )
2016-05-19 21:30:05 -04:00
// Enable profiler if ``MINIO_PROFILER`` is set. Supported options are [cpu, mem, block].
switch os . Getenv ( "MINIO_PROFILER" ) {
case "cpu" :
2016-05-23 01:11:39 -04:00
defer profile . Start ( profile . CPUProfile , profile . ProfilePath ( profileDir ) ) . Stop ( )
2016-05-19 21:30:05 -04:00
case "mem" :
2016-05-23 01:11:39 -04:00
defer profile . Start ( profile . MemProfile , profile . ProfilePath ( profileDir ) ) . Stop ( )
2016-05-19 21:30:05 -04:00
case "block" :
2016-05-23 01:11:39 -04:00
defer profile . Start ( profile . BlockProfile , profile . ProfilePath ( profileDir ) ) . Stop ( )
2016-05-19 21:30:05 -04:00
}
2016-05-19 17:50:54 -04:00
2016-08-05 16:48:31 -04:00
// Initialize and monitor shutdown signal
shutdownSignal = make ( chan bool , 1 )
2016-08-07 02:53:10 -04:00
monitorShutdownSignal ( os . Exit )
2016-08-05 16:48:31 -04:00
2016-03-24 20:20:49 -04:00
// Run the app - exit on error.
2015-04-05 18:52:31 -04:00
app . RunAndExitOnError ( )
2015-01-14 14:29:04 -05:00
}