From 2be51fcc86cb34cf8914ca17db23ff59da15bc83 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Thu, 7 Aug 2025 15:07:29 +0100 Subject: [PATCH] suricata-report-generator: Render a PDF document and give it a title page Signed-off-by: Michael Tremer --- config/suricata/suricata-report-generator | 88 +++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/config/suricata/suricata-report-generator b/config/suricata/suricata-report-generator index fd0a2f636..bcbfd6b73 100644 --- a/config/suricata/suricata-report-generator +++ b/config/suricata/suricata-report-generator @@ -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) -- 2.47.3