]> git.ipfire.org Git - thirdparty/bacula.git/commitdiff
bscan: Add Plugin Object handling
authorMichal Rakowski <michal.rakowski@baculasystems.com>
Wed, 16 Sep 2020 16:54:53 +0000 (18:54 +0200)
committerEric Bollengier <eric@baculasystems.com>
Thu, 24 Mar 2022 08:02:57 +0000 (09:02 +0100)
bacula/src/cats/cats.c
bacula/src/cats/cats.h
bacula/src/dird/catreq.c
bacula/src/stored/bscan.c

index 3b191f4957e4661c3d3f4a505d66e8daaf91d4cf..338b64af0ec71a880ea1e05a19680ee1a463c158 100644 (file)
@@ -148,5 +148,73 @@ void BDB::print_lock_info(FILE *fp)
          &mdb->m_lock, mdb->m_lock.w_active, mdb->m_lock.w_wait); 
    } 
 } 
+
+void parse_plugin_object_string(char **obj_str, OBJECT_DBR *obj_r)
+{
+   char *p = *obj_str;
+
+   obj_r->JobId = str_to_int32(p);
+   skip_nonspaces(&p);                  /* skip JobId */
+   skip_spaces(&p);
+
+   obj_r->Path = p;
+   skip_nonspaces(&p);                  /* skip Path */
+   skip_spaces(&p);
+   char *c = strpbrk(obj_r->Path, " ");
+   if (c) {
+      *c = '\0';
+   }
+
+   obj_r->Filename = p;
+   skip_nonspaces(&p);                  /* skip FileName */
+   skip_spaces(&p);
+   c = strpbrk(obj_r->Filename, " ");
+   if (c) {
+      *c = '\0';
+   }
+
+   obj_r->PluginName = p;
+   skip_nonspaces(&p);                  /* skip PluginName */
+   skip_spaces(&p);
+   c = strpbrk(obj_r->PluginName, " ");
+   if (c) {
+      *c = '\0';
+   }
+
+   char *obj_type = p;
+   skip_nonspaces(&p);                  /* skip ObjectType */
+   skip_spaces(&p);
+   c = strpbrk(obj_type, " ");
+   if (c) {
+      *c = '\0';
+   }
+   bstrncpy(obj_r->ObjectType, obj_type, sizeof(obj_r->ObjectType));
+
+   obj_r->ObjectName = p;
+   skip_nonspaces(&p);                  /* skip ObjectName */
+   skip_spaces(&p);
+   c = strpbrk(obj_r->ObjectName, " ");
+   if (c) {
+      *c = '\0';
+   }
+
+   obj_r->ObjectSource = p;
+   skip_nonspaces(&p);                  /* skip ObjectSource */
+   skip_spaces(&p);
+   c = strpbrk(obj_r->ObjectSource, " ");
+   if (c) {
+      *c = '\0';
+   }
+
+   obj_r->ObjectUUID = p;
+   skip_nonspaces(&p);                  /* skip ObjectUuid */
+   skip_spaces(&p);
+   c = strpbrk(obj_r->ObjectUUID, " ");
+   if (c) {
+      *c = '\0';
+   }
+
+   obj_r->ObjectSize = str_to_uint64(p);
+}
+
 #endif /* HAVE_SQLITE3 || HAVE_MYSQL || HAVE_POSTGRESQL */ 
index ca40a165f94c6a605176a18110e570d52a2a5d0f..68229daebd435eb6a7651453fc0b048d2d180874 100644 (file)
@@ -661,4 +661,7 @@ int InsertDB(const char *file, int line, JCR *jcr, BDB *db, char *select_cmd);
 int DeleteDB(const char *file, int line, JCR *jcr, BDB *db, char *delete_cmd);
 void split_path_and_file(JCR *jcr, BDB *mdb, const char *fname);
 
+/* Helper functions */
+void parse_plugin_object_string(char **obj_str, OBJECT_DBR *obj_r);
+
 #endif  /* __CATS_H_ */
index ee028ce7814c9127c4412b0147c9b387f1cee067..3b1896568fba092e37fbaff49012765fc17ca38e 100644 (file)
@@ -646,68 +646,7 @@ static void update_attribute(JCR *jcr, char *msg, int32_t msglen)
       skip_nonspaces(&p);                  /* skip FileType */
       skip_spaces(&p);
 
