| 
									
										
										
										
											2015-07-01 11:15:48 +08: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 07:27:10 +08:00
										 |  |  |  * Minio Cloud Storage, (C) 2015, 2016 Minio, Inc. | 
					
						
							| 
									
										
										
										
											2015-07-01 11:15:48 +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. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-19 07:23:42 +08:00
										 |  |  | package cmd | 
					
						
							| 
									
										
										
										
											2015-07-01 11:15:48 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"net/http" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-23 09:34:00 +08:00
										 |  |  | 	router "github.com/gorilla/mux" | 
					
						
							| 
									
										
										
										
											2015-07-01 11:15:48 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-03 17:07:45 +08:00
										 |  |  | func newObjectLayerFn() (layer ObjectLayer) { | 
					
						
							|  |  |  | 	globalObjLayerMutex.RLock() | 
					
						
							|  |  |  | 	layer = globalObjectAPI | 
					
						
							|  |  |  | 	globalObjLayerMutex.RUnlock() | 
					
						
							|  |  |  | 	return | 
					
						
							| 
									
										
										
										
											2016-08-31 10:22:27 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-10 16:42:22 +08:00
										 |  |  | // Composed function registering routers for only distributed XL setup.
 | 
					
						
							|  |  |  | func registerDistXLRouters(mux *router.Router, srvCmdConfig serverCmdConfig) error { | 
					
						
							|  |  |  | 	// Register storage rpc router only if its a distributed setup.
 | 
					
						
							|  |  |  | 	err := registerStorageRPCRouters(mux, srvCmdConfig) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Register distributed namespace lock.
 | 
					
						
							|  |  |  | 	err = registerDistNSLockRouter(mux, srvCmdConfig) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Register S3 peer communication router.
 | 
					
						
							|  |  |  | 	err = registerS3PeerRPCRouter(mux) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Register RPC router for web related calls.
 | 
					
						
							|  |  |  | 	return registerBrowserPeerRPCRouter(mux) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
											
												routers: Fix a crash while initializing network fs. (#1382)
Crash happens when 'minio server filename' a file name is
provided instead of a directory on command line argument.
```
panic: runtime error: slice bounds out of range
goroutine 1 [running]:
panic(0x5eb460, 0xc82000e0b0)
	/usr/local/opt/go/libexec/src/runtime/panic.go:464 +0x3e6
main.splitNetPath(0x7fff5fbff9bd, 0x7, 0x0, 0x0, 0x0, 0x0)
	/Users/harsha/mygo/src/github.com/minio/minio/network-fs.go:49 +0xb7
main.newNetworkFS(0x7fff5fbff9bd, 0x7, 0x0, 0x0, 0x0, 0x0)
	/Users/harsha/mygo/src/github.com/minio/minio/network-fs.go:90 +0x20a
main.configureServerHandler(0xc82024e1c8, 0x5, 0xc8200640e0, 0x1, 0x1, 0x0, 0x0)
	/Users/harsha/mygo/src/github.com/minio/minio/routers.go:43 +0x6ce
main.configureServer(0xc82024e1c8, 0x5, 0xc8200640e0, 0x1, 0x1, 0x5)
	/Users/harsha/mygo/src/github.com/minio/minio/server-main.go:86 +0x67
```
											
										 
											2016-04-26 09:10:40 +08:00
										 |  |  | // configureServer handler returns final handler for the http server.
 | 
					
						
							| 
									
										
										
										
											2016-10-13 14:13:24 +08:00
										 |  |  | func configureServerHandler(srvCmdConfig serverCmdConfig) (http.Handler, error) { | 
					
						
							| 
									
										
										
										
											2016-11-17 08:23:22 +08:00
										 |  |  | 	// Initialize router. `SkipClean(true)` stops gorilla/mux from
 | 
					
						
							|  |  |  | 	// normalizing URL path minio/minio#3256
 | 
					
						
							|  |  |  | 	mux := router.NewRouter().SkipClean(true) | 
					
						
							| 
									
										
										
										
											2016-03-28 03:37:21 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-19 05:50:50 +08:00
										 |  |  | 	// Initialize distributed NS lock.
 | 
					
						
							| 
									
										
										
										
											2016-11-08 04:09:24 +08:00
										 |  |  | 	if globalIsDistXL { | 
					
						
							| 
									
										
										
										
											2016-12-10 16:42:22 +08:00
										 |  |  | 		registerDistXLRouters(mux, srvCmdConfig) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-10-06 17:30:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-16 14:26:15 +08:00
										 |  |  | 	// Add Admin RPC router
 | 
					
						
							|  |  |  | 	err := registerAdminRPCRouter(mux) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		return nil, err | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-10 16:42:22 +08:00
										 |  |  | 	// Register web router when its enabled.
 | 
					
						
							|  |  |  | 	if globalIsBrowserEnabled { | 
					
						
							|  |  |  | 		if err := registerWebRouter(mux); err != nil { | 
					
						
							| 
									
										
										
										
											2016-10-13 14:13:24 +08:00
										 |  |  | 			return nil, err | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-10-06 03:48:07 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-07-28 19:00:33 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-16 14:26:15 +08:00
										 |  |  | 	// Add Admin router.
 | 
					
						
							|  |  |  | 	registerAdminRouter(mux) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-06 03:48:07 +08:00
										 |  |  | 	// Add API router.
 | 
					
						
							|  |  |  | 	registerAPIRouter(mux) | 
					
						
							| 
									
										
										
										
											2016-03-28 03:37:21 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-25 01:14:14 +08:00
										 |  |  | 	// List of some generic handlers which are applied for all incoming requests.
 | 
					
						
							| 
									
										
										
										
											2016-02-05 06:57:20 +08:00
										 |  |  | 	var handlerFns = []HandlerFunc{ | 
					
						
							| 
									
										
										
										
											2017-02-07 01:29:53 +08:00
										 |  |  | 		// Network statistics
 | 
					
						
							|  |  |  | 		setHTTPStatsHandler, | 
					
						
							| 
									
										
										
										
											2016-07-29 03:02:22 +08:00
										 |  |  | 		// Limits all requests size to a maximum fixed limit
 | 
					
						
							|  |  |  | 		setRequestSizeLimitHandler, | 
					
						
							| 
									
										
										
										
											2016-07-28 10:53:55 +08:00
										 |  |  | 		// Adds 'crossdomain.xml' policy handler to serve legacy flash clients.
 | 
					
						
							|  |  |  | 		setCrossDomainPolicy, | 
					
						
							|  |  |  | 		// Redirect some pre-defined browser request paths to a static location prefix.
 | 
					
						
							| 
									
										
										
										
											2016-02-17 10:50:36 +08:00
										 |  |  | 		setBrowserRedirectHandler, | 
					
						
							|  |  |  | 		// Validates if incoming request is for restricted buckets.
 | 
					
						
							|  |  |  | 		setPrivateBucketHandler, | 
					
						
							|  |  |  | 		// Adds cache control for all browser requests.
 | 
					
						
							|  |  |  | 		setBrowserCacheControlHandler, | 
					
						
							| 
									
										
										
										
											2016-11-12 08:36:07 +08:00
										 |  |  | 		// Validates all incoming requests to have a valid date header.
 | 
					
						
							|  |  |  | 		setTimeValidityHandler, | 
					
						
							| 
									
										
										
										
											2016-02-17 10:50:36 +08:00
										 |  |  | 		// CORS setting for all browser API requests.
 | 
					
						
							|  |  |  | 		setCorsHandler, | 
					
						
							|  |  |  | 		// Validates all incoming URL resources, for invalid/unsupported
 | 
					
						
							|  |  |  | 		// resources client receives a HTTP error.
 | 
					
						
							| 
									
										
										
										
											2016-02-05 06:57:20 +08:00
										 |  |  | 		setIgnoreResourcesHandler, | 
					
						
							| 
									
										
										
										
											2016-02-17 10:50:36 +08:00
										 |  |  | 		// Auth handler verifies incoming authorization headers and
 | 
					
						
							|  |  |  | 		// routes them accordingly. Client receives a HTTP error for
 | 
					
						
							|  |  |  | 		// invalid/unsupported signatures.
 | 
					
						
							| 
									
										
										
										
											2016-02-16 09:42:39 +08:00
										 |  |  | 		setAuthHandler, | 
					
						
							| 
									
										
										
										
											2016-03-28 03:37:21 +08:00
										 |  |  | 		// Add new handlers here.
 | 
					
						
							| 
									
										
										
										
											2015-10-07 14:32:20 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-02-18 18:13:52 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Register rest of the handlers.
 | 
					
						
							| 
									
										
										
										
											2016-10-13 14:13:24 +08:00
										 |  |  | 	return registerHandlers(mux, handlerFns...), nil | 
					
						
							| 
									
										
										
										
											2015-07-01 11:15:48 +08:00
										 |  |  | } |