Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- Bacula® is a registered trademark of John Walker.
+ Bacula® is a registered trademark of Kern Sibbald.
The licensor of Bacula is the Free Software Foundation Europe
(FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
Switzerland, email:ftf@fsfeurope.org.
int files;
bool cloned;
bool mod;
+ int spool_data;
+ bool spool_data_set;
/* Methods */
run_ctx() { memset(this, 0, sizeof(run_ctx));
start_job:
Dmsg3(100, "JobId=%u using pool %s priority=%d\n", (int)jcr->JobId,
jcr->pool->name(), jcr->JobPriority);
+ Dmsg1(900, "Running a job; its spool_data = %d\n", jcr->spool_data);
JobId = run_job(jcr);
Dmsg4(100, "JobId=%u NewJobId=%d using pool %s priority=%d\n", (int)jcr->JobId,
JobId, jcr->pool->name(), jcr->JobPriority);
add_prompt(ua, _("Storage")); /* 1 */
add_prompt(ua, _("Job")); /* 2 */
add_prompt(ua, _("FileSet")); /* 3 */
- if (jcr->JobType == JT_RESTORE) {
+ if (jcr->get_JobType() == JT_RESTORE) {
add_prompt(ua, _("Restore Client")); /* 4 */
} else {
add_prompt(ua, _("Client")); /* 4 */
}
add_prompt(ua, _("When")); /* 5 */
add_prompt(ua, _("Priority")); /* 6 */
- if (jcr->JobType == JT_BACKUP ||
- jcr->JobType == JT_COPY ||
- jcr->JobType == JT_MIGRATE ||
- jcr->JobType == JT_VERIFY) {
+ if (jcr->get_JobType() == JT_BACKUP ||
+ jcr->get_JobType() == JT_COPY ||
+ jcr->get_JobType() == JT_MIGRATE ||
+ jcr->get_JobType() == JT_VERIFY) {
add_prompt(ua, _("Pool")); /* 7 */
- if (jcr->JobType == JT_VERIFY) {
+ if (jcr->get_JobType() == JT_VERIFY) {
add_prompt(ua, _("Verify Job")); /* 8 */
}
- } else if (jcr->JobType == JT_RESTORE) {
+ } else if (jcr->get_JobType() == JT_RESTORE) {
add_prompt(ua, _("Bootstrap")); /* 7 */
add_prompt(ua, _("Where")); /* 8 */
add_prompt(ua, _("File Relocation"));/* 9 */
add_prompt(ua, _("Replace")); /* 10 */
add_prompt(ua, _("JobId")); /* 11 */
}
+ if (jcr->get_JobType() == JT_BACKUP || jcr->get_JobType() == JT_RESTORE) {
+ add_prompt(ua, _("Plugin Options")); /* 12 */
+ }
switch (do_prompt(ua, "", _("Select parameter to modify"), NULL, 0)) {
case 0:
/* Level */
jcr->JobPriority = ua->pint32_val;
}
goto try_again;
- case 7:
+ case 7:
/* Pool or Bootstrap depending on JobType */
- if (jcr->JobType == JT_BACKUP ||
- jcr->JobType == JT_COPY ||
- jcr->JobType == JT_MIGRATE ||
- jcr->JobType == JT_VERIFY) { /* Pool */
+ if (jcr->get_JobType() == JT_BACKUP ||
+ jcr->get_JobType() == JT_COPY ||
+ jcr->get_JobType() == JT_MIGRATE ||
+ jcr->get_JobType() == JT_VERIFY) { /* Pool */
rc.pool = select_pool_resource(ua);
if (rc.pool) {
jcr->pool = rc.pool;
goto try_again;
case 8:
/* Verify Job */
- if (jcr->JobType == JT_VERIFY) {
+ if (jcr->get_JobType() == JT_VERIFY) {
rc.verify_job = select_job_resource(ua);
if (rc.verify_job) {
jcr->verify_job = rc.verify_job;
ua->send_msg(_("You must set the bootstrap file to NULL to be able to specify a JobId.\n"));
}
goto try_again;
+ case 12:
+ /* Plugin Options */
+ if (!get_cmd(ua, _("Please Plugin Options string: "))) {
+ break;
+ }
+ if (jcr->plugin_options) {
+ free(jcr->plugin_options);
+ jcr->plugin_options = NULL;
+ }
+ jcr->plugin_options = bstrdup(ua->cmd);
+ goto try_again;
case -1: /* error or cancel */
goto bail_out;
default:
rc.where = NULL;
}
-
if (rc.regexwhere) {
if (jcr->RegexWhere) {
free(jcr->RegexWhere);
/* If pool changed, update migration write storage */
- if (jcr->JobType == JT_MIGRATE || jcr->JobType == JT_COPY) {
+ if (jcr->get_JobType() == JT_MIGRATE || jcr->get_JobType() == JT_COPY ||
+ (jcr->get_JobType() == JT_BACKUP && jcr->get_JobLevel() == L_VIRTUAL_FULL)) {
if (!set_migration_wstorage(jcr, rc.pool)) {
return false;
}
}
if (rc.level_name) {
if (!get_level_from_name(jcr, rc.level_name)) {
- ua->send_msg(_("Level %s not valid.\n"), rc.level_name);
+ ua->send_msg(_("Level \"%s\" not valid.\n"), rc.level_name);
return false;
}
rc.level_name = NULL;
static void select_job_level(UAContext *ua, JCR *jcr)
{
- if (jcr->JobType == JT_BACKUP) {
+ if (jcr->get_JobType() == JT_BACKUP) {
start_prompt(ua, _("Levels:\n"));
- add_prompt(ua, _("Base"));
+// add_prompt(ua, _("Base"));
add_prompt(ua, _("Full"));
add_prompt(ua, _("Incremental"));
add_prompt(ua, _("Differential"));
add_prompt(ua, _("Since"));
+ add_prompt(ua, _("VirtualFull"));
switch (do_prompt(ua, "", _("Select level"), NULL, 0)) {
+// case 0:
+// jcr->JobLevel = L_BASE;
+// break;
case 0:
- jcr->JobLevel = L_BASE;
+ jcr->set_JobLevel(L_FULL);
break;
case 1:
- jcr->JobLevel = L_FULL;
+ jcr->set_JobLevel(L_INCREMENTAL);
break;
case 2:
- jcr->JobLevel = L_INCREMENTAL;
+ jcr->set_JobLevel(L_DIFFERENTIAL);
break;
case 3:
- jcr->JobLevel = L_DIFFERENTIAL;
+ jcr->set_JobLevel(L_SINCE);
break;
case 4:
- jcr->JobLevel = L_SINCE;
+ jcr->set_JobLevel(L_VIRTUAL_FULL);
break;
default:
break;
}
- } else if (jcr->JobType == JT_VERIFY) {
+ } else if (jcr->get_JobType() == JT_VERIFY) {
start_prompt(ua, _("Levels:\n"));
add_prompt(ua, _("Initialize Catalog"));
add_prompt(ua, _("Verify Catalog"));
add_prompt(ua, _("Verify Volume Data (not yet implemented)"));
switch (do_prompt(ua, "", _("Select level"), NULL, 0)) {
case 0:
- jcr->JobLevel = L_VERIFY_INIT;
+ jcr->set_JobLevel(L_VERIFY_INIT);
break;
case 1:
- jcr->JobLevel = L_VERIFY_CATALOG;
+ jcr->set_JobLevel(L_VERIFY_CATALOG);
break;
case 2:
- jcr->JobLevel = L_VERIFY_VOLUME_TO_CATALOG;
+ jcr->set_JobLevel(L_VERIFY_VOLUME_TO_CATALOG);
break;
case 3:
- jcr->JobLevel = L_VERIFY_DISK_TO_CATALOG;
+ jcr->set_JobLevel(L_VERIFY_DISK_TO_CATALOG);
break;
case 4:
- jcr->JobLevel = L_VERIFY_DATA;
+ jcr->set_JobLevel(L_VERIFY_DATA);
break;
default:
break;
static bool display_job_parameters(UAContext *ua, JCR *jcr, JOB *job, const char *verify_list,
char *jid, const char *replace, char *client_name)
{
- Dmsg1(800, "JobType=%c\n", jcr->JobType);
- switch (jcr->JobType) {
+ Dmsg1(800, "JobType=%c\n", jcr->get_JobType());
+ switch (jcr->get_JobType()) {
char ec1[30];
char dt[MAX_TIME_LENGTH];
case JT_ADMIN:
jcr->wstore?jcr->wstore->name():"*None*",
bstrutime(dt, sizeof(dt), jcr->sched_time),
jcr->JobPriority);
- jcr->JobLevel = L_FULL;
+ jcr->set_JobLevel(L_FULL);
break;
case JT_BACKUP:
case JT_VERIFY:
- if (jcr->JobType == JT_BACKUP) {
+ if (jcr->get_JobType() == JT_BACKUP) {
if (ua->api) ua->signal(BNET_RUN_CMD);
ua->send_msg(_("Run %s job\n"
"JobName: %s\n"
"Pool: %s (From %s)\n"
"Storage: %s (From %s)\n"
"When: %s\n"
- "Priority: %d\n"),
+ "Priority: %d\n"
+ "%s%s%s"),
_("Backup"),
job->name(),
- level_to_str(jcr->JobLevel),
+ level_to_str(jcr->get_JobLevel()),
jcr->client->name(),
jcr->fileset->name(),
NPRT(jcr->pool->name()), jcr->pool_source,
jcr->wstore?jcr->wstore->name():"*None*", jcr->wstore_source,
bstrutime(dt, sizeof(dt), jcr->sched_time),
- jcr->JobPriority);
+ jcr->JobPriority,
+ jcr->plugin_options?"Plugin Options: ":"",
+ jcr->plugin_options?jcr->plugin_options:"",
+ jcr->plugin_options?"\n":"");
} else { /* JT_VERIFY */
const char *Name;
if (jcr->verify_job) {
"Priority: %d\n"),
_("Verify"),
job->name(),
- level_to_str(jcr->JobLevel),
+ level_to_str(jcr->get_JobLevel()),
jcr->client->name(),
jcr->fileset->name(),
NPRT(jcr->pool->name()), jcr->pool_source,
jcr->RestoreJobId = ua->int64_val;
}
}
- jcr->JobLevel = L_FULL; /* default level */
+ jcr->set_JobLevel(L_FULL); /* default level */
Dmsg1(800, "JobId to restore=%d\n", jcr->RestoreJobId);
if (jcr->RestoreJobId == 0) {
if (ua->api) ua->signal(BNET_RUN_CMD);
"Storage: %s\n"
"When: %s\n"
"Catalog: %s\n"
- "Priority: %d\n"),
+ "Priority: %d\n"
+ "Plugin Options: %s\n"),
job->name(),
NPRT(jcr->RestoreBootstrap),
jcr->RegexWhere?jcr->RegexWhere:job->RegexWhere,
jcr->rstore->name(),
bstrutime(dt, sizeof(dt), jcr->sched_time),
jcr->catalog->name(),
- jcr->JobPriority);
+ jcr->JobPriority,
+ NPRT(jcr->plugin_options));
} else {
ua->send_msg(_("Run Restore job\n"
"Storage: %s\n"
"When: %s\n"
"Catalog: %s\n"
- "Priority: %d\n"),
+ "Priority: %d\n"
+ "Plugin Options: %s\n"),
job->name(),
NPRT(jcr->RestoreBootstrap),
jcr->where?jcr->where:NPRT(job->RestoreWhere),
jcr->rstore->name(),
bstrutime(dt, sizeof(dt), jcr->sched_time),
jcr->catalog->name(),
- jcr->JobPriority);
+ jcr->JobPriority,
+ NPRT(jcr->plugin_options));
}
} else {
jcr->where?jcr->where:NPRT(job->RestoreWhere));
}
- ua->send_msg(_("Replace: %s\n"
- "Client: %s\n"
- "Storage: %s\n"
- "JobId: %s\n"
- "When: %s\n"
- "Catalog: %s\n"
- "Priority: %d\n"),
+ ua->send_msg(_("Replace: %s\n"
+ "Client: %s\n"
+ "Storage: %s\n"
+ "JobId: %s\n"
+ "When: %s\n"
+ "Catalog: %s\n"
+ "Priority: %d\n"
+ "Plugin Options: %s\n"),
replace,
jcr->client->name(),
jcr->rstore->name(),
jcr->RestoreJobId==0?"*None*":edit_uint64(jcr->RestoreJobId, ec1),
bstrutime(dt, sizeof(dt), jcr->sched_time),
jcr->catalog->name(),
- jcr->JobPriority);
+ jcr->JobPriority,
+ NPRT(jcr->plugin_options));
}
break;
case JT_COPY:
case JT_MIGRATE:
char *prt_type;
- if (jcr->JobType == JT_COPY) {
+ if (jcr->get_JobType() == JT_COPY) {
prt_type = _("Run Copy job\n");
} else {
prt_type = _("Run Migration job\n");
}
- jcr->JobLevel = L_FULL; /* default level */
+ jcr->set_JobLevel(L_FULL); /* default level */
if (ua->api) ua->signal(BNET_RUN_CMD);
ua->send_msg("%s"
"JobName: %s\n"
jcr->JobPriority);
break;
default:
- ua->error_msg(_("Unknown Job Type=%d\n"), jcr->JobType);
+ ua->error_msg(_("Unknown Job Type=%d\n"), jcr->get_JobType());
return false;
}
return true;
"pool", /* 22 */
"backupclient", /* 23 */
"restoreclient", /* 24 */
+ "pluginoptions", /* 25 */
+ "spooldata", /* 26 */
NULL};
#define YES_POS 14
rc.fileset_name = NULL;
rc.verify_job_name = NULL;
rc.previous_job_name = NULL;
+ rc.spool_data_set = 0;
for (i=1; i<ua->argc; i++) {
rc.restore_client_name = ua->argv[i];
kw_ok = true;
break;
+ case 25: /* pluginoptions */
+ if (rc.plugin_options) {
+ ua->send_msg(_("Plugin Options specified twice.\n"));
+ return false;
+ }
+ rc.plugin_options = ua->argv[i];
+ if (!acl_access_ok(ua, PluginOptions_ACL, rc.plugin_options)) {
+ ua->send_msg(_("No authoriztion for \"PluginOptions\" specification.\n"));
+ return false;
+ }
+ kw_ok = true;
+ break;
+ case 26: /* spooldata */
+ if (rc.spool_data_set) {
+ ua->send_msg(_("Spool flag specified twice.\n"));
+ return false;
+ }
+ if (is_yesno(ua->argv[i], &rc.spool_data)) {
+ rc.spool_data_set = 1;
+ kw_ok = true;
+ } else {
+ ua->send_msg(_("Invalid spooldata flag.\n"));
+ }
+ break;
default:
break;
}
}
Dmsg1(100, "Using pool %s\n", rc.pool->name());
+ if (rc.spool_data_set) {
+ rc.job->spool_data = rc.spool_data;
+ }
+ Dmsg1(900, "Spooling data: %s\n", (rc.job->spool_data ? "Yes" : "No"));
+
if (rc.store_name) {
rc.store->store = GetStoreResWithName(rc.store_name);
pm_strcpy(rc.store->store_source, _("command line"));