/*
Bacula® - The Network Backup Solution
- Copyright (C) 2001-2010 Free Software Foundation Europe e.V.
+ Copyright (C) 2001-2012 Free Software Foundation Europe e.V.
The main author of Bacula is Kern Sibbald, with contributions from
many others, a complete list can be found in the file AUTHORS.
bool mod;
int spool_data;
bool spool_data_set;
+ int accurate;
+ bool accurate_set;
+ int ignoreduplicatecheck;
+ bool ignoreduplicatecheck_set;
/* Methods */
run_ctx() { memset(this, 0, sizeof(run_ctx));
int modify_job_parameters(UAContext *ua, JCR *jcr, run_ctx &rc)
{
int i, opt;
+
+ /* Some options are not available through the menu
+ * TODO: Add an advanced menu?
+ */
+ if (rc.spool_data_set) {
+ jcr->spool_data = rc.spool_data;
+ }
+
+ if (rc.accurate_set) {
+ jcr->accurate = rc.accurate;
+ }
+
+ /* Used by migration jobs that can have the same name,
+ * but can run at the same time
+ */
+ if (rc.ignoreduplicatecheck_set) {
+ jcr->IgnoreDuplicateJobChecking = rc.ignoreduplicatecheck;
+ }
+
/*
* At user request modify parameters of job to be run.
*/
rc.plugin_options = NULL;
}
-
if (rc.replace) {
jcr->replace = 0;
for (i=0; ReplaceOptions[i].name; i++) {
rc.cloned = false;
}
-
/* If pool changed, update migration write storage */
- if (jcr->getJobType() == JT_MIGRATE || jcr->getJobType() == JT_COPY ||
- (jcr->getJobType() == JT_BACKUP && jcr->getJobLevel() == L_VIRTUAL_FULL)) {
+ if (jcr->is_JobType(JT_MIGRATE) || jcr->is_JobType(JT_COPY) ||
+ (jcr->is_JobType(JT_BACKUP) && jcr->is_JobLevel(L_VIRTUAL_FULL))) {
if (!set_migration_wstorage(jcr, rc.pool)) {
return false;
}
// jcr->JobLevel = L_BASE;
// break;
case 0:
- jcr->set_JobLevel(L_FULL);
+ jcr->setJobLevel(L_FULL);
break;
case 1:
- jcr->set_JobLevel(L_INCREMENTAL);
+ jcr->setJobLevel(L_INCREMENTAL);
break;
case 2:
- jcr->set_JobLevel(L_DIFFERENTIAL);
+ jcr->setJobLevel(L_DIFFERENTIAL);
break;
case 3:
- jcr->set_JobLevel(L_SINCE);
+ jcr->setJobLevel(L_SINCE);
break;
case 4:
- jcr->set_JobLevel(L_VIRTUAL_FULL);
+ jcr->setJobLevel(L_VIRTUAL_FULL);
break;
default:
break;
add_prompt(ua, _("Verify Volume Data (not yet implemented)"));
switch (do_prompt(ua, "", _("Select level"), NULL, 0)) {
case 0:
- jcr->set_JobLevel(L_VERIFY_INIT);
+ jcr->setJobLevel(L_VERIFY_INIT);
break;
case 1:
- jcr->set_JobLevel(L_VERIFY_CATALOG);
+ jcr->setJobLevel(L_VERIFY_CATALOG);
break;
case 2:
- jcr->set_JobLevel(L_VERIFY_VOLUME_TO_CATALOG);
+ jcr->setJobLevel(L_VERIFY_VOLUME_TO_CATALOG);
break;
case 3:
- jcr->set_JobLevel(L_VERIFY_DISK_TO_CATALOG);
+ jcr->setJobLevel(L_VERIFY_DISK_TO_CATALOG);
break;
case 4:
- jcr->set_JobLevel(L_VERIFY_DATA);
+ jcr->setJobLevel(L_VERIFY_DATA);
break;
default:
break;
bstrutime(dt, sizeof(dt), jcr->sched_time),
jcr->JobPriority);
}
- jcr->set_JobLevel(L_FULL);
+ jcr->setJobLevel(L_FULL);
break;
case JT_BACKUP:
case JT_VERIFY:
jcr->RestoreJobId = ua->int64_val;
}
}
- jcr->set_JobLevel(L_FULL); /* default level */
+ jcr->setJobLevel(L_FULL); /* default level */
Dmsg1(800, "JobId to restore=%d\n", jcr->RestoreJobId);
if (jcr->RestoreJobId == 0) {
/* RegexWhere is take before RestoreWhere */
case JT_COPY:
case JT_MIGRATE:
char *prt_type;
- jcr->set_JobLevel(L_FULL); /* default level */
+ jcr->setJobLevel(L_FULL); /* default level */
if (ua->api) {
ua->signal(BNET_RUN_CMD);
if (jcr->getJobType() == JT_COPY) {
"job", /* Used in a switch() */
"jobid", /* 1 */
"client", /* 2 */
- "fd",
+ "fd", /* 3 */
"fileset", /* 4 */
"level", /* 5 */
"storage", /* 6 */
"replace", /* 11 */
"when", /* 12 */
"priority", /* 13 */
- "yes", /* 14 -- if you change this change YES_POS too */
+ "yes", /* 14 -- if you change this change YES_POS too */
"verifyjob", /* 15 */
"files", /* 16 number of files to restore */
"catalog", /* 17 override catalog */
"pluginoptions", /* 25 */
"spooldata", /* 26 */
"comment", /* 27 */
- NULL};
+ "ignoreduplicatecheck", /* 28 */
+ "accurate", /* 29 */
+ NULL
+ };
#define YES_POS 14
rc.fileset_name = NULL;
rc.verify_job_name = NULL;
rc.previous_job_name = NULL;
- rc.spool_data_set = 0;
+ rc.accurate_set = false;
+ rc.spool_data_set = false;
+ rc.ignoreduplicatecheck = false;
rc.comment = NULL;
for (i=1; i<ua->argc; i++) {
rc.files = atoi(ua->argv[i]);
kw_ok = true;
break;
-
case 17: /* catalog */
rc.catalog_name = ua->argv[i];
kw_ok = true;
break;
-
case 18: /* since */
rc.since = ua->argv[i];
kw_ok = true;
break;
-
case 19: /* cloned */
rc. cloned = true;
kw_ok = true;
break;
-
case 20: /* write verify list output */
rc.verify_list = ua->argv[i];
kw_ok = true;
return false;
}
if (is_yesno(ua->argv[i], &rc.spool_data)) {
- rc.spool_data_set = 1;
+ rc.spool_data_set = true;
kw_ok = true;
} else {
ua->send_msg(_("Invalid spooldata flag.\n"));
case 27: /* comment */
rc.comment = ua->argv[i];
kw_ok = true;
+ break;
+ case 28: /* ignoreduplicatecheck */
+ if (rc.ignoreduplicatecheck_set) {
+ ua->send_msg(_("IgnoreDuplicateCheck flag specified twice.\n"));
+ return false;
+ }
+ if (is_yesno(ua->argv[i], &rc.ignoreduplicatecheck)) {
+ rc.ignoreduplicatecheck_set = true;
+ kw_ok = true;
+ } else {
+ ua->send_msg(_("Invalid ignoreduplicatecheck flag.\n"));
+ }
+ break;
+ case 29: /* accurate */
+ if (rc.accurate_set) {
+ ua->send_msg(_("Accurate flag specified twice.\n"));
+ return false;
+ }
+ if (is_yesno(ua->argv[i], &rc.accurate)) {
+ rc.accurate_set = true;
+ kw_ok = true;
+ } else {
+ ua->send_msg(_("Invalid accurate 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"));
}
Dmsg1(800, "Using restore client=%s\n", rc.client->name());
-
if (rc.fileset_name) {
rc.fileset = GetFileSetResWithName(rc.fileset_name);
if (!rc.fileset) {