Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions cmd/acl/acl.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ import (
"github.com/go-zookeeper/zk"
"github.com/jam2in/arcus-cli/cmd/acl/group"
"github.com/jam2in/arcus-cli/cmd/acl/user"
"github.com/jam2in/arcus-cli/internal"
"github.com/jam2in/arcus-cli/internal/types"
"github.com/jam2in/arcus-cli/internal/zookeeper"
"github.com/spf13/cobra"
)

Expand All @@ -21,7 +22,7 @@ var AclCmd = &cobra.Command{
"allowing you to manage user groups and individual user credentials for SASL authentication.\n" +
"A typical workflow involves creating a group first and then adding users to it.\n",
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
ctx, err := internal.ContextWithZkConn(cmd.Context(), digestUsername, digestPassword)
ctx, err := zookeeper.ContextWithZkConn(cmd.Context(), digestUsername, digestPassword)
if err != nil {
return err
}
Expand All @@ -30,7 +31,7 @@ var AclCmd = &cobra.Command{
return nil
},
PersistentPostRun: func(cmd *cobra.Command, args []string) {
zkConn := cmd.Context().Value(internal.CtxZkConnKey{}).(*zk.Conn)
zkConn := cmd.Context().Value(types.CtxZkConnKey{}).(*zk.Conn)
zkConn.Close()
},
}
Expand Down
12 changes: 5 additions & 7 deletions cmd/acl/group/add.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ import (
"os"

"github.com/go-zookeeper/zk"
"github.com/jam2in/arcus-cli/internal"
"github.com/jam2in/arcus-cli/internal/acl"
"github.com/jam2in/arcus-cli/internal/types"
"github.com/spf13/cobra"
)

Expand All @@ -15,16 +16,13 @@ var addCmd = &cobra.Command{
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
groupName := args[0]
zkConn := cmd.Context().Value(types.CtxZkConnKey{}).(*zk.Conn)
zkAcl := cmd.Context().Value(types.CtxZkAclKey{}).([]zk.ACL)

zkConn := cmd.Context().Value(internal.CtxZkConnKey{}).(*zk.Conn)
acl := cmd.Context().Value(internal.CtxZkAclKey{}).([]zk.ACL)

_, err := zkConn.Create(internal.AclRootPath+"/"+groupName, nil, 0, acl)
if err != nil {
if err := acl.AddGroup(zkConn, zkAcl, groupName); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}

fmt.Printf("ACL group '%s' created successfully.\n", groupName)
},
}
7 changes: 4 additions & 3 deletions cmd/acl/group/list.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ import (
"os"

"github.com/go-zookeeper/zk"
"github.com/jam2in/arcus-cli/internal"
"github.com/jam2in/arcus-cli/internal/acl"
"github.com/jam2in/arcus-cli/internal/types"
"github.com/spf13/cobra"
)

