/*
Bacula® - The Network Backup Solution
- Copyright (C) 2001-2008 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.
*
* Kern Sibbald, December MMI
*
- * Version $Id$
*/
#include "bacula.h"
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;
}
rc.level_name = NULL;
}
if (rc.jid) {
- /* Note, this is also MigrateJobId */
+ /* Note, this is also MigrateJobId and a VerifyJobId */
jcr->RestoreJobId = str_to_int64(rc.jid);
rc.jid = 0;
}
// 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;
static bool display_job_parameters(UAContext *ua, JCR *jcr, JOB *job, const char *verify_list,
char *jid, const char *replace, char *client_name)
{
+ char ec1[30];
+ char dt[MAX_TIME_LENGTH];
+
Dmsg1(800, "JobType=%c\n", jcr->getJobType());
switch (jcr->getJobType()) {
- char ec1[30];
- char dt[MAX_TIME_LENGTH];
case JT_ADMIN:
- if (ua->api) ua->signal(BNET_RUN_CMD);
- ua->send_msg(_("Run %s job\n"
+ if (ua->api) {
+ ua->signal(BNET_RUN_CMD);
+ ua->send_msg("Type: Admin\n"
+ "Title: Run Admin Job\n"
+ "JobName: %s\n"
+ "FileSet: %s\n"
+ "Client: %s\n"
+ "Storage: %s\n"
+ "When: %s\n"
+ "Priority: %d\n",
+ job->name(),
+ jcr->fileset->name(),
+ NPRT(jcr->client->name()),
+ jcr->wstore?jcr->wstore->name():"*None*",
+ bstrutime(dt, sizeof(dt), jcr->sched_time),
+ jcr->JobPriority);
+ } else {
+ ua->send_msg(_("Run Admin Job\n"
"JobName: %s\n"
"FileSet: %s\n"
"Client: %s\n"
"Storage: %s\n"
"When: %s\n"
"Priority: %d\n"),
- _("Admin"),
job->name(),
jcr->fileset->name(),
NPRT(jcr->client->name()),
jcr->wstore?jcr->wstore->name():"*None*",
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:
if (jcr->getJobType() == JT_BACKUP) {
- if (ua->api) ua->signal(BNET_RUN_CMD);
- ua->send_msg(_("Run %s job\n"
+ if (ua->api) {
+ ua->signal(BNET_RUN_CMD);
+ ua->send_msg("Type: Backup\n"
+ "Title: Run Backup Job\n"
+ "JobName: %s\n"
+ "Level: %s\n"
+ "Client: %s\n"
+ "FileSet: %s\n"
+ "Pool: %s\n"
+ "Storage: %s\n"
+ "When: %s\n"
+ "Priority: %d\n"
+ "%s%s%s",
+ job->name(),
+ level_to_str(jcr->getJobLevel()),
+ jcr->client->name(),
+ jcr->fileset->name(),
+ NPRT(jcr->pool->name()),
+ jcr->wstore?jcr->wstore->name():"*None*",
+ bstrutime(dt, sizeof(dt), jcr->sched_time),
+ jcr->JobPriority,
+ jcr->plugin_options?"Plugin Options: ":"",
+ jcr->plugin_options?jcr->plugin_options:"",
+ jcr->plugin_options?"\n":"");
+ } else {
+ ua->send_msg(_("Run Backup job\n"
"JobName: %s\n"
"Level: %s\n"
"Client: %s\n"
"When: %s\n"
"Priority: %d\n"
"%s%s%s"),
- _("Backup"),
job->name(),
level_to_str(jcr->getJobLevel()),
jcr->client->name(),
jcr->plugin_options?"Plugin Options: ":"",
jcr->plugin_options?jcr->plugin_options:"",
jcr->plugin_options?"\n":"");
+ }
} else { /* JT_VERIFY */
+ JOB_DBR jr;
const char *Name;
if (jcr->verify_job) {
Name = jcr->verify_job->name();
+ } else if (jcr->RestoreJobId) { /* Display job name if jobid requested */
+ memset(&jr, 0, sizeof(jr));
+ jr.JobId = jcr->RestoreJobId;
+ if (!db_get_job_record(jcr, ua->db, &jr)) {
+ ua->error_msg(_("Could not get job record for selected JobId. ERR=%s"),
+ db_strerror(ua->db));
+ return false;
+ }
+ Name = jr.Job;
} else {
Name = "";
}
if (!verify_list) {
verify_list = "";
}
- if (ua->api) ua->signal(BNET_RUN_CMD);
- ua->send_msg(_("Run %s job\n"
+ if (ua->api) {
+ ua->signal(BNET_RUN_CMD);
+ ua->send_msg("Type: Verify\n"
+ "Title: Run Verify Job\n"
+ "JobName: %s\n"
+ "Level: %s\n"
+ "Client: %s\n"
+ "FileSet: %s\n"
+ "Pool: %s (From %s)\n"
+ "Storage: %s (From %s)\n"
+ "Verify Job: %s\n"
+ "Verify List: %s\n"
+ "When: %s\n"
+ "Priority: %d\n",
+ job->name(),
+ level_to_str(jcr->getJobLevel()),
+ jcr->client->name(),
+ jcr->fileset->name(),
+ NPRT(jcr->pool->name()), jcr->pool_source,
+ jcr->rstore->name(), jcr->rstore_source,
+ Name,
+ verify_list,
+ bstrutime(dt, sizeof(dt), jcr->sched_time),
+ jcr->JobPriority);
+ } else {
+ ua->send_msg(_("Run Verify Job\n"
"JobName: %s\n"
"Level: %s\n"
"Client: %s\n"
"Verify List: %s\n"
"When: %s\n"
"Priority: %d\n"),
- _("Verify"),
job->name(),
level_to_str(jcr->getJobLevel()),
jcr->client->name(),
verify_list,
bstrutime(dt, sizeof(dt), jcr->sched_time),
jcr->JobPriority);
+ }
}
break;
case JT_RESTORE:
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) {
- if (ua->api) ua->signal(BNET_RUN_CMD);
/* RegexWhere is take before RestoreWhere */
if (jcr->RegexWhere || (job->RegexWhere && !jcr->where)) {
- ua->send_msg(_("Run Restore job\n"
+ if (ua->api) {
+ ua->signal(BNET_RUN_CMD);
+ ua->send_msg("Type: Restore\n"
+ "Title: Run Restore Job\n"
+ "JobName: %s\n"
+ "Bootstrap: %s\n"
+ "RegexWhere: %s\n"
+ "Replace: %s\n"
+ "FileSet: %s\n"
+ "Backup Client: %s\n"
+ "Restore Client: %s\n"
+ "Storage: %s\n"
+ "When: %s\n"
+ "Catalog: %s\n"
+ "Priority: %d\n"
+ "Plugin Options: %s\n",
+ job->name(),
+ NPRT(jcr->RestoreBootstrap),
+ jcr->RegexWhere?jcr->RegexWhere:job->RegexWhere,
+ replace,
+ jcr->fileset->name(),
+ client_name,
+ jcr->client->name(),
+ jcr->rstore->name(),
+ bstrutime(dt, sizeof(dt), jcr->sched_time),
+ jcr->catalog->name(),
+ jcr->JobPriority,
+ NPRT(jcr->plugin_options));
+ } else {
+ ua->send_msg(_("Run Restore job\n"
"JobName: %s\n"
"Bootstrap: %s\n"
"RegexWhere: %s\n"
jcr->catalog->name(),
jcr->JobPriority,
NPRT(jcr->plugin_options));
-
+ }
} else {
- ua->send_msg(_("Run Restore job\n"
+ if (ua->api) {
+ ua->signal(BNET_RUN_CMD);
+ ua->send_msg("Type: Restore\n"
+ "Title: Run Restore job\n"
+ "JobName: %s\n"
+ "Bootstrap: %s\n"
+ "Where: %s\n"
+ "Replace: %s\n"
+ "FileSet: %s\n"
+ "Backup Client: %s\n"
+ "Restore Client: %s\n"
+ "Storage: %s\n"
+ "When: %s\n"
+ "Catalog: %s\n"
+ "Priority: %d\n"
+ "Plugin Options: %s\n",
+ job->name(),
+ NPRT(jcr->RestoreBootstrap),
+ jcr->where?jcr->where:NPRT(job->RestoreWhere),
+ replace,
+ jcr->fileset->name(),
+ client_name,
+ jcr->client->name(),
+ jcr->rstore->name(),
+ bstrutime(dt, sizeof(dt), jcr->sched_time),
+ jcr->catalog->name(),
+ jcr->JobPriority,
+ NPRT(jcr->plugin_options));
+ } else {
+ ua->send_msg(_("Run Restore job\n"
"JobName: %s\n"
"Bootstrap: %s\n"
"Where: %s\n"
jcr->catalog->name(),
jcr->JobPriority,
NPRT(jcr->plugin_options));
+ }
}
} else {
+ /* ***FIXME*** This needs to be fixed for bat */
if (ua->api) ua->signal(BNET_RUN_CMD);
ua->send_msg(_("Run Restore job\n"
"JobName: %s\n"
case JT_COPY:
case JT_MIGRATE:
char *prt_type;
- if (jcr->getJobType() == JT_COPY) {
- prt_type = _("Run Copy job\n");
+ jcr->setJobLevel(L_FULL); /* default level */
+ if (ua->api) {
+ ua->signal(BNET_RUN_CMD);
+ if (jcr->getJobType() == JT_COPY) {
+ prt_type = (char *)"Type: Copy\nTitle: Run Copy Job\n";
+ } else {
+ prt_type = (char *)"Type: Migration\nTitle: Run Migration Job\n";
+ }
+ ua->send_msg("%s"
+ "JobName: %s\n"
+ "Bootstrap: %s\n"
+ "Client: %s\n"
+ "FileSet: %s\n"
+ "Pool: %s\n"
+ "Read Storage: %s\n"
+ "Write Storage: %s\n"
+ "JobId: %s\n"
+ "When: %s\n"
+ "Catalog: %s\n"
+ "Priority: %d\n",
+ prt_type,
+ job->name(),
+ NPRT(jcr->RestoreBootstrap),
+ jcr->client->name(),
+ jcr->fileset->name(),
+ NPRT(jcr->pool->name()),
+ jcr->rstore->name(),
+ jcr->wstore?jcr->wstore->name():"*None*",
+ jcr->MigrateJobId==0?"*None*":edit_uint64(jcr->MigrateJobId, ec1),
+ bstrutime(dt, sizeof(dt), jcr->sched_time),
+ jcr->catalog->name(),
+ jcr->JobPriority);
} else {
- prt_type = _("Run Migration job\n");
- }
- jcr->set_JobLevel(L_FULL); /* default level */
- if (ua->api) ua->signal(BNET_RUN_CMD);
- ua->send_msg("%s"
+ if (jcr->getJobType() == JT_COPY) {
+ prt_type = _("Run Copy job\n");
+ } else {
+ prt_type = _("Run Migration job\n");
+ }
+ ua->send_msg("%s"
"JobName: %s\n"
"Bootstrap: %s\n"
"Client: %s\n"
bstrutime(dt, sizeof(dt), jcr->sched_time),
jcr->catalog->name(),
jcr->JobPriority);
+ }
break;
default:
ua->error_msg(_("Unknown Job Type=%d\n"), jcr->getJobType());
"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) {