]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/dird/ua_run.c
Fix bug #1959 input validation on delete of jobs.
[bacula/bacula] / bacula / src / dird / ua_run.c
index b813c8904ad9ed4cf3c866aeb77c630d23dca12e..f66bdd572e0f9d238ac13d153f761ca63ef940e0 100644 (file)
@@ -1,7 +1,7 @@
 /*
    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.
@@ -61,6 +61,10 @@ public:
    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)); 
@@ -203,6 +207,7 @@ bail_out:
 int modify_job_parameters(UAContext *ua, JCR *jcr, run_ctx &rc)
 {
    int i, opt;
+   
    /*
     * At user request modify parameters of job to be run.
     */
@@ -351,7 +356,7 @@ int modify_job_parameters(UAContext *ua, JCR *jcr, run_ctx &rc)
             goto try_again;
          }
          /* Where */
-         if (!get_cmd(ua, _("Please enter path prefix for restore (/ for none): "))) {
+         if (!get_cmd(ua, _("Please enter the full path prefix for restore (/ for none): "))) {
             break;
          }
          if (jcr->RegexWhere) { /* cannot use regexwhere and where */
@@ -486,7 +491,6 @@ static bool reset_restore_context(UAContext *ua, JCR *jcr, run_ctx &rc)
       rc.plugin_options = NULL;
    }
 
-
    if (rc.replace) {
       jcr->replace = 0;
       for (i=0; ReplaceOptions[i].name; i++) {
@@ -523,10 +527,9 @@ static bool reset_restore_context(UAContext *ua, JCR *jcr, run_ctx &rc)
       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;
       }
@@ -549,6 +552,25 @@ static bool reset_restore_context(UAContext *ua, JCR *jcr, run_ctx &rc)
       jcr->RestoreJobId = str_to_int64(rc.jid);
       rc.jid = 0;
    }
+
+   /* 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;
+   }
+
    return true;
 }
 
@@ -573,7 +595,7 @@ try_again_reg:
    switch (do_prompt(ua, "", _("Select parameter to modify"), NULL, 0)) {
    case 0:
       /* Strip prefix */
-      if (get_cmd(ua, _("Please enter path prefix to strip: "))) {
+      if (get_cmd(ua, _("Please enter the path prefix to strip: "))) {
          if (strip_prefix) bfree(strip_prefix);
          strip_prefix = bstrdup(ua->cmd);
       }
@@ -581,7 +603,7 @@ try_again_reg:
       goto try_again_reg;
    case 1:
       /* Add prefix */
-      if (get_cmd(ua, _("Please enter path prefix to add (/ for none): "))) {
+      if (get_cmd(ua, _("Please enter the path prefix to add (/ for none): "))) {
          if (IsPathSeparator(ua->cmd[0]) && ua->cmd[1] == '\0') {
             ua->cmd[0] = 0;
          }
@@ -592,7 +614,7 @@ try_again_reg:
       goto try_again_reg;
    case 2:
       /* Add suffix */
-      if (get_cmd(ua, _("Please enter file suffix to add: "))) {
+      if (get_cmd(ua, _("Please enter the file suffix to add: "))) {
          if (add_suffix) bfree(add_suffix);
          add_suffix = bstrdup(ua->cmd);
       }      
@@ -700,19 +722,19 @@ static void select_job_level(UAContext *ua, JCR *jcr)
 //       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;
@@ -726,19 +748,19 @@ static void select_job_level(UAContext *ua, JCR *jcr)
       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;
@@ -775,14 +797,13 @@ static bool display_job_parameters(UAContext *ua, JCR *jcr, JOB *job, const char
                  bstrutime(dt, sizeof(dt), jcr->sched_time),
                  jcr->JobPriority);
       } else {
-         ua->send_msg(_("Run %s job\n"
+         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()),
@@ -790,7 +811,7 @@ static bool display_job_parameters(UAContext *ua, JCR *jcr, JOB *job, const char
                  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:
@@ -820,7 +841,7 @@ static bool display_job_parameters(UAContext *ua, JCR *jcr, JOB *job, const char
                  jcr->plugin_options?jcr->plugin_options:"",
                  jcr->plugin_options?"\n":"");
          } else {
-            ua->send_msg(_("Run %s job\n"
+            ua->send_msg(_("Run Backup job\n"
                         "JobName:  %s\n"
                         "Level:    %s\n"
                         "Client:   %s\n"
@@ -890,7 +911,7 @@ static bool display_job_parameters(UAContext *ua, JCR *jcr, JOB *job, const char
               bstrutime(dt, sizeof(dt), jcr->sched_time),
               jcr->JobPriority);
          } else {
-            ua->send_msg(_("Run %s job\n"
+            ua->send_msg(_("Run Verify Job\n"
                         "JobName:     %s\n"
                         "Level:       %s\n"
                         "Client:      %s\n"
@@ -901,7 +922,6 @@ static bool display_job_parameters(UAContext *ua, JCR *jcr, JOB *job, const char
                         "Verify List: %s\n"
                         "When:        %s\n"
                         "Priority:    %d\n"),
-              _("Verify"),
               job->name(),
               level_to_str(jcr->getJobLevel()),
               jcr->client->name(),
@@ -926,7 +946,7 @@ static bool display_job_parameters(UAContext *ua, JCR *jcr, JOB *job, const char
             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 */
@@ -1083,7 +1103,7 @@ static bool display_job_parameters(UAContext *ua, JCR *jcr, JOB *job, const char
    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) {
@@ -1163,7 +1183,7 @@ static bool scan_command_line_arguments(UAContext *ua, run_ctx &rc)
       "job",                          /*  Used in a switch() */
       "jobid",                        /* 1 */
       "client",                       /* 2 */
-      "fd",
+      "fd",                           /* 3 */
       "fileset",                      /* 4 */
       "level",                        /* 5 */
       "storage",                      /* 6 */
@@ -1174,7 +1194,7 @@ static bool scan_command_line_arguments(UAContext *ua, run_ctx &rc)
       "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 */
@@ -1188,7 +1208,10 @@ static bool scan_command_line_arguments(UAContext *ua, run_ctx &rc)
       "pluginoptions",                /* 25 */
       "spooldata",                    /* 26 */
       "comment",                      /* 27 */
-      NULL};
+      "ignoreduplicatecheck",         /* 28 */
+      "accurate",                     /* 29 */
+      NULL
+   };
 
 #define YES_POS 14
 
@@ -1201,7 +1224,9 @@ static bool scan_command_line_arguments(UAContext *ua, run_ctx &rc)
    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++) {
@@ -1342,22 +1367,18 @@ static bool scan_command_line_arguments(UAContext *ua, run_ctx &rc)
                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;
@@ -1414,7 +1435,7 @@ static bool scan_command_line_arguments(UAContext *ua, run_ctx &rc)
                   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"));
@@ -1423,6 +1444,31 @@ static bool scan_command_line_arguments(UAContext *ua, run_ctx &rc)
             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;
             }
@@ -1507,11 +1553,6 @@ static bool scan_command_line_arguments(UAContext *ua, run_ctx &rc)
    }
    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"));
@@ -1575,7 +1616,6 @@ static bool scan_command_line_arguments(UAContext *ua, run_ctx &rc)
    }
    Dmsg1(800, "Using restore client=%s\n", rc.client->name());
 
-
    if (rc.fileset_name) {
       rc.fileset = GetFileSetResWithName(rc.fileset_name);
       if (!rc.fileset) {