22 .
name =
"basebackup_to_shell",
48 const char *archive_name);
74 "Shell command to be executed for each backup file.",
83 "Backup user must be a member of this role to use shell backup target.",
112 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
113 errmsg(
"permission denied to use basebackup_to_shell")));
117 return target_detail;
130 bool has_detail_escape =
false;
148 errcode(ERRCODE_INVALID_PARAMETER_VALUE),
149 errmsg(
"shell command for backup is not configured"));
154 if (
c[0] ==
'%' &&
c[1] !=
'\0')
157 has_detail_escape =
true;
165 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
166 errmsg(
"a target detail is required because the configured command includes %%d"),
167 errhint(
"Try \"pg_basebackup --target shell:DETAIL ...\"")));
170 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
171 errmsg(
"a target detail is not permitted because the configured command does not include %%d")));
188 if (*d >=
'a' && *d <=
'z')
190 if (*d >=
'A' && *d <=
'Z')
192 if (*d >=
'0' && *d <=
'9')
200 errcode(ERRCODE_INVALID_PARAMETER_VALUE),
201 errmsg(
"target detail must contain only alphanumeric characters"));
213 const char *target_detail)
236 errmsg(
"could not close pipe to external command: %m")));
237 else if (pclose_rc != 0)
240 (
errcode(ERRCODE_EXTERNAL_ROUTINE_EXCEPTION),
241 errmsg(
"shell command \"%s\" failed",
269 if (sink->
pipe == NULL)
272 errmsg(
"could not execute command \"%s\": %m",
302 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
PG_MODULE_MAGIC_EXT(.name="basebackup_to_shell",.version=PG_VERSION)
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)
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)
Assert(PointerIsAligned(start, uint64))
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)