Add support for customizable user (#7569)
parent
1008c2c069
commit
91ceae23d0
@ -0,0 +1,136 @@ |
|||||||
|
// +build ignore
|
||||||
|
|
||||||
|
/* |
||||||
|
* MinIO Cloud Storage, (C) 2019 MinIO, Inc. |
||||||
|
* |
||||||
|
* 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 main |
||||||
|
|
||||||
|
import ( |
||||||
|
"fmt" |
||||||
|
"log" |
||||||
|
"os" |
||||||
|
"os/exec" |
||||||
|
"os/user" |
||||||
|
"syscall" |
||||||
|
|
||||||
|
"github.com/minio/cli" |
||||||
|
minio "github.com/minio/minio/cmd" |
||||||
|
) |
||||||
|
|
||||||
|
var defaultUserGroup string |
||||||
|
|
||||||
|
func init() { |
||||||
|
username := os.Getenv("MINIO_USERNAME") |
||||||
|
groupname := os.Getenv("MINIO_GROUPNAME") |
||||||
|
defaultUserGroup = username + ":" + groupname |
||||||
|
} |
||||||
|
|
||||||
|
func getUserGroup(path string) (string, error) { |
||||||
|
fi, err := os.Stat(minio.PathJoin(path, ".minio.sys")) |
||||||
|
if err != nil { |
||||||
|
// Fresh directory we should default to what was requested by user.
|
||||||
|
if os.IsNotExist(err) { |
||||||
|
cmd := exec.Command("chown", "-R", defaultUserGroup, path) |
||||||
|
if err = cmd.Run(); err != nil { |
||||||
|
return "", err |
||||||
|
} |
||||||
|
return defaultUserGroup, nil |
||||||
|
} |
||||||
|
return "", err |
||||||
|
} |
||||||
|
stat, ok := fi.Sys().(*syscall.Stat_t) |
||||||
|
if !ok { |
||||||
|
// Unable to figure out uid/gid, default to defaultUserGroup
|
||||||
|
return defaultUserGroup, nil |
||||||
|
} |
||||||
|
u, err := user.LookupId(fmt.Sprintf("%d", stat.Uid)) |
||||||
|
if err != nil { |
||||||
|
return fmt.Sprintf("%d:%d", stat.Uid, stat.Gid), nil |
||||||
|
} |
||||||
|
g, err := user.LookupGroupId(fmt.Sprintf("%d", stat.Gid)) |
||||||
|
if err != nil { |
||||||
|
return fmt.Sprintf("%d:%d", stat.Uid, stat.Gid), nil |
||||||
|
} |
||||||
|
return fmt.Sprintf("%s:%s", u.Username, g.Name), nil |
||||||
|
} |
||||||
|
|
||||||
|
func main() { |
||||||
|
app := cli.NewApp() |
||||||
|
app.Flags = append(minio.ServerFlags, minio.GlobalFlags...) |
||||||
|
app.Action = func(ctx *cli.Context) { |
||||||
|
// Fetch address option
|
||||||
|
serverAddr := ctx.GlobalString("address") |
||||||
|
if serverAddr == "" || serverAddr == ":9000" { |
||||||
|
serverAddr = ctx.String("address") |
||||||
|
} |
||||||
|
if ctx.Args().First() == "help" { |
||||||
|
cli.ShowCommandHelpAndExit(ctx, "check-user", 1) |
||||||
|
} |
||||||
|
if ctx.Args().First() != "minio" { |
||||||
|
cli.ShowCommandHelpAndExit(ctx, "check-user", 1) |
||||||
|
} |
||||||
|
args := cli.Args(ctx.Args().Tail()) |
||||||
|
if !args.Present() { |
||||||
|
cli.ShowCommandHelpAndExit(ctx, "check-user", 1) |
||||||
|
} |
||||||
|
var ug string |
||||||
|
var err error |
||||||
|
switch args.First() { |
||||||
|
case "gateway": |
||||||
|
args = cli.Args(args.Tail()) |
||||||
|
if args.First() != "nas" { |
||||||
|
fmt.Println(defaultUserGroup) |
||||||
|
return |
||||||
|
} |
||||||
|
args = cli.Args(args.Tail()) |
||||||
|
if args.First() == "" { |
||||||
|
fmt.Println("") |
||||||
|
return |
||||||
|
} |
||||||
|
ug, err = getUserGroup(args.First()) |
||||||
|
if err != nil { |
||||||
|
log.Fatalln(err) |
||||||
|
} |
||||||
|
case "server": |
||||||
|
var setArgs [][]string |
||||||
|
setArgs, err = minio.GetAllSets(args.Tail()...) |
||||||
|
if err != nil { |
||||||
|
log.Fatalln(err) |
||||||
|
} |
||||||
|
var endpoints minio.EndpointList |
||||||
|
_, endpoints, _, err = minio.CreateEndpoints(serverAddr, setArgs...) |
||||||
|
if err != nil { |
||||||
|
log.Fatalln(err) |
||||||
|
} |
||||||
|
for _, endpoint := range endpoints { |
||||||
|
if !endpoint.IsLocal { |
||||||
|
continue |
||||||
|
} |
||||||
|
ug, err = getUserGroup(endpoint.Path) |
||||||
|
if err != nil { |
||||||
|
log.Fatalln(err) |
||||||
|
} |
||||||
|
break |
||||||
|
} |
||||||
|
default: |
||||||
|
cli.ShowCommandHelpAndExit(ctx, "check-user", 1) |
||||||
|
} |
||||||
|
fmt.Println(ug) |
||||||
|
} |
||||||
|
if err := app.Run(os.Args); err != nil { |
||||||
|
log.Fatalln(err) |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue