aboutsummaryrefslogtreecommitdiffstats
path: root/lib/srtgui/reports.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/srtgui/reports.py')
-rw-r--r--lib/srtgui/reports.py227
1 files changed, 225 insertions, 2 deletions
diff --git a/lib/srtgui/reports.py b/lib/srtgui/reports.py
index a1f0de00..715c5606 100644
--- a/lib/srtgui/reports.py
+++ b/lib/srtgui/reports.py
@@ -20,13 +20,14 @@
import os
import logging
-from datetime import datetime
+from datetime import datetime, timedelta
import csv
from orm.models import Cve, CveSource, Vulnerability, Investigation, Defect, Product
from orm.models import Package
from orm.models import SRTool, SrtSetting
from orm.models import PublishSet, DefectHistory
+from orm.models import Notify, ErrorLog
from srtgui.api import readCveDetails, summaryCveDetails
from django.db.models import Q
@@ -2273,7 +2274,7 @@ class HistoryDefectReport(Report):
separator = ";"
if csv_separator == 'comma': separator = ","
if csv_separator == 'tab': separator = "\t"
- writer = csv.writer(csvfile, delimiter=separator,
+ writer = csv.writer(report_name, delimiter=separator,
quotechar='"', quoting=csv.QUOTE_MINIMAL)
else:
separator = ","
@@ -2297,6 +2298,223 @@ class HistoryDefectReport(Report):
###############################################################################
#
+# Notifications reports
+#
+
+class NotificationsReport(Report):
+ """Report for the Notifications Page"""
+
+ def __init__(self, parent_page, *args, **kwargs):
+ _log_args("WR_NOTIFICATION_INIT(%s)" % parent_page, *args, **kwargs)
+ super(NotificationsReport, self).__init__(parent_page, *args, **kwargs)
+
+ def get_context_data(self, *args, **kwargs):
+ _log_args("WR_NOTIFICATION_CONTEXT", *args, **kwargs)
+ context = super(NotificationsReport, self).get_context_data(*args, **kwargs)
+
+ context['report_type_list'] = '\
+ <option value="summary">Notification List</option> \
+ '
+
+ context['report_columnrange_list'] = ''
+ context['report_format_list'] = '\
+ <input type="radio" name="format" value="txt" checked> Text<br> \
+ <input type="radio" name="format" value="csv"> CSV \
+ (Separator: \
+ <select name="csv_separator"> \
+ <option value="semi">Semi-colon</option> \
+ <option value="comma">Comma</option> \
+ <option value="tab">Tab</option> \
+ </select>) \
+ <br> \
+ '
+
+ context['report_recordrange_list'] = '\
+ <input type="radio" name="records" value="all"> All<br> \
+ '
+
+ # Add a date range
+ date_start = datetime.today() - timedelta(days=30)
+ date_stop = datetime.today()
+ context['report_date_list'] = '\
+ Start: <input type="text" name="date_start" value="%s"><br> \
+ Stop: <input type="text" name="date_stop" value="%s"> \
+ ' % (date_start.strftime('%m/%d/%Y'),date_stop.strftime('%m/%d/%Y'))
+
+ # Done!
+ return context
+
+ def exec_report(self, *args, **kwargs):
+ _log_args("WR_NOTIFICATION_EXEC", *args, **kwargs)
+
+ request_POST = self.request.POST
+
+ records = request_POST.get('records', '')
+ format = request_POST.get('format', '')
+# title = request_POST.get('title', '')
+ report_type = request_POST.get('report_type', '')
+ record_list = request_POST.get('record_list', '')
+ csv_separator = request_POST.get('csv_separator', 'semi')
+
+ # Dates (make as no timezone)
+ msg = ''
+ try:
+ msg = 'Start:%s' % request_POST.get('date_start', '')
+ date_start = datetime.strptime(request_POST.get('date_start', ''), '%m/%d/%Y')
+ msg = 'Stop:%s' % request_POST.get('date_stop', '')
+ date_stop = datetime.strptime(request_POST.get('date_stop', ''), '%m/%d/%Y')
+ if date_stop < date_start:
+ return 'Error:stop date is before start date',''
+ except Exception as e:
+ return 'Error:bad format for dates (must be mm/dd/yyyy) (%s)(%s)' % (msg,e),''
+
+ date_start = date_start.strftime('%Y-%m-%d')
+ date_stop = date_stop.strftime('%Y-%m-%d')
+
+ report_name = '%s/notifications_%s_%s.%s' % (SRT_REPORT_DIR,report_type,datetime.today().strftime('%Y%m%d_%H%M'),format)
+ with open(report_name, 'w') as file:
+
+ if 'csv' == format:
+ separator = ";"
+ if csv_separator == 'comma': separator = ","
+ if csv_separator == 'tab': separator = "\t"
+ writer = csv.writer(file, delimiter=separator,
+ quotechar='"', quoting=csv.QUOTE_MINIMAL)
+ else:
+ separator = ","
+
+ if ('summary' == report_type):
+ if 'csv' == format:
+ writer.writerow(['Date','Category','Priority','Decription','URL','Author'])
+ if 'txt' == format:
+ file.write("Report : Notifications\n")
+ file.write("\n")
+ text_format='%02d) %-10s %-25s %-10s "%s",%s,%s\n'
+ file.write(text_format % (0,'Date','Category','Priority','Decription','URL','Author'))
+
+# for i,notify in enumerate(Notify.objects.filter(srt_updated__gte=date_start,srt_updated__lte=date_stop).order_by('-srt_updated')):
+ for i,notify in enumerate(Notify.objects.all().order_by('-srt_updated')):
+ srt_updated = notify.srt_updated.strftime('%Y-%m-%d')
+ if (date_start > srt_updated) or (date_stop < srt_updated):
+ continue
+
+ if 'csv' == format:
+ writer.writerow([i+1,srt_updated,notify.category,notify.get_priority_text,notify.description,notify.url,notify.author])
+ if 'txt' == format:
+ file.write(text_format % (i+1,srt_updated,notify.category,notify.get_priority_text,notify.description,notify.url,notify.author))
+
+ return report_name,os.path.basename(report_name)
+
+###############################################################################
+#
+# ErrorLogs reports
+#
+
+class ErrorLogsReport(Report):
+ """Report for the Error Logs Page"""
+
+ def __init__(self, parent_page, *args, **kwargs):
+ _log_args("WR_ERRORLOGS_INIT(%s)" % parent_page, *args, **kwargs)
+ super(ErrorLogsReport, self).__init__(parent_page, *args, **kwargs)
+
+ def get_context_data(self, *args, **kwargs):
+ _log_args("WR_ERRORLOGS_CONTEXT", *args, **kwargs)
+ context = super(ErrorLogsReport, self).get_context_data(*args, **kwargs)
+
+ context['report_type_list'] = '\
+ <option value="summary">Error Log List</option> \
+ '
+
+ context['report_columnrange_list'] = ''
+ context['report_format_list'] = '\
+ <input type="radio" name="format" value="txt" checked> Text<br> \
+ <input type="radio" name="format" value="csv"> CSV \
+ (Separator: \
+ <select name="csv_separator"> \
+ <option value="semi">Semi-colon</option> \
+ <option value="comma">Comma</option> \
+ <option value="tab">Tab</option> \
+ </select>) \
+ <br> \
+ '
+
+ context['report_recordrange_list'] = '\
+ <input type="radio" name="records" value="all"> All<br> \
+ '
+
+ # Add a date range
+ date_start = datetime.today() - timedelta(days=30)
+ date_stop = datetime.today()
+ context['report_date_list'] = '\
+ Start: <input type="text" name="date_start" value="%s"><br> \
+ Stop: <input type="text" name="date_stop" value="%s"> \
+ ' % (date_start.strftime('%m/%d/%Y'),date_stop.strftime('%m/%d/%Y'))
+
+ # Done!
+ return context
+
+ def exec_report(self, *args, **kwargs):
+ _log_args("WR_ERRORLOGS_EXEC", *args, **kwargs)
+
+ request_POST = self.request.POST
+
+ records = request_POST.get('records', '')
+ format = request_POST.get('format', '')
+# title = request_POST.get('title', '')
+ report_type = request_POST.get('report_type', '')
+ record_list = request_POST.get('record_list', '')
+ csv_separator = request_POST.get('csv_separator', 'semi')
+
+ # Dates (make as no timezone)
+ msg = ''
+ try:
+ msg = 'Start:%s' % request_POST.get('date_start', '')
+ date_start = datetime.strptime(request_POST.get('date_start', ''), '%m/%d/%Y')
+ msg = 'Stop:%s' % request_POST.get('date_stop', '')
+ date_stop = datetime.strptime(request_POST.get('date_stop', ''), '%m/%d/%Y')
+ if date_stop < date_start:
+ return 'Error:stop date is before start date',''
+ except Exception as e:
+ return 'Error:bad format for dates (must be mm/dd/yyyy) (%s)(%s)' % (msg,e),''
+
+ date_start = date_start.strftime('%Y-%m-%d')
+ date_stop = date_stop.strftime('%Y-%m-%d')
+
+ report_name = '%s/errorlogs_%s_%s.%s' % (SRT_REPORT_DIR,report_type,datetime.today().strftime('%Y%m%d_%H%M'),format)
+ with open(report_name, 'w') as file:
+
+ if 'csv' == format:
+ separator = ";"
+ if csv_separator == 'comma': separator = ","
+ if csv_separator == 'tab': separator = "\t"
+ writer = csv.writer(file, delimiter=separator,
+ quotechar='"', quoting=csv.QUOTE_MINIMAL)
+ else:
+ separator = ","
+
+ if ('summary' == report_type):
+ if 'csv' == format:
+ writer.writerow(['Date','Severity','Decription'])
+ if 'txt' == format:
+ file.write("Report : Error Logs\n")
+ file.write("Start=%s,Stop=%s\n" % (date_start,date_stop))
+ text_format='%02d) %-10s %-10s "%s"\n'
+ file.write(text_format % (0,'Date','Severity','Decription'))
+
+# for i,notify in enumerate(ErrorLog.objects.filter(srt_created__gte=date_start,srt_created__lte=date_stop).order_by('-srt_created')):
+ for i,notify in enumerate(ErrorLog.objects.all().order_by('-srt_created')):
+ srt_created = notify.srt_created.strftime('%Y-%m-%d')
+ if (date_start > srt_created) or (date_stop < srt_created):
+ continue
+ if 'csv' == format:
+ writer.writerow([i+1,srt_created,notify.severity,notify.description])
+ if 'txt' == format:
+ file.write(text_format % (i+1,srt_created,notify.get_severity_text,notify.description))
+
+ return report_name,os.path.basename(report_name)
+
+###############################################################################
+#
class DefaultReport(Report):
"""Report for the Default Page"""
@@ -2377,6 +2595,11 @@ class ReportManager():
elif 'cpes_srtool' == parent_page:
return CpesSrtoolReport(parent_page, *args, **kwargs)
+ elif 'manage_notifications' == parent_page:
+ return NotificationsReport(parent_page, *args, **kwargs)
+ elif 'error_logs' == parent_page:
+ return ErrorLogsReport(parent_page, *args, **kwargs)
+
elif 'history_defect' == parent_page:
return HistoryDefectReport(parent_page, *args, **kwargs)