]> git.ipfire.org Git - thirdparty/bacula.git/commitdiff
Add list restoreobject client= option
authorEric Bollengier <eric@baculasystems.com>
Mon, 21 Nov 2022 15:24:20 +0000 (16:24 +0100)
committerEric Bollengier <eric@baculasystems.com>
Thu, 14 Sep 2023 11:57:01 +0000 (13:57 +0200)
bacula/src/cats/cats.h
bacula/src/cats/sql_list.c
bacula/src/dird/ua_output.c

index 98431d8a89cb39249859c7c8c292248276f8e29d..6cbdaeeff438b183f4369b9e375ca1ebad72de55 100644 (file)
@@ -338,6 +338,7 @@ struct ROBJECT_DBR {
    DBId_t RestoreObjectId;
 
    int limit;                   /* Needed to restrict a search */
+   DBId_t clientid;
 };
 
 
index 02ffd927a13f6a8777d53168415c1d0e9f59479a..248fd33456f13e9d48a5b100aa7bb5cd3bf76067 100644 (file)
@@ -378,22 +378,23 @@ void BDB::bdb_list_plugin_objects_ids(JCR *jcr, char* id_list, DB_LIST_HANDLER *
  */
 void BDB::bdb_list_restore_objects(JCR *jcr, ROBJECT_DBR *rr, DB_LIST_HANDLER *sendit, void *ctx, e_list_type type)
 {
-   POOL_MEM filter;
-   char  ed1[50];
-   char *jobid;
+   POOL_MEM filter, jfilter;
 
    /* The ACL checking is done on the bconsole command */
    if (rr->JobIds && is_a_number_list(rr->JobIds)) {
-      jobid = rr->JobIds;
+      Mmsg(jfilter, " %s ", rr->JobIds);
 
    } else if (rr->JobId) {
-      jobid = edit_int64(rr->JobId, ed1);
+      Mmsg(jfilter, " %ld ", rr->JobId);
+
+   } else if (rr->clientid > 0) {
+      Mmsg(jfilter, "SELECT A.JobId FROM Job AS A JOIN RestoreObject AS B USING (JobId) WHERE A.ClientId = %ld ORDER By A.JobTDate DESC LIMIT 1", rr->clientid);
 
    } else {
       return;
    }
-
-   if (rr->FileType > 0) {
+   
+   if (rr->clientid == 0 && rr->FileType > 0) {
       Mmsg(filter, "AND ObjectType = %d ", rr->FileType);
    }
 
@@ -402,14 +403,14 @@ void BDB::bdb_list_restore_objects(JCR *jcr, ROBJECT_DBR *rr, DB_LIST_HANDLER *s
       Mmsg(cmd, "SELECT JobId, RestoreObjectId, ObjectName, "
            "PluginName, ObjectType "
            "FROM RestoreObject JOIN Job USING (JobId) WHERE JobId IN (%s) %s "
-           "ORDER BY JobTDate ASC, RestoreObjectId",
-           jobid, filter.c_str());
+           "ORDER BY JobTDate ASC, RestoreObjectId ASC",
+           jfilter.c_str(), filter.c_str());
    } else {
       Mmsg(cmd, "SELECT JobId, RestoreObjectId, ObjectName, "
            "PluginName, ObjectType, ObjectLength "
            "FROM RestoreObject JOIN Job USING (JobId) WHERE JobId IN (%s) %s "
-           "ORDER BY JobTDate ASC, RestoreObjectId",
-           jobid, filter.c_str());
+           "ORDER BY JobTDate ASC, RestoreObjectId ASC",
+           jfilter.c_str(), filter.c_str());
    }
 
    if (!QueryDB(jcr, cmd)) {
index 80b4d960edfe6b2ed1e1d5c9fa145663c5396c9a..867dae058fc6624a993b0b80f1d89aa74a95a836 100644 (file)
@@ -701,7 +701,17 @@ static int do_list_cmd(UAContext *ua, const char *cmd, e_list_type llist)
          for (j=i+1; j<ua->argc; j++) {
             if (strcasecmp(ua->argk[j], NT_("ujobid")) == 0 && ua->argv[j]) {
                bstrncpy(jr.Job, ua->argv[j], MAX_NAME_LENGTH);
-               jr.JobId = 0;
+               jr.JobId = 0;    // TODO: jr is not used
+
+            } else if (strcasecmp(ua->argk[j], NT_("client")) == 0) {
+               if (is_name_valid(ua->argv[j], NULL)) {
+                  CLIENT_DBR cr;
+                  bmemset(&cr, 0, sizeof(cr));
+                  /* Both Backup & Restore wants to list jobs for this client */
+                  if(get_client_dbr(ua, &cr, JT_BACKUP_RESTORE)) {
+                     rr.clientid = cr.ClientId;
+                  }
+               }
 
             } else if (strcasecmp(ua->argk[j], NT_("jobid")) == 0 && ua->argv[j]) {
 
@@ -756,8 +766,8 @@ static int do_list_cmd(UAContext *ua, const char *cmd, e_list_type llist)
             }
          }
 
-         if (!rr.JobId && !rr.JobIds) {
-            ua->error_msg(_("list pluginrestoreconf requires jobid argument\n"));
+         if (!rr.JobId && !rr.JobIds && !rr.clientid) {
+            ua->error_msg(_("list pluginrestoreconf requires jobid argument or Client\n"));
             return 1;
          }