From fb668558aaca2e647898beb6fd657dcd82b14fa0 Mon Sep 17 00:00:00 2001 From: Eric Bollengier Date: Thu, 5 Jan 2023 08:43:21 -0500 Subject: [PATCH] Fix #9780 allow multiple jobids in fileevents request --- bacula/src/cats/cats.h | 6 +++--- bacula/src/cats/sql_create.c | 2 +- bacula/src/cats/sql_list.c | 2 +- bacula/src/dird/catreq.c | 5 +++-- bacula/src/dird/ua_output.c | 4 ++-- bacula/src/stored/bscan.c | 3 ++- 6 files changed, 12 insertions(+), 10 deletions(-) diff --git a/bacula/src/cats/cats.h b/bacula/src/cats/cats.h index 832c13b27..98431d8a8 100644 --- a/bacula/src/cats/cats.h +++ b/bacula/src/cats/cats.h @@ -733,13 +733,13 @@ class FILEEVENT_DBR: public SMARTALLOC { public: DBId_t FileIndex; // FileIndex of the File - DBId_t JobId; // JobId of the file + char *JobId; // JobId of the file. For list only: can specify list or range of jobs DBId_t SourceJobId; // Verify/Restore JobId char Type; // antivirus, malware, lost file int Severity; // level of severity (0 OK, 100 Important) char Description[MAX_NAME_LENGTH]; char Source[MAX_NAME_LENGTH]; - FILEEVENT_DBR(): FileIndex(0), JobId(0), Type(0), + FILEEVENT_DBR(): FileIndex(0), JobId(NULL), Type(0), Severity(0) { *Description = *Source = 0; @@ -747,7 +747,7 @@ public: ~FILEEVENT_DBR() {}; bool unpack(uint32_t stream, const char *data, int data_len) { - SourceJobId = JobId = FileIndex = 0; + SourceJobId = FileIndex = 0; if (scan_string(data, "%c %d %127s %127s 0", &Type, &Severity, Source, Description) == 4) { unbash_spaces(Source); unbash_spaces(Description); diff --git a/bacula/src/cats/sql_create.c b/bacula/src/cats/sql_create.c index 15cefb5d7..73dbc1bc6 100644 --- a/bacula/src/cats/sql_create.c +++ b/bacula/src/cats/sql_create.c @@ -1487,7 +1487,7 @@ bool BDB::bdb_create_fileevent_record(JCR *jcr, FILEEVENT_DBR *event) bdb_escape_string(jcr, esc1, event->Description, strlen(event->Description)); bdb_escape_string(jcr, esc2, event->Source, strlen(event->Source)); Mmsg(cmd, "INSERT INTO FileEvents (SourceJobId, JobId, FileIndex, Type, Description, Severity, Source) " - " VALUES (%lu, %lu, %ld, '%c', '%s', %d, '%s')", + " VALUES (%lu, %s, %ld, '%c', '%s', %d, '%s')", event->SourceJobId, event->JobId, event->FileIndex, event->Type, esc1, event->Severity, esc2); ret = bdb_sql_query(cmd, NULL, (void *)NULL); bdb_unlock(); diff --git a/bacula/src/cats/sql_list.c b/bacula/src/cats/sql_list.c index b834fa637..68fd6982d 100644 --- a/bacula/src/cats/sql_list.c +++ b/bacula/src/cats/sql_list.c @@ -652,7 +652,7 @@ void BDB::bdb_list_fileevents_records(JCR *jcr, FILEEVENT_DBR *rec, POOL_MEM tmp, filter; char ed1[50]; - Mmsg(filter, "FileEvents.JobId=%s ", edit_int64(rec->JobId, ed1)); + Mmsg(filter, "FileEvents.JobId in (%s) ", rec->JobId); if (rec->FileIndex > 0) { Mmsg(tmp, "AND FileEvents.FileIndex=%s ", edit_int64(rec->FileIndex, ed1)); diff --git a/bacula/src/dird/catreq.c b/bacula/src/dird/catreq.c index 7c9710378..5e4157d1c 100644 --- a/bacula/src/dird/catreq.c +++ b/bacula/src/dird/catreq.c @@ -132,12 +132,13 @@ static bool catreq_fileevent(JCR *jcr, DBId_t FileIndex, const char *p) FILEEVENT_DBR event; bool ok=false; uint32_t t1, t2, t3, t4; + char ed1[50]; event.FileIndex = FileIndex; /* If the string is going through the attribute flow, we don't have the CatReq header */ if (scan_string(p, FileEvent_add, &event.Type, &event.Severity, event.Source, event.Description) == 4) { - event.JobId = jcr->JobId; // Might need to look for previous jobid for example + event.JobId = edit_int64(jcr->JobId, ed1); // Might need to look for previous jobid for example event.FileIndex = FileIndex; ok = true; @@ -145,7 +146,7 @@ static bool catreq_fileevent(JCR *jcr, DBId_t FileIndex, const char *p) } else if (scan_string(p, FileEvent_fd_add, &t1, &t2, &t3, &t4, &event.Type, &event.Severity, event.Source, event.Description) == 8) { - event.JobId = jcr->previous_jr.JobId; + event.JobId = edit_int64(jcr->previous_jr.JobId, ed1); ok = true; } if (ok) { diff --git a/bacula/src/dird/ua_output.c b/bacula/src/dird/ua_output.c index f925a950a..f878b867e 100644 --- a/bacula/src/dird/ua_output.c +++ b/bacula/src/dird/ua_output.c @@ -628,8 +628,8 @@ static int do_list_cmd(UAContext *ua, const char *cmd, e_list_type llist) } else if (strcasecmp(ua->argk[i], NT_("fileevents")) == 0) { FILEEVENT_DBR event; for (j=i+1; jargc; j++) { - if (strcasecmp(ua->argk[j], NT_("jobid")) == 0 && ua->argv[j]) { - event.JobId = str_to_int64(ua->argv[j]); + if (strcasecmp(ua->argk[j], NT_("jobid")) == 0 && ua->argv[j] && is_a_number_list(ua->argv[j])) { + event.JobId = ua->argv[j]; } else if (strcasecmp(ua->argk[j], NT_("fileindex")) == 0 && ua->argv[j]) { event.FileIndex = str_to_int64(ua->argv[j]); diff --git a/bacula/src/stored/bscan.c b/bacula/src/stored/bscan.c index 98f7cb830..2b4b4c4b6 100644 --- a/bacula/src/stored/bscan.c +++ b/bacula/src/stored/bscan.c @@ -1012,7 +1012,8 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec) rec->VolSessionId, rec->VolSessionTime); break; } - fevent.SourceJobId = fevent.JobId = mjcr->JobId; + fevent.SourceJobId = mjcr->JobId; + fevent.JobId = edit_int64(mjcr->JobId, ec1); fevent.FileIndex = mjcr->JobFiles; if (!db_create_fileevent_record(mjcr, mjcr->db, &fevent)) { Jmsg2(mjcr, M_ERROR, 0, _("Failed to insert FileEvent record for file: %d. err: %s\n"), -- 2.47.3