45 const char *archive_name);
71 "Shell command to be executed for each backup file.",
80 "Backup user must be a member of this role to use shell backup target.",
109 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
110 errmsg(
"permission denied to use basebackup_to_shell")));
114 return target_detail;
127 bool has_detail_escape =
false;
145 errcode(ERRCODE_INVALID_PARAMETER_VALUE),
146 errmsg(
"shell command for backup is not configured"));
151 if (
c[0] ==
'%' &&
c[1] !=
'\0')
154 has_detail_escape =
true;
162 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
163 errmsg(
"a target detail is required because the configured command includes %%d"),
164 errhint(
"Try \"pg_basebackup --target shell:DETAIL ...\"")));
167 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
168 errmsg(
"a target detail is not permitted because the configured command does not include %%d")));
185 if (*d >=
'a' && *d <=
'z')
187 if (*d >=
'A' && *d <=
'Z')
189 if (*d >=
'0' && *d <=
'9')
197 errcode(ERRCODE_INVALID_PARAMETER_VALUE),
198 errmsg(
"target detail must contain only alphanumeric characters"));
210 const char *target_detail)
233 errmsg(
"could not close pipe to external command: %m")));
234 else if (pclose_rc != 0)
237 (
errcode(ERRCODE_EXTERNAL_ROUTINE_EXCEPTION),
238 errmsg(
"shell command \"%s\" failed",
266 if (sink->
pipe == NULL)
269 errmsg(
"could not execute command \"%s\": %m",
299 errmsg(
"could not write to shell backup program: %m")));
bool has_privs_of_role(Oid member, Oid role)
Oid get_role_oid(const char *rolname, bool missing_ok)
void bbsink_forward_begin_backup(bbsink *sink)
void bbsink_forward_begin_manifest(bbsink *sink)
void bbsink_forward_end_backup(bbsink *sink, XLogRecPtr endptr, TimeLineID endtli)
void bbsink_forward_cleanup(bbsink *sink)
void bbsink_forward_manifest_contents(bbsink *sink, size_t len)
void bbsink_forward_end_archive(bbsink *sink)
void bbsink_forward_archive_contents(bbsink *sink, size_t len)
void bbsink_forward_begin_archive(bbsink *sink, const char *archive_name)
void bbsink_forward_end_manifest(bbsink *sink)
void BaseBackupAddTarget(char *name, void *(*check_detail)(char *, char *), bbsink *(*get_sink)(bbsink *, void *))
static void * shell_check_detail(char *target, char *target_detail)
static char * shell_required_role
static void shell_finish_command(bbsink_shell *sink)
static void bbsink_shell_begin_manifest(bbsink *sink)
static bbsink * shell_get_sink(bbsink *next_sink, void *detail_arg)
static void bbsink_shell_end_manifest(bbsink *sink)
static char * shell_construct_command(const char *base_command, const char *filename, const char *target_detail)
static void bbsink_shell_end_archive(bbsink *sink)
static void shell_send_data(bbsink_shell *sink, size_t len)
struct bbsink_shell bbsink_shell
static void shell_run_command(bbsink_shell *sink, const char *filename)
static void bbsink_shell_begin_archive(bbsink *sink, const char *archive_name)
static void bbsink_shell_archive_contents(bbsink *sink, size_t len)
static char * shell_command
static const bbsink_ops bbsink_shell_ops
static void bbsink_shell_manifest_contents(bbsink *sink, size_t len)
#define Assert(condition)
int errdetail_internal(const char *fmt,...)
int errcode_for_file_access(void)
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
FILE * OpenPipeStream(const char *command, const char *mode)
int ClosePipeStream(FILE *file)
void DefineCustomStringVariable(const char *name, const char *short_desc, const char *long_desc, char **valueAddr, const char *bootValue, GucContext context, int flags, GucStringCheckHook check_hook, GucStringAssignHook assign_hook, GucShowHook show_hook)
void MarkGUCPrefixReserved(const char *className)
char * pstrdup(const char *in)
void pfree(void *pointer)
void * palloc0(Size size)
char * replace_percent_placeholders(const char *instr, const char *param_name, const char *letters,...)
void(* begin_backup)(bbsink *sink)
const bbsink_ops * bbs_ops
char * wait_result_to_str(int exitstatus)
void StartTransactionCommand(void)
void CommitTransactionCommand(void)