From: Eric Bollengier Date: Tue, 19 Sep 2017 12:19:22 +0000 (+0200) Subject: Enhance "status schedule" function to allow multiple job= and client= filters X-Git-Tag: Release-9.2.0~20 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5fc48db5ffe53376ffa39804090506aafb5b0653;p=thirdparty%2Fbacula.git Enhance "status schedule" function to allow multiple job= and client= filters --- diff --git a/bacula/src/dird/backup.c b/bacula/src/dird/backup.c index f31fd4472..85f337592 100644 --- a/bacula/src/dird/backup.c +++ b/bacula/src/dird/backup.c @@ -767,7 +767,7 @@ int wait_for_job_termination(JCR *jcr, int timeout) */ void backup_cleanup(JCR *jcr, int TermCode) { - char sdt[50], edt[50], schedt[50]; + char sdt[50], edt[50], schedt[50], edl[50]; char ec1[30], ec2[30], ec3[30], ec4[30], ec5[30]; char ec6[30], ec7[30], ec8[30], ec9[30], ec10[30], elapsed[50]; char data_compress[200], comm_compress[200]; @@ -969,7 +969,7 @@ void backup_cleanup(JCR *jcr, int TermCode) HOST_OS, DISTNAME, DISTVER, jcr->jr.JobId, jcr->jr.Job, - level_to_str(jcr->getJobLevel()), jcr->since, + level_to_str(edl, sizeof(edl), jcr->getJobLevel()), jcr->since, jcr->client->name(), cr.Uname, jcr->fileset->name(), jcr->FSCreateTime, jcr->pool->name(), jcr->pool_source, @@ -1014,6 +1014,7 @@ void update_bootstrap_file(JCR *jcr) FILE *fd; BPIPE *bpipe = NULL; int got_pipe = 0; + char edl[50]; POOLMEM *fname = get_pool_memory(PM_FNAME); fname = edit_job_codes(jcr, fname, jcr->job->WriteBootstrap, "", job_code_callback_director); @@ -1044,7 +1045,7 @@ void update_bootstrap_file(JCR *jcr) /* Start output with when and who wrote it */ bstrftimes(edt, sizeof(edt), time(NULL)); fprintf(fd, "# %s - %s - %s%s\n", edt, jcr->jr.Job, - level_to_str(jcr->getJobLevel()), jcr->since); + level_to_str(edl, sizeof(edl), jcr->getJobLevel()), jcr->since); for (int i=0; i < VolCount; i++) { /* Write the record */ fprintf(fd, "Volume=\"%s\"\n", VolParams[i].VolumeName); diff --git a/bacula/src/dird/dird_conf.c b/bacula/src/dird/dird_conf.c index a72c7e11e..a16d13e0c 100644 --- a/bacula/src/dird/dird_conf.c +++ b/bacula/src/dird/dird_conf.c @@ -807,20 +807,17 @@ char *CAT::display(POOLMEM *dst) { return dst; } -const char *level_to_str(int level) +char *level_to_str(char *buf, int len, int level) { int i; - static char level_no[30]; - const char *str = level_no; - - bsnprintf(level_no, sizeof(level_no), "%c (%d)", level, level); /* default if not found */ + bsnprintf(buf, len, "%c (%d)", level, level); /* default if not found */ for (i=0; joblevels[i].level_name; i++) { if (level == (int)joblevels[i].level) { - str = joblevels[i].level_name; + bstrncpy(buf, joblevels[i].level_name, len); break; } } - return str; + return buf; } /* Dump contents of resource */ @@ -829,7 +826,7 @@ void dump_resource(int type, RES *ares, void sendit(void *sock, const char *fmt, RES *next; URES *res = (URES *)ares; bool recurse = true; - char ed1[100], ed2[100], ed3[100]; + char ed1[100], ed2[100], ed3[100], edl[50]; DEVICE *dev; UAContext *ua = (UAContext *)sock; POOLMEM *buf; @@ -966,7 +963,7 @@ void dump_resource(int type, RES *ares, void sendit(void *sock, const char *fmt, sendit(sock, _("%s: name=%s JobType=%d level=%s Priority=%d Enabled=%d\n"), type == R_JOB ? _("Job") : _("JobDefs"), res->res_job.hdr.name, res->res_job.JobType, - level_to_str(res->res_job.JobLevel), res->res_job.Priority, + level_to_str(edl, sizeof(edl), res->res_job.JobLevel), res->res_job.Priority, res->res_job.is_enabled()); sendit(sock, _(" MaxJobs=%u NumJobs=%u Resched=%d Times=%d Interval=%s Spool=%d WritePartAfterJob=%d\n"), res->res_job.MaxConcurrentJobs, @@ -1205,7 +1202,7 @@ void dump_resource(int type, RES *ares, void sendit(void *sock, const char *fmt, break; } next_run: - sendit(sock, _(" --> Run Level=%s\n"), level_to_str(run->level)); + sendit(sock, _(" --> Run Level=%s\n"), level_to_str(edl, sizeof(edl), run->level)); if (run->MaxRunSchedTime) { sendit(sock, _(" MaxRunSchedTime=%u\n"), run->MaxRunSchedTime); } diff --git a/bacula/src/dird/fd_cmds.c b/bacula/src/dird/fd_cmds.c index ba2164edf..827ea4244 100644 --- a/bacula/src/dird/fd_cmds.c +++ b/bacula/src/dird/fd_cmds.c @@ -182,7 +182,7 @@ void get_level_since_time(JCR *jcr, char *since, int since_len) utime_t now; utime_t last_full_time = 0; utime_t last_diff_time; - char prev_job[MAX_NAME_LENGTH]; + char prev_job[MAX_NAME_LENGTH], edl[50]; since[0] = 0; /* If job cloned and a since time already given, use it */ @@ -259,20 +259,20 @@ void get_level_since_time(JCR *jcr, char *since, int since_len) Jmsg(jcr, M_INFO, 0, "%s", db_strerror(jcr->db)); Jmsg(jcr, M_INFO, 0, _("No prior or suitable Full backup found in catalog. Doing FULL backup.\n")); bsnprintf(since, since_len, _(" (upgraded from %s)"), - level_to_str(jcr->getJobLevel())); + level_to_str(edl, sizeof(edl), jcr->getJobLevel())); jcr->setJobLevel(jcr->jr.JobLevel = L_FULL); } else if (do_vfull) { /* No recent Full job found, and MaxVirtualFull is set so upgrade this one to Virtual Full */ Jmsg(jcr, M_INFO, 0, "%s", db_strerror(jcr->db)); Jmsg(jcr, M_INFO, 0, _("No prior or suitable Full backup found in catalog. Doing Virtual FULL backup.\n")); bsnprintf(since, since_len, _(" (upgraded from %s)"), - level_to_str(jcr->getJobLevel())); + level_to_str(edl, sizeof(edl), jcr->getJobLevel())); jcr->setJobLevel(jcr->jr.JobLevel = L_VIRTUAL_FULL); } else if (do_diff) { /* No recent diff job found, so upgrade this one to Diff */ Jmsg(jcr, M_INFO, 0, _("No prior or suitable Differential backup found in catalog. Doing Differential backup.\n")); bsnprintf(since, since_len, _(" (upgraded from %s)"), - level_to_str(jcr->getJobLevel())); + level_to_str(edl, sizeof(edl), jcr->getJobLevel())); jcr->setJobLevel(jcr->jr.JobLevel = L_DIFFERENTIAL); } else { if (jcr->job->rerun_failed_levels) { @@ -293,9 +293,9 @@ void get_level_since_time(JCR *jcr, char *since, int since_len) if ((jcr->getJobLevel() == L_INCREMENTAL) || ((jcr->getJobLevel() == L_DIFFERENTIAL) && (JobLevel == L_FULL))) { Jmsg(jcr, M_INFO, 0, _("Prior failed job found in catalog. Upgrading to %s.\n"), - level_to_str(JobLevel)); + level_to_str(edl, sizeof(edl), JobLevel)); bsnprintf(since, since_len, _(" (upgraded from %s)"), - level_to_str(jcr->getJobLevel())); + level_to_str(edl, sizeof(edl), jcr->getJobLevel())); jcr->setJobLevel(jcr->jr.JobLevel = JobLevel); jcr->jr.JobId = jcr->JobId; break; diff --git a/bacula/src/dird/mac.c b/bacula/src/dird/mac.c index 1ed32c1b3..afa643a62 100644 --- a/bacula/src/dird/mac.c +++ b/bacula/src/dird/mac.c @@ -621,7 +621,7 @@ void mac_cleanup(JCR *jcr, int TermCode, int writeTermCode) { char sdt[MAX_TIME_LENGTH], edt[MAX_TIME_LENGTH]; char ec1[30], ec2[30], ec3[30], ec4[30], ec5[30], elapsed[50]; - char ec6[50], ec7[50], ec8[50], ec9[30], ec10[30]; + char ec6[50], ec7[50], ec8[50], ec9[30], ec10[30], edl[50]; char sd_term_msg[100]; POOL_MEM term_code; POOL_MEM term_msg; @@ -875,7 +875,7 @@ void mac_cleanup(JCR *jcr, int TermCode, int writeTermCode) wjcr ? edit_uint64(wjcr->jr.JobId, ec7) : "0", edit_uint64(jcr->jr.JobId, ec8), jcr->jr.Job, - level_to_str(jcr->getJobLevel()), jcr->since, + level_to_str(edl, sizeof(edl), jcr->getJobLevel()), jcr->since, jcr->client->name(), jcr->fileset->name(), jcr->FSCreateTime, jcr->rpool->name(), jcr->rpool_source, diff --git a/bacula/src/dird/protos.h b/bacula/src/dird/protos.h index a35d969dd..05217c683 100644 --- a/bacula/src/dird/protos.h +++ b/bacula/src/dird/protos.h @@ -84,7 +84,7 @@ extern bool despool_attributes_from_file(JCR *jcr, const char *file); extern void remove_dummy_jobmedia_records(JCR *jcr); /* dird_conf.c */ -extern const char *level_to_str(int level); +extern char *level_to_str(char *buf, int len, int level); extern "C" char *job_code_callback_director(JCR *jcr, const char*, char *, int); /* expand.c */ diff --git a/bacula/src/dird/ua_dotcmds.c b/bacula/src/dird/ua_dotcmds.c index 292d933c1..ff7cfdf0b 100644 --- a/bacula/src/dird/ua_dotcmds.c +++ b/bacula/src/dird/ua_dotcmds.c @@ -2094,6 +2094,7 @@ static bool defaultscmd(UAContext *ua, const char *cmd) JOB *job = (JOB *)GetResWithName(R_JOB, ua->argv[1]); if (job) { USTORE store; + char edl[50]; ua->send_msg("job=%s", job->name()); ua->send_msg("pool=%s", job->pool->name()); ua->send_msg("messages=%s", job->messages->name()); @@ -2101,7 +2102,7 @@ static bool defaultscmd(UAContext *ua, const char *cmd) get_job_storage(&store, job, NULL); ua->send_msg("storage=%s", store.store->name()); ua->send_msg("where=%s", job->RestoreWhere?job->RestoreWhere:""); - ua->send_msg("level=%s", level_to_str(job->JobLevel)); + ua->send_msg("level=%s", level_to_str(edl, sizeof(edl), job->JobLevel)); ua->send_msg("type=%s", job_type_to_str(job->JobType)); ua->send_msg("fileset=%s", job->fileset->name()); ua->send_msg("enabled=%d", job->is_enabled()); diff --git a/bacula/src/dird/ua_output.c b/bacula/src/dird/ua_output.c index c18f340a9..8425d99e0 100644 --- a/bacula/src/dird/ua_output.c +++ b/bacula/src/dird/ua_output.c @@ -759,6 +759,7 @@ static bool list_nextvol(UAContext *ua, int ndays) bool found = false; MEDIA_DBR mr; POOL_DBR pr; + char edl[50]; int i = find_arg_with_value(ua, "job"); if (i <= 0) { @@ -796,11 +797,11 @@ static bool list_nextvol(UAContext *ua, int ndays) /* no need to set ScratchPoolId, since we use fnv_no_create_vol */ if (!find_next_volume_for_append(jcr, &mr, 1, fnv_no_create_vol, fnv_prune)) { ua->error_msg(_("Could not find next Volume for Job %s (Pool=%s, Level=%s).\n"), - job->name(), pr.Name, level_to_str(run->level)); + job->name(), pr.Name, level_to_str(edl, sizeof(edl), run->level)); } else { ua->send_msg( _("The next Volume to be used by Job \"%s\" (Pool=%s, Level=%s) will be %s\n"), - job->name(), pr.Name, level_to_str(run->level), mr.VolumeName); + job->name(), pr.Name, level_to_str(edl, sizeof(edl), run->level), mr.VolumeName); found = true; } } diff --git a/bacula/src/dird/ua_run.c b/bacula/src/dird/ua_run.c index 58ca3d6c8..00f5b4bb6 100644 --- a/bacula/src/dird/ua_run.c +++ b/bacula/src/dird/ua_run.c @@ -1755,7 +1755,7 @@ static void select_job_level(UAContext *ua, JCR *jcr) static bool display_job_parameters(UAContext *ua, JCR *jcr, JOB *job, const char *verify_list, char *jid, const char *replace, char *client_name) { - char ec1[30]; + char ec1[30], edl[50]; char dt[MAX_TIME_LENGTH]; Dmsg1(800, "JobType=%c\n", jcr->getJobType()); @@ -1818,7 +1818,7 @@ static bool display_job_parameters(UAContext *ua, JCR *jcr, JOB *job, const char "Priority: %d\n" "%s%s%s", job->name(), - level_to_str(jcr->getJobLevel()), + level_to_str(edl, sizeof(edl), jcr->getJobLevel()), jcr->client->name(), jcr->fileset->name(), NPRT(jcr->pool->name()), @@ -1848,7 +1848,7 @@ static bool display_job_parameters(UAContext *ua, JCR *jcr, JOB *job, const char "Priority: %d\n" "%s%s%s"), job->name(), - level_to_str(jcr->getJobLevel()), + level_to_str(edl, sizeof(edl), jcr->getJobLevel()), jcr->client->name(), jcr->fileset->name(), NPRT(jcr->pool->name()), jcr->pool_source, @@ -1898,7 +1898,7 @@ static bool display_job_parameters(UAContext *ua, JCR *jcr, JOB *job, const char "When: %s\n" "Priority: %d\n", job->name(), - level_to_str(jcr->getJobLevel()), + level_to_str(edl, sizeof(edl), jcr->getJobLevel()), jcr->client->name(), jcr->fileset->name(), NPRT(jcr->pool->name()), jcr->pool_source, @@ -1920,7 +1920,7 @@ static bool display_job_parameters(UAContext *ua, JCR *jcr, JOB *job, const char "When: %s\n" "Priority: %d\n"), job->name(), - level_to_str(jcr->getJobLevel()), + level_to_str(edl, sizeof(edl), jcr->getJobLevel()), jcr->client->name(), jcr->fileset->name(), NPRT(jcr->pool->name()), jcr->pool_source, diff --git a/bacula/src/dird/ua_status.c b/bacula/src/dird/ua_status.c index 8f2de88d7..eadd460b8 100644 --- a/bacula/src/dird/ua_status.c +++ b/bacula/src/dird/ua_status.c @@ -668,7 +668,7 @@ struct sched_pkt { static void prt_runtime(UAContext *ua, sched_pkt *sp, OutputWriter *ow) { - char dt[MAX_TIME_LENGTH]; + char dt[MAX_TIME_LENGTH], edl[50]; const char *level_ptr; bool ok = false; bool close_db = false; @@ -705,7 +705,7 @@ static void prt_runtime(UAContext *ua, sched_pkt *sp, OutputWriter *ow) level_ptr = "Restore"; break; default: - level_ptr = level_to_str(sp->level); + level_ptr = level_to_str(edl, sizeof(edl), sp->level); break; } if (ua->api == 1) { @@ -780,6 +780,20 @@ static int compare(void *i1, void *i2) return 1; /* If same name, same time, same prio => insert after */ } +static bool is_included(const char *str, alist *list) +{ + char *v; + if (list->size() == 0) { /* The list is empty, we take everything */ + return true; + } + foreach_alist(v, list) { + if (strcmp(v, str) == 0) { + return true; + } + } + return false; +} + /* * Detailed listing of all scheduler jobs */ @@ -1330,7 +1344,7 @@ static void list_running_jobs(UAContext *ua) bstrncpy(level, "Restore", sizeof(level)); break; default: - bstrncpy(level, level_to_str(jcr->getJobLevel()), sizeof(level)); + level_to_str(level, sizeof(level), jcr->getJobLevel()); level[7] = 0; break; } @@ -1445,7 +1459,7 @@ static void list_terminated_jobs(UAContext *ua) bstrncpy(level, "Restore", sizeof(level)); break; default: - bstrncpy(level, level_to_str(je->JobLevel), sizeof(level)); + level_to_str(level, sizeof(level), je->JobLevel); level[4] = 0; break; } diff --git a/bacula/src/dird/verify.c b/bacula/src/dird/verify.c index 8a97693fc..74d5bb07a 100644 --- a/bacula/src/dird/verify.c +++ b/bacula/src/dird/verify.c @@ -87,7 +87,7 @@ bool do_verify(JCR *jcr) const char *level; BSOCK *fd, *sd; int stat; - char ed1[100]; + char ed1[100], edl[50]; JOB_DBR jr; JobId_t verify_jobid = 0; char *store_address; @@ -240,7 +240,7 @@ bool do_verify(JCR *jcr) /* Print Job Start message */ Jmsg(jcr, M_INFO, 0, _("Start Verify JobId=%s Level=%s Job=%s\n"), - edit_uint64(jcr->JobId, ed1), level_to_str(jcr->getJobLevel()), jcr->Job); + edit_uint64(jcr->JobId, ed1), level_to_str(edl, sizeof(edl), jcr->getJobLevel()), jcr->Job); if (jcr->getJobLevel() == L_VERIFY_VOLUME_TO_CATALOG || jcr->getJobLevel() == L_VERIFY_DATA) @@ -434,7 +434,7 @@ bail_out: */ void verify_cleanup(JCR *jcr, int TermCode) { - char sdt[50], edt[50]; + char sdt[50], edt[50], edl[50]; char ec1[30], ec2[30], elapsed[50]; char term_code[100], fd_term_msg[100], sd_term_msg[100]; const char *term_msg; @@ -532,7 +532,7 @@ void verify_cleanup(JCR *jcr, int TermCode) jcr->jr.JobId, jcr->jr.Job, jcr->fileset->hdr.name, - level_to_str(jcr->getJobLevel()), + level_to_str(edl, sizeof(edl), jcr->getJobLevel()), jcr->client->hdr.name, jcr->previous_jr.JobId, Name, @@ -569,7 +569,7 @@ void verify_cleanup(JCR *jcr, int TermCode) jcr->jr.JobId, jcr->jr.Job, jcr->fileset->hdr.name, - level_to_str(jcr->getJobLevel()), + level_to_str(edl, sizeof(edl), jcr->getJobLevel()), jcr->client->name(), jcr->previous_jr.JobId, Name,