]> git.ipfire.org Git - thirdparty/bacula.git/commitdiff
Enhance "status schedule" function to allow multiple job= and client= filters
authorEric Bollengier <eric@baculasystems.com>
Tue, 19 Sep 2017 12:19:22 +0000 (14:19 +0200)
committerKern Sibbald <kern@sibbald.com>
Sat, 14 Jul 2018 13:37:13 +0000 (15:37 +0200)
bacula/src/dird/backup.c
bacula/src/dird/dird_conf.c
bacula/src/dird/fd_cmds.c
bacula/src/dird/mac.c
bacula/src/dird/protos.h
bacula/src/dird/ua_dotcmds.c
bacula/src/dird/ua_output.c
bacula/src/dird/ua_run.c
bacula/src/dird/ua_status.c
bacula/src/dird/verify.c

index f31fd447269c0145671a3ade03cd7580a73f3739..85f33759255dc50bbe3784f537fbdefa52d9a0e9 100644 (file)
@@ -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);
index a72c7e11eda6fc6bc1de22780685a6e63c191b43..a16d13e0cc76021d441f3a4b8b8237641c5a5870 100644 (file)
@@ -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);
          }
index ba2164edf77b4b8d528649992e7ab94b35d4f62c..827ea42448898f8bcbc6f1cb22f57c68785322a5 100644 (file)
@@ -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;
index 1ed32c1b3e02252e48016127ef9f450e407dce22..afa643a62db413c14fd53af2bd47b0e0c764173d 100644 (file)
@@ -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,
index a35d969dda72d93dfafbe28ebb0ae34b4355d43c..05217c68364d1ad71fedb7ee9210f61bb10fd707 100644 (file)
@@ -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 */
index 292d933c14f2100593db6d0d159735b9e863f915..ff7cfdf0bbd8b41ccb1c28ff7b1dccd58fdc80be 100644 (file)
@@ -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());
index c18f340a925cfdf92c6dc01e2262e6dce336509c..8425d99e01ad9ac066d8b4d5231863a89995e5c2 100644 (file)
@@ -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;
       }
    }
index 58ca3d6c80f7eb688f2aeb524061a58701fbf7d2..00f5b4bb68dc70da9da6d119299877dd0083d28a 100644 (file)
@@ -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,
index 8f2de88d72a499044f22fafbaf24b8623850d485..eadd460b86642769cfeeae72009395d1146e2668 100644 (file)
@@ -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;
       }
index 8a97693fc11f3167725b22e8451e5c66df764a85..74d5bb07a0c10d1b834ccab961afdaba5f4767c4 100644 (file)
@@ -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,