From bf6b71e922f5f86db990a1398760845f4d42f380 Mon Sep 17 00:00:00 2001 From: zhangjianjun_code <7844966+zhangjianjun_code@user.noreply.gitee.com> Date: Tue, 1 Dec 2020 17:17:50 +0800 Subject: [PATCH 1/2] 1. Solve the bug of repeated parallel execution of timed tasks; 2. Add cpe data to the excel file --- conf/app.conf | 16 +- conf/product_app.conf | 14 +- controllers/file.go | 1 - ...0\345\260\204\345\205\263\347\263\273.xls" | Bin 0 -> 213504 bytes main.go | 2 + models/cve.go | 5 +- models/excel.go | 9 +- models/uploadcve.go | 21 +- task/inittask.go | 173 +++------------- task/issuetask.go | 8 +- taskhandler/createissue.go | 4 + taskhandler/cve.go | 24 +-- taskhandler/oricvecheck.go | 2 +- taskhandler/xml.go | 189 ++++++++++++++++++ taskhandler/yaml.go | 4 +- 15 files changed, 277 insertions(+), 195 deletions(-) create mode 100644 "cve-py/mappingexcels/trust\345\214\205\345\220\215\346\230\240\345\260\204\345\205\263\347\263\273.xls" create mode 100644 taskhandler/xml.go diff --git a/conf/app.conf b/conf/app.conf index b25442f..9edc409 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -45,24 +45,24 @@ maxsize=204800 [crontab] ymalflag = 2 -getymal = 00 00 23 * * * +getymal = 0 0 1 * * 1 cveflag = 2 -getcve = 00 00 01 * * * +getcve = 0 0 3 * * * oricveflag = 2 -oricvecheck = 00 00 05 * * * +oricvecheck = 0 0 5 * * * getissueflag = 2 -getissue = 00 00 05 * * * +getissue = 0 20 5 * * * issueflag = 2 -createissue = * * 05 * * * +createissue = 0 0 6 * * * test = 0/10 * * * * * gittokenflag = 2 issueoath = * * */20 * * * genexcelflag = 2 -genexcel = 0 */10 * * * * +genexcel = 0 0/10 * * * * days = -30 prcnum = 50 -printlogflag = 1 -printlog = 0 */20 * * * * +printlogflag = 2 +printlog = 0 0/20 * * * * [gitee] diff --git a/conf/product_app.conf b/conf/product_app.conf index 49c0aeb..8ecfb5a 100644 --- a/conf/product_app.conf +++ b/conf/product_app.conf @@ -46,24 +46,24 @@ maxsize=204800 [crontab] ymalflag = 1 -getymal = 00 00 01 * * 1 +getymal = 0 0 1 * * 1 cveflag = 1 -getcve = 00 00 03 * * * +getcve = 0 0 3 * * * oricveflag = 1 -oricvecheck = 00 00 05 * * * +oricvecheck = 0 0 5 * * * getissueflag = 1 -getissue = 00 00 05 * * * +getissue = 0 20 5 * * * issueflag = 1 -createissue = * * 06 * * * +createissue = 0 0 6 * * * test = 0/10 * * * * * gittokenflag = 2 issueoath = * * */20 * * * genexcelflag = 1 -genexcel = 00 00 04 * * * +genexcel = 0 30 7 * * * days = -30 prcnum = 50 printlogflag = 1 -printlog = 00 00 01 * * 1 +printlog = 0 0 1 * * 1 [gitee] diff --git a/controllers/file.go b/controllers/file.go index 0f3f53b..57fc188 100644 --- a/controllers/file.go +++ b/controllers/file.go @@ -128,5 +128,4 @@ func (f *FileController) TriggerCveData() { "You can try to call the download file interface and pass in the param fileCode=%s to be downloaded.", en, fileCode)) } } - } diff --git "a/cve-py/mappingexcels/trust\345\214\205\345\220\215\346\230\240\345\260\204\345\205\263\347\263\273.xls" "b/cve-py/mappingexcels/trust\345\214\205\345\220\215\346\230\240\345\260\204\345\205\263\347\263\273.xls" new file mode 100644 index 0000000000000000000000000000000000000000..79e889dc58e7a7f0184b0ca56b7e4d6293d4d425 GIT binary patch literal 213504 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 1 { @@ -406,7 +406,7 @@ func ProcIssue(issueValue models.VulnCenter, accessToken, owner, path string) er path = issueValue.PackName logs.Info("查询安全信息:sn: ", sn) // Get issue handler - gitYaml, ok := models.QueryCveOpeneulerdata(issueValue.PackName, issueValue.CveVersion) + gitYaml, ok := models.QueryRepoMaintainer(issueValue.PackName, issueValue.CveVersion) if !ok || gitYaml.MainTainer == "" || len(gitYaml.MainTainer) < 1 { assignee, err = taskhandler.GetCollaboratorInfo(accessToken, owner, path) if assignee == "" { diff --git a/taskhandler/createissue.go b/taskhandler/createissue.go index dec4663..514fa70 100644 --- a/taskhandler/createissue.go +++ b/taskhandler/createissue.go @@ -121,7 +121,9 @@ func CreateIssueToGit(accessToken string, owner string, path string, assignee st cve, sc, OpenEulerScore, score, labels, it, 1, it.IssueType, "", brandArray) if requestBody != "" && len(requestBody) > 1 { logs.Info("isssue_body: ", requestBody) + updateLock.Lock() resp, err := util.HTTPPatch(url, requestBody) + updateLock.Unlock() if err != nil { logs.Error("创建issue失败, cveNum: ", cve.CveNum, "err: ", err) return "", err @@ -174,7 +176,9 @@ func CreateIssueToGit(accessToken string, owner string, path string, assignee st cve, sc, "", score, labels, it, 2, issueType, "", brandArray) logs.Info("isssue_body: ", requestBody) if requestBody != "" && len(requestBody) > 1 { + updateLock.Lock() resp, err := util.HTTPPost(url, requestBody) + updateLock.Unlock() if err != nil { logs.Error("url: ", url, "创建issue失败, cveNum: ", cve.CveNum, "err: ", err) models.DeleteIssueTemplate(issTempID) diff --git a/taskhandler/cve.go b/taskhandler/cve.go index 390aec8..3da91d4 100644 --- a/taskhandler/cve.go +++ b/taskhandler/cve.go @@ -772,7 +772,7 @@ func GenCveVuler(cveData models.OriginUpstream, cveRef string, openeulernum int) if len(versionList) > 0 { for _, ver := range versionList { if ver != "" && len(ver) > 1 { - goe, ok = models.QueryCveOpeneulerDetaildataByName(key) + goe, ok = models.QueryCveOpeneulerDetaildataByName(key, ver) if ok { versionFlag = true break @@ -784,14 +784,14 @@ func GenCveVuler(cveData models.OriginUpstream, cveRef string, openeulernum int) } } repoFlag := false - if !versionFlag { - gr, reok := models.QueryOriginRepo(key) - if reok && gr.RepoId > 0 { - repoFlag = true - } + gr, reok := models.QueryOriginRepo(key) + if reok && gr.RepoId > 0 { + repoFlag = true } - if !versionFlag && !repoFlag { + if !versionFlag || !repoFlag { models.UpdateOriginStatus(common.GetCurTime(), cveData.PackName, cveData.Version, cveData.CveId, 4) + logs.Error("版本信息对应错误, ", cveData.PackName, cveData.Version, cveData.CveId) + return false, errors.New("数据错误,暂时不处理") } CveRes, err := models.QueryCveByNum(cveData.CveNum, key, value) if err { @@ -827,13 +827,11 @@ func SyncCveVuler(cveData models.OriginExcel, cveRef string, openeulerNum int) ( } god, ok := models.QueryCveOpeneulerdata(cveData.PackName, cveData.CveVersion) if !ok { - logs.Error("仓库不存在,暂时不处理,data: ", cveData) + logs.Error("仓库和版本对应错误, data: ", cveData) models.UpdateOriginExcelStatus(common.GetCurTime(), cveData.CveId, 4) - return false, errors.New("仓库不存在,暂时不处理") - } else { - logs.Info("获取到的数据: god:", god) + return false, errors.New("仓库和版本对应错误,暂时不处理") } - goe, ok := models.QueryCveOpeneulerDetaildataByName(cveData.PackName) + goe, ok := models.QueryCveOpeneulerDetaildataByName(cveData.PackName, cveData.CveVersion) if !ok { logs.Error("仓库存在,yaml数据源不存在,god: ", god, ", cveData: ", cveData) } @@ -1473,7 +1471,7 @@ func GenCveVulerByIssue(cveData models.GiteOriginIssue, cveRef string, openeuler models.UpdateCveIssueStatusById(3, cveData.Id) return false, err } - goe, ok := models.QueryCveOpeneulerDetaildataByName(cveData.RepoPath) + goe, ok := models.QueryCveOpeneulerDetaildataByName(cveData.RepoPath, hole.Version) if !ok || goe.DetailId == 0 { logs.Error("获取数据失败,", "Components: ", hole.Components, ",Version: ", hole.Version) } diff --git a/taskhandler/oricvecheck.go b/taskhandler/oricvecheck.go index f8f6f47..98facf9 100644 --- a/taskhandler/oricvecheck.go +++ b/taskhandler/oricvecheck.go @@ -42,7 +42,7 @@ func CheckCveOriginData(prcnum int) (string, error) { gits, ok := models.QueryCveOpeneulerdata(pkList[0], pkList[1]) if !ok { models.UpdateOriginExist(common.GetCurTime(), cveData.PackName, cveData.Version, cveData.CveId, 0) - logs.Info("不存在,还原: ", cveData, ", gits: ", gits) + logs.Info("仓库和版本对应关系错误, 还原: ", cveData, ", gits: ", gits) break } else { models.UpdateOriginExist(common.GetCurTime(), cveData.PackName, cveData.Version, cveData.CveId, 1) diff --git a/taskhandler/xml.go b/taskhandler/xml.go new file mode 100644 index 0000000..bd07fce --- /dev/null +++ b/taskhandler/xml.go @@ -0,0 +1,189 @@ +package taskhandler + +import ( + "encoding/xml" + "github.com/astaxie/beego/logs" + "io/ioutil" + "os" +) + +type Updates struct { + XMLName xml.Name `xml:"updates,omitempty"` + Updatex []Update `xml:"update,omitempty"` +} + +type Update struct { + XMLName xml.Name `xml:"update,omitempty"` + From string `xml:"from,attr"` + Type string `xml:"type,attr"` + Status string `xml:"status,attr"` + Id string `xml:"id"` + Title string `xml:"title"` + Severity string `xml:"severity"` + Release string `xml:"release"` + Issued *Issued `xml:"issued,omitempty"` + References *References `xml:"references,omitempty"` + Description string `xml:"description"` + Pkglist *Pkglist `xml:"pkglist,omitempty"` +} + +type Issued struct { + XMLName xml.Name `xml:"issued,omitempty"` + Date string `xml:"date,attr"` +} + +type References struct { + XMLName xml.Name `xml:"references,omitempty"` + Reference []Reference `xml:"reference,omitempty"` +} + +type Reference struct { + XMLName xml.Name `xml:"reference,omitempty"` + Href string `xml:"href,attr"` + Id string `xml:"id,attr"` + Title string `xml:"title,attr"` + Type string `xml:"type,attr"` +} + +type Pkglist struct { + XMLName xml.Name `xml:"pkglist,omitempty"` + Collection *Collection `xml:"collection,omitempty"` +} + +type Collection struct { + XMLName xml.Name `xml:"collection,omitempty"` + Name string `xml:"name"` + Package []Package `xml:"package,omitempty"` +} + +type Package struct { + XMLName xml.Name `xml:"package,omitempty"` + Arch string `xml:"arch,attr"` + Name string `xml:"name,attr"` + Release string `xml:"release,attr"` + Version string `xml:"version,attr"` + Filename string `xml:"filename"` +} + +// Intermediate information +type SecurityNoticeXml struct { + CveNum string + Title string + Type string + ReferenceLink string + Description string +} + +type PackRpm struct { + PackName string +} + +type CveXml struct { + PublicDate string + OpenEulerSANum string + Introduction string + CveLevel string + SecurityNotice []SecurityNoticeXml + PackRpmx []PackRpm +} + +func ReadXml(filePath string, dpdates *Updates) error { + if filePath == "" || len(filePath) == 0 { + filePath = "download/updateinfo.xml" + } + fd, err := os.Open(filePath) + if err != nil { + logs.Error("open file err : ", err, ",filePath: ", filePath) + return err + } + defer fd.Close() + fileContent, err := ioutil.ReadAll(fd) + if err != nil { + logs.Error("read file err : ", err, ", filePath: ", filePath) + return err + } + err = xml.Unmarshal(fileContent, dpdates) + if err != nil { + logs.Error("unmarshal err : ", err, ", fileContent: ", fileContent) + return err + } + return nil +} + +//func WriteXml(dpdates *Updates, v models.ExcelExport) { +// pkg, pkgErr := models.GetCvePackageList(v.SecID) +// if pkgErr != nil { +// logs.Error(pkgErr) +// } +// if v.PublicDate == "" { +// v.PublicDate = time.Now().Format("2006-01-02") +// } +// pkgStr := getPkgStr(pkg) +// sn := []interface{}{v.OpenEulerSANum, v.CveNum, v.Introduction, v.Summary, v.Theme, v.Description, v.InfluenceComponent, +// v.AffectProduct, pkgStr, v.ReferenceLink, v.PublicDate} +// axis, searched := ec.searchValueInSheet(ec.SecNoticeSheetName, v.InfluenceComponent) +// if !searched { +// fillErr := ec.fillSecurityNoticeSheet(sn) +// if fillErr != nil { +// logs.Error(fillErr) +// } +// } else { +// //merge openEuler SA notice data +// colReg := regexp.MustCompile(`[A-Z]*`) +// col := colReg.FindString(axis) +// row := strings.Trim(axis, col) +// rCN := "B" + row +// rRl := "J" + row +// vcn, _ := ec.ExcelHandel.GetCellValue(ec.SecNoticeSheetName, rCN) +// vcn += ";\n" + v.CveNum +// _ = ec.ExcelHandel.SetCellValue(ec.SecNoticeSheetName, rCN, vcn) +// vrl, _ := ec.ExcelHandel.GetCellValue(ec.SecNoticeSheetName, rRl) +// vrl += "\n" + v.ReferenceLink +// _ = ec.ExcelHandel.SetCellValue(ec.SecNoticeSheetName, rRl, vrl) +// rSAN := fmt.Sprintf("A%s", row) +// vSAN, cellError := ec.ExcelHandel.GetCellValue(ec.SecNoticeSheetName, rSAN) +// if cellError == nil { +// v.OpenEulerSANum = vSAN +// } +// //merger description +// rd := "F" + row +// vd, _ := ec.ExcelHandel.GetCellValue(ec.SecNoticeSheetName, rd) +// dSplit := strings.Split(v.Description, "Security Fix(es):") +// if len(dSplit) > 1 { +// if !strings.Contains(vd, dSplit[0]) { +// vd = dSplit[0] + vd +// } +// vd += dSplit[1] +// } +// _ = ec.ExcelHandel.SetCellValue(ec.SecNoticeSheetName, rd, vd) +// //Get the highest-rated theme +// rd = "E" + row +// theme, err := models.GetCanExportTheme(vcn, v.OwnedComponent) +// if err == nil { +// _ = ec.ExcelHandel.SetCellValue(ec.SecNoticeSheetName, rd, theme) +// } +// } +// cve := []interface{}{v.CveNum, v.CveBrief, v.NVDScore, v.OpenEulerScore, v.NattackVector, v.OattackVector, +// v.NattackComplexity, v.OattackComplexity, v.NprivilegeRequired, v.OprivilegeRequired, v.NuserInteraction, +// v.OuserInteraction, v.Nscope, v.Oscope, v.Nconfidentiality, v.Oconfidentiality, v.Nintegrity, v.Ointegrity, +// v.Navailability, v.Oavailability, v.ScoreType, v.OpenEulerSANum, v.PublicDate} +// shErr := ec.fillCveSheetRow(cve) +// if shErr != nil { +// logs.Error(shErr) +// } +// +// ap := []interface{}{v.CveNum, v.AffectProduct, v.InfluenceComponent, v.AffectStatus} +// err := ec.fillAffectProductSheet(ap) +// if err != nil { +// logs.Error(err) +// } +// for _, v := range pkg { +// pk := []interface{}{v.PackName, v.PackUrl} +// if _, ok := ec.searchValueInSheet(ec.PackageURLSheetName, v.PackName); !ok { +// err := ec.fillPackageSheet(pk) +// if err != nil { +// logs.Error(err) +// } +// } +// } +//} diff --git a/taskhandler/yaml.go b/taskhandler/yaml.go index 02c8614..5b9ff8d 100644 --- a/taskhandler/yaml.go +++ b/taskhandler/yaml.go @@ -194,7 +194,7 @@ func ProcPackDetail(url string, value map[string]interface{}, tableValue models. ok, _ := models.GetSingleYaml(&ge) if ok { logs.Info("第 ", i, "条数据, PackageName: ", ge.PackageName, "已经存在,不需要再次插入") - gpinfo, okinfo := models.QueryCveOpeneulerDetaildata(ge.PackageName, ge.Version) + gpinfo, okinfo := models.QueryCveOpeneulerDetaildataByName(ge.PackageName, ge.Version) if !okinfo && gpinfo.DetailId == 0 { _, pierr := GetPackageInfo(url, tableValue, ge) if pierr != nil { @@ -213,7 +213,7 @@ func ProcPackDetail(url string, value map[string]interface{}, tableValue models. ok, _ := models.GetSingleYaml(&ge) if ok { logs.Info("第 ", i, "条数据, PackageName: ", ge.PackageName, "已经存在,不需要再次插入") - gpinfo, okinfo := models.QueryCveOpeneulerDetaildata(ge.PackageName, ge.Version) + gpinfo, okinfo := models.QueryCveOpeneulerDetaildataByName(ge.PackageName, ge.Version) if !okinfo && gpinfo.DetailId == 0 { _, pierr := GetPackageInfo(url, tableValue, ge) if pierr != nil { -- Gitee From a03b0976d69769651af30a88e590664492d02814 Mon Sep 17 00:00:00 2001 From: zhangjianjun_code <7844966+zhangjianjun_code@user.noreply.gitee.com> Date: Tue, 1 Dec 2020 17:18:23 +0800 Subject: [PATCH 2/2] 1. Solve the bug of repeated parallel execution of timed tasks; 2. Add cpe data to the excel file --- taskhandler/xml.go | 189 --------------------------------------------- 1 file changed, 189 deletions(-) delete mode 100644 taskhandler/xml.go diff --git a/taskhandler/xml.go b/taskhandler/xml.go deleted file mode 100644 index bd07fce..0000000 --- a/taskhandler/xml.go +++ /dev/null @@ -1,189 +0,0 @@ -package taskhandler - -import ( - "encoding/xml" - "github.com/astaxie/beego/logs" - "io/ioutil" - "os" -) - -type Updates struct { - XMLName xml.Name `xml:"updates,omitempty"` - Updatex []Update `xml:"update,omitempty"` -} - -type Update struct { - XMLName xml.Name `xml:"update,omitempty"` - From string `xml:"from,attr"` - Type string `xml:"type,attr"` - Status string `xml:"status,attr"` - Id string `xml:"id"` - Title string `xml:"title"` - Severity string `xml:"severity"` - Release string `xml:"release"` - Issued *Issued `xml:"issued,omitempty"` - References *References `xml:"references,omitempty"` - Description string `xml:"description"` - Pkglist *Pkglist `xml:"pkglist,omitempty"` -} - -type Issued struct { - XMLName xml.Name `xml:"issued,omitempty"` - Date string `xml:"date,attr"` -} - -type References struct { - XMLName xml.Name `xml:"references,omitempty"` - Reference []Reference `xml:"reference,omitempty"` -} - -type Reference struct { - XMLName xml.Name `xml:"reference,omitempty"` - Href string `xml:"href,attr"` - Id string `xml:"id,attr"` - Title string `xml:"title,attr"` - Type string `xml:"type,attr"` -} - -type Pkglist struct { - XMLName xml.Name `xml:"pkglist,omitempty"` - Collection *Collection `xml:"collection,omitempty"` -} - -type Collection struct { - XMLName xml.Name `xml:"collection,omitempty"` - Name string `xml:"name"` - Package []Package `xml:"package,omitempty"` -} - -type Package struct { - XMLName xml.Name `xml:"package,omitempty"` - Arch string `xml:"arch,attr"` - Name string `xml:"name,attr"` - Release string `xml:"release,attr"` - Version string `xml:"version,attr"` - Filename string `xml:"filename"` -} - -// Intermediate information -type SecurityNoticeXml struct { - CveNum string - Title string - Type string - ReferenceLink string - Description string -} - -type PackRpm struct { - PackName string -} - -type CveXml struct { - PublicDate string - OpenEulerSANum string - Introduction string - CveLevel string - SecurityNotice []SecurityNoticeXml - PackRpmx []PackRpm -} - -func ReadXml(filePath string, dpdates *Updates) error { - if filePath == "" || len(filePath) == 0 { - filePath = "download/updateinfo.xml" - } - fd, err := os.Open(filePath) - if err != nil { - logs.Error("open file err : ", err, ",filePath: ", filePath) - return err - } - defer fd.Close() - fileContent, err := ioutil.ReadAll(fd) - if err != nil { - logs.Error("read file err : ", err, ", filePath: ", filePath) - return err - } - err = xml.Unmarshal(fileContent, dpdates) - if err != nil { - logs.Error("unmarshal err : ", err, ", fileContent: ", fileContent) - return err - } - return nil -} - -//func WriteXml(dpdates *Updates, v models.ExcelExport) { -// pkg, pkgErr := models.GetCvePackageList(v.SecID) -// if pkgErr != nil { -// logs.Error(pkgErr) -// } -// if v.PublicDate == "" { -// v.PublicDate = time.Now().Format("2006-01-02") -// } -// pkgStr := getPkgStr(pkg) -// sn := []interface{}{v.OpenEulerSANum, v.CveNum, v.Introduction, v.Summary, v.Theme, v.Description, v.InfluenceComponent, -// v.AffectProduct, pkgStr, v.ReferenceLink, v.PublicDate} -// axis, searched := ec.searchValueInSheet(ec.SecNoticeSheetName, v.InfluenceComponent) -// if !searched { -// fillErr := ec.fillSecurityNoticeSheet(sn) -// if fillErr != nil { -// logs.Error(fillErr) -// } -// } else { -// //merge openEuler SA notice data -// colReg := regexp.MustCompile(`[A-Z]*`) -// col := colReg.FindString(axis) -// row := strings.Trim(axis, col) -// rCN := "B" + row -// rRl := "J" + row -// vcn, _ := ec.ExcelHandel.GetCellValue(ec.SecNoticeSheetName, rCN) -// vcn += ";\n" + v.CveNum -// _ = ec.ExcelHandel.SetCellValue(ec.SecNoticeSheetName, rCN, vcn) -// vrl, _ := ec.ExcelHandel.GetCellValue(ec.SecNoticeSheetName, rRl) -// vrl += "\n" + v.ReferenceLink -// _ = ec.ExcelHandel.SetCellValue(ec.SecNoticeSheetName, rRl, vrl) -// rSAN := fmt.Sprintf("A%s", row) -// vSAN, cellError := ec.ExcelHandel.GetCellValue(ec.SecNoticeSheetName, rSAN) -// if cellError == nil { -// v.OpenEulerSANum = vSAN -// } -// //merger description -// rd := "F" + row -// vd, _ := ec.ExcelHandel.GetCellValue(ec.SecNoticeSheetName, rd) -// dSplit := strings.Split(v.Description, "Security Fix(es):") -// if len(dSplit) > 1 { -// if !strings.Contains(vd, dSplit[0]) { -// vd = dSplit[0] + vd -// } -// vd += dSplit[1] -// } -// _ = ec.ExcelHandel.SetCellValue(ec.SecNoticeSheetName, rd, vd) -// //Get the highest-rated theme -// rd = "E" + row -// theme, err := models.GetCanExportTheme(vcn, v.OwnedComponent) -// if err == nil { -// _ = ec.ExcelHandel.SetCellValue(ec.SecNoticeSheetName, rd, theme) -// } -// } -// cve := []interface{}{v.CveNum, v.CveBrief, v.NVDScore, v.OpenEulerScore, v.NattackVector, v.OattackVector, -// v.NattackComplexity, v.OattackComplexity, v.NprivilegeRequired, v.OprivilegeRequired, v.NuserInteraction, -// v.OuserInteraction, v.Nscope, v.Oscope, v.Nconfidentiality, v.Oconfidentiality, v.Nintegrity, v.Ointegrity, -// v.Navailability, v.Oavailability, v.ScoreType, v.OpenEulerSANum, v.PublicDate} -// shErr := ec.fillCveSheetRow(cve) -// if shErr != nil { -// logs.Error(shErr) -// } -// -// ap := []interface{}{v.CveNum, v.AffectProduct, v.InfluenceComponent, v.AffectStatus} -// err := ec.fillAffectProductSheet(ap) -// if err != nil { -// logs.Error(err) -// } -// for _, v := range pkg { -// pk := []interface{}{v.PackName, v.PackUrl} -// if _, ok := ec.searchValueInSheet(ec.PackageURLSheetName, v.PackName); !ok { -// err := ec.fillPackageSheet(pk) -// if err != nil { -// logs.Error(err) -// } -// } -// } -//} -- Gitee