]> git.ipfire.org Git - ipfire-2.x.git/commitdiff
suricata-report-generator: Render a PDF document and give it a title page
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 7 Aug 2025 14:07:29 +0000 (15:07 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 3 Sep 2025 17:42:01 +0000 (18:42 +0100)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
config/suricata/suricata-report-generator

index fd0a2f636f6d49447b916da363ec16fe87c0cee8..bcbfd6b73d0b680794465f592da2fa993cc4ca97 100644 (file)
@@ -23,8 +23,14 @@ import argparse
 import calendar
 import datetime
 import logging
+import reportlab
+import reportlab.lib.styles
+import reportlab.platypus
+import socket
 import sqlite3
 
+from reportlab.lib.units import cm
+
 log = logging.getLogger("suricata-report-generator")
 log.setLevel(logging.DEBUG)
 
@@ -41,6 +47,17 @@ class ReportGenerator(object):
                # Open the database
                self.db = sqlite3.connect(path)
 
+               # Load a default stylesheet for our document
+               self.styles = reportlab.lib.styles.getSampleStyleSheet()
+
+               # Allow to center content
+               centered = reportlab.lib.styles.ParagraphStyle(
+                       name      = "Centered",
+                       parent    = self.styles["Normal"],
+                       alignment = reportlab.lib.enums.TA_CENTER,
+               )
+               self.styles.add(centered)
+
        def generate(self, output, year, month, week, day):
                """
                        Generates a PDF report.
@@ -90,6 +107,77 @@ class ReportGenerator(object):
                # Log the dates
                log.debug("  Dates: %s - %s" % (date_start, date_end))
 
+               # Create a new PDF document
+               doc = reportlab.platypus.SimpleDocTemplate(
+                       output, pagesize=reportlab.lib.pagesizes.A4,
+               )
+
+               # Collect everything that should go on the document
+               elements = []
+
+               # Create the title page
+               self._make_titlepage(elements, date_start, date_end)
+
+               # Render the document
+               doc.build(elements)
+
+       def _make_titlepage(self, elements, date_start, date_end):
+               """
+                       Generates the title page of the report
+               """
+               date_format = "%d %B %Y"
+
+               # What time is it right now?
+               now = datetime.datetime.now()
+
+               # Leave some space at the top
+               elements.append(reportlab.platypus.Spacer(1, 6 * cm))
+
+               # Show the title
+               elements.append(reportlab.platypus.Paragraph(
+                       _("IPFire Intrusion Prevention Alert Report"), self.styles["Title"],
+               ))
+
+               # Only show one date if this is a daily report
+               if date_start == date_end:
+                       elements.append(
+                               reportlab.platypus.Paragraph(
+                                       date_start.strftime(date_format),
+                                       self.styles["Centered"],
+                               ),
+                       )
+
+               # Otherwise show the date range
+               else:
+                       elements.append(
+                               reportlab.platypus.Paragraph(
+                                       "%s - %s" % (
+                                               date_start.strftime(date_format),
+                                               date_end.strftime(date_format)
+                                       ),
+                                       self.styles["Centered"],
+                               ),
+                       )
+
+               # Leave some extra space
+               elements.append(reportlab.platypus.Spacer(1, 1 * cm))
+
+               # Show when this report was generated and on which host
+               elements.append(
+                       reportlab.platypus.Paragraph(
+                               _("Generated on %(hostname)s on %(when)s.") % {
+                                       "hostname" : socket.gethostname(),
+                                       "when"     : now.strftime("%d %B %Y %H:%M"),
+                               },
+                               self.styles["Centered"],
+                       ),
+               )
+
+               # End the page
+               elements.append(
+                       reportlab.platypus.PageBreak(),
+               )
+
 
 def setup_logging(loglevel=logging.INFO):
        log.setLevel(loglevel)