-      obj_r.JobId = str_to_int32(p);
-      skip_nonspaces(&p);                  /* skip JobId */
-      skip_spaces(&p);
-
-      obj_r.Path = p;
-      skip_nonspaces(&p);                  /* skip Path */
-      skip_spaces(&p);
-      char *c = strpbrk(obj_r.Path, " ");
-      if (c) {
-         *c = '\0';
-      }
-
-      obj_r.Filename = p;
-      skip_nonspaces(&p);                  /* skip FileName */
-      skip_spaces(&p);
-      c = strpbrk(obj_r.Filename, " ");
-      if (c) {
-         *c = '\0';
-      }
-
-      obj_r.PluginName = p;
-      skip_nonspaces(&p);                  /* skip PluginName */
-      skip_spaces(&p);
-      c = strpbrk(obj_r.PluginName, " ");
-      if (c) {
-         *c = '\0';
-      }
-
-      char *obj_type = p;
-      skip_nonspaces(&p);                  /* skip ObjectType */
-      skip_spaces(&p);
-      c = strpbrk(obj_type, " ");
-      if (c) {
-         *c = '\0';
-      }
-      bstrncpy(obj_r.ObjectType, obj_type, sizeof(obj_r.ObjectType));
-
-      obj_r.ObjectName = p;
-      skip_nonspaces(&p);                  /* skip ObjectName */
-      skip_spaces(&p);
-      c = strpbrk(obj_r.ObjectName, " ");
-      if (c) {
-         *c = '\0';
-      }
-
-      obj_r.ObjectSource = p;
-      skip_nonspaces(&p);                  /* skip ObjectSource */
-      skip_spaces(&p);
-      c = strpbrk(obj_r.ObjectSource, " ");
-      if (c) {
-         *c = '\0';
-      }
-
-      obj_r.ObjectUUID = p;
-      skip_nonspaces(&p);                  /* skip ObjectUuid */
-      skip_spaces(&p);
-      c = strpbrk(obj_r.ObjectUUID, " ");
-      if (c) {
-         *c = '\0';
-      }
-
-      obj_r.ObjectSize = str_to_uint64(p);
+      parse_plugin_object_string(&p, &obj_r);
 
       if (!db_create_object_record(jcr, jcr->db, &obj_r)) {
          Jmsg1(jcr, M_FATAL, 0, _("Plugin object create error. %s"), db_strerror(jcr->db));
index 7d3a692fe6d0587638a7eb222420717f26e0242d..e9e52fffa9df369f1023497ae8b670632cb00b13 100644 (file)
@@ -92,6 +92,7 @@ static int num_jobs = 0;
 static int num_pools = 0;
 static int num_media = 0;
 static int num_files = 0;
+static int num_plugin_objects = 0;
 
 static CONFIG *config;
 #define CONFIG_FILE "bacula-sd.conf"
@@ -331,11 +332,12 @@ int main (int argc, char *argv[])
 
    do_scan();
    if (update_db) {
-      printf("Records added or updated in the catalog:\n%7d Media\n%7d Pool\n%7d Job\n%7d File\n",
-         num_media, num_pools, num_jobs, num_files);
+      printf("Records added or updated in the catalog:\n%7d Media\n%7d Pool\n%7d Job\n%7d File\n%7d PluginObjects\n",
+         num_media, num_pools, num_jobs, num_files, num_plugin_objects);
    } else {
-      printf("Records would have been added or updated in the catalog:\n%7d Media\n%7d Pool\n%7d Job\n%7d File\n",
-         num_media, num_pools, num_jobs, num_files);
+      printf("Records would have been added or updated in the catalog:\n%7d Media\n%7d Pool\n%7d Job\n%7d File\n"
+            "%7d Plugin Objects\n",
+         num_media, num_pools, num_jobs, num_files, num_plugin_objects);
    }
 
    bjcr->read_dcr->dev->free_dedup_rehydration_interface(bjcr->read_dcr);
@@ -751,6 +753,46 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
       /* Implement putting into catalog */
       break;
 
+   case STREAM_PLUGIN_OBJECT:
+      {
+         OBJECT_DBR obj_r;
+         char *buf = rec->data;
+         num_plugin_objects++;
+
+         skip_nonspaces(&buf);   /* Skip FileIndex */
+         skip_spaces(&buf);
+         skip_nonspaces(&buf);   /* Skip FileType */
+         skip_spaces(&buf);
+
+         parse_plugin_object_string(&buf, &obj_r);
+
+         // Need to get new jobId if possible
+         mjcr = get_jcr_by_session(rec->VolSessionId, rec->VolSessionTime);
+         if (!mjcr) {
+            Pmsg2(000, _("Could not find SessId=%d SessTime=%d for PluginObject record.\n"),
+                  rec->VolSessionId, rec->VolSessionTime);
+            break;
+         }
+
+         obj_r.JobId = mjcr->JobId;
+
+         if (db_get_plugin_object_record(mjcr, db, &obj_r)) {
+            if (verbose) {
+               Pmsg1(0, _("RESTORE_OBJECT: Found Plugin Object \"%s\" in the catalog\n"), obj_r.ObjectName);
+            }
+         } else if (update_db) {
+            /* Send it */
+            Pmsg1(0, _("PLUGIN_OBJECT: Inserting Plugin Object \"%s\" into the catalog\n"), obj_r.ObjectName);
+            if (!db_create_object_record(mjcr, db, &obj_r)) {
+               Jmsg1(mjcr, M_FATAL, 0, _("Plugin object create error. %s"), db_strerror(db));
+            }
+         } else {
+            Pmsg1(0, _("PLUGIN_OBJECT: Found Plugin Object \"%s\" on the volume\n"), obj_r.ObjectName);
+         }
+
+         break;
+      }
+
    /* Data stream */
    case STREAM_WIN32_DATA:
    case STREAM_FILE_DATA: