From a1cf7a2d8fd736272715539de018e0fa6b81eec2 Mon Sep 17 00:00:00 2001 From: Michal Rakowski Date: Wed, 16 Sep 2020 18:54:53 +0200 Subject: [PATCH] bscan: Add Plugin Object handling --- bacula/src/cats/cats.c | 70 ++++++++++++++++++++++++++++++++++++++- bacula/src/cats/cats.h | 3 ++ bacula/src/dird/catreq.c | 63 +---------------------------------- bacula/src/stored/bscan.c | 50 +++++++++++++++++++++++++--- 4 files changed, 119 insertions(+), 67 deletions(-) diff --git a/bacula/src/cats/cats.c b/bacula/src/cats/cats.c index 3b191f495..338b64af0 100644 --- a/bacula/src/cats/cats.c +++ b/bacula/src/cats/cats.c @@ -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 */ diff --git a/bacula/src/cats/cats.h b/bacula/src/cats/cats.h index ca40a165f..68229daeb 100644 --- a/bacula/src/cats/cats.h +++ b/bacula/src/cats/cats.h @@ -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_ */ diff --git a/bacula/src/dird/catreq.c b/bacula/src/dird/catreq.c index ee028ce78..3b1896568 100644 --- a/bacula/src/dird/catreq.c +++ b/bacula/src/dird/catreq.c @@ -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)); diff --git a/bacula/src/stored/bscan.c b/bacula/src/stored/bscan.c index 7d3a692fe..e9e52fffa 100644 --- a/bacula/src/stored/bscan.c +++ b/bacula/src/stored/bscan.c @@ -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: -- 2.47.3