From 065f4d5869500763294176aec1637c51a808547b Mon Sep 17 00:00:00 2001 From: chenxinquan Date: Thu, 16 Nov 2023 10:30:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90Pdf=E6=8A=A5=E5=91=8A?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/genmai/ReportSummationPdf.go | 853 +++++++++++++++++++++++++++++++ 1 file changed, 853 insertions(+) create mode 100644 src/genmai/ReportSummationPdf.go diff --git a/src/genmai/ReportSummationPdf.go b/src/genmai/ReportSummationPdf.go new file mode 100644 index 0000000..e92eacd --- /dev/null +++ b/src/genmai/ReportSummationPdf.go @@ -0,0 +1,853 @@ +//////////////////////////////////////////////////////////////// +// +// Filename: ReportSummationPdf.go +// +// Version: 1.0 +// Created: 2023年11月05日 09时48分53秒 +// Revision: none +// Compiler: go +// +// Author: alpha +// Organization: alpha +// Contacts: a-alpha +// +//////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////// +// Description: +//////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////// +// Log: +//////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////// +// Todo: +// +//////////////////////////////////////////////////////////////// + +package genmai + +import ( + "os" + "os/user" + "fmt" + "strconv" + "log" + "time" + "github.com/jung-kurt/gofpdf/v2" +) + +func +Createpdf_fun(fileName string, start_time string,Host string, + ScanResultKernel *ReportKernel, + ScanResultSystem *ReportSystem, + ScanResultBaseline *ReportBaseLine, + FastScanResult map[string]interface {}, + FastScanNotInResult map[string]interface {}, + IsoScanResult map[string]interface {}, + IsoScanNotInResult map[string]interface {}) { + //////////////////////////////// + + // 用户名 + currentUser,_:=user.Current() + UserName:=currentUser.Username + // 计算机名 + Hostname,_:= os.Hostname() + // 操作系统名 + OpName:=GetdOpUInfo("cat /etc/os-release | awk 'NR==1{print $1}'") + // 操作系统版本 + GetdOpInfo:=GetdOpInfo() + // 系统架构 + _,arch := GetCurrentFw() + // 内核版本 + kernelRelease:=GetdOpUInfo("uname -r") + // 加载数量 + var system_exec_nums int = 0 + var kernel_exec_nums int = 0 + var baseline_exec_nums int = 0 + if nil != ScanResultSystem { + system_exec_nums =ScanResultSystem.ReportCommon.RCExecPocNums + } + if nil != ScanResultKernel { + kernel_exec_nums=ScanResultKernel.ReportCommon.RCExecPocNums + } + if nil != ScanResultBaseline { + baseline_exec_nums=ScanResultBaseline.ReportCommon.RCExecPocNums + } + exec_nums:=system_exec_nums+kernel_exec_nums+baseline_exec_nums + exec_nums_str:=strconv.Itoa(exec_nums) + //docx1.Replace("pocnumhhccxx", exec_nums_str, -1) + + // 发起扫描时间 + //docx1.Replace("start_time", start_time, -1) + + // 扫描完成时间 + end_time:= time.Now().Format("15:04:05") + //docx1.Replace("end_time", end_time, -1) + + // 危险基线数 + var baseline_nums int = 0 + if nil != ScanResultBaseline { + baseline_nums=ScanResultBaseline.ReportCommon.RCNotFixedNums + } + baseline_nums_str:=strconv.Itoa(baseline_nums) + //docx1.Replace("baseline_num", baseline_nums_str, -1) + + // 发现漏洞数 + var system_not_Fixed_nums int = 0 + var kernel_not_Fixed_nums int = 0 + + if nil != ScanResultSystem { + system_not_Fixed_nums =ScanResultSystem.ReportCommon.RCNotFixedNums + } + if nil != ScanResultKernel { + kernel_not_Fixed_nums=ScanResultKernel.ReportCommon.RCNotFixedNums + } + vuln_num:=system_not_Fixed_nums+kernel_not_Fixed_nums + vuln_num_str:=strconv.Itoa(vuln_num) + //docx1.Replace("vuln_num", vuln_num_str, -1) + + // 高中低危漏洞数统计 + var risk_h_nums int = 0 + var risk_m_nums int = 0 + var risk_l_nums int = 0 + var system_h_nums int = 0 + var system_m_nums int = 0 + var system_l_nums int = 0 + var kernel_h_nums int = 0 + var kernel_m_nums int = 0 + var kernel_l_nums int = 0 + if nil != ScanResultSystem { + system_h_nums =ScanResultSystem.ReportCommon.RCRisk_system_h_nums + system_m_nums =ScanResultSystem.ReportCommon.RCRisk_system_m_nums + system_l_nums =ScanResultSystem.ReportCommon.RCRisk_system_l_nums + } + if nil != ScanResultKernel { + kernel_h_nums=ScanResultKernel.ReportCommon.RCRisk_kernel_h_nums + kernel_m_nums=ScanResultKernel.ReportCommon.RCRisk_kernel_m_nums + kernel_l_nums=ScanResultKernel.ReportCommon.RCRisk_kernel_l_nums + } + risk_h_nums = system_h_nums + kernel_h_nums + risk_m_nums = system_m_nums + kernel_m_nums + risk_l_nums = system_l_nums + kernel_l_nums + risk_h_nums_str:=strconv.Itoa(risk_h_nums) + risk_m_nums_str:=strconv.Itoa(risk_m_nums) + risk_l_nums_str:=strconv.Itoa(risk_l_nums) + //docx1.Replace("vuln_h_num", risk_h_nums_str, -1) + //docx1.Replace("vuln_m_num", risk_m_nums_str, -1) + //docx1.Replace("vuln_L_num", risk_l_nums_str, -1) + + // 未执行个数统计 + var system_not_exec_nums int = 0 + var kernel_not_exec_nums int = 0 + var baseline_not_exec_nums int = 0 + system_not_exec_nums_str := "0" + if nil != ScanResultSystem { + system_not_exec_nums =ScanResultSystem.ReportCommon.RCNotExecPocNums + system_not_exec_nums_str=strconv.Itoa(system_not_exec_nums) + //docx1.Replace("systemnotexec", system_not_exec_nums_str, -1) + } + kernel_not_exec_nums_str := "0" + if nil != ScanResultKernel { + kernel_not_exec_nums =ScanResultKernel.ReportCommon.RCNotExecPocNums + kernel_not_exec_nums_str=strconv.Itoa(kernel_not_exec_nums) + //docx1.Replace("kernelnotexec", kernel_not_exec_nums_str, -1) + } + baseline_not_exec_nums_str := "0" + if nil != ScanResultBaseline { + baseline_not_exec_nums =ScanResultBaseline.ReportCommon.RCNotExecPocNums + baseline_not_exec_nums_str=strconv.Itoa(baseline_not_exec_nums) + //docx1.Replace("baselinenotexec", baseline_not_exec_nums_str, -1) + } + + // -------------FastScan数据生成----------------- + // 发起扫描时间 + //docx1.Replace("vmstattime", start_time, -1) + + // 扫描完成时间 + //docx1.Replace("vmendtime", end_time, -1) + + // 漏洞数量 + fastscan_vulnum_str:= "0" + fastscan_vulnum_f_str:= "0" + fastscan_vulnum_h_str:= "0" + fastscan_vulnum_m_str:= "0" + fastscan_vulnum_l_str:= "0" + fastscan_vulnum_i_str:= "0" + // + isoscan_vulnum_str:= "0" + isoscan_vulnum_f_str:= "0" + isoscan_vulnum_h_str:= "0" + isoscan_vulnum_m_str:= "0" + isoscan_vulnum_l_str:= "0" + isoscan_vulnum_i_str:= "0" + + var vul_fastscan_data_in []map[string]string + var vul_fastscan_data_notin []map[string]string + // + var vul_isoscan_data_in []map[string]string + var vul_isoscan_data_notin []map[string]string + + if len(FastScanResult) !=0 { + fastscan_vulnum_str = strconv.Itoa(FastScanResult["VbNums"].(int)) + fastscan_vulnum_f_str = strconv.Itoa(FastScanResult["VbLevel_fatal"].(int)) + fastscan_vulnum_h_str = strconv.Itoa(FastScanResult["VbLevel_hight"].(int)) + fastscan_vulnum_m_str = strconv.Itoa(FastScanResult["VbLevel_mid"].(int)) + fastscan_vulnum_l_str = strconv.Itoa(FastScanResult["VbLevel_low"].(int)) + fastscan_vulnum_i_str = strconv.Itoa(FastScanResult["VbLevel_unknown"].(int)) + + // 版本匹配详情添加 + vul_fastscan_data_in = transferVersionScanResultToStringMap_IN(FastScanResult) + } + // + if len(IsoScanResult) !=0 { + isoscan_vulnum_str = strconv.Itoa(IsoScanResult["VbNums"].(int)) + isoscan_vulnum_f_str = strconv.Itoa(IsoScanResult["VbLevel_fatal"].(int)) + isoscan_vulnum_h_str = strconv.Itoa(IsoScanResult["VbLevel_hight"].(int)) + isoscan_vulnum_m_str = strconv.Itoa(IsoScanResult["VbLevel_mid"].(int)) + isoscan_vulnum_l_str = strconv.Itoa(IsoScanResult["VbLevel_low"].(int)) + isoscan_vulnum_i_str = strconv.Itoa(IsoScanResult["VbLevel_unknown"].(int)) + + // Iso匹配详情添加 + vul_isoscan_data_in = transferVersionScanResultToStringMap_IN(IsoScanResult) + } + + vul_fastscan_data_notin = transferVersionScanResultToStringMap_NOTIN(FastScanNotInResult) + vul_isoscan_data_notin = transferVersionScanResultToStringMap_NOTIN(IsoScanNotInResult) + + // -------------FastScan数据生成----------------- + +// // 漏洞详情添加 +// var vul_system_data string +// var vul_kernel_data string +// var vul_baseline_data string +// +// // 系统漏洞详情添加 +// if nil != ScanResultSystem { +// system_config:=ScanResultSystem.ReportCommon.RCExploredVulns +// for i:=0;i 150{ + pdf.CellFormat(_header_w, _row_h+_row_h, "名称", "1", 0, "L", true, 0, "") + pdf.MultiCell((page_w - page_margin_l - page_margin_r) - _header_w, _row_h, + vulns[i].VICSiteInfo.Name, + "1", "L", true) + }else{ + pdf.CellFormat(_header_w, _row_h, "名称", "1", 0, "L", true, 0, "") + pdf.MultiCell((page_w - page_margin_l - page_margin_r) - _header_w, _row_h, + vulns[i].VICSiteInfo.Name, + "1", "L", true) + } + + + pdf.CellFormat(_header_w, _row_h, "包名", "1", 0, "L", true, 0, "") + pdf.MultiCell((page_w - page_margin_l - page_margin_r) - _header_w, _row_h, + vulns[i].VICPackages, + "1", "L", true) + + pdf.CellFormat(_header_w, _row_h, "禅道ID", "1", 0, "L", true, 0, "") + pdf.MultiCell((page_w - page_margin_l - page_margin_r) - _header_w, _row_h, + vulns[i].VICBugID, + "1", "L", true) + + pdf.CellFormat(_header_w, _row_h, "危害等级", "1", 0, "L", true, 0, "") + pdf.MultiCell((page_w - page_margin_l - page_margin_r) - _header_w, _row_h, + vulns[i].VICSiteInfo.Severity, + "1", "L", true) + + if len(vulns[i].VICSiteInfo.Description) > 150 { + pdf.CellFormat(_header_w, _row_h+_row_h, "漏洞详情", "1", 0, "L", true, 0, "") + pdf.MultiCell((page_w - page_margin_l - page_margin_r) - _header_w, _row_h, + vulns[i].VICSiteInfo.Description, + "1", "L", true) + }else{ + pdf.CellFormat(_header_w, _row_h, "漏洞详情", "1", 0, "L", true, 0, "") + pdf.MultiCell((page_w - page_margin_l - page_margin_r) - _header_w, _row_h, + vulns[i].VICSiteInfo.Description, + "1", "L", true) + } + + + pdf.CellFormat(_header_w, _row_h, "影响包范围", "1", 0, "L", true, 0, "") + pdf.MultiCell((page_w - page_margin_l - page_margin_r) - _header_w, _row_h, + vulns[i].VICSiteInfo.ScopeOfInfluence, + "1", "L", true) + + pdf.CellFormat((page_w - page_margin_l - page_margin_r) - _header_w, _row_h, + "", "", 1, "L", false, 0, "") + } // for i := ... + //} // if nill + } // reportVulnsInfo := func + + reportVersionScanVulnsInfo := func (sectionname string, vul_versionscan_data_in []map[string]string) { + pdf.SetFont(page_style_l2_font_name, "", page_style_l2_font_size) + pdf.Write(page_style_l2_font_size / 2, "\r\n\r\n" + sectionname+ "检测详情\r\n") + + pdf.SetFont(page_style_table_font_name, "", + page_style_table_font_size + 4 ) + pdf.CellFormat(page_w, 20, + "表. " + sectionname+ "检测详情", "", 1, "C", false, 0, "") + + pdf.SetFont(page_style_table_font_name, "", + page_style_table_font_size ) + pdf.SetFillColor(240, 240, 240) + +// m := map[string]string { "漏洞编号":"string", "危害等级":"string", "漏洞名称":"string", "漏洞类型":"string", "漏洞状态":"string", "漏洞组件介绍":"string", "当前包版本":"string", "修复版本":"string"} +// vul_versionscan_data_in=append(vul_versionscan_data_in, m) +// vul_versionscan_data_in=append(vul_versionscan_data_in, m) +// vul_versionscan_data_in=append(vul_versionscan_data_in, m) +// vul_versionscan_data_in=append(vul_versionscan_data_in, m) + // fmt.Print(vul_versionscan_data_in) + + pdf.SetFont(page_style_table_mini_font_name, "", page_style_table_mini_font_size) + + for i, row := range vul_versionscan_data_in { + pdf.CellFormat(_header_w, _row_h, "索引", "1", 0, "L", true, 0, "") + pdf.MultiCell((page_w - page_margin_l - page_margin_r) - _header_w, _row_h, + strconv.Itoa(i+1), "1", "L", true) + + pdf.CellFormat(_header_w, _row_h, "漏洞编号", "1", 0, "L", true, 0, "") + pdf.MultiCell((page_w - page_margin_l - page_margin_r) - _header_w, _row_h, + row["漏洞编号"], "1", "L", true) + + pdf.CellFormat(_header_w, _row_h, "危害等级", "1", 0, "L", true, 0, "") + pdf.MultiCell((page_w - page_margin_l - page_margin_r) - _header_w, _row_h, + row["危害等级"], "1", "L", true) + + pdf.CellFormat(_header_w, _row_h, "漏洞名称", "1", 0, "L", true, 0, "") + pdf.MultiCell((page_w - page_margin_l - page_margin_r) - _header_w, _row_h, + row["漏洞名称"], "1", "L", true) + + pdf.CellFormat(_header_w, _row_h, "漏洞类型", "1", 0, "L", true, 0, "") + pdf.MultiCell((page_w - page_margin_l - page_margin_r) - _header_w, _row_h, + row["漏洞类型"], "1", "L", true) + + pdf.CellFormat(_header_w, _row_h, "漏洞状态", "1", 0, "L", true, 0, "") + pdf.MultiCell((page_w - page_margin_l - page_margin_r) - _header_w, _row_h, + row["漏洞状态"], "1", "L", true) + + pdf.CellFormat(_header_w, _row_h, "当前包版本", "1", 0, "L", true, 0, "") + pdf.MultiCell((page_w - page_margin_l - page_margin_r) - _header_w, _row_h, + row["当前包版本"], "1", "L", true) + + pdf.CellFormat(_header_w, _row_h, "修复版本", "1", 0, "L", true, 0, "") + pdf.MultiCell((page_w - page_margin_l - page_margin_r) - _header_w, _row_h, + row["修复版本"], "1", "L", true) + + pdf.CellFormat(_header_w, _row_h, "修复建议", "1", 0, "L", true, 0, "") + pdf.MultiCell((page_w - page_margin_l - page_margin_r) - _header_w, _row_h, + row["修复建议"], "1", "L", true) + + pdf.CellFormat((page_w - page_margin_l - page_margin_r) - _header_w, _row_h, + row[""], "", 1, "L", false, 0, "") + } // for i, row ... + } // report_fastscan_vulns := func ... + // lambda + //////////////// + + pdf.AddPage() + + pdf.SetY(page_margin_t) + + pdf.SetFont(page_style_l1_font_name, "", page_style_l1_font_size) + pdf.Write(page_style_l1_font_size / 2, "三.漏洞详情\r\n") + //pdf.Line(page_margin_l, pdf.GetY(), + // page_w - page_margin_r, pdf.GetY()) + + + // 系统漏洞详情 + if nil != ScanResultSystem { + reportVulnsInfo("系统漏洞检测详情", ScanResultSystem.ReportCommon.RCExploredVulns) + } // if nil ... + + // 内核漏洞详情 + if nil != ScanResultKernel { + reportVulnsInfo("内核漏洞检测详情", ScanResultKernel.ReportCommon.RCExploredVulns) + } // if nil ... + + // 基线详情 + if nil != ScanResultBaseline { + reportVulnsInfo("安全基线检测详情", ScanResultBaseline.ReportCommon.RCExploredVulns) + } // if nil ... + + reportVersionScanVulnsInfo("快速扫描", vul_fastscan_data_in) + reportVersionScanVulnsInfo("ISO扫描", vul_isoscan_data_in) + + //////////////////////////////// + // 保存报表文件 + pdf.OutputFileAndClose(path) + + // 输出错误 + if pdf.Err() { + fmt.Print(pdf.Error()) + } +} + +func transferVersionScanResultToStringMap_IN(IsoScanResult map[string]interface {}) []map[string]string { + var vul_isoscan_data_in []map[string]string + packagesList := IsoScanResult["package_info"].(map[string]interface{})["packages"].(map[string]interface{})["packagesList"].(map[string]map[string]interface{}) + for key := range packagesList { + cve_id:=packagesList[key]["cve_id"].([]string) + cve_name:=packagesList[key]["cve_name"].([]string) + cve_risk:=packagesList[key]["cve_risk"].([]string) + cve_type:=packagesList[key]["cve_type"].([]string) + cve_introduction:=packagesList[key]["cve_introduction"].([]string) + cve_status:=packagesList[key]["cve_status"].([]string) + cve_currentVersion:=packagesList[key]["cve_currentVersion"].([]string) + cve_secureVersion:=packagesList[key]["cve_secureVersion"].([]string) + cve_repairSuggestions:=packagesList[key]["cve_repairSuggestions"].([]string) + for i:=0;i