mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2026-05-13 21:31:32 +00:00
* feat(shell): add group management commands Add weed shell commands for IAM group management: - s3.group.create -name <group> - s3.group.delete -name <group> - s3.group.list - s3.group.show -name <group> - s3.group.add-user -group <group> -user <user> - s3.group.remove-user -group <group> -user <user> All commands use GetConfiguration/PutConfiguration gRPC pattern, consistent with existing shell commands like s3.user.list. * fix: add nil check for Configuration in group shell commands Guard against nil Configuration response from GetConfiguration gRPC call to prevent potential panics. (Gemini review)
79 lines
1.8 KiB
Go
79 lines
1.8 KiB
Go
package shell
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"io"
|
|
"time"
|
|
|
|
"github.com/seaweedfs/seaweedfs/weed/pb"
|
|
"github.com/seaweedfs/seaweedfs/weed/pb/iam_pb"
|
|
"google.golang.org/grpc"
|
|
)
|
|
|
|
func init() {
|
|
Commands = append(Commands, &commandS3GroupList{})
|
|
}
|
|
|
|
type commandS3GroupList struct {
|
|
}
|
|
|
|
func (c *commandS3GroupList) Name() string {
|
|
return "s3.group.list"
|
|
}
|
|
|
|
func (c *commandS3GroupList) Help() string {
|
|
return `list S3 IAM groups
|
|
|
|
s3.group.list
|
|
|
|
Output: JSON array of groups with members and policies.
|
|
`
|
|
}
|
|
|
|
func (c *commandS3GroupList) HasTag(CommandTag) bool {
|
|
return false
|
|
}
|
|
|
|
type s3GroupListEntry struct {
|
|
Name string `json:"name"`
|
|
Status string `json:"status"`
|
|
Members int `json:"members"`
|
|
Policies []string `json:"policies"`
|
|
}
|
|
|
|
func (c *commandS3GroupList) Do(args []string, commandEnv *CommandEnv, writer io.Writer) error {
|
|
return pb.WithGrpcClient(false, 0, func(conn *grpc.ClientConn) error {
|
|
client := iam_pb.NewSeaweedIdentityAccessManagementClient(conn)
|
|
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
|
defer cancel()
|
|
|
|
resp, err := client.GetConfiguration(ctx, &iam_pb.GetConfigurationRequest{})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var result []s3GroupListEntry
|
|
for _, g := range resp.Configuration.GetGroups() {
|
|
status := "enabled"
|
|
if g.Disabled {
|
|
status = "disabled"
|
|
}
|
|
policies := g.PolicyNames
|
|
if policies == nil {
|
|
policies = []string{}
|
|
}
|
|
result = append(result, s3GroupListEntry{
|
|
Name: g.Name,
|
|
Status: status,
|
|
Members: len(g.Members),
|
|
Policies: policies,
|
|
})
|
|
}
|
|
if result == nil {
|
|
result = []s3GroupListEntry{}
|
|
}
|
|
return json.NewEncoder(writer).Encode(result)
|
|
}, commandEnv.option.FilerAddress.ToGrpcAddress(), false, commandEnv.option.GrpcDialOption)
|
|
}
|