/* * Minio Cloud Storage, (C) 2016 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 cmd /// Auth operations // Login - login handler. func (c *controllerAPIHandlers) LoginHandler(args *RPCLoginArgs, reply *RPCLoginReply) error { jwt, err := newJWT(defaultTokenExpiry) if err != nil { return err } if err = jwt.Authenticate(args.Username, args.Password); err != nil { return err } token, err := jwt.GenerateToken(args.Username) if err != nil { return err } reply.Token = token reply.ServerVersion = Version return nil } // HealListArgs - argument for ListObjects RPC. type HealListArgs struct { // Authentication token generated by Login. GenericArgs Bucket string Prefix string Marker string Delimiter string MaxKeys int } // HealListReply - reply object by ListObjects RPC. type HealListReply struct { IsTruncated bool NextMarker string Objects []string } // ListObjects - list all objects that needs healing. func (c *controllerAPIHandlers) ListObjectsHealHandler(args *HealListArgs, reply *HealListReply) error { objAPI := c.ObjectAPI() if objAPI == nil { return errVolumeBusy } if !isRPCTokenValid(args.Token) { return errInvalidToken } info, err := objAPI.ListObjectsHeal(args.Bucket, args.Prefix, args.Marker, args.Delimiter, args.MaxKeys) if err != nil { return err } reply.IsTruncated = info.IsTruncated reply.NextMarker = info.NextMarker for _, obj := range info.Objects { reply.Objects = append(reply.Objects, obj.Name) } return nil } // HealObjectArgs - argument for HealObject RPC. type HealObjectArgs struct { // Authentication token generated by Login. GenericArgs // Name of the bucket. Bucket string // Name of the object. Object string } // HealObjectReply - reply by HealObject RPC. type HealObjectReply struct{} // HealObject - heal the object. func (c *controllerAPIHandlers) HealObjectHandler(args *HealObjectArgs, reply *GenericReply) error { objAPI := c.ObjectAPI() if objAPI == nil { return errVolumeBusy } if !isRPCTokenValid(args.Token) { return errInvalidToken } return objAPI.HealObject(args.Bucket, args.Object) } // HealObject - heal the object. func (c *controllerAPIHandlers) HealDiskMetadataHandler(args *GenericArgs, reply *GenericReply) error { objAPI := c.ObjectAPI() if objAPI == nil { return errVolumeBusy } if !isRPCTokenValid(args.Token) { return errInvalidToken } err := objAPI.HealDiskMetadata() if err != nil { return err } go func() { globalWakeupCh <- struct{}{} }() return err } // ShutdownArgs - argument for Shutdown RPC. type ShutdownArgs struct { // Authentication token generated by Login. GenericArgs // Should the server be restarted, call active connections are served before server // is restarted. Restart bool } // Shutdown - Shutsdown the server. func (c *controllerAPIHandlers) ShutdownHandler(args *ShutdownArgs, reply *GenericReply) error { if !isRPCTokenValid(args.Token) { return errInvalidToken } if args.Restart { globalShutdownSignalCh <- shutdownRestart } else { globalShutdownSignalCh <- shutdownHalt } return nil } func (c *controllerAPIHandlers) TryInitHandler(args *GenericArgs, reply *GenericReply) error { go func() { globalWakeupCh <- struct{}{} }() *reply = GenericReply{} return nil } // LockInfo - RPC control handler for `minio control lock`. // Returns the info of the locks held in the system. func (c *controllerAPIHandlers) LockInfo(arg *GenericArgs, reply *SystemLockState) error { // obtain the lock state information. lockInfo, err := generateSystemLockResponse() // in case of error, return err to the RPC client. if err != nil { return err } // the response containing the lock info. *reply = lockInfo return nil }