Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
9321c787
Commit
9321c787
authored
Mar 16, 2020
by
antirez
Browse files
Sentinel: implement auth-user directive for ACLs.
parent
bce9a68b
Changes
1
Hide whitespace changes
Inline
Side-by-side
src/sentinel.c
View file @
9321c787
...
...
@@ -205,7 +205,8 @@ typedef struct sentinelRedisInstance {
dict
*
slaves
;
/* Slaves for this master instance. */
unsigned
int
quorum
;
/* Number of sentinels that need to agree on failure. */
int
parallel_syncs
;
/* How many slaves to reconfigure at same time. */
char
*
auth_pass
;
/* Password to use for AUTH against master & slaves. */
char
*
auth_pass
;
/* Password to use for AUTH against master & replica. */
char
*
auth_user
;
/* Username for ACLs AUTH against master & replica. */
/* Slave specific. */
mstime_t
master_link_down_time
;
/* Slave replication link down time. */
...
...
@@ -1231,6 +1232,7 @@ sentinelRedisInstance *createSentinelRedisInstance(char *name, int flags, char *
SENTINEL_DEFAULT_DOWN_AFTER
;
ri
->
master_link_down_time
=
0
;
ri
->
auth_pass
=
NULL
;
ri
->
auth_user
=
NULL
;
ri
->
slave_priority
=
SENTINEL_DEFAULT_SLAVE_PRIORITY
;
ri
->
slave_reconf_sent_time
=
0
;
ri
->
slave_master_host
=
NULL
;
...
...
@@ -1289,6 +1291,7 @@ void releaseSentinelRedisInstance(sentinelRedisInstance *ri) {
sdsfree
(
ri
->
slave_master_host
);
sdsfree
(
ri
->
leader
);
sdsfree
(
ri
->
auth_pass
);
sdsfree
(
ri
->
auth_user
);
sdsfree
(
ri
->
info
);
releaseSentinelAddr
(
ri
->
addr
);
dictRelease
(
ri
->
renamed_commands
);
...
...
@@ -1654,19 +1657,19 @@ char *sentinelHandleConfiguration(char **argv, int argc) {
ri
->
failover_timeout
=
atoi
(
argv
[
2
]);
if
(
ri
->
failover_timeout
<=
0
)
return
"negative or zero time parameter."
;
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"parallel-syncs"
)
&&
argc
==
3
)
{
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"parallel-syncs"
)
&&
argc
==
3
)
{
/* parallel-syncs <name> <milliseconds> */
ri
=
sentinelGetMasterByName
(
argv
[
1
]);
if
(
!
ri
)
return
"No such master with specified name."
;
ri
->
parallel_syncs
=
atoi
(
argv
[
2
]);
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"notification-script"
)
&&
argc
==
3
)
{
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"notification-script"
)
&&
argc
==
3
)
{
/* notification-script <name> <path> */
ri
=
sentinelGetMasterByName
(
argv
[
1
]);
if
(
!
ri
)
return
"No such master with specified name."
;
if
(
access
(
argv
[
2
],
X_OK
)
==
-
1
)
return
"Notification script seems non existing or non executable."
;
ri
->
notification_script
=
sdsnew
(
argv
[
2
]);
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"client-reconfig-script"
)
&&
argc
==
3
)
{
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"client-reconfig-script"
)
&&
argc
==
3
)
{
/* client-reconfig-script <name> <path> */
ri
=
sentinelGetMasterByName
(
argv
[
1
]);
if
(
!
ri
)
return
"No such master with specified name."
;
...
...
@@ -1674,11 +1677,16 @@ char *sentinelHandleConfiguration(char **argv, int argc) {
return
"Client reconfiguration script seems non existing or "
"non executable."
;
ri
->
client_reconfig_script
=
sdsnew
(
argv
[
2
]);
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"auth-pass"
)
&&
argc
==
3
)
{
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"auth-pass"
)
&&
argc
==
3
)
{
/* auth-pass <name> <password> */
ri
=
sentinelGetMasterByName
(
argv
[
1
]);
if
(
!
ri
)
return
"No such master with specified name."
;
ri
->
auth_pass
=
sdsnew
(
argv
[
2
]);
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"auth-user"
)
&&
argc
==
3
)
{
/* auth-user <name> <username> */
ri
=
sentinelGetMasterByName
(
argv
[
1
]);
if
(
!
ri
)
return
"No such master with specified name."
;
ri
->
auth_user
=
sdsnew
(
argv
[
2
]);
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"current-epoch"
)
&&
argc
==
2
)
{
/* current-epoch <epoch> */
unsigned
long
long
current_epoch
=
strtoull
(
argv
[
1
],
NULL
,
10
);
...
...
@@ -1836,7 +1844,7 @@ void rewriteConfigSentinelOption(struct rewriteConfigState *state) {
rewriteConfigRewriteLine
(
state
,
"sentinel"
,
line
,
1
);
}
/* sentinel auth-pass */
/* sentinel auth-pass
& auth-user
*/
if
(
master
->
auth_pass
)
{
line
=
sdscatprintf
(
sdsempty
(),
"sentinel auth-pass %s %s"
,
...
...
@@ -1844,6 +1852,13 @@ void rewriteConfigSentinelOption(struct rewriteConfigState *state) {
rewriteConfigRewriteLine
(
state
,
"sentinel"
,
line
,
1
);
}
if
(
master
->
auth_user
)
{
line
=
sdscatprintf
(
sdsempty
(),
"sentinel auth-user %s %s"
,
master
->
name
,
master
->
auth_user
);
rewriteConfigRewriteLine
(
state
,
"sentinel"
,
line
,
1
);
}
/* sentinel config-epoch */
line
=
sdscatprintf
(
sdsempty
(),
"sentinel config-epoch %s %llu"
,
...
...
@@ -1968,19 +1983,29 @@ werr:
* will disconnect and reconnect the link and so forth. */
void
sentinelSendAuthIfNeeded
(
sentinelRedisInstance
*
ri
,
redisAsyncContext
*
c
)
{
char
*
auth_pass
=
NULL
;
char
*
auth_user
=
NULL
;
if
(
ri
->
flags
&
SRI_MASTER
)
{
auth_pass
=
ri
->
auth_pass
;
auth_user
=
ri
->
auth_user
;
}
else
if
(
ri
->
flags
&
SRI_SLAVE
)
{
auth_pass
=
ri
->
master
->
auth_pass
;
auth_user
=
ri
->
master
->
auth_user
;
}
else
if
(
ri
->
flags
&
SRI_SENTINEL
)
{
auth_pass
=
ACLDefaultUserFirstPassword
();
auth_user
=
NULL
;
}
if
(
auth_pass
)
{
if
(
auth_pass
&&
auth_user
==
NULL
)
{
if
(
redisAsyncCommand
(
c
,
sentinelDiscardReplyCallback
,
ri
,
"%s %s"
,
sentinelInstanceMapCommand
(
ri
,
"AUTH"
),
auth_pass
)
==
C_OK
)
ri
->
link
->
pending_commands
++
;
}
else
if
(
auth_pass
&&
auth_user
)
{
/* If we also have an username, use the ACL-style AUTH command
* with two arguments, username and password. */
if
(
redisAsyncCommand
(
c
,
sentinelDiscardReplyCallback
,
ri
,
"%s %s %s"
,
sentinelInstanceMapCommand
(
ri
,
"AUTH"
),
auth_user
,
auth_pass
)
==
C_OK
)
ri
->
link
->
pending_commands
++
;
}
}
...
...
@@ -3522,6 +3547,12 @@ void sentinelSetCommand(client *c) {
sdsfree
(
ri
->
auth_pass
);
ri
->
auth_pass
=
strlen
(
value
)
?
sdsnew
(
value
)
:
NULL
;
changes
++
;
}
else
if
(
!
strcasecmp
(
option
,
"auth-user"
)
&&
moreargs
>
0
)
{
/* auth-user <username> */
char
*
value
=
c
->
argv
[
++
j
]
->
ptr
;
sdsfree
(
ri
->
auth_user
);
ri
->
auth_user
=
strlen
(
value
)
?
sdsnew
(
value
)
:
NULL
;
changes
++
;
}
else
if
(
!
strcasecmp
(
option
,
"quorum"
)
&&
moreargs
>
0
)
{
/* quorum <count> */
robj
*
o
=
c
->
argv
[
++
j
];
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment