-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathReportGenerator.py
139 lines (112 loc) · 5.63 KB
/
ReportGenerator.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
import csv
import datetime
import json
import os
class Report_Generator:
def __init__(self):
self.default_name_csv = 'ReportCSV'
self.default_name_txt = 'ReportText'
self.default_name_json = 'ReportJSON'
def _get_unique_filename(self, filename):
"""Generates a unique filename by appending numbers if the file already exists."""
base, ext = os.path.splitext(filename)
counter = 1
new_filename = filename
while os.path.exists(new_filename):
new_filename = f"{base}({counter}){ext}"
counter += 1
return new_filename
def _get_user_filename(self, default_name, extension):
"""Prompts user for a filename, using a default if none is provided."""
filename = input(f"[>] Enter desired filename for the report (or press Enter for default: {default_name}): ")
if not filename:
filename = default_name
if not filename.endswith(extension):
filename += extension
return filename
def _add_metadata(self, file):
"""Adds metadata information to the report."""
timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
file.write(f"Report generated on: {timestamp}\n")
file.write(f"Generated by: {os.getlogin()}\n")
file.write(f"Hostname: {os.uname().nodename}\n")
file.write(f"OS: {os.uname().sysname} {os.uname().release}\n")
file.write("\n=============================\n\n")
def CSV_GenerateReport(self, Data, filename=None):
"""Generates a CSV report from the provided data."""
try:
if filename is None:
filename = self._get_user_filename(self.default_name_csv, '.csv')
filename = self._get_unique_filename(filename)
all_fieldnames = set()
for fdata in Data:
all_fieldnames.update(fdata.keys())
all_fieldnames = sorted(all_fieldnames)
with open(filename, 'w', newline='') as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=all_fieldnames)
writer.writeheader()
if not Data:
print("[!] No discovered data to write.")
return
print("[>] Writing data to CSV file...")
for fdata in Data:
writer.writerow(fdata)
print("[>] Data writing completed.")
full_path = os.path.abspath(filename)
print(f"[+] Report generated successfully in CSV format: {filename}")
print(f"[+] Total records written: {len(Data)}")
print(f"[+] Path of {filename}: {full_path}")
except Exception as e:
print(f"[!] Error generating CSV report: {e}")
print(f"[!] Detailed Error: {e.__class__.__name__} - {e}")
def TXT_GenerateReport(self, Data, filename=None):
"""Generates a TXT report from the provided data."""
try:
if filename is None:
filename = self._get_user_filename(self.default_name_txt, '.txt')
filename = self._get_unique_filename(filename)
with open(filename, 'w') as txtfile:
self._add_metadata(txtfile)
if not Data:
print("[!] No discovered data to write.")
return
print("[>] Writing data to TXT file...")
for index, fdata in enumerate(Data, start=1):
txtfile.write(f"Record {index}\n")
for key, value in fdata.items():
txtfile.write(f"{key}: {value}\n")
txtfile.write("\n-----------------------------\n")
print("[>] Data writing completed.")
full_path = os.path.abspath(filename)
print(f"[+] Report generated successfully in TXT format: {filename}")
print(f"[+] Total records written: {len(Data)}")
print(f"[+] Path of {filename}: {full_path}")
except Exception as e:
print(f"[!] Error generating TXT report: {e}")
print(f"[!] Detailed Error: {e.__class__.__name__} - {e}")
def JSON_GenerateReport(self, Data, filename=None):
"""Generates a JSON report from the provided data."""
try:
if filename is None:
filename = self._get_user_filename(self.default_name_json, '.json')
filename = self._get_unique_filename(filename)
with open(filename, 'w') as jsonfile:
self._add_metadata(jsonfile)
if not Data:
print("[!] No scan data to write.")
return
print("[>] Writing data to JSON file...")
json.dump(Data, jsonfile, indent=4)
full_path = os.path.abspath(filename)
print("[>] Data writing completed.")
print(f"[+] Report generated successfully in TXT format: {filename}")
print(f"[+] Total records written: {len(Data)}")
print(f"[+] Path of {filename}: {full_path}")
except Exception as e:
print(f"[!] Error generating JSON report: {e}")
print(f"[!] Detailed Error: {e.__class__.__name__} - {e}")
if __name__ == "__main__":
#Example usage
generator = Report_Generator()
generator.CSV_GenerateReport([{"Name": "John", "Age": 30}, {"Name": "Jane", "Age": 25}])
generator.TXT_GenerateReport([{"Name": "John", "Age": 30}, {"Name": "Jane", "Age": 25}])