gs_basebackup支持通过-W指定密码(原先逻辑通过不指定-W的方式继承)

This commit is contained in:
wuyuechuan
2023-11-20 15:32:22 +08:00
parent d7a36c7faa
commit 3854958074
3 changed files with 69 additions and 26 deletions

View File

@ -127,6 +127,43 @@ static int GsBaseBackup(int argc, char** argv);
static const char* get_tablespace_mapping(const char* dir); static const char* get_tablespace_mapping(const char* dir);
/*
* Replace the actual password with *'s.
*/
void replace_password(int argc, char** argv, const char* optionName)
{
int count = 0;
char* pchPass = NULL;
char* pchTemp = NULL;
// Check if password option is specified in command line
for (count = 0; count < argc; count++) {
// Password can be specified by optionName
if (strncmp(optionName, argv[count], strlen(optionName)) == 0) {
pchTemp = strchr(argv[count], '=');
if (pchTemp != NULL) {
pchPass = pchTemp + 1;
} else if ((NULL != strstr(argv[count], optionName)) && (strlen(argv[count]) > strlen(optionName))) {
pchPass = argv[count] + strlen(optionName);
} else {
pchPass = argv[(int)(count + 1)];
}
// Replace first char of password with * and rest clear it
if (strlen(pchPass) > 0) {
*pchPass = '*';
pchPass = pchPass + 1;
while ('\0' != *pchPass) {
*pchPass = '\0';
pchPass++;
}
}
break;
}
}
}
static void TablespaceValueCheck(TablespaceListCell* cell, const char* arg) static void TablespaceValueCheck(TablespaceListCell* cell, const char* arg)
{ {
if (!*cell->old_dir || !*cell->new_dir) { if (!*cell->old_dir || !*cell->new_dir) {
@ -236,33 +273,33 @@ static void usage(void)
printf(_("Usage:\n")); printf(_("Usage:\n"));
printf(_(" %s [OPTION]...\n"), progname); printf(_(" %s [OPTION]...\n"), progname);
printf(_("\nOptions controlling the output:\n")); printf(_("\nOptions controlling the output:\n"));
printf(_(" -D, --pgdata=DIRECTORY receive base backup into directory\n")); printf(_(" -D, --pgdata=DIRECTORY receive base backup into directory\n"));
printf(_(" -F, --format=p|t output format (plain (default), tar)\n")); printf(_(" -F, --format=p|t output format (plain (default), tar)\n"));
printf(_(" -T, --tablespace-mapping=OLDDIR=NEWDIR\n" printf(_(" -T, --tablespace-mapping=OLDDIR=NEWDIR\n"
" relocate tablespace in OLDDIR to NEWDIR\n")); " relocate tablespace in OLDDIR to NEWDIR\n"));
printf(_(" -x, --xlog include required WAL files in backup (fetch mode)\n")); printf(_(" -x, --xlog include required WAL files in backup (fetch mode)\n"));
printf(_(" -X, --xlog-method=fetch|stream\n" printf(_(" -X, --xlog-method=fetch|stream\n"
" include required WAL files with specified method\n")); " include required WAL files with specified method\n"));
printf(_(" -z, --gzip compress tar output\n")); printf(_(" -z, --gzip compress tar output\n"));
printf(_(" -Z, --compress=0-9 compress tar output with given compression level\n")); printf(_(" -Z, --compress=0-9 compress tar output with given compression level\n"));
printf(_("\nGeneral options:\n")); printf(_("\nGeneral options:\n"));
printf(_(" -c, --checkpoint=fast|spread\n" printf(_(" -c, --checkpoint=fast|spread\n"
" set fast or spread checkpointing\n")); " set fast or spread checkpointing\n"));
printf(_(" -l, --label=LABEL set backup label\n")); printf(_(" -l, --label=LABEL set backup label\n"));
printf(_(" -P, --progress show progress information\n")); printf(_(" -P, --progress show progress information\n"));
printf(_(" -v, --verbose output verbose messages\n")); printf(_(" -v, --verbose output verbose messages\n"));
printf(_(" -V, --version output version information, then exit\n")); printf(_(" -V, --version output version information, then exit\n"));
printf(_(" -?, --help show this help, then exit\n")); printf(_(" -?, --help show this help, then exit\n"));
printf(_("\nConnection options:\n")); printf(_("\nConnection options:\n"));
printf(_(" -h, --host=HOSTNAME database server host or socket directory\n")); printf(_(" -h, --host=HOSTNAME database server host or socket directory\n"));
printf(_(" -p, --port=PORT database server port number\n")); printf(_(" -p, --port=PORT database server port number\n"));
printf(_(" -s, --status-interval=INTERVAL\n" printf(_(" -s, --status-interval=INTERVAL\n"
" time between status packets sent to server (in seconds)\n")); " time between status packets sent to server (in seconds)\n"));
printf(_(" -t, --rw-timeout=RW_TIMEOUT\n" printf(_(" -t, --rw-timeout=RW_TIMEOUT\n"
" read-write timeout during idle connection.(in seconds)\n")); " read-write timeout during idle connection.(in seconds)\n"));
printf(_(" -U, --username=NAME connect as specified database user\n")); printf(_(" -U, --username=NAME connect as specified database user\n"));
printf(_(" -w, --no-password never prompt for password\n")); printf(_(" -w, --no-password never prompt for password\n"));
printf(_(" -W, --password force password prompt (should happen automatically)\n")); printf(_(" -W, --password=password the password of specified database user\n"));
#if ((defined(ENABLE_MULTIPLE_NODES)) || (defined(ENABLE_PRIVATEGAUSS))) #if ((defined(ENABLE_MULTIPLE_NODES)) || (defined(ENABLE_PRIVATEGAUSS)))
printf(_("\nReport bugs to GaussDB support.\n")); printf(_("\nReport bugs to GaussDB support.\n"));
@ -1934,7 +1971,7 @@ static int GsBaseBackup(int argc, char** argv)
{"port", required_argument, NULL, 'p'}, {"port", required_argument, NULL, 'p'},
{"username", required_argument, NULL, 'U'}, {"username", required_argument, NULL, 'U'},
{"no-password", no_argument, NULL, 'w'}, {"no-password", no_argument, NULL, 'w'},
{"password", no_argument, NULL, 'W'}, {"password", required_argument, NULL, 'W'},
{"status-interval", required_argument, NULL, 's'}, {"status-interval", required_argument, NULL, 's'},
{"rw-timeout", required_argument, NULL, 't'}, {"rw-timeout", required_argument, NULL, 't'},
{"verbose", no_argument, NULL, 'v'}, {"verbose", no_argument, NULL, 'v'},
@ -1955,7 +1992,7 @@ static int GsBaseBackup(int argc, char** argv)
} }
} }
char optstring[] = "D:l:c:h:p:U:s:X:F:T:Z:t:wWvPxz"; char optstring[] = "D:l:c:h:p:U:s:X:F:T:Z:t:wW:vPxz";
/* check if a required_argument option has a void argument */ /* check if a required_argument option has a void argument */
int i; int i;
for (i = 0; i < argc; i++) { for (i = 0; i < argc; i++) {
@ -1995,7 +2032,7 @@ static int GsBaseBackup(int argc, char** argv)
} }
} }
while ((c = getopt_long(argc, argv, "D:l:c:h:p:U:s:X:F:T:Z:t:wWvPxz", long_options, &option_index)) != -1) { while ((c = getopt_long(argc, argv, optstring, long_options, &option_index)) != -1) {
switch (c) { switch (c) {
case 'D': { case 'D': {
GS_FREE(basedir); GS_FREE(basedir);
@ -2106,7 +2143,12 @@ static int GsBaseBackup(int argc, char** argv)
dbgetpassword = -1; dbgetpassword = -1;
break; break;
case 'W': case 'W':
dbgetpassword = 1; dbpassword = strdup(optarg);
if (NULL == dbpassword) {
fprintf(stderr, _("%s: out of memory\n"), progname);
exit(1);
}
replace_password(argc, argv, "-W");
break; break;
case 's': case 's':
if ((atoi(optarg)) < 0 || (atoi(optarg) * 1000) > PG_INT32_MAX) { if ((atoi(optarg)) < 0 || (atoi(optarg) * 1000) > PG_INT32_MAX) {

View File

@ -34,7 +34,7 @@ char* dbport = NULL;
char* dbname = NULL; char* dbname = NULL;
int rwtimeout = 0; int rwtimeout = 0;
int dbgetpassword = 0; /* 0=auto, -1=never, 1=always */ int dbgetpassword = 0; /* 0=auto, -1=never, 1=always */
static char* dbpassword = NULL; char* dbpassword = NULL;
PGconn* conn = NULL; PGconn* conn = NULL;
int standby_message_timeout = 10 * 1000; /* 10 sec = default */ int standby_message_timeout = 10 * 1000; /* 10 sec = default */
static const int PASSWDLEN = 100; static const int PASSWDLEN = 100;
@ -120,7 +120,7 @@ char* inc_dbport(const char* db_port)
void ClearAndFreePasswd(void) void ClearAndFreePasswd(void)
{ {
if (dbpassword != nullptr) { if (dbpassword != nullptr) {
errno_t errorno = memset_s(dbpassword, PASSWDLEN + 1, '\0', PASSWDLEN + 1); errno_t errorno = memset_s(dbpassword, sizeof(dbpassword), '\0', sizeof(dbpassword));
securec_check_c(errorno, "\0", "\0"); securec_check_c(errorno, "\0", "\0");
free(dbpassword); free(dbpassword);
dbpassword = nullptr; dbpassword = nullptr;

View File

@ -10,6 +10,7 @@ extern char* dbport;
extern char* dbname; extern char* dbname;
extern int rwtimeout; extern int rwtimeout;
extern int dbgetpassword; extern int dbgetpassword;
extern char* dbpassword;
extern char* replication_slot; extern char* replication_slot;
extern int standby_message_timeout; extern int standby_message_timeout;