From 5185d248960b5f4773cbea9d237e8c2f27e7e2a0 Mon Sep 17 00:00:00 2001 From: zhangjianjun_code <7844966+zhangjianjun_code@user.noreply.gitee.com> Date: Wed, 30 Sep 2020 14:09:26 +0800 Subject: [PATCH 1/5] 1. Bugs occurred during the self-test; 2. Code optimization, including local variables, logic flow, etc. --- conf/app.conf | 6 +- controllers/hook.go | 40 +++++-- doc/md/manual.md | 10 +- go.mod | 2 +- main.go | 7 +- models/cve.go | 10 ++ models/giteeissue.go | 62 ++++++++--- models/initdb.go | 4 + models/issue.go | 8 +- task/inittask.go | 2 +- taskhandler/common.go | 213 ++++++++++++++++++++++--------------- taskhandler/createissue.go | 35 +++++- taskhandler/cve.go | 93 ++++++++++------ tests/conf/app.conf | 107 +++++++++++++++++++ tests/createrepo_test.go | 55 +++++++++- tests/giteeissue_test.go | 20 ++++ tests/grabissue_test.go | 7 +- tests/issue_test.go | 48 +++++++++ util/parsepayload.go | 113 +++++++++++++------- 19 files changed, 641 insertions(+), 201 deletions(-) create mode 100644 tests/conf/app.conf create mode 100644 tests/giteeissue_test.go create mode 100644 tests/issue_test.go diff --git a/conf/app.conf b/conf/app.conf index 490092f..634471b 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -46,9 +46,9 @@ ymalflag = 2 getymal = 00 00 23 * * * cveflag = 1 getcve = 00 00 01 * * * -oricveflag = 1 +oricveflag = 2 oricvecheck = 00 00 02 * * * -getissueflag = 1 +getissueflag = 2 getissue = 00 00 03 * * * issueflag = 1 createissue = * * 01 * * * @@ -67,7 +67,7 @@ prcnum = 100 #email = 1499273991@qq.com #redirect_uri = http://119.8.126.102:80/v1/issue/oauth/callback # -------jianjun gitee 配置 -------- -owner = zhangjianjun_code +owner = cve-test path = jasper email = 7844966+zhangjianjun_code@user.noreply.gitee.com redirect_uri = http://159.138.2.2:80/v1/issue/oauth/callback diff --git a/controllers/hook.go b/controllers/hook.go index 17d8425..c8576c8 100644 --- a/controllers/hook.go +++ b/controllers/hook.go @@ -310,7 +310,9 @@ func analysisComment(issueNum string, cuAccount string, cBody string, payload *m issueTmp.OpenEulerVector = v cols = append(cols, k) case "affected_version": - issueTmp.AffectedVersion = v + if v != "" && len(v) > 1 { + issueTmp.AffectedVersion = v + } cols = append(cols, k) case "solution": issueTmp.Solution = v @@ -461,7 +463,7 @@ func checkIssueAnalysisComplete(i *models.IssueTemplate) (msg, tbStr string, ok tbContent[1] = "openEulerScore" tbContent[2] = i.OpenEulerScore } - if i.CveAnalysis == "" { + if util.TrimString(i.CveAnalysis) == "" { msg = fmt.Sprintf("影响性分析说明没有填写:%v", i.CveAnalysis) ok = false return @@ -477,7 +479,7 @@ func checkIssueAnalysisComplete(i *models.IssueTemplate) (msg, tbStr string, ok return }*/ if i.OpenEulerVector == "" { - msg = fmt.Sprintf("OpenEulerVector没有填写:%v", i.OpenEulerVector) + msg = fmt.Sprintf("openEulerVector没有填写:%v", i.OpenEulerVector) ok = false return } else { @@ -486,11 +488,35 @@ func checkIssueAnalysisComplete(i *models.IssueTemplate) (msg, tbStr string, ok tbContent[8] = util.TrimStringNR(i.OpenEulerVector) } if i.AffectedVersion != "" { - tbContent[9] = "已分析" - tbContent[10] = "受影响版本排查" - tbContent[11] = util.TrimStringNR(i.AffectedVersion) + versionfFlag := true + affectedVersionArry := strings.Split(i.AffectedVersion, ",") + if len(affectedVersionArry) > 0 { + for _, affect := range affectedVersionArry { + versionArry := strings.Split(affect, ":") + if len(versionArry) > 1 { + if versionArry[1] == "受影响" || versionArry[1] == "不受影响" { + continue + } else { + versionfFlag = false + break + } + } else { + versionfFlag = false + break + } + } + } + if versionfFlag { + tbContent[9] = "已分析" + tbContent[10] = "受影响版本排查" + tbContent[11] = util.TrimStringNR(i.AffectedVersion) + } else { + tbContent[9] = "待分析" + tbContent[10] = "受影响版本排查" + tbContent[11] = util.TrimStringNR(i.AffectedVersion) + } } else { - tbContent[9] = "待分析" + tbContent[9] = "已分析" tbContent[10] = "受影响版本排查" tbContent[11] = "" } diff --git a/doc/md/manual.md b/doc/md/manual.md index 34d4967..027b9b7 100644 --- a/doc/md/manual.md +++ b/doc/md/manual.md @@ -10,7 +10,9 @@ issue分析注意事项 - 分析issue模板并拷贝以下内容在**评论区回复**: ```batch 影响性分析说明: - openEuler评分: + openEuler评分: (评分和向量) + openEulerScore: + openEulerVector: 受影响版本排查(受影响/不受影响): 1.openEuler-20.03-LTS: 2.openEuler-20.09: @@ -34,9 +36,9 @@ issue分析注意事项 |-----|----------------|------------------------| | 已分析 | openEulerScore | 6.0 | | 已分析 | 影响性分析说明 | 您分析的内容 | - | 已分析 | OpenEulerVector | AV:A/AC:C... | + | 已分析 | openEulerVector | AV:A/AC:C... | | 已分析 | 受影响的版本 | openEuler-20.03-LTS:受影响 | - **因OpenEulerScore与NvdScore不一致,分析内容需审核,请等待审核** + **因openEulerScore与NvdScore不一致,分析内容需审核,请等待审核** 2.评分一致 @@ -44,7 +46,7 @@ issue分析注意事项 |-----|----------------|------------------------| | 已分析 | openEulerScore | 6.0 | | 已分析 | 影响性分析说明 | 您分析的内容 | - | 已分析 | OpenEulerVector | AV:A/AC:C... | + | 已分析 | openEulerVector | AV:A/AC:C... | | 已分析 | 受影响的版本 | openEuler-20.03-LTS:受影响 | **请确认分析内容的准确性,确认无误后,您可以进行后续步骤或您可以继续分析。** - 评分不一致则需等待审核员审核后进行下一步 **否则将视为无效分析将不可导出** diff --git a/go.mod b/go.mod index 157bff7..e6dd210 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module cvevulner go 1.14 require ( + github.com/360EntSecGroup-Skylar/excelize/v2 v2.3.0 github.com/astaxie/beego v1.12.2 github.com/dgrijalva/jwt-go v3.2.0+incompatible github.com/go-sql-driver/mysql v1.5.0 @@ -13,5 +14,4 @@ require ( golang.org/x/sys v0.0.0-20200819091447-39769834ee22 // indirect golang.org/x/text v0.3.2 // indirect gopkg.in/yaml.v2 v2.3.0 // indirect - github.com/360EntSecGroup-Skylar/excelize/v2 v2.3.0 ) diff --git a/main.go b/main.go index 2991512..be8a6b5 100644 --- a/main.go +++ b/main.go @@ -2,23 +2,24 @@ package main import ( "cvevulner/common" - "cvevulner/models" + _"cvevulner/models" _ "cvevulner/routers" "cvevulner/task" "github.com/astaxie/beego" ) + func init() { // 初始化全局变量 common.InitGlobal() // 初始化日志 common.LogInit() // 初始化数据库 - models.Initdb() + //models.Initdb() // 初始化定时任务 task.InitTask() // test 后续删除 - //test.Init() + //tests.Init() } diff --git a/models/cve.go b/models/cve.go index c05f152..9a158dd 100644 --- a/models/cve.go +++ b/models/cve.go @@ -557,6 +557,16 @@ func QueryOpenSaLastId() (OpenEulerSA, error) { return os, err } +func QueryOpenSaById(cveId int64) (OpenEulerSA, error) { + o := orm.NewOrm() + var os OpenEulerSA + err := o.Raw("select openeuler_id, openeuler_sa_num from cve_open_euler_s_a where cve_id = ?", cveId).QueryRow(&os) + if err == nil { + logs.Info("OpenEulerSA 查询结果:", os) + } + return os, err +} + func UpdateOriginStatus(updateTime, pakName, version string, cveId int64, status int) bool { o := orm.NewOrm() res, err := o.Raw("UPDATE cve_origin_upstream SET "+ diff --git a/models/giteeissue.go b/models/giteeissue.go index 4c41073..86ba822 100644 --- a/models/giteeissue.go +++ b/models/giteeissue.go @@ -5,9 +5,9 @@ import ( "errors" "github.com/astaxie/beego/logs" "github.com/astaxie/beego/orm" + "strings" ) - //Loophole issue body model type Loophole struct { Number string //编号 @@ -77,6 +77,13 @@ func (g *GiteOriginIssue) InsertOrUpdate() error { return err } +func GetGiteOriginIssue(cveNum string) (oi GiteOriginIssue, err error) { + o := orm.NewOrm() + oi.CveNumber = cveNum + err = o.Read(&oi, "cve_number") + return +} + func (g *GiteOriginIssue) ParseToLoophole() (hole Loophole, err error) { lp := Loophole{} if g.Body == "" { @@ -117,7 +124,7 @@ func (v *VectorValue) VctToVectorValue(vector string) bool { return true } -func (v *VectorValueV2) VctToVectorValue(vector string) bool { +func (v *VectorValueV2) VctToVectorValue(vector string) bool { if util.TrimString(vector) == "" { return false } @@ -168,12 +175,22 @@ func parseOldTplToLoopHole(lp *Loophole, body string) { lp.Number = util.GetCveNumber(util.TrimString(val)) } sm = util.RegexpCveComponents.FindAllStringSubmatch(body, -1) - if len(sm) > 0 && len(sm[0]) > 0 { - lp.Components = util.TrimString(sm[0][1]) + if len(sm) > 0 && len(sm[0]) > 1 { + for _, v := range sm[0][1:] { + if v != "" { + lp.Components = util.TrimString(v) + break + } + } } - sm = util.RegexpCveVersion.FindAllStringSubmatch(body, -1) - if len(sm) > 0 && len(sm[0]) > 0 { - lp.Version = util.TrimString(sm[0][1]) + sm = util.RegexpCveVersion.FindAllStringSubmatch(body, 1) + if len(sm) > 0 && len(sm[0]) > 1 { + for _, v := range sm[0][1:] { + if v != "" { + lp.Version = util.TrimString(v) + break + } + } } sm = util.RegexpCveScore.FindAllStringSubmatch(body, -1) if len(sm) > 0 && len(sm[0]) > 0 { @@ -240,12 +257,26 @@ func parseNewTplToLoopHole(lp *Loophole, body string) { val := sm[0][1] lp.Number = util.GetCveNumber(util.TrimString(val)) } - if len(sm) > 0 && len(sm[0]) > 0 { - lp.Components = util.TrimString(sm[0][1]) + + sm = util.RegexpCveComponents.FindAllStringSubmatch(body, -1) + if len(sm) > 0 && len(sm[0]) > 1 { + for _, v := range sm[0][1:] { + if v != "" { + lp.Components = util.TrimString(v) + break + } + } } - sm = util.RegexpCveVersion.FindAllStringSubmatch(body, -1) - if len(sm) > 0 && len(sm[0]) > 0 { - lp.Version = util.TrimString(sm[0][1]) + + sm = util.RegexpCveVersion.FindAllStringSubmatch(body, 1) + if len(sm) > 0 && len(sm[0]) > 1 { + for _, v := range sm[0][1:] { + if v != "" { + lp.Version = util.TrimString(v) + break + } + } + } sm = util.RegexpCveScore.FindAllStringSubmatch(body, -1) if len(sm) > 0 && len(sm[0]) > 0 { @@ -259,8 +290,8 @@ func parseNewTplToLoopHole(lp *Loophole, body string) { } sm = util.RegexpCveBriefDesc.FindAllStringSubmatch(body, -1) if len(sm) > 0 && len(sm[0]) > 0 { - //lp.BriefIntroduction = util.TrimString(sm[0][1]) - lp.BriefIntroduction = sm[0][1] + lp.BriefIntroduction = strings.Replace(sm[0][1], "二、漏洞分析结构反馈", "", -1) + //lp.BriefIntroduction = sm[0][1] } sm = util.RegexpCveInfluencesDescNew.FindAllStringSubmatch(body, -1) if len(sm) > 0 && len(sm[0]) > 0 { @@ -278,6 +309,7 @@ func parseNewTplToLoopHole(lp *Loophole, body string) { } sm = util.RegexpCveInfluencesVersionNew.FindAllStringSubmatch(body, -1) if len(sm) > 0 && len(sm[0]) > 0 { - lp.InfVersion = util.TrimString(sm[0][1]) + value := util.ExtractCommentEffectVersion(sm[0][1]) + lp.InfVersion = util.TrimString(value) } } diff --git a/models/initdb.go b/models/initdb.go index 06d3737..79143c7 100644 --- a/models/initdb.go +++ b/models/initdb.go @@ -10,6 +10,10 @@ import ( _ "github.com/go-sql-driver/mysql" ) +func init() { + Initdb() +} + func Initdb() { BConfig, err := config.NewConfig("ini", "conf/app.conf") if err != nil{ diff --git a/models/issue.go b/models/issue.go index df5f9d7..c66a4b7 100644 --- a/models/issue.go +++ b/models/issue.go @@ -256,7 +256,7 @@ func CreateDepositHooks(ih *IssueHooks) (issHookId int64, err error) { localIh.CveId = ih.CveId localIh.IssueNum = ih.IssueNum errx := o.Raw("select *"+ - " from cve_issue_hooks where cve_id = ? and issue_num = ?", ih.CveId, ih.IssueNum).QueryRow(&localIh) + " from cve_issue_hooks where owner = ? and repo = ? and status = ?", ih.Owner, ih.Repo, ih.Status).QueryRow(&localIh) if errx == nil { logs.Info("cve_issue_hooks 查询结果:", localIh) ih.Id = localIh.Id @@ -355,3 +355,9 @@ func GetIssueTplByCveNum(num string) (list []IssueTemplate, err error) { _, err = o.QueryTable("cve_issue_template").Filter("cve_num", num).All(&list) return } + +func GetIssueTplGroupByRepo()(list []IssueTemplate ,err error) { + o := orm.NewOrm() + _,err = o.QueryTable("cve_issue_template").GroupBy("repo").All(&list) + return +} diff --git a/task/inittask.go b/task/inittask.go index f663e45..648bb6c 100644 --- a/task/inittask.go +++ b/task/inittask.go @@ -119,8 +119,8 @@ func GenSAExcelTask(genExcel string, ch *chan bool) { //defer toolbox.StopTask() } +// 定时任务初始化 func InitTask() { - BConfig, err := config.NewConfig("ini", "conf/app.conf") if err != nil { logs.Error("config init error: file:conf/app.conf: ", err) diff --git a/taskhandler/common.go b/taskhandler/common.go index e0f9033..8ff8d69 100644 --- a/taskhandler/common.go +++ b/taskhandler/common.go @@ -18,11 +18,49 @@ type GiteeToken struct { Scope string } +const bodyTpl = `一、漏洞信息 + 漏洞编号:%v + 漏洞归属组件:%v + 漏洞归属的版本:%v + CVSS V%v分值: + BaseScore:%v + Vector:CVSS: %v + 漏洞简述: + %v +二、漏洞分析结构反馈 + 影响性分析说明: + %v + openEuler评分: + %v + 受影响的版本排查(受影响/不受影响): + %v +` + +const bodyUpTpl = `一、漏洞信息 + 漏洞编号:%v + 漏洞归属组件:%v + 漏洞归属的版本:%v + CVSS V%v分值: + BaseScore:%v + Vector:CVSS: %v + 漏洞简述: + %v +二、漏洞分析结构反馈 + 影响性分析说明: + %v + openEuler评分: + %v + Vector:CVSS:%v + 受影响的版本排查(受影响/不受影响): + %v +` + func CommentTemplate(assignee, commentCmd, affectedVersion string) string { //commentTemplate := "" commentTemplate := "Hey @" + assignee + "\n" + "以下内容需要您填写, 请复制到评论区回复喔" + "\n" + - "影响性分析说明: \n\n" + "openEuler评分: \n\n" + + "影响性分析说明: \n\n" + "openEuler评分: (评分和向量)\n" + + "openEulerScore: \n" + "openEulerVector: \n\n" + "受影响版本排查(受影响/不受影响): \n" + affectedVersion + "\n也可以参考: " + commentCmd + "\n" return commentTemplate @@ -266,28 +304,48 @@ func CreateIssueBody(accessToken string, owner string, path string, assignee str cveAnalysis = strings.Replace(its.CveAnalysis, "\n", "", -1) //cveAnalysis = strings.Replace(cveAnalysis, "\n", "", 0) } + StatusName := "" + if its.StatusName != "" && len(its.StatusName) > 1 { + if its.StatusName == "待办的" { + StatusName = "open" + } else if its.StatusName == "进行中" || strings.ToLower(its.StatusName) == "started" { + StatusName = "progressing" + } else if its.StatusName == "已完成" { + StatusName = "closed" + } else if its.StatusName == "已拒绝" { + StatusName = "rejected" + } else { + StatusName = its.StatusName + } + } if flag == 1 { if len(brandArry) > 0 { for i, brand := range brandArry { if brand == "" || len(brand) < 2 { continue } - affectedVersion = affectedVersion + "
" + strconv.Itoa(i + 1) + "." + brand + ":
" + affectedVersion = affectedVersion + strconv.Itoa(i+1) + "." + brand + ":\n" } } else { - affectedVersion = "
" + "" + "
" + affectedVersion = "\n" } if floatOpenEulerScore > 0.0 || (its.OpenEulerVector != "" && len(its.OpenEulerVector) > 1) { - body := "一、漏洞信息" + "
漏洞编号: " + "[" + cve.CveNum + "](https://nvd.nist.gov/vuln/detail/" + cve.CveNum + ")" + "
" + - "
漏洞归属组件: " + path + "
" + - "
漏洞归属的版本: " + cve.CveVersion + "
" + "
CVSS V" + scoretype + "分值:
" + - "
BaseScore: " + score + " " + cve.CveLevel + "
" + - "
Vector: CVSS:" + scoretype + "/" + sc.NvectorVule + "
" + "
漏洞简述:
" + - "
" + cve.Description + "
" + "
二、漏洞分析结构反馈
" + "
影响性分析说明:
" + - "
" + cveAnalysis + "
" + - "
openEuler评分:
" + "
" + openEulerScore + "
" + - "
Vector: CVSS:" + scoretype + "/" + its.OpenEulerVector + "
" + - "
受影响版本排查(受影响/不受影响):
" + affectedVersion + "



" + cveNumber := "[" + cve.CveNum + "](https://nvd.nist.gov/vuln/detail/" + cve.CveNum + ")" + nveScore := score + " " + cve.CveLevel + nveVector := scoretype + "/" + sc.NvectorVule + oVector := scoretype + "/" + its.OpenEulerVector + body := fmt.Sprintf(bodyUpTpl, cveNumber, path, cve.CveVersion, scoretype, nveScore, nveVector, + cve.Description, cveAnalysis, openEulerScore, oVector, affectedVersion) + /*body := "一、漏洞信息" + "
漏洞编号: " + "[" + cve.CveNum + "](https://nvd.nist.gov/vuln/detail/" + cve.CveNum + ")" + "
" + + "
漏洞归属组件: " + path + "
" + + "
漏洞归属的版本: " + cve.CveVersion + "
" + "
CVSS V" + scoretype + "分值:
" + + "
BaseScore: " + score + " " + cve.CveLevel + "
" + + "
Vector: CVSS:" + scoretype + "/" + sc.NvectorVule + "
" + "
漏洞简述:
" + + "
" + cve.Description + "
" + "
二、漏洞分析结构反馈
" + "
影响性分析说明:
" + + "
" + cveAnalysis + "
" + + "
openEuler评分:
" + "
" + openEulerScore + "
" + + "
Vector: CVSS:" + scoretype + "/" + its.OpenEulerVector + "
" + + "
受影响版本排查(受影响/不受影响):
" + affectedVersion + "



"*/ requestBody = fmt.Sprintf(`{ "access_token": "%s", "repo": "%s", @@ -297,17 +355,15 @@ func CreateIssueBody(accessToken string, owner string, path string, assignee str "assignee": "%s", "labels": "%s", "security_hole": "false" - }`, accessToken, path, cve.CveNum, its.StatusName, body, assignee, labels) + }`, accessToken, path, cve.CveNum, StatusName, body, assignee, labels) } else { - body := "一、漏洞信息" + "
漏洞编号: " + "[" + cve.CveNum + "](https://nvd.nist.gov/vuln/detail/" + cve.CveNum + ")" + "
" + - "
漏洞归属组件: " + path + "
" + - "
漏洞归属的版本: " + cve.CveVersion + "
" + "
CVSS V" + scoretype + "分值:
" + - "
BaseScore: " + score + " " + cve.CveLevel + "
" + - "
Vector: CVSS:" + scoretype + "/" + sc.NvectorVule + "
" + "
漏洞简述:
" + - "
" + cve.Description + "
" + "
二、漏洞分析结构反馈
" + "
影响性分析说明:
" + - "
" + cveAnalysis + "
" + - "
openEuler评分:
" + "
" + "" + "
" + - "
受影响版本排查(受影响/不受影响):
" + affectedVersion + "



" + cveNumber := "[" + cve.CveNum + "](https://nvd.nist.gov/vuln/detail/" + cve.CveNum + ")" + nveScore := score + " " + cve.CveLevel + nveVector := scoretype + "/" + sc.NvectorVule + //oVector := scoretype + "/" + its.OpenEulerVector + openEulerScore = " " + body := fmt.Sprintf(bodyTpl, cveNumber, path, cve.CveVersion, scoretype, nveScore, nveVector, + cve.Description, cveAnalysis, openEulerScore, affectedVersion) requestBody = fmt.Sprintf(`{ "access_token": "%s", "repo": "%s", @@ -317,7 +373,7 @@ func CreateIssueBody(accessToken string, owner string, path string, assignee str "assignee": "%s", "labels": "%s", "security_hole": "false" - }`, accessToken, path, cve.CveNum, its.StatusName, body, assignee, labels) + }`, accessToken, path, cve.CveNum, StatusName, body, assignee, labels) } } else if flag == 2 { @@ -326,19 +382,18 @@ func CreateIssueBody(accessToken string, owner string, path string, assignee str if brand == "" || len(brand) < 2 { continue } - affectedVersion = affectedVersion + "
" + strconv.Itoa(i + 1) + "." + brand + ":
" + affectedVersion = affectedVersion + strconv.Itoa(i+1) + "." + brand + ":\n" } } else { - affectedVersion = "
" + "" + "
" + affectedVersion = "\n" } - body := "一、漏洞信息" + "
漏洞编号: " + "[" + cve.CveNum + "](https://nvd.nist.gov/vuln/detail/" + cve.CveNum + ")" + "
" + - "
漏洞归属组件: " + path + "
" + - "
漏洞归属的版本: " + cve.CveVersion + "
" + "
CVSS V" + scoretype + "分值:
" + - "
BaseScore: " + score + " " + cve.CveLevel + "
" + - "
Vector: CVSS:" + scoretype + "/" + sc.NvectorVule + "
" + "
漏洞简述:
" + - "
" + cve.Description + "
" + "
二、漏洞分析结构反馈
" + "
影响性分析说明:
" + - "

" + "
openEuler评分:
" + "

" + - "
受影响版本排查(受影响/不受影响):
" + affectedVersion + "



" + cveNumber := "[" + cve.CveNum + "](https://nvd.nist.gov/vuln/detail/" + cve.CveNum + ")" + nveScore := score + " " + cve.CveLevel + nveVector := scoretype + "/" + sc.NvectorVule + //oVector := scoretype + "/" + its.OpenEulerVector + openEulerScore = " " + body := fmt.Sprintf(bodyTpl, cveNumber, path, cve.CveVersion, scoretype, nveScore, nveVector, + cve.Description, cveAnalysis, openEulerScore, affectedVersion) requestBody = fmt.Sprintf(`{ "access_token": "%s", "repo": "%s", @@ -357,25 +412,20 @@ func CreateIssueBody(accessToken string, owner string, path string, assignee str if brand == "" || len(brand) < 2 { continue } - affectedVersion = affectedVersion + "
" + strconv.Itoa(i + 1) + "." + brand + "
" + affectedVersion = affectedVersion + strconv.Itoa(i+1) + "." + brand + "\n" } } } else { - affectedVersion = "
" + "" + "
" + affectedVersion = "\n" } if floatOpenEulerScore > 0.0 || (its.OpenEulerVector != "" && len(its.OpenEulerVector) > 1) { if len(cveAnalysis) > 1 { - body := "一、漏洞信息" + "
漏洞编号: " + "[" + cve.CveNum + "](https://nvd.nist.gov/vuln/detail/" + cve.CveNum + ")" + "
" + - "
漏洞归属组件: " + path + "
" + - "
漏洞归属的版本: " + cve.CveVersion + "
" + "
CVSS V" + scoretype + "分值:
" + - "
BaseScore: " + score + " " + cve.CveLevel + "
" + - "
Vector: CVSS:" + scoretype + "/" + its.NVDVector + "
" + "
漏洞简述:
" + - "
" + cve.Description + "
" + "
二、漏洞分析结构反馈
" + "
影响性分析说明:
" + - "
" + cveAnalysis + "
" + - //cveAnalysis + - "
openEuler评分:
" + "
" + openEulerScore + "
" + - "
Vector: CVSS:" + scoretype + "/" + its.OpenEulerVector + "
" + - "
受影响版本排查(受影响/不受影响):
" + affectedVersion + "



" + cveNumber := "[" + cve.CveNum + "](https://nvd.nist.gov/vuln/detail/" + cve.CveNum + ")" + nveScore := score + " " + cve.CveLevel + nveVector := scoretype + "/" + its.NVDVector + oVector := scoretype + "/" + its.OpenEulerVector + body := fmt.Sprintf(bodyUpTpl, cveNumber, path, cve.CveVersion, scoretype, nveScore, nveVector, + cve.Description, cveAnalysis, openEulerScore, oVector, affectedVersion) requestBody = fmt.Sprintf(`{ "access_token": "%s", "repo": "%s", @@ -385,19 +435,14 @@ func CreateIssueBody(accessToken string, owner string, path string, assignee str "assignee": "%s", "labels": "%s", "security_hole": "false" - }`, accessToken, path, cve.CveNum, its.StatusName, body, its.Assignee, labels) + }`, accessToken, path, cve.CveNum, StatusName, body, its.Assignee, labels) } else { - body := "一、漏洞信息" + "
漏洞编号: " + "[" + cve.CveNum + "](https://nvd.nist.gov/vuln/detail/" + cve.CveNum + ")" + "
" + - "
漏洞归属组件: " + path + "
" + - "
漏洞归属的版本: " + cve.CveVersion + "
" + "
CVSS V" + scoretype + "分值:
" + - "
BaseScore: " + score + " " + cve.CveLevel + "
" + - "
Vector: CVSS:" + scoretype + "/" + its.NVDVector + "
" + "
漏洞简述:
" + - "
" + cve.Description + "
" + "
二、漏洞分析结构反馈
" + "
影响性分析说明:
" + - "
" + cveAnalysis + "
" + - //cveAnalysis + - "
openEuler评分:
" + "
" + openEulerScore + "
" + - "
Vector: CVSS:" + scoretype + "/" + its.OpenEulerVector + "
" + - "
受影响版本排查(受影响/不受影响):
" + affectedVersion + "



" + cveNumber := "[" + cve.CveNum + "](https://nvd.nist.gov/vuln/detail/" + cve.CveNum + ")" + nveScore := score + " " + cve.CveLevel + nveVector := scoretype + "/" + its.NVDVector + oVector := scoretype + "/" + its.OpenEulerVector + body := fmt.Sprintf(bodyUpTpl, cveNumber, path, cve.CveVersion, scoretype, nveScore, nveVector, + cve.Description, cveAnalysis, openEulerScore, oVector, affectedVersion) requestBody = fmt.Sprintf(`{ "access_token": "%s", "repo": "%s", @@ -407,21 +452,18 @@ func CreateIssueBody(accessToken string, owner string, path string, assignee str "assignee": "%s", "labels": "%s", "security_hole": "false" - }`, accessToken, path, cve.CveNum, its.StatusName, body, its.Assignee, labels) + }`, accessToken, path, cve.CveNum, StatusName, body, its.Assignee, labels) } } else { + openEulerScore = " " if len(cveAnalysis) > 1 { - body := "一、漏洞信息" + "
漏洞编号: " + "[" + cve.CveNum + "](https://nvd.nist.gov/vuln/detail/" + cve.CveNum + ")" + "
" + - "
漏洞归属组件: " + path + "
" + - "
漏洞归属的版本: " + cve.CveVersion + "
" + "
CVSS V" + scoretype + "分值:
" + - "
BaseScore: " + score + " " + cve.CveLevel + "
" + - "
Vector: CVSS:" + scoretype + "/" + its.NVDVector + "
" + "
漏洞简述:
" + - "
" + cve.Description + "
" + "
二、漏洞分析结构反馈
" + "
影响性分析说明:
" + - "
" + cveAnalysis + "
" + - //cveAnalysis + - "
openEuler评分:
" + "
" + "" + "
" + - "
受影响版本排查(受影响/不受影响):
" + affectedVersion + "



" + cveNumber := "[" + cve.CveNum + "](https://nvd.nist.gov/vuln/detail/" + cve.CveNum + ")" + nveScore := score + " " + cve.CveLevel + nveVector := scoretype + "/" + sc.NvectorVule + //oVector := scoretype + "/" + its.OpenEulerVector + body := fmt.Sprintf(bodyTpl, cveNumber, path, cve.CveVersion, scoretype, nveScore, nveVector, + cve.Description, cveAnalysis, openEulerScore, affectedVersion) requestBody = fmt.Sprintf(`{ "access_token": "%s", "repo": "%s", @@ -431,17 +473,14 @@ func CreateIssueBody(accessToken string, owner string, path string, assignee str "assignee": "%s", "labels": "%s", "security_hole": "false" - }`, accessToken, path, cve.CveNum, its.StatusName, body, its.Assignee, labels) + }`, accessToken, path, cve.CveNum, StatusName, body, its.Assignee, labels) } else { - body := "一、漏洞信息" + "
漏洞编号: " + "[" + cve.CveNum + "](https://nvd.nist.gov/vuln/detail/" + cve.CveNum + ")" + "
" + - "
漏洞归属组件: " + path + "
" + - "
漏洞归属的版本: " + cve.CveVersion + "
" + "
CVSS V" + scoretype + "分值:
" + - "
BaseScore: " + score + " " + cve.CveLevel + "
" + - "
Vector: CVSS:" + scoretype + "/" + its.NVDVector + "
" + "
漏洞简述:
" + - "
" + cve.Description + "
" + "
二、漏洞分析结构反馈
" + "
影响性分析说明:
" + - "
" + cveAnalysis + "
" + - "
openEuler评分:
" + "
" + "" + "
" + - "
受影响版本排查(受影响/不受影响):
" + affectedVersion + "



" + cveNumber := "[" + cve.CveNum + "](https://nvd.nist.gov/vuln/detail/" + cve.CveNum + ")" + nveScore := score + " " + cve.CveLevel + nveVector := scoretype + "/" + sc.NvectorVule + //oVector := scoretype + "/" + its.OpenEulerVector + body := fmt.Sprintf(bodyTpl, cveNumber, path, cve.CveVersion, scoretype, nveScore, nveVector, + cve.Description, cveAnalysis, openEulerScore, affectedVersion) requestBody = fmt.Sprintf(`{ "access_token": "%s", "repo": "%s", @@ -451,14 +490,13 @@ func CreateIssueBody(accessToken string, owner string, path string, assignee str "assignee": "%s", "labels": "%s", "security_hole": "false" - }`, accessToken, path, cve.CveNum, its.StatusName, body, its.Assignee, labels) + }`, accessToken, path, cve.CveNum, StatusName, body, its.Assignee, labels) } } } return requestBody } - func Duplicate(a interface{}) (ret []interface{}) { va := reflect.ValueOf(a) for i := 0; i < va.Len(); i++ { @@ -468,4 +506,13 @@ func Duplicate(a interface{}) (ret []interface{}) { ret = append(ret, va.Index(i).Interface()) } return ret -} \ No newline at end of file +} + + +func RemoveSubstring(s, sub string) string { + if strings.Contains(s, sub) { + return strings.ReplaceAll(s, sub, "") + } + return s +} + diff --git a/taskhandler/createissue.go b/taskhandler/createissue.go index 407b545..c166524 100644 --- a/taskhandler/createissue.go +++ b/taskhandler/createissue.go @@ -27,13 +27,21 @@ func CreateIssueData(issueTemp *models.IssueTemplate, cve models.VulnCenter, sc issueTemp.IssueNum = resp["number"].(string) issueTemp.Assignee = assignee issueTemp.StatusName = resp["state"].(string) - if resp["state"].(string) == "Open" { + if strings.ToLower(resp["state"].(string)) == "open" || resp["state"].(string) == "待办的"{ issueTemp.Status = 1 - } else if resp["state"].(string) == "Started" { + issueTemp.StatusName = "open" + } else if strings.ToLower(resp["state"].(string)) == "started" || + strings.ToLower(resp["state"].(string)) == "progressing" || + strings.ToLower(resp["state"].(string)) == "进行中" { issueTemp.Status = 2 - } else if resp["state"].(string) == "Closed" { + issueTemp.StatusName = "progressing" + } else if strings.ToLower(resp["state"].(string)) == "closed" || resp["state"].(string) == "已完成"{ issueTemp.Status = 3 + issueTemp.StatusName = "closed" } else { + if strings.ToLower(resp["state"].(string)) == "rejected" || resp["state"].(string) == "已拒绝" { + issueTemp.StatusName = "rejected" + } issueTemp.Status = 4 } issueTemp.IssueStatus = 1 @@ -82,6 +90,14 @@ func CreateIssueToGit(accessToken string, owner string, path string, assignee st // 构建数据 var issueTemp models.IssueTemplate CreateIssueData(&issueTemp, cve, sc, resp, path, its.Assignee, issueType, labels, owner) + if len(brandArry) > 0 { + var brandArryTmp []string + for _, brand := range brandArry { + brandArryTmp = append(brandArryTmp, brand + ":") + } + brandStr := strings.Join(brandArryTmp, ",") + issueTemp.AffectedVersion = brandStr + } // 存储issue数据 issTempId, err := models.CreateIssueTemplet(&issueTemp) if err != nil { @@ -129,6 +145,14 @@ func CreateIssueToGit(accessToken string, owner string, path string, assignee st var issueTemp models.IssueTemplate CreateIssueData(&issueTemp, cve, sc, resp, path, assignee, issueType, labels, owner) // 存储issue数据 + if len(brandArry) > 0 { + var brandArryTmp []string + for _, brand := range brandArry { + brandArryTmp = append(brandArryTmp, brand + ":") + } + brandStr := strings.Join(brandArryTmp, ",") + issueTemp.AffectedVersion = brandStr + } issTempId, err := models.CreateIssueTemplet(&issueTemp) if err != nil { logs.Error("创建issue 模板的数据失败, cveNum: ", cve.CveNum, "err: ", err) @@ -221,6 +245,11 @@ func UpdateIssueToGit(accessToken string, owner string, path string, return "", nil } +//func UpdateCommentInfo(owner, path, issueNumber string) { +// issueUrl := "https://gitee.com/" + owner + "/" + path + "/issues/" + issueNumber +// util.HttpGet(issueUrl) +//} + func CreateIssueHookData(issHook *models.IssueHooks, cve models.VulnCenter, resp map[string]interface{}, path, owner string, issueNum string, issueId int64) *models.IssueHooks { issHook.CveId = cve.CveId diff --git a/taskhandler/cve.go b/taskhandler/cve.go index 5905622..e0beee4 100644 --- a/taskhandler/cve.go +++ b/taskhandler/cve.go @@ -776,11 +776,19 @@ func SyncCveVuler(cveData models.OriginExcel, cveRef string, openeulerNum int) ( models.UpdateOriginExcelStatus(common.GetCurTime(), cveData.CveId, 3) return false, errors.New("数据错误,暂时不处理") } - goe, ok := models.QueryCveOpeneulerDetaildata(cveData.PackName, cveData.CveVersion) + god, ok := models.QueryCveOpeneulerdata(cveData.PackName, cveData.CveVersion) if !ok { logs.Error("仓库不存在,暂时不处理,data: ", cveData) models.UpdateOriginExcelStatus(common.GetCurTime(), cveData.CveId, 4) return false, errors.New("仓库不存在,暂时不处理") + } else { + logs.Info("获取到的数据: god:", god) + } + goe, ok := models.QueryCveOpeneulerDetaildata(cveData.PackName, cveData.CveVersion) + if !ok { + logs.Error("仓库存在,yaml数据源不存在,god: ", god, ", cveData: ", cveData) + //models.UpdateOriginExcelStatus(common.GetCurTime(), cveData.CveId, 4) + //return false, errors.New("仓库不存在,暂时不处理") } CveRes, err := models.QueryCveByNum(cveData.CveNum, cveData.PackName, cveData.CveVersion) if err { @@ -878,11 +886,11 @@ func InsertIssueCveGroups(cveData models.GiteOriginIssue, lop models.Loophole, c cveStatus int8, goe models.GitPackageInfo, owner string) (bool, error) { var vul models.VulnCenter vul.CveNum = cveData.CveNumber - vul.Description = lop.RepoDesc + vul.Description = RemoveSubstring(lop.BriefIntroduction, "

") vul.Status = cveStatus - vul.CveVersion = lop.Version + vul.CveVersion = RemoveSubstring(lop.Version, "

") vul.RepairTime = "" - vul.PackName = lop.Components + vul.PackName = cveData.RepoPath vul.CveUrl = cveRef + cveData.CveNumber vul.IsExport = 0 v2, cvsError := strconv.ParseFloat(lop.CvsScore, 64) @@ -904,7 +912,7 @@ func InsertIssueCveGroups(cveData models.GiteOriginIssue, lop models.Loophole, c sec.Status = 0 sec.AffectStatus = "UnFixed" sec.Summary = lop.Components + " security update" - sec.Description = goe.Decription + "\n\n" + "Security Fix(es):" + "\n\n" + lop.BriefIntroduction + sec.Description = goe.Decription + "\n\n" + "Security Fix(es):" + "\n\n" + RemoveSubstring(lop.BriefIntroduction, "

") sec.ReferenceLink = cveRef + cveData.CveNumber sec.Introduction = "An update for " + lop.Components + " is now available for " + lop.InfProduct //sec.Summary = "An update for " + path + " is now available for " + branchs @@ -984,12 +992,12 @@ func InsertIssueCveGroups(cveData models.GiteOriginIssue, lop models.Loophole, c issueTemp.CveId = cveid issueTemp.CveNum = cveData.CveNumber issueTemp.OwnedComponent = lop.Components - issueTemp.OwnedVersion = lop.Version + issueTemp.OwnedVersion = RemoveSubstring(lop.Version, "

") issueTemp.NVDScore = nVDScore issueTemp.OpenEulerScore = openEulerScore issueTemp.NVDVector = lop.CvsVector issueTemp.OpenEulerVector = lop.OpVector - issueTemp.CveBrief = lop.BriefIntroduction + issueTemp.CveBrief = RemoveSubstring(lop.BriefIntroduction, "

") issueTemp.CveAnalysis = lop.Influences issueTemp.PrincipleAnalysis = lop.Principle issueTemp.AffectedVersion = lop.InfVersion @@ -1012,7 +1020,7 @@ func InsertIssueCveGroups(cveData models.GiteOriginIssue, lop models.Loophole, c } issueTemp.StatusName = cveData.State issueTemp.IssueLabel = "cve/Undisclosed" - issueTemp.Owner = cveData.RepoPath + issueTemp.Owner = owner issueTemp.Repo = lop.Repo if cveData.Title != "" { issueTemp.Title = cveData.Title @@ -1038,11 +1046,11 @@ func UpdateIssueCveGroups(cveData models.GiteOriginIssue, lop models.Loophole, c cveStatus int8, goe models.GitPackageInfo, vul models.VulnCenter, owner string) (bool, error) { //var vul models.VulnCenter vul.CveNum = cveData.CveNumber - vul.Description = lop.RepoDesc + vul.Description = RemoveSubstring(lop.BriefIntroduction, "

") vul.Status = cveStatus - vul.CveVersion = lop.Version + vul.CveVersion = RemoveSubstring(lop.Version, "

") vul.RepairTime = "" - vul.PackName = lop.Components + vul.PackName = cveData.RepoPath vul.CveUrl = cveRef + cveData.CveNumber vul.IsExport = 0 var sec models.SecurityNotice @@ -1051,7 +1059,7 @@ func UpdateIssueCveGroups(cveData models.GiteOriginIssue, lop models.Loophole, c sec.Status = 0 sec.AffectStatus = "Fixed" sec.Summary = lop.Components + " security update" - sec.Description = goe.Decription + "\n\n" + "Security Fix(es):" + "\n\n" + lop.BriefIntroduction + sec.Description = goe.Decription + "\n\n" + "Security Fix(es):" + "\n\n" + RemoveSubstring(lop.BriefIntroduction, "

") sec.ReferenceLink = cveRef + cveData.CveNumber sec.Introduction = "An update for " + lop.Components + " is now available for " + lop.InfProduct //sec.Summary = "An update for " + path + " is now available for " + branchs @@ -1179,24 +1187,38 @@ func UpdateIssueCveGroups(cveData models.GiteOriginIssue, lop models.Loophole, c accessToken := os.Getenv("GITEE_TOKEN") CreateDepositHooks(accessToken, owner, cveData.RepoPath, vul, cveData.Number, cveData.IssueId) } - //var opensa models.OpenEulerSA - ////var os models.OpenSaId - //os, operr := models.QueryOpenSaLastId() - //var OpenNumData int - //if operr == nil { - // OpenNumList := strings.Split(os.OpenEulerSANum, "-") - // OpenNum, err := strconv.Atoi(OpenNumList[len(OpenNumList) - 1]) - // if err == nil { - // OpenNum += 100 - // } else { - // OpenNum = openeulernum - // } - // OpenNumData = OpenNum - //} else { - // OpenNumData = openeulernum - //} - //OpenEulerSANum := "openEuler-SA-" + strconv.Itoa(time.Now().Year()) + "-" + strconv.Itoa(int(OpenNumData)) - //opensa.OpenEulerSANum = OpenEulerSANum + osa, osaError := models.QueryOpenSaById(vul.CveId) + if osaError == nil && osa.OpenId > 0 { + sec.OpenId = osa.OpenId + score.OpenId = osa.OpenId + } else { + var opensa models.OpenEulerSA + var OpenNumData int + //var os models.OpenSaId + osx, opError := models.QueryOpenSaLastId() + if opError == nil { + OpenNumList := strings.Split(osx.OpenEulerSANum, "-") + OpenNum, err := strconv.Atoi(OpenNumList[len(OpenNumList)-1]) + if err == nil { + OpenNum += 10 + } else { + OpenNum = openeulernum + } + OpenNumData = OpenNum + } else { + OpenNumData = openeulernum + } + OpenEulerSANum := "openEuler-SA-" + strconv.Itoa(time.Now().Year()) + "-" + strconv.Itoa(int(OpenNumData)) + opensa.OpenEulerSANum = OpenEulerSANum + opensa.CveId = vul.CveId + openId, openError := models.CreateOpenEulerSA(&opensa) + if openError != nil && openId == 0 { + logs.Error("生成openSA失败,openSA: ", opensa, ", error: ", openError) + return false, errors.New("数据插入失败,暂时不处理") + } + sec.OpenId = openId + score.OpenId = openId + } cveError := models.UpdateCveRelat(&vul, &sec, &score) if cveError != nil || vul.CveId == 0 { @@ -1218,13 +1240,13 @@ func UpdateIssueCveGroups(cveData models.GiteOriginIssue, lop models.Loophole, c if okl && localt.TemplateId > 0 { issueTemp.CveNum = cveData.CveNumber issueTemp.OwnedComponent = lop.Components - issueTemp.OwnedVersion = lop.Version + issueTemp.OwnedVersion = RemoveSubstring(lop.Version, "

") openEulerScore, openError := strconv.ParseFloat(lop.OpScore, 64) if openError == nil { issueTemp.OpenEulerScore = openEulerScore } issueTemp.OpenEulerVector = lop.OpVector - issueTemp.CveBrief = lop.BriefIntroduction + issueTemp.CveBrief = RemoveSubstring(lop.BriefIntroduction, "

") issueTemp.CveAnalysis = lop.Influences issueTemp.PrincipleAnalysis = lop.Principle issueTemp.AffectedVersion = lop.InfVersion @@ -1256,7 +1278,7 @@ func UpdateIssueCveGroups(cveData models.GiteOriginIssue, lop models.Loophole, c } else { issueTemp.CveNum = cveData.CveNumber issueTemp.OwnedComponent = lop.Components - issueTemp.OwnedVersion = lop.Version + issueTemp.OwnedVersion = RemoveSubstring(lop.Version, "

") issueTemp.NVDScore = nVDScore openEulerScore, openError := strconv.ParseFloat(lop.OpScore, 64) if openError == nil { @@ -1264,7 +1286,7 @@ func UpdateIssueCveGroups(cveData models.GiteOriginIssue, lop models.Loophole, c } issueTemp.NVDVector = lop.CvsVector issueTemp.OpenEulerVector = lop.OpVector - issueTemp.CveBrief = lop.BriefIntroduction + issueTemp.CveBrief = RemoveSubstring(lop.BriefIntroduction, "

") issueTemp.CveAnalysis = lop.Influences issueTemp.PrincipleAnalysis = lop.Principle issueTemp.AffectedVersion = lop.InfVersion @@ -1287,7 +1309,7 @@ func UpdateIssueCveGroups(cveData models.GiteOriginIssue, lop models.Loophole, c } issueTemp.StatusName = cveData.State issueTemp.IssueLabel = "cve/Undisclosed" - issueTemp.Owner = cveData.RepoPath + issueTemp.Owner = owner issueTemp.Repo = lop.Repo if cveData.Title != "" { issueTemp.Title = cveData.Title @@ -1307,6 +1329,7 @@ func UpdateIssueCveGroups(cveData models.GiteOriginIssue, lop models.Loophole, c } func GenCveVulerByIssue(cveData models.GiteOriginIssue, cveRef string, openeulernum int, owner string) (bool, error) { + defer common.Catchs() hole, err := cveData.ParseToLoophole() if err != nil { logs.Error("数据解析错误,") diff --git a/tests/conf/app.conf b/tests/conf/app.conf new file mode 100644 index 0000000..4020e79 --- /dev/null +++ b/tests/conf/app.conf @@ -0,0 +1,107 @@ +appname = cvevulner +#appname = cve_manager +httpport = 80 +runmode = dev +autorender = false +copyrequestbody = true +EnableDocs = true +sqlconn = +# 登录双方约定的key +key = "${AES_KEY||djS*@+8K9{J!ymk6}" +initdb = 1 +# 登录key +loginkey = "{${LOGIN_KEY||djS*@+8K9{-!yo%64}" +# token 有效期,单位:天 +token_expir_time=3 +#分析指令 +analysisCmd = "/analysis" +endCmd = "/done" +rejectCmd = "/reject" +approveCmd = "/approve" + + +[mysql] +#dbhost = 127.0.0.1 +dbhost = 159.138.2.2 +dbport = 3306 +#dbuser = "${DB_USER||root}" +dbuser = "${DB_USER||cve}" +#dbpwd = "${DB_PWD||***}" +dbpwd = "+KAOKtEnEn7gRlDEIjeh59lutAMw2688YOqKVJQ2+Lo=" +dbname = cvevulner +dbprefix = cve_ +maxidle = 30 +maxconn = 3000 + + +[log] +log_level = 7 +#log_path = C:\GoPject\src\cvevulner\logs\cve.log +log_path = logs/cve.log +maxlines=200000 +maxsize=1024000 + +[crontab] +ymalflag = 2 +getymal = 00 00 23 * * * +<<<<<<< HEAD +cveflag = 2 +======= +cveflag = 1 +>>>>>>> dcc533bfb3e46ca7de687eb69f20e183f2353c67 +getcve = 00 00 01 * * * +oricveflag = 2 +oricvecheck = 00 00 02 * * * +getissueflag = 2 +getissue = 00 00 03 * * * +issueflag = 2 +createissue = * * 01 * * * +test = 0/10 * * * * * +gittokenflag = 1 +issueoath = * * */20 * * * +genexcelflag = 2 +genexcel = 00 00 04 * * * +days = -30 +prcnum = 100 + + +[gitee] +#owner = xwzQmxx +#path = test +#email = 1499273991@qq.com +#redirect_uri = http://119.8.126.102:80/v1/issue/oauth/callback +# -------jianjun gitee 配置 -------- +owner = zhangjianjun_code +path = jasper +email = 7844966+zhangjianjun_code@user.noreply.gitee.com +redirect_uri = http://159.138.2.2:80/v1/issue/oauth/callback + +scope = user_info projects pull_requests issues notes keys hook groups gists enterprises emails +# 优先从系统环境变量获取 获取失败使用默认值 **** +client_id = "${GITEE_CLIENT_ID||****}" +client_secret = "${GITEE_CLIENT_SECRET||****}" +password = "${GITEE_PASSWORD||****}" + +# git token +git_token = "${GITEE_TOKEN||xxx}" + +[hook] +hookpwd = "${HOOK_PWD||***}" +hookurl = http://159.138.2.2:80/v1/issue/hook/event +#hookurl = http://119.8.126.102:80/v1/issue/hook/event + + +[yaml] +apiurl = https://api.openeuler.org/pkgmanage + +[cve] +cveref = https://nvd.nist.gov/vuln/detail/ +openeulernum = 3000 + +[reflink] +comment_cmd = https://gitee.com/openeuler/cve-manager/blob/master/doc/md/manual.md + +[excel] +forcerewrite = false +snprefix = op-2020-10- +snsuffix = 1002 \ No newline at end of file diff --git a/tests/createrepo_test.go b/tests/createrepo_test.go index 01ff0d4..c24fc6e 100644 --- a/tests/createrepo_test.go +++ b/tests/createrepo_test.go @@ -26,6 +26,18 @@ func QueryOriginCveExcelData() ([]models.OriginExcel, int64, error) { return coe, num, err } +func QueryOriginCveCenterData() ([]models.VulnCenter, int64, error) { + o := orm.NewOrm() + var coe []models.VulnCenter + num, err := o.Raw("select * from cve_vuln_center GROUP BY pack_name").QueryRows(&coe) + if err == nil && num > 0 { + logs.Info("cve_vuln_center 查询结果: ", num) + } else { + logs.Info("当前无新增或者更新的cve, cur_time:", common.GetCurTime(), "err: ", err) + } + return coe, num, err +} + func UpdateExcelDataPkName(originPackName, packName string) (id int64) { o := orm.NewOrm() _ = o.Raw("UPDATE cve_origin_excel SET pack_name = ?" + @@ -34,14 +46,45 @@ func UpdateExcelDataPkName(originPackName, packName string) (id int64) { } func CreateRepo() { - coe, num, err := QueryOriginCveExcelData() + //coe, num, err := QueryOriginCveExcelData() + coe, num, err := QueryOriginCveCenterData() if err == nil && num > 0 { for _, qc := range coe { - PostRepo(qc.PackName) + //PostRepo(qc.PackName) + PostGroupRepo(qc.PackName) + //CreateBrand(qc.PackName) } } } +func PostGroupRepo(packName string) error { + url := "https://gitee.com/api/v5/orgs/cve-test/repos" + accessToken := os.Getenv("GITEE_TOKEN") + requestBody := fmt.Sprintf(`{ + "access_token": "%s", + "name": "%s", + "has_issues": "true", + "has_wiki": "true", + "can_comment": "true", + "auto_init": "true", + "path": "%s", + "private": "false" + }`, accessToken, packName, packName) + logs.Info("isssue_body: ", requestBody) + resp, err := util.HttpPost(url, requestBody) + if err != nil { + logs.Error("创建",packName,"失败, err: ", err) + return err + } + if _, ok := resp["id"]; !ok { + logs.Error("创建issue 失败, err: ", ok, "url: ", url) + return errors.New("创建仓库失败") + } + errb := CreateBrand(packName) + logs.Info(errb) + return nil +} + func PostRepo(packName string) error{ url := "https://gitee.com/api/v5/user/repos" accessToken := os.Getenv("GITEE_TOKEN") @@ -71,7 +114,7 @@ func PostRepo(packName string) error{ } func CreateBrand(packName string) error{ - url := "https://gitee.com/api/v5/repos/zhangjianjun_code/" + packName + "/branches" + url := "https://gitee.com/api/v5/repos/cve-test/" + packName + "/branches" accessToken := os.Getenv("GITEE_TOKEN") requestBody := fmt.Sprintf(`{ "access_token": "%s", @@ -92,6 +135,10 @@ func CreateBrand(packName string) error{ return nil } +<<<<<<< HEAD + +======= func Init() { CreateRepo() -} \ No newline at end of file +} +>>>>>>> dcc533bfb3e46ca7de687eb69f20e183f2353c67 diff --git a/tests/giteeissue_test.go b/tests/giteeissue_test.go new file mode 100644 index 0000000..e8f1206 --- /dev/null +++ b/tests/giteeissue_test.go @@ -0,0 +1,20 @@ +package test + +import ( + "cvevulner/models" + "fmt" + "testing" +) + +func TestGetGiteOriginIssue(t *testing.T) { + //issue, err := models.GetGiteOriginIssue("CVE-2020-15719") + issue, err := models.GetGiteOriginIssue("CVE-2018-19541") + if err != nil { + t.Error(err) + } + loophole, err := issue.ParseToLoophole() + if err != nil { + t.Error(err) + } + t.Log(fmt.Sprintf("%#v", loophole)) +} diff --git a/tests/grabissue_test.go b/tests/grabissue_test.go index 33ce142..d87e749 100644 --- a/tests/grabissue_test.go +++ b/tests/grabissue_test.go @@ -6,6 +6,11 @@ import ( ) func TestGrabIssueByOrg(t *testing.T) { - taskhandler.GrabIssueByOrg("8457c66db66955376519059b97e33dd1","src-openeuler") + err := taskhandler.GrabIssueByOrg("bee5383db9aa3f19663b8aab82b76289", "cve-test") + if err != nil { + t.Error(err) + }else { + t.Log(err) + } } diff --git a/tests/issue_test.go b/tests/issue_test.go new file mode 100644 index 0000000..a171f08 --- /dev/null +++ b/tests/issue_test.go @@ -0,0 +1,48 @@ +package test + +import ( + "fmt" + "io/ioutil" + "net/http" + "sync" + "testing" +) + +var wt sync.WaitGroup + +func TestDeleteRepo(t *testing.T) { +/* repo, err := models.GetIssueTplGroupByRepo() + if err != nil { + t.Error(err) + } else {*/ + repo := []string{"javamail","libssh","libraw","flex","glibc","gstreamer","binutils","cairo","bouncycastle"} + for _, v := range repo { + go func(rep string) { + wt.Add(1) + defer wt.Done() + _ = deleteRepo("zhangjianjun_code", rep, "bee5383db9aa3f19663b8aab82b76289") + + }(v) + } + //} + wt.Wait() +} + +func deleteRepo(owner, repo, token string) error { + url := fmt.Sprintf("https://gitee.com/api/v5/repos/%s/%s?access_token=%s", owner, repo, token) + request, err := http.NewRequest(http.MethodDelete, url, nil) + if err != nil { + return err + } + + rsp, err := http.DefaultClient.Do(request) + if err != nil { + return err + } + defer rsp.Body.Close() + + body, _ := ioutil.ReadAll(rsp.Body) + fmt.Println(string(body)) + + return nil +} diff --git a/util/parsepayload.go b/util/parsepayload.go index fa8e6c2..9e0a935 100644 --- a/util/parsepayload.go +++ b/util/parsepayload.go @@ -36,8 +36,8 @@ var ( CvsScoreV2 = "v2" RegexpCveNumber = regexp.MustCompile(`漏洞编号[::](?s:(.*?))漏洞归属组件[::]`) RegexpCveNumberLink = regexp.MustCompile(`\[(.*?)\]\((.*?)\)`) - RegexpCveComponents = regexp.MustCompile(`漏洞归属组件[::](?s:(.*?))漏洞归属[的]版本[::]`) - RegexpCveVersion = regexp.MustCompile(`漏洞归属[的]版本[::](?s:(.*?))CVSS V[23].0分值[::]`) + RegexpCveComponents = regexp.MustCompile(`漏洞归属组件[::](?s:(.*?))漏洞归属的?版本[::]`) + RegexpCveVersion = regexp.MustCompile(`漏洞归属的?版本[::](?s:(.*?))CVSS V[23].0分值[::]`) RegexpCveScore = regexp.MustCompile(`CVSS V[23].0分值[::](?s:(.*?))漏洞[简描]述[::]`) //RegexpCveScore = regexp.MustCompile(`CVSS V3.0分值[::](?s:(.*?))Vector[::]`) //RegexpCveVector = regexp.MustCompile(`Vector[::](?s:(.*?))(漏洞简述[::])`) @@ -46,24 +46,26 @@ var ( RegexpCveInfluencesDescNew = regexp.MustCompile(`影响性分析说明[::](?s:(.*?))openEuler评分[::]`) RegexpCvePrincipleDesc = regexp.MustCompile(`原理分析[::](?s:(.*?))openEuler评分[::]`) RegexpCveOpScore = regexp.MustCompile(`openEuler评分[::](?s:(.*?))受影响版本[::]`) - RegexpCveOpScoreNew = regexp.MustCompile(`openEuler评分[::](?s:(.*?))受影响版本排查(受影响/不受影响)[::]`) + RegexpCveOpScoreNew = regexp.MustCompile(`openEuler评分[::](?s:(.*?))受影响版本排查\(受影响/不受影响\)[::]`) //RegexpCveOpScore1 = regexp.MustCompile(`openEuler评分[::](?s:(.*?))受影响版本[::]`) //RegexpCveOpVector = regexp.MustCompile(`openEulerVector[::](?s:(.*?))受影响版本[::]`) RegexpCveInfluencesVersion = regexp.MustCompile(`受影响版本[::](?s:(.*?))规避方案或消减措施[::]`) - RegexpCveInfluencesVersionNew = regexp.MustCompile(`受影响版本排查(受影响/不受影响)[::](?s:(.*?))$`) + RegexpCveInfluencesVersionNew = regexp.MustCompile(`受影响版本排查\(受影响/不受影响\)[::](?s:(.*?))$`) RegexpCvePlannedMeasures = regexp.MustCompile(`规避方案或消减措施[::](?s:(.*?))受影响的包[::]`) RegexpCvePlannedMeasures1 = regexp.MustCompile(`规避方案或消减措施[::](?s:(.*?))$`) RegexpCveInfluencesPkg = regexp.MustCompile(`受影响的包[::](?s:(.*?))$`) - RegexpDigital = regexp.MustCompile(`(\d){1,}(\.\d+)?`) + RegexpSpecialDigital = regexp.MustCompile(`(CVSS[::]3.0|CVSS[::]2.0|cvss[::]3.0|cvss[::]2.0|3.0/|2.0/|3.0 /|2.0 /)*`) //^((CVSS:3.0|CVSS:2.0|3.0/|2.0/|3.0 /|2.0 /).)*$ + RegexpDigital = regexp.MustCompile(`(\d){1,}(\.?\d+)?`) //(\d){1,}(\.\d+)? //`/AV:[NLAP]/AC:[HL]/PR:[NLH]/UI:[NR]/S:[UC]/C:[NLH]/I:[HNL]/A:[LNH]` - RegexpVector = regexp.MustCompile(`AV:[NLAP](?s:(.*?))/A:[LNH]`) - RegexpVectorV2 = regexp.MustCompile(`AV:[LAN](?s:(.*))/Au:[MSN](?s:(.*))/A:[NPC]`) - RegexpScoreTypeV2 = regexp.MustCompile(`(?mi)^CVSS v2.0分值\s*`) - RegexpScoreTypeV3 = regexp.MustCompile(`(?mi)^CVSS v3.0分值\s*`) - RegexpIsNewTpl = regexp.MustCompile(`(?mi)^原理分析[::]\s*`) - RegexpIsNewTpl2 = regexp.MustCompile(`(?mi)^规避方案或消减措施[::]\s*`) - regexpEffectVersion = regexp.MustCompile(`(?mi)[\d]{1,}\.(.*?)[::]受影响`) + RegexpVector = regexp.MustCompile(`AV:[NLAP](?s:(.*?))/A:[LNH]`) + RegexpVectorV2 = regexp.MustCompile(`AV:[LAN](?s:(.*))/Au:[MSN](?s:(.*))/A:[NPC]`) + RegexpScoreTypeV2 = regexp.MustCompile(`(?mi)^CVSS v2.0分值\s*`) + RegexpScoreTypeV3 = regexp.MustCompile(`(?mi)^CVSS v3.0分值\s*`) + RegexpIsNewTpl = regexp.MustCompile(`(?mi)^原理分析[::]\s*`) + RegexpIsNewTpl2 = regexp.MustCompile(`(?mi)^规避方案或消减措施[::]\s*`) + regexpEffectVersion = regexp.MustCompile(`(?mi)[\d]{1,}\.(.*?)[::]受影响`) regexpNoEffectVersion = regexp.MustCompile(`(?mi)[\d]{1,}\.(.*?)[::]不受影响`) + regexpOtherEffectVersion = regexp.MustCompile(`(?mi)[\d]{1,}\.(.*?)[::]`) ) var ( @@ -78,10 +80,11 @@ type CommentAnalysis struct { KeyValue string } type CaSlice []CommentAnalysis + func (a CaSlice) Len() int { return len(a) } -func (a CaSlice) Swap(i, j int){ +func (a CaSlice) Swap(i, j int) { a[i], a[j] = a[j], a[i] } func (a CaSlice) Less(i, j int) bool { @@ -334,46 +337,58 @@ func ExtractCommentAnalysisAllValue(content string) map[string]string { res := make(map[string]string, 0) ca := GenerateCommentAnalysis(content) if len(ca) > 0 { - value ,ext:= ExtractCommentValue(ca, KwAnalysisDesc) + value, ext := ExtractCommentValue(ca, KwAnalysisDesc) if ext { res["cve_analysis"] = TrimStringNR(value) } - value,ext = ExtractCommentValue(ca, KwEffectVersion) + value, ext = ExtractCommentValue(ca, KwEffectVersion) if ext { value = ExtractCommentEffectVersion(value) //if value != "" { - res["affected_version"] = value + res["affected_version"] = value //} } - value ,ext= ExtractCommentValue(ca, KwOpenEulerScore) + value, ext = ExtractCommentValue(ca, KwOpenEulerScore) if ext { score, vector := ExtractCommentOpenEulerScore(value) - //if score != ""{ - res["openeuler_score"] = score - //} - //if vector != "" { - res["openeuler_vector"] = vector - //} + if score != ""{ + res["openeuler_score"] = score + } + if vector != "" { + res["openeuler_vector"] = vector + } } } return res } func ExtractCommentEffectVersion(str string) string { + str = strings.Trim(str, " ") var res []string match := regexpEffectVersion.FindAllStringSubmatch(str, -1) match2 := regexpNoEffectVersion.FindAllStringSubmatch(str, -1) - if len(match) > 0 { - for _, v := range match { - if len(v) > 1 { - res = append(res, TrimString(v[1])+":受影响") + if len(match) > 0 || len(match2) > 0 { + if len(match) > 0 { + for _, v := range match { + if len(v) > 1 { + res = append(res, TrimString(v[1])+":受影响") + } } } - } - if len(match2) >0 { - for _, v := range match2 { - if len(v) > 1 { - res = append(res, TrimString(v[1])+":不受影响") + if len(match2) > 0 { + for _, v := range match2 { + if len(v) > 1 { + res = append(res, TrimString(v[1])+":不受影响") + } + } + } + } else { + match3 := regexpOtherEffectVersion.FindAllStringSubmatch(str, -1) + if len(match3) > 0 { + for _, v := range match3 { + if len(v) > 1 { + res = append(res, TrimString(v[1])+":") + } } } } @@ -383,21 +398,21 @@ func ExtractCommentEffectVersion(str string) string { return "" } -func ExtractCommentValue(ca CaSlice, keyWord string) (string,bool) { +func ExtractCommentValue(ca CaSlice, keyWord string) (string, bool) { for _, v := range ca { if v.KeyName == keyWord { - return v.KeyValue,true + return v.KeyValue, true } } - return "",false + return "", false } -func ExtractCommentOpenEulerScore(str string) (score, vector string){ +func ExtractCommentOpenEulerScore(str string) (score, vector string) { str = TrimString(str) score = ExtractDigital(str) - vector = ExtractVector(str,CvsScoreV3) - if vector == ""{ - vector = ExtractVector(str,CvsScoreV2) + vector = ExtractVector(str, CvsScoreV3) + if vector == "" { + vector = ExtractVector(str, CvsScoreV2) } return } @@ -421,11 +436,29 @@ func TrimStringNR(str string) string { return str } +func RemoveSpecialDigital(body string) string { + if body == "" { + return body + } + sds := RegexpSpecialDigital.ReplaceAllString(body, "") + if len(sds) > 0 { + return sds + } + return "" +} + func ExtractDigital(body string) string { if body == "" { return body } - sds := RegexpDigital.FindAllStringSubmatch(body, -1) + scoreStr := "" + tempStr := RemoveSpecialDigital(body) + if tempStr != "" && len(tempStr) > 0 { + scoreStr = tempStr + } else { + scoreStr = body + } + sds := RegexpDigital.FindAllStringSubmatch(scoreStr, -1) if len(sds) > 0 { return sds[0][0] } -- Gitee From 43d50ada52eaf4ea7e7763e4372682889a3c5fbe Mon Sep 17 00:00:00 2001 From: zhangjianjun_code <7844966+zhangjianjun_code@user.noreply.gitee.com> Date: Wed, 30 Sep 2020 17:54:52 +0800 Subject: [PATCH 2/5] 1. Add comments to the function; 2. Modify the irregular code format --- common/aes.go | 47 ++++--- common/logs.go | 12 +- controllers/file.go | 11 +- controllers/hook.go | 136 ++++++++++--------- controllers/issue.go | 12 +- controllers/login.go | 24 ++-- controllers/object.go | 25 ++-- controllers/packages.go | 68 +++++----- controllers/upload.go | 28 ++-- controllers/user.go | 2 +- errcode/errcode.go | 71 +++++----- models/common.go | 2 + models/cve.go | 8 +- models/excel.go | 27 ++-- models/giteeissue.go | 28 ++-- models/hookevent.go | 5 +- models/initdb.go | 2 +- models/issue.go | 17 ++- models/modeldb.go | 267 ++++++++++++++++++------------------- models/user.go | 4 +- models/ymal.go | 2 +- task/cve.go | 14 +- task/genexcel.go | 2 +- task/grabissue.go | 1 + task/inittask.go | 29 ++-- task/issuetask.go | 60 ++++----- task/oricvecheck.go | 15 ++- task/yaml.go | 15 ++- taskhandler/assist.go | 10 +- taskhandler/comment.go | 6 +- taskhandler/common.go | 70 +++++----- taskhandler/createissue.go | 76 +++++------ taskhandler/cve.go | 56 ++++---- taskhandler/excel.go | 84 ++++++------ taskhandler/grabissue.go | 46 ++++--- taskhandler/oricvecheck.go | 10 +- taskhandler/yaml.go | 93 ++++++------- tests/createrepo_test.go | 6 +- util/http.go | 83 +++++++----- util/parsepayload.go | 152 +++++++++++++-------- 40 files changed, 872 insertions(+), 754 deletions(-) diff --git a/common/aes.go b/common/aes.go index c4a15c8..fe6f79e 100644 --- a/common/aes.go +++ b/common/aes.go @@ -9,13 +9,12 @@ import ( "flag" "fmt" "github.com/astaxie/beego/logs" + jwt "github.com/dgrijalva/jwt-go" "math/rand" "time" - jwt "github.com/dgrijalva/jwt-go" ) - -//PKCS7 填充模式 +//PKCS7Padding PKCS7 填充模式 func PKCS7Padding(ciphertext []byte, blockSize int) []byte { padding := blockSize - len(ciphertext)%blockSize //Repeat()函数的功能是把切片[]byte{byte(padding)}复制padding个,然后合并成新的字节切片返回 @@ -23,21 +22,21 @@ func PKCS7Padding(ciphertext []byte, blockSize int) []byte { return append(ciphertext, padtext...) } -//填充的反向操作,删除填充字符串 +//PKCS7UnPadding 填充的反向操作,删除填充字符串 func PKCS7UnPadding(origData []byte) ([]byte, error) { //获取数据长度 length := len(origData) if length == 0 { return nil, errors.New("加密字符串错误!") - } else { - //获取填充字符串长度 - unpadding := int(origData[length-1]) - //截取切片,删除填充字节,并且返回明文 - return origData[:(length - unpadding)], nil } + //获取填充字符串长度 + unPadding := int(origData[length-1]) + //截取切片,删除填充字节,并且返回明文 + return origData[:(length - unPadding)], nil + } -//实现加密 +//AesEcrypt 实现加密 func AesEcrypt(origData []byte, key []byte) ([]byte, error) { //创建加密算法实例 block, err := aes.NewCipher(key) @@ -56,7 +55,7 @@ func AesEcrypt(origData []byte, key []byte) ([]byte, error) { return crypted, nil } -//实现解密 +//AesDeCrypt 实现解密 func AesDeCrypt(cypted []byte, key []byte) ([]byte, error) { //创建加密算法实例 block, err := aes.NewCipher(key) @@ -78,7 +77,7 @@ func AesDeCrypt(cypted []byte, key []byte) ([]byte, error) { return origData, err } -//加密base64 +//EnPwdCode 加密base64 func EnPwdCode(pwd []byte, key []byte) (string, error) { result, err := AesEcrypt(pwd, key) if err != nil { @@ -87,7 +86,7 @@ func EnPwdCode(pwd []byte, key []byte) (string, error) { return base64.StdEncoding.EncodeToString(result), err } -//解密 +//DePwdCode 解密 func DePwdCode(pwd string, key []byte) ([]byte, error) { //解密base64字符串 pwdByte, err := base64.StdEncoding.DecodeString(pwd) @@ -98,6 +97,7 @@ func DePwdCode(pwd string, key []byte) ([]byte, error) { return AesDeCrypt(pwdByte, key) } + //func main() { // str := []byte("12fff我是ww.topgoer.com的站长枯藤") // pwd, _ := EnPwdCode(str) @@ -123,10 +123,10 @@ func parseArgs(lens int) { //flag.StringVar(&charset, "t", "num", // //反引号以原样输出 // `-t 制定密码生成的字符集, - // num:只使用数字[0-9], - // char:只使用英文字母[a-zA-Z], - // mix:使用数字和字母, - // advance:使用数字、字母以及特殊字符`) + // num:只使用数字[0-9], + // char:只使用英文字母[a-zA-Z], + // mix:使用数字和字母, + // advance:使用数字、字母以及特殊字符`) length = lens charset = "advance" flag.Parse() @@ -171,7 +171,8 @@ func generatePasswd() string { return string(passwd) } -func GenPrivKey(lens int) string{ +//GenPrivKey 生成私有key +func GenPrivKey(lens int) string { //随机种子 rand.Seed(time.Now().UnixNano()) parseArgs(lens) @@ -183,15 +184,13 @@ func GenPrivKey(lens int) string{ return passwd } - - type Claims struct { username string password string jwt.StandardClaims } -func setting(jwtkey []byte, username, password string) (string, error){ +func setting(jwtkey []byte, username, password string) (string, error) { expireTime := time.Now().Add(7 * 24 * time.Hour) claims := &Claims{ username: username, @@ -213,10 +212,11 @@ func setting(jwtkey []byte, username, password string) (string, error){ return tokenString, nil } -func GenToken(username, password string) (string, error){ +//GenToken 生成Token +func GenToken(username, password string) (string, error) { pKey := GenPrivKey(16) var jwtkey = []byte(pKey) - tokens,err := setting(jwtkey, username, password) + tokens, err := setting(jwtkey, username, password) return tokens, err } @@ -236,4 +236,3 @@ func GenToken(username, password string) (string, error){ // }) // return token, Claims, err //} - diff --git a/common/logs.go b/common/logs.go index 423137e..caad326 100644 --- a/common/logs.go +++ b/common/logs.go @@ -9,7 +9,7 @@ import ( func InitLogger() (err error) { BConfig, err := config.NewConfig("ini", "conf/app.conf") - if err != nil{ + if err != nil { fmt.Println("config init error:", err) return } @@ -20,7 +20,7 @@ func InitLogger() (err error) { logConf := make(map[string]interface{}) logConf["filename"] = BConfig.String("log::log_path") - level,_ := BConfig.Int("log::log_level") + level, _ := BConfig.Int("log::log_level") logConf["level"] = level logConf["maxlines"] = maxlines @@ -29,7 +29,11 @@ func InitLogger() (err error) { fmt.Println("marshal failed,err:", err) return } - logs.SetLogger(logs.AdapterFile, string(confStr)) + err = logs.SetLogger(logs.AdapterFile, string(confStr)) + if err != nil { + fmt.Println("marshal failed,err:", err) + return + } logs.SetLogFuncCall(true) return } @@ -40,4 +44,4 @@ func LogInit() { fmt.Println(err) } fmt.Println("log init success !") -} \ No newline at end of file +} diff --git a/controllers/file.go b/controllers/file.go index 54bc1ac..54bb97c 100644 --- a/controllers/file.go +++ b/controllers/file.go @@ -4,18 +4,19 @@ import ( "cvevulner/models" "github.com/astaxie/beego" ) - +//FileController file operation routing processing type FileController struct { beego.Controller } +//DownloadLastExcel Download the latest excel file // @router /lastExcel [get] -func (f *FileController) DownloadLastExcel() { - er :=models.ExportRecord{} +func (f *FileController) DownloadLastExcel() { + er := models.ExportRecord{} err := er.QueryLast() if err != nil { _ = f.Ctx.Output.Body([]byte("no file ")) } - fp := "./"+er.FileName - f.Ctx.Output.Download(fp,er.FileName) + fp := "./" + er.FileName + f.Ctx.Output.Download(fp, er.FileName) } diff --git a/controllers/hook.go b/controllers/hook.go index c8576c8..b15be03 100644 --- a/controllers/hook.go +++ b/controllers/hook.go @@ -15,28 +15,46 @@ import ( ) var ( - GiteeUserAgent = "git-oschina-hook" //gitee hook request flag - XGiteeToken = "X-Gitee-Token" // password or sign - XGIteeEventType = "X-Gitee-Event" //webhook event type - NoteHookType = "Note Hook" // type of comment - PullReqHookType = "merge_request_hooks" // type of pull request - PushTagHookType = "push_hooks/tag_push_hooks" // type of push or tag - IssueHookType = "Issue Hook" //type of issue + //GiteeUserAgent gitee hook request flag + GiteeUserAgent = "git-oschina-hook" + //XGiteeToken password or sign + XGiteeToken = "X-Gitee-Token" + //XGIteeEventType webhook event type + XGIteeEventType = "X-Gitee-Event" + //NoteHookType type of comment + NoteHookType = "Note Hook" + //PullReqHookType type of pull request + PullReqHookType = "merge_request_hooks" + //PushTagHookType type of push or tag + PushTagHookType = "push_hooks/tag_push_hooks" + //IssueHookType type of issue + IssueHookType = "Issue Hook" ) const ( - CommentAnalysisCplTpl = "@%v %v" + //CommentAnalysisCplTpl complete comment analysis reply template + CommentAnalysisCplTpl = "@%v %v" + //ReviewPrivateLettersTpl send private review letters template ReviewPrivateLettersTpl = `%s(%s)analysis is over,CVEScore:%v;OpenEulerScore:%v。Please review!` - ReviewRejectScore = `@%v you submit issue score audit failed(reject by %v),Please re-analyze and submit!` - ReviewApproveScore = `@%v you submit issue score audit success(approved by %v),You can proceed to the next step!` - CommentReviewTpl = `%v The CVE score needs to be reviewed (the review instruction /approve&/reject means agreement and rejection)。` - IssueRejectState = "rejected" - IssueCloseState = "closed" - IssueProgressState = "progressing" - IssueOpenState = "open" - AnalysisComplete = "@%v 经过 CVE-Manager 解析, 您分析的内容如下表所示:\n" + //ReviewRejectScore reply the review reject template + ReviewRejectScore = `@%v you submit issue score audit failed(reject by %v),Please re-analyze and submit!` + //ReviewApproveScore replay the review approve template + ReviewApproveScore = `@%v you submit issue score audit success(approved by %v),You can proceed to the next step!` + //CommentReviewTpl comment review template + CommentReviewTpl = `%v The CVE score needs to be reviewed (the review instruction /approve&/reject means agreement and rejection)。` + //IssueRejectState issue state rejected + IssueRejectState = "rejected" + //IssueCloseState issue state closed + IssueCloseState = "closed" + //IssueProgressState issue state progressing + IssueProgressState = "progressing" + //IssueOpenState issue state open + IssueOpenState = "open" + //AnalysisComplete issue analysis complete comment + AnalysisComplete = "@%v 经过 cve-manager 解析, 您分析的内容如下表所示:\n" ) +//HookEventControllers gitee hook callback type HookEventControllers struct { beego.Controller } @@ -62,16 +80,7 @@ func (c *HookEventControllers) Post() { } } -// @router / [get] -func (c *HookEventControllers) Get() { - if ok := c.isLegitimateHookEvent(); !ok { - logs.Info("hah:", "giteeUseAgent") - return - } - -} - -// isLegitimateHookEvent according to gitee doc judge +//isLegitimateHookEvent according to gitee doc judge func (c *HookEventControllers) isLegitimateHookEvent() (ok bool) { ok = true //judge user agent @@ -191,11 +200,11 @@ func handleIssueStateChange(issueHook *models.IssuePayload) error { return nil } -func isNormalCloseIssue(cveId int64, issueState int8) bool { +func isNormalCloseIssue(cveID int64, issueState int8) bool { if issueState == 1 { return false } - score, err := models.QueryIssueScore(cveId) + score, err := models.QueryIssueScore(cveID) if err != nil { logs.Error(err) return false @@ -419,7 +428,7 @@ func notifyAuditorReview(payload *models.CommentPayload, issueTmp models.IssueTe path := issueTmp.Repo ns := make([]string, len(list)) for k, v := range list { - ns[k] = "@" + v.NameSpace+" " + ns[k] = "@" + v.NameSpace + " " taskhandler.SendPrivateLetters(accessToken, content, v.NameSpace) //add @comment } @@ -428,8 +437,8 @@ func notifyAuditorReview(payload *models.CommentPayload, issueTmp models.IssueTe } -func changeOpenEulerScoreStatus(cveId int64, status int8) error { - score, err := models.QueryIssueScore(cveId) +func changeOpenEulerScoreStatus(cveID int64, status int8) error { + score, err := models.QueryIssueScore(cveID) if err != nil { return err } @@ -455,23 +464,22 @@ func checkIssueAnalysisComplete(i *models.IssueTemplate) (msg, tbStr string, ok ok = true tbContent := make([]interface{}, 12) if i.OpenEulerScore == 0.0 { - msg = fmt.Sprintf("openEulerScore没有填写:%v", i.OpenEulerScore) + msg = fmt.Sprintf("openEulerScore没有填写或正确填写(0-10)") ok = false return - } else { - tbContent[0] = "已分析" - tbContent[1] = "openEulerScore" - tbContent[2] = i.OpenEulerScore } + tbContent[0] = "已分析" + tbContent[1] = "openEulerScore" + tbContent[2] = i.OpenEulerScore + if util.TrimString(i.CveAnalysis) == "" { msg = fmt.Sprintf("影响性分析说明没有填写:%v", i.CveAnalysis) ok = false return - } else { - tbContent[3] = "已分析" - tbContent[4] = "影响性分析说明" - tbContent[5] = util.TrimStringNR(i.CveAnalysis) } + tbContent[3] = "已分析" + tbContent[4] = "影响性分析说明" + tbContent[5] = util.TrimStringNR(i.CveAnalysis) //新模板没有该值 /*if i.PrincipleAnalysis == "" { msg = fmt.Sprintf("原理分析:%v",i.PrincipleAnalysis) @@ -482,11 +490,10 @@ func checkIssueAnalysisComplete(i *models.IssueTemplate) (msg, tbStr string, ok msg = fmt.Sprintf("openEulerVector没有填写:%v", i.OpenEulerVector) ok = false return - } else { - tbContent[6] = "已分析" - tbContent[7] = "openEulerVector" - tbContent[8] = util.TrimStringNR(i.OpenEulerVector) } + tbContent[6] = "已分析" + tbContent[7] = "openEulerVector" + tbContent[8] = util.TrimStringNR(i.OpenEulerVector) if i.AffectedVersion != "" { versionfFlag := true affectedVersionArry := strings.Split(i.AffectedVersion, ",") @@ -506,6 +513,11 @@ func checkIssueAnalysisComplete(i *models.IssueTemplate) (msg, tbStr string, ok } } } + if !versionfFlag { + msg = fmt.Sprintf("受影响版本排查 没有分析或未按正确格式填写:%v", i.AffectedVersion) + ok = false + return + } if versionfFlag { tbContent[9] = "已分析" tbContent[10] = "受影响版本排查" @@ -562,8 +574,8 @@ func commentUpdateIssue(issueTmp models.IssueTemplate) { } } -func saveVectorData(vct string, cveId int64) error { - score, err := models.QueryIssueScore(cveId) +func saveVectorData(vct string, cveID int64) error { + score, err := models.QueryIssueScore(cveID) if err != nil { return err } @@ -579,74 +591,74 @@ func saveVectorData(vct string, cveId int64) error { } if util.RegexpVectorV2.Match([]byte(vct)) { //update v2 vector - avv := util.ReadVmValueV2(vMap["AV"]) + avv := util.ReadVMValueV2(vMap["AV"]) if avv != "" { score.OaccessVector = avv upFields = append(upFields, "o_access_vector") } - acv := util.ReadVmValueV2(vMap["AC"]) + acv := util.ReadVMValueV2(vMap["AC"]) if acv != "" { score.OaccessComplexity = acv upFields = append(upFields, "o_access_complexity") } - au := util.ReadVmValueV2(vMap["Au"]) + au := util.ReadVMValueV2(vMap["Au"]) if au != "" { score.Oauthentication = au upFields = append(upFields, "o_authentication") } - cv := util.ReadVmValueV2(vMap["C"]) + cv := util.ReadVMValueV2(vMap["C"]) if cv != "" { score.Oconfidentiality = cv upFields = append(upFields, "o_confidentiality") } - iv := util.ReadVmValueV2(vMap["I"]) + iv := util.ReadVMValueV2(vMap["I"]) if iv != "" { score.Ointegrity = iv upFields = append(upFields, "o_integrity") } - av := util.ReadVmValueV2(vMap["A"]) + av := util.ReadVMValueV2(vMap["A"]) if av != "" { score.Oavailability = av upFields = append(upFields, "o_availability") } } else { //update v3 vector - avv := util.ReadVmValue(vMap["AV"]) + avv := util.ReadVMValue(vMap["AV"]) if avv != "" { score.OattackVector = avv upFields = append(upFields, "o_attack_vector") } - acv := util.ReadVmValue(vMap["AC"]) + acv := util.ReadVMValue(vMap["AC"]) if acv != "" { score.OattackComplexity = acv upFields = append(upFields, "o_attack_complexity") } - prv := util.ReadVmValue(vMap["PR"]) + prv := util.ReadVMValue(vMap["PR"]) if prv != "" { score.OprivilegeRequired = prv upFields = append(upFields, "o_privilege_required") } - uiv := util.ReadVmValue(vMap["UI"]) + uiv := util.ReadVMValue(vMap["UI"]) if uiv != "" { score.OuserInteraction = uiv upFields = append(upFields, "o_user_interaction") } - sv := util.ReadVmValue(vMap["S"]) + sv := util.ReadVMValue(vMap["S"]) if sv != "" { score.Oscope = sv upFields = append(upFields, "o_scope") } - cv := util.ReadVmValue(vMap["C"]) + cv := util.ReadVMValue(vMap["C"]) if cv != "" { score.Oconfidentiality = cv upFields = append(upFields, "o_confidentiality") } - iv := util.ReadVmValue(vMap["I"]) + iv := util.ReadVMValue(vMap["I"]) if iv != "" { score.Ointegrity = iv upFields = append(upFields, "o_integrity") } - av := util.ReadVmValue(vMap["A"]) + av := util.ReadVMValue(vMap["A"]) if av != "" { score.Oavailability = av upFields = append(upFields, "o_availability") @@ -662,9 +674,9 @@ func saveVectorData(vct string, cveId int64) error { return nil } -func handleCommentPackage(packageStr string, cveId int64) error { +func handleCommentPackage(packageStr string, cveID int64) error { packageStr = util.TrimString(packageStr) - err := models.UpdatePackageByCveId(packageStr, cveId) + err := models.UpdatePackageByCveId(packageStr, cveID) if err != nil { return err } diff --git a/controllers/issue.go b/controllers/issue.go index a48d786..bb5ef08 100644 --- a/controllers/issue.go +++ b/controllers/issue.go @@ -20,17 +20,17 @@ func (c *IssueOathCallbackController) RetData(resp map[string]interface{}) { // @Title UserLogin // @Description UserLogin // @Param body body models.User true "body for user content" -// @Success 200 {int} models.User.Id +// @Success 200 {int} models.User.ID // @Failure 403 body is empty // @router / [post] -func (u *IssueOathCallbackController) Post() { +func (c *IssueOathCallbackController) Post() { req := make(map[string]interface{}) resp := make(map[string]interface{}) - resp["errno"]=errcode.RECODE_LOGINERR - resp["errmsg"]=errcode.RecodeText(errcode.RECODE_LOGINERR) + resp["errno"]=errcode.RecodeLoginErr + resp["errmsg"]=errcode.RecodeText(errcode.RecodeLoginErr) resp["body"] = Result{} - defer u.RetData(resp) - json.Unmarshal(u.Ctx.Input.RequestBody,&req) + defer c.RetData(resp) + json.Unmarshal(c.Ctx.Input.RequestBody,&req) logs.Info("登录请求参数:", &req) //判断是否合法 //if req["UserName"] == nil || req["PassWord"] ==nil{ diff --git a/controllers/login.go b/controllers/login.go index 240c470..f9c31d2 100644 --- a/controllers/login.go +++ b/controllers/login.go @@ -28,22 +28,26 @@ func (c *UserLoginController) RetData(resp map[string]interface{}) { // @Title UserLogin // @Description UserLogin // @Param body body models.User true "body for user content" -// @Success 200 {int} models.User.Id +// @Success 200 {int} models.User.ID // @Failure 403 body is empty // @router / [post] func (u *UserLoginController) Post() { req := make(map[string]interface{}) resp := make(map[string]interface{}) - resp["errno"]=errcode.RECODE_LOGINERR - resp["errmsg"]=errcode.RecodeText(errcode.RECODE_LOGINERR) + resp["errno"]=errcode.RecodeLoginErr + resp["errmsg"]=errcode.RecodeText(errcode.RecodeLoginErr) resp["body"] = Result{} defer u.RetData(resp) - json.Unmarshal(u.Ctx.Input.RequestBody,&req) + err := json.Unmarshal(u.Ctx.Input.RequestBody, &req) + if err != nil{ + logs.Error(err) + return + } logs.Info("登录请求参数:", &req) //判断是否合法 if req["userName"] == nil || req["passWord"] == nil{ - resp["errno"]=errcode.RECODE_DATAERR - resp["errmsg"]=errcode.RecodeText(errcode.RECODE_DATAERR) + resp["errno"]=errcode.RecodeDataErr + resp["errmsg"]=errcode.RecodeText(errcode.RecodeDataErr) resp["body"] = Result{} logs.Error("数据错误") return @@ -52,8 +56,8 @@ func (u *UserLoginController) Post() { // 加密先注释 //password = common.DesString(password) if password == "" || len(password) == 0{ - resp["errno"]=errcode.RECODE_PWDERR - resp["errmsg"]=errcode.RecodeText(errcode.RECODE_PWDERR) + resp["errno"]=errcode.RecodePwdErr + resp["errmsg"]=errcode.RecodeText(errcode.RecodePwdErr) logs.Error("密码解析错误", password) resp["body"] = Result{} return @@ -70,8 +74,8 @@ func (u *UserLoginController) Post() { user_id := resp_model[0]["user_id"] strc.UserId = user_id resp["body"] = strc - resp["errno"]=errcode.RECODE_OK - resp["errmsg"]=errcode.RecodeText(errcode.RECODE_OK) + resp["errno"]=errcode.RecodeOk + resp["errmsg"]=errcode.RecodeText(errcode.RecodeOk) expirTime := common.GetTokenExpirTime() newTime := time.Now().AddDate(0, 0, expirTime) models.UpdateToken(resp_model[0]["user_id"], token, newTime) diff --git a/controllers/object.go b/controllers/object.go index 714a066..bde796f 100644 --- a/controllers/object.go +++ b/controllers/object.go @@ -3,11 +3,11 @@ package controllers import ( "cvevulner/models" "encoding/json" - "github.com/astaxie/beego" + "github.com/astaxie/beego/logs" ) -// Operations about object +//ObjectController Operations about object type ObjectController struct { beego.Controller } @@ -15,14 +15,18 @@ type ObjectController struct { // @Title Create // @Description create object // @Param body body models.Object true "The object content" -// @Success 200 {string} models.Object.Id +// @Success 200 {string} models.Object.ID // @Failure 403 body is empty // @router / [post] func (o *ObjectController) Post() { var ob models.Object - json.Unmarshal(o.Ctx.Input.RequestBody, &ob) - objectid := models.AddOne(ob) - o.Data["json"] = map[string]string{"ObjectId": objectid} + err := json.Unmarshal(o.Ctx.Input.RequestBody, &ob) + if err != nil { + logs.Error(err) + o.Abort("500") + } + objectId := models.AddOne(ob) + o.Data["json"] = map[string]string{"ObjectId": objectId} o.ServeJSON() } @@ -66,9 +70,11 @@ func (o *ObjectController) GetAll() { func (o *ObjectController) Put() { objectId := o.Ctx.Input.Param(":objectId") var ob models.Object - json.Unmarshal(o.Ctx.Input.RequestBody, &ob) - - err := models.Update(objectId, ob.Score) + err := json.Unmarshal(o.Ctx.Input.RequestBody, &ob) + if err != nil { + o.Data["json"] = err.Error() + } + err = models.Update(objectId, ob.Score) if err != nil { o.Data["json"] = err.Error() } else { @@ -89,4 +95,3 @@ func (o *ObjectController) Delete() { o.Data["json"] = "delete success!" o.ServeJSON() } - diff --git a/controllers/packages.go b/controllers/packages.go index 41ed97a..a6f619f 100644 --- a/controllers/packages.go +++ b/controllers/packages.go @@ -78,8 +78,8 @@ func (u *PackagesController) Get() { logs.Info("Method: ",req.Method, "客户端请求的:addr: ", addr, "Header: ", req.Header, "body: ", req.Body) resp := make(map[string]interface{}) var pd []PackageData - resp["errno"]=errcode.RECODE_UNKNOWERR - resp["errmsg"]=errcode.RecodeText(errcode.RECODE_UNKNOWERR) + resp["errno"]=errcode.RecodeUnknowErr + resp["errmsg"]=errcode.RecodeText(errcode.RecodeUnknowErr) resp["body"] = []PackageData{} resp["totalCount"] = 0 resp["totalPage"] = 0 @@ -89,40 +89,40 @@ func (u *PackagesController) Get() { addrIp := strings.Split(addr, ":") err := models.GetIpWhite(addrIp[0], &iw) if err != nil { - resp["errno"]=errcode.RECODE_IPERR - resp["errmsg"]=errcode.RecodeText(errcode.RECODE_IPERR) + resp["errno"]=errcode.RecodeIpErr + resp["errmsg"]=errcode.RecodeText(errcode.RecodeIpErr) return } } else { - resp["errno"]=errcode.RECODE_IPERR - resp["errmsg"]=errcode.RecodeText(errcode.RECODE_IPERR) + resp["errno"]=errcode.RecodeIpErr + resp["errmsg"]=errcode.RecodeText(errcode.RecodeIpErr) return } token := u.GetString("token") if token == "" { - resp["errno"]=errcode.RECODE_SESSIONERR - resp["errmsg"]=errcode.RecodeText(errcode.RECODE_SESSIONERR) + resp["errno"]=errcode.RecodeSessionErr + resp["errmsg"]=errcode.RecodeText(errcode.RecodeSessionErr) return } else { ok := models.CheckToken(token) if !ok { - resp["errno"]=errcode.RECODE_ROLEERR - resp["errmsg"]=errcode.RecodeText(errcode.RECODE_ROLEERR) + resp["errno"]=errcode.RecodeRoleErr + resp["errmsg"]=errcode.RecodeText(errcode.RecodeRoleErr) return } } PageNum, err := u.GetInt64("pageNum") if err != nil { logs.Error("pageNum, err: ", err) - resp["errno"]=errcode.RECODE_PARAMERR - resp["errmsg"]=errcode.RecodeText(errcode.RECODE_PARAMERR) + resp["errno"]=errcode.RecodeParamErr + resp["errmsg"]=errcode.RecodeText(errcode.RecodeParamErr) return } PageSize, err := u.GetInt64("pageSize") if err != nil { logs.Error("PageSize, err: ", err) - resp["errno"]=errcode.RECODE_PARAMERR - resp["errmsg"]=errcode.RecodeText(errcode.RECODE_PARAMERR) + resp["errno"]=errcode.RecodeParamErr + resp["errmsg"]=errcode.RecodeText(errcode.RecodeParamErr) return } QueryPkgName := u.GetString("queryPkgName") @@ -160,12 +160,12 @@ func (u *PackagesController) Get() { pd = append(pd, pg) } resp["body"] = pd - resp["errno"]=errcode.RECODE_OK - resp["errmsg"]=errcode.RecodeText(errcode.RECODE_OK) + resp["errno"]=errcode.RecodeOk + resp["errmsg"]=errcode.RecodeText(errcode.RecodeOk) } } else { - resp["errno"]=errcode.RECODE_NODATA - resp["errmsg"]=errcode.RecodeText(errcode.RECODE_NODATA) + resp["errno"]=errcode.RecodeNodata + resp["errmsg"]=errcode.RecodeText(errcode.RecodeNodata) return } } @@ -183,8 +183,8 @@ func (u *PackagesInfoController) Get() { logs.Info("Method: ",req.Method, "客户端请求的:addr: ", addr, "Header: ", req.Header, "body: ", req.Body) resp := make(map[string]interface{}) var pd PackageInfoData - resp["errno"]=errcode.RECODE_UNKNOWERR - resp["errmsg"]=errcode.RecodeText(errcode.RECODE_UNKNOWERR) + resp["errno"]=errcode.RecodeUnknowErr + resp["errmsg"]=errcode.RecodeText(errcode.RecodeUnknowErr) resp["body"] = PackageInfoData{} defer u.RetData(resp) var iw models.IpWhite @@ -192,40 +192,40 @@ func (u *PackagesInfoController) Get() { addrIp := strings.Split(addr, ":") err := models.GetIpWhite(addrIp[0], &iw) if err != nil { - resp["errno"]=errcode.RECODE_IPERR - resp["errmsg"]=errcode.RecodeText(errcode.RECODE_IPERR) + resp["errno"]=errcode.RecodeIpErr + resp["errmsg"]=errcode.RecodeText(errcode.RecodeIpErr) return } } else { - resp["errno"]=errcode.RECODE_IPERR - resp["errmsg"]=errcode.RecodeText(errcode.RECODE_IPERR) + resp["errno"]=errcode.RecodeIpErr + resp["errmsg"]=errcode.RecodeText(errcode.RecodeIpErr) return } token := u.GetString("token") if token == "" { - resp["errno"]=errcode.RECODE_SESSIONERR - resp["errmsg"]=errcode.RecodeText(errcode.RECODE_SESSIONERR) + resp["errno"]=errcode.RecodeSessionErr + resp["errmsg"]=errcode.RecodeText(errcode.RecodeSessionErr) return } else { ok := models.CheckToken(token) if !ok { - resp["errno"]=errcode.RECODE_ROLEERR - resp["errmsg"]=errcode.RecodeText(errcode.RECODE_ROLEERR) + resp["errno"]=errcode.RecodeRoleErr + resp["errmsg"]=errcode.RecodeText(errcode.RecodeRoleErr) return } } pkgName := u.GetString("pkgName") if pkgName == "" { logs.Error("pkgName, 参数错误") - resp["errno"]=errcode.RECODE_PARAMERR - resp["errmsg"]=errcode.RecodeText(errcode.RECODE_PARAMERR) + resp["errno"]=errcode.RecodeParamErr + resp["errmsg"]=errcode.RecodeText(errcode.RecodeParamErr) return } var gi models.GitPackageInfo err := models.GetPackageInfo(pkgName, &gi) if err != nil { - resp["errno"]=errcode.RECODE_NODATA - resp["errmsg"]=errcode.RecodeText(errcode.RECODE_NODATA) + resp["errno"]=errcode.RecodeNodata + resp["errmsg"]=errcode.RecodeText(errcode.RecodeNodata) return } pd.OriginUrl = gi.OriginUrl @@ -285,8 +285,8 @@ func (u *PackagesInfoController) Get() { } else { pd.Subpack = []SubPack{} } - resp["errno"]=errcode.RECODE_OK - resp["errmsg"]=errcode.RecodeText(errcode.RECODE_OK) + resp["errno"]=errcode.RecodeOk + resp["errmsg"]=errcode.RecodeText(errcode.RecodeOk) resp["body"] = pd return } \ No newline at end of file diff --git a/controllers/upload.go b/controllers/upload.go index f3ebf79..a54f1ad 100644 --- a/controllers/upload.go +++ b/controllers/upload.go @@ -37,8 +37,8 @@ func (u *UserUploadController) Post() { addr := req.RemoteAddr logs.Info("Method: ",req.Method, "客户端请求的:addr: ", addr, "Header: ", req.Header) resp := make(map[string]interface{}) - resp["errno"]=errcode.RECODE_UNKNOWERR - resp["errmsg"]=errcode.RecodeText(errcode.RECODE_UNKNOWERR) + resp["errno"]=errcode.RecodeUnknowErr + resp["errmsg"]=errcode.RecodeText(errcode.RecodeUnknowErr) resp["body"] = []ResultData{} defer u.RetData(resp) json.Unmarshal(u.Ctx.Input.RequestBody,&uploaddata) @@ -48,19 +48,19 @@ func (u *UserUploadController) Post() { addrIp := strings.Split(addr, ":") err := models.GetIpWhite(addrIp[0], &iw) if err != nil { - resp["errno"]=errcode.RECODE_IPERR - resp["errmsg"]=errcode.RecodeText(errcode.RECODE_IPERR) + resp["errno"]=errcode.RecodeIpErr + resp["errmsg"]=errcode.RecodeText(errcode.RecodeIpErr) return } } else { - resp["errno"]=errcode.RECODE_IPERR - resp["errmsg"]=errcode.RecodeText(errcode.RECODE_IPERR) + resp["errno"]=errcode.RecodeIpErr + resp["errmsg"]=errcode.RecodeText(errcode.RecodeIpErr) return } //判断是否合法 if uploaddata.Token == "" { - resp["errno"]=errcode.RECODE_SESSIONERR - resp["errmsg"]=errcode.RecodeText(errcode.RECODE_SESSIONERR) + resp["errno"]=errcode.RecodeSessionErr + resp["errmsg"]=errcode.RecodeText(errcode.RecodeSessionErr) resp["body"] = []ResultData{} logs.Error("token 校验失败") return @@ -68,16 +68,16 @@ func (u *UserUploadController) Post() { // 校验token ok := models.CheckToken(uploaddata.Token) if !ok { - resp["errno"]=errcode.RECODE_SESSIONERR - resp["errmsg"]=errcode.RecodeText(errcode.RECODE_SESSIONERR) + resp["errno"]=errcode.RecodeSessionErr + resp["errmsg"]=errcode.RecodeText(errcode.RecodeSessionErr) resp["body"] = []ResultData{} logs.Error("token 校验失败") return } } if uploaddata.CveData == nil || len(uploaddata.CveData) == 0{ - resp["errno"]=errcode.RECODE_NODATA - resp["errmsg"]=errcode.RecodeText(errcode.RECODE_NODATA) + resp["errno"]=errcode.RecodeNodata + resp["errmsg"]=errcode.RecodeText(errcode.RecodeNodata) resp["body"] = []ResultData{} logs.Error("数据为空") return @@ -226,8 +226,8 @@ func (u *UserUploadController) Post() { ResDataList = append(ResDataList, ResData) } } - resp["errno"]=errcode.RECODE_OK - resp["errmsg"]=errcode.RecodeText(errcode.RECODE_OK) + resp["errno"]=errcode.RecodeOk + resp["errmsg"]=errcode.RecodeText(errcode.RecodeOk) resp["body"] = ResDataList return } diff --git a/controllers/user.go b/controllers/user.go index 1c689d4..2a7b360 100644 --- a/controllers/user.go +++ b/controllers/user.go @@ -15,7 +15,7 @@ type UserController struct { // @Title CreateUser // @Description create users // @Param body body models.User true "body for user content" -// @Success 200 {int} models.User.Id +// @Success 200 {int} models.User.ID // @Failure 403 body is empty // @router / [post] func (u *UserController) Post() { diff --git a/errcode/errcode.go b/errcode/errcode.go index c47f459..f24d0d5 100644 --- a/errcode/errcode.go +++ b/errcode/errcode.go @@ -2,50 +2,51 @@ package errcode const ( - RECODE_OK = "200" - RECODE_DBERR = "4001" - RECODE_NODATA = "4002" - RECODE_DATAEXIST = "4003" - RECODE_DATAERR = "4004" - RECODE_SESSIONERR = "4101" - RECODE_LOGINERR = "4102" - RECODE_PARAMERR = "4103" - RECODE_USERERR = "4104" - RECODE_ROLEERR = "4105" - RECODE_PWDERR = "4106" - RECODE_REQERR = "4201" - RECODE_IPERR = "4202" - RECODE_THIRDERR = "4301" - RECODE_IOERR = "4302" - RECODE_SERVERERR = "4500" - RECODE_UNKNOWERR = "4501" + RecodeOk = "200" + RecodeDbErr = "4001" + RecodeNodata = "4002" + RecodeDataExist = "4003" + RecodeDataErr = "4004" + RecodeSessionErr = "4101" + RecodeLoginErr = "4102" + RecodeParamErr = "4103" + RecodeUserErr = "4104" + RecodeRoleErr = "4105" + RecodePwdErr = "4106" + RecodeReqErr = "4201" + RecodeIpErr = "4202" + RecodeThirdErr = "4301" + RecodeIoErr = "4302" + RecodeServerErr = "4500" + RecodeUnknowErr = "4501" ) var recodeText = map[string]string{ - RECODE_OK: "成功", - RECODE_DBERR: "数据库查询错误", - RECODE_NODATA: "无数据", - RECODE_DATAEXIST: "数据已存在", - RECODE_DATAERR: "数据错误", - RECODE_SESSIONERR: "用户未登录", - RECODE_LOGINERR: "用户登录失败", - RECODE_PARAMERR: "请求参数错误", - RECODE_USERERR: "用户不存在或未激活", - RECODE_ROLEERR: "登录身份错误", - RECODE_PWDERR: "密码错误", - RECODE_REQERR: "非法请求或请求次数受限", - RECODE_IPERR: "IP受限", - RECODE_THIRDERR: "第三方系统错误", - RECODE_IOERR: "文件读写错误", - RECODE_SERVERERR: "内部错误", - RECODE_UNKNOWERR: "未知错误", + RecodeOk: "成功", + RecodeDbErr: "数据库查询错误", + RecodeNodata: "无数据", + RecodeDataExist: "数据已存在", + RecodeDataErr: "数据错误", + RecodeSessionErr: "用户未登录", + RecodeLoginErr: "用户登录失败", + RecodeParamErr: "请求参数错误", + RecodeUserErr: "用户不存在或未激活", + RecodeRoleErr: "登录身份错误", + RecodePwdErr: "密码错误", + RecodeReqErr: "非法请求或请求次数受限", + RecodeIpErr: "IP受限", + RecodeThirdErr: "第三方系统错误", + RecodeIoErr: "文件读写错误", + RecodeServerErr: "内部错误", + RecodeUnknowErr: "未知错误", } +//RecodeText get resp string by code func RecodeText(code string)string { str,ok := recodeText[code] if ok { return str } - return RecodeText(RECODE_UNKNOWERR) + return RecodeText(RecodeUnknowErr) } \ No newline at end of file diff --git a/models/common.go b/models/common.go index 0d6ab12..138951d 100644 --- a/models/common.go +++ b/models/common.go @@ -5,6 +5,7 @@ import ( "time" ) +//Time2Str format time to string func Time2Str() string { const shortForm = "2006-01-02 15:04:05" t := time.Now() @@ -12,6 +13,7 @@ func Time2Str() string { return str } +//CheckToken Check whether the token is legal func CheckToken(token string) bool { var ou OtherUser err := GetUserByToken(token, &ou) diff --git a/models/cve.go b/models/cve.go index 9a158dd..e456ebb 100644 --- a/models/cve.go +++ b/models/cve.go @@ -210,11 +210,11 @@ func CreateSecurityNotice(sec *SecurityNotice) (SecId int64, err error) { logs.Info("insert cve_security_notice success, num:, cveNum", num, sec.CveNum) } else { logs.Error("insert cve_security_notice failed, cveNum:", sec.CveNum) - o.Rollback() + err = o.Rollback() return 0, err } SecId = sec.SecId - o.Commit() + _ = o.Commit() } else { logs.Error("事务创建失败,cveNum:", sec.CveNum) return 0, errs @@ -611,7 +611,7 @@ func UpdateVulnCenter(cve *VulnCenter, field ...string) bool { return true } -func GetVulnCenterByCid(cve *VulnCenter,field ...string) error { +func GetVulnCenterByCid(cve *VulnCenter, field ...string) error { o := orm.NewOrm() err := o.Read(cve, field...) return err @@ -683,7 +683,7 @@ ON e.cve_id = a.cve_id WHERE a.cve_id IN (%s) ORDER BY c.openeuler_score DESC ` - sql = fmt.Sprintf(sql,cId) + sql = fmt.Sprintf(sql, cId) o := orm.NewOrm() _, err = o.Raw(sql).QueryRows(&list) return diff --git a/models/excel.go b/models/excel.go index 9762689..e0c8831 100644 --- a/models/excel.go +++ b/models/excel.go @@ -2,30 +2,33 @@ package models import "github.com/astaxie/beego/orm" +//ExcelExport the export excel row content model type ExcelExport struct { Num int64 Score - CveBrief string `json:"cve_brief"` - OwnedComponent string `json:"owned_component"` - SecId int64 `json:"sec_id"` - Introduction string `json:"introduction"` - Summary string `json:"summary"` - Theme string `json:"theme"` - Description string `json:"description"` + CveBrief string `json:"cve_brief"` + OwnedComponent string `json:"owned_component"` + SecID int64 `json:"sec_id"` + Introduction string `json:"introduction"` + Summary string `json:"summary"` + Theme string `json:"theme"` + Description string `json:"description"` InfluenceComponent string `json:"influence_component" orm:"size(256);null;column(influence_component)"` - AffectProduct string `json:"affect_product"` - ReferenceLink string `json:"reference_link"` - AffectStatus string `json:"affect_status"` - PublicDate string `json:"public_date"` - OpenEulerSANum string `json:"openeuler_sa_num" orm:"size(128);column(openeuler_sa_num)"` + AffectProduct string `json:"affect_product"` + ReferenceLink string `json:"reference_link"` + AffectStatus string `json:"affect_status"` + PublicDate string `json:"public_date"` + OpenEulerSANum string `json:"openeuler_sa_num" orm:"size(128);column(openeuler_sa_num)"` } +//Insert Insert a generated excel file record func (er ExportRecord) Insert() error { o := orm.NewOrm() _, err := o.Insert(&er) return err } +//QueryLast query the last excel record func (er *ExportRecord) QueryLast() error { o := orm.NewOrm() err := o.QueryTable(er).OrderBy("-create_time").One(er) diff --git a/models/giteeissue.go b/models/giteeissue.go index 86ba822..369ab62 100644 --- a/models/giteeissue.go +++ b/models/giteeissue.go @@ -113,14 +113,14 @@ func (v *VectorValue) VctToVectorValue(vector string) bool { if !ok { return false } - v.AttackVector = util.ReadVmValue(m["AV"]) - v.AttackComplexity = util.ReadVmValue(m["AC"]) - v.Availability = util.ReadVmValue(m["A"]) - v.Confidentiality = util.ReadVmValue(m["C"]) - v.Integrity = util.ReadVmValue(m["I"]) - v.PrivilegesRequired = util.ReadVmValue(m["PR"]) - v.UserInteraction = util.ReadVmValue(m["UI"]) - v.Scope = util.ReadVmValue(m["S"]) + v.AttackVector = util.ReadVMValue(m["AV"]) + v.AttackComplexity = util.ReadVMValue(m["AC"]) + v.Availability = util.ReadVMValue(m["A"]) + v.Confidentiality = util.ReadVMValue(m["C"]) + v.Integrity = util.ReadVMValue(m["I"]) + v.PrivilegesRequired = util.ReadVMValue(m["PR"]) + v.UserInteraction = util.ReadVMValue(m["UI"]) + v.Scope = util.ReadVMValue(m["S"]) return true } @@ -132,12 +132,12 @@ func (v *VectorValueV2) VctToVectorValue(vector string) bool { if !ok { return false } - v.AccessVector = util.ReadVmValueV2(m["AV"]) - v.AccessComplexity = util.ReadVmValueV2(m["AC"]) - v.Availability = util.ReadVmValueV2(m["A"]) - v.Confidentiality = util.ReadVmValueV2(m["C"]) - v.IntegrityImpact = util.ReadVmValueV2(m["I"]) - v.Authentication = util.ReadVmValueV2(m["Au"]) + v.AccessVector = util.ReadVMValueV2(m["AV"]) + v.AccessComplexity = util.ReadVMValueV2(m["AC"]) + v.Availability = util.ReadVMValueV2(m["A"]) + v.Confidentiality = util.ReadVMValueV2(m["C"]) + v.IntegrityImpact = util.ReadVMValueV2(m["I"]) + v.Authentication = util.ReadVMValueV2(m["Au"]) return true } diff --git a/models/hookevent.go b/models/hookevent.go index 683cf21..6b8f4d1 100644 --- a/models/hookevent.go +++ b/models/hookevent.go @@ -1,7 +1,7 @@ package models import "time" - +//HookUser gitee user model type HookUser struct { Id int64 Login string //同下username @@ -13,6 +13,7 @@ type HookUser struct { } +//HookIssue gitee issue model type HookIssue struct { Id int64 Number string @@ -31,6 +32,7 @@ type HookIssue struct { SecurityHole bool `json:"security_hole"` } +//HookRepository gitee repository model type HookRepository struct { Id int64 FullName string `json:"full_name"` @@ -42,6 +44,7 @@ type HookRepository struct { public bool } +//HookComment gitee comment model type HookComment struct { User *HookUser //评论的作者信息 HtmlUrl string `json:"html_url"` //评论在码云上的url diff --git a/models/initdb.go b/models/initdb.go index 79143c7..6c40301 100644 --- a/models/initdb.go +++ b/models/initdb.go @@ -13,7 +13,7 @@ import ( func init() { Initdb() } - +//InitDb init database func Initdb() { BConfig, err := config.NewConfig("ini", "conf/app.conf") if err != nil{ diff --git a/models/issue.go b/models/issue.go index c66a4b7..5293a96 100644 --- a/models/issue.go +++ b/models/issue.go @@ -13,6 +13,7 @@ import ( var mutex sync.Mutex +//QueryIssueCveByNum query issue by cve num func QueryIssueCveByNum(cvenum, repoPath string) (GiteOriginIssue, bool) { o := orm.NewOrm() var cve GiteOriginIssue @@ -25,6 +26,7 @@ func QueryIssueCveByNum(cvenum, repoPath string) (GiteOriginIssue, bool) { } } +//QueryIssue query center func QueryIssue(days string, prcnum int) ([]VulnCenter, error) { o := orm.NewOrm() var vc []VulnCenter @@ -51,7 +53,7 @@ func GetVulnCenterByCVEID(vc *VulnCenter, cveId int64, fields ...string) error { err := o.Raw(sqlStr, cveId).QueryRow(vc) return err } - +//QueryIssueSecurity 查找安全公告 func QueryIssueSecurity(cveId int64) (SecurityNotice, error) { o := orm.NewOrm() var sn SecurityNotice @@ -175,7 +177,7 @@ func UpdatePackageByCveId(pkgStr string, cveId int64) error { if err != nil { return err } - _, err = o.Raw(delPkgSql, sec.SecId).Exec() + _, err = o.Raw(delPkgSql, sec.SecID).Exec() if err != nil { err = o.Rollback() return err @@ -183,7 +185,7 @@ func UpdatePackageByCveId(pkgStr string, cveId int64) error { pkgVals := make([]Package, 0) for _, v := range ps { pkgUrl := fmt.Sprintf(`https://repo.openeuler.org/openEuler-20.03-LTS/update/aarch64/Packages/%s`, v) - pv := Package{SecId: sec.SecId, PackName: v, PackUrl: pkgUrl} + pv := Package{SecID: sec.SecID, PackName: v, PackUrl: pkgUrl} pkgVals = append(pkgVals, pv) } _, err = o.InsertMulti(1, pkgVals) @@ -207,7 +209,7 @@ func QueryPackageByCveId(cveId int64) ([]Package, error) { return res, err } -func CreateIssueTemplet(it *IssueTemplate) (issTempId int64, err error) { +func CreateIssueTemplate(it *IssueTemplate) (issTempId int64, err error) { o := orm.NewOrm() var localIt IssueTemplate errx := o.Raw("select *"+ @@ -298,9 +300,9 @@ func UpdateSecNotice(sec *SecurityNotice) (secId int64, err error) { sec.Status = localSec.Status sec.ReferenceLink = localSec.ReferenceLink if num, err := o.Update(sec); err == nil { - logs.Info("update cve_security_notice success, SecId: ", num, "CveNum: ", sec.CveNum) + logs.Info("update cve_security_notice success, SecID: ", num, "CveNum: ", sec.CveNum) } else { - logs.Error("update cve_security_notice failed, SecId:", sec.SecId, "err: ", err) + logs.Error("update cve_security_notice failed, SecID:", sec.SecId, "err: ", err) return 0, err } return sec.SecId, nil @@ -308,7 +310,7 @@ func UpdateSecNotice(sec *SecurityNotice) (secId int64, err error) { logs.Info("查询 cve_security_notic err, cveId: ", sec.CveId, "err: ", err) var SecId int64 if SecId, err = o.Insert(sec); err == nil { - logs.Info("insert cve_security_notice success, SecId: ", SecId, "CveNum: ", sec.CveNum) + logs.Info("insert cve_security_notice success, SecID: ", SecId, "CveNum: ", sec.CveNum) } else { logs.Error("insert cve_security_notice failed, CveNum:", sec.CveNum, "err: ", err) return 0, err @@ -341,6 +343,7 @@ func UpdateIssueCommentId(issueNum, cveNum string, commentId int64) (id int64) { return } +//IssueExistByNumber Determine whether the issue exists func IssueExistByNumber(number string) bool { if number == "" { return false diff --git a/models/modeldb.go b/models/modeldb.go index ba9a96c..0b37dce 100644 --- a/models/modeldb.go +++ b/models/modeldb.go @@ -182,15 +182,15 @@ type IssueHooks struct { NoteEvent int8 `orm:"column(note_events);default(1)" description:"评论了Issue/代码等等, 默认1:已监听; 0: 未监听"` MergeRequestEvent int8 `orm:"column(merge_requests_events);default(1)" description:"合并请求和合并后, 默认1:已监听; 0: 未监听"` Status int8 `orm:"default(1);column(status)" description:"1:有效; 2:无效"` - CreateTime string `orm:"size(32);column(create_time)"` - UpdateTime string `orm:"size(32);column(update_time);null"` - DeleteTime string `orm:"size(32);column(delete_time);null"` + CreateTime string `orm:"size(32);column(create_time)"` + UpdateTime string `orm:"size(32);column(update_time);null"` + DeleteTime string `orm:"size(32);column(delete_time);null"` } type GitPackageTable struct { TableId int64 `orm:"pk;auto;column(table_id)"` TableName string `orm:"size(128);column(table_name)" description:"数据库pkginfo下的表名,如:mainline, bringInRely"` - Brands string `orm:"size(256);column(brands)" description:"对应分支信息"` + Brands string `orm:"size(256);column(brands)" description:"对应分支信息"` } type GitOpenEuler struct { @@ -218,13 +218,12 @@ type GitOpenEuler struct { } type GitOpenEulerTableRelate struct { - RelateId int64 `orm:"pk;auto;column(relate_id)"` - GitId int64 `orm:"index;column(git_id)" description:"GitOpenEuler,外键"` - Brands string `orm:"size(256);column(brands)" description:"对应分支信息"` + RelateId int64 `orm:"pk;auto;column(relate_id)"` + GitId int64 `orm:"index;column(git_id)" description:"GitOpenEuler,外键"` + Brands string `orm:"size(256);column(brands)" description:"对应分支信息"` TableName string `orm:"size(256);column(table_name)" description:"数据库pkginfo下的表名,如:mainline, bringInRely"` } - type GitPackageInfo struct { DetailId int64 `orm:"pk;auto;column(detail_id)"` GitId int64 `orm:"index;column(git_id)" description:"包id,外键"` @@ -272,28 +271,28 @@ type GitSubPackProvides struct { type GitSubPackRequiredby struct { Id int64 `orm:"pk;auto;column(id)"` - ProvideId int64 `orm:"index;column(provide_id)"description:"包id,外键"` + ProvideId int64 `orm:"index;column(provide_id)" description:" 包id,外键"` Requiredby string `orm:"size(256);column(requiredb)" description:"依赖该组件的二进制包列表"` } type OriginUpstream struct { CveId int64 `orm:"pk;auto;column(cve_id)"` - Ids string `orm:"size(256);column(cve_un_ids);unique"description:"唯一编号,根据此字段去重数据, 唯一识别码,可以填cve编号"` - CveNum string `orm:"size(256);column(cve_num);index"description:"cve编号"` - UpdateType string `orm:"size(32);column(update_type);"description:"数据上传类型:insert, update, delete"` - CvePackName string `orm:"size(512);column(cve_packname);index;null"description:"Cve在上游对应的包名"` - PackName string `orm:"size(512);column(git_packname);index;null"description:"Cve对应的openEuler包名称(或者影响的包名)"` - Title string `orm:"size(1024);column(cve_title);null"description:"标题"` - AffectProduct string `orm:"size(512);column(affect_porduct);null"description:"Cve影响的组件, 对应"` - CnnvdID string `orm:"size(256);column(cnnvd_id);null"description:"Cnnvd_id"` - CnvdID string `orm:"size(256);column(cnvd_id);null"description:"Cnvd_id"` - PublishedDate string `orm:"size(32);column(published_date);null"description:"漏洞发布日期"` - VulStatus string `orm:"size(64);column(vul_status);null"description:"漏洞状态,REJECT, DISPUTED"` - Status int8 `orm:"default(0);column(cve_status)"description:"0:cve新增;1:数据已变化;2:数据已处理"` - AffectedScope string `orm:"size(512);column(affected_scope);null"description:"影响范围推理"` + Ids string `orm:"size(256);column(cve_un_ids);unique" description:" 唯一编号,根据此字段去重数据, 唯一识别码,可以填cve编号"` + CveNum string `orm:"size(256);column(cve_num);index" description:"cve编号"` + UpdateType string `orm:"size(32);column(update_type);" description:"数据上传类型:insert, update, delete"` + CvePackName string `orm:"size(512);column(cve_packname);index;null" description:"Cve在上游对应的包名"` + PackName string `orm:"size(512);column(git_packname);index;null" description:"Cve对应的openEuler包名称(或者影响的包名)"` + Title string `orm:"size(1024);column(cve_title);null" description:"标题"` + AffectProduct string `orm:"size(512);column(affect_porduct);null" description:"Cve影响的组件, 对应"` + CnnvdID string `orm:"size(256);column(cnnvd_id);null" description:"Cnnvd_id"` + CnvdID string `orm:"size(256);column(cnvd_id);null" description:"Cnvd_id"` + PublishedDate string `orm:"size(32);column(published_date);null" description:"漏洞发布日期"` + VulStatus string `orm:"size(64);column(vul_status);null" description:"漏洞状态,REJECT, DISPUTED"` + Status int8 `orm:"default(0);column(cve_status)" description:"0:cve新增;1:数据已变化;2:数据已处理"` + AffectedScope string `orm:"size(512);column(affected_scope);null" description:"影响范围推理"` Version string `orm:"size(64);column(version);index" description:"包对应的版本号"` - AttackLink string `orm:"size(512);column(attack_link);null"description:"攻击链路推理"` - IsExit int8 `orm:"default(1);column(is_exit)"description:"1: 当前包对应在src-openEuler有对应仓库; 0: 无;2:临时值"` + AttackLink string `orm:"size(512);column(attack_link);null" description:"攻击链路推理"` + IsExit int8 `orm:"default(1);column(is_exit)" description:"1: 当前包对应在src-openEuler有对应仓库; 0: 无;2:临时值"` CreateTime string `orm:"size(32);column(create_time)"` UpdateTime string `orm:"size(32);column(update_time);null"` DeleteTime string `orm:"size(32);column(delete_time);null"` @@ -301,21 +300,21 @@ type OriginUpstream struct { type OriginUpstreamDesc struct { DescId int64 `orm:"pk;auto;column(desc_id)"` - CveId int64 `orm:"index;column(cve_id)"description:"OriginUpstream 外键"` - EnDescription string `orm:"size(8192);column(en_desc);null"description:"cve英文描述"` - ZhDescription string `orm:"size(8192);column(zh_desc);null"description:"cve中文描述"` + CveId int64 `orm:"index;column(cve_id)" description:"OriginUpstream 外键"` + EnDescription string `orm:"size(8192);column(en_desc);null" description:"cve英文描述"` + ZhDescription string `orm:"size(8192);column(zh_desc);null" description:"cve中文描述"` } type OriginUpstreamConfig struct { ConfId int64 `orm:"pk;auto;column(conf_id)"` - CveId int64 `orm:"index;column(cve_id)"description:"OriginUpstream 外键"` - Nodes string `orm:"size(32);column(nodes);null"description:"nodes数组"` + CveId int64 `orm:"index;column(cve_id)" description:"OriginUpstream 外键"` + Nodes string `orm:"size(32);column(nodes);null" description:"nodes数组"` } type OriginUpstreamConfigNode struct { NodeId int64 `orm:"pk;auto;column(node_id)"` - ConfId int64 `orm:"index;column(conf_id)"description:"OriginUpstreamConfig 外键"` - Operator string `orm:"size(256);column(operator);null"description:"operator"` + ConfId int64 `orm:"index;column(conf_id)" description:"OriginUpstreamConfig 外键"` + Operator string `orm:"size(256);column(operator);null" description:"operator"` } type SecurityReviewer struct { @@ -325,16 +324,16 @@ type SecurityReviewer struct { type OriginUpstreamConfigNodeCpe struct { CpeId int64 `orm:"pk;auto;column(cpe_id)"` - NodeId int64 `orm:"index;column(node_id)"description:"OriginUpstreamConfigNode 外键"` - Cpe23Uri string `orm:"size(1024);column(cpe_uri);null"description:"cpe"` - CpeMatchString string `orm:"size(1024);column(cpe_match);null"description:"过滤字符串"` - Vulnerable string `orm:"size(64);column(vulner_able);null"description:"易受攻击"` + NodeId int64 `orm:"index;column(node_id)" description:"OriginUpstreamConfigNode 外键"` + Cpe23Uri string `orm:"size(1024);column(cpe_uri);null" description:"cpe"` + CpeMatchString string `orm:"size(1024);column(cpe_match);null" description:"过滤字符串"` + Vulnerable string `orm:"size(64);column(vulner_able);null" description:"易受攻击"` } type OriginUpstreamImpact struct { ImpactId int64 `orm:"pk;auto;column(impact_id)"` - CveId int64 `orm:"index;column(cve_id)"description:"OriginUpstream 外键"` - Impact string `orm:"size(32);column(impact);null"description:"包含v2,v3评分数据"` + CveId int64 `orm:"index;column(cve_id)" description:"OriginUpstream 外键"` + Impact string `orm:"size(32);column(impact);null" description:"包含v2,v3评分数据"` } type OriginUpstreamImpactScore struct { @@ -352,19 +351,19 @@ type OriginUpstreamImpactScoreV3 struct { ScoreId int64 `orm:"index;column(score_id)" description:"OriginUpstreamImpactScore 外键"` BaseScore float64 `orm:"digits(10);decimals(1);column(base_score);null" description:"nvd 基准分"` VectorString string `orm:"size(256);column(vector_value);null" description:"nvd vector 评分向量值"` - AttackComplexity string `orm:"size(64);column(attack_complexity);null"description:"攻击复杂性"` - AttackVector string `orm:"size(64);column(attack_vector);null"description:"攻击目标"` - AvailabilityImpact string `orm:"size(64);column(availability_impact);null"description:"可用性影响"` - BaseSeverity string `orm:"size(64);column(base_severity);null"description:"严重程度"` - UserInteraction string `orm:"size(64);column(user_interaction);null"description:"用户交互"` - PrivilegesRequired string `orm:"size(64);column(privilege_required);null"description:"所需特权"` - Version string `orm:"size(64);column(version);null"description:"Cvss版本"` - ConfidentialityImpact string `orm:"size(64);column(confidentiality_impact);null"description:"可信性影响"` - IntegrityImpact string `orm:"size(64);column(integrity_impact);null"description:"完整性影响"` - Scope string `orm:"size(64);column(scope);null"description:"范围"` + AttackComplexity string `orm:"size(64);column(attack_complexity);null" description:"攻击复杂性"` + AttackVector string `orm:"size(64);column(attack_vector);null" description:"攻击目标"` + AvailabilityImpact string `orm:"size(64);column(availability_impact);null" description:"可用性影响"` + BaseSeverity string `orm:"size(64);column(base_severity);null" description:"严重程度"` + UserInteraction string `orm:"size(64);column(user_interaction);null" description:"用户交互"` + PrivilegesRequired string `orm:"size(64);column(privilege_required);null" description:"所需特权"` + Version string `orm:"size(64);column(version);null" description:"Cvss版本"` + ConfidentialityImpact string `orm:"size(64);column(confidentiality_impact);null" description:"可信性影响"` + IntegrityImpact string `orm:"size(64);column(integrity_impact);null" description:"完整性影响"` + Scope string `orm:"size(64);column(scope);null" description:"范围"` ImpactScore float64 `orm:"digits(10);decimals(1);column(impact_score);null" description:"nvd 影响评分"` ExploitabilityScore float64 `orm:"digits(10);decimals(1);column(exploitability_score);null" description:"nvd 可利用性评分"` - CveLevel string `orm:"size(32);column(cve_level);null"description:"致命(Critical) >= 9.0;严重(High)>=7.0&&<=8.9;中等(Medium)>4.0 && <=6.9;一般(Low)<=4.0;其他"` + CveLevel string `orm:"size(32);column(cve_level);null" description:"致命(Critical) >= 9.0;严重(High)>=7.0&&<=8.9;中等(Medium)>4.0 && <=6.9;一般(Low)<=4.0;其他"` } type OriginUpstreamImpactScoreV2 struct { @@ -373,72 +372,72 @@ type OriginUpstreamImpactScoreV2 struct { AcInsufInfo string `orm:"size(64);column(acinsuf_info);null" description:"nvd vector 原始值"` BaseScore float64 `orm:"digits(10);decimals(1);column(base_score);null" description:"nvd 基准分"` VectorString string `orm:"size(256);column(vector_value);null" description:"nvd vector 评分向量值"` - AccessComplexity string `orm:"size(64);column(access_complexity);null"description:"攻击复杂性"` - Authentication string `orm:"size(64);column(authentication);null"description:"身份认证"` - AvailabilityImpact string `orm:"size(64);column(availability_impact);null"description:"可用性影响"` - Version string `orm:"size(64);column(version);null"description:"Cvss版本"` - ConfidentialityImpact string `orm:"size(64);column(confidentiality_impact);null"description:"可信性影响"` - IntegrityImpact string `orm:"size(64);column(integrity_impact);null"description:"完整性影响"` - AccessVector string `orm:"size(64);column(access_vector);null"description:"攻击目标"` - UserInteractionRequired string `orm:"size(64);column(user_interaction_required);null"description:"需要用户交互"` - Severity string `orm:"size(64);column(severity);null"description:"严重程度"` - ObtainUserPrivilege string `orm:"size(64);column(obtain_user_privilege);null"description:"获取用户特权"` - ObtainAllPrivilege string `orm:"size(64);column(obtain_all_privilege);null"description:"获取所有特权"` - ObtainOtherPrivilege string `orm:"size(64);column(obtain_other_privilege);null"description:"获取其他特权"` + AccessComplexity string `orm:"size(64);column(access_complexity);null" description:"攻击复杂性"` + Authentication string `orm:"size(64);column(authentication);null" description:"身份认证"` + AvailabilityImpact string `orm:"size(64);column(availability_impact);null" description:"可用性影响"` + Version string `orm:"size(64);column(version);null" description:"Cvss版本"` + ConfidentialityImpact string `orm:"size(64);column(confidentiality_impact);null" description:"可信性影响"` + IntegrityImpact string `orm:"size(64);column(integrity_impact);null" description:"完整性影响"` + AccessVector string `orm:"size(64);column(access_vector);null" description:"攻击目标"` + UserInteractionRequired string `orm:"size(64);column(user_interaction_required);null" description:"需要用户交互"` + Severity string `orm:"size(64);column(severity);null" description:"严重程度"` + ObtainUserPrivilege string `orm:"size(64);column(obtain_user_privilege);null" description:"获取用户特权"` + ObtainAllPrivilege string `orm:"size(64);column(obtain_all_privilege);null" description:"获取所有特权"` + ObtainOtherPrivilege string `orm:"size(64);column(obtain_other_privilege);null" description:"获取其他特权"` ImpactScore float64 `orm:"digits(10);decimals(1);column(impact_score);null" description:"nvd 影响评分"` ExploitabilityScore float64 `orm:"digits(10);decimals(1);column(exploitability_score);null" description:"nvd 可利用性评分"` - CveLevel string `orm:"size(32);column(cve_level);null"description:"致命(Critical) >= 9.0;严重(High)>=7.0&&<=8.9;中等(Medium)>4.0 && <=6.9;一般(Low)<=4.0;其他"` + CveLevel string `orm:"size(32);column(cve_level);null" description:"致命(Critical) >= 9.0;严重(High)>=7.0&&<=8.9;中等(Medium)>4.0 && <=6.9;一般(Low)<=4.0;其他"` } type OriginUpstreamPoc struct { PocId int64 `orm:"pk;auto;column(poc_id)"` - CveId int64 `orm:"index;column(cve_id)"description:"OriginUpstream 外键"` - Source string `orm:"size(512);column(source);null"description:"来源"` - Date string `orm:"size(32);column(date);null"description:"日期"` - Path string `orm:"size(512);column(path);null"description:"文件路径"` - Dbindex string `orm:"size(512);column(dbindex);null"description:"数据库索引"` - Url string `orm:"size(512);column(url);null"description:"下载链接"` - Desc string `orm:"size(2048);column(desc);null"description:"说明"` + CveId int64 `orm:"index;column(cve_id)" description:"OriginUpstream 外键"` + Source string `orm:"size(512);column(source);null" description:"来源"` + Date string `orm:"size(32);column(date);null" description:"日期"` + Path string `orm:"size(512);column(path);null" description:"文件路径"` + Dbindex string `orm:"size(512);column(dbindex);null" description:"数据库索引"` + Url string `orm:"size(512);column(url);null" description:"下载链接"` + Desc string `orm:"size(2048);column(desc);null" description:"说明"` } type OriginUpstreamEvent struct { EventId int64 `orm:"pk;auto;column(event_id)"` - CveId int64 `orm:"index;column(cve_id)"description:"OriginUpstream 外键"` - Title string `orm:"size(512);column(title);null"description:"标题"` - Date string `orm:"size(32);column(date);null"description:"日期"` - Url string `orm:"size(512);column(url);null"description:"连接"` - Description string `orm:"size(2048);column(description);null"description:"说明"` + CveId int64 `orm:"index;column(cve_id)" description:"OriginUpstream 外键"` + Title string `orm:"size(512);column(title);null" description:"标题"` + Date string `orm:"size(32);column(date);null" description:"日期"` + Url string `orm:"size(512);column(url);null" description:"连接"` + Description string `orm:"size(2048);column(description);null" description:"说明"` } type OriginUpstreamReference struct { RefId int64 `orm:"pk;auto;column(ref_id)"` - CveId int64 `orm:"index;column(cve_id)"description:"OriginUpstream 外键"` - Name string `orm:"size(512);column(name);null"description:"名称"` - Refsource string `orm:"size(512);column(refsource);null"description:"参考来源"` - Url string `orm:"size(512);column(url);null"description:"链接"` - Tags string `orm:"size(2048);column(tags);null"description:"tags"` + CveId int64 `orm:"index;column(cve_id)" description:"OriginUpstream 外键"` + Name string `orm:"size(512);column(name);null" description:"名称"` + Refsource string `orm:"size(512);column(refsource);null" description:"参考来源"` + Url string `orm:"size(512);column(url);null" description:"链接"` + Tags string `orm:"size(2048);column(tags);null" description:"tags"` } type OriginUpstreamVulType struct { VulId int64 `orm:"pk;auto;column(vul_id)"` - CveId int64 `orm:"index;column(cve_id)"description:"OriginUpstream 外键"` - Cwe string `orm:"size(256);column(cwe);null"description:"Cwe编号"` - EnDesc string `orm:"size(2048);column(en_desc);null"description:"英文描述"` - ZhDesc string `orm:"size(2048);column(zh_desc);null"description:"中文描述"` + CveId int64 `orm:"index;column(cve_id)" description:"OriginUpstream 外键"` + Cwe string `orm:"size(256);column(cwe);null" description:"Cwe编号"` + EnDesc string `orm:"size(2048);column(en_desc);null" description:"英文描述"` + ZhDesc string `orm:"size(2048);column(zh_desc);null" description:"中文描述"` } type OriginUpstreamFixSuggest struct { FixId int64 `orm:"pk;auto;column(fix_id)"` - CveId int64 `orm:"index;column(cve_id)"description:"OriginUpstream 外键"` - Detail string `orm:"size(1024);column(detail);null"description:"细节"` + CveId int64 `orm:"index;column(cve_id)" description:"OriginUpstream 外键"` + Detail string `orm:"size(1024);column(detail);null" description:"细节"` } type OriginUpstreamFixSuggestRef struct { FixRefId int64 `orm:"pk;auto;column(fix_ref_id)"` - FixId int64 `orm:"index;column(fix_id)"description:"OriginUpstreamFixSuggest 外键"` - Refsource string `orm:"size(512);column(refsource);null"description:"参考文献,包含以下内容"` - Url string `orm:"size(1024);column(url);null"description:"链接"` - Name string `orm:"size(1024);column(name);null"description:"名称"` + FixId int64 `orm:"index;column(fix_id)" description:"OriginUpstreamFixSuggest 外键"` + Refsource string `orm:"size(512);column(refsource);null" description:"参考文献,包含以下内容"` + Url string `orm:"size(1024);column(url);null" description:"链接"` + Name string `orm:"size(1024);column(name);null" description:"名称"` } //GiteOriginIssue 码云上已经存在的issue @@ -458,7 +457,7 @@ type GiteOriginIssue struct { IssueType string `json:"issue_type" description:"issue 类型"` IssueExistTpl bool `json:"issue_exist_tpl" description:"此 issue 是否有对应的模板"` SecurityHole bool `json:"security_hole" description:"是否为安全漏洞"` - Status int8 `orm:"default(0);column(proc_status)"description:"0:cve新增;1:数据已变化;2:数据已处理"` + Status int8 `orm:"default(0);column(proc_status)" description:"0:cve新增;1:数据已变化;2:数据已处理"` IssueCreateAt time.Time `json:"issue_create_at" orm:"null" description:"issue 创建的时间"` IssueUpdateAt time.Time `json:"issue_update_at" orm:"null" description:"issue 更新的时间"` IssueFinishAt time.Time `json:"issue_finish_at" orm:"null" description:"issue 关闭的时间"` @@ -474,52 +473,50 @@ type OriginUpstreamFixSuggestRefTag struct { } type OriginExcel struct { - CveId int64 `orm:"pk;auto;column(cve_id)"` - CveNum string `orm:"size(256);column(cve_num)" description:"cve编号"` - CveUrl string `orm:"size(2048);column(cve_url);null" description:"cve下载链接"` - CveVersion string `orm:"size(256);column(cve_version);null" description:"漏洞归属版本"` - PackName string `orm:"size(128);column(pack_name);null" description:"包名"` - ScoreType string `orm:"size(16);column(score_type);null" description:"评分类型:v3"` - NVDScore float64 `orm:"digits(10);decimals(1);column(nvd_score);null" description:"nvd评分"` - CveLevel string `orm:"size(32);column(cve_level);null" description:"致命(Critical);严重(High);中等(Medium);一般(Low);其他"` - CveDesc string `orm:"size(4096);column(cve_desc);null" description:"漏洞简述"` - RepairTime string `orm:"size(32);column(repair_time);null" description:"cve发布时间"` - NVDVector string `orm:"size(256);column(vector_value);null" description:"nvd 评分向量"` - AttackVector string `orm:"size(256);column(attack_vector);null" description:"nvd 3.0评分"` - AccessVector string `orm:"size(256);column(access_vector);null" description:"nvd 2.0 评分"` - AttackComplexity string `orm:"size(64);column(attack_complexity);null"` - AccessComplexity string `orm:"size(64);column(access_complexity);null"` - PrivilegeRequired string `orm:"size(64);column(privilege_required);null"` - UserInteraction string `orm:"size(64);column(user_interaction);null"` - Scope string `orm:"size(64);column(scope);null"` - Confidentiality string `orm:"size(64);column(confidentiality);null"` - Integrity string `orm:"size(64);column(integrity);null"` - Availability string `orm:"size(64);column(availability);null"` - Authentication string `orm:"size(64);column(authentication);null"` - CveStatus int8 `orm:"default(0);column(cve_status);null" description:"0:未处理;1:已修改;2:已处理; 3: 数据错误,不做处理"` - CreateTime string `orm:"type(datetime);column(create_time);null"` - UpdateTime string `orm:"type(datetime);column(update_time);null"` - DeleteTime string `orm:"type(datetime);column(delete_time);null"` - + CveId int64 `orm:"pk;auto;column(cve_id)"` + CveNum string `orm:"size(256);column(cve_num)" description:"cve编号"` + CveUrl string `orm:"size(2048);column(cve_url);null" description:"cve下载链接"` + CveVersion string `orm:"size(256);column(cve_version);null" description:"漏洞归属版本"` + PackName string `orm:"size(128);column(pack_name);null" description:"包名"` + ScoreType string `orm:"size(16);column(score_type);null" description:"评分类型:v3"` + NVDScore float64 `orm:"digits(10);decimals(1);column(nvd_score);null" description:"nvd评分"` + CveLevel string `orm:"size(32);column(cve_level);null" description:"致命(Critical);严重(High);中等(Medium);一般(Low);其他"` + CveDesc string `orm:"size(4096);column(cve_desc);null" description:"漏洞简述"` + RepairTime string `orm:"size(32);column(repair_time);null" description:"cve发布时间"` + NVDVector string `orm:"size(256);column(vector_value);null" description:"nvd 评分向量"` + AttackVector string `orm:"size(256);column(attack_vector);null" description:"nvd 3.0评分"` + AccessVector string `orm:"size(256);column(access_vector);null" description:"nvd 2.0 评分"` + AttackComplexity string `orm:"size(64);column(attack_complexity);null"` + AccessComplexity string `orm:"size(64);column(access_complexity);null"` + PrivilegeRequired string `orm:"size(64);column(privilege_required);null"` + UserInteraction string `orm:"size(64);column(user_interaction);null"` + Scope string `orm:"size(64);column(scope);null"` + Confidentiality string `orm:"size(64);column(confidentiality);null"` + Integrity string `orm:"size(64);column(integrity);null"` + Availability string `orm:"size(64);column(availability);null"` + Authentication string `orm:"size(64);column(authentication);null"` + CveStatus int8 `orm:"default(0);column(cve_status);null" description:"0:未处理;1:已修改;2:已处理; 3: 数据错误,不做处理"` + CreateTime string `orm:"type(datetime);column(create_time);null"` + UpdateTime string `orm:"type(datetime);column(update_time);null"` + DeleteTime string `orm:"type(datetime);column(delete_time);null"` } - type GitRepoGroups struct { - GroupId int64 `orm:"pk;auto;column(group_id)"` + GroupId int64 `orm:"pk;auto;column(group_id)"` GroupName string `orm:"index"` } //GiteRepo 码云仓库 type GiteRepo struct { - RepoId int64 `orm:"pk;auto;column(repo_id)"` - GroupId int64 `orm:"index;column(group_id)"description:"GitRepoGroups 外键"` - OrgId int64 - OrgPath string `orm:"size(128);column(org_path);null" description:"组织名称"` - Path string `orm:"size(512);column(path);null" description:"仓库名称"` - Status int8 `orm:"default(0);column(status);null" description:"1: 正常;2:已删除"` - Public bool - Private bool - Fork bool + RepoId int64 `orm:"pk;auto;column(repo_id)"` + GroupId int64 `orm:"index;column(group_id)" description:"GitRepoGroups 外键"` + OrgId int64 + OrgPath string `orm:"size(128);column(org_path);null" description:"组织名称"` + Path string `orm:"size(512);column(path);null" description:"仓库名称"` + Status int8 `orm:"default(0);column(status);null" description:"1: 正常;2:已删除"` + Public bool + Private bool + Fork bool CreateTime string `orm:"type(datetime);column(create_time);null"` UpdateTime string `orm:"type(datetime);column(update_time);null"` DeleteTime string `orm:"type(datetime);column(delete_time);null"` @@ -527,10 +524,10 @@ type GiteRepo struct { //GiteMember 码云仓库成员 type GiteRepoMember struct { - MemBerId int64 `orm:"pk;auto;column(repo_id)"` - GroupId int64 `orm:"index;column(group_id)"description:"GitRepoGroups 外键"` + MemBerId int64 `orm:"pk;auto;column(repo_id)"` + GroupId int64 `orm:"index;column(group_id)" description:"GitRepoGroups 外键"` MemberName string `orm:"size(512);column(member_name);null" description:"成员名称"` - MemberType string `orm:"size(128);column(member_type);null" description:"Maintainer;Committer"` + MemberType string `orm:"size(128);column(member_type);null" description:"Maintainer;Committer"` CreateTime string `orm:"type(datetime);column(create_time);null"` UpdateTime string `orm:"type(datetime);column(update_time);null"` DeleteTime string `orm:"type(datetime);column(delete_time);null"` @@ -539,7 +536,7 @@ type GiteRepoMember struct { //GiteRepoBranch 码云仓库分支 type GiteRepoBranch struct { Id int64 `orm:"pk;auto"` - RepoId int64 `orm:"index;column(repo_id)"description:"GiteRepo 外键"` + RepoId int64 `orm:"index;column(repo_id)" description:"GiteRepo 外键"` ProtectionUrl string Name string Protected string @@ -563,7 +560,7 @@ func CreateDb() bool { orm.RegisterModelWithPrefix(prefix, new(OtherUser), new(AdminUser), new(VulnCenter), new(OpenEulerSA), new(Score), new(SecurityNotice), new(Package), new(IssueTemplate), new(ScoreRecord), new(IssueHooks), - new(GitPackageTable), new(GitOpenEuler), new(GitPackageInfo), new(GitSubPack),new(GitOpenEulerTableRelate), + new(GitPackageTable), new(GitOpenEuler), new(GitPackageInfo), new(GitSubPack), new(GitOpenEulerTableRelate), new(SecurityReviewer), new(GitSubPackRequire), new(GitSubPackProvides), new(GitSubPackRequiredby), new(IpWhite), new(OriginUpstream), new(OriginUpstreamDesc), new(OriginUpstreamConfig), new(OriginUpstreamConfigNode), @@ -571,9 +568,9 @@ func CreateDb() bool { new(OriginUpstreamImpactScoreV3), new(OriginUpstreamImpactScoreV2), new(OriginUpstreamPoc), new(OriginUpstreamEvent), new(OriginUpstreamReference), new(OriginUpstreamVulType), new(OriginUpstreamFixSuggest), new(OriginUpstreamFixSuggestRefTag), - new(OriginUpstreamFixSuggestRef), new(GiteOriginIssue), new(OriginExcel), new(ExportRecord),new(GitRepoGroups), - new(GiteRepo),new(GiteRepoMember),new(GiteRepoBranch), - ) + new(OriginUpstreamFixSuggestRef), new(GiteOriginIssue), new(OriginExcel), new(ExportRecord), new(GitRepoGroups), + new(GiteRepo), new(GiteRepoMember), new(GiteRepoBranch), + ) logs.Info("table create success!") errosyn := orm.RunSyncdb("default", false, true) if errosyn != nil { diff --git a/models/user.go b/models/user.go index d4bebb2..99dbfc5 100644 --- a/models/user.go +++ b/models/user.go @@ -40,7 +40,7 @@ func GetUser(uid string) (u *User, err error) { if u, ok := UserList[uid]; ok { return u, nil } - return nil, errors.New("User not exists") + return nil, errors.New(" User not exists") } func GetAllUsers() map[string]*User { @@ -69,7 +69,7 @@ func UpdateUser(uid string, uu *User) (a *User, err error) { } return u, nil } - return nil, errors.New("User Not Exist") + return nil, errors.New(" User Not Exist") } func Login(username, password string) bool { diff --git a/models/ymal.go b/models/ymal.go index 8313eff..c96fa7a 100644 --- a/models/ymal.go +++ b/models/ymal.go @@ -229,7 +229,7 @@ func CreateYamlSubPackRequiredb(gs *GitSubPackRequiredby) (Id int64, typex strin // 创建 var Id int64 if Id, err = o.Insert(gs); err == nil { - logs.Info("insert cve_git_sub_pack_requiredby success, Id: ", Id, "requiredb: ", gs.Requiredby) + logs.Info("insert cve_git_sub_pack_requiredby success, ID: ", Id, "requiredb: ", gs.Requiredby) } else { logs.Error("insert cve_git_sub_pack_requiredby failed, ", "requiredb: ", gs.Requiredby, "err: ", err) return 0, "insert", err diff --git a/task/cve.go b/task/cve.go index 0bb41ba..3854eaf 100644 --- a/task/cve.go +++ b/task/cve.go @@ -8,25 +8,27 @@ import ( "github.com/astaxie/beego/logs" ) -func ProcCveOriginData(prcnum, days , openeulernum int, cveRef, owner string)(bool, error) { +//ProcCveOriginData 处理api获取的原始数据 +func ProcCveOriginData(prcNum, days , openeulerNum int, cveRef, owner string)(bool, error) { // 处理api获取的原始数据 - ok, err := taskhandler.GetCveOriginData(prcnum, days, openeulernum, cveRef) + ok, err := taskhandler.GetCveOriginData(prcNum, days, openeulerNum, cveRef) if !ok { logs.Error("接口上的原始数据处理失败(GetCveOriginData), err: ", err) } // 处理excel的原始数据 - okx, errx := taskhandler.GetCveOriginExcelData(prcnum, days, openeulernum, cveRef) + okx, err := taskhandler.GetCveOriginExcelData(prcNum, days, openeulerNum, cveRef) if !okx { - logs.Error("excel数据处理失败(GetCveOriginExcelData), errx: ", errx) + logs.Error("excel数据处理失败(GetCveOriginExcelData), errx: ", err) } // 兼容已创建的issue数据 - oki, erri := taskhandler.GetCveIssueData(prcnum, days, openeulernum, cveRef, owner) + oki, err := taskhandler.GetCveIssueData(prcNum, days, openeulerNum, cveRef, owner) if !oki { - logs.Error("issue数据处理失败(GetCveIssueData), erri: ", erri) + logs.Error("issue数据处理失败(GetCveIssueData), erri: ", err) } return true, nil } +//ParamsCveOriginData 处理cve原始数据 func ParamsCveOriginData() error{ defer common.Catchs() // 查询需要处理的cve, 1:新增;2:修改 diff --git a/task/genexcel.go b/task/genexcel.go index 05f3454..db53e82 100644 --- a/task/genexcel.go +++ b/task/genexcel.go @@ -1,4 +1,3 @@ -// Issues that have been normally closed are exported to excel files package task import ( @@ -9,6 +8,7 @@ import ( "github.com/astaxie/beego/logs" ) +//GenExcelData generate excel data func GenExcelData() error{ defer common.Catchs() // 查询需要处理的cve, 1:新增;2:修改 diff --git a/task/grabissue.go b/task/grabissue.go index cb84268..a7ea7d5 100644 --- a/task/grabissue.go +++ b/task/grabissue.go @@ -9,6 +9,7 @@ import ( "os" ) +//GetIssueData get the issue data func GetIssueData() error{ defer common.Catchs() // 查询需要处理的cve, 1:新增;2:修改 diff --git a/task/inittask.go b/task/inittask.go index 648bb6c..453838a 100644 --- a/task/inittask.go +++ b/task/inittask.go @@ -6,9 +6,10 @@ import ( "github.com/astaxie/beego/toolbox" ) -func CheckOriCveTask(oricvecheck string, ch *chan bool) { +//CheckOriCveTask 校验原始cve数据 +func CheckOriCveTask(oriCveCheck string, ch *chan bool) { logs.Info("校验原始cve数据 task start") - CheckTask := toolbox.NewTask("CheckOriCve", oricvecheck, CheckOriCve) + CheckTask := toolbox.NewTask("CheckOriCve", oriCveCheck, CheckOriCve) err := CheckTask.Run() if err != nil { logs.Error("创建校验原始cve数据失败 ,err:", err) @@ -22,9 +23,10 @@ func CheckOriCveTask(oricvecheck string, ch *chan bool) { //defer toolbox.StopTask() } -func InitYamlTask(getymal string, ch *chan bool) { +//InitYamlTask 获取yaml数据源 +func InitYamlTask(getYaml string, ch *chan bool) { logs.Info("获取yaml数据源 task start") - YamlTask := toolbox.NewTask("GetYamlData", getymal, GetYamlData) + YamlTask := toolbox.NewTask("GetYamlData", getYaml, GetYamlData) err := YamlTask.Run() if err != nil { logs.Error("创建获取yaml数据源任务失败 ,err:", err) @@ -38,9 +40,10 @@ func InitYamlTask(getymal string, ch *chan bool) { //defer toolbox.StopTask() } -func InitCveTask(getcve string, ch *chan bool) { +//InitCveTask 将cve原始数据生成cve库 +func InitCveTask(getCve string, ch *chan bool) { logs.Info("将cve原始数据生成cve库 task start") - CveTask := toolbox.NewTask("ParamsCveOriginData", getcve, ParamsCveOriginData) + CveTask := toolbox.NewTask("ParamsCveOriginData", getCve, ParamsCveOriginData) err := CveTask.Run() if err != nil { logs.Error("创建Cve任务失败 ,err:", err) @@ -54,10 +57,11 @@ func InitCveTask(getcve string, ch *chan bool) { //defer toolbox.StopTask() } -func InitIssueTask(getissue string, ch *chan bool) { +//InitIssueTask 获取已经创建的issue数据源 +func InitIssueTask(getIssue string, ch *chan bool) { logs.Info("获取已经创建的issue数据源 task start") //taskhandler.GrabIssueByOrg("8457c66db66955376519059b97e33dd1","src-openeuler") - issueTask := toolbox.NewTask("GetIssueData", getissue, GetIssueData) + issueTask := toolbox.NewTask("GetIssueData", getIssue, GetIssueData) err := issueTask.Run() if err != nil { logs.Error("获取已经创建的issue数据源任务失败 ,err:", err) @@ -71,9 +75,10 @@ func InitIssueTask(getissue string, ch *chan bool) { //defer toolbox.StopTask() } -func InitIssueToken(issueoath string, ch *chan bool) { +//InitIssueToken 执行获取token任务开始 +func InitIssueToken(issueOath string, ch *chan bool) { logs.Info("执行获取token任务开始") - TokenTask := toolbox.NewTask("GetGiteeToken", issueoath, GetGiteeToken) + TokenTask := toolbox.NewTask("GetGiteeToken", issueOath, GetGiteeToken) err := TokenTask.Run() if err != nil { logs.Error("create Issue token task failed ,err:", err) @@ -87,6 +92,7 @@ func InitIssueToken(issueoath string, ch *chan bool) { //defer toolbox.StopTask() } +//CreatTask 执行创建issue任务开始 func CreatTask(createIssue string, ch *chan bool) { logs.Info("执行创建issue任务开始") cIssueTask := toolbox.NewTask("CreateIssue", createIssue, CreateIssue) @@ -103,6 +109,7 @@ func CreatTask(createIssue string, ch *chan bool) { //defer toolbox.StopTask() } +//GenSAExcelTask 执行issue生成excel任务开始 func GenSAExcelTask(genExcel string, ch *chan bool) { logs.Info("执行issue生成excel任务开始") genExcelTask := toolbox.NewTask("GenExcelData", genExcel, GenExcelData) @@ -119,7 +126,7 @@ func GenSAExcelTask(genExcel string, ch *chan bool) { //defer toolbox.StopTask() } -// 定时任务初始化 +//InitTask 定时任务初始化 func InitTask() { BConfig, err := config.NewConfig("ini", "conf/app.conf") if err != nil { diff --git a/task/issuetask.go b/task/issuetask.go index 8d04fd6..de3c812 100644 --- a/task/issuetask.go +++ b/task/issuetask.go @@ -12,23 +12,23 @@ import ( "strings" ) - -func GetGiteeToken() error{ +//GetGiteeToken 获取码云API TOKEN +func GetGiteeToken() error { defer common.Catchs() // 查询需要处理的cve, 1:新增;2:修改 BConfig, err := config.NewConfig("ini", "conf/app.conf") - if err != nil{ + if err != nil { logs.Error("config init error:", err) return err } - clientId := BConfig.String("gitee::client_id") - if clientId == "" { - logs.Error("config gitee::clientId error: invalid value is ",clientId) + clientID := BConfig.String("gitee::client_id") + if clientID == "" { + logs.Error("config gitee::clientID error: invalid value is ", clientID) return errors.New("value is nil") } clientSecret := beego.AppConfig.String("gitee::client_secret") - if clientSecret == "" { - logs.Error("config gitee::clientSecret error: invalid value is ",clientSecret) + if clientSecret == "" { + logs.Error("config gitee::clientSecret error: invalid value is ", clientSecret) return errors.New("value is nil") } @@ -48,24 +48,24 @@ func GetGiteeToken() error{ logs.Error("config gitee::scope error: value is nil") return errors.New("value is nil") } - logs.Info(clientId,clientSecret,password) + logs.Info(clientID, clientSecret, password) var gt taskhandler.GiteeToken gt.GrantType = "password" gt.UserName = Email gt.Password = password - gt.ClientId = clientId + gt.ClientID = clientID gt.ClientSecret = clientSecret gt.Scope = Scope taskhandler.GetOautToken(gt) return nil } - -func CreateIssue() error{ +//CreateIssue 创建issue +func CreateIssue() error { defer common.Catchs() // 查询需要处理的cve, 1:新增;2:修改 BConfig, err := config.NewConfig("ini", "conf/app.conf") - if err != nil{ + if err != nil { logs.Error("config init error:", err) return err } @@ -81,7 +81,7 @@ func CreateIssue() error{ } beforeTime := common.GetBeforeTime(days) cveData, err := models.QueryIssue(beforeTime, prcnum) - if err == nil && len(cveData) > 0{ + if err == nil && len(cveData) > 0 { logs.Info(cveData) } else { logs.Info("无cve数据可以使用, 当前时间: ", common.GetCurTime()) @@ -114,7 +114,7 @@ func CreateIssue() error{ } // 处理每一条cve数据 if issueValue.Status == 0 { - err := ProcIssue(issueValue , accessToken, owner, path) + err := ProcIssue(issueValue, accessToken, owner, path) if err != nil { logs.Error("创建issue失败, cvenum: ", issueValue.CveNum, "err,err: ", err) continue @@ -130,7 +130,8 @@ func CreateIssue() error{ return nil } -func ProcUpdateIssue(issueValue models.VulnCenter, accessToken, owner, path string) error{ +//ProcUpdateIssue 更新issue +func ProcUpdateIssue(issueValue models.VulnCenter, accessToken, owner, path string) error { // 查询修改评分 sr, err := models.QueryIssueScoreRecord(issueValue.CveId, 0) if err != nil { @@ -151,24 +152,25 @@ func ProcUpdateIssue(issueValue models.VulnCenter, accessToken, owner, path stri issueValue, lit) if err != nil { logs.Error("更新issue 模板失败, cveId: ", issueValue.CveId, "err: ", err) - return err + return err } // 更新issue状态 models.UpdateIssueStatus(issueValue, 2) // 更新分数状态 models.UpdateIssueScore(issueValue, 2) - templetId, err := models.CreateIssueTemplet(&lit) + templetID, err := models.CreateIssueTemplate(&lit) if err != nil { logs.Error("修改issue模板失败, cveId: ", issueValue.CveId, "err: ", err) return err } models.UpdateIssueScoreRe(issueValue, 1) - logs.Info("更新issue模板成功,cveId: ", issueValue.CveId, "templetId: ", templetId) + logs.Info("更新issue模板成功,cveId: ", issueValue.CveId, "templetID: ", templetID) } return nil } -func ProcIssue(issueValue models.VulnCenter, accessToken, owner, path string) error{ +//ProcIssue 处理issue +func ProcIssue(issueValue models.VulnCenter, accessToken, owner, path string) error { assignee := "" brandArry := []string{} sn, err := models.QueryIssueSecurity(issueValue.CveId) @@ -177,7 +179,7 @@ func ProcIssue(issueValue models.VulnCenter, accessToken, owner, path string) er logs.Info("查询安全信息:sn: ", sn) // 获取issue处理人 gitYaml, ok := models.QueryCveOpeneulerdata(issueValue.PackName, issueValue.CveVersion) - if !ok || gitYaml.MainTainer == "" || len(gitYaml.MainTainer) < 1{ + if !ok || gitYaml.MainTainer == "" || len(gitYaml.MainTainer) < 1 { assignee, err = taskhandler.GetCollaboratorInfo(accessToken, owner, path) if assignee == "" { logs.Error("获取仓库: owner:", owner, "path:", path, "分析人失败", "err:", err, "cveid: ", issueValue.CveId) @@ -187,7 +189,7 @@ func ProcIssue(issueValue models.VulnCenter, accessToken, owner, path string) er assignee = gitYaml.MainTainer // 查询受影响的分支信息 gt, errgt := models.QueryCveBrands(gitYaml.GitId) - if errgt == nil{ + if errgt == nil { for _, t := range gt { if t.Brands != "" && t.Brands != "master" && len(t.Brands) > 1 { brandArry = append(brandArry, t.Brands) @@ -214,7 +216,7 @@ func ProcIssue(issueValue models.VulnCenter, accessToken, owner, path string) er } } if branchs != "" && len(branchs) > 1 { - branchs = branchs[:len(branchs) - 1] + branchs = branchs[:len(branchs)-1] } } else { branchs, errBrands = taskhandler.GetBranchesInfo(accessToken, owner, path) @@ -231,19 +233,11 @@ func ProcIssue(issueValue models.VulnCenter, accessToken, owner, path string) er // 存储安全公告相关信息 var sec models.SecurityNotice taskhandler.CreateSecNoticeData(&sec, issueValue, path, branchs) - secId, err := models.UpdateSecNotice(&sec) + secID, err := models.UpdateSecNotice(&sec) if err != nil { logs.Error("更新安全信息失败,CveNum: ", issueValue.CveNum, "path: ", path, "err: ", err) return err - } else { - logs.Info("更新安全信息成功, secId: ", secId, "cveNum: ", issueValue.CveNum) } + logs.Info("更新安全信息成功, secID: ", secID, "cveNum: ", issueValue.CveNum) return nil } - - - - - - - diff --git a/task/oricvecheck.go b/task/oricvecheck.go index a229341..4b0cee6 100644 --- a/task/oricvecheck.go +++ b/task/oricvecheck.go @@ -8,21 +8,22 @@ import ( "github.com/astaxie/beego/logs" ) -func CheckOriCve() error{ +//CheckOriCve 检查原始数据的CVE +func CheckOriCve() error { defer common.Catchs() // 查询需要处理的cve, 1:新增;2:修改 BConfig, err := config.NewConfig("ini", "conf/app.conf") - if err != nil{ + if err != nil { logs.Error("config init error:", err) return err } // 单次处理的数据量 - prcnum, err := BConfig.Int("crontab::prcnum") + prcNum, err := BConfig.Int("crontab::prcNum") if err != nil { - logs.Error("config crontab::prcnum error: invalid value is ",prcnum) + logs.Error("config crontab::prcNum error: invalid value is ", prcNum) return errors.New("value is nil") } // 获取表的数据源 - _, errx := taskhandler.CheckCveOriginData(prcnum) - return errx -} \ No newline at end of file + _, err = taskhandler.CheckCveOriginData(prcNum) + return err +} diff --git a/task/yaml.go b/task/yaml.go index cc2951c..57c9c33 100644 --- a/task/yaml.go +++ b/task/yaml.go @@ -8,24 +8,25 @@ import ( "github.com/astaxie/beego/logs" ) -func GetYamlData() error{ +//GetYamlData 获取yaml数据源 +func GetYamlData() error { defer common.Catchs() // 查询需要处理的cve, 1:新增;2:修改 BConfig, err := config.NewConfig("ini", "conf/app.conf") - if err != nil{ + if err != nil { logs.Error("config init error:", err) return err } apiUrl := BConfig.String("yaml::apiurl") if apiUrl == "" { - logs.Error("config yaml::apiurl error: invalid value is ",apiUrl) + logs.Error("config yaml::apiurl error: invalid value is ", apiUrl) return errors.New("value is nil") } // 获取表的数据源 - _, errx := taskhandler.GetYamlTables(apiUrl) + _, err = taskhandler.GetYamlTables(apiUrl) // 获取yaml - if errx == nil { - _, errx = taskhandler.GetYamlByGit(apiUrl) + if err == nil { + _, err = taskhandler.GetYamlByGit(apiUrl) } - return errx + return err } diff --git a/taskhandler/assist.go b/taskhandler/assist.go index b5c187d..fc2c72b 100644 --- a/taskhandler/assist.go +++ b/taskhandler/assist.go @@ -13,15 +13,15 @@ import ( func GetOautToken(gt GiteeToken) { url := "https://gitee.com/oauth/token" var req util.RequestInfo - req.Url = url + req.URL = url req.Data = make(map[string]string) req.Data["grant_type"] = gt.GrantType req.Data["username"] = gt.UserName req.Data["password"] = gt.Password - req.Data["client_id"] = gt.ClientId + req.Data["client_id"] = gt.ClientID req.Data["client_secret"] = gt.ClientSecret req.Data["scope"] = gt.Scope - resp, err := util.PostUrlEncoded(req) + resp, err := util.PostURLEncoded(req) if err != nil { logs.Error("获取 token 失败,url: ", url, "请求参数:", gt, "err:", err) return @@ -44,7 +44,7 @@ func GetOautToken(gt GiteeToken) { func GetCollaboratorInfo(accessToken string, owner string, path string) (string, error){ if accessToken != "" && owner != "" && path !="" { url := "https://gitee.com/api/v5/repos/" + owner + "/" + path + "/collaborators?access_token=" + accessToken - collabor, err:= util.HttpGet(url) + collabor, err:= util.HTTPGet(url) if err == nil && collabor != nil { for _, value := range collabor { if _, ok := value["id"]; !ok { @@ -82,7 +82,7 @@ func GetBranchesInfo(accessToken string, owner string, path string) (string, err branchName := "" if accessToken != "" && owner != "" && path != "" { url := "https://gitee.com/api/v5/repos/"+ owner +"/"+ path +"/branches?access_token=" + accessToken - branch, err:= util.HttpGet(url) + branch, err:= util.HTTPGet(url) if err == nil && branch != nil { for _, value := range(branch) { if _, ok := value["name"]; !ok { diff --git a/taskhandler/comment.go b/taskhandler/comment.go index 4f61df6..a1e2822 100644 --- a/taskhandler/comment.go +++ b/taskhandler/comment.go @@ -6,20 +6,22 @@ import ( "github.com/astaxie/beego/logs" ) +//AddCommentToIssue Add a comment to the issue func AddCommentToIssue(msg,issueNum,owner,repo ,access string) { url := fmt.Sprintf(`https://gitee.com/api/v5/repos/%v/%v/issues/%v/comments`,owner,repo,issueNum) param := fmt.Sprintf(`{"access_token": "%s","body":"%s"}`,access,msg) - res, err := util.HttpPost(url, param) + res, err := util.HTTPPost(url, param) if err != nil { logs.Error(err) } logs.Info("添加评论返回:",res) } +//SendPrivateLetters Send a private message to a gitee user func SendPrivateLetters(access,content,useName string) { url := "https://gitee.com/api/v5/notifications/messages" param := fmt.Sprintf(`{"access_token":"%s","username":"%s","content":"%s"}`,access,useName,content) - res,err := util.HttpPost(url,param) + res,err := util.HTTPPost(url,param) if err != nil { logs.Error(err) } diff --git a/taskhandler/common.go b/taskhandler/common.go index 8ff8d69..aba4b09 100644 --- a/taskhandler/common.go +++ b/taskhandler/common.go @@ -13,7 +13,7 @@ type GiteeToken struct { GrantType string UserName string Password string - ClientId string + ClientID string ClientSecret string Scope string } @@ -32,7 +32,7 @@ const bodyTpl = `一、漏洞信息 %v openEuler评分: %v - 受影响的版本排查(受影响/不受影响): + 受影响版本排查(受影响/不受影响): %v ` @@ -51,7 +51,7 @@ const bodyUpTpl = `一、漏洞信息 openEuler评分: %v Vector:CVSS:%v - 受影响的版本排查(受影响/不受影响): + 受影响版本排查(受影响/不受影响): %v ` @@ -286,14 +286,14 @@ type GitTablePackCount struct { func CreateIssueBody(accessToken string, owner string, path string, assignee string, cve models.VulnCenter, sc models.Score, openEulerScore, score, labels string, - its models.IssueTemplate, flag int, issueType, pkgLink string, brandArry []string) string { + its models.IssueTemplate, flag int, issueType, pkgLink string, brandArray []string) string { requestBody := "" - scoretype := "" + scoreType := "" affectedVersion := "" if sc.ScoreType == "v2" { - scoretype = "2.0" + scoreType = "2.0" } else { - scoretype = "3.0" + scoreType = "3.0" } floatOpenEulerScore, err := strconv.ParseFloat(openEulerScore, 64) if err != nil { @@ -319,8 +319,8 @@ func CreateIssueBody(accessToken string, owner string, path string, assignee str } } if flag == 1 { - if len(brandArry) > 0 { - for i, brand := range brandArry { + if len(brandArray) > 0 { + for i, brand := range brandArray { if brand == "" || len(brand) < 2 { continue } @@ -332,19 +332,19 @@ func CreateIssueBody(accessToken string, owner string, path string, assignee str if floatOpenEulerScore > 0.0 || (its.OpenEulerVector != "" && len(its.OpenEulerVector) > 1) { cveNumber := "[" + cve.CveNum + "](https://nvd.nist.gov/vuln/detail/" + cve.CveNum + ")" nveScore := score + " " + cve.CveLevel - nveVector := scoretype + "/" + sc.NvectorVule - oVector := scoretype + "/" + its.OpenEulerVector - body := fmt.Sprintf(bodyUpTpl, cveNumber, path, cve.CveVersion, scoretype, nveScore, nveVector, + nveVector := scoreType + "/" + sc.NvectorVule + oVector := scoreType + "/" + its.OpenEulerVector + body := fmt.Sprintf(bodyUpTpl, cveNumber, path, cve.CveVersion, scoreType, nveScore, nveVector, cve.Description, cveAnalysis, openEulerScore, oVector, affectedVersion) /*body := "一、漏洞信息" + "
漏洞编号: " + "[" + cve.CveNum + "](https://nvd.nist.gov/vuln/detail/" + cve.CveNum + ")" + "
" + "
漏洞归属组件: " + path + "
" + - "
漏洞归属的版本: " + cve.CveVersion + "
" + "
CVSS V" + scoretype + "分值:
" + + "
漏洞归属的版本: " + cve.CveVersion + "
" + "
CVSS V" + scoreType + "分值:
" + "
BaseScore: " + score + " " + cve.CveLevel + "
" + - "
Vector: CVSS:" + scoretype + "/" + sc.NvectorVule + "
" + "
漏洞简述:
" + + "
Vector: CVSS:" + scoreType + "/" + sc.NvectorVule + "
" + "
漏洞简述:
" + "
" + cve.Description + "
" + "
二、漏洞分析结构反馈
" + "
影响性分析说明:
" + "
" + cveAnalysis + "
" + "
openEuler评分:
" + "
" + openEulerScore + "
" + - "
Vector: CVSS:" + scoretype + "/" + its.OpenEulerVector + "
" + + "
Vector: CVSS:" + scoreType + "/" + its.OpenEulerVector + "
" + "
受影响版本排查(受影响/不受影响):
" + affectedVersion + "



"*/ requestBody = fmt.Sprintf(`{ "access_token": "%s", @@ -359,10 +359,9 @@ func CreateIssueBody(accessToken string, owner string, path string, assignee str } else { cveNumber := "[" + cve.CveNum + "](https://nvd.nist.gov/vuln/detail/" + cve.CveNum + ")" nveScore := score + " " + cve.CveLevel - nveVector := scoretype + "/" + sc.NvectorVule - //oVector := scoretype + "/" + its.OpenEulerVector + nveVector := scoreType + "/" + sc.NvectorVule openEulerScore = " " - body := fmt.Sprintf(bodyTpl, cveNumber, path, cve.CveVersion, scoretype, nveScore, nveVector, + body := fmt.Sprintf(bodyTpl, cveNumber, path, cve.CveVersion, scoreType, nveScore, nveVector, cve.Description, cveAnalysis, openEulerScore, affectedVersion) requestBody = fmt.Sprintf(`{ "access_token": "%s", @@ -377,8 +376,8 @@ func CreateIssueBody(accessToken string, owner string, path string, assignee str } } else if flag == 2 { - if len(brandArry) > 0 { - for i, brand := range brandArry { + if len(brandArray) > 0 { + for i, brand := range brandArray { if brand == "" || len(brand) < 2 { continue } @@ -389,10 +388,9 @@ func CreateIssueBody(accessToken string, owner string, path string, assignee str } cveNumber := "[" + cve.CveNum + "](https://nvd.nist.gov/vuln/detail/" + cve.CveNum + ")" nveScore := score + " " + cve.CveLevel - nveVector := scoretype + "/" + sc.NvectorVule - //oVector := scoretype + "/" + its.OpenEulerVector + nveVector := scoreType + "/" + sc.NvectorVule openEulerScore = " " - body := fmt.Sprintf(bodyTpl, cveNumber, path, cve.CveVersion, scoretype, nveScore, nveVector, + body := fmt.Sprintf(bodyTpl, cveNumber, path, cve.CveVersion, scoreType, nveScore, nveVector, cve.Description, cveAnalysis, openEulerScore, affectedVersion) requestBody = fmt.Sprintf(`{ "access_token": "%s", @@ -422,9 +420,9 @@ func CreateIssueBody(accessToken string, owner string, path string, assignee str if len(cveAnalysis) > 1 { cveNumber := "[" + cve.CveNum + "](https://nvd.nist.gov/vuln/detail/" + cve.CveNum + ")" nveScore := score + " " + cve.CveLevel - nveVector := scoretype + "/" + its.NVDVector - oVector := scoretype + "/" + its.OpenEulerVector - body := fmt.Sprintf(bodyUpTpl, cveNumber, path, cve.CveVersion, scoretype, nveScore, nveVector, + nveVector := scoreType + "/" + its.NVDVector + oVector := scoreType + "/" + its.OpenEulerVector + body := fmt.Sprintf(bodyUpTpl, cveNumber, path, cve.CveVersion, scoreType, nveScore, nveVector, cve.Description, cveAnalysis, openEulerScore, oVector, affectedVersion) requestBody = fmt.Sprintf(`{ "access_token": "%s", @@ -439,9 +437,10 @@ func CreateIssueBody(accessToken string, owner string, path string, assignee str } else { cveNumber := "[" + cve.CveNum + "](https://nvd.nist.gov/vuln/detail/" + cve.CveNum + ")" nveScore := score + " " + cve.CveLevel - nveVector := scoretype + "/" + its.NVDVector - oVector := scoretype + "/" + its.OpenEulerVector - body := fmt.Sprintf(bodyUpTpl, cveNumber, path, cve.CveVersion, scoretype, nveScore, nveVector, + + nveVector := scoreType + "/" + its.NVDVector + oVector := scoreType + "/" + its.OpenEulerVector + body := fmt.Sprintf(bodyUpTpl, cveNumber, path, cve.CveVersion, scoreType, nveScore, nveVector, cve.Description, cveAnalysis, openEulerScore, oVector, affectedVersion) requestBody = fmt.Sprintf(`{ "access_token": "%s", @@ -460,9 +459,8 @@ func CreateIssueBody(accessToken string, owner string, path string, assignee str if len(cveAnalysis) > 1 { cveNumber := "[" + cve.CveNum + "](https://nvd.nist.gov/vuln/detail/" + cve.CveNum + ")" nveScore := score + " " + cve.CveLevel - nveVector := scoretype + "/" + sc.NvectorVule - //oVector := scoretype + "/" + its.OpenEulerVector - body := fmt.Sprintf(bodyTpl, cveNumber, path, cve.CveVersion, scoretype, nveScore, nveVector, + nveVector := scoreType + "/" + sc.NvectorVule + body := fmt.Sprintf(bodyTpl, cveNumber, path, cve.CveVersion, scoreType, nveScore, nveVector, cve.Description, cveAnalysis, openEulerScore, affectedVersion) requestBody = fmt.Sprintf(`{ "access_token": "%s", @@ -477,9 +475,9 @@ func CreateIssueBody(accessToken string, owner string, path string, assignee str } else { cveNumber := "[" + cve.CveNum + "](https://nvd.nist.gov/vuln/detail/" + cve.CveNum + ")" nveScore := score + " " + cve.CveLevel - nveVector := scoretype + "/" + sc.NvectorVule - //oVector := scoretype + "/" + its.OpenEulerVector - body := fmt.Sprintf(bodyTpl, cveNumber, path, cve.CveVersion, scoretype, nveScore, nveVector, + + nveVector := scoreType + "/" + sc.NvectorVule + body := fmt.Sprintf(bodyTpl, cveNumber, path, cve.CveVersion, scoreType, nveScore, nveVector, cve.Description, cveAnalysis, openEulerScore, affectedVersion) requestBody = fmt.Sprintf(`{ "access_token": "%s", @@ -508,11 +506,9 @@ func Duplicate(a interface{}) (ret []interface{}) { return ret } - func RemoveSubstring(s, sub string) string { if strings.Contains(s, sub) { return strings.ReplaceAll(s, sub, "") } return s } - diff --git a/taskhandler/createissue.go b/taskhandler/createissue.go index c166524..e6d926b 100644 --- a/taskhandler/createissue.go +++ b/taskhandler/createissue.go @@ -27,7 +27,7 @@ func CreateIssueData(issueTemp *models.IssueTemplate, cve models.VulnCenter, sc issueTemp.IssueNum = resp["number"].(string) issueTemp.Assignee = assignee issueTemp.StatusName = resp["state"].(string) - if strings.ToLower(resp["state"].(string)) == "open" || resp["state"].(string) == "待办的"{ + if strings.ToLower(resp["state"].(string)) == "open" || resp["state"].(string) == "待办的" { issueTemp.Status = 1 issueTemp.StatusName = "open" } else if strings.ToLower(resp["state"].(string)) == "started" || @@ -35,7 +35,7 @@ func CreateIssueData(issueTemp *models.IssueTemplate, cve models.VulnCenter, sc strings.ToLower(resp["state"].(string)) == "进行中" { issueTemp.Status = 2 issueTemp.StatusName = "progressing" - } else if strings.ToLower(resp["state"].(string)) == "closed" || resp["state"].(string) == "已完成"{ + } else if strings.ToLower(resp["state"].(string)) == "closed" || resp["state"].(string) == "已完成" { issueTemp.Status = 3 issueTemp.StatusName = "closed" } else { @@ -59,7 +59,7 @@ func CreateIssueData(issueTemp *models.IssueTemplate, cve models.VulnCenter, sc } func CreateIssueToGit(accessToken string, owner string, path string, assignee string, - cve models.VulnCenter, sc models.Score, brandArry []string) (string, error) { + cve models.VulnCenter, sc models.Score, brandArray []string) (string, error) { defer common.Catchs() var it models.IssueTemplate it.CveId = cve.CveId @@ -75,9 +75,9 @@ func CreateIssueToGit(accessToken string, owner string, path string, assignee st score := strconv.FormatFloat(sc.NVDScore, 'f', 1, 64) OpenEulerScore := strconv.FormatFloat(its.OpenEulerScore, 'f', 1, 64) requestBody := CreateIssueBody(accessToken, owner, path, its.Assignee, - cve, sc, OpenEulerScore, score, labels, its, 1, its.IssueType, "", brandArry) + cve, sc, OpenEulerScore, score, labels, its, 1, its.IssueType, "", brandArray) logs.Info("isssue_body: ", requestBody) - resp, err := util.HttpPatch(url, requestBody) + resp, err := util.HTTPPatch(url, requestBody) if err != nil { logs.Error("创建issue失败, cveNum: ", cve.CveNum, "err: ", err) return "", err @@ -90,22 +90,21 @@ func CreateIssueToGit(accessToken string, owner string, path string, assignee st // 构建数据 var issueTemp models.IssueTemplate CreateIssueData(&issueTemp, cve, sc, resp, path, its.Assignee, issueType, labels, owner) - if len(brandArry) > 0 { + if len(brandArray) > 0 { var brandArryTmp []string - for _, brand := range brandArry { + for _, brand := range brandArray { brandArryTmp = append(brandArryTmp, brand + ":") } brandStr := strings.Join(brandArryTmp, ",") issueTemp.AffectedVersion = brandStr } // 存储issue数据 - issTempId, err := models.CreateIssueTemplet(&issueTemp) + issTempID, err := models.CreateIssueTemplate(&issueTemp) if err != nil { logs.Error("创建issue 模板的数据失败, cveNum: ", cve.CveNum, "err: ", err) return "", err - } else { - logs.Info("创建issue 模板的数据成功, issTempId: ", issTempId, "cveNum: ", cve.CveNum) } + logs.Info("创建issue 模板的数据成功, issTempID: ", issTempID, "cveNum: ", cve.CveNum) // 构建回调 //err = CreateIssueHooks(accessToken, owner, path, cve, resp) //if err != nil { @@ -130,9 +129,9 @@ func CreateIssueToGit(accessToken string, owner string, path string, assignee st url := "https://gitee.com/api/v5/repos/" + owner + "/issues" score := strconv.FormatFloat(sc.NVDScore, 'f', 1, 64) requestBody := CreateIssueBody(accessToken, owner, path, assignee, - cve, sc, "", score, labels, its, 2, issueType, "", brandArry) + cve, sc, "", score, labels, its, 2, issueType, "", brandArray) logs.Info("isssue_body: ", requestBody) - resp, err := util.HttpPost(url, requestBody) + resp, err := util.HTTPPost(url, requestBody) if err != nil { logs.Error("创建issue失败, cveNum: ", cve.CveNum, "err: ", err) return "", err @@ -145,29 +144,28 @@ func CreateIssueToGit(accessToken string, owner string, path string, assignee st var issueTemp models.IssueTemplate CreateIssueData(&issueTemp, cve, sc, resp, path, assignee, issueType, labels, owner) // 存储issue数据 - if len(brandArry) > 0 { - var brandArryTmp []string - for _, brand := range brandArry { - brandArryTmp = append(brandArryTmp, brand + ":") + issTempID, err := models.CreateIssueTemplate(&issueTemp) + if len(brandArray) > 0 { + var brandArrayTmp []string + for _, brand := range brandArray { + brandArrayTmp = append(brandArrayTmp, brand + ":") } - brandStr := strings.Join(brandArryTmp, ",") + brandStr := strings.Join(brandArrayTmp, ",") issueTemp.AffectedVersion = brandStr } - issTempId, err := models.CreateIssueTemplet(&issueTemp) if err != nil { logs.Error("创建issue 模板的数据失败, cveNum: ", cve.CveNum, "err: ", err) return "", err - } else { - logs.Info("创建issue 模板的数据成功, issTempId: ", issTempId, "cveNum: ", cve.CveNum) } + logs.Info("创建issue 模板的数据成功, issTempID: ", issTempID, "cveNum: ", cve.CveNum) // 创建issue评论 affectedVersion := "" - if len(brandArry) > 0 { - for i, brand := range brandArry { + if len(brandArray) > 0 { + for i, brand := range brandArray { if brand == "" || len(brand) < 2 { continue } - affectedVersion = affectedVersion + strconv.Itoa(i + 1) +"." + brand + ":\n" + affectedVersion = affectedVersion + strconv.Itoa(i+1) + "." + brand + ":\n" } } else { affectedVersion = affectedVersion + "\n" @@ -176,14 +174,13 @@ func CreateIssueToGit(accessToken string, owner string, path string, assignee st logs.Info("issue评论创建结果, err: ", errx) // 构建回调 issueNum := resp["number"].(string) - issueId := int64(resp["id"].(float64)) - err = CreateDepositHooks(accessToken, owner, path, cve, issueNum, issueId) + issueID := int64(resp["id"].(float64)) + err = CreateDepositHooks(accessToken, owner, path, cve, issueNum, issueID) if err != nil { logs.Error("创建hooks 失败, cveNum: ", cve.CveNum, "err: ", err) return "", err - } else { - logs.Info("创建hooks 成功, cveNum: ", cve.CveNum) } + logs.Info("创建hooks 成功, cveNum: ", cve.CveNum) // 创建issue标签 //CreateIssueLabel(accessToken, owner, path, resp["number"].(string)) // 更新issue状态 @@ -222,7 +219,7 @@ func UpdateIssueToGit(accessToken string, owner string, path string, requestBody := CreateIssueBody(accessToken, owner, path, its.Assignee, cve, sc, OpenEulerScore, score, labels, its, 3, its.IssueType, pkgLink, brandArray) logs.Info("isssue_body: ", requestBody) - resp, err := util.HttpPatch(url, requestBody) + resp, err := util.HTTPPatch(url, requestBody) if err != nil { logs.Error("更新issue失败, cveNum: ", cve.CveNum, "err: ", err) return "", err @@ -247,7 +244,7 @@ func UpdateIssueToGit(accessToken string, owner string, path string, //func UpdateCommentInfo(owner, path, issueNumber string) { // issueUrl := "https://gitee.com/" + owner + "/" + path + "/issues/" + issueNumber -// util.HttpGet(issueUrl) +// util.HTTPGet(issueUrl) //} func CreateIssueHookData(issHook *models.IssueHooks, cve models.VulnCenter, resp map[string]interface{}, @@ -330,7 +327,7 @@ func CreateDepositHooks(accessToken string, owner string, path string, "merge_requests_events": "%s" }`, accessToken, hookurl, pwd, push_events, tag_push_events, issues_events, note_events, merge_requests_events) logs.Info("hook_body: ", requestBody) - resp, err := util.HttpPatch(url, requestBody) + resp, err := util.HTTPPatch(url, requestBody) if err != nil { logs.Error("创建钩子失败, url: ", url, "cveId", cve.CveId, "err: ", err) return err @@ -375,7 +372,7 @@ func CreateDepositHooks(accessToken string, owner string, path string, "merge_requests_events": "%s" }`, accessToken, hookurl, pwd, push_events, tag_push_events, issues_events, note_events, merge_requests_events) logs.Info("hook_body: ", requestBody) - resp, err := util.HttpPost(url, requestBody) + resp, err := util.HTTPPost(url, requestBody) if err != nil { logs.Error("创建钩子失败, url: ", url, "cveId", cve.CveId, "err: ", err) return err @@ -419,7 +416,7 @@ func CreateDepositHooks(accessToken string, owner string, path string, "merge_requests_events": "%s" }`, accessToken, hookurl, pwd, push_events, tag_push_events, issues_events, note_events, merge_requests_events) logs.Info("hook_body: ", requestBody) - resp, err := util.HttpPost(url, requestBody) + resp, err := util.HTTPPost(url, requestBody) if err != nil { logs.Error("创建钩子失败, url: ", url, "cveId", cve.CveId, "err: ", err) return err @@ -434,13 +431,12 @@ func CreateDepositHooks(accessToken string, owner string, path string, CreateIssueHookData(&issHook, cve, resp, path, owner, issueNum, issueId) // 存储issue数据 - hookId, err := models.CreateDepositHooks(&issHook) + hookID, err := models.CreateDepositHooks(&issHook) if err != nil { logs.Error("创建仓库hook失败, cveNum: ", cve.CveNum, "err: ", err) return err - } else { - logs.Info("创建仓库 hook数据成功, hookId: ", hookId, "cveNum: ", cve.CveNum) } + logs.Info("创建仓库 hook数据成功, hookID: ", hookID, "cveNum: ", cve.CveNum) } } } @@ -466,7 +462,7 @@ func CreateIssueComment(accessToken, owner, path, Assignee string, "body": "%s" }`, accessToken, commentBody) logs.Info("create issue comment body: ", requestBody) - resp, err := util.HttpPost(url, requestBody) + resp, err := util.HTTPPost(url, requestBody) if err != nil { logs.Error("创建issue评论失败, url: ", url, "cveId", cve.CveId, ",issueNum: ", issueNum, ",err: ", err) return err @@ -475,8 +471,8 @@ func CreateIssueComment(accessToken, owner, path, Assignee string, logs.Error("创建issue评论失败, err: ", ok, "url: ", url) return errors.New("创建issue评论失败") } - commentId := int64(resp["id"].(float64)) - models.UpdateIssueCommentId(issueNum, cve.CveNum, commentId) + commentID := int64(resp["id"].(float64)) + models.UpdateIssueCommentId(issueNum, cve.CveNum, commentID) } return nil } @@ -509,7 +505,7 @@ func CreateSecNoticeData(sec *models.SecurityNotice, iss models.VulnCenter, path } } if branchs != "" && len(branchs) > 1 { - branchs = branchs[: len(branchs) - 1] + branchs = branchs[:len(branchs)-1] } sec.CveId = iss.CveId sec.CveNum = iss.CveNum @@ -540,7 +536,7 @@ func CreateIssueLabel(accessToken string, owner string, path string, body["body"] = "[\"CVE/Undisclosed\",\"CVE/Disclosed\"]" requestBody, _ := json.Marshal(body) logs.Info("create issue label: ", string(requestBody)) - resp, err := util.HttpPost1(url, string(requestBody)) + resp, err := util.HTTPPost1(url, string(requestBody)) if err != nil { logs.Error("cve标签创建失败, url: ", url, "requestBody: ", requestBody, "err: ", err) return err diff --git a/taskhandler/cve.go b/taskhandler/cve.go index e0beee4..99d0cd2 100644 --- a/taskhandler/cve.go +++ b/taskhandler/cve.go @@ -829,16 +829,16 @@ func GetCveOriginData(prcnum, days, openeulernum int, cveRef string) (bool, erro } logs.Info("总共有: ", num, "条的数据需要处理, ", osx) ch := make(chan int, len(osx)) - for i, cveData := range osx { + for i, cveOrg := range osx { count = count + 1 - logs.Info("当前正常解析第: ", count, "条数据,i:", i, ", cvenum: ", cveData.Ids) - go func() { + logs.Info("当前正常解析第: ", count, "条数据,i:", i, ", cvenum: ", cveOrg.Ids) + go func(idx int, cveData models.OriginUpstream) { ok, err := GenCveVuler(cveData, cveRef, openeulernum) if !ok { logs.Error("cveData: ", cveData, "处理失败, err: ", err) } - ch <- i - }() + ch <- idx + }(i, cveOrg) } for i := 0; i < cap(ch); i++ { <-ch @@ -863,16 +863,16 @@ func GetCveOriginExcelData(prcnum, days, openeulerNum int, cveRef string) (bool, } logs.Info("excel总共有: ", num, "条的数据需要处理, ", osx) ch := make(chan int, len(osx)) - for i, cveData := range osx { + for i, cveOrg := range osx { count = count + 1 - logs.Info("当前正常解析第: ", count, "条数据,i:", i, ", cvenum: ", cveData.CveNum) - go func() { + logs.Info("当前正常解析第: ", count, "条数据,i:", i, ", cvenum: ", cveOrg.CveNum) + go func(idx int, cveData models.OriginExcel) { ok, err := SyncCveVuler(cveData, cveRef, openeulerNum) if !ok { logs.Error("cveData: ", cveData, "处理失败, err: ", err) } ch <- i - }() + }(i, cveOrg) } for i := 0; i < cap(ch); i++ { <-ch @@ -1028,7 +1028,7 @@ func InsertIssueCveGroups(cveData models.GiteOriginIssue, lop models.Loophole, c issueTemp.IssueType = cveData.IssueType issueTemp.CveLevel = vul.CveLevel // 存储issue数据 - issTempId, issError := models.CreateIssueTemplet(&issueTemp) + issTempId, issError := models.CreateIssueTemplate(&issueTemp) if issError != nil { logs.Error("创建issue 模板的数据失败, cveNum: ", cveData.CveNumber, "err: ", issError) return false, issError @@ -1037,7 +1037,8 @@ func InsertIssueCveGroups(cveData models.GiteOriginIssue, lop models.Loophole, c } if cveData.State != "" && (strings.ToLower(cveData.State) == "open" || strings.ToLower(cveData.State) == "progressing") { accessToken := os.Getenv("GITEE_TOKEN") - CreateDepositHooks(accessToken, owner, cveData.RepoPath, vul, cveData.Number, cveData.IssueId) + hookError := CreateDepositHooks(accessToken, owner, cveData.RepoPath, vul, cveData.Number, cveData.IssueId) + logs.Info(hookError) } return true, nil } @@ -1185,7 +1186,8 @@ func UpdateIssueCveGroups(cveData models.GiteOriginIssue, lop models.Loophole, c } if vul.Status == 0 { accessToken := os.Getenv("GITEE_TOKEN") - CreateDepositHooks(accessToken, owner, cveData.RepoPath, vul, cveData.Number, cveData.IssueId) + hookError := CreateDepositHooks(accessToken, owner, cveData.RepoPath, vul, cveData.Number, cveData.IssueId) + logs.Info(hookError) } osa, osaError := models.QueryOpenSaById(vul.CveId) if osaError == nil && osa.OpenId > 0 { @@ -1231,7 +1233,8 @@ func UpdateIssueCveGroups(cveData models.GiteOriginIssue, lop models.Loophole, c scorecode.NVDScore = score.NVDScore scorecode.NvectorVule = score.NvectorVule scorecode.Status = 0 - models.InsertScoreRecord(&scorecode) + scRecordId, scError := models.InsertScoreRecord(&scorecode) + logs.Info(scRecordId, scError) } } var issueTemp models.IssueTemplate @@ -1318,7 +1321,7 @@ func UpdateIssueCveGroups(cveData models.GiteOriginIssue, lop models.Loophole, c issueTemp.CveLevel = vul.CveLevel } // 存储issue数据 - issTempId, issError := models.CreateIssueTemplet(&issueTemp) + issTempId, issError := models.CreateIssueTemplate(&issueTemp) if issError != nil { logs.Error("创建issue 模板的数据失败, cveNum: ", cveData.CveNumber, "err: ", issError) return false, issError @@ -1346,7 +1349,8 @@ func GenCveVulerByIssue(cveData models.GiteOriginIssue, cveRef string, openeuler cvd, ok := models.QueryCveByNum(cveData.CveNumber, cveData.RepoPath, hole.Version) if ok && cvd.CveNum != "" { lock.Lock() - UpdateIssueCveGroups(cveData, hole, cveRef, openeulernum, 2, goe, cvd, owner) + upOk, upError := UpdateIssueCveGroups(cveData, hole, cveRef, openeulernum, 2, goe, cvd, owner) + logs.Info(upOk, upError) lock.Unlock() } else { lock.Lock() @@ -1365,7 +1369,8 @@ func GenCveVulerByIssue(cveData models.GiteOriginIssue, cveRef string, openeuler cvd, ok := models.QueryCveByNum(cveData.CveNumber, cveData.RepoPath, hole.Version) if ok && cvd.CveNum != "" { lock.Lock() - UpdateIssueCveGroups(cveData, hole, cveRef, openeulernum, 2, goe, cvd, owner) + upOk, upError := UpdateIssueCveGroups(cveData, hole, cveRef, openeulernum, 2, goe, cvd, owner) + logs.Info(upOk, upError) lock.Unlock() //models.UpdateCveStatusExportByNum(common.GetCurTime(), cveData.CveNumber, 2, 2) } else { @@ -1385,7 +1390,8 @@ func GenCveVulerByIssue(cveData models.GiteOriginIssue, cveRef string, openeuler cvd, ok := models.QueryCveByNum(cveData.CveNumber, cveData.RepoPath, hole.Version) if ok && cvd.CveNum != "" { lock.Lock() - UpdateIssueCveGroups(cveData, hole, cveRef, openeulernum, 1, goe, cvd, owner) + upOk, upError := UpdateIssueCveGroups(cveData, hole, cveRef, openeulernum, 1, goe, cvd, owner) + logs.Info(upOk, upError) lock.Unlock() //models.UpdateCveStatusExportByNum(common.GetCurTime(), cveData.CveNumber, 2, 2) } else { @@ -1414,21 +1420,21 @@ func GetCveIssueData(prcnum, days, openeulernum int, cveRef, owner string) (bool } logs.Info("总共有: ", num, "条的数据需要处理, ", gs) ch := make(chan int, len(gs)) - for i, cveData := range gs { + for i, cveOrg := range gs { count = count + 1 - logs.Info("当前正常解析第: ", count, "条数据,i:", i, ", cvenum: ", cveData.IssueId) - if cveData.CveNumber == "" || len(cveData.CveNumber) == 0 { - logs.Error("数据异常, 不处理, cveData: ", cveData) - models.UpdateCveIssueStatusById(3, cveData.Id) + logs.Info("当前正常解析第: ", count, "条数据,i:", i, ", cvenum: ", cveOrg.IssueId) + if cveOrg.CveNumber == "" || len(cveOrg.CveNumber) == 0 { + logs.Error("数据异常, 不处理, cveData: ", cveOrg) + models.UpdateCveIssueStatusById(3, cveOrg.Id) continue } - go func() { + go func(idx int, cveData models.GiteOriginIssue) { ok, err := GenCveVulerByIssue(cveData, cveRef, openeulernum, owner) if !ok { logs.Error("cveData: ", cveData, "处理失败, err: ", err) } - ch <- i - }() + ch <- idx + }(i, cveOrg) } for i := 0; i < cap(ch); i++ { <-ch diff --git a/taskhandler/excel.go b/taskhandler/excel.go index aae25f8..1b39b31 100644 --- a/taskhandler/excel.go +++ b/taskhandler/excel.go @@ -12,6 +12,7 @@ import ( "time" ) +//CveExcel Excel export client type CveExcel struct { ExcelName string //excel 名字 ExcelHandel *excelize.File //excel 文件句柄 @@ -23,8 +24,8 @@ type CveExcel struct { SecNoticeSuffixIdx int64 //安全公告后缀起始值 InfProductSheetName string //CVE 影响的产品 InfProductSheetIndex int - PackageUrlSheetName string - PackageUrlSheetIndex int + PackageURLSheetName string + PackageURLSheetIndex int } //GenerateCveExcel Generate Excel documents based on data. @@ -56,6 +57,7 @@ func GenerateCveExcel(excelName, snPrefix string, snSuffix int64, forceRewrite b return ec.Save(mode) } +//Init init excel client func (ec *CveExcel) Init(excelName, snPrefix string, snSuffix int64) (err error) { if excelName == "" || !(strings.HasSuffix(excelName, ".xlsx") || strings.HasSuffix(excelName, "xls")) { err = errors.New("excel name illegal") @@ -70,8 +72,8 @@ func (ec *CveExcel) Init(excelName, snPrefix string, snSuffix int64) (err error) ec.SecNoticeSheetName = "安全公告" ec.InfProductSheetIndex = 2 ec.InfProductSheetName = "CVE影响的产品" - ec.PackageUrlSheetIndex = 3 - ec.PackageUrlSheetName = "安全公告升级包链接" + ec.PackageURLSheetIndex = 3 + ec.PackageURLSheetName = "安全公告升级包链接" return nil } @@ -93,24 +95,26 @@ func (ec *CveExcel) InitFileHandle(forceRewrite bool) (wm int8) { if err != nil { ec.ExcelHandel = excelize.NewFile() return 0 - } else { - ec.ExcelHandel = file - return 1 } - } else { - ec.ExcelHandel = excelize.NewFile() - return 0 + ec.ExcelHandel = file + return 1 + } + ec.ExcelHandel = excelize.NewFile() + return 0 + } +//InitSheet init excel sheet func (ec *CveExcel) InitSheet() { ec.SecNoticeSheetIdx = ec.ExcelHandel.NewSheet(ec.SecNoticeSheetName) ec.InfProductSheetIndex = ec.ExcelHandel.NewSheet(ec.InfProductSheetName) - ec.PackageUrlSheetIndex = ec.ExcelHandel.NewSheet(ec.PackageUrlSheetName) + ec.PackageURLSheetIndex = ec.ExcelHandel.NewSheet(ec.PackageURLSheetName) sn := ec.ExcelHandel.GetSheetName(ec.CveSheetIdx) ec.ExcelHandel.SetSheetName(sn, ec.CveSheetName) } +//FillHeader fill the excel sheet header func (ec *CveExcel) FillHeader() (err error) { err = ec.ExcelHandel.SetCellValue(ec.CveSheetName, "A1", "CVE编号") if err != nil { @@ -309,18 +313,19 @@ func (ec *CveExcel) FillHeader() (err error) { return err } ph := []interface{}{"包名", "包下载链接"} - err = ec.ExcelHandel.SetSheetRow(ec.PackageUrlSheetName, "A1", &ph) + err = ec.ExcelHandel.SetSheetRow(ec.PackageURLSheetName, "A1", &ph) if err != nil { return err } return nil } +//FillContent fill the excel content func (ec *CveExcel) FillContent(count int64) { pageSize := 50 pageCount := count / int64(pageSize) if count%int64(pageSize) > 0 { - pageCount += 1 + pageCount++ } for i := int64(0); i < pageCount; i++ { off := i * int64(pageSize) @@ -357,27 +362,27 @@ func (ec *CveExcel) handleWriteContent(off int64, size int) (err error) { break } if t.IssueStatus == 2 { - mergerList = append(mergerList, strconv.FormatInt(t.CveId,10)) + mergerList = append(mergerList, strconv.FormatInt(t.CveId, 10)) } } //2.从issue_status == 2 的模板数据中找到评分最高的对应的ExcelExport数据 - if canMerger && len(mergerList)>0{ + if canMerger && len(mergerList) > 0 { canExport, err := models.GetCanExportCveDataSameNum(strings.Join(mergerList, ",")) if err != nil { logs.Error(err) } - ep := canExport[0] - if len(canExport)>1{ - canExport = canExport[1:] - for _,ex := range canExport { - ep.Introduction = ep.Introduction+"\n"+ex.Introduction - ep.Summary = ep.Summary+"\n"+ex.Summary - ep.Theme = ep.Theme+"\n"+ex.Theme - ep.Description = ep.Description+"\n"+ex.Description - ep.OwnedComponent = ep.OwnedComponent+"\n"+ex.OwnedComponent - ep.InfluenceComponent = ep.InfluenceComponent+"\n"+ex.InfluenceComponent - ep.AffectProduct = ep.AffectProduct+"\n"+ex.AffectProduct + ep := canExport[0] + if len(canExport) > 1 { + canExport = canExport[1:] + for _, ex := range canExport { + ep.Introduction = ep.Introduction + "\n" + ex.Introduction + ep.Summary = ep.Summary + "\n" + ex.Summary + ep.Theme = ep.Theme + "\n" + ex.Theme + ep.Description = ep.Description + "\n" + ex.Description + ep.OwnedComponent = ep.OwnedComponent + "\n" + ex.OwnedComponent + ep.InfluenceComponent = ep.InfluenceComponent + "\n" + ex.InfluenceComponent + ep.AffectProduct = ep.AffectProduct + "\n" + ex.AffectProduct } } @@ -391,7 +396,7 @@ func (ec *CveExcel) handleWriteContent(off int64, size int) (err error) { } func (ec *CveExcel) setContentRow(v models.ExcelExport) { - pkg, err := models.GetCvePackageList(v.SecId) + pkg, err := models.GetCvePackageList(v.SecID) if err != nil { logs.Error(err) } @@ -403,24 +408,24 @@ func (ec *CveExcel) setContentRow(v models.ExcelExport) { 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} - err = ec.FillCveSheetRow(cve) + err = ec.fillCveSheetRow(cve) if err != nil { logs.Error(err) } sn := []interface{}{v.OpenEulerSANum, v.CveNum, v.Introduction, v.Summary, v.Theme, v.Description, v.InfluenceComponent, v.AffectProduct, pkgStr, v.ReferenceLink, v.PublicDate} - err = ec.FillSecurityNoticeSheet(sn) + err = ec.fillSecurityNoticeSheet(sn) if err != nil { logs.Error(err) } ap := []interface{}{v.CveNum, v.AffectProduct, v.InfluenceComponent, v.AffectStatus} - err = ec.FillAffectProductSheet(ap) + err = ec.fillAffectProductSheet(ap) if err != nil { logs.Error(err) } for _, v := range pkg { pk := []interface{}{v.PackName, v.PackUrl} - err := ec.FillPackageSheet(pk) + err := ec.fillPackageSheet(pk) if err != nil { logs.Error(err) } @@ -441,7 +446,7 @@ func getPkgStr(pkg []models.Package) string { return strings.Join(ps, ";\n") } -func (ec *CveExcel) FillCveSheetRow(row []interface{}) (err error) { +func (ec *CveExcel) fillCveSheetRow(row []interface{}) (err error) { rows, err := ec.ExcelHandel.GetRows(ec.CveSheetName) if err != nil { return err @@ -452,7 +457,7 @@ func (ec *CveExcel) FillCveSheetRow(row []interface{}) (err error) { return err } -func (ec *CveExcel) FillSecurityNoticeSheet(row []interface{}) (err error) { +func (ec *CveExcel) fillSecurityNoticeSheet(row []interface{}) (err error) { rows, err := ec.ExcelHandel.GetRows(ec.SecNoticeSheetName) if err != nil { return err @@ -463,7 +468,7 @@ func (ec *CveExcel) FillSecurityNoticeSheet(row []interface{}) (err error) { return err } -func (ec *CveExcel) FillAffectProductSheet(row []interface{}) (err error) { +func (ec *CveExcel) fillAffectProductSheet(row []interface{}) (err error) { rows, err := ec.ExcelHandel.GetRows(ec.InfProductSheetName) if err != nil { return err @@ -474,21 +479,22 @@ func (ec *CveExcel) FillAffectProductSheet(row []interface{}) (err error) { return err } -func (ec *CveExcel) FillPackageSheet(row []interface{}) (err error) { - rows, err := ec.ExcelHandel.GetRows(ec.PackageUrlSheetName) +func (ec *CveExcel) fillPackageSheet(row []interface{}) (err error) { + rows, err := ec.ExcelHandel.GetRows(ec.PackageURLSheetName) if err != nil { return err } idx := len(rows) + 1 axis := fmt.Sprintf("A%d", idx) - err = ec.ExcelHandel.SetSheetRow(ec.PackageUrlSheetName, axis, &row) + err = ec.ExcelHandel.SetSheetRow(ec.PackageURLSheetName, axis, &row) return err } +//Save save the excel content to file func (ec *CveExcel) Save(md int8) error { if md == 0 { return ec.ExcelHandel.SaveAs(ec.ExcelName) - } else { - return ec.ExcelHandel.Save() } + return ec.ExcelHandel.Save() + } diff --git a/taskhandler/grabissue.go b/taskhandler/grabissue.go index 42fe6e9..cc382f2 100644 --- a/taskhandler/grabissue.go +++ b/taskhandler/grabissue.go @@ -13,26 +13,32 @@ import ( ) const ( - GiteOrgInfoUrl = `https://gitee.com/api/v5/orgs/%v?access_token=%v` //get gitee org info - GiteOrgReposUrl = `https://gitee.com/api/v5/orgs/%v/repos?access_token=%v&type=all&page=%v&per_page=%v` //get all repository - GiteRepoIssuesUrl = `https://gitee.com/api/v5/repos/%v/%v/issues?state=%v&sort=created&direction=desc&page=%v&per_page=%v` //get issue list + //GiteOrgInfoURL get gitee org info url + GiteOrgInfoURL = `https://gitee.com/api/v5/orgs/%v?access_token=%v` + //GiteOrgReposURL get all repository url + GiteOrgReposURL = `https://gitee.com/api/v5/orgs/%v/repos?access_token=%v&type=all&page=%v&per_page=%v` + //GiteRepoIssuesURL get issue list url + GiteRepoIssuesURL = `https://gitee.com/api/v5/repos/%v/%v/issues?state=%v&sort=created&direction=desc&page=%v&per_page=%v` + //GiteRepoBranch get repo branch url GiteRepoBranch = `https://gitee.com/api/v5/repos/%v/%v/branches?access_token=%v` - RepoInfoUrl = "https://api.openeuler.org/pkgmanagedebug/packages/packageInfo?table_name=mainline&pkg_name=%s" + //RepoInfoURL get repo info url + RepoInfoURL = "https://api.openeuler.org/pkgmanagedebug/packages/packageInfo?table_name=mainline&pkg_name=%s" perPage = 50 + //IssueType Types of issues crawled IssueType = "CVE和安全问题" ) var wg sync.WaitGroup -//var mu sync.Mutex +//OrgInfo 组织 type OrgInfo struct { - Id int32 `json:"id,omitempty"` + ID int32 `json:"id,omitempty"` Login string `json:"login,omitempty"` - Url string `json:"url,omitempty"` - AvatarUrl string `json:"avatar_url,omitempty"` - ReposUrl string `json:"repos_url,omitempty"` - EventsUrl string `json:"events_url,omitempty"` - MembersUrl string `json:"members_url,omitempty"` + URL string `json:"url,omitempty"` + AvatarURL string `json:"avatar_url,omitempty"` + ReposURL string `json:"repos_url,omitempty"` + EventsURL string `json:"events_url,omitempty"` + MembersURL string `json:"members_url,omitempty"` Description string `json:"description,omitempty"` Name string `json:"name,omitempty"` Enterprise string `json:"enterprise,omitempty"` @@ -41,19 +47,21 @@ type OrgInfo struct { PrivateRepos int64 `json:"private_repos,omitempty"` } -// 获取所有分支 +//Branch 获取所有分支 type Branch struct { Name string `json:"name,omitempty"` Protected bool `json:"protected,omitempty"` - ProtectionUrl string `json:"protection_url,omitempty"` + ProtectionURL string `json:"protection_url,omitempty"` } +//PackageInfo package info model type PackageInfo struct { Code string Msg string Data Info } +//Info cve info type Info struct { Description string } @@ -165,9 +173,10 @@ func handleIssueList(list []models.HookIssue, product,desc string) { } } +//GetOrgInfo get organization information func GetOrgInfo(accToken, org string) (OrgInfo, error) { oi := OrgInfo{} - resp, err := http.Get(fmt.Sprintf(GiteOrgInfoUrl, org, accToken)) + resp, err := http.Get(fmt.Sprintf(GiteOrgInfoURL, org, accToken)) if err != nil { return oi, err } @@ -180,10 +189,11 @@ func GetOrgInfo(accToken, org string) (OrgInfo, error) { return oi, err } +//GetOrgRepos get organization repository func GetOrgRepos(accToken, org string, page int64) { wg.Add(1) defer wg.Done() - resp, err := http.Get(fmt.Sprintf(GiteOrgReposUrl, org, accToken, page, perPage)) + resp, err := http.Get(fmt.Sprintf(GiteOrgReposURL, org, accToken, page, perPage)) if err != nil { logs.Error(err) return @@ -205,8 +215,9 @@ func GetOrgRepos(accToken, org string, page int64) { } } +//GetIssueList get the repository issue list func GetIssueList(accToken, owner, repo, state string, page int) (issueList []models.HookIssue, err error) { - resp, err := http.Get(fmt.Sprintf(GiteRepoIssuesUrl, owner, repo, state, page, perPage)) + resp, err := http.Get(fmt.Sprintf(GiteRepoIssuesURL, owner, repo, state, page, perPage)) if err != nil { return issueList, err } @@ -219,11 +230,12 @@ func GetIssueList(accToken, owner, repo, state string, page int) (issueList []mo return } +//GetRepoDescription get repository description func GetRepoDescription(repo string) (desc string) { if repo == "" { return "" } - url := fmt.Sprintf(RepoInfoUrl, repo) + url := fmt.Sprintf(RepoInfoURL, repo) resp, err := http.Get(url) if err != nil { return "" diff --git a/taskhandler/oricvecheck.go b/taskhandler/oricvecheck.go index d1196c9..e9f48f5 100644 --- a/taskhandler/oricvecheck.go +++ b/taskhandler/oricvecheck.go @@ -26,10 +26,10 @@ func CheckCveOriginData(prcnum int) (string, error) { } logs.Info("总共有: ", num, "条数据需要处理, ", os) ch := make(chan int, len(os)) - for i, cveData := range os { + for i, cveOrg := range os { count = count + 1 - logs.Info("当前正常解析第: ", count, "条数据,i:", i, ", cvenum: ", cveData.Ids) - go func() { + logs.Info("当前正常解析第: ", count, "条数据,i:", i, ", cvenum: ", cveOrg.Ids) + go func(idx int, cveData models.OriginUpstream) { packNameList := []string{} if cveData.PackName != "" && len(cveData.PackName) > 0 { packNameList = strings.Split(cveData.PackName, ",") @@ -50,8 +50,8 @@ func CheckCveOriginData(prcnum int) (string, error) { } } } - ch <- i - }() + ch <- idx + }(i, cveOrg) } for i :=0; i < cap(ch); i++ { <- ch diff --git a/taskhandler/yaml.go b/taskhandler/yaml.go index 608ca1d..d204d1f 100644 --- a/taskhandler/yaml.go +++ b/taskhandler/yaml.go @@ -13,8 +13,8 @@ import ( ) func GetYamlTables(url string) (string, error){ - compUrl := url + "/lifeCycle/tables" - body, err:= util.HttpGetCom(compUrl) + compURL := url + "/lifeCycle/tables" + body, err:= util.HTTPGetCom(compURL) if err == nil && body != nil { var respBody map[string]interface{} err =json.Unmarshal(body, &respBody) @@ -27,9 +27,9 @@ func GetYamlTables(url string) (string, error){ for i, values := range respBody["data"].([]interface{}) { var gt models.GitPackageTable gt.TableName = values.(string) - table_id, err := models.CreateYamlTable(>) - if table_id > 0 { - logs.Info("第 ", i, "条数据, table: ", values, "插入成功, table_id: ", table_id) + tableID, err := models.CreateYamlTable(>) + if tableID > 0 { + logs.Info("第 ", i, "条数据, table: ", values, "插入成功, table_id: ", tableID) } else { logs.Error("第 ", i, "条数据, table: ", values, "插入失败, err: ", err) return "", err @@ -45,6 +45,7 @@ func GetYamlTables(url string) (string, error){ var lock sync.Mutex //var wg sync.WaitGroup +//GetYamlByGit func GetYamlByGit(url string) (string, error) { defer common.Catchs() var gt []models.GitPackageTable @@ -56,19 +57,19 @@ func GetYamlByGit(url string) (string, error) { return "", err } logs.Info("总共有: ", num, "表的数据需要获取, ", gt) - compUrl1 := url + "/packages" + compURL1 := url + "/packages" var ch = make(chan int, len(gt)) for i, tableValue := range gt { logs.Info("查询第 ", i, "tableName: ", tableValue.TableName, "开始...") //wg.Add(1) - go func() { - ok, err := GetYaml(url, compUrl1, page, size, tableValue, &ch) + go func(tv models.GitPackageTable,idx int) { + ok, err := GetYaml(url, compURL1, page, size, tv, &ch) if err == nil { - logs.Info("当前数据处理成功,i: ", i) + logs.Info("当前数据处理成功,i: ", idx) } else { - logs.Error("当前数据处理失败, ok: ", ok, ",i: ", i, ", err: ", err) + logs.Error("当前数据处理失败, ok: ", ok, ",i: ", idx, ", err: ", err) } - }() + }(tableValue,i) //<- ch } for i:=0; i< len(gt); i++ { @@ -79,7 +80,7 @@ func GetYamlByGit(url string) (string, error) { return "", nil } -func GetYaml(url, compUrl1 string, page, size int, tableValue models.GitPackageTable, ch *chan int) (string, error){ +func GetYaml(url, compURL1 string, page, size int, tableValue models.GitPackageTable, ch *chan int) (string, error){ //defer wg.Done() defer common.Catchs() var tc GitTablePackCount @@ -88,11 +89,11 @@ func GetYaml(url, compUrl1 string, page, size int, tableValue models.GitPackageT tc.Size = 0 tc.Page = page tc.Size = size - compUrl2 := compUrl1 + "?table_name=" + tableValue.TableName + compURL2 := compURL1 + "?table_name=" + tableValue.TableName for ;; { - compUrl := compUrl2 + + compURL := compURL2 + "&page_num=" + strconv.Itoa(tc.Page) + "&page_size=" + strconv.Itoa(size) - body, err:= util.HttpGetCom(compUrl) + body, err:= util.HTTPGetCom(compURL) var respBody map[string]interface{} if err == nil && body != nil { err =json.Unmarshal(body, &respBody) @@ -101,15 +102,15 @@ func GetYaml(url, compUrl1 string, page, size int, tableValue models.GitPackageT return "", err } } else { - logs.Error( "http 请求失败, url: ", compUrl) + logs.Error( "http 请求失败, url: ", compURL) return "", err } logs.Info("start: ", tc) if respBody["code"].(string) == "2001"{ //chx := make(chan int) - cur_count := 0 + curCount := 0 if respBody == nil || respBody["data"] == nil || len(respBody["data"].([]interface{})) == 0{ - logs.Error("数据为空, url: ", compUrl) + logs.Error("数据为空, url: ", compURL) return "", err } for i, values := range respBody["data"].([]interface{}) { @@ -119,14 +120,14 @@ func GetYaml(url, compUrl1 string, page, size int, tableValue models.GitPackageT if values == nil || values == "" || len(values.(map[string]interface{})) == 0{ logs.Error("第:",tc.Page,"页, 到: ", tc.Size, "条, tableName: ",tc.TableName, ",已处理到第count: ", tc.Count, "条, yaml values: ", values, ", 处理失败") - cur_count = cur_count + 1 + curCount = curCount + 1 continue } - valuesx := values.(map[string]interface{}) - ok, err := ProcPackDetail(url, valuesx, tableValue, i) + valuesX := values.(map[string]interface{}) + ok, err := ProcPackDetail(url, valuesX, tableValue, i) logs.Info("ok: ", ok, ", err: ", err) //<- chx - cur_count = cur_count + 1 + curCount = curCount + 1 } //close(chx) totalPage := 0 @@ -158,23 +159,23 @@ func GetYaml(url, compUrl1 string, page, size int, tableValue models.GitPackageT if tc.Page > totalPage || tc.Size >= totalCount{ logs.Info("已处理完成:tableName: ", tc.TableName, "数据获取完成, " + "总页数(page_num):", totalPage, ", 总条数(page_size):", totalCount, "\n", - ",当前页数Page:", tc.Page, ",当前条数size: ", tc.Size, ",url: ", compUrl) + ",当前页数Page:", tc.Page, ",当前条数size: ", tc.Size, ",url: ", compURL) break } else { logs.Info("当前: tableName: ", tc.TableName, "数据获取完成, " + "总页数(page_num):", totalPage, ", 总条数(page_size):", totalCount, "\n", - ",当前页数Page:", tc.Page, ",当前条数size: ", tc.Size, ",url: ", compUrl) + ",当前页数Page:", tc.Page, ",当前条数size: ", tc.Size, ",url: ", compURL) lock.Lock() tc.Page = tc.Page + page - tc.Size = tc.Size + cur_count + tc.Size = tc.Size + curCount lock.Unlock() logs.Info("增加后: tableName: ", tc.TableName, "数据获取完成, " + "总页数(page_num):", totalPage, ", 总条数(page_size):", totalCount, "\n", - ",当前页数Page:", tc.Page, ",当前条数size: ", tc.Size, ",url: ", compUrl) + ",当前页数Page:", tc.Page, ",当前条数size: ", tc.Size, ",url: ", compURL) } logs.Info("start: ", tc) } else { - logs.Error("网络请求失败,url:", compUrl) + logs.Error("网络请求失败,url:", compURL) continue } } @@ -199,11 +200,11 @@ func ProcPackDetail(url string, values map[string]interface{}, tableValue models } return ge.PackageName, nil } - git_id, typex, err := models.CreateYaml(&ge, tableValue) - if git_id > 0 && err == nil { - logs.Info("第 ", i, "条数据, PackageName: ", ge.PackageName, typex, "成功, git_id: ", git_id) + gitID, typeX, err := models.CreateYaml(&ge, tableValue) + if gitID > 0 && err == nil { + logs.Info("第 ", i, "条数据, PackageName: ", ge.PackageName, typeX, "成功, git_id: ", gitID) } else { - logs.Error("第 ", i, "条数据, PackageName: ", ge.PackageName, typex, "失败, err: ", err) + logs.Error("第 ", i, "条数据, PackageName: ", ge.PackageName, typeX, "失败, err: ", err) if strings.ContainsAny(string(err.Error()), "Duplicate entry") { ok, _ := models.GetSingleYaml(&ge) if ok { @@ -221,7 +222,7 @@ func ProcPackDetail(url string, values map[string]interface{}, tableValue models } return "", err } - if typex == "insert" && git_id > 0 { + if typeX == "insert" && gitID > 0 { _, pierr := GetPackageInfo(url, tableValue, ge) if pierr != nil { logs.Error("获取包详情失败, url: ", url, ", PackageName: ", ge.PackageName, ",version: ", ge.Version, ",err: ", pierr) @@ -232,8 +233,8 @@ func ProcPackDetail(url string, values map[string]interface{}, tableValue models } func GetPackageInfo(url string, tableValue models.GitPackageTable, ge models.GitOpenEuler) (string, error){ - subcompUrl := url + "/packages/packageInfo" + "?table_name=" + tableValue.TableName + "&pkg_name=" + ge.PackageName - body, err:= util.HttpGetCom(subcompUrl) + scpURL := url + "/packages/packageInfo" + "?table_name=" + tableValue.TableName + "&pkg_name=" + ge.PackageName + body, err:= util.HTTPGetCom(scpURL) var respBody map[string]interface{} if err == nil && body != nil { err =json.Unmarshal(body, &respBody) @@ -242,13 +243,13 @@ func GetPackageInfo(url string, tableValue models.GitPackageTable, ge models.Git return "", err } } else { - logs.Error( "http 请求失败, subcompUrl: ", subcompUrl) + logs.Error( "http 请求失败, scpURL: ", scpURL) return "", err } logs.Info(respBody) if respBody["code"].(string) == "2001"{ if respBody["data"] == nil || respBody["data"] == "" { - logs.Error("获取包详情失败, subcompUrl: ", subcompUrl) + logs.Error("获取包详情失败, scpURL: ", scpURL) return "", errors.New("数据错误") } var gp models.GitPackageInfo @@ -288,8 +289,8 @@ func GetPackageInfo(url string, tableValue models.GitPackageTable, ge models.Git } else { gb.SubPackName = packValue["name"].(string) } - SubId, typex, err := models.CreateYamlSubPack(&gb) - if SubId > 0 && typex == "insert" && err == nil { + SubID, typex, err := models.CreateYamlSubPack(&gb) + if SubID > 0 && typex == "insert" && err == nil { if packValue["provides"] != nil && len(packValue["provides"].([]interface{})) > 0{ provides := packValue["provides"].([]interface{}) for _, provValuex := range provides { @@ -299,7 +300,7 @@ func GetPackageInfo(url string, tableValue models.GitPackageTable, ge models.Git } provValue := provValuex.(map[string]interface{}) var gs models.GitSubPackProvides - gs.SubId = SubId + gs.SubId = SubID switch provValue["id"].(type) { case string: gs.Ids, _ = strconv.ParseInt(provValue["id"].(string), 10, 64) @@ -319,8 +320,8 @@ func GetPackageInfo(url string, tableValue models.GitPackageTable, ge models.Git } gs.Requiredby = "" - ProvideId, typexx, err := models.CreateYamlSubPackProvides(&gs) - if ProvideId > 0 && typexx == "insert" && err == nil { + ProvideID, typexx, err := models.CreateYamlSubPackProvides(&gs) + if ProvideID > 0 && typexx == "insert" && err == nil { if provValue["requiredby"] != nil && len(provValue["requiredby"].([]interface{})) > 0{ requiredby := provValue["requiredby"].([]interface{}) for _, reqValue := range requiredby { @@ -328,8 +329,8 @@ func GetPackageInfo(url string, tableValue models.GitPackageTable, ge models.Git var gr models.GitSubPackRequiredby gr.ProvideId = gs.ProvideId gr.Requiredby = reqValue.(string) - Id, typexy, err := models.CreateYamlSubPackRequiredb(&gr) - logs.Info("CreateYamlSubPackRequiredb", Id, typexy, err) + ID, typexy, err := models.CreateYamlSubPackRequiredb(&gr) + logs.Info("CreateYamlSubPackRequiredb", ID, typexy, err) } } } @@ -357,7 +358,7 @@ func GetPackageInfo(url string, tableValue models.GitPackageTable, ge models.Git reqStr = reqStr[:len(reqStr) -1] } var gs models.GitSubPackRequire - gs.SubId = SubId + gs.SubId = SubID switch reqValuex["id"].(type) { case string: gs.Ids, _ = strconv.ParseInt(reqValuex["id"].(string), 10, 64) @@ -376,8 +377,8 @@ func GetPackageInfo(url string, tableValue models.GitPackageTable, ge models.Git gs.RequireName = reqValuex["name"].(string) } gs.Providedby = reqStr - RequireId, typexx, err := models.CreateYamlSubPackRequires(&gs) - logs.Info("CreateYamlSubPackRequires", RequireId, typexx, err) + RequireID, typexx, err := models.CreateYamlSubPackRequires(&gs) + logs.Info("CreateYamlSubPackRequires", RequireID, typexx, err) } } } diff --git a/tests/createrepo_test.go b/tests/createrepo_test.go index c24fc6e..3750e66 100644 --- a/tests/createrepo_test.go +++ b/tests/createrepo_test.go @@ -71,7 +71,7 @@ func PostGroupRepo(packName string) error { "private": "false" }`, accessToken, packName, packName) logs.Info("isssue_body: ", requestBody) - resp, err := util.HttpPost(url, requestBody) + resp, err := util.HTTPPost(url, requestBody) if err != nil { logs.Error("创建",packName,"失败, err: ", err) return err @@ -99,7 +99,7 @@ func PostRepo(packName string) error{ "private": "false" }`, accessToken, packName, packName) logs.Info("isssue_body: ", requestBody) - resp, err := util.HttpPost(url, requestBody) + resp, err := util.HTTPPost(url, requestBody) if err != nil { logs.Error("创建",packName,"失败, err: ", err) return err @@ -122,7 +122,7 @@ func CreateBrand(packName string) error{ "branch_name": "openEuler-20.03-LTS" }`, accessToken) logs.Info("isssue_body: ", requestBody) - resp, err := util.HttpPost(url, requestBody) + resp, err := util.HTTPPost(url, requestBody) if err != nil { logs.Error("创建分支:openEuler-20.03-LTS",packName,"失败, err: ", err) return err diff --git a/util/http.go b/util/http.go index 527153a..38a6b0d 100644 --- a/util/http.go +++ b/util/http.go @@ -12,15 +12,19 @@ import ( "strings" ) +//RequestInfo http request information type RequestInfo struct { - Url string - Data map[string]string //post要传输的数据,必须key value必须都是string + URL string + Data map[string]string //post要传输的数据,必须key value必须都是string DataInterface map[string]interface{} } - -func HttpPatch(url string, requestBody string) (map[string]interface{}, error){ +//HTTPPatch patch request +func HTTPPatch(url string, requestBody string) (map[string]interface{}, error) { req, err := http.NewRequest("PATCH", url, bytes.NewBuffer([]byte(requestBody))) + if err != nil { + return nil, err + } req.Header.Set("Content-Type", "application/json") client := &http.Client{} resp, err := client.Do(req) @@ -44,7 +48,7 @@ func HttpPatch(url string, requestBody string) (map[string]interface{}, error){ } logs.Info("post 返回成功!, body: ", string(body)) var iss map[string]interface{} - err =json.Unmarshal(body, &iss) + err = json.Unmarshal(body, &iss) if err != nil { logs.Error(err, string(body)) return nil, err @@ -53,9 +57,12 @@ func HttpPatch(url string, requestBody string) (map[string]interface{}, error){ return iss, nil } - -func HttpPost(url string, requestBody string) (map[string]interface{}, error){ +//HTTPPost post request +func HTTPPost(url string, requestBody string) (map[string]interface{}, error) { req, err := http.NewRequest("POST", url, bytes.NewBuffer([]byte(requestBody))) + if err != nil { + return nil, err + } req.Header.Set("Content-Type", "application/json") client := &http.Client{} resp, err := client.Do(req) @@ -79,7 +86,7 @@ func HttpPost(url string, requestBody string) (map[string]interface{}, error){ } logs.Info("post 返回成功!, body: ", string(body)) var iss map[string]interface{} - err =json.Unmarshal(body, &iss) + err = json.Unmarshal(body, &iss) if err != nil { logs.Error(err, string(body)) return nil, err @@ -88,8 +95,12 @@ func HttpPost(url string, requestBody string) (map[string]interface{}, error){ return iss, nil } -func HttpPost1(url string, requestBody string) ([]map[string]interface{}, error){ +//HTTPPost1 post request +func HTTPPost1(url string, requestBody string) ([]map[string]interface{}, error) { req, err := http.NewRequest("POST", url, bytes.NewBuffer([]byte(requestBody))) + if err != nil { + return nil, err + } req.Header.Set("Content-Type", "application/json") client := &http.Client{} resp, err := client.Do(req) @@ -113,7 +124,7 @@ func HttpPost1(url string, requestBody string) ([]map[string]interface{}, error) } logs.Info("post 返回成功!, body: ", string(body)) var iss []map[string]interface{} - err =json.Unmarshal(body, &iss) + err = json.Unmarshal(body, &iss) if err != nil { logs.Error(err, string(body)) return nil, err @@ -122,41 +133,42 @@ func HttpPost1(url string, requestBody string) ([]map[string]interface{}, error) return iss, nil } -func PostUrlEncoded(this RequestInfo)([]byte,error){ +//PostURLEncoded request params encode +func PostURLEncoded(this RequestInfo) ([]byte, error) { client := &http.Client{} //post要提交的数据 - DataUrlVal := url.Values{} - for key,val := range this.Data{ - DataUrlVal.Add(key,val) + DataURLVal := url.Values{} + for key, val := range this.Data { + DataURLVal.Add(key, val) } - req,err := http.NewRequest("POST",this.Url,strings.NewReader(DataUrlVal.Encode())) - if err != nil{ + req, err := http.NewRequest("POST", this.URL, strings.NewReader(DataURLVal.Encode())) + if err != nil { logs.Error(err) - return nil,err + return nil, err } //伪装头部 - req.Header.Set("Accept","application/json") - req.Header.Add("Content-Type","application/x-www-form-urlencoded") + req.Header.Set("Accept", "application/json") + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") //提交请求 - resp,err := client.Do(req) - defer resp.Body.Close() - if err != nil{ + resp, err := client.Do(req) + if err != nil { logs.Error(err) - return nil,err + return nil, err } + defer resp.Body.Close() //读取返回值 - result,err := ioutil.ReadAll(resp.Body) - if err != nil{ + result, err := ioutil.ReadAll(resp.Body) + if err != nil { logs.Error(err) - return nil,err + return nil, err } logs.Info(string(result)) - return result,nil + return result, nil } - -func HttpGet(url string) ([]map[string]interface{}, error){ +//HTTPGet get request +func HTTPGet(url string) ([]map[string]interface{}, error) { resp, err := http.Get(url) if err != nil { logs.Error("get error, url:", url, "error: ", err) @@ -167,18 +179,18 @@ func HttpGet(url string) ([]map[string]interface{}, error){ if err != nil { logs.Error("url:", url, ",err: ", err) return nil, err - }else { - logs.Info("body: \n", string(body), "url: ", url) } + logs.Info("body: \n", string(body), "url: ", url) var col []map[string]interface{} - err =json.Unmarshal(body, &col) + err = json.Unmarshal(body, &col) if err != nil { logs.Error(err) } return col, nil } -func HttpGetCom(url string) ([]byte, error){ +//HTTPGetCom common get request +func HTTPGetCom(url string) ([]byte, error) { resp, err := http.Get(url) if err != nil { logs.Error("get error, url:", url, "error: ", err) @@ -189,8 +201,7 @@ func HttpGetCom(url string) ([]byte, error){ if err != nil { logs.Error(err) return nil, err - }else { - logs.Info("body: \n", string(body), "url: ", url) } + logs.Info("body: \n", string(body), "url: ", url) return body, nil -} \ No newline at end of file +} diff --git a/util/parsepayload.go b/util/parsepayload.go index 9e0a935..5df705c 100644 --- a/util/parsepayload.go +++ b/util/parsepayload.go @@ -9,54 +9,84 @@ import ( ) const ( - KwAnalysisDesc = "影响性分析说明:" + //KwAnalysisDesc 影响性分析说明的关键字 + KwAnalysisDesc = "影响性分析说明:" + //KwOpenEulerScore openEuler评分的关键字 KwOpenEulerScore = "openEuler评分:" - KwEffectVersion = "受影响版本排查(受影响/不受影响):" + //KwEffectVersion 受影响的版本的关键字 + KwEffectVersion = "受影响版本排查(受影响/不受影响):" ) var ( - LAC = "LAC" //漏洞组件标签 - LN = "LN" //漏洞编号标签 - LAV = "LAV" //漏洞版本标签 - CVS = "CVS" //cvss 3.0分值标签 - CVV = "CVV" //cvss 3.1向量标签 - LD = "LD" //漏洞描述标签 - IAD = "IAD" //影响分析说明标签 - PA = "PA" //原理分析标签 - OES = "OES" //openEuler评分标签 - OEV = "OEV" //openEuler向量标签 - IV = "IV" //影响的版本标签 - CPMM = "CPMM" //规避方案措施 - IW = "IW" //影响的包 + //LAC 漏洞组件标签 + //LAC = "LAC" + //LN 漏洞编号标签 + //LN = "LN" + //LAV 漏洞版本标签 + //LAV = "LAV" + //CVS cvss 3.0分值标签 + //CVS = "CVS" + //CVV cvss 3.1向量标签 + //CVV = "CVV" + //LD 漏洞描述标签 + LD = "LD" + //IAD 影响分析说明标签 + IAD = "IAD" + //PA 原理分析标签 + PA = "PA" + //OES openEuler评分标签 + OES = "OES" + //OEV openEuler向量标签 + OEV = "OEV" + //IV 影响的版本标签 + IV = "IV" + //CPMM 规避方案措施 + CPMM = "CPMM" + //IW 影响的包 + IW = "IW" + //CommentKeys 新版评论解析的关键字 CommentKeys = []string{KwAnalysisDesc, KwOpenEulerScore, KwEffectVersion} ) var ( - CvsScoreV3 = "v3" - CvsScoreV2 = "v2" + //CvsScoreV3 nveScoreType v3 + CvsScoreV3 = "v3" + //CvsScoreV2 nveScoreType V2 + CvsScoreV2 = "v2" + //RegexpCveNumber cveNum extract regexp RegexpCveNumber = regexp.MustCompile(`漏洞编号[::](?s:(.*?))漏洞归属组件[::]`) - RegexpCveNumberLink = regexp.MustCompile(`\[(.*?)\]\((.*?)\)`) + regexpCveNumberLink = regexp.MustCompile(`\[(.*?)\]\((.*?)\)`) + //RegexpCveComponents components extract regexp RegexpCveComponents = regexp.MustCompile(`漏洞归属组件[::](?s:(.*?))漏洞归属的?版本[::]`) - RegexpCveVersion = regexp.MustCompile(`漏洞归属的?版本[::](?s:(.*?))CVSS V[23].0分值[::]`) - RegexpCveScore = regexp.MustCompile(`CVSS V[23].0分值[::](?s:(.*?))漏洞[简描]述[::]`) - //RegexpCveScore = regexp.MustCompile(`CVSS V3.0分值[::](?s:(.*?))Vector[::]`) - //RegexpCveVector = regexp.MustCompile(`Vector[::](?s:(.*?))(漏洞简述[::])`) - RegexpCveBriefDesc = regexp.MustCompile(`漏洞[简描]述[::](?s:(.*?))影响性分析说明[::]`) - RegexpCveInfluencesDesc = regexp.MustCompile(`影响性分析说明[::](?s:(.*?))原理分析[::]`) + //RegexpCveVersion cveVersion extract regexp + RegexpCveVersion = regexp.MustCompile(`漏洞归属的?版本[::](?s:(.*?))CVSS V[23].0分值[::]`) + //RegexpCveScore cveScore extract regexp + RegexpCveScore = regexp.MustCompile(`CVSS V[23].0分值[::](?s:(.*?))漏洞[简描]述[::]`) + //RegexpCveBriefDesc brief description extract regexp + RegexpCveBriefDesc = regexp.MustCompile(`漏洞[简描]述[::](?s:(.*?))影响性分析说明[::]`) + //RegexpCveInfluencesDesc influences description regexp + RegexpCveInfluencesDesc = regexp.MustCompile(`影响性分析说明[::](?s:(.*?))原理分析[::]`) + //RegexpCveInfluencesDescNew new tpl influences description regexp RegexpCveInfluencesDescNew = regexp.MustCompile(`影响性分析说明[::](?s:(.*?))openEuler评分[::]`) - RegexpCvePrincipleDesc = regexp.MustCompile(`原理分析[::](?s:(.*?))openEuler评分[::]`) - RegexpCveOpScore = regexp.MustCompile(`openEuler评分[::](?s:(.*?))受影响版本[::]`) - RegexpCveOpScoreNew = regexp.MustCompile(`openEuler评分[::](?s:(.*?))受影响版本排查\(受影响/不受影响\)[::]`) - //RegexpCveOpScore1 = regexp.MustCompile(`openEuler评分[::](?s:(.*?))受影响版本[::]`) - //RegexpCveOpVector = regexp.MustCompile(`openEulerVector[::](?s:(.*?))受影响版本[::]`) - RegexpCveInfluencesVersion = regexp.MustCompile(`受影响版本[::](?s:(.*?))规避方案或消减措施[::]`) + //RegexpCvePrincipleDesc principle description regexp + RegexpCvePrincipleDesc = regexp.MustCompile(`原理分析[::](?s:(.*?))openEuler评分[::]`) + //RegexpCveOpScore openEuler score regexp + RegexpCveOpScore = regexp.MustCompile(`openEuler评分[::](?s:(.*?))受影响版本[::]`) + //RegexpCveOpScoreNew new tpl openEuler score regexp + RegexpCveOpScoreNew = regexp.MustCompile(`openEuler评分[::](?s:(.*?))受影响版本排查\(受影响/不受影响\)[::]`) + //RegexpCveInfluencesVersion influences version regexp + RegexpCveInfluencesVersion = regexp.MustCompile(`受影响版本[::](?s:(.*?))规避方案或消减措施[::]`) + //RegexpCveInfluencesVersionNew new tpl influences version regexp RegexpCveInfluencesVersionNew = regexp.MustCompile(`受影响版本排查\(受影响/不受影响\)[::](?s:(.*?))$`) - RegexpCvePlannedMeasures = regexp.MustCompile(`规避方案或消减措施[::](?s:(.*?))受影响的包[::]`) - RegexpCvePlannedMeasures1 = regexp.MustCompile(`规避方案或消减措施[::](?s:(.*?))$`) - RegexpCveInfluencesPkg = regexp.MustCompile(`受影响的包[::](?s:(.*?))$`) + //RegexpCvePlannedMeasures the cve planned measures regexp + RegexpCvePlannedMeasures = regexp.MustCompile(`规避方案或消减措施[::](?s:(.*?))受影响的包[::]`) + //RegexpCvePlannedMeasures1 the second cve planned measures regexp + RegexpCvePlannedMeasures1 = regexp.MustCompile(`规避方案或消减措施[::](?s:(.*?))$`) + //RegexpCveInfluencesPkg the cve influences package regexp + RegexpCveInfluencesPkg = regexp.MustCompile(`受影响的包[::](?s:(.*?))$`) + //RegexpDigital digital regexp + RegexpDigital = regexp.MustCompile(`(\d){1,}(\.\d+)?`) RegexpSpecialDigital = regexp.MustCompile(`(CVSS[::]3.0|CVSS[::]2.0|cvss[::]3.0|cvss[::]2.0|3.0/|2.0/|3.0 /|2.0 /)*`) //^((CVSS:3.0|CVSS:2.0|3.0/|2.0/|3.0 /|2.0 /).)*$ - RegexpDigital = regexp.MustCompile(`(\d){1,}(\.?\d+)?`) //(\d){1,}(\.\d+)? - //`/AV:[NLAP]/AC:[HL]/PR:[NLH]/UI:[NR]/S:[UC]/C:[NLH]/I:[HNL]/A:[LNH]` RegexpVector = regexp.MustCompile(`AV:[NLAP](?s:(.*?))/A:[LNH]`) RegexpVectorV2 = regexp.MustCompile(`AV:[LAN](?s:(.*))/Au:[MSN](?s:(.*))/A:[NPC]`) RegexpScoreTypeV2 = regexp.MustCompile(`(?mi)^CVSS v2.0分值\s*`) @@ -69,16 +99,21 @@ var ( ) var ( + //VectorMapV2 the vector v2.0 map VectorMapV2 map[string]map[string]string - VectorMap map[string]map[string]string - mutex sync.Mutex + //VectorMap the vector v3.0 map + VectorMap map[string]map[string]string + mutex sync.Mutex ) +//CommentAnalysis issue comment analysis keyword and value container type CommentAnalysis struct { KeyName string KeyIdx int KeyValue string } + +//CaSlice define the CommentAnalysis slice type CaSlice []CommentAnalysis func (a CaSlice) Len() int { @@ -109,10 +144,10 @@ func init() { mPr["N"] = "None" mPr["L"] = "Low" VectorMap["PR"] = mPr - mUi := make(map[string]string) - mUi["N"] = "None" - mUi["R"] = "Require" - VectorMap["UI"] = mUi + mUI := make(map[string]string) + mUI["N"] = "None" + mUI["R"] = "Require" + VectorMap["UI"] = mUI mS := make(map[string]string) mS["U"] = "Unchanged" mS["C"] = "Changed" @@ -184,7 +219,7 @@ func GenerateCommentAnalysis(content string) (ca CaSlice) { //sort by index sort.Sort(ca) //extract keyword value - for k, _ := range ca { + for k := range ca { if k == len(ca)-1 { start := ca[k].KeyIdx + len(ca[k].KeyName) ca[k].KeyValue = content[start:] @@ -209,11 +244,13 @@ func ParseCommentContent(content string, label string) (res string, ok bool) { return } +//ParseCommentVector extract vector from issue comment func ParseCommentVector(content string) string { sm := RegexpVector.Find([]byte(content)) return string(sm) } +//ExtractVector extract vector from issue body func ExtractVector(body, scoreType string) string { if body == "" { return body @@ -233,7 +270,8 @@ func ExtractVector(body, scoreType string) string { return "" } -func ReadVmValue(kStr string) (value string) { +//ReadVMValue get vector v3 value from the vector map by keyword +func ReadVMValue(kStr string) (value string) { if kStr == "" { return "" } @@ -253,7 +291,8 @@ func ReadVmValue(kStr string) (value string) { return } -func ReadVmValueV2(kStr string) (value string) { +//ReadVMValueV2 get vector v2 value from the vector map by keyword +func ReadVMValueV2(kStr string) (value string) { if kStr == "" { return "" } @@ -273,6 +312,7 @@ func ReadVmValueV2(kStr string) (value string) { return } +//VctToMap Convert vector string value to map func VctToMap(vct string) (vctMap map[string]string, ok bool) { if vct == "" { return nil, false @@ -291,11 +331,12 @@ func VctToMap(vct string) (vctMap map[string]string, ok bool) { } if len(vMap) > 0 { return vMap, true - } else { - return nil, false } + return nil, false + } +//ParseCommentWithAllLabel extract comment value with custom label func ParseCommentWithAllLabel(content string) map[string]string { res := make(map[string]string, 0) s, ok := ParseCommentContent(content, IAD) @@ -333,6 +374,7 @@ func ParseCommentWithAllLabel(content string) map[string]string { return res } +//ExtractCommentAnalysisAllValue Extract all value by issue comment func ExtractCommentAnalysisAllValue(content string) map[string]string { res := make(map[string]string, 0) ca := GenerateCommentAnalysis(content) @@ -351,17 +393,18 @@ func ExtractCommentAnalysisAllValue(content string) map[string]string { value, ext = ExtractCommentValue(ca, KwOpenEulerScore) if ext { score, vector := ExtractCommentOpenEulerScore(value) - if score != ""{ - res["openeuler_score"] = score + if score != "" { + res["openeuler_score"] = score } if vector != "" { - res["openeuler_vector"] = vector + res["openeuler_vector"] = vector } } } return res } +//ExtractCommentEffectVersion Extract the affected version from the issue comment func ExtractCommentEffectVersion(str string) string { str = strings.Trim(str, " ") var res []string @@ -398,6 +441,7 @@ func ExtractCommentEffectVersion(str string) string { return "" } +//ExtractCommentValue Get the value of CaSlice by keyword func ExtractCommentValue(ca CaSlice, keyWord string) (string, bool) { for _, v := range ca { if v.KeyName == keyWord { @@ -407,6 +451,7 @@ func ExtractCommentValue(ca CaSlice, keyWord string) (string, bool) { return "", false } +//ExtractCommentOpenEulerScore Extract openEuler score from issue comment func ExtractCommentOpenEulerScore(str string) (score, vector string) { str = TrimString(str) score = ExtractDigital(str) @@ -421,6 +466,7 @@ func genCommentRegexpStr(label string) string { return fmt.Sprintf(`\[%s\](?s:(.*?))\[/%s\]`, label, label) } +//TrimString Remove the \n \r \t spaces in the string func TrimString(str string) string { str = strings.Replace(str, " ", "", -1) str = strings.Replace(str, "\n", "", -1) @@ -429,6 +475,7 @@ func TrimString(str string) string { return str } +//TrimStringNR Remove the \n \r in the string func TrimStringNR(str string) string { str = strings.Replace(str, "\n", "", -1) str = strings.Replace(str, "\r", "", -1) @@ -436,6 +483,7 @@ func TrimStringNR(str string) string { return str } +//ExtractDigital Get number in string func RemoveSpecialDigital(body string) string { if body == "" { return body @@ -465,13 +513,13 @@ func ExtractDigital(body string) string { return "" } +//GetCveNumber Extract cveNum from the issue body cveNumber link func GetCveNumber(ov string) string { - if v := RegexpCveNumberLink.Find([]byte(ov)); len(v) > 0 { + if v := regexpCveNumberLink.Find([]byte(ov)); len(v) > 0 { sv := string(v) start := strings.Index(sv, "[") + 1 end := strings.Index(sv, "]") return sv[start:end] - } else { - return ov } + return ov } -- Gitee From ed04cda795210f58e15b82f7fab670506c4bb038 Mon Sep 17 00:00:00 2001 From: zhangjianjun_code <7844966+zhangjianjun_code@user.noreply.gitee.com> Date: Wed, 14 Oct 2020 10:09:41 +0800 Subject: [PATCH 3/5] 1. Add user error feedback interface; 2. Modify the bug encountered in the test; 2. Add the cve detail display link in the issue template; 3. Add the dockerfile file --- Dockerfile | 30 ++++++ common/common.go | 18 ++++ conf/app.conf | 15 +-- conf/product_app.conf | 102 ++++++++++++++++++ controllers/cvedetail.go | 220 +++++++++++++++++++++++++++++++++++++++ controllers/upload.go | 90 ++++++++++++++++ doc/sql/db_struct.sql | 73 ++++++------- models/cve.go | 6 +- models/cvedetail.go | 150 ++++++++++++++++++++++++++ models/issue.go | 3 +- models/modeldb.go | 43 ++++---- models/uploadcve.go | 21 ++++ routers/router.go | 10 ++ task/inittask.go | 26 +++++ task/printlog.go | 50 +++++++++ taskhandler/common.go | 49 +++++++-- taskhandler/cve.go | 6 ++ taskhandler/yaml.go | 4 - util/parsepayload.go | 3 +- 19 files changed, 840 insertions(+), 79 deletions(-) create mode 100644 Dockerfile create mode 100644 conf/product_app.conf create mode 100644 controllers/cvedetail.go create mode 100644 models/cvedetail.go create mode 100644 task/printlog.go diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..b66da06 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,30 @@ +FROM centos + +FROM library/golang + +# Godep for vendoring +RUN go get github.com/tools/godep + +# Recompile the standard library without CGO +RUN CGO_ENABLED=0 go install -a std + +ENV APP_DIR $GOPATH\src\cve-manager +RUN mkdir -p $APP_DIR + +# Set the entrypoint +ENTRYPOINT (cd $APP_DIR && ./\src\cve-manager) +ADD . $APP_DIR + +# Compile the binary and statically link +RUN cd $APP_DIR && CGO_ENABLED=0 godep go build -ldflags '-d -w -s' + +EXPOSE 80 + +# copy binary config and utils +FROM golang:latest +RUN mkdir -p /opt/cve-manager/conf +COPY ./conf/product_app.conf /opt/cve-manager/app.conf +COPY ./cve-manager/cve-manager /opt/cve-manager + +WORKDIR /opt/app/ +ENTRYPOINT ["/opt/app/cve-manager"] \ No newline at end of file diff --git a/common/common.go b/common/common.go index f5f2c22..e5238e1 100644 --- a/common/common.go +++ b/common/common.go @@ -305,6 +305,24 @@ type UploadData struct { CveData []CveOriginData } +type CveOriginDetailData struct { + CveNum string `json:"cveNum"` + CvePackName string `json:"cvePackName"` + Description CveDescription `json:"description"` + Title string `json:"title"` + Configurations CveConfigurations `json:"configurations"` + CnnvdID string `json:"cnnvdID"` + CnvdID string `json:"cnvdID"` + PublishedDate string `json:"publishedDate"` + Impact CveImpact `json:"impact"` + VulStatus string `json:"vulStatus"` + Poc CvePoc `json:"poc"` + Event CveEvent `json:"event"` + ReferenceData []CveReferenceData `json:"referenceData"` + VulType CveVulType `json:"vulType"` + FixSuggest CveFixSuggest `json:"fixSuggest"` +} + func GetRepoOrg() (string, error) { BConfig, err := config.NewConfig("ini", "conf/app.conf") if err != nil{ diff --git a/conf/app.conf b/conf/app.conf index 634471b..93cf1bc 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -21,13 +21,13 @@ approveCmd = "/approve" [mysql] -#dbhost = 127.0.0.1 -dbhost = 159.138.2.2 +dbhost = 192.168.1.95 +#dbhost = 159.138.2.2 dbport = 3306 #dbuser = "${DB_USER||root}" dbuser = "${DB_USER||cve}" -#dbpwd = "${DB_PWD||***}" -dbpwd = "+KAOKtEnEn7gRlDEIjeh59lutAMw2688YOqKVJQ2+Lo=" +dbpwd = "${DB_PWD||***}" +#dbpwd = "+KAOKtEnEn7gRlDEIjeh59lutAMw2688YOqKVJQ2+Lo=" dbname = cvevulner dbprefix = cve_ maxidle = 30 @@ -36,6 +36,7 @@ maxconn = 3000 [log] log_level = 7 +log_dir = ./logs #log_path = C:\GoPject\src\cvevulner\logs\cve.log log_path = logs/cve.log maxlines=200000 @@ -44,13 +45,13 @@ maxsize=1024000 [crontab] ymalflag = 2 getymal = 00 00 23 * * * -cveflag = 1 +cveflag = 2 getcve = 00 00 01 * * * oricveflag = 2 oricvecheck = 00 00 02 * * * getissueflag = 2 getissue = 00 00 03 * * * -issueflag = 1 +issueflag = 2 createissue = * * 01 * * * test = 0/10 * * * * * gittokenflag = 1 @@ -59,6 +60,8 @@ genexcelflag = 2 genexcel = 00 00 04 * * * days = -30 prcnum = 100 +printlogflag = 1 +printlog = 0 */10 * * * * [gitee] diff --git a/conf/product_app.conf b/conf/product_app.conf new file mode 100644 index 0000000..0697ea9 --- /dev/null +++ b/conf/product_app.conf @@ -0,0 +1,102 @@ +#appname = cvevulner +appname = cve_manager +httpport = 80 +runmode = dev +autorender = false +copyrequestbody = true +EnableDocs = true +sqlconn = +# 登录双方约定的key +key = "${AES_KEY||djS*@+8K9{J!ymk6}" +initdb = 1 +# 登录key +loginkey = "{${LOGIN_KEY||djS*@+8K9{-!yo%64}" +# token 有效期,单位:天 +token_expir_time=3 +#分析指令 +analysisCmd = "/analysis" +endCmd = "/done" +rejectCmd = "/reject" +approveCmd = "/approve" + + +[mysql] +#dbhost = 127.0.0.1 +dbhost = fafd55e8084b402d9998539b072eef7fin01.internal.ap-southeast-1.mysql.rds.myhuaweicloud.com +dbport = 3306 +#dbuser = "${DB_USER||root}" +dbuser = "${DB_USER||cve}" +dbpwd = "${DB_PWD||***}" +dbname = cvevulner +dbprefix = cve_ +maxidle = 30 +maxconn = 3000 + + +[log] +log_level = 7 +#log_path = C:\GoPject\src\cvevulner\logs\cve.log +log_path = logs/cve.log +maxlines=200000 +maxsize=1024000 + +[crontab] +ymalflag = 2 +getymal = 00 00 23 * * * +cveflag = 2 +getcve = 00 00 01 * * * +oricveflag = 2 +oricvecheck = 00 00 02 * * * +getissueflag = 2 +getissue = 00 00 03 * * * +issueflag = 2 +createissue = * * 01 * * * +test = 0/10 * * * * * +gittokenflag = 1 +issueoath = * * */20 * * * +genexcelflag = 2 +genexcel = 00 00 04 * * * +days = -30 +prcnum = 100 + + +[gitee] +#owner = xwzQmxx +#path = test +#email = 1499273991@qq.com +#redirect_uri = http://119.8.126.102:80/v1/issue/oauth/callback +# -------jianjun gitee 配置 -------- +owner = src-openeuler +path = jasper +email = 7844966+zhangjianjun_code@user.noreply.gitee.com +redirect_uri = http://159.138.2.2:80/v1/issue/oauth/callback + +scope = user_info projects pull_requests issues notes keys hook groups gists enterprises emails +# 优先从系统环境变量获取 获取失败使用默认值 **** +client_id = "${GITEE_CLIENT_ID||****}" +client_secret = "${GITEE_CLIENT_SECRET||****}" +password = "${GITEE_PASSWORD||****}" + +# git token +git_token = "${GITEE_TOKEN||xxx}" + +[hook] +hookpwd = "${HOOK_PWD||***}" +hookurl = http://159.138.2.2:80/v1/issue/hook/event +#hookurl = http://119.8.126.102:80/v1/issue/hook/event + + +[yaml] +apiurl = https://api.openeuler.org/pkgmanage + +[cve] +cveref = https://nvd.nist.gov/vuln/detail/ +openeulernum = 3000 + +[reflink] +comment_cmd = https://gitee.com/openeuler/cve-manager/blob/master/doc/md/manual.md + +[excel] +forcerewrite = false +snprefix = op-2020-10- +snsuffix = 1002 \ No newline at end of file diff --git a/controllers/cvedetail.go b/controllers/cvedetail.go new file mode 100644 index 0000000..9dea1e4 --- /dev/null +++ b/controllers/cvedetail.go @@ -0,0 +1,220 @@ +package controllers + +import ( + "cvevulner/common" + "cvevulner/errcode" + "cvevulner/models" + "github.com/astaxie/beego" + "github.com/astaxie/beego/logs" +) + +// Operations about Packages + +type CveDetailController struct { + beego.Controller +} + +func (c *CveDetailController) RetData(resp map[string]interface{}) { + c.Data["json"] =resp + c.ServeJSON() +} + + +// @Title Get cvedetail +// @Description get cvedetail +// @Param cvenumber type string true +// @Success 200 {object} models.uploadcve +// @Failure 403 :cvenumber is err +// @router / [get] +func (u *CveDetailController) Get() { + req := u.Ctx.Request + addr := req.RemoteAddr + logs.Info("Method: ",req.Method, "客户端请求的:addr: ", addr, "Header: ", req.Header, "body: ", req.Body) + resp := make(map[string]interface{}) + var cod common.CveOriginDetailData + resp["errno"]=errcode.RecodeUnknowErr + resp["errmsg"]=errcode.RecodeText(errcode.RecodeUnknowErr) + resp["body"] = cod + defer u.RetData(resp) + cveNum := u.GetString("cveNum") + if cveNum == "" { + logs.Error("cveNum, 参数错误") + resp["errno"]=errcode.RecodeParamErr + resp["errmsg"]=errcode.RecodeText(errcode.RecodeParamErr) + return + } + cveType, typeError := u.GetInt("cveType") + if typeError != nil || cveType == 0 { + logs.Error("cveType, 参数错误") + resp["errno"]=errcode.RecodeParamErr + resp["errmsg"]=errcode.RecodeText(errcode.RecodeParamErr) + return + } + // 原始数据来源于中科院展示 + if cveType == 1 { + var ou models.OriginUpstream + ouErr := models.GetOriginUpstream(cveNum, &ou) + if ouErr != nil || ou.CveId == 0{ + resp["errno"]=errcode.RecodeNodata + resp["errmsg"]=errcode.RecodeText(errcode.RecodeNodata) + return + } + cod.CveNum = ou.CveNum + cod.CvePackName = ou.PackName + cod.Title = ou.Title + cod.CnnvdID = ou.CnnvdID + cod.CnvdID = ou.CnvdID + cod.PublishedDate = ou.PublishedDate + cod.VulStatus = ou.VulStatus + + var oud models.OriginUpstreamDesc + oudErr := models.GetOriginDesc(ou.CveId, &oud) + if oudErr == nil && oud.DescId > 0 { + cod.Description.EnDesc = oud.EnDescription + cod.Description.ZhDesc = oud.ZhDescription + } + var ouc models.OriginUpstreamConfig + oucErr := models.GetOriginConfig(ou.CveId, &ouc) + if oucErr == nil && ouc.ConfId > 0 { + var oucn []models.OriginUpstreamConfigNode + var cf common.CveConfigurations + oucnNum, oucnErr := models.GetOriginConfigNode(ouc.ConfId, &oucn) + if oucnNum > 0 && oucnErr == nil { + for _, nodes := range oucn { + var cn common.ConfNodes + cn.Operator = nodes.Operator + var oucnc []models.OriginUpstreamConfigNodeCpe + oucncNum, oucncErr := models.GetOriginConfigNodeCpe(nodes.NodeId, &oucnc) + if oucncNum > 0 && oucncErr == nil { + for _, cpe := range oucnc { + var cnc common.NodeCpe + cnc.Vulnerable = cpe.Vulnerable + cnc.CpeMatchString = cpe.CpeMatchString + cnc.Cpe23Uri = cpe.Cpe23Uri + cn.Cpe = append(cn.Cpe, cnc) + } + } + cf.Nodes = append(cf.Nodes, cn) + } + } + cod.Configurations = cf + } + cveImpact, ok := models.QueryCveImpact(ou.CveId) + if ok && cveImpact.ImpactId > 0 { + cveScore, ok := models.QueryCveScore(cveImpact.ImpactId, "v3") + if ok && cveScore.ScoreId > 0{ + cveScV3, ok := models.QueryCveCvssV3(cveScore.ScoreId) + if ok && cveScV3.V3Id > 0 { + logs.Info(cveScV3) + cod.Impact.BaseMetricV3.CvssV3.Version = cveScV3.Version + cod.Impact.BaseMetricV3.CvssV3.VectorString = cveScV3.VectorString + cod.Impact.BaseMetricV3.CvssV3.AttackComplexity = cveScV3.AttackComplexity + cod.Impact.BaseMetricV3.CvssV3.AttackVector = cveScV3.AttackVector + cod.Impact.BaseMetricV3.CvssV3.AvailabilityImpact = cveScV3.AvailabilityImpact + cod.Impact.BaseMetricV3.CvssV3.BaseSeverity = cveScV3.BaseSeverity + cod.Impact.BaseMetricV3.CvssV3.UserInteraction = cveScV3.UserInteraction + cod.Impact.BaseMetricV3.CvssV3.BaseScore = cveScV3.BaseScore + cod.Impact.BaseMetricV3.CvssV3.PrivilegesRequired = cveScV3.PrivilegesRequired + cod.Impact.BaseMetricV3.CvssV3.ConfidentialityImpact = cveScV3.ConfidentialityImpact + cod.Impact.BaseMetricV3.CvssV3.IntegrityImpact = cveScV3.IntegrityImpact + cod.Impact.BaseMetricV3.CvssV3.Scope = cveScV3.Scope + cod.Impact.BaseMetricV3.ExploitabilityScore = cveScV3.ExploitabilityScore + cod.Impact.BaseMetricV3.ImpactScore = cveScV3.ImpactScore + } + } + cveScoreV2, ok2 := models.QueryCveScore(cveImpact.ImpactId, "v2") + if ok2 && cveScoreV2.ScoreId > 0 { + cveScV2, okV2 := models.QueryCveCvssV2(cveScoreV2.ScoreId) + if okV2 && cveScV2.V2Id > 0 { + logs.Info(cveScV2) + cod.Impact.BaseMetricV2.CvssV2.VectorString = cveScV2.VectorString + cod.Impact.BaseMetricV2.CvssV2.AccessComplexity = cveScV2.AccessComplexity + cod.Impact.BaseMetricV2.CvssV2.AvailabilityImpact = cveScV2.AvailabilityImpact + cod.Impact.BaseMetricV2.CvssV2.Authentication = cveScV2.Authentication + cod.Impact.BaseMetricV2.CvssV2.Version = cveScV2.Version + cod.Impact.BaseMetricV2.CvssV2.BaseScore = cveScV2.BaseScore + cod.Impact.BaseMetricV2.CvssV2.IntegrityImpact = cveScV2.IntegrityImpact + cod.Impact.BaseMetricV2.CvssV2.ConfidentialityImpact = cveScV2.ConfidentialityImpact + cod.Impact.BaseMetricV2.CvssV2.AccessVector = cveScV2.AccessVector + cod.Impact.BaseMetricV2.AcInsufInfo = cveScV2.AcInsufInfo + cod.Impact.BaseMetricV2.UserInteractionRequired = cveScV2.UserInteractionRequired + cod.Impact.BaseMetricV2.Severity = cveScV2.Severity + cod.Impact.BaseMetricV2.ObtainUserPrivilege = cveScV2.ObtainUserPrivilege + cod.Impact.BaseMetricV2.ObtainAllPrivilege = cveScV2.ObtainAllPrivilege + cod.Impact.BaseMetricV2.ImpactScore = cveScV2.ImpactScore + cod.Impact.BaseMetricV2.ExploitabilityScore = cveScV2.ExploitabilityScore + cod.Impact.BaseMetricV2.ObtainOtherPrivilege = cveScV2.ObtainOtherPrivilege + } + } + } + var oup models.OriginUpstreamPoc + oupErr := models.GetOriginPoc(ou.CveId, &oup) + if oupErr == nil && oup.PocId > 0 { + cod.Poc.Url = oup.Url + cod.Poc.Date = oup.Date + cod.Poc.Source = oup.Source + cod.Poc.Path = oup.Path + cod.Poc.Desc = oup.Desc + cod.Poc.Dbindex = oup.Dbindex + } + var oue models.OriginUpstreamEvent + oueErr := models.GetOriginEvent(ou.CveId, &oue) + if oueErr == nil && oue.EventId > 0 { + cod.Event.Date = oue.Date + cod.Event.Url = oue.Url + cod.Event.Description = oue.Description + cod.Event.Title = oue.Title + } + var our []models.OriginUpstreamReference + ourNum, ourErr := models.GetOriginReference(ou.CveId, &our) + if ourErr == nil && ourNum > 0 { + for _, reference := range our { + var crd common.CveReferenceData + crd.Url = reference.Url + crd.Name = reference.Name + crd.Tags = append(crd.Tags, reference.Tags) + crd.Refsource = reference.Refsource + cod.ReferenceData = append(cod.ReferenceData, crd) + } + } + var ouv models.OriginUpstreamVulType + ouvErr := models.GetOriginVulType(ou.CveId, &ouv) + if ouvErr == nil && ouv.VulId > 0 { + cod.VulType.Cwe = ouv.Cwe + cod.VulType.En = ouv.EnDesc + cod.VulType.Zh = ouv.ZhDesc + } + var ouf models.OriginUpstreamFixSuggest + oufErr := models.GetOriginFixSuggest(ou.CveId, &ouf) + if oufErr == nil && ouf.FixId > 0 { + var oufr []models.OriginUpstreamFixSuggestRef + oufrNum, oufErr := models.GetOriginFixSuggestRef(ouf.FixId, &oufr) + if oufErr == nil && oufrNum > 0 { + for _, ref := range oufr { + var fr common.FixReferences + fr.Refsource = ref.Refsource + fr.Name = ref.Name + fr.Url = ref.Url + var oufrt []models.OriginUpstreamFixSuggestRefTag + oufrtNum, oufrtErr := models.GetOriginFixSuggestRefTag(ref.FixRefId, &oufrt) + if oufrtErr == nil && oufrtNum > 0 { + for _, tag := range oufrt { + fr.Tags = append(fr.Tags, tag.Name) + } + } + cod.FixSuggest.References = append(cod.FixSuggest.References, fr) + } + } + cod.FixSuggest.Detail = ouf.Detail + } + resp["errno"]=errcode.RecodeOk + resp["errmsg"]=errcode.RecodeText(errcode.RecodeOk) + resp["body"] = cod + return + } else { + resp["errno"]=errcode.RecodeNodata + resp["errmsg"]=errcode.RecodeText(errcode.RecodeNodata) + return + } + +} diff --git a/controllers/upload.go b/controllers/upload.go index a54f1ad..54c1e4a 100644 --- a/controllers/upload.go +++ b/controllers/upload.go @@ -24,6 +24,96 @@ func (c *UserUploadController) RetData(resp map[string]interface{}) { c.ServeJSON() } +func (c *CveErrorFeedBackController) RetData(resp map[string]interface{}) { + c.Data["json"] =resp + c.ServeJSON() +} + +type CveErrorFeedBackController struct { + beego.Controller +} + +type CveErrorData struct { + CveNum string `json:"cveNum"` + ErrorDesc string `json:"errorDesc"` + CveUploadTime string `json:"cveUploadTime"` +} + +// @Title Get cveerrorfeedback +// @Description get cveerrorfeedback +// @Param startDate endDate string false +// @Success 200 {object} models.uploadcve +// @Failure 403 :endDate is err +// @router / [get] +func (u *CveErrorFeedBackController) Get() { + req := u.Ctx.Request + addr := req.RemoteAddr + logs.Info("Method: ",req.Method, "客户端请求的:addr: ", addr, "Header: ", req.Header, "body: ", req.Body) + resp := make(map[string]interface{}) + var ced []CveErrorData + resp["errno"]=errcode.RecodeUnknowErr + resp["errmsg"]=errcode.RecodeText(errcode.RecodeUnknowErr) + resp["body"] = []CveErrorData{} + defer u.RetData(resp) + var iw models.IpWhite + if addr != "" { + addrIp := strings.Split(addr, ":") + err := models.GetIpWhite(addrIp[0], &iw) + if err != nil { + resp["errno"]=errcode.RecodeIpErr + resp["errmsg"]=errcode.RecodeText(errcode.RecodeIpErr) + return + } + } else { + resp["errno"]=errcode.RecodeIpErr + resp["errmsg"]=errcode.RecodeText(errcode.RecodeIpErr) + return + } + token := u.GetString("token") + if token == "" { + resp["errno"]=errcode.RecodeSessionErr + resp["errmsg"]=errcode.RecodeText(errcode.RecodeSessionErr) + return + } else { + ok := models.CheckToken(token) + if !ok { + resp["errno"]=errcode.RecodeRoleErr + resp["errmsg"]=errcode.RecodeText(errcode.RecodeRoleErr) + return + } + } + + startDate := u.GetString("startDate") + if startDate != "" { + logs.Info("查询: ", startDate, " 开始日期") + } + + endDate := u.GetString("endDate") + if endDate != "" { + logs.Info("查询: ", endDate, " 结束日期") + } else { + endDate = common.GetCurTime() + } + + it, ok := models.QueryCveErrorInfo(6, startDate, endDate) + if ok { + for _, cveErr := range it { + var ved CveErrorData + ved.CveNum = cveErr.CveNum + ved.CveUploadTime = cveErr.CreateTime.String()[:19] + ved.ErrorDesc = cveErr.ErrorDescription + ced = append(ced, ved) + } + resp["body"] = ced + resp["errno"]=errcode.RecodeOk + resp["errmsg"]=errcode.RecodeText(errcode.RecodeOk) + } else { + resp["errno"]=errcode.RecodeNodata + resp["errmsg"]=errcode.RecodeText(errcode.RecodeNodata) + return + } +} + // @Title UserUpload // @Description UserUpload // @Param body body models.OriginUpstream true "body for user content" diff --git a/doc/sql/db_struct.sql b/doc/sql/db_struct.sql index dae8400..e9ad2eb 100644 --- a/doc/sql/db_struct.sql +++ b/doc/sql/db_struct.sql @@ -38,7 +38,7 @@ CREATE TABLE `cve_export_record` ( `create_time` datetime NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `file_name` (`file_name`) -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8; /*Table structure for table `cve_git_open_euler` */ @@ -71,7 +71,7 @@ CREATE TABLE `cve_git_open_euler` ( KEY `cve_git_open_euler_package_id` (`package_id`), KEY `cve_git_open_euler_version` (`version`), KEY `cve_git_open_euler_table_id` (`table_id`) -) ENGINE=InnoDB AUTO_INCREMENT=8159 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=10413 DEFAULT CHARSET=utf8; /*Table structure for table `cve_git_open_euler_table_relate` */ @@ -85,7 +85,7 @@ CREATE TABLE `cve_git_open_euler_table_relate` ( PRIMARY KEY (`relate_id`), UNIQUE KEY `cve_git_open_euler_table_gitid_tab_un` (`git_id`,`table_name`), KEY `cve_git_open_euler_table_relate_git_id` (`git_id`) -) ENGINE=InnoDB AUTO_INCREMENT=4570 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=4748 DEFAULT CHARSET=utf8; /*Table structure for table `cve_git_package_info` */ @@ -116,7 +116,7 @@ CREATE TABLE `cve_git_package_info` ( KEY `cve_git_package_info_git_id` (`git_id`), KEY `cve_git_package_info_git_ids` (`git_ids`), KEY `cve_git_package_info_version` (`version`) -) ENGINE=InnoDB AUTO_INCREMENT=979 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=1244 DEFAULT CHARSET=utf8; /*Table structure for table `cve_git_package_table` */ @@ -138,7 +138,7 @@ CREATE TABLE `cve_git_repo_groups` ( `group_name` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`group_id`), KEY `cve_git_repo_groups_group_name` (`group_name`) -) ENGINE=InnoDB AUTO_INCREMENT=72 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=144 DEFAULT CHARSET=utf8; /*Table structure for table `cve_git_sub_pack` */ @@ -152,7 +152,7 @@ CREATE TABLE `cve_git_sub_pack` ( PRIMARY KEY (`sub_id`), KEY `cve_git_sub_pack_detail_id` (`detail_id`), KEY `cve_git_sub_pack_ids` (`ids`) -) ENGINE=InnoDB AUTO_INCREMENT=2438 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=3408 DEFAULT CHARSET=utf8; /*Table structure for table `cve_git_sub_pack_provides` */ @@ -167,7 +167,7 @@ CREATE TABLE `cve_git_sub_pack_provides` ( PRIMARY KEY (`provide_id`), KEY `cve_git_sub_pack_provides_sub_id` (`sub_id`), KEY `cve_git_sub_pack_provides_ids` (`ids`) -) ENGINE=InnoDB AUTO_INCREMENT=10556 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=18830 DEFAULT CHARSET=utf8; /*Table structure for table `cve_git_sub_pack_require` */ @@ -182,7 +182,7 @@ CREATE TABLE `cve_git_sub_pack_require` ( PRIMARY KEY (`require_id`), KEY `cve_git_sub_pack_require_sub_id` (`sub_id`), KEY `cve_git_sub_pack_require_ids` (`ids`) -) ENGINE=InnoDB AUTO_INCREMENT=13525 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=19139 DEFAULT CHARSET=utf8; /*Table structure for table `cve_git_sub_pack_requiredby` */ @@ -194,7 +194,7 @@ CREATE TABLE `cve_git_sub_pack_requiredby` ( `requiredb` varchar(256) NOT NULL DEFAULT '', PRIMARY KEY (`id`), KEY `cve_git_sub_pack_requiredby_provide_id` (`provide_id`) -) ENGINE=InnoDB AUTO_INCREMENT=2214 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=3428 DEFAULT CHARSET=utf8; /*Table structure for table `cve_gite_origin_issue` */ @@ -226,7 +226,7 @@ CREATE TABLE `cve_gite_origin_issue` ( PRIMARY KEY (`id`), UNIQUE KEY `issue_id` (`issue_id`), UNIQUE KEY `number` (`number`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=691 DEFAULT CHARSET=utf8; /*Table structure for table `cve_gite_repo` */ @@ -247,7 +247,7 @@ CREATE TABLE `cve_gite_repo` ( `delete_time` varchar(255) DEFAULT NULL, PRIMARY KEY (`repo_id`), KEY `cve_gite_repo_group_id` (`group_id`) -) ENGINE=InnoDB AUTO_INCREMENT=7072 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=7096 DEFAULT CHARSET=utf8; /*Table structure for table `cve_gite_repo_branch` */ @@ -278,7 +278,7 @@ CREATE TABLE `cve_gite_repo_member` ( PRIMARY KEY (`repo_id`), KEY `cve_gite_repo_member_group_id` (`group_id`), CONSTRAINT `member_groups_group_id` FOREIGN KEY (`group_id`) REFERENCES `cve_git_repo_groups` (`group_id`) -) ENGINE=InnoDB AUTO_INCREMENT=437 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=443 DEFAULT CHARSET=utf8; /*Table structure for table `cve_ip_white` */ @@ -319,7 +319,7 @@ CREATE TABLE `cve_issue_hooks` ( UNIQUE KEY `cve_issue_hooks_owner_repo_status_un` (`owner`,`repo`,`hook_url`,`status`), KEY `cve_issue_hooks_Cve_id` (`cve_id`), KEY `cve_issue_hooks_issue_num` (`issue_num`) -) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=110 DEFAULT CHARSET=utf8; /*Table structure for table `cve_issue_template` */ @@ -360,11 +360,12 @@ CREATE TABLE `cve_issue_template` ( `create_time` datetime NOT NULL, `update_time` datetime NOT NULL, `delete_time` datetime NOT NULL, + `error_description` text CHARACTER SET utf8 COLLATE utf8_general_ci, PRIMARY KEY (`template_id`), UNIQUE KEY `cve_issue_template_cvn_issnu` (`cve_num`,`issue_num`), KEY `cve_issue_template_cve_id` (`cve_id`), KEY `cve_issue_template_issue_num` (`issue_num`) -) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=482 DEFAULT CHARSET=utf8; /*Table structure for table `cve_open_euler_s_a` */ @@ -378,7 +379,7 @@ CREATE TABLE `cve_open_euler_s_a` ( PRIMARY KEY (`openeuler_id`), UNIQUE KEY `openeuler_sa_num` (`openeuler_sa_num`), KEY `cve_open_euler_s_a_cve_id` (`cve_id`) -) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=543 DEFAULT CHARSET=utf8; /*Table structure for table `cve_origin_excel` */ @@ -446,7 +447,7 @@ CREATE TABLE `cve_origin_upstream` ( KEY `cve_origin_upstream_cve_packname` (`cve_packname`), KEY `cve_origin_upstream_git_packname` (`git_packname`), KEY `cve_origin_upstream_version` (`version`) -) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=40 DEFAULT CHARSET=utf8; /*Table structure for table `cve_origin_upstream_config` */ @@ -458,7 +459,7 @@ CREATE TABLE `cve_origin_upstream_config` ( `nodes` varchar(32) DEFAULT NULL, PRIMARY KEY (`conf_id`), KEY `cve_origin_upstream_config_cve_id` (`cve_id`) -) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=81 DEFAULT CHARSET=utf8; /*Table structure for table `cve_origin_upstream_config_node` */ @@ -470,7 +471,7 @@ CREATE TABLE `cve_origin_upstream_config_node` ( `operator` varchar(256) DEFAULT NULL, PRIMARY KEY (`node_id`), KEY `cve_origin_upstream_config_node_conf_id` (`conf_id`) -) ENGINE=InnoDB AUTO_INCREMENT=69 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=101 DEFAULT CHARSET=utf8; /*Table structure for table `cve_origin_upstream_config_node_cpe` */ @@ -484,7 +485,7 @@ CREATE TABLE `cve_origin_upstream_config_node_cpe` ( `vulner_able` varchar(64) DEFAULT NULL, PRIMARY KEY (`cpe_id`), KEY `cve_origin_upstream_config_node_cpe_node_id` (`node_id`) -) ENGINE=InnoDB AUTO_INCREMENT=2601 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=2633 DEFAULT CHARSET=utf8; /*Table structure for table `cve_origin_upstream_desc` */ @@ -497,7 +498,7 @@ CREATE TABLE `cve_origin_upstream_desc` ( `zh_desc` text CHARACTER SET utf8 COLLATE utf8_general_ci, PRIMARY KEY (`desc_id`), KEY `cve_origin_upstream_desc_cve_id` (`cve_id`) -) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=81 DEFAULT CHARSET=utf8; /*Table structure for table `cve_origin_upstream_event` */ @@ -512,7 +513,7 @@ CREATE TABLE `cve_origin_upstream_event` ( `description` text CHARACTER SET utf8 COLLATE utf8_general_ci, PRIMARY KEY (`event_id`), KEY `cve_origin_upstream_event_cve_id` (`cve_id`) -) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=81 DEFAULT CHARSET=utf8; /*Table structure for table `cve_origin_upstream_fix_suggest` */ @@ -524,7 +525,7 @@ CREATE TABLE `cve_origin_upstream_fix_suggest` ( `detail` varchar(1024) DEFAULT NULL, PRIMARY KEY (`fix_id`), KEY `cve_origin_upstream_fix_suggest_cve_id` (`cve_id`) -) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=81 DEFAULT CHARSET=utf8; /*Table structure for table `cve_origin_upstream_fix_suggest_ref` */ @@ -538,7 +539,7 @@ CREATE TABLE `cve_origin_upstream_fix_suggest_ref` ( `name` varchar(1024) DEFAULT NULL, PRIMARY KEY (`fix_ref_id`), KEY `cve_origin_upstream_fix_suggest_ref_fix_id` (`fix_id`) -) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=44 DEFAULT CHARSET=utf8; /*Table structure for table `cve_origin_upstream_fix_suggest_ref_tag` */ @@ -550,7 +551,7 @@ CREATE TABLE `cve_origin_upstream_fix_suggest_ref_tag` ( `name` varchar(512) DEFAULT NULL, PRIMARY KEY (`tag_id`), KEY `cve_origin_upstream_fix_suggest_ref_tag_fix_ref_id` (`fix_ref_id`) -) ENGINE=InnoDB AUTO_INCREMENT=34 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=130 DEFAULT CHARSET=utf8; /*Table structure for table `cve_origin_upstream_impact` */ @@ -562,7 +563,7 @@ CREATE TABLE `cve_origin_upstream_impact` ( `impact` varchar(32) DEFAULT NULL, PRIMARY KEY (`impact_id`), KEY `cve_origin_upstream_impact_cve_id` (`cve_id`) -) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=81 DEFAULT CHARSET=utf8; /*Table structure for table `cve_origin_upstream_impact_score` */ @@ -578,7 +579,7 @@ CREATE TABLE `cve_origin_upstream_impact_score` ( `score_status` tinyint DEFAULT '1', PRIMARY KEY (`score_id`), KEY `cve_origin_upstream_impact_score_impact_id` (`impact_id`) -) ENGINE=InnoDB AUTO_INCREMENT=97 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=161 DEFAULT CHARSET=utf8; /*Table structure for table `cve_origin_upstream_impact_score_v2` */ @@ -607,7 +608,7 @@ CREATE TABLE `cve_origin_upstream_impact_score_v2` ( `cve_level` varchar(32) DEFAULT NULL, PRIMARY KEY (`v2_id`), KEY `cve_origin_upstream_impact_score_v2_score_id` (`score_id`) -) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=81 DEFAULT CHARSET=utf8; /*Table structure for table `cve_origin_upstream_impact_score_v3` */ @@ -633,7 +634,7 @@ CREATE TABLE `cve_origin_upstream_impact_score_v3` ( `cve_level` varchar(32) DEFAULT NULL, PRIMARY KEY (`v3_id`), KEY `cve_origin_upstream_impact_score_v3_score_id` (`score_id`) -) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=81 DEFAULT CHARSET=utf8; /*Table structure for table `cve_origin_upstream_poc` */ @@ -650,7 +651,7 @@ CREATE TABLE `cve_origin_upstream_poc` ( `desc` text CHARACTER SET utf8 COLLATE utf8_general_ci, PRIMARY KEY (`poc_id`), KEY `cve_origin_upstream_poc_cve_id` (`cve_id`) -) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=81 DEFAULT CHARSET=utf8; /*Table structure for table `cve_origin_upstream_reference` */ @@ -665,7 +666,7 @@ CREATE TABLE `cve_origin_upstream_reference` ( `tags` text CHARACTER SET utf8 COLLATE utf8_general_ci, PRIMARY KEY (`ref_id`), KEY `cve_origin_upstream_reference_cve_id` (`cve_id`) -) ENGINE=InnoDB AUTO_INCREMENT=1089 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=1377 DEFAULT CHARSET=utf8; /*Table structure for table `cve_origin_upstream_vul_type` */ @@ -679,7 +680,7 @@ CREATE TABLE `cve_origin_upstream_vul_type` ( `zh_desc` text CHARACTER SET utf8 COLLATE utf8_general_ci, PRIMARY KEY (`vul_id`), KEY `cve_origin_upstream_vul_type_cve_id` (`cve_id`) -) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=81 DEFAULT CHARSET=utf8; /*Table structure for table `cve_other_user` */ @@ -754,7 +755,7 @@ CREATE TABLE `cve_score` ( PRIMARY KEY (`id`), UNIQUE KEY `openeuler_id` (`openeuler_id`), KEY `cve_score_cve_id` (`cve_id`) -) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=543 DEFAULT CHARSET=utf8; /*Table structure for table `cve_score_record` */ @@ -769,7 +770,7 @@ CREATE TABLE `cve_score_record` ( `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `cve_score_record_cve_id` (`cve_id`) -) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=543 DEFAULT CHARSET=utf8; /*Table structure for table `cve_security_notice` */ @@ -795,7 +796,7 @@ CREATE TABLE `cve_security_notice` ( PRIMARY KEY (`sec_id`), UNIQUE KEY `openeuler_id` (`openeuler_id`), KEY `cve_security_notice_cve_id` (`cve_id`) -) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=543 DEFAULT CHARSET=utf8; /*Table structure for table `cve_security_reviewer` */ @@ -826,10 +827,12 @@ CREATE TABLE `cve_vuln_center` ( `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `delete_time` datetime NOT NULL, `is_export` tinyint NOT NULL DEFAULT '0', + `data_source` tinyint NOT NULL DEFAULT '1', + `cve_detail_url` varchar(1024) NOT NULL DEFAULT '', PRIMARY KEY (`cve_id`), UNIQUE KEY `cve_vuln_c_n_pk_v_un` (`cve_num`,`cve_version`,`pack_name`), KEY `cve_vuln_center_cve_num` (`cve_num`) -) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=600 DEFAULT CHARSET=utf8; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; diff --git a/models/cve.go b/models/cve.go index e456ebb..1919d0d 100644 --- a/models/cve.go +++ b/models/cve.go @@ -76,7 +76,7 @@ func QueryCveImpact(cveId int64) (OriginUpstreamImpact, bool) { var cveImpact OriginUpstreamImpact err := o.Raw("select * from cve_origin_upstream_impact where cve_id = ?", cveId).QueryRow(&cveImpact) if err != nil { - logs.Error(cveId, "cve_origin_upstream_impact cve impact查询不到") + logs.Error(cveId, "cve_origin_upstream_impact cve impact 查询不到") return cveImpact, false } else { return cveImpact, true @@ -90,7 +90,7 @@ func QueryCveScore(impactId int64, typex string) (OriginUpstreamImpactScore, boo err := o.Raw("select * from cve_origin_upstream_impact_score where "+ "impact_id = ? and base_met_v3=? and cvss_v3=?", impactId, 1, 1).QueryRow(&cveScore) if err != nil { - logs.Error(impactId, "cve_origin_upstream_impact_score cve score查询不到") + logs.Error(impactId, "cve_origin_upstream_impact_score cve score 查询不到") return cveScore, false } else { return cveScore, true @@ -99,7 +99,7 @@ func QueryCveScore(impactId int64, typex string) (OriginUpstreamImpactScore, boo err := o.Raw("select * from cve_origin_upstream_impact_score where "+ "impact_id = ? and base_met_v2=? and cvss_v2=?", impactId, 1, 1).QueryRow(&cveScore) if err != nil { - logs.Error(impactId, "cve_origin_upstream_impact_score cve score查询不到") + logs.Error(impactId, "cve_origin_upstream_impact_score cve score 查询不到") return cveScore, false } else { return cveScore, true diff --git a/models/cvedetail.go b/models/cvedetail.go new file mode 100644 index 0000000..d9535e6 --- /dev/null +++ b/models/cvedetail.go @@ -0,0 +1,150 @@ +package models + +import ( + "github.com/astaxie/beego/logs" + "github.com/astaxie/beego/orm" +) + +func GetOriginUpstream(cveNum string, ou *OriginUpstream) (err error) { + o := orm.NewOrm() + err = o.Raw("select * FROM cve_origin_upstream WHERE cve_num=? order by cve_id desc limit 1", cveNum).QueryRow(ou) + if err == nil { + logs.Info("cve_origin_upstream cveNum: ", cveNum, " 查询成功") + return nil + } else { + logs.Error("cve_origin_upstream cveNum: ", cveNum, " 不存在") + } + return err +} + +func GetOriginDesc(cveId int64, oud *OriginUpstreamDesc) (err error) { + o := orm.NewOrm() + err = o.Raw("select * FROM cve_origin_upstream_desc WHERE cve_id=?", cveId).QueryRow(oud) + if err == nil { + logs.Info("cve_origin_upstream_desc cve_id: ", cveId, " 查询成功") + return nil + } else { + logs.Error("cve_origin_upstream_desc cve_id: ", cveId, " 不存在") + } + return err +} + +func GetOriginConfig(cveId int64, ouc *OriginUpstreamConfig) (err error) { + o := orm.NewOrm() + err = o.Raw("select * FROM cve_origin_upstream_config WHERE cve_id=?", cveId).QueryRow(ouc) + if err == nil { + logs.Info("cve_origin_upstream_config cve_id: ", cveId, " 查询成功") + return nil + } else { + logs.Error("cve_origin_upstream_config cve_id: ", cveId, " 不存在") + } + return err +} + +func GetOriginConfigNode(configId int64, oucn *[]OriginUpstreamConfigNode) (num int64, err error) { + o := orm.NewOrm() + num, err = o.Raw("select * FROM cve_origin_upstream_config_node WHERE conf_id=?", configId).QueryRows(oucn) + if num > 0 && err == nil { + logs.Info("cve_origin_upstream_config_node configId: ", configId, " 查询成功") + return num, nil + } else { + logs.Error("cve_origin_upstream_config_node configId: ", configId, " 不存在") + } + return 0, err +} + +func GetOriginConfigNodeCpe(nodeId int64, oucnc *[]OriginUpstreamConfigNodeCpe) (num int64, err error) { + o := orm.NewOrm() + num, err = o.Raw("select * FROM cve_origin_upstream_config_node_cpe WHERE node_id=?", nodeId).QueryRows(oucnc) + if num > 0 && err == nil { + logs.Info("cve_origin_upstream_config_node_cpe configId: ", nodeId, " 查询成功") + return num, nil + } else { + logs.Error("cve_origin_upstream_config_node_cpe configId: ", nodeId, " 不存在") + } + return 0, err +} + +func GetOriginPoc(cveId int64, oup *OriginUpstreamPoc) (err error) { + o := orm.NewOrm() + err = o.Raw("select * FROM cve_origin_upstream_poc WHERE cve_id=?", cveId).QueryRow(oup) + if err == nil { + logs.Info("cve_origin_upstream_poc cve_id: ", cveId, " 查询成功") + return nil + } else { + logs.Error("cve_origin_upstream_poc cve_id: ", cveId, " 不存在") + } + return err +} + +func GetOriginEvent(cveId int64, oue *OriginUpstreamEvent) (err error) { + o := orm.NewOrm() + err = o.Raw("select * FROM cve_origin_upstream_event WHERE cve_id=?", cveId).QueryRow(oue) + if err == nil { + logs.Info("cve_origin_upstream_event cve_id: ", cveId, " 查询成功") + return nil + } else { + logs.Error("cve_origin_upstream_event cve_id: ", cveId, " 不存在") + } + return err +} + +func GetOriginReference(cveId int64, our *[]OriginUpstreamReference) (num int64, err error) { + o := orm.NewOrm() + num, err = o.Raw("select * FROM cve_origin_upstream_reference WHERE cve_id=?", cveId).QueryRows(our) + if num > 0 && err == nil { + logs.Info("cve_origin_upstream_reference cve_id: ", cveId, " 查询成功") + return num, nil + } else { + logs.Error("cve_origin_upstream_reference cve_id: ", cveId, " 不存在") + } + return 0, err +} + +func GetOriginVulType(cveId int64, ouv *OriginUpstreamVulType) (err error) { + o := orm.NewOrm() + err = o.Raw("select * FROM cve_origin_upstream_vul_type WHERE cve_id=?", cveId).QueryRow(ouv) + if err == nil { + logs.Info("cve_origin_upstream_vul_type cve_id: ", cveId, " 查询成功") + return nil + } else { + logs.Error("cve_origin_upstream_vul_type cve_id: ", cveId, " 不存在") + } + return err +} + +func GetOriginFixSuggest(cveId int64, ouf *OriginUpstreamFixSuggest) (err error) { + o := orm.NewOrm() + err = o.Raw("select * FROM cve_origin_upstream_fix_suggest WHERE cve_id=?", cveId).QueryRow(ouf) + if err == nil { + logs.Info("cve_origin_upstream_fix_suggest cve_id: ", cveId, " 查询成功") + return nil + } else { + logs.Error("cve_origin_upstream_fix_suggest cve_id: ", cveId, " 不存在") + } + return err +} + +func GetOriginFixSuggestRef(fixId int64, oufr *[]OriginUpstreamFixSuggestRef) (num int64, err error) { + o := orm.NewOrm() + num, err = o.Raw("select * FROM cve_origin_upstream_fix_suggest_ref WHERE fix_id=?", fixId).QueryRows(oufr) + if num > 0 && err == nil { + logs.Info("cve_origin_upstream_fix_suggest_ref fix_id: ", fixId, " 查询成功") + return num, nil + } else { + logs.Error("cve_origin_upstream_fix_suggest_ref fix_id: ", fixId, " 不存在") + } + return 0, err +} + +func GetOriginFixSuggestRefTag(fixRefId int64, oufrt *[]OriginUpstreamFixSuggestRefTag) (num int64, err error) { + o := orm.NewOrm() + num, err = o.Raw("select * FROM cve_origin_upstream_fix_suggest_ref_tag WHERE fix_ref_id=?", fixRefId).QueryRows(oufrt) + if num > 0 && err == nil { + logs.Info("cve_origin_upstream_fix_suggest_ref_tag fix_ref_id: ", fixRefId, " 查询成功") + return num, nil + } else { + logs.Error("cve_origin_upstream_fix_suggest_ref_tag fix_ref_id: ", fixRefId, " 不存在") + } + return 0, err +} \ No newline at end of file diff --git a/models/issue.go b/models/issue.go index 5293a96..3e9a4eb 100644 --- a/models/issue.go +++ b/models/issue.go @@ -30,7 +30,8 @@ func QueryIssueCveByNum(cvenum, repoPath string) (GiteOriginIssue, bool) { func QueryIssue(days string, prcnum int) ([]VulnCenter, error) { o := orm.NewOrm() var vc []VulnCenter - num, err := o.Raw("select cve_id,cve_num,cve_desc,cve_version,repair_time,pack_name,cve_url,cve_level"+ + num, err := o.Raw("select cve_id,cve_num,cve_desc,cve_version,repair_time," + + "pack_name,cve_url,cve_level,data_source,update_time,is_export,cve_detail_url"+ " from cve_vuln_center where update_time >= ? and cve_status in (?, ?) "+ "order by cve_id asc limit ?", days, 0, 1, prcnum).QueryRows(&vc) if err == nil && num > 0 { diff --git a/models/modeldb.go b/models/modeldb.go index 0b37dce..685f8ad 100644 --- a/models/modeldb.go +++ b/models/modeldb.go @@ -34,19 +34,21 @@ type AdminUser struct { } type VulnCenter struct { - CveId int64 `orm:"pk;auto;column(cve_id)"` - CveNum string `orm:"size(256);column(cve_num);index" description:"cve编号"` - Description string `orm:"size(8192);column(cve_desc)" description:"cve描述"` - CveLevel string `orm:"size(32);column(cve_level)" description:"致命(Critical);严重(High);中等(Medium);一般(Low);其他"` - Status int8 `orm:"default(0);column(cve_status)" description:"0:cve新增;1:数据已变化;2:已创建issue"` - CveVersion string `orm:"size(128);column(cve_version)" description:"cve归属版本"` - RepairTime string `orm:"size(32);column(repair_time)" description:"cve修复时间"` - PackName string `orm:"size(512);column(pack_name)" description:"cve对应得包名称"` - CveUrl string `orm:"size(2048);column(cve_url)" description:"cve下载链接"` - IsExport int8 `orm:"default(0);column(is_export)" description:"0:数据初始化;1:数据已同步到官网;2:数据不需要同步到官网;3:issue已关闭需要同步到官网"` - CreateTime time.Time `orm:"auto_now_add;type(datetime);column(create_time)"` - UpdateTime time.Time `orm:"auto_now;type(datetime);column(update_time)"` - DeleteTime time.Time `orm:"auto_now;type(datetime);column(delete_time)"` + CveId int64 `orm:"pk;auto;column(cve_id)"` + CveNum string `orm:"size(256);column(cve_num);index" description:"cve编号"` + Description string `orm:"size(8192);column(cve_desc)" description:"cve描述"` + CveLevel string `orm:"size(32);column(cve_level)" description:"致命(Critical);严重(High);中等(Medium);一般(Low);其他"` + Status int8 `orm:"default(0);column(cve_status)" description:"0:cve新增;1:数据已变化;2:已创建issue"` + CveVersion string `orm:"size(128);column(cve_version)" description:"cve归属版本"` + RepairTime string `orm:"size(32);column(repair_time)" description:"cve修复时间"` + PackName string `orm:"size(512);column(pack_name)" description:"cve对应得包名称"` + CveUrl string `orm:"size(2048);column(cve_url)" description:"cve下载链接"` + IsExport int8 `orm:"default(0);column(is_export)" description:"0:数据初始化;1:数据已同步到官网;2:数据不需要同步到官网;3:issue已关闭需要同步到官网"` + DataSource int8 `orm:"default(1);column(data_source)" description:"1:软件所提供;2:网络爬取;3:人工处理; 4:兼容之前的数据"` + CveDetailUrl string `orm:"size(1024);column(cve_detail_url)" description:"cve详情链接"` + CreateTime time.Time `orm:"auto_now_add;type(datetime);column(create_time)"` + UpdateTime time.Time `orm:"auto_now;type(datetime);column(update_time)"` + DeleteTime time.Time `orm:"auto_now;type(datetime);column(delete_time)"` } type OpenEulerSA struct { @@ -161,7 +163,8 @@ type IssueTemplate struct { Program string `orm:"size(64);column(program);null" description:"项目编号"` SecurityHole int8 `orm:"default(0);column(security_hole)" description:"是否是私有issue"` CveLevel string `orm:"size(32);column(cve_level)" description:"致命(Critical);严重(High);中等(Medium);一般(Low);其他"` - CommentId int64 `orm:"column(comment_id), null" description:"首条评论id"` + CommentId int64 `orm:"column(comment_id);null" description:"首条评论id"` + ErrorDescription string `orm:"size(64);column(error_description);null" description:"cve错误信息,cve与当前仓库错误信息保存"` CreateTime time.Time `orm:"auto_now_add;type(datetime);column(create_time)"` UpdateTime time.Time `orm:"auto_now;type(datetime);column(update_time)"` DeleteTime time.Time `orm:"auto_now;type(datetime);column(delete_time)"` @@ -440,6 +443,12 @@ type OriginUpstreamFixSuggestRef struct { Name string `orm:"size(1024);column(name);null" description:"名称"` } +type OriginUpstreamFixSuggestRefTag struct { + TagId int64 `orm:"pk;auto;column(tag_id)"` + FixRefId int64 `orm:"index;column(fix_ref_id)" description:"OriginUpstreamFixSuggestRef 外键"` + Name string `orm:"size(512);column(name);null" description:"名称"` +} + //GiteOriginIssue 码云上已经存在的issue type GiteOriginIssue struct { Id int64 `orm:"pk;auto"` @@ -466,12 +475,6 @@ type GiteOriginIssue struct { RepoDesc string `json:"repo_desc" orm:"null;size(2048)" description:"cve 对组件的描述"` } -type OriginUpstreamFixSuggestRefTag struct { - TagId int64 `orm:"pk;auto;column(tag_id)"` - FixRefId int64 `orm:"index;column(fix_ref_id)" description:"OriginUpstreamFixSuggestRef 外键"` - Name string `orm:"size(512);column(name);null" description:"名称"` -} - type OriginExcel struct { CveId int64 `orm:"pk;auto;column(cve_id)"` CveNum string `orm:"size(256);column(cve_num)" description:"cve编号"` diff --git a/models/uploadcve.go b/models/uploadcve.go index 56b0d1f..54e8d77 100644 --- a/models/uploadcve.go +++ b/models/uploadcve.go @@ -813,3 +813,24 @@ func CreateOriginCve(CveData common.CveOriginData, ou *OriginUpstream, od *Origi return 0, nil } +func QueryCveErrorInfo(issueStatus int8, startDate, endDate string)([]IssueTemplate, bool){ + o := orm.NewOrm() + var it []IssueTemplate + var num int64 + var err error + if startDate != "" { + num, err = o.Raw("select cve_num,error_description,create_time from cve_issue_template " + + "where issue_status = ? and create_time >= ? and create_time <= ?", issueStatus, startDate, endDate).QueryRows(&it) + } else { + num, err = o.Raw("select cve_num,error_description,create_time from cve_issue_template " + + "where issue_status = ? and create_time <= ?", issueStatus, endDate).QueryRows(&it) + } + + if err != nil || num == 0{ + logs.Info(issueStatus, startDate, endDate, ", cve_issue_template 无对应数据") + return it,false + } else { + logs.Info(issueStatus, startDate, endDate, ", cve_issue_template 查询成功") + return it,true + } +} \ No newline at end of file diff --git a/routers/router.go b/routers/router.go index 1ae0b43..16f1996 100644 --- a/routers/router.go +++ b/routers/router.go @@ -58,6 +58,16 @@ func init() { &controllers.FileController{}, ), ), + beego.NSNamespace("/cve/detail", + beego.NSInclude( + &controllers.CveDetailController{}, + ), + ), + beego.NSNamespace("/cve/error/feedback", + beego.NSInclude( + &controllers.CveErrorFeedBackController{}, + ), + ), ) beego.AddNamespace(ns) } diff --git a/task/inittask.go b/task/inittask.go index 453838a..bffe416 100644 --- a/task/inittask.go +++ b/task/inittask.go @@ -126,6 +126,23 @@ func GenSAExcelTask(genExcel string, ch *chan bool) { //defer toolbox.StopTask() } +//打印日志到控制台上,同时删除多余日志 +func PrintLogTask(printLog string, ch *chan bool) { + logs.Info("创建日志任务 task start") + printLogTask := toolbox.NewTask("ProcLogData", printLog, ProcLogData) + err := printLogTask.Run() + if err != nil { + logs.Error("创建日志任务失败 ,err:", err) + return + } + toolbox.AddTask("ProcLogData", printLogTask) + toolbox.StartTask() + //time.Sleep(time.Minute * 1) + logs.Info("创建日志任务 task end") + *ch <- true + //defer toolbox.StopTask() +} + //InitTask 定时任务初始化 func InitTask() { BConfig, err := config.NewConfig("ini", "conf/app.conf") @@ -184,6 +201,15 @@ func InitTask() { <-cvech close(cvech) } + // 定时输出日志到控制台上 + printLogFlag, errxs := BConfig.Int("crontab::printlogflag") + if printLogFlag == 1 && errxs == nil { + printLog := BConfig.String("crontab::printlog") + var logch = make(chan bool) + go PrintLogTask(printLog, &logch) + <-logch + close(logch) + } // 添加issue taskFlag, errx := BConfig.Int("crontab::issueflag") if taskFlag == 1 && errx == nil { diff --git a/task/printlog.go b/task/printlog.go new file mode 100644 index 0000000..5c505c2 --- /dev/null +++ b/task/printlog.go @@ -0,0 +1,50 @@ +package task + +import ( + "errors" + "fmt" + "github.com/astaxie/beego/config" + "github.com/astaxie/beego/logs" + "io/ioutil" + "os" +) + +func DeletLogs() error{ + BConfig, err := config.NewConfig("ini", "conf/app.conf") + if err != nil{ + logs.Error("config init error:", err) + return err + } + logDir := BConfig.String("log::log_dir") + if logDir == ""{ + logs.Error("config excel::log_dir error: invalid value is ", logDir) + return errors.New("value is nil") + } + fileInfoList, err := ioutil.ReadDir(logDir) + if err != nil { + logs.Error(err) + return err + } + fmt.Println(len(fileInfoList)) + for i := range fileInfoList { + if fileInfoList[i].Name() != "cve.log" { + err := os.Remove(logDir + "/" + fileInfoList[i].Name()) + if err != nil { + logs.Error("删除文件失败: ", fileInfoList[i].Name()) + } + } + } + return nil +} +//ProcCveOriginData 处理api获取的原始数据 +func ProcLogData() error{ + // delete logs + err := DeletLogs() + if err != nil { + logs.Error(err) + } + + // 打印日志 + return err +} + diff --git a/taskhandler/common.go b/taskhandler/common.go index aba4b09..ea467ab 100644 --- a/taskhandler/common.go +++ b/taskhandler/common.go @@ -4,6 +4,8 @@ import ( "cvevulner/common" "cvevulner/models" "fmt" + "github.com/astaxie/beego/config" + "github.com/astaxie/beego/logs" "reflect" "strconv" "strings" @@ -24,9 +26,15 @@ const bodyTpl = `一、漏洞信息 漏洞归属的版本:%v CVSS V%v分值: BaseScore:%v - Vector:CVSS: %v + Vector:CVSS:%v 漏洞简述: %v + 漏洞公开时间:%v + 漏洞信息修改时间:%v + 漏洞详情参考链接: + %v + 漏洞分析指导链接: + %v 二、漏洞分析结构反馈 影响性分析说明: %v @@ -42,9 +50,15 @@ const bodyUpTpl = `一、漏洞信息 漏洞归属的版本:%v CVSS V%v分值: BaseScore:%v - Vector:CVSS: %v + Vector:CVSS:%v 漏洞简述: %v + 漏洞公开时间:%v + 漏洞信息修改时间:%v + 漏洞详情参考链接: + %v + 漏洞分析指导链接: + %v 二、漏洞分析结构反馈 影响性分析说明: %v @@ -295,6 +309,12 @@ func CreateIssueBody(accessToken string, owner string, path string, assignee str } else { scoreType = "3.0" } + BConfig, err := config.NewConfig("ini", "conf/app.conf") + if err != nil { + logs.Error("config init error:", err) + return "" + } + commentCmd := BConfig.String("reflink::comment_cmd") floatOpenEulerScore, err := strconv.ParseFloat(openEulerScore, 64) if err != nil { floatOpenEulerScore = 0.0 @@ -304,6 +324,10 @@ func CreateIssueBody(accessToken string, owner string, path string, assignee str cveAnalysis = strings.Replace(its.CveAnalysis, "\n", "", -1) //cveAnalysis = strings.Replace(cveAnalysis, "\n", "", 0) } + updateTime := cve.UpdateTime.String() + if updateTime != "" && len(updateTime) > 19 { + updateTime = updateTime[:19] + } StatusName := "" if its.StatusName != "" && len(its.StatusName) > 1 { if its.StatusName == "待办的" { @@ -335,7 +359,8 @@ func CreateIssueBody(accessToken string, owner string, path string, assignee str nveVector := scoreType + "/" + sc.NvectorVule oVector := scoreType + "/" + its.OpenEulerVector body := fmt.Sprintf(bodyUpTpl, cveNumber, path, cve.CveVersion, scoreType, nveScore, nveVector, - cve.Description, cveAnalysis, openEulerScore, oVector, affectedVersion) + cve.Description, cve.RepairTime, updateTime, cve.CveDetailUrl, commentCmd, + cveAnalysis, openEulerScore, oVector, affectedVersion) /*body := "一、漏洞信息" + "
漏洞编号: " + "[" + cve.CveNum + "](https://nvd.nist.gov/vuln/detail/" + cve.CveNum + ")" + "
" + "
漏洞归属组件: " + path + "
" + "
漏洞归属的版本: " + cve.CveVersion + "
" + "
CVSS V" + scoreType + "分值:
" + @@ -362,7 +387,8 @@ func CreateIssueBody(accessToken string, owner string, path string, assignee str nveVector := scoreType + "/" + sc.NvectorVule openEulerScore = " " body := fmt.Sprintf(bodyTpl, cveNumber, path, cve.CveVersion, scoreType, nveScore, nveVector, - cve.Description, cveAnalysis, openEulerScore, affectedVersion) + cve.Description, cve.RepairTime, updateTime, cve.CveDetailUrl, commentCmd, + cveAnalysis, openEulerScore, affectedVersion) requestBody = fmt.Sprintf(`{ "access_token": "%s", "repo": "%s", @@ -391,7 +417,8 @@ func CreateIssueBody(accessToken string, owner string, path string, assignee str nveVector := scoreType + "/" + sc.NvectorVule openEulerScore = " " body := fmt.Sprintf(bodyTpl, cveNumber, path, cve.CveVersion, scoreType, nveScore, nveVector, - cve.Description, cveAnalysis, openEulerScore, affectedVersion) + cve.Description, cve.RepairTime, updateTime, cve.CveDetailUrl, commentCmd, + cveAnalysis, openEulerScore, affectedVersion) requestBody = fmt.Sprintf(`{ "access_token": "%s", "repo": "%s", @@ -423,7 +450,8 @@ func CreateIssueBody(accessToken string, owner string, path string, assignee str nveVector := scoreType + "/" + its.NVDVector oVector := scoreType + "/" + its.OpenEulerVector body := fmt.Sprintf(bodyUpTpl, cveNumber, path, cve.CveVersion, scoreType, nveScore, nveVector, - cve.Description, cveAnalysis, openEulerScore, oVector, affectedVersion) + cve.Description, cve.RepairTime, updateTime, cve.CveDetailUrl, commentCmd, + cveAnalysis, openEulerScore, oVector, affectedVersion) requestBody = fmt.Sprintf(`{ "access_token": "%s", "repo": "%s", @@ -441,7 +469,8 @@ func CreateIssueBody(accessToken string, owner string, path string, assignee str nveVector := scoreType + "/" + its.NVDVector oVector := scoreType + "/" + its.OpenEulerVector body := fmt.Sprintf(bodyUpTpl, cveNumber, path, cve.CveVersion, scoreType, nveScore, nveVector, - cve.Description, cveAnalysis, openEulerScore, oVector, affectedVersion) + cve.Description, cve.RepairTime, updateTime, cve.CveDetailUrl, commentCmd, + cveAnalysis, openEulerScore, oVector, affectedVersion) requestBody = fmt.Sprintf(`{ "access_token": "%s", "repo": "%s", @@ -461,7 +490,8 @@ func CreateIssueBody(accessToken string, owner string, path string, assignee str nveScore := score + " " + cve.CveLevel nveVector := scoreType + "/" + sc.NvectorVule body := fmt.Sprintf(bodyTpl, cveNumber, path, cve.CveVersion, scoreType, nveScore, nveVector, - cve.Description, cveAnalysis, openEulerScore, affectedVersion) + cve.Description, cve.RepairTime, updateTime, cve.CveDetailUrl, commentCmd, + cveAnalysis, openEulerScore, affectedVersion) requestBody = fmt.Sprintf(`{ "access_token": "%s", "repo": "%s", @@ -478,7 +508,8 @@ func CreateIssueBody(accessToken string, owner string, path string, assignee str nveVector := scoreType + "/" + sc.NvectorVule body := fmt.Sprintf(bodyTpl, cveNumber, path, cve.CveVersion, scoreType, nveScore, nveVector, - cve.Description, cveAnalysis, openEulerScore, affectedVersion) + cve.Description, cve.RepairTime, updateTime, cve.CveDetailUrl, commentCmd, + cveAnalysis, openEulerScore, affectedVersion) requestBody = fmt.Sprintf(`{ "access_token": "%s", "repo": "%s", diff --git a/taskhandler/cve.go b/taskhandler/cve.go index 99d0cd2..e9b09a4 100644 --- a/taskhandler/cve.go +++ b/taskhandler/cve.go @@ -29,6 +29,7 @@ func UpdateExcelCveGroups(cveData models.OriginExcel, cveRef string, openeulerNu CveRes.PackName = cveData.PackName CveRes.CveUrl = cveRef + cveData.CveNum CveRes.CveLevel = cveData.CveLevel + CveRes.DataSource = 3 CveRes.IsExport = 0 if CveRes.Status != 0 && CveRes.Status != 1 { CveRes.Status = 1 @@ -206,6 +207,7 @@ func InsertCveExcelGroups(cveData models.OriginExcel, cveRef string, openeulerNu vul.PackName = cveData.PackName vul.CveUrl = cveRef + cveData.CveNum vul.CveLevel = cveData.CveLevel + vul.DataSource = 3 vul.IsExport = 0 var sec models.SecurityNotice sec.CveNum = cveData.CveNum @@ -295,6 +297,7 @@ func UpdateCveGroups(cveData models.OriginUpstream, cveRef string, openeulerNum CveRes.PackName = pkList[0] CveRes.CveUrl = cveRef + cveData.CveNum CveRes.CveLevel = cveScV3.CveLevel + CveRes.DataSource = 1 CveRes.IsExport = 0 if CveRes.Status != 0 && CveRes.Status != 1 { CveRes.Status = 1 @@ -537,6 +540,7 @@ func InsertCveGroups(cveData models.OriginUpstream, cveRef string, openeulerNum vul.PackName = pkList[0] vul.CveUrl = cveRef + cveData.CveNum vul.CveLevel = cveScV3.CveLevel + vul.DataSource = 1 vul.IsExport = 0 var sec models.SecurityNotice sec.CveNum = cveData.CveNum @@ -893,6 +897,7 @@ func InsertIssueCveGroups(cveData models.GiteOriginIssue, lop models.Loophole, c vul.PackName = cveData.RepoPath vul.CveUrl = cveRef + cveData.CveNumber vul.IsExport = 0 + vul.DataSource = 4 v2, cvsError := strconv.ParseFloat(lop.CvsScore, 64) if cvsError != nil { vul.CveLevel = "Critical" @@ -1054,6 +1059,7 @@ func UpdateIssueCveGroups(cveData models.GiteOriginIssue, lop models.Loophole, c vul.PackName = cveData.RepoPath vul.CveUrl = cveRef + cveData.CveNumber vul.IsExport = 0 + vul.DataSource = 4 var sec models.SecurityNotice sec.CveNum = cveData.CveNumber sec.InfluenceComponent = lop.Components diff --git a/taskhandler/yaml.go b/taskhandler/yaml.go index d204d1f..37051e5 100644 --- a/taskhandler/yaml.go +++ b/taskhandler/yaml.go @@ -43,7 +43,6 @@ func GetYamlTables(url string) (string, error){ } var lock sync.Mutex -//var wg sync.WaitGroup //GetYamlByGit func GetYamlByGit(url string) (string, error) { @@ -61,7 +60,6 @@ func GetYamlByGit(url string) (string, error) { var ch = make(chan int, len(gt)) for i, tableValue := range gt { logs.Info("查询第 ", i, "tableName: ", tableValue.TableName, "开始...") - //wg.Add(1) go func(tv models.GitPackageTable,idx int) { ok, err := GetYaml(url, compURL1, page, size, tv, &ch) if err == nil { @@ -70,13 +68,11 @@ func GetYamlByGit(url string) (string, error) { logs.Error("当前数据处理失败, ok: ", ok, ",i: ", idx, ", err: ", err) } }(tableValue,i) - //<- ch } for i:=0; i< len(gt); i++ { <-ch } close(ch) - //wg.Wait() return "", nil } diff --git a/util/parsepayload.go b/util/parsepayload.go index 5df705c..f41f8d0 100644 --- a/util/parsepayload.go +++ b/util/parsepayload.go @@ -483,7 +483,7 @@ func TrimStringNR(str string) string { return str } -//ExtractDigital Get number in string +//ExtractDigital remove "cvss 3.0" or "cvss 2.0" func RemoveSpecialDigital(body string) string { if body == "" { return body @@ -495,6 +495,7 @@ func RemoveSpecialDigital(body string) string { return "" } +//ExtractDigital Get number in string func ExtractDigital(body string) string { if body == "" { return body -- Gitee From f111da404e441f36b00ce5870086891cf887e0eb Mon Sep 17 00:00:00 2001 From: zhangjianjun_code <7844966+zhangjianjun_code@user.noreply.gitee.com> Date: Wed, 14 Oct 2020 16:51:45 +0800 Subject: [PATCH 4/5] 1. New python code; 2. Analysis of main functions to manually generate excel files and store them in the database for future use; 3. Feedback on wrong excel file emails --- cve-python/.gitignore | 4 + cve-python/Dockerfile | 10 + cve-python/README.md | 37 + cve-python/controller/__init__.py | 0 cve-python/controller/gitwebcontroller.py | 8 + cve-python/controller/tablecontroller.py | 16 + cve-python/dbConnecttion/Config.py | 10 + cve-python/dbConnecttion/MysqlConn.py | 135 + cve-python/dbConnecttion/__init__.py | 0 cve-python/dbConnecttion/test.py | 9 + cve-python/emailtask/__init__.py | 0 cve-python/emailtask/sendemail.py | 20 + cve-python/gitwebtask/__init__.py | 0 cve-python/gitwebtask/genegroup.py | 86 + cve-python/gitwebtask/yamltask.py | 47 + cve-python/main.py | 29 + cve-python/problemexcels/data.xls | Bin 0 -> 5632 bytes cve-python/requirements.txt | 60 + cve-python/sigs.yaml | 7232 +++++++++++++++++++++ cve-python/tabletask/__init__.py | 0 cve-python/tabletask/crawltask.py | 114 + cve-python/tabletask/exceltask.py | 124 + cve-python/tabletask/runtask.py | 109 + cve-python/tabletask/test.py | 7 + cve-python/tabletask/timedtask.py | 31 + cve-python/tabletask/toexcel.py | 93 + cve-python/templates/index.html | 10 + 27 files changed, 8191 insertions(+) create mode 100644 cve-python/.gitignore create mode 100644 cve-python/Dockerfile create mode 100644 cve-python/README.md create mode 100644 cve-python/controller/__init__.py create mode 100644 cve-python/controller/gitwebcontroller.py create mode 100644 cve-python/controller/tablecontroller.py create mode 100644 cve-python/dbConnecttion/Config.py create mode 100644 cve-python/dbConnecttion/MysqlConn.py create mode 100644 cve-python/dbConnecttion/__init__.py create mode 100644 cve-python/dbConnecttion/test.py create mode 100644 cve-python/emailtask/__init__.py create mode 100644 cve-python/emailtask/sendemail.py create mode 100644 cve-python/gitwebtask/__init__.py create mode 100644 cve-python/gitwebtask/genegroup.py create mode 100644 cve-python/gitwebtask/yamltask.py create mode 100644 cve-python/main.py create mode 100644 cve-python/problemexcels/data.xls create mode 100644 cve-python/requirements.txt create mode 100644 cve-python/sigs.yaml create mode 100644 cve-python/tabletask/__init__.py create mode 100644 cve-python/tabletask/crawltask.py create mode 100644 cve-python/tabletask/exceltask.py create mode 100644 cve-python/tabletask/runtask.py create mode 100644 cve-python/tabletask/test.py create mode 100644 cve-python/tabletask/timedtask.py create mode 100644 cve-python/tabletask/toexcel.py create mode 100644 cve-python/templates/index.html diff --git a/cve-python/.gitignore b/cve-python/.gitignore new file mode 100644 index 0000000..729dfe8 --- /dev/null +++ b/cve-python/.gitignore @@ -0,0 +1,4 @@ +.idea +__pycache__ +.gitee +venv \ No newline at end of file diff --git a/cve-python/Dockerfile b/cve-python/Dockerfile new file mode 100644 index 0000000..3ef97ae --- /dev/null +++ b/cve-python/Dockerfile @@ -0,0 +1,10 @@ +FROM ubuntu:latest + +MAINTAINER TommyLike +RUN set -ex && apt-get update -y && apt-get install -y python-pip python3.5-dev build-essential libpq-dev && mkdir -p /opt/app/ +#RUN apt-get update && apt-get install -y python-pip && mkdir -p /opt/app/ +RUN set -ex && ln -s /usr/bin/python3 /usr/bin/python && ln -s /usr/bin/pip3 /usr/bin/pip +COPY ./cve-python /opt/app + +WORKDIR /opt/app/cve-python +ENTRYPOINT ["python", "/opt/app/cve-python/main.py"] \ No newline at end of file diff --git a/cve-python/README.md b/cve-python/README.md new file mode 100644 index 0000000..cc0c6e4 --- /dev/null +++ b/cve-python/README.md @@ -0,0 +1,37 @@ +# cve-python + +#### 介绍 +处理人工cve数据 + +#### 软件架构 +软件架构说明 + + +#### 安装教程 + +1. xxxx +2. xxxx +3. xxxx + +#### 使用说明 + +1. xxxx +2. xxxx +3. xxxx + +#### 参与贡献 + +1. Fork 本仓库 +2. 新建 Feat_xxx 分支 +3. 提交代码 +4. 新建 Pull Request + + +#### 特技 + +1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md +2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) +3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 +4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 +5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) +6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/cve-python/controller/__init__.py b/cve-python/controller/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cve-python/controller/gitwebcontroller.py b/cve-python/controller/gitwebcontroller.py new file mode 100644 index 0000000..ab8795b --- /dev/null +++ b/cve-python/controller/gitwebcontroller.py @@ -0,0 +1,8 @@ +# -*- coding: UTF-8 -*- +from gitwebtask import genegroup,yamltask + +def gwcontroller(): + print("查询数据库生成excel任务开始") + genegroup.Command().handle() + yamltask.task().download() + yamltask.task().read() \ No newline at end of file diff --git a/cve-python/controller/tablecontroller.py b/cve-python/controller/tablecontroller.py new file mode 100644 index 0000000..ecc6380 --- /dev/null +++ b/cve-python/controller/tablecontroller.py @@ -0,0 +1,16 @@ +# -*- coding: UTF-8 -*- +import sys +import os +from tabletask import runtask,exceltask,toexcel + +def toExcelController(): + + ''' + 查询数据库cve_status状态为3或4的数据,生成excel + 修改cve_status状态为3或4的状态为5,表示已加入excel待处理 + ''' + toexcel.MysqlToExcel().generate_table() + toexcel.MysqlToExcel().update_status() +def runTaskController(): + # 执行解析表格 爬取CVE官网数据 存入数据库 + runtask.crawlWeb() diff --git a/cve-python/dbConnecttion/Config.py b/cve-python/dbConnecttion/Config.py new file mode 100644 index 0000000..460fccf --- /dev/null +++ b/cve-python/dbConnecttion/Config.py @@ -0,0 +1,10 @@ +#coding:utf-8 +''' +@author:xjh +''' +DBHOST="localhost" +DBPORT=3306 +DBUSER="root" +DBPWD="work123" +DBNAME="a_l" +DBCHAR="utf8" \ No newline at end of file diff --git a/cve-python/dbConnecttion/MysqlConn.py b/cve-python/dbConnecttion/MysqlConn.py new file mode 100644 index 0000000..d40595a --- /dev/null +++ b/cve-python/dbConnecttion/MysqlConn.py @@ -0,0 +1,135 @@ +# -*- coding: UTF-8 -*- +""" +Created on 2016年5月7日 + +@author: xjh +1、执行带参数的SQL时,请先用sql语句指定需要输入的条件列表,然后再用tuple/list进行条件批配 +2、在格式SQL中不需要使用引号指定数据类型,系统会根据输入参数自动识别 +3、在输入的值中不需要使用转意函数,系统会自动处理 +""" +import MySQLdb +from MySQLdb.cursors import DictCursor +from DBUtils.PooledDB import PooledDB +from dbConnecttion import Config + +class Mysql(object): + #连接池对象 + __pool=None + def __init__(self): + self.__conn=Mysql.__getConn() + self.__cursor=self.__conn.cursor() + + @staticmethod + def __getConn(): + """ + @summary:静态方法,从连接池中取出连接 + @return MySQLdb.connection + """ + if Mysql.__pool is None: + __pool=PooledDB(creator=MySQLdb,mincached=1,maxcached=20,host=Config.DBHOST,port=Config.DBPORT,user=Config.DBUSER, + passwd=Config.DBPWD,db=Config.DBNAME,use_unicode=False,charset=Config.DBCHAR,cursorclass=DictCursor) + return __pool.connection() + def getOne(self,sql,param=None): + """ + @summary: 执行查询,并取出第一条 + @param sql:查询SQL,如果有查询条件,请只指定条件列表,并将条件值使用参数[param]传递进来 + @param param: 可选参数,条件列表值(元组/列表) + @return: result list/boolean 查询到的结果集 + """ + if param is None: + count=self.__cursor.execute(sql) + else: + count=self.__cursor.execute(sql,param) + if count>0: + result=self.__cursor.fetchone() + else: + result=False + return result + + def getMany(self, sql, param=None): + """ + @summary: 执行查询,并取出num条结果 + @param sql:查询SQL,如果有查询条件,请只指定条件列表,并将条件值使用参数[param]传递进来 + + @param param: 可选参数,条件列表值(元组/列表) + @return: result list/boolean 查询到的结果集 + """ + if param is None: + count = self.__cursor.execute(sql) + else: + count = self.__cursor.execute(sql, param) + if count > 0: + result = self.__cursor.fetchall() + else: + result = False + return result + def insertOne(self,sql,value): + """ + @summary: 向数据表插入一条记录 + @param sql:要插入的SQL格式 + @param value:要插入的记录数据tuple/list + @return: insertId 受影响的行数 + """ + self.__cursor.execute(sql, value) + return self.__getInsertId() + + def __getInsertId(self): + """ + 获取当前连接最后一次插入操作生成的id,如果没有则为0 + """ + self.__cursor.execute("SELECT @@IDENTITY AS id") + result = self.__cursor.fetchall() + return result[0]['id'] + def __query(self,sql,param=None): + if param is None: + count=self.__cursor.execute(sql) + else: + count=self.__cursor.execute(sql,param) + return count + def update(self, sql, param=None): + """ + @summary: 更新数据表记录 + @param sql: SQL格式及条件,使用(%s,%s) + @param param: 要更新的 值 tuple/list + @return: count 受影响的行数 + """ + return self.__query(sql, param) + + def delete(self, sql, param=None): + """ + @summary: 删除数据表记录 + @param sql: SQL格式及条件,使用(%s,%s) + @param param: 要删除的条件 值 tuple/list + @return: count 受影响的行数 + """ + return self.__query(sql, param) + + def begin(self): + """ + @summary: 开启事务 + """ + self.__conn.autocommit(0) + + def end(self, option='commit'): + """ + @summary: 结束事务 + """ + if option == 'commit': + self.__conn.commit() + else: + self.__conn.rollback() + + def dispose(self, isEnd=1): + """ + @summary: 提交事务 + """ + if isEnd == 1: + self.end('commit') + else: + self.end('rollback') + def close(self): + """ + @summary: 关闭连接 + """ + self.__cursor.close() + self.__conn.close() \ No newline at end of file diff --git a/cve-python/dbConnecttion/__init__.py b/cve-python/dbConnecttion/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cve-python/dbConnecttion/test.py b/cve-python/dbConnecttion/test.py new file mode 100644 index 0000000..08e9418 --- /dev/null +++ b/cve-python/dbConnecttion/test.py @@ -0,0 +1,9 @@ +# -*- coding: UTF-8 -*- +from dbConnecttion.MysqlConn import Mysql +from _sqlite3 import Row + +mysql=Mysql() +sql="select * from sites where name =%s" +val=("ss",) +result=mysql.getOne(sql,val) +print(str(result['name'],encoding="utf-8")) \ No newline at end of file diff --git a/cve-python/emailtask/__init__.py b/cve-python/emailtask/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cve-python/emailtask/sendemail.py b/cve-python/emailtask/sendemail.py new file mode 100644 index 0000000..bb3f978 --- /dev/null +++ b/cve-python/emailtask/sendemail.py @@ -0,0 +1,20 @@ +import smtplib +from email.mime.text import MIMEText +from email.mime.multipart import MIMEMultipart +from email.header import Header + +def send(): + sender="jhxiaoh@isoftstone.com" + receivers=["283750495@qq.com"] + #创建一个带附件的实例 + message=MIMEMultipart() + message['From']=Header('xjh','utf-8') + message['To']=Header("接收者",'utf-8') + subject='解析出错的excel数据提醒' + message['Subject']=Header(subject,'utf-8') + + #邮件正文类容 + message.attach(MIMEText("excel中录入的cve漏洞解析失败失败数据反馈,检查内容和格式,重新提交",'plain','utf-8')) + + #构造 + diff --git a/cve-python/gitwebtask/__init__.py b/cve-python/gitwebtask/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cve-python/gitwebtask/genegroup.py b/cve-python/gitwebtask/genegroup.py new file mode 100644 index 0000000..f1eed44 --- /dev/null +++ b/cve-python/gitwebtask/genegroup.py @@ -0,0 +1,86 @@ +# -*- coding: UTF-8 -*- +import requests +import lxml +import logging +from lxml.etree import HTML +from dbConnecttion.MysqlConn import Mysql +import time + + +class Command(): + logger = logging.getLogger('log') + + def handle(self): + mysql = Mysql() + url = 'https://gitee.com/openeuler/community/tree/master/sig' + try: + r = requests.get(url) + except requests.exceptions.ConnectionError: + print('ConnectionError') + except requests.exceptions.ChunkedEncodingError: + print('ChunkedEncodingError') + except: + print('Unfortunitely -- An Unknow Error Happened') + html = HTML(r.content) + assert isinstance(html, lxml.etree._Element) + sigs_list = [] + i = 3 + while True: + sig_name = html.xpath("//div[@id='tree-slider']/div[{}]/div[1]/a/@title".format(i))[0] + if sig_name == 'sigs.yaml': + break + sql="select * from cve_git_repo_groups where group_name = %s" + val=(sig_name,) + flag=mysql.getOne(sql,val) + if flag==False: + print("数据库无此条数据,执行插入操作") + sql="insert into cve_git_repo_groups (group_name) values (%s)" + val=(sig_name,) + mysql.insertOne(sql,val) + mysql.dispose() + + sig_page = html.xpath("//div[@id='tree-slider']/div[{}]/div[1]/a/@href".format(i))[0] + etherpad = 'https://etherpad.openeuler.org/p/{}-meetings'.format(sig_name) + # 获取所有sig的名称、首页和etherpad + sigs_list.append([sig_name, 'https://gitee.com' + sig_page, etherpad]) + i += 2 + sigs_list = sorted(sigs_list) + print(sigs_list) + for sig in sigs_list: + #获取group_id + sql="select group_id from cve_git_repo_groups where group_name = %s" + val=(sig[0],) + groupId=mysql.getOne(sql,val)["group_id"] + #删除cve_gite_repo_member里面的数据 + #根据groupId + sql1="delete from cve_gite_repo_member where group_id = %s" + val1=(groupId,) + mysql.delete(sql1,val1) + mysql.dispose() + # 获取owners + url = 'https://gitee.com/openeuler/community/blob/master/sig/{}/OWNERS'.format(sig[0]) + r = requests.get(url) + html = HTML(r.text) + assert isinstance(html, lxml.etree._Element) + res = html.xpath('//div[@class="line"]/text()') + owners = [] + for i in res[1:]: + maintainer = i.strip().split('-')[-1].strip() + createTime = str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + sql="insert into cve_gite_repo_member (group_id,member_name,member_type,create_time) values (%s,%s,%s,%s)" + val=(groupId,maintainer,"Maintainer",createTime) + mysql.insertOne(sql,val) + mysql.dispose() + + owners.append(maintainer) + print(owners) + # owners = ','.join(owners) + # sig.append(owners) + # group_name = sig[0] + # home_page = sig[1] + # etherpad = sig[2] + # maillist = sig[3] + # irc = sig[4] + # owners = sig[5] + + mysql.close() diff --git a/cve-python/gitwebtask/yamltask.py b/cve-python/gitwebtask/yamltask.py new file mode 100644 index 0000000..7caa004 --- /dev/null +++ b/cve-python/gitwebtask/yamltask.py @@ -0,0 +1,47 @@ +# -*- coding: UTF-8 -*- +import yaml +import requests +from dbConnecttion.MysqlConn import Mysql +import time +import os +import logging + +class task(): + logger = logging.getLogger('log') + def download(self): + url="https://gitee.com/openeuler/community/raw/master/sig/sigs.yaml" + try: + r=requests.get(url) + except requests.exceptions.ConnectionError: + print('ConnectionError') + except requests.exceptions.ChunkedEncodingError: + print('ChunkedEncodingError') + except: + print('Unfortunitely -- An Unknow Error Happened') + with open ("sigs.yaml","wb") as code: + code.write(r.content) + def read(self): + mysql=Mysql() + if os.path.exists("sigs.yaml"): + with open("sigs.yaml","r") as f: + data=yaml.load(f) + print(data) + for sig in data['sigs']: + sql="select group_id from cve_git_repo_groups where group_name=%s" + val=(sig['name'],) + groupId=mysql.getOne(sql,val)['group_id'] + #根据group_id删除数据避免重复 + sql1="delete from cve_gite_repo where group_id = %s" + val1=(groupId,) + mysql.delete(sql1,val1) + mysql.dispose() + # print(groupId) + for p in sig["repositories"]: + orgPath=p[0:p.rfind("/")] + path=p[p.rfind("/"):][1:] + createTime = str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + sql="insert into cve_gite_repo (group_id,org_path,path,status,create_time) values (%s,%s,%s,%s,%s)" + val=(groupId,orgPath,path,0,createTime) + mysql.insertOne(sql,val) + mysql.dispose() + mysql.close() diff --git a/cve-python/main.py b/cve-python/main.py new file mode 100644 index 0000000..0ba014d --- /dev/null +++ b/cve-python/main.py @@ -0,0 +1,29 @@ +# This is a sample Python script. + +# Press Shift+F10 to execute it or replace it with your code. +# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings. +from controller import tablecontroller,gitwebcontroller +import schedule +import time + +def print_hi(name): + # Use a breakpoint in the code line below to debug your script. + print(f'Hi, {name}') # Press Ctrl+F8 to toggle the breakpoint. + + +# Press the green button in the gutter to run the script. +def run(): + tablecontroller.toExcelController() + # gitwebcontroller.gwcontroller() +def run1(): + tablecontroller.runTaskController() +if __name__ == '__main__': + +# schedule.every(2).seconds.do(run) +# schedule.every().day.at("17:09").do(run) + schedule.every().day.at("17:48").do(run1) + while True: + schedule.run_pending() #run_pending:运行所有可以运行的任务 + time.sleep(1) + +# See PyCharm help at https://www.jetbrains.com/help/pycharm/ diff --git a/cve-python/problemexcels/data.xls b/cve-python/problemexcels/data.xls new file mode 100644 index 0000000000000000000000000000000000000000..a32c7d78bdf6a1063adfa3a0f1355b8713efd245 GIT binary patch literal 5632 zcmeI0OKjXk7{@=mNt(2IZJP8EpbUk+lYOPFnw8oll+qTZQ3#}<3TbidN#bVLUTp7% z^gv4=Mt?>35BA`mZS8qd!E zn}=t9-{%?EpI=K{zw%D^4O)^8(;E71p@|x5>>A2Vi@Kdqzp%h^@wX9Wm{!w&h(J># z9NAD$AGUn9mVL?ozCk*@UH1ucqVI4$LnUe=Su zmMqAq4&xj-b+k8|&K&H`^zYx7O%Y88LCMdhQlOZ0Y(Gd&xs_C_g#<;g_Tbe^>gFY3P$jA2~68a-L|&5w`D_rIqx}hSmb#)bKEhf4QEPPs6B2^ zO{*Jb)4dt|WktF_*O$qq57b)wMCL#)o6V*BZ+BFtuYZM(LXUGbZkUD}CZu%4q+53G z;)bFuy51bqn_==`n=cxLf(xc%79l81DEM;HbBl0=nJ+st`6(Hc46o>`9{!c)Hewo|@Eoqo;8EoxKcggOJ;sgZ8J`O_CCCq@VI z%5okSPJAS8=PipC=tb^<&VY{u&mwi>+M{~xRrv*OL-(k1x5_(lp5jE`G1?Us9=)jA zTvD|=aGySvz8u(DQ{IL0=;_1KNGomamexI)|TK5F3}{O=<5Xg%6% zuX6feVDVSO`OohV->N)(d#HVHXwlu>d*VLKoOyHPF6GU(1YL-F z@^cGPv0~mmv8v^*Bi5_Db;Np=w~km((CY|l=Aa|itGso@dV+f6F`0KVR?Hi_c+`)1 zr=gg)9`n`_=T+YPe}j;>ju@|U(-GrU-n@<~ZyhmS+p?Coju@}<))C_&ZyoVnjd5M^ z&crii-mJozGVjBB2ffR1X^^uhh5O5*TK!!m@J|uoy_dt2&o4f;_^jd+iq9qfu5$|) z|E{M0CxJ11z;W>zN6=Ax*x`>lbMX8hPaCOTTO`A=bf+{pfBMqkm9MnL?}gmtE53j2`d50hW!nF#`~MC#|5ncc literal 0 HcmV?d00001 diff --git a/cve-python/requirements.txt b/cve-python/requirements.txt new file mode 100644 index 0000000..633fae4 --- /dev/null +++ b/cve-python/requirements.txt @@ -0,0 +1,60 @@ +Automat==20.2.0 +DBUtils==1.3 +Flask==1.1.2 +Jinja2==2.11.2 +MarkupSafe==1.1.1 +Protego==0.1.16 +PyDispatcher==2.0.5 +PyHamcrest==2.0.2 +PyMySQL==0.10.0 +PyYAML==5.3.1 +Werkzeug==1.0.1 +aiocoap==0.3 +aiohttp==3.6.2 +async-timeout==3.0.1 +attrs==20.1.0 +beautifulsoup4==4.9.1 +certifi==2020.6.20 +cffi==1.14.2 +chardet==3.0.4 +click==7.1.2 +config==0.5.0.post0 +constantly==15.1.0 +cryptography==3.1 +cssselect==1.1.0 +hyperlink==20.0.1 +idna==2.10 +incremental==17.5.0 +itemadapter==0.1.0 +itemloaders==1.0.2 +itsdangerous==1.1.0 +jmespath==0.10.0 +lxml==4.5.2 +multidict==4.7.6 +mysql==0.0.2 +mysql-connector-python==8.0.21 +mysqlclient==2.0.1 +parsel==1.6.0 +pip==20.2.2 +protobuf==3.13.0 +psutil==5.7.2 +pyOpenSSL==19.1.0 +pyasn1==0.4.8 +pyasn1-modules==0.2.8 +pycparser==2.20 +queuelib==1.5.0 +requests==2.24.0 +resolver==0.2.1 +schedule==0.6.0 +selector==0.10.1 +service-identity==18.1.0 +setuptools==50.1.0 +sites==0.0.1 +six==1.15.0 +soupsieve==2.0.1 +urllib3==1.25.10 +w3lib==1.22.0 +xlrd==1.2.0 +xlwt==1.3.0 +yarl==1.5.1 +zope.interface==5.1.0 diff --git a/cve-python/sigs.yaml b/cve-python/sigs.yaml new file mode 100644 index 0000000..1784086 --- /dev/null +++ b/cve-python/sigs.yaml @@ -0,0 +1,7232 @@ +sigs: +- name: Infrastructure + repositories: + - openeuler/infrastructure + - openeuler/blog + - openeuler/website + - openeuler/go-gitee + - openeuler/gitbook-theme-hugo + - openeuler/tool-collections + - openeuler/cve-manager +- name: TC + repositories: + - openeuler/community +- name: doc + repositories: + - openeuler/docs +- name: sig-CICD + repositories: + - openeuler/compass-ci +- name: Application + repositories: + - openeuler/custom_build_tool + - src-openeuler/abrt + - src-openeuler/abrt-java-connector + - src-openeuler/alsa-utils + - src-openeuler/amanda + - src-openeuler/antlr-maven-plugin + - src-openeuler/antlr32 + - src-openeuler/apache-commons-collections + - src-openeuler/apache-commons-csv + - src-openeuler/apache-commons-daemon + - src-openeuler/apache-commons-dbcp + - src-openeuler/apache-commons-logging + - src-openeuler/apache-commons-pool + - src-openeuler/apache-commons-validator + - src-openeuler/apache-logging-parent + - src-openeuler/apache-mime4j + - src-openeuler/apache-mod_jk + - src-openeuler/apache-rat + - src-openeuler/apache-rpm-macros + - src-openeuler/aries-blueprint-core + - src-openeuler/aries-blueprint-parser + - src-openeuler/aries-proxy-api + - src-openeuler/aspell + - src-openeuler/aspell-en + - src-openeuler/avro + - src-openeuler/boilerpipe + - src-openeuler/brasero + - src-openeuler/bwa + - src-openeuler/cdrdao + - src-openeuler/cjose + - src-openeuler/cli-parser + - src-openeuler/codegen + - src-openeuler/coffee-script + - src-openeuler/compface + - src-openeuler/compress-lzf + - src-openeuler/console-setup + - src-openeuler/convmv + - src-openeuler/cookxml + - src-openeuler/culmus-fonts + - src-openeuler/custom_build_tool + - src-openeuler/dblatex + - src-openeuler/dcraw + - src-openeuler/decentxml + - src-openeuler/discount + - src-openeuler/dleyna-server + - src-openeuler/dlm + - src-openeuler/dnssec-trigger + - src-openeuler/docbook-style-dsssl + - src-openeuler/docbook-utils + - src-openeuler/docbook2X + - src-openeuler/docbook5-style-xsl + - src-openeuler/dovecot + - src-openeuler/doxygen + - src-openeuler/dump + - src-openeuler/elinks + - src-openeuler/elixir + - src-openeuler/enscript + - src-openeuler/eog + - src-openeuler/erlang-protobuffs + - src-openeuler/erlang-rebar + - src-openeuler/esc + - src-openeuler/evince + - src-openeuler/faust + - src-openeuler/fdupes + - src-openeuler/felix-gogo-runtime + - src-openeuler/felix-gogo-shell + - src-openeuler/felix-scr-annotations + - src-openeuler/felix-scr-generator + - src-openeuler/fetchmail + - src-openeuler/file-roller + - src-openeuler/fio + - src-openeuler/firefox + - src-openeuler/fmpp + - src-openeuler/fontforge + - src-openeuler/fonts-tweak-tool + - src-openeuler/forbidden-apis + - src-openeuler/forge-parent + - src-openeuler/freerdp + - src-openeuler/genwqe-tools + - src-openeuler/geronimo-parent-poms + - src-openeuler/gfbgraph + - src-openeuler/gl-manpages + - src-openeuler/glog + - src-openeuler/gmetric4j + - src-openeuler/gnome-calculator + - src-openeuler/gnome-desktop + - src-openeuler/gnome-online-miners + - src-openeuler/gnupg + - src-openeuler/gnuplot + - src-openeuler/google-crosextra-carlito-fonts + - src-openeuler/grafana + - src-openeuler/GraphicsMagick + - src-openeuler/grilo-plugins + - src-openeuler/gromacs + - src-openeuler/gshhg-gmt-nc4 + - src-openeuler/gstreamer + - src-openeuler/gstreamer-plugins-base + - src-openeuler/gstreamer-plugins-good + - src-openeuler/gyp + - src-openeuler/hazelcast + - src-openeuler/HdrHistogram + - src-openeuler/hspell + - src-openeuler/hsqldb1 + - src-openeuler/httpcomponents-asyncclient + - src-openeuler/hunspell-ak + - src-openeuler/hunspell-am + - src-openeuler/hunspell-ar + - src-openeuler/hunspell-as + - src-openeuler/hunspell-ast + - src-openeuler/hunspell-az + - src-openeuler/hunspell-be + - src-openeuler/hunspell-ber + - src-openeuler/hunspell-bg + - src-openeuler/hunspell-bn + - src-openeuler/hunspell-br + - src-openeuler/hunspell-ca + - src-openeuler/hunspell-cop + - src-openeuler/hunspell-csb + - src-openeuler/hunspell-cv + - src-openeuler/hunspell-cy + - src-openeuler/hunspell-da + - src-openeuler/hunspell-de + - src-openeuler/hunspell-dsb + - src-openeuler/hunspell-el + - src-openeuler/hunspell-eo + - src-openeuler/hunspell-es + - src-openeuler/hunspell-et + - src-openeuler/hunspell-eu + - src-openeuler/hunspell-fa + - src-openeuler/hunspell-fj + - src-openeuler/hunspell-fo + - src-openeuler/hunspell-fr + - src-openeuler/hunspell-fur + - src-openeuler/hunspell-fy + - src-openeuler/hunspell-ga + - src-openeuler/hunspell-gd + - src-openeuler/hunspell-gl + - src-openeuler/hunspell-grc + - src-openeuler/hunspell-gu + - src-openeuler/hunspell-gv + - src-openeuler/hunspell-haw + - src-openeuler/hunspell-hil + - src-openeuler/hunspell-hr + - src-openeuler/hunspell-hsb + - src-openeuler/hunspell-ht + - src-openeuler/hunspell-hu + - src-openeuler/hunspell-hy + - src-openeuler/hunspell-ia + - src-openeuler/hunspell-id + - src-openeuler/hunspell-is + - src-openeuler/hunspell-it + - src-openeuler/hunspell-kk + - src-openeuler/hunspell-km + - src-openeuler/hunspell-kn + - src-openeuler/hunspell-ko + - src-openeuler/hunspell-ku + - src-openeuler/hunspell-ky + - src-openeuler/hunspell-la + - src-openeuler/hunspell-lb + - src-openeuler/hunspell-ln + - src-openeuler/hunspell-lt + - src-openeuler/hunspell-mai + - src-openeuler/hunspell-mg + - src-openeuler/hunspell-mi + - src-openeuler/hunspell-mk + - src-openeuler/hunspell-ml + - src-openeuler/hunspell-mn + - src-openeuler/hunspell-mos + - src-openeuler/hunspell-mr + - src-openeuler/hunspell-ms + - src-openeuler/hunspell-mt + - src-openeuler/hunspell-nds + - src-openeuler/hunspell-ne + - src-openeuler/hunspell-nl + - src-openeuler/hunspell-no + - src-openeuler/hunspell-nr + - src-openeuler/hunspell-nso + - src-openeuler/hunspell-ny + - src-openeuler/hunspell-oc + - src-openeuler/hunspell-om + - src-openeuler/hunspell-or + - src-openeuler/hunspell-pa + - src-openeuler/hunspell-pl + - src-openeuler/hunspell-pt + - src-openeuler/hunspell-qu + - src-openeuler/hunspell-ro + - src-openeuler/hunspell-ru + - src-openeuler/hunspell-rw + - src-openeuler/hunspell-sc + - src-openeuler/hunspell-se + - src-openeuler/hunspell-si + - src-openeuler/hunspell-sk + - src-openeuler/hunspell-sl + - src-openeuler/hunspell-smj + - src-openeuler/hunspell-so + - src-openeuler/hunspell-sq + - src-openeuler/hunspell-sr + - src-openeuler/hunspell-ss + - src-openeuler/hunspell-st + - src-openeuler/hunspell-sv + - src-openeuler/hunspell-sw + - src-openeuler/hunspell-ta + - src-openeuler/hunspell-te + - src-openeuler/hunspell-tet + - src-openeuler/hunspell-th + - src-openeuler/hunspell-ti + - src-openeuler/hunspell-tl + - src-openeuler/hunspell-tn + - src-openeuler/hunspell-tpi + - src-openeuler/hunspell-ts + - src-openeuler/hunspell-uk + - src-openeuler/hunspell-ur + - src-openeuler/hunspell-uz + - src-openeuler/hunspell-ve + - src-openeuler/hunspell-vi + - src-openeuler/hunspell-wa + - src-openeuler/hunspell-xh + - src-openeuler/hunspell-yi + - src-openeuler/hunspell-zu + - src-openeuler/hwloc + - src-openeuler/hyphen + - src-openeuler/hyphen-as + - src-openeuler/hyphen-bg + - src-openeuler/hyphen-bn + - src-openeuler/hyphen-ca + - src-openeuler/hyphen-cy + - src-openeuler/hyphen-da + - src-openeuler/hyphen-de + - src-openeuler/hyphen-el + - src-openeuler/hyphen-es + - src-openeuler/hyphen-eu + - src-openeuler/hyphen-fa + - src-openeuler/hyphen-fo + - src-openeuler/hyphen-fr + - src-openeuler/hyphen-ga + - src-openeuler/hyphen-gl + - src-openeuler/hyphen-gu + - src-openeuler/hyphen-hi + - src-openeuler/hyphen-hsb + - src-openeuler/hyphen-ia + - src-openeuler/hyphen-id + - src-openeuler/hyphen-is + - src-openeuler/hyphen-it + - src-openeuler/hyphen-kn + - src-openeuler/hyphen-ku + - src-openeuler/hyphen-lt + - src-openeuler/hyphen-ml + - src-openeuler/hyphen-mn + - src-openeuler/hyphen-mr + - src-openeuler/hyphen-nl + - src-openeuler/hyphen-or + - src-openeuler/hyphen-pa + - src-openeuler/hyphen-pl + - src-openeuler/hyphen-pt + - src-openeuler/hyphen-ro + - src-openeuler/hyphen-ru + - src-openeuler/hyphen-sa + - src-openeuler/hyphen-sk + - src-openeuler/hyphen-sl + - src-openeuler/hyphen-sv + - src-openeuler/hyphen-ta + - src-openeuler/hyphen-te + - src-openeuler/hyphen-tk + - src-openeuler/hyphen-uk + - src-openeuler/ibus-table-chinese + - src-openeuler/icc-profiles-openicc + - src-openeuler/idm-console-framework + - src-openeuler/iio-sensor-proxy + - src-openeuler/indent + - src-openeuler/infiniband-diags + - src-openeuler/iperf2 + - src-openeuler/iperf3 + - src-openeuler/irssi + - src-openeuler/java-atk-wrapper + - src-openeuler/javamail + - src-openeuler/jboss-jms-2.0-api + - src-openeuler/jdepend + - src-openeuler/jedis + - src-openeuler/jpegoptim + - src-openeuler/jsch + - src-openeuler/json_simple + - src-openeuler/jsonp + - src-openeuler/jss + - src-openeuler/jzlib + - src-openeuler/kim-api + - src-openeuler/kohsuke-pom + - src-openeuler/libabigail + - src-openeuler/libaec + - src-openeuler/libapr1 + - src-openeuler/libdmapsharing + - src-openeuler/libdvdnav + - src-openeuler/libdvdread + - src-openeuler/libeasyfc + - src-openeuler/libgadu + - src-openeuler/liblockfile + - src-openeuler/liblouis + - src-openeuler/libmicrohttpd + - src-openeuler/libmikmod + - src-openeuler/libmpeg2 + - src-openeuler/libmtp + - src-openeuler/libmusicbrainz5 + - src-openeuler/libtcnative + - src-openeuler/libvpx + - src-openeuler/libwbxml + - src-openeuler/libyami + - src-openeuler/linkchecker + - src-openeuler/linuxconsoletools + - src-openeuler/linuxdoc-tools + - src-openeuler/linuxptp + - src-openeuler/lksctp-tools + - src-openeuler/lmfit + - src-openeuler/log4j12 + - src-openeuler/lohit-assamese-fonts + - src-openeuler/lohit-bengali-fonts + - src-openeuler/lohit-devanagari-fonts + - src-openeuler/lohit-gujarati-fonts + - src-openeuler/lohit-kannada-fonts + - src-openeuler/lohit-malayalam-fonts + - src-openeuler/lohit-marathi-fonts + - src-openeuler/lohit-nepali-fonts + - src-openeuler/lohit-tamil-fonts + - src-openeuler/lohit-telugu-fonts + - src-openeuler/lpg + - src-openeuler/lrzsz + - src-openeuler/lsyncd + - src-openeuler/lynx + - src-openeuler/mailman + - src-openeuler/mc + - src-openeuler/media-player-info + - src-openeuler/memcached + - src-openeuler/metadata-extractor2 + - src-openeuler/mikmod + - src-openeuler/mina-ftpserver + - src-openeuler/mod_intercept_form_submit + - src-openeuler/mod_lookup_identity + - src-openeuler/mousetweaks + - src-openeuler/mrtg + - src-openeuler/msv + - src-openeuler/munge + - src-openeuler/mutt + - src-openeuler/mythes + - src-openeuler/nano + - src-openeuler/netpbm + - src-openeuler/nss-altfiles + - src-openeuler/nss-mdns + - src-openeuler/nss_wrapper + - src-openeuler/ntfs-3g + - src-openeuler/objectweb-asm + - src-openeuler/oldstandard-sfd-fonts + - src-openeuler/openal-soft + - src-openeuler/openjade + - src-openeuler/openmpi + - src-openeuler/opennlp + - src-openeuler/openoffice-lv + - src-openeuler/openoffice.org-dict-cs_CZ + - src-openeuler/opensm + - src-openeuler/opensp + - src-openeuler/opentest4j + - src-openeuler/openvpn + - src-openeuler/pam_krb5 + - src-openeuler/paps + - src-openeuler/patchutils + - src-openeuler/pavucontrol + - src-openeuler/pax + - src-openeuler/pbzip2 + - src-openeuler/pcp + - src-openeuler/perftest + - src-openeuler/perl-B-Lint + - src-openeuler/perl-Pod-LaTeX + - src-openeuler/pesign + - src-openeuler/pidgin + - src-openeuler/pki-core + - src-openeuler/pngquant + - src-openeuler/pnm2ppa + - src-openeuler/po4a + - src-openeuler/pptp + - src-openeuler/prelink + - src-openeuler/psacct + - src-openeuler/psutils + - src-openeuler/pylint + - src-openeuler/qperf + - src-openeuler/R-language + - src-openeuler/rabbitmq-server + - src-openeuler/rasqal + - src-openeuler/rdate + - src-openeuler/redis-protocol + - src-openeuler/regexp + - src-openeuler/rhythmbox + - src-openeuler/rngom + - src-openeuler/rpcsvc-proto + - src-openeuler/rrdtool + - src-openeuler/rubygem-kramdown + - src-openeuler/sane-frontends + - src-openeuler/scrub + - src-openeuler/skkdic + - src-openeuler/slapi-nis + - src-openeuler/snapd-glib + - src-openeuler/socat + - src-openeuler/soundtouch + - src-openeuler/spamassassin + - src-openeuler/spec-version-maven-plugin + - src-openeuler/strongswan + - src-openeuler/stunnel + - src-openeuler/t-digest + - src-openeuler/targetcli + - src-openeuler/tboot + - src-openeuler/testng + - src-openeuler/tex-fonts-hebrew + - src-openeuler/texi2html + - src-openeuler/texlive + - src-openeuler/texlive-base + - src-openeuler/three-eight-nine-ds-base + - src-openeuler/tomcat + - src-openeuler/tomcat-taglibs-standard + - src-openeuler/torque + - src-openeuler/tpm-quote-tools + - src-openeuler/tpm-tools + - src-openeuler/transfig + - src-openeuler/tre + - src-openeuler/ttmkfdir + - src-openeuler/uid_wrapper + - src-openeuler/units + - src-openeuler/unrtf + - src-openeuler/usb_modeswitch-data + - src-openeuler/usbguard + - src-openeuler/uwsgi + - src-openeuler/vinagre + - src-openeuler/vorbis-tools + - src-openeuler/voroplusplus + - src-openeuler/vte + - src-openeuler/wavpack + - src-openeuler/wayland-protocols + - src-openeuler/web-assets + - src-openeuler/weechat + - src-openeuler/weston + - src-openeuler/wireshark + - src-openeuler/wmctrl + - src-openeuler/xapps + - src-openeuler/xdg-dbus-proxy + - src-openeuler/xdg-desktop-portal-gtk + - src-openeuler/xml-commons-apis + - src-openeuler/XmlSchema + - src-openeuler/xmlstreambuffer + - src-openeuler/xmltoman + - src-openeuler/xmltool + - src-openeuler/xmms + - src-openeuler/xsane + - src-openeuler/xz-java + - src-openeuler/yelp-tools +- name: Programming-language + repositories: + - src-openeuler/assertj-core + - src-openeuler/cinnamon-translations + - src-openeuler/gmavenplus-plugin + - src-openeuler/jboss-el + - src-openeuler/spock + - src-openeuler/mockito + - src-openeuler/keepalived + - src-openeuler/ndisc6 + - src-openeuler/perl-Module-Install-ReadmeFromPod + - src-openeuler/perl-Module-Install-ReadmeMarkdownFromPod + - src-openeuler/perl-Module-Install-Repository + - src-openeuler/perl-Module-Manifest-Skip + - src-openeuler/perl-Module-Package + - src-openeuler/perl-Module-Package-Au + - src-openeuler/perl-Module-ScanDeps + - src-openeuler/perl-Moo + - src-openeuler/perl-Path-Class + - src-openeuler/perl-Role-Tiny + - src-openeuler/perl-strictures + - src-openeuler/libimagequant + - src-openeuler/perl-Crypt-OpenSSL-Random + - src-openeuler/python-psutil + - src-openeuler/perl-NTLM + - src-openeuler/python-entrypoints + - src-openeuler/gnu-efi + - src-openeuler/libzip + - src-openeuler/libdwarf + - src-openeuler/ltrace + - src-openeuler/python-which + - src-openeuler/perl-Software-License + - src-openeuler/xcb-util-keysyms + - src-openeuler/xcb-util-cursor + - src-openeuler/autoconf213 + - src-openeuler/perl-Pod-Markdown + - src-openeuler/gperf + - src-openeuler/xdelta + - src-openeuler/python-iso8601 + - src-openeuler/python-sphinx-theme-alabaster + - src-openeuler/perl-Sub-Install + - src-openeuler/enchant2 + - src-openeuler/perl-Capture-Tiny + - src-openeuler/gssdp + - src-openeuler/uuid + - src-openeuler/mpich + - src-openeuler/python-attrs + - src-openeuler/perl-SGMLSpm + - src-openeuler/librelp + - src-openeuler/python-imagesize + - src-openeuler/perl-Path-Tiny + - src-openeuler/python-paramiko + - src-openeuler/python-sphinx + - src-openeuler/nvml + - src-openeuler/python-virtualenv + - src-openeuler/python-configparser + - src-openeuler/perl-Config-AutoConf + - src-openeuler/xorg-x11-proto-devel + - src-openeuler/qt5-qtwebsockets + - src-openeuler/perl-WWW-RobotRules + - src-openeuler/python-pluggy + - src-openeuler/qt5-qtsensors + - src-openeuler/python-funcsigs + - src-openeuler/pywbem + - src-openeuler/qt5-qtquickcontrols + - src-openeuler/libuv + - src-openeuler/qt5-qtx11extras + - src-openeuler/perl-Data-UUID + - src-openeuler/python-traceback2 + - src-openeuler/perl-Text-Unidecode + - src-openeuler/dotconf + - src-openeuler/python-scons + - src-openeuler/perl-YAML-Tiny + - src-openeuler/mallard-rng + - src-openeuler/itstool + - src-openeuler/crash-gcore-command + - src-openeuler/intel-cmt-cat + - src-openeuler/qt5-qtdeclarative + - src-openeuler/qt5-qtquickcontrols2 + - src-openeuler/byacc + - src-openeuler/numpy + - src-openeuler/python-enchant + - src-openeuler/rpmlint + - src-openeuler/perl-HTTP-Message + - src-openeuler/libindicator + - src-openeuler/libappstream-glib + - src-openeuler/iowatcher + - src-openeuler/python-wheel + - src-openeuler/perl-NetAddr-IP + - src-openeuler/cppunit + - src-openeuler/perl-Authen-SASL + - src-openeuler/libpfm + - src-openeuler/python-pyasn1 + - src-openeuler/perl-LWP-MediaTypes + - src-openeuler/perl-Try-Tiny + - src-openeuler/perl-gettext + - src-openeuler/perl-Date-Calc + - src-openeuler/python-unittest2 + - src-openeuler/check + - src-openeuler/tix + - src-openeuler/python-dns + - src-openeuler/python-atomicwrites + - src-openeuler/perl-IO-Socket-INET6 + - src-openeuler/cmocka + - src-openeuler/qt5-qtxmlpatterns + - src-openeuler/perl-IO-HTML + - src-openeuler/ninja-build + - src-openeuler/socket_wrapper + - src-openeuler/perl-Module-Build + - src-openeuler/pygobject2 + - src-openeuler/lua-posix + - src-openeuler/python-snowballstemmer + - src-openeuler/lua-lunit + - src-openeuler/qt5-qtconnectivity + - src-openeuler/qt5-qtsvg + - src-openeuler/vte291 + - src-openeuler/python-cryptography-vectors + - src-openeuler/python-lit + - src-openeuler/xcb-util-renderutil + - src-openeuler/jimtcl + - src-openeuler/perl-MailTools + - src-openeuler/python-pygments + - src-openeuler/perl-JSON + - src-openeuler/python-itsdangerous + - src-openeuler/cscope + - src-openeuler/perl-LWP-Protocol-https + - src-openeuler/ilmbase + - src-openeuler/perl-Crypt-OpenSSL-RSA + - src-openeuler/libstemmer + - src-openeuler/perl-File-Listing + - src-openeuler/ocaml + - src-openeuler/pygtk2 + - src-openeuler/python-urwid + - src-openeuler/python-linecache2 + - src-openeuler/gupnp + - src-openeuler/python-docutils + - src-openeuler/perl-inc-latest + - src-openeuler/fakeroot + - src-openeuler/qt5-qtdoc + - src-openeuler/perl-MRO-Compat + - src-openeuler/perl-String-ShellQuote + - src-openeuler/python-extras + - src-openeuler/python-mimeparse + - src-openeuler/perl-TimeDate + - src-openeuler/rhnlib + - src-openeuler/perl-XML-Simple + - src-openeuler/perl-XML-LibXML + - src-openeuler/subunit + - src-openeuler/scipy + - src-openeuler/SDL + - src-openeuler/perl-generators + - src-openeuler/perl-Test-Pod + - src-openeuler/neon + - src-openeuler/python-fonttools + - src-openeuler/lapack + - src-openeuler/libdbusmenu + - src-openeuler/python-netaddr + - src-openeuler/perl-Bit-Vector + - src-openeuler/gflags + - src-openeuler/perl-libxml-perl + - src-openeuler/intltool + - src-openeuler/python-sphinxcontrib-websupport + - src-openeuler/perl-Params-Util + - src-openeuler/qt5-qttools + - src-openeuler/autoconf-archive + - src-openeuler/python-cups + - src-openeuler/gupnp-igd + - src-openeuler/perl-IO-String + - src-openeuler/perl-Net-HTTP + - src-openeuler/python-click + - src-openeuler/python-sure + - src-openeuler/python-backports_abc + - src-openeuler/perl-HTTP-Date + - src-openeuler/python-fixtures + - src-openeuler/obs-env + - src-openeuler/libspectre + - src-openeuler/perl-HTTP-Negotiate + - src-openeuler/vala + - src-openeuler/eglexternalplatform + - src-openeuler/python-genshi + - src-openeuler/gstreamer1-plugins-bad-free + - src-openeuler/python-blinker + - src-openeuler/xcb-util-wm + - src-openeuler/qt5-qttranslations + - src-openeuler/PyYAML + - src-openeuler/python-keyring + - src-openeuler/go-compilers + - src-openeuler/python-futures + - src-openeuler/perl-Test-Deep + - src-openeuler/perl-Text-CharWidth + - src-openeuler/perl-Devel-CheckLib + - src-openeuler/python-whoosh + - src-openeuler/qt5-qtwayland + - src-openeuler/perl-Module-Runtime + - src-openeuler/mvapich2 + - src-openeuler/python-more-itertools + - src-openeuler/perl-Data-OptList + - src-openeuler/crash-trace-command + - src-openeuler/perl-File-Slurp + - src-openeuler/python-py + - src-openeuler/perl-Test-Warnings + - src-openeuler/perl-Date-Manip + - src-openeuler/libdv + - src-openeuler/python-sqlalchemy + - src-openeuler/qt5-qtmultimedia + - src-openeuler/gnome-user-docs + - src-openeuler/meanwhile + - src-openeuler/qt5-qtcanvas3d + - src-openeuler/perl-XML-SAX + - src-openeuler/python-singledispatch + - src-openeuler/pyxdg + - src-openeuler/perl-Unicode-UTF8 + - src-openeuler/perl-XML-SAX-Base + - src-openeuler/python-pretend + - src-openeuler/libXScrnSaver + - src-openeuler/perl-Archive-Zip + - src-openeuler/perl-Text-WrapI18N + - src-openeuler/pytest + - src-openeuler/swig + - src-openeuler/lua-filesystem + - src-openeuler/perl-XML-XPath + - src-openeuler/pyflakes + - src-openeuler/dejagnu + - src-openeuler/python-testtools + - src-openeuler/jsoncpp + - src-openeuler/qt5-qtimageformats + - src-openeuler/perl-libwww-perl + - src-openeuler/qt5-qtserialport + - src-openeuler/python-distro + - src-openeuler/meson + - src-openeuler/perl-Data-Section + - src-openeuler/perl-ExtUtils-CBuilder + - src-openeuler/perl-Test-FailWarnings + - src-openeuler/qt5-qtbase + - src-openeuler/Cython + - src-openeuler/qpdf + - src-openeuler/python-pbr + - src-openeuler/cmake + - src-openeuler/papi + - src-openeuler/perl-Digest-HMAC + - src-openeuler/python-freezegun + - src-openeuler/nasm + - src-openeuler/perl-HTML-Tagset + - src-openeuler/python-hypothesis + - src-openeuler/openscap + - src-openeuler/gnome-common + - src-openeuler/python-packaging + - src-openeuler/qt5-qt3d + - src-openeuler/gspell + - src-openeuler/xcb-util-image + - src-openeuler/python-SecretStorage + - src-openeuler/python-bottle + - src-openeuler/perl-libintl-perl + - src-openeuler/python-greenlet + - src-openeuler/perl-Fedora-VSP + - src-openeuler/perl-Test-Needs + - src-openeuler/tinyxml2 + - src-openeuler/python2-typing + - src-openeuler/libfabric + - src-openeuler/xorg-x11-util-macros + - src-openeuler/perl-Text-Tabs-Wrap + - src-openeuler/pangomm + - src-openeuler/perl-Font-TTF + - src-openeuler/LibRaw + - src-openeuler/perl-Socket6 + - src-openeuler/perl-Test-NoWarnings + - src-openeuler/perl-Parse-Yapp + - src-openeuler/xcb-proto + - src-openeuler/flatpak + - src-openeuler/libell + - src-openeuler/perl-Carp-Clan + - src-openeuler/python-flit + - src-openeuler/qt5-qtlocation + - src-openeuler/libXp + - src-openeuler/python-configshell + - src-openeuler/python-werkzeug + - src-openeuler/python-mock + - src-openeuler/librdkafka + - src-openeuler/python-setuptools_scm + - src-openeuler/perl-HTML-Parser + - src-openeuler/python-pytoml + - src-openeuler/libsrtp + - src-openeuler/qt5-qtscript + - src-openeuler/python-gevent + - src-openeuler/libmemcached + - src-openeuler/trace-cmd + - src-openeuler/python-urlgrabber + - src-openeuler/python-markdown + - src-openeuler/python-nose + - src-openeuler/perl-HTTP-Cookies + - src-openeuler/perl-XML-NamespaceSupport + - src-openeuler/python-sphinx_rtd_theme + - src-openeuler/tbb + - src-openeuler/python-flask + - src-openeuler/qt5-qtwebchannel + - src-openeuler/gtest + - src-openeuler/cppcheck + - src-openeuler/nototools + - src-openeuler/qt5-qtserialbus + - src-openeuler/valgrind + - src-openeuler/qt5-qtgraphicaleffects + - src-openeuler/qt5-qtspeech + - src-openeuler/qt5-qtvirtualkeyboard + - src-openeuler/qt5dxcb-plugin + - src-openeuler/perl-Text-Template + - src-openeuler/perl-Mail-DKIM + - src-openeuler/cvs + - src-openeuler/perl-Net-DNS + - src-openeuler/python-construct + - src-openeuler/openblas + - src-openeuler/spice-protocol + - src-openeuler/libgnome-keyring + - src-openeuler/pyelftools + - src-openeuler/python-tornado + - src-openeuler/python-httpretty + - src-openeuler/egl-wayland + - src-openeuler/python-testscenarios + - src-openeuler/python-augeas + - src-openeuler/glib + - src-openeuler/perl-Data-Dump + - src-openeuler/help2man + - src-openeuler/python-pymongo + - src-openeuler/perl-YAML + - src-openeuler/sblim-cmpi-devel + - src-openeuler/gtk-vnc + - src-openeuler/perl-Sub-Name + - src-openeuler/perl-Sub-Quote + - src-openeuler/perl-Test-Fatal + - src-openeuler/perl-Test-InDistDir + - src-openeuler/perl-Test-Pod-Coverage + - src-openeuler/perl-Test-Requires + - src-openeuler/perl-Text-Glob + - src-openeuler/nim + - src-openeuler/erlang + - src-openeuler/erlang-getopt + - src-openeuler/erlang-neotoma + - src-openeuler/erlang-eflame + - src-openeuler/erlang-erlsyslog + - src-openeuler/erlang-mustache + - src-openeuler/erlang-lfe + - src-openeuler/erlang-rpm-macros + - src-openeuler/erlang-proper + - src-openeuler/erlang-hamcrest + - src-openeuler/erlang-gettext + - src-openeuler/erlang-erlydtl + - src-openeuler/erlang-sd_notify + - src-openeuler/erlang-meck +- name: Runtime + repositories: + - src-openeuler/ibus-libpinyin + - src-openeuler/mesa-demos + - src-openeuler/tinycdb + - src-openeuler/freeglut + - src-openeuler/libmpcdec + - src-openeuler/mesa-libGLw + - src-openeuler/alsa-plugins + - src-openeuler/pkcs11-helper + - src-openeuler/rhash + - src-openeuler/libpeas + - src-openeuler/libnice + - src-openeuler/python-httplib2 + - src-openeuler/vdo + - src-openeuler/protobuf-c + - src-openeuler/fftw + - src-openeuler/ibus-sayura + - src-openeuler/hdf5 + - src-openeuler/libvdpau + - src-openeuler/ibus-m17n + - src-openeuler/xorg-x11-xtrans-devel + - src-openeuler/redland + - src-openeuler/libshout + - src-openeuler/ibus-typing-booster + - src-openeuler/librabbitmq + - src-openeuler/celt051 + - src-openeuler/libva + - src-openeuler/libvoikko + - src-openeuler/jemalloc + - src-openeuler/libpng12 + - src-openeuler/gsl + - src-openeuler/clutter-gst2 + - src-openeuler/libiec61883 + - src-openeuler/atlas + - src-openeuler/atkmm + - src-openeuler/freetds + - src-openeuler/kmod-kvdo + - src-openeuler/libao + - src-openeuler/glew + - src-openeuler/libstoragemgmt + - src-openeuler/qt + - src-openeuler/OpenEXR + - src-openeuler/motif + - src-openeuler/m2crypto + - src-openeuler/libsmi + - src-openeuler/usbmuxd + - src-openeuler/libavc1394 + - src-openeuler/libieee1284 +- name: Networking + repositories: + - src-openeuler/apache-commons-net + - src-openeuler/glassfish-jax-rs-api + - src-openeuler/kronosnet + - src-openeuler/initscripts + - src-openeuler/http-parser + - src-openeuler/openvswitch + - src-openeuler/ldns + - src-openeuler/ipvsadm + - src-openeuler/unbound + - src-openeuler/ntp + - src-openeuler/neethi + - src-openeuler/openssh + - src-openeuler/NetworkManager + - src-openeuler/libserf + - src-openeuler/tipcutils + - src-openeuler/libmbim + - src-openeuler/libqmi + - src-openeuler/libnetfilter_queue + - src-openeuler/iptables + - src-openeuler/python-idna + - src-openeuler/GeoIP + - src-openeuler/xinetd + - src-openeuler/libssh2 + - src-openeuler/nftables + - src-openeuler/bridge-utils + - src-openeuler/telnet + - src-openeuler/libassuan + - src-openeuler/iw + - src-openeuler/GeoIP-GeoLite-data + - src-openeuler/zd1211-firmware + - src-openeuler/ipmitool + - src-openeuler/ipset + - src-openeuler/iptraf-ng + - src-openeuler/ppp + - src-openeuler/tcpdump + - src-openeuler/traceroute + - src-openeuler/mtr + - src-openeuler/firewalld + - src-openeuler/arpwatch + - src-openeuler/iputils + - src-openeuler/iproute + - src-openeuler/nmap + - src-openeuler/httpd + - src-openeuler/network-manager-applet + - src-openeuler/libdnet + - src-openeuler/python-requests-ftp + - src-openeuler/ModemManager + - src-openeuler/procmail + - src-openeuler/tcp_wrappers + - src-openeuler/vconfig + - src-openeuler/lua-socket + - src-openeuler/mod_http2 + - src-openeuler/libtirpc + - src-openeuler/ethtool + - src-openeuler/net-tools + - src-openeuler/hostname + - src-openeuler/openldap + - src-openeuler/ipcalc + - src-openeuler/vsftpd + - src-openeuler/samba + - src-openeuler/dnsmasq + - src-openeuler/notification-daemon + - src-openeuler/chrony + - src-openeuler/libproxy + - src-openeuler/ntpstat + - src-openeuler/libnetfilter_conntrack + - src-openeuler/postfix + - src-openeuler/libnl3 + - src-openeuler/arptables + - src-openeuler/ftp + - src-openeuler/python-paste + - src-openeuler/libgcrypt + - src-openeuler/python-ipaddress + - src-openeuler/libpcap + - src-openeuler/xmlrpc-c + - src-openeuler/libssh + - src-openeuler/wget + - src-openeuler/nghttp2 + - src-openeuler/libnfnetlink + - src-openeuler/curl + - src-openeuler/python-IPy + - src-openeuler/lftp + - src-openeuler/atmel-firmware + - src-openeuler/netcf + - src-openeuler/c-ares + - src-openeuler/python-backports-ssl_match_hostname + - src-openeuler/python-ntplib + - src-openeuler/libesmtp + - src-openeuler/geolite2 + - src-openeuler/ebtables + - src-openeuler/dropwatch + - src-openeuler/bind + - src-openeuler/OpenIPMI + - src-openeuler/grpc + - src-openeuler/bind-dyndb-ldap + - src-openeuler/dhcp + - src-openeuler/glib-networking + - src-openeuler/net-snmp + - src-openeuler/icfg + - src-openeuler/python-requests + - src-openeuler/rpcbind + - src-openeuler/python-urllib3 + - src-openeuler/iptstate + - src-openeuler/radvd + - src-openeuler/squid + - src-openeuler/python-html5lib + - src-openeuler/libnet + - src-openeuler/tftp + - src-openeuler/lldpad + - src-openeuler/b43-openfwwf + - src-openeuler/libndp + - src-openeuler/openslp + - src-openeuler/mobile-broadband-provider-info + - src-openeuler/xdp-cpumap-tc + - src-openeuler/appweb +- name: Virt + repositories: + - src-openeuler/virt-viewer + - src-openeuler/virglrenderer + - src-openeuler/python-beautifulsoup4 + - src-openeuler/libvirt-python + - src-openeuler/libvirt-glib + - src-openeuler/virt-manager + - src-openeuler/qemu + - src-openeuler/libvirt + - src-openeuler/edk2 + - src-openeuler/perl-Sys-Virt + - src-openeuler/vmtop + - src-openeuler/stratovirt + - openeuler/qemu + - openeuler/libvirt + - openeuler/vmtop + - openeuler/stratovirt +- name: Kernel + repositories: + - openeuler/kernel + - src-openeuler/kabi-dw + - src-openeuler/kernel +- name: Others + repositories: + - src-openeuler/libopenraw + - src-openeuler/libzapojit + - src-openeuler/glassfish-jaxb-api + - src-openeuler/farstream02 + - src-openeuler/fabtests + - src-openeuler/perl-Sub-Uplevel + - src-openeuler/python-pynacl + - src-openeuler/autotune + - src-openeuler/perl-Devel-Symdump + - src-openeuler/perl-Net-SMTP-SSL + - src-openeuler/gegl04 + - src-openeuler/perl-GSSAPI + - src-openeuler/pyorbit + - src-openeuler/u2f-hidraw-policy + - src-openeuler/python-kitchen + - src-openeuler/python-hwdata + - src-openeuler/nilfs-utils + - src-openeuler/keyrings-filesystem + - src-openeuler/zerofree + - src-openeuler/hfsplus-tools + - src-openeuler/ImageMagick + - src-openeuler/gnome-disk-utility + - src-openeuler/twolame + - src-openeuler/perl-Mail-Sender + - src-openeuler/gnome-getting-started-docs + - src-openeuler/folks + - src-openeuler/perl-Encode-Detect + - src-openeuler/libsigcpp20 + - src-openeuler/raptor2 + - src-openeuler/clamav + - src-openeuler/opencc + - src-openeuler/python-joblib + - src-openeuler/python-threadpoolctl + - src-openeuler/perl-Class-Inspector + - src-openeuler/gavl + - src-openeuler/python-qt5 + - src-openeuler/sox + - src-openeuler/perl-Crypt-OpenSSL-Bignum + - src-openeuler/qt-mobility + - src-openeuler/frei0r-plugins + - src-openeuler/xhtml1-dtds + - src-openeuler/perl-File-ShareDir-Install + - src-openeuler/capstone + - src-openeuler/osc + - src-openeuler/python-bcrypt + - src-openeuler/mpg123 + - src-openeuler/libgovirt + - src-openeuler/PyQt4 + - src-openeuler/perl-IO-Multiplex + - src-openeuler/libgnomeui + - src-openeuler/perl-Sys-MemInfo + - src-openeuler/python-cycler + - src-openeuler/libgdither + - src-openeuler/emacs-auctex + - src-openeuler/gtk + - src-openeuler/gtk4 + - src-openeuler/gnome-font-viewer + - src-openeuler/perl-Net-CIDR-Lite + - src-openeuler/python-pandas + - src-openeuler/gnome-icon-theme-symbolic + - src-openeuler/sblim-sfcCommon + - src-openeuler/perl-Net-Server + - src-openeuler/jfsutils + - src-openeuler/python-reportlab + - src-openeuler/python-argcomplete + - src-openeuler/gnome-color-manager + - src-openeuler/python-xgboost + - src-openeuler/gnome-video-effects + - src-openeuler/nbdkit + - src-openeuler/perl-Pod-Coverage + - src-openeuler/gsound + - src-openeuler/libfprint + - src-openeuler/gtksourceview3 + - src-openeuler/clucene + - src-openeuler/python-flask-restful + - src-openeuler/perl-Sys-CPU + - src-openeuler/marisa + - src-openeuler/festival-freebsoft-utils + - src-openeuler/python-dict2xml + - src-openeuler/hexedit + - src-openeuler/perl-File-ShareDir + - src-openeuler/gtkmm30 + - src-openeuler/suitesparse + - src-openeuler/anthy + - src-openeuler/python-pillow + - src-openeuler/pcaudiolib + - src-openeuler/obs-build + - src-openeuler/urlview + - src-openeuler/perl-Sub-Exporter + - src-openeuler/qt5-qtenginio + - src-openeuler/flite + - src-openeuler/opusfile + - src-openeuler/breeze-icon-theme + - src-openeuler/dvdplusrw-tools + - src-openeuler/latex2html + - src-openeuler/dkms + - src-openeuler/glibmm24 + - src-openeuler/python-aniso8601 + - src-openeuler/libmad + - src-openeuler/python-parse + - src-openeuler/gimp + - src-openeuler/container-exception-logger + - src-openeuler/perl-Sub-Exporter-Progressive + - src-openeuler/qt5-qtwebkit + - src-openeuler/espeak-ng + - src-openeuler/irrlicht + - src-openeuler/proj + - src-openeuler/ucs-miscfixed-fonts + - src-openeuler/libwmf + - src-openeuler/qt5-qtwebengine + - src-openeuler/perl-String-CRC32 + - src-openeuler/phonon + - src-openeuler/python-kiwisolver + - src-openeuler/kyotocabinet + - src-openeuler/python-humanize + - src-openeuler/gstreamer1-plugins-good + - src-openeuler/qt5-doc + - src-openeuler/xapian-core + - src-openeuler/babl + - src-openeuler/sip + - src-openeuler/lame + - src-openeuler/python-olefile + - src-openeuler/libburn + - src-openeuler/openEuler-latest-release + - src-openeuler/perl-SNMP_Session + - src-openeuler/gnome-packagekit + - src-openeuler/phodav + - src-openeuler/perl-Package-Generator + - src-openeuler/re2 + - src-openeuler/gnome-python2 + - src-openeuler/mt-st + - src-openeuler/cldr-emoji-annotation + - src-openeuler/qtwebkit + - src-openeuler/festival + - src-openeuler/gcab + - src-openeuler/gnome-icon-theme-extras + - src-openeuler/libmypaint + - src-openeuler/perl-Unicode-EastAsianWidth + - src-openeuler/perl-Tk + - src-openeuler/djvulibre + - src-openeuler/perl-BSD-Resource + - src-openeuler/conmon + - src-openeuler/nagios + - src-openeuler/libid3tag + - src-openeuler/libxmlb + - src-openeuler/libisofs + - src-openeuler/SDL2 + - src-openeuler/mac-robber + - src-openeuler/libspiro + - src-openeuler/python-scikit-learn + - src-openeuler/python-scikit-optimize + - src-openeuler/assimp + - src-openeuler/poly2tri + - src-openeuler/libaesgm + - src-openeuler/aalib + - src-openeuler/afflib + - src-openeuler/apache2-mod_xforward + - src-openeuler/biosdevname + - src-openeuler/cloud-utils + - src-openeuler/debootstrap + - src-openeuler/dogtail + - src-openeuler/dpkg + - src-openeuler/fonts-rpm-macros + - src-openeuler/fuse-python + - src-openeuler/galera + - src-openeuler/gcc_secure + - src-openeuler/icoutils + - src-openeuler/libewf + - src-openeuler/libhbaapi + - src-openeuler/libhbalinux + - src-openeuler/libisoburn + - src-openeuler/libpinyin + - src-openeuler/libsodium + - src-openeuler/mcelog + - src-openeuler/mongo-c-driver + - src-openeuler/mypaint-brushes + - src-openeuler/mysql + - src-openeuler/py3c + - src-openeuler/beakerlib + - src-openeuler/oniguruma + - src-openeuler/perl-BSSolv + - src-openeuler/perl-Canary-Stability + - src-openeuler/perl-Business-ISBN + - src-openeuler/perl-Business-ISBN-Data + - src-openeuler/perl-Class-Method-Modifiers + - src-openeuler/perl-Class-XSAccessor + - src-openeuler/perl-Compress-Bzip2 + - src-openeuler/perl-Config-General + - src-openeuler/perl-common-sense + - src-openeuler/perl-CPAN + - src-openeuler/perl-Crypt-DES + - src-openeuler/perl-Crypt-PasswdMD5 + - src-openeuler/perl-Devel-GlobalDestruction + - src-openeuler/perl-Devel-Size + - src-openeuler/perl-Digest-SHA1 + - src-openeuler/perl-Digest-SHA3 + - src-openeuler/perl-Email-Date-Format + - src-openeuler/perl-ExtUtils-Config + - src-openeuler/perl-ExtUtils-Helpers + - src-openeuler/perl-ExtUtils-InstallPaths + - src-openeuler/perl-Module-Build-Tiny + - src-openeuler/perl-Readonly + - src-openeuler/perl-Test-LeakTrace + - src-openeuler/perl-File-Sync + - src-openeuler/perl-File-BaseDir + - src-openeuler/perl-File-Copy-Recursive + - src-openeuler/perl-File-DesktopEntry + - src-openeuler/perl-File-MimeInfo + - src-openeuler/perl-File-ReadBackwards + - src-openeuler/perl-File-pushd + - src-openeuler/perl-File-Remove + - src-openeuler/perl-GD + - src-openeuler/perl-GD-Barcode + - src-openeuler/perl-HTTP-Daemon + - src-openeuler/perl-Import-Into + - src-openeuler/perl-IO-All + - src-openeuler/perl-IO-stringy + - src-openeuler/perl-JSON-XS + - src-openeuler/perl-local-lib + - src-openeuler/perl-MIME-Lite + - src-openeuler/perl-MIME-Types + - src-openeuler/perl-Module-Install + - src-openeuler/perl-Module-Install-AuthorRequires + - src-openeuler/perl-Module-Install-AuthorTests + - src-openeuler/perl-Module-Install-AutoLicense + - src-openeuler/perl-Module-Install-GithubMeta + - src-openeuler/perl-Module-Install-ManifestSkip + - src-openeuler/perl-Net-LibIDN + - src-openeuler/perl-Net-SNMP + - src-openeuler/perl-Package-Constants + - src-openeuler/perl-Socket-MsgHdr + - src-openeuler/perl-Types-Serialiser + - src-openeuler/perl-Switch + - src-openeuler/perl-Test-RequiresInternet + - src-openeuler/perl-Unicode-LineBreak + - src-openeuler/perl-XML-Catalog + - src-openeuler/perl-XML-TokeParser + - src-openeuler/perl-YAML-LibYAML + - src-openeuler/php + - src-openeuler/PyPAM + - src-openeuler/pv + - src-openeuler/python-alsa + - src-openeuler/python-apipkg + - src-openeuler/python-tqdm + - src-openeuler/python-backports-unittest_mock + - src-openeuler/python-cached_property + - src-openeuler/python-cherrypy + - src-openeuler/python-constantly + - src-openeuler/python-contextlib2 + - src-openeuler/python-docker + - src-openeuler/python-docker-pycreds + - src-openeuler/python-dockerpty + - src-openeuler/python-ecdsa + - src-openeuler/python-evdev + - src-openeuler/python-execnet + - src-openeuler/python-filelock + - src-openeuler/python-gflags + - src-openeuler/python-hamcrest + - src-openeuler/python-hyperlink + - src-openeuler/python-importlib-metadata + - src-openeuler/python-incremental + - src-openeuler/python-junitxml + - src-openeuler/python-keyczar + - src-openeuler/python-ldap + - src-openeuler/python-logutils + - src-openeuler/python-path + - src-openeuler/python-pecan + - src-openeuler/python-pytest-shutil + - src-openeuler/python-semantic_version + - src-openeuler/python-setuptools_git + - src-openeuler/python-simplegeneric + - src-openeuler/python-subprocess32 + - src-openeuler/python-varlink + - src-openeuler/python-zipp + - src-openeuler/python-zope-interface + - src-openeuler/qhull + - src-openeuler/qt-assistant-adp + - src-openeuler/rear + - src-openeuler/redis + - src-openeuler/reiserfs-utils + - src-openeuler/resource-agents + - src-openeuler/rust-packaging + - src-openeuler/sassc + - src-openeuler/sleuthkit + - src-openeuler/sos + - src-openeuler/sphinx + - src-openeuler/tidy + - src-openeuler/tuna + - src-openeuler/uchardet + - src-openeuler/umoci + - src-openeuler/python-toml + - src-openeuler/python-mysqlclient + - src-openeuler/python-PyMySQL + - src-openeuler/python-rsa + - src-openeuler/python-ruamel-yaml + - src-openeuler/python-ruamel-yaml-clib + - src-openeuler/python-suds2 + - src-openeuler/python-texttable + - src-openeuler/python-waitress + - src-openeuler/python-websocket-client + - src-openeuler/python-webtest + - src-openeuler/python-paste-deploy + - src-openeuler/python-pyquery + - src-openeuler/python-WSGIProxy2 + - src-openeuler/python-webob + - src-openeuler/perl-Config-IniFiles + - src-openeuler/perl-CGI + - src-openeuler/boom-boot + - src-openeuler/python-memcached + - src-openeuler/python-psycopg2 + - src-openeuler/seabios + - src-openeuler/procinfo + - src-openeuler/annobin + - src-openeuler/python-zope-event + - src-openeuler/rcs + - src-openeuler/rootsh + - src-openeuler/scsi-target-utils + - src-openeuler/python-cssselect + - src-openeuler/obs-bundled-gems + - src-openeuler/obs-server + - src-openeuler/obs-service-download_files + - src-openeuler/obs-service-extract_file + - src-openeuler/obs-service-rust2rpm + - src-openeuler/obs-service-set_version + - src-openeuler/passenger + - src-openeuler/papirus-icon-theme + - src-openeuler/onboard +- name: System-tool + repositories: + - src-openeuler/argyllcms + - src-openeuler/watchdog + - src-openeuler/custodia + - src-openeuler/criu + - src-openeuler/liblognorm + - src-openeuler/mksh + - src-openeuler/libgphoto2 + - src-openeuler/leveldb + - src-openeuler/rocksdb + - src-openeuler/fcoe-utils + - src-openeuler/ibus-hangul + - src-openeuler/colord-gtk + - src-openeuler/gutenprint + - src-openeuler/kiwi + - src-openeuler/overpass-fonts + - src-openeuler/libraw1394 + - src-openeuler/ibus-table + - src-openeuler/wsmancli + - src-openeuler/v4l-utils + - src-openeuler/hplip + - src-openeuler/crda + - src-openeuler/tang + - src-openeuler/libotf + - src-openeuler/cups-filters + - src-openeuler/bolt + - src-openeuler/kde-filesystem + - src-openeuler/mtx + - src-openeuler/autofs + - src-openeuler/varnish + - src-openeuler/sil-abyssinica-fonts + - src-openeuler/b43-tools + - src-openeuler/ibus-table-array30 + - src-openeuler/libreswan + - src-openeuler/logwatch + - src-openeuler/NetworkManager-libreswan + - src-openeuler/system-config-printer + - src-openeuler/microcode_ctl + - src-openeuler/openhpi + - src-openeuler/netlabel_tools + - src-openeuler/libguestfs + - src-openeuler/mod_fcgid + - src-openeuler/unicode-ucd + - src-openeuler/fakechroot + - src-openeuler/cim-schema + - src-openeuler/cgdcbxd + - src-openeuler/rng-tools + - src-openeuler/portreserve + - src-openeuler/mod_auth_gssapi + - src-openeuler/tog-pegasus + - src-openeuler/m17n-db + - src-openeuler/fwupd + - src-openeuler/libhangul + - src-openeuler/environment-modules + - src-openeuler/nvme-cli + - src-openeuler/sblim-sfcb + - src-openeuler/sblim-sfcc + - src-openeuler/bacula + - src-openeuler/mod_security + - src-openeuler/open-sans-fonts + - src-openeuler/liberation-fonts + - src-openeuler/freeradius + - src-openeuler/gfs2-utils + - src-openeuler/sane-backends + - src-openeuler/dejavu-fonts + - src-openeuler/speech-dispatcher + - src-openeuler/smc-fonts + - src-openeuler/sil-scheherazade-fonts + - src-openeuler/fontawesome-fonts + - src-openeuler/freeipmi + - src-openeuler/m17n-lib + - src-openeuler/libsmbios + - src-openeuler/pinfo + - src-openeuler/openwsman + - src-openeuler/fprintd + - src-openeuler/initial-setup + - src-openeuler/khmeros-fonts + - src-openeuler/julietaula-montserrat-fonts + - src-openeuler/usb_modeswitch + - src-openeuler/sanlock + - src-openeuler/mstflint + - src-openeuler/pps-tools + - src-openeuler/lklug-fonts + - src-openeuler/nvmetcli + - src-openeuler/hivex + - src-openeuler/scap-workbench + - src-openeuler/minicom + - src-openeuler/supermin + - src-openeuler/scap-security-guide + - src-openeuler/haproxy + - src-openeuler/entr + - src-openeuler/rfkill + - src-openeuler/partclone +- name: Packaging + repositories: + - src-openeuler/pakchois + - src-openeuler/copy-jdk-configs + - src-openeuler/rpmdevtools + - src-openeuler/nginx + - src-openeuler/multilib-rpm-config + - src-openeuler/obs_meta +- name: DB + repositories: + - src-openeuler/derby + - src-openeuler/gupnp-dlna + - src-openeuler/h2 + - src-openeuler/postgresql-odbc + - src-openeuler/foomatic + - src-openeuler/foomatic-db + - src-openeuler/postgresql + - src-openeuler/unixODBC + - src-openeuler/firebird + - src-openeuler/mysql5 + - src-openeuler/glassfish-legal + - src-openeuler/geolatte-geom +- name: Base-service + repositories: + - openeuler/openEuler-rpm-config + - src-openeuler/acl + - src-openeuler/acpica-tools + - src-openeuler/adcli + - src-openeuler/aide + - src-openeuler/airline + - src-openeuler/ant-antunit + - src-openeuler/apache-commons-chain + - src-openeuler/apache-commons-el + - src-openeuler/apache-commons-javaflow + - src-openeuler/apache-commons-jci + - src-openeuler/apache-mina + - src-openeuler/apr + - src-openeuler/apr-util + - src-openeuler/argon2 + - src-openeuler/aries-blueprint-annotation-api + - src-openeuler/aries-proxy-impl + - src-openeuler/arm-trusted-firmware + - src-openeuler/asciidoc + - src-openeuler/at + - src-openeuler/atf + - src-openeuler/audiofile + - src-openeuler/authd + - src-openeuler/authselect + - src-openeuler/autoconf + - src-openeuler/autogen + - src-openeuler/automake + - src-openeuler/axiom + - src-openeuler/babel + - src-openeuler/babeltrace + - src-openeuler/basesystem + - src-openeuler/bash + - src-openeuler/bash-completion + - src-openeuler/bc + - src-openeuler/binutils + - src-openeuler/bison + - src-openeuler/brotli + - src-openeuler/bubblewrap + - src-openeuler/bval + - src-openeuler/byte-buddy + - src-openeuler/bzip2 + - src-openeuler/ca-certificates + - src-openeuler/castor + - src-openeuler/cbi-plugins + - src-openeuler/chkconfig + - src-openeuler/chrpath + - src-openeuler/clevis + - src-openeuler/cloud-init + - src-openeuler/conntrack-tools + - src-openeuler/cookcc + - src-openeuler/coreutils + - src-openeuler/cpio + - src-openeuler/cpp-hocon + - src-openeuler/crash + - src-openeuler/createrepo_c + - src-openeuler/cronie + - src-openeuler/crontabs + - src-openeuler/ctags + - src-openeuler/cxf + - src-openeuler/CUnit + - src-openeuler/cyrus-sasl + - src-openeuler/dbus + - src-openeuler/dbus-glib + - src-openeuler/dbus-python + - src-openeuler/dbxtool + - src-openeuler/deltarpm + - src-openeuler/dialog + - src-openeuler/diffstat + - src-openeuler/diffutils + - src-openeuler/ding-libs + - src-openeuler/disruptor + - src-openeuler/docbook-dtds + - src-openeuler/docbook-style-xsl + - src-openeuler/dos2unix + - src-openeuler/dracut + - src-openeuler/drpm + - src-openeuler/dtc + - src-openeuler/dwz + - src-openeuler/ed + - src-openeuler/edac-utils + - src-openeuler/elfutils + - src-openeuler/epydoc + - src-openeuler/exempi + - src-openeuler/expat + - src-openeuler/expect + - src-openeuler/facter + - src-openeuler/felix-osgi-compendium + - src-openeuler/felix-osgi-core + - src-openeuler/felix-osgi-foundation + - src-openeuler/felix-osgi-obr + - src-openeuler/felix-shell + - src-openeuler/findutils + - src-openeuler/fipscheck + - src-openeuler/flex + - src-openeuler/fpaste + - src-openeuler/fusesource-pom + - src-openeuler/future + - src-openeuler/gamin + - src-openeuler/gawk + - src-openeuler/gc + - src-openeuler/gemini-blueprint + - src-openeuler/gettext + - src-openeuler/ghostscript + - src-openeuler/git + - src-openeuler/glassfish-fastinfoset + - src-openeuler/glassfish-master-pom + - src-openeuler/glassfish-websocket-api + - src-openeuler/glassfish-ejb-api + - src-openeuler/gmime30 + - src-openeuler/gnulib + - src-openeuler/gobject-introspection + - src-openeuler/gpgme + - src-openeuler/gphoto2 + - src-openeuler/grep + - src-openeuler/groff + - src-openeuler/grubby + - src-openeuler/gssproxy + - src-openeuler/gupnp-av + - src-openeuler/gzip + - src-openeuler/haveged + - src-openeuler/hiredis + - src-openeuler/hppc + - src-openeuler/htrace + - src-openeuler/ima-evm-utils + - src-openeuler/iso-codes + - src-openeuler/isomd5sum + - src-openeuler/isorelax + - src-openeuler/istack-commons + - src-openeuler/ivtv-firmware + - src-openeuler/jansson + - src-openeuler/jdeparser1 + - src-openeuler/jdom + - src-openeuler/jeromq + - src-openeuler/jose + - src-openeuler/jq + - src-openeuler/json-c + - src-openeuler/Judy + - src-openeuler/kdump-anaconda-addon + - src-openeuler/kexec-tools + - src-openeuler/kpatch + - src-openeuler/krb5 + - src-openeuler/ksh + - src-openeuler/kyua + - src-openeuler/langtable + - src-openeuler/lasso + - src-openeuler/latrace + - src-openeuler/leatherman + - src-openeuler/leptonica + - src-openeuler/less + - src-openeuler/libbytesize + - src-openeuler/libcap-ng + - src-openeuler/libclc + - src-openeuler/libcomps + - src-openeuler/libconfig + - src-openeuler/libcroco + - src-openeuler/libdaemon + - src-openeuler/libdatrie + - src-openeuler/libdb + - src-openeuler/libdbi + - src-openeuler/libecap + - src-openeuler/libedit + - src-openeuler/libestr + - src-openeuler/libev + - src-openeuler/libevent + - src-openeuler/libfastjson + - src-openeuler/libffi + - src-openeuler/libgdiplus + - src-openeuler/libgexiv2 + - src-openeuler/libgit2 + - src-openeuler/libgit2-glib + - src-openeuler/libgsf + - src-openeuler/libIDL + - src-openeuler/libidn + - src-openeuler/libidn2 + - src-openeuler/libkcapi + - src-openeuler/libksba + - src-openeuler/libmaxminddb + - src-openeuler/libmetalink + - src-openeuler/libmnl + - src-openeuler/libmodulemd + - src-openeuler/libmspack + - src-openeuler/libnetfilter_cthelper + - src-openeuler/libnetfilter_cttimeout + - src-openeuler/libnfs + - src-openeuler/libnftnl + - src-openeuler/libnma + - src-openeuler/libnsl2 + - src-openeuler/liboauth + - src-openeuler/libomxil-bellagio + - src-openeuler/libosinfo + - src-openeuler/libpaper + - src-openeuler/libpipeline + - src-openeuler/libplist + - src-openeuler/libpsl + - src-openeuler/libquvi + - src-openeuler/libquvi-scripts + - src-openeuler/librepo + - src-openeuler/libreport + - src-openeuler/libsass + - src-openeuler/libseccomp + - src-openeuler/libsecret + - src-openeuler/libsigsegv + - src-openeuler/libtar + - src-openeuler/libtasn1 + - src-openeuler/libtdb + - src-openeuler/libteam + - src-openeuler/libtheora + - src-openeuler/libtomcrypt + - src-openeuler/libtommath + - src-openeuler/libtool + - src-openeuler/libunistring + - src-openeuler/libunwind + - src-openeuler/libuser + - src-openeuler/libutempter + - src-openeuler/libverto + - src-openeuler/libvorbis + - src-openeuler/libxcrypt + - src-openeuler/libxml2 + - src-openeuler/libxslt + - src-openeuler/libyaml + - src-openeuler/lmdb + - src-openeuler/logrotate + - src-openeuler/lshw + - src-openeuler/lsof + - src-openeuler/lua + - src-openeuler/luajit + - src-openeuler/lua-expat + - src-openeuler/lua-json + - src-openeuler/lua-lpeg + - src-openeuler/lucene4 + - src-openeuler/lutok + - src-openeuler/lz4 + - src-openeuler/lzo + - src-openeuler/lzop + - src-openeuler/m4 + - src-openeuler/mailcap + - src-openeuler/make + - src-openeuler/man-db + - src-openeuler/man-pages + - src-openeuler/maven-release + - src-openeuler/maven-replacer + - src-openeuler/maven-shared + - src-openeuler/maven-verifier-plugin + - src-openeuler/mcpp + - src-openeuler/mecab + - src-openeuler/mercurial + - src-openeuler/mlocate + - src-openeuler/mod_security_crs + - src-openeuler/mongodb + - src-openeuler/mongo-java-driver2 + - src-openeuler/mono + - src-openeuler/morfologik-stemming + - src-openeuler/mtdev + - src-openeuler/multithreadedtc + - src-openeuler/munge-maven-plugin + - src-openeuler/mvel + - src-openeuler/mysema-commons-lang + - src-openeuler/nailgun + - src-openeuler/ncompress + - src-openeuler/nettle + - src-openeuler/nss_nis + - src-openeuler/nss-pam-ldapd + - src-openeuler/ocl-icd + - src-openeuler/oddjob + - src-openeuler/openEuler-indexhtml + - src-openeuler/openEuler-logos + - src-openeuler/openEuler-release + - src-openeuler/openEuler-repos + - src-openeuler/openEuler-rpm-config + - src-openeuler/opensc + - src-openeuler/orc + - src-openeuler/osinfo-db + - src-openeuler/osinfo-db-tools + - src-openeuler/os-prober + - src-openeuler/ostree + - src-openeuler/p11-kit + - src-openeuler/paranamer + - src-openeuler/passwd + - src-openeuler/patch + - src-openeuler/pcre + - src-openeuler/pcre2 + - src-openeuler/perl + - src-openeuler/perl-Digest + - src-openeuler/perl-ExtUtils-MakeMaker + - src-openeuler/perl-Mozilla-CA + - src-openeuler/perl-Storable + - src-openeuler/pigz + - src-openeuler/pkgconf + - src-openeuler/plexus-component-factories-pom + - src-openeuler/polkit + - src-openeuler/polkit-gnome + - src-openeuler/polkit-pkla-compat + - src-openeuler/popt + - src-openeuler/powermock + - src-openeuler/powertop + - src-openeuler/publicsuffix-list + - src-openeuler/pygobject3 + - src-openeuler/pykickstart + - src-openeuler/pyliblzma + - src-openeuler/pyparsing + - src-openeuler/pyparted + - src-openeuler/pyserial + - src-openeuler/python3 + - src-openeuler/python3-mallard-ducktype + - src-openeuler/python-asn1crypto + - src-openeuler/python-backports + - src-openeuler/python-beaker + - src-openeuler/python-cffi + - src-openeuler/python-chardet + - src-openeuler/python-cheetah + - src-openeuler/python-commonmark + - src-openeuler/python-cpio + - src-openeuler/python-crypto + - src-openeuler/python-cryptography + - src-openeuler/python-dateutil + - src-openeuler/python-decorator + - src-openeuler/python-docopt + - src-openeuler/python-enum34 + - src-openeuler/python-google-apputils + - src-openeuler/python-gssapi + - src-openeuler/python-iniparse + - src-openeuler/python-inotify + - src-openeuler/python-jinja2 + - src-openeuler/python-jsonpatch + - src-openeuler/python-jsonpointer + - src-openeuler/python-jsonschema + - src-openeuler/python-jwt + - src-openeuler/python-kmod + - src-openeuler/python-lhsmdu + - src-openeuler/python-linux-procfs + - src-openeuler/python-lxml + - src-openeuler/python-mako + - src-openeuler/python-markupsafe + - src-openeuler/python-meh + - src-openeuler/python-mox + - src-openeuler/python-oauthlib + - src-openeuler/python-ordered-set + - src-openeuler/python-pid + - src-openeuler/python-pip + - src-openeuler/python-ply + - src-openeuler/python-pocketlint + - src-openeuler/python-polib + - src-openeuler/python-prettytable + - src-openeuler/python-productmd + - src-openeuler/python-pyaml + - src-openeuler/python-pycparser + - src-openeuler/python-pycurl + - src-openeuler/python-pydbus + - src-openeuler/python-pysocks + - src-openeuler/python-pytest-cov + - src-openeuler/python-pytest-expect + - src-openeuler/python-pytest-fixture-config + - src-openeuler/python-pytest-mock + - src-openeuler/python-pytest-virtualenv + - src-openeuler/python-pyudev + - src-openeuler/python-qrcode + - src-openeuler/python-recommonmark + - src-openeuler/python-redis + - src-openeuler/python-repoze-lru + - src-openeuler/python-requests-file + - src-openeuler/python-rpm-generators + - src-openeuler/python-schedutils + - src-openeuler/python-setuptools + - src-openeuler/python-simpleline + - src-openeuler/python-six + - src-openeuler/python-slip + - src-openeuler/python-sphinxcontrib-spelling + - src-openeuler/python-systemd + - src-openeuler/python-tempita + - src-openeuler/python-u-msgpack-python + - src-openeuler/python-webencodings + - src-openeuler/pyxattr + - src-openeuler/qdox + - src-openeuler/qpid-proton + - src-openeuler/randomizedtesting + - src-openeuler/rapidjson + - src-openeuler/rarian + - src-openeuler/rasdaemon + - src-openeuler/readline + - src-openeuler/realmd + - src-openeuler/recode + - src-openeuler/replacer + - src-openeuler/rmic-maven-plugin + - src-openeuler/rootfiles + - src-openeuler/rpm + - src-openeuler/rpmrebuild + - src-openeuler/rsync + - src-openeuler/rsyslog + - src-openeuler/screen + - src-openeuler/sed + - src-openeuler/setools + - src-openeuler/setroubleshoot-plugins + - src-openeuler/setup + - src-openeuler/sgabios + - src-openeuler/sgpio + - src-openeuler/shadow + - src-openeuler/sharutils + - src-openeuler/shim + - src-openeuler/si-units + - src-openeuler/slang + - src-openeuler/snakeyaml + - src-openeuler/snappy + - src-openeuler/snappy-java + - src-openeuler/sombok + - src-openeuler/speex + - src-openeuler/speexdsp + - src-openeuler/sscg + - src-openeuler/sssd + - src-openeuler/star + - src-openeuler/startup-notification + - src-openeuler/stringtemplate4 + - src-openeuler/subversion + - src-openeuler/sudo + - src-openeuler/sushi + - src-openeuler/symlinks + - src-openeuler/sysstat + - src-openeuler/systemd + - src-openeuler/tar + - src-openeuler/tcl + - src-openeuler/tcllib + - src-openeuler/tcsh + - src-openeuler/TeXamator + - src-openeuler/thrift + - src-openeuler/time + - src-openeuler/timedatex + - src-openeuler/tmpwatch + - src-openeuler/tng + - src-openeuler/tokyocabinet + - src-openeuler/tomcatjss + - src-openeuler/totem + - src-openeuler/totem-pl-parser + - src-openeuler/tracker + - src-openeuler/tracker-miners + - src-openeuler/trousers + - src-openeuler/tuscany-sdo-java + - src-openeuler/umockdev + - src-openeuler/uname-build-checks + - src-openeuler/unicode-emoji + - src-openeuler/unique + - src-openeuler/unit-api + - src-openeuler/univocity-parsers + - src-openeuler/unzip + - src-openeuler/uom-lib + - src-openeuler/uom-parent + - src-openeuler/uom-systems + - src-openeuler/usermode + - src-openeuler/ustr + - src-openeuler/utf8proc + - src-openeuler/uthash + - src-openeuler/util-linux + - src-openeuler/vboot-utils + - src-openeuler/vim + - src-openeuler/volume_key + - src-openeuler/vulkan-headers + - src-openeuler/vulkan-loader + - src-openeuler/which + - src-openeuler/words + - src-openeuler/wpa_supplicant + - src-openeuler/xalan-j2 + - src-openeuler/xmlsec1 + - src-openeuler/xerces-j2 + - src-openeuler/xmlstarlet + - src-openeuler/xmlto + - src-openeuler/xml-commons-resolver + - src-openeuler/xz + - src-openeuler/yajl + - src-openeuler/yaml-cpp + - src-openeuler/yaml-cpp03 + - src-openeuler/yasm + - src-openeuler/zip + - src-openeuler/zlib + - src-openeuler/zopfli + - src-openeuler/zsh + - src-openeuler/zstd + - src-openeuler/zziplib +- name: Container + repositories: + - openeuler/kata_integration + - src-openeuler/kata-micro-kernel + - src-openeuler/jboss-parent + - src-openeuler/clibcni + - src-openeuler/docker-client-java + - src-openeuler/runc + - src-openeuler/virt-what + - src-openeuler/containerd + - src-openeuler/iSulad-img + - src-openeuler/lcr + - src-openeuler/protobuf + - src-openeuler/iSulad + - src-openeuler/podman + - src-openeuler/skopeo + - src-openeuler/kata-shim + - src-openeuler/kata_integration + - src-openeuler/busybox + - src-openeuler/container-selinux + - src-openeuler/lxc + - src-openeuler/docker + - src-openeuler/kata-runtime + - src-openeuler/libevhtp + - src-openeuler/kata-proxy + - src-openeuler/lxcfs + - src-openeuler/containernetworking-plugins + - src-openeuler/libcgroup + - src-openeuler/kata-agent + - src-openeuler/libnetwork + - src-openeuler/kubernetes + - src-openeuler/docker-compose +- name: Compiler + repositories: + - src-openeuler/gcc + - src-openeuler/llvm + - src-openeuler/clang + - src-openeuler/compiler-rt + - src-openeuler/jtreg + - src-openeuler/openjdk-1.8.0 + - src-openeuler/openjdk-11 + - src-openeuler/openjdk-latest + - src-openeuler/openjfx8 + - src-openeuler/openjfx11 + - src-openeuler/icedtea-web + - src-openeuler/rust + - openeuler/bishengjdk-8 + - openeuler/bishengjdk-11 +- name: Storage + repositories: + - src-openeuler/system-storage-manager + - src-openeuler/gom + - src-openeuler/parted + - src-openeuler/iprutils + - src-openeuler/ndctl + - src-openeuler/fuse + - src-openeuler/tree + - src-openeuler/sg3_utils + - src-openeuler/mdadm + - src-openeuler/python-configobj + - src-openeuler/btrfs-progs + - src-openeuler/python-rtslib + - src-openeuler/ccid + - src-openeuler/attr + - src-openeuler/smartmontools + - src-openeuler/luksmeta + - src-openeuler/nfs4-acl-tools + - src-openeuler/cryptsetup + - src-openeuler/udisks2 + - src-openeuler/mtools + - src-openeuler/libblockdev + - src-openeuler/libldm + - src-openeuler/sdparm + - src-openeuler/perl-DBD-SQLite + - src-openeuler/libpciaccess + - src-openeuler/iotop + - src-openeuler/xfsdump + - src-openeuler/open-iscsi + - src-openeuler/libaio + - src-openeuler/libusbmuxd + - src-openeuler/file + - src-openeuler/e2fsprogs + - src-openeuler/gdbm + - src-openeuler/thin-provisioning-tools + - src-openeuler/dosfstools + - src-openeuler/libusbx + - src-openeuler/mariadb + - src-openeuler/pciutils + - src-openeuler/blktrace + - src-openeuler/usbredir + - src-openeuler/lvm2 + - src-openeuler/dmraid + - src-openeuler/libtalloc + - src-openeuler/perl-DBD-MySQL + - src-openeuler/quota + - src-openeuler/mariadb-connector-c + - src-openeuler/xfsprogs + - src-openeuler/nfs-utils + - src-openeuler/libtevent + - src-openeuler/gdisk + - src-openeuler/glusterfs + - src-openeuler/multipath-tools + - src-openeuler/sysfsutils + - src-openeuler/sqlite + - src-openeuler/smp_utils + - src-openeuler/squashfs-tools + - src-openeuler/libiscsi + - src-openeuler/fxload + - src-openeuler/libusb + - src-openeuler/hdparm + - src-openeuler/pcsc-lite + - src-openeuler/filesystem + - src-openeuler/cifs-utils + - src-openeuler/cachefilesd + - src-openeuler/usbutils + - src-openeuler/lsscsi + - src-openeuler/open-isns + - openeuler/memory-scan + - src-openeuler/fastdfs + - src-openeuler/libfastcommon + - src-openeuler/DCache + - src-openeuler/s3fs-fuse +- name: Desktop + repositories: + - src-openeuler/abattis-cantarell-fonts + - src-openeuler/accountsservice + - src-openeuler/adobe-mappings-cmap + - src-openeuler/adobe-mappings-pdf + - src-openeuler/adwaita-icon-theme + - src-openeuler/adwaita-qt + - src-openeuler/at-spi2-atk + - src-openeuler/at-spi2-core + - src-openeuler/atk + - src-openeuler/augeas + - src-openeuler/avahi + - src-openeuler/bluez + - src-openeuler/bpg-fonts + - src-openeuler/brltty + - src-openeuler/cairo + - src-openeuler/cairomm + - src-openeuler/cdparanoia + - src-openeuler/CharLS + - src-openeuler/cheese + - src-openeuler/cjkuni-ukai-fonts + - src-openeuler/clutter + - src-openeuler/clutter-gst3 + - src-openeuler/clutter-gtk + - src-openeuler/cockpit + - src-openeuler/cogl + - src-openeuler/color-filesystem + - src-openeuler/colord + - src-openeuler/comps-extras + - src-openeuler/cups + - src-openeuler/cups-pk-helper + - src-openeuler/dconf + - src-openeuler/dconf-editor + - src-openeuler/desktop-file-utils + - src-openeuler/disomaster + - src-openeuler/emacs + - src-openeuler/enchant + - src-openeuler/epiphany + - src-openeuler/evolution-data-server + - src-openeuler/exiv2 + - src-openeuler/fltk + - src-openeuler/fontconfig + - src-openeuler/fontpackages + - src-openeuler/freetype + - src-openeuler/fribidi + - src-openeuler/fros + - src-openeuler/GConf2 + - src-openeuler/gcr + - src-openeuler/gd + - src-openeuler/gdk-pixbuf2 + - src-openeuler/gdm + - src-openeuler/geoclue2 + - src-openeuler/geocode-glib + - src-openeuler/giflib + - src-openeuler/gio-qt + - src-openeuler/gjs + - src-openeuler/glade + - src-openeuler/glib2 + - src-openeuler/gnome-abrt + - src-openeuler/gnome-bluetooth + - src-openeuler/gnome-boxes + - src-openeuler/gnome-clocks + - src-openeuler/gnome-contacts + - src-openeuler/gnome-dictionary + - src-openeuler/gnome-doc-utils + - src-openeuler/gnome-icon-theme + - src-openeuler/gnome-initial-setup + - src-openeuler/gnome-keyring + - src-openeuler/gnome-menus + - src-openeuler/gnome-screenshot + - src-openeuler/gnome-session + - src-openeuler/gnome-settings-daemon + - src-openeuler/gnome-shell + - src-openeuler/gnome-shell-extensions + - src-openeuler/gnome-software + - src-openeuler/gnome-system-monitor + - src-openeuler/gnome-terminal + - src-openeuler/gnu-free-fonts + - src-openeuler/google-croscore-fonts + - src-openeuler/google-droid-fonts + - src-openeuler/google-noto-cjk-fonts + - src-openeuler/google-noto-emoji-fonts + - src-openeuler/gpm + - src-openeuler/graphite2 + - src-openeuler/graphviz + - src-openeuler/grilo + - src-openeuler/gsettings-desktop-schemas + - src-openeuler/gsm + - src-openeuler/gstreamer1 + - src-openeuler/gstreamer1-plugins-base + - src-openeuler/gtk2 + - src-openeuler/gtk3 + - src-openeuler/gubbi-fonts + - src-openeuler/guile + - src-openeuler/gv + - src-openeuler/gvfs + - src-openeuler/harfbuzz + - src-openeuler/hicolor-icon-theme + - src-openeuler/hunspell + - src-openeuler/hunspell-en + - src-openeuler/hyperscan + - src-openeuler/ibus + - src-openeuler/ibus-libzhuyin + - src-openeuler/icu + - src-openeuler/imake + - src-openeuler/jbig2dec + - src-openeuler/jbigkit + - src-openeuler/jomolhari-fonts + - src-openeuler/json-glib + - src-openeuler/jxrlib + - src-openeuler/kacst-fonts + - src-openeuler/kbd + - src-openeuler/kde-settings + - src-openeuler/keybinder3 + - src-openeuler/kurdit-unikurd-web-fonts + - src-openeuler/lato-fonts + - src-openeuler/lcms2 + - src-openeuler/libappindicator + - src-openeuler/libarchive + - src-openeuler/libart_lgpl + - src-openeuler/libasyncns + - src-openeuler/libatasmart + - src-openeuler/libbluray + - src-openeuler/libbonobo + - src-openeuler/libbonoboui + - src-openeuler/libcacard + - src-openeuler/libcanberra + - src-openeuler/libcdio + - src-openeuler/libcdio-paranoia + - src-openeuler/libdazzle + - src-openeuler/libdmx + - src-openeuler/libdrm + - src-openeuler/libepoxy + - src-openeuler/libexif + - src-openeuler/libfontenc + - src-openeuler/libgdata + - src-openeuler/libgee + - src-openeuler/libglade2 + - src-openeuler/libglvnd + - src-openeuler/libgpg-error + - src-openeuler/libgtop2 + - src-openeuler/libgudev + - src-openeuler/libgusb + - src-openeuler/libgweather + - src-openeuler/libgxps + - src-openeuler/libical + - src-openeuler/libICE + - src-openeuler/libimobiledevice + - src-openeuler/libiptcdata + - src-openeuler/libisal + - src-openeuler/libjpeg-turbo + - src-openeuler/libldb + - src-openeuler/libmatchbox + - src-openeuler/libmediaart + - src-openeuler/libmediainfo + - src-openeuler/libmng + - src-openeuler/libnotify + - src-openeuler/libpng + - src-openeuler/librsvg2 + - src-openeuler/libsexy + - src-openeuler/libSM + - src-openeuler/libsoup + - src-openeuler/libtiff + - src-openeuler/libtimezonemap + - src-openeuler/libwebp + - src-openeuler/libwnck3 + - src-openeuler/libX11 + - src-openeuler/libx86emu + - src-openeuler/libXau + - src-openeuler/libXaw + - src-openeuler/libxcb + - src-openeuler/libXcomposite + - src-openeuler/libXcursor + - src-openeuler/libXdamage + - src-openeuler/libXdmcp + - src-openeuler/libXext + - src-openeuler/libXfixes + - src-openeuler/libXfont2 + - src-openeuler/libXft + - src-openeuler/libXi + - src-openeuler/libXinerama + - src-openeuler/libxkbcommon + - src-openeuler/libxkbfile + - src-openeuler/libxklavier + - src-openeuler/libXmu + - src-openeuler/libXpm + - src-openeuler/libXrandr + - src-openeuler/libXrender + - src-openeuler/libXres + - src-openeuler/libxshmfence + - src-openeuler/libXt + - src-openeuler/libXtst + - src-openeuler/libXv + - src-openeuler/libXvMC + - src-openeuler/libXxf86dga + - src-openeuler/libXxf86misc + - src-openeuler/libXxf86vm + - src-openeuler/libzen + - src-openeuler/lxsession + - src-openeuler/madan-fonts + - src-openeuler/mailx + - src-openeuler/mesa + - src-openeuler/mesa-libGLU + - src-openeuler/metacity + - src-openeuler/mozilla-filesystem + - src-openeuler/mozjs52 + - src-openeuler/mozjs60 + - src-openeuler/mozjs68 + - src-openeuler/nafees-web-naskh-fonts + - src-openeuler/navilu-fonts + - src-openeuler/ncurses + - src-openeuler/newt + - src-openeuler/openbox + - src-openeuler/openjpeg + - src-openeuler/openjpeg2 + - src-openeuler/orca + - src-openeuler/PackageKit + - src-openeuler/PackageKit-Qt + - src-openeuler/paktype-naqsh-fonts + - src-openeuler/paktype-naskh-basic-fonts + - src-openeuler/paktype-tehreer-fonts + - src-openeuler/pango + - src-openeuler/paratype-pt-sans-fonts + - src-openeuler/pinentry + - src-openeuler/pipewire + - src-openeuler/pixman + - src-openeuler/plymouth + - src-openeuler/poppler + - src-openeuler/poppler-data + - src-openeuler/pyatspi + - src-openeuler/pycairo + - src-openeuler/python-coverage + - src-openeuler/python-dmidecode + - src-openeuler/python-ethtool + - src-openeuler/pytz + - src-openeuler/qrencode + - src-openeuler/qt-settings + - src-openeuler/qt5 + - src-openeuler/rest + - src-openeuler/rtkit + - src-openeuler/saab-fonts + - src-openeuler/samyak-fonts + - src-openeuler/satyr + - src-openeuler/sbc + - src-openeuler/seahorse + - src-openeuler/sendmail + - src-openeuler/setserial + - src-openeuler/sgml-common + - src-openeuler/shared-mime-info + - src-openeuler/sil-nuosu-fonts + - src-openeuler/sil-padauk-fonts + - src-openeuler/sound-theme-freedesktop + - src-openeuler/source-highlight + - src-openeuler/spice + - src-openeuler/spice-gtk + - src-openeuler/spice-vdagent + - src-openeuler/stix-fonts + - src-openeuler/switcheroo-control + - src-openeuler/sysprof + - src-openeuler/taglib + - src-openeuler/telepathy-filesystem + - src-openeuler/telepathy-glib + - src-openeuler/telepathy-logger + - src-openeuler/texinfo + - src-openeuler/thai-scalable-fonts + - src-openeuler/tibetan-machine-uni-fonts + - src-openeuler/tigervnc + - src-openeuler/tk + - src-openeuler/tmux + - src-openeuler/urw-base35-fonts + - src-openeuler/vino + - src-openeuler/wayland + - src-openeuler/webkit2gtk3 + - src-openeuler/webrtc-audio-processing + - src-openeuler/woff2 + - src-openeuler/wqy-microhei-fonts + - src-openeuler/wqy-zenhei-fonts + - src-openeuler/wxGTK3 + - src-openeuler/x265 + - src-openeuler/x3270 + - src-openeuler/Xaw3d + - src-openeuler/xcb-util + - src-openeuler/xdg-desktop-portal + - src-openeuler/xdg-user-dirs + - src-openeuler/xdg-user-dirs-gtk + - src-openeuler/xdg-utils + - src-openeuler/xkeyboard-config + - src-openeuler/xorg-x11-apps + - src-openeuler/xorg-x11-drivers + - src-openeuler/xorg-x11-drv-ati + - src-openeuler/xorg-x11-drv-dummy + - src-openeuler/xorg-x11-drv-evdev + - src-openeuler/xorg-x11-drv-fbdev + - src-openeuler/xorg-x11-drv-intel + - src-openeuler/xorg-x11-drv-libinput + - src-openeuler/xorg-x11-drv-nouveau + - src-openeuler/xorg-x11-drv-qxl + - src-openeuler/xorg-x11-drv-v4l + - src-openeuler/xorg-x11-drv-vesa + - src-openeuler/xorg-x11-drv-vmware + - src-openeuler/xorg-x11-drv-wacom + - src-openeuler/xorg-x11-font-utils + - src-openeuler/xorg-x11-fonts + - src-openeuler/xorg-x11-server + - src-openeuler/xorg-x11-server-utils + - src-openeuler/xorg-x11-utils + - src-openeuler/xorg-x11-xauth + - src-openeuler/xorg-x11-xbitmaps + - src-openeuler/xorg-x11-xinit + - src-openeuler/xorg-x11-xkb-utils + - src-openeuler/xrestop + - src-openeuler/xterm + - src-openeuler/xvattr + - src-openeuler/yelp + - src-openeuler/yelp-xsl + - src-openeuler/yp-tools + - src-openeuler/ypbind + - src-openeuler/ypserv + - src-openeuler/zenity +- name: Computing + repositories: + - src-openeuler/jamm + - src-openeuler/double-conversion + - src-openeuler/ps_mem + - src-openeuler/libqb + - src-openeuler/memkind + - src-openeuler/dyninst + - src-openeuler/libevdev + - src-openeuler/nspr + - src-openeuler/libatomic_ops + - src-openeuler/lm_sensors + - src-openeuler/lttng-ust + - src-openeuler/hwdata + - src-openeuler/irqbalance + - src-openeuler/procps-ng + - src-openeuler/userspace-rcu + - src-openeuler/linux-firmware + - src-openeuler/mpfr + - src-openeuler/libinput + - src-openeuler/boost + - src-openeuler/psmisc + - src-openeuler/numad + - src-openeuler/libthai + - src-openeuler/kmod + - src-openeuler/lockdev + - src-openeuler/hwinfo + - src-openeuler/gdb + - src-openeuler/libipt + - src-openeuler/libsamplerate + - src-openeuler/gperftools + - src-openeuler/libogg + - src-openeuler/pulseaudio + - src-openeuler/libsndfile + - src-openeuler/tzdata + - src-openeuler/flac + - src-openeuler/upower + - src-openeuler/alsa-lib + - src-openeuler/gmp + - src-openeuler/alsa-firmware + - src-openeuler/numactl + - src-openeuler/glibc + - src-openeuler/libijs + - src-openeuler/libmpc + - src-openeuler/npth + - src-openeuler/acpid + - src-openeuler/ORBit2 + - src-openeuler/libwacom + - src-openeuler/i2c-tools + - src-openeuler/strace + - src-openeuler/shapelib + - src-openeuler/tuned + - src-openeuler/systemtap + - src-openeuler/alsa-tools + - src-openeuler/libvisual + - src-openeuler/dmidecode + - src-openeuler/opus + - src-openeuler/libhugetlbfs +- name: sig-Community + repositories: + - openeuler/community + - openeuler/blog +- name: A-Tune + repositories: + - openeuler/A-Tune + - openeuler/prefetch_tuning + - src-openeuler/A-Tune + - src-openeuler/prefetch_tuning + - openeuler/wisdom-advisor + - src-openeuler/wisdom-advisor +- name: kae + repositories: + - openeuler/kae_driver + - openeuler/libkae + - openeuler/libwd + - src-openeuler/kae_driver + - src-openeuler/libkae + - src-openeuler/libwd +- name: iSulad + repositories: + - openeuler/iSulad + - openeuler/lcr + - openeuler/clibcni + - openeuler/iSulad-img + - openeuler/authz + - openeuler/syscontainer-tools + - openeuler/lxcfs-tools + - openeuler/async-libfuse + - openeuler/isula-build + - openeuler/isula-transform + - src-openeuler/authz + - src-openeuler/syscontainer-tools + - src-openeuler/lxcfs-tools + - src-openeuler/isula-build + - src-openeuler/isula-transform + - src-openeuler/libwebsockets +- name: sig-Java + repositories: + - openeuler/Java-Packages + - src-openeuler/aesh + - src-openeuler/android-json-org-java + - src-openeuler/annotation-indexer + - src-openeuler/ant + - src-openeuler/ant-contrib + - src-openeuler/antlr3 + - src-openeuler/aopalliance + - src-openeuler/apache-commons-cli + - src-openeuler/apache-commons-compress + - src-openeuler/apache-commons-configuration + - src-openeuler/apache-commons-discovery + - src-openeuler/apache-commons-exec + - src-openeuler/apache-commons-io + - src-openeuler/apache-commons-jxpath + - src-openeuler/apache-commons-lang3 + - src-openeuler/apache-commons-ognl + - src-openeuler/apache-commons-parent + - src-openeuler/apache-ivy + - src-openeuler/apache-parent + - src-openeuler/apache-resource-bundles + - src-openeuler/apacheds + - src-openeuler/apiguardian + - src-openeuler/aqute-bnd + - src-openeuler/arquillian-core + - src-openeuler/artemis + - src-openeuler/aspectjweaver + - src-openeuler/atinject + - src-openeuler/avalon-framework + - src-openeuler/avalon-logkit + - src-openeuler/BareBonesBrowserLaunch + - src-openeuler/bean-validation-api + - src-openeuler/bsh + - src-openeuler/buildnumber-maven-plugin + - src-openeuler/byaccj + - src-openeuler/byteman + - src-openeuler/c3p0 + - src-openeuler/cassandra-java-driver + - src-openeuler/cdi-api + - src-openeuler/classmate + - src-openeuler/codehaus-parent + - src-openeuler/codemodel + - src-openeuler/cpptasks + - src-openeuler/cxf-build-utils + - src-openeuler/cxf-xjc-utils + - src-openeuler/dain-snappy + - src-openeuler/datanucleus-api-jdo + - src-openeuler/datanucleus-core + - src-openeuler/datanucleus-maven-parent + - src-openeuler/datanucleus-rdbms + - src-openeuler/dnsjava + - src-openeuler/dom4j + - src-openeuler/easymock + - src-openeuler/eclipse-cdt + - src-openeuler/eclipse-ecf + - src-openeuler/eclipse-egit + - src-openeuler/eclipse-emf + - src-openeuler/eclipse-gef + - src-openeuler/eclipse-launchbar + - src-openeuler/eclipse-license + - src-openeuler/eclipse-linuxtools + - src-openeuler/eclipse-m2e-workspace + - src-openeuler/eclipse-mylyn + - src-openeuler/eclipse-photran + - src-openeuler/eclipse-ptp + - src-openeuler/eclipse-remote + - src-openeuler/eclipse-subclipse + - src-openeuler/eclipse-swtbot + - src-openeuler/eclipse-tm-terminal + - src-openeuler/eclipselink + - src-openeuler/ed25519-java + - src-openeuler/ehcache-core + - src-openeuler/ehcache-sizeof-agent + - src-openeuler/evo-inflector + - src-openeuler/exec-maven-plugin + - src-openeuler/extra166y + - src-openeuler/felix-bundlerepository + - src-openeuler/felix-framework + - src-openeuler/felix-gogo-command + - src-openeuler/felix-gogo-parent + - src-openeuler/felix-main + - src-openeuler/felix-osgi-obr-resolver + - src-openeuler/felix-scr + - src-openeuler/felix-utils + - src-openeuler/findbugs + - src-openeuler/findbugs-bcel + - src-openeuler/fop + - src-openeuler/geronimo-annotation + - src-openeuler/geronimo-commonj + - src-openeuler/geronimo-jaxrpc + - src-openeuler/geronimo-jms + - src-openeuler/geronimo-jta + - src-openeuler/geronimo-saaj + - src-openeuler/glassfish-el + - src-openeuler/glassfish-gmbal + - src-openeuler/glassfish-hk2 + - src-openeuler/glassfish-jaxrpc-api + - src-openeuler/glassfish-jsp-api + - src-openeuler/glassfish-management-api + - src-openeuler/glassfish-pfl + - src-openeuler/glassfish-servlet-api + - src-openeuler/glassfish-toplink-essentials + - src-openeuler/glassfish-transaction-api + - src-openeuler/gnu-getopt + - src-openeuler/google-guice + - src-openeuler/gpars + - src-openeuler/grizzly-npn + - src-openeuler/groovy + - src-openeuler/groovy18 + - src-openeuler/gsbase + - src-openeuler/guava20 + - src-openeuler/hawtbuf + - src-openeuler/hawtjni + - src-openeuler/hessian + - src-openeuler/hibernate + - src-openeuler/hibernate-commons-annotations + - src-openeuler/hibernate-jpa-2.0-api + - src-openeuler/hibernate-jpa-2.1-api + - src-openeuler/hibernate-search + - src-openeuler/hibernate-validator + - src-openeuler/hibernate3 + - src-openeuler/hibernate4 + - src-openeuler/HikariCP + - src-openeuler/hsqldb + - src-openeuler/httpcomponents-client + - src-openeuler/httpcomponents-core + - src-openeuler/httpunit + - src-openeuler/icu4j + - src-openeuler/idlj-maven-plugin + - src-openeuler/infinispan + - src-openeuler/invokebinder + - src-openeuler/irclib + - src-openeuler/ironjacamar + - src-openeuler/itext + - src-openeuler/jackcess + - src-openeuler/jackcess-encrypt + - src-openeuler/jackson + - src-openeuler/jackson-databind + - src-openeuler/jackson-dataformat-xml + - src-openeuler/jackson-dataformats-text + - src-openeuler/jackson-datatype-joda + - src-openeuler/jackson-datatypes-collections + - src-openeuler/jackson-jaxrs-providers + - src-openeuler/jackson-modules-base + - src-openeuler/jacoco + - src-openeuler/jacorb + - src-openeuler/jaf + - src-openeuler/jakarta-commons-httpclient + - src-openeuler/jamonapi + - src-openeuler/jandex + - src-openeuler/jandex-maven-plugin + - src-openeuler/janino + - src-openeuler/jansi + - src-openeuler/jansi-native + - src-openeuler/jasperreports + - src-openeuler/jastow + - src-openeuler/jasypt + - src-openeuler/java-libpst + - src-openeuler/java-oauth + - src-openeuler/java-service-wrapper + - src-openeuler/java-xmlbuilder + - src-openeuler/javacc + - src-openeuler/javapackages-tools + - src-openeuler/javapoet + - src-openeuler/javassist + - src-openeuler/jaxb2-common-basics + - src-openeuler/jaxb2-maven-plugin + - src-openeuler/jaxen + - src-openeuler/jberet + - src-openeuler/jboss-batch-1.0-api + - src-openeuler/jboss-classfilewriter + - src-openeuler/jboss-common-beans + - src-openeuler/jboss-concurrency-1.0-api + - src-openeuler/jboss-connector-1.7-api + - src-openeuler/jboss-dmr + - src-openeuler/jboss-ejb-3.1-api + - src-openeuler/jboss-ejb-3.2-api + - src-openeuler/jboss-ejb-client + - src-openeuler/jboss-ejb3-ext-api + - src-openeuler/jboss-el-2.2-api + - src-openeuler/jboss-el-3.0-api + - src-openeuler/jboss-iiop-client + - src-openeuler/jboss-integration + - src-openeuler/jboss-interceptors-1.1-api + - src-openeuler/jboss-interceptors-1.2-api + - src-openeuler/jboss-invocation + - src-openeuler/jboss-jacc-1.4-api + - src-openeuler/jboss-jacc-1.5-api + - src-openeuler/jboss-jaspi-1.0-api + - src-openeuler/jboss-jaspi-1.1-api + - src-openeuler/jboss-jaxb-2.2-api + - src-openeuler/jboss-jaxrpc-1.1-api + - src-openeuler/jboss-jaxws-2.2-api + - src-openeuler/jboss-jms-1.1-api + - src-openeuler/jboss-jsf-2.2-api + - src-openeuler/jboss-jsp-2.2-api + - src-openeuler/jboss-logging + - src-openeuler/jboss-logging-tools + - src-openeuler/jboss-logging-tools1 + - src-openeuler/jboss-logmanager + - src-openeuler/jboss-marshalling + - src-openeuler/jboss-metadata + - src-openeuler/jboss-modules + - src-openeuler/jboss-msc + - src-openeuler/jboss-negotiation + - src-openeuler/jboss-remote-naming + - src-openeuler/jboss-remoting-jmx + - src-openeuler/jboss-rmi-1.0-api + - src-openeuler/jboss-sasl + - src-openeuler/jboss-servlet-2.5-api + - src-openeuler/jboss-servlet-3.0-api + - src-openeuler/jboss-specs-parent + - src-openeuler/jboss-threads + - src-openeuler/jboss-transaction-1.1-api + - src-openeuler/jboss-transaction-1.2-api + - src-openeuler/jboss-transaction-spi + - src-openeuler/jboss-vfs + - src-openeuler/jboss-websocket-1.1-api + - src-openeuler/jbossws-api + - src-openeuler/jbossws-parent + - src-openeuler/jcifs + - src-openeuler/jcip-annotations + - src-openeuler/jcommon + - src-openeuler/jcsp + - src-openeuler/jdbi + - src-openeuler/jdependency + - src-openeuler/jdiff + - src-openeuler/jdo-api + - src-openeuler/jdo2-api + - src-openeuler/jdom2 + - src-openeuler/je + - src-openeuler/jenkins-executable-war + - src-openeuler/jenkins-xstream + - src-openeuler/jersey + - src-openeuler/jersey1 + - src-openeuler/jets3t + - src-openeuler/jetty-alpn + - src-openeuler/jetty-alpn-api + - src-openeuler/jetty-artifact-remote-resources + - src-openeuler/jetty-assembly-descriptors + - src-openeuler/jetty-build-support + - src-openeuler/jetty-distribution-remote-resources + - src-openeuler/jetty-test-helper + - src-openeuler/jetty-test-policy + - src-openeuler/jetty-toolchain + - src-openeuler/jetty-version-maven-plugin + - src-openeuler/jetty8 + - src-openeuler/jflex + - src-openeuler/jFormatString + - src-openeuler/jfreechart + - src-openeuler/jgit + - src-openeuler/jgroups + - src-openeuler/jibx + - src-openeuler/jline + - src-openeuler/jline1 + - src-openeuler/jmatio + - src-openeuler/jmh + - src-openeuler/jmock + - src-openeuler/jna + - src-openeuler/jnr-x86asm + - src-openeuler/joda-time + - src-openeuler/johnzon + - src-openeuler/json-path + - src-openeuler/json-smart + - src-openeuler/jsonic + - src-openeuler/jsoup + - src-openeuler/jspc + - src-openeuler/jsr-305 + - src-openeuler/jsr-311 + - src-openeuler/jtidy + - src-openeuler/jtoaster + - src-openeuler/jts + - src-openeuler/jul-to-slf4j-stub + - src-openeuler/junit-addons + - src-openeuler/junitperf + - src-openeuler/juniversalchardet + - src-openeuler/jvnet-parent + - src-openeuler/jwnl + - src-openeuler/jython + - src-openeuler/kxml + - src-openeuler/language-detector + - src-openeuler/ldaptive + - src-openeuler/lettuce + - src-openeuler/leveldb-java + - src-openeuler/leveldbjni + - src-openeuler/lightcouch + - src-openeuler/log4j + - src-openeuler/log4j-jboss-logmanager + - src-openeuler/lucene3 + - src-openeuler/lz4-java + - src-openeuler/lzma-java + - src-openeuler/maven + - src-openeuler/maven-antrun-plugin + - src-openeuler/maven-archiver + - src-openeuler/maven-artifact-resolver + - src-openeuler/maven-artifact-transfer + - src-openeuler/maven-assembly-plugin + - src-openeuler/maven-checkstyle-plugin + - src-openeuler/maven-common-artifact-filters + - src-openeuler/maven-compiler-plugin + - src-openeuler/maven-dependency-analyzer + - src-openeuler/maven-dependency-plugin + - src-openeuler/maven-dependency-tree + - src-openeuler/maven-doxia + - src-openeuler/maven-doxia-sitetools + - src-openeuler/maven-eclipse-plugin + - src-openeuler/maven-enforcer + - src-openeuler/maven-file-management + - src-openeuler/maven-filtering + - src-openeuler/maven-gpg-plugin + - src-openeuler/maven-idea-plugin + - src-openeuler/maven-injection-plugin + - src-openeuler/maven-invoker + - src-openeuler/maven-invoker-plugin + - src-openeuler/maven-jar-plugin + - src-openeuler/maven-jarsigner-plugin + - src-openeuler/maven-javadoc-plugin + - src-openeuler/maven-jaxb2-plugin + - src-openeuler/maven-license-plugin + - src-openeuler/maven-local + - src-openeuler/maven-mapping + - src-openeuler/maven-native + - src-openeuler/maven-parent + - src-openeuler/maven-plugin-build-helper + - src-openeuler/maven-plugin-bundle + - src-openeuler/maven-plugin-testing + - src-openeuler/maven-plugin-tools + - src-openeuler/maven-processor-plugin + - src-openeuler/maven-remote-resources-plugin + - src-openeuler/maven-reporting-api + - src-openeuler/maven-reporting-exec + - src-openeuler/maven-reporting-impl + - src-openeuler/maven-resolver + - src-openeuler/maven-resources-plugin + - src-openeuler/maven-script-interpreter + - src-openeuler/maven-shade-plugin + - src-openeuler/maven-shared-incremental + - src-openeuler/maven-shared-io + - src-openeuler/maven-shared-jar + - src-openeuler/maven-shared-jarsigner + - src-openeuler/maven-shared-utils + - src-openeuler/maven-site-plugin + - src-openeuler/maven-source-plugin + - src-openeuler/maven-surefire + - src-openeuler/maven-verifier + - src-openeuler/maven-wagon + - src-openeuler/maven-war-plugin + - src-openeuler/maven2 + - src-openeuler/mavibot + - src-openeuler/mchange-commons + - src-openeuler/memoryfilesystem + - src-openeuler/metainf-services + - src-openeuler/metrics + - src-openeuler/mimepull + - src-openeuler/mojarra + - src-openeuler/mongo-java-driver + - src-openeuler/multiverse + - src-openeuler/mustache-java + - src-openeuler/mx4j + - src-openeuler/narayana + - src-openeuler/native-platform + - src-openeuler/netty-tcnative + - src-openeuler/netty3 + - src-openeuler/noggit + - src-openeuler/objectweb-pom + - src-openeuler/objenesis + - src-openeuler/ohc + - src-openeuler/openjpa + - src-openeuler/openwebbeans + - src-openeuler/os-maven-plugin + - src-openeuler/parboiled + - src-openeuler/pdf-renderer + - src-openeuler/pdfbox + - src-openeuler/pegdown + - src-openeuler/picketbox + - src-openeuler/picketbox-commons + - src-openeuler/picketbox-xacml + - src-openeuler/plexus-archiver + - src-openeuler/plexus-build-api + - src-openeuler/plexus-cipher + - src-openeuler/plexus-classworlds + - src-openeuler/plexus-cli + - src-openeuler/plexus-compiler + - src-openeuler/plexus-component-api + - src-openeuler/plexus-components-pom + - src-openeuler/plexus-containers + - src-openeuler/plexus-i18n + - src-openeuler/plexus-interactivity + - src-openeuler/plexus-interpolation + - src-openeuler/plexus-io + - src-openeuler/plexus-languages + - src-openeuler/plexus-pom + - src-openeuler/plexus-resources + - src-openeuler/plexus-sec-dispatcher + - src-openeuler/plexus-utils + - src-openeuler/plexus-velocity + - src-openeuler/postgresql-jdbc + - src-openeuler/proguard + - src-openeuler/protostream + - src-openeuler/proxool + - src-openeuler/proxytoys + - src-openeuler/qpid-proton-java + - src-openeuler/quartz + - src-openeuler/querydsl3 + - src-openeuler/rabbitmq-java-client + - src-openeuler/reflections + - src-openeuler/remotetea + - src-openeuler/resteasy + - src-openeuler/rhino + - src-openeuler/rhq-plugin-annotations + - src-openeuler/robust-http-client + - src-openeuler/rome + - src-openeuler/rxjava + - src-openeuler/rxtx + - src-openeuler/sac + - src-openeuler/sat4j + - src-openeuler/saxpath + - src-openeuler/scala + - src-openeuler/scannotation + - src-openeuler/sequence-library + - src-openeuler/serp + - src-openeuler/sezpoz + - src-openeuler/shibboleth-java-parent-v3 + - src-openeuler/shibboleth-java-support + - src-openeuler/shrinkwrap + - src-openeuler/shrinkwrap-descriptors + - src-openeuler/shrinkwrap-resolver + - src-openeuler/sigar + - src-openeuler/signpost-core + - src-openeuler/simple + - src-openeuler/simple-xml + - src-openeuler/sisu + - src-openeuler/sisu-mojos + - src-openeuler/slf4j-jboss-logmanager + - src-openeuler/snowball-java + - src-openeuler/sonatype-oss-parent + - src-openeuler/sonatype-plugins-parent + - src-openeuler/spatial4j + - src-openeuler/spring-ldap + - src-openeuler/springframework + - src-openeuler/springframework-amqp + - src-openeuler/springframework-batch + - src-openeuler/springframework-data-commons + - src-openeuler/springframework-data-mongodb + - src-openeuler/springframework-data-redis + - src-openeuler/springframework-hateoas + - src-openeuler/springframework-plugin + - src-openeuler/springframework-retry + - src-openeuler/spymemcached + - src-openeuler/sqljet + - src-openeuler/sslext + - src-openeuler/stapler + - src-openeuler/stapler-adjunct-timeline + - src-openeuler/staxmapper + - src-openeuler/stream-lib + - src-openeuler/struts + - src-openeuler/svnkit + - src-openeuler/swagger-core + - src-openeuler/swt-chart + - src-openeuler/tagsoup + - src-openeuler/takari-archiver + - src-openeuler/takari-incrementalbuild + - src-openeuler/takari-lifecycle + - src-openeuler/takari-plugin-testing + - src-openeuler/takari-pom + - src-openeuler/tascalate-asmx + - src-openeuler/tascalate-javaflow + - src-openeuler/test-interface + - src-openeuler/thredds + - src-openeuler/tika + - src-openeuler/tiles + - src-openeuler/time-api + - src-openeuler/tomcat-taglibs-parent + - src-openeuler/treelayout + - src-openeuler/trilead-putty-extension + - src-openeuler/trilead-ssh2 + - src-openeuler/txw2 + - src-openeuler/tycho + - src-openeuler/tycho-extras + - src-openeuler/typesafe-config + - src-openeuler/uima-addons + - src-openeuler/uima-parent-pom + - src-openeuler/uimaj + - src-openeuler/undertow + - src-openeuler/velocity + - src-openeuler/velocity-tools + - src-openeuler/vorbis-java + - src-openeuler/weld-api + - src-openeuler/weld-core + - src-openeuler/weld-parent + - src-openeuler/wildfly-build-tools + - src-openeuler/wildfly-core + - src-openeuler/wildfly-elytron + - src-openeuler/wildfly-security-manager + - src-openeuler/ws-jaxme + - src-openeuler/ws-xmlschema + - src-openeuler/wsdl4j + - src-openeuler/wss4j + - src-openeuler/xapool + - src-openeuler/xbean + - src-openeuler/xml-maven-plugin + - src-openeuler/xml-security + - src-openeuler/xmlbeans + - src-openeuler/xmlbeans-maven-plugin + - src-openeuler/xmlenc + - src-openeuler/xmlrpc + - src-openeuler/xmlunit + - src-openeuler/xmpcore + - src-openeuler/xmvn + - src-openeuler/xnio + - src-openeuler/xpp3 + - src-openeuler/xsom + - src-openeuler/xstream + - src-openeuler/yecht + - src-openeuler/znerd-oss-parent + - src-openeuler/zxing +- name: sig-ruby + repositories: + - src-openeuler/jruby + - src-openeuler/ruby + - src-openeuler/ruby-augeas + - src-openeuler/ruby-common + - src-openeuler/rubygem-abrt + - src-openeuler/rubygem-actioncable + - src-openeuler/rubygem-actionmailer + - src-openeuler/rubygem-actionpack + - src-openeuler/rubygem-actionview + - src-openeuler/rubygem-activejob + - src-openeuler/rubygem-activemodel + - src-openeuler/rubygem-activemodel-serializers-xml + - src-openeuler/rubygem-activerecord + - src-openeuler/rubygem-activeresource + - src-openeuler/rubygem-activestorage + - src-openeuler/rubygem-activesupport + - src-openeuler/rubygem-addressable + - src-openeuler/rubygem-afm + - src-openeuler/rubygem-ansi + - src-openeuler/rubygem-arel + - src-openeuler/rubygem-aruba + - src-openeuler/rubygem-Ascii85 + - src-openeuler/rubygem-asciidoctor + - src-openeuler/rubygem-atomic + - src-openeuler/rubygem-backports + - src-openeuler/rubygem-bacon + - src-openeuler/rubygem-bcrypt + - src-openeuler/rubygem-bindex + - src-openeuler/rubygem-bootsnap + - src-openeuler/rubygem-builder + - src-openeuler/rubygem-bundler + - src-openeuler/rubygem-byebug + - src-openeuler/rubygem-capybara + - src-openeuler/rubygem-childprocess + - src-openeuler/rubygem-chronic + - src-openeuler/rubygem-coderay + - src-openeuler/rubygem-coffee-script + - src-openeuler/rubygem-coffee-script-source + - src-openeuler/rubygem-concurrent-ruby + - src-openeuler/rubygem-connection_pool + - src-openeuler/rubygem-contracts + - src-openeuler/rubygem-crack + - src-openeuler/rubygem-crass + - src-openeuler/rubygem-creole + - src-openeuler/rubygem-cucumber + - src-openeuler/rubygem-cucumber-core + - src-openeuler/rubygem-cucumber-expressions + - src-openeuler/rubygem-cucumber-tag_expressions + - src-openeuler/rubygem-cucumber-wire + - src-openeuler/rubygem-curb + - src-openeuler/rubygem-daemons + - src-openeuler/rubygem-dalli + - src-openeuler/rubygem-delorean + - src-openeuler/rubygem-diff-lcs + - src-openeuler/rubygem-docile + - src-openeuler/rubygem-domain_name + - src-openeuler/rubygem-ejs + - src-openeuler/rubygem-erubi + - src-openeuler/rubygem-erubis + - src-openeuler/rubygem-ethon + - src-openeuler/rubygem-eventmachine + - src-openeuler/rubygem-excon + - src-openeuler/rubygem-execjs + - src-openeuler/rubygem-expression_parser + - src-openeuler/rubygem-fakefs + - src-openeuler/rubygem-faraday + - src-openeuler/rubygem-fattr + - src-openeuler/rubygem-ffi + - src-openeuler/rubygem-flexmock + - src-openeuler/rubygem-formatador + - src-openeuler/rubygem-gem2rpm + - src-openeuler/rubygem-gherkin + - src-openeuler/rubygem-globalid + - src-openeuler/rubygem-haml + - src-openeuler/rubygem-hashdiff + - src-openeuler/rubygem-hashery + - src-openeuler/rubygem-http-cookie + - src-openeuler/rubygem-httpclient + - src-openeuler/rubygem-i18n + - src-openeuler/rubygem-idn + - src-openeuler/rubygem-introspection + - src-openeuler/rubygem-jbuilder + - src-openeuler/rubygem-jquery-rails + - src-openeuler/rubygem-json_pure + - src-openeuler/rubygem-launchy + - src-openeuler/rubygem-liquid + - src-openeuler/rubygem-listen + - src-openeuler/rubygem-loofah + - src-openeuler/rubygem-mail + - src-openeuler/rubygem-marcel + - src-openeuler/rubygem-maruku + - src-openeuler/rubygem-memcache-client + - src-openeuler/rubygem-metaclass + - src-openeuler/rubygem-method_source + - src-openeuler/rubygem-mime-types + - src-openeuler/rubygem-mime-types-data + - src-openeuler/rubygem-mimemagic + - src-openeuler/rubygem-mini_magick + - src-openeuler/rubygem-mini_mime + - src-openeuler/rubygem-minitest + - src-openeuler/rubygem-minitest-reporters + - src-openeuler/rubygem-minitest4 + - src-openeuler/rubygem-mocha + - src-openeuler/rubygem-msgpack + - src-openeuler/rubygem-multi_json + - src-openeuler/rubygem-multi_test + - src-openeuler/rubygem-multipart-post + - src-openeuler/rubygem-mustermann + - src-openeuler/rubygem-nio4r + - src-openeuler/rubygem-nokogiri + - src-openeuler/rubygem-open4 + - src-openeuler/rubygem-pathspec + - src-openeuler/rubygem-pdf-core + - src-openeuler/rubygem-pdf-inspector + - src-openeuler/rubygem-pdf-reader + - src-openeuler/rubygem-pkg-config + - src-openeuler/rubygem-power_assert + - src-openeuler/rubygem-prawn + - src-openeuler/rubygem-prawn-table + - src-openeuler/rubygem-pry + - src-openeuler/rubygem-pry-nav + - src-openeuler/rubygem-public_suffix + - src-openeuler/rubygem-puma + - src-openeuler/rubygem-rack + - src-openeuler/rubygem-rack-cache + - src-openeuler/rubygem-rack-protection + - src-openeuler/rubygem-rack-test + - src-openeuler/rubygem-rails + - src-openeuler/rubygem-rails-controller-testing + - src-openeuler/rubygem-rails-dom-testing + - src-openeuler/rubygem-rails-html-sanitizer + - src-openeuler/rubygem-railties + - src-openeuler/rubygem-rake-compiler + - src-openeuler/rubygem-rb-inotify + - src-openeuler/rubygem-rdiscount + - src-openeuler/rubygem-redcarpet + - src-openeuler/rubygem-RedCloth + - src-openeuler/rubygem-redis + - src-openeuler/rubygem-rgen + - src-openeuler/rubygem-rouge + - src-openeuler/rubygem-rspec + - src-openeuler/rubygem-rspec-core + - src-openeuler/rubygem-rspec-expectations + - src-openeuler/rubygem-rspec-its + - src-openeuler/rubygem-rspec-mocks + - src-openeuler/rubygem-rspec-rails + - src-openeuler/rubygem-rspec-support + - src-openeuler/rubygem-rspec2 + - src-openeuler/rubygem-rspec2-core + - src-openeuler/rubygem-rspec2-expectations + - src-openeuler/rubygem-rspec2-mocks + - src-openeuler/rubygem-ruby-progressbar + - src-openeuler/rubygem-ruby-rc4 + - src-openeuler/rubygem-ruby-shadow + - src-openeuler/rubygem-rubyzip + - src-openeuler/rubygem-safe_yaml + - src-openeuler/rubygem-sass + - src-openeuler/rubygem-sass-rails + - src-openeuler/rubygem-sdoc + - src-openeuler/rubygem-selenium-webdriver + - src-openeuler/rubygem-session + - src-openeuler/rubygem-shindo + - src-openeuler/rubygem-shoulda + - src-openeuler/rubygem-shoulda-context + - src-openeuler/rubygem-shoulda-matchers + - src-openeuler/rubygem-simplecov + - src-openeuler/rubygem-simplecov-html + - src-openeuler/rubygem-sinatra + - src-openeuler/rubygem-slop + - src-openeuler/rubygem-spring + - src-openeuler/rubygem-sprockets + - src-openeuler/rubygem-sprockets-rails + - src-openeuler/rubygem-sqlite3 + - src-openeuler/rubygem-temple + - src-openeuler/rubygem-test_declarative + - src-openeuler/rubygem-thin + - src-openeuler/rubygem-thor + - src-openeuler/rubygem-thread_order + - src-openeuler/rubygem-thread_safe + - src-openeuler/rubygem-tilt + - src-openeuler/rubygem-timecop + - src-openeuler/rubygem-ttfunk + - src-openeuler/rubygem-turbolinks + - src-openeuler/rubygem-turbolinks-source + - src-openeuler/rubygem-typhoeus + - src-openeuler/rubygem-tzinfo + - src-openeuler/rubygem-uglifier + - src-openeuler/rubygem-unf + - src-openeuler/rubygem-unf_ext + - src-openeuler/rubygem-webmock + - src-openeuler/rubygem-websocket + - src-openeuler/rubygem-websocket-driver + - src-openeuler/rubygem-websocket-extensions + - src-openeuler/rubygem-wikicloth + - src-openeuler/rubygem-xpath + - src-openeuler/rubygem-yard + - src-openeuler/rubygem-ZenTest + - src-openeuler/rubygems-ronn +- name: sig-nodejs + repositories: + - src-openeuler/closure-compiler + - src-openeuler/expresso + - src-openeuler/js-jquery2 + - src-openeuler/js-sizzle + - src-openeuler/lodash + - src-openeuler/node-gyp + - src-openeuler/nodejs + - src-openeuler/nodejs-abbrev + - src-openeuler/nodejs-acorn + - src-openeuler/nodejs-ansi + - src-openeuler/nodejs-ansi-font + - src-openeuler/nodejs-ansi-regex + - src-openeuler/nodejs-ansi-styles + - src-openeuler/nodejs-are-we-there-yet + - src-openeuler/nodejs-argparse + - src-openeuler/nodejs-array-differ + - src-openeuler/nodejs-array-index + - src-openeuler/nodejs-array-union + - src-openeuler/nodejs-array-uniq + - src-openeuler/nodejs-arrify + - src-openeuler/nodejs-asap + - src-openeuler/nodejs-asn1 + - src-openeuler/nodejs-assert-plus + - src-openeuler/nodejs-assertion-error + - src-openeuler/nodejs-async + - src-openeuler/nodejs-aws-sign2 + - src-openeuler/nodejs-balanced-match + - src-openeuler/nodejs-better-assert + - src-openeuler/nodejs-bindings + - src-openeuler/nodejs-bl + - src-openeuler/nodejs-block-stream + - src-openeuler/nodejs-bluebird + - src-openeuler/nodejs-boom + - src-openeuler/nodejs-brace-expansion + - src-openeuler/nodejs-buffer-equal + - src-openeuler/nodejs-builtin-modules + - src-openeuler/nodejs-bunker + - src-openeuler/nodejs-burrito + - src-openeuler/nodejs-bytes + - src-openeuler/nodejs-caller-callsite + - src-openeuler/nodejs-caller-path + - src-openeuler/nodejs-callsite + - src-openeuler/nodejs-callsites + - src-openeuler/nodejs-caseless + - src-openeuler/nodejs-chai + - src-openeuler/nodejs-chalk + - src-openeuler/nodejs-character-parser + - src-openeuler/nodejs-charm + - src-openeuler/nodejs-cjson + - src-openeuler/nodejs-clean-css + - src-openeuler/nodejs-cli-color + - src-openeuler/nodejs-clone + - src-openeuler/nodejs-closure-compiler + - src-openeuler/nodejs-colors + - src-openeuler/nodejs-combined-stream + - src-openeuler/nodejs-commander + - src-openeuler/nodejs-commonmark + - src-openeuler/nodejs-concat-map + - src-openeuler/nodejs-concat-stream + - src-openeuler/nodejs-console-dot-log + - src-openeuler/nodejs-constantinople + - src-openeuler/nodejs-core-util-is + - src-openeuler/nodejs-cryptiles + - src-openeuler/nodejs-css + - src-openeuler/nodejs-css-parse + - src-openeuler/nodejs-css-stringify + - src-openeuler/nodejs-ctype + - src-openeuler/nodejs-d + - src-openeuler/nodejs-dateformat + - src-openeuler/nodejs-debug + - src-openeuler/nodejs-deep-eql + - src-openeuler/nodejs-deep-equal + - src-openeuler/nodejs-deep-is + - src-openeuler/nodejs-defence + - src-openeuler/nodejs-defence-cli + - src-openeuler/nodejs-define-properties + - src-openeuler/nodejs-defined + - src-openeuler/nodejs-delayed-stream + - src-openeuler/nodejs-delegates + - src-openeuler/nodejs-diff + - src-openeuler/nodejs-difflet + - src-openeuler/nodejs-difflib + - src-openeuler/nodejs-docopt + - src-openeuler/nodejs-dreamopt + - src-openeuler/nodejs-duplexer + - src-openeuler/nodejs-ebnf-parser + - src-openeuler/nodejs-ejs + - src-openeuler/nodejs-end-of-stream + - src-openeuler/nodejs-entities + - src-openeuler/nodejs-es-abstract + - src-openeuler/nodejs-es-to-primitive + - src-openeuler/nodejs-es5-ext + - src-openeuler/nodejs-es6-iterator + - src-openeuler/nodejs-es6-symbol + - src-openeuler/nodejs-es6-weak-map + - src-openeuler/nodejs-escape-string-regexp + - src-openeuler/nodejs-escodegen + - src-openeuler/nodejs-esprima + - src-openeuler/nodejs-estraverse + - src-openeuler/nodejs-esutils + - src-openeuler/nodejs-event-emitter + - src-openeuler/nodejs-eventemitter2 + - src-openeuler/nodejs-events-to-array + - src-openeuler/nodejs-exit + - src-openeuler/nodejs-expect-dot-js + - src-openeuler/nodejs-extend + - src-openeuler/nodejs-eyes + - src-openeuler/nodejs-fast-levenshtein + - src-openeuler/nodejs-faye-websocket + - src-openeuler/nodejs-figures + - src-openeuler/nodejs-fileset + - src-openeuler/nodejs-fill-keys + - src-openeuler/nodejs-find-up + - src-openeuler/nodejs-findup-sync + - src-openeuler/nodejs-flot + - src-openeuler/nodejs-for-each + - src-openeuler/nodejs-foreach + - src-openeuler/nodejs-forever-agent + - src-openeuler/nodejs-form-data + - src-openeuler/nodejs-formatio + - src-openeuler/nodejs-from + - src-openeuler/nodejs-fstream + - src-openeuler/nodejs-function-bind + - src-openeuler/nodejs-gauge + - src-openeuler/nodejs-gaze + - src-openeuler/nodejs-generate-function + - src-openeuler/nodejs-generate-object-property + - src-openeuler/nodejs-getobject + - src-openeuler/nodejs-github-url-from-git + - src-openeuler/nodejs-glob + - src-openeuler/nodejs-globule + - src-openeuler/nodejs-graceful-fs + - src-openeuler/nodejs-graceful-readlink + - src-openeuler/nodejs-growl + - src-openeuler/nodejs-grunt + - src-openeuler/nodejs-grunt-cli + - src-openeuler/nodejs-grunt-contrib-clean + - src-openeuler/nodejs-grunt-contrib-internal + - src-openeuler/nodejs-grunt-contrib-nodeunit + - src-openeuler/nodejs-grunt-contrib-uglify + - src-openeuler/nodejs-grunt-contrib-watch + - src-openeuler/nodejs-grunt-known-options + - src-openeuler/nodejs-grunt-legacy-log + - src-openeuler/nodejs-grunt-legacy-log-utils + - src-openeuler/nodejs-grunt-legacy-util + - src-openeuler/nodejs-gzip-size + - src-openeuler/nodejs-handlebars + - src-openeuler/nodejs-har-validator + - src-openeuler/nodejs-has + - src-openeuler/nodejs-has-ansi + - src-openeuler/nodejs-has-color + - src-openeuler/nodejs-has-flag + - src-openeuler/nodejs-has-symbols + - src-openeuler/nodejs-has-unicode + - src-openeuler/nodejs-hash_file + - src-openeuler/nodejs-hashish + - src-openeuler/nodejs-hawk + - src-openeuler/nodejs-heap + - src-openeuler/nodejs-hoek + - src-openeuler/nodejs-hooker + - src-openeuler/nodejs-hosted-git-info + - src-openeuler/nodejs-http-signature + - src-openeuler/nodejs-iconv + - src-openeuler/nodejs-iconv-lite + - src-openeuler/nodejs-image-size + - src-openeuler/nodejs-inflight + - src-openeuler/nodejs-inherits + - src-openeuler/nodejs-inherits1 + - src-openeuler/nodejs-interpret + - src-openeuler/nodejs-is + - src-openeuler/nodejs-is-builtin-module + - src-openeuler/nodejs-is-callable + - src-openeuler/nodejs-is-date-object + - src-openeuler/nodejs-is-function + - src-openeuler/nodejs-is-my-json-valid + - src-openeuler/nodejs-is-object + - src-openeuler/nodejs-is-property + - src-openeuler/nodejs-is-regex + - src-openeuler/nodejs-is-symbol + - src-openeuler/nodejs-is-typedarray + - src-openeuler/nodejs-isarray + - src-openeuler/nodejs-isexe + - src-openeuler/nodejs-isstream + - src-openeuler/nodejs-istanbul + - src-openeuler/nodejs-jade + - src-openeuler/nodejs-jison + - src-openeuler/nodejs-jison-lex + - src-openeuler/nodejs-jju + - src-openeuler/nodejs-js-yaml + - src-openeuler/nodejs-json-diff + - src-openeuler/nodejs-json-parse-helpfulerror + - src-openeuler/nodejs-json-stringify-safe + - src-openeuler/nodejs-jsonify + - src-openeuler/nodejs-jsonpointer + - src-openeuler/nodejs-jsonselect + - src-openeuler/nodejs-less + - src-openeuler/nodejs-less-plugin-clean-css + - src-openeuler/nodejs-levn + - src-openeuler/nodejs-lex-parser + - src-openeuler/nodejs-load-grunt-tasks + - src-openeuler/nodejs-locate-path + - src-openeuler/nodejs-lolex + - src-openeuler/nodejs-lru-queue + - src-openeuler/nodejs-make-arrow-function + - src-openeuler/nodejs-make-generator-function + - src-openeuler/nodejs-maxmin + - src-openeuler/nodejs-mdurl + - src-openeuler/nodejs-memoizee + - src-openeuler/nodejs-merge-descriptors + - src-openeuler/nodejs-mime + - src-openeuler/nodejs-mime-db + - src-openeuler/nodejs-mime-types + - src-openeuler/nodejs-minimatch + - src-openeuler/nodejs-minimist + - src-openeuler/nodejs-mkdirp + - src-openeuler/nodejs-mock-fs + - src-openeuler/nodejs-module-not-found-error + - src-openeuler/nodejs-monocle + - src-openeuler/nodejs-ms + - src-openeuler/nodejs-multimatch + - src-openeuler/nodejs-nan + - src-openeuler/nodejs-nan0 + - src-openeuler/nodejs-nan1 + - src-openeuler/nodejs-next-tick + - src-openeuler/nodejs-node-uuid + - src-openeuler/nodejs-nomnom + - src-openeuler/nodejs-nopt + - src-openeuler/nodejs-noptify + - src-openeuler/nodejs-normalize-package-data + - src-openeuler/nodejs-npmlog + - src-openeuler/nodejs-oauth-sign + - src-openeuler/nodejs-object-assign + - src-openeuler/nodejs-object-dot-assign + - src-openeuler/nodejs-object-inspect + - src-openeuler/nodejs-object-is + - src-openeuler/nodejs-object-keys + - src-openeuler/nodejs-once + - src-openeuler/nodejs-optimist + - src-openeuler/nodejs-optionator + - src-openeuler/nodejs-os-homedir + - src-openeuler/nodejs-os-tmpdir + - src-openeuler/nodejs-osenv + - src-openeuler/nodejs-p-limit + - src-openeuler/nodejs-p-locate + - src-openeuler/nodejs-package + - src-openeuler/nodejs-packaging + - src-openeuler/nodejs-paperboy + - src-openeuler/nodejs-path-array + - src-openeuler/nodejs-path-exists + - src-openeuler/nodejs-path-is-absolute + - src-openeuler/nodejs-path-parse + - src-openeuler/nodejs-pinkie + - src-openeuler/nodejs-pinkie-promise + - src-openeuler/nodejs-pkg-up + - src-openeuler/nodejs-prelude-ls + - src-openeuler/nodejs-pretty-bytes + - src-openeuler/nodejs-process-nextick-args + - src-openeuler/nodejs-promise + - src-openeuler/nodejs-promises-aplus-tests + - src-openeuler/nodejs-proxyquire + - src-openeuler/nodejs-qs + - src-openeuler/nodejs-raw-body + - src-openeuler/nodejs-read-package-json + - src-openeuler/nodejs-readable-stream + - src-openeuler/nodejs-readdirp + - src-openeuler/nodejs-rechoir + - src-openeuler/nodejs-replace-require-self + - src-openeuler/nodejs-request + - src-openeuler/nodejs-require-directory + - src-openeuler/nodejs-require-inject + - src-openeuler/nodejs-require-uncached + - src-openeuler/nodejs-requirejs + - src-openeuler/nodejs-resolve + - src-openeuler/nodejs-resolve-from + - src-openeuler/nodejs-resolve-pkg + - src-openeuler/nodejs-resumer + - src-openeuler/nodejs-rimraf + - src-openeuler/nodejs-rollup + - src-openeuler/nodejs-runforcover + - src-openeuler/nodejs-safe-buffer + - src-openeuler/nodejs-samsam + - src-openeuler/nodejs-semver + - src-openeuler/nodejs-set-immediate-shim + - src-openeuler/nodejs-shelljs + - src-openeuler/nodejs-should + - src-openeuler/nodejs-should-equal + - src-openeuler/nodejs-should-format + - src-openeuler/nodejs-should-type + - src-openeuler/nodejs-simple-assert + - src-openeuler/nodejs-sinon + - src-openeuler/nodejs-slide + - src-openeuler/nodejs-sntp + - src-openeuler/nodejs-source-map + - src-openeuler/nodejs-source-map-support + - src-openeuler/nodejs-spdx-correct + - src-openeuler/nodejs-spdx-exceptions + - src-openeuler/nodejs-spdx-expression-parse + - src-openeuler/nodejs-spdx-license-ids + - src-openeuler/nodejs-sprintf-js + - src-openeuler/nodejs-stream-replace + - src-openeuler/nodejs-string + - src-openeuler/nodejs-string-dot-prototype-dot-repeat + - src-openeuler/nodejs-string-dot-prototype-dot-trim + - src-openeuler/nodejs-string_decoder + - src-openeuler/nodejs-stringstream + - src-openeuler/nodejs-strip-ansi + - src-openeuler/nodejs-strip-json-comments + - src-openeuler/nodejs-supports-color + - src-openeuler/nodejs-tap + - src-openeuler/nodejs-tap-parser + - src-openeuler/nodejs-tape + - src-openeuler/nodejs-tar + - src-openeuler/nodejs-temporary + - src-openeuler/nodejs-test + - src-openeuler/nodejs-through + - src-openeuler/nodejs-through2 + - src-openeuler/nodejs-timers-ext + - src-openeuler/nodejs-tiny-lr-fork + - src-openeuler/nodejs-tough-cookie + - src-openeuler/nodejs-transformers + - src-openeuler/nodejs-traverse + - src-openeuler/nodejs-tunnel-agent + - src-openeuler/nodejs-type-check + - src-openeuler/nodejs-type-detect + - src-openeuler/nodejs-underscore + - src-openeuler/nodejs-underscore-dot-string + - src-openeuler/nodejs-unpipe + - src-openeuler/nodejs-uri-path + - src-openeuler/nodejs-util + - src-openeuler/nodejs-util-deprecate + - src-openeuler/nodejs-validate-npm-package-license + - src-openeuler/nodejs-vows + - src-openeuler/nodejs-websocket-driver + - src-openeuler/nodejs-which + - src-openeuler/nodejs-window-size + - src-openeuler/nodejs-with + - src-openeuler/nodejs-wordwrap + - src-openeuler/nodejs-wrappy + - src-openeuler/nodejs-xtend + - src-openeuler/nodejs-yamlish + - src-openeuler/nodejs-yargs + - src-openeuler/nodeunit + - src-openeuler/uglify-js + - src-openeuler/uglify-js1 +- name: Private + repositories: + - openeuler/os-autoinst-distri-openEuler + - openeuler/security + - src-openeuler/aalto-xml + - src-openeuler/adobe-source-code-pro-fonts + - src-openeuler/allegro + - src-openeuler/amtk + - src-openeuler/antlr4 + - src-openeuler/apache-commons-beanutils + - src-openeuler/apache-commons-codec + - src-openeuler/apache-commons-lang + - src-openeuler/apache-commons-vfs + - src-openeuler/appstream + - src-openeuler/appstream-data + - src-openeuler/args4j + - src-openeuler/armadillo + - src-openeuler/arpack + - src-openeuler/asio + - src-openeuler/autotrace + - src-openeuler/aws-sdk-java + - src-openeuler/baobab + - src-openeuler/batik + - src-openeuler/bcm283x-firmware + - src-openeuler/blosc + - src-openeuler/build + - src-openeuler/bullet + - src-openeuler/bytelist + - src-openeuler/cfitsio + - src-openeuler/checkstyle + - src-openeuler/chromaprint + - src-openeuler/ci_check + - src-openeuler/ci_project + - src-openeuler/clamav-unofficial-sigs + - src-openeuler/classloader-leak-test-framework + - src-openeuler/codenarc + - src-openeuler/compat-libgfortran + - src-openeuler/cvsps + - src-openeuler/cyrus-imapd + - src-openeuler/debian-keyring + - src-openeuler/devhelp + - src-openeuler/DevIL + - src-openeuler/dict2xml + - src-openeuler/dietlibc + - src-openeuler/Done + - src-openeuler/eclipse + - src-openeuler/eclipse-jgit + - src-openeuler/eclipselink-persistence-api + - src-openeuler/efl + - src-openeuler/ehcache-parent + - src-openeuler/extlinux-bootloader + - src-openeuler/ezmorph + - src-openeuler/f29-backgrounds + - src-openeuler/fasterxml-oss-parent + - src-openeuler/fastutil + - src-openeuler/fcitx + - src-openeuler/felix-parent + - src-openeuler/Flask-RESTful + - src-openeuler/fluid-soundfont + - src-openeuler/fluidsynth + - src-openeuler/folks-telepathy + - src-openeuler/freexl + - src-openeuler/fwupdate + - src-openeuler/game-music-emu + - src-openeuler/gdal + - src-openeuler/gedit + - src-openeuler/geos + - src-openeuler/geronimo-interceptor + - src-openeuler/geronimo-validation + - src-openeuler/glassfish-annotation-api + - src-openeuler/glyphicons-halflings-fonts + - src-openeuler/gmetrics + - src-openeuler/gnome-backgrounds + - src-openeuler/gnome-characters + - src-openeuler/gnome-logs + - src-openeuler/gnome-remote-desktop + - src-openeuler/gnome-tweaks + - src-openeuler/google-gson + - src-openeuler/google-http-java-client + - src-openeuler/google-oauth-java-client + - src-openeuler/google-roboto-slab-fonts + - src-openeuler/gradle + - src-openeuler/gssntlmssp + - src-openeuler/gtkspell + - src-openeuler/gtkspell3 + - src-openeuler/gtkspellmm30 + - src-openeuler/guava + - src-openeuler/hawtjni-runtime + - src-openeuler/hibernate-jpa + - src-openeuler/http-builder + - src-openeuler/ibus-kkc + - src-openeuler/icon-naming-utils + - src-openeuler/imlib2 + - src-openeuler/imsettings + - src-openeuler/infinipath-psm + - src-openeuler/inkscape + - src-openeuler/temporary-integration-test + - src-openeuler/internal-issue + - src-openeuler/ipython + - src-openeuler/irrXML + - src-openeuler/jackson-core + - src-openeuler/libburn1 + - src-openeuler/libisofs1 + - src-openeuler/jack-audio-connection-kit + - src-openeuler/jackson-annotations + - src-openeuler/jackson-bom + - src-openeuler/jackson-dataformats-binary + - src-openeuler/jackson-parent + - src-openeuler/jai-imageio-core + - src-openeuler/jarjar + - src-openeuler/jatl + - src-openeuler/java + - src-openeuler/java-base64 + - src-openeuler/java-comment-preprocessor + - src-openeuler/javacc-maven-plugin + - src-openeuler/javaewah + - src-openeuler/jboss-remoting + - src-openeuler/jboss-transaction + - src-openeuler/jcodings + - src-openeuler/jctools + - src-openeuler/jdeparser + - src-openeuler/jenkins_project + - src-openeuler/jetty + - src-openeuler/jetty-schemas + - src-openeuler/jhighlight + - src-openeuler/js-jquery + - src-openeuler/js-underscore + - src-openeuler/jsch-agent-proxy + - src-openeuler/js-jquery1 + - src-openeuler/json-lib + - src-openeuler/Keras + - src-openeuler/kiwi-dlimage + - src-openeuler/kiwi-template-openEuler + - src-openeuler/kryo + - src-openeuler/ladspa + - src-openeuler/ledmon + - src-openeuler/lensfun + - src-openeuler/libass + - src-openeuler/libbs2b + - src-openeuler/libdap + - src-openeuler/libEMF + - src-openeuler/libffado + - src-openeuler/libgeotiff + - src-openeuler/libgta + - src-openeuler/libkate + - src-openeuler/libkkc + - src-openeuler/libkkc-data + - src-openeuler/libkml + - src-openeuler/libmodplug + - src-openeuler/libofa + - src-openeuler/liboggz + - src-openeuler/liboil + - src-openeuler/libomp + - src-openeuler/libpq + - src-openeuler/libpsm2 + - src-openeuler/librevenge + - src-openeuler/libsane-hpaio + - src-openeuler/libspatialite + - src-openeuler/libuninameslist + - src-openeuler/libvncserver + - src-openeuler/libwpd + - src-openeuler/libwpg + - src-openeuler/libxmlpp + - src-openeuler/lldb + - src-openeuler/logback + - src-openeuler/lohit-gurmukhi-fonts + - src-openeuler/lohit-odia-fonts + - src-openeuler/lucene + - src-openeuler/lzma + - src-openeuler/mainline.list + - src-openeuler/malaga + - src-openeuler/malaga-suomi-voikko + - src-openeuler/manifest + - src-openeuler/maven-clean-plugin + - src-openeuler/maven-install-plugin + - src-openeuler/maven-plugins-pom + - src-openeuler/maven-scm + - src-openeuler/mingw-crt + - src-openeuler/mingw-filesystem + - src-openeuler/mingw-gcc + - src-openeuler/mingw-srvany + - src-openeuler/minlog + - src-openeuler/mkeuleros + - src-openeuler/modello + - src-openeuler/mojo-parent + - src-openeuler/nautilus-sendto + - src-openeuler/nekohtml + - src-openeuler/netcdf + - src-openeuler/netty + - src-openeuler/new.list + - src-openeuler/objectweb-asm3 + - src-openeuler/ocaml-calendar + - src-openeuler/ocaml-camlp4 + - src-openeuler/ocaml-camomile + - src-openeuler/ocaml-csv + - src-openeuler/ocaml-curses + - src-openeuler/ocaml-extlib + - src-openeuler/ocaml-fileutils + - src-openeuler/ocaml-findlib + - src-openeuler/ocaml-gettext + - src-openeuler/ocaml-libvirt + - src-openeuler/ocaml-ounit + - src-openeuler/ocaml-xml-light + - src-openeuler/ogdi + - src-openeuler/ongres-scram + - src-openeuler/opencryptoki + - src-openeuler/openEuler_chroot + - src-openeuler/openmotif + - src-openeuler/openpgm + - src-openeuler/osgi-annotation + - src-openeuler/osgi-compendium + - src-openeuler/osgi-core + - src-openeuler/passivetex + - src-openeuler/perl-CPAN-Changes + - src-openeuler/perl-Crypt-CBC + - src-openeuler/perl-Crypt-OpenSSL-Guess + - src-openeuler/perl-Expect + - src-openeuler/perl-Mojolicious + - src-openeuler/perl-IO-Tty + - src-openeuler/perl-Net-DNS-Resolver-Mock + - src-openeuler/perl-Net-LibIDN2 + - src-openeuler/perl-srpm-macros + - src-openeuler/perl-Test-CPAN-Meta + - src-openeuler/perl-Tie-IxHash + - src-openeuler/perl-Time-Zone + - src-openeuler/perl-Unix-Syslog + - src-openeuler/phonon-backend-gstreamer + - src-openeuler/physfs + - src-openeuler/pkgconfig + - src-openeuler/plexus-ant-factory + - src-openeuler/plexus-bsh-factory + - src-openeuler/plotutils + - src-openeuler/pmix + - src-openeuler/portaudio + - src-openeuler/potrace + - src-openeuler/properties-maven-plugin + - src-openeuler/protoparser + - src-openeuler/pstoedit + - src-openeuler/python-appdirs + - src-openeuler/python-Automat + - src-openeuler/python-backports-functools_lru_cache + - src-openeuler/python-backports-shutil_get_terminal_size + - src-openeuler/python-behave + - src-openeuler/python-Bottleneck + - src-openeuler/python-breathe + - src-openeuler/python-eventlet + - src-openeuler/python-graphviz + - src-openeuler/python-h5py + - src-openeuler/python-hpack + - src-openeuler/python-httpbin + - src-openeuler/python-hyperframe + - src-openeuler/python-jmespath + - src-openeuler/python-Keras + - src-openeuler/python-keras-applications + - src-openeuler/python-Keras_Preprocessing + - src-openeuler/python-latexcodec + - src-openeuler/python-m2r + - src-openeuler/python-matplotlib + - src-openeuler/python-mistune + - src-openeuler/python-netifaces + - src-openeuler/python-networkx + - src-openeuler/python-numexpr + - src-openeuler/python-numpydoc + - src-openeuler/python-orderedset + - src-openeuler/python-parse_type + - src-openeuler/python-pasta + - src-openeuler/python-pathlib + - src-openeuler/python-pexpect + - src-openeuler/python-pickleshare + - src-openeuler/python-pkgconfig + - src-openeuler/python-priority + - src-openeuler/python-prompt_toolkit + - src-openeuler/python-ptyprocess + - src-openeuler/python-pybtex + - src-openeuler/python-pybtex-docutils + - src-openeuler/python-pydotplus + - src-openeuler/python-pyflakes + - src-openeuler/python-pyglet + - src-openeuler/python-pyside + - src-openeuler/python-pytest-httpbin + - src-openeuler/python-rpmfluff + - src-openeuler/python-scour + - src-openeuler/python-service-identity + - src-openeuler/python-sphinx-bootstrap-theme + - src-openeuler/python-sphinxcontrib-bibtex + - src-openeuler/python-tables + - src-openeuler/python-twisted + - src-openeuler/python-wcwidth + - src-openeuler/python-zmq + - src-openeuler/python-h2 + - src-openeuler/reflectasm + - src-openeuler/repo + - src-openeuler/rpm-mpi-hooks + - src-openeuler/rsh + - src-openeuler/rubygem-hpricot + - src-openeuler/rubygem-mustache + - src-openeuler/rubygem-ronn + - src-openeuler/sbinary + - src-openeuler/sbt + - src-openeuler/scl-utils + - src-openeuler/SDL_sound + - src-openeuler/setuptool + - src-openeuler/slf4j + - src-openeuler/sni-qt + - src-openeuler/sos-collector + - src-openeuler/spice-parent + - src-openeuler/sshj + - src-openeuler/stax2-api + - src-openeuler/SuperLU + - src-openeuler/syslinux-tftpboot + - src-openeuler/system-config-firewall + - src-openeuler/taglist-enable + - src-openeuler/tclx + - src-openeuler/teckit + - src-openeuler/tesla-polyglot + - src-openeuler/thx + - src-openeuler/tinyxml + - src-openeuler/tomcat-native + - src-openeuler/tslib + - src-openeuler/ttembed + - src-openeuler/ttfautohint + - src-openeuler/ubu-keyring + - src-openeuler/uniconvertor + - src-openeuler/uriparser + - src-openeuler/virt-top + - src-openeuler/wildfly-common + - src-openeuler/wildmidi + - src-openeuler/wxPython + - src-openeuler/xerces-c + - src-openeuler/xhtml2fo-style-xsl + - src-openeuler/xmlgraphics-commons + - src-openeuler/xmvn-connector-gradle + - src-openeuler/xmvn-tools + - src-openeuler/xorg-sgml-doctools + - src-openeuler/xorg-x11-docs + - src-openeuler/xorg-x11-drv-armsoc + - src-openeuler/zbar + - src-openeuler/zvbi + - src-openeuler/pysendfile + - src-openeuler/python-pycdlib + - src-openeuler/zeromq + - src-openeuler/zinc +- name: oVirt + repositories: + - src-openeuler/ioprocess + - src-openeuler/cockpit-ovirt + - src-openeuler/engine-db-query + - src-openeuler/go-ovirt-engine-sdk4 + - src-openeuler/imgbased + - src-openeuler/java-ovirt-engine-sdk4 + - src-openeuler/mingw-spice-vdagent + - src-openeuler/mom + - src-openeuler/nsis-simple-service-plugin + - src-openeuler/otopi + - src-openeuler/ovirt-ansible-cluster-upgrade + - src-openeuler/ovirt-ansible-disaster-recovery + - src-openeuler/ovirt-ansible-engine-setup + - src-openeuler/ovirt-ansible-hosted-engine-setup + - src-openeuler/ovirt-ansible-image-template + - src-openeuler/ovirt-ansible-infra + - src-openeuler/ovirt-ansible-manageiq + - src-openeuler/ovirt-ansible-repositories + - src-openeuler/ovirt-ansible-roles + - src-openeuler/ovirt-ansible-shutdown-env + - src-openeuler/ovirt-ansible-v2v-conversion-host + - src-openeuler/ovirt-ansible-vm-infra + - src-openeuler/ovirt-cockpit-sso + - src-openeuler/ovirt-engine + - src-openeuler/ovirt-engine-api-explorer + - src-openeuler/ovirt-engine-appliance + - src-openeuler/ovirt-engine-cli + - src-openeuler/ovirt-engine-dwh + - src-openeuler/ovirt-engine-extension-aaa-ldap + - src-openeuler/ovirt-engine-extension-aaa-misc + - src-openeuler/ovirt-engine-metrics + - src-openeuler/ovirt-engine-nodejs + - src-openeuler/ovirt-engine-nodejs-modules + - src-openeuler/ovirt-engine-ui-extensions + - src-openeuler/ovirt-engine-wildfly + - src-openeuler/ovirt-engine-wildfly-overlay + - src-openeuler/ovirt-engine-yarn + - src-openeuler/ovirt-guest-agent + - src-openeuler/ovirt-guest-agent-windows + - src-openeuler/ovirt-guest-tools-iso + - src-openeuler/ovirt-host + - src-openeuler/ovirt-host-deploy + - src-openeuler/ovirt-hosted-engine-ha + - src-openeuler/ovirt-hosted-engine-setup + - src-openeuler/ovirt-imageio-common + - src-openeuler/ovirt-imageio-daemon + - src-openeuler/ovirt-imageio-proxy + - src-openeuler/ovirt-iso-uploader + - src-openeuler/ovirt-lldp-labeler + - src-openeuler/ovirt-log-collector + - src-openeuler/ovirt-node-ng + - src-openeuler/ovirt-node-ng-image-update + - src-openeuler/ovirt-provider-ovn + - src-openeuler/ovirt-release43 + - src-openeuler/ovirt-scheduler-proxy + - src-openeuler/ovirt-setup-lib + - src-openeuler/ovirt-vmconsole + - src-openeuler/ovirt-web-ui + - src-openeuler/python-ovirt-engine-sdk4 + - src-openeuler/rubygem-ovirt-engine-sdk4 + - src-openeuler/v2v-conversion-host + - src-openeuler/vcredist + - src-openeuler/vdsm + - src-openeuler/vdsm-jsonrpc-java + - src-openeuler/java-client-kubevirt + - src-openeuler/ovirt-engine-extension-aaa-jdbc + - src-openeuler/ovirt-engine-extension-logger-log4j + - src-openeuler/ovirt-engine-extensions-api + - src-openeuler/ovirt-imageio + - src-openeuler/ovirt-jboss-modules-maven-plugin + - src-openeuler/safelease + - src-openeuler/ovirt-engine-api-model +- name: sig-REDF + repositories: + - openeuler/redf + - src-openeuler/redf +- name: Marketing + repositories: + - openeuler/marketing +- name: security-committee + repositories: + - openeuler/security-committee + - openeuler/security +- name: dev-utils + repositories: + - openeuler/abichecker + - openeuler/auto_py2to3 + - openeuler/nodejsporter + - openeuler/openEuler-bootstrap + - openeuler/openEuler-pkginfo + - openeuler/perlporter + - openeuler/pkgporter + - openeuler/pyporter + - openeuler/rubyporter + - openeuler/trucker + - src-openeuler/ansible + - src-openeuler/antlr + - src-openeuler/apache-commons-collections4 + - src-openeuler/apache-commons-digester + - src-openeuler/apache-commons-fileupload + - src-openeuler/apache-commons-jexl + - src-openeuler/apache-commons-math + - src-openeuler/apache-commons-pool2 + - src-openeuler/apache-log4j-extras + - src-openeuler/apache-poi + - src-openeuler/apache-sshd + - src-openeuler/apacheds-ldap-api + - src-openeuler/apiviz + - src-openeuler/aries-blueprint-api + - src-openeuler/aries-quiesce-api + - src-openeuler/aries-util + - src-openeuler/asymptote + - src-openeuler/atop + - src-openeuler/auto + - src-openeuler/automoc + - src-openeuler/bam + - src-openeuler/base64coder + - src-openeuler/bcc + - src-openeuler/bcel + - src-openeuler/bcftools + - src-openeuler/bcrypt + - src-openeuler/bea-stax + - src-openeuler/beust-jcommander + - src-openeuler/bouncycastle + - src-openeuler/bpftrace + - src-openeuler/bridge-method-injector + - src-openeuler/brpc + - src-openeuler/bsf + - src-openeuler/buildroot + - src-openeuler/caffeine + - src-openeuler/cal10n + - src-openeuler/castor-maven-plugin + - src-openeuler/catch1 + - src-openeuler/cglib + - src-openeuler/ck + - src-openeuler/cloc + - src-openeuler/colm + - src-openeuler/colordiff + - src-openeuler/concurrent-trees + - src-openeuler/coro-mock + - src-openeuler/cpp-httplib + - src-openeuler/cpuid + - src-openeuler/cryptacular + - src-openeuler/csmith + - src-openeuler/ct-ng + - src-openeuler/curator + - src-openeuler/curvesapi + - src-openeuler/dbus-cpp + - src-openeuler/dbusmenu-qt + - src-openeuler/delve + - src-openeuler/dleyna-connector-dbus + - src-openeuler/dleyna-core + - src-openeuler/ecj + - src-openeuler/emma + - src-openeuler/enca + - src-openeuler/extra-cmake-modules + - src-openeuler/f2fs-tools + - src-openeuler/fcgi + - src-openeuler/figlet + - src-openeuler/fping + - src-openeuler/freeimage + - src-openeuler/freemarker + - src-openeuler/GAPP + - src-openeuler/geronimo-ejb + - src-openeuler/geronimo-jaspic-spec + - src-openeuler/geronimo-jcache + - src-openeuler/geronimo-jcdi-1.0-api + - src-openeuler/geronimo-jpa + - src-openeuler/geronimo-osgi-support + - src-openeuler/git-lfs + - src-openeuler/git-tools + - src-openeuler/glassfish-dtd-parser + - src-openeuler/glassfish-jaxb + - src-openeuler/glassfish-jsp + - src-openeuler/grizzly + - src-openeuler/gtkmm24 + - src-openeuler/hamcrest + - src-openeuler/hardinfo + - src-openeuler/hawtdispatch + - src-openeuler/hello + - src-openeuler/hping + - src-openeuler/htop + - src-openeuler/htslib + - src-openeuler/http_load + - src-openeuler/httpcomponents-project + - src-openeuler/iftop + - src-openeuler/iniparser + - src-openeuler/iozone + - src-openeuler/ipwatchd + - src-openeuler/jakarta-oro + - src-openeuler/java_cup + - src-openeuler/javaparser + - src-openeuler/jBCrypt + - src-openeuler/jboss-annotations-1.2-api + - src-openeuler/jboss-connector-1.6-api + - src-openeuler/jboss-jaxrs-2.0-api + - src-openeuler/jboss-jsf-2.1-api + - src-openeuler/jboss-jsp-2.3-api + - src-openeuler/jboss-jstl-1.2-api + - src-openeuler/jboss-servlet-3.1-api + - src-openeuler/jboss-stdio + - src-openeuler/jboss-websocket-1.0-api + - src-openeuler/jetbrains-annotations + - src-openeuler/jettison + - src-openeuler/jetty-parent + - src-openeuler/jexcelapi + - src-openeuler/jffi + - src-openeuler/jnr-constants + - src-openeuler/jnr-enxio + - src-openeuler/jnr-ffi + - src-openeuler/jnr-netdb + - src-openeuler/jnr-posix + - src-openeuler/jnr-unixsocket + - src-openeuler/joda-convert + - src-openeuler/joni + - src-openeuler/jopt-simple + - src-openeuler/jredis + - src-openeuler/js-excanvas + - src-openeuler/junit + - src-openeuler/junit5 + - src-openeuler/kelbt + - src-openeuler/kf5 + - src-openeuler/kscreenlocker + - src-openeuler/ldapjdk + - src-openeuler/libecb + - src-openeuler/libgpod + - src-openeuler/libgssglue + - src-openeuler/libhandy + - src-openeuler/libkeepalive + - src-openeuler/librpcsecgss + - src-openeuler/libwpe + - src-openeuler/libyubikey + - src-openeuler/lmbench + - src-openeuler/log4cplus + - src-openeuler/log4cpp + - src-openeuler/maven-osgi + - src-openeuler/memleax + - src-openeuler/memtester + - src-openeuler/miniasm + - src-openeuler/minimap2 + - src-openeuler/mocha + - src-openeuler/mock + - src-openeuler/morphia + - src-openeuler/multitail + - src-openeuler/mysql-connector-java + - src-openeuler/ncdu + - src-openeuler/nethogs + - src-openeuler/netperf + - src-openeuler/neXtaw + - src-openeuler/nmon + - src-openeuler/openEuler-pkginfo + - src-openeuler/options + - src-openeuler/p7zip + - src-openeuler/parfait + - src-openeuler/PEGTL + - src-openeuler/portals-pom + - src-openeuler/portlet-2.0-api + - src-openeuler/pyporter + - src-openeuler/pyusb + - src-openeuler/R-knitr + - src-openeuler/ragel + - src-openeuler/ranger + - src-openeuler/relaxngcc + - src-openeuler/relaxngDatatype + - src-openeuler/rpm-ostree + - src-openeuler/s-tui + - src-openeuler/samtools + - src-openeuler/saxon + - src-openeuler/slurm + - src-openeuler/sqlite-jdbc + - src-openeuler/stax-ex + - src-openeuler/stress-ng + - src-openeuler/stringtemplate + - src-openeuler/sysbench + - src-openeuler/sysget + - src-openeuler/systemd-bootchart + - src-openeuler/the_silver_searcher + - src-openeuler/tig + - src-openeuler/tito + - src-openeuler/unixbench + - src-openeuler/uom-se + - src-openeuler/webbench + - src-openeuler/woodstox-core + - src-openeuler/wpebackend-fdo + - src-openeuler/ws-commons-util + - src-openeuler/xom + - src-openeuler/ykpers +- name: sig-mate-desktop + repositories: + - openeuler/mate-desktop + - src-openeuler/caja + - src-openeuler/caja-extensions + - src-openeuler/cjkuni-uming-fonts + - src-openeuler/eom + - src-openeuler/fcitx-configtool + - src-openeuler/gajim + - src-openeuler/gcolor2 + - src-openeuler/glade3 + - src-openeuler/gparted + - src-openeuler/gtk-layer-shell + - src-openeuler/gtk-murrine-engine + - src-openeuler/gtk2-engines + - src-openeuler/gtksourceview4 + - src-openeuler/gucharmap + - src-openeuler/im-chooser + - src-openeuler/libXpresent + - src-openeuler/libmatekbd + - src-openeuler/libmatemixer + - src-openeuler/libmateweather + - src-openeuler/libwnck + - src-openeuler/marco + - src-openeuler/mate-applets + - src-openeuler/mate-backgrounds + - src-openeuler/mate-calc + - src-openeuler/mate-common + - src-openeuler/mate-control-center + - src-openeuler/mate-desktop + - src-openeuler/mate-icon-theme + - src-openeuler/mate-media + - src-openeuler/mate-menus + - src-openeuler/mate-notification-daemon + - src-openeuler/mate-panel + - src-openeuler/mate-polkit + - src-openeuler/mate-power-manager + - src-openeuler/mate-screensaver + - src-openeuler/mate-session-manager + - src-openeuler/mate-settings-daemon + - src-openeuler/mate-system-monitor + - src-openeuler/mate-terminal + - src-openeuler/mate-themes + - src-openeuler/mate-user-guide + - src-openeuler/mate-utils + - src-openeuler/open-chinese-fonts + - src-openeuler/pangox-compat + - src-openeuler/perl-ExtUtils-Depends + - src-openeuler/perl-ExtUtils-PkgConfig + - src-openeuler/perl-Glib + - src-openeuler/python-cssutils + - src-openeuler/python-nbxmpp + - src-openeuler/python-precis_i18n + - src-openeuler/re2c + - src-openeuler/system-config-users + - src-openeuler/system-config-users-docs + - src-openeuler/unique3 + - src-openeuler/wireless-tools +- name: sig-bounds_checking_function + repositories: + - openeuler/bounds_checking_function + - src-openeuler/bounds_checking_function +- name: sig-UKUI + repositories: + - src-openeuler/qt5-ukui-platformtheme + - src-openeuler/peony + - src-openeuler/ukui-control-center + - src-openeuler/ukui-sidebar + - src-openeuler/ukui-panel + - src-openeuler/ukui-window-switch + - src-openeuler/ukui-power-manager + - src-openeuler/ukui-screensaver + - src-openeuler/ukui-media + - src-openeuler/ukui-menu + - src-openeuler/ukui-session-manager + - src-openeuler/ukui-settings-daemon + - src-openeuler/kylin-nm + - src-openeuler/ukui-themes + - src-openeuler/ukui-biometric-manager + - src-openeuler/ukui-biometric-auth + - src-openeuler/peony-extensions + - src-openeuler/ukui-greeter + - src-openeuler/ukylin-feedback-client + - src-openeuler/ukwm + - src-openeuler/ukui-interface + - src-openeuler/ukui-screenshot + - src-openeuler/ukui-indicators + - src-openeuler/ukui-desktop-environment + - src-openeuler/biometric-authentication + - src-openeuler/attica + - src-openeuler/bamf + - src-openeuler/grantlee + - src-openeuler/gsettings-qt + - src-openeuler/kf5-karchive + - src-openeuler/kf5-kauth + - src-openeuler/kf5-kcodecs + - src-openeuler/kf5-kconfig + - src-openeuler/kf5-kconfigwidgets + - src-openeuler/kf5-kcoreaddons + - src-openeuler/kf5-kdoctools + - src-openeuler/kf5-kguiaddons + - src-openeuler/kf5-ki18n + - src-openeuler/kf5-kidletime + - src-openeuler/kf5-kwayland + - src-openeuler/kf5-kwidgetsaddons + - src-openeuler/kf5-kwindowsystem + - src-openeuler/kf5-solid + - src-openeuler/libkscreen-qt5 + - src-openeuler/libqtxdg + - src-openeuler/libstatgrab + - src-openeuler/libsysstat + - src-openeuler/libupnp + - src-openeuler/lxqt-build-tools + - src-openeuler/polkit-qt-1 + - src-openeuler/qjson + - src-openeuler/qt5-qtcharts + - src-openeuler/qtchooser + - src-openeuler/redshift + - src-openeuler/shared-desktop-ontologies + - src-openeuler/ubuntukylin-default-settings + - src-openeuler/ukui-system-monitor + - src-openeuler/ukui-wallpapers + - src-openeuler/libchamplain + - src-openeuler/atril + - src-openeuler/mathjax + - src-openeuler/shotwell + - src-openeuler/engrampa +- name: sig-recycle + repositories: + - src-openeuler/cmockery + - src-openeuler/jasper + - src-openeuler/liberation-sans-fonts + - src-openeuler/libibmad + - src-openeuler/python2 + - src-openeuler/caffe + - src-openeuler/shim-unsigned-aarch64 + - src-openeuler/subscription-manager + - src-openeuler/redhat-menus + - src-openeuler/golang-github-cpuguy83-go-md2man + - src-openeuler/golang-github-fsnotify-fsnotify + - src-openeuler/golang-github-go-tomb-tomb + - src-openeuler/golang-github-hpcloud-tail + - src-openeuler/golang-github-onsi-ginkgo + - src-openeuler/golang-github-onsi-gomega + - src-openeuler/golang-googlecode-go-crypto + - src-openeuler/golang-googlecode-net + - src-openeuler/golang-googlecode-text + - src-openeuler/golang-googlecode-tools + - src-openeuler/golang-gopkg-yaml + - src-openeuler/golang-googlecode-goprotobuf + - src-openeuler/golang-github-vishvananda-netns + - src-openeuler/golang-github-golang-sys + - src-openeuler/golang-github-vishvananda-netlink + - src-openeuler/golang-github-d2g-dhcp4 + - src-openeuler/golang-github-coreos-go-iptables + - src-openeuler/golang-github-russross-blackfriday + - src-openeuler/yum-metadata-parser + - src-openeuler/hardlink + - src-openeuler/langpacks + - src-openeuler/hesiod + - src-openeuler/libmodman + - src-openeuler/tpm2-abrmd-selinux + - src-openeuler/oci-systemd-hook + - src-openeuler/openvswitch-kmod + - src-openeuler/docker-anaconda-addon +- name: sig-RaspberryPi + repositories: + - openeuler/raspberrypi + - openeuler/raspberrypi-kernel + - src-openeuler/raspberrypi-kernel + - src-openeuler/raspberrypi-firmware + - src-openeuler/raspberrypi-build + - src-openeuler/raspberrypi-bluetooth + - openeuler/raspberrypi-build +- name: sig-Ha + repositories: + - src-openeuler/pacemaker + - src-openeuler/corosync + - src-openeuler/pcs + - openeuler/pacemaker-mgmt + - openeuler/ha-api + - openeuler/ha-web + - src-openeuler/pacemaker-mgmt + - src-openeuler/ha-api + - src-openeuler/ha-web + - src-openeuler/fence-agents + - src-openeuler/fence-virt + - src-openeuler/sbd + - src-openeuler/corosync-qdevice + - src-openeuler/drbd + - src-openeuler/drbd-utils +- name: sig-QA + repositories: + - openeuler/QA + - openeuler/avocado + - openeuler/avocado-vt + - openeuler/tp-libvirt + - openeuler/tp-qemu + - openeuler/EulerRobot + - openeuler/integration-test + - openeuler/container-test + - openeuler/compiler-test + - openeuler/package-reinforce-test + - openeuler/test-tools +- name: sig-KIRAN-DESKTOP + repositories: + - src-openeuler/kiran-avatar-editor + - src-openeuler/kiran-gtk-theme + - src-openeuler/kiran-icon-theme + - src-openeuler/kiran-menu + - src-openeuler/kiran-screensaver-dialog + - src-openeuler/kiran-themes + - src-openeuler/kiran-wallpapers + - src-openeuler/lightdm-kiran-greeter + - src-openeuler/plymouth-theme-kiran +- name: sig-ROS + repositories: + - openeuler/ros + - src-openeuler/catkin + - src-openeuler/class_loader + - src-openeuler/cmake_modules + - src-openeuler/gencpp + - src-openeuler/geneus + - src-openeuler/genlisp + - src-openeuler/genpy + - src-openeuler/gennodejs + - src-openeuler/genmsg + - src-openeuler/std_msgs + - src-openeuler/message_generation + - src-openeuler/ros_environment + - src-openeuler/message_runtime + - src-openeuler/roscpp_core + - src-openeuler/ros + - src-openeuler/rosconsole + - src-openeuler/roslisp + - src-openeuler/rospack + - src-openeuler/ros_comm_msgs + - src-openeuler/pluginlib + - src-openeuler/ros_comm +- name: sig-ai-bigdata + repositories: + - src-openeuler/arm-ml-examples + - src-openeuler/armnn + - src-openeuler/bazel + - src-openeuler/blaze + - src-openeuler/ComputeLibrary + - src-openeuler/dlib + - src-openeuler/eigen + - src-openeuler/eli5 + - src-openeuler/ensmallen + - src-openeuler/epstool + - src-openeuler/flink + - src-openeuler/ftgl + - src-openeuler/gl2ps + - src-openeuler/glpk + - src-openeuler/hadoop + - src-openeuler/hbase + - src-openeuler/hive + - src-openeuler/ibis + - src-openeuler/incubator-mxnet + - src-openeuler/jupyter + - src-openeuler/kafka + - src-openeuler/libhdfs + - src-openeuler/libiodbc + - src-openeuler/libmetal + - src-openeuler/libsvm + - src-openeuler/libxsmm + - src-openeuler/lightgbm + - src-openeuler/lzip + - src-openeuler/mlpack + - src-openeuler/octave + - src-openeuler/oneDNN + - src-openeuler/opencl + - src-openeuler/opencl-filesystem + - src-openeuler/opencl-headers + - src-openeuler/opencv + - src-openeuler/opennn + - src-openeuler/presto + - src-openeuler/pytorch + - src-openeuler/qrupdate + - src-openeuler/qscintilla + - src-openeuler/rain + - src-openeuler/Shark + - src-openeuler/spark + - src-openeuler/sundials + - src-openeuler/SuperLUMT + - src-openeuler/tensorflow + - src-openeuler/zeppelin + - src-openeuler/zookeeper +- name: sig-golang + repositories: + - src-openeuler/golang +- name: sig-EasyLife + repositories: + - openeuler/openEuler-Advisor + - src-openeuler/pkgship + - src-openeuler/abi-compliance-checker + - src-openeuler/abi-dumper + - src-openeuler/patch-tracking +- name: sig-ceph + repositories: + - src-openeuler/ceph + - src-openeuler/ceph-deploy + - src-openeuler/ceph-ansible +- name: sig-security-facility + repositories: + - openeuler/security-tool + - openeuler/attest-tools + - openeuler/digest-list-tools + - src-openeuler/mysql-selinux + - src-openeuler/pesign-obs-integration + - src-openeuler/tss2 + - src-openeuler/oscap-anaconda-addon + - src-openeuler/certmonger + - src-openeuler/keycloak-httpd-client-install + - src-openeuler/mod_auth_openidc + - src-openeuler/mod_authnz_pam + - src-openeuler/attest-tools + - src-openeuler/digest-list-tools + - src-openeuler/apparmor + - src-openeuler/cryptopp + - src-openeuler/tpm2-tools + - src-openeuler/setroubleshoot + - src-openeuler/openssl + - src-openeuler/tpm2-abrmd + - src-openeuler/libselinux + - src-openeuler/libsepol + - src-openeuler/keyutils + - src-openeuler/mcstrans + - src-openeuler/selinux-policy + - src-openeuler/crypto-policies + - src-openeuler/checkpolicy + - src-openeuler/libcap + - src-openeuler/gnupg2 + - src-openeuler/cracklib + - src-openeuler/policycoreutils + - src-openeuler/pyOpenSSL + - src-openeuler/libsemanage + - src-openeuler/openssl-pkcs11 + - src-openeuler/gnutls + - src-openeuler/mokutil + - src-openeuler/pam + - src-openeuler/libpwquality + - src-openeuler/softhsm + - src-openeuler/nss + - src-openeuler/security-tool + - src-openeuler/tpm2-tss + - src-openeuler/audit + - src-openeuler/nss-pem + - src-openeuler/swtpm + - src-openeuler/libtpms +- name: sig-Compatibility-Infra + repositories: + - openeuler/oec-hardware + - openeuler/oec-application + - src-openeuler/oec-hardware + - src-openeuler/oec-application +- name: sig-cms + repositories: + - src-openeuler/doracms +- name: sig-RISC-V + repositories: + - openeuler/RISC-V + - src-openeuler/risc-v-kernel + - src-openeuler/opensbi +- name: sig-android-middleware + repositories: + - openeuler/android-emulator + - openeuler/anbox + - src-openeuler/platform_hardware_libhardware_legacy + - src-openeuler/platform_hardware_ril + - src-openeuler/platform_frameworks_base + - src-openeuler/platform_frameworks_native + - src-openeuler/platform_frameworks_opt_net_wifi + - src-openeuler/platform_system_core + - src-openeuler/platform_packages_apps_DeskClock + - src-openeuler/platform_packages_apps_PackageInstaller + - src-openeuler/platform_build + - src-openeuler/platform_manifests +- name: sig-perl-modules + repositories: + - src-openeuler/biber + - src-openeuler/inst-source-utils + - src-openeuler/latexmk + - src-openeuler/perl-accessors + - src-openeuler/perl-Acme-Damn + - src-openeuler/perl-Algorithm-Combinatorics + - src-openeuler/perl-Algorithm-Dependency + - src-openeuler/perl-Algorithm-Diff + - src-openeuler/perl-Algorithm-Diff-XS + - src-openeuler/perl-Algorithm-Loops + - src-openeuler/perl-Algorithm-LUHN + - src-openeuler/perl-Algorithm-NaiveBayes + - src-openeuler/perl-aliased + - src-openeuler/perl-Alien-Build + - src-openeuler/perl-Alien-Libxml2 + - src-openeuler/perl-Alien-Packages + - src-openeuler/perl-Any-Moose + - src-openeuler/perl-Any-URI-Escape + - src-openeuler/perl-AnyEvent + - src-openeuler/perl-Apache-LogFormat-Compiler + - src-openeuler/perl-Apache-Session + - src-openeuler/perl-Apache-Session-Wrapper + - src-openeuler/perl-App-Cmd + - src-openeuler/perl-App-FatPacker + - src-openeuler/perl-AppConfig + - src-openeuler/perl-Archive-Any-Lite + - src-openeuler/perl-Archive-Tar + - src-openeuler/perl-autobox + - src-openeuler/perl-autobox-Core + - src-openeuler/perl-autodie + - src-openeuler/perl-B-Compiling + - src-openeuler/perl-B-COW + - src-openeuler/perl-B-Debug + - src-openeuler/perl-B-Hooks-EndOfScope + - src-openeuler/perl-B-Hooks-OP-Annotation + - src-openeuler/perl-B-Hooks-OP-Check + - src-openeuler/perl-B-Hooks-OP-PPAddr + - src-openeuler/perl-B-Hooks-Parser + - src-openeuler/perl-B-Keywords + - src-openeuler/perl-B-Utils + - src-openeuler/perl-bareword-filehandles + - src-openeuler/perl-Biblio-EndnoteStyle + - src-openeuler/perl-BibTeX-Parser + - src-openeuler/perl-bignum + - src-openeuler/perl-Browser-Open + - src-openeuler/perl-Business-CreditCard + - src-openeuler/perl-Business-Hours + - src-openeuler/perl-Business-ISMN + - src-openeuler/perl-Business-ISSN + - src-openeuler/perl-Business-Stripe + - src-openeuler/perl-Cache-Cache + - src-openeuler/perl-Cache-FastMmap + - src-openeuler/perl-Cache-LRU + - src-openeuler/perl-Cache-Memcached + - src-openeuler/perl-CAD-Format-STL + - src-openeuler/perl-Carp + - src-openeuler/perl-Carp-Assert + - src-openeuler/perl-Carp-Assert-More + - src-openeuler/perl-Carp-Fix-1_25 + - src-openeuler/perl-Carton + - src-openeuler/perl-Catalyst-Manual + - src-openeuler/perl-Catalyst-Plugin-CustomErrorMessage + - src-openeuler/perl-CBOR-XS + - src-openeuler/perl-CDDB + - src-openeuler/perl-CGI-Ajax + - src-openeuler/perl-CGI-Application + - src-openeuler/perl-CGI-Application-Plugin-ConfigAuto + - src-openeuler/perl-CGI-Application-Plugin-DBH + - src-openeuler/perl-CGI-Application-Plugin-DBIC-Schema + - src-openeuler/perl-CGI-Application-Plugin-DevPopup + - src-openeuler/perl-CGI-Application-Plugin-ErrorPage + - src-openeuler/perl-CGI-Application-Plugin-FillInForm + - src-openeuler/perl-CGI-Application-Plugin-FormState + - src-openeuler/perl-CGI-Application-Plugin-JSON + - src-openeuler/perl-CGI-Application-Plugin-LinkIntegrity + - src-openeuler/perl-CGI-Application-Plugin-MessageStack + - src-openeuler/perl-CGI-Application-Plugin-Redirect + - src-openeuler/perl-CGI-Application-Plugin-Session + - src-openeuler/perl-CGI-Application-Plugin-Stream + - src-openeuler/perl-CGI-Application-Plugin-TT + - src-openeuler/perl-CGI-Application-PSGI + - src-openeuler/perl-CGI-Application-Standard-Config + - src-openeuler/perl-CGI-Deurl-XS + - src-openeuler/perl-CGI-Emulate-PSGI + - src-openeuler/perl-CGI-Ex + - src-openeuler/perl-CGI-Fast + - src-openeuler/perl-CGI-FormBuilder + - src-openeuler/perl-CGI-Prototype + - src-openeuler/perl-CGI-PSGI + - src-openeuler/perl-CGI-Session + - src-openeuler/perl-CGI-Session-Driver-memcached + - src-openeuler/perl-CGI-Simple + - src-openeuler/perl-CGI-Struct + - src-openeuler/perl-Chatbot-Eliza + - src-openeuler/perl-Check-ISA + - src-openeuler/perl-Child + - src-openeuler/perl-ClamAV-Client + - src-openeuler/perl-CLASS + - src-openeuler/perl-Class-Accessor + - src-openeuler/perl-Class-Accessor-Chained + - src-openeuler/perl-Class-Accessor-Classy + - src-openeuler/perl-Class-Accessor-Grouped + - src-openeuler/perl-Class-Accessor-Lite + - src-openeuler/perl-Class-Adapter + - src-openeuler/perl-Class-Autouse + - src-openeuler/perl-Class-Base + - src-openeuler/perl-Class-C3 + - src-openeuler/perl-Class-C3-Adopt-NEXT + - src-openeuler/perl-Class-C3-Componentised + - src-openeuler/perl-Class-C3-XS + - src-openeuler/perl-Class-Can + - src-openeuler/perl-Class-Container + - src-openeuler/perl-Class-Data-Accessor + - src-openeuler/perl-Class-Date + - src-openeuler/perl-Class-ErrorHandler + - src-openeuler/perl-Class-Factory-Util + - src-openeuler/perl-Class-Field + - src-openeuler/perl-Class-ISA + - src-openeuler/perl-Class-Load + - src-openeuler/perl-Class-Load-XS + - src-openeuler/perl-Class-MethodMaker + - src-openeuler/perl-Class-Prototyped + - src-openeuler/perl-Class-Refresh + - src-openeuler/perl-Class-ReturnValue + - src-openeuler/perl-Class-Std + - src-openeuler/perl-Class-Std-Fast + - src-openeuler/perl-Class-Throwable + - src-openeuler/perl-Class-Tiny + - src-openeuler/perl-Class-Trigger + - src-openeuler/perl-Class-Unload + - src-openeuler/perl-Class-Utils + - src-openeuler/perl-Class-Virtual + - src-openeuler/perl-Clipboard + - src-openeuler/perl-Clone + - src-openeuler/perl-Clone-Choose + - src-openeuler/perl-Clone-PP + - src-openeuler/perl-Color-Library + - src-openeuler/perl-Command-Runner + - src-openeuler/perl-Commandable + - src-openeuler/perl-Compress-LZ4 + - src-openeuler/perl-Compress-LZF + - src-openeuler/perl-Compress-Raw-Bzip2 + - src-openeuler/perl-Compress-Raw-Zlib + - src-openeuler/perl-Compress-Snappy + - src-openeuler/perl-Config-Any + - src-openeuler/perl-Config-Auto + - src-openeuler/perl-Config-Extend-MySQL + - src-openeuler/perl-Config-GitLike + - src-openeuler/perl-Config-Grammar + - src-openeuler/perl-Config-INI + - src-openeuler/perl-Config-INI-Reader-Multiline + - src-openeuler/perl-Config-INI-Reader-Ordered + - src-openeuler/perl-Config-Perl-V + - src-openeuler/perl-Config-Properties + - src-openeuler/perl-Config-Std + - src-openeuler/perl-Config-Tiny + - src-openeuler/perl-Config-ZOMG + - src-openeuler/perl-Const-Fast + - src-openeuler/perl-constant + - src-openeuler/perl-constant-boolean + - src-openeuler/perl-constant-defer + - src-openeuler/perl-constant-tiny + - src-openeuler/perl-Context-Preserve + - src-openeuler/perl-Contextual-Return + - src-openeuler/perl-Convert-ASN1 + - src-openeuler/perl-Convert-Base32 + - src-openeuler/perl-Convert-Base64 + - src-openeuler/perl-Convert-Bencode + - src-openeuler/perl-Convert-BER + - src-openeuler/perl-Convert-Binary-C + - src-openeuler/perl-Convert-BinHex + - src-openeuler/perl-Convert-Color + - src-openeuler/perl-Convert-Color-XTerm + - src-openeuler/perl-Convert-NLS_DATE_FORMAT + - src-openeuler/perl-Convert-TNEF + - src-openeuler/perl-Convert-UU + - src-openeuler/perl-Cookie-Baker + - src-openeuler/perl-CPAN-Common-Index + - src-openeuler/perl-CPAN-DistnameInfo + - src-openeuler/perl-CPAN-Meta + - src-openeuler/perl-CPAN-Meta-Check + - src-openeuler/perl-CPAN-Meta-Requirements + - src-openeuler/perl-CPAN-Meta-YAML + - src-openeuler/perl-Cpanel-JSON-XS + - src-openeuler/perl-Crypt-Blowfish + - src-openeuler/perl-Crypt-ECB + - src-openeuler/perl-Crypt-GeneratePassword + - src-openeuler/perl-Crypt-GPG + - src-openeuler/perl-Crypt-IDEA + - src-openeuler/perl-Crypt-OpenSSL-DSA + - src-openeuler/perl-Crypt-OpenSSL-EC + - src-openeuler/perl-Crypt-OpenSSL-PKCS10 + - src-openeuler/perl-Crypt-OpenSSL-X509 + - src-openeuler/perl-Crypt-RandPasswd + - src-openeuler/perl-Crypt-Rijndael + - src-openeuler/perl-Crypt-Salsa20 + - src-openeuler/perl-Crypt-SaltedHash + - src-openeuler/perl-Crypt-ScryptKDF + - src-openeuler/perl-Crypt-UnixCrypt_XS + - src-openeuler/perl-Crypt-URandom + - src-openeuler/perl-Crypt-X509 + - src-openeuler/perl-CSS-DOM + - src-openeuler/perl-CSS-Minifier-XS + - src-openeuler/perl-CSS-Squish + - src-openeuler/perl-CSS-Tiny + - src-openeuler/perl-curry + - src-openeuler/perl-Cwd-Guard + - src-openeuler/perl-Cwd-utf8 + - src-openeuler/perl-Daemon-Control + - src-openeuler/perl-Data-AsObject + - src-openeuler/perl-Data-Binary + - src-openeuler/perl-Data-Compare + - src-openeuler/perl-Data-Dmp + - src-openeuler/perl-Data-Dump-Streamer + - src-openeuler/perl-Data-Dumper + - src-openeuler/perl-Data-Dumper-Concise + - src-openeuler/perl-Data-Dumper-Names + - src-openeuler/perl-Data-Munge + - src-openeuler/perl-Data-Page + - src-openeuler/perl-Data-Perl + - src-openeuler/perl-Data-Section-Simple + - src-openeuler/perl-Data-Stream-Bulk + - src-openeuler/perl-Data-TreeDumper + - src-openeuler/perl-Data-Tumbler + - src-openeuler/perl-Data-Validate-Type + - src-openeuler/perl-Database-DumpTruck + - src-openeuler/perl-Date-Calc-XS + - src-openeuler/perl-Date-Easter + - src-openeuler/perl-Date-Holidays-DE + - src-openeuler/perl-Date-ISO8601 + - src-openeuler/perl-Date-JD + - src-openeuler/perl-Date-Leapyear + - src-openeuler/perl-Date-Simple + - src-openeuler/perl-Date-Tiny + - src-openeuler/perl-DB_File + - src-openeuler/perl-DBD-Mock + - src-openeuler/perl-DBD-Pg + - src-openeuler/perl-DBD-SQLite2 + - src-openeuler/perl-DBD-XBase + - src-openeuler/perl-DBI + - src-openeuler/perl-DBICx-AutoDoc + - src-openeuler/perl-DBIx-Class + - src-openeuler/perl-DBIx-Class-Candy + - src-openeuler/perl-DBIx-Class-Cursor-Cached + - src-openeuler/perl-DBIx-Class-IntrospectableM2M + - src-openeuler/perl-DBIx-Class-OptimisticLocking + - src-openeuler/perl-DBIx-Class-Schema-Config + - src-openeuler/perl-DBIx-Connector + - src-openeuler/perl-DBIx-DBSchema + - src-openeuler/perl-DBIx-Introspector + - src-openeuler/perl-DBIx-RunSQL + - src-openeuler/perl-DBIx-Simple + - src-openeuler/perl-DBIx-XHTML_Table + - src-openeuler/perl-DBM-Deep + - src-openeuler/perl-Debug-ShowStuff + - src-openeuler/perl-Declare-Constraints-Simple + - src-openeuler/perl-Devel-Autoflush + - src-openeuler/perl-Devel-Caller + - src-openeuler/perl-Devel-Caller-IgnoreNamespaces + - src-openeuler/perl-Devel-CheckBin + - src-openeuler/perl-Devel-CheckCompiler + - src-openeuler/perl-Devel-CheckOS + - src-openeuler/perl-Devel-Confess + - src-openeuler/perl-Devel-Cycle + - src-openeuler/perl-Devel-Dumpvar + - src-openeuler/perl-Devel-EnforceEncapsulation + - src-openeuler/perl-Devel-FindPerl + - src-openeuler/perl-Devel-Gladiator + - src-openeuler/perl-Devel-GoFaster + - src-openeuler/perl-Devel-Hexdump + - src-openeuler/perl-Devel-LexAlias + - src-openeuler/perl-Devel-MAT-Dumper + - src-openeuler/perl-Devel-OverloadInfo + - src-openeuler/perl-Devel-OverrideGlobalRequire + - src-openeuler/perl-Devel-PartialDump + - src-openeuler/perl-Devel-PPPort + - src-openeuler/perl-Devel-Pragma + - src-openeuler/perl-Devel-Refcount + - src-openeuler/perl-Devel-SelfStubber + - src-openeuler/perl-Devel-SimpleTrace + - src-openeuler/perl-Devel-StackTrace-AsHTML + - src-openeuler/perl-Devel-StackTrace-WithLexicals + - src-openeuler/perl-Devel-StringInfo + - src-openeuler/perl-Devel-Timer + - src-openeuler/perl-Devel-Trace + - src-openeuler/perl-Diff-LibXDiff + - src-openeuler/perl-Digest-BubbleBabble + - src-openeuler/perl-Digest-JHash + - src-openeuler/perl-Digest-MD2 + - src-openeuler/perl-Digest-MD4 + - src-openeuler/perl-Digest-MD5 + - src-openeuler/perl-Digest-MD5-File + - src-openeuler/perl-Digest-Nilsimsa + - src-openeuler/perl-Digest-Perl-MD5 + - src-openeuler/perl-Digest-SHA + - src-openeuler/perl-Dir-Manifest + - src-openeuler/perl-Dir-Self + - src-openeuler/perl-Directory-Scratch + - src-openeuler/perl-Dist-Metadata + - src-openeuler/perl-EBook-EPUB + - src-openeuler/perl-ElasticSearch-SearchBuilder + - src-openeuler/perl-Email-Abstract + - src-openeuler/perl-Email-Address + - src-openeuler/perl-Email-Address-List + - src-openeuler/perl-Email-Address-XS + - src-openeuler/perl-Email-Date + - src-openeuler/perl-Email-MessageID + - src-openeuler/perl-Email-MIME + - src-openeuler/perl-Email-MIME-Attachment-Stripper + - src-openeuler/perl-Email-MIME-ContentType + - src-openeuler/perl-Email-MIME-Encodings + - src-openeuler/perl-Email-Reply + - src-openeuler/perl-Email-Send + - src-openeuler/perl-Email-Sender + - src-openeuler/perl-Email-Simple + - src-openeuler/perl-Encode + - src-openeuler/perl-Encode-IMAPUTF7 + - src-openeuler/perl-Encode-Locale + - src-openeuler/perl-Encode-Newlines + - src-openeuler/perl-End + - src-openeuler/perl-enum + - src-openeuler/perl-Env + - src-openeuler/perl-Env-C + - src-openeuler/perl-Env-Path + - src-openeuler/perl-Env-Sanctify + - src-openeuler/perl-Error + - src-openeuler/perl-Error-Pure + - src-openeuler/perl-Error-Pure-Output-Text + - src-openeuler/perl-Eval-Closure + - src-openeuler/perl-Eval-LineNumbers + - src-openeuler/perl-Eval-WithLexicals + - src-openeuler/perl-Event + - src-openeuler/perl-Excel-Writer-XLSX + - src-openeuler/perl-Exception-Base + - src-openeuler/perl-Exception-Class + - src-openeuler/perl-Exception-Class-TryCatch + - src-openeuler/perl-Exception-Tiny + - src-openeuler/perl-Expect-Simple + - src-openeuler/perl-experimental + - src-openeuler/perl-Export-Attrs + - src-openeuler/perl-Exporter + - src-openeuler/perl-Exporter-Declare + - src-openeuler/perl-Exporter-Declare-Magic + - src-openeuler/perl-Exporter-Easy + - src-openeuler/perl-Exporter-Lite + - src-openeuler/perl-Exporter-Tiny + - src-openeuler/perl-ExtUtils-AutoInstall + - src-openeuler/perl-ExtUtils-CChecker + - src-openeuler/perl-ExtUtils-HasCompiler + - src-openeuler/perl-ExtUtils-InferConfig + - src-openeuler/perl-ExtUtils-Install + - src-openeuler/perl-ExtUtils-LibBuilder + - src-openeuler/perl-ExtUtils-Manifest + - src-openeuler/perl-ExtUtils-ParseXS + - src-openeuler/perl-ExtUtils-TBone + - src-openeuler/perl-ExtUtils-Typemap + - src-openeuler/perl-ExtUtils-Typemaps-Default + - src-openeuler/perl-failures + - src-openeuler/perl-FCGI + - src-openeuler/perl-FCGI-ProcManager + - src-openeuler/perl-Fennec-Lite + - src-openeuler/perl-FFI-CheckLib + - src-openeuler/perl-File-BOM + - src-openeuler/perl-File-chdir + - src-openeuler/perl-File-CheckTree + - src-openeuler/perl-File-chmod + - src-openeuler/perl-File-ConfigDir + - src-openeuler/perl-File-Copy-Recursive-Reduced + - src-openeuler/perl-File-FcntlLock + - src-openeuler/perl-File-Fetch + - src-openeuler/perl-File-Find-Object + - src-openeuler/perl-File-Find-Object-Rule + - src-openeuler/perl-File-Find-Rule + - src-openeuler/perl-File-Find-Rule-Perl + - src-openeuler/perl-File-Find-Rule-PPI + - src-openeuler/perl-File-Find-Rule-VCS + - src-openeuler/perl-File-Find-utf8 + - src-openeuler/perl-File-FindLib + - src-openeuler/perl-File-Flat + - src-openeuler/perl-File-HomeDir + - src-openeuler/perl-File-KeePass + - src-openeuler/perl-File-LoadLines + - src-openeuler/perl-File-Map + - src-openeuler/perl-File-MMagic + - src-openeuler/perl-File-Modified + - src-openeuler/perl-File-NCopy + - src-openeuler/perl-File-NFSLock + - src-openeuler/perl-File-Object + - src-openeuler/perl-File-Path + - src-openeuler/perl-File-Path-Tiny + - src-openeuler/perl-File-PathList + - src-openeuler/perl-File-Read + - src-openeuler/perl-File-SearchPath + - src-openeuler/perl-File-Share + - src-openeuler/perl-File-ShareDir-ProjectDistDir + - src-openeuler/perl-File-Slurp-Tiny + - src-openeuler/perl-File-Slurper + - src-openeuler/perl-File-Spec-Native + - src-openeuler/perl-File-Temp + - src-openeuler/perl-File-Touch + - src-openeuler/perl-File-Type + - src-openeuler/perl-File-Type-WebImages + - src-openeuler/perl-File-Which + - src-openeuler/perl-File-Zglob + - src-openeuler/perl-FileHandle-Fmode + - src-openeuler/perl-FileHandle-Unget + - src-openeuler/perl-Filesys-Notify-Simple + - src-openeuler/perl-Filter + - src-openeuler/perl-Filter-Simple + - src-openeuler/perl-Finance-YahooQuote + - src-openeuler/perl-Flow + - src-openeuler/perl-Format-Human-Bytes + - src-openeuler/perl-FreezeThaw + - src-openeuler/perl-Games-Solitaire-Verify + - src-openeuler/perl-GD-SVG + - src-openeuler/perl-Geo-Constants + - src-openeuler/perl-Geo-Ellipsoids + - src-openeuler/perl-Geo-Forward + - src-openeuler/perl-Geo-Functions + - src-openeuler/perl-Geo-Inverse + - src-openeuler/perl-Geo-IP + - src-openeuler/perl-Geo-IPfree + - src-openeuler/perl-Geography-Countries + - src-openeuler/perl-Getopt-ArgvFile + - src-openeuler/perl-Getopt-Euclid + - src-openeuler/perl-Getopt-Long + - src-openeuler/perl-Getopt-Long-Descriptive + - src-openeuler/perl-Getopt-Lucid + - src-openeuler/perl-Getopt-Simple + - src-openeuler/perl-Git-Repository + - src-openeuler/perl-Git-Repository-Plugin-AUTOLOAD + - src-openeuler/perl-Git-Version-Compare + - src-openeuler/perl-Git-Wrapper + - src-openeuler/perl-GPS-OID + - src-openeuler/perl-Graph + - src-openeuler/perl-Graphics-ColorNames + - src-openeuler/perl-Graphics-ColorNames-WWW + - src-openeuler/perl-Graphics-ColorNamesLite-WWW + - src-openeuler/perl-Growl-GNTP + - src-openeuler/perl-Guard + - src-openeuler/perl-Ham-Reference-QRZ + - src-openeuler/perl-HarfBuzz-Shaper + - src-openeuler/perl-Hash-Case + - src-openeuler/perl-Hash-Diff + - src-openeuler/perl-Hash-Flatten + - src-openeuler/perl-Hash-Merge + - src-openeuler/perl-Hash-Merge-Simple + - src-openeuler/perl-Hash-MoreUtils + - src-openeuler/perl-Hash-MultiValue + - src-openeuler/perl-Hash-Util-FieldHash-Compat + - src-openeuler/perl-Hook-LexWrap + - src-openeuler/perl-HTML-Defang + - src-openeuler/perl-HTML-Encoding + - src-openeuler/perl-HTML-FillInForm + - src-openeuler/perl-HTML-Form + - src-openeuler/perl-HTML-Format + - src-openeuler/perl-HTML-GenToc + - src-openeuler/perl-HTML-HTML5-Entities + - src-openeuler/perl-HTML-LinkList + - src-openeuler/perl-HTML-Lint + - src-openeuler/perl-HTML-Mason + - src-openeuler/perl-HTML-Quoted + - src-openeuler/perl-HTML-RewriteAttributes + - src-openeuler/perl-HTML-Scrubber + - src-openeuler/perl-HTML-SimpleParse + - src-openeuler/perl-HTML-Strip + - src-openeuler/perl-HTML-StripScripts + - src-openeuler/perl-HTML-StripScripts-Parser + - src-openeuler/perl-HTML-Table + - src-openeuler/perl-HTML-TagCloud + - src-openeuler/perl-HTML-Template + - src-openeuler/perl-HTML-Template-Pro + - src-openeuler/perl-HTML-Tiny + - src-openeuler/perl-HTML-TokeParser-Simple + - src-openeuler/perl-HTTP-Body + - src-openeuler/perl-HTTP-BrowserDetect + - src-openeuler/perl-HTTP-Cache-Transparent + - src-openeuler/perl-HTTP-CookieMonster + - src-openeuler/perl-HTTP-Exception + - src-openeuler/perl-HTTP-Headers-Fast + - src-openeuler/perl-HTTP-Link-Parser + - src-openeuler/perl-HTTP-Lite + - src-openeuler/perl-HTTP-MultiPartParser + - src-openeuler/perl-HTTP-Parser + - src-openeuler/perl-HTTP-Parser-XS + - src-openeuler/perl-HTTP-Request-AsCGI + - src-openeuler/perl-HTTP-Request-Params + - src-openeuler/perl-HTTP-Response-Encoding + - src-openeuler/perl-HTTP-Server-Simple + - src-openeuler/perl-HTTP-Server-Simple-PSGI + - src-openeuler/perl-HTTP-Thin + - src-openeuler/perl-HTTP-Tiny + - src-openeuler/perl-HTTP-Tiny-Multipart + - src-openeuler/perl-HTTP-Tinyish + - src-openeuler/perl-Image-Base + - src-openeuler/perl-Image-ExifTool + - src-openeuler/perl-Image-Math-Constrain + - src-openeuler/perl-Image-Size + - src-openeuler/perl-Image-Xbm + - src-openeuler/perl-Image-Xpm + - src-openeuler/perl-Importer + - src-openeuler/perl-indirect + - src-openeuler/perl-Inline + - src-openeuler/perl-IO + - src-openeuler/perl-IO-Any + - src-openeuler/perl-IO-Compress + - src-openeuler/perl-IO-Interactive + - src-openeuler/perl-IO-Interface + - src-openeuler/perl-IO-Pager + - src-openeuler/perl-IO-Pipely + - src-openeuler/perl-IO-Prompt-Tiny + - src-openeuler/perl-IO-Prompter + - src-openeuler/perl-IO-Pty-Easy + - src-openeuler/perl-IO-Socket-IP + - src-openeuler/perl-IO-Socket-Multicast + - src-openeuler/perl-IO-Socket-Socks + - src-openeuler/perl-IO-Socket-SSL + - src-openeuler/perl-IO-Socket-Timeout + - src-openeuler/perl-IO-Stty + - src-openeuler/perl-IO-Tee + - src-openeuler/perl-IO-TieCombine + - src-openeuler/perl-IPC-Cmd + - src-openeuler/perl-IPC-Run + - src-openeuler/perl-IPC-Run3 + - src-openeuler/perl-IPC-ShareLite + - src-openeuler/perl-IPC-System-Simple + - src-openeuler/perl-IPC-SysV + - src-openeuler/perl-IPTables-ChainMgr + - src-openeuler/perl-IPTables-Parse + - src-openeuler/perl-IRC-Utils + - src-openeuler/perl-Iterator-Simple + - src-openeuler/perl-Iterator-Simple-Lookahead + - src-openeuler/perl-JavaScript-Beautifier + - src-openeuler/perl-JSON-Parse + - src-openeuler/perl-JSON-Pointer + - src-openeuler/perl-JSON-PP + - src-openeuler/perl-JSON-RPC-Common + - src-openeuler/perl-JSON-Tiny + - src-openeuler/perl-L + - src-openeuler/perl-Language-Functional + - src-openeuler/perl-latest + - src-openeuler/perl-LaTeX-ToUnicode + - src-openeuler/perl-Lchown + - src-openeuler/perl-Lexical-Persistence + - src-openeuler/perl-Lexical-SealRequireHints + - src-openeuler/perl-lexical-underscore + - src-openeuler/perl-lib-abs + - src-openeuler/perl-lib-relative + - src-openeuler/perl-libnet + - src-openeuler/perl-Library-CallNumber-LC + - src-openeuler/perl-Lingua-EN-Alphabet-Shaw + - src-openeuler/perl-Lingua-EN-Fathom + - src-openeuler/perl-Lingua-EN-FindNumber + - src-openeuler/perl-Lingua-EN-Inflect + - src-openeuler/perl-Lingua-EN-Inflect-Number + - src-openeuler/perl-Lingua-EN-Number-IsOrdinal + - src-openeuler/perl-Lingua-EN-Numbers + - src-openeuler/perl-Lingua-EN-Numbers-Easy + - src-openeuler/perl-Lingua-EN-Numbers-Ordinate + - src-openeuler/perl-Lingua-EN-PluralToSingular + - src-openeuler/perl-Lingua-EN-Sentence + - src-openeuler/perl-Lingua-EN-Syllable + - src-openeuler/perl-Lingua-EN-Words2Nums + - src-openeuler/perl-Lingua-Flags + - src-openeuler/perl-Lingua-Identify + - src-openeuler/perl-Lingua-KO-Hangul-Util + - src-openeuler/perl-Lingua-PT-Stemmer + - src-openeuler/perl-Lingua-Stem-Ru + - src-openeuler/perl-Lingua-Stem-Snowball + - src-openeuler/perl-Lingua-Translit + - src-openeuler/perl-List-AllUtils + - src-openeuler/perl-List-MoreUtils + - src-openeuler/perl-List-MoreUtils-XS + - src-openeuler/perl-List-Pairwise + - src-openeuler/perl-List-SomeUtils + - src-openeuler/perl-List-SomeUtils-XS + - src-openeuler/perl-List-UtilsBy + - src-openeuler/perl-Locale-Codes + - src-openeuler/perl-Locale-Currency-Format + - src-openeuler/perl-Locale-Maketext + - src-openeuler/perl-Locale-Maketext-Gettext + - src-openeuler/perl-Locale-Maketext-Lexicon + - src-openeuler/perl-Locale-Maketext-Simple + - src-openeuler/perl-Locale-MO-File + - src-openeuler/perl-Locale-Msgfmt + - src-openeuler/perl-Locale-PO + - src-openeuler/perl-Locale-SubCountry + - src-openeuler/perl-Locale-TextDomain-OO + - src-openeuler/perl-Locale-TextDomain-OO-Util + - src-openeuler/perl-Locale-US + - src-openeuler/perl-Locale-Utils-PlaceholderBabelFish + - src-openeuler/perl-Locale-Utils-PlaceholderMaketext + - src-openeuler/perl-Locale-Utils-PlaceholderNamed + - src-openeuler/perl-Log-Any + - src-openeuler/perl-Log-Contextual + - src-openeuler/perl-Log-Dispatch + - src-openeuler/perl-Log-ger + - src-openeuler/perl-Log-Handler + - src-openeuler/perl-Log-Log4perl + - src-openeuler/perl-Log-Message + - src-openeuler/perl-Log-Message-Simple + - src-openeuler/perl-Log-Trace + - src-openeuler/perl-Log-Trivial + - src-openeuler/perl-LWP-Online + - src-openeuler/perl-Mail-AuthenticationResults + - src-openeuler/perl-Mail-Box + - src-openeuler/perl-Mail-Box-Parser-C + - src-openeuler/perl-Mail-Box-POP3 + - src-openeuler/perl-Mail-IMAPTalk + - src-openeuler/perl-Mail-JMAPTalk + - src-openeuler/perl-Mail-Message + - src-openeuler/perl-Mail-Sendmail + - src-openeuler/perl-Mail-SPF + - src-openeuler/perl-Mail-Transport + - src-openeuler/perl-Makefile-DOM + - src-openeuler/perl-MasonX-Request-WithApacheSession + - src-openeuler/perl-Math-Base36 + - src-openeuler/perl-Math-Base85 + - src-openeuler/perl-Math-BaseCnv + - src-openeuler/perl-Math-BigInt + - src-openeuler/perl-Math-BigInt-FastCalc + - src-openeuler/perl-Math-BigRat + - src-openeuler/perl-Math-Calc-Units + - src-openeuler/perl-Math-Cartesian-Product + - src-openeuler/perl-Math-Complex + - src-openeuler/perl-Math-ConvexHull + - src-openeuler/perl-Math-ConvexHull-MonotoneChain + - src-openeuler/perl-Math-Derivative + - src-openeuler/perl-Math-Expression-Evaluator + - src-openeuler/perl-Math-FFT + - src-openeuler/perl-Math-Int64 + - src-openeuler/perl-Math-MatrixReal + - src-openeuler/perl-Math-Polygon + - src-openeuler/perl-Math-Round + - src-openeuler/perl-Math-Spline + - src-openeuler/perl-Math-Utils + - src-openeuler/perl-Math-Vec + - src-openeuler/perl-MemHandle + - src-openeuler/perl-Memoize + - src-openeuler/perl-Menlo + - src-openeuler/perl-Menlo-Legacy + - src-openeuler/perl-Meta-Builder + - src-openeuler/perl-Method-Signatures-Simple + - src-openeuler/perl-Metrics-Any + - src-openeuler/perl-MIME-Base32 + - src-openeuler/perl-MIME-Base64 + - src-openeuler/perl-MIME-Charset + - src-openeuler/perl-MIME-EncWords + - src-openeuler/perl-MIME-tools + - src-openeuler/perl-mixin + - src-openeuler/perl-Mixin-ExtraFields + - src-openeuler/perl-Mixin-Linewise + - src-openeuler/perl-Mock-Config + - src-openeuler/perl-Mock-Quick + - src-openeuler/perl-Mock-Sub + - src-openeuler/perl-Modern-Perl + - src-openeuler/perl-Module-Build-Deprecated + - src-openeuler/perl-Module-Build-Pluggable + - src-openeuler/perl-Module-Build-Using-PkgConfig + - src-openeuler/perl-Module-Compile + - src-openeuler/perl-Module-CoreList + - src-openeuler/perl-Module-CPANfile + - src-openeuler/perl-Module-Data + - src-openeuler/perl-Module-Depends + - src-openeuler/perl-Module-Extract + - src-openeuler/perl-Module-Extract-Namespaces + - src-openeuler/perl-Module-Extract-Use + - src-openeuler/perl-Module-Find + - src-openeuler/perl-Module-Install-Authority + - src-openeuler/perl-Module-Install-AutoManifest + - src-openeuler/perl-Module-Install-ExtraTests + - src-openeuler/perl-Module-Install-TestBase + - src-openeuler/perl-Module-Install-TrustMetaYml + - src-openeuler/perl-Module-Load + - src-openeuler/perl-Module-Load-Conditional + - src-openeuler/perl-Module-Load-Util + - src-openeuler/perl-Module-Manifest + - src-openeuler/perl-Module-Mask + - src-openeuler/perl-Module-Math-Depends + - src-openeuler/perl-Module-Metadata + - src-openeuler/perl-Module-Path + - src-openeuler/perl-Module-Pluggable + - src-openeuler/perl-Module-Reader + - src-openeuler/perl-Module-Refresh + - src-openeuler/perl-Module-Runtime-Conflicts + - src-openeuler/perl-Module-Signature + - src-openeuler/perl-Module-Starter + - src-openeuler/perl-Module-Util + - src-openeuler/perl-MogileFS-Client + - src-openeuler/perl-MogileFS-Utils + - src-openeuler/perl-Mojo-DOM58 + - src-openeuler/perl-Monitoring-Plugin + - src-openeuler/perl-Monotone-AutomateStdio + - src-openeuler/perl-Moose + - src-openeuler/perl-Moose-Autobox + - src-openeuler/perl-MooseX-Aliases + - src-openeuler/perl-MooseX-App-Cmd + - src-openeuler/perl-MooseX-ArrayRef + - src-openeuler/perl-MooseX-Async + - src-openeuler/perl-MooseX-Attribute-Chained + - src-openeuler/perl-MooseX-CascadeClearing + - src-openeuler/perl-MooseX-ClassAttribute + - src-openeuler/perl-MooseX-CoercePerAttribute + - src-openeuler/perl-MooseX-ConfigFromFile + - src-openeuler/perl-MooseX-Configuration + - src-openeuler/perl-MooseX-Daemonize + - src-openeuler/perl-MooseX-Emulate-Class-Accessor-Fast + - src-openeuler/perl-MooseX-Getopt + - src-openeuler/perl-MooseX-GlobRef + - src-openeuler/perl-MooseX-Has-Options + - src-openeuler/perl-MooseX-Has-Sugar + - src-openeuler/perl-MooseX-InsideOut + - src-openeuler/perl-MooseX-Iterator + - src-openeuler/perl-MooseX-LazyRequire + - src-openeuler/perl-MooseX-MarkAsMethods + - src-openeuler/perl-MooseX-Meta-TypeConstraint-ForceCoercion + - src-openeuler/perl-MooseX-Meta-TypeConstraint-Mooish + - src-openeuler/perl-MooseX-MethodAttributes + - src-openeuler/perl-MooseX-MultiInitArg + - src-openeuler/perl-MooseX-NonMoose + - src-openeuler/perl-MooseX-Object-Pluggable + - src-openeuler/perl-MooseX-OneArgNew + - src-openeuler/perl-MooseX-Param + - src-openeuler/perl-MooseX-Params-Validate + - src-openeuler/perl-MooseX-POE + - src-openeuler/perl-MooseX-RelatedClassRoles + - src-openeuler/perl-MooseX-Role-Cmd + - src-openeuler/perl-MooseX-Role-Matcher + - src-openeuler/perl-MooseX-Role-Parameterized + - src-openeuler/perl-MooseX-Role-Strict + - src-openeuler/perl-MooseX-Role-Tempdir + - src-openeuler/perl-MooseX-SemiAffordanceAccessor + - src-openeuler/perl-MooseX-SetOnce + - src-openeuler/perl-MooseX-SimpleConfig + - src-openeuler/perl-MooseX-Singleton + - src-openeuler/perl-MooseX-StrictConstructor + - src-openeuler/perl-MooseX-TraitFor-Meta-Class-BetterAnonClassNames + - src-openeuler/perl-MooseX-Traits + - src-openeuler/perl-MooseX-Traits-Pluggable + - src-openeuler/perl-MooseX-Types + - src-openeuler/perl-MooseX-Types-Common + - src-openeuler/perl-MooseX-Types-LoadableClass + - src-openeuler/perl-MooseX-Types-Path-Class + - src-openeuler/perl-MooseX-Types-Path-Tiny + - src-openeuler/perl-MooseX-Types-Perl + - src-openeuler/perl-MooseX-Types-Stringlike + - src-openeuler/perl-MooX + - src-openeuler/perl-MooX-Cmd + - src-openeuler/perl-MooX-ConfigFromFile + - src-openeuler/perl-MooX-File-ConfigDir + - src-openeuler/perl-MooX-HandlesVia + - src-openeuler/perl-MooX-HasEnv + - src-openeuler/perl-MooX-Locale-Passthrough + - src-openeuler/perl-MooX-Locale-TextDomain-OO + - src-openeuler/perl-MooX-Log-Any + - src-openeuler/perl-MooX-Role-Parameterized + - src-openeuler/perl-MooX-Roles-Pluggable + - src-openeuler/perl-MooX-Singleton + - src-openeuler/perl-MooX-StrictConstructor + - src-openeuler/perl-Mozilla-LDAP + - src-openeuler/perl-Mozilla-PublicSuffix + - src-openeuler/perl-MP3-Info + - src-openeuler/perl-multidimensional + - src-openeuler/perl-namespace-autoclean + - src-openeuler/perl-namespace-clean + - src-openeuler/perl-namespace-sweep + - src-openeuler/perl-Net-AMQP + - src-openeuler/perl-Net-BGP + - src-openeuler/perl-Net-CIDR + - src-openeuler/perl-Net-Daemon + - src-openeuler/perl-Net-DNS-Resolver-Programmable + - src-openeuler/perl-Net-DNS-SEC + - src-openeuler/perl-Net-Domain-TLD + - src-openeuler/perl-Net-Google-AuthSub + - src-openeuler/perl-Net-HL7 + - src-openeuler/perl-Net-INET6Glue + - src-openeuler/perl-Net-IP + - src-openeuler/perl-Net-IP-Match-Regexp + - src-openeuler/perl-Net-IP-Minimal + - src-openeuler/perl-Net-LDAP-SID + - src-openeuler/perl-Net-MQTT-Simple + - src-openeuler/perl-Net-OAuth + - src-openeuler/perl-Net-OpenSSH + - src-openeuler/perl-Net-Ping-External + - src-openeuler/perl-Net-POP3S + - src-openeuler/perl-Net-Random + - src-openeuler/perl-Net-RawIP + - src-openeuler/perl-Net-Server-SS-PreFork + - src-openeuler/perl-Net-SFTP-Foreign + - src-openeuler/perl-Net-SMTPS + - src-openeuler/perl-Net-SSLeay + - src-openeuler/perl-Net-Telnet + - src-openeuler/perl-Net-Telnet-Cisco + - src-openeuler/perl-Net-UPnP + - src-openeuler/perl-Nmap-Parser + - src-openeuler/perl-NNTPClient + - src-openeuler/perl-Number-Bytes-Human + - src-openeuler/perl-Number-Compare + - src-openeuler/perl-Number-Format + - src-openeuler/perl-Number-Misc + - src-openeuler/perl-Number-Range + - src-openeuler/perl-Number-Tolerant + - src-openeuler/perl-Object-Accessor + - src-openeuler/perl-Object-HashBase + - src-openeuler/perl-Object-Pluggable + - src-openeuler/perl-Object-Realize-Later + - src-openeuler/perl-Object-Signature + - src-openeuler/perl-Object-Tiny + - src-openeuler/perl-OLE-Storage_Lite + - src-openeuler/perl-Ouch + - src-openeuler/perl-Package-Anon + - src-openeuler/perl-Package-DeprecationManager + - src-openeuler/perl-Package-New + - src-openeuler/perl-Package-Stash + - src-openeuler/perl-Package-Variant + - src-openeuler/perl-PadWalker + - src-openeuler/perl-Palm + - src-openeuler/perl-Palm-PDB + - src-openeuler/perl-Panotools-Script + - src-openeuler/perl-PAR + - src-openeuler/perl-PAR-Dist + - src-openeuler/perl-Parallel-ForkManager + - src-openeuler/perl-Parallel-Iterator + - src-openeuler/perl-Parallel-Pipes + - src-openeuler/perl-Parallel-Runner + - src-openeuler/perl-Parallel-Scoreboard + - src-openeuler/perl-Params-CallbackRequest + - src-openeuler/perl-Params-Check + - src-openeuler/perl-Params-Coerce + - src-openeuler/perl-Params-Validate + - src-openeuler/perl-parent + - src-openeuler/perl-Parse-Debian-Packages + - src-openeuler/perl-Parse-DMIDecode + - src-openeuler/perl-Parse-EDID + - src-openeuler/perl-Parse-ErrorString-Perl + - src-openeuler/perl-Parse-ExuberantCTags + - src-openeuler/perl-Parse-Gitignore + - src-openeuler/perl-Parse-MIME + - src-openeuler/perl-Parse-PMFile + - src-openeuler/perl-Path-FindDev + - src-openeuler/perl-Path-IsDev + - src-openeuler/perl-Path-Iterator-Rule + - src-openeuler/perl-Path-ScanINC + - src-openeuler/perl-Path-Tiny-Rule + - src-openeuler/perl-PathTools + - src-openeuler/perl-PBKDF2-Tiny + - src-openeuler/perl-PDF-Create + - src-openeuler/perl-PDF-Reuse + - src-openeuler/perl-Pegex + - src-openeuler/perl-Perl-OSType + - src-openeuler/perl-Perl-PrereqScanner + - src-openeuler/perl-Perl-Stripper + - src-openeuler/perl-Perl-Tidy + - src-openeuler/perl-Perl-Tidy-Sweetened + - src-openeuler/perl-Perl-Version + - src-openeuler/perl-Perl6-Caller + - src-openeuler/perl-Perl6-Junction + - src-openeuler/perl-Perl6-Slurp + - src-openeuler/perl-perlfaq + - src-openeuler/perl-Perlilog + - src-openeuler/perl-PerlIO-buffersize + - src-openeuler/perl-PerlIO-eol + - src-openeuler/perl-PerlIO-gzip + - src-openeuler/perl-PerlIO-Layers + - src-openeuler/perl-PerlIO-locale + - src-openeuler/perl-PerlIO-utf8_strict + - src-openeuler/perl-PerlIO-via-QuotedPrint + - src-openeuler/perl-PerlIO-via-Timeout + - src-openeuler/perl-PFT + - src-openeuler/perl-PHP-Serialization + - src-openeuler/perl-PkgConfig-LibPkgConf + - src-openeuler/perl-Pod-Checker + - src-openeuler/perl-Pod-Constants + - src-openeuler/perl-Pod-Coverage-Moose + - src-openeuler/perl-Pod-Coverage-TrustPod + - src-openeuler/perl-Pod-Elemental + - src-openeuler/perl-Pod-Elemental-PerlMunger + - src-openeuler/perl-Pod-Escapes + - src-openeuler/perl-Pod-Eventual + - src-openeuler/perl-Pod-Markdown-Github + - src-openeuler/perl-Pod-MinimumVersion + - src-openeuler/perl-Pod-Parser + - src-openeuler/perl-Pod-Perldoc + - src-openeuler/perl-Pod-Plainer + - src-openeuler/perl-Pod-POM + - src-openeuler/perl-Pod-PseudoPod + - src-openeuler/perl-Pod-Simple + - src-openeuler/perl-Pod-Simple-Wiki + - src-openeuler/perl-Pod-Snippets + - src-openeuler/perl-Pod-Spell + - src-openeuler/perl-Pod-Spell-CommonMistakes + - src-openeuler/perl-Pod-Strip + - src-openeuler/perl-Pod-Tidy + - src-openeuler/perl-Pod-Usage + - src-openeuler/perl-Pod-Wrap + - src-openeuler/perl-Pod-Xhtml + - src-openeuler/perl-POD2-Base + - src-openeuler/perl-podlators + - src-openeuler/perl-POE + - src-openeuler/perl-POE-Test-Loops + - src-openeuler/perl-POSIX-strftime-Compiler + - src-openeuler/perl-POSIX-strptime + - src-openeuler/perl-PPI + - src-openeuler/perl-PPI-HTML + - src-openeuler/perl-PPI-XS + - src-openeuler/perl-PPIx-EditorTools + - src-openeuler/perl-PPIx-QuoteLike + - src-openeuler/perl-PPIx-Regexp + - src-openeuler/perl-prefork + - src-openeuler/perl-Printer + - src-openeuler/perl-Proc-Daemon + - src-openeuler/perl-Proc-InvokeEditor + - src-openeuler/perl-Proc-PID-File + - src-openeuler/perl-Proc-ProcessTable + - src-openeuler/perl-Proc-Simple + - src-openeuler/perl-Proc-Terminator + - src-openeuler/perl-Proc-Wait3 + - src-openeuler/perl-Promises + - src-openeuler/perl-PSGI + - src-openeuler/perl-RDF-NS + - src-openeuler/perl-RDF-NS-Curated + - src-openeuler/perl-RDF-Prefixes + - src-openeuler/perl-re-engine-PCRE2 + - src-openeuler/perl-ReadonlyX + - src-openeuler/perl-Redis + - src-openeuler/perl-Ref-Util + - src-openeuler/perl-Ref-Util-XS + - src-openeuler/perl-Regexp-Assemble + - src-openeuler/perl-Regexp-Assemble-Compressed + - src-openeuler/perl-Regexp-Common + - src-openeuler/perl-Regexp-Common-net-CIDR + - src-openeuler/perl-Regexp-Grammars + - src-openeuler/perl-Regexp-IPv6 + - src-openeuler/perl-Regexp-Pattern + - src-openeuler/perl-Regexp-Stringify + - src-openeuler/perl-Regexp-Util + - src-openeuler/perl-REST-Client + - src-openeuler/perl-Retry + - src-openeuler/perl-Return-MultiLevel + - src-openeuler/perl-Return-Value + - src-openeuler/perl-Role-Basic + - src-openeuler/perl-Role-Identifiable + - src-openeuler/perl-Roman + - src-openeuler/perl-Router-Simple + - src-openeuler/perl-Safe-Isa + - src-openeuler/perl-Scalar-Construct + - src-openeuler/perl-Scalar-List-Utils + - src-openeuler/perl-Scalar-String + - src-openeuler/perl-Schedule-Cron + - src-openeuler/perl-Scope-Guard + - src-openeuler/perl-Scope-Upper + - src-openeuler/perl-Scriptalicious + - src-openeuler/perl-SelfLoader + - src-openeuler/perl-Server-Starter + - src-openeuler/perl-Set-Array + - src-openeuler/perl-Set-Crontab + - src-openeuler/perl-Set-Infinite + - src-openeuler/perl-Set-IntSpan + - src-openeuler/perl-Set-Scalar + - src-openeuler/perl-Set-Tiny + - src-openeuler/perl-Shell + - src-openeuler/perl-Shell-Guess + - src-openeuler/perl-Smart-Comments + - src-openeuler/perl-Snowball-Swedish + - src-openeuler/perl-Socket + - src-openeuler/perl-Software-License-CCpack + - src-openeuler/perl-Sort-Key + - src-openeuler/perl-Sort-MergeSort + - src-openeuler/perl-Sort-Naturally + - src-openeuler/perl-Sort-Versions + - src-openeuler/perl-Spellunker + - src-openeuler/perl-Spiffy + - src-openeuler/perl-Spreadsheet-ParseExcel + - src-openeuler/perl-SQL-Abstract + - src-openeuler/perl-SQL-Interp + - src-openeuler/perl-SQL-Library + - src-openeuler/perl-SQL-ReservedWords + - src-openeuler/perl-Statistics-Basic + - src-openeuler/perl-Statistics-CaseResampling + - src-openeuler/perl-Statistics-ChiSquare + - src-openeuler/perl-Statistics-Contingency + - src-openeuler/perl-Statistics-Descriptive + - src-openeuler/perl-STD + - src-openeuler/perl-Stream-Buffered + - src-openeuler/perl-String-Approx + - src-openeuler/perl-String-Base + - src-openeuler/perl-String-CamelCase + - src-openeuler/perl-String-Copyright + - src-openeuler/perl-String-Dirify + - src-openeuler/perl-String-Escape + - src-openeuler/perl-String-Format + - src-openeuler/perl-String-Formatter + - src-openeuler/perl-String-Interpolate-Named + - src-openeuler/perl-String-Print + - src-openeuler/perl-String-Random + - src-openeuler/perl-String-RewritePrefix + - src-openeuler/perl-String-Similarity + - src-openeuler/perl-String-Tagged + - src-openeuler/perl-String-Tagged-Terminal + - src-openeuler/perl-String-Trim + - src-openeuler/perl-String-Truncate + - src-openeuler/perl-String-Util + - src-openeuler/perl-Struct-Dumb + - src-openeuler/perl-Sub-Attribute + - src-openeuler/perl-Sub-Exporter-ForMethods + - src-openeuler/perl-Sub-Exporter-GlobExporter + - src-openeuler/perl-Sub-Identify + - src-openeuler/perl-Sub-Infix + - src-openeuler/perl-Sub-Info + - src-openeuler/perl-Sub-Override + - src-openeuler/perl-Sub-Prototype + - src-openeuler/perl-Sub-WrapPackages + - src-openeuler/perl-SUPER + - src-openeuler/perl-SVG + - src-openeuler/perl-SVG-Parser + - src-openeuler/perl-Symbol-Global-Name + - src-openeuler/perl-Symbol-Util + - src-openeuler/perl-syntax + - src-openeuler/perl-Syntax-Keyword-Gather + - src-openeuler/perl-Syntax-Keyword-Junction + - src-openeuler/perl-Syntax-Keyword-Try + - src-openeuler/perl-Sys-Hostname-Long + - src-openeuler/perl-Sys-Info-Base + - src-openeuler/perl-Sys-Mmap + - src-openeuler/perl-Sys-Statistics-Linux + - src-openeuler/perl-Sys-Syslog + - src-openeuler/perl-System-Command + - src-openeuler/perl-System-Info + - src-openeuler/perl-Taint-Util + - src-openeuler/perl-Tangerine + - src-openeuler/perl-TAP-Formatter-HTML + - src-openeuler/perl-TAP-Harness-Archive + - src-openeuler/perl-TAP-Harness-JUnit + - src-openeuler/perl-TAP-SimpleOutput + - src-openeuler/perl-Tapper + - src-openeuler/perl-Task-Kensho-Exceptions + - src-openeuler/perl-Task-Moose + - src-openeuler/perl-Task-Weaken + - src-openeuler/perl-Template-Alloy + - src-openeuler/perl-Template-Multilingual + - src-openeuler/perl-Template-Plugin-Class + - src-openeuler/perl-Template-Plugin-Cycle + - src-openeuler/perl-Template-Tiny + - src-openeuler/perl-Template-Toolkit + - src-openeuler/perl-Template-Toolkit-Simple + - src-openeuler/perl-Term-ANSIColor + - src-openeuler/perl-Term-Cap + - src-openeuler/perl-Term-Chrome + - src-openeuler/perl-Term-Clui + - src-openeuler/perl-Term-EditorEdit + - src-openeuler/perl-Term-Encoding + - src-openeuler/perl-Term-ProgressBar + - src-openeuler/perl-Term-Size + - src-openeuler/perl-Term-Table + - src-openeuler/perl-Term-UI + - src-openeuler/perl-TermReadKey + - src-openeuler/perl-Test-Abortable + - src-openeuler/perl-Test-API + - src-openeuler/perl-Test-Assert + - src-openeuler/perl-Test-Assertions + - src-openeuler/perl-Test-Base + - src-openeuler/perl-Test-CheckChanges + - src-openeuler/perl-Test-CheckDeps + - src-openeuler/perl-Test-Class + - src-openeuler/perl-Test-Class-Most + - src-openeuler/perl-Test-CleanNamespaces + - src-openeuler/perl-Test-Cmd + - src-openeuler/perl-Test-Command + - src-openeuler/perl-Test-Compile + - src-openeuler/perl-Test-ConsistentVersion + - src-openeuler/perl-Test-CPAN-Meta-JSON + - src-openeuler/perl-Test-CPAN-Meta-YAML + - src-openeuler/perl-Test-Deep-Fuzzy + - src-openeuler/perl-Test-Deep-Type + - src-openeuler/perl-Test-Dependencies + - src-openeuler/perl-Test-Differences + - src-openeuler/perl-Test-Dir + - src-openeuler/perl-Test-Directory + - src-openeuler/perl-Test-Dist-VersionSync + - src-openeuler/perl-Test-Distribution + - src-openeuler/perl-Test-EOL + - src-openeuler/perl-Test-Exception + - src-openeuler/perl-Test-Exception-LessClever + - src-openeuler/perl-Test-Exit + - src-openeuler/perl-Test-Expect + - src-openeuler/perl-Test-File + - src-openeuler/perl-Test-File-Contents + - src-openeuler/perl-Test-File-ShareDir + - src-openeuler/perl-Test-Filename + - src-openeuler/perl-Test-Fixme + - src-openeuler/perl-Test-Harness + - src-openeuler/perl-Test-Harness-Straps + - src-openeuler/perl-Test-HasVersion + - src-openeuler/perl-Test-HexDifferences + - src-openeuler/perl-Test-HexString + - src-openeuler/perl-Test-HTTP-Server-Simple + - src-openeuler/perl-Test-Identity + - src-openeuler/perl-Test-Inter + - src-openeuler/perl-Test-Is + - src-openeuler/perl-Test-JSON + - src-openeuler/perl-Test-LectroTest + - src-openeuler/perl-Test-LoadAllModules + - src-openeuler/perl-Test-LongString + - src-openeuler/perl-Test-LWP-UserAgent + - src-openeuler/perl-Test-Manifest + - src-openeuler/perl-Test-Memory-Cycle + - src-openeuler/perl-Test-Metrics-Any + - src-openeuler/perl-Test-Mock-LWP + - src-openeuler/perl-Test-Mock-Time + - src-openeuler/perl-Test-MockModule + - src-openeuler/perl-Test-MockObject + - src-openeuler/perl-Test-MockRandom + - src-openeuler/perl-Test-MockTime + - src-openeuler/perl-Test-Modern + - src-openeuler/perl-Test-Mojibake + - src-openeuler/perl-Test-Moose-More + - src-openeuler/perl-Test-More-UTF8 + - src-openeuler/perl-Test-Most + - src-openeuler/perl-Test-mysqld + - src-openeuler/perl-Test-Name-FromLine + - src-openeuler/perl-Test-NiceDump + - src-openeuler/perl-Test-NoBreakpoints + - src-openeuler/perl-Test-NoPlan + - src-openeuler/perl-Test-NoTabs + - src-openeuler/perl-Test-Number-Delta + - src-openeuler/perl-Test-Object + - src-openeuler/perl-Test-Output + - src-openeuler/perl-Test-Pod-Content + - src-openeuler/perl-Test-Pod-No404s + - src-openeuler/perl-Test-Pod-Spelling-CommonMistakes + - src-openeuler/perl-Test-POE-Client-TCP + - src-openeuler/perl-Test-POE-Server-TCP + - src-openeuler/perl-Test-Portability-Files + - src-openeuler/perl-Test-Prereq + - src-openeuler/perl-Test-Regexp + - src-openeuler/perl-Test-Regression + - src-openeuler/perl-Test-Requires-Git + - src-openeuler/perl-Test-Roo + - src-openeuler/perl-Test-Routine + - src-openeuler/perl-Test-Run + - src-openeuler/perl-Test-Run-CmdLine + - src-openeuler/perl-Test-Script-Run + - src-openeuler/perl-Test-SharedFork + - src-openeuler/perl-Test-Simple + - src-openeuler/perl-Test-Spelling + - src-openeuler/perl-Test-Strict + - src-openeuler/perl-Test-SubCalls + - src-openeuler/perl-Test-Synopsis + - src-openeuler/perl-Test-Taint + - src-openeuler/perl-Test-TCP + - src-openeuler/perl-Test-Time + - src-openeuler/perl-Test-TinyMocker + - src-openeuler/perl-Test-Toolbox + - src-openeuler/perl-Test-TrailingSpace + - src-openeuler/perl-Test-Trap + - src-openeuler/perl-Test-Unit-Lite + - src-openeuler/perl-Test-UseAllModules + - src-openeuler/perl-Test-utf8 + - src-openeuler/perl-Test-Vars + - src-openeuler/perl-Test-Warn + - src-openeuler/perl-Test-Without-Module + - src-openeuler/perl-Test-WriteVariants + - src-openeuler/perl-Test-WWW-Selenium + - src-openeuler/perl-Test-YAML + - src-openeuler/perl-Test-YAML-Valid + - src-openeuler/perl-Test2-Suite + - src-openeuler/perl-TestML + - src-openeuler/perl-TeX-Encode + - src-openeuler/perl-TeX-Hyphen + - src-openeuler/perl-Text-Affixes + - src-openeuler/perl-Text-Aligner + - src-openeuler/perl-Text-ASCIITable + - src-openeuler/perl-Text-Autoformat + - src-openeuler/perl-Text-Balanced + - src-openeuler/perl-Text-Clip + - src-openeuler/perl-Text-CSV-Separator + - src-openeuler/perl-Text-Diff + - src-openeuler/perl-Text-Diff-HTML + - src-openeuler/perl-Text-Diff-Parser + - src-openeuler/perl-Text-FindIndent + - src-openeuler/perl-Text-Format + - src-openeuler/perl-Text-FormatTable + - src-openeuler/perl-Text-Fuzzy + - src-openeuler/perl-Text-Haml + - src-openeuler/perl-Text-Levenshtein-Damerau + - src-openeuler/perl-Text-Levenshtein-Damerau-XS + - src-openeuler/perl-Text-Markdown + - src-openeuler/perl-Text-MultiMarkdown + - src-openeuler/perl-Text-Ngram + - src-openeuler/perl-Text-ParseWords + - src-openeuler/perl-Text-PDF + - src-openeuler/perl-Text-Quoted + - src-openeuler/perl-Text-Reflow + - src-openeuler/perl-Text-Reform + - src-openeuler/perl-Text-Roman + - src-openeuler/perl-Text-Soundex + - src-openeuler/perl-Text-Sprintf-Named + - src-openeuler/perl-Text-Table + - src-openeuler/perl-Text-Table-Tiny + - src-openeuler/perl-Text-TabularDisplay + - src-openeuler/perl-Text-Template-Simple + - src-openeuler/perl-Text-Textile + - src-openeuler/perl-Text-vCard + - src-openeuler/perl-Text-VCardFast + - src-openeuler/perl-Text-vFile-asData + - src-openeuler/perl-Text-VisualWidth-PP + - src-openeuler/perl-Text-WikiFormat + - src-openeuler/perl-Text-WordDiff + - src-openeuler/perl-Text-Wrapper + - src-openeuler/perl-Text-xSV + - src-openeuler/perl-Thread-Queue + - src-openeuler/perl-Thread-SigMask + - src-openeuler/perl-threads + - src-openeuler/perl-threads-shared + - src-openeuler/perl-Throwable + - src-openeuler/perl-Tie-Cache + - src-openeuler/perl-Tie-Cycle + - src-openeuler/perl-Tie-DataUUID + - src-openeuler/perl-Tie-DBI + - src-openeuler/perl-Tie-EncryptedHash + - src-openeuler/perl-Tie-Handle-Offset + - src-openeuler/perl-Tie-Hash-MultiValue + - src-openeuler/perl-Tie-Simple + - src-openeuler/perl-Tie-Sub + - src-openeuler/perl-Time-Clock + - src-openeuler/perl-Time-Duration + - src-openeuler/perl-Time-Duration-Parse + - src-openeuler/perl-Time-HiRes + - src-openeuler/perl-Time-Interval + - src-openeuler/perl-Time-Local + - src-openeuler/perl-Time-Mock + - src-openeuler/perl-Time-Moment + - src-openeuler/perl-Time-ParseDate + - src-openeuler/perl-Time-Period + - src-openeuler/perl-Time-Piece + - src-openeuler/perl-Time-timegm + - src-openeuler/perl-Time-Tiny + - src-openeuler/perl-Time-Warp + - src-openeuler/perl-Time-y2038 + - src-openeuler/perl-Tk-Canvas-GradientColor + - src-openeuler/perl-Tk-ColoredButton + - src-openeuler/perl-Tk-DoubleClick + - src-openeuler/perl-Tk-FontDialog + - src-openeuler/perl-Tk-ObjScanner + - src-openeuler/perl-Tk-Pod + - src-openeuler/perl-Tk-Text-SuperText + - src-openeuler/perl-TOML-Parser + - src-openeuler/perl-Tree + - src-openeuler/perl-Tree-DAG_Node + - src-openeuler/perl-Tree-R + - src-openeuler/perl-Tree-Simple + - src-openeuler/perl-Type-Tiny-XS + - src-openeuler/perl-Unicode-CaseFold + - src-openeuler/perl-Unicode-Casing + - src-openeuler/perl-Unicode-CheckUTF8 + - src-openeuler/perl-Unicode-CheckUTF8-PP + - src-openeuler/perl-Unicode-Collate + - src-openeuler/perl-Unicode-Map + - src-openeuler/perl-Unicode-Normalize + - src-openeuler/perl-Unicode-String + - src-openeuler/perl-UNIVERSAL-can + - src-openeuler/perl-UNIVERSAL-isa + - src-openeuler/perl-UNIVERSAL-require + - src-openeuler/perl-Unix-Process + - src-openeuler/perl-URI + - src-openeuler/perl-URI-db + - src-openeuler/perl-URI-Encode + - src-openeuler/perl-URI-Escape-XS + - src-openeuler/perl-URI-Find + - src-openeuler/perl-URI-Find-Simple + - src-openeuler/perl-URI-FromHash + - src-openeuler/perl-URI-Nested + - src-openeuler/perl-URI-Query + - src-openeuler/perl-URI-Title + - src-openeuler/perl-URI-ws + - src-openeuler/perl-URL-Encode + - src-openeuler/perl-URL-Encode-XS + - src-openeuler/perl-User + - src-openeuler/perl-User-Identity + - src-openeuler/perl-UUID + - src-openeuler/perl-UUID-Tiny + - src-openeuler/perl-v6 + - src-openeuler/perl-Validation-Class + - src-openeuler/perl-Variable-Magic + - src-openeuler/perl-Verilog-Readmem + - src-openeuler/perl-version + - src-openeuler/perl-Version-Next + - src-openeuler/perl-Version-Requirements + - src-openeuler/perl-Want + - src-openeuler/perl-WebService-Linode + - src-openeuler/perl-WebService-Validator-HTML-W3C + - src-openeuler/perl-Win32-ShellQuote + - src-openeuler/perl-WWW-DuckDuckGo + - src-openeuler/perl-WWW-GoodData + - src-openeuler/perl-WWW-Mechanize + - src-openeuler/perl-WWW-Shorten + - src-openeuler/perl-WWW-Splunk + - src-openeuler/perl-WWW-Twilio-API + - src-openeuler/perl-XML-Atom-SimpleFeed + - src-openeuler/perl-XML-Bare + - src-openeuler/perl-XML-CommonNS + - src-openeuler/perl-XML-DOM + - src-openeuler/perl-XML-Fast + - src-openeuler/perl-XML-FeedPP + - src-openeuler/perl-XML-Flow + - src-openeuler/perl-XML-Generator + - src-openeuler/perl-XML-Generator-PerlData + - src-openeuler/perl-XML-Hash-LX + - src-openeuler/perl-XML-LibXML-Debugging + - src-openeuler/perl-XML-LibXML-PrettyPrint + - src-openeuler/perl-XML-LibXML-Simple + - src-openeuler/perl-XML-Merge + - src-openeuler/perl-XML-NamespaceFactory + - src-openeuler/perl-XML-Parser + - src-openeuler/perl-XML-Parser-Lite + - src-openeuler/perl-XML-Parser-Lite-Tree + - src-openeuler/perl-XML-Parser-Lite-Tree-XPath + - src-openeuler/perl-XML-RegExp + - src-openeuler/perl-XML-SAX-ExpatXS + - src-openeuler/perl-XML-SemanticDiff + - src-openeuler/perl-XML-Stream + - src-openeuler/perl-XML-Tidy + - src-openeuler/perl-XML-Tidy-Tiny + - src-openeuler/perl-XML-Tiny + - src-openeuler/perl-XML-TreePP + - src-openeuler/perl-XML-Twig + - src-openeuler/perl-XML-Writer + - src-openeuler/perl-XML-XPathEngine + - src-openeuler/perl-XXX + - src-openeuler/perl-YAML-PP + - src-openeuler/perl-YAML-Syck + - src-openeuler/perl-ZMQ-Constants +- name: sig-python-modules + repositories: + - src-openeuler/python-ez_setup + - src-openeuler/python-APScheduler + - src-openeuler/python-ATpy + - src-openeuler/python-AWSIoTPythonSDK + - src-openeuler/python-Arpeggio + - src-openeuler/python-Babel + - src-openeuler/python-Brotli + - src-openeuler/python-Cerberus + - src-openeuler/python-Cerealizer + - src-openeuler/python-Chameleon + - src-openeuler/python-ConfigArgParse + - src-openeuler/python-CouchDB + - src-openeuler/python-Cython + - src-openeuler/python-ECPy + - src-openeuler/python-EditorConfig + - src-openeuler/python-Faker + - src-openeuler/python-Flask-APScheduler + - src-openeuler/python-Flask-Admin + - src-openeuler/python-Flask-Assets + - src-openeuler/python-Flask-AutoIndex + - src-openeuler/python-Flask-Bootstrap + - src-openeuler/python-Flask-Cache + - src-openeuler/python-Flask-Classy + - src-openeuler/python-Flask-Mail + - src-openeuler/python-Flask-Mako + - src-openeuler/python-Flask-OAuth + - src-openeuler/python-Flask-OpenID + - src-openeuler/python-Flask-Paranoid + - src-openeuler/python-Flask-Principal + - src-openeuler/python-Flask-RSTPages + - src-openeuler/python-Flask-SQLAlchemy + - src-openeuler/python-Flask-Script + - src-openeuler/python-Flask-Silk + - src-openeuler/python-Flask-HTTPAuth + - src-openeuler/python-FormEncode + - src-openeuler/python-GitPython + - src-openeuler/python-GridDataFormats + - src-openeuler/python-HeapDict + - src-openeuler/python-ipython_genutils + - src-openeuler/python-JPype1 + - src-openeuler/python-JSON_minify + - src-openeuler/python-JayDeBeApi + - src-openeuler/python-Kajiki + - src-openeuler/python-Lasagne + - src-openeuler/python-Logbook + - src-openeuler/python-ModestMaps + - src-openeuler/python-Naked + - src-openeuler/python-Parsley + - src-openeuler/python-PyDispatcher + - src-openeuler/python-PyDrive + - src-openeuler/python-PyLaTeX + - src-openeuler/python-PyLink + - src-openeuler/python-PyMeeus + - src-openeuler/python-PyNLPl + - src-openeuler/python-PyOpenGL + - src-openeuler/python-PyPDF2 + - src-openeuler/python-PyRSS2Gen + - src-openeuler/python-PySimpleSOAP + - src-openeuler/python-PySnooper + - src-openeuler/python-PyYAML + - src-openeuler/python-Pympler + - src-openeuler/python-Pyphen + - src-openeuler/python-QtAwesome + - src-openeuler/python-QtPy + - src-openeuler/python-SALib + - src-openeuler/python-SQLAlchemy-Utils + - src-openeuler/python-Send2Trash + - src-openeuler/python-Slowloris + - src-openeuler/python-TGScheduler + - src-openeuler/python-Theano + - src-openeuler/python-Trololio + - src-openeuler/python-TurboGears2 + - src-openeuler/python-Twiggy + - src-openeuler/python-Unipath + - src-openeuler/python-XStatic + - src-openeuler/python-XStatic-Angular + - src-openeuler/python-XStatic-Angular-Bootstrap + - src-openeuler/python-XStatic-Angular-Gettext + - src-openeuler/python-XStatic-Bootstrap-SCSS + - src-openeuler/python-XStatic-Font-Awesome + - src-openeuler/python-XStatic-JSEncrypt + - src-openeuler/python-XStatic-Jasmine + - src-openeuler/python-XStatic-Patternfly-Bootstrap-Treeview + - src-openeuler/python-XStatic-bootswatch + - src-openeuler/python-XStatic-mdi + - src-openeuler/python-XStatic-roboto-fontface + - src-openeuler/python-XStatic-smart-table + - src-openeuler/python-XlsxWriter + - src-openeuler/python-Yapsy + - src-openeuler/python-ZEO + - src-openeuler/python-aaargh + - src-openeuler/python-abclient + - src-openeuler/python-abimap + - src-openeuler/python-adodbapi + - src-openeuler/python-aenum + - src-openeuler/python-agate + - src-openeuler/python-agate-dbf + - src-openeuler/python-agate-excel + - src-openeuler/python-agate-sql + - src-openeuler/python-aiodns + - src-openeuler/python-aiofiles + - src-openeuler/python-aiohttp-negotiate + - src-openeuler/python-aiomqtt + - src-openeuler/python-aiomysql + - src-openeuler/python-aioodbc + - src-openeuler/python-aiorpcX + - src-openeuler/python-aiosmtpd + - src-openeuler/python-aiosnmp + - src-openeuler/python-aiostream + - src-openeuler/python-aiounittest + - src-openeuler/python-aiowinreg + - src-openeuler/python-aiozeroconf + - src-openeuler/python-airspeed + - src-openeuler/python-alembic + - src-openeuler/python-altgraph + - src-openeuler/python-amqp + - src-openeuler/python-animatplot + - src-openeuler/python-ansi2html + - src-openeuler/python-ansible-inventory-grapher + - src-openeuler/python-ansible-review + - src-openeuler/python-ansicolor + - src-openeuler/python-ansicolors + - src-openeuler/python-anyjson + - src-openeuler/python-anykeystore + - src-openeuler/python-anymarkup + - src-openeuler/python-anymarkup-core + - src-openeuler/python-anytree + - src-openeuler/python-apptools + - src-openeuler/python-apypie + - src-openeuler/python-argh + - src-openeuler/python-argon2-cffi + - src-openeuler/python-argparse-manpage + - src-openeuler/python-args + - src-openeuler/python-arpy + - src-openeuler/python-asciitree + - src-openeuler/python-asgiref + - src-openeuler/python-aspectlib + - src-openeuler/python-aspy + - src-openeuler/python-asteval + - src-openeuler/python-astral + - src-openeuler/python-astroid + - src-openeuler/python-astroML + - src-openeuler/python-astroplan + - src-openeuler/python-astropy + - src-openeuler/python-astropy-healpix + - src-openeuler/python-astropy-helpers + - src-openeuler/python-astroquery + - src-openeuler/python-astunparse + - src-openeuler/python-async-timeout + - src-openeuler/python-async_generator + - src-openeuler/python-asyncssh + - src-openeuler/python-asynctest + - src-openeuler/python-atpublic + - src-openeuler/python-audioread + - src-openeuler/python-auth.credential + - src-openeuler/python-autopep8 + - src-openeuler/python-babelfish + - src-openeuler/python-backcall + - src-openeuler/python-backlash + - src-openeuler/python-backoff + - src-openeuler/python-baluhn + - src-openeuler/python-bashate + - src-openeuler/python-bcc + - src-openeuler/python-beanbag + - src-openeuler/python-beniget + - src-openeuler/python-bids-validator + - src-openeuler/python-bigsuds + - src-openeuler/python-billiard + - src-openeuler/python-binaryornot + - src-openeuler/python-binstruct + - src-openeuler/python-bintrees + - src-openeuler/python-bitcoinlib + - src-openeuler/python-bitlyapi + - src-openeuler/python-bitmath + - src-openeuler/python-bitstring + - src-openeuler/python-bleach + - src-openeuler/python-blessed + - src-openeuler/python-blessings + - src-openeuler/python-blindspin + - src-openeuler/python-blockdiag + - src-openeuler/python-blowfish + - src-openeuler/python-blurb + - src-openeuler/python-bobo + - src-openeuler/python-booleanOperations + - src-openeuler/python-boom + - src-openeuler/python-boto + - src-openeuler/python-boto3 + - src-openeuler/python-botocore + - src-openeuler/python-bottle-sqlite + - src-openeuler/python-branca + - src-openeuler/python-bson + - src-openeuler/python-btrfs + - src-openeuler/python-bucky + - src-openeuler/python-bugzilla + - src-openeuler/python-bytesize + - src-openeuler/python-bz2file + - src-openeuler/python-cachelib + - src-openeuler/python-cachetools + - src-openeuler/python-cachez + - src-openeuler/python-cairocffi + - src-openeuler/python-canonicaljson + - src-openeuler/python-capturer + - src-openeuler/python-caribou + - src-openeuler/python-case + - src-openeuler/python-catkin-sphinx + - src-openeuler/python-ccdproc + - src-openeuler/python-cchardet + - src-openeuler/python-certifi + - src-openeuler/python-cfgv + - src-openeuler/python-check-manifest + - src-openeuler/python-citeproc-py + - src-openeuler/python-cjdns + - src-openeuler/python-click-completion + - src-openeuler/python-click-help-colors + - src-openeuler/python-click-log + - src-openeuler/python-click-man + - src-openeuler/python-click-threading + - src-openeuler/python-cliff-tablib + - src-openeuler/python-cligj + - src-openeuler/python-clint + - src-openeuler/python-cloud_sptheme + - src-openeuler/python-cloudpickle + - src-openeuler/python-cltk + - src-openeuler/python-clyent + - src-openeuler/python-cmarkgfm + - src-openeuler/python-cmdln + - src-openeuler/python-cmigemo + - src-openeuler/python-cocotb + - src-openeuler/python-codecov + - src-openeuler/python-colcon-bazel + - src-openeuler/python-colorama + - src-openeuler/python-colorclass + - src-openeuler/python-coloredlogs + - src-openeuler/python-colorful + - src-openeuler/python-colorlog + - src-openeuler/python-colorspacious + - src-openeuler/python-colour + - src-openeuler/python-colour-runner + - src-openeuler/python-conditional + - src-openeuler/python-condor + - src-openeuler/python-confuse + - src-openeuler/python-contextvars + - src-openeuler/python-convertdate + - src-openeuler/python-copr + - src-openeuler/python-copr-common + - src-openeuler/python-copr-messaging + - src-openeuler/python-cov-core + - src-openeuler/python-cram + - src-openeuler/python-crank + - src-openeuler/python-crashtest + - src-openeuler/python-crayons + - src-openeuler/python-crcelk + - src-openeuler/python-croniter + - src-openeuler/python-cson + - src-openeuler/python-css-parser + - src-openeuler/python-cssmin + - src-openeuler/python-cssselect2 + - src-openeuler/python-csvkit + - src-openeuler/python-cu2qu + - src-openeuler/python-curio + - src-openeuler/python-curtsies + - src-openeuler/python-cvss + - src-openeuler/python-cxxfilt + - src-openeuler/python-cypy + - src-openeuler/python-d2to1 + - src-openeuler/python-daemonize + - src-openeuler/python-daiquiri + - src-openeuler/python-dataclasses + - src-openeuler/python-datanommer.consumer + - src-openeuler/python-datanommer.models + - src-openeuler/python-dateparser + - src-openeuler/python-dbfread + - src-openeuler/python-dbus-client-gen + - src-openeuler/python-dbus-signature-pyparsing + - src-openeuler/python-ddt + - src-openeuler/python-deap + - src-openeuler/python-debrepo + - src-openeuler/python-deepmerge + - src-openeuler/python-defusedxml + - src-openeuler/python-demjson + - src-openeuler/python-deprecation + - src-openeuler/python-dict.sorted + - src-openeuler/python-dictdumper + - src-openeuler/python-diff-match-patch + - src-openeuler/python-dill + - src-openeuler/python-dirq + - src-openeuler/python-diskcache + - src-openeuler/python-distlib + - src-openeuler/python-distro-info + - src-openeuler/python-dj-database-url + - src-openeuler/python-dj-email-url + - src-openeuler/python-dj-search-url + - src-openeuler/python-django + - src-openeuler/python-django-ajax-selects + - src-openeuler/python-django-angular + - src-openeuler/python-django-annoying + - src-openeuler/python-django-appconf + - src-openeuler/python-django-authority + - src-openeuler/python-django-babel + - src-openeuler/python-django-cache-url + - src-openeuler/python-django-compressor + - src-openeuler/python-django-cors-headers + - src-openeuler/python-django-crispy-forms + - src-openeuler/python-django-debreach + - src-openeuler/python-django-debug-toolbar + - src-openeuler/python-django-discover-runner + - src-openeuler/python-django-filter + - src-openeuler/python-django-haystack + - src-openeuler/python-django-health-check + - src-openeuler/python-django-helpdesk + - src-openeuler/python-django-ipware + - src-openeuler/python-django-macros + - src-openeuler/python-django-markdownx + - src-openeuler/python-django-mptt + - src-openeuler/python-django-nose + - src-openeuler/python-django-pipeline + - src-openeuler/python-django-pyscss + - src-openeuler/python-django-pytest + - src-openeuler/python-django-redis + - src-openeuler/python-django-registration + - src-openeuler/python-django-rest-framework + - src-openeuler/python-django-reversion + - src-openeuler/python-django-robots + - src-openeuler/python-django-simple-captcha + - src-openeuler/python-django-tagging + - src-openeuler/python-django-tastypie + - src-openeuler/python-django-tinymce + - src-openeuler/python-djangoql + - src-openeuler/python-dnf + - src-openeuler/python-dns-lexicon + - src-openeuler/python-dnspython + - src-openeuler/python-docker-squash + - src-openeuler/python-dockerfile-parse + - src-openeuler/python-docx + - src-openeuler/python-dogpile.cache + - src-openeuler/python-doit + - src-openeuler/python-dominate + - src-openeuler/python-dotenv + - src-openeuler/python-dpath + - src-openeuler/python-dpkt + - src-openeuler/python-drat + - src-openeuler/python-duecredit + - src-openeuler/python-dulwich + - src-openeuler/python-easyargs + - src-openeuler/python-easygui + - src-openeuler/python-editdistance + - src-openeuler/python-email_reply_parser + - src-openeuler/python-emcee + - src-openeuler/python-emoji + - src-openeuler/python-envisage + - src-openeuler/python-enzyme + - src-openeuler/python-epdb + - src-openeuler/python-epub + - src-openeuler/python-et_xmlfile + - src-openeuler/python-exif + - src-openeuler/python-f5-icontrol-rest + - src-openeuler/python-fabulous + - src-openeuler/python-fastavro + - src-openeuler/python-fasteners + - src-openeuler/python-fastimport + - src-openeuler/python-fastnumbers + - src-openeuler/python-fastpurge + - src-openeuler/python-fauxquests + - src-openeuler/python-fdb + - src-openeuler/python-fedfind + - src-openeuler/python-feedgenerator + - src-openeuler/python-feedparser + - src-openeuler/python-fido2 + - src-openeuler/python-fields + - src-openeuler/python-filetype + - src-openeuler/python-fire + - src-openeuler/python-firebirdsql + - src-openeuler/python-firehose + - src-openeuler/python-firewall + - src-openeuler/python-first + - src-openeuler/python-fisx + - src-openeuler/python-flake8-import-order + - src-openeuler/python-flaky + - src-openeuler/python-flann + - src-openeuler/python-flask-multistatic + - src-openeuler/python-flask-oidc + - src-openeuler/python-flask-restplus + - src-openeuler/python-flask-restx + - src-openeuler/python-flask-session + - src-openeuler/python-flask-whooshee + - src-openeuler/python-flatpak-module-tools + - src-openeuler/python-flexmock + - src-openeuler/python-flickrapi + - src-openeuler/python-flock + - src-openeuler/python-flower + - src-openeuler/python-flufl.i18n + - src-openeuler/python-flufl.lock + - src-openeuler/python-flufl.testing + - src-openeuler/python-flup + - src-openeuler/python-fontMath + - src-openeuler/python-fontdump + - src-openeuler/python-fontname + - src-openeuler/python-formats + - src-openeuler/python-friendlyloris + - src-openeuler/python-frozendict + - src-openeuler/python-fsmonitor + - src-openeuler/python-fsspec + - src-openeuler/python-fuckit + - src-openeuler/python-funcparserlib + - src-openeuler/python-furl + - src-openeuler/python-fusepy + - src-openeuler/python-futurist + - src-openeuler/python-fuzzyfinder + - src-openeuler/python-fypp + - src-openeuler/python-gTTS-token + - src-openeuler/python-gast + - src-openeuler/python-gatspy + - src-openeuler/python-gccinvocation + - src-openeuler/python-gearbox + - src-openeuler/python-genty + - src-openeuler/python-geographiclib + - src-openeuler/python-geojson + - src-openeuler/python-geomet + - src-openeuler/python-gerrit-view + - src-openeuler/python-gerritlib + - src-openeuler/python-gerrymander + - src-openeuler/python-getmac + - src-openeuler/python-ghp-import2 + - src-openeuler/python-git-url-parse + - src-openeuler/python-gitapi + - src-openeuler/python-gitdb + - src-openeuler/python-githubpy + - src-openeuler/python-gitlab + - src-openeuler/python-glad + - src-openeuler/python-glances_api + - src-openeuler/python-glob2 + - src-openeuler/python-gntp + - src-openeuler/python-gnupg + - src-openeuler/python-google-auth + - src-openeuler/python-google-compute-engine + - src-openeuler/python-gpxpy + - src-openeuler/python-grabbit + - src-openeuler/python-grabserial + - src-openeuler/python-guizero + - src-openeuler/python-gwebsockets + - src-openeuler/python-h11 + - src-openeuler/python-h5io + - src-openeuler/python-hdfs + - src-openeuler/python-heketi + - src-openeuler/python-hgapi + - src-openeuler/python-hgdistver + - src-openeuler/python-hkdf + - src-openeuler/python-hl7 + - src-openeuler/python-hole + - src-openeuler/python-holidays + - src-openeuler/python-hstspreload + - src-openeuler/python-html2text + - src-openeuler/python-htmlmin + - src-openeuler/python-httmock + - src-openeuler/python-http_client + - src-openeuler/python-httpsig_cffi + - src-openeuler/python-httptools + - src-openeuler/python-humanfriendly + - src-openeuler/python-humblewx + - src-openeuler/python-husl + - src-openeuler/python-hypothesis-fspaths + - src-openeuler/python-icalendar + - src-openeuler/python-identify + - src-openeuler/python-idstools + - src-openeuler/python-ifcfg + - src-openeuler/python-igor + - src-openeuler/python-igraph + - src-openeuler/python-img2pdf + - src-openeuler/python-importmagic + - src-openeuler/python-inema + - src-openeuler/python-injector + - src-openeuler/python-interfile + - src-openeuler/python-intervaltree + - src-openeuler/python-into-dbus-python + - src-openeuler/python-iowait + - src-openeuler/python-ipdb + - src-openeuler/python-ipgetter2 + - src-openeuler/python-isodate + - src-openeuler/python-isort + - src-openeuler/python-javalang + - src-openeuler/python-jdcal + - src-openeuler/python-jeepney + - src-openeuler/python-jinja2-time + - src-openeuler/python-jinja2_pluralize + - src-openeuler/python-journal-brief + - src-openeuler/python-jsmin + - src-openeuler/python-json2table + - src-openeuler/python-json5 + - src-openeuler/python-json_logger + - src-openeuler/python-jsonmodels + - src-openeuler/python-jsonpath-rw + - src-openeuler/python-jsonpath-rw-ext + - src-openeuler/python-justbytes + - src-openeuler/python-jwcrypto + - src-openeuler/python-kaitaistruct + - src-openeuler/python-kaptan + - src-openeuler/python-kdcproxy + - src-openeuler/python-kerberos + - src-openeuler/python-kickstart + - src-openeuler/python-klusta + - src-openeuler/python-kobo + - src-openeuler/python-krbcontext + - src-openeuler/python-landslide + - src-openeuler/python-langtable + - src-openeuler/python-lark-parser + - src-openeuler/python-lasso + - src-openeuler/python-launchpadlib + - src-openeuler/python-lazr.config + - src-openeuler/python-lazr.delegates + - src-openeuler/python-lazr.restfulclient + - src-openeuler/python-lazr.smtptest + - src-openeuler/python-lazr.uri + - src-openeuler/python-lazyarray + - src-openeuler/python-lazy-object-proxy + - src-openeuler/python-leather + - src-openeuler/python-lesscpy + - src-openeuler/python-libNeuroML + - src-openeuler/python-libarchive-c + - src-openeuler/python-libevdev + - src-openeuler/python-liblinear + - src-openeuler/python-libmount + - src-openeuler/python-libnacl + - src-openeuler/python-libnl + - src-openeuler/python-librosa + - src-openeuler/python-libsass + - src-openeuler/python-libtmux + - src-openeuler/python-libusb1 + - src-openeuler/python-libvoikko + - src-openeuler/python-liquidctl + - src-openeuler/python-listparser + - src-openeuler/python-littleutils + - src-openeuler/python-livereload + - src-openeuler/python-lmdb + - src-openeuler/python-locket + - src-openeuler/python-lockfile + - src-openeuler/python-logging_tree + - src-openeuler/python-logzero + - src-openeuler/python-lrparsing + - src-openeuler/python-lttngust + - src-openeuler/python-luftdaten + - src-openeuler/python-lupa + - src-openeuler/python-mailer + - src-openeuler/python-makeelf + - src-openeuler/python-manuel + - src-openeuler/python-maps + - src-openeuler/python-markdown2 + - src-openeuler/python-marshmallow + - src-openeuler/python-mccabe + - src-openeuler/python-mdx_gh_links + - src-openeuler/python-med + - src-openeuler/python-metaextract + - src-openeuler/python-metar + - src-openeuler/python-micawber + - src-openeuler/python-microfs + - src-openeuler/python-migen + - src-openeuler/python-migrate + - src-openeuler/python-mimerender + - src-openeuler/python-minibelt + - src-openeuler/python-minidb + - src-openeuler/python-minidump + - src-openeuler/python-mne + - src-openeuler/python-mne-bids + - src-openeuler/python-mnemonic + - src-openeuler/python-modernize + - src-openeuler/python-moksha.common + - src-openeuler/python-mongoengine + - src-openeuler/python-monotonic + - src-openeuler/python-mpmath + - src-openeuler/python-msgpack + - src-openeuler/python-mtg + - src-openeuler/python-multi_key_dict + - src-openeuler/python-multidict + - src-openeuler/python-multio + - src-openeuler/python-multipart + - src-openeuler/python-munkres + - src-openeuler/python-musicbrainzngs + - src-openeuler/python-mutagen + - src-openeuler/python-mwclient + - src-openeuler/python-mygpoclient + - src-openeuler/python-nb2plots + - src-openeuler/python-ndjson-testrunner + - src-openeuler/python-neomodel + - src-openeuler/python-neotime + - src-openeuler/python-neovim + - src-openeuler/python-netdata + - src-openeuler/python-ngram + - src-openeuler/python-nine + - src-openeuler/python-nltk + - src-openeuler/python-nmap + - src-openeuler/python-nmrglue + - src-openeuler/python-nose-cov + - src-openeuler/python-nose-exclude + - src-openeuler/python-nose-ignore-docstring + - src-openeuler/python-nose-parameterized + - src-openeuler/python-nose-progressive + - src-openeuler/python-nose-timer + - src-openeuler/python-nose2 + - src-openeuler/python-nose_fixes + - src-openeuler/python-notario + - src-openeuler/python-notify2 + - src-openeuler/python-notmuch + - src-openeuler/python-ns1-python + - src-openeuler/python-nss + - src-openeuler/python-ntlm-auth + - src-openeuler/python-nudatus + - src-openeuler/python-num2words + - src-openeuler/python-numpoly + - src-openeuler/python-oauth2client + - src-openeuler/python-odML + - src-openeuler/python-odfpy + - src-openeuler/python-offtrac + - src-openeuler/python-ofxparse + - src-openeuler/python-okaara + - src-openeuler/python-oletools + - src-openeuler/python-openidc-client + - src-openeuler/python-openpyxl + - src-openeuler/python-opensensemap-api + - src-openeuler/python-openstackdocstheme + - src-openeuler/python-orderedmultidict + - src-openeuler/python-os-service-types + - src-openeuler/python-oslo.i18n + - src-openeuler/python-oslo.sphinx + - src-openeuler/python-oslotest + - src-openeuler/python-outcome + - src-openeuler/python-outdated + - src-openeuler/python-packit + - src-openeuler/python-pacpy + - src-openeuler/python-paho-mqtt + - src-openeuler/python-pamela + - src-openeuler/python-pandocfilters + - src-openeuler/python-paperwork-backend + - src-openeuler/python-parameterized + - src-openeuler/python-parsedatetime + - src-openeuler/python-parso + - src-openeuler/python-passlib + - src-openeuler/python-pastel + - src-openeuler/python-patch-ng + - src-openeuler/python-pathlib2 + - src-openeuler/python-pathspec + - src-openeuler/python-pathtools + - src-openeuler/python-patool + - src-openeuler/python-patsy + - src-openeuler/python-pbkdf2 + - src-openeuler/python-pdc-client + - src-openeuler/python-pdfkit + - src-openeuler/python-pdfminer + - src-openeuler/python-pdfrw + - src-openeuler/python-pdir2 + - src-openeuler/python-peewee + - src-openeuler/python-pendulum + - src-openeuler/python-pep517 + - src-openeuler/python-periodictable + - src-openeuler/python-persist-queue + - src-openeuler/python-pg8000 + - src-openeuler/python-pgpdump + - src-openeuler/python-phonenumbers + - src-openeuler/python-phpserialize + - src-openeuler/python-piexif + - src-openeuler/python-pigpio + - src-openeuler/python-pika-pool + - src-openeuler/python-pipdeptree + - src-openeuler/python-pkginfo + - src-openeuler/python-pkgwat.api + - src-openeuler/python-plaintable + - src-openeuler/python-player + - src-openeuler/python-plink + - src-openeuler/python-pluginbase + - src-openeuler/python-pluginlib + - src-openeuler/python-plugnplay + - src-openeuler/python-plumbum + - src-openeuler/python-podcastparser + - src-openeuler/python-portalocker + - src-openeuler/python-power + - src-openeuler/python-poyo + - src-openeuler/python-praw + - src-openeuler/python-prettyprinter + - src-openeuler/python-process-tests + - src-openeuler/python-profilehooks + - src-openeuler/python-progress + - src-openeuler/python-progressbar2 + - src-openeuler/python-prometheus_client + - src-openeuler/python-psycogreen + - src-openeuler/python-pudb + - src-openeuler/python-pulsectl + - src-openeuler/python-pungi + - src-openeuler/python-pure-sasl + - src-openeuler/python-pvc + - src-openeuler/python-py-cpuinfo + - src-openeuler/python-py-make + - src-openeuler/python-py2pack + - src-openeuler/python-pyLibravatar + - src-openeuler/python-pyModbusTCP + - src-openeuler/python-pyPEG2 + - src-openeuler/python-pyTelegramBotAPI + - src-openeuler/python-pyactivetwo + - src-openeuler/python-pyaes + - src-openeuler/python-pyasn1-modules + - src-openeuler/python-pybeam + - src-openeuler/python-pycares + - src-openeuler/python-pyclipper + - src-openeuler/python-pycodestyle + - src-openeuler/python-pycollada + - src-openeuler/python-pycryptodome + - src-openeuler/python-pycryptodomex + - src-openeuler/python-pycscope + - src-openeuler/python-pydenticon + - src-openeuler/python-pydicom + - src-openeuler/python-pydocstyle + - src-openeuler/python-pyelectro + - src-openeuler/python-pyephem + - src-openeuler/python-pyface + - src-openeuler/python-pyfakefs + - src-openeuler/python-pyftdi + - src-openeuler/python-pyftpdlib + - src-openeuler/python-pygal + - src-openeuler/python-pygatt + - src-openeuler/python-pygeoip + - src-openeuler/python-pyghmi + - src-openeuler/python-pygments-style-solarized + - src-openeuler/python-pyhcl + - src-openeuler/python-pyi2cflash + - src-openeuler/python-pyinstaller + - src-openeuler/python-pykalman + - src-openeuler/python-pykeepass + - src-openeuler/python-pylast + - src-openeuler/python-pylev + - src-openeuler/python-pylons-sphinx-themes + - src-openeuler/python-pymatreader + - src-openeuler/python-pymemcache + - src-openeuler/python-pymoc + - src-openeuler/python-pymod2pkg + - src-openeuler/python-pynetdicom + - src-openeuler/python-pyngus + - src-openeuler/python-pynvml + - src-openeuler/python-pyocr + - src-openeuler/python-pyotp + - src-openeuler/python-pypandoc + - src-openeuler/python-pyperclip + - src-openeuler/python-pypng + - src-openeuler/python-pyprocdev + - src-openeuler/python-pyrad + - src-openeuler/python-pyramid_fas_openid + - src-openeuler/python-pyreadline + - src-openeuler/python-pyroute2 + - src-openeuler/python-pyrsistent + - src-openeuler/python-pyrtlsdr + - src-openeuler/python-pysb + - src-openeuler/python-pyserial + - src-openeuler/python-pyshark + - src-openeuler/python-pyshp + - src-openeuler/python-pysmi + - src-openeuler/python-pysnmp + - src-openeuler/python-pyspf + - src-openeuler/python-pyspiflash + - src-openeuler/python-pysrt + - src-openeuler/python-pystache + - src-openeuler/python-pystalk + - src-openeuler/python-pystoi + - src-openeuler/python-pystray + - src-openeuler/python-pytest-arraydiff + - src-openeuler/python-pytest-asyncio + - src-openeuler/python-pytest-beakerlib + - src-openeuler/python-pytest-cache + - src-openeuler/python-pytest-capturelog + - src-openeuler/python-pytest-catchlog + - src-openeuler/python-pytest-datafiles + - src-openeuler/python-pytest-doctestplus + - src-openeuler/python-pytest-faulthandler + - src-openeuler/python-pytest-flakes + - src-openeuler/python-pytest-forked + - src-openeuler/python-pytest-helpers-namespace + - src-openeuler/python-pytest-isort + - src-openeuler/python-pytest-lazy-fixture + - src-openeuler/python-pytest-metadata + - src-openeuler/python-pytest-multihost + - src-openeuler/python-pytest-openfiles + - src-openeuler/python-pytest-ordering + - src-openeuler/python-pytest-pep8 + - src-openeuler/python-pytest-random-order + - src-openeuler/python-pytest-relaxed + - src-openeuler/python-pytest-remotedata + - src-openeuler/python-pytest-repeat + - src-openeuler/python-pytest-rerunfailures + - src-openeuler/python-pytest-runner + - src-openeuler/python-pytest-sourceorder + - src-openeuler/python-pytest-subtests + - src-openeuler/python-pytest-sugar + - src-openeuler/python-pytest-testmon + - src-openeuler/python-pytest-timeout + - src-openeuler/python-pytest-toolbox + - src-openeuler/python-pytest-tornado + - src-openeuler/python-pytest-watch + - src-openeuler/python-pytest-xdist + - src-openeuler/python-pytest-xprocess + - src-openeuler/python-pytimeparse + - src-openeuler/python-pytools + - src-openeuler/python-pytrailer + - src-openeuler/python-pytzdata + - src-openeuler/python-pyusb + - src-openeuler/python-pyvit + - src-openeuler/python-pyvmomi + - src-openeuler/python-pyvo + - src-openeuler/python-pyxdg + - src-openeuler/python-pyxs + - src-openeuler/python-pyzabbix + - src-openeuler/python-pyzmq + - src-openeuler/python-pyzolib + - src-openeuler/python-qcelemental + - src-openeuler/python-qrcodegen + - src-openeuler/python-quantities + - src-openeuler/python-queuelib + - src-openeuler/python-random2 + - src-openeuler/python-rangehttpserver + - src-openeuler/python-rarfile + - src-openeuler/python-ratelimitingfilter + - src-openeuler/python-rawkit + - src-openeuler/python-rcssmin + - src-openeuler/python-rebulk + - src-openeuler/python-regex + - src-openeuler/python-remoto + - src-openeuler/python-renderspec + - src-openeuler/python-repoze.sphinx.autointerface + - src-openeuler/python-repoze.tm2 + - src-openeuler/python-repoze.who + - src-openeuler/python-repoze.who.plugins.sa + - src-openeuler/python-requests-gssapi + - src-openeuler/python-requests-kerberos + - src-openeuler/python-requests-ntlm + - src-openeuler/python-requests-oauthlib + - src-openeuler/python-requestsexceptions + - src-openeuler/python-restfly + - src-openeuler/python-restsh + - src-openeuler/python-retask + - src-openeuler/python-retrying + - src-openeuler/python-retryz + - src-openeuler/python-rfc3986 + - src-openeuler/python-ripozo + - src-openeuler/python-rjsmin + - src-openeuler/python-rmtest + - src-openeuler/python-rnc2rng + - src-openeuler/python-roman + - src-openeuler/python-rope + - src-openeuler/python-rosinstall + - src-openeuler/python-rpdb + - src-openeuler/python-rstcheck + - src-openeuler/python-ruffus + - src-openeuler/python-rustcfg + - src-openeuler/python-rxjson + - src-openeuler/python-saml + - src-openeuler/python-sanction + - src-openeuler/python-scales + - src-openeuler/python-scandir + - src-openeuler/python-scapy + - src-openeuler/python-schema + - src-openeuler/python-scp + - src-openeuler/python-scramp + - src-openeuler/python-scripttester + - src-openeuler/python-scrypt + - src-openeuler/python-selectors2 + - src-openeuler/python-semver + - src-openeuler/python-serpy + - src-openeuler/python-setuptools_hg + - src-openeuler/python-sh + - src-openeuler/python-shamir-mnemonic + - src-openeuler/python-shodan + - src-openeuler/python-shortuuid + - src-openeuler/python-should_dsl + - src-openeuler/python-sieve + - src-openeuler/python-simplebayes + - src-openeuler/python-simpleeval + - src-openeuler/python-simplejson + - src-openeuler/python-simplepam + - src-openeuler/python-simplevisor + - src-openeuler/python-simpy + - src-openeuler/python-siphash + - src-openeuler/python-slack-cleaner + - src-openeuler/python-slacker + - src-openeuler/python-slixmpp + - src-openeuler/python-slugify + - src-openeuler/python-smmap + - src-openeuler/python-sniffio + - src-openeuler/python-snuggs + - src-openeuler/python-social-auth-app-flask + - src-openeuler/python-social-auth-app-flask-sqlalchemy + - src-openeuler/python-social-auth-storage-sqlalchemy + - src-openeuler/python-sockjs-tornado + - src-openeuler/python-socks5line + - src-openeuler/python-sortedcontainers + - src-openeuler/python-spake2 + - src-openeuler/python-spdx-lookup + - src-openeuler/python-speaklater + - src-openeuler/python-spec + - src-openeuler/python-speedtest-cli + - src-openeuler/python-speg + - src-openeuler/python-sphinx-argparse + - src-openeuler/python-sphinx-epytext + - src-openeuler/python-sphinx-gallery + - src-openeuler/python-sphinx-intl + - src-openeuler/python-sphinx-notfound-page + - src-openeuler/python-sphinxcontrib-applehelp + - src-openeuler/python-sphinxcontrib-blockdiag + - src-openeuler/python-sphinxcontrib-devhelp + - src-openeuler/python-sphinxcontrib-fulltoc + - src-openeuler/python-sphinxcontrib-htmlhelp + - src-openeuler/python-sphinxcontrib-issuetracker + - src-openeuler/python-sphinxcontrib-jsmath + - src-openeuler/python-sphinxcontrib-qthelp + - src-openeuler/python-sphinxcontrib-serializinghtml + - src-openeuler/python-sphinxtesters + - src-openeuler/python-sphobjinv + - src-openeuler/python-spur + - src-openeuler/python-sqlalchemy-collectd + - src-openeuler/python-sqlalchemy_schemadisplay + - src-openeuler/python-sqlparse + - src-openeuler/python-sseclient + - src-openeuler/python-statistics + - src-openeuler/python-statsd + - src-openeuler/python-statsmodels + - src-openeuler/python-stdlib-list + - src-openeuler/python-stem + - src-openeuler/python-stevedore + - src-openeuler/python-stomper + - src-openeuler/python-stompest + - src-openeuler/python-stuf + - src-openeuler/python-subliminal + - src-openeuler/python-supersmoother + - src-openeuler/python-svg + - src-openeuler/python-svg.path + - src-openeuler/python-svgwrite + - src-openeuler/python-sympy + - src-openeuler/python-tabulate + - src-openeuler/python-tambo + - src-openeuler/python-tasklib + - src-openeuler/python-tbgrep + - src-openeuler/python-tblib + - src-openeuler/python-tbtrim + - src-openeuler/python-tempdir + - src-openeuler/python-termcolor + - src-openeuler/python-terminaltables + - src-openeuler/python-test-server + - src-openeuler/python-testpath + - src-openeuler/python-testrepository + - src-openeuler/python-testresources + - src-openeuler/python-texext + - src-openeuler/python-text-unidecode + - src-openeuler/python-textparser + - src-openeuler/python-tftpy + - src-openeuler/python-tgext.crud + - src-openeuler/python-timeout-decorator + - src-openeuler/python-timeunit + - src-openeuler/python-tinydb + - src-openeuler/python-tinyrpc + - src-openeuler/python-toolz + - src-openeuler/python-tox + - src-openeuler/python-traitsui + - src-openeuler/python-traitlets + - src-openeuler/python-translationstring + - src-openeuler/python-trustme + - src-openeuler/python-tvb-data + - src-openeuler/python-tw2.core + - src-openeuler/python-tw2.forms + - src-openeuler/python-tw2.jqplugins.ui + - src-openeuler/python-tw2.jquery + - src-openeuler/python-twilio + - src-openeuler/python-txWS + - src-openeuler/python-txZMQ + - src-openeuler/python-typing + - src-openeuler/python-typogrify + - src-openeuler/python-tzlocal + - src-openeuler/python-unicodecsv + - src-openeuler/python-unidiff + - src-openeuler/python-upoints + - src-openeuler/python-uritemplate + - src-openeuler/python-urllib_gssapi + - src-openeuler/python-urwidtrees + - src-openeuler/python-utmp + - src-openeuler/python-uwsgidecorators + - src-openeuler/python-vagrantpy + - src-openeuler/python-validators + - src-openeuler/python-vatnumber + - src-openeuler/python-vconnector + - src-openeuler/python-vdirsyncer + - src-openeuler/python-verboselogs + - src-openeuler/python-versiontools + - src-openeuler/python-vine + - src-openeuler/python-virtualenv-api + - src-openeuler/python-virtualenv-clone + - src-openeuler/python-virtualenvwrapper + - src-openeuler/python-visidata + - src-openeuler/python-visitor + - src-openeuler/python-visvis + - src-openeuler/python-vobject + - src-openeuler/python-volkszaehler + - src-openeuler/python-voluptuous + - src-openeuler/python-vpoller + - src-openeuler/python-vulture + - src-openeuler/python-w3lib + - src-openeuler/python-wadllib + - src-openeuler/python-walkdir + - src-openeuler/python-warlock + - src-openeuler/python-watchdog + - src-openeuler/python-webassets + - src-openeuler/python-webcolors + - src-openeuler/python-websockets + - src-openeuler/python-websockify + - src-openeuler/python-webthing-ws + - src-openeuler/python-whichcraft + - src-openeuler/python-whisper + - src-openeuler/python-whitenoise + - src-openeuler/python-whois + - src-openeuler/python-wikipedia + - src-openeuler/python-wikitcms + - src-openeuler/python-winacl + - src-openeuler/python-winrm + - src-openeuler/python-wsproto + - src-openeuler/python-wrapt + - src-openeuler/python-wtf-peewee + - src-openeuler/python-wurlitzer + - src-openeuler/python-www-authenticate + - src-openeuler/python-wxnatpy + - src-openeuler/python-xarray + - src-openeuler/python-xcffib + - src-openeuler/python-xlib + - src-openeuler/python-xlrd + - src-openeuler/python-xlwt + - src-openeuler/python-xml2rfc + - src-openeuler/python-xmlrunner + - src-openeuler/python-xmltodict + - src-openeuler/python-xpath-expressions + - src-openeuler/python-xtermcolor + - src-openeuler/python-xunitparser + - src-openeuler/python-xvfbwrapper + - src-openeuler/python-xxhash + - src-openeuler/python-yamlordereddictloader + - src-openeuler/python-yaql + - src-openeuler/python-yara + - src-openeuler/python-yarg + - src-openeuler/python-yarl + - src-openeuler/python-yaspin + - src-openeuler/python-yaswfp + - src-openeuler/python-yattag + - src-openeuler/python-yubico + - src-openeuler/python-yubikey-manager + - src-openeuler/python-zabbix-api-erigones + - src-openeuler/python-zanata2fedmsg + - src-openeuler/python-zarr + - src-openeuler/python-zc.customdoctests + - src-openeuler/python-zdaemon + - src-openeuler/python-zipstream + - src-openeuler/python-zope.dottedname + - src-openeuler/python-zope.fixers + - src-openeuler/python-zope.i18n + - src-openeuler/python-zope.i18nmessageid + - src-openeuler/python-zope.testing + - src-openeuler/python-lightgbm + - src-openeuler/python-eli5 + - src-openeuler/python-blaze + - src-openeuler/python-Flask-Cors + - src-openeuler/python-odo + - src-openeuler/python-datashape + - src-openeuler/python-multipledispatch + - src-openeuler/python3-docs + - src-openeuler/python-concurrent-log-handler +- name: sig-release-management + repositories: + - src-openeuler/openEuler-lsb + - openeuler/openEuler-lsb + - openeuler/release-management +- name: xfce + repositories: + - src-openeuler/Thunar + - src-openeuler/catfish + - src-openeuler/exo + - src-openeuler/garcon + - src-openeuler/gigolo + - src-openeuler/hddtemp + - src-openeuler/libglademm24 + - src-openeuler/libgnomecanvasmm26 + - src-openeuler/libmpd + - src-openeuler/libxfce4ui + - src-openeuler/libxfce4util + - src-openeuler/lightdm + - src-openeuler/lightdm-gtk + - src-openeuler/lightdm-gtk-greeter + - src-openeuler/mousepad + - src-openeuler/orage + - src-openeuler/parole + - src-openeuler/python-distutils-extra + - src-openeuler/ristretto + - src-openeuler/thunar-archive-plugin + - src-openeuler/thunar-media-tags-plugin + - src-openeuler/thunar-vcs-plugin + - src-openeuler/thunar-volman + - src-openeuler/thunarx-python + - src-openeuler/tumbler + - src-openeuler/xarchiver + - src-openeuler/xfburn + - src-openeuler/xfce-polkit + - src-openeuler/xfce-theme-manager + - src-openeuler/xfce4-appfinder + - src-openeuler/xfce4-battery-plugin + - src-openeuler/xfce4-calculator-plugin + - src-openeuler/xfce4-clipman-plugin + - src-openeuler/xfce4-cpufreq-plugin + - src-openeuler/xfce4-cpugraph-plugin + - src-openeuler/xfce4-datetime-plugin + - src-openeuler/xfce4-dev-tools + - src-openeuler/xfce4-dict + - src-openeuler/xfce4-diskperf-plugin + - src-openeuler/xfce4-embed-plugin + - src-openeuler/xfce4-eyes-plugin + - src-openeuler/xfce4-fsguard-plugin + - src-openeuler/xfce4-genmon-plugin + - src-openeuler/xfce4-hardware-monitor-plugin + - src-openeuler/xfce4-mailwatch-plugin + - src-openeuler/xfce4-mount-plugin + - src-openeuler/xfce4-mpc-plugin + - src-openeuler/xfce4-netload-plugin + - src-openeuler/xfce4-notes-plugin + - src-openeuler/xfce4-notifyd + - src-openeuler/xfce4-panel + - src-openeuler/xfce4-panel-profiles + - src-openeuler/xfce4-places-plugin + - src-openeuler/xfce4-power-manager + - src-openeuler/xfce4-pulseaudio-plugin + - src-openeuler/xfce4-screensaver + - src-openeuler/xfce4-screenshooter + - src-openeuler/xfce4-sensors-plugin + - src-openeuler/xfce4-session + - src-openeuler/xfce4-settings + - src-openeuler/xfce4-smartbookmark-plugin + - src-openeuler/xfce4-statusnotifier-plugin + - src-openeuler/xfce4-systemload-plugin + - src-openeuler/xfce4-taskmanager + - src-openeuler/xfce4-terminal + - src-openeuler/xfce4-time-out-plugin + - src-openeuler/xfce4-timer-plugin + - src-openeuler/xfce4-vala + - src-openeuler/xfce4-verve-plugin + - src-openeuler/xfce4-volumed-pulse + - src-openeuler/xfce4-wavelan-plugin + - src-openeuler/xfce4-weather-plugin + - src-openeuler/xfce4-whiskermenu-plugin + - src-openeuler/xfce4-xkb-plugin + - src-openeuler/xfconf + - src-openeuler/xfdashboard + - src-openeuler/xfdesktop + - src-openeuler/xfwm4 +- name: GNOME + repositories: + - src-openeuler/gdlmm + - src-openeuler/libgdl + - src-openeuler/qgnomeplatform + - src-openeuler/gnome-control-center + - src-openeuler/gtk-doc + - src-openeuler/nautilus + - src-openeuler/mutter + - src-openeuler/libgnomekbd + - src-openeuler/libgnomecanvas + - src-openeuler/gnome-themes-standard + - src-openeuler/gnome-online-accounts + - src-openeuler/gnome-autoar + - src-openeuler/gnome-desktop3 + - src-openeuler/gnome-vfs2 + - src-openeuler/libgnome +- name: sig-desktop-apps + repositories: + - src-openeuler/vnpy + - src-openeuler/musescore + - src-openeuler/lilypond + - src-openeuler/uget + - src-openeuler/meld + - src-openeuler/thunderbird +- name: sig-DDE + repositories: + - src-openeuler/dde-control-center + - src-openeuler/blur-effect + - src-openeuler/dde-api + - src-openeuler/dde-calendar + - src-openeuler/dde-clipboard + - src-openeuler/dde-daemon + - src-openeuler/dde-dock + - src-openeuler/dde-file-manager + - src-openeuler/dde-introduction + - src-openeuler/deepin-kwin + - src-openeuler/dde-kwin + - src-openeuler/dde-launcher + - src-openeuler/dde-network-utils + - src-openeuler/dde-polkit-agent + - src-openeuler/dde-qt-dbus-factory + - src-openeuler/dde-session-shell + - src-openeuler/dde-session-ui + - src-openeuler/deepin-anything + - src-openeuler/deepin-compressor + - src-openeuler/deepin-desktop-base + - src-openeuler/deepin-desktop-schemas + - src-openeuler/deepin-devicemanager + - src-openeuler/deepin-editor + - src-openeuler/deepin-font-manager + - src-openeuler/deepin-gettext-tools + - src-openeuler/deepin-graphics-driver-manager + - src-openeuler/deepin-image-viewer + - src-openeuler/deepin-log-viewer + - src-openeuler/deepin-manual + - src-openeuler/deepin-menu + - src-openeuler/deepin-reader + - src-openeuler/deepin-shortcut-viewer + - src-openeuler/deepin-system-monitor + - src-openeuler/deepin-terminal + - src-openeuler/deepin-turbo + - src-openeuler/deepin-sound-theme + - src-openeuler/dtkcore + - src-openeuler/dtkcore2 + - src-openeuler/dtkgui + - src-openeuler/dtkwidget + - src-openeuler/dtkwidget2 + - src-openeuler/dtkwm + - src-openeuler/deepin-icon-theme + - src-openeuler/qt5integration + - src-openeuler/udisks2-qt5 + - src-openeuler/startdde + - src-openeuler/deepin-wallpapers + - src-openeuler/deepin-gtk-theme + - src-openeuler/dde-account-faces + - src-openeuler/dde-server-industry-config + - src-openeuler/dde-device-formatter + - src-openeuler/deepin-clone + - src-openeuler/deepin-dbus-generator + - src-openeuler/deepin-default-settings + - src-openeuler/deepin-gir-generator + - src-openeuler/deepin-qml-widgets + - src-openeuler/dde +- name: sig-high-performance-network + repositories: + - src-openeuler/dwarves + - src-openeuler/dpdk + - src-openeuler/rdma-core + - src-openeuler/libbpf + - src-openeuler/goebpf + - src-openeuler/xdp-tools + - src-openeuler/libvma + - src-openeuler/polycube + - src-openeuler/libkefir + - src-openeuler/cilium + - src-openeuler/katran + - src-openeuler/pistache + - src-openeuler/libyang + - src-openeuler/libtins + - src-openeuler/go-bindata + - src-openeuler/seastar +- name: sig-openstack + repositories: + - src-openeuler/openstack-nova + - src-openeuler/openstack-python-novaclient + - src-openeuler/openstack-neutron +- name: sig-wine + repositories: + - src-openeuler/wine +- name: sig-OS-Builder + repositories: + - src-openeuler/anaconda + - src-openeuler/anaconda-user-help + - src-openeuler/blivet-gui + - src-openeuler/cdrkit + - src-openeuler/dnf + - src-openeuler/dnf-plugins-core + - src-openeuler/libdnf + - src-openeuler/libsolv + - src-openeuler/efi-rpm-macros + - src-openeuler/efibootmgr + - src-openeuler/efivar + - src-openeuler/grub2 + - src-openeuler/ipxe + - src-openeuler/syslinux + - src-openeuler/lorax + - src-openeuler/python-blivet + - src-openeuler/uboot-tools + - src-openeuler/python-dasbus + - src-openeuler/oemaker + - openeuler/oemaker +- name: sig-Gatekeeper + repositories: + - openeuler/ci-bot + - openeuler/openeuler-jenkins + - openeuler/openeuler-obs +- name: sig-OKD + repositories: + - src-openeuler/moosefs + - src-openeuler/kubevirt + - src-openeuler/prometheus + - src-openeuler/node_exporter + - src-openeuler/etcd + - src-openeuler/alertmanager + - src-openeuler/quay + - src-openeuler/pulp + - src-openeuler/gvisor + - src-openeuler/cri-o + - src-openeuler/cri-tools + - src-openeuler/go-rpm-macros + - src-openeuler/go-srpm-macros + - src-openeuler/goversioninfo + - src-openeuler/openshift-ansible + - src-openeuler/origin +- name: sig-bootstrap + repositories: + - src-openeuler/bazel-bin +- name: sig-confidential-computing + repositories: + - src-openeuler/linux-sgx + - openeuler/secGear +- name: sig-Kubernetes + repositories: + - openeuler/kubekey +- name: sig-KDE + repositories: + - src-openeuler/kf5-attica + - src-openeuler/kf5-frameworkintegration + - src-openeuler/kf5-kactivities + - src-openeuler/kf5-kbookmarks + - src-openeuler/kf5-kcmutils + - src-openeuler/kf5-kcompletion + - src-openeuler/kf5-kcrash + - src-openeuler/kf5-kdbusaddons + - src-openeuler/kf5-kdeclarative + - src-openeuler/kf5-kded + - src-openeuler/kf5-kdelibs4support + - src-openeuler/kf5-kdesignerplugin + - src-openeuler/kf5-kdesu + - src-openeuler/kf5-kemoticons + - src-openeuler/kf5-kglobalaccel + - src-openeuler/kf5-kiconthemes + - src-openeuler/kf5-kinit + - src-openeuler/kf5-kio + - src-openeuler/kf5-kirigami2 + - src-openeuler/kf5-kitemmodels + - src-openeuler/kf5-kitemviews + - src-openeuler/kf5-kjobwidgets + - src-openeuler/kf5-knewstuff + - src-openeuler/kf5-knotifications + - src-openeuler/kf5-kpackage + - src-openeuler/kf5-kparts + - src-openeuler/kf5-kplotting + - src-openeuler/kf5-kpty + - src-openeuler/kf5-kservice + - src-openeuler/kf5-ktextwidgets + - src-openeuler/kf5-kunitconversion + - src-openeuler/kf5-kwallet + - src-openeuler/kf5-kxmlgui + - src-openeuler/kf5-networkmanager-qt + - src-openeuler/kf5-plasma + - src-openeuler/kf5-sonnet + - src-openeuler/kf5-syntax-highlighting + - src-openeuler/kf5-kdewebkit + - src-openeuler/kdecoration + - src-openeuler/kwin + - src-openeuler/plasma-breeze diff --git a/cve-python/tabletask/__init__.py b/cve-python/tabletask/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cve-python/tabletask/crawltask.py b/cve-python/tabletask/crawltask.py new file mode 100644 index 0000000..c22fb3e --- /dev/null +++ b/cve-python/tabletask/crawltask.py @@ -0,0 +1,114 @@ +# -*- coding: UTF-8 -*- +#爬虫封装 +import requests +from lxml import etree +from datetime import datetime +def crawling(url): + + try: + content=requests.get(url).content + except requests.exceptions.ConnectionError: + print('ConnectionError') + except requests.exceptions.ChunkedEncodingError: + print('ChunkedEncodingError') + except: + print('Unfortunitely -- An Unknow Error Happened') + html=etree.HTML(content) + try: + if html.xpath('/html/body/div[2]/div[2]/div/table/tr/td/div/div[1]/div[3]/div[2]/div[1]/div[2]/span/span/a/text()') == ["N/A"] or \ + html.xpath('/html/body/div[2]/div[2]/div/table/tr/td/div/div[1]/div[2]/div[2]/div[1]/div[2]/span/span/a/text()')==["N/A"] or \ + html.xpath('/html/body/div[2]/div[2]/div[2]/table/tr/td/div/div[1]/div[4]/div[2]/div[1]/div[2]/span/span/a/text()') == ['N/A']: + if html.xpath("/html/body/div[2]/div[2]/div/table/tr/td/div/div[1]/div[2]/div[3]/div[1]/div[2]/span/span/a/text()")==["N/A"]or \ + html.xpath("/html/body/div[2]/div[2]/div/table/tbody/tr/td/div/div[1]/div[2]/div[2]/div[1]/div[2]/span/span/a/text()")==["N/A"]: + # /html/body/div[2]/div[2]/div/table/tr/td/div/div[1]/div[2]/div[2]/div[1]/div[2]/span/span/a + nvdScore = cveLevel = cveDesc = repairTime = vectorValue = attackVector = accessVector = attackComplexity = accessComplexity = \ + privilegeRequired = userInteraction = scope = confidentiality = integrity = availability = authentication = None + print("此漏洞链接无数据") + else: + scoreType="v2.0" + element = html.xpath('//*[@id="nistV2MetricHidden"]/@value') + cveDesc = str(html.xpath('//*[@id="vulnDetailTableView"]/tr/td/div/div[1]/p[1]/text()')[0]) + repairTime = str(html.xpath('//*[@id="vulnDetailTableView"]/tr/td/div/div[2]/div/span[1]/text()')[0]) + # print(repairTime,type(repairTime)) + repairTime =datetime.strptime(repairTime,'%m/%d/%Y') + # print(repairTime) + # print(type(repairTime)) + html1 = etree.HTML(element[0]) + cveLevel = str(html1.xpath('//*[@data-testid="vuln-cvssv2-base-score-severity"]/text()')[0].strip()) + + nvdScore = str(html1.xpath('//*[@data-testid="vuln-cvssv2-base-score"]/text()')[0].strip()) + + vectorValue = str(html1.xpath('//*[@data-testid="vuln-cvssv2-vector"]/text()')[0]).replace("(","").replace(")","").strip() + + accessVector = str(html1.xpath('//*[@data-testid="vuln-cvssv2-av"]/text()')[0].strip()) + + accessComplexity = str(html1.xpath('//*[@data-testid="vuln-cvssv2-ac"]/text()')[0].strip()) + + authentication = str(html1.xpath('//*[@data-testid="vuln-cvssv2-au"]/text()')[0].strip()) + + confidentiality = str(html1.xpath('//*[@data-testid="vuln-cvssv3-c"]/text()')[0].strip()) + + integrity = str(html1.xpath('//*[@data-testid="vuln-cvssv2-i"]/text()')[0].strip()) + + availability = str(html1.xpath('//*[@data-testid="vuln-cvssv2-a"]/text()')[0].strip()) + + + + + attackVector=attackComplexity=privilegeRequired=userInteraction=scope=None + + + elif html.xpath('/html/body/div[2]/div[2]/div/table/tr/td/div/div[1]/div[3]/div[2]/div[1]/div[2]/span/span/a/text()') == []and \ + html.xpath('/html/body/div[2]/div[2]/div/table/tr/td/div/div[1]/div[2]/div[2]/div[1]/div[2]/span/span/a/text()')==[]: + nvdScore=cveLevel=cveDesc=repairTime=vectorValue=attackVector=accessVector=attackComplexity=accessComplexity= \ + privilegeRequired=userInteraction=scope=confidentiality=integrity=availability=authentication=scoreType=None + print("此漏洞链接not found") + else: + scoreType="v3.0" + cveDesc = str(html.xpath('//*[@id="vulnDetailTableView"]/tr/td/div/div[1]/p[1]/text()')[0]) + + repairTime = html.xpath('//*[@id="vulnDetailTableView"]/tr/td/div/div[2]/div/span[1]/text()')[0] + # print(repairTime,type(repairTime)) + repairTime =datetime.strptime(repairTime,'%m/%d/%Y') + # print(repairTime) + # print(type(repairTime)) + if html.xpath('//*[@id="nistV3MetricHidden"]/@value') != []: + element = html.xpath('//*[@id="nistV3MetricHidden"]/@value') + + else: + element = html.xpath('//*[@id="cnaV3MetricHidden"]/@value') + html1 = etree.HTML(element[0]) + cveLevel = str(html1.xpath('//*[@data-testid="vuln-cvssv3-base-score-severity"]/text()')[0].strip()) + + nvdScore = str(html1.xpath('//*[@data-testid="vuln-cvssv3-base-score"]/text()')[0].strip()) + + vectorValue = str(html1.xpath('//*[@data-testid="vuln-cvssv3-vector"]/text()')[0]).replace("(",'').replace(')','').strip() + + attackVector = str(html1.xpath('//*[@data-testid="vuln-cvssv3-av"]/text()')[0].strip()) + + attackComplexity = str(html1.xpath('//*[@data-testid="vuln-cvssv3-ac"]/text()')[0].strip()) + + privilegeRequired = str(html1.xpath('//*[@data-testid="vuln-cvssv3-pr"]/text()')[0].strip()) + + userInteraction = str(html1.xpath('//*[@data-testid="vuln-cvssv3-ui"]/text()')[0].strip()) + + scope = str(html1.xpath('//*[@data-testid="vuln-cvssv3-s"]/text()')[0].strip()) + + confidentiality = str(html1.xpath('//*[@data-testid="vuln-cvssv3-c"]/text()')[0].strip()) + + integrity = str(html1.xpath('//*[@data-testid="vuln-cvssv3-i"]/text()')[0].strip()) + + availability = str(html1.xpath('//*[@data-testid="vuln-cvssv3-a"]/text()')[0].strip()) + + + + accessVector=accessComplexity=authentication=None + except IndexError as e: + print("下标越界",e) + except UnboundLocalError as e: + print("未找到标签",e) + list = [nvdScore, cveLevel, cveDesc, repairTime, vectorValue, attackVector, accessVector, attackComplexity,accessComplexity, + privilegeRequired, userInteraction, scope, confidentiality, integrity, availability, authentication,scoreType] + + return list + diff --git a/cve-python/tabletask/exceltask.py b/cve-python/tabletask/exceltask.py new file mode 100644 index 0000000..2d656ea --- /dev/null +++ b/cve-python/tabletask/exceltask.py @@ -0,0 +1,124 @@ +# -*- coding: UTF-8 -*- +#读取excel表格内容 +import xlrd +import os +import shutil + + +#读取excel +#CVE评分 +from xlrd import XLRDError + + +# def crawlScore(): +# score=[] +# try: +# data = xlrd.open_workbook("./newexcels/a-l.rar.1599118583853.xlsx") +# table_one = data.sheet_by_name("漏洞报告") # 根据表名查找漏洞报告信息表 +# row_number = table_one.nrows # 获取所有数据的最大行数 +# for i in range(1, row_number): +# scoreOne =str(table_one.cell(i, 5).value) +# score.append(scoreOne) +# except IndexError as e: +# print("下标越界",e) +# except XLRDError as e: +# print("未找到漏洞报告table",e) +# except Exception as e: +# print("其他异常:",e) +# return score +#CVE地址 + +def crawlUrls(fileName): + urls=[] + try: + data=xlrd.open_workbook("./newexcels/"+fileName) + table_one=data.sheet_by_name("漏洞报告") #根据名称查找漏洞报告信息表 + row_number=table_one.nrows #获取所有数据的最大行数 + for i in range(1,row_number): + url="https://nvd.nist.gov/vuln/detail/"+str(table_one.cell(i,2).value) + urls.append(url) + except IndexError as e: + print("下标越界", e) + except XLRDError as e: + print("未找到漏洞报告table",e) + except Exception as e: + print("其他异常:", e) + return urls +#CVE编号 +def crawlCveNum(fileName): + cveNum=[] + try: + data=xlrd.open_workbook("./newexcels/"+fileName) + table_one=data.sheet_by_name("漏洞报告") #根据名称查找漏洞报告信息表 + row_number=table_one.nrows #获取所有数据的最大行数 + for i in range(1,row_number): + cveNumOne=str(table_one.cell(i,2).value) + cveNum.append(cveNumOne) + except IndexError as e: + print("下标越界", e) + except XLRDError as e: + print("未找到漏洞报告table",e) + except Exception as e: + print("其他异常:", e) + return cveNum +#CVE版本 +def crawlCveVersion(fileName): + cveVersion=[] + try: + data=xlrd.open_workbook("./newexcels/"+fileName) + table_one=data.sheet_by_name("漏洞报告") + row_number=table_one.nrows + for i in range(1,row_number): + cveVersionOne=table_one.cell(i,1).value + cveVersion.append(cveVersionOne) + except IndexError as e: + print("下标越界",e) + except XLRDError as e: + print("未找到漏洞报告table", e) + except Exception as e: + print("其他异常:", e) + return cveVersion +#CVE类型 +def crawlScopeType(fileName): + scopeType=[] + try: + data=xlrd.open_workbook("./newexcels/"+fileName) + table_one=data.sheet_by_name("漏洞报告") + row_number=table_one.nrows + for i in range(1,row_number): + scopeTypeOne = 'v' + str(table_one.cell(i, 4).value) + scopeType.append(scopeTypeOne) + except IndexError as e: + print("下标越界",e) + except XLRDError as e: + print("未找到漏洞报告table",e) + except Exception as e: + print("error:",e) + return scopeType +#Component +def crawlPackName(fileName): + packName = [] + try: + data = xlrd.open_workbook("./newexcels/"+fileName) + table_one = data.sheet_by_name("漏洞报告") + row_number = table_one.nrows # 获取所有数据的最大行数 + for i in range(1, row_number): + packNameOne = table_one.cell(i, 0).value + packName.append(packNameOne) + except IndexError as e: + print("下标越界",e) + except XLRDError as e: + print("未找到漏洞报告table",e) + except Exception as e: + print("error:",e) + return packName + + +#excel解析完成后调用函数移动到oldexcels文件夹备份 +def move_file(fileName): + try: + f_src=os.path.join("./newexcels/"+fileName) + f_dst=os.path.join("./oldexcels/"+fileName) + shutil.move(f_src,f_dst) + except Exception as e: + print("move error",e) diff --git a/cve-python/tabletask/runtask.py b/cve-python/tabletask/runtask.py new file mode 100644 index 0000000..d2d65e3 --- /dev/null +++ b/cve-python/tabletask/runtask.py @@ -0,0 +1,109 @@ +# -*- coding: UTF-8 -*- +# CVSS官网数据爬取 数据储存数据库 + + +from tabletask import exceltask,crawltask +from dbConnecttion.MysqlConn import Mysql +import time +import os + + + +def crawlWeb(): + mysql=Mysql() + path="./newexcels" + files=os.listdir(path) + if files: + for fileName in files: + cveNumList=exceltask.crawlCveNum(fileName) + urls=exceltask.crawlUrls(fileName) + cveVersionList=exceltask.crawlCveVersion(fileName) + # scopeTypeList=exceltask.crawlScopeType() + packNameList=exceltask.crawlPackName(fileName) + for i in range(0,len(urls)): + cveNum=str(cveNumList[i]).strip() + print(cveNum) + # 数据库查询结果 + sql = "select * from cve_origin_excel where cve_num= %s" + val = (cveNum,) + resultDict = mysql.getOne(sql, val) + + if resultDict: #判断CVE是否存在数据库 + + #爬虫网页数据 + crawlList=crawltask.crawling(urls[i]) + + #判断数据库类容是否为最新数据 + if resultDict["nvd_score"]!=None: + if str(resultDict["nvd_score"])==str(crawlList[0])and str(resultDict["vector_value"],encoding="utf-8")==str(crawlList[4]): + if resultDict['cve_status'] in [3,4,5]: + updateTime = str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + try: + sql = "update cve_origin_excel set nvd_score=%s,cve_level=%s,cve_desc=%s,repair_time=%s,vector_value=%s,attack_vector=%s,access_vector=%s," \ + "attack_complexity=%s,access_complexity=%s,privilege_required=%s,user_interaction=%s,scope=%s,confidentiality=%s,integrity=%s" \ + ",availability=%s,authentication=%s,cve_status=%s,update_time=%s where cve_num=%s" + val = ( + crawlList[0], crawlList[1], crawlList[2], crawlList[3], crawlList[4], crawlList[5], + crawlList[6], crawlList[7], crawlList[8], crawlList[9], + crawlList[10], crawlList[11], crawlList[12], crawlList[13], crawlList[14], + crawlList[15], 1, updateTime, cveNum) + mysql.update(sql, val) + mysql.dispose() + print("更新数据修改状态成功") + + except IndexError as e: + print("下标越界", e) + else: + print("数据库为最新数据") + else: + print("更新数据") + updateTime=str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + try: + sql="update cve_origin_excel set nvd_score=%s,cve_level=%s,cve_desc=%s,repair_time=%s,vector_value=%s,attack_vector=%s,access_vector=%s," \ + "attack_complexity=%s,access_complexity=%s,privilege_required=%s,user_interaction=%s,scope=%s,confidentiality=%s,integrity=%s" \ + ",availability=%s,authentication=%s,cve_status=%s,update_time=%s where cve_num=%s" + val=(crawlList[0],crawlList[1],crawlList[2],crawlList[3],crawlList[4],crawlList[5],crawlList[6],crawlList[7],crawlList[8],crawlList[9], + crawlList[10],crawlList[11],crawlList[12],crawlList[13],crawlList[14],crawlList[15],1,updateTime,cveNum) + mysql.update(sql,val) + mysql.dispose() + except IndexError as e: + print("下标越界",e) + + + + else: + print("数据库未发现数据,执行插入操作") + createTime=updateTime= str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + deleteTime=None + cveStatus=0 #状态0表示新建,1表示修改 + try: + cveUrl=str(urls[i]) + + cveVersion=str(cveVersionList[i]) + + packName=str(packNameList[i]) + + # scoreType = str(scopeTypeList[i].strip()) + #爬虫爬取数据列表 + list=crawltask.crawling(cveUrl) + + + + sql="INSERT INTO cve_origin_excel (cve_num,cve_url,cve_version,pack_name,score_type,nvd_score,cve_level,cve_desc,repair_time,vector_value,attack_vector," \ + "access_vector,attack_complexity,access_complexity,privilege_required,user_interaction,scope,confidentiality,integrity,availability,authentication,cve_status" \ + ",create_time,update_time,delete_time) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)" + val=(cveNum,cveUrl,cveVersion,packName,list[16],list[0],list[1],list[2],list[3],list[4],list[5],list[6],list[7],list[8],list[9],list[10],list[11],list[12],list[13], + list[14],list[15],cveStatus,createTime,updateTime,deleteTime) + + mysql.insertOne(sql,val) + mysql.dispose() + except IndexError as e: + print("下标越界",e) + exceltask.move_file(fileName) + else: + print("newexcels文件夹中无手动添加表") + return False + mysql.close() + + + diff --git a/cve-python/tabletask/test.py b/cve-python/tabletask/test.py new file mode 100644 index 0000000..2ef010b --- /dev/null +++ b/cve-python/tabletask/test.py @@ -0,0 +1,7 @@ +# -*- coding: UTF-8 -*- +# from tabletask import toexcel +import os +from tabletask import exceltask +fils=os.listdir("../newexcels") +for i in fils: + exceltask.move_file(i) \ No newline at end of file diff --git a/cve-python/tabletask/timedtask.py b/cve-python/tabletask/timedtask.py new file mode 100644 index 0000000..4732209 --- /dev/null +++ b/cve-python/tabletask/timedtask.py @@ -0,0 +1,31 @@ +# -*- coding: UTF-8 -*- +import sys +sys.path.append(r"D:\Users\Administrator\PycharmProjects\work") +import os +import schedule +import time +from tabletask import runtask,exceltask,toexcel + +def task(): + #判断newexcels中是否存在xlsx表格 + # while os.path.exists("../newexcels/b-l.rar.1599118583853.xlsx"): + flag=os.path.exists("../newexcels/a-l.rar.1599118583853.xlsx") + if flag: + + print("定时任务开始") + runtask.crawlWeb() + # #移动xlsx文件备份 + exceltask.move_file() + else: + print("excel文件不存在,手动加入excel文件") + ''' + 查询数据库cve_status的数据,并生成excel + 修改cve_status为3或者4的为5,表示已生成excel待处理 + ''' + toexcel.MysqlToExcel().generate_table() + toexcel.MysqlToExcel().update_status() +schedule.every().day.at("10:29").do(task) +while True: + schedule.run_pending() #run_pending:运行所有可以运行的任务 + time.sleep(1) #睡眠1秒 + diff --git a/cve-python/tabletask/toexcel.py b/cve-python/tabletask/toexcel.py new file mode 100644 index 0000000..e860744 --- /dev/null +++ b/cve-python/tabletask/toexcel.py @@ -0,0 +1,93 @@ +# -*- coding: UTF-8 -*- +import os +import xlwt +from dbConnecttion.MysqlConn import Mysql +class MysqlToExcel(object): + def __init__(self): + self.file_name= './problemexcels/data.xls' + def get_results(self): + mysql=Mysql() + sql="select * from cve_origin_excel where cve_status = 3 or cve_status=4 or cve_status=5 or cve_status=Null" + results=mysql.getMany(sql) + print(results) + + mysql.dispose() + mysql.close() + return results + + def generate_table(self): + #生成excel表格 + #文件已存在则删除 + if os.path.exists(self.file_name): + os.remove(self.file_name) + results=self.get_results() + if not results: + print("查询结果为空") + return False + #创建excel对象 + f=xlwt.Workbook() + sheet1=f.add_sheet('sheet1',cell_overwrite_ok=True) + #列字段 + column_names=['cve_id','cve_num','cve_url','cve_version','pack_name','score_type','nvd_score','cve_level','cve_desc', + 'repair_time','vector_value','attack_vector','access_vector','attack_complexity','access_complexity', + 'privilege_required','user_interaction','scope','confidentiality','integrity','availability', + 'authentication','cve_status','create_time','update_time','delete_time'] + #写第一行,列名 + for i in range(0,len(column_names)): + sheet1.write(0,i,column_names[i]) + #写多行 + num=0 + for i in results: + for key in i: + if type(i[key])==bytes: + i[key]=i[key].decode("utf-8") + + sheet1.write(num + 1, 0, i["cve_id"]) + sheet1.write(num + 1, 1, i["cve_num"]) + sheet1.write(num + 1, 2, i["cve_url"]) + sheet1.write(num + 1, 3, i["cve_version"]) + sheet1.write(num + 1, 4, i["pack_name"]) + sheet1.write(num + 1, 5, i["score_type"]) + sheet1.write(num + 1, 6, i["nvd_score"]) + sheet1.write(num + 1, 7, i["cve_level"]) + sheet1.write(num + 1, 8, i["cve_desc"]) + sheet1.write(num + 1, 9, i["repair_time"]) + sheet1.write(num + 1, 10, i["vector_value"]) + sheet1.write(num + 1, 11, i["attack_vector"]) + sheet1.write(num + 1, 12, i["access_vector"]) + sheet1.write(num + 1, 13, i["attack_complexity"]) + sheet1.write(num + 1, 14, i["access_complexity"]) + sheet1.write(num + 1, 15, i["privilege_required"]) + sheet1.write(num + 1, 16, i["user_interaction"]) + sheet1.write(num + 1, 17, i["scope"]) + sheet1.write(num + 1, 18, i["confidentiality"]) + sheet1.write(num + 1, 19, i["integrity"]) + sheet1.write(num + 1, 20, i["availability"]) + sheet1.write(num + 1, 21, i["authentication"]) + sheet1.write(num + 1, 22, i["cve_status"]) + if i['create_time']!=None: + sheet1.write(num + 1, 23, i["create_time"].strftime('%Y-%m-%d %H:%M:%S')) + else: + sheet1.write(num + 1, 23, i['create_time']) + if i["update_time"]!=None: + sheet1.write(num + 1, 24, i["update_time"].strftime('%Y-%m-%d %H:%M:%S')) + else: + sheet1.write(num + 1, 24, i["update_time"]) + if i["delete_time"] != None: + sheet1.write(num + 1, 25, i["delete_time"].strftime('%Y-%m-%d %H:%M:%S')) + else: + sheet1.write(num + 1, 25, i["delete_time"]) + num+=1 + #保存文件 + f.save(self.file_name) + #判断文件是否存在 + if not os.path.exists(self.file_name): + print("生成excel失败") + else: + print("生成excel成功") + #修改状态为3,4的为5表示已保存在excel中 + def update_status(self): + mysql=Mysql() + sql="update cve_origin_excel set cve_status=5 where cve_status=3 or cve_status=4" + mysql.update(sql) + mysql.dispose() diff --git a/cve-python/templates/index.html b/cve-python/templates/index.html new file mode 100644 index 0000000..1cbce03 --- /dev/null +++ b/cve-python/templates/index.html @@ -0,0 +1,10 @@ + + + + + Title + + +

hello world111

+ + \ No newline at end of file -- Gitee From ba5939064d0bdb82ed27f5cf4333cf15992d6c62 Mon Sep 17 00:00:00 2001 From: zhangjianjun_code <7844966+zhangjianjun_code@user.noreply.gitee.com> Date: Wed, 14 Oct 2020 17:04:02 +0800 Subject: [PATCH 5/5] 1. New python code; 2. Analysis of main functions to manually generate excel files and store them in the database for future use; 3. Feedback on wrong excel file emails --- Dockerfile | 6 +- controllers/packages.go | 2 + cve-python/.gitignore | 4 - cve-python/Dockerfile | 10 - cve-python/README.md | 37 - cve-python/controller/__init__.py | 0 cve-python/controller/gitwebcontroller.py | 8 - cve-python/controller/tablecontroller.py | 16 - cve-python/dbConnecttion/Config.py | 10 - cve-python/dbConnecttion/MysqlConn.py | 135 - cve-python/dbConnecttion/__init__.py | 0 cve-python/dbConnecttion/test.py | 9 - cve-python/emailtask/__init__.py | 0 cve-python/emailtask/sendemail.py | 20 - cve-python/gitwebtask/__init__.py | 0 cve-python/gitwebtask/genegroup.py | 86 - cve-python/gitwebtask/yamltask.py | 47 - cve-python/main.py | 29 - cve-python/problemexcels/data.xls | Bin 5632 -> 0 bytes cve-python/requirements.txt | 60 - cve-python/sigs.yaml | 7232 --------------------- cve-python/tabletask/__init__.py | 0 cve-python/tabletask/crawltask.py | 114 - cve-python/tabletask/exceltask.py | 124 - cve-python/tabletask/runtask.py | 109 - cve-python/tabletask/test.py | 7 - cve-python/tabletask/timedtask.py | 31 - cve-python/tabletask/toexcel.py | 93 - cve-python/templates/index.html | 10 - doc/sql/db_data.sql | 74 + doc/sql/db_struct.sql | 27 +- models/modeldb.go | 16 +- models/ymal.go | 8 + taskhandler/common.go | 9 +- taskhandler/yaml.go | 6 + 35 files changed, 142 insertions(+), 8197 deletions(-) delete mode 100644 cve-python/.gitignore delete mode 100644 cve-python/Dockerfile delete mode 100644 cve-python/README.md delete mode 100644 cve-python/controller/__init__.py delete mode 100644 cve-python/controller/gitwebcontroller.py delete mode 100644 cve-python/controller/tablecontroller.py delete mode 100644 cve-python/dbConnecttion/Config.py delete mode 100644 cve-python/dbConnecttion/MysqlConn.py delete mode 100644 cve-python/dbConnecttion/__init__.py delete mode 100644 cve-python/dbConnecttion/test.py delete mode 100644 cve-python/emailtask/__init__.py delete mode 100644 cve-python/emailtask/sendemail.py delete mode 100644 cve-python/gitwebtask/__init__.py delete mode 100644 cve-python/gitwebtask/genegroup.py delete mode 100644 cve-python/gitwebtask/yamltask.py delete mode 100644 cve-python/main.py delete mode 100644 cve-python/problemexcels/data.xls delete mode 100644 cve-python/requirements.txt delete mode 100644 cve-python/sigs.yaml delete mode 100644 cve-python/tabletask/__init__.py delete mode 100644 cve-python/tabletask/crawltask.py delete mode 100644 cve-python/tabletask/exceltask.py delete mode 100644 cve-python/tabletask/runtask.py delete mode 100644 cve-python/tabletask/test.py delete mode 100644 cve-python/tabletask/timedtask.py delete mode 100644 cve-python/tabletask/toexcel.py delete mode 100644 cve-python/templates/index.html create mode 100644 doc/sql/db_data.sql diff --git a/Dockerfile b/Dockerfile index b66da06..a242adb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,6 @@ -FROM centos +FROM centos:latest + +MAINTAINER TommyLike FROM library/golang @@ -16,7 +18,7 @@ ENTRYPOINT (cd $APP_DIR && ./\src\cve-manager) ADD . $APP_DIR # Compile the binary and statically link -RUN cd $APP_DIR && CGO_ENABLED=0 godep go build -ldflags '-d -w -s' +#RUN cd $APP_DIR && CGO_ENABLED=0 godep go build -ldflags '-d -w -s' EXPOSE 80 diff --git a/controllers/packages.go b/controllers/packages.go index a6f619f..444fff0 100644 --- a/controllers/packages.go +++ b/controllers/packages.go @@ -33,6 +33,7 @@ type PackageData struct { Version string `json:"version"` Release string `json:"release"` OriginUrl string `json:"url"` + CpeName string `json:"cpeName"` ReleaseTime string `json:"releaseTime"` LatestVersion string `json:"latestVersion"` LatestVersionTime string `json:"latestVersionTime"` @@ -152,6 +153,7 @@ func (u *PackagesController) Get() { pg.Id = g.GitId pg.Release = g.Release pg.Version = g.Version + pg.CpeName = g.CpePackName pg.LatestVersion = g.LatestVersion pg.LatestVersionTime = g.LatestVersionTime pg.Name = g.PackageName diff --git a/cve-python/.gitignore b/cve-python/.gitignore deleted file mode 100644 index 729dfe8..0000000 --- a/cve-python/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -.idea -__pycache__ -.gitee -venv \ No newline at end of file diff --git a/cve-python/Dockerfile b/cve-python/Dockerfile deleted file mode 100644 index 3ef97ae..0000000 --- a/cve-python/Dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -FROM ubuntu:latest - -MAINTAINER TommyLike -RUN set -ex && apt-get update -y && apt-get install -y python-pip python3.5-dev build-essential libpq-dev && mkdir -p /opt/app/ -#RUN apt-get update && apt-get install -y python-pip && mkdir -p /opt/app/ -RUN set -ex && ln -s /usr/bin/python3 /usr/bin/python && ln -s /usr/bin/pip3 /usr/bin/pip -COPY ./cve-python /opt/app - -WORKDIR /opt/app/cve-python -ENTRYPOINT ["python", "/opt/app/cve-python/main.py"] \ No newline at end of file diff --git a/cve-python/README.md b/cve-python/README.md deleted file mode 100644 index cc0c6e4..0000000 --- a/cve-python/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# cve-python - -#### 介绍 -处理人工cve数据 - -#### 软件架构 -软件架构说明 - - -#### 安装教程 - -1. xxxx -2. xxxx -3. xxxx - -#### 使用说明 - -1. xxxx -2. xxxx -3. xxxx - -#### 参与贡献 - -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 -4. 新建 Pull Request - - -#### 特技 - -1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md -2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) -3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 -4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 -5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) -6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/cve-python/controller/__init__.py b/cve-python/controller/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/cve-python/controller/gitwebcontroller.py b/cve-python/controller/gitwebcontroller.py deleted file mode 100644 index ab8795b..0000000 --- a/cve-python/controller/gitwebcontroller.py +++ /dev/null @@ -1,8 +0,0 @@ -# -*- coding: UTF-8 -*- -from gitwebtask import genegroup,yamltask - -def gwcontroller(): - print("查询数据库生成excel任务开始") - genegroup.Command().handle() - yamltask.task().download() - yamltask.task().read() \ No newline at end of file diff --git a/cve-python/controller/tablecontroller.py b/cve-python/controller/tablecontroller.py deleted file mode 100644 index ecc6380..0000000 --- a/cve-python/controller/tablecontroller.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: UTF-8 -*- -import sys -import os -from tabletask import runtask,exceltask,toexcel - -def toExcelController(): - - ''' - 查询数据库cve_status状态为3或4的数据,生成excel - 修改cve_status状态为3或4的状态为5,表示已加入excel待处理 - ''' - toexcel.MysqlToExcel().generate_table() - toexcel.MysqlToExcel().update_status() -def runTaskController(): - # 执行解析表格 爬取CVE官网数据 存入数据库 - runtask.crawlWeb() diff --git a/cve-python/dbConnecttion/Config.py b/cve-python/dbConnecttion/Config.py deleted file mode 100644 index 460fccf..0000000 --- a/cve-python/dbConnecttion/Config.py +++ /dev/null @@ -1,10 +0,0 @@ -#coding:utf-8 -''' -@author:xjh -''' -DBHOST="localhost" -DBPORT=3306 -DBUSER="root" -DBPWD="work123" -DBNAME="a_l" -DBCHAR="utf8" \ No newline at end of file diff --git a/cve-python/dbConnecttion/MysqlConn.py b/cve-python/dbConnecttion/MysqlConn.py deleted file mode 100644 index d40595a..0000000 --- a/cve-python/dbConnecttion/MysqlConn.py +++ /dev/null @@ -1,135 +0,0 @@ -# -*- coding: UTF-8 -*- -""" -Created on 2016年5月7日 - -@author: xjh -1、执行带参数的SQL时,请先用sql语句指定需要输入的条件列表,然后再用tuple/list进行条件批配 -2、在格式SQL中不需要使用引号指定数据类型,系统会根据输入参数自动识别 -3、在输入的值中不需要使用转意函数,系统会自动处理 -""" -import MySQLdb -from MySQLdb.cursors import DictCursor -from DBUtils.PooledDB import PooledDB -from dbConnecttion import Config - -class Mysql(object): - #连接池对象 - __pool=None - def __init__(self): - self.__conn=Mysql.__getConn() - self.__cursor=self.__conn.cursor() - - @staticmethod - def __getConn(): - """ - @summary:静态方法,从连接池中取出连接 - @return MySQLdb.connection - """ - if Mysql.__pool is None: - __pool=PooledDB(creator=MySQLdb,mincached=1,maxcached=20,host=Config.DBHOST,port=Config.DBPORT,user=Config.DBUSER, - passwd=Config.DBPWD,db=Config.DBNAME,use_unicode=False,charset=Config.DBCHAR,cursorclass=DictCursor) - return __pool.connection() - def getOne(self,sql,param=None): - """ - @summary: 执行查询,并取出第一条 - @param sql:查询SQL,如果有查询条件,请只指定条件列表,并将条件值使用参数[param]传递进来 - @param param: 可选参数,条件列表值(元组/列表) - @return: result list/boolean 查询到的结果集 - """ - if param is None: - count=self.__cursor.execute(sql) - else: - count=self.__cursor.execute(sql,param) - if count>0: - result=self.__cursor.fetchone() - else: - result=False - return result - - def getMany(self, sql, param=None): - """ - @summary: 执行查询,并取出num条结果 - @param sql:查询SQL,如果有查询条件,请只指定条件列表,并将条件值使用参数[param]传递进来 - - @param param: 可选参数,条件列表值(元组/列表) - @return: result list/boolean 查询到的结果集 - """ - if param is None: - count = self.__cursor.execute(sql) - else: - count = self.__cursor.execute(sql, param) - if count > 0: - result = self.__cursor.fetchall() - else: - result = False - return result - def insertOne(self,sql,value): - """ - @summary: 向数据表插入一条记录 - @param sql:要插入的SQL格式 - @param value:要插入的记录数据tuple/list - @return: insertId 受影响的行数 - """ - self.__cursor.execute(sql, value) - return self.__getInsertId() - - def __getInsertId(self): - """ - 获取当前连接最后一次插入操作生成的id,如果没有则为0 - """ - self.__cursor.execute("SELECT @@IDENTITY AS id") - result = self.__cursor.fetchall() - return result[0]['id'] - def __query(self,sql,param=None): - if param is None: - count=self.__cursor.execute(sql) - else: - count=self.__cursor.execute(sql,param) - return count - def update(self, sql, param=None): - """ - @summary: 更新数据表记录 - @param sql: SQL格式及条件,使用(%s,%s) - @param param: 要更新的 值 tuple/list - @return: count 受影响的行数 - """ - return self.__query(sql, param) - - def delete(self, sql, param=None): - """ - @summary: 删除数据表记录 - @param sql: SQL格式及条件,使用(%s,%s) - @param param: 要删除的条件 值 tuple/list - @return: count 受影响的行数 - """ - return self.__query(sql, param) - - def begin(self): - """ - @summary: 开启事务 - """ - self.__conn.autocommit(0) - - def end(self, option='commit'): - """ - @summary: 结束事务 - """ - if option == 'commit': - self.__conn.commit() - else: - self.__conn.rollback() - - def dispose(self, isEnd=1): - """ - @summary: 提交事务 - """ - if isEnd == 1: - self.end('commit') - else: - self.end('rollback') - def close(self): - """ - @summary: 关闭连接 - """ - self.__cursor.close() - self.__conn.close() \ No newline at end of file diff --git a/cve-python/dbConnecttion/__init__.py b/cve-python/dbConnecttion/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/cve-python/dbConnecttion/test.py b/cve-python/dbConnecttion/test.py deleted file mode 100644 index 08e9418..0000000 --- a/cve-python/dbConnecttion/test.py +++ /dev/null @@ -1,9 +0,0 @@ -# -*- coding: UTF-8 -*- -from dbConnecttion.MysqlConn import Mysql -from _sqlite3 import Row - -mysql=Mysql() -sql="select * from sites where name =%s" -val=("ss",) -result=mysql.getOne(sql,val) -print(str(result['name'],encoding="utf-8")) \ No newline at end of file diff --git a/cve-python/emailtask/__init__.py b/cve-python/emailtask/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/cve-python/emailtask/sendemail.py b/cve-python/emailtask/sendemail.py deleted file mode 100644 index bb3f978..0000000 --- a/cve-python/emailtask/sendemail.py +++ /dev/null @@ -1,20 +0,0 @@ -import smtplib -from email.mime.text import MIMEText -from email.mime.multipart import MIMEMultipart -from email.header import Header - -def send(): - sender="jhxiaoh@isoftstone.com" - receivers=["283750495@qq.com"] - #创建一个带附件的实例 - message=MIMEMultipart() - message['From']=Header('xjh','utf-8') - message['To']=Header("接收者",'utf-8') - subject='解析出错的excel数据提醒' - message['Subject']=Header(subject,'utf-8') - - #邮件正文类容 - message.attach(MIMEText("excel中录入的cve漏洞解析失败失败数据反馈,检查内容和格式,重新提交",'plain','utf-8')) - - #构造 - diff --git a/cve-python/gitwebtask/__init__.py b/cve-python/gitwebtask/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/cve-python/gitwebtask/genegroup.py b/cve-python/gitwebtask/genegroup.py deleted file mode 100644 index f1eed44..0000000 --- a/cve-python/gitwebtask/genegroup.py +++ /dev/null @@ -1,86 +0,0 @@ -# -*- coding: UTF-8 -*- -import requests -import lxml -import logging -from lxml.etree import HTML -from dbConnecttion.MysqlConn import Mysql -import time - - -class Command(): - logger = logging.getLogger('log') - - def handle(self): - mysql = Mysql() - url = 'https://gitee.com/openeuler/community/tree/master/sig' - try: - r = requests.get(url) - except requests.exceptions.ConnectionError: - print('ConnectionError') - except requests.exceptions.ChunkedEncodingError: - print('ChunkedEncodingError') - except: - print('Unfortunitely -- An Unknow Error Happened') - html = HTML(r.content) - assert isinstance(html, lxml.etree._Element) - sigs_list = [] - i = 3 - while True: - sig_name = html.xpath("//div[@id='tree-slider']/div[{}]/div[1]/a/@title".format(i))[0] - if sig_name == 'sigs.yaml': - break - sql="select * from cve_git_repo_groups where group_name = %s" - val=(sig_name,) - flag=mysql.getOne(sql,val) - if flag==False: - print("数据库无此条数据,执行插入操作") - sql="insert into cve_git_repo_groups (group_name) values (%s)" - val=(sig_name,) - mysql.insertOne(sql,val) - mysql.dispose() - - sig_page = html.xpath("//div[@id='tree-slider']/div[{}]/div[1]/a/@href".format(i))[0] - etherpad = 'https://etherpad.openeuler.org/p/{}-meetings'.format(sig_name) - # 获取所有sig的名称、首页和etherpad - sigs_list.append([sig_name, 'https://gitee.com' + sig_page, etherpad]) - i += 2 - sigs_list = sorted(sigs_list) - print(sigs_list) - for sig in sigs_list: - #获取group_id - sql="select group_id from cve_git_repo_groups where group_name = %s" - val=(sig[0],) - groupId=mysql.getOne(sql,val)["group_id"] - #删除cve_gite_repo_member里面的数据 - #根据groupId - sql1="delete from cve_gite_repo_member where group_id = %s" - val1=(groupId,) - mysql.delete(sql1,val1) - mysql.dispose() - # 获取owners - url = 'https://gitee.com/openeuler/community/blob/master/sig/{}/OWNERS'.format(sig[0]) - r = requests.get(url) - html = HTML(r.text) - assert isinstance(html, lxml.etree._Element) - res = html.xpath('//div[@class="line"]/text()') - owners = [] - for i in res[1:]: - maintainer = i.strip().split('-')[-1].strip() - createTime = str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) - sql="insert into cve_gite_repo_member (group_id,member_name,member_type,create_time) values (%s,%s,%s,%s)" - val=(groupId,maintainer,"Maintainer",createTime) - mysql.insertOne(sql,val) - mysql.dispose() - - owners.append(maintainer) - print(owners) - # owners = ','.join(owners) - # sig.append(owners) - # group_name = sig[0] - # home_page = sig[1] - # etherpad = sig[2] - # maillist = sig[3] - # irc = sig[4] - # owners = sig[5] - - mysql.close() diff --git a/cve-python/gitwebtask/yamltask.py b/cve-python/gitwebtask/yamltask.py deleted file mode 100644 index 7caa004..0000000 --- a/cve-python/gitwebtask/yamltask.py +++ /dev/null @@ -1,47 +0,0 @@ -# -*- coding: UTF-8 -*- -import yaml -import requests -from dbConnecttion.MysqlConn import Mysql -import time -import os -import logging - -class task(): - logger = logging.getLogger('log') - def download(self): - url="https://gitee.com/openeuler/community/raw/master/sig/sigs.yaml" - try: - r=requests.get(url) - except requests.exceptions.ConnectionError: - print('ConnectionError') - except requests.exceptions.ChunkedEncodingError: - print('ChunkedEncodingError') - except: - print('Unfortunitely -- An Unknow Error Happened') - with open ("sigs.yaml","wb") as code: - code.write(r.content) - def read(self): - mysql=Mysql() - if os.path.exists("sigs.yaml"): - with open("sigs.yaml","r") as f: - data=yaml.load(f) - print(data) - for sig in data['sigs']: - sql="select group_id from cve_git_repo_groups where group_name=%s" - val=(sig['name'],) - groupId=mysql.getOne(sql,val)['group_id'] - #根据group_id删除数据避免重复 - sql1="delete from cve_gite_repo where group_id = %s" - val1=(groupId,) - mysql.delete(sql1,val1) - mysql.dispose() - # print(groupId) - for p in sig["repositories"]: - orgPath=p[0:p.rfind("/")] - path=p[p.rfind("/"):][1:] - createTime = str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) - sql="insert into cve_gite_repo (group_id,org_path,path,status,create_time) values (%s,%s,%s,%s,%s)" - val=(groupId,orgPath,path,0,createTime) - mysql.insertOne(sql,val) - mysql.dispose() - mysql.close() diff --git a/cve-python/main.py b/cve-python/main.py deleted file mode 100644 index 0ba014d..0000000 --- a/cve-python/main.py +++ /dev/null @@ -1,29 +0,0 @@ -# This is a sample Python script. - -# Press Shift+F10 to execute it or replace it with your code. -# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings. -from controller import tablecontroller,gitwebcontroller -import schedule -import time - -def print_hi(name): - # Use a breakpoint in the code line below to debug your script. - print(f'Hi, {name}') # Press Ctrl+F8 to toggle the breakpoint. - - -# Press the green button in the gutter to run the script. -def run(): - tablecontroller.toExcelController() - # gitwebcontroller.gwcontroller() -def run1(): - tablecontroller.runTaskController() -if __name__ == '__main__': - -# schedule.every(2).seconds.do(run) -# schedule.every().day.at("17:09").do(run) - schedule.every().day.at("17:48").do(run1) - while True: - schedule.run_pending() #run_pending:运行所有可以运行的任务 - time.sleep(1) - -# See PyCharm help at https://www.jetbrains.com/help/pycharm/ diff --git a/cve-python/problemexcels/data.xls b/cve-python/problemexcels/data.xls deleted file mode 100644 index a32c7d78bdf6a1063adfa3a0f1355b8713efd245..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5632 zcmeI0OKjXk7{@=mNt(2IZJP8EpbUk+lYOPFnw8oll+qTZQ3#}<3TbidN#bVLUTp7% z^gv4=Mt?>35BA`mZS8qd!E zn}=t9-{%?EpI=K{zw%D^4O)^8(;E71p@|x5>>A2Vi@Kdqzp%h^@wX9Wm{!w&h(J># z9NAD$AGUn9mVL?ozCk*@UH1ucqVI4$LnUe=Su zmMqAq4&xj-b+k8|&K&H`^zYx7O%Y88LCMdhQlOZ0Y(Gd&xs_C_g#<;g_Tbe^>gFY3P$jA2~68a-L|&5w`D_rIqx}hSmb#)bKEhf4QEPPs6B2^ zO{*Jb)4dt|WktF_*O$qq57b)wMCL#)o6V*BZ+BFtuYZM(LXUGbZkUD}CZu%4q+53G z;)bFuy51bqn_==`n=cxLf(xc%79l81DEM;HbBl0=nJ+st`6(Hc46o>`9{!c)Hewo|@Eoqo;8EoxKcggOJ;sgZ8J`O_CCCq@VI z%5okSPJAS8=PipC=tb^<&VY{u&mwi>+M{~xRrv*OL-(k1x5_(lp5jE`G1?Us9=)jA zTvD|=aGySvz8u(DQ{IL0=;_1KNGomamexI)|TK5F3}{O=<5Xg%6% zuX6feVDVSO`OohV->N)(d#HVHXwlu>d*VLKoOyHPF6GU(1YL-F z@^cGPv0~mmv8v^*Bi5_Db;Np=w~km((CY|l=Aa|itGso@dV+f6F`0KVR?Hi_c+`)1 zr=gg)9`n`_=T+YPe}j;>ju@|U(-GrU-n@<~ZyhmS+p?Coju@}<))C_&ZyoVnjd5M^ z&crii-mJozGVjBB2ffR1X^^uhh5O5*TK!!m@J|uoy_dt2&o4f;_^jd+iq9qfu5$|) z|E{M0CxJ11z;W>zN6=Ax*x`>lbMX8hPaCOTTO`A=bf+{pfBMqkm9MnL?}gmtE53j2`d50hW!nF#`~MC#|5ncc diff --git a/cve-python/requirements.txt b/cve-python/requirements.txt deleted file mode 100644 index 633fae4..0000000 --- a/cve-python/requirements.txt +++ /dev/null @@ -1,60 +0,0 @@ -Automat==20.2.0 -DBUtils==1.3 -Flask==1.1.2 -Jinja2==2.11.2 -MarkupSafe==1.1.1 -Protego==0.1.16 -PyDispatcher==2.0.5 -PyHamcrest==2.0.2 -PyMySQL==0.10.0 -PyYAML==5.3.1 -Werkzeug==1.0.1 -aiocoap==0.3 -aiohttp==3.6.2 -async-timeout==3.0.1 -attrs==20.1.0 -beautifulsoup4==4.9.1 -certifi==2020.6.20 -cffi==1.14.2 -chardet==3.0.4 -click==7.1.2 -config==0.5.0.post0 -constantly==15.1.0 -cryptography==3.1 -cssselect==1.1.0 -hyperlink==20.0.1 -idna==2.10 -incremental==17.5.0 -itemadapter==0.1.0 -itemloaders==1.0.2 -itsdangerous==1.1.0 -jmespath==0.10.0 -lxml==4.5.2 -multidict==4.7.6 -mysql==0.0.2 -mysql-connector-python==8.0.21 -mysqlclient==2.0.1 -parsel==1.6.0 -pip==20.2.2 -protobuf==3.13.0 -psutil==5.7.2 -pyOpenSSL==19.1.0 -pyasn1==0.4.8 -pyasn1-modules==0.2.8 -pycparser==2.20 -queuelib==1.5.0 -requests==2.24.0 -resolver==0.2.1 -schedule==0.6.0 -selector==0.10.1 -service-identity==18.1.0 -setuptools==50.1.0 -sites==0.0.1 -six==1.15.0 -soupsieve==2.0.1 -urllib3==1.25.10 -w3lib==1.22.0 -xlrd==1.2.0 -xlwt==1.3.0 -yarl==1.5.1 -zope.interface==5.1.0 diff --git a/cve-python/sigs.yaml b/cve-python/sigs.yaml deleted file mode 100644 index 1784086..0000000 --- a/cve-python/sigs.yaml +++ /dev/null @@ -1,7232 +0,0 @@ -sigs: -- name: Infrastructure - repositories: - - openeuler/infrastructure - - openeuler/blog - - openeuler/website - - openeuler/go-gitee - - openeuler/gitbook-theme-hugo - - openeuler/tool-collections - - openeuler/cve-manager -- name: TC - repositories: - - openeuler/community -- name: doc - repositories: - - openeuler/docs -- name: sig-CICD - repositories: - - openeuler/compass-ci -- name: Application - repositories: - - openeuler/custom_build_tool - - src-openeuler/abrt - - src-openeuler/abrt-java-connector - - src-openeuler/alsa-utils - - src-openeuler/amanda - - src-openeuler/antlr-maven-plugin - - src-openeuler/antlr32 - - src-openeuler/apache-commons-collections - - src-openeuler/apache-commons-csv - - src-openeuler/apache-commons-daemon - - src-openeuler/apache-commons-dbcp - - src-openeuler/apache-commons-logging - - src-openeuler/apache-commons-pool - - src-openeuler/apache-commons-validator - - src-openeuler/apache-logging-parent - - src-openeuler/apache-mime4j - - src-openeuler/apache-mod_jk - - src-openeuler/apache-rat - - src-openeuler/apache-rpm-macros - - src-openeuler/aries-blueprint-core - - src-openeuler/aries-blueprint-parser - - src-openeuler/aries-proxy-api - - src-openeuler/aspell - - src-openeuler/aspell-en - - src-openeuler/avro - - src-openeuler/boilerpipe - - src-openeuler/brasero - - src-openeuler/bwa - - src-openeuler/cdrdao - - src-openeuler/cjose - - src-openeuler/cli-parser - - src-openeuler/codegen - - src-openeuler/coffee-script - - src-openeuler/compface - - src-openeuler/compress-lzf - - src-openeuler/console-setup - - src-openeuler/convmv - - src-openeuler/cookxml - - src-openeuler/culmus-fonts - - src-openeuler/custom_build_tool - - src-openeuler/dblatex - - src-openeuler/dcraw - - src-openeuler/decentxml - - src-openeuler/discount - - src-openeuler/dleyna-server - - src-openeuler/dlm - - src-openeuler/dnssec-trigger - - src-openeuler/docbook-style-dsssl - - src-openeuler/docbook-utils - - src-openeuler/docbook2X - - src-openeuler/docbook5-style-xsl - - src-openeuler/dovecot - - src-openeuler/doxygen - - src-openeuler/dump - - src-openeuler/elinks - - src-openeuler/elixir - - src-openeuler/enscript - - src-openeuler/eog - - src-openeuler/erlang-protobuffs - - src-openeuler/erlang-rebar - - src-openeuler/esc - - src-openeuler/evince - - src-openeuler/faust - - src-openeuler/fdupes - - src-openeuler/felix-gogo-runtime - - src-openeuler/felix-gogo-shell - - src-openeuler/felix-scr-annotations - - src-openeuler/felix-scr-generator - - src-openeuler/fetchmail - - src-openeuler/file-roller - - src-openeuler/fio - - src-openeuler/firefox - - src-openeuler/fmpp - - src-openeuler/fontforge - - src-openeuler/fonts-tweak-tool - - src-openeuler/forbidden-apis - - src-openeuler/forge-parent - - src-openeuler/freerdp - - src-openeuler/genwqe-tools - - src-openeuler/geronimo-parent-poms - - src-openeuler/gfbgraph - - src-openeuler/gl-manpages - - src-openeuler/glog - - src-openeuler/gmetric4j - - src-openeuler/gnome-calculator - - src-openeuler/gnome-desktop - - src-openeuler/gnome-online-miners - - src-openeuler/gnupg - - src-openeuler/gnuplot - - src-openeuler/google-crosextra-carlito-fonts - - src-openeuler/grafana - - src-openeuler/GraphicsMagick - - src-openeuler/grilo-plugins - - src-openeuler/gromacs - - src-openeuler/gshhg-gmt-nc4 - - src-openeuler/gstreamer - - src-openeuler/gstreamer-plugins-base - - src-openeuler/gstreamer-plugins-good - - src-openeuler/gyp - - src-openeuler/hazelcast - - src-openeuler/HdrHistogram - - src-openeuler/hspell - - src-openeuler/hsqldb1 - - src-openeuler/httpcomponents-asyncclient - - src-openeuler/hunspell-ak - - src-openeuler/hunspell-am - - src-openeuler/hunspell-ar - - src-openeuler/hunspell-as - - src-openeuler/hunspell-ast - - src-openeuler/hunspell-az - - src-openeuler/hunspell-be - - src-openeuler/hunspell-ber - - src-openeuler/hunspell-bg - - src-openeuler/hunspell-bn - - src-openeuler/hunspell-br - - src-openeuler/hunspell-ca - - src-openeuler/hunspell-cop - - src-openeuler/hunspell-csb - - src-openeuler/hunspell-cv - - src-openeuler/hunspell-cy - - src-openeuler/hunspell-da - - src-openeuler/hunspell-de - - src-openeuler/hunspell-dsb - - src-openeuler/hunspell-el - - src-openeuler/hunspell-eo - - src-openeuler/hunspell-es - - src-openeuler/hunspell-et - - src-openeuler/hunspell-eu - - src-openeuler/hunspell-fa - - src-openeuler/hunspell-fj - - src-openeuler/hunspell-fo - - src-openeuler/hunspell-fr - - src-openeuler/hunspell-fur - - src-openeuler/hunspell-fy - - src-openeuler/hunspell-ga - - src-openeuler/hunspell-gd - - src-openeuler/hunspell-gl - - src-openeuler/hunspell-grc - - src-openeuler/hunspell-gu - - src-openeuler/hunspell-gv - - src-openeuler/hunspell-haw - - src-openeuler/hunspell-hil - - src-openeuler/hunspell-hr - - src-openeuler/hunspell-hsb - - src-openeuler/hunspell-ht - - src-openeuler/hunspell-hu - - src-openeuler/hunspell-hy - - src-openeuler/hunspell-ia - - src-openeuler/hunspell-id - - src-openeuler/hunspell-is - - src-openeuler/hunspell-it - - src-openeuler/hunspell-kk - - src-openeuler/hunspell-km - - src-openeuler/hunspell-kn - - src-openeuler/hunspell-ko - - src-openeuler/hunspell-ku - - src-openeuler/hunspell-ky - - src-openeuler/hunspell-la - - src-openeuler/hunspell-lb - - src-openeuler/hunspell-ln - - src-openeuler/hunspell-lt - - src-openeuler/hunspell-mai - - src-openeuler/hunspell-mg - - src-openeuler/hunspell-mi - - src-openeuler/hunspell-mk - - src-openeuler/hunspell-ml - - src-openeuler/hunspell-mn - - src-openeuler/hunspell-mos - - src-openeuler/hunspell-mr - - src-openeuler/hunspell-ms - - src-openeuler/hunspell-mt - - src-openeuler/hunspell-nds - - src-openeuler/hunspell-ne - - src-openeuler/hunspell-nl - - src-openeuler/hunspell-no - - src-openeuler/hunspell-nr - - src-openeuler/hunspell-nso - - src-openeuler/hunspell-ny - - src-openeuler/hunspell-oc - - src-openeuler/hunspell-om - - src-openeuler/hunspell-or - - src-openeuler/hunspell-pa - - src-openeuler/hunspell-pl - - src-openeuler/hunspell-pt - - src-openeuler/hunspell-qu - - src-openeuler/hunspell-ro - - src-openeuler/hunspell-ru - - src-openeuler/hunspell-rw - - src-openeuler/hunspell-sc - - src-openeuler/hunspell-se - - src-openeuler/hunspell-si - - src-openeuler/hunspell-sk - - src-openeuler/hunspell-sl - - src-openeuler/hunspell-smj - - src-openeuler/hunspell-so - - src-openeuler/hunspell-sq - - src-openeuler/hunspell-sr - - src-openeuler/hunspell-ss - - src-openeuler/hunspell-st - - src-openeuler/hunspell-sv - - src-openeuler/hunspell-sw - - src-openeuler/hunspell-ta - - src-openeuler/hunspell-te - - src-openeuler/hunspell-tet - - src-openeuler/hunspell-th - - src-openeuler/hunspell-ti - - src-openeuler/hunspell-tl - - src-openeuler/hunspell-tn - - src-openeuler/hunspell-tpi - - src-openeuler/hunspell-ts - - src-openeuler/hunspell-uk - - src-openeuler/hunspell-ur - - src-openeuler/hunspell-uz - - src-openeuler/hunspell-ve - - src-openeuler/hunspell-vi - - src-openeuler/hunspell-wa - - src-openeuler/hunspell-xh - - src-openeuler/hunspell-yi - - src-openeuler/hunspell-zu - - src-openeuler/hwloc - - src-openeuler/hyphen - - src-openeuler/hyphen-as - - src-openeuler/hyphen-bg - - src-openeuler/hyphen-bn - - src-openeuler/hyphen-ca - - src-openeuler/hyphen-cy - - src-openeuler/hyphen-da - - src-openeuler/hyphen-de - - src-openeuler/hyphen-el - - src-openeuler/hyphen-es - - src-openeuler/hyphen-eu - - src-openeuler/hyphen-fa - - src-openeuler/hyphen-fo - - src-openeuler/hyphen-fr - - src-openeuler/hyphen-ga - - src-openeuler/hyphen-gl - - src-openeuler/hyphen-gu - - src-openeuler/hyphen-hi - - src-openeuler/hyphen-hsb - - src-openeuler/hyphen-ia - - src-openeuler/hyphen-id - - src-openeuler/hyphen-is - - src-openeuler/hyphen-it - - src-openeuler/hyphen-kn - - src-openeuler/hyphen-ku - - src-openeuler/hyphen-lt - - src-openeuler/hyphen-ml - - src-openeuler/hyphen-mn - - src-openeuler/hyphen-mr - - src-openeuler/hyphen-nl - - src-openeuler/hyphen-or - - src-openeuler/hyphen-pa - - src-openeuler/hyphen-pl - - src-openeuler/hyphen-pt - - src-openeuler/hyphen-ro - - src-openeuler/hyphen-ru - - src-openeuler/hyphen-sa - - src-openeuler/hyphen-sk - - src-openeuler/hyphen-sl - - src-openeuler/hyphen-sv - - src-openeuler/hyphen-ta - - src-openeuler/hyphen-te - - src-openeuler/hyphen-tk - - src-openeuler/hyphen-uk - - src-openeuler/ibus-table-chinese - - src-openeuler/icc-profiles-openicc - - src-openeuler/idm-console-framework - - src-openeuler/iio-sensor-proxy - - src-openeuler/indent - - src-openeuler/infiniband-diags - - src-openeuler/iperf2 - - src-openeuler/iperf3 - - src-openeuler/irssi - - src-openeuler/java-atk-wrapper - - src-openeuler/javamail - - src-openeuler/jboss-jms-2.0-api - - src-openeuler/jdepend - - src-openeuler/jedis - - src-openeuler/jpegoptim - - src-openeuler/jsch - - src-openeuler/json_simple - - src-openeuler/jsonp - - src-openeuler/jss - - src-openeuler/jzlib - - src-openeuler/kim-api - - src-openeuler/kohsuke-pom - - src-openeuler/libabigail - - src-openeuler/libaec - - src-openeuler/libapr1 - - src-openeuler/libdmapsharing - - src-openeuler/libdvdnav - - src-openeuler/libdvdread - - src-openeuler/libeasyfc - - src-openeuler/libgadu - - src-openeuler/liblockfile - - src-openeuler/liblouis - - src-openeuler/libmicrohttpd - - src-openeuler/libmikmod - - src-openeuler/libmpeg2 - - src-openeuler/libmtp - - src-openeuler/libmusicbrainz5 - - src-openeuler/libtcnative - - src-openeuler/libvpx - - src-openeuler/libwbxml - - src-openeuler/libyami - - src-openeuler/linkchecker - - src-openeuler/linuxconsoletools - - src-openeuler/linuxdoc-tools - - src-openeuler/linuxptp - - src-openeuler/lksctp-tools - - src-openeuler/lmfit - - src-openeuler/log4j12 - - src-openeuler/lohit-assamese-fonts - - src-openeuler/lohit-bengali-fonts - - src-openeuler/lohit-devanagari-fonts - - src-openeuler/lohit-gujarati-fonts - - src-openeuler/lohit-kannada-fonts - - src-openeuler/lohit-malayalam-fonts - - src-openeuler/lohit-marathi-fonts - - src-openeuler/lohit-nepali-fonts - - src-openeuler/lohit-tamil-fonts - - src-openeuler/lohit-telugu-fonts - - src-openeuler/lpg - - src-openeuler/lrzsz - - src-openeuler/lsyncd - - src-openeuler/lynx - - src-openeuler/mailman - - src-openeuler/mc - - src-openeuler/media-player-info - - src-openeuler/memcached - - src-openeuler/metadata-extractor2 - - src-openeuler/mikmod - - src-openeuler/mina-ftpserver - - src-openeuler/mod_intercept_form_submit - - src-openeuler/mod_lookup_identity - - src-openeuler/mousetweaks - - src-openeuler/mrtg - - src-openeuler/msv - - src-openeuler/munge - - src-openeuler/mutt - - src-openeuler/mythes - - src-openeuler/nano - - src-openeuler/netpbm - - src-openeuler/nss-altfiles - - src-openeuler/nss-mdns - - src-openeuler/nss_wrapper - - src-openeuler/ntfs-3g - - src-openeuler/objectweb-asm - - src-openeuler/oldstandard-sfd-fonts - - src-openeuler/openal-soft - - src-openeuler/openjade - - src-openeuler/openmpi - - src-openeuler/opennlp - - src-openeuler/openoffice-lv - - src-openeuler/openoffice.org-dict-cs_CZ - - src-openeuler/opensm - - src-openeuler/opensp - - src-openeuler/opentest4j - - src-openeuler/openvpn - - src-openeuler/pam_krb5 - - src-openeuler/paps - - src-openeuler/patchutils - - src-openeuler/pavucontrol - - src-openeuler/pax - - src-openeuler/pbzip2 - - src-openeuler/pcp - - src-openeuler/perftest - - src-openeuler/perl-B-Lint - - src-openeuler/perl-Pod-LaTeX - - src-openeuler/pesign - - src-openeuler/pidgin - - src-openeuler/pki-core - - src-openeuler/pngquant - - src-openeuler/pnm2ppa - - src-openeuler/po4a - - src-openeuler/pptp - - src-openeuler/prelink - - src-openeuler/psacct - - src-openeuler/psutils - - src-openeuler/pylint - - src-openeuler/qperf - - src-openeuler/R-language - - src-openeuler/rabbitmq-server - - src-openeuler/rasqal - - src-openeuler/rdate - - src-openeuler/redis-protocol - - src-openeuler/regexp - - src-openeuler/rhythmbox - - src-openeuler/rngom - - src-openeuler/rpcsvc-proto - - src-openeuler/rrdtool - - src-openeuler/rubygem-kramdown - - src-openeuler/sane-frontends - - src-openeuler/scrub - - src-openeuler/skkdic - - src-openeuler/slapi-nis - - src-openeuler/snapd-glib - - src-openeuler/socat - - src-openeuler/soundtouch - - src-openeuler/spamassassin - - src-openeuler/spec-version-maven-plugin - - src-openeuler/strongswan - - src-openeuler/stunnel - - src-openeuler/t-digest - - src-openeuler/targetcli - - src-openeuler/tboot - - src-openeuler/testng - - src-openeuler/tex-fonts-hebrew - - src-openeuler/texi2html - - src-openeuler/texlive - - src-openeuler/texlive-base - - src-openeuler/three-eight-nine-ds-base - - src-openeuler/tomcat - - src-openeuler/tomcat-taglibs-standard - - src-openeuler/torque - - src-openeuler/tpm-quote-tools - - src-openeuler/tpm-tools - - src-openeuler/transfig - - src-openeuler/tre - - src-openeuler/ttmkfdir - - src-openeuler/uid_wrapper - - src-openeuler/units - - src-openeuler/unrtf - - src-openeuler/usb_modeswitch-data - - src-openeuler/usbguard - - src-openeuler/uwsgi - - src-openeuler/vinagre - - src-openeuler/vorbis-tools - - src-openeuler/voroplusplus - - src-openeuler/vte - - src-openeuler/wavpack - - src-openeuler/wayland-protocols - - src-openeuler/web-assets - - src-openeuler/weechat - - src-openeuler/weston - - src-openeuler/wireshark - - src-openeuler/wmctrl - - src-openeuler/xapps - - src-openeuler/xdg-dbus-proxy - - src-openeuler/xdg-desktop-portal-gtk - - src-openeuler/xml-commons-apis - - src-openeuler/XmlSchema - - src-openeuler/xmlstreambuffer - - src-openeuler/xmltoman - - src-openeuler/xmltool - - src-openeuler/xmms - - src-openeuler/xsane - - src-openeuler/xz-java - - src-openeuler/yelp-tools -- name: Programming-language - repositories: - - src-openeuler/assertj-core - - src-openeuler/cinnamon-translations - - src-openeuler/gmavenplus-plugin - - src-openeuler/jboss-el - - src-openeuler/spock - - src-openeuler/mockito - - src-openeuler/keepalived - - src-openeuler/ndisc6 - - src-openeuler/perl-Module-Install-ReadmeFromPod - - src-openeuler/perl-Module-Install-ReadmeMarkdownFromPod - - src-openeuler/perl-Module-Install-Repository - - src-openeuler/perl-Module-Manifest-Skip - - src-openeuler/perl-Module-Package - - src-openeuler/perl-Module-Package-Au - - src-openeuler/perl-Module-ScanDeps - - src-openeuler/perl-Moo - - src-openeuler/perl-Path-Class - - src-openeuler/perl-Role-Tiny - - src-openeuler/perl-strictures - - src-openeuler/libimagequant - - src-openeuler/perl-Crypt-OpenSSL-Random - - src-openeuler/python-psutil - - src-openeuler/perl-NTLM - - src-openeuler/python-entrypoints - - src-openeuler/gnu-efi - - src-openeuler/libzip - - src-openeuler/libdwarf - - src-openeuler/ltrace - - src-openeuler/python-which - - src-openeuler/perl-Software-License - - src-openeuler/xcb-util-keysyms - - src-openeuler/xcb-util-cursor - - src-openeuler/autoconf213 - - src-openeuler/perl-Pod-Markdown - - src-openeuler/gperf - - src-openeuler/xdelta - - src-openeuler/python-iso8601 - - src-openeuler/python-sphinx-theme-alabaster - - src-openeuler/perl-Sub-Install - - src-openeuler/enchant2 - - src-openeuler/perl-Capture-Tiny - - src-openeuler/gssdp - - src-openeuler/uuid - - src-openeuler/mpich - - src-openeuler/python-attrs - - src-openeuler/perl-SGMLSpm - - src-openeuler/librelp - - src-openeuler/python-imagesize - - src-openeuler/perl-Path-Tiny - - src-openeuler/python-paramiko - - src-openeuler/python-sphinx - - src-openeuler/nvml - - src-openeuler/python-virtualenv - - src-openeuler/python-configparser - - src-openeuler/perl-Config-AutoConf - - src-openeuler/xorg-x11-proto-devel - - src-openeuler/qt5-qtwebsockets - - src-openeuler/perl-WWW-RobotRules - - src-openeuler/python-pluggy - - src-openeuler/qt5-qtsensors - - src-openeuler/python-funcsigs - - src-openeuler/pywbem - - src-openeuler/qt5-qtquickcontrols - - src-openeuler/libuv - - src-openeuler/qt5-qtx11extras - - src-openeuler/perl-Data-UUID - - src-openeuler/python-traceback2 - - src-openeuler/perl-Text-Unidecode - - src-openeuler/dotconf - - src-openeuler/python-scons - - src-openeuler/perl-YAML-Tiny - - src-openeuler/mallard-rng - - src-openeuler/itstool - - src-openeuler/crash-gcore-command - - src-openeuler/intel-cmt-cat - - src-openeuler/qt5-qtdeclarative - - src-openeuler/qt5-qtquickcontrols2 - - src-openeuler/byacc - - src-openeuler/numpy - - src-openeuler/python-enchant - - src-openeuler/rpmlint - - src-openeuler/perl-HTTP-Message - - src-openeuler/libindicator - - src-openeuler/libappstream-glib - - src-openeuler/iowatcher - - src-openeuler/python-wheel - - src-openeuler/perl-NetAddr-IP - - src-openeuler/cppunit - - src-openeuler/perl-Authen-SASL - - src-openeuler/libpfm - - src-openeuler/python-pyasn1 - - src-openeuler/perl-LWP-MediaTypes - - src-openeuler/perl-Try-Tiny - - src-openeuler/perl-gettext - - src-openeuler/perl-Date-Calc - - src-openeuler/python-unittest2 - - src-openeuler/check - - src-openeuler/tix - - src-openeuler/python-dns - - src-openeuler/python-atomicwrites - - src-openeuler/perl-IO-Socket-INET6 - - src-openeuler/cmocka - - src-openeuler/qt5-qtxmlpatterns - - src-openeuler/perl-IO-HTML - - src-openeuler/ninja-build - - src-openeuler/socket_wrapper - - src-openeuler/perl-Module-Build - - src-openeuler/pygobject2 - - src-openeuler/lua-posix - - src-openeuler/python-snowballstemmer - - src-openeuler/lua-lunit - - src-openeuler/qt5-qtconnectivity - - src-openeuler/qt5-qtsvg - - src-openeuler/vte291 - - src-openeuler/python-cryptography-vectors - - src-openeuler/python-lit - - src-openeuler/xcb-util-renderutil - - src-openeuler/jimtcl - - src-openeuler/perl-MailTools - - src-openeuler/python-pygments - - src-openeuler/perl-JSON - - src-openeuler/python-itsdangerous - - src-openeuler/cscope - - src-openeuler/perl-LWP-Protocol-https - - src-openeuler/ilmbase - - src-openeuler/perl-Crypt-OpenSSL-RSA - - src-openeuler/libstemmer - - src-openeuler/perl-File-Listing - - src-openeuler/ocaml - - src-openeuler/pygtk2 - - src-openeuler/python-urwid - - src-openeuler/python-linecache2 - - src-openeuler/gupnp - - src-openeuler/python-docutils - - src-openeuler/perl-inc-latest - - src-openeuler/fakeroot - - src-openeuler/qt5-qtdoc - - src-openeuler/perl-MRO-Compat - - src-openeuler/perl-String-ShellQuote - - src-openeuler/python-extras - - src-openeuler/python-mimeparse - - src-openeuler/perl-TimeDate - - src-openeuler/rhnlib - - src-openeuler/perl-XML-Simple - - src-openeuler/perl-XML-LibXML - - src-openeuler/subunit - - src-openeuler/scipy - - src-openeuler/SDL - - src-openeuler/perl-generators - - src-openeuler/perl-Test-Pod - - src-openeuler/neon - - src-openeuler/python-fonttools - - src-openeuler/lapack - - src-openeuler/libdbusmenu - - src-openeuler/python-netaddr - - src-openeuler/perl-Bit-Vector - - src-openeuler/gflags - - src-openeuler/perl-libxml-perl - - src-openeuler/intltool - - src-openeuler/python-sphinxcontrib-websupport - - src-openeuler/perl-Params-Util - - src-openeuler/qt5-qttools - - src-openeuler/autoconf-archive - - src-openeuler/python-cups - - src-openeuler/gupnp-igd - - src-openeuler/perl-IO-String - - src-openeuler/perl-Net-HTTP - - src-openeuler/python-click - - src-openeuler/python-sure - - src-openeuler/python-backports_abc - - src-openeuler/perl-HTTP-Date - - src-openeuler/python-fixtures - - src-openeuler/obs-env - - src-openeuler/libspectre - - src-openeuler/perl-HTTP-Negotiate - - src-openeuler/vala - - src-openeuler/eglexternalplatform - - src-openeuler/python-genshi - - src-openeuler/gstreamer1-plugins-bad-free - - src-openeuler/python-blinker - - src-openeuler/xcb-util-wm - - src-openeuler/qt5-qttranslations - - src-openeuler/PyYAML - - src-openeuler/python-keyring - - src-openeuler/go-compilers - - src-openeuler/python-futures - - src-openeuler/perl-Test-Deep - - src-openeuler/perl-Text-CharWidth - - src-openeuler/perl-Devel-CheckLib - - src-openeuler/python-whoosh - - src-openeuler/qt5-qtwayland - - src-openeuler/perl-Module-Runtime - - src-openeuler/mvapich2 - - src-openeuler/python-more-itertools - - src-openeuler/perl-Data-OptList - - src-openeuler/crash-trace-command - - src-openeuler/perl-File-Slurp - - src-openeuler/python-py - - src-openeuler/perl-Test-Warnings - - src-openeuler/perl-Date-Manip - - src-openeuler/libdv - - src-openeuler/python-sqlalchemy - - src-openeuler/qt5-qtmultimedia - - src-openeuler/gnome-user-docs - - src-openeuler/meanwhile - - src-openeuler/qt5-qtcanvas3d - - src-openeuler/perl-XML-SAX - - src-openeuler/python-singledispatch - - src-openeuler/pyxdg - - src-openeuler/perl-Unicode-UTF8 - - src-openeuler/perl-XML-SAX-Base - - src-openeuler/python-pretend - - src-openeuler/libXScrnSaver - - src-openeuler/perl-Archive-Zip - - src-openeuler/perl-Text-WrapI18N - - src-openeuler/pytest - - src-openeuler/swig - - src-openeuler/lua-filesystem - - src-openeuler/perl-XML-XPath - - src-openeuler/pyflakes - - src-openeuler/dejagnu - - src-openeuler/python-testtools - - src-openeuler/jsoncpp - - src-openeuler/qt5-qtimageformats - - src-openeuler/perl-libwww-perl - - src-openeuler/qt5-qtserialport - - src-openeuler/python-distro - - src-openeuler/meson - - src-openeuler/perl-Data-Section - - src-openeuler/perl-ExtUtils-CBuilder - - src-openeuler/perl-Test-FailWarnings - - src-openeuler/qt5-qtbase - - src-openeuler/Cython - - src-openeuler/qpdf - - src-openeuler/python-pbr - - src-openeuler/cmake - - src-openeuler/papi - - src-openeuler/perl-Digest-HMAC - - src-openeuler/python-freezegun - - src-openeuler/nasm - - src-openeuler/perl-HTML-Tagset - - src-openeuler/python-hypothesis - - src-openeuler/openscap - - src-openeuler/gnome-common - - src-openeuler/python-packaging - - src-openeuler/qt5-qt3d - - src-openeuler/gspell - - src-openeuler/xcb-util-image - - src-openeuler/python-SecretStorage - - src-openeuler/python-bottle - - src-openeuler/perl-libintl-perl - - src-openeuler/python-greenlet - - src-openeuler/perl-Fedora-VSP - - src-openeuler/perl-Test-Needs - - src-openeuler/tinyxml2 - - src-openeuler/python2-typing - - src-openeuler/libfabric - - src-openeuler/xorg-x11-util-macros - - src-openeuler/perl-Text-Tabs-Wrap - - src-openeuler/pangomm - - src-openeuler/perl-Font-TTF - - src-openeuler/LibRaw - - src-openeuler/perl-Socket6 - - src-openeuler/perl-Test-NoWarnings - - src-openeuler/perl-Parse-Yapp - - src-openeuler/xcb-proto - - src-openeuler/flatpak - - src-openeuler/libell - - src-openeuler/perl-Carp-Clan - - src-openeuler/python-flit - - src-openeuler/qt5-qtlocation - - src-openeuler/libXp - - src-openeuler/python-configshell - - src-openeuler/python-werkzeug - - src-openeuler/python-mock - - src-openeuler/librdkafka - - src-openeuler/python-setuptools_scm - - src-openeuler/perl-HTML-Parser - - src-openeuler/python-pytoml - - src-openeuler/libsrtp - - src-openeuler/qt5-qtscript - - src-openeuler/python-gevent - - src-openeuler/libmemcached - - src-openeuler/trace-cmd - - src-openeuler/python-urlgrabber - - src-openeuler/python-markdown - - src-openeuler/python-nose - - src-openeuler/perl-HTTP-Cookies - - src-openeuler/perl-XML-NamespaceSupport - - src-openeuler/python-sphinx_rtd_theme - - src-openeuler/tbb - - src-openeuler/python-flask - - src-openeuler/qt5-qtwebchannel - - src-openeuler/gtest - - src-openeuler/cppcheck - - src-openeuler/nototools - - src-openeuler/qt5-qtserialbus - - src-openeuler/valgrind - - src-openeuler/qt5-qtgraphicaleffects - - src-openeuler/qt5-qtspeech - - src-openeuler/qt5-qtvirtualkeyboard - - src-openeuler/qt5dxcb-plugin - - src-openeuler/perl-Text-Template - - src-openeuler/perl-Mail-DKIM - - src-openeuler/cvs - - src-openeuler/perl-Net-DNS - - src-openeuler/python-construct - - src-openeuler/openblas - - src-openeuler/spice-protocol - - src-openeuler/libgnome-keyring - - src-openeuler/pyelftools - - src-openeuler/python-tornado - - src-openeuler/python-httpretty - - src-openeuler/egl-wayland - - src-openeuler/python-testscenarios - - src-openeuler/python-augeas - - src-openeuler/glib - - src-openeuler/perl-Data-Dump - - src-openeuler/help2man - - src-openeuler/python-pymongo - - src-openeuler/perl-YAML - - src-openeuler/sblim-cmpi-devel - - src-openeuler/gtk-vnc - - src-openeuler/perl-Sub-Name - - src-openeuler/perl-Sub-Quote - - src-openeuler/perl-Test-Fatal - - src-openeuler/perl-Test-InDistDir - - src-openeuler/perl-Test-Pod-Coverage - - src-openeuler/perl-Test-Requires - - src-openeuler/perl-Text-Glob - - src-openeuler/nim - - src-openeuler/erlang - - src-openeuler/erlang-getopt - - src-openeuler/erlang-neotoma - - src-openeuler/erlang-eflame - - src-openeuler/erlang-erlsyslog - - src-openeuler/erlang-mustache - - src-openeuler/erlang-lfe - - src-openeuler/erlang-rpm-macros - - src-openeuler/erlang-proper - - src-openeuler/erlang-hamcrest - - src-openeuler/erlang-gettext - - src-openeuler/erlang-erlydtl - - src-openeuler/erlang-sd_notify - - src-openeuler/erlang-meck -- name: Runtime - repositories: - - src-openeuler/ibus-libpinyin - - src-openeuler/mesa-demos - - src-openeuler/tinycdb - - src-openeuler/freeglut - - src-openeuler/libmpcdec - - src-openeuler/mesa-libGLw - - src-openeuler/alsa-plugins - - src-openeuler/pkcs11-helper - - src-openeuler/rhash - - src-openeuler/libpeas - - src-openeuler/libnice - - src-openeuler/python-httplib2 - - src-openeuler/vdo - - src-openeuler/protobuf-c - - src-openeuler/fftw - - src-openeuler/ibus-sayura - - src-openeuler/hdf5 - - src-openeuler/libvdpau - - src-openeuler/ibus-m17n - - src-openeuler/xorg-x11-xtrans-devel - - src-openeuler/redland - - src-openeuler/libshout - - src-openeuler/ibus-typing-booster - - src-openeuler/librabbitmq - - src-openeuler/celt051 - - src-openeuler/libva - - src-openeuler/libvoikko - - src-openeuler/jemalloc - - src-openeuler/libpng12 - - src-openeuler/gsl - - src-openeuler/clutter-gst2 - - src-openeuler/libiec61883 - - src-openeuler/atlas - - src-openeuler/atkmm - - src-openeuler/freetds - - src-openeuler/kmod-kvdo - - src-openeuler/libao - - src-openeuler/glew - - src-openeuler/libstoragemgmt - - src-openeuler/qt - - src-openeuler/OpenEXR - - src-openeuler/motif - - src-openeuler/m2crypto - - src-openeuler/libsmi - - src-openeuler/usbmuxd - - src-openeuler/libavc1394 - - src-openeuler/libieee1284 -- name: Networking - repositories: - - src-openeuler/apache-commons-net - - src-openeuler/glassfish-jax-rs-api - - src-openeuler/kronosnet - - src-openeuler/initscripts - - src-openeuler/http-parser - - src-openeuler/openvswitch - - src-openeuler/ldns - - src-openeuler/ipvsadm - - src-openeuler/unbound - - src-openeuler/ntp - - src-openeuler/neethi - - src-openeuler/openssh - - src-openeuler/NetworkManager - - src-openeuler/libserf - - src-openeuler/tipcutils - - src-openeuler/libmbim - - src-openeuler/libqmi - - src-openeuler/libnetfilter_queue - - src-openeuler/iptables - - src-openeuler/python-idna - - src-openeuler/GeoIP - - src-openeuler/xinetd - - src-openeuler/libssh2 - - src-openeuler/nftables - - src-openeuler/bridge-utils - - src-openeuler/telnet - - src-openeuler/libassuan - - src-openeuler/iw - - src-openeuler/GeoIP-GeoLite-data - - src-openeuler/zd1211-firmware - - src-openeuler/ipmitool - - src-openeuler/ipset - - src-openeuler/iptraf-ng - - src-openeuler/ppp - - src-openeuler/tcpdump - - src-openeuler/traceroute - - src-openeuler/mtr - - src-openeuler/firewalld - - src-openeuler/arpwatch - - src-openeuler/iputils - - src-openeuler/iproute - - src-openeuler/nmap - - src-openeuler/httpd - - src-openeuler/network-manager-applet - - src-openeuler/libdnet - - src-openeuler/python-requests-ftp - - src-openeuler/ModemManager - - src-openeuler/procmail - - src-openeuler/tcp_wrappers - - src-openeuler/vconfig - - src-openeuler/lua-socket - - src-openeuler/mod_http2 - - src-openeuler/libtirpc - - src-openeuler/ethtool - - src-openeuler/net-tools - - src-openeuler/hostname - - src-openeuler/openldap - - src-openeuler/ipcalc - - src-openeuler/vsftpd - - src-openeuler/samba - - src-openeuler/dnsmasq - - src-openeuler/notification-daemon - - src-openeuler/chrony - - src-openeuler/libproxy - - src-openeuler/ntpstat - - src-openeuler/libnetfilter_conntrack - - src-openeuler/postfix - - src-openeuler/libnl3 - - src-openeuler/arptables - - src-openeuler/ftp - - src-openeuler/python-paste - - src-openeuler/libgcrypt - - src-openeuler/python-ipaddress - - src-openeuler/libpcap - - src-openeuler/xmlrpc-c - - src-openeuler/libssh - - src-openeuler/wget - - src-openeuler/nghttp2 - - src-openeuler/libnfnetlink - - src-openeuler/curl - - src-openeuler/python-IPy - - src-openeuler/lftp - - src-openeuler/atmel-firmware - - src-openeuler/netcf - - src-openeuler/c-ares - - src-openeuler/python-backports-ssl_match_hostname - - src-openeuler/python-ntplib - - src-openeuler/libesmtp - - src-openeuler/geolite2 - - src-openeuler/ebtables - - src-openeuler/dropwatch - - src-openeuler/bind - - src-openeuler/OpenIPMI - - src-openeuler/grpc - - src-openeuler/bind-dyndb-ldap - - src-openeuler/dhcp - - src-openeuler/glib-networking - - src-openeuler/net-snmp - - src-openeuler/icfg - - src-openeuler/python-requests - - src-openeuler/rpcbind - - src-openeuler/python-urllib3 - - src-openeuler/iptstate - - src-openeuler/radvd - - src-openeuler/squid - - src-openeuler/python-html5lib - - src-openeuler/libnet - - src-openeuler/tftp - - src-openeuler/lldpad - - src-openeuler/b43-openfwwf - - src-openeuler/libndp - - src-openeuler/openslp - - src-openeuler/mobile-broadband-provider-info - - src-openeuler/xdp-cpumap-tc - - src-openeuler/appweb -- name: Virt - repositories: - - src-openeuler/virt-viewer - - src-openeuler/virglrenderer - - src-openeuler/python-beautifulsoup4 - - src-openeuler/libvirt-python - - src-openeuler/libvirt-glib - - src-openeuler/virt-manager - - src-openeuler/qemu - - src-openeuler/libvirt - - src-openeuler/edk2 - - src-openeuler/perl-Sys-Virt - - src-openeuler/vmtop - - src-openeuler/stratovirt - - openeuler/qemu - - openeuler/libvirt - - openeuler/vmtop - - openeuler/stratovirt -- name: Kernel - repositories: - - openeuler/kernel - - src-openeuler/kabi-dw - - src-openeuler/kernel -- name: Others - repositories: - - src-openeuler/libopenraw - - src-openeuler/libzapojit - - src-openeuler/glassfish-jaxb-api - - src-openeuler/farstream02 - - src-openeuler/fabtests - - src-openeuler/perl-Sub-Uplevel - - src-openeuler/python-pynacl - - src-openeuler/autotune - - src-openeuler/perl-Devel-Symdump - - src-openeuler/perl-Net-SMTP-SSL - - src-openeuler/gegl04 - - src-openeuler/perl-GSSAPI - - src-openeuler/pyorbit - - src-openeuler/u2f-hidraw-policy - - src-openeuler/python-kitchen - - src-openeuler/python-hwdata - - src-openeuler/nilfs-utils - - src-openeuler/keyrings-filesystem - - src-openeuler/zerofree - - src-openeuler/hfsplus-tools - - src-openeuler/ImageMagick - - src-openeuler/gnome-disk-utility - - src-openeuler/twolame - - src-openeuler/perl-Mail-Sender - - src-openeuler/gnome-getting-started-docs - - src-openeuler/folks - - src-openeuler/perl-Encode-Detect - - src-openeuler/libsigcpp20 - - src-openeuler/raptor2 - - src-openeuler/clamav - - src-openeuler/opencc - - src-openeuler/python-joblib - - src-openeuler/python-threadpoolctl - - src-openeuler/perl-Class-Inspector - - src-openeuler/gavl - - src-openeuler/python-qt5 - - src-openeuler/sox - - src-openeuler/perl-Crypt-OpenSSL-Bignum - - src-openeuler/qt-mobility - - src-openeuler/frei0r-plugins - - src-openeuler/xhtml1-dtds - - src-openeuler/perl-File-ShareDir-Install - - src-openeuler/capstone - - src-openeuler/osc - - src-openeuler/python-bcrypt - - src-openeuler/mpg123 - - src-openeuler/libgovirt - - src-openeuler/PyQt4 - - src-openeuler/perl-IO-Multiplex - - src-openeuler/libgnomeui - - src-openeuler/perl-Sys-MemInfo - - src-openeuler/python-cycler - - src-openeuler/libgdither - - src-openeuler/emacs-auctex - - src-openeuler/gtk - - src-openeuler/gtk4 - - src-openeuler/gnome-font-viewer - - src-openeuler/perl-Net-CIDR-Lite - - src-openeuler/python-pandas - - src-openeuler/gnome-icon-theme-symbolic - - src-openeuler/sblim-sfcCommon - - src-openeuler/perl-Net-Server - - src-openeuler/jfsutils - - src-openeuler/python-reportlab - - src-openeuler/python-argcomplete - - src-openeuler/gnome-color-manager - - src-openeuler/python-xgboost - - src-openeuler/gnome-video-effects - - src-openeuler/nbdkit - - src-openeuler/perl-Pod-Coverage - - src-openeuler/gsound - - src-openeuler/libfprint - - src-openeuler/gtksourceview3 - - src-openeuler/clucene - - src-openeuler/python-flask-restful - - src-openeuler/perl-Sys-CPU - - src-openeuler/marisa - - src-openeuler/festival-freebsoft-utils - - src-openeuler/python-dict2xml - - src-openeuler/hexedit - - src-openeuler/perl-File-ShareDir - - src-openeuler/gtkmm30 - - src-openeuler/suitesparse - - src-openeuler/anthy - - src-openeuler/python-pillow - - src-openeuler/pcaudiolib - - src-openeuler/obs-build - - src-openeuler/urlview - - src-openeuler/perl-Sub-Exporter - - src-openeuler/qt5-qtenginio - - src-openeuler/flite - - src-openeuler/opusfile - - src-openeuler/breeze-icon-theme - - src-openeuler/dvdplusrw-tools - - src-openeuler/latex2html - - src-openeuler/dkms - - src-openeuler/glibmm24 - - src-openeuler/python-aniso8601 - - src-openeuler/libmad - - src-openeuler/python-parse - - src-openeuler/gimp - - src-openeuler/container-exception-logger - - src-openeuler/perl-Sub-Exporter-Progressive - - src-openeuler/qt5-qtwebkit - - src-openeuler/espeak-ng - - src-openeuler/irrlicht - - src-openeuler/proj - - src-openeuler/ucs-miscfixed-fonts - - src-openeuler/libwmf - - src-openeuler/qt5-qtwebengine - - src-openeuler/perl-String-CRC32 - - src-openeuler/phonon - - src-openeuler/python-kiwisolver - - src-openeuler/kyotocabinet - - src-openeuler/python-humanize - - src-openeuler/gstreamer1-plugins-good - - src-openeuler/qt5-doc - - src-openeuler/xapian-core - - src-openeuler/babl - - src-openeuler/sip - - src-openeuler/lame - - src-openeuler/python-olefile - - src-openeuler/libburn - - src-openeuler/openEuler-latest-release - - src-openeuler/perl-SNMP_Session - - src-openeuler/gnome-packagekit - - src-openeuler/phodav - - src-openeuler/perl-Package-Generator - - src-openeuler/re2 - - src-openeuler/gnome-python2 - - src-openeuler/mt-st - - src-openeuler/cldr-emoji-annotation - - src-openeuler/qtwebkit - - src-openeuler/festival - - src-openeuler/gcab - - src-openeuler/gnome-icon-theme-extras - - src-openeuler/libmypaint - - src-openeuler/perl-Unicode-EastAsianWidth - - src-openeuler/perl-Tk - - src-openeuler/djvulibre - - src-openeuler/perl-BSD-Resource - - src-openeuler/conmon - - src-openeuler/nagios - - src-openeuler/libid3tag - - src-openeuler/libxmlb - - src-openeuler/libisofs - - src-openeuler/SDL2 - - src-openeuler/mac-robber - - src-openeuler/libspiro - - src-openeuler/python-scikit-learn - - src-openeuler/python-scikit-optimize - - src-openeuler/assimp - - src-openeuler/poly2tri - - src-openeuler/libaesgm - - src-openeuler/aalib - - src-openeuler/afflib - - src-openeuler/apache2-mod_xforward - - src-openeuler/biosdevname - - src-openeuler/cloud-utils - - src-openeuler/debootstrap - - src-openeuler/dogtail - - src-openeuler/dpkg - - src-openeuler/fonts-rpm-macros - - src-openeuler/fuse-python - - src-openeuler/galera - - src-openeuler/gcc_secure - - src-openeuler/icoutils - - src-openeuler/libewf - - src-openeuler/libhbaapi - - src-openeuler/libhbalinux - - src-openeuler/libisoburn - - src-openeuler/libpinyin - - src-openeuler/libsodium - - src-openeuler/mcelog - - src-openeuler/mongo-c-driver - - src-openeuler/mypaint-brushes - - src-openeuler/mysql - - src-openeuler/py3c - - src-openeuler/beakerlib - - src-openeuler/oniguruma - - src-openeuler/perl-BSSolv - - src-openeuler/perl-Canary-Stability - - src-openeuler/perl-Business-ISBN - - src-openeuler/perl-Business-ISBN-Data - - src-openeuler/perl-Class-Method-Modifiers - - src-openeuler/perl-Class-XSAccessor - - src-openeuler/perl-Compress-Bzip2 - - src-openeuler/perl-Config-General - - src-openeuler/perl-common-sense - - src-openeuler/perl-CPAN - - src-openeuler/perl-Crypt-DES - - src-openeuler/perl-Crypt-PasswdMD5 - - src-openeuler/perl-Devel-GlobalDestruction - - src-openeuler/perl-Devel-Size - - src-openeuler/perl-Digest-SHA1 - - src-openeuler/perl-Digest-SHA3 - - src-openeuler/perl-Email-Date-Format - - src-openeuler/perl-ExtUtils-Config - - src-openeuler/perl-ExtUtils-Helpers - - src-openeuler/perl-ExtUtils-InstallPaths - - src-openeuler/perl-Module-Build-Tiny - - src-openeuler/perl-Readonly - - src-openeuler/perl-Test-LeakTrace - - src-openeuler/perl-File-Sync - - src-openeuler/perl-File-BaseDir - - src-openeuler/perl-File-Copy-Recursive - - src-openeuler/perl-File-DesktopEntry - - src-openeuler/perl-File-MimeInfo - - src-openeuler/perl-File-ReadBackwards - - src-openeuler/perl-File-pushd - - src-openeuler/perl-File-Remove - - src-openeuler/perl-GD - - src-openeuler/perl-GD-Barcode - - src-openeuler/perl-HTTP-Daemon - - src-openeuler/perl-Import-Into - - src-openeuler/perl-IO-All - - src-openeuler/perl-IO-stringy - - src-openeuler/perl-JSON-XS - - src-openeuler/perl-local-lib - - src-openeuler/perl-MIME-Lite - - src-openeuler/perl-MIME-Types - - src-openeuler/perl-Module-Install - - src-openeuler/perl-Module-Install-AuthorRequires - - src-openeuler/perl-Module-Install-AuthorTests - - src-openeuler/perl-Module-Install-AutoLicense - - src-openeuler/perl-Module-Install-GithubMeta - - src-openeuler/perl-Module-Install-ManifestSkip - - src-openeuler/perl-Net-LibIDN - - src-openeuler/perl-Net-SNMP - - src-openeuler/perl-Package-Constants - - src-openeuler/perl-Socket-MsgHdr - - src-openeuler/perl-Types-Serialiser - - src-openeuler/perl-Switch - - src-openeuler/perl-Test-RequiresInternet - - src-openeuler/perl-Unicode-LineBreak - - src-openeuler/perl-XML-Catalog - - src-openeuler/perl-XML-TokeParser - - src-openeuler/perl-YAML-LibYAML - - src-openeuler/php - - src-openeuler/PyPAM - - src-openeuler/pv - - src-openeuler/python-alsa - - src-openeuler/python-apipkg - - src-openeuler/python-tqdm - - src-openeuler/python-backports-unittest_mock - - src-openeuler/python-cached_property - - src-openeuler/python-cherrypy - - src-openeuler/python-constantly - - src-openeuler/python-contextlib2 - - src-openeuler/python-docker - - src-openeuler/python-docker-pycreds - - src-openeuler/python-dockerpty - - src-openeuler/python-ecdsa - - src-openeuler/python-evdev - - src-openeuler/python-execnet - - src-openeuler/python-filelock - - src-openeuler/python-gflags - - src-openeuler/python-hamcrest - - src-openeuler/python-hyperlink - - src-openeuler/python-importlib-metadata - - src-openeuler/python-incremental - - src-openeuler/python-junitxml - - src-openeuler/python-keyczar - - src-openeuler/python-ldap - - src-openeuler/python-logutils - - src-openeuler/python-path - - src-openeuler/python-pecan - - src-openeuler/python-pytest-shutil - - src-openeuler/python-semantic_version - - src-openeuler/python-setuptools_git - - src-openeuler/python-simplegeneric - - src-openeuler/python-subprocess32 - - src-openeuler/python-varlink - - src-openeuler/python-zipp - - src-openeuler/python-zope-interface - - src-openeuler/qhull - - src-openeuler/qt-assistant-adp - - src-openeuler/rear - - src-openeuler/redis - - src-openeuler/reiserfs-utils - - src-openeuler/resource-agents - - src-openeuler/rust-packaging - - src-openeuler/sassc - - src-openeuler/sleuthkit - - src-openeuler/sos - - src-openeuler/sphinx - - src-openeuler/tidy - - src-openeuler/tuna - - src-openeuler/uchardet - - src-openeuler/umoci - - src-openeuler/python-toml - - src-openeuler/python-mysqlclient - - src-openeuler/python-PyMySQL - - src-openeuler/python-rsa - - src-openeuler/python-ruamel-yaml - - src-openeuler/python-ruamel-yaml-clib - - src-openeuler/python-suds2 - - src-openeuler/python-texttable - - src-openeuler/python-waitress - - src-openeuler/python-websocket-client - - src-openeuler/python-webtest - - src-openeuler/python-paste-deploy - - src-openeuler/python-pyquery - - src-openeuler/python-WSGIProxy2 - - src-openeuler/python-webob - - src-openeuler/perl-Config-IniFiles - - src-openeuler/perl-CGI - - src-openeuler/boom-boot - - src-openeuler/python-memcached - - src-openeuler/python-psycopg2 - - src-openeuler/seabios - - src-openeuler/procinfo - - src-openeuler/annobin - - src-openeuler/python-zope-event - - src-openeuler/rcs - - src-openeuler/rootsh - - src-openeuler/scsi-target-utils - - src-openeuler/python-cssselect - - src-openeuler/obs-bundled-gems - - src-openeuler/obs-server - - src-openeuler/obs-service-download_files - - src-openeuler/obs-service-extract_file - - src-openeuler/obs-service-rust2rpm - - src-openeuler/obs-service-set_version - - src-openeuler/passenger - - src-openeuler/papirus-icon-theme - - src-openeuler/onboard -- name: System-tool - repositories: - - src-openeuler/argyllcms - - src-openeuler/watchdog - - src-openeuler/custodia - - src-openeuler/criu - - src-openeuler/liblognorm - - src-openeuler/mksh - - src-openeuler/libgphoto2 - - src-openeuler/leveldb - - src-openeuler/rocksdb - - src-openeuler/fcoe-utils - - src-openeuler/ibus-hangul - - src-openeuler/colord-gtk - - src-openeuler/gutenprint - - src-openeuler/kiwi - - src-openeuler/overpass-fonts - - src-openeuler/libraw1394 - - src-openeuler/ibus-table - - src-openeuler/wsmancli - - src-openeuler/v4l-utils - - src-openeuler/hplip - - src-openeuler/crda - - src-openeuler/tang - - src-openeuler/libotf - - src-openeuler/cups-filters - - src-openeuler/bolt - - src-openeuler/kde-filesystem - - src-openeuler/mtx - - src-openeuler/autofs - - src-openeuler/varnish - - src-openeuler/sil-abyssinica-fonts - - src-openeuler/b43-tools - - src-openeuler/ibus-table-array30 - - src-openeuler/libreswan - - src-openeuler/logwatch - - src-openeuler/NetworkManager-libreswan - - src-openeuler/system-config-printer - - src-openeuler/microcode_ctl - - src-openeuler/openhpi - - src-openeuler/netlabel_tools - - src-openeuler/libguestfs - - src-openeuler/mod_fcgid - - src-openeuler/unicode-ucd - - src-openeuler/fakechroot - - src-openeuler/cim-schema - - src-openeuler/cgdcbxd - - src-openeuler/rng-tools - - src-openeuler/portreserve - - src-openeuler/mod_auth_gssapi - - src-openeuler/tog-pegasus - - src-openeuler/m17n-db - - src-openeuler/fwupd - - src-openeuler/libhangul - - src-openeuler/environment-modules - - src-openeuler/nvme-cli - - src-openeuler/sblim-sfcb - - src-openeuler/sblim-sfcc - - src-openeuler/bacula - - src-openeuler/mod_security - - src-openeuler/open-sans-fonts - - src-openeuler/liberation-fonts - - src-openeuler/freeradius - - src-openeuler/gfs2-utils - - src-openeuler/sane-backends - - src-openeuler/dejavu-fonts - - src-openeuler/speech-dispatcher - - src-openeuler/smc-fonts - - src-openeuler/sil-scheherazade-fonts - - src-openeuler/fontawesome-fonts - - src-openeuler/freeipmi - - src-openeuler/m17n-lib - - src-openeuler/libsmbios - - src-openeuler/pinfo - - src-openeuler/openwsman - - src-openeuler/fprintd - - src-openeuler/initial-setup - - src-openeuler/khmeros-fonts - - src-openeuler/julietaula-montserrat-fonts - - src-openeuler/usb_modeswitch - - src-openeuler/sanlock - - src-openeuler/mstflint - - src-openeuler/pps-tools - - src-openeuler/lklug-fonts - - src-openeuler/nvmetcli - - src-openeuler/hivex - - src-openeuler/scap-workbench - - src-openeuler/minicom - - src-openeuler/supermin - - src-openeuler/scap-security-guide - - src-openeuler/haproxy - - src-openeuler/entr - - src-openeuler/rfkill - - src-openeuler/partclone -- name: Packaging - repositories: - - src-openeuler/pakchois - - src-openeuler/copy-jdk-configs - - src-openeuler/rpmdevtools - - src-openeuler/nginx - - src-openeuler/multilib-rpm-config - - src-openeuler/obs_meta -- name: DB - repositories: - - src-openeuler/derby - - src-openeuler/gupnp-dlna - - src-openeuler/h2 - - src-openeuler/postgresql-odbc - - src-openeuler/foomatic - - src-openeuler/foomatic-db - - src-openeuler/postgresql - - src-openeuler/unixODBC - - src-openeuler/firebird - - src-openeuler/mysql5 - - src-openeuler/glassfish-legal - - src-openeuler/geolatte-geom -- name: Base-service - repositories: - - openeuler/openEuler-rpm-config - - src-openeuler/acl - - src-openeuler/acpica-tools - - src-openeuler/adcli - - src-openeuler/aide - - src-openeuler/airline - - src-openeuler/ant-antunit - - src-openeuler/apache-commons-chain - - src-openeuler/apache-commons-el - - src-openeuler/apache-commons-javaflow - - src-openeuler/apache-commons-jci - - src-openeuler/apache-mina - - src-openeuler/apr - - src-openeuler/apr-util - - src-openeuler/argon2 - - src-openeuler/aries-blueprint-annotation-api - - src-openeuler/aries-proxy-impl - - src-openeuler/arm-trusted-firmware - - src-openeuler/asciidoc - - src-openeuler/at - - src-openeuler/atf - - src-openeuler/audiofile - - src-openeuler/authd - - src-openeuler/authselect - - src-openeuler/autoconf - - src-openeuler/autogen - - src-openeuler/automake - - src-openeuler/axiom - - src-openeuler/babel - - src-openeuler/babeltrace - - src-openeuler/basesystem - - src-openeuler/bash - - src-openeuler/bash-completion - - src-openeuler/bc - - src-openeuler/binutils - - src-openeuler/bison - - src-openeuler/brotli - - src-openeuler/bubblewrap - - src-openeuler/bval - - src-openeuler/byte-buddy - - src-openeuler/bzip2 - - src-openeuler/ca-certificates - - src-openeuler/castor - - src-openeuler/cbi-plugins - - src-openeuler/chkconfig - - src-openeuler/chrpath - - src-openeuler/clevis - - src-openeuler/cloud-init - - src-openeuler/conntrack-tools - - src-openeuler/cookcc - - src-openeuler/coreutils - - src-openeuler/cpio - - src-openeuler/cpp-hocon - - src-openeuler/crash - - src-openeuler/createrepo_c - - src-openeuler/cronie - - src-openeuler/crontabs - - src-openeuler/ctags - - src-openeuler/cxf - - src-openeuler/CUnit - - src-openeuler/cyrus-sasl - - src-openeuler/dbus - - src-openeuler/dbus-glib - - src-openeuler/dbus-python - - src-openeuler/dbxtool - - src-openeuler/deltarpm - - src-openeuler/dialog - - src-openeuler/diffstat - - src-openeuler/diffutils - - src-openeuler/ding-libs - - src-openeuler/disruptor - - src-openeuler/docbook-dtds - - src-openeuler/docbook-style-xsl - - src-openeuler/dos2unix - - src-openeuler/dracut - - src-openeuler/drpm - - src-openeuler/dtc - - src-openeuler/dwz - - src-openeuler/ed - - src-openeuler/edac-utils - - src-openeuler/elfutils - - src-openeuler/epydoc - - src-openeuler/exempi - - src-openeuler/expat - - src-openeuler/expect - - src-openeuler/facter - - src-openeuler/felix-osgi-compendium - - src-openeuler/felix-osgi-core - - src-openeuler/felix-osgi-foundation - - src-openeuler/felix-osgi-obr - - src-openeuler/felix-shell - - src-openeuler/findutils - - src-openeuler/fipscheck - - src-openeuler/flex - - src-openeuler/fpaste - - src-openeuler/fusesource-pom - - src-openeuler/future - - src-openeuler/gamin - - src-openeuler/gawk - - src-openeuler/gc - - src-openeuler/gemini-blueprint - - src-openeuler/gettext - - src-openeuler/ghostscript - - src-openeuler/git - - src-openeuler/glassfish-fastinfoset - - src-openeuler/glassfish-master-pom - - src-openeuler/glassfish-websocket-api - - src-openeuler/glassfish-ejb-api - - src-openeuler/gmime30 - - src-openeuler/gnulib - - src-openeuler/gobject-introspection - - src-openeuler/gpgme - - src-openeuler/gphoto2 - - src-openeuler/grep - - src-openeuler/groff - - src-openeuler/grubby - - src-openeuler/gssproxy - - src-openeuler/gupnp-av - - src-openeuler/gzip - - src-openeuler/haveged - - src-openeuler/hiredis - - src-openeuler/hppc - - src-openeuler/htrace - - src-openeuler/ima-evm-utils - - src-openeuler/iso-codes - - src-openeuler/isomd5sum - - src-openeuler/isorelax - - src-openeuler/istack-commons - - src-openeuler/ivtv-firmware - - src-openeuler/jansson - - src-openeuler/jdeparser1 - - src-openeuler/jdom - - src-openeuler/jeromq - - src-openeuler/jose - - src-openeuler/jq - - src-openeuler/json-c - - src-openeuler/Judy - - src-openeuler/kdump-anaconda-addon - - src-openeuler/kexec-tools - - src-openeuler/kpatch - - src-openeuler/krb5 - - src-openeuler/ksh - - src-openeuler/kyua - - src-openeuler/langtable - - src-openeuler/lasso - - src-openeuler/latrace - - src-openeuler/leatherman - - src-openeuler/leptonica - - src-openeuler/less - - src-openeuler/libbytesize - - src-openeuler/libcap-ng - - src-openeuler/libclc - - src-openeuler/libcomps - - src-openeuler/libconfig - - src-openeuler/libcroco - - src-openeuler/libdaemon - - src-openeuler/libdatrie - - src-openeuler/libdb - - src-openeuler/libdbi - - src-openeuler/libecap - - src-openeuler/libedit - - src-openeuler/libestr - - src-openeuler/libev - - src-openeuler/libevent - - src-openeuler/libfastjson - - src-openeuler/libffi - - src-openeuler/libgdiplus - - src-openeuler/libgexiv2 - - src-openeuler/libgit2 - - src-openeuler/libgit2-glib - - src-openeuler/libgsf - - src-openeuler/libIDL - - src-openeuler/libidn - - src-openeuler/libidn2 - - src-openeuler/libkcapi - - src-openeuler/libksba - - src-openeuler/libmaxminddb - - src-openeuler/libmetalink - - src-openeuler/libmnl - - src-openeuler/libmodulemd - - src-openeuler/libmspack - - src-openeuler/libnetfilter_cthelper - - src-openeuler/libnetfilter_cttimeout - - src-openeuler/libnfs - - src-openeuler/libnftnl - - src-openeuler/libnma - - src-openeuler/libnsl2 - - src-openeuler/liboauth - - src-openeuler/libomxil-bellagio - - src-openeuler/libosinfo - - src-openeuler/libpaper - - src-openeuler/libpipeline - - src-openeuler/libplist - - src-openeuler/libpsl - - src-openeuler/libquvi - - src-openeuler/libquvi-scripts - - src-openeuler/librepo - - src-openeuler/libreport - - src-openeuler/libsass - - src-openeuler/libseccomp - - src-openeuler/libsecret - - src-openeuler/libsigsegv - - src-openeuler/libtar - - src-openeuler/libtasn1 - - src-openeuler/libtdb - - src-openeuler/libteam - - src-openeuler/libtheora - - src-openeuler/libtomcrypt - - src-openeuler/libtommath - - src-openeuler/libtool - - src-openeuler/libunistring - - src-openeuler/libunwind - - src-openeuler/libuser - - src-openeuler/libutempter - - src-openeuler/libverto - - src-openeuler/libvorbis - - src-openeuler/libxcrypt - - src-openeuler/libxml2 - - src-openeuler/libxslt - - src-openeuler/libyaml - - src-openeuler/lmdb - - src-openeuler/logrotate - - src-openeuler/lshw - - src-openeuler/lsof - - src-openeuler/lua - - src-openeuler/luajit - - src-openeuler/lua-expat - - src-openeuler/lua-json - - src-openeuler/lua-lpeg - - src-openeuler/lucene4 - - src-openeuler/lutok - - src-openeuler/lz4 - - src-openeuler/lzo - - src-openeuler/lzop - - src-openeuler/m4 - - src-openeuler/mailcap - - src-openeuler/make - - src-openeuler/man-db - - src-openeuler/man-pages - - src-openeuler/maven-release - - src-openeuler/maven-replacer - - src-openeuler/maven-shared - - src-openeuler/maven-verifier-plugin - - src-openeuler/mcpp - - src-openeuler/mecab - - src-openeuler/mercurial - - src-openeuler/mlocate - - src-openeuler/mod_security_crs - - src-openeuler/mongodb - - src-openeuler/mongo-java-driver2 - - src-openeuler/mono - - src-openeuler/morfologik-stemming - - src-openeuler/mtdev - - src-openeuler/multithreadedtc - - src-openeuler/munge-maven-plugin - - src-openeuler/mvel - - src-openeuler/mysema-commons-lang - - src-openeuler/nailgun - - src-openeuler/ncompress - - src-openeuler/nettle - - src-openeuler/nss_nis - - src-openeuler/nss-pam-ldapd - - src-openeuler/ocl-icd - - src-openeuler/oddjob - - src-openeuler/openEuler-indexhtml - - src-openeuler/openEuler-logos - - src-openeuler/openEuler-release - - src-openeuler/openEuler-repos - - src-openeuler/openEuler-rpm-config - - src-openeuler/opensc - - src-openeuler/orc - - src-openeuler/osinfo-db - - src-openeuler/osinfo-db-tools - - src-openeuler/os-prober - - src-openeuler/ostree - - src-openeuler/p11-kit - - src-openeuler/paranamer - - src-openeuler/passwd - - src-openeuler/patch - - src-openeuler/pcre - - src-openeuler/pcre2 - - src-openeuler/perl - - src-openeuler/perl-Digest - - src-openeuler/perl-ExtUtils-MakeMaker - - src-openeuler/perl-Mozilla-CA - - src-openeuler/perl-Storable - - src-openeuler/pigz - - src-openeuler/pkgconf - - src-openeuler/plexus-component-factories-pom - - src-openeuler/polkit - - src-openeuler/polkit-gnome - - src-openeuler/polkit-pkla-compat - - src-openeuler/popt - - src-openeuler/powermock - - src-openeuler/powertop - - src-openeuler/publicsuffix-list - - src-openeuler/pygobject3 - - src-openeuler/pykickstart - - src-openeuler/pyliblzma - - src-openeuler/pyparsing - - src-openeuler/pyparted - - src-openeuler/pyserial - - src-openeuler/python3 - - src-openeuler/python3-mallard-ducktype - - src-openeuler/python-asn1crypto - - src-openeuler/python-backports - - src-openeuler/python-beaker - - src-openeuler/python-cffi - - src-openeuler/python-chardet - - src-openeuler/python-cheetah - - src-openeuler/python-commonmark - - src-openeuler/python-cpio - - src-openeuler/python-crypto - - src-openeuler/python-cryptography - - src-openeuler/python-dateutil - - src-openeuler/python-decorator - - src-openeuler/python-docopt - - src-openeuler/python-enum34 - - src-openeuler/python-google-apputils - - src-openeuler/python-gssapi - - src-openeuler/python-iniparse - - src-openeuler/python-inotify - - src-openeuler/python-jinja2 - - src-openeuler/python-jsonpatch - - src-openeuler/python-jsonpointer - - src-openeuler/python-jsonschema - - src-openeuler/python-jwt - - src-openeuler/python-kmod - - src-openeuler/python-lhsmdu - - src-openeuler/python-linux-procfs - - src-openeuler/python-lxml - - src-openeuler/python-mako - - src-openeuler/python-markupsafe - - src-openeuler/python-meh - - src-openeuler/python-mox - - src-openeuler/python-oauthlib - - src-openeuler/python-ordered-set - - src-openeuler/python-pid - - src-openeuler/python-pip - - src-openeuler/python-ply - - src-openeuler/python-pocketlint - - src-openeuler/python-polib - - src-openeuler/python-prettytable - - src-openeuler/python-productmd - - src-openeuler/python-pyaml - - src-openeuler/python-pycparser - - src-openeuler/python-pycurl - - src-openeuler/python-pydbus - - src-openeuler/python-pysocks - - src-openeuler/python-pytest-cov - - src-openeuler/python-pytest-expect - - src-openeuler/python-pytest-fixture-config - - src-openeuler/python-pytest-mock - - src-openeuler/python-pytest-virtualenv - - src-openeuler/python-pyudev - - src-openeuler/python-qrcode - - src-openeuler/python-recommonmark - - src-openeuler/python-redis - - src-openeuler/python-repoze-lru - - src-openeuler/python-requests-file - - src-openeuler/python-rpm-generators - - src-openeuler/python-schedutils - - src-openeuler/python-setuptools - - src-openeuler/python-simpleline - - src-openeuler/python-six - - src-openeuler/python-slip - - src-openeuler/python-sphinxcontrib-spelling - - src-openeuler/python-systemd - - src-openeuler/python-tempita - - src-openeuler/python-u-msgpack-python - - src-openeuler/python-webencodings - - src-openeuler/pyxattr - - src-openeuler/qdox - - src-openeuler/qpid-proton - - src-openeuler/randomizedtesting - - src-openeuler/rapidjson - - src-openeuler/rarian - - src-openeuler/rasdaemon - - src-openeuler/readline - - src-openeuler/realmd - - src-openeuler/recode - - src-openeuler/replacer - - src-openeuler/rmic-maven-plugin - - src-openeuler/rootfiles - - src-openeuler/rpm - - src-openeuler/rpmrebuild - - src-openeuler/rsync - - src-openeuler/rsyslog - - src-openeuler/screen - - src-openeuler/sed - - src-openeuler/setools - - src-openeuler/setroubleshoot-plugins - - src-openeuler/setup - - src-openeuler/sgabios - - src-openeuler/sgpio - - src-openeuler/shadow - - src-openeuler/sharutils - - src-openeuler/shim - - src-openeuler/si-units - - src-openeuler/slang - - src-openeuler/snakeyaml - - src-openeuler/snappy - - src-openeuler/snappy-java - - src-openeuler/sombok - - src-openeuler/speex - - src-openeuler/speexdsp - - src-openeuler/sscg - - src-openeuler/sssd - - src-openeuler/star - - src-openeuler/startup-notification - - src-openeuler/stringtemplate4 - - src-openeuler/subversion - - src-openeuler/sudo - - src-openeuler/sushi - - src-openeuler/symlinks - - src-openeuler/sysstat - - src-openeuler/systemd - - src-openeuler/tar - - src-openeuler/tcl - - src-openeuler/tcllib - - src-openeuler/tcsh - - src-openeuler/TeXamator - - src-openeuler/thrift - - src-openeuler/time - - src-openeuler/timedatex - - src-openeuler/tmpwatch - - src-openeuler/tng - - src-openeuler/tokyocabinet - - src-openeuler/tomcatjss - - src-openeuler/totem - - src-openeuler/totem-pl-parser - - src-openeuler/tracker - - src-openeuler/tracker-miners - - src-openeuler/trousers - - src-openeuler/tuscany-sdo-java - - src-openeuler/umockdev - - src-openeuler/uname-build-checks - - src-openeuler/unicode-emoji - - src-openeuler/unique - - src-openeuler/unit-api - - src-openeuler/univocity-parsers - - src-openeuler/unzip - - src-openeuler/uom-lib - - src-openeuler/uom-parent - - src-openeuler/uom-systems - - src-openeuler/usermode - - src-openeuler/ustr - - src-openeuler/utf8proc - - src-openeuler/uthash - - src-openeuler/util-linux - - src-openeuler/vboot-utils - - src-openeuler/vim - - src-openeuler/volume_key - - src-openeuler/vulkan-headers - - src-openeuler/vulkan-loader - - src-openeuler/which - - src-openeuler/words - - src-openeuler/wpa_supplicant - - src-openeuler/xalan-j2 - - src-openeuler/xmlsec1 - - src-openeuler/xerces-j2 - - src-openeuler/xmlstarlet - - src-openeuler/xmlto - - src-openeuler/xml-commons-resolver - - src-openeuler/xz - - src-openeuler/yajl - - src-openeuler/yaml-cpp - - src-openeuler/yaml-cpp03 - - src-openeuler/yasm - - src-openeuler/zip - - src-openeuler/zlib - - src-openeuler/zopfli - - src-openeuler/zsh - - src-openeuler/zstd - - src-openeuler/zziplib -- name: Container - repositories: - - openeuler/kata_integration - - src-openeuler/kata-micro-kernel - - src-openeuler/jboss-parent - - src-openeuler/clibcni - - src-openeuler/docker-client-java - - src-openeuler/runc - - src-openeuler/virt-what - - src-openeuler/containerd - - src-openeuler/iSulad-img - - src-openeuler/lcr - - src-openeuler/protobuf - - src-openeuler/iSulad - - src-openeuler/podman - - src-openeuler/skopeo - - src-openeuler/kata-shim - - src-openeuler/kata_integration - - src-openeuler/busybox - - src-openeuler/container-selinux - - src-openeuler/lxc - - src-openeuler/docker - - src-openeuler/kata-runtime - - src-openeuler/libevhtp - - src-openeuler/kata-proxy - - src-openeuler/lxcfs - - src-openeuler/containernetworking-plugins - - src-openeuler/libcgroup - - src-openeuler/kata-agent - - src-openeuler/libnetwork - - src-openeuler/kubernetes - - src-openeuler/docker-compose -- name: Compiler - repositories: - - src-openeuler/gcc - - src-openeuler/llvm - - src-openeuler/clang - - src-openeuler/compiler-rt - - src-openeuler/jtreg - - src-openeuler/openjdk-1.8.0 - - src-openeuler/openjdk-11 - - src-openeuler/openjdk-latest - - src-openeuler/openjfx8 - - src-openeuler/openjfx11 - - src-openeuler/icedtea-web - - src-openeuler/rust - - openeuler/bishengjdk-8 - - openeuler/bishengjdk-11 -- name: Storage - repositories: - - src-openeuler/system-storage-manager - - src-openeuler/gom - - src-openeuler/parted - - src-openeuler/iprutils - - src-openeuler/ndctl - - src-openeuler/fuse - - src-openeuler/tree - - src-openeuler/sg3_utils - - src-openeuler/mdadm - - src-openeuler/python-configobj - - src-openeuler/btrfs-progs - - src-openeuler/python-rtslib - - src-openeuler/ccid - - src-openeuler/attr - - src-openeuler/smartmontools - - src-openeuler/luksmeta - - src-openeuler/nfs4-acl-tools - - src-openeuler/cryptsetup - - src-openeuler/udisks2 - - src-openeuler/mtools - - src-openeuler/libblockdev - - src-openeuler/libldm - - src-openeuler/sdparm - - src-openeuler/perl-DBD-SQLite - - src-openeuler/libpciaccess - - src-openeuler/iotop - - src-openeuler/xfsdump - - src-openeuler/open-iscsi - - src-openeuler/libaio - - src-openeuler/libusbmuxd - - src-openeuler/file - - src-openeuler/e2fsprogs - - src-openeuler/gdbm - - src-openeuler/thin-provisioning-tools - - src-openeuler/dosfstools - - src-openeuler/libusbx - - src-openeuler/mariadb - - src-openeuler/pciutils - - src-openeuler/blktrace - - src-openeuler/usbredir - - src-openeuler/lvm2 - - src-openeuler/dmraid - - src-openeuler/libtalloc - - src-openeuler/perl-DBD-MySQL - - src-openeuler/quota - - src-openeuler/mariadb-connector-c - - src-openeuler/xfsprogs - - src-openeuler/nfs-utils - - src-openeuler/libtevent - - src-openeuler/gdisk - - src-openeuler/glusterfs - - src-openeuler/multipath-tools - - src-openeuler/sysfsutils - - src-openeuler/sqlite - - src-openeuler/smp_utils - - src-openeuler/squashfs-tools - - src-openeuler/libiscsi - - src-openeuler/fxload - - src-openeuler/libusb - - src-openeuler/hdparm - - src-openeuler/pcsc-lite - - src-openeuler/filesystem - - src-openeuler/cifs-utils - - src-openeuler/cachefilesd - - src-openeuler/usbutils - - src-openeuler/lsscsi - - src-openeuler/open-isns - - openeuler/memory-scan - - src-openeuler/fastdfs - - src-openeuler/libfastcommon - - src-openeuler/DCache - - src-openeuler/s3fs-fuse -- name: Desktop - repositories: - - src-openeuler/abattis-cantarell-fonts - - src-openeuler/accountsservice - - src-openeuler/adobe-mappings-cmap - - src-openeuler/adobe-mappings-pdf - - src-openeuler/adwaita-icon-theme - - src-openeuler/adwaita-qt - - src-openeuler/at-spi2-atk - - src-openeuler/at-spi2-core - - src-openeuler/atk - - src-openeuler/augeas - - src-openeuler/avahi - - src-openeuler/bluez - - src-openeuler/bpg-fonts - - src-openeuler/brltty - - src-openeuler/cairo - - src-openeuler/cairomm - - src-openeuler/cdparanoia - - src-openeuler/CharLS - - src-openeuler/cheese - - src-openeuler/cjkuni-ukai-fonts - - src-openeuler/clutter - - src-openeuler/clutter-gst3 - - src-openeuler/clutter-gtk - - src-openeuler/cockpit - - src-openeuler/cogl - - src-openeuler/color-filesystem - - src-openeuler/colord - - src-openeuler/comps-extras - - src-openeuler/cups - - src-openeuler/cups-pk-helper - - src-openeuler/dconf - - src-openeuler/dconf-editor - - src-openeuler/desktop-file-utils - - src-openeuler/disomaster - - src-openeuler/emacs - - src-openeuler/enchant - - src-openeuler/epiphany - - src-openeuler/evolution-data-server - - src-openeuler/exiv2 - - src-openeuler/fltk - - src-openeuler/fontconfig - - src-openeuler/fontpackages - - src-openeuler/freetype - - src-openeuler/fribidi - - src-openeuler/fros - - src-openeuler/GConf2 - - src-openeuler/gcr - - src-openeuler/gd - - src-openeuler/gdk-pixbuf2 - - src-openeuler/gdm - - src-openeuler/geoclue2 - - src-openeuler/geocode-glib - - src-openeuler/giflib - - src-openeuler/gio-qt - - src-openeuler/gjs - - src-openeuler/glade - - src-openeuler/glib2 - - src-openeuler/gnome-abrt - - src-openeuler/gnome-bluetooth - - src-openeuler/gnome-boxes - - src-openeuler/gnome-clocks - - src-openeuler/gnome-contacts - - src-openeuler/gnome-dictionary - - src-openeuler/gnome-doc-utils - - src-openeuler/gnome-icon-theme - - src-openeuler/gnome-initial-setup - - src-openeuler/gnome-keyring - - src-openeuler/gnome-menus - - src-openeuler/gnome-screenshot - - src-openeuler/gnome-session - - src-openeuler/gnome-settings-daemon - - src-openeuler/gnome-shell - - src-openeuler/gnome-shell-extensions - - src-openeuler/gnome-software - - src-openeuler/gnome-system-monitor - - src-openeuler/gnome-terminal - - src-openeuler/gnu-free-fonts - - src-openeuler/google-croscore-fonts - - src-openeuler/google-droid-fonts - - src-openeuler/google-noto-cjk-fonts - - src-openeuler/google-noto-emoji-fonts - - src-openeuler/gpm - - src-openeuler/graphite2 - - src-openeuler/graphviz - - src-openeuler/grilo - - src-openeuler/gsettings-desktop-schemas - - src-openeuler/gsm - - src-openeuler/gstreamer1 - - src-openeuler/gstreamer1-plugins-base - - src-openeuler/gtk2 - - src-openeuler/gtk3 - - src-openeuler/gubbi-fonts - - src-openeuler/guile - - src-openeuler/gv - - src-openeuler/gvfs - - src-openeuler/harfbuzz - - src-openeuler/hicolor-icon-theme - - src-openeuler/hunspell - - src-openeuler/hunspell-en - - src-openeuler/hyperscan - - src-openeuler/ibus - - src-openeuler/ibus-libzhuyin - - src-openeuler/icu - - src-openeuler/imake - - src-openeuler/jbig2dec - - src-openeuler/jbigkit - - src-openeuler/jomolhari-fonts - - src-openeuler/json-glib - - src-openeuler/jxrlib - - src-openeuler/kacst-fonts - - src-openeuler/kbd - - src-openeuler/kde-settings - - src-openeuler/keybinder3 - - src-openeuler/kurdit-unikurd-web-fonts - - src-openeuler/lato-fonts - - src-openeuler/lcms2 - - src-openeuler/libappindicator - - src-openeuler/libarchive - - src-openeuler/libart_lgpl - - src-openeuler/libasyncns - - src-openeuler/libatasmart - - src-openeuler/libbluray - - src-openeuler/libbonobo - - src-openeuler/libbonoboui - - src-openeuler/libcacard - - src-openeuler/libcanberra - - src-openeuler/libcdio - - src-openeuler/libcdio-paranoia - - src-openeuler/libdazzle - - src-openeuler/libdmx - - src-openeuler/libdrm - - src-openeuler/libepoxy - - src-openeuler/libexif - - src-openeuler/libfontenc - - src-openeuler/libgdata - - src-openeuler/libgee - - src-openeuler/libglade2 - - src-openeuler/libglvnd - - src-openeuler/libgpg-error - - src-openeuler/libgtop2 - - src-openeuler/libgudev - - src-openeuler/libgusb - - src-openeuler/libgweather - - src-openeuler/libgxps - - src-openeuler/libical - - src-openeuler/libICE - - src-openeuler/libimobiledevice - - src-openeuler/libiptcdata - - src-openeuler/libisal - - src-openeuler/libjpeg-turbo - - src-openeuler/libldb - - src-openeuler/libmatchbox - - src-openeuler/libmediaart - - src-openeuler/libmediainfo - - src-openeuler/libmng - - src-openeuler/libnotify - - src-openeuler/libpng - - src-openeuler/librsvg2 - - src-openeuler/libsexy - - src-openeuler/libSM - - src-openeuler/libsoup - - src-openeuler/libtiff - - src-openeuler/libtimezonemap - - src-openeuler/libwebp - - src-openeuler/libwnck3 - - src-openeuler/libX11 - - src-openeuler/libx86emu - - src-openeuler/libXau - - src-openeuler/libXaw - - src-openeuler/libxcb - - src-openeuler/libXcomposite - - src-openeuler/libXcursor - - src-openeuler/libXdamage - - src-openeuler/libXdmcp - - src-openeuler/libXext - - src-openeuler/libXfixes - - src-openeuler/libXfont2 - - src-openeuler/libXft - - src-openeuler/libXi - - src-openeuler/libXinerama - - src-openeuler/libxkbcommon - - src-openeuler/libxkbfile - - src-openeuler/libxklavier - - src-openeuler/libXmu - - src-openeuler/libXpm - - src-openeuler/libXrandr - - src-openeuler/libXrender - - src-openeuler/libXres - - src-openeuler/libxshmfence - - src-openeuler/libXt - - src-openeuler/libXtst - - src-openeuler/libXv - - src-openeuler/libXvMC - - src-openeuler/libXxf86dga - - src-openeuler/libXxf86misc - - src-openeuler/libXxf86vm - - src-openeuler/libzen - - src-openeuler/lxsession - - src-openeuler/madan-fonts - - src-openeuler/mailx - - src-openeuler/mesa - - src-openeuler/mesa-libGLU - - src-openeuler/metacity - - src-openeuler/mozilla-filesystem - - src-openeuler/mozjs52 - - src-openeuler/mozjs60 - - src-openeuler/mozjs68 - - src-openeuler/nafees-web-naskh-fonts - - src-openeuler/navilu-fonts - - src-openeuler/ncurses - - src-openeuler/newt - - src-openeuler/openbox - - src-openeuler/openjpeg - - src-openeuler/openjpeg2 - - src-openeuler/orca - - src-openeuler/PackageKit - - src-openeuler/PackageKit-Qt - - src-openeuler/paktype-naqsh-fonts - - src-openeuler/paktype-naskh-basic-fonts - - src-openeuler/paktype-tehreer-fonts - - src-openeuler/pango - - src-openeuler/paratype-pt-sans-fonts - - src-openeuler/pinentry - - src-openeuler/pipewire - - src-openeuler/pixman - - src-openeuler/plymouth - - src-openeuler/poppler - - src-openeuler/poppler-data - - src-openeuler/pyatspi - - src-openeuler/pycairo - - src-openeuler/python-coverage - - src-openeuler/python-dmidecode - - src-openeuler/python-ethtool - - src-openeuler/pytz - - src-openeuler/qrencode - - src-openeuler/qt-settings - - src-openeuler/qt5 - - src-openeuler/rest - - src-openeuler/rtkit - - src-openeuler/saab-fonts - - src-openeuler/samyak-fonts - - src-openeuler/satyr - - src-openeuler/sbc - - src-openeuler/seahorse - - src-openeuler/sendmail - - src-openeuler/setserial - - src-openeuler/sgml-common - - src-openeuler/shared-mime-info - - src-openeuler/sil-nuosu-fonts - - src-openeuler/sil-padauk-fonts - - src-openeuler/sound-theme-freedesktop - - src-openeuler/source-highlight - - src-openeuler/spice - - src-openeuler/spice-gtk - - src-openeuler/spice-vdagent - - src-openeuler/stix-fonts - - src-openeuler/switcheroo-control - - src-openeuler/sysprof - - src-openeuler/taglib - - src-openeuler/telepathy-filesystem - - src-openeuler/telepathy-glib - - src-openeuler/telepathy-logger - - src-openeuler/texinfo - - src-openeuler/thai-scalable-fonts - - src-openeuler/tibetan-machine-uni-fonts - - src-openeuler/tigervnc - - src-openeuler/tk - - src-openeuler/tmux - - src-openeuler/urw-base35-fonts - - src-openeuler/vino - - src-openeuler/wayland - - src-openeuler/webkit2gtk3 - - src-openeuler/webrtc-audio-processing - - src-openeuler/woff2 - - src-openeuler/wqy-microhei-fonts - - src-openeuler/wqy-zenhei-fonts - - src-openeuler/wxGTK3 - - src-openeuler/x265 - - src-openeuler/x3270 - - src-openeuler/Xaw3d - - src-openeuler/xcb-util - - src-openeuler/xdg-desktop-portal - - src-openeuler/xdg-user-dirs - - src-openeuler/xdg-user-dirs-gtk - - src-openeuler/xdg-utils - - src-openeuler/xkeyboard-config - - src-openeuler/xorg-x11-apps - - src-openeuler/xorg-x11-drivers - - src-openeuler/xorg-x11-drv-ati - - src-openeuler/xorg-x11-drv-dummy - - src-openeuler/xorg-x11-drv-evdev - - src-openeuler/xorg-x11-drv-fbdev - - src-openeuler/xorg-x11-drv-intel - - src-openeuler/xorg-x11-drv-libinput - - src-openeuler/xorg-x11-drv-nouveau - - src-openeuler/xorg-x11-drv-qxl - - src-openeuler/xorg-x11-drv-v4l - - src-openeuler/xorg-x11-drv-vesa - - src-openeuler/xorg-x11-drv-vmware - - src-openeuler/xorg-x11-drv-wacom - - src-openeuler/xorg-x11-font-utils - - src-openeuler/xorg-x11-fonts - - src-openeuler/xorg-x11-server - - src-openeuler/xorg-x11-server-utils - - src-openeuler/xorg-x11-utils - - src-openeuler/xorg-x11-xauth - - src-openeuler/xorg-x11-xbitmaps - - src-openeuler/xorg-x11-xinit - - src-openeuler/xorg-x11-xkb-utils - - src-openeuler/xrestop - - src-openeuler/xterm - - src-openeuler/xvattr - - src-openeuler/yelp - - src-openeuler/yelp-xsl - - src-openeuler/yp-tools - - src-openeuler/ypbind - - src-openeuler/ypserv - - src-openeuler/zenity -- name: Computing - repositories: - - src-openeuler/jamm - - src-openeuler/double-conversion - - src-openeuler/ps_mem - - src-openeuler/libqb - - src-openeuler/memkind - - src-openeuler/dyninst - - src-openeuler/libevdev - - src-openeuler/nspr - - src-openeuler/libatomic_ops - - src-openeuler/lm_sensors - - src-openeuler/lttng-ust - - src-openeuler/hwdata - - src-openeuler/irqbalance - - src-openeuler/procps-ng - - src-openeuler/userspace-rcu - - src-openeuler/linux-firmware - - src-openeuler/mpfr - - src-openeuler/libinput - - src-openeuler/boost - - src-openeuler/psmisc - - src-openeuler/numad - - src-openeuler/libthai - - src-openeuler/kmod - - src-openeuler/lockdev - - src-openeuler/hwinfo - - src-openeuler/gdb - - src-openeuler/libipt - - src-openeuler/libsamplerate - - src-openeuler/gperftools - - src-openeuler/libogg - - src-openeuler/pulseaudio - - src-openeuler/libsndfile - - src-openeuler/tzdata - - src-openeuler/flac - - src-openeuler/upower - - src-openeuler/alsa-lib - - src-openeuler/gmp - - src-openeuler/alsa-firmware - - src-openeuler/numactl - - src-openeuler/glibc - - src-openeuler/libijs - - src-openeuler/libmpc - - src-openeuler/npth - - src-openeuler/acpid - - src-openeuler/ORBit2 - - src-openeuler/libwacom - - src-openeuler/i2c-tools - - src-openeuler/strace - - src-openeuler/shapelib - - src-openeuler/tuned - - src-openeuler/systemtap - - src-openeuler/alsa-tools - - src-openeuler/libvisual - - src-openeuler/dmidecode - - src-openeuler/opus - - src-openeuler/libhugetlbfs -- name: sig-Community - repositories: - - openeuler/community - - openeuler/blog -- name: A-Tune - repositories: - - openeuler/A-Tune - - openeuler/prefetch_tuning - - src-openeuler/A-Tune - - src-openeuler/prefetch_tuning - - openeuler/wisdom-advisor - - src-openeuler/wisdom-advisor -- name: kae - repositories: - - openeuler/kae_driver - - openeuler/libkae - - openeuler/libwd - - src-openeuler/kae_driver - - src-openeuler/libkae - - src-openeuler/libwd -- name: iSulad - repositories: - - openeuler/iSulad - - openeuler/lcr - - openeuler/clibcni - - openeuler/iSulad-img - - openeuler/authz - - openeuler/syscontainer-tools - - openeuler/lxcfs-tools - - openeuler/async-libfuse - - openeuler/isula-build - - openeuler/isula-transform - - src-openeuler/authz - - src-openeuler/syscontainer-tools - - src-openeuler/lxcfs-tools - - src-openeuler/isula-build - - src-openeuler/isula-transform - - src-openeuler/libwebsockets -- name: sig-Java - repositories: - - openeuler/Java-Packages - - src-openeuler/aesh - - src-openeuler/android-json-org-java - - src-openeuler/annotation-indexer - - src-openeuler/ant - - src-openeuler/ant-contrib - - src-openeuler/antlr3 - - src-openeuler/aopalliance - - src-openeuler/apache-commons-cli - - src-openeuler/apache-commons-compress - - src-openeuler/apache-commons-configuration - - src-openeuler/apache-commons-discovery - - src-openeuler/apache-commons-exec - - src-openeuler/apache-commons-io - - src-openeuler/apache-commons-jxpath - - src-openeuler/apache-commons-lang3 - - src-openeuler/apache-commons-ognl - - src-openeuler/apache-commons-parent - - src-openeuler/apache-ivy - - src-openeuler/apache-parent - - src-openeuler/apache-resource-bundles - - src-openeuler/apacheds - - src-openeuler/apiguardian - - src-openeuler/aqute-bnd - - src-openeuler/arquillian-core - - src-openeuler/artemis - - src-openeuler/aspectjweaver - - src-openeuler/atinject - - src-openeuler/avalon-framework - - src-openeuler/avalon-logkit - - src-openeuler/BareBonesBrowserLaunch - - src-openeuler/bean-validation-api - - src-openeuler/bsh - - src-openeuler/buildnumber-maven-plugin - - src-openeuler/byaccj - - src-openeuler/byteman - - src-openeuler/c3p0 - - src-openeuler/cassandra-java-driver - - src-openeuler/cdi-api - - src-openeuler/classmate - - src-openeuler/codehaus-parent - - src-openeuler/codemodel - - src-openeuler/cpptasks - - src-openeuler/cxf-build-utils - - src-openeuler/cxf-xjc-utils - - src-openeuler/dain-snappy - - src-openeuler/datanucleus-api-jdo - - src-openeuler/datanucleus-core - - src-openeuler/datanucleus-maven-parent - - src-openeuler/datanucleus-rdbms - - src-openeuler/dnsjava - - src-openeuler/dom4j - - src-openeuler/easymock - - src-openeuler/eclipse-cdt - - src-openeuler/eclipse-ecf - - src-openeuler/eclipse-egit - - src-openeuler/eclipse-emf - - src-openeuler/eclipse-gef - - src-openeuler/eclipse-launchbar - - src-openeuler/eclipse-license - - src-openeuler/eclipse-linuxtools - - src-openeuler/eclipse-m2e-workspace - - src-openeuler/eclipse-mylyn - - src-openeuler/eclipse-photran - - src-openeuler/eclipse-ptp - - src-openeuler/eclipse-remote - - src-openeuler/eclipse-subclipse - - src-openeuler/eclipse-swtbot - - src-openeuler/eclipse-tm-terminal - - src-openeuler/eclipselink - - src-openeuler/ed25519-java - - src-openeuler/ehcache-core - - src-openeuler/ehcache-sizeof-agent - - src-openeuler/evo-inflector - - src-openeuler/exec-maven-plugin - - src-openeuler/extra166y - - src-openeuler/felix-bundlerepository - - src-openeuler/felix-framework - - src-openeuler/felix-gogo-command - - src-openeuler/felix-gogo-parent - - src-openeuler/felix-main - - src-openeuler/felix-osgi-obr-resolver - - src-openeuler/felix-scr - - src-openeuler/felix-utils - - src-openeuler/findbugs - - src-openeuler/findbugs-bcel - - src-openeuler/fop - - src-openeuler/geronimo-annotation - - src-openeuler/geronimo-commonj - - src-openeuler/geronimo-jaxrpc - - src-openeuler/geronimo-jms - - src-openeuler/geronimo-jta - - src-openeuler/geronimo-saaj - - src-openeuler/glassfish-el - - src-openeuler/glassfish-gmbal - - src-openeuler/glassfish-hk2 - - src-openeuler/glassfish-jaxrpc-api - - src-openeuler/glassfish-jsp-api - - src-openeuler/glassfish-management-api - - src-openeuler/glassfish-pfl - - src-openeuler/glassfish-servlet-api - - src-openeuler/glassfish-toplink-essentials - - src-openeuler/glassfish-transaction-api - - src-openeuler/gnu-getopt - - src-openeuler/google-guice - - src-openeuler/gpars - - src-openeuler/grizzly-npn - - src-openeuler/groovy - - src-openeuler/groovy18 - - src-openeuler/gsbase - - src-openeuler/guava20 - - src-openeuler/hawtbuf - - src-openeuler/hawtjni - - src-openeuler/hessian - - src-openeuler/hibernate - - src-openeuler/hibernate-commons-annotations - - src-openeuler/hibernate-jpa-2.0-api - - src-openeuler/hibernate-jpa-2.1-api - - src-openeuler/hibernate-search - - src-openeuler/hibernate-validator - - src-openeuler/hibernate3 - - src-openeuler/hibernate4 - - src-openeuler/HikariCP - - src-openeuler/hsqldb - - src-openeuler/httpcomponents-client - - src-openeuler/httpcomponents-core - - src-openeuler/httpunit - - src-openeuler/icu4j - - src-openeuler/idlj-maven-plugin - - src-openeuler/infinispan - - src-openeuler/invokebinder - - src-openeuler/irclib - - src-openeuler/ironjacamar - - src-openeuler/itext - - src-openeuler/jackcess - - src-openeuler/jackcess-encrypt - - src-openeuler/jackson - - src-openeuler/jackson-databind - - src-openeuler/jackson-dataformat-xml - - src-openeuler/jackson-dataformats-text - - src-openeuler/jackson-datatype-joda - - src-openeuler/jackson-datatypes-collections - - src-openeuler/jackson-jaxrs-providers - - src-openeuler/jackson-modules-base - - src-openeuler/jacoco - - src-openeuler/jacorb - - src-openeuler/jaf - - src-openeuler/jakarta-commons-httpclient - - src-openeuler/jamonapi - - src-openeuler/jandex - - src-openeuler/jandex-maven-plugin - - src-openeuler/janino - - src-openeuler/jansi - - src-openeuler/jansi-native - - src-openeuler/jasperreports - - src-openeuler/jastow - - src-openeuler/jasypt - - src-openeuler/java-libpst - - src-openeuler/java-oauth - - src-openeuler/java-service-wrapper - - src-openeuler/java-xmlbuilder - - src-openeuler/javacc - - src-openeuler/javapackages-tools - - src-openeuler/javapoet - - src-openeuler/javassist - - src-openeuler/jaxb2-common-basics - - src-openeuler/jaxb2-maven-plugin - - src-openeuler/jaxen - - src-openeuler/jberet - - src-openeuler/jboss-batch-1.0-api - - src-openeuler/jboss-classfilewriter - - src-openeuler/jboss-common-beans - - src-openeuler/jboss-concurrency-1.0-api - - src-openeuler/jboss-connector-1.7-api - - src-openeuler/jboss-dmr - - src-openeuler/jboss-ejb-3.1-api - - src-openeuler/jboss-ejb-3.2-api - - src-openeuler/jboss-ejb-client - - src-openeuler/jboss-ejb3-ext-api - - src-openeuler/jboss-el-2.2-api - - src-openeuler/jboss-el-3.0-api - - src-openeuler/jboss-iiop-client - - src-openeuler/jboss-integration - - src-openeuler/jboss-interceptors-1.1-api - - src-openeuler/jboss-interceptors-1.2-api - - src-openeuler/jboss-invocation - - src-openeuler/jboss-jacc-1.4-api - - src-openeuler/jboss-jacc-1.5-api - - src-openeuler/jboss-jaspi-1.0-api - - src-openeuler/jboss-jaspi-1.1-api - - src-openeuler/jboss-jaxb-2.2-api - - src-openeuler/jboss-jaxrpc-1.1-api - - src-openeuler/jboss-jaxws-2.2-api - - src-openeuler/jboss-jms-1.1-api - - src-openeuler/jboss-jsf-2.2-api - - src-openeuler/jboss-jsp-2.2-api - - src-openeuler/jboss-logging - - src-openeuler/jboss-logging-tools - - src-openeuler/jboss-logging-tools1 - - src-openeuler/jboss-logmanager - - src-openeuler/jboss-marshalling - - src-openeuler/jboss-metadata - - src-openeuler/jboss-modules - - src-openeuler/jboss-msc - - src-openeuler/jboss-negotiation - - src-openeuler/jboss-remote-naming - - src-openeuler/jboss-remoting-jmx - - src-openeuler/jboss-rmi-1.0-api - - src-openeuler/jboss-sasl - - src-openeuler/jboss-servlet-2.5-api - - src-openeuler/jboss-servlet-3.0-api - - src-openeuler/jboss-specs-parent - - src-openeuler/jboss-threads - - src-openeuler/jboss-transaction-1.1-api - - src-openeuler/jboss-transaction-1.2-api - - src-openeuler/jboss-transaction-spi - - src-openeuler/jboss-vfs - - src-openeuler/jboss-websocket-1.1-api - - src-openeuler/jbossws-api - - src-openeuler/jbossws-parent - - src-openeuler/jcifs - - src-openeuler/jcip-annotations - - src-openeuler/jcommon - - src-openeuler/jcsp - - src-openeuler/jdbi - - src-openeuler/jdependency - - src-openeuler/jdiff - - src-openeuler/jdo-api - - src-openeuler/jdo2-api - - src-openeuler/jdom2 - - src-openeuler/je - - src-openeuler/jenkins-executable-war - - src-openeuler/jenkins-xstream - - src-openeuler/jersey - - src-openeuler/jersey1 - - src-openeuler/jets3t - - src-openeuler/jetty-alpn - - src-openeuler/jetty-alpn-api - - src-openeuler/jetty-artifact-remote-resources - - src-openeuler/jetty-assembly-descriptors - - src-openeuler/jetty-build-support - - src-openeuler/jetty-distribution-remote-resources - - src-openeuler/jetty-test-helper - - src-openeuler/jetty-test-policy - - src-openeuler/jetty-toolchain - - src-openeuler/jetty-version-maven-plugin - - src-openeuler/jetty8 - - src-openeuler/jflex - - src-openeuler/jFormatString - - src-openeuler/jfreechart - - src-openeuler/jgit - - src-openeuler/jgroups - - src-openeuler/jibx - - src-openeuler/jline - - src-openeuler/jline1 - - src-openeuler/jmatio - - src-openeuler/jmh - - src-openeuler/jmock - - src-openeuler/jna - - src-openeuler/jnr-x86asm - - src-openeuler/joda-time - - src-openeuler/johnzon - - src-openeuler/json-path - - src-openeuler/json-smart - - src-openeuler/jsonic - - src-openeuler/jsoup - - src-openeuler/jspc - - src-openeuler/jsr-305 - - src-openeuler/jsr-311 - - src-openeuler/jtidy - - src-openeuler/jtoaster - - src-openeuler/jts - - src-openeuler/jul-to-slf4j-stub - - src-openeuler/junit-addons - - src-openeuler/junitperf - - src-openeuler/juniversalchardet - - src-openeuler/jvnet-parent - - src-openeuler/jwnl - - src-openeuler/jython - - src-openeuler/kxml - - src-openeuler/language-detector - - src-openeuler/ldaptive - - src-openeuler/lettuce - - src-openeuler/leveldb-java - - src-openeuler/leveldbjni - - src-openeuler/lightcouch - - src-openeuler/log4j - - src-openeuler/log4j-jboss-logmanager - - src-openeuler/lucene3 - - src-openeuler/lz4-java - - src-openeuler/lzma-java - - src-openeuler/maven - - src-openeuler/maven-antrun-plugin - - src-openeuler/maven-archiver - - src-openeuler/maven-artifact-resolver - - src-openeuler/maven-artifact-transfer - - src-openeuler/maven-assembly-plugin - - src-openeuler/maven-checkstyle-plugin - - src-openeuler/maven-common-artifact-filters - - src-openeuler/maven-compiler-plugin - - src-openeuler/maven-dependency-analyzer - - src-openeuler/maven-dependency-plugin - - src-openeuler/maven-dependency-tree - - src-openeuler/maven-doxia - - src-openeuler/maven-doxia-sitetools - - src-openeuler/maven-eclipse-plugin - - src-openeuler/maven-enforcer - - src-openeuler/maven-file-management - - src-openeuler/maven-filtering - - src-openeuler/maven-gpg-plugin - - src-openeuler/maven-idea-plugin - - src-openeuler/maven-injection-plugin - - src-openeuler/maven-invoker - - src-openeuler/maven-invoker-plugin - - src-openeuler/maven-jar-plugin - - src-openeuler/maven-jarsigner-plugin - - src-openeuler/maven-javadoc-plugin - - src-openeuler/maven-jaxb2-plugin - - src-openeuler/maven-license-plugin - - src-openeuler/maven-local - - src-openeuler/maven-mapping - - src-openeuler/maven-native - - src-openeuler/maven-parent - - src-openeuler/maven-plugin-build-helper - - src-openeuler/maven-plugin-bundle - - src-openeuler/maven-plugin-testing - - src-openeuler/maven-plugin-tools - - src-openeuler/maven-processor-plugin - - src-openeuler/maven-remote-resources-plugin - - src-openeuler/maven-reporting-api - - src-openeuler/maven-reporting-exec - - src-openeuler/maven-reporting-impl - - src-openeuler/maven-resolver - - src-openeuler/maven-resources-plugin - - src-openeuler/maven-script-interpreter - - src-openeuler/maven-shade-plugin - - src-openeuler/maven-shared-incremental - - src-openeuler/maven-shared-io - - src-openeuler/maven-shared-jar - - src-openeuler/maven-shared-jarsigner - - src-openeuler/maven-shared-utils - - src-openeuler/maven-site-plugin - - src-openeuler/maven-source-plugin - - src-openeuler/maven-surefire - - src-openeuler/maven-verifier - - src-openeuler/maven-wagon - - src-openeuler/maven-war-plugin - - src-openeuler/maven2 - - src-openeuler/mavibot - - src-openeuler/mchange-commons - - src-openeuler/memoryfilesystem - - src-openeuler/metainf-services - - src-openeuler/metrics - - src-openeuler/mimepull - - src-openeuler/mojarra - - src-openeuler/mongo-java-driver - - src-openeuler/multiverse - - src-openeuler/mustache-java - - src-openeuler/mx4j - - src-openeuler/narayana - - src-openeuler/native-platform - - src-openeuler/netty-tcnative - - src-openeuler/netty3 - - src-openeuler/noggit - - src-openeuler/objectweb-pom - - src-openeuler/objenesis - - src-openeuler/ohc - - src-openeuler/openjpa - - src-openeuler/openwebbeans - - src-openeuler/os-maven-plugin - - src-openeuler/parboiled - - src-openeuler/pdf-renderer - - src-openeuler/pdfbox - - src-openeuler/pegdown - - src-openeuler/picketbox - - src-openeuler/picketbox-commons - - src-openeuler/picketbox-xacml - - src-openeuler/plexus-archiver - - src-openeuler/plexus-build-api - - src-openeuler/plexus-cipher - - src-openeuler/plexus-classworlds - - src-openeuler/plexus-cli - - src-openeuler/plexus-compiler - - src-openeuler/plexus-component-api - - src-openeuler/plexus-components-pom - - src-openeuler/plexus-containers - - src-openeuler/plexus-i18n - - src-openeuler/plexus-interactivity - - src-openeuler/plexus-interpolation - - src-openeuler/plexus-io - - src-openeuler/plexus-languages - - src-openeuler/plexus-pom - - src-openeuler/plexus-resources - - src-openeuler/plexus-sec-dispatcher - - src-openeuler/plexus-utils - - src-openeuler/plexus-velocity - - src-openeuler/postgresql-jdbc - - src-openeuler/proguard - - src-openeuler/protostream - - src-openeuler/proxool - - src-openeuler/proxytoys - - src-openeuler/qpid-proton-java - - src-openeuler/quartz - - src-openeuler/querydsl3 - - src-openeuler/rabbitmq-java-client - - src-openeuler/reflections - - src-openeuler/remotetea - - src-openeuler/resteasy - - src-openeuler/rhino - - src-openeuler/rhq-plugin-annotations - - src-openeuler/robust-http-client - - src-openeuler/rome - - src-openeuler/rxjava - - src-openeuler/rxtx - - src-openeuler/sac - - src-openeuler/sat4j - - src-openeuler/saxpath - - src-openeuler/scala - - src-openeuler/scannotation - - src-openeuler/sequence-library - - src-openeuler/serp - - src-openeuler/sezpoz - - src-openeuler/shibboleth-java-parent-v3 - - src-openeuler/shibboleth-java-support - - src-openeuler/shrinkwrap - - src-openeuler/shrinkwrap-descriptors - - src-openeuler/shrinkwrap-resolver - - src-openeuler/sigar - - src-openeuler/signpost-core - - src-openeuler/simple - - src-openeuler/simple-xml - - src-openeuler/sisu - - src-openeuler/sisu-mojos - - src-openeuler/slf4j-jboss-logmanager - - src-openeuler/snowball-java - - src-openeuler/sonatype-oss-parent - - src-openeuler/sonatype-plugins-parent - - src-openeuler/spatial4j - - src-openeuler/spring-ldap - - src-openeuler/springframework - - src-openeuler/springframework-amqp - - src-openeuler/springframework-batch - - src-openeuler/springframework-data-commons - - src-openeuler/springframework-data-mongodb - - src-openeuler/springframework-data-redis - - src-openeuler/springframework-hateoas - - src-openeuler/springframework-plugin - - src-openeuler/springframework-retry - - src-openeuler/spymemcached - - src-openeuler/sqljet - - src-openeuler/sslext - - src-openeuler/stapler - - src-openeuler/stapler-adjunct-timeline - - src-openeuler/staxmapper - - src-openeuler/stream-lib - - src-openeuler/struts - - src-openeuler/svnkit - - src-openeuler/swagger-core - - src-openeuler/swt-chart - - src-openeuler/tagsoup - - src-openeuler/takari-archiver - - src-openeuler/takari-incrementalbuild - - src-openeuler/takari-lifecycle - - src-openeuler/takari-plugin-testing - - src-openeuler/takari-pom - - src-openeuler/tascalate-asmx - - src-openeuler/tascalate-javaflow - - src-openeuler/test-interface - - src-openeuler/thredds - - src-openeuler/tika - - src-openeuler/tiles - - src-openeuler/time-api - - src-openeuler/tomcat-taglibs-parent - - src-openeuler/treelayout - - src-openeuler/trilead-putty-extension - - src-openeuler/trilead-ssh2 - - src-openeuler/txw2 - - src-openeuler/tycho - - src-openeuler/tycho-extras - - src-openeuler/typesafe-config - - src-openeuler/uima-addons - - src-openeuler/uima-parent-pom - - src-openeuler/uimaj - - src-openeuler/undertow - - src-openeuler/velocity - - src-openeuler/velocity-tools - - src-openeuler/vorbis-java - - src-openeuler/weld-api - - src-openeuler/weld-core - - src-openeuler/weld-parent - - src-openeuler/wildfly-build-tools - - src-openeuler/wildfly-core - - src-openeuler/wildfly-elytron - - src-openeuler/wildfly-security-manager - - src-openeuler/ws-jaxme - - src-openeuler/ws-xmlschema - - src-openeuler/wsdl4j - - src-openeuler/wss4j - - src-openeuler/xapool - - src-openeuler/xbean - - src-openeuler/xml-maven-plugin - - src-openeuler/xml-security - - src-openeuler/xmlbeans - - src-openeuler/xmlbeans-maven-plugin - - src-openeuler/xmlenc - - src-openeuler/xmlrpc - - src-openeuler/xmlunit - - src-openeuler/xmpcore - - src-openeuler/xmvn - - src-openeuler/xnio - - src-openeuler/xpp3 - - src-openeuler/xsom - - src-openeuler/xstream - - src-openeuler/yecht - - src-openeuler/znerd-oss-parent - - src-openeuler/zxing -- name: sig-ruby - repositories: - - src-openeuler/jruby - - src-openeuler/ruby - - src-openeuler/ruby-augeas - - src-openeuler/ruby-common - - src-openeuler/rubygem-abrt - - src-openeuler/rubygem-actioncable - - src-openeuler/rubygem-actionmailer - - src-openeuler/rubygem-actionpack - - src-openeuler/rubygem-actionview - - src-openeuler/rubygem-activejob - - src-openeuler/rubygem-activemodel - - src-openeuler/rubygem-activemodel-serializers-xml - - src-openeuler/rubygem-activerecord - - src-openeuler/rubygem-activeresource - - src-openeuler/rubygem-activestorage - - src-openeuler/rubygem-activesupport - - src-openeuler/rubygem-addressable - - src-openeuler/rubygem-afm - - src-openeuler/rubygem-ansi - - src-openeuler/rubygem-arel - - src-openeuler/rubygem-aruba - - src-openeuler/rubygem-Ascii85 - - src-openeuler/rubygem-asciidoctor - - src-openeuler/rubygem-atomic - - src-openeuler/rubygem-backports - - src-openeuler/rubygem-bacon - - src-openeuler/rubygem-bcrypt - - src-openeuler/rubygem-bindex - - src-openeuler/rubygem-bootsnap - - src-openeuler/rubygem-builder - - src-openeuler/rubygem-bundler - - src-openeuler/rubygem-byebug - - src-openeuler/rubygem-capybara - - src-openeuler/rubygem-childprocess - - src-openeuler/rubygem-chronic - - src-openeuler/rubygem-coderay - - src-openeuler/rubygem-coffee-script - - src-openeuler/rubygem-coffee-script-source - - src-openeuler/rubygem-concurrent-ruby - - src-openeuler/rubygem-connection_pool - - src-openeuler/rubygem-contracts - - src-openeuler/rubygem-crack - - src-openeuler/rubygem-crass - - src-openeuler/rubygem-creole - - src-openeuler/rubygem-cucumber - - src-openeuler/rubygem-cucumber-core - - src-openeuler/rubygem-cucumber-expressions - - src-openeuler/rubygem-cucumber-tag_expressions - - src-openeuler/rubygem-cucumber-wire - - src-openeuler/rubygem-curb - - src-openeuler/rubygem-daemons - - src-openeuler/rubygem-dalli - - src-openeuler/rubygem-delorean - - src-openeuler/rubygem-diff-lcs - - src-openeuler/rubygem-docile - - src-openeuler/rubygem-domain_name - - src-openeuler/rubygem-ejs - - src-openeuler/rubygem-erubi - - src-openeuler/rubygem-erubis - - src-openeuler/rubygem-ethon - - src-openeuler/rubygem-eventmachine - - src-openeuler/rubygem-excon - - src-openeuler/rubygem-execjs - - src-openeuler/rubygem-expression_parser - - src-openeuler/rubygem-fakefs - - src-openeuler/rubygem-faraday - - src-openeuler/rubygem-fattr - - src-openeuler/rubygem-ffi - - src-openeuler/rubygem-flexmock - - src-openeuler/rubygem-formatador - - src-openeuler/rubygem-gem2rpm - - src-openeuler/rubygem-gherkin - - src-openeuler/rubygem-globalid - - src-openeuler/rubygem-haml - - src-openeuler/rubygem-hashdiff - - src-openeuler/rubygem-hashery - - src-openeuler/rubygem-http-cookie - - src-openeuler/rubygem-httpclient - - src-openeuler/rubygem-i18n - - src-openeuler/rubygem-idn - - src-openeuler/rubygem-introspection - - src-openeuler/rubygem-jbuilder - - src-openeuler/rubygem-jquery-rails - - src-openeuler/rubygem-json_pure - - src-openeuler/rubygem-launchy - - src-openeuler/rubygem-liquid - - src-openeuler/rubygem-listen - - src-openeuler/rubygem-loofah - - src-openeuler/rubygem-mail - - src-openeuler/rubygem-marcel - - src-openeuler/rubygem-maruku - - src-openeuler/rubygem-memcache-client - - src-openeuler/rubygem-metaclass - - src-openeuler/rubygem-method_source - - src-openeuler/rubygem-mime-types - - src-openeuler/rubygem-mime-types-data - - src-openeuler/rubygem-mimemagic - - src-openeuler/rubygem-mini_magick - - src-openeuler/rubygem-mini_mime - - src-openeuler/rubygem-minitest - - src-openeuler/rubygem-minitest-reporters - - src-openeuler/rubygem-minitest4 - - src-openeuler/rubygem-mocha - - src-openeuler/rubygem-msgpack - - src-openeuler/rubygem-multi_json - - src-openeuler/rubygem-multi_test - - src-openeuler/rubygem-multipart-post - - src-openeuler/rubygem-mustermann - - src-openeuler/rubygem-nio4r - - src-openeuler/rubygem-nokogiri - - src-openeuler/rubygem-open4 - - src-openeuler/rubygem-pathspec - - src-openeuler/rubygem-pdf-core - - src-openeuler/rubygem-pdf-inspector - - src-openeuler/rubygem-pdf-reader - - src-openeuler/rubygem-pkg-config - - src-openeuler/rubygem-power_assert - - src-openeuler/rubygem-prawn - - src-openeuler/rubygem-prawn-table - - src-openeuler/rubygem-pry - - src-openeuler/rubygem-pry-nav - - src-openeuler/rubygem-public_suffix - - src-openeuler/rubygem-puma - - src-openeuler/rubygem-rack - - src-openeuler/rubygem-rack-cache - - src-openeuler/rubygem-rack-protection - - src-openeuler/rubygem-rack-test - - src-openeuler/rubygem-rails - - src-openeuler/rubygem-rails-controller-testing - - src-openeuler/rubygem-rails-dom-testing - - src-openeuler/rubygem-rails-html-sanitizer - - src-openeuler/rubygem-railties - - src-openeuler/rubygem-rake-compiler - - src-openeuler/rubygem-rb-inotify - - src-openeuler/rubygem-rdiscount - - src-openeuler/rubygem-redcarpet - - src-openeuler/rubygem-RedCloth - - src-openeuler/rubygem-redis - - src-openeuler/rubygem-rgen - - src-openeuler/rubygem-rouge - - src-openeuler/rubygem-rspec - - src-openeuler/rubygem-rspec-core - - src-openeuler/rubygem-rspec-expectations - - src-openeuler/rubygem-rspec-its - - src-openeuler/rubygem-rspec-mocks - - src-openeuler/rubygem-rspec-rails - - src-openeuler/rubygem-rspec-support - - src-openeuler/rubygem-rspec2 - - src-openeuler/rubygem-rspec2-core - - src-openeuler/rubygem-rspec2-expectations - - src-openeuler/rubygem-rspec2-mocks - - src-openeuler/rubygem-ruby-progressbar - - src-openeuler/rubygem-ruby-rc4 - - src-openeuler/rubygem-ruby-shadow - - src-openeuler/rubygem-rubyzip - - src-openeuler/rubygem-safe_yaml - - src-openeuler/rubygem-sass - - src-openeuler/rubygem-sass-rails - - src-openeuler/rubygem-sdoc - - src-openeuler/rubygem-selenium-webdriver - - src-openeuler/rubygem-session - - src-openeuler/rubygem-shindo - - src-openeuler/rubygem-shoulda - - src-openeuler/rubygem-shoulda-context - - src-openeuler/rubygem-shoulda-matchers - - src-openeuler/rubygem-simplecov - - src-openeuler/rubygem-simplecov-html - - src-openeuler/rubygem-sinatra - - src-openeuler/rubygem-slop - - src-openeuler/rubygem-spring - - src-openeuler/rubygem-sprockets - - src-openeuler/rubygem-sprockets-rails - - src-openeuler/rubygem-sqlite3 - - src-openeuler/rubygem-temple - - src-openeuler/rubygem-test_declarative - - src-openeuler/rubygem-thin - - src-openeuler/rubygem-thor - - src-openeuler/rubygem-thread_order - - src-openeuler/rubygem-thread_safe - - src-openeuler/rubygem-tilt - - src-openeuler/rubygem-timecop - - src-openeuler/rubygem-ttfunk - - src-openeuler/rubygem-turbolinks - - src-openeuler/rubygem-turbolinks-source - - src-openeuler/rubygem-typhoeus - - src-openeuler/rubygem-tzinfo - - src-openeuler/rubygem-uglifier - - src-openeuler/rubygem-unf - - src-openeuler/rubygem-unf_ext - - src-openeuler/rubygem-webmock - - src-openeuler/rubygem-websocket - - src-openeuler/rubygem-websocket-driver - - src-openeuler/rubygem-websocket-extensions - - src-openeuler/rubygem-wikicloth - - src-openeuler/rubygem-xpath - - src-openeuler/rubygem-yard - - src-openeuler/rubygem-ZenTest - - src-openeuler/rubygems-ronn -- name: sig-nodejs - repositories: - - src-openeuler/closure-compiler - - src-openeuler/expresso - - src-openeuler/js-jquery2 - - src-openeuler/js-sizzle - - src-openeuler/lodash - - src-openeuler/node-gyp - - src-openeuler/nodejs - - src-openeuler/nodejs-abbrev - - src-openeuler/nodejs-acorn - - src-openeuler/nodejs-ansi - - src-openeuler/nodejs-ansi-font - - src-openeuler/nodejs-ansi-regex - - src-openeuler/nodejs-ansi-styles - - src-openeuler/nodejs-are-we-there-yet - - src-openeuler/nodejs-argparse - - src-openeuler/nodejs-array-differ - - src-openeuler/nodejs-array-index - - src-openeuler/nodejs-array-union - - src-openeuler/nodejs-array-uniq - - src-openeuler/nodejs-arrify - - src-openeuler/nodejs-asap - - src-openeuler/nodejs-asn1 - - src-openeuler/nodejs-assert-plus - - src-openeuler/nodejs-assertion-error - - src-openeuler/nodejs-async - - src-openeuler/nodejs-aws-sign2 - - src-openeuler/nodejs-balanced-match - - src-openeuler/nodejs-better-assert - - src-openeuler/nodejs-bindings - - src-openeuler/nodejs-bl - - src-openeuler/nodejs-block-stream - - src-openeuler/nodejs-bluebird - - src-openeuler/nodejs-boom - - src-openeuler/nodejs-brace-expansion - - src-openeuler/nodejs-buffer-equal - - src-openeuler/nodejs-builtin-modules - - src-openeuler/nodejs-bunker - - src-openeuler/nodejs-burrito - - src-openeuler/nodejs-bytes - - src-openeuler/nodejs-caller-callsite - - src-openeuler/nodejs-caller-path - - src-openeuler/nodejs-callsite - - src-openeuler/nodejs-callsites - - src-openeuler/nodejs-caseless - - src-openeuler/nodejs-chai - - src-openeuler/nodejs-chalk - - src-openeuler/nodejs-character-parser - - src-openeuler/nodejs-charm - - src-openeuler/nodejs-cjson - - src-openeuler/nodejs-clean-css - - src-openeuler/nodejs-cli-color - - src-openeuler/nodejs-clone - - src-openeuler/nodejs-closure-compiler - - src-openeuler/nodejs-colors - - src-openeuler/nodejs-combined-stream - - src-openeuler/nodejs-commander - - src-openeuler/nodejs-commonmark - - src-openeuler/nodejs-concat-map - - src-openeuler/nodejs-concat-stream - - src-openeuler/nodejs-console-dot-log - - src-openeuler/nodejs-constantinople - - src-openeuler/nodejs-core-util-is - - src-openeuler/nodejs-cryptiles - - src-openeuler/nodejs-css - - src-openeuler/nodejs-css-parse - - src-openeuler/nodejs-css-stringify - - src-openeuler/nodejs-ctype - - src-openeuler/nodejs-d - - src-openeuler/nodejs-dateformat - - src-openeuler/nodejs-debug - - src-openeuler/nodejs-deep-eql - - src-openeuler/nodejs-deep-equal - - src-openeuler/nodejs-deep-is - - src-openeuler/nodejs-defence - - src-openeuler/nodejs-defence-cli - - src-openeuler/nodejs-define-properties - - src-openeuler/nodejs-defined - - src-openeuler/nodejs-delayed-stream - - src-openeuler/nodejs-delegates - - src-openeuler/nodejs-diff - - src-openeuler/nodejs-difflet - - src-openeuler/nodejs-difflib - - src-openeuler/nodejs-docopt - - src-openeuler/nodejs-dreamopt - - src-openeuler/nodejs-duplexer - - src-openeuler/nodejs-ebnf-parser - - src-openeuler/nodejs-ejs - - src-openeuler/nodejs-end-of-stream - - src-openeuler/nodejs-entities - - src-openeuler/nodejs-es-abstract - - src-openeuler/nodejs-es-to-primitive - - src-openeuler/nodejs-es5-ext - - src-openeuler/nodejs-es6-iterator - - src-openeuler/nodejs-es6-symbol - - src-openeuler/nodejs-es6-weak-map - - src-openeuler/nodejs-escape-string-regexp - - src-openeuler/nodejs-escodegen - - src-openeuler/nodejs-esprima - - src-openeuler/nodejs-estraverse - - src-openeuler/nodejs-esutils - - src-openeuler/nodejs-event-emitter - - src-openeuler/nodejs-eventemitter2 - - src-openeuler/nodejs-events-to-array - - src-openeuler/nodejs-exit - - src-openeuler/nodejs-expect-dot-js - - src-openeuler/nodejs-extend - - src-openeuler/nodejs-eyes - - src-openeuler/nodejs-fast-levenshtein - - src-openeuler/nodejs-faye-websocket - - src-openeuler/nodejs-figures - - src-openeuler/nodejs-fileset - - src-openeuler/nodejs-fill-keys - - src-openeuler/nodejs-find-up - - src-openeuler/nodejs-findup-sync - - src-openeuler/nodejs-flot - - src-openeuler/nodejs-for-each - - src-openeuler/nodejs-foreach - - src-openeuler/nodejs-forever-agent - - src-openeuler/nodejs-form-data - - src-openeuler/nodejs-formatio - - src-openeuler/nodejs-from - - src-openeuler/nodejs-fstream - - src-openeuler/nodejs-function-bind - - src-openeuler/nodejs-gauge - - src-openeuler/nodejs-gaze - - src-openeuler/nodejs-generate-function - - src-openeuler/nodejs-generate-object-property - - src-openeuler/nodejs-getobject - - src-openeuler/nodejs-github-url-from-git - - src-openeuler/nodejs-glob - - src-openeuler/nodejs-globule - - src-openeuler/nodejs-graceful-fs - - src-openeuler/nodejs-graceful-readlink - - src-openeuler/nodejs-growl - - src-openeuler/nodejs-grunt - - src-openeuler/nodejs-grunt-cli - - src-openeuler/nodejs-grunt-contrib-clean - - src-openeuler/nodejs-grunt-contrib-internal - - src-openeuler/nodejs-grunt-contrib-nodeunit - - src-openeuler/nodejs-grunt-contrib-uglify - - src-openeuler/nodejs-grunt-contrib-watch - - src-openeuler/nodejs-grunt-known-options - - src-openeuler/nodejs-grunt-legacy-log - - src-openeuler/nodejs-grunt-legacy-log-utils - - src-openeuler/nodejs-grunt-legacy-util - - src-openeuler/nodejs-gzip-size - - src-openeuler/nodejs-handlebars - - src-openeuler/nodejs-har-validator - - src-openeuler/nodejs-has - - src-openeuler/nodejs-has-ansi - - src-openeuler/nodejs-has-color - - src-openeuler/nodejs-has-flag - - src-openeuler/nodejs-has-symbols - - src-openeuler/nodejs-has-unicode - - src-openeuler/nodejs-hash_file - - src-openeuler/nodejs-hashish - - src-openeuler/nodejs-hawk - - src-openeuler/nodejs-heap - - src-openeuler/nodejs-hoek - - src-openeuler/nodejs-hooker - - src-openeuler/nodejs-hosted-git-info - - src-openeuler/nodejs-http-signature - - src-openeuler/nodejs-iconv - - src-openeuler/nodejs-iconv-lite - - src-openeuler/nodejs-image-size - - src-openeuler/nodejs-inflight - - src-openeuler/nodejs-inherits - - src-openeuler/nodejs-inherits1 - - src-openeuler/nodejs-interpret - - src-openeuler/nodejs-is - - src-openeuler/nodejs-is-builtin-module - - src-openeuler/nodejs-is-callable - - src-openeuler/nodejs-is-date-object - - src-openeuler/nodejs-is-function - - src-openeuler/nodejs-is-my-json-valid - - src-openeuler/nodejs-is-object - - src-openeuler/nodejs-is-property - - src-openeuler/nodejs-is-regex - - src-openeuler/nodejs-is-symbol - - src-openeuler/nodejs-is-typedarray - - src-openeuler/nodejs-isarray - - src-openeuler/nodejs-isexe - - src-openeuler/nodejs-isstream - - src-openeuler/nodejs-istanbul - - src-openeuler/nodejs-jade - - src-openeuler/nodejs-jison - - src-openeuler/nodejs-jison-lex - - src-openeuler/nodejs-jju - - src-openeuler/nodejs-js-yaml - - src-openeuler/nodejs-json-diff - - src-openeuler/nodejs-json-parse-helpfulerror - - src-openeuler/nodejs-json-stringify-safe - - src-openeuler/nodejs-jsonify - - src-openeuler/nodejs-jsonpointer - - src-openeuler/nodejs-jsonselect - - src-openeuler/nodejs-less - - src-openeuler/nodejs-less-plugin-clean-css - - src-openeuler/nodejs-levn - - src-openeuler/nodejs-lex-parser - - src-openeuler/nodejs-load-grunt-tasks - - src-openeuler/nodejs-locate-path - - src-openeuler/nodejs-lolex - - src-openeuler/nodejs-lru-queue - - src-openeuler/nodejs-make-arrow-function - - src-openeuler/nodejs-make-generator-function - - src-openeuler/nodejs-maxmin - - src-openeuler/nodejs-mdurl - - src-openeuler/nodejs-memoizee - - src-openeuler/nodejs-merge-descriptors - - src-openeuler/nodejs-mime - - src-openeuler/nodejs-mime-db - - src-openeuler/nodejs-mime-types - - src-openeuler/nodejs-minimatch - - src-openeuler/nodejs-minimist - - src-openeuler/nodejs-mkdirp - - src-openeuler/nodejs-mock-fs - - src-openeuler/nodejs-module-not-found-error - - src-openeuler/nodejs-monocle - - src-openeuler/nodejs-ms - - src-openeuler/nodejs-multimatch - - src-openeuler/nodejs-nan - - src-openeuler/nodejs-nan0 - - src-openeuler/nodejs-nan1 - - src-openeuler/nodejs-next-tick - - src-openeuler/nodejs-node-uuid - - src-openeuler/nodejs-nomnom - - src-openeuler/nodejs-nopt - - src-openeuler/nodejs-noptify - - src-openeuler/nodejs-normalize-package-data - - src-openeuler/nodejs-npmlog - - src-openeuler/nodejs-oauth-sign - - src-openeuler/nodejs-object-assign - - src-openeuler/nodejs-object-dot-assign - - src-openeuler/nodejs-object-inspect - - src-openeuler/nodejs-object-is - - src-openeuler/nodejs-object-keys - - src-openeuler/nodejs-once - - src-openeuler/nodejs-optimist - - src-openeuler/nodejs-optionator - - src-openeuler/nodejs-os-homedir - - src-openeuler/nodejs-os-tmpdir - - src-openeuler/nodejs-osenv - - src-openeuler/nodejs-p-limit - - src-openeuler/nodejs-p-locate - - src-openeuler/nodejs-package - - src-openeuler/nodejs-packaging - - src-openeuler/nodejs-paperboy - - src-openeuler/nodejs-path-array - - src-openeuler/nodejs-path-exists - - src-openeuler/nodejs-path-is-absolute - - src-openeuler/nodejs-path-parse - - src-openeuler/nodejs-pinkie - - src-openeuler/nodejs-pinkie-promise - - src-openeuler/nodejs-pkg-up - - src-openeuler/nodejs-prelude-ls - - src-openeuler/nodejs-pretty-bytes - - src-openeuler/nodejs-process-nextick-args - - src-openeuler/nodejs-promise - - src-openeuler/nodejs-promises-aplus-tests - - src-openeuler/nodejs-proxyquire - - src-openeuler/nodejs-qs - - src-openeuler/nodejs-raw-body - - src-openeuler/nodejs-read-package-json - - src-openeuler/nodejs-readable-stream - - src-openeuler/nodejs-readdirp - - src-openeuler/nodejs-rechoir - - src-openeuler/nodejs-replace-require-self - - src-openeuler/nodejs-request - - src-openeuler/nodejs-require-directory - - src-openeuler/nodejs-require-inject - - src-openeuler/nodejs-require-uncached - - src-openeuler/nodejs-requirejs - - src-openeuler/nodejs-resolve - - src-openeuler/nodejs-resolve-from - - src-openeuler/nodejs-resolve-pkg - - src-openeuler/nodejs-resumer - - src-openeuler/nodejs-rimraf - - src-openeuler/nodejs-rollup - - src-openeuler/nodejs-runforcover - - src-openeuler/nodejs-safe-buffer - - src-openeuler/nodejs-samsam - - src-openeuler/nodejs-semver - - src-openeuler/nodejs-set-immediate-shim - - src-openeuler/nodejs-shelljs - - src-openeuler/nodejs-should - - src-openeuler/nodejs-should-equal - - src-openeuler/nodejs-should-format - - src-openeuler/nodejs-should-type - - src-openeuler/nodejs-simple-assert - - src-openeuler/nodejs-sinon - - src-openeuler/nodejs-slide - - src-openeuler/nodejs-sntp - - src-openeuler/nodejs-source-map - - src-openeuler/nodejs-source-map-support - - src-openeuler/nodejs-spdx-correct - - src-openeuler/nodejs-spdx-exceptions - - src-openeuler/nodejs-spdx-expression-parse - - src-openeuler/nodejs-spdx-license-ids - - src-openeuler/nodejs-sprintf-js - - src-openeuler/nodejs-stream-replace - - src-openeuler/nodejs-string - - src-openeuler/nodejs-string-dot-prototype-dot-repeat - - src-openeuler/nodejs-string-dot-prototype-dot-trim - - src-openeuler/nodejs-string_decoder - - src-openeuler/nodejs-stringstream - - src-openeuler/nodejs-strip-ansi - - src-openeuler/nodejs-strip-json-comments - - src-openeuler/nodejs-supports-color - - src-openeuler/nodejs-tap - - src-openeuler/nodejs-tap-parser - - src-openeuler/nodejs-tape - - src-openeuler/nodejs-tar - - src-openeuler/nodejs-temporary - - src-openeuler/nodejs-test - - src-openeuler/nodejs-through - - src-openeuler/nodejs-through2 - - src-openeuler/nodejs-timers-ext - - src-openeuler/nodejs-tiny-lr-fork - - src-openeuler/nodejs-tough-cookie - - src-openeuler/nodejs-transformers - - src-openeuler/nodejs-traverse - - src-openeuler/nodejs-tunnel-agent - - src-openeuler/nodejs-type-check - - src-openeuler/nodejs-type-detect - - src-openeuler/nodejs-underscore - - src-openeuler/nodejs-underscore-dot-string - - src-openeuler/nodejs-unpipe - - src-openeuler/nodejs-uri-path - - src-openeuler/nodejs-util - - src-openeuler/nodejs-util-deprecate - - src-openeuler/nodejs-validate-npm-package-license - - src-openeuler/nodejs-vows - - src-openeuler/nodejs-websocket-driver - - src-openeuler/nodejs-which - - src-openeuler/nodejs-window-size - - src-openeuler/nodejs-with - - src-openeuler/nodejs-wordwrap - - src-openeuler/nodejs-wrappy - - src-openeuler/nodejs-xtend - - src-openeuler/nodejs-yamlish - - src-openeuler/nodejs-yargs - - src-openeuler/nodeunit - - src-openeuler/uglify-js - - src-openeuler/uglify-js1 -- name: Private - repositories: - - openeuler/os-autoinst-distri-openEuler - - openeuler/security - - src-openeuler/aalto-xml - - src-openeuler/adobe-source-code-pro-fonts - - src-openeuler/allegro - - src-openeuler/amtk - - src-openeuler/antlr4 - - src-openeuler/apache-commons-beanutils - - src-openeuler/apache-commons-codec - - src-openeuler/apache-commons-lang - - src-openeuler/apache-commons-vfs - - src-openeuler/appstream - - src-openeuler/appstream-data - - src-openeuler/args4j - - src-openeuler/armadillo - - src-openeuler/arpack - - src-openeuler/asio - - src-openeuler/autotrace - - src-openeuler/aws-sdk-java - - src-openeuler/baobab - - src-openeuler/batik - - src-openeuler/bcm283x-firmware - - src-openeuler/blosc - - src-openeuler/build - - src-openeuler/bullet - - src-openeuler/bytelist - - src-openeuler/cfitsio - - src-openeuler/checkstyle - - src-openeuler/chromaprint - - src-openeuler/ci_check - - src-openeuler/ci_project - - src-openeuler/clamav-unofficial-sigs - - src-openeuler/classloader-leak-test-framework - - src-openeuler/codenarc - - src-openeuler/compat-libgfortran - - src-openeuler/cvsps - - src-openeuler/cyrus-imapd - - src-openeuler/debian-keyring - - src-openeuler/devhelp - - src-openeuler/DevIL - - src-openeuler/dict2xml - - src-openeuler/dietlibc - - src-openeuler/Done - - src-openeuler/eclipse - - src-openeuler/eclipse-jgit - - src-openeuler/eclipselink-persistence-api - - src-openeuler/efl - - src-openeuler/ehcache-parent - - src-openeuler/extlinux-bootloader - - src-openeuler/ezmorph - - src-openeuler/f29-backgrounds - - src-openeuler/fasterxml-oss-parent - - src-openeuler/fastutil - - src-openeuler/fcitx - - src-openeuler/felix-parent - - src-openeuler/Flask-RESTful - - src-openeuler/fluid-soundfont - - src-openeuler/fluidsynth - - src-openeuler/folks-telepathy - - src-openeuler/freexl - - src-openeuler/fwupdate - - src-openeuler/game-music-emu - - src-openeuler/gdal - - src-openeuler/gedit - - src-openeuler/geos - - src-openeuler/geronimo-interceptor - - src-openeuler/geronimo-validation - - src-openeuler/glassfish-annotation-api - - src-openeuler/glyphicons-halflings-fonts - - src-openeuler/gmetrics - - src-openeuler/gnome-backgrounds - - src-openeuler/gnome-characters - - src-openeuler/gnome-logs - - src-openeuler/gnome-remote-desktop - - src-openeuler/gnome-tweaks - - src-openeuler/google-gson - - src-openeuler/google-http-java-client - - src-openeuler/google-oauth-java-client - - src-openeuler/google-roboto-slab-fonts - - src-openeuler/gradle - - src-openeuler/gssntlmssp - - src-openeuler/gtkspell - - src-openeuler/gtkspell3 - - src-openeuler/gtkspellmm30 - - src-openeuler/guava - - src-openeuler/hawtjni-runtime - - src-openeuler/hibernate-jpa - - src-openeuler/http-builder - - src-openeuler/ibus-kkc - - src-openeuler/icon-naming-utils - - src-openeuler/imlib2 - - src-openeuler/imsettings - - src-openeuler/infinipath-psm - - src-openeuler/inkscape - - src-openeuler/temporary-integration-test - - src-openeuler/internal-issue - - src-openeuler/ipython - - src-openeuler/irrXML - - src-openeuler/jackson-core - - src-openeuler/libburn1 - - src-openeuler/libisofs1 - - src-openeuler/jack-audio-connection-kit - - src-openeuler/jackson-annotations - - src-openeuler/jackson-bom - - src-openeuler/jackson-dataformats-binary - - src-openeuler/jackson-parent - - src-openeuler/jai-imageio-core - - src-openeuler/jarjar - - src-openeuler/jatl - - src-openeuler/java - - src-openeuler/java-base64 - - src-openeuler/java-comment-preprocessor - - src-openeuler/javacc-maven-plugin - - src-openeuler/javaewah - - src-openeuler/jboss-remoting - - src-openeuler/jboss-transaction - - src-openeuler/jcodings - - src-openeuler/jctools - - src-openeuler/jdeparser - - src-openeuler/jenkins_project - - src-openeuler/jetty - - src-openeuler/jetty-schemas - - src-openeuler/jhighlight - - src-openeuler/js-jquery - - src-openeuler/js-underscore - - src-openeuler/jsch-agent-proxy - - src-openeuler/js-jquery1 - - src-openeuler/json-lib - - src-openeuler/Keras - - src-openeuler/kiwi-dlimage - - src-openeuler/kiwi-template-openEuler - - src-openeuler/kryo - - src-openeuler/ladspa - - src-openeuler/ledmon - - src-openeuler/lensfun - - src-openeuler/libass - - src-openeuler/libbs2b - - src-openeuler/libdap - - src-openeuler/libEMF - - src-openeuler/libffado - - src-openeuler/libgeotiff - - src-openeuler/libgta - - src-openeuler/libkate - - src-openeuler/libkkc - - src-openeuler/libkkc-data - - src-openeuler/libkml - - src-openeuler/libmodplug - - src-openeuler/libofa - - src-openeuler/liboggz - - src-openeuler/liboil - - src-openeuler/libomp - - src-openeuler/libpq - - src-openeuler/libpsm2 - - src-openeuler/librevenge - - src-openeuler/libsane-hpaio - - src-openeuler/libspatialite - - src-openeuler/libuninameslist - - src-openeuler/libvncserver - - src-openeuler/libwpd - - src-openeuler/libwpg - - src-openeuler/libxmlpp - - src-openeuler/lldb - - src-openeuler/logback - - src-openeuler/lohit-gurmukhi-fonts - - src-openeuler/lohit-odia-fonts - - src-openeuler/lucene - - src-openeuler/lzma - - src-openeuler/mainline.list - - src-openeuler/malaga - - src-openeuler/malaga-suomi-voikko - - src-openeuler/manifest - - src-openeuler/maven-clean-plugin - - src-openeuler/maven-install-plugin - - src-openeuler/maven-plugins-pom - - src-openeuler/maven-scm - - src-openeuler/mingw-crt - - src-openeuler/mingw-filesystem - - src-openeuler/mingw-gcc - - src-openeuler/mingw-srvany - - src-openeuler/minlog - - src-openeuler/mkeuleros - - src-openeuler/modello - - src-openeuler/mojo-parent - - src-openeuler/nautilus-sendto - - src-openeuler/nekohtml - - src-openeuler/netcdf - - src-openeuler/netty - - src-openeuler/new.list - - src-openeuler/objectweb-asm3 - - src-openeuler/ocaml-calendar - - src-openeuler/ocaml-camlp4 - - src-openeuler/ocaml-camomile - - src-openeuler/ocaml-csv - - src-openeuler/ocaml-curses - - src-openeuler/ocaml-extlib - - src-openeuler/ocaml-fileutils - - src-openeuler/ocaml-findlib - - src-openeuler/ocaml-gettext - - src-openeuler/ocaml-libvirt - - src-openeuler/ocaml-ounit - - src-openeuler/ocaml-xml-light - - src-openeuler/ogdi - - src-openeuler/ongres-scram - - src-openeuler/opencryptoki - - src-openeuler/openEuler_chroot - - src-openeuler/openmotif - - src-openeuler/openpgm - - src-openeuler/osgi-annotation - - src-openeuler/osgi-compendium - - src-openeuler/osgi-core - - src-openeuler/passivetex - - src-openeuler/perl-CPAN-Changes - - src-openeuler/perl-Crypt-CBC - - src-openeuler/perl-Crypt-OpenSSL-Guess - - src-openeuler/perl-Expect - - src-openeuler/perl-Mojolicious - - src-openeuler/perl-IO-Tty - - src-openeuler/perl-Net-DNS-Resolver-Mock - - src-openeuler/perl-Net-LibIDN2 - - src-openeuler/perl-srpm-macros - - src-openeuler/perl-Test-CPAN-Meta - - src-openeuler/perl-Tie-IxHash - - src-openeuler/perl-Time-Zone - - src-openeuler/perl-Unix-Syslog - - src-openeuler/phonon-backend-gstreamer - - src-openeuler/physfs - - src-openeuler/pkgconfig - - src-openeuler/plexus-ant-factory - - src-openeuler/plexus-bsh-factory - - src-openeuler/plotutils - - src-openeuler/pmix - - src-openeuler/portaudio - - src-openeuler/potrace - - src-openeuler/properties-maven-plugin - - src-openeuler/protoparser - - src-openeuler/pstoedit - - src-openeuler/python-appdirs - - src-openeuler/python-Automat - - src-openeuler/python-backports-functools_lru_cache - - src-openeuler/python-backports-shutil_get_terminal_size - - src-openeuler/python-behave - - src-openeuler/python-Bottleneck - - src-openeuler/python-breathe - - src-openeuler/python-eventlet - - src-openeuler/python-graphviz - - src-openeuler/python-h5py - - src-openeuler/python-hpack - - src-openeuler/python-httpbin - - src-openeuler/python-hyperframe - - src-openeuler/python-jmespath - - src-openeuler/python-Keras - - src-openeuler/python-keras-applications - - src-openeuler/python-Keras_Preprocessing - - src-openeuler/python-latexcodec - - src-openeuler/python-m2r - - src-openeuler/python-matplotlib - - src-openeuler/python-mistune - - src-openeuler/python-netifaces - - src-openeuler/python-networkx - - src-openeuler/python-numexpr - - src-openeuler/python-numpydoc - - src-openeuler/python-orderedset - - src-openeuler/python-parse_type - - src-openeuler/python-pasta - - src-openeuler/python-pathlib - - src-openeuler/python-pexpect - - src-openeuler/python-pickleshare - - src-openeuler/python-pkgconfig - - src-openeuler/python-priority - - src-openeuler/python-prompt_toolkit - - src-openeuler/python-ptyprocess - - src-openeuler/python-pybtex - - src-openeuler/python-pybtex-docutils - - src-openeuler/python-pydotplus - - src-openeuler/python-pyflakes - - src-openeuler/python-pyglet - - src-openeuler/python-pyside - - src-openeuler/python-pytest-httpbin - - src-openeuler/python-rpmfluff - - src-openeuler/python-scour - - src-openeuler/python-service-identity - - src-openeuler/python-sphinx-bootstrap-theme - - src-openeuler/python-sphinxcontrib-bibtex - - src-openeuler/python-tables - - src-openeuler/python-twisted - - src-openeuler/python-wcwidth - - src-openeuler/python-zmq - - src-openeuler/python-h2 - - src-openeuler/reflectasm - - src-openeuler/repo - - src-openeuler/rpm-mpi-hooks - - src-openeuler/rsh - - src-openeuler/rubygem-hpricot - - src-openeuler/rubygem-mustache - - src-openeuler/rubygem-ronn - - src-openeuler/sbinary - - src-openeuler/sbt - - src-openeuler/scl-utils - - src-openeuler/SDL_sound - - src-openeuler/setuptool - - src-openeuler/slf4j - - src-openeuler/sni-qt - - src-openeuler/sos-collector - - src-openeuler/spice-parent - - src-openeuler/sshj - - src-openeuler/stax2-api - - src-openeuler/SuperLU - - src-openeuler/syslinux-tftpboot - - src-openeuler/system-config-firewall - - src-openeuler/taglist-enable - - src-openeuler/tclx - - src-openeuler/teckit - - src-openeuler/tesla-polyglot - - src-openeuler/thx - - src-openeuler/tinyxml - - src-openeuler/tomcat-native - - src-openeuler/tslib - - src-openeuler/ttembed - - src-openeuler/ttfautohint - - src-openeuler/ubu-keyring - - src-openeuler/uniconvertor - - src-openeuler/uriparser - - src-openeuler/virt-top - - src-openeuler/wildfly-common - - src-openeuler/wildmidi - - src-openeuler/wxPython - - src-openeuler/xerces-c - - src-openeuler/xhtml2fo-style-xsl - - src-openeuler/xmlgraphics-commons - - src-openeuler/xmvn-connector-gradle - - src-openeuler/xmvn-tools - - src-openeuler/xorg-sgml-doctools - - src-openeuler/xorg-x11-docs - - src-openeuler/xorg-x11-drv-armsoc - - src-openeuler/zbar - - src-openeuler/zvbi - - src-openeuler/pysendfile - - src-openeuler/python-pycdlib - - src-openeuler/zeromq - - src-openeuler/zinc -- name: oVirt - repositories: - - src-openeuler/ioprocess - - src-openeuler/cockpit-ovirt - - src-openeuler/engine-db-query - - src-openeuler/go-ovirt-engine-sdk4 - - src-openeuler/imgbased - - src-openeuler/java-ovirt-engine-sdk4 - - src-openeuler/mingw-spice-vdagent - - src-openeuler/mom - - src-openeuler/nsis-simple-service-plugin - - src-openeuler/otopi - - src-openeuler/ovirt-ansible-cluster-upgrade - - src-openeuler/ovirt-ansible-disaster-recovery - - src-openeuler/ovirt-ansible-engine-setup - - src-openeuler/ovirt-ansible-hosted-engine-setup - - src-openeuler/ovirt-ansible-image-template - - src-openeuler/ovirt-ansible-infra - - src-openeuler/ovirt-ansible-manageiq - - src-openeuler/ovirt-ansible-repositories - - src-openeuler/ovirt-ansible-roles - - src-openeuler/ovirt-ansible-shutdown-env - - src-openeuler/ovirt-ansible-v2v-conversion-host - - src-openeuler/ovirt-ansible-vm-infra - - src-openeuler/ovirt-cockpit-sso - - src-openeuler/ovirt-engine - - src-openeuler/ovirt-engine-api-explorer - - src-openeuler/ovirt-engine-appliance - - src-openeuler/ovirt-engine-cli - - src-openeuler/ovirt-engine-dwh - - src-openeuler/ovirt-engine-extension-aaa-ldap - - src-openeuler/ovirt-engine-extension-aaa-misc - - src-openeuler/ovirt-engine-metrics - - src-openeuler/ovirt-engine-nodejs - - src-openeuler/ovirt-engine-nodejs-modules - - src-openeuler/ovirt-engine-ui-extensions - - src-openeuler/ovirt-engine-wildfly - - src-openeuler/ovirt-engine-wildfly-overlay - - src-openeuler/ovirt-engine-yarn - - src-openeuler/ovirt-guest-agent - - src-openeuler/ovirt-guest-agent-windows - - src-openeuler/ovirt-guest-tools-iso - - src-openeuler/ovirt-host - - src-openeuler/ovirt-host-deploy - - src-openeuler/ovirt-hosted-engine-ha - - src-openeuler/ovirt-hosted-engine-setup - - src-openeuler/ovirt-imageio-common - - src-openeuler/ovirt-imageio-daemon - - src-openeuler/ovirt-imageio-proxy - - src-openeuler/ovirt-iso-uploader - - src-openeuler/ovirt-lldp-labeler - - src-openeuler/ovirt-log-collector - - src-openeuler/ovirt-node-ng - - src-openeuler/ovirt-node-ng-image-update - - src-openeuler/ovirt-provider-ovn - - src-openeuler/ovirt-release43 - - src-openeuler/ovirt-scheduler-proxy - - src-openeuler/ovirt-setup-lib - - src-openeuler/ovirt-vmconsole - - src-openeuler/ovirt-web-ui - - src-openeuler/python-ovirt-engine-sdk4 - - src-openeuler/rubygem-ovirt-engine-sdk4 - - src-openeuler/v2v-conversion-host - - src-openeuler/vcredist - - src-openeuler/vdsm - - src-openeuler/vdsm-jsonrpc-java - - src-openeuler/java-client-kubevirt - - src-openeuler/ovirt-engine-extension-aaa-jdbc - - src-openeuler/ovirt-engine-extension-logger-log4j - - src-openeuler/ovirt-engine-extensions-api - - src-openeuler/ovirt-imageio - - src-openeuler/ovirt-jboss-modules-maven-plugin - - src-openeuler/safelease - - src-openeuler/ovirt-engine-api-model -- name: sig-REDF - repositories: - - openeuler/redf - - src-openeuler/redf -- name: Marketing - repositories: - - openeuler/marketing -- name: security-committee - repositories: - - openeuler/security-committee - - openeuler/security -- name: dev-utils - repositories: - - openeuler/abichecker - - openeuler/auto_py2to3 - - openeuler/nodejsporter - - openeuler/openEuler-bootstrap - - openeuler/openEuler-pkginfo - - openeuler/perlporter - - openeuler/pkgporter - - openeuler/pyporter - - openeuler/rubyporter - - openeuler/trucker - - src-openeuler/ansible - - src-openeuler/antlr - - src-openeuler/apache-commons-collections4 - - src-openeuler/apache-commons-digester - - src-openeuler/apache-commons-fileupload - - src-openeuler/apache-commons-jexl - - src-openeuler/apache-commons-math - - src-openeuler/apache-commons-pool2 - - src-openeuler/apache-log4j-extras - - src-openeuler/apache-poi - - src-openeuler/apache-sshd - - src-openeuler/apacheds-ldap-api - - src-openeuler/apiviz - - src-openeuler/aries-blueprint-api - - src-openeuler/aries-quiesce-api - - src-openeuler/aries-util - - src-openeuler/asymptote - - src-openeuler/atop - - src-openeuler/auto - - src-openeuler/automoc - - src-openeuler/bam - - src-openeuler/base64coder - - src-openeuler/bcc - - src-openeuler/bcel - - src-openeuler/bcftools - - src-openeuler/bcrypt - - src-openeuler/bea-stax - - src-openeuler/beust-jcommander - - src-openeuler/bouncycastle - - src-openeuler/bpftrace - - src-openeuler/bridge-method-injector - - src-openeuler/brpc - - src-openeuler/bsf - - src-openeuler/buildroot - - src-openeuler/caffeine - - src-openeuler/cal10n - - src-openeuler/castor-maven-plugin - - src-openeuler/catch1 - - src-openeuler/cglib - - src-openeuler/ck - - src-openeuler/cloc - - src-openeuler/colm - - src-openeuler/colordiff - - src-openeuler/concurrent-trees - - src-openeuler/coro-mock - - src-openeuler/cpp-httplib - - src-openeuler/cpuid - - src-openeuler/cryptacular - - src-openeuler/csmith - - src-openeuler/ct-ng - - src-openeuler/curator - - src-openeuler/curvesapi - - src-openeuler/dbus-cpp - - src-openeuler/dbusmenu-qt - - src-openeuler/delve - - src-openeuler/dleyna-connector-dbus - - src-openeuler/dleyna-core - - src-openeuler/ecj - - src-openeuler/emma - - src-openeuler/enca - - src-openeuler/extra-cmake-modules - - src-openeuler/f2fs-tools - - src-openeuler/fcgi - - src-openeuler/figlet - - src-openeuler/fping - - src-openeuler/freeimage - - src-openeuler/freemarker - - src-openeuler/GAPP - - src-openeuler/geronimo-ejb - - src-openeuler/geronimo-jaspic-spec - - src-openeuler/geronimo-jcache - - src-openeuler/geronimo-jcdi-1.0-api - - src-openeuler/geronimo-jpa - - src-openeuler/geronimo-osgi-support - - src-openeuler/git-lfs - - src-openeuler/git-tools - - src-openeuler/glassfish-dtd-parser - - src-openeuler/glassfish-jaxb - - src-openeuler/glassfish-jsp - - src-openeuler/grizzly - - src-openeuler/gtkmm24 - - src-openeuler/hamcrest - - src-openeuler/hardinfo - - src-openeuler/hawtdispatch - - src-openeuler/hello - - src-openeuler/hping - - src-openeuler/htop - - src-openeuler/htslib - - src-openeuler/http_load - - src-openeuler/httpcomponents-project - - src-openeuler/iftop - - src-openeuler/iniparser - - src-openeuler/iozone - - src-openeuler/ipwatchd - - src-openeuler/jakarta-oro - - src-openeuler/java_cup - - src-openeuler/javaparser - - src-openeuler/jBCrypt - - src-openeuler/jboss-annotations-1.2-api - - src-openeuler/jboss-connector-1.6-api - - src-openeuler/jboss-jaxrs-2.0-api - - src-openeuler/jboss-jsf-2.1-api - - src-openeuler/jboss-jsp-2.3-api - - src-openeuler/jboss-jstl-1.2-api - - src-openeuler/jboss-servlet-3.1-api - - src-openeuler/jboss-stdio - - src-openeuler/jboss-websocket-1.0-api - - src-openeuler/jetbrains-annotations - - src-openeuler/jettison - - src-openeuler/jetty-parent - - src-openeuler/jexcelapi - - src-openeuler/jffi - - src-openeuler/jnr-constants - - src-openeuler/jnr-enxio - - src-openeuler/jnr-ffi - - src-openeuler/jnr-netdb - - src-openeuler/jnr-posix - - src-openeuler/jnr-unixsocket - - src-openeuler/joda-convert - - src-openeuler/joni - - src-openeuler/jopt-simple - - src-openeuler/jredis - - src-openeuler/js-excanvas - - src-openeuler/junit - - src-openeuler/junit5 - - src-openeuler/kelbt - - src-openeuler/kf5 - - src-openeuler/kscreenlocker - - src-openeuler/ldapjdk - - src-openeuler/libecb - - src-openeuler/libgpod - - src-openeuler/libgssglue - - src-openeuler/libhandy - - src-openeuler/libkeepalive - - src-openeuler/librpcsecgss - - src-openeuler/libwpe - - src-openeuler/libyubikey - - src-openeuler/lmbench - - src-openeuler/log4cplus - - src-openeuler/log4cpp - - src-openeuler/maven-osgi - - src-openeuler/memleax - - src-openeuler/memtester - - src-openeuler/miniasm - - src-openeuler/minimap2 - - src-openeuler/mocha - - src-openeuler/mock - - src-openeuler/morphia - - src-openeuler/multitail - - src-openeuler/mysql-connector-java - - src-openeuler/ncdu - - src-openeuler/nethogs - - src-openeuler/netperf - - src-openeuler/neXtaw - - src-openeuler/nmon - - src-openeuler/openEuler-pkginfo - - src-openeuler/options - - src-openeuler/p7zip - - src-openeuler/parfait - - src-openeuler/PEGTL - - src-openeuler/portals-pom - - src-openeuler/portlet-2.0-api - - src-openeuler/pyporter - - src-openeuler/pyusb - - src-openeuler/R-knitr - - src-openeuler/ragel - - src-openeuler/ranger - - src-openeuler/relaxngcc - - src-openeuler/relaxngDatatype - - src-openeuler/rpm-ostree - - src-openeuler/s-tui - - src-openeuler/samtools - - src-openeuler/saxon - - src-openeuler/slurm - - src-openeuler/sqlite-jdbc - - src-openeuler/stax-ex - - src-openeuler/stress-ng - - src-openeuler/stringtemplate - - src-openeuler/sysbench - - src-openeuler/sysget - - src-openeuler/systemd-bootchart - - src-openeuler/the_silver_searcher - - src-openeuler/tig - - src-openeuler/tito - - src-openeuler/unixbench - - src-openeuler/uom-se - - src-openeuler/webbench - - src-openeuler/woodstox-core - - src-openeuler/wpebackend-fdo - - src-openeuler/ws-commons-util - - src-openeuler/xom - - src-openeuler/ykpers -- name: sig-mate-desktop - repositories: - - openeuler/mate-desktop - - src-openeuler/caja - - src-openeuler/caja-extensions - - src-openeuler/cjkuni-uming-fonts - - src-openeuler/eom - - src-openeuler/fcitx-configtool - - src-openeuler/gajim - - src-openeuler/gcolor2 - - src-openeuler/glade3 - - src-openeuler/gparted - - src-openeuler/gtk-layer-shell - - src-openeuler/gtk-murrine-engine - - src-openeuler/gtk2-engines - - src-openeuler/gtksourceview4 - - src-openeuler/gucharmap - - src-openeuler/im-chooser - - src-openeuler/libXpresent - - src-openeuler/libmatekbd - - src-openeuler/libmatemixer - - src-openeuler/libmateweather - - src-openeuler/libwnck - - src-openeuler/marco - - src-openeuler/mate-applets - - src-openeuler/mate-backgrounds - - src-openeuler/mate-calc - - src-openeuler/mate-common - - src-openeuler/mate-control-center - - src-openeuler/mate-desktop - - src-openeuler/mate-icon-theme - - src-openeuler/mate-media - - src-openeuler/mate-menus - - src-openeuler/mate-notification-daemon - - src-openeuler/mate-panel - - src-openeuler/mate-polkit - - src-openeuler/mate-power-manager - - src-openeuler/mate-screensaver - - src-openeuler/mate-session-manager - - src-openeuler/mate-settings-daemon - - src-openeuler/mate-system-monitor - - src-openeuler/mate-terminal - - src-openeuler/mate-themes - - src-openeuler/mate-user-guide - - src-openeuler/mate-utils - - src-openeuler/open-chinese-fonts - - src-openeuler/pangox-compat - - src-openeuler/perl-ExtUtils-Depends - - src-openeuler/perl-ExtUtils-PkgConfig - - src-openeuler/perl-Glib - - src-openeuler/python-cssutils - - src-openeuler/python-nbxmpp - - src-openeuler/python-precis_i18n - - src-openeuler/re2c - - src-openeuler/system-config-users - - src-openeuler/system-config-users-docs - - src-openeuler/unique3 - - src-openeuler/wireless-tools -- name: sig-bounds_checking_function - repositories: - - openeuler/bounds_checking_function - - src-openeuler/bounds_checking_function -- name: sig-UKUI - repositories: - - src-openeuler/qt5-ukui-platformtheme - - src-openeuler/peony - - src-openeuler/ukui-control-center - - src-openeuler/ukui-sidebar - - src-openeuler/ukui-panel - - src-openeuler/ukui-window-switch - - src-openeuler/ukui-power-manager - - src-openeuler/ukui-screensaver - - src-openeuler/ukui-media - - src-openeuler/ukui-menu - - src-openeuler/ukui-session-manager - - src-openeuler/ukui-settings-daemon - - src-openeuler/kylin-nm - - src-openeuler/ukui-themes - - src-openeuler/ukui-biometric-manager - - src-openeuler/ukui-biometric-auth - - src-openeuler/peony-extensions - - src-openeuler/ukui-greeter - - src-openeuler/ukylin-feedback-client - - src-openeuler/ukwm - - src-openeuler/ukui-interface - - src-openeuler/ukui-screenshot - - src-openeuler/ukui-indicators - - src-openeuler/ukui-desktop-environment - - src-openeuler/biometric-authentication - - src-openeuler/attica - - src-openeuler/bamf - - src-openeuler/grantlee - - src-openeuler/gsettings-qt - - src-openeuler/kf5-karchive - - src-openeuler/kf5-kauth - - src-openeuler/kf5-kcodecs - - src-openeuler/kf5-kconfig - - src-openeuler/kf5-kconfigwidgets - - src-openeuler/kf5-kcoreaddons - - src-openeuler/kf5-kdoctools - - src-openeuler/kf5-kguiaddons - - src-openeuler/kf5-ki18n - - src-openeuler/kf5-kidletime - - src-openeuler/kf5-kwayland - - src-openeuler/kf5-kwidgetsaddons - - src-openeuler/kf5-kwindowsystem - - src-openeuler/kf5-solid - - src-openeuler/libkscreen-qt5 - - src-openeuler/libqtxdg - - src-openeuler/libstatgrab - - src-openeuler/libsysstat - - src-openeuler/libupnp - - src-openeuler/lxqt-build-tools - - src-openeuler/polkit-qt-1 - - src-openeuler/qjson - - src-openeuler/qt5-qtcharts - - src-openeuler/qtchooser - - src-openeuler/redshift - - src-openeuler/shared-desktop-ontologies - - src-openeuler/ubuntukylin-default-settings - - src-openeuler/ukui-system-monitor - - src-openeuler/ukui-wallpapers - - src-openeuler/libchamplain - - src-openeuler/atril - - src-openeuler/mathjax - - src-openeuler/shotwell - - src-openeuler/engrampa -- name: sig-recycle - repositories: - - src-openeuler/cmockery - - src-openeuler/jasper - - src-openeuler/liberation-sans-fonts - - src-openeuler/libibmad - - src-openeuler/python2 - - src-openeuler/caffe - - src-openeuler/shim-unsigned-aarch64 - - src-openeuler/subscription-manager - - src-openeuler/redhat-menus - - src-openeuler/golang-github-cpuguy83-go-md2man - - src-openeuler/golang-github-fsnotify-fsnotify - - src-openeuler/golang-github-go-tomb-tomb - - src-openeuler/golang-github-hpcloud-tail - - src-openeuler/golang-github-onsi-ginkgo - - src-openeuler/golang-github-onsi-gomega - - src-openeuler/golang-googlecode-go-crypto - - src-openeuler/golang-googlecode-net - - src-openeuler/golang-googlecode-text - - src-openeuler/golang-googlecode-tools - - src-openeuler/golang-gopkg-yaml - - src-openeuler/golang-googlecode-goprotobuf - - src-openeuler/golang-github-vishvananda-netns - - src-openeuler/golang-github-golang-sys - - src-openeuler/golang-github-vishvananda-netlink - - src-openeuler/golang-github-d2g-dhcp4 - - src-openeuler/golang-github-coreos-go-iptables - - src-openeuler/golang-github-russross-blackfriday - - src-openeuler/yum-metadata-parser - - src-openeuler/hardlink - - src-openeuler/langpacks - - src-openeuler/hesiod - - src-openeuler/libmodman - - src-openeuler/tpm2-abrmd-selinux - - src-openeuler/oci-systemd-hook - - src-openeuler/openvswitch-kmod - - src-openeuler/docker-anaconda-addon -- name: sig-RaspberryPi - repositories: - - openeuler/raspberrypi - - openeuler/raspberrypi-kernel - - src-openeuler/raspberrypi-kernel - - src-openeuler/raspberrypi-firmware - - src-openeuler/raspberrypi-build - - src-openeuler/raspberrypi-bluetooth - - openeuler/raspberrypi-build -- name: sig-Ha - repositories: - - src-openeuler/pacemaker - - src-openeuler/corosync - - src-openeuler/pcs - - openeuler/pacemaker-mgmt - - openeuler/ha-api - - openeuler/ha-web - - src-openeuler/pacemaker-mgmt - - src-openeuler/ha-api - - src-openeuler/ha-web - - src-openeuler/fence-agents - - src-openeuler/fence-virt - - src-openeuler/sbd - - src-openeuler/corosync-qdevice - - src-openeuler/drbd - - src-openeuler/drbd-utils -- name: sig-QA - repositories: - - openeuler/QA - - openeuler/avocado - - openeuler/avocado-vt - - openeuler/tp-libvirt - - openeuler/tp-qemu - - openeuler/EulerRobot - - openeuler/integration-test - - openeuler/container-test - - openeuler/compiler-test - - openeuler/package-reinforce-test - - openeuler/test-tools -- name: sig-KIRAN-DESKTOP - repositories: - - src-openeuler/kiran-avatar-editor - - src-openeuler/kiran-gtk-theme - - src-openeuler/kiran-icon-theme - - src-openeuler/kiran-menu - - src-openeuler/kiran-screensaver-dialog - - src-openeuler/kiran-themes - - src-openeuler/kiran-wallpapers - - src-openeuler/lightdm-kiran-greeter - - src-openeuler/plymouth-theme-kiran -- name: sig-ROS - repositories: - - openeuler/ros - - src-openeuler/catkin - - src-openeuler/class_loader - - src-openeuler/cmake_modules - - src-openeuler/gencpp - - src-openeuler/geneus - - src-openeuler/genlisp - - src-openeuler/genpy - - src-openeuler/gennodejs - - src-openeuler/genmsg - - src-openeuler/std_msgs - - src-openeuler/message_generation - - src-openeuler/ros_environment - - src-openeuler/message_runtime - - src-openeuler/roscpp_core - - src-openeuler/ros - - src-openeuler/rosconsole - - src-openeuler/roslisp - - src-openeuler/rospack - - src-openeuler/ros_comm_msgs - - src-openeuler/pluginlib - - src-openeuler/ros_comm -- name: sig-ai-bigdata - repositories: - - src-openeuler/arm-ml-examples - - src-openeuler/armnn - - src-openeuler/bazel - - src-openeuler/blaze - - src-openeuler/ComputeLibrary - - src-openeuler/dlib - - src-openeuler/eigen - - src-openeuler/eli5 - - src-openeuler/ensmallen - - src-openeuler/epstool - - src-openeuler/flink - - src-openeuler/ftgl - - src-openeuler/gl2ps - - src-openeuler/glpk - - src-openeuler/hadoop - - src-openeuler/hbase - - src-openeuler/hive - - src-openeuler/ibis - - src-openeuler/incubator-mxnet - - src-openeuler/jupyter - - src-openeuler/kafka - - src-openeuler/libhdfs - - src-openeuler/libiodbc - - src-openeuler/libmetal - - src-openeuler/libsvm - - src-openeuler/libxsmm - - src-openeuler/lightgbm - - src-openeuler/lzip - - src-openeuler/mlpack - - src-openeuler/octave - - src-openeuler/oneDNN - - src-openeuler/opencl - - src-openeuler/opencl-filesystem - - src-openeuler/opencl-headers - - src-openeuler/opencv - - src-openeuler/opennn - - src-openeuler/presto - - src-openeuler/pytorch - - src-openeuler/qrupdate - - src-openeuler/qscintilla - - src-openeuler/rain - - src-openeuler/Shark - - src-openeuler/spark - - src-openeuler/sundials - - src-openeuler/SuperLUMT - - src-openeuler/tensorflow - - src-openeuler/zeppelin - - src-openeuler/zookeeper -- name: sig-golang - repositories: - - src-openeuler/golang -- name: sig-EasyLife - repositories: - - openeuler/openEuler-Advisor - - src-openeuler/pkgship - - src-openeuler/abi-compliance-checker - - src-openeuler/abi-dumper - - src-openeuler/patch-tracking -- name: sig-ceph - repositories: - - src-openeuler/ceph - - src-openeuler/ceph-deploy - - src-openeuler/ceph-ansible -- name: sig-security-facility - repositories: - - openeuler/security-tool - - openeuler/attest-tools - - openeuler/digest-list-tools - - src-openeuler/mysql-selinux - - src-openeuler/pesign-obs-integration - - src-openeuler/tss2 - - src-openeuler/oscap-anaconda-addon - - src-openeuler/certmonger - - src-openeuler/keycloak-httpd-client-install - - src-openeuler/mod_auth_openidc - - src-openeuler/mod_authnz_pam - - src-openeuler/attest-tools - - src-openeuler/digest-list-tools - - src-openeuler/apparmor - - src-openeuler/cryptopp - - src-openeuler/tpm2-tools - - src-openeuler/setroubleshoot - - src-openeuler/openssl - - src-openeuler/tpm2-abrmd - - src-openeuler/libselinux - - src-openeuler/libsepol - - src-openeuler/keyutils - - src-openeuler/mcstrans - - src-openeuler/selinux-policy - - src-openeuler/crypto-policies - - src-openeuler/checkpolicy - - src-openeuler/libcap - - src-openeuler/gnupg2 - - src-openeuler/cracklib - - src-openeuler/policycoreutils - - src-openeuler/pyOpenSSL - - src-openeuler/libsemanage - - src-openeuler/openssl-pkcs11 - - src-openeuler/gnutls - - src-openeuler/mokutil - - src-openeuler/pam - - src-openeuler/libpwquality - - src-openeuler/softhsm - - src-openeuler/nss - - src-openeuler/security-tool - - src-openeuler/tpm2-tss - - src-openeuler/audit - - src-openeuler/nss-pem - - src-openeuler/swtpm - - src-openeuler/libtpms -- name: sig-Compatibility-Infra - repositories: - - openeuler/oec-hardware - - openeuler/oec-application - - src-openeuler/oec-hardware - - src-openeuler/oec-application -- name: sig-cms - repositories: - - src-openeuler/doracms -- name: sig-RISC-V - repositories: - - openeuler/RISC-V - - src-openeuler/risc-v-kernel - - src-openeuler/opensbi -- name: sig-android-middleware - repositories: - - openeuler/android-emulator - - openeuler/anbox - - src-openeuler/platform_hardware_libhardware_legacy - - src-openeuler/platform_hardware_ril - - src-openeuler/platform_frameworks_base - - src-openeuler/platform_frameworks_native - - src-openeuler/platform_frameworks_opt_net_wifi - - src-openeuler/platform_system_core - - src-openeuler/platform_packages_apps_DeskClock - - src-openeuler/platform_packages_apps_PackageInstaller - - src-openeuler/platform_build - - src-openeuler/platform_manifests -- name: sig-perl-modules - repositories: - - src-openeuler/biber - - src-openeuler/inst-source-utils - - src-openeuler/latexmk - - src-openeuler/perl-accessors - - src-openeuler/perl-Acme-Damn - - src-openeuler/perl-Algorithm-Combinatorics - - src-openeuler/perl-Algorithm-Dependency - - src-openeuler/perl-Algorithm-Diff - - src-openeuler/perl-Algorithm-Diff-XS - - src-openeuler/perl-Algorithm-Loops - - src-openeuler/perl-Algorithm-LUHN - - src-openeuler/perl-Algorithm-NaiveBayes - - src-openeuler/perl-aliased - - src-openeuler/perl-Alien-Build - - src-openeuler/perl-Alien-Libxml2 - - src-openeuler/perl-Alien-Packages - - src-openeuler/perl-Any-Moose - - src-openeuler/perl-Any-URI-Escape - - src-openeuler/perl-AnyEvent - - src-openeuler/perl-Apache-LogFormat-Compiler - - src-openeuler/perl-Apache-Session - - src-openeuler/perl-Apache-Session-Wrapper - - src-openeuler/perl-App-Cmd - - src-openeuler/perl-App-FatPacker - - src-openeuler/perl-AppConfig - - src-openeuler/perl-Archive-Any-Lite - - src-openeuler/perl-Archive-Tar - - src-openeuler/perl-autobox - - src-openeuler/perl-autobox-Core - - src-openeuler/perl-autodie - - src-openeuler/perl-B-Compiling - - src-openeuler/perl-B-COW - - src-openeuler/perl-B-Debug - - src-openeuler/perl-B-Hooks-EndOfScope - - src-openeuler/perl-B-Hooks-OP-Annotation - - src-openeuler/perl-B-Hooks-OP-Check - - src-openeuler/perl-B-Hooks-OP-PPAddr - - src-openeuler/perl-B-Hooks-Parser - - src-openeuler/perl-B-Keywords - - src-openeuler/perl-B-Utils - - src-openeuler/perl-bareword-filehandles - - src-openeuler/perl-Biblio-EndnoteStyle - - src-openeuler/perl-BibTeX-Parser - - src-openeuler/perl-bignum - - src-openeuler/perl-Browser-Open - - src-openeuler/perl-Business-CreditCard - - src-openeuler/perl-Business-Hours - - src-openeuler/perl-Business-ISMN - - src-openeuler/perl-Business-ISSN - - src-openeuler/perl-Business-Stripe - - src-openeuler/perl-Cache-Cache - - src-openeuler/perl-Cache-FastMmap - - src-openeuler/perl-Cache-LRU - - src-openeuler/perl-Cache-Memcached - - src-openeuler/perl-CAD-Format-STL - - src-openeuler/perl-Carp - - src-openeuler/perl-Carp-Assert - - src-openeuler/perl-Carp-Assert-More - - src-openeuler/perl-Carp-Fix-1_25 - - src-openeuler/perl-Carton - - src-openeuler/perl-Catalyst-Manual - - src-openeuler/perl-Catalyst-Plugin-CustomErrorMessage - - src-openeuler/perl-CBOR-XS - - src-openeuler/perl-CDDB - - src-openeuler/perl-CGI-Ajax - - src-openeuler/perl-CGI-Application - - src-openeuler/perl-CGI-Application-Plugin-ConfigAuto - - src-openeuler/perl-CGI-Application-Plugin-DBH - - src-openeuler/perl-CGI-Application-Plugin-DBIC-Schema - - src-openeuler/perl-CGI-Application-Plugin-DevPopup - - src-openeuler/perl-CGI-Application-Plugin-ErrorPage - - src-openeuler/perl-CGI-Application-Plugin-FillInForm - - src-openeuler/perl-CGI-Application-Plugin-FormState - - src-openeuler/perl-CGI-Application-Plugin-JSON - - src-openeuler/perl-CGI-Application-Plugin-LinkIntegrity - - src-openeuler/perl-CGI-Application-Plugin-MessageStack - - src-openeuler/perl-CGI-Application-Plugin-Redirect - - src-openeuler/perl-CGI-Application-Plugin-Session - - src-openeuler/perl-CGI-Application-Plugin-Stream - - src-openeuler/perl-CGI-Application-Plugin-TT - - src-openeuler/perl-CGI-Application-PSGI - - src-openeuler/perl-CGI-Application-Standard-Config - - src-openeuler/perl-CGI-Deurl-XS - - src-openeuler/perl-CGI-Emulate-PSGI - - src-openeuler/perl-CGI-Ex - - src-openeuler/perl-CGI-Fast - - src-openeuler/perl-CGI-FormBuilder - - src-openeuler/perl-CGI-Prototype - - src-openeuler/perl-CGI-PSGI - - src-openeuler/perl-CGI-Session - - src-openeuler/perl-CGI-Session-Driver-memcached - - src-openeuler/perl-CGI-Simple - - src-openeuler/perl-CGI-Struct - - src-openeuler/perl-Chatbot-Eliza - - src-openeuler/perl-Check-ISA - - src-openeuler/perl-Child - - src-openeuler/perl-ClamAV-Client - - src-openeuler/perl-CLASS - - src-openeuler/perl-Class-Accessor - - src-openeuler/perl-Class-Accessor-Chained - - src-openeuler/perl-Class-Accessor-Classy - - src-openeuler/perl-Class-Accessor-Grouped - - src-openeuler/perl-Class-Accessor-Lite - - src-openeuler/perl-Class-Adapter - - src-openeuler/perl-Class-Autouse - - src-openeuler/perl-Class-Base - - src-openeuler/perl-Class-C3 - - src-openeuler/perl-Class-C3-Adopt-NEXT - - src-openeuler/perl-Class-C3-Componentised - - src-openeuler/perl-Class-C3-XS - - src-openeuler/perl-Class-Can - - src-openeuler/perl-Class-Container - - src-openeuler/perl-Class-Data-Accessor - - src-openeuler/perl-Class-Date - - src-openeuler/perl-Class-ErrorHandler - - src-openeuler/perl-Class-Factory-Util - - src-openeuler/perl-Class-Field - - src-openeuler/perl-Class-ISA - - src-openeuler/perl-Class-Load - - src-openeuler/perl-Class-Load-XS - - src-openeuler/perl-Class-MethodMaker - - src-openeuler/perl-Class-Prototyped - - src-openeuler/perl-Class-Refresh - - src-openeuler/perl-Class-ReturnValue - - src-openeuler/perl-Class-Std - - src-openeuler/perl-Class-Std-Fast - - src-openeuler/perl-Class-Throwable - - src-openeuler/perl-Class-Tiny - - src-openeuler/perl-Class-Trigger - - src-openeuler/perl-Class-Unload - - src-openeuler/perl-Class-Utils - - src-openeuler/perl-Class-Virtual - - src-openeuler/perl-Clipboard - - src-openeuler/perl-Clone - - src-openeuler/perl-Clone-Choose - - src-openeuler/perl-Clone-PP - - src-openeuler/perl-Color-Library - - src-openeuler/perl-Command-Runner - - src-openeuler/perl-Commandable - - src-openeuler/perl-Compress-LZ4 - - src-openeuler/perl-Compress-LZF - - src-openeuler/perl-Compress-Raw-Bzip2 - - src-openeuler/perl-Compress-Raw-Zlib - - src-openeuler/perl-Compress-Snappy - - src-openeuler/perl-Config-Any - - src-openeuler/perl-Config-Auto - - src-openeuler/perl-Config-Extend-MySQL - - src-openeuler/perl-Config-GitLike - - src-openeuler/perl-Config-Grammar - - src-openeuler/perl-Config-INI - - src-openeuler/perl-Config-INI-Reader-Multiline - - src-openeuler/perl-Config-INI-Reader-Ordered - - src-openeuler/perl-Config-Perl-V - - src-openeuler/perl-Config-Properties - - src-openeuler/perl-Config-Std - - src-openeuler/perl-Config-Tiny - - src-openeuler/perl-Config-ZOMG - - src-openeuler/perl-Const-Fast - - src-openeuler/perl-constant - - src-openeuler/perl-constant-boolean - - src-openeuler/perl-constant-defer - - src-openeuler/perl-constant-tiny - - src-openeuler/perl-Context-Preserve - - src-openeuler/perl-Contextual-Return - - src-openeuler/perl-Convert-ASN1 - - src-openeuler/perl-Convert-Base32 - - src-openeuler/perl-Convert-Base64 - - src-openeuler/perl-Convert-Bencode - - src-openeuler/perl-Convert-BER - - src-openeuler/perl-Convert-Binary-C - - src-openeuler/perl-Convert-BinHex - - src-openeuler/perl-Convert-Color - - src-openeuler/perl-Convert-Color-XTerm - - src-openeuler/perl-Convert-NLS_DATE_FORMAT - - src-openeuler/perl-Convert-TNEF - - src-openeuler/perl-Convert-UU - - src-openeuler/perl-Cookie-Baker - - src-openeuler/perl-CPAN-Common-Index - - src-openeuler/perl-CPAN-DistnameInfo - - src-openeuler/perl-CPAN-Meta - - src-openeuler/perl-CPAN-Meta-Check - - src-openeuler/perl-CPAN-Meta-Requirements - - src-openeuler/perl-CPAN-Meta-YAML - - src-openeuler/perl-Cpanel-JSON-XS - - src-openeuler/perl-Crypt-Blowfish - - src-openeuler/perl-Crypt-ECB - - src-openeuler/perl-Crypt-GeneratePassword - - src-openeuler/perl-Crypt-GPG - - src-openeuler/perl-Crypt-IDEA - - src-openeuler/perl-Crypt-OpenSSL-DSA - - src-openeuler/perl-Crypt-OpenSSL-EC - - src-openeuler/perl-Crypt-OpenSSL-PKCS10 - - src-openeuler/perl-Crypt-OpenSSL-X509 - - src-openeuler/perl-Crypt-RandPasswd - - src-openeuler/perl-Crypt-Rijndael - - src-openeuler/perl-Crypt-Salsa20 - - src-openeuler/perl-Crypt-SaltedHash - - src-openeuler/perl-Crypt-ScryptKDF - - src-openeuler/perl-Crypt-UnixCrypt_XS - - src-openeuler/perl-Crypt-URandom - - src-openeuler/perl-Crypt-X509 - - src-openeuler/perl-CSS-DOM - - src-openeuler/perl-CSS-Minifier-XS - - src-openeuler/perl-CSS-Squish - - src-openeuler/perl-CSS-Tiny - - src-openeuler/perl-curry - - src-openeuler/perl-Cwd-Guard - - src-openeuler/perl-Cwd-utf8 - - src-openeuler/perl-Daemon-Control - - src-openeuler/perl-Data-AsObject - - src-openeuler/perl-Data-Binary - - src-openeuler/perl-Data-Compare - - src-openeuler/perl-Data-Dmp - - src-openeuler/perl-Data-Dump-Streamer - - src-openeuler/perl-Data-Dumper - - src-openeuler/perl-Data-Dumper-Concise - - src-openeuler/perl-Data-Dumper-Names - - src-openeuler/perl-Data-Munge - - src-openeuler/perl-Data-Page - - src-openeuler/perl-Data-Perl - - src-openeuler/perl-Data-Section-Simple - - src-openeuler/perl-Data-Stream-Bulk - - src-openeuler/perl-Data-TreeDumper - - src-openeuler/perl-Data-Tumbler - - src-openeuler/perl-Data-Validate-Type - - src-openeuler/perl-Database-DumpTruck - - src-openeuler/perl-Date-Calc-XS - - src-openeuler/perl-Date-Easter - - src-openeuler/perl-Date-Holidays-DE - - src-openeuler/perl-Date-ISO8601 - - src-openeuler/perl-Date-JD - - src-openeuler/perl-Date-Leapyear - - src-openeuler/perl-Date-Simple - - src-openeuler/perl-Date-Tiny - - src-openeuler/perl-DB_File - - src-openeuler/perl-DBD-Mock - - src-openeuler/perl-DBD-Pg - - src-openeuler/perl-DBD-SQLite2 - - src-openeuler/perl-DBD-XBase - - src-openeuler/perl-DBI - - src-openeuler/perl-DBICx-AutoDoc - - src-openeuler/perl-DBIx-Class - - src-openeuler/perl-DBIx-Class-Candy - - src-openeuler/perl-DBIx-Class-Cursor-Cached - - src-openeuler/perl-DBIx-Class-IntrospectableM2M - - src-openeuler/perl-DBIx-Class-OptimisticLocking - - src-openeuler/perl-DBIx-Class-Schema-Config - - src-openeuler/perl-DBIx-Connector - - src-openeuler/perl-DBIx-DBSchema - - src-openeuler/perl-DBIx-Introspector - - src-openeuler/perl-DBIx-RunSQL - - src-openeuler/perl-DBIx-Simple - - src-openeuler/perl-DBIx-XHTML_Table - - src-openeuler/perl-DBM-Deep - - src-openeuler/perl-Debug-ShowStuff - - src-openeuler/perl-Declare-Constraints-Simple - - src-openeuler/perl-Devel-Autoflush - - src-openeuler/perl-Devel-Caller - - src-openeuler/perl-Devel-Caller-IgnoreNamespaces - - src-openeuler/perl-Devel-CheckBin - - src-openeuler/perl-Devel-CheckCompiler - - src-openeuler/perl-Devel-CheckOS - - src-openeuler/perl-Devel-Confess - - src-openeuler/perl-Devel-Cycle - - src-openeuler/perl-Devel-Dumpvar - - src-openeuler/perl-Devel-EnforceEncapsulation - - src-openeuler/perl-Devel-FindPerl - - src-openeuler/perl-Devel-Gladiator - - src-openeuler/perl-Devel-GoFaster - - src-openeuler/perl-Devel-Hexdump - - src-openeuler/perl-Devel-LexAlias - - src-openeuler/perl-Devel-MAT-Dumper - - src-openeuler/perl-Devel-OverloadInfo - - src-openeuler/perl-Devel-OverrideGlobalRequire - - src-openeuler/perl-Devel-PartialDump - - src-openeuler/perl-Devel-PPPort - - src-openeuler/perl-Devel-Pragma - - src-openeuler/perl-Devel-Refcount - - src-openeuler/perl-Devel-SelfStubber - - src-openeuler/perl-Devel-SimpleTrace - - src-openeuler/perl-Devel-StackTrace-AsHTML - - src-openeuler/perl-Devel-StackTrace-WithLexicals - - src-openeuler/perl-Devel-StringInfo - - src-openeuler/perl-Devel-Timer - - src-openeuler/perl-Devel-Trace - - src-openeuler/perl-Diff-LibXDiff - - src-openeuler/perl-Digest-BubbleBabble - - src-openeuler/perl-Digest-JHash - - src-openeuler/perl-Digest-MD2 - - src-openeuler/perl-Digest-MD4 - - src-openeuler/perl-Digest-MD5 - - src-openeuler/perl-Digest-MD5-File - - src-openeuler/perl-Digest-Nilsimsa - - src-openeuler/perl-Digest-Perl-MD5 - - src-openeuler/perl-Digest-SHA - - src-openeuler/perl-Dir-Manifest - - src-openeuler/perl-Dir-Self - - src-openeuler/perl-Directory-Scratch - - src-openeuler/perl-Dist-Metadata - - src-openeuler/perl-EBook-EPUB - - src-openeuler/perl-ElasticSearch-SearchBuilder - - src-openeuler/perl-Email-Abstract - - src-openeuler/perl-Email-Address - - src-openeuler/perl-Email-Address-List - - src-openeuler/perl-Email-Address-XS - - src-openeuler/perl-Email-Date - - src-openeuler/perl-Email-MessageID - - src-openeuler/perl-Email-MIME - - src-openeuler/perl-Email-MIME-Attachment-Stripper - - src-openeuler/perl-Email-MIME-ContentType - - src-openeuler/perl-Email-MIME-Encodings - - src-openeuler/perl-Email-Reply - - src-openeuler/perl-Email-Send - - src-openeuler/perl-Email-Sender - - src-openeuler/perl-Email-Simple - - src-openeuler/perl-Encode - - src-openeuler/perl-Encode-IMAPUTF7 - - src-openeuler/perl-Encode-Locale - - src-openeuler/perl-Encode-Newlines - - src-openeuler/perl-End - - src-openeuler/perl-enum - - src-openeuler/perl-Env - - src-openeuler/perl-Env-C - - src-openeuler/perl-Env-Path - - src-openeuler/perl-Env-Sanctify - - src-openeuler/perl-Error - - src-openeuler/perl-Error-Pure - - src-openeuler/perl-Error-Pure-Output-Text - - src-openeuler/perl-Eval-Closure - - src-openeuler/perl-Eval-LineNumbers - - src-openeuler/perl-Eval-WithLexicals - - src-openeuler/perl-Event - - src-openeuler/perl-Excel-Writer-XLSX - - src-openeuler/perl-Exception-Base - - src-openeuler/perl-Exception-Class - - src-openeuler/perl-Exception-Class-TryCatch - - src-openeuler/perl-Exception-Tiny - - src-openeuler/perl-Expect-Simple - - src-openeuler/perl-experimental - - src-openeuler/perl-Export-Attrs - - src-openeuler/perl-Exporter - - src-openeuler/perl-Exporter-Declare - - src-openeuler/perl-Exporter-Declare-Magic - - src-openeuler/perl-Exporter-Easy - - src-openeuler/perl-Exporter-Lite - - src-openeuler/perl-Exporter-Tiny - - src-openeuler/perl-ExtUtils-AutoInstall - - src-openeuler/perl-ExtUtils-CChecker - - src-openeuler/perl-ExtUtils-HasCompiler - - src-openeuler/perl-ExtUtils-InferConfig - - src-openeuler/perl-ExtUtils-Install - - src-openeuler/perl-ExtUtils-LibBuilder - - src-openeuler/perl-ExtUtils-Manifest - - src-openeuler/perl-ExtUtils-ParseXS - - src-openeuler/perl-ExtUtils-TBone - - src-openeuler/perl-ExtUtils-Typemap - - src-openeuler/perl-ExtUtils-Typemaps-Default - - src-openeuler/perl-failures - - src-openeuler/perl-FCGI - - src-openeuler/perl-FCGI-ProcManager - - src-openeuler/perl-Fennec-Lite - - src-openeuler/perl-FFI-CheckLib - - src-openeuler/perl-File-BOM - - src-openeuler/perl-File-chdir - - src-openeuler/perl-File-CheckTree - - src-openeuler/perl-File-chmod - - src-openeuler/perl-File-ConfigDir - - src-openeuler/perl-File-Copy-Recursive-Reduced - - src-openeuler/perl-File-FcntlLock - - src-openeuler/perl-File-Fetch - - src-openeuler/perl-File-Find-Object - - src-openeuler/perl-File-Find-Object-Rule - - src-openeuler/perl-File-Find-Rule - - src-openeuler/perl-File-Find-Rule-Perl - - src-openeuler/perl-File-Find-Rule-PPI - - src-openeuler/perl-File-Find-Rule-VCS - - src-openeuler/perl-File-Find-utf8 - - src-openeuler/perl-File-FindLib - - src-openeuler/perl-File-Flat - - src-openeuler/perl-File-HomeDir - - src-openeuler/perl-File-KeePass - - src-openeuler/perl-File-LoadLines - - src-openeuler/perl-File-Map - - src-openeuler/perl-File-MMagic - - src-openeuler/perl-File-Modified - - src-openeuler/perl-File-NCopy - - src-openeuler/perl-File-NFSLock - - src-openeuler/perl-File-Object - - src-openeuler/perl-File-Path - - src-openeuler/perl-File-Path-Tiny - - src-openeuler/perl-File-PathList - - src-openeuler/perl-File-Read - - src-openeuler/perl-File-SearchPath - - src-openeuler/perl-File-Share - - src-openeuler/perl-File-ShareDir-ProjectDistDir - - src-openeuler/perl-File-Slurp-Tiny - - src-openeuler/perl-File-Slurper - - src-openeuler/perl-File-Spec-Native - - src-openeuler/perl-File-Temp - - src-openeuler/perl-File-Touch - - src-openeuler/perl-File-Type - - src-openeuler/perl-File-Type-WebImages - - src-openeuler/perl-File-Which - - src-openeuler/perl-File-Zglob - - src-openeuler/perl-FileHandle-Fmode - - src-openeuler/perl-FileHandle-Unget - - src-openeuler/perl-Filesys-Notify-Simple - - src-openeuler/perl-Filter - - src-openeuler/perl-Filter-Simple - - src-openeuler/perl-Finance-YahooQuote - - src-openeuler/perl-Flow - - src-openeuler/perl-Format-Human-Bytes - - src-openeuler/perl-FreezeThaw - - src-openeuler/perl-Games-Solitaire-Verify - - src-openeuler/perl-GD-SVG - - src-openeuler/perl-Geo-Constants - - src-openeuler/perl-Geo-Ellipsoids - - src-openeuler/perl-Geo-Forward - - src-openeuler/perl-Geo-Functions - - src-openeuler/perl-Geo-Inverse - - src-openeuler/perl-Geo-IP - - src-openeuler/perl-Geo-IPfree - - src-openeuler/perl-Geography-Countries - - src-openeuler/perl-Getopt-ArgvFile - - src-openeuler/perl-Getopt-Euclid - - src-openeuler/perl-Getopt-Long - - src-openeuler/perl-Getopt-Long-Descriptive - - src-openeuler/perl-Getopt-Lucid - - src-openeuler/perl-Getopt-Simple - - src-openeuler/perl-Git-Repository - - src-openeuler/perl-Git-Repository-Plugin-AUTOLOAD - - src-openeuler/perl-Git-Version-Compare - - src-openeuler/perl-Git-Wrapper - - src-openeuler/perl-GPS-OID - - src-openeuler/perl-Graph - - src-openeuler/perl-Graphics-ColorNames - - src-openeuler/perl-Graphics-ColorNames-WWW - - src-openeuler/perl-Graphics-ColorNamesLite-WWW - - src-openeuler/perl-Growl-GNTP - - src-openeuler/perl-Guard - - src-openeuler/perl-Ham-Reference-QRZ - - src-openeuler/perl-HarfBuzz-Shaper - - src-openeuler/perl-Hash-Case - - src-openeuler/perl-Hash-Diff - - src-openeuler/perl-Hash-Flatten - - src-openeuler/perl-Hash-Merge - - src-openeuler/perl-Hash-Merge-Simple - - src-openeuler/perl-Hash-MoreUtils - - src-openeuler/perl-Hash-MultiValue - - src-openeuler/perl-Hash-Util-FieldHash-Compat - - src-openeuler/perl-Hook-LexWrap - - src-openeuler/perl-HTML-Defang - - src-openeuler/perl-HTML-Encoding - - src-openeuler/perl-HTML-FillInForm - - src-openeuler/perl-HTML-Form - - src-openeuler/perl-HTML-Format - - src-openeuler/perl-HTML-GenToc - - src-openeuler/perl-HTML-HTML5-Entities - - src-openeuler/perl-HTML-LinkList - - src-openeuler/perl-HTML-Lint - - src-openeuler/perl-HTML-Mason - - src-openeuler/perl-HTML-Quoted - - src-openeuler/perl-HTML-RewriteAttributes - - src-openeuler/perl-HTML-Scrubber - - src-openeuler/perl-HTML-SimpleParse - - src-openeuler/perl-HTML-Strip - - src-openeuler/perl-HTML-StripScripts - - src-openeuler/perl-HTML-StripScripts-Parser - - src-openeuler/perl-HTML-Table - - src-openeuler/perl-HTML-TagCloud - - src-openeuler/perl-HTML-Template - - src-openeuler/perl-HTML-Template-Pro - - src-openeuler/perl-HTML-Tiny - - src-openeuler/perl-HTML-TokeParser-Simple - - src-openeuler/perl-HTTP-Body - - src-openeuler/perl-HTTP-BrowserDetect - - src-openeuler/perl-HTTP-Cache-Transparent - - src-openeuler/perl-HTTP-CookieMonster - - src-openeuler/perl-HTTP-Exception - - src-openeuler/perl-HTTP-Headers-Fast - - src-openeuler/perl-HTTP-Link-Parser - - src-openeuler/perl-HTTP-Lite - - src-openeuler/perl-HTTP-MultiPartParser - - src-openeuler/perl-HTTP-Parser - - src-openeuler/perl-HTTP-Parser-XS - - src-openeuler/perl-HTTP-Request-AsCGI - - src-openeuler/perl-HTTP-Request-Params - - src-openeuler/perl-HTTP-Response-Encoding - - src-openeuler/perl-HTTP-Server-Simple - - src-openeuler/perl-HTTP-Server-Simple-PSGI - - src-openeuler/perl-HTTP-Thin - - src-openeuler/perl-HTTP-Tiny - - src-openeuler/perl-HTTP-Tiny-Multipart - - src-openeuler/perl-HTTP-Tinyish - - src-openeuler/perl-Image-Base - - src-openeuler/perl-Image-ExifTool - - src-openeuler/perl-Image-Math-Constrain - - src-openeuler/perl-Image-Size - - src-openeuler/perl-Image-Xbm - - src-openeuler/perl-Image-Xpm - - src-openeuler/perl-Importer - - src-openeuler/perl-indirect - - src-openeuler/perl-Inline - - src-openeuler/perl-IO - - src-openeuler/perl-IO-Any - - src-openeuler/perl-IO-Compress - - src-openeuler/perl-IO-Interactive - - src-openeuler/perl-IO-Interface - - src-openeuler/perl-IO-Pager - - src-openeuler/perl-IO-Pipely - - src-openeuler/perl-IO-Prompt-Tiny - - src-openeuler/perl-IO-Prompter - - src-openeuler/perl-IO-Pty-Easy - - src-openeuler/perl-IO-Socket-IP - - src-openeuler/perl-IO-Socket-Multicast - - src-openeuler/perl-IO-Socket-Socks - - src-openeuler/perl-IO-Socket-SSL - - src-openeuler/perl-IO-Socket-Timeout - - src-openeuler/perl-IO-Stty - - src-openeuler/perl-IO-Tee - - src-openeuler/perl-IO-TieCombine - - src-openeuler/perl-IPC-Cmd - - src-openeuler/perl-IPC-Run - - src-openeuler/perl-IPC-Run3 - - src-openeuler/perl-IPC-ShareLite - - src-openeuler/perl-IPC-System-Simple - - src-openeuler/perl-IPC-SysV - - src-openeuler/perl-IPTables-ChainMgr - - src-openeuler/perl-IPTables-Parse - - src-openeuler/perl-IRC-Utils - - src-openeuler/perl-Iterator-Simple - - src-openeuler/perl-Iterator-Simple-Lookahead - - src-openeuler/perl-JavaScript-Beautifier - - src-openeuler/perl-JSON-Parse - - src-openeuler/perl-JSON-Pointer - - src-openeuler/perl-JSON-PP - - src-openeuler/perl-JSON-RPC-Common - - src-openeuler/perl-JSON-Tiny - - src-openeuler/perl-L - - src-openeuler/perl-Language-Functional - - src-openeuler/perl-latest - - src-openeuler/perl-LaTeX-ToUnicode - - src-openeuler/perl-Lchown - - src-openeuler/perl-Lexical-Persistence - - src-openeuler/perl-Lexical-SealRequireHints - - src-openeuler/perl-lexical-underscore - - src-openeuler/perl-lib-abs - - src-openeuler/perl-lib-relative - - src-openeuler/perl-libnet - - src-openeuler/perl-Library-CallNumber-LC - - src-openeuler/perl-Lingua-EN-Alphabet-Shaw - - src-openeuler/perl-Lingua-EN-Fathom - - src-openeuler/perl-Lingua-EN-FindNumber - - src-openeuler/perl-Lingua-EN-Inflect - - src-openeuler/perl-Lingua-EN-Inflect-Number - - src-openeuler/perl-Lingua-EN-Number-IsOrdinal - - src-openeuler/perl-Lingua-EN-Numbers - - src-openeuler/perl-Lingua-EN-Numbers-Easy - - src-openeuler/perl-Lingua-EN-Numbers-Ordinate - - src-openeuler/perl-Lingua-EN-PluralToSingular - - src-openeuler/perl-Lingua-EN-Sentence - - src-openeuler/perl-Lingua-EN-Syllable - - src-openeuler/perl-Lingua-EN-Words2Nums - - src-openeuler/perl-Lingua-Flags - - src-openeuler/perl-Lingua-Identify - - src-openeuler/perl-Lingua-KO-Hangul-Util - - src-openeuler/perl-Lingua-PT-Stemmer - - src-openeuler/perl-Lingua-Stem-Ru - - src-openeuler/perl-Lingua-Stem-Snowball - - src-openeuler/perl-Lingua-Translit - - src-openeuler/perl-List-AllUtils - - src-openeuler/perl-List-MoreUtils - - src-openeuler/perl-List-MoreUtils-XS - - src-openeuler/perl-List-Pairwise - - src-openeuler/perl-List-SomeUtils - - src-openeuler/perl-List-SomeUtils-XS - - src-openeuler/perl-List-UtilsBy - - src-openeuler/perl-Locale-Codes - - src-openeuler/perl-Locale-Currency-Format - - src-openeuler/perl-Locale-Maketext - - src-openeuler/perl-Locale-Maketext-Gettext - - src-openeuler/perl-Locale-Maketext-Lexicon - - src-openeuler/perl-Locale-Maketext-Simple - - src-openeuler/perl-Locale-MO-File - - src-openeuler/perl-Locale-Msgfmt - - src-openeuler/perl-Locale-PO - - src-openeuler/perl-Locale-SubCountry - - src-openeuler/perl-Locale-TextDomain-OO - - src-openeuler/perl-Locale-TextDomain-OO-Util - - src-openeuler/perl-Locale-US - - src-openeuler/perl-Locale-Utils-PlaceholderBabelFish - - src-openeuler/perl-Locale-Utils-PlaceholderMaketext - - src-openeuler/perl-Locale-Utils-PlaceholderNamed - - src-openeuler/perl-Log-Any - - src-openeuler/perl-Log-Contextual - - src-openeuler/perl-Log-Dispatch - - src-openeuler/perl-Log-ger - - src-openeuler/perl-Log-Handler - - src-openeuler/perl-Log-Log4perl - - src-openeuler/perl-Log-Message - - src-openeuler/perl-Log-Message-Simple - - src-openeuler/perl-Log-Trace - - src-openeuler/perl-Log-Trivial - - src-openeuler/perl-LWP-Online - - src-openeuler/perl-Mail-AuthenticationResults - - src-openeuler/perl-Mail-Box - - src-openeuler/perl-Mail-Box-Parser-C - - src-openeuler/perl-Mail-Box-POP3 - - src-openeuler/perl-Mail-IMAPTalk - - src-openeuler/perl-Mail-JMAPTalk - - src-openeuler/perl-Mail-Message - - src-openeuler/perl-Mail-Sendmail - - src-openeuler/perl-Mail-SPF - - src-openeuler/perl-Mail-Transport - - src-openeuler/perl-Makefile-DOM - - src-openeuler/perl-MasonX-Request-WithApacheSession - - src-openeuler/perl-Math-Base36 - - src-openeuler/perl-Math-Base85 - - src-openeuler/perl-Math-BaseCnv - - src-openeuler/perl-Math-BigInt - - src-openeuler/perl-Math-BigInt-FastCalc - - src-openeuler/perl-Math-BigRat - - src-openeuler/perl-Math-Calc-Units - - src-openeuler/perl-Math-Cartesian-Product - - src-openeuler/perl-Math-Complex - - src-openeuler/perl-Math-ConvexHull - - src-openeuler/perl-Math-ConvexHull-MonotoneChain - - src-openeuler/perl-Math-Derivative - - src-openeuler/perl-Math-Expression-Evaluator - - src-openeuler/perl-Math-FFT - - src-openeuler/perl-Math-Int64 - - src-openeuler/perl-Math-MatrixReal - - src-openeuler/perl-Math-Polygon - - src-openeuler/perl-Math-Round - - src-openeuler/perl-Math-Spline - - src-openeuler/perl-Math-Utils - - src-openeuler/perl-Math-Vec - - src-openeuler/perl-MemHandle - - src-openeuler/perl-Memoize - - src-openeuler/perl-Menlo - - src-openeuler/perl-Menlo-Legacy - - src-openeuler/perl-Meta-Builder - - src-openeuler/perl-Method-Signatures-Simple - - src-openeuler/perl-Metrics-Any - - src-openeuler/perl-MIME-Base32 - - src-openeuler/perl-MIME-Base64 - - src-openeuler/perl-MIME-Charset - - src-openeuler/perl-MIME-EncWords - - src-openeuler/perl-MIME-tools - - src-openeuler/perl-mixin - - src-openeuler/perl-Mixin-ExtraFields - - src-openeuler/perl-Mixin-Linewise - - src-openeuler/perl-Mock-Config - - src-openeuler/perl-Mock-Quick - - src-openeuler/perl-Mock-Sub - - src-openeuler/perl-Modern-Perl - - src-openeuler/perl-Module-Build-Deprecated - - src-openeuler/perl-Module-Build-Pluggable - - src-openeuler/perl-Module-Build-Using-PkgConfig - - src-openeuler/perl-Module-Compile - - src-openeuler/perl-Module-CoreList - - src-openeuler/perl-Module-CPANfile - - src-openeuler/perl-Module-Data - - src-openeuler/perl-Module-Depends - - src-openeuler/perl-Module-Extract - - src-openeuler/perl-Module-Extract-Namespaces - - src-openeuler/perl-Module-Extract-Use - - src-openeuler/perl-Module-Find - - src-openeuler/perl-Module-Install-Authority - - src-openeuler/perl-Module-Install-AutoManifest - - src-openeuler/perl-Module-Install-ExtraTests - - src-openeuler/perl-Module-Install-TestBase - - src-openeuler/perl-Module-Install-TrustMetaYml - - src-openeuler/perl-Module-Load - - src-openeuler/perl-Module-Load-Conditional - - src-openeuler/perl-Module-Load-Util - - src-openeuler/perl-Module-Manifest - - src-openeuler/perl-Module-Mask - - src-openeuler/perl-Module-Math-Depends - - src-openeuler/perl-Module-Metadata - - src-openeuler/perl-Module-Path - - src-openeuler/perl-Module-Pluggable - - src-openeuler/perl-Module-Reader - - src-openeuler/perl-Module-Refresh - - src-openeuler/perl-Module-Runtime-Conflicts - - src-openeuler/perl-Module-Signature - - src-openeuler/perl-Module-Starter - - src-openeuler/perl-Module-Util - - src-openeuler/perl-MogileFS-Client - - src-openeuler/perl-MogileFS-Utils - - src-openeuler/perl-Mojo-DOM58 - - src-openeuler/perl-Monitoring-Plugin - - src-openeuler/perl-Monotone-AutomateStdio - - src-openeuler/perl-Moose - - src-openeuler/perl-Moose-Autobox - - src-openeuler/perl-MooseX-Aliases - - src-openeuler/perl-MooseX-App-Cmd - - src-openeuler/perl-MooseX-ArrayRef - - src-openeuler/perl-MooseX-Async - - src-openeuler/perl-MooseX-Attribute-Chained - - src-openeuler/perl-MooseX-CascadeClearing - - src-openeuler/perl-MooseX-ClassAttribute - - src-openeuler/perl-MooseX-CoercePerAttribute - - src-openeuler/perl-MooseX-ConfigFromFile - - src-openeuler/perl-MooseX-Configuration - - src-openeuler/perl-MooseX-Daemonize - - src-openeuler/perl-MooseX-Emulate-Class-Accessor-Fast - - src-openeuler/perl-MooseX-Getopt - - src-openeuler/perl-MooseX-GlobRef - - src-openeuler/perl-MooseX-Has-Options - - src-openeuler/perl-MooseX-Has-Sugar - - src-openeuler/perl-MooseX-InsideOut - - src-openeuler/perl-MooseX-Iterator - - src-openeuler/perl-MooseX-LazyRequire - - src-openeuler/perl-MooseX-MarkAsMethods - - src-openeuler/perl-MooseX-Meta-TypeConstraint-ForceCoercion - - src-openeuler/perl-MooseX-Meta-TypeConstraint-Mooish - - src-openeuler/perl-MooseX-MethodAttributes - - src-openeuler/perl-MooseX-MultiInitArg - - src-openeuler/perl-MooseX-NonMoose - - src-openeuler/perl-MooseX-Object-Pluggable - - src-openeuler/perl-MooseX-OneArgNew - - src-openeuler/perl-MooseX-Param - - src-openeuler/perl-MooseX-Params-Validate - - src-openeuler/perl-MooseX-POE - - src-openeuler/perl-MooseX-RelatedClassRoles - - src-openeuler/perl-MooseX-Role-Cmd - - src-openeuler/perl-MooseX-Role-Matcher - - src-openeuler/perl-MooseX-Role-Parameterized - - src-openeuler/perl-MooseX-Role-Strict - - src-openeuler/perl-MooseX-Role-Tempdir - - src-openeuler/perl-MooseX-SemiAffordanceAccessor - - src-openeuler/perl-MooseX-SetOnce - - src-openeuler/perl-MooseX-SimpleConfig - - src-openeuler/perl-MooseX-Singleton - - src-openeuler/perl-MooseX-StrictConstructor - - src-openeuler/perl-MooseX-TraitFor-Meta-Class-BetterAnonClassNames - - src-openeuler/perl-MooseX-Traits - - src-openeuler/perl-MooseX-Traits-Pluggable - - src-openeuler/perl-MooseX-Types - - src-openeuler/perl-MooseX-Types-Common - - src-openeuler/perl-MooseX-Types-LoadableClass - - src-openeuler/perl-MooseX-Types-Path-Class - - src-openeuler/perl-MooseX-Types-Path-Tiny - - src-openeuler/perl-MooseX-Types-Perl - - src-openeuler/perl-MooseX-Types-Stringlike - - src-openeuler/perl-MooX - - src-openeuler/perl-MooX-Cmd - - src-openeuler/perl-MooX-ConfigFromFile - - src-openeuler/perl-MooX-File-ConfigDir - - src-openeuler/perl-MooX-HandlesVia - - src-openeuler/perl-MooX-HasEnv - - src-openeuler/perl-MooX-Locale-Passthrough - - src-openeuler/perl-MooX-Locale-TextDomain-OO - - src-openeuler/perl-MooX-Log-Any - - src-openeuler/perl-MooX-Role-Parameterized - - src-openeuler/perl-MooX-Roles-Pluggable - - src-openeuler/perl-MooX-Singleton - - src-openeuler/perl-MooX-StrictConstructor - - src-openeuler/perl-Mozilla-LDAP - - src-openeuler/perl-Mozilla-PublicSuffix - - src-openeuler/perl-MP3-Info - - src-openeuler/perl-multidimensional - - src-openeuler/perl-namespace-autoclean - - src-openeuler/perl-namespace-clean - - src-openeuler/perl-namespace-sweep - - src-openeuler/perl-Net-AMQP - - src-openeuler/perl-Net-BGP - - src-openeuler/perl-Net-CIDR - - src-openeuler/perl-Net-Daemon - - src-openeuler/perl-Net-DNS-Resolver-Programmable - - src-openeuler/perl-Net-DNS-SEC - - src-openeuler/perl-Net-Domain-TLD - - src-openeuler/perl-Net-Google-AuthSub - - src-openeuler/perl-Net-HL7 - - src-openeuler/perl-Net-INET6Glue - - src-openeuler/perl-Net-IP - - src-openeuler/perl-Net-IP-Match-Regexp - - src-openeuler/perl-Net-IP-Minimal - - src-openeuler/perl-Net-LDAP-SID - - src-openeuler/perl-Net-MQTT-Simple - - src-openeuler/perl-Net-OAuth - - src-openeuler/perl-Net-OpenSSH - - src-openeuler/perl-Net-Ping-External - - src-openeuler/perl-Net-POP3S - - src-openeuler/perl-Net-Random - - src-openeuler/perl-Net-RawIP - - src-openeuler/perl-Net-Server-SS-PreFork - - src-openeuler/perl-Net-SFTP-Foreign - - src-openeuler/perl-Net-SMTPS - - src-openeuler/perl-Net-SSLeay - - src-openeuler/perl-Net-Telnet - - src-openeuler/perl-Net-Telnet-Cisco - - src-openeuler/perl-Net-UPnP - - src-openeuler/perl-Nmap-Parser - - src-openeuler/perl-NNTPClient - - src-openeuler/perl-Number-Bytes-Human - - src-openeuler/perl-Number-Compare - - src-openeuler/perl-Number-Format - - src-openeuler/perl-Number-Misc - - src-openeuler/perl-Number-Range - - src-openeuler/perl-Number-Tolerant - - src-openeuler/perl-Object-Accessor - - src-openeuler/perl-Object-HashBase - - src-openeuler/perl-Object-Pluggable - - src-openeuler/perl-Object-Realize-Later - - src-openeuler/perl-Object-Signature - - src-openeuler/perl-Object-Tiny - - src-openeuler/perl-OLE-Storage_Lite - - src-openeuler/perl-Ouch - - src-openeuler/perl-Package-Anon - - src-openeuler/perl-Package-DeprecationManager - - src-openeuler/perl-Package-New - - src-openeuler/perl-Package-Stash - - src-openeuler/perl-Package-Variant - - src-openeuler/perl-PadWalker - - src-openeuler/perl-Palm - - src-openeuler/perl-Palm-PDB - - src-openeuler/perl-Panotools-Script - - src-openeuler/perl-PAR - - src-openeuler/perl-PAR-Dist - - src-openeuler/perl-Parallel-ForkManager - - src-openeuler/perl-Parallel-Iterator - - src-openeuler/perl-Parallel-Pipes - - src-openeuler/perl-Parallel-Runner - - src-openeuler/perl-Parallel-Scoreboard - - src-openeuler/perl-Params-CallbackRequest - - src-openeuler/perl-Params-Check - - src-openeuler/perl-Params-Coerce - - src-openeuler/perl-Params-Validate - - src-openeuler/perl-parent - - src-openeuler/perl-Parse-Debian-Packages - - src-openeuler/perl-Parse-DMIDecode - - src-openeuler/perl-Parse-EDID - - src-openeuler/perl-Parse-ErrorString-Perl - - src-openeuler/perl-Parse-ExuberantCTags - - src-openeuler/perl-Parse-Gitignore - - src-openeuler/perl-Parse-MIME - - src-openeuler/perl-Parse-PMFile - - src-openeuler/perl-Path-FindDev - - src-openeuler/perl-Path-IsDev - - src-openeuler/perl-Path-Iterator-Rule - - src-openeuler/perl-Path-ScanINC - - src-openeuler/perl-Path-Tiny-Rule - - src-openeuler/perl-PathTools - - src-openeuler/perl-PBKDF2-Tiny - - src-openeuler/perl-PDF-Create - - src-openeuler/perl-PDF-Reuse - - src-openeuler/perl-Pegex - - src-openeuler/perl-Perl-OSType - - src-openeuler/perl-Perl-PrereqScanner - - src-openeuler/perl-Perl-Stripper - - src-openeuler/perl-Perl-Tidy - - src-openeuler/perl-Perl-Tidy-Sweetened - - src-openeuler/perl-Perl-Version - - src-openeuler/perl-Perl6-Caller - - src-openeuler/perl-Perl6-Junction - - src-openeuler/perl-Perl6-Slurp - - src-openeuler/perl-perlfaq - - src-openeuler/perl-Perlilog - - src-openeuler/perl-PerlIO-buffersize - - src-openeuler/perl-PerlIO-eol - - src-openeuler/perl-PerlIO-gzip - - src-openeuler/perl-PerlIO-Layers - - src-openeuler/perl-PerlIO-locale - - src-openeuler/perl-PerlIO-utf8_strict - - src-openeuler/perl-PerlIO-via-QuotedPrint - - src-openeuler/perl-PerlIO-via-Timeout - - src-openeuler/perl-PFT - - src-openeuler/perl-PHP-Serialization - - src-openeuler/perl-PkgConfig-LibPkgConf - - src-openeuler/perl-Pod-Checker - - src-openeuler/perl-Pod-Constants - - src-openeuler/perl-Pod-Coverage-Moose - - src-openeuler/perl-Pod-Coverage-TrustPod - - src-openeuler/perl-Pod-Elemental - - src-openeuler/perl-Pod-Elemental-PerlMunger - - src-openeuler/perl-Pod-Escapes - - src-openeuler/perl-Pod-Eventual - - src-openeuler/perl-Pod-Markdown-Github - - src-openeuler/perl-Pod-MinimumVersion - - src-openeuler/perl-Pod-Parser - - src-openeuler/perl-Pod-Perldoc - - src-openeuler/perl-Pod-Plainer - - src-openeuler/perl-Pod-POM - - src-openeuler/perl-Pod-PseudoPod - - src-openeuler/perl-Pod-Simple - - src-openeuler/perl-Pod-Simple-Wiki - - src-openeuler/perl-Pod-Snippets - - src-openeuler/perl-Pod-Spell - - src-openeuler/perl-Pod-Spell-CommonMistakes - - src-openeuler/perl-Pod-Strip - - src-openeuler/perl-Pod-Tidy - - src-openeuler/perl-Pod-Usage - - src-openeuler/perl-Pod-Wrap - - src-openeuler/perl-Pod-Xhtml - - src-openeuler/perl-POD2-Base - - src-openeuler/perl-podlators - - src-openeuler/perl-POE - - src-openeuler/perl-POE-Test-Loops - - src-openeuler/perl-POSIX-strftime-Compiler - - src-openeuler/perl-POSIX-strptime - - src-openeuler/perl-PPI - - src-openeuler/perl-PPI-HTML - - src-openeuler/perl-PPI-XS - - src-openeuler/perl-PPIx-EditorTools - - src-openeuler/perl-PPIx-QuoteLike - - src-openeuler/perl-PPIx-Regexp - - src-openeuler/perl-prefork - - src-openeuler/perl-Printer - - src-openeuler/perl-Proc-Daemon - - src-openeuler/perl-Proc-InvokeEditor - - src-openeuler/perl-Proc-PID-File - - src-openeuler/perl-Proc-ProcessTable - - src-openeuler/perl-Proc-Simple - - src-openeuler/perl-Proc-Terminator - - src-openeuler/perl-Proc-Wait3 - - src-openeuler/perl-Promises - - src-openeuler/perl-PSGI - - src-openeuler/perl-RDF-NS - - src-openeuler/perl-RDF-NS-Curated - - src-openeuler/perl-RDF-Prefixes - - src-openeuler/perl-re-engine-PCRE2 - - src-openeuler/perl-ReadonlyX - - src-openeuler/perl-Redis - - src-openeuler/perl-Ref-Util - - src-openeuler/perl-Ref-Util-XS - - src-openeuler/perl-Regexp-Assemble - - src-openeuler/perl-Regexp-Assemble-Compressed - - src-openeuler/perl-Regexp-Common - - src-openeuler/perl-Regexp-Common-net-CIDR - - src-openeuler/perl-Regexp-Grammars - - src-openeuler/perl-Regexp-IPv6 - - src-openeuler/perl-Regexp-Pattern - - src-openeuler/perl-Regexp-Stringify - - src-openeuler/perl-Regexp-Util - - src-openeuler/perl-REST-Client - - src-openeuler/perl-Retry - - src-openeuler/perl-Return-MultiLevel - - src-openeuler/perl-Return-Value - - src-openeuler/perl-Role-Basic - - src-openeuler/perl-Role-Identifiable - - src-openeuler/perl-Roman - - src-openeuler/perl-Router-Simple - - src-openeuler/perl-Safe-Isa - - src-openeuler/perl-Scalar-Construct - - src-openeuler/perl-Scalar-List-Utils - - src-openeuler/perl-Scalar-String - - src-openeuler/perl-Schedule-Cron - - src-openeuler/perl-Scope-Guard - - src-openeuler/perl-Scope-Upper - - src-openeuler/perl-Scriptalicious - - src-openeuler/perl-SelfLoader - - src-openeuler/perl-Server-Starter - - src-openeuler/perl-Set-Array - - src-openeuler/perl-Set-Crontab - - src-openeuler/perl-Set-Infinite - - src-openeuler/perl-Set-IntSpan - - src-openeuler/perl-Set-Scalar - - src-openeuler/perl-Set-Tiny - - src-openeuler/perl-Shell - - src-openeuler/perl-Shell-Guess - - src-openeuler/perl-Smart-Comments - - src-openeuler/perl-Snowball-Swedish - - src-openeuler/perl-Socket - - src-openeuler/perl-Software-License-CCpack - - src-openeuler/perl-Sort-Key - - src-openeuler/perl-Sort-MergeSort - - src-openeuler/perl-Sort-Naturally - - src-openeuler/perl-Sort-Versions - - src-openeuler/perl-Spellunker - - src-openeuler/perl-Spiffy - - src-openeuler/perl-Spreadsheet-ParseExcel - - src-openeuler/perl-SQL-Abstract - - src-openeuler/perl-SQL-Interp - - src-openeuler/perl-SQL-Library - - src-openeuler/perl-SQL-ReservedWords - - src-openeuler/perl-Statistics-Basic - - src-openeuler/perl-Statistics-CaseResampling - - src-openeuler/perl-Statistics-ChiSquare - - src-openeuler/perl-Statistics-Contingency - - src-openeuler/perl-Statistics-Descriptive - - src-openeuler/perl-STD - - src-openeuler/perl-Stream-Buffered - - src-openeuler/perl-String-Approx - - src-openeuler/perl-String-Base - - src-openeuler/perl-String-CamelCase - - src-openeuler/perl-String-Copyright - - src-openeuler/perl-String-Dirify - - src-openeuler/perl-String-Escape - - src-openeuler/perl-String-Format - - src-openeuler/perl-String-Formatter - - src-openeuler/perl-String-Interpolate-Named - - src-openeuler/perl-String-Print - - src-openeuler/perl-String-Random - - src-openeuler/perl-String-RewritePrefix - - src-openeuler/perl-String-Similarity - - src-openeuler/perl-String-Tagged - - src-openeuler/perl-String-Tagged-Terminal - - src-openeuler/perl-String-Trim - - src-openeuler/perl-String-Truncate - - src-openeuler/perl-String-Util - - src-openeuler/perl-Struct-Dumb - - src-openeuler/perl-Sub-Attribute - - src-openeuler/perl-Sub-Exporter-ForMethods - - src-openeuler/perl-Sub-Exporter-GlobExporter - - src-openeuler/perl-Sub-Identify - - src-openeuler/perl-Sub-Infix - - src-openeuler/perl-Sub-Info - - src-openeuler/perl-Sub-Override - - src-openeuler/perl-Sub-Prototype - - src-openeuler/perl-Sub-WrapPackages - - src-openeuler/perl-SUPER - - src-openeuler/perl-SVG - - src-openeuler/perl-SVG-Parser - - src-openeuler/perl-Symbol-Global-Name - - src-openeuler/perl-Symbol-Util - - src-openeuler/perl-syntax - - src-openeuler/perl-Syntax-Keyword-Gather - - src-openeuler/perl-Syntax-Keyword-Junction - - src-openeuler/perl-Syntax-Keyword-Try - - src-openeuler/perl-Sys-Hostname-Long - - src-openeuler/perl-Sys-Info-Base - - src-openeuler/perl-Sys-Mmap - - src-openeuler/perl-Sys-Statistics-Linux - - src-openeuler/perl-Sys-Syslog - - src-openeuler/perl-System-Command - - src-openeuler/perl-System-Info - - src-openeuler/perl-Taint-Util - - src-openeuler/perl-Tangerine - - src-openeuler/perl-TAP-Formatter-HTML - - src-openeuler/perl-TAP-Harness-Archive - - src-openeuler/perl-TAP-Harness-JUnit - - src-openeuler/perl-TAP-SimpleOutput - - src-openeuler/perl-Tapper - - src-openeuler/perl-Task-Kensho-Exceptions - - src-openeuler/perl-Task-Moose - - src-openeuler/perl-Task-Weaken - - src-openeuler/perl-Template-Alloy - - src-openeuler/perl-Template-Multilingual - - src-openeuler/perl-Template-Plugin-Class - - src-openeuler/perl-Template-Plugin-Cycle - - src-openeuler/perl-Template-Tiny - - src-openeuler/perl-Template-Toolkit - - src-openeuler/perl-Template-Toolkit-Simple - - src-openeuler/perl-Term-ANSIColor - - src-openeuler/perl-Term-Cap - - src-openeuler/perl-Term-Chrome - - src-openeuler/perl-Term-Clui - - src-openeuler/perl-Term-EditorEdit - - src-openeuler/perl-Term-Encoding - - src-openeuler/perl-Term-ProgressBar - - src-openeuler/perl-Term-Size - - src-openeuler/perl-Term-Table - - src-openeuler/perl-Term-UI - - src-openeuler/perl-TermReadKey - - src-openeuler/perl-Test-Abortable - - src-openeuler/perl-Test-API - - src-openeuler/perl-Test-Assert - - src-openeuler/perl-Test-Assertions - - src-openeuler/perl-Test-Base - - src-openeuler/perl-Test-CheckChanges - - src-openeuler/perl-Test-CheckDeps - - src-openeuler/perl-Test-Class - - src-openeuler/perl-Test-Class-Most - - src-openeuler/perl-Test-CleanNamespaces - - src-openeuler/perl-Test-Cmd - - src-openeuler/perl-Test-Command - - src-openeuler/perl-Test-Compile - - src-openeuler/perl-Test-ConsistentVersion - - src-openeuler/perl-Test-CPAN-Meta-JSON - - src-openeuler/perl-Test-CPAN-Meta-YAML - - src-openeuler/perl-Test-Deep-Fuzzy - - src-openeuler/perl-Test-Deep-Type - - src-openeuler/perl-Test-Dependencies - - src-openeuler/perl-Test-Differences - - src-openeuler/perl-Test-Dir - - src-openeuler/perl-Test-Directory - - src-openeuler/perl-Test-Dist-VersionSync - - src-openeuler/perl-Test-Distribution - - src-openeuler/perl-Test-EOL - - src-openeuler/perl-Test-Exception - - src-openeuler/perl-Test-Exception-LessClever - - src-openeuler/perl-Test-Exit - - src-openeuler/perl-Test-Expect - - src-openeuler/perl-Test-File - - src-openeuler/perl-Test-File-Contents - - src-openeuler/perl-Test-File-ShareDir - - src-openeuler/perl-Test-Filename - - src-openeuler/perl-Test-Fixme - - src-openeuler/perl-Test-Harness - - src-openeuler/perl-Test-Harness-Straps - - src-openeuler/perl-Test-HasVersion - - src-openeuler/perl-Test-HexDifferences - - src-openeuler/perl-Test-HexString - - src-openeuler/perl-Test-HTTP-Server-Simple - - src-openeuler/perl-Test-Identity - - src-openeuler/perl-Test-Inter - - src-openeuler/perl-Test-Is - - src-openeuler/perl-Test-JSON - - src-openeuler/perl-Test-LectroTest - - src-openeuler/perl-Test-LoadAllModules - - src-openeuler/perl-Test-LongString - - src-openeuler/perl-Test-LWP-UserAgent - - src-openeuler/perl-Test-Manifest - - src-openeuler/perl-Test-Memory-Cycle - - src-openeuler/perl-Test-Metrics-Any - - src-openeuler/perl-Test-Mock-LWP - - src-openeuler/perl-Test-Mock-Time - - src-openeuler/perl-Test-MockModule - - src-openeuler/perl-Test-MockObject - - src-openeuler/perl-Test-MockRandom - - src-openeuler/perl-Test-MockTime - - src-openeuler/perl-Test-Modern - - src-openeuler/perl-Test-Mojibake - - src-openeuler/perl-Test-Moose-More - - src-openeuler/perl-Test-More-UTF8 - - src-openeuler/perl-Test-Most - - src-openeuler/perl-Test-mysqld - - src-openeuler/perl-Test-Name-FromLine - - src-openeuler/perl-Test-NiceDump - - src-openeuler/perl-Test-NoBreakpoints - - src-openeuler/perl-Test-NoPlan - - src-openeuler/perl-Test-NoTabs - - src-openeuler/perl-Test-Number-Delta - - src-openeuler/perl-Test-Object - - src-openeuler/perl-Test-Output - - src-openeuler/perl-Test-Pod-Content - - src-openeuler/perl-Test-Pod-No404s - - src-openeuler/perl-Test-Pod-Spelling-CommonMistakes - - src-openeuler/perl-Test-POE-Client-TCP - - src-openeuler/perl-Test-POE-Server-TCP - - src-openeuler/perl-Test-Portability-Files - - src-openeuler/perl-Test-Prereq - - src-openeuler/perl-Test-Regexp - - src-openeuler/perl-Test-Regression - - src-openeuler/perl-Test-Requires-Git - - src-openeuler/perl-Test-Roo - - src-openeuler/perl-Test-Routine - - src-openeuler/perl-Test-Run - - src-openeuler/perl-Test-Run-CmdLine - - src-openeuler/perl-Test-Script-Run - - src-openeuler/perl-Test-SharedFork - - src-openeuler/perl-Test-Simple - - src-openeuler/perl-Test-Spelling - - src-openeuler/perl-Test-Strict - - src-openeuler/perl-Test-SubCalls - - src-openeuler/perl-Test-Synopsis - - src-openeuler/perl-Test-Taint - - src-openeuler/perl-Test-TCP - - src-openeuler/perl-Test-Time - - src-openeuler/perl-Test-TinyMocker - - src-openeuler/perl-Test-Toolbox - - src-openeuler/perl-Test-TrailingSpace - - src-openeuler/perl-Test-Trap - - src-openeuler/perl-Test-Unit-Lite - - src-openeuler/perl-Test-UseAllModules - - src-openeuler/perl-Test-utf8 - - src-openeuler/perl-Test-Vars - - src-openeuler/perl-Test-Warn - - src-openeuler/perl-Test-Without-Module - - src-openeuler/perl-Test-WriteVariants - - src-openeuler/perl-Test-WWW-Selenium - - src-openeuler/perl-Test-YAML - - src-openeuler/perl-Test-YAML-Valid - - src-openeuler/perl-Test2-Suite - - src-openeuler/perl-TestML - - src-openeuler/perl-TeX-Encode - - src-openeuler/perl-TeX-Hyphen - - src-openeuler/perl-Text-Affixes - - src-openeuler/perl-Text-Aligner - - src-openeuler/perl-Text-ASCIITable - - src-openeuler/perl-Text-Autoformat - - src-openeuler/perl-Text-Balanced - - src-openeuler/perl-Text-Clip - - src-openeuler/perl-Text-CSV-Separator - - src-openeuler/perl-Text-Diff - - src-openeuler/perl-Text-Diff-HTML - - src-openeuler/perl-Text-Diff-Parser - - src-openeuler/perl-Text-FindIndent - - src-openeuler/perl-Text-Format - - src-openeuler/perl-Text-FormatTable - - src-openeuler/perl-Text-Fuzzy - - src-openeuler/perl-Text-Haml - - src-openeuler/perl-Text-Levenshtein-Damerau - - src-openeuler/perl-Text-Levenshtein-Damerau-XS - - src-openeuler/perl-Text-Markdown - - src-openeuler/perl-Text-MultiMarkdown - - src-openeuler/perl-Text-Ngram - - src-openeuler/perl-Text-ParseWords - - src-openeuler/perl-Text-PDF - - src-openeuler/perl-Text-Quoted - - src-openeuler/perl-Text-Reflow - - src-openeuler/perl-Text-Reform - - src-openeuler/perl-Text-Roman - - src-openeuler/perl-Text-Soundex - - src-openeuler/perl-Text-Sprintf-Named - - src-openeuler/perl-Text-Table - - src-openeuler/perl-Text-Table-Tiny - - src-openeuler/perl-Text-TabularDisplay - - src-openeuler/perl-Text-Template-Simple - - src-openeuler/perl-Text-Textile - - src-openeuler/perl-Text-vCard - - src-openeuler/perl-Text-VCardFast - - src-openeuler/perl-Text-vFile-asData - - src-openeuler/perl-Text-VisualWidth-PP - - src-openeuler/perl-Text-WikiFormat - - src-openeuler/perl-Text-WordDiff - - src-openeuler/perl-Text-Wrapper - - src-openeuler/perl-Text-xSV - - src-openeuler/perl-Thread-Queue - - src-openeuler/perl-Thread-SigMask - - src-openeuler/perl-threads - - src-openeuler/perl-threads-shared - - src-openeuler/perl-Throwable - - src-openeuler/perl-Tie-Cache - - src-openeuler/perl-Tie-Cycle - - src-openeuler/perl-Tie-DataUUID - - src-openeuler/perl-Tie-DBI - - src-openeuler/perl-Tie-EncryptedHash - - src-openeuler/perl-Tie-Handle-Offset - - src-openeuler/perl-Tie-Hash-MultiValue - - src-openeuler/perl-Tie-Simple - - src-openeuler/perl-Tie-Sub - - src-openeuler/perl-Time-Clock - - src-openeuler/perl-Time-Duration - - src-openeuler/perl-Time-Duration-Parse - - src-openeuler/perl-Time-HiRes - - src-openeuler/perl-Time-Interval - - src-openeuler/perl-Time-Local - - src-openeuler/perl-Time-Mock - - src-openeuler/perl-Time-Moment - - src-openeuler/perl-Time-ParseDate - - src-openeuler/perl-Time-Period - - src-openeuler/perl-Time-Piece - - src-openeuler/perl-Time-timegm - - src-openeuler/perl-Time-Tiny - - src-openeuler/perl-Time-Warp - - src-openeuler/perl-Time-y2038 - - src-openeuler/perl-Tk-Canvas-GradientColor - - src-openeuler/perl-Tk-ColoredButton - - src-openeuler/perl-Tk-DoubleClick - - src-openeuler/perl-Tk-FontDialog - - src-openeuler/perl-Tk-ObjScanner - - src-openeuler/perl-Tk-Pod - - src-openeuler/perl-Tk-Text-SuperText - - src-openeuler/perl-TOML-Parser - - src-openeuler/perl-Tree - - src-openeuler/perl-Tree-DAG_Node - - src-openeuler/perl-Tree-R - - src-openeuler/perl-Tree-Simple - - src-openeuler/perl-Type-Tiny-XS - - src-openeuler/perl-Unicode-CaseFold - - src-openeuler/perl-Unicode-Casing - - src-openeuler/perl-Unicode-CheckUTF8 - - src-openeuler/perl-Unicode-CheckUTF8-PP - - src-openeuler/perl-Unicode-Collate - - src-openeuler/perl-Unicode-Map - - src-openeuler/perl-Unicode-Normalize - - src-openeuler/perl-Unicode-String - - src-openeuler/perl-UNIVERSAL-can - - src-openeuler/perl-UNIVERSAL-isa - - src-openeuler/perl-UNIVERSAL-require - - src-openeuler/perl-Unix-Process - - src-openeuler/perl-URI - - src-openeuler/perl-URI-db - - src-openeuler/perl-URI-Encode - - src-openeuler/perl-URI-Escape-XS - - src-openeuler/perl-URI-Find - - src-openeuler/perl-URI-Find-Simple - - src-openeuler/perl-URI-FromHash - - src-openeuler/perl-URI-Nested - - src-openeuler/perl-URI-Query - - src-openeuler/perl-URI-Title - - src-openeuler/perl-URI-ws - - src-openeuler/perl-URL-Encode - - src-openeuler/perl-URL-Encode-XS - - src-openeuler/perl-User - - src-openeuler/perl-User-Identity - - src-openeuler/perl-UUID - - src-openeuler/perl-UUID-Tiny - - src-openeuler/perl-v6 - - src-openeuler/perl-Validation-Class - - src-openeuler/perl-Variable-Magic - - src-openeuler/perl-Verilog-Readmem - - src-openeuler/perl-version - - src-openeuler/perl-Version-Next - - src-openeuler/perl-Version-Requirements - - src-openeuler/perl-Want - - src-openeuler/perl-WebService-Linode - - src-openeuler/perl-WebService-Validator-HTML-W3C - - src-openeuler/perl-Win32-ShellQuote - - src-openeuler/perl-WWW-DuckDuckGo - - src-openeuler/perl-WWW-GoodData - - src-openeuler/perl-WWW-Mechanize - - src-openeuler/perl-WWW-Shorten - - src-openeuler/perl-WWW-Splunk - - src-openeuler/perl-WWW-Twilio-API - - src-openeuler/perl-XML-Atom-SimpleFeed - - src-openeuler/perl-XML-Bare - - src-openeuler/perl-XML-CommonNS - - src-openeuler/perl-XML-DOM - - src-openeuler/perl-XML-Fast - - src-openeuler/perl-XML-FeedPP - - src-openeuler/perl-XML-Flow - - src-openeuler/perl-XML-Generator - - src-openeuler/perl-XML-Generator-PerlData - - src-openeuler/perl-XML-Hash-LX - - src-openeuler/perl-XML-LibXML-Debugging - - src-openeuler/perl-XML-LibXML-PrettyPrint - - src-openeuler/perl-XML-LibXML-Simple - - src-openeuler/perl-XML-Merge - - src-openeuler/perl-XML-NamespaceFactory - - src-openeuler/perl-XML-Parser - - src-openeuler/perl-XML-Parser-Lite - - src-openeuler/perl-XML-Parser-Lite-Tree - - src-openeuler/perl-XML-Parser-Lite-Tree-XPath - - src-openeuler/perl-XML-RegExp - - src-openeuler/perl-XML-SAX-ExpatXS - - src-openeuler/perl-XML-SemanticDiff - - src-openeuler/perl-XML-Stream - - src-openeuler/perl-XML-Tidy - - src-openeuler/perl-XML-Tidy-Tiny - - src-openeuler/perl-XML-Tiny - - src-openeuler/perl-XML-TreePP - - src-openeuler/perl-XML-Twig - - src-openeuler/perl-XML-Writer - - src-openeuler/perl-XML-XPathEngine - - src-openeuler/perl-XXX - - src-openeuler/perl-YAML-PP - - src-openeuler/perl-YAML-Syck - - src-openeuler/perl-ZMQ-Constants -- name: sig-python-modules - repositories: - - src-openeuler/python-ez_setup - - src-openeuler/python-APScheduler - - src-openeuler/python-ATpy - - src-openeuler/python-AWSIoTPythonSDK - - src-openeuler/python-Arpeggio - - src-openeuler/python-Babel - - src-openeuler/python-Brotli - - src-openeuler/python-Cerberus - - src-openeuler/python-Cerealizer - - src-openeuler/python-Chameleon - - src-openeuler/python-ConfigArgParse - - src-openeuler/python-CouchDB - - src-openeuler/python-Cython - - src-openeuler/python-ECPy - - src-openeuler/python-EditorConfig - - src-openeuler/python-Faker - - src-openeuler/python-Flask-APScheduler - - src-openeuler/python-Flask-Admin - - src-openeuler/python-Flask-Assets - - src-openeuler/python-Flask-AutoIndex - - src-openeuler/python-Flask-Bootstrap - - src-openeuler/python-Flask-Cache - - src-openeuler/python-Flask-Classy - - src-openeuler/python-Flask-Mail - - src-openeuler/python-Flask-Mako - - src-openeuler/python-Flask-OAuth - - src-openeuler/python-Flask-OpenID - - src-openeuler/python-Flask-Paranoid - - src-openeuler/python-Flask-Principal - - src-openeuler/python-Flask-RSTPages - - src-openeuler/python-Flask-SQLAlchemy - - src-openeuler/python-Flask-Script - - src-openeuler/python-Flask-Silk - - src-openeuler/python-Flask-HTTPAuth - - src-openeuler/python-FormEncode - - src-openeuler/python-GitPython - - src-openeuler/python-GridDataFormats - - src-openeuler/python-HeapDict - - src-openeuler/python-ipython_genutils - - src-openeuler/python-JPype1 - - src-openeuler/python-JSON_minify - - src-openeuler/python-JayDeBeApi - - src-openeuler/python-Kajiki - - src-openeuler/python-Lasagne - - src-openeuler/python-Logbook - - src-openeuler/python-ModestMaps - - src-openeuler/python-Naked - - src-openeuler/python-Parsley - - src-openeuler/python-PyDispatcher - - src-openeuler/python-PyDrive - - src-openeuler/python-PyLaTeX - - src-openeuler/python-PyLink - - src-openeuler/python-PyMeeus - - src-openeuler/python-PyNLPl - - src-openeuler/python-PyOpenGL - - src-openeuler/python-PyPDF2 - - src-openeuler/python-PyRSS2Gen - - src-openeuler/python-PySimpleSOAP - - src-openeuler/python-PySnooper - - src-openeuler/python-PyYAML - - src-openeuler/python-Pympler - - src-openeuler/python-Pyphen - - src-openeuler/python-QtAwesome - - src-openeuler/python-QtPy - - src-openeuler/python-SALib - - src-openeuler/python-SQLAlchemy-Utils - - src-openeuler/python-Send2Trash - - src-openeuler/python-Slowloris - - src-openeuler/python-TGScheduler - - src-openeuler/python-Theano - - src-openeuler/python-Trololio - - src-openeuler/python-TurboGears2 - - src-openeuler/python-Twiggy - - src-openeuler/python-Unipath - - src-openeuler/python-XStatic - - src-openeuler/python-XStatic-Angular - - src-openeuler/python-XStatic-Angular-Bootstrap - - src-openeuler/python-XStatic-Angular-Gettext - - src-openeuler/python-XStatic-Bootstrap-SCSS - - src-openeuler/python-XStatic-Font-Awesome - - src-openeuler/python-XStatic-JSEncrypt - - src-openeuler/python-XStatic-Jasmine - - src-openeuler/python-XStatic-Patternfly-Bootstrap-Treeview - - src-openeuler/python-XStatic-bootswatch - - src-openeuler/python-XStatic-mdi - - src-openeuler/python-XStatic-roboto-fontface - - src-openeuler/python-XStatic-smart-table - - src-openeuler/python-XlsxWriter - - src-openeuler/python-Yapsy - - src-openeuler/python-ZEO - - src-openeuler/python-aaargh - - src-openeuler/python-abclient - - src-openeuler/python-abimap - - src-openeuler/python-adodbapi - - src-openeuler/python-aenum - - src-openeuler/python-agate - - src-openeuler/python-agate-dbf - - src-openeuler/python-agate-excel - - src-openeuler/python-agate-sql - - src-openeuler/python-aiodns - - src-openeuler/python-aiofiles - - src-openeuler/python-aiohttp-negotiate - - src-openeuler/python-aiomqtt - - src-openeuler/python-aiomysql - - src-openeuler/python-aioodbc - - src-openeuler/python-aiorpcX - - src-openeuler/python-aiosmtpd - - src-openeuler/python-aiosnmp - - src-openeuler/python-aiostream - - src-openeuler/python-aiounittest - - src-openeuler/python-aiowinreg - - src-openeuler/python-aiozeroconf - - src-openeuler/python-airspeed - - src-openeuler/python-alembic - - src-openeuler/python-altgraph - - src-openeuler/python-amqp - - src-openeuler/python-animatplot - - src-openeuler/python-ansi2html - - src-openeuler/python-ansible-inventory-grapher - - src-openeuler/python-ansible-review - - src-openeuler/python-ansicolor - - src-openeuler/python-ansicolors - - src-openeuler/python-anyjson - - src-openeuler/python-anykeystore - - src-openeuler/python-anymarkup - - src-openeuler/python-anymarkup-core - - src-openeuler/python-anytree - - src-openeuler/python-apptools - - src-openeuler/python-apypie - - src-openeuler/python-argh - - src-openeuler/python-argon2-cffi - - src-openeuler/python-argparse-manpage - - src-openeuler/python-args - - src-openeuler/python-arpy - - src-openeuler/python-asciitree - - src-openeuler/python-asgiref - - src-openeuler/python-aspectlib - - src-openeuler/python-aspy - - src-openeuler/python-asteval - - src-openeuler/python-astral - - src-openeuler/python-astroid - - src-openeuler/python-astroML - - src-openeuler/python-astroplan - - src-openeuler/python-astropy - - src-openeuler/python-astropy-healpix - - src-openeuler/python-astropy-helpers - - src-openeuler/python-astroquery - - src-openeuler/python-astunparse - - src-openeuler/python-async-timeout - - src-openeuler/python-async_generator - - src-openeuler/python-asyncssh - - src-openeuler/python-asynctest - - src-openeuler/python-atpublic - - src-openeuler/python-audioread - - src-openeuler/python-auth.credential - - src-openeuler/python-autopep8 - - src-openeuler/python-babelfish - - src-openeuler/python-backcall - - src-openeuler/python-backlash - - src-openeuler/python-backoff - - src-openeuler/python-baluhn - - src-openeuler/python-bashate - - src-openeuler/python-bcc - - src-openeuler/python-beanbag - - src-openeuler/python-beniget - - src-openeuler/python-bids-validator - - src-openeuler/python-bigsuds - - src-openeuler/python-billiard - - src-openeuler/python-binaryornot - - src-openeuler/python-binstruct - - src-openeuler/python-bintrees - - src-openeuler/python-bitcoinlib - - src-openeuler/python-bitlyapi - - src-openeuler/python-bitmath - - src-openeuler/python-bitstring - - src-openeuler/python-bleach - - src-openeuler/python-blessed - - src-openeuler/python-blessings - - src-openeuler/python-blindspin - - src-openeuler/python-blockdiag - - src-openeuler/python-blowfish - - src-openeuler/python-blurb - - src-openeuler/python-bobo - - src-openeuler/python-booleanOperations - - src-openeuler/python-boom - - src-openeuler/python-boto - - src-openeuler/python-boto3 - - src-openeuler/python-botocore - - src-openeuler/python-bottle-sqlite - - src-openeuler/python-branca - - src-openeuler/python-bson - - src-openeuler/python-btrfs - - src-openeuler/python-bucky - - src-openeuler/python-bugzilla - - src-openeuler/python-bytesize - - src-openeuler/python-bz2file - - src-openeuler/python-cachelib - - src-openeuler/python-cachetools - - src-openeuler/python-cachez - - src-openeuler/python-cairocffi - - src-openeuler/python-canonicaljson - - src-openeuler/python-capturer - - src-openeuler/python-caribou - - src-openeuler/python-case - - src-openeuler/python-catkin-sphinx - - src-openeuler/python-ccdproc - - src-openeuler/python-cchardet - - src-openeuler/python-certifi - - src-openeuler/python-cfgv - - src-openeuler/python-check-manifest - - src-openeuler/python-citeproc-py - - src-openeuler/python-cjdns - - src-openeuler/python-click-completion - - src-openeuler/python-click-help-colors - - src-openeuler/python-click-log - - src-openeuler/python-click-man - - src-openeuler/python-click-threading - - src-openeuler/python-cliff-tablib - - src-openeuler/python-cligj - - src-openeuler/python-clint - - src-openeuler/python-cloud_sptheme - - src-openeuler/python-cloudpickle - - src-openeuler/python-cltk - - src-openeuler/python-clyent - - src-openeuler/python-cmarkgfm - - src-openeuler/python-cmdln - - src-openeuler/python-cmigemo - - src-openeuler/python-cocotb - - src-openeuler/python-codecov - - src-openeuler/python-colcon-bazel - - src-openeuler/python-colorama - - src-openeuler/python-colorclass - - src-openeuler/python-coloredlogs - - src-openeuler/python-colorful - - src-openeuler/python-colorlog - - src-openeuler/python-colorspacious - - src-openeuler/python-colour - - src-openeuler/python-colour-runner - - src-openeuler/python-conditional - - src-openeuler/python-condor - - src-openeuler/python-confuse - - src-openeuler/python-contextvars - - src-openeuler/python-convertdate - - src-openeuler/python-copr - - src-openeuler/python-copr-common - - src-openeuler/python-copr-messaging - - src-openeuler/python-cov-core - - src-openeuler/python-cram - - src-openeuler/python-crank - - src-openeuler/python-crashtest - - src-openeuler/python-crayons - - src-openeuler/python-crcelk - - src-openeuler/python-croniter - - src-openeuler/python-cson - - src-openeuler/python-css-parser - - src-openeuler/python-cssmin - - src-openeuler/python-cssselect2 - - src-openeuler/python-csvkit - - src-openeuler/python-cu2qu - - src-openeuler/python-curio - - src-openeuler/python-curtsies - - src-openeuler/python-cvss - - src-openeuler/python-cxxfilt - - src-openeuler/python-cypy - - src-openeuler/python-d2to1 - - src-openeuler/python-daemonize - - src-openeuler/python-daiquiri - - src-openeuler/python-dataclasses - - src-openeuler/python-datanommer.consumer - - src-openeuler/python-datanommer.models - - src-openeuler/python-dateparser - - src-openeuler/python-dbfread - - src-openeuler/python-dbus-client-gen - - src-openeuler/python-dbus-signature-pyparsing - - src-openeuler/python-ddt - - src-openeuler/python-deap - - src-openeuler/python-debrepo - - src-openeuler/python-deepmerge - - src-openeuler/python-defusedxml - - src-openeuler/python-demjson - - src-openeuler/python-deprecation - - src-openeuler/python-dict.sorted - - src-openeuler/python-dictdumper - - src-openeuler/python-diff-match-patch - - src-openeuler/python-dill - - src-openeuler/python-dirq - - src-openeuler/python-diskcache - - src-openeuler/python-distlib - - src-openeuler/python-distro-info - - src-openeuler/python-dj-database-url - - src-openeuler/python-dj-email-url - - src-openeuler/python-dj-search-url - - src-openeuler/python-django - - src-openeuler/python-django-ajax-selects - - src-openeuler/python-django-angular - - src-openeuler/python-django-annoying - - src-openeuler/python-django-appconf - - src-openeuler/python-django-authority - - src-openeuler/python-django-babel - - src-openeuler/python-django-cache-url - - src-openeuler/python-django-compressor - - src-openeuler/python-django-cors-headers - - src-openeuler/python-django-crispy-forms - - src-openeuler/python-django-debreach - - src-openeuler/python-django-debug-toolbar - - src-openeuler/python-django-discover-runner - - src-openeuler/python-django-filter - - src-openeuler/python-django-haystack - - src-openeuler/python-django-health-check - - src-openeuler/python-django-helpdesk - - src-openeuler/python-django-ipware - - src-openeuler/python-django-macros - - src-openeuler/python-django-markdownx - - src-openeuler/python-django-mptt - - src-openeuler/python-django-nose - - src-openeuler/python-django-pipeline - - src-openeuler/python-django-pyscss - - src-openeuler/python-django-pytest - - src-openeuler/python-django-redis - - src-openeuler/python-django-registration - - src-openeuler/python-django-rest-framework - - src-openeuler/python-django-reversion - - src-openeuler/python-django-robots - - src-openeuler/python-django-simple-captcha - - src-openeuler/python-django-tagging - - src-openeuler/python-django-tastypie - - src-openeuler/python-django-tinymce - - src-openeuler/python-djangoql - - src-openeuler/python-dnf - - src-openeuler/python-dns-lexicon - - src-openeuler/python-dnspython - - src-openeuler/python-docker-squash - - src-openeuler/python-dockerfile-parse - - src-openeuler/python-docx - - src-openeuler/python-dogpile.cache - - src-openeuler/python-doit - - src-openeuler/python-dominate - - src-openeuler/python-dotenv - - src-openeuler/python-dpath - - src-openeuler/python-dpkt - - src-openeuler/python-drat - - src-openeuler/python-duecredit - - src-openeuler/python-dulwich - - src-openeuler/python-easyargs - - src-openeuler/python-easygui - - src-openeuler/python-editdistance - - src-openeuler/python-email_reply_parser - - src-openeuler/python-emcee - - src-openeuler/python-emoji - - src-openeuler/python-envisage - - src-openeuler/python-enzyme - - src-openeuler/python-epdb - - src-openeuler/python-epub - - src-openeuler/python-et_xmlfile - - src-openeuler/python-exif - - src-openeuler/python-f5-icontrol-rest - - src-openeuler/python-fabulous - - src-openeuler/python-fastavro - - src-openeuler/python-fasteners - - src-openeuler/python-fastimport - - src-openeuler/python-fastnumbers - - src-openeuler/python-fastpurge - - src-openeuler/python-fauxquests - - src-openeuler/python-fdb - - src-openeuler/python-fedfind - - src-openeuler/python-feedgenerator - - src-openeuler/python-feedparser - - src-openeuler/python-fido2 - - src-openeuler/python-fields - - src-openeuler/python-filetype - - src-openeuler/python-fire - - src-openeuler/python-firebirdsql - - src-openeuler/python-firehose - - src-openeuler/python-firewall - - src-openeuler/python-first - - src-openeuler/python-fisx - - src-openeuler/python-flake8-import-order - - src-openeuler/python-flaky - - src-openeuler/python-flann - - src-openeuler/python-flask-multistatic - - src-openeuler/python-flask-oidc - - src-openeuler/python-flask-restplus - - src-openeuler/python-flask-restx - - src-openeuler/python-flask-session - - src-openeuler/python-flask-whooshee - - src-openeuler/python-flatpak-module-tools - - src-openeuler/python-flexmock - - src-openeuler/python-flickrapi - - src-openeuler/python-flock - - src-openeuler/python-flower - - src-openeuler/python-flufl.i18n - - src-openeuler/python-flufl.lock - - src-openeuler/python-flufl.testing - - src-openeuler/python-flup - - src-openeuler/python-fontMath - - src-openeuler/python-fontdump - - src-openeuler/python-fontname - - src-openeuler/python-formats - - src-openeuler/python-friendlyloris - - src-openeuler/python-frozendict - - src-openeuler/python-fsmonitor - - src-openeuler/python-fsspec - - src-openeuler/python-fuckit - - src-openeuler/python-funcparserlib - - src-openeuler/python-furl - - src-openeuler/python-fusepy - - src-openeuler/python-futurist - - src-openeuler/python-fuzzyfinder - - src-openeuler/python-fypp - - src-openeuler/python-gTTS-token - - src-openeuler/python-gast - - src-openeuler/python-gatspy - - src-openeuler/python-gccinvocation - - src-openeuler/python-gearbox - - src-openeuler/python-genty - - src-openeuler/python-geographiclib - - src-openeuler/python-geojson - - src-openeuler/python-geomet - - src-openeuler/python-gerrit-view - - src-openeuler/python-gerritlib - - src-openeuler/python-gerrymander - - src-openeuler/python-getmac - - src-openeuler/python-ghp-import2 - - src-openeuler/python-git-url-parse - - src-openeuler/python-gitapi - - src-openeuler/python-gitdb - - src-openeuler/python-githubpy - - src-openeuler/python-gitlab - - src-openeuler/python-glad - - src-openeuler/python-glances_api - - src-openeuler/python-glob2 - - src-openeuler/python-gntp - - src-openeuler/python-gnupg - - src-openeuler/python-google-auth - - src-openeuler/python-google-compute-engine - - src-openeuler/python-gpxpy - - src-openeuler/python-grabbit - - src-openeuler/python-grabserial - - src-openeuler/python-guizero - - src-openeuler/python-gwebsockets - - src-openeuler/python-h11 - - src-openeuler/python-h5io - - src-openeuler/python-hdfs - - src-openeuler/python-heketi - - src-openeuler/python-hgapi - - src-openeuler/python-hgdistver - - src-openeuler/python-hkdf - - src-openeuler/python-hl7 - - src-openeuler/python-hole - - src-openeuler/python-holidays - - src-openeuler/python-hstspreload - - src-openeuler/python-html2text - - src-openeuler/python-htmlmin - - src-openeuler/python-httmock - - src-openeuler/python-http_client - - src-openeuler/python-httpsig_cffi - - src-openeuler/python-httptools - - src-openeuler/python-humanfriendly - - src-openeuler/python-humblewx - - src-openeuler/python-husl - - src-openeuler/python-hypothesis-fspaths - - src-openeuler/python-icalendar - - src-openeuler/python-identify - - src-openeuler/python-idstools - - src-openeuler/python-ifcfg - - src-openeuler/python-igor - - src-openeuler/python-igraph - - src-openeuler/python-img2pdf - - src-openeuler/python-importmagic - - src-openeuler/python-inema - - src-openeuler/python-injector - - src-openeuler/python-interfile - - src-openeuler/python-intervaltree - - src-openeuler/python-into-dbus-python - - src-openeuler/python-iowait - - src-openeuler/python-ipdb - - src-openeuler/python-ipgetter2 - - src-openeuler/python-isodate - - src-openeuler/python-isort - - src-openeuler/python-javalang - - src-openeuler/python-jdcal - - src-openeuler/python-jeepney - - src-openeuler/python-jinja2-time - - src-openeuler/python-jinja2_pluralize - - src-openeuler/python-journal-brief - - src-openeuler/python-jsmin - - src-openeuler/python-json2table - - src-openeuler/python-json5 - - src-openeuler/python-json_logger - - src-openeuler/python-jsonmodels - - src-openeuler/python-jsonpath-rw - - src-openeuler/python-jsonpath-rw-ext - - src-openeuler/python-justbytes - - src-openeuler/python-jwcrypto - - src-openeuler/python-kaitaistruct - - src-openeuler/python-kaptan - - src-openeuler/python-kdcproxy - - src-openeuler/python-kerberos - - src-openeuler/python-kickstart - - src-openeuler/python-klusta - - src-openeuler/python-kobo - - src-openeuler/python-krbcontext - - src-openeuler/python-landslide - - src-openeuler/python-langtable - - src-openeuler/python-lark-parser - - src-openeuler/python-lasso - - src-openeuler/python-launchpadlib - - src-openeuler/python-lazr.config - - src-openeuler/python-lazr.delegates - - src-openeuler/python-lazr.restfulclient - - src-openeuler/python-lazr.smtptest - - src-openeuler/python-lazr.uri - - src-openeuler/python-lazyarray - - src-openeuler/python-lazy-object-proxy - - src-openeuler/python-leather - - src-openeuler/python-lesscpy - - src-openeuler/python-libNeuroML - - src-openeuler/python-libarchive-c - - src-openeuler/python-libevdev - - src-openeuler/python-liblinear - - src-openeuler/python-libmount - - src-openeuler/python-libnacl - - src-openeuler/python-libnl - - src-openeuler/python-librosa - - src-openeuler/python-libsass - - src-openeuler/python-libtmux - - src-openeuler/python-libusb1 - - src-openeuler/python-libvoikko - - src-openeuler/python-liquidctl - - src-openeuler/python-listparser - - src-openeuler/python-littleutils - - src-openeuler/python-livereload - - src-openeuler/python-lmdb - - src-openeuler/python-locket - - src-openeuler/python-lockfile - - src-openeuler/python-logging_tree - - src-openeuler/python-logzero - - src-openeuler/python-lrparsing - - src-openeuler/python-lttngust - - src-openeuler/python-luftdaten - - src-openeuler/python-lupa - - src-openeuler/python-mailer - - src-openeuler/python-makeelf - - src-openeuler/python-manuel - - src-openeuler/python-maps - - src-openeuler/python-markdown2 - - src-openeuler/python-marshmallow - - src-openeuler/python-mccabe - - src-openeuler/python-mdx_gh_links - - src-openeuler/python-med - - src-openeuler/python-metaextract - - src-openeuler/python-metar - - src-openeuler/python-micawber - - src-openeuler/python-microfs - - src-openeuler/python-migen - - src-openeuler/python-migrate - - src-openeuler/python-mimerender - - src-openeuler/python-minibelt - - src-openeuler/python-minidb - - src-openeuler/python-minidump - - src-openeuler/python-mne - - src-openeuler/python-mne-bids - - src-openeuler/python-mnemonic - - src-openeuler/python-modernize - - src-openeuler/python-moksha.common - - src-openeuler/python-mongoengine - - src-openeuler/python-monotonic - - src-openeuler/python-mpmath - - src-openeuler/python-msgpack - - src-openeuler/python-mtg - - src-openeuler/python-multi_key_dict - - src-openeuler/python-multidict - - src-openeuler/python-multio - - src-openeuler/python-multipart - - src-openeuler/python-munkres - - src-openeuler/python-musicbrainzngs - - src-openeuler/python-mutagen - - src-openeuler/python-mwclient - - src-openeuler/python-mygpoclient - - src-openeuler/python-nb2plots - - src-openeuler/python-ndjson-testrunner - - src-openeuler/python-neomodel - - src-openeuler/python-neotime - - src-openeuler/python-neovim - - src-openeuler/python-netdata - - src-openeuler/python-ngram - - src-openeuler/python-nine - - src-openeuler/python-nltk - - src-openeuler/python-nmap - - src-openeuler/python-nmrglue - - src-openeuler/python-nose-cov - - src-openeuler/python-nose-exclude - - src-openeuler/python-nose-ignore-docstring - - src-openeuler/python-nose-parameterized - - src-openeuler/python-nose-progressive - - src-openeuler/python-nose-timer - - src-openeuler/python-nose2 - - src-openeuler/python-nose_fixes - - src-openeuler/python-notario - - src-openeuler/python-notify2 - - src-openeuler/python-notmuch - - src-openeuler/python-ns1-python - - src-openeuler/python-nss - - src-openeuler/python-ntlm-auth - - src-openeuler/python-nudatus - - src-openeuler/python-num2words - - src-openeuler/python-numpoly - - src-openeuler/python-oauth2client - - src-openeuler/python-odML - - src-openeuler/python-odfpy - - src-openeuler/python-offtrac - - src-openeuler/python-ofxparse - - src-openeuler/python-okaara - - src-openeuler/python-oletools - - src-openeuler/python-openidc-client - - src-openeuler/python-openpyxl - - src-openeuler/python-opensensemap-api - - src-openeuler/python-openstackdocstheme - - src-openeuler/python-orderedmultidict - - src-openeuler/python-os-service-types - - src-openeuler/python-oslo.i18n - - src-openeuler/python-oslo.sphinx - - src-openeuler/python-oslotest - - src-openeuler/python-outcome - - src-openeuler/python-outdated - - src-openeuler/python-packit - - src-openeuler/python-pacpy - - src-openeuler/python-paho-mqtt - - src-openeuler/python-pamela - - src-openeuler/python-pandocfilters - - src-openeuler/python-paperwork-backend - - src-openeuler/python-parameterized - - src-openeuler/python-parsedatetime - - src-openeuler/python-parso - - src-openeuler/python-passlib - - src-openeuler/python-pastel - - src-openeuler/python-patch-ng - - src-openeuler/python-pathlib2 - - src-openeuler/python-pathspec - - src-openeuler/python-pathtools - - src-openeuler/python-patool - - src-openeuler/python-patsy - - src-openeuler/python-pbkdf2 - - src-openeuler/python-pdc-client - - src-openeuler/python-pdfkit - - src-openeuler/python-pdfminer - - src-openeuler/python-pdfrw - - src-openeuler/python-pdir2 - - src-openeuler/python-peewee - - src-openeuler/python-pendulum - - src-openeuler/python-pep517 - - src-openeuler/python-periodictable - - src-openeuler/python-persist-queue - - src-openeuler/python-pg8000 - - src-openeuler/python-pgpdump - - src-openeuler/python-phonenumbers - - src-openeuler/python-phpserialize - - src-openeuler/python-piexif - - src-openeuler/python-pigpio - - src-openeuler/python-pika-pool - - src-openeuler/python-pipdeptree - - src-openeuler/python-pkginfo - - src-openeuler/python-pkgwat.api - - src-openeuler/python-plaintable - - src-openeuler/python-player - - src-openeuler/python-plink - - src-openeuler/python-pluginbase - - src-openeuler/python-pluginlib - - src-openeuler/python-plugnplay - - src-openeuler/python-plumbum - - src-openeuler/python-podcastparser - - src-openeuler/python-portalocker - - src-openeuler/python-power - - src-openeuler/python-poyo - - src-openeuler/python-praw - - src-openeuler/python-prettyprinter - - src-openeuler/python-process-tests - - src-openeuler/python-profilehooks - - src-openeuler/python-progress - - src-openeuler/python-progressbar2 - - src-openeuler/python-prometheus_client - - src-openeuler/python-psycogreen - - src-openeuler/python-pudb - - src-openeuler/python-pulsectl - - src-openeuler/python-pungi - - src-openeuler/python-pure-sasl - - src-openeuler/python-pvc - - src-openeuler/python-py-cpuinfo - - src-openeuler/python-py-make - - src-openeuler/python-py2pack - - src-openeuler/python-pyLibravatar - - src-openeuler/python-pyModbusTCP - - src-openeuler/python-pyPEG2 - - src-openeuler/python-pyTelegramBotAPI - - src-openeuler/python-pyactivetwo - - src-openeuler/python-pyaes - - src-openeuler/python-pyasn1-modules - - src-openeuler/python-pybeam - - src-openeuler/python-pycares - - src-openeuler/python-pyclipper - - src-openeuler/python-pycodestyle - - src-openeuler/python-pycollada - - src-openeuler/python-pycryptodome - - src-openeuler/python-pycryptodomex - - src-openeuler/python-pycscope - - src-openeuler/python-pydenticon - - src-openeuler/python-pydicom - - src-openeuler/python-pydocstyle - - src-openeuler/python-pyelectro - - src-openeuler/python-pyephem - - src-openeuler/python-pyface - - src-openeuler/python-pyfakefs - - src-openeuler/python-pyftdi - - src-openeuler/python-pyftpdlib - - src-openeuler/python-pygal - - src-openeuler/python-pygatt - - src-openeuler/python-pygeoip - - src-openeuler/python-pyghmi - - src-openeuler/python-pygments-style-solarized - - src-openeuler/python-pyhcl - - src-openeuler/python-pyi2cflash - - src-openeuler/python-pyinstaller - - src-openeuler/python-pykalman - - src-openeuler/python-pykeepass - - src-openeuler/python-pylast - - src-openeuler/python-pylev - - src-openeuler/python-pylons-sphinx-themes - - src-openeuler/python-pymatreader - - src-openeuler/python-pymemcache - - src-openeuler/python-pymoc - - src-openeuler/python-pymod2pkg - - src-openeuler/python-pynetdicom - - src-openeuler/python-pyngus - - src-openeuler/python-pynvml - - src-openeuler/python-pyocr - - src-openeuler/python-pyotp - - src-openeuler/python-pypandoc - - src-openeuler/python-pyperclip - - src-openeuler/python-pypng - - src-openeuler/python-pyprocdev - - src-openeuler/python-pyrad - - src-openeuler/python-pyramid_fas_openid - - src-openeuler/python-pyreadline - - src-openeuler/python-pyroute2 - - src-openeuler/python-pyrsistent - - src-openeuler/python-pyrtlsdr - - src-openeuler/python-pysb - - src-openeuler/python-pyserial - - src-openeuler/python-pyshark - - src-openeuler/python-pyshp - - src-openeuler/python-pysmi - - src-openeuler/python-pysnmp - - src-openeuler/python-pyspf - - src-openeuler/python-pyspiflash - - src-openeuler/python-pysrt - - src-openeuler/python-pystache - - src-openeuler/python-pystalk - - src-openeuler/python-pystoi - - src-openeuler/python-pystray - - src-openeuler/python-pytest-arraydiff - - src-openeuler/python-pytest-asyncio - - src-openeuler/python-pytest-beakerlib - - src-openeuler/python-pytest-cache - - src-openeuler/python-pytest-capturelog - - src-openeuler/python-pytest-catchlog - - src-openeuler/python-pytest-datafiles - - src-openeuler/python-pytest-doctestplus - - src-openeuler/python-pytest-faulthandler - - src-openeuler/python-pytest-flakes - - src-openeuler/python-pytest-forked - - src-openeuler/python-pytest-helpers-namespace - - src-openeuler/python-pytest-isort - - src-openeuler/python-pytest-lazy-fixture - - src-openeuler/python-pytest-metadata - - src-openeuler/python-pytest-multihost - - src-openeuler/python-pytest-openfiles - - src-openeuler/python-pytest-ordering - - src-openeuler/python-pytest-pep8 - - src-openeuler/python-pytest-random-order - - src-openeuler/python-pytest-relaxed - - src-openeuler/python-pytest-remotedata - - src-openeuler/python-pytest-repeat - - src-openeuler/python-pytest-rerunfailures - - src-openeuler/python-pytest-runner - - src-openeuler/python-pytest-sourceorder - - src-openeuler/python-pytest-subtests - - src-openeuler/python-pytest-sugar - - src-openeuler/python-pytest-testmon - - src-openeuler/python-pytest-timeout - - src-openeuler/python-pytest-toolbox - - src-openeuler/python-pytest-tornado - - src-openeuler/python-pytest-watch - - src-openeuler/python-pytest-xdist - - src-openeuler/python-pytest-xprocess - - src-openeuler/python-pytimeparse - - src-openeuler/python-pytools - - src-openeuler/python-pytrailer - - src-openeuler/python-pytzdata - - src-openeuler/python-pyusb - - src-openeuler/python-pyvit - - src-openeuler/python-pyvmomi - - src-openeuler/python-pyvo - - src-openeuler/python-pyxdg - - src-openeuler/python-pyxs - - src-openeuler/python-pyzabbix - - src-openeuler/python-pyzmq - - src-openeuler/python-pyzolib - - src-openeuler/python-qcelemental - - src-openeuler/python-qrcodegen - - src-openeuler/python-quantities - - src-openeuler/python-queuelib - - src-openeuler/python-random2 - - src-openeuler/python-rangehttpserver - - src-openeuler/python-rarfile - - src-openeuler/python-ratelimitingfilter - - src-openeuler/python-rawkit - - src-openeuler/python-rcssmin - - src-openeuler/python-rebulk - - src-openeuler/python-regex - - src-openeuler/python-remoto - - src-openeuler/python-renderspec - - src-openeuler/python-repoze.sphinx.autointerface - - src-openeuler/python-repoze.tm2 - - src-openeuler/python-repoze.who - - src-openeuler/python-repoze.who.plugins.sa - - src-openeuler/python-requests-gssapi - - src-openeuler/python-requests-kerberos - - src-openeuler/python-requests-ntlm - - src-openeuler/python-requests-oauthlib - - src-openeuler/python-requestsexceptions - - src-openeuler/python-restfly - - src-openeuler/python-restsh - - src-openeuler/python-retask - - src-openeuler/python-retrying - - src-openeuler/python-retryz - - src-openeuler/python-rfc3986 - - src-openeuler/python-ripozo - - src-openeuler/python-rjsmin - - src-openeuler/python-rmtest - - src-openeuler/python-rnc2rng - - src-openeuler/python-roman - - src-openeuler/python-rope - - src-openeuler/python-rosinstall - - src-openeuler/python-rpdb - - src-openeuler/python-rstcheck - - src-openeuler/python-ruffus - - src-openeuler/python-rustcfg - - src-openeuler/python-rxjson - - src-openeuler/python-saml - - src-openeuler/python-sanction - - src-openeuler/python-scales - - src-openeuler/python-scandir - - src-openeuler/python-scapy - - src-openeuler/python-schema - - src-openeuler/python-scp - - src-openeuler/python-scramp - - src-openeuler/python-scripttester - - src-openeuler/python-scrypt - - src-openeuler/python-selectors2 - - src-openeuler/python-semver - - src-openeuler/python-serpy - - src-openeuler/python-setuptools_hg - - src-openeuler/python-sh - - src-openeuler/python-shamir-mnemonic - - src-openeuler/python-shodan - - src-openeuler/python-shortuuid - - src-openeuler/python-should_dsl - - src-openeuler/python-sieve - - src-openeuler/python-simplebayes - - src-openeuler/python-simpleeval - - src-openeuler/python-simplejson - - src-openeuler/python-simplepam - - src-openeuler/python-simplevisor - - src-openeuler/python-simpy - - src-openeuler/python-siphash - - src-openeuler/python-slack-cleaner - - src-openeuler/python-slacker - - src-openeuler/python-slixmpp - - src-openeuler/python-slugify - - src-openeuler/python-smmap - - src-openeuler/python-sniffio - - src-openeuler/python-snuggs - - src-openeuler/python-social-auth-app-flask - - src-openeuler/python-social-auth-app-flask-sqlalchemy - - src-openeuler/python-social-auth-storage-sqlalchemy - - src-openeuler/python-sockjs-tornado - - src-openeuler/python-socks5line - - src-openeuler/python-sortedcontainers - - src-openeuler/python-spake2 - - src-openeuler/python-spdx-lookup - - src-openeuler/python-speaklater - - src-openeuler/python-spec - - src-openeuler/python-speedtest-cli - - src-openeuler/python-speg - - src-openeuler/python-sphinx-argparse - - src-openeuler/python-sphinx-epytext - - src-openeuler/python-sphinx-gallery - - src-openeuler/python-sphinx-intl - - src-openeuler/python-sphinx-notfound-page - - src-openeuler/python-sphinxcontrib-applehelp - - src-openeuler/python-sphinxcontrib-blockdiag - - src-openeuler/python-sphinxcontrib-devhelp - - src-openeuler/python-sphinxcontrib-fulltoc - - src-openeuler/python-sphinxcontrib-htmlhelp - - src-openeuler/python-sphinxcontrib-issuetracker - - src-openeuler/python-sphinxcontrib-jsmath - - src-openeuler/python-sphinxcontrib-qthelp - - src-openeuler/python-sphinxcontrib-serializinghtml - - src-openeuler/python-sphinxtesters - - src-openeuler/python-sphobjinv - - src-openeuler/python-spur - - src-openeuler/python-sqlalchemy-collectd - - src-openeuler/python-sqlalchemy_schemadisplay - - src-openeuler/python-sqlparse - - src-openeuler/python-sseclient - - src-openeuler/python-statistics - - src-openeuler/python-statsd - - src-openeuler/python-statsmodels - - src-openeuler/python-stdlib-list - - src-openeuler/python-stem - - src-openeuler/python-stevedore - - src-openeuler/python-stomper - - src-openeuler/python-stompest - - src-openeuler/python-stuf - - src-openeuler/python-subliminal - - src-openeuler/python-supersmoother - - src-openeuler/python-svg - - src-openeuler/python-svg.path - - src-openeuler/python-svgwrite - - src-openeuler/python-sympy - - src-openeuler/python-tabulate - - src-openeuler/python-tambo - - src-openeuler/python-tasklib - - src-openeuler/python-tbgrep - - src-openeuler/python-tblib - - src-openeuler/python-tbtrim - - src-openeuler/python-tempdir - - src-openeuler/python-termcolor - - src-openeuler/python-terminaltables - - src-openeuler/python-test-server - - src-openeuler/python-testpath - - src-openeuler/python-testrepository - - src-openeuler/python-testresources - - src-openeuler/python-texext - - src-openeuler/python-text-unidecode - - src-openeuler/python-textparser - - src-openeuler/python-tftpy - - src-openeuler/python-tgext.crud - - src-openeuler/python-timeout-decorator - - src-openeuler/python-timeunit - - src-openeuler/python-tinydb - - src-openeuler/python-tinyrpc - - src-openeuler/python-toolz - - src-openeuler/python-tox - - src-openeuler/python-traitsui - - src-openeuler/python-traitlets - - src-openeuler/python-translationstring - - src-openeuler/python-trustme - - src-openeuler/python-tvb-data - - src-openeuler/python-tw2.core - - src-openeuler/python-tw2.forms - - src-openeuler/python-tw2.jqplugins.ui - - src-openeuler/python-tw2.jquery - - src-openeuler/python-twilio - - src-openeuler/python-txWS - - src-openeuler/python-txZMQ - - src-openeuler/python-typing - - src-openeuler/python-typogrify - - src-openeuler/python-tzlocal - - src-openeuler/python-unicodecsv - - src-openeuler/python-unidiff - - src-openeuler/python-upoints - - src-openeuler/python-uritemplate - - src-openeuler/python-urllib_gssapi - - src-openeuler/python-urwidtrees - - src-openeuler/python-utmp - - src-openeuler/python-uwsgidecorators - - src-openeuler/python-vagrantpy - - src-openeuler/python-validators - - src-openeuler/python-vatnumber - - src-openeuler/python-vconnector - - src-openeuler/python-vdirsyncer - - src-openeuler/python-verboselogs - - src-openeuler/python-versiontools - - src-openeuler/python-vine - - src-openeuler/python-virtualenv-api - - src-openeuler/python-virtualenv-clone - - src-openeuler/python-virtualenvwrapper - - src-openeuler/python-visidata - - src-openeuler/python-visitor - - src-openeuler/python-visvis - - src-openeuler/python-vobject - - src-openeuler/python-volkszaehler - - src-openeuler/python-voluptuous - - src-openeuler/python-vpoller - - src-openeuler/python-vulture - - src-openeuler/python-w3lib - - src-openeuler/python-wadllib - - src-openeuler/python-walkdir - - src-openeuler/python-warlock - - src-openeuler/python-watchdog - - src-openeuler/python-webassets - - src-openeuler/python-webcolors - - src-openeuler/python-websockets - - src-openeuler/python-websockify - - src-openeuler/python-webthing-ws - - src-openeuler/python-whichcraft - - src-openeuler/python-whisper - - src-openeuler/python-whitenoise - - src-openeuler/python-whois - - src-openeuler/python-wikipedia - - src-openeuler/python-wikitcms - - src-openeuler/python-winacl - - src-openeuler/python-winrm - - src-openeuler/python-wsproto - - src-openeuler/python-wrapt - - src-openeuler/python-wtf-peewee - - src-openeuler/python-wurlitzer - - src-openeuler/python-www-authenticate - - src-openeuler/python-wxnatpy - - src-openeuler/python-xarray - - src-openeuler/python-xcffib - - src-openeuler/python-xlib - - src-openeuler/python-xlrd - - src-openeuler/python-xlwt - - src-openeuler/python-xml2rfc - - src-openeuler/python-xmlrunner - - src-openeuler/python-xmltodict - - src-openeuler/python-xpath-expressions - - src-openeuler/python-xtermcolor - - src-openeuler/python-xunitparser - - src-openeuler/python-xvfbwrapper - - src-openeuler/python-xxhash - - src-openeuler/python-yamlordereddictloader - - src-openeuler/python-yaql - - src-openeuler/python-yara - - src-openeuler/python-yarg - - src-openeuler/python-yarl - - src-openeuler/python-yaspin - - src-openeuler/python-yaswfp - - src-openeuler/python-yattag - - src-openeuler/python-yubico - - src-openeuler/python-yubikey-manager - - src-openeuler/python-zabbix-api-erigones - - src-openeuler/python-zanata2fedmsg - - src-openeuler/python-zarr - - src-openeuler/python-zc.customdoctests - - src-openeuler/python-zdaemon - - src-openeuler/python-zipstream - - src-openeuler/python-zope.dottedname - - src-openeuler/python-zope.fixers - - src-openeuler/python-zope.i18n - - src-openeuler/python-zope.i18nmessageid - - src-openeuler/python-zope.testing - - src-openeuler/python-lightgbm - - src-openeuler/python-eli5 - - src-openeuler/python-blaze - - src-openeuler/python-Flask-Cors - - src-openeuler/python-odo - - src-openeuler/python-datashape - - src-openeuler/python-multipledispatch - - src-openeuler/python3-docs - - src-openeuler/python-concurrent-log-handler -- name: sig-release-management - repositories: - - src-openeuler/openEuler-lsb - - openeuler/openEuler-lsb - - openeuler/release-management -- name: xfce - repositories: - - src-openeuler/Thunar - - src-openeuler/catfish - - src-openeuler/exo - - src-openeuler/garcon - - src-openeuler/gigolo - - src-openeuler/hddtemp - - src-openeuler/libglademm24 - - src-openeuler/libgnomecanvasmm26 - - src-openeuler/libmpd - - src-openeuler/libxfce4ui - - src-openeuler/libxfce4util - - src-openeuler/lightdm - - src-openeuler/lightdm-gtk - - src-openeuler/lightdm-gtk-greeter - - src-openeuler/mousepad - - src-openeuler/orage - - src-openeuler/parole - - src-openeuler/python-distutils-extra - - src-openeuler/ristretto - - src-openeuler/thunar-archive-plugin - - src-openeuler/thunar-media-tags-plugin - - src-openeuler/thunar-vcs-plugin - - src-openeuler/thunar-volman - - src-openeuler/thunarx-python - - src-openeuler/tumbler - - src-openeuler/xarchiver - - src-openeuler/xfburn - - src-openeuler/xfce-polkit - - src-openeuler/xfce-theme-manager - - src-openeuler/xfce4-appfinder - - src-openeuler/xfce4-battery-plugin - - src-openeuler/xfce4-calculator-plugin - - src-openeuler/xfce4-clipman-plugin - - src-openeuler/xfce4-cpufreq-plugin - - src-openeuler/xfce4-cpugraph-plugin - - src-openeuler/xfce4-datetime-plugin - - src-openeuler/xfce4-dev-tools - - src-openeuler/xfce4-dict - - src-openeuler/xfce4-diskperf-plugin - - src-openeuler/xfce4-embed-plugin - - src-openeuler/xfce4-eyes-plugin - - src-openeuler/xfce4-fsguard-plugin - - src-openeuler/xfce4-genmon-plugin - - src-openeuler/xfce4-hardware-monitor-plugin - - src-openeuler/xfce4-mailwatch-plugin - - src-openeuler/xfce4-mount-plugin - - src-openeuler/xfce4-mpc-plugin - - src-openeuler/xfce4-netload-plugin - - src-openeuler/xfce4-notes-plugin - - src-openeuler/xfce4-notifyd - - src-openeuler/xfce4-panel - - src-openeuler/xfce4-panel-profiles - - src-openeuler/xfce4-places-plugin - - src-openeuler/xfce4-power-manager - - src-openeuler/xfce4-pulseaudio-plugin - - src-openeuler/xfce4-screensaver - - src-openeuler/xfce4-screenshooter - - src-openeuler/xfce4-sensors-plugin - - src-openeuler/xfce4-session - - src-openeuler/xfce4-settings - - src-openeuler/xfce4-smartbookmark-plugin - - src-openeuler/xfce4-statusnotifier-plugin - - src-openeuler/xfce4-systemload-plugin - - src-openeuler/xfce4-taskmanager - - src-openeuler/xfce4-terminal - - src-openeuler/xfce4-time-out-plugin - - src-openeuler/xfce4-timer-plugin - - src-openeuler/xfce4-vala - - src-openeuler/xfce4-verve-plugin - - src-openeuler/xfce4-volumed-pulse - - src-openeuler/xfce4-wavelan-plugin - - src-openeuler/xfce4-weather-plugin - - src-openeuler/xfce4-whiskermenu-plugin - - src-openeuler/xfce4-xkb-plugin - - src-openeuler/xfconf - - src-openeuler/xfdashboard - - src-openeuler/xfdesktop - - src-openeuler/xfwm4 -- name: GNOME - repositories: - - src-openeuler/gdlmm - - src-openeuler/libgdl - - src-openeuler/qgnomeplatform - - src-openeuler/gnome-control-center - - src-openeuler/gtk-doc - - src-openeuler/nautilus - - src-openeuler/mutter - - src-openeuler/libgnomekbd - - src-openeuler/libgnomecanvas - - src-openeuler/gnome-themes-standard - - src-openeuler/gnome-online-accounts - - src-openeuler/gnome-autoar - - src-openeuler/gnome-desktop3 - - src-openeuler/gnome-vfs2 - - src-openeuler/libgnome -- name: sig-desktop-apps - repositories: - - src-openeuler/vnpy - - src-openeuler/musescore - - src-openeuler/lilypond - - src-openeuler/uget - - src-openeuler/meld - - src-openeuler/thunderbird -- name: sig-DDE - repositories: - - src-openeuler/dde-control-center - - src-openeuler/blur-effect - - src-openeuler/dde-api - - src-openeuler/dde-calendar - - src-openeuler/dde-clipboard - - src-openeuler/dde-daemon - - src-openeuler/dde-dock - - src-openeuler/dde-file-manager - - src-openeuler/dde-introduction - - src-openeuler/deepin-kwin - - src-openeuler/dde-kwin - - src-openeuler/dde-launcher - - src-openeuler/dde-network-utils - - src-openeuler/dde-polkit-agent - - src-openeuler/dde-qt-dbus-factory - - src-openeuler/dde-session-shell - - src-openeuler/dde-session-ui - - src-openeuler/deepin-anything - - src-openeuler/deepin-compressor - - src-openeuler/deepin-desktop-base - - src-openeuler/deepin-desktop-schemas - - src-openeuler/deepin-devicemanager - - src-openeuler/deepin-editor - - src-openeuler/deepin-font-manager - - src-openeuler/deepin-gettext-tools - - src-openeuler/deepin-graphics-driver-manager - - src-openeuler/deepin-image-viewer - - src-openeuler/deepin-log-viewer - - src-openeuler/deepin-manual - - src-openeuler/deepin-menu - - src-openeuler/deepin-reader - - src-openeuler/deepin-shortcut-viewer - - src-openeuler/deepin-system-monitor - - src-openeuler/deepin-terminal - - src-openeuler/deepin-turbo - - src-openeuler/deepin-sound-theme - - src-openeuler/dtkcore - - src-openeuler/dtkcore2 - - src-openeuler/dtkgui - - src-openeuler/dtkwidget - - src-openeuler/dtkwidget2 - - src-openeuler/dtkwm - - src-openeuler/deepin-icon-theme - - src-openeuler/qt5integration - - src-openeuler/udisks2-qt5 - - src-openeuler/startdde - - src-openeuler/deepin-wallpapers - - src-openeuler/deepin-gtk-theme - - src-openeuler/dde-account-faces - - src-openeuler/dde-server-industry-config - - src-openeuler/dde-device-formatter - - src-openeuler/deepin-clone - - src-openeuler/deepin-dbus-generator - - src-openeuler/deepin-default-settings - - src-openeuler/deepin-gir-generator - - src-openeuler/deepin-qml-widgets - - src-openeuler/dde -- name: sig-high-performance-network - repositories: - - src-openeuler/dwarves - - src-openeuler/dpdk - - src-openeuler/rdma-core - - src-openeuler/libbpf - - src-openeuler/goebpf - - src-openeuler/xdp-tools - - src-openeuler/libvma - - src-openeuler/polycube - - src-openeuler/libkefir - - src-openeuler/cilium - - src-openeuler/katran - - src-openeuler/pistache - - src-openeuler/libyang - - src-openeuler/libtins - - src-openeuler/go-bindata - - src-openeuler/seastar -- name: sig-openstack - repositories: - - src-openeuler/openstack-nova - - src-openeuler/openstack-python-novaclient - - src-openeuler/openstack-neutron -- name: sig-wine - repositories: - - src-openeuler/wine -- name: sig-OS-Builder - repositories: - - src-openeuler/anaconda - - src-openeuler/anaconda-user-help - - src-openeuler/blivet-gui - - src-openeuler/cdrkit - - src-openeuler/dnf - - src-openeuler/dnf-plugins-core - - src-openeuler/libdnf - - src-openeuler/libsolv - - src-openeuler/efi-rpm-macros - - src-openeuler/efibootmgr - - src-openeuler/efivar - - src-openeuler/grub2 - - src-openeuler/ipxe - - src-openeuler/syslinux - - src-openeuler/lorax - - src-openeuler/python-blivet - - src-openeuler/uboot-tools - - src-openeuler/python-dasbus - - src-openeuler/oemaker - - openeuler/oemaker -- name: sig-Gatekeeper - repositories: - - openeuler/ci-bot - - openeuler/openeuler-jenkins - - openeuler/openeuler-obs -- name: sig-OKD - repositories: - - src-openeuler/moosefs - - src-openeuler/kubevirt - - src-openeuler/prometheus - - src-openeuler/node_exporter - - src-openeuler/etcd - - src-openeuler/alertmanager - - src-openeuler/quay - - src-openeuler/pulp - - src-openeuler/gvisor - - src-openeuler/cri-o - - src-openeuler/cri-tools - - src-openeuler/go-rpm-macros - - src-openeuler/go-srpm-macros - - src-openeuler/goversioninfo - - src-openeuler/openshift-ansible - - src-openeuler/origin -- name: sig-bootstrap - repositories: - - src-openeuler/bazel-bin -- name: sig-confidential-computing - repositories: - - src-openeuler/linux-sgx - - openeuler/secGear -- name: sig-Kubernetes - repositories: - - openeuler/kubekey -- name: sig-KDE - repositories: - - src-openeuler/kf5-attica - - src-openeuler/kf5-frameworkintegration - - src-openeuler/kf5-kactivities - - src-openeuler/kf5-kbookmarks - - src-openeuler/kf5-kcmutils - - src-openeuler/kf5-kcompletion - - src-openeuler/kf5-kcrash - - src-openeuler/kf5-kdbusaddons - - src-openeuler/kf5-kdeclarative - - src-openeuler/kf5-kded - - src-openeuler/kf5-kdelibs4support - - src-openeuler/kf5-kdesignerplugin - - src-openeuler/kf5-kdesu - - src-openeuler/kf5-kemoticons - - src-openeuler/kf5-kglobalaccel - - src-openeuler/kf5-kiconthemes - - src-openeuler/kf5-kinit - - src-openeuler/kf5-kio - - src-openeuler/kf5-kirigami2 - - src-openeuler/kf5-kitemmodels - - src-openeuler/kf5-kitemviews - - src-openeuler/kf5-kjobwidgets - - src-openeuler/kf5-knewstuff - - src-openeuler/kf5-knotifications - - src-openeuler/kf5-kpackage - - src-openeuler/kf5-kparts - - src-openeuler/kf5-kplotting - - src-openeuler/kf5-kpty - - src-openeuler/kf5-kservice - - src-openeuler/kf5-ktextwidgets - - src-openeuler/kf5-kunitconversion - - src-openeuler/kf5-kwallet - - src-openeuler/kf5-kxmlgui - - src-openeuler/kf5-networkmanager-qt - - src-openeuler/kf5-plasma - - src-openeuler/kf5-sonnet - - src-openeuler/kf5-syntax-highlighting - - src-openeuler/kf5-kdewebkit - - src-openeuler/kdecoration - - src-openeuler/kwin - - src-openeuler/plasma-breeze diff --git a/cve-python/tabletask/__init__.py b/cve-python/tabletask/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/cve-python/tabletask/crawltask.py b/cve-python/tabletask/crawltask.py deleted file mode 100644 index c22fb3e..0000000 --- a/cve-python/tabletask/crawltask.py +++ /dev/null @@ -1,114 +0,0 @@ -# -*- coding: UTF-8 -*- -#爬虫封装 -import requests -from lxml import etree -from datetime import datetime -def crawling(url): - - try: - content=requests.get(url).content - except requests.exceptions.ConnectionError: - print('ConnectionError') - except requests.exceptions.ChunkedEncodingError: - print('ChunkedEncodingError') - except: - print('Unfortunitely -- An Unknow Error Happened') - html=etree.HTML(content) - try: - if html.xpath('/html/body/div[2]/div[2]/div/table/tr/td/div/div[1]/div[3]/div[2]/div[1]/div[2]/span/span/a/text()') == ["N/A"] or \ - html.xpath('/html/body/div[2]/div[2]/div/table/tr/td/div/div[1]/div[2]/div[2]/div[1]/div[2]/span/span/a/text()')==["N/A"] or \ - html.xpath('/html/body/div[2]/div[2]/div[2]/table/tr/td/div/div[1]/div[4]/div[2]/div[1]/div[2]/span/span/a/text()') == ['N/A']: - if html.xpath("/html/body/div[2]/div[2]/div/table/tr/td/div/div[1]/div[2]/div[3]/div[1]/div[2]/span/span/a/text()")==["N/A"]or \ - html.xpath("/html/body/div[2]/div[2]/div/table/tbody/tr/td/div/div[1]/div[2]/div[2]/div[1]/div[2]/span/span/a/text()")==["N/A"]: - # /html/body/div[2]/div[2]/div/table/tr/td/div/div[1]/div[2]/div[2]/div[1]/div[2]/span/span/a - nvdScore = cveLevel = cveDesc = repairTime = vectorValue = attackVector = accessVector = attackComplexity = accessComplexity = \ - privilegeRequired = userInteraction = scope = confidentiality = integrity = availability = authentication = None - print("此漏洞链接无数据") - else: - scoreType="v2.0" - element = html.xpath('//*[@id="nistV2MetricHidden"]/@value') - cveDesc = str(html.xpath('//*[@id="vulnDetailTableView"]/tr/td/div/div[1]/p[1]/text()')[0]) - repairTime = str(html.xpath('//*[@id="vulnDetailTableView"]/tr/td/div/div[2]/div/span[1]/text()')[0]) - # print(repairTime,type(repairTime)) - repairTime =datetime.strptime(repairTime,'%m/%d/%Y') - # print(repairTime) - # print(type(repairTime)) - html1 = etree.HTML(element[0]) - cveLevel = str(html1.xpath('//*[@data-testid="vuln-cvssv2-base-score-severity"]/text()')[0].strip()) - - nvdScore = str(html1.xpath('//*[@data-testid="vuln-cvssv2-base-score"]/text()')[0].strip()) - - vectorValue = str(html1.xpath('//*[@data-testid="vuln-cvssv2-vector"]/text()')[0]).replace("(","").replace(")","").strip() - - accessVector = str(html1.xpath('//*[@data-testid="vuln-cvssv2-av"]/text()')[0].strip()) - - accessComplexity = str(html1.xpath('//*[@data-testid="vuln-cvssv2-ac"]/text()')[0].strip()) - - authentication = str(html1.xpath('//*[@data-testid="vuln-cvssv2-au"]/text()')[0].strip()) - - confidentiality = str(html1.xpath('//*[@data-testid="vuln-cvssv3-c"]/text()')[0].strip()) - - integrity = str(html1.xpath('//*[@data-testid="vuln-cvssv2-i"]/text()')[0].strip()) - - availability = str(html1.xpath('//*[@data-testid="vuln-cvssv2-a"]/text()')[0].strip()) - - - - - attackVector=attackComplexity=privilegeRequired=userInteraction=scope=None - - - elif html.xpath('/html/body/div[2]/div[2]/div/table/tr/td/div/div[1]/div[3]/div[2]/div[1]/div[2]/span/span/a/text()') == []and \ - html.xpath('/html/body/div[2]/div[2]/div/table/tr/td/div/div[1]/div[2]/div[2]/div[1]/div[2]/span/span/a/text()')==[]: - nvdScore=cveLevel=cveDesc=repairTime=vectorValue=attackVector=accessVector=attackComplexity=accessComplexity= \ - privilegeRequired=userInteraction=scope=confidentiality=integrity=availability=authentication=scoreType=None - print("此漏洞链接not found") - else: - scoreType="v3.0" - cveDesc = str(html.xpath('//*[@id="vulnDetailTableView"]/tr/td/div/div[1]/p[1]/text()')[0]) - - repairTime = html.xpath('//*[@id="vulnDetailTableView"]/tr/td/div/div[2]/div/span[1]/text()')[0] - # print(repairTime,type(repairTime)) - repairTime =datetime.strptime(repairTime,'%m/%d/%Y') - # print(repairTime) - # print(type(repairTime)) - if html.xpath('//*[@id="nistV3MetricHidden"]/@value') != []: - element = html.xpath('//*[@id="nistV3MetricHidden"]/@value') - - else: - element = html.xpath('//*[@id="cnaV3MetricHidden"]/@value') - html1 = etree.HTML(element[0]) - cveLevel = str(html1.xpath('//*[@data-testid="vuln-cvssv3-base-score-severity"]/text()')[0].strip()) - - nvdScore = str(html1.xpath('//*[@data-testid="vuln-cvssv3-base-score"]/text()')[0].strip()) - - vectorValue = str(html1.xpath('//*[@data-testid="vuln-cvssv3-vector"]/text()')[0]).replace("(",'').replace(')','').strip() - - attackVector = str(html1.xpath('//*[@data-testid="vuln-cvssv3-av"]/text()')[0].strip()) - - attackComplexity = str(html1.xpath('//*[@data-testid="vuln-cvssv3-ac"]/text()')[0].strip()) - - privilegeRequired = str(html1.xpath('//*[@data-testid="vuln-cvssv3-pr"]/text()')[0].strip()) - - userInteraction = str(html1.xpath('//*[@data-testid="vuln-cvssv3-ui"]/text()')[0].strip()) - - scope = str(html1.xpath('//*[@data-testid="vuln-cvssv3-s"]/text()')[0].strip()) - - confidentiality = str(html1.xpath('//*[@data-testid="vuln-cvssv3-c"]/text()')[0].strip()) - - integrity = str(html1.xpath('//*[@data-testid="vuln-cvssv3-i"]/text()')[0].strip()) - - availability = str(html1.xpath('//*[@data-testid="vuln-cvssv3-a"]/text()')[0].strip()) - - - - accessVector=accessComplexity=authentication=None - except IndexError as e: - print("下标越界",e) - except UnboundLocalError as e: - print("未找到标签",e) - list = [nvdScore, cveLevel, cveDesc, repairTime, vectorValue, attackVector, accessVector, attackComplexity,accessComplexity, - privilegeRequired, userInteraction, scope, confidentiality, integrity, availability, authentication,scoreType] - - return list - diff --git a/cve-python/tabletask/exceltask.py b/cve-python/tabletask/exceltask.py deleted file mode 100644 index 2d656ea..0000000 --- a/cve-python/tabletask/exceltask.py +++ /dev/null @@ -1,124 +0,0 @@ -# -*- coding: UTF-8 -*- -#读取excel表格内容 -import xlrd -import os -import shutil - - -#读取excel -#CVE评分 -from xlrd import XLRDError - - -# def crawlScore(): -# score=[] -# try: -# data = xlrd.open_workbook("./newexcels/a-l.rar.1599118583853.xlsx") -# table_one = data.sheet_by_name("漏洞报告") # 根据表名查找漏洞报告信息表 -# row_number = table_one.nrows # 获取所有数据的最大行数 -# for i in range(1, row_number): -# scoreOne =str(table_one.cell(i, 5).value) -# score.append(scoreOne) -# except IndexError as e: -# print("下标越界",e) -# except XLRDError as e: -# print("未找到漏洞报告table",e) -# except Exception as e: -# print("其他异常:",e) -# return score -#CVE地址 - -def crawlUrls(fileName): - urls=[] - try: - data=xlrd.open_workbook("./newexcels/"+fileName) - table_one=data.sheet_by_name("漏洞报告") #根据名称查找漏洞报告信息表 - row_number=table_one.nrows #获取所有数据的最大行数 - for i in range(1,row_number): - url="https://nvd.nist.gov/vuln/detail/"+str(table_one.cell(i,2).value) - urls.append(url) - except IndexError as e: - print("下标越界", e) - except XLRDError as e: - print("未找到漏洞报告table",e) - except Exception as e: - print("其他异常:", e) - return urls -#CVE编号 -def crawlCveNum(fileName): - cveNum=[] - try: - data=xlrd.open_workbook("./newexcels/"+fileName) - table_one=data.sheet_by_name("漏洞报告") #根据名称查找漏洞报告信息表 - row_number=table_one.nrows #获取所有数据的最大行数 - for i in range(1,row_number): - cveNumOne=str(table_one.cell(i,2).value) - cveNum.append(cveNumOne) - except IndexError as e: - print("下标越界", e) - except XLRDError as e: - print("未找到漏洞报告table",e) - except Exception as e: - print("其他异常:", e) - return cveNum -#CVE版本 -def crawlCveVersion(fileName): - cveVersion=[] - try: - data=xlrd.open_workbook("./newexcels/"+fileName) - table_one=data.sheet_by_name("漏洞报告") - row_number=table_one.nrows - for i in range(1,row_number): - cveVersionOne=table_one.cell(i,1).value - cveVersion.append(cveVersionOne) - except IndexError as e: - print("下标越界",e) - except XLRDError as e: - print("未找到漏洞报告table", e) - except Exception as e: - print("其他异常:", e) - return cveVersion -#CVE类型 -def crawlScopeType(fileName): - scopeType=[] - try: - data=xlrd.open_workbook("./newexcels/"+fileName) - table_one=data.sheet_by_name("漏洞报告") - row_number=table_one.nrows - for i in range(1,row_number): - scopeTypeOne = 'v' + str(table_one.cell(i, 4).value) - scopeType.append(scopeTypeOne) - except IndexError as e: - print("下标越界",e) - except XLRDError as e: - print("未找到漏洞报告table",e) - except Exception as e: - print("error:",e) - return scopeType -#Component -def crawlPackName(fileName): - packName = [] - try: - data = xlrd.open_workbook("./newexcels/"+fileName) - table_one = data.sheet_by_name("漏洞报告") - row_number = table_one.nrows # 获取所有数据的最大行数 - for i in range(1, row_number): - packNameOne = table_one.cell(i, 0).value - packName.append(packNameOne) - except IndexError as e: - print("下标越界",e) - except XLRDError as e: - print("未找到漏洞报告table",e) - except Exception as e: - print("error:",e) - return packName - - -#excel解析完成后调用函数移动到oldexcels文件夹备份 -def move_file(fileName): - try: - f_src=os.path.join("./newexcels/"+fileName) - f_dst=os.path.join("./oldexcels/"+fileName) - shutil.move(f_src,f_dst) - except Exception as e: - print("move error",e) diff --git a/cve-python/tabletask/runtask.py b/cve-python/tabletask/runtask.py deleted file mode 100644 index d2d65e3..0000000 --- a/cve-python/tabletask/runtask.py +++ /dev/null @@ -1,109 +0,0 @@ -# -*- coding: UTF-8 -*- -# CVSS官网数据爬取 数据储存数据库 - - -from tabletask import exceltask,crawltask -from dbConnecttion.MysqlConn import Mysql -import time -import os - - - -def crawlWeb(): - mysql=Mysql() - path="./newexcels" - files=os.listdir(path) - if files: - for fileName in files: - cveNumList=exceltask.crawlCveNum(fileName) - urls=exceltask.crawlUrls(fileName) - cveVersionList=exceltask.crawlCveVersion(fileName) - # scopeTypeList=exceltask.crawlScopeType() - packNameList=exceltask.crawlPackName(fileName) - for i in range(0,len(urls)): - cveNum=str(cveNumList[i]).strip() - print(cveNum) - # 数据库查询结果 - sql = "select * from cve_origin_excel where cve_num= %s" - val = (cveNum,) - resultDict = mysql.getOne(sql, val) - - if resultDict: #判断CVE是否存在数据库 - - #爬虫网页数据 - crawlList=crawltask.crawling(urls[i]) - - #判断数据库类容是否为最新数据 - if resultDict["nvd_score"]!=None: - if str(resultDict["nvd_score"])==str(crawlList[0])and str(resultDict["vector_value"],encoding="utf-8")==str(crawlList[4]): - if resultDict['cve_status'] in [3,4,5]: - updateTime = str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) - try: - sql = "update cve_origin_excel set nvd_score=%s,cve_level=%s,cve_desc=%s,repair_time=%s,vector_value=%s,attack_vector=%s,access_vector=%s," \ - "attack_complexity=%s,access_complexity=%s,privilege_required=%s,user_interaction=%s,scope=%s,confidentiality=%s,integrity=%s" \ - ",availability=%s,authentication=%s,cve_status=%s,update_time=%s where cve_num=%s" - val = ( - crawlList[0], crawlList[1], crawlList[2], crawlList[3], crawlList[4], crawlList[5], - crawlList[6], crawlList[7], crawlList[8], crawlList[9], - crawlList[10], crawlList[11], crawlList[12], crawlList[13], crawlList[14], - crawlList[15], 1, updateTime, cveNum) - mysql.update(sql, val) - mysql.dispose() - print("更新数据修改状态成功") - - except IndexError as e: - print("下标越界", e) - else: - print("数据库为最新数据") - else: - print("更新数据") - updateTime=str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) - try: - sql="update cve_origin_excel set nvd_score=%s,cve_level=%s,cve_desc=%s,repair_time=%s,vector_value=%s,attack_vector=%s,access_vector=%s," \ - "attack_complexity=%s,access_complexity=%s,privilege_required=%s,user_interaction=%s,scope=%s,confidentiality=%s,integrity=%s" \ - ",availability=%s,authentication=%s,cve_status=%s,update_time=%s where cve_num=%s" - val=(crawlList[0],crawlList[1],crawlList[2],crawlList[3],crawlList[4],crawlList[5],crawlList[6],crawlList[7],crawlList[8],crawlList[9], - crawlList[10],crawlList[11],crawlList[12],crawlList[13],crawlList[14],crawlList[15],1,updateTime,cveNum) - mysql.update(sql,val) - mysql.dispose() - except IndexError as e: - print("下标越界",e) - - - - else: - print("数据库未发现数据,执行插入操作") - createTime=updateTime= str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) - deleteTime=None - cveStatus=0 #状态0表示新建,1表示修改 - try: - cveUrl=str(urls[i]) - - cveVersion=str(cveVersionList[i]) - - packName=str(packNameList[i]) - - # scoreType = str(scopeTypeList[i].strip()) - #爬虫爬取数据列表 - list=crawltask.crawling(cveUrl) - - - - sql="INSERT INTO cve_origin_excel (cve_num,cve_url,cve_version,pack_name,score_type,nvd_score,cve_level,cve_desc,repair_time,vector_value,attack_vector," \ - "access_vector,attack_complexity,access_complexity,privilege_required,user_interaction,scope,confidentiality,integrity,availability,authentication,cve_status" \ - ",create_time,update_time,delete_time) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)" - val=(cveNum,cveUrl,cveVersion,packName,list[16],list[0],list[1],list[2],list[3],list[4],list[5],list[6],list[7],list[8],list[9],list[10],list[11],list[12],list[13], - list[14],list[15],cveStatus,createTime,updateTime,deleteTime) - - mysql.insertOne(sql,val) - mysql.dispose() - except IndexError as e: - print("下标越界",e) - exceltask.move_file(fileName) - else: - print("newexcels文件夹中无手动添加表") - return False - mysql.close() - - - diff --git a/cve-python/tabletask/test.py b/cve-python/tabletask/test.py deleted file mode 100644 index 2ef010b..0000000 --- a/cve-python/tabletask/test.py +++ /dev/null @@ -1,7 +0,0 @@ -# -*- coding: UTF-8 -*- -# from tabletask import toexcel -import os -from tabletask import exceltask -fils=os.listdir("../newexcels") -for i in fils: - exceltask.move_file(i) \ No newline at end of file diff --git a/cve-python/tabletask/timedtask.py b/cve-python/tabletask/timedtask.py deleted file mode 100644 index 4732209..0000000 --- a/cve-python/tabletask/timedtask.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: UTF-8 -*- -import sys -sys.path.append(r"D:\Users\Administrator\PycharmProjects\work") -import os -import schedule -import time -from tabletask import runtask,exceltask,toexcel - -def task(): - #判断newexcels中是否存在xlsx表格 - # while os.path.exists("../newexcels/b-l.rar.1599118583853.xlsx"): - flag=os.path.exists("../newexcels/a-l.rar.1599118583853.xlsx") - if flag: - - print("定时任务开始") - runtask.crawlWeb() - # #移动xlsx文件备份 - exceltask.move_file() - else: - print("excel文件不存在,手动加入excel文件") - ''' - 查询数据库cve_status的数据,并生成excel - 修改cve_status为3或者4的为5,表示已生成excel待处理 - ''' - toexcel.MysqlToExcel().generate_table() - toexcel.MysqlToExcel().update_status() -schedule.every().day.at("10:29").do(task) -while True: - schedule.run_pending() #run_pending:运行所有可以运行的任务 - time.sleep(1) #睡眠1秒 - diff --git a/cve-python/tabletask/toexcel.py b/cve-python/tabletask/toexcel.py deleted file mode 100644 index e860744..0000000 --- a/cve-python/tabletask/toexcel.py +++ /dev/null @@ -1,93 +0,0 @@ -# -*- coding: UTF-8 -*- -import os -import xlwt -from dbConnecttion.MysqlConn import Mysql -class MysqlToExcel(object): - def __init__(self): - self.file_name= './problemexcels/data.xls' - def get_results(self): - mysql=Mysql() - sql="select * from cve_origin_excel where cve_status = 3 or cve_status=4 or cve_status=5 or cve_status=Null" - results=mysql.getMany(sql) - print(results) - - mysql.dispose() - mysql.close() - return results - - def generate_table(self): - #生成excel表格 - #文件已存在则删除 - if os.path.exists(self.file_name): - os.remove(self.file_name) - results=self.get_results() - if not results: - print("查询结果为空") - return False - #创建excel对象 - f=xlwt.Workbook() - sheet1=f.add_sheet('sheet1',cell_overwrite_ok=True) - #列字段 - column_names=['cve_id','cve_num','cve_url','cve_version','pack_name','score_type','nvd_score','cve_level','cve_desc', - 'repair_time','vector_value','attack_vector','access_vector','attack_complexity','access_complexity', - 'privilege_required','user_interaction','scope','confidentiality','integrity','availability', - 'authentication','cve_status','create_time','update_time','delete_time'] - #写第一行,列名 - for i in range(0,len(column_names)): - sheet1.write(0,i,column_names[i]) - #写多行 - num=0 - for i in results: - for key in i: - if type(i[key])==bytes: - i[key]=i[key].decode("utf-8") - - sheet1.write(num + 1, 0, i["cve_id"]) - sheet1.write(num + 1, 1, i["cve_num"]) - sheet1.write(num + 1, 2, i["cve_url"]) - sheet1.write(num + 1, 3, i["cve_version"]) - sheet1.write(num + 1, 4, i["pack_name"]) - sheet1.write(num + 1, 5, i["score_type"]) - sheet1.write(num + 1, 6, i["nvd_score"]) - sheet1.write(num + 1, 7, i["cve_level"]) - sheet1.write(num + 1, 8, i["cve_desc"]) - sheet1.write(num + 1, 9, i["repair_time"]) - sheet1.write(num + 1, 10, i["vector_value"]) - sheet1.write(num + 1, 11, i["attack_vector"]) - sheet1.write(num + 1, 12, i["access_vector"]) - sheet1.write(num + 1, 13, i["attack_complexity"]) - sheet1.write(num + 1, 14, i["access_complexity"]) - sheet1.write(num + 1, 15, i["privilege_required"]) - sheet1.write(num + 1, 16, i["user_interaction"]) - sheet1.write(num + 1, 17, i["scope"]) - sheet1.write(num + 1, 18, i["confidentiality"]) - sheet1.write(num + 1, 19, i["integrity"]) - sheet1.write(num + 1, 20, i["availability"]) - sheet1.write(num + 1, 21, i["authentication"]) - sheet1.write(num + 1, 22, i["cve_status"]) - if i['create_time']!=None: - sheet1.write(num + 1, 23, i["create_time"].strftime('%Y-%m-%d %H:%M:%S')) - else: - sheet1.write(num + 1, 23, i['create_time']) - if i["update_time"]!=None: - sheet1.write(num + 1, 24, i["update_time"].strftime('%Y-%m-%d %H:%M:%S')) - else: - sheet1.write(num + 1, 24, i["update_time"]) - if i["delete_time"] != None: - sheet1.write(num + 1, 25, i["delete_time"].strftime('%Y-%m-%d %H:%M:%S')) - else: - sheet1.write(num + 1, 25, i["delete_time"]) - num+=1 - #保存文件 - f.save(self.file_name) - #判断文件是否存在 - if not os.path.exists(self.file_name): - print("生成excel失败") - else: - print("生成excel成功") - #修改状态为3,4的为5表示已保存在excel中 - def update_status(self): - mysql=Mysql() - sql="update cve_origin_excel set cve_status=5 where cve_status=3 or cve_status=4" - mysql.update(sql) - mysql.dispose() diff --git a/cve-python/templates/index.html b/cve-python/templates/index.html deleted file mode 100644 index 1cbce03..0000000 --- a/cve-python/templates/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Title - - -

hello world111

- - \ No newline at end of file diff --git a/doc/sql/db_data.sql b/doc/sql/db_data.sql new file mode 100644 index 0000000..484272d --- /dev/null +++ b/doc/sql/db_data.sql @@ -0,0 +1,74 @@ +/* +SQLyog Community v13.1.6 (64 bit) +MySQL - 8.0.21 : Database - cvevulner +********************************************************************* +*/ + +/*!40101 SET NAMES utf8 */; + +/*!40101 SET SQL_MODE=''*/; + +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +CREATE DATABASE /*!32312 IF NOT EXISTS*/`cvevulner` /*!40100 DEFAULT CHARACTER SET utf8 */ /*!80016 DEFAULT ENCRYPTION='N' */; + +USE `cvevulner`; + +/*Table structure for table `cve_email_list` */ + +DROP TABLE IF EXISTS `cve_email_list`; + +CREATE TABLE `cve_email_list` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `email_name` varchar(512) DEFAULT NULL, + `email_type` tinyint NOT NULL DEFAULT '1', + PRIMARY KEY (`id`), + KEY `cve_email_list_email_type` (`email_type`) +) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8; + +/*Table structure for table `cve_ip_white` */ + +DROP TABLE IF EXISTS `cve_ip_white`; + +CREATE TABLE `cve_ip_white` ( + `ip_id` int NOT NULL AUTO_INCREMENT, + `machine_name` varchar(128) NOT NULL DEFAULT '', + `machine_ip` varchar(128) NOT NULL DEFAULT '', + `access_count` bigint NOT NULL DEFAULT '0', + PRIMARY KEY (`ip_id`), + KEY `cve_ip_white_machine_ip` (`machine_ip`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; + +/*Table structure for table `cve_other_user` */ + +DROP TABLE IF EXISTS `cve_other_user`; + +CREATE TABLE `cve_other_user` ( + `user_id` int NOT NULL AUTO_INCREMENT, + `user_name` varchar(64) NOT NULL DEFAULT '', + `pass_word` varchar(256) NOT NULL DEFAULT '', + `aes_key` varchar(512) NOT NULL DEFAULT '', + `expiration_time` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `delete_time` datetime DEFAULT NULL, + PRIMARY KEY (`user_id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; + +/*Table structure for table `cve_security_reviewer` */ + +DROP TABLE IF EXISTS `cve_security_reviewer`; + +CREATE TABLE `cve_security_reviewer` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `name_space` varchar(255) NOT NULL DEFAULT '', + PRIMARY KEY (`id`), + UNIQUE KEY `name_space` (`name_space`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; diff --git a/doc/sql/db_struct.sql b/doc/sql/db_struct.sql index e9ad2eb..37ccd60 100644 --- a/doc/sql/db_struct.sql +++ b/doc/sql/db_struct.sql @@ -28,6 +28,18 @@ CREATE TABLE `cve_admin_user` ( PRIMARY KEY (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*Table structure for table `cve_email_list` */ + +DROP TABLE IF EXISTS `cve_email_list`; + +CREATE TABLE `cve_email_list` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `email_name` varchar(512) DEFAULT NULL, + `email_type` tinyint NOT NULL DEFAULT '1', + PRIMARY KEY (`id`), + KEY `cve_email_list_email_type` (`email_type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + /*Table structure for table `cve_export_record` */ DROP TABLE IF EXISTS `cve_export_record`; @@ -71,7 +83,7 @@ CREATE TABLE `cve_git_open_euler` ( KEY `cve_git_open_euler_package_id` (`package_id`), KEY `cve_git_open_euler_version` (`version`), KEY `cve_git_open_euler_table_id` (`table_id`) -) ENGINE=InnoDB AUTO_INCREMENT=10413 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=10460 DEFAULT CHARSET=utf8; /*Table structure for table `cve_git_open_euler_table_relate` */ @@ -711,6 +723,19 @@ CREATE TABLE `cve_package` ( KEY `cve_package_sec_id` (`sec_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +/*Table structure for table `cve_package_cpe` */ + +DROP TABLE IF EXISTS `cve_package_cpe`; + +CREATE TABLE `cve_package_cpe` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `packname` varchar(512) DEFAULT NULL, + `cpe_packname` varchar(512) DEFAULT NULL, + `create_time` varchar(32) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `cve_package_cpe_packname` (`packname`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + /*Table structure for table `cve_score` */ DROP TABLE IF EXISTS `cve_score`; diff --git a/models/modeldb.go b/models/modeldb.go index 685f8ad..f1c1375 100644 --- a/models/modeldb.go +++ b/models/modeldb.go @@ -214,6 +214,7 @@ type GitOpenEuler struct { IssueCount int64 `orm:"column(issue_count);default(0)" description:"该软件包仓库下的issue总数"` TableId int64 `orm:"index;column(table_id)" description:"表id,外键"` TableName string `orm:"size(128);column(table_name)" description:"数据库pkginfo下的表名,如:mainline, bringInRely"` + CpePackName string `orm:"size(512);column(cpe_packname);null" description:"openEuler对应的cpe包名称(或者影响的包名)"` Status int8 `orm:"default(0);column(status)" description:"0: 代表新数据; 1:已推送; 2:代表已废弃"` CreateTime time.Time `orm:"auto_now_add;type(datetime);column(create_time)"` UpdateTime time.Time `orm:"auto_now;type(datetime);column(update_time)"` @@ -551,6 +552,19 @@ type ExportRecord struct { CreateTime time.Time `orm:"auto_now_add;type(datetime);column(create_time)"` } +type PackageCpe struct { + Id int64 `orm:"pk;auto"` + PackName string `orm:"size(512);column(packname);index;null" description:"Cve对应的openEuler包名称(或者影响的包名)"` + CpePackName string `orm:"size(512);column(cpe_packname);null" description:"openEuler对应的cpe包名称(或者影响的包名)"` + CreateTime string `orm:"size(32);column(create_time);null" description:"createtime"` +} + +type EmailList struct { + Id int64 `orm:"pk;auto"` + EmailName string `orm:"size(512);column(email_name);null" description:"收件人名称"` + EmailType int8 `orm:"index;column(email_type);default(1)" description:"1: excel导出列表"` +} + func CreateDb() bool { BConfig, err := config.NewConfig("ini", "conf/app.conf") if err != nil { @@ -572,7 +586,7 @@ func CreateDb() bool { new(OriginUpstreamPoc), new(OriginUpstreamEvent), new(OriginUpstreamReference), new(OriginUpstreamVulType), new(OriginUpstreamFixSuggest), new(OriginUpstreamFixSuggestRefTag), new(OriginUpstreamFixSuggestRef), new(GiteOriginIssue), new(OriginExcel), new(ExportRecord), new(GitRepoGroups), - new(GiteRepo), new(GiteRepoMember), new(GiteRepoBranch), + new(GiteRepo), new(GiteRepoMember), new(GiteRepoBranch),new(PackageCpe),new(EmailList), ) logs.Info("table create success!") errosyn := orm.RunSyncdb("default", false, true) diff --git a/models/ymal.go b/models/ymal.go index c96fa7a..6ef2f88 100644 --- a/models/ymal.go +++ b/models/ymal.go @@ -15,6 +15,14 @@ func GetYamlTable(gt *[]GitPackageTable) (int64, error) { return num, errx } +func GetCpePackName(pc *PackageCpe, packName string) (error) { + o := orm.NewOrm() + errx := o.Raw("select id, cpe_packname"+ + " from cve_package_cpe where packname = ?", packName).QueryRow(pc) + + return errx +} + func CreateYamlTable(gt *GitPackageTable) (TableId int64, err error) { o := orm.NewOrm() var localgt GitPackageTable diff --git a/taskhandler/common.go b/taskhandler/common.go index ea467ab..78b0598 100644 --- a/taskhandler/common.go +++ b/taskhandler/common.go @@ -71,10 +71,15 @@ const bodyUpTpl = `一、漏洞信息 func CommentTemplate(assignee, commentCmd, affectedVersion string) string { //commentTemplate := "" + //commentTemplate := "Hey @" + assignee + "\n" + + // "以下内容需要您填写, 请复制到评论区回复喔" + "\n" + + // "影响性分析说明: \n\n" + "openEuler评分: (评分和向量)\n" + + // "openEulerScore: \n" + "openEulerVector: \n\n" + + // "受影响版本排查(受影响/不受影响): \n" + affectedVersion + + // "\n也可以参考: " + commentCmd + "\n" commentTemplate := "Hey @" + assignee + "\n" + "以下内容需要您填写, 请复制到评论区回复喔" + "\n" + - "影响性分析说明: \n\n" + "openEuler评分: (评分和向量)\n" + - "openEulerScore: \n" + "openEulerVector: \n\n" + + "影响性分析说明: \n\n" + "openEuler评分: (评分和向量)\n\n" + "受影响版本排查(受影响/不受影响): \n" + affectedVersion + "\n也可以参考: " + commentCmd + "\n" return commentTemplate diff --git a/taskhandler/yaml.go b/taskhandler/yaml.go index 37051e5..e94b373 100644 --- a/taskhandler/yaml.go +++ b/taskhandler/yaml.go @@ -183,6 +183,12 @@ func GetYaml(url, compURL1 string, page, size int, tableValue models.GitPackageT func ProcPackDetail(url string, values map[string]interface{}, tableValue models.GitPackageTable, i int) (string, error){ var ge models.GitOpenEuler GitOpenEulerData(values, &ge, tableValue) + // 查询cpe数据 + var pc models.PackageCpe + pcError := models.GetCpePackName(&pc, ge.PackageName) + if pcError == nil && pc.Id > 0 { + ge.CpePackName = pc.CpePackName + } ok, _ := models.GetSingleYaml(&ge) if ok { logs.Info("第 ", i, "条数据, PackageName: ", ge.PackageName, "已经存在,不需要再次插入") -- Gitee