From: Michal Rakowski Date: Mon, 2 Nov 2020 12:16:42 +0000 (+0100) Subject: Fix #2776 About specifying range in 'disable jobs' command X-Git-Tag: Release-11.3.2~874 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b8aa1386d7b8a9e993d231317a8cfe405fa5e40a;p=thirdparty%2Fbacula.git Fix #2776 About specifying range in 'disable jobs' command --- diff --git a/bacula/src/dird/protos.h b/bacula/src/dird/protos.h index 49189b4d8..33b61013a 100644 --- a/bacula/src/dird/protos.h +++ b/bacula/src/dird/protos.h @@ -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); diff --git a/bacula/src/dird/ua_cmds.c b/bacula/src/dird/ua_cmds.c index a723e903f..22c59e42c 100644 --- a/bacula/src/dird/ua_cmds.c +++ b/bacula/src/dird/ua_cmds.c @@ -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"); diff --git a/bacula/src/dird/ua_select.c b/bacula/src/dird/ua_select.c index 19c0d7b3b..cb6f929d8 100644 --- a/bacula/src/dird/ua_select.c +++ b/bacula/src/dird/ua_select.c @@ -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; + } /*