Expand All @@ -14,9 +15,9 @@ var listCmd = &cobra.Command{
Short: "List all ACL groups.",
Args: cobra.NoArgs,
Run: func(cmd *cobra.Command, args []string) {
zkConn := cmd.Context().Value(internal.CtxZkConnKey{}).(*zk.Conn)
zkConn := cmd.Context().Value(types.CtxZkConnKey{}).(*zk.Conn)

groups, _, err := zkConn.Children(internal.AclRootPath)
groups, err := acl.GetGroups(zkConn)
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
Expand Down
8 changes: 4 additions & 4 deletions cmd/acl/group/remove.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ import (
"os"

"github.com/go-zookeeper/zk"
"github.com/jam2in/arcus-cli/internal"
"github.com/jam2in/arcus-cli/internal/acl"
"github.com/jam2in/arcus-cli/internal/types"
"github.com/spf13/cobra"
)

Expand All @@ -15,10 +16,9 @@ var removeCmd = &cobra.Command{
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
groupName := args[0]
zkConn := cmd.Context().Value(types.CtxZkConnKey{}).(*zk.Conn)

zkConn := cmd.Context().Value(internal.CtxZkConnKey{}).(*zk.Conn)

if err := zkConn.Delete(internal.AclRootPath+"/"+groupName, -1); err != nil {
if err := acl.RemoveGroup(zkConn, groupName); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
Expand Down
41 changes: 10 additions & 31 deletions cmd/acl/user/add.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ import (
"syscall"

"github.com/go-zookeeper/zk"
"github.com/jam2in/arcus-cli/internal"
"github.com/jam2in/arcus-cli/internal/scram"
"github.com/jam2in/arcus-cli/internal/acl"
"github.com/jam2in/arcus-cli/internal/types"
"github.com/spf13/cobra"
"golang.org/x/term"
)
Expand All @@ -33,24 +33,17 @@ var addCmd = &cobra.Command{
Run: func(cmd *cobra.Command, args []string) {
groupName := args[0]
userArgs := args[1:]
zkConn := cmd.Context().Value(types.CtxZkConnKey{}).(*zk.Conn)
zkAcl := cmd.Context().Value(types.CtxZkAclKey{}).([]zk.ACL)

zkConn := cmd.Context().Value(internal.CtxZkConnKey{}).(*zk.Conn)
acl := cmd.Context().Value(internal.CtxZkAclKey{}).([]zk.ACL)

requests := make([]any, 0, 2*len(userArgs))
var err error
for _, arg := range userArgs {
requests, err = appendRequests(requests, groupName, arg, acl)
err = addUserRequest(zkConn, zkAcl, groupName, arg)
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}

if _, err := zkConn.Multi(requests...); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
},
}

Expand Down Expand Up @@ -93,7 +86,7 @@ func validateRoles(role string) error {
return nil
}

func appendRequests(requests []any, group, arg string, acl []zk.ACL) ([]any, error) {
func addUserRequest(zkConn *zk.Conn, zkAcl []zk.ACL, group, arg string) error {
tokens := strings.Split(arg, ":")
var user, password, role string
switch len(tokens) {
Expand All @@ -106,28 +99,14 @@ func appendRequests(requests []any, group, arg string, acl []zk.ACL) ([]any, err
password = tokens[1]
role = tokens[2]
default:
return nil, fmt.Errorf("invalid argument format: %s", arg)
return fmt.Errorf("invalid argument format: %s", arg)
}

if user == "" || password == "" {
return nil, fmt.Errorf("user & password cannot be empty: %s", arg)
return fmt.Errorf("user & password cannot be empty: %s", arg)
} else if err := validateRoles(role); err != nil {
return nil, err
return err
}

secret := scram.GenerateScramSHA256Secret(password, nil, 0)
return append(requests,
&zk.CreateRequest{
Path: internal.AclRootPath + "/" + group + "/" + user,
Data: []byte(role),
Acl: acl,
Flags: 0,
},
&zk.CreateRequest{
Path: internal.AclRootPath + "/" + group + "/" + user + "/" + propName,
Data: []byte(secret.EncodeToBase64()),
Acl: acl,
Flags: 0,
},
), nil
return acl.AddUser(zkConn, zkAcl, group, user, password, role)
}
31 changes: 4 additions & 27 deletions cmd/acl/user/list.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,10 @@ package user
import (
"fmt"
"os"
"path"
"strings"

"github.com/go-zookeeper/zk"
"github.com/jam2in/arcus-cli/internal"
"github.com/jam2in/arcus-cli/internal/acl"
"github.com/jam2in/arcus-cli/internal/types"
"github.com/spf13/cobra"
)

Expand All @@ -17,10 +16,9 @@ var listCmd = &cobra.Command{
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
groupName := args[0]
zkConn := cmd.Context().Value(types.CtxZkConnKey{}).(*zk.Conn)

zkConn := cmd.Context().Value(internal.CtxZkConnKey{}).(*zk.Conn)

users, err := listUsers(zkConn, groupName)
users, err := acl.GetUsers(zkConn, groupName)
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
Expand All @@ -33,24 +31,3 @@ var listCmd = &cobra.Command{
fmt.Printf("Total %d users in group '%s'.\n", len(users), groupName)
},
}

func listUsers(zkConn *zk.Conn, groupName string) ([]UserInfo, error) {
groupPath := internal.AclRootPath + "/" + groupName

userNames, _, err := zkConn.Children(groupPath)
if err != nil {
return nil, err
}

users := make([]UserInfo, 0, len(userNames))
for _, userName := range userNames {
userPath := path.Join(groupPath, userName)
roleBytes, _, err := zkConn.Get(userPath)
if err != nil {
return nil, err
}
users = append(users, UserInfo{Username: userName, Roles: strings.Split(string(roleBytes), ",")})
}

return users, nil
}
18 changes: 4 additions & 14 deletions cmd/acl/user/remove.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ import (
"os"

"github.com/go-zookeeper/zk"
"github.com/jam2in/arcus-cli/internal"
"github.com/jam2in/arcus-cli/internal/acl"
"github.com/jam2in/arcus-cli/internal/types"
"github.com/spf13/cobra"
)

Expand All @@ -16,23 +17,12 @@ var removeCmd = &cobra.Command{
Run: func(cmd *cobra.Command, args []string) {
groupName := args[0]
userName := args[1]
zkConn := cmd.Context().Value(types.CtxZkConnKey{}).(*zk.Conn)

zkConn := cmd.Context().Value(internal.CtxZkConnKey{}).(*zk.Conn)

if _, err := zkConn.Multi(
&zk.DeleteRequest{
Path: internal.AclRootPath + "/" + groupName + "/" + userName + "/" + propName,
Version: -1,
},
&zk.DeleteRequest{
Path: internal.AclRootPath + "/" + groupName + "/" + userName,
Version: -1,
},
); err != nil {
if err := acl.RemoveUser(zkConn, groupName, userName); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}

fmt.Printf("User '%s' removed from group '%s' successfully.\n", userName, groupName)
},
}
13 changes: 0 additions & 13 deletions cmd/acl/user/user.go
Original file line number Diff line number Diff line change
@@ -1,22 +1,9 @@
package user

import (
"fmt"

"github.com/spf13/cobra"
)

const propName = "authPassword"

type UserInfo struct {
Username string
Roles []string
}

func (i UserInfo) String() string {
return fmt.Sprintf("Username: %s, Role: %s", i.Username, i.Roles)
}

var UserCmd = &cobra.Command{
Use: "user",
Short: "Manage SASL users within an ACL group",
Expand Down
58 changes: 4 additions & 54 deletions cmd/memcached/add.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ package memcached
import (
"fmt"
"os"
"path"

"github.com/go-zookeeper/zk"
"github.com/jam2in/arcus-cli/internal"
"github.com/jam2in/arcus-cli/internal/memcached"
"github.com/jam2in/arcus-cli/internal/types"
"github.com/spf13/cobra"
)

Expand All @@ -17,62 +17,12 @@ var addCmd = &cobra.Command{
Run: func(cmd *cobra.Command, args []string) {
serviceCode := args[0]
address := args[1]
zkConn := cmd.Context().Value(types.CtxZkConnKey{}).(*zk.Conn)

zkConn := cmd.Context().Value(internal.CtxZkConnKey{}).(*zk.Conn)

if err := addServiceCodePath(zkConn, serviceCode); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}

if err := addServerPath(zkConn, serviceCode, address); err != nil {
if err := memcached.AddToServiceCode(zkConn, serviceCode, address); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}

fmt.Printf("Successfully added server %s to service code %s\n", address, serviceCode)
},
}

func addServiceCodePath(zkConn *zk.Conn, serviceCode string) error {
ops := []any{
&zk.CreateRequest{
Path: path.Join(internal.ArcusCacheListPath, serviceCode),
Data: nil,
Acl: zk.WorldACL(zk.PermAll),
Flags: 0,
},
&zk.CreateRequest{
Path: path.Join(internal.ArcusClientListPath, serviceCode),
Data: nil,
Acl: zk.WorldACL(zk.PermAll),
Flags: 0,
},
}
if _, err := zkConn.Multi(ops...); err != nil && err != zk.ErrNodeExists {
return err
}
return nil
}

func addServerPath(zkConn *zk.Conn, serviceCode, address string) error {
ops := []any{
&zk.CreateRequest{
Path: path.Join(internal.ArcusCacheServerMappingPath, address),
Data: nil,
Acl: zk.WorldACL(zk.PermAll),
Flags: 0,
},
&zk.CreateRequest{
Path: path.Join(internal.ArcusCacheServerMappingPath, address, serviceCode),
Data: nil,
Acl: zk.WorldACL(zk.PermAll),
Flags: 0,
},
}
if _, err := zkConn.Multi(ops...); err != nil {
return err
}

return nil
}
Loading
Loading