def create_report(options, scan_unique_id): """ sort all events, create log file in HTML/TEXT/JSON and remove old logs Args: options: parsing options scan_unique_id: scan unique id Returns: True if success otherwise None """ all_scan_logs = get_logs_by_scan_unique_id(scan_unique_id) if not all_scan_logs: info(messages("no_events_for_report")) return True report_path_filename = options.report_path_filename if (len(report_path_filename) >= 5 and report_path_filename[-5:] == '.html') or (len(report_path_filename) >= 4 and report_path_filename[-4:] == '.htm'): if options.graph_name: html_graph = build_graph(options.graph_name, all_scan_logs) else: html_graph = '' from lib.html_log import log_data html_table_content = log_data.table_title.format( html_graph, log_data.css_1, 'date', 'target', 'module_name', 'scan_unique_id', 'port', 'event', 'json_event') for event in all_scan_logs: html_table_content += log_data.table_items.format( event["date"], event["target"], event["module_name"], event["scan_unique_id"], event["port"], event["event"], event["json_event"]) html_table_content += log_data.table_end + '<p class="footer">' + messages( "nettacker_version_details").format(version_info()[0], version_info()[1], now()) + '</p>' with open(report_path_filename, 'w', encoding='utf-8') as save: save.write(html_table_content + '\n') save.close() elif len(report_path_filename ) >= 5 and report_path_filename[-5:] == '.json': with open(report_path_filename, 'w', encoding='utf-8') as save: save.write(str(json.dumps(all_scan_logs)) + '\n') save.close() elif len( report_path_filename) >= 5 and report_path_filename[-4:] == '.csv': keys = all_scan_logs[0].keys() with open(report_path_filename, 'a') as csvfile: writer = csv.DictWriter(csvfile, fieldnames=keys) writer.writeheader() for log in all_scan_logs: dict_data = { key: value for key, value in log.items() if key in keys } writer.writerow(dict_data) csvfile.close() else: with open(report_path_filename, 'wb') as save: save.write(build_texttable(all_scan_logs)) save.close() submit_report_to_db({ "date": now(model=None), "scan_unique_id": scan_unique_id, "options": vars(options), }) info(messages("file_saved").format(report_path_filename)) return True
def sort_logs(log_in_file, language, graph_flag, scan_id, scan_cmd, verbose_level, api_flag, profile, scan_method, ports): """ sort all events, create log file in HTML/TEXT/JSON and remove old logs Args: log_in_file: output filename language: language graph_flag: graph name scan_id: scan hash id scan_cmd: scan cmd verbose_level: verbose level number api_flag: API flag profile: profiles scan_method: module names ports: ports Returns: True if success otherwise None """ _HOST = messages(language, "HOST") _USERNAME = messages(language, "USERNAME") _PASSWORD = messages(language, "PASSWORD") _PORT = messages(language, "PORT") _TYPE = messages(language, "TYPE") _DESCRIPTION = messages(language, "DESCRIPTION") _TIME = messages(language, "TIME") events_num = 0 report_type = "" JSON_FROM_DB = __logs_by_scan_id(scan_id, language) JSON_Data = sorted(JSON_FROM_DB, key=sorted) if compatible.version() is 2: import sys reload(sys) sys.setdefaultencoding('utf8') if (len(log_in_file) >= 5 and log_in_file[-5:] == '.html') or ( len(log_in_file) >= 4 and log_in_file[-4:] == '.htm'): report_type = "HTML" data = sorted(JSON_FROM_DB, key=lambda x: sorted(x.keys())) # if user want a graph _graph = '' if graph_flag is not None: _graph = build_graph(graph_flag, language, data, 'HOST', 'USERNAME', 'PASSWORD', 'PORT', 'TYPE', 'DESCRIPTION') from lib.html_log import _log_data _css = _log_data.css_1 _table = _log_data.table_title.format(_graph, _css, _HOST, _USERNAME, _PASSWORD, _PORT, _TYPE, _DESCRIPTION, _TIME) for value in data: _table += _log_data.table_items.format(value['HOST'], value['USERNAME'], value['PASSWORD'], value['PORT'], value['TYPE'], value['DESCRIPTION'], value['TIME']) events_num += 1 _table += _log_data.table_end + '<p class="footer">' + messages(language, "nettacker_version_details") \ .format(compatible.__version__, compatible.__code_name__, now()) + '</p>' __log_into_file(log_in_file, 'w' if type(_table) == str else 'wb', _table, language, final=True) elif len(log_in_file) >= 5 and log_in_file[-5:] == '.json': graph_flag = "" report_type = "JSON" data = json.dumps(JSON_Data) events_num = len(JSON_Data) __log_into_file(log_in_file, 'w', data, language, final=True) else: graph_flag = "" report_type = "TEXT" data, events_num = __build_texttable(JSON_FROM_DB, _HOST, _USERNAME, _PASSWORD, _PORT, _TYPE, _DESCRIPTION, _TIME, language) __log_into_file(log_in_file, 'wb', data, language, final=True) data = data if report_type == "TEXT" else __build_texttable(JSON_FROM_DB, _HOST, _USERNAME, _PASSWORD, _PORT, _TYPE, _DESCRIPTION, _TIME, language)[0] info(messages(language, "updating_database")) category = [] for sm in scan_method: if sm.rsplit("_")[-1] not in category: category.append(sm.rsplit("_")[-1]) category = ",".join(list(set(category))) scan_method = ",".join(scan_method) if ports is None: ports = "default" submit_report_to_db(now(), scan_id, log_in_file, events_num, 0 if verbose_level is 0 else 1, api_flag, report_type, graph_flag, category, profile, scan_method, language, scan_cmd, ports) info(messages(language, "removing_logs_db")) hosts = [] for log in JSON_Data: if log["HOST"] not in hosts: hosts.append(log["HOST"]) for host in hosts: for sm in scan_method.rsplit(','): remove_old_logs(host, sm, scan_id, language) # info(messages(language,"inserting_logs_db")) # for log in JSON_Data: # submit_logs_to_db(language, log) if events_num: info(messages(language, "summary_report")) write(data) else: info(messages(language, "no_event_found")) info(messages(language, "file_saved").format(log_in_file)) return True