]> git.ipfire.org Git - thirdparty/bacula.git/commitdiff
Fix #2776 About specifying range in 'disable jobs' command
authorMichal Rakowski <michal.rakowski@baculasystems.com>
Mon, 2 Nov 2020 12:16:42 +0000 (13:16 +0100)
committerEric Bollengier <eric@baculasystems.com>
Thu, 24 Mar 2022 08:02:58 +0000 (09:02 +0100)
bacula/src/dird/protos.h
bacula/src/dird/ua_cmds.c
bacula/src/dird/ua_select.c

index 49189b4d8ffdd29f94490e91fd4142f4c6bb7a37..33b61013a9208746fdc6e83bcfc6cf30e50c4559 100644 (file)
@@ -225,6 +225,7 @@ bool open_client_db(UAContext *ua);
 bool open_db(UAContext *ua);
 void close_db(UAContext *ua);
 int cloud_volumes_cmd(UAContext *ua, const char *cmd, const char *mode);
+void enable_disable_job(UAContext *ua, JOB *job, bool setting, bool force);
 enum e_pool_op {
    POOL_OP_UPDATE,
    POOL_OP_CREATE
@@ -277,7 +278,7 @@ void free_ua_context(UAContext *ua);
 /* ua_select.c */
 STORE   *select_storage_resource(UAContext *ua, bool unique=false);
 JOB     *select_job_resource(UAContext *ua);
-JOB     *select_enable_disable_job_resource(UAContext *ua, bool enable);
+void    select_enable_disable_job_resource(UAContext *ua, bool enable);
 JOB     *select_restore_job_resource(UAContext *ua);
 CLIENT  *select_enable_disable_client_resource(UAContext *ua, bool enable);
 CLIENT  *select_client_resource(UAContext *ua, int32_t jobtype);
index a723e903f73ca53276f0c8bcbd8a6cce8f6302f9..22c59e42ca7370410e6521dcd6dfd5d27af5f670 100644 (file)
@@ -871,7 +871,7 @@ get_out:
    return 1;
 }
 
-static void enable_disable_job(UAContext *ua, JOB *job, bool setting, bool force)
+void enable_disable_job(UAContext *ua, JOB *job, bool setting, bool force)
 {
    if (!acl_access_ok(ua, Job_ACL, job->name())) {
       return;
@@ -924,25 +924,24 @@ static void do_enable_disable_cmd(UAContext *ua, bool setting)
    if (i >= 0) {
       if (ua->argv[i]) {
          LockRes();
+
          job = GetJobResWithName(ua->argv[i]);
          UnlockRes();
-      } else {
-         job = select_enable_disable_job_resource(ua, setting);
-         if (!job) {
-            return;
+
+         if (job) {
+            /* User manages single job, force flag can be set */
+            enable_disable_job(ua, job, setting, true);
          }
-      }
-   }
 
-   if (job) {
-      /* User manages single job, force flag can be set */
-      enable_disable_job(ua, job, setting, true);
-      return;
+         return;
+      } else {
+         select_enable_disable_job_resource(ua, setting);
+         return;
+      }
    }
 
    i = find_arg(ua, NT_("jobs"));
    if (i >= 0) {
-      //TODO passing list of jobs could implemented as well
       int j = find_arg(ua, NT_("all"));
       if (j >= 0) {
          ua->send_events("DC0007", EVENTS_TYPE_COMMAND, "%sabling all jobs", setting?"en":"dis");
index 19c0d7b3b0a22ce3b3a2ca5c7bae8279457a364d..cb6f929d8f189a65b76f9098307f9c6c4569bb1e 100644 (file)
@@ -283,9 +283,8 @@ CAT *get_catalog_resource(UAContext *ua)
 /*
  * Select a job to enable or disable
  */
-JOB *select_enable_disable_job_resource(UAContext *ua, bool enable)
+void select_enable_disable_job_resource(UAContext *ua, bool enable)
 {
-   char name[MAX_NAME_LENGTH];
    JOB *job;
 
    LockRes();
@@ -304,11 +303,22 @@ JOB *select_enable_disable_job_resource(UAContext *ua, bool enable)
       add_prompt(ua, job->name());
    }
    UnlockRes();
-   if (do_prompt(ua, _("Job"), _("Select Job resource"), name, sizeof(name)) < 0) {
-      return NULL;
+
+   alist selected(10);
+   if (do_alist_prompt(ua, _("Job"), _("Select Job resource"), &selected) < 0) {
+      return;
+   } else {
+      char *name;
+      foreach_alist(name, &selected) {
+         job = (JOB *)GetResWithName(R_JOB, name);
+         if (job) {
+            enable_disable_job(ua, job, enable, false);
+         } else {
+            return;
+         }
+      }
    }
-   job = (JOB *)GetResWithName(R_JOB, name);
-   return job;
+
 }
 
 /*