PostgreSQL Source Code: contrib/basebackup_to_shell/basebackup_to_shell.c Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
12
20
22 .name = "basebackup_to_shell",
24);
25
27{
28
30
31
33
34
36
37
39
40
43
46
48 const char *archive_name);
54
66
69
70void
72{
74 "Shell command to be executed for each backup file.",
77 "",
79 0,
81
83 "Backup user must be a member of this role to use shell backup target.",
86 "",
88 0,
90
92
94}
95
96
97
98
99
100
101static void *
103{
105 {
106 Oid roleid;
107
113 errmsg("permission denied to use basebackup_to_shell")));
115 }
116
117 return target_detail;
118}
119
120
121
122
123
124
125
128{
131 char *c;
132
133
134
135
136
137
138
142 sink->target_detail = detail_arg;
144
145
146 if (sink->shell_command[0] == '\0')
149 errmsg("shell command for backup is not configured"));
150
151
152 for (c = sink->shell_command; *c != '\0'; ++c)
153 {
154 if (c[0] == '%' && c[1] != '\0')
155 {
156 if (c[1] == 'd')
158 ++c;
159 }
160 }
161
162
166 errmsg("a target detail is required because the configured command includes %%d"),
167 errhint("Try \"pg_basebackup --target shell:DETAIL ...\"")));
171 errmsg("a target detail is not permitted because the configured command does not include %%d")));
172
173
174
175
176
177
178
179
180
181 if (sink->target_detail != NULL)
182 {
183 char *d;
184 bool scary = false;
185
186 for (d = sink->target_detail; *d != '\0'; ++d)
187 {
188 if (*d >= 'a' && *d <= 'z')
189 continue;
190 if (*d >= 'A' && *d <= 'Z')
191 continue;
192 if (*d >= '0' && *d <= '9')
193 continue;
195 break;
196 }
197
201 errmsg("target detail must contain only alphanumeric characters"));
202 }
203
204 return &sink->base;
205}
206
207
208
209
210
211static char *
213 const char *target_detail)
214{
216 "df", target_detail, filename);
217}
218
219
220
221
222static void
224{
226
227
230
231
236 errmsg("could not close pipe to external command: %m")));
238 {
241 errmsg("shell command \"%s\" failed",
242 sink->current_command),
244 }
245
246
249 sink->current_command = NULL;
250}
251
252
253
254
255static void
257{
258
261
262
265 sink->target_detail);
266
267
272 errmsg("could not execute command \"%s\": %m",
273 sink->current_command)));
274}
275
276
277
278
279static void
281{
282
285
286
289 {
291 {
292
293
294
295
296
299 }
302 errmsg("could not write to shell backup program: %m")));
303 }
304}
305
306
307
308
309static void
317
318
319
320
321static void
329
330
331
332
333static void
341
342
343
344
345static void
353
354
355
356
357static void
365
366
367
368
369static void
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)
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 errcode_for_file_access(void)
int errcode(int sqlerrcode)
int int errdetail_internal(const char *fmt,...) pg_attribute_printf(1
int errhint(const char *fmt,...) pg_attribute_printf(1
#define ereport(elevel,...)
FILE * OpenPipeStream(const char *command, const char *mode)
int ClosePipeStream(FILE *file)
#define palloc0_object(type)
#define PG_MODULE_MAGIC_EXT(...)
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)
char * replace_percent_placeholders(const char *instr, const char *param_name, const char *letters,...)
void(* begin_backup)(bbsink *sink)
char * wait_result_to_str(int exitstatus)
void StartTransactionCommand(void)
void CommitTransactionCommand(void)