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)
# 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.
# 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)