mirror of
https://github.com/redis/go-redis.git
synced 2025-07-28 06:42:00 +03:00
feat: Add ACL LOG (#2536)
* feat: Add ACL LOG Signed-off-by: monkey92t <golang@88.com> --------- Signed-off-by: monkey92t <golang@88.com> Co-authored-by: Anuragkillswitch <70265851+Anuragkillswitch@users.noreply.github.com> Co-authored-by: ktsivkov <ktsivkov@gmail.com> Co-authored-by: Elena Kolevska <elena@kolevska.com> Co-authored-by: monkey92t <golang@88.com>
This commit is contained in:
committed by
GitHub
parent
fcb3506e79
commit
31ba855dde
109
command.go
109
command.go
@ -5057,3 +5057,112 @@ func parseClientInfo(txt string) (info *ClientInfo, err error) {
|
||||
|
||||
return info, nil
|
||||
}
|
||||
|
||||
// -------------------------------------------
|
||||
|
||||
type ACLLogEntry struct {
|
||||
Count int64
|
||||
Reason string
|
||||
Context string
|
||||
Object string
|
||||
Username string
|
||||
AgeSeconds float64
|
||||
ClientInfo *ClientInfo
|
||||
EntryID int64
|
||||
TimestampCreated int64
|
||||
TimestampLastUpdated int64
|
||||
}
|
||||
|
||||
type ACLLogCmd struct {
|
||||
baseCmd
|
||||
|
||||
val []*ACLLogEntry
|
||||
}
|
||||
|
||||
var _ Cmder = (*ACLLogCmd)(nil)
|
||||
|
||||
func NewACLLogCmd(ctx context.Context, args ...interface{}) *ACLLogCmd {
|
||||
return &ACLLogCmd{
|
||||
baseCmd: baseCmd{
|
||||
ctx: ctx,
|
||||
args: args,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func (cmd *ACLLogCmd) SetVal(val []*ACLLogEntry) {
|
||||
cmd.val = val
|
||||
}
|
||||
|
||||
func (cmd *ACLLogCmd) Val() []*ACLLogEntry {
|
||||
return cmd.val
|
||||
}
|
||||
|
||||
func (cmd *ACLLogCmd) Result() ([]*ACLLogEntry, error) {
|
||||
return cmd.Val(), cmd.Err()
|
||||
}
|
||||
|
||||
func (cmd *ACLLogCmd) String() string {
|
||||
return cmdString(cmd, cmd.val)
|
||||
}
|
||||
|
||||
func (cmd *ACLLogCmd) readReply(rd *proto.Reader) error {
|
||||
n, err := rd.ReadArrayLen()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
cmd.val = make([]*ACLLogEntry, n)
|
||||
for i := 0; i < n; i++ {
|
||||
cmd.val[i] = &ACLLogEntry{}
|
||||
entry := cmd.val[i]
|
||||
respLen, err := rd.ReadMapLen()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for j := 0; j < respLen; j++ {
|
||||
key, err := rd.ReadString()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
switch key {
|
||||
case "count":
|
||||
entry.Count, err = rd.ReadInt()
|
||||
case "reason":
|
||||
entry.Reason, err = rd.ReadString()
|
||||
case "context":
|
||||
entry.Context, err = rd.ReadString()
|
||||
case "object":
|
||||
entry.Object, err = rd.ReadString()
|
||||
case "username":
|
||||
entry.Username, err = rd.ReadString()
|
||||
case "age-seconds":
|
||||
entry.AgeSeconds, err = rd.ReadFloat()
|
||||
case "client-info":
|
||||
txt, err := rd.ReadString()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
entry.ClientInfo, err = parseClientInfo(strings.TrimSpace(txt))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
case "entry-id":
|
||||
entry.EntryID, err = rd.ReadInt()
|
||||
case "timestamp-created":
|
||||
entry.TimestampCreated, err = rd.ReadInt()
|
||||
case "timestamp-last-updated":
|
||||
entry.TimestampLastUpdated, err = rd.ReadInt()
|
||||
default:
|
||||
return fmt.Errorf("redis: unexpected key %q in ACL LOG reply", key)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user