X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fdird%2Fua_output.c;h=779b0ab3dfa2343c0b82e3e0bd3490050863a856;hb=a64e57850ac943b84184f43e712ccf18b498ca30;hp=b79001982e9d941adf14c83b8e4156f3263521f0;hpb=84a05f3bfbde64c606b014d68b45b2d060e2a478;p=bacula%2Fbacula diff --git a/bacula/src/dird/ua_output.c b/bacula/src/dird/ua_output.c index b79001982e..779b0ab3df 100644 --- a/bacula/src/dird/ua_output.c +++ b/bacula/src/dird/ua_output.c @@ -372,6 +372,10 @@ static int do_list_cmd(UAContext *ua, char *cmd, e_list_type llist) strcasecmp(ua->argk[i], _("nextvolume")) == 0) { JOB *job; JCR *jcr = ua->jcr; + POOL *pool; + RUN *run; + time_t runtime; + i = find_arg_with_value(ua, "job"); if (i <= 0) { if ((job = select_job_resource(ua)) == NULL) { @@ -386,7 +390,9 @@ static int do_list_cmd(UAContext *ua, char *cmd, e_list_type llist) } } } - if (!complete_jcr_for_job(jcr, job, NULL)) { + for (run=NULL; (run = find_next_run(run, job, runtime)); ) { + pool = run ? run->pool : NULL; + if (!complete_jcr_for_job(jcr, job, pool)) { return 1; } @@ -399,6 +405,7 @@ static int do_list_cmd(UAContext *ua, char *cmd, e_list_type llist) bsendmsg(ua, "The next Volume to be used by Job \"%s\" will be %s\n", job->hdr.name, mr.VolumeName); } + } db_close_database(jcr, jcr->db); jcr->db = NULL; } else { @@ -408,6 +415,96 @@ static int do_list_cmd(UAContext *ua, char *cmd, e_list_type llist) return 1; } +/* + * For a given job, we examine all his run records + * to see if it is scheduled today or tomorrow. + */ +RUN *find_next_run(RUN *run, JOB *job, time_t &runtime) +{ + time_t now, tomorrow; + SCHED *sched; + struct tm tm; + int mday, wday, month, wpos, tmday, twday, tmonth, twpos, i, hour; + int tod, tom; + + Dmsg0(200, "enter find_runs()\n"); + + sched = job->schedule; + if (sched == NULL) { /* scheduled? */ + return NULL; /* no nothing to report */ + } + /* Break down current time into components */ + now = time(NULL); + localtime_r(&now, &tm); + mday = tm.tm_mday - 1; + wday = tm.tm_wday; + month = tm.tm_mon; + wpos = (tm.tm_mday - 1) / 7; + + /* Break down tomorrow into components */ + tomorrow = now + 60 * 60 * 24; + localtime_r(&tomorrow, &tm); + tmday = tm.tm_mday - 1; + twday = tm.tm_wday; + tmonth = tm.tm_mon; + twpos = (tm.tm_mday - 1) / 7; + + if (run == NULL) { + run = sched->run; + } else { + run = run->next; + } + for ( ; run; run=run->next) { + /* + * Find runs in next 24 hours + */ + tod = (bit_is_set(mday, run->mday) || bit_is_set(wday, run->wday)) && + bit_is_set(month, run->month) && bit_is_set(wpos, run->wpos); + + tom = (bit_is_set(tmday, run->mday) || bit_is_set(twday, run->wday)) && + bit_is_set(tmonth, run->month) && bit_is_set(wpos, run->wpos); + + Dmsg2(200, "tod=%d tom=%d\n", tod, tom); + if (tod) { /* Jobs scheduled today (next 24 hours) */ + /* find time (time_t) job is to be run */ + localtime_r(&now, &tm); + hour = 0; + for (i=tm.tm_hour; i < 24; i++) { + if (bit_is_set(i, run->hour)) { + tm.tm_hour = i; + tm.tm_min = run->minute; + tm.tm_sec = 0; + runtime = mktime(&tm); + if (runtime > now) { + return run; /* found it, return run resource */ + } + } + } + } + +// Dmsg2(200, "runtime=%d now=%d\n", runtime, now); + if (tom) { /* look at jobs scheduled tomorrow */ + localtime_r(&tomorrow, &tm); + hour = 0; + for (i=0; i < 24; i++) { + if (bit_is_set(i, run->hour)) { + hour = i; + break; + } + } + tm.tm_hour = hour; + tm.tm_min = run->minute; + tm.tm_sec = 0; + runtime = mktime(&tm); + Dmsg2(200, "truntime=%d now=%d\n", runtime, now); + if (runtime < tomorrow) { + return run; /* found it, return run resource */ + } + } + } /* end for loop over runs */ + /* Nothing found */ + return NULL; +} /* * Fill in the remaining fields of the jcr as if it * is going to run the job.