]> git.ipfire.org Git - thirdparty/bacula.git/commitdiff
antivirus: Generate FileEvents when a virus is detected
authorEric Bollengier <eric@baculasystems.com>
Tue, 13 Sep 2022 13:01:57 +0000 (15:01 +0200)
committerEric Bollengier <eric@baculasystems.com>
Thu, 14 Sep 2023 11:56:59 +0000 (13:56 +0200)
bacula/src/plugins/fd/antivirus-fd.c

index 443deba090459a4e06df6baae5acb34185fc4e78..ee037a3bc7708fcdc38685b030ba91fdc46c99e5 100644 (file)
@@ -115,18 +115,31 @@ public:
    char     *hostname;
    int      port;
    antivirus(bpContext *bpc): cmd_parser(), ctx(bpc), bs(NULL), fname(NULL), hostname(NULL), port(3310) {
-   }
+   };
 
    virtual ~antivirus() {
       free_and_null_pool_memory(fname);
-   }
+   };
 
    /* Wait to be called to allocate memory */
    void init_mem() {
       fname = get_pool_memory(PM_FNAME);
-   }
+   };
+   void report_virus(const char *fname, const char *msg);
 };
 
+void antivirus::report_virus(const char *name, const char *msg)
+{
+   fileevent_pkt event;
+   Jmsg(ctx, M_ERROR, "%s Virus detected \"%s\"\n", name, msg);
+   bfuncs->getBaculaValue(ctx, bVarFileIndex, &event.FileIndex);
+   event.Severity = 100;
+   event.Type = FILEEVENT_TYPE_ANTIVIRUS;
+   bstrncpy(event.Source, "Clamav", sizeof(event.Source));
+   bstrncpy(event.Description, msg, sizeof(event.Description));
+   bfuncs->AddFileEvent(ctx, &event);
+}
+
 /*
  * loadPlugin() and unloadPlugin() are entry points that are
  *  exported, so Bacula can directly call these two entry points
@@ -241,7 +254,7 @@ static bRC handlePluginEvent(bpContext *ctx, bEvent *event, void *value)
       } else {
          self->port = 3310;
       }
-      Dmsg0(0, "Register event bEventVerifyStream\n");
+      Dmsg0(50, "Register event bEventVerifyStream\n");
       break;
    case bEventVssPrepareSnapshot:
       break;
@@ -252,7 +265,7 @@ static bRC handlePluginEvent(bpContext *ctx, bEvent *event, void *value)
 //    Dmsg(ctx, dbglvl, "JobEnd\n");
       break;
    case bEventLevel:
-      Dmsg0(0, "Register event bEventVerifyStream\n");
+      Dmsg0(50, "Register event bEventVerifyStream\n");
       break;
    case bEventSince:
 //    Dmsg(ctx, dbglvl, "since=%d\n", (int)value);
@@ -407,7 +420,7 @@ static bRC pluginIO(bpContext *ctx, struct io_pkt *io)
              if (strstr(self->bs->msg, "OK")) {
                 Dmsg(ctx, dbglvl, "%s %s\n", self->fname, self->bs->msg);
              } else {
-                Jmsg(ctx, M_ERROR, "%s Virus detected %s\n", self->fname, self->bs->msg);
+                self->report_virus(self->fname, self->bs->msg);
              }
          }
          self->bs->close();