From 3bbfe4198cadc94fee6b61c4fe97986d08cb91ec Mon Sep 17 00:00:00 2001 From: Marco van Wieringen Date: Fri, 6 Jun 2014 17:01:18 +0200 Subject: [PATCH] Enable/Disable Scheduler Fixes #308: Enable/Disable Scheduler --- src/dird/dird_conf.c | 1 + src/dird/dird_conf.h | 2 ++ src/dird/protos.h | 1 + src/dird/scheduler.c | 4 ++- src/dird/ua_cmds.c | 67 +++++++++++++++++++++++++++++++------------- src/dird/ua_select.c | 27 ++++++++++++++++++ src/dird/ua_status.c | 4 +++ 7 files changed, 86 insertions(+), 20 deletions(-) diff --git a/src/dird/dird_conf.c b/src/dird/dird_conf.c index 6d713ad08b6..f2da9125621 100644 --- a/src/dird/dird_conf.c +++ b/src/dird/dird_conf.c @@ -395,6 +395,7 @@ static RES_ITEM sch_items[] = { { "name", CFG_TYPE_NAME, ITEM(res_sch.hdr.name), 0, CFG_ITEM_REQUIRED, NULL }, { "description", CFG_TYPE_STR, ITEM(res_sch.hdr.desc), 0, 0, NULL }, { "run", CFG_TYPE_RUN, ITEM(res_sch.run), 0, 0, NULL }, + { "enabled", CFG_TYPE_BOOL, ITEM(res_sch.enabled), 0, CFG_ITEM_DEFAULT, "true" }, { NULL, 0, { 0 }, 0, 0, NULL } }; diff --git a/src/dird/dird_conf.h b/src/dird/dird_conf.h index 5c4244e0d9e..369886fe93d 100644 --- a/src/dird/dird_conf.h +++ b/src/dird/dird_conf.h @@ -548,6 +548,7 @@ inline char *FILESETRES::name() const { return hdr.name; } class SCHEDRES: public BRSRES { public: RUNRES *run; + bool enabled; /* Set if schedule is enabled */ }; /* @@ -665,3 +666,4 @@ class RUNRES: public BRSRES { #define GetJobResWithName(x) ((JOBRES *)GetResWithName(R_JOB, (x))) #define GetFileSetResWithName(x) ((FILESETRES *)GetResWithName(R_FILESET, (x))) #define GetCatalogResWithName(x) ((CATRES *)GetResWithName(R_CATALOG, (x))) +#define GetScheduleResWithName(x) ((SCHEDRES *)GetResWithName(R_SCHEDULE, (x))) diff --git a/src/dird/protos.h b/src/dird/protos.h index 516ffefcd07..4168a8d01b0 100644 --- a/src/dird/protos.h +++ b/src/dird/protos.h @@ -293,6 +293,7 @@ JOBRES *select_restore_job_resource(UAContext *ua); CLIENTRES *select_client_resource(UAContext *ua); CLIENTRES *select_enable_disable_client_resource(UAContext *ua, bool enable); FILESETRES *select_fileset_resource(UAContext *ua); +SCHEDRES *select_enable_disable_schedule_resource(UAContext *ua, bool enable); int select_pool_and_media_dbr(UAContext *ua, POOL_DBR *pr, MEDIA_DBR *mr); int select_media_dbr(UAContext *ua, MEDIA_DBR *mr); bool select_pool_dbr(UAContext *ua, POOL_DBR *pr, const char *argk = "pool"); diff --git a/src/dird/scheduler.c b/src/dird/scheduler.c index 240666625fc..f3e08b36c2d 100644 --- a/src/dird/scheduler.c +++ b/src/dird/scheduler.c @@ -349,12 +349,14 @@ static void find_runs() foreach_res(job, R_JOB) { sched = job->schedule; if (sched == NULL || + !sched->enabled || !job->enabled || (job->client && !job->client->enabled)) { /* scheduled? or enabled? */ continue; /* no, skip this job */ } + Dmsg1(dbglvl, "Got job: %s\n", job->hdr.name); - for (run=sched->run; run; run=run->next) { + for (run = sched->run; run; run = run->next) { bool run_now, run_nh; /* * Find runs scheduled between now and the next hour. diff --git a/src/dird/ua_cmds.c b/src/dird/ua_cmds.c index 276bb5c105e..cd81e3c0c40 100644 --- a/src/dird/ua_cmds.c +++ b/src/dird/ua_cmds.c @@ -111,10 +111,10 @@ static struct cmdstruct commands[] = { NT_("pool="), false }, { NT_("delete"), delete_cmd, _("Delete volume, pool or job"), NT_("volume= pool= jobid="), true }, - { NT_("disable"), disable_cmd, _("Disable a job/client"), - NT_("job= client="), true }, - { NT_("enable"), enable_cmd, _("Enable a job/client"), - NT_("job= client="), true }, + { NT_("disable"), disable_cmd, _("Disable a job/client/schedule"), + NT_("job= client= schedule="), true }, + { NT_("enable"), enable_cmd, _("Enable a job/client/schedule"), + NT_("job= client= schedule="), true }, { NT_("estimate"), estimate_cmd, _("Performs FileSet estimate, listing gives full listing"), NT_("fileset= client= level= accurate= job= listing"), true }, { NT_("exit"), quit_cmd, _("Terminate Bconsole session"), @@ -943,48 +943,77 @@ static int setip_cmd(UAContext *ua, const char *cmd) static void do_en_disable_cmd(UAContext *ua, bool setting) { + SCHEDRES *sched = NULL; CLIENTRES *client = NULL; JOBRES *job = NULL; int i; - i = find_arg(ua, NT_("client")); + i = find_arg(ua, NT_("schedule")); if (i >= 0) { - i = find_arg_with_value(ua, NT_("client")); + i = find_arg_with_value(ua, NT_("schedule")); if (i >= 0) { LockRes(); - client = GetClientResWithName(ua->argv[i]); + sched = GetScheduleResWithName(ua->argv[i]); UnlockRes(); } else { - client = select_enable_disable_client_resource(ua, setting); - if (!client) { + sched = select_enable_disable_schedule_resource(ua, setting); + if (!sched) { return; } } - if (!client) { + if (!sched) { ua->error_msg(_("Client \"%s\" not found.\n"), ua->argv[i]); return; } } else { - i = find_arg_with_value(ua, NT_("job")); + i = find_arg(ua, NT_("client")); if (i >= 0) { - LockRes(); - job = GetJobResWithName(ua->argv[i]); - UnlockRes(); + i = find_arg_with_value(ua, NT_("client")); + if (i >= 0) { + LockRes(); + client = GetClientResWithName(ua->argv[i]); + UnlockRes(); + } else { + client = select_enable_disable_client_resource(ua, setting); + if (!client) { + return; + } + } + + if (!client) { + ua->error_msg(_("Client \"%s\" not found.\n"), ua->argv[i]); + return; + } } else { - job = select_enable_disable_job_resource(ua, setting); + i = find_arg_with_value(ua, NT_("job")); + if (i >= 0) { + LockRes(); + job = GetJobResWithName(ua->argv[i]); + UnlockRes(); + } else { + job = select_enable_disable_job_resource(ua, setting); + if (!job) { + return; + } + } + if (!job) { + ua->error_msg(_("Job \"%s\" not found.\n"), ua->argv[i]); return; } } + } - if (!job) { - ua->error_msg(_("Job \"%s\" not found.\n"), ua->argv[i]); + if (sched) { + if (!acl_access_ok(ua, Schedule_ACL, sched->name())) { + ua->error_msg(_("Unauthorized command from this console.\n")); return; } - } - if (client) { + sched->enabled = setting; + ua->send_msg(_("Schedule \"%s\" %sabled\n"), sched->name(), setting ? "en" : "dis"); + } else if (client) { if (!acl_access_ok(ua, Client_ACL, client->name())) { ua->error_msg(_("Unauthorized command from this console.\n")); return; diff --git a/src/dird/ua_select.c b/src/dird/ua_select.c index 5ded0b70bc2..a0984e7a989 100644 --- a/src/dird/ua_select.c +++ b/src/dird/ua_select.c @@ -410,6 +410,33 @@ CLIENTRES *get_client_resource(UAContext *ua) return select_client_resource(ua); } +/* + * Select a schedule to enable or disable + */ +SCHEDRES *select_enable_disable_schedule_resource(UAContext *ua, bool enable) +{ + char name[MAX_NAME_LENGTH]; + SCHEDRES *sched; + + LockRes(); + start_prompt(ua, _("The defined Schedule resources are:\n")); + foreach_res(sched, R_SCHEDULE) { + if (!acl_access_ok(ua, Schedule_ACL, sched->name())) { + continue; + } + if (sched->enabled == enable) { /* Already enabled/disabled? */ + continue; /* yes, skip */ + } + add_prompt(ua, sched->name()); + } + UnlockRes(); + if (do_prompt(ua, _("Schedule"), _("Select Schedule resource"), name, sizeof(name)) < 0) { + return NULL; + } + sched = (SCHEDRES *)GetResWithName(R_SCHEDULE, name); + return sched; +} + /* Scan what the user has entered looking for: * * client= diff --git a/src/dird/ua_status.c b/src/dird/ua_status.c index c959736a1b2..591d443b831 100644 --- a/src/dird/ua_status.c +++ b/src/dird/ua_status.c @@ -646,6 +646,10 @@ static void do_scheduler_status(UAContext *ua) foreach_res(sched, R_SCHEDULE) { int cnt = 0; + if (!schedulegiven && !sched->enabled) { + continue; + } + if (!acl_access_ok(ua, Schedule_ACL, sched->hdr.name)) { continue; }