From 7d6e4a740a2117afa7e57c44637622fbc8796a42 Mon Sep 17 00:00:00 2001 From: zhangjianjun_code <7844966+zhangjianjun_code@user.noreply.gitee.com> Date: Thu, 22 Oct 2020 19:01:54 +0800 Subject: [PATCH 01/20] python module, used to process excel files submitted manually --- cve-py/Dockerfile | 9 + cve-py/README.md | 34 + cve-py/controller/__init__.py | 0 cve-py/controller/taskcontroller.py | 40 + cve-py/controller/timertaskcontroller.py | 25 + cve-py/dbConnecttion/Config.py | 13 + cve-py/dbConnecttion/MysqlConn.py | 136 + cve-py/dbConnecttion/__init__.py | 0 cve-py/deletetask/__init__.py | 0 cve-py/deletetask/deletefiletask.py | 36 + cve-py/downloadtask/__init__.py | 0 cve-py/downloadtask/downloadfiletask.py | 76 + cve-py/emailtask/__init__.py | 0 cve-py/emailtask/sendemail.py | 54 + cve-py/emailtask/sendingtask.py | 19 + cve-py/gitwebtask/__init__.py | 0 cve-py/gitwebtask/genegroup.py | 86 + cve-py/gitwebtask/yamltask.py | 58 + cve-py/main.py | 9 + ...0\345\260\204\345\205\263\347\263\273.xls" | Bin 0 -> 182272 bytes ...0\345\260\204\345\205\263\347\263\273.xls" | Bin 0 -> 182272 bytes cve-py/requirements.txt | 67 + cve-py/sigs.yaml | 7292 +++++++++++++++++ cve-py/tabletask/__init__.py | 0 cve-py/tabletask/crawltask.py | 103 + cve-py/tabletask/exceltask.py | 117 + cve-py/tabletask/mappingtask.py | 77 + cve-py/tabletask/runtask.py | 99 + cve-py/tabletask/toexcel.py | 107 + cve-py/templates/index.html | 10 + 30 files changed, 8467 insertions(+) create mode 100644 cve-py/Dockerfile create mode 100644 cve-py/README.md create mode 100644 cve-py/controller/__init__.py create mode 100644 cve-py/controller/taskcontroller.py create mode 100644 cve-py/controller/timertaskcontroller.py create mode 100644 cve-py/dbConnecttion/Config.py create mode 100644 cve-py/dbConnecttion/MysqlConn.py create mode 100644 cve-py/dbConnecttion/__init__.py create mode 100644 cve-py/deletetask/__init__.py create mode 100644 cve-py/deletetask/deletefiletask.py create mode 100644 cve-py/downloadtask/__init__.py create mode 100644 cve-py/downloadtask/downloadfiletask.py create mode 100644 cve-py/emailtask/__init__.py create mode 100644 cve-py/emailtask/sendemail.py create mode 100644 cve-py/emailtask/sendingtask.py create mode 100644 cve-py/gitwebtask/__init__.py create mode 100644 cve-py/gitwebtask/genegroup.py create mode 100644 cve-py/gitwebtask/yamltask.py create mode 100644 cve-py/main.py create mode 100644 "cve-py/mappingexcels/trust\345\214\205\345\220\215\346\230\240\345\260\204\345\205\263\347\263\273.xls" create mode 100644 "cve-py/oldexcels/trust\345\214\205\345\220\215\346\230\240\345\260\204\345\205\263\347\263\273.xls" create mode 100644 cve-py/requirements.txt create mode 100644 cve-py/sigs.yaml create mode 100644 cve-py/tabletask/__init__.py create mode 100644 cve-py/tabletask/crawltask.py create mode 100644 cve-py/tabletask/exceltask.py create mode 100644 cve-py/tabletask/mappingtask.py create mode 100644 cve-py/tabletask/runtask.py create mode 100644 cve-py/tabletask/toexcel.py create mode 100644 cve-py/templates/index.html diff --git a/cve-py/Dockerfile b/cve-py/Dockerfile new file mode 100644 index 0000000..324a8e6 --- /dev/null +++ b/cve-py/Dockerfile @@ -0,0 +1,9 @@ +FROM python:3.8 +MAINTAINER TommyLike + +RUN mkdir -p /opt/app/cve-python +WORKDIR /opt/app/cve-python +COPY . /opt/app/cve-python/ +RUN pip install --no-cache-dir -r /opt/app/cve-python/requirements.txt + +ENTRYPOINT ["python", "/opt/app/cve-python/main.py"] \ No newline at end of file diff --git a/cve-py/README.md b/cve-py/README.md new file mode 100644 index 0000000..38a5af8 --- /dev/null +++ b/cve-py/README.md @@ -0,0 +1,34 @@ +# cve-artificial + +## Introduction + +This part of the code is to realize the manual data entry module. + +## Architecture + +![](https://images.gitee.com/uploads/images/2020/1019/171406_17619722_7432213.png "Structure.png") + +## Prerequisites + +You'll need to setup a MySQL Database before you are getting started. +This is an example to create Database instance. + +* Setup MySQL instance by the Huawei Cloud Relational Database Service (RDS) +* Login in MySQL with your account and password +* Create database instance by running the following command + ``` + CREATE DATABASE cvevulner; + source ./doc/sql/db_struct.sql; + ``` +The information of database instance will be used in the following Installation. + +## Getting Started + +* [Build the project](doc/md/installx.md) + +## Process processing help + +See the [Process processing help](doc/md/manual.md) file for details. +> For Chinese version, please refer to [流程处理帮助](doc/md/manual.md). + + diff --git a/cve-py/controller/__init__.py b/cve-py/controller/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cve-py/controller/taskcontroller.py b/cve-py/controller/taskcontroller.py new file mode 100644 index 0000000..642cd6a --- /dev/null +++ b/cve-py/controller/taskcontroller.py @@ -0,0 +1,40 @@ +#!/usr/bin/python +# -*- coding: UTF-8 -*- +from tabletask import runtask,mappingtask,toexcel +from gitwebtask import genegroup,yamltask +from emailtask import sendingtask +from downloadtask import downloadfiletask +from deletetask import deletefiletask + +def toexcelcontroller(): + + ''' + Query the data whose cve_status status is 3 or 4 in the database to generate excel + Modify the status of cve_status to 3 or 4 to 5, indicating that it has been added to excel to be processed + ''' + toexcel.MysqlToExcel().generate_table() + toexcel.MysqlToExcel().update_status() + + # Send email after successful export of excel + sendingtask.sending() +def runtabletask(): + # Parse the artificial CVE table, crawl the CVE official website data, and store it in the database + runtask.crawlWeb() + +def runmappeingtask(): + #Package name relationship mapping analysis + mappingtask.toMysql() + +def gwcontroller(): + genegroup.Command().handle() + yamltask.task().download() + yamltask.task().read() + +def rundownloadtask(): + #download files + downloadfiletask.handle_one() + downloadfiletask.handle_two() + +def rundelfiletask(): + #Delete files older than one month + deletefiletask.deldir("./oldexcels") diff --git a/cve-py/controller/timertaskcontroller.py b/cve-py/controller/timertaskcontroller.py new file mode 100644 index 0000000..4160fd9 --- /dev/null +++ b/cve-py/controller/timertaskcontroller.py @@ -0,0 +1,25 @@ +#!/usr/bin/python +# -*- coding: UTF-8 -*- + +from apscheduler.schedulers.blocking import BlockingScheduler +from controller import taskcontroller + +def timertask(): + try: + scheduler=BlockingScheduler() + #Add tasks + # Warehouse, organization, and owner correspondence timing task + scheduler.add_job(taskcontroller.gwcontroller,'cron', day_of_week='0-6', hour=0, minute=10) + # Manual CVE data entry timing task + scheduler.add_job(taskcontroller.runtabletask, 'cron', day_of_week='0-6', hour=11, minute=32) + # Error data export and email sending timing task + scheduler.add_job(taskcontroller.toexcelcontroller, 'cron', day_of_week='0-6', hour=7, minute=0) + # Package name correspondence relationship timing task + scheduler.add_job(taskcontroller.runmappeingtask, 'cron', day_of_week='0-6', hour=0, minute=10) + # Download files timing task + scheduler.add_job(taskcontroller.rundownloadtask,'cron',day_of_week='0-6',hour=0,minute=1) + # Delete files timed tasks that are more than one month old + scheduler.add_job(taskcontroller.rundelfiletask, 'cron', day_of_week='0-6', hour=0, minute=1) + scheduler.start() + except Exception as err: + print("Err:",err) \ No newline at end of file diff --git a/cve-py/dbConnecttion/Config.py b/cve-py/dbConnecttion/Config.py new file mode 100644 index 0000000..d3db6cc --- /dev/null +++ b/cve-py/dbConnecttion/Config.py @@ -0,0 +1,13 @@ +#!/usr/bin/python +# -*- coding: UTF-8 -*- +import os +''' +@author:xjh +''' + +DBHOST=os.getenv("DB_URI") +DBPORT=3306 +DBUSER="cve" +DBPWD=os.getenv("DB_PWDPY") +DBNAME="cvevulner" +DBCHAR="utf8" diff --git a/cve-py/dbConnecttion/MysqlConn.py b/cve-py/dbConnecttion/MysqlConn.py new file mode 100644 index 0000000..0f658fd --- /dev/null +++ b/cve-py/dbConnecttion/MysqlConn.py @@ -0,0 +1,136 @@ +#!/usr/bin/python +# -*- coding: UTF-8 -*- +""" +Created on October 15, 2020 + +@author: xjh +1. When executing SQL with parameters, please use sql statement to specify the list of conditions that need to be entered, and then use tuple/list for conditional batch allocation +2. There is no need to use quotation marks to specify the data type in the format SQL, and the system will automatically recognize it according to the input parameters +3. There is no need to use conversion function in the input value, the system will automatically handle it +""" +import MySQLdb +from MySQLdb.cursors import DictCursor +from DBUtils.PooledDB import PooledDB +from dbConnecttion import Config + +class Mysql(object): + #Connection pool object + __pool=None + def __init__(self): + self.__conn=Mysql.__getConn() + self.__cursor=self.__conn.cursor() + + @staticmethod + def __getConn(): + """ + @summary:Static method, remove the connection from the connection pool + @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: Execute the query and take out the first + @param sql:Query SQL. If there are query conditions, please specify only the condition list and pass in the condition value using the parameter [param] + @param param: Optional parameter, condition list value (tuple/list) + @return: result list/boolean Query result set + """ + 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: Execute the query and take out num results + @param sql:Query SQL. If there are query conditions, please specify only the condition list and pass in the condition value using the parameter [param] + + @param param: Optional parameter, condition list value (tuple/list) + @return: result list/boolean Query result set + """ + 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: Insert a record into the data table + @param sql:SQL format to be inserted + @param value:Record data to be inserted tuple/list + @return: insertId Number of rows affected + """ + self.__cursor.execute(sql, value) + return self.__getInsertId() + + def __getInsertId(self): + """ + Get the id generated by the last insert operation of the current connection, or 0 if not + """ + 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: Update data table records + @param sql: SQL format and conditions, use (%s,%s) + @param param: The value to be updated tuple/list + @return: count Number of rows affected + """ + return self.__query(sql, param) + + def delete(self, sql, param=None): + """ + @summary: Delete data table record + @param sql: SQL format and conditions, use (%s,%s) + @param param: Condition to be deleted Value tuple/list + @return: count Number of rows affected + """ + return self.__query(sql, param) + + def begin(self): + """ + @summary: Open transaction + """ + self.__conn.autocommit(0) + + def end(self, option='commit'): + """ + @summary: End the transaction + """ + if option == 'commit': + self.__conn.commit() + else: + self.__conn.rollback() + + def dispose(self, isEnd=1): + """ + @summary: Commit transaction + """ + if isEnd == 1: + self.end('commit') + else: + self.end('rollback') + def close(self): + """ + @summary: Close the connection + """ + self.__cursor.close() + self.__conn.close() \ No newline at end of file diff --git a/cve-py/dbConnecttion/__init__.py b/cve-py/dbConnecttion/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cve-py/deletetask/__init__.py b/cve-py/deletetask/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cve-py/deletetask/deletefiletask.py b/cve-py/deletetask/deletefiletask.py new file mode 100644 index 0000000..8cc5223 --- /dev/null +++ b/cve-py/deletetask/deletefiletask.py @@ -0,0 +1,36 @@ +#!/usr/bin/python +# -*- coding: UTF-8 -*- +from datetime import datetime,timedelta +import os +import time +import datetime +""" +Delete files older than one month +""" +def deldir(dir): + files = os.listdir(dir) + for file in files: + filePath=dir+"/"+file + if os.path.isfile(filePath): + # Last modified time + # Get file timestamp + last1=os.stat(filePath).st_mtime + filetime=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(last1)) + # Get expiration time + starttime=datetime.datetime.now() + d1=starttime+timedelta(days=-30) + date1=str(d1) + index=date1.find(".") + datatime01=date1[:index] + # datatime01 is the time 7 days before the current time, filetime is the time of file modification, + # if the file time is less than (earlier) datatime01 time, delete fileu + if (datatime01>filetime): + os.remove(filePath) + print(filePath+"was removed!") + elif os.path.isdir(filePath): + # If it is a folder, continue to traverse + deldir(filePath) + # Delete if the folder is empty + if not os.listdir(filePath): + os.rmdir(filePath) + print("empty"+filePath+"was removed!") diff --git a/cve-py/downloadtask/__init__.py b/cve-py/downloadtask/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cve-py/downloadtask/downloadfiletask.py b/cve-py/downloadtask/downloadfiletask.py new file mode 100644 index 0000000..dcdedad --- /dev/null +++ b/cve-py/downloadtask/downloadfiletask.py @@ -0,0 +1,76 @@ +#!/usr/bin/python +# -*- coding: UTF-8 -*- + +import requests +import lxml +from lxml.etree import HTML +import shutil +import os + + +def handle_one(): + if os.listdir("../newexcels"): + shutil.rmtree("../newexcels") + os.mkdir("../newexcels") + url = 'https://gitee.com/iamxjh/test/tree/master/testfile/chirdfile' + try: + r = requests.get(url) + except requests.exceptions.ConnectionError: + print('ConnectionError') + return + except requests.exceptions.ChunkedEncodingError: + print('ChunkedEncodingError') + return + except: + print('Unfortunitely -- An Unknow Error Happened') + return + html = HTML(r.content) + if html: + assert isinstance(html, lxml.etree._Element) + i = 3 + while True: + try: + name = html.xpath("//div[@id='tree-slider']/div[{}]/div[1]/a/@title".format(i))[0] + except IndexError: + break + if name.endswith(".xls") or name.endswith(".xlsx"): + url = "https://gitee.com/iamxjh/test/raw/master/testfile/chirdfile/" + name + r = requests.get(url) + print(r.status_code) + with open("../newexcels/" + name, 'wb') as code: + code.write(r.content) + i += 2 + + +def handle_two(): + if os.listdir("../mappingexcels"): + shutil.rmtree("../mappingexcels") + os.mkdir("../mappingexcels") + url = 'https://gitee.com/iamxjh/test/tree/master/testfile/chirdfile' + try: + r = requests.get(url) + except requests.exceptions.ConnectionError: + print('ConnectionError') + return + except requests.exceptions.ChunkedEncodingError: + print('ChunkedEncodingError') + return + except: + print('Unfortunitely -- An Unknow Error Happened') + return + html = HTML(r.content) + if html: + assert isinstance(html, lxml.etree._Element) + i = 3 + while True: + try: + name = html.xpath("//div[@id='tree-slider']/div[{}]/div[1]/a/@title".format(i))[0] + except IndexError: + break + if name.endswith(".xls") or name.endswith(".xlsx"): + url = "https://gitee.com/iamxjh/test/raw/master/testfile/chirdfile/" + name + r = requests.get(url) + print(r.status_code) + with open("../mappingexcels/" + name, 'wb') as code: + code.write(r.content) + i += 2 diff --git a/cve-py/emailtask/__init__.py b/cve-py/emailtask/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cve-py/emailtask/sendemail.py b/cve-py/emailtask/sendemail.py new file mode 100644 index 0000000..a76d014 --- /dev/null +++ b/cve-py/emailtask/sendemail.py @@ -0,0 +1,54 @@ +#!/usr/bin/python +# -*- coding: UTF-8 -*- +import smtplib +import os +import email.mime.multipart +import email.mime.text +from email.mime.application import MIMEApplication + +def send_email(smtp_host,smtp_port,sendAddr,password,recipientAddrs,subject='',content=''): + ''' + :param smtp_host:smpt.gmail.com + :param smtp_port:587 + :param sendAddr: + :param password: + :param recipientAddrs: + :param subject:标题 + :param content:内容 + :return:无 + ''' + msg=email.mime.multipart.MIMEMultipart() + msg['from']=sendAddr + msg['to']=recipientAddrs + msg['subject']=subject + content=content + txt=email.mime.text.MIMEText(content,'plain','utf-8') + msg.attach(txt) + + #Add attachment address + files = os.listdir("../problemexcels") + if not files: + print("不存在错误数据表") + return + for fileName in files: + part=MIMEApplication(open('./problemexcels/'+fileName,'rb').read()) + part.add_header('Content-Disposition','attachment',filename=fileName) + msg.attach(part) + + try: + smtpSSLClient=smtplib.SMTP(smtp_host,smtp_port) + smtpSSLClient.ehlo() + smtpSSLClient.starttls() + loginRes=smtpSSLClient.login(sendAddr,password) + print(f"登录结果:loginRes={loginRes}") + if loginRes and loginRes[0]==235: + print(f"登录成功,code=[loginRes[0]]") + smtpSSLClient.sendmail(sendAddr,recipientAddrs,str(msg)) + print(f"mail has been send successfully. message:{str(msg)}") + smtpSSLClient.quit() + else: + print(f"登录失败,code={loginRes[0]}") + except Exception as e: + print(f"发送失败,Exception:e={e}") + + diff --git a/cve-py/emailtask/sendingtask.py b/cve-py/emailtask/sendingtask.py new file mode 100644 index 0000000..19bc4da --- /dev/null +++ b/cve-py/emailtask/sendingtask.py @@ -0,0 +1,19 @@ +#!/usr/bin/python +# -*- coding: UTF-8 -*- +import os +from dbConnecttion import MysqlConn +from emailtask import sendemail + + +def sending(): + # Query all recipients + mysql = MysqlConn.Mysql() + sql = "select email_name from cve_email_list where email_type=1" + result = mysql.getMany(sql) + mysql.close() + print(result) + for i in result: + subject = "表格错误数据反馈" + content = "提交的CVE数据出错,请检查格式及内容,详见附件" + sendemail.send_email("smtp.gmail.com", 587, os.getenv("CVE_EMAIL_SENDADDR"), os.getenv("CVE_EMAIL_PASSWORD"), + str(i['email_name'], encoding='utf-8'), subject, content) diff --git a/cve-py/gitwebtask/__init__.py b/cve-py/gitwebtask/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cve-py/gitwebtask/genegroup.py b/cve-py/gitwebtask/genegroup.py new file mode 100644 index 0000000..ee8e49b --- /dev/null +++ b/cve-py/gitwebtask/genegroup.py @@ -0,0 +1,86 @@ +#!/usr/bin/python +# -*- coding: UTF-8 -*- +import requests +import lxml +from lxml.etree import HTML +from dbConnecttion.MysqlConn import Mysql +import time + + +class Command(): + + def handle(self): + url = 'https://gitee.com/openeuler/community/tree/master/sig' + try: + r = requests.get(url) + except requests.exceptions.ConnectionError: + print('ConnectionError') + return + except requests.exceptions.ChunkedEncodingError: + print('ChunkedEncodingError') + return + except: + print('Unfortunitely -- An Unknow Error Happened') + return + html = HTML(r.content) + if html: + assert isinstance(html, lxml.etree._Element) + sigs_list = [] + i = 3 + mysql = Mysql() + 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,) + try: + mysql.insertOne(sql, val) + mysql.dispose() + except Exception as e: + mysql.dispose(0) + print("mysql.insertOne(sql, val)", sql, val, e) + 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) + # Get the name, homepage and etherpad of all sigs + 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: + # Gtt 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"] + # Delete the data in cve_gite_repo_member + # groupId + sql1 = "delete from cve_gite_repo_member where group_id = %s" + val1 = (groupId,) + mysql.delete(sql1, val1) + mysql.dispose() + # Get 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) + try: + mysql.insertOne(sql, val) + mysql.dispose() + except Exception as e: + mysql.dispose(0) + print("mysql.insertOne(sql, val):",sql, val, e) + owners.append(maintainer) + print(owners) + mysql.close() diff --git a/cve-py/gitwebtask/yamltask.py b/cve-py/gitwebtask/yamltask.py new file mode 100644 index 0000000..53d744e --- /dev/null +++ b/cve-py/gitwebtask/yamltask.py @@ -0,0 +1,58 @@ +#!/usr/bin/python +# -*- coding: UTF-8 -*- +import yaml +import requests +from dbConnecttion.MysqlConn import Mysql +import time +import os + + +class task(): + 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') + return + except requests.exceptions.ChunkedEncodingError: + print('ChunkedEncodingError') + return + except: + print('Unfortunitely -- An Unknow Error Happened') + return + with open("sigs.yaml", "wb") as code: + code.write(r.content) + + def read(self): + if os.path.exists("sigs.yaml"): + with open("sigs.yaml", "r") as f: + data = yaml.load(f) + if data and data['sigs']: + mysql = Mysql() + 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'] + # Delete data according to group_id to avoid duplication + sql1 = "delete from cve_gite_repo where group_id = %s" + val1 = (groupId,) + try: + mysql.delete(sql1, val1) + mysql.dispose() + except Exception as e: + mysql.dispose(0) + print("mysql.delete(sql1, val1): ", sql1, val1, e) + 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) + try: + mysql.insertOne(sql, val) + mysql.dispose() + except Exception as e: + mysql.dispose(0) + print("mysql.insertOne(sql, val)", sql, val, e) + mysql.close() diff --git a/cve-py/main.py b/cve-py/main.py new file mode 100644 index 0000000..ff3519b --- /dev/null +++ b/cve-py/main.py @@ -0,0 +1,9 @@ +#!/usr/bin/python +# -*- coding: UTF-8 -*- + +from controller import timertaskcontroller + + +if __name__ == '__main__': + timertaskcontroller.timertask() + diff --git "a/cve-py/mappingexcels/trust\345\214\205\345\220\215\346\230\240\345\260\204\345\205\263\347\263\273.xls" "b/cve-py/mappingexcels/trust\345\214\205\345\220\215\346\230\240\345\260\204\345\205\263\347\263\273.xls" new file mode 100644 index 0000000000000000000000000000000000000000..6ce54d62b4610c08c4596af03031edb3c9f31486 GIT binary patch literal 182272 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 S?YzD&)^GYy{r%7Q=YInbiZQ|f literal 0 HcmV?d00001 diff --git "a/cve-py/oldexcels/trust\345\214\205\345\220\215\346\230\240\345\260\204\345\205\263\347\263\273.xls" "b/cve-py/oldexcels/trust\345\214\205\345\220\215\346\230\240\345\260\204\345\205\263\347\263\273.xls" new file mode 100644 index 0000000000000000000000000000000000000000..6ce54d62b4610c08c4596af03031edb3c9f31486 GIT binary patch literal 182272 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 S?YzD&)^GYy{r%7Q=YInbiZQ|f literal 0 HcmV?d00001 diff --git a/cve-py/requirements.txt b/cve-py/requirements.txt new file mode 100644 index 0000000..6f0c150 --- /dev/null +++ b/cve-py/requirements.txt @@ -0,0 +1,67 @@ +APScheduler==3.6.3 +DBUtils==1.3 +Django==3.1.1 +Flask==1.1.2 +Jinja2==2.10.3 +Markdown==3.1.1 +MarkupSafe==1.1.1 +Pillow==6.2.1 +PyJWT==1.7.1 +PyMySQL==0.9.3 +PyYAML==5.3.1 +Serializer==0.2.1 +Werkzeug==1.0.1 +app==0.0.1 +asgiref==3.2.10 +asn1crypto==1.2.0 +certifi==2019.11.28 +cffi==1.13.2 +chardet==3.0.4 +click==7.1.2 +coreapi==2.3.3 +coreschema==0.0.4 +cryptography==2.8 +django-ckeditor==5.8.0 +django-cors-headers ==3.2.0 +django-filter==2.2.0 +django-js-asset==1.2.2 +django-redis==4.12.1 +django-scheduler==0.9.3 +django-simpleui==3.9 +djangorestframework==3.11.0 +djangorestframework-jwt==1.11.0 +djangorestframework-simplejwt==4.4.0 +docopt==0.6.2 +drf-yasg==1.17.0 +icalendar==4.0.7 +idna==2.8 +inflection==0.3.1 +itsdangerous==1.1.0 +itypes==1.1.0 +lxml==4.5.2 +mysql-connector==2.2.9 +mysql-connector-python==8.0.21 +mysqlclient==1.4.6 +packaging ==19.2 +pip==20.2.2 +pipreqs==0.4.10 +pyOpenSSL==19.1.0 +pycparser==2.19 +pycryptodomex==3.9.4 +pyparsing==2.4.5 +python-alipay-sdk==2.0.1 +python-dateutil==2.8.1 +pytz==2019.3 +redis==3.5.3 +requests==2.22.0 +ruamel.yaml==0.16.5 +ruamel.yaml.clib==0.2.0 +setuptools ==47.1.0 +simplejson==3.17.0 +six==1.13.0 +sqlparse==0.3.0 +uritemplate==3.0.0 +urllib3==1.25.7 +xlrd==1.2.0 +xlwt==1.3.0 +yarg==0.1.9 \ No newline at end of file diff --git a/cve-py/sigs.yaml b/cve-py/sigs.yaml new file mode 100644 index 0000000..05d8888 --- /dev/null +++ b/cve-py/sigs.yaml @@ -0,0 +1,7292 @@ +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/uperf + - 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/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/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/mt-st + - src-openeuler/cldr-emoji-annotation + - src-openeuler/qtwebkit + - src-openeuler/festival + - src-openeuler/gcab + - 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/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-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/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/libEMF + - 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/python-ntplib + - 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 + - src-openeuler/python-networkx + - src-openeuler/python-netifaces + - src-openeuler/python-Keras_Preprocessing + - src-openeuler/python-hyperopt + - src-openeuler/python-nni + - src-openeuler/python-astor + - src-openeuler/python-json-tricks + - src-openeuler/python-pythonwebhdfs + - src-openeuler/python-absl-py + - src-openeuler/python-google-pasta + - src-openeuler/python-h5py + - src-openeuler/python-opt-einsum + - src-openeuler/python-pkgconfig + - src-openeuler/python-tensorboard + - src-openeuler/python-tensorboard-plugin-wit + - src-openeuler/python-estimator + - src-openeuler/python-Keras + - src-openeuler/python-keras-rl2 +- 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-digester + - 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/apacheds-ldap-api + - 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/castor-maven-plugin + - 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/jdom + - 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-release + - src-openeuler/maven-remote-resources-plugin + - src-openeuler/maven-replacer + - 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 + - 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/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/ehcache-parent + - src-openeuler/extlinux-bootloader + - src-openeuler/ezmorph + - src-openeuler/f29-backgrounds + - src-openeuler/fasterxml-oss-parent + - src-openeuler/fastutil + - 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/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/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/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/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-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-hpack + - src-openeuler/python-httpbin + - src-openeuler/python-hyperframe + - src-openeuler/python-jmespath + - src-openeuler/python-keras-applications + - src-openeuler/python-latexcodec + - src-openeuler/python-m2r + - src-openeuler/python-matplotlib + - src-openeuler/python-mistune + - 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-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/tomcat-native + - 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-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/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/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-libboundscheck + repositories: + - openeuler/libboundscheck + - src-openeuler/libboundscheck +- 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/gnome-icon-theme-extras + - src-openeuler/gnome-icon-theme-symbolic + - src-openeuler/gnome-python2 + - 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/deepin-kwin + - src-openeuler/openvswitch-kmod + - src-openeuler/docker-anaconda-addon + - src-openeuler/fontpackages +- 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 + - src-openeuler/test-tools + - src-openeuler/integration-test +- 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 + - src-openeuler/actionlib + - src-openeuler/angles + - src-openeuler/bond_core + - src-openeuler/dynamic_reconfigure + - src-openeuler/geometry + - src-openeuler/geometry2 + - src-openeuler/nodelet_core + - src-openeuler/common_msgs + - src-openeuler/openslam_gmapping + - src-openeuler/slam_gmapping +- 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/openEuler-Advisor + - src-openeuler/pkgship + - src-openeuler/abi-compliance-checker + - src-openeuler/abi-dumper + - src-openeuler/patch-tracking + - 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 + - openeuler/security-facility + - 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 + - src-openeuler/NutShell-riscv-pk + - src-openeuler/NutShell-systemd + - src-openeuler/NutShell-Kernel + - src-openeuler/NutShell-riscv-glibc +- 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-auth-oauthlib + - 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-pyrpm + - 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 + - src-openeuler/python-glanceclient + - src-openeuler/python-openstackclient +- 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/libgxim + - src-openeuler/imsettings + - src-openeuler/fcitx + - src-openeuler/fcitx-qt5 + - src-openeuler/fcitx-libpinyin + - 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/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/swagger-codegen + - 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-swift + - src-openeuler/openstack-neutron + - src-openeuler/openstack-keystone + - src-openeuler/openstack-glance +- name: sig-wine + repositories: + - src-openeuler/wine + - src-openeuler/bullet + - src-openeuler/cloog + - src-openeuler/efl + - src-openeuler/FAudio + - src-openeuler/isl + - src-openeuler/jack-audio-connection-kit + - src-openeuler/libffado + - src-openeuler/libxmlpp + - src-openeuler/mingw-binutils + - src-openeuler/mingw-crt + - src-openeuler/mingw-filesystem + - src-openeuler/mingw-gcc + - src-openeuler/mingw-headers + - src-openeuler/mingw-wine-gecko + - src-openeuler/mingw-winpthreads + - src-openeuler/spirv-headers + - src-openeuler/spirv-tools + - src-openeuler/tinyxml + - src-openeuler/tslib + - src-openeuler/vkd3d + - src-openeuler/wine-mono +- 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 + - src-openeuler/linux-sgx-driver + - src-openeuler/intel-sgx-ssl + - 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 +- name: sig-DyscheOS + repositories: + - openeuler/DyscheOS-kernel + - openeuler/DyscheOS-utils diff --git a/cve-py/tabletask/__init__.py b/cve-py/tabletask/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cve-py/tabletask/crawltask.py b/cve-py/tabletask/crawltask.py new file mode 100644 index 0000000..f8179ca --- /dev/null +++ b/cve-py/tabletask/crawltask.py @@ -0,0 +1,103 @@ +#!/usr/bin/python +# -*- coding: UTF-8 -*- +import requests +from lxml import etree +from datetime import datetime + + +# Reptile Package +def crawling(url): + content = "" + xpthList = [] + 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') + if content and len(content) > 1: + 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"]: + nvdScore = cveLevel = cveDesc = repairTime = vectorValue = attackVector = accessVector = attackComplexity = accessComplexity = \ + privilegeRequired = userInteraction = scope = confidentiality = integrity = availability = authentication = None + print("此漏洞链接无数据") + scoreType = "" + 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]) + repairTime = datetime.strptime(repairTime, '%m/%d/%Y') + 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] + repairTime = datetime.strptime(repairTime, '%m/%d/%Y') + 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 + xpthList = [nvdScore, cveLevel, cveDesc, repairTime, vectorValue, attackVector, accessVector, + attackComplexity, + accessComplexity, + privilegeRequired, userInteraction, scope, confidentiality, integrity, availability, + authentication, + scoreType] + except IndexError as e: + print("下标越界", e) + except UnboundLocalError as e: + print("未找到标签", e) + return xpthList diff --git a/cve-py/tabletask/exceltask.py b/cve-py/tabletask/exceltask.py new file mode 100644 index 0000000..1033adb --- /dev/null +++ b/cve-py/tabletask/exceltask.py @@ -0,0 +1,117 @@ +#!/usr/bin/python +# -*- coding: UTF-8 -*- + +import xlrd +import os +import shutil +from xlrd import XLRDError + + +# Read excel table content +# CVE score +def crawlUrls(fileName): + urls = [] + try: + data = xlrd.open_workbook("./newexcels/" + fileName) + # Find the vulnerability report information table by name + table_one = data.sheet_by_name("漏洞报告") + # Get the maximum number of rows of all data + 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 number +def crawlCveNum(fileName): + cveNum = [] + try: + data = xlrd.open_workbook("./newexcels/" + fileName) + # Find the vulnerability report information table by name + table_one = data.sheet_by_name("漏洞报告") + # Get the maximum number of rows of all data + 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 version +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 type +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 After the analysis is complete, call the function to move to the oldexcels folder for backup +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-py/tabletask/mappingtask.py b/cve-py/tabletask/mappingtask.py new file mode 100644 index 0000000..7c24125 --- /dev/null +++ b/cve-py/tabletask/mappingtask.py @@ -0,0 +1,77 @@ +#!/usr/bin/python +# -*- coding: UTF-8 -*- + +import xlrd +import os +import time +import shutil +from xlrd import XLRDError +from dbConnecttion import MysqlConn + + +def parseExcel(filename): + packName = [] + cpe_packName = [] + try: + data = xlrd.open_workbook("./mappingexcels/" + 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) + cpePackNameOne = table_one.cell(i, 1).value + cpe_packName.append(cpePackNameOne) + except IndexError as e: + print("下标越界", e) + except XLRDError as e: + print("未找到映射关系table", e) + except Exception as e: + print("其他异常:", e) + return packName, cpe_packName + + +def toMysql(): + files = os.listdir("./mappingexcels") + if not files: + print("无文件,请上传excel文件") + return False + mysql = MysqlConn.Mysql() + for filename in files: + packNameList = parseExcel(filename)[0] + cpe_packNameList = parseExcel(filename)[1] + if packNameList and cpe_packNameList: + for j in range(0, len(packNameList)): + createTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + # Query whether data exists in the database, update the data if it exists and is different + sql = "select * from cve_package_cpe where packname = %s" + val = (packNameList[j],) + result = mysql.getOne(sql, val) + if result: + # If the query is not empty, execute the next judgment, if it is empty, insert the data + if str(result['packname'], encoding="utf-8") == packNameList[j]: + if str(result["cpe_packname"], encoding="utf-8") != cpe_packNameList[j]: + print("更新数据") + sql = "update cve_package_cpe set cpe_packname=%s,createtime=%s where packname=%s" + val = (cpe_packNameList[j], createTime, packNameList[j]) + try: + mysql.update(sql, val) + mysql.dispose() + except Exception as e: + mysql.dispose(0) + print("mysql.update: ", e) + else: + print("数据库为最新数据") + else: + print("插入数据") + sql = "insert into cve_package_cpe (packname,cpe_packname,create_time) values (%s,%s,%s)" + val = (packNameList[j], cpe_packNameList[j], createTime) + try: + mysql.insertOne(sql, val) + mysql.dispose() + except Excption as e: + mysql.dispose(0) + print("mysql.insertOne: ", e) + f_src = os.path.join("./mappingexcels/" + filename) + f_dst = os.path.join("./oldexcels/" + filename) + shutil.move(f_src, f_dst) + mysql.close() diff --git a/cve-py/tabletask/runtask.py b/cve-py/tabletask/runtask.py new file mode 100644 index 0000000..cd8bdf3 --- /dev/null +++ b/cve-py/tabletask/runtask.py @@ -0,0 +1,99 @@ +#!/usr/bin/python +# -*- coding: UTF-8 -*- + +from tabletask import exceltask, crawltask +from dbConnecttion.MysqlConn import Mysql +import time +import os + + +# CVSS official website data crawling data storage database +def crawlWeb(): + path = "./newexcels" + files = os.listdir(path) + if files: + mysql = Mysql() + for fileName in files: + cveNumList = exceltask.crawlCveNum(fileName) + urls = exceltask.crawlUrls(fileName) + cveVersionList = exceltask.crawlCveVersion(fileName) + packNameList = exceltask.crawlPackName(fileName) + for i in range(0, len(urls)): + cveNum = str(cveNumList[i]).strip() + print(fileName, cveNum) + # Database query results + sql = "select * from cve_origin_excel where cve_num= %s" + val = (cveNum,) + resultDict = mysql.getOne(sql, val) + # Determine whether CVE exists in the database + if resultDict: + # Crawler web data + crawlList = crawltask.crawling(urls[i]) + # Determine whether the database content is the latest data + if resultDict["nvd_score"]: + 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() + except IndexError as e: + mysql.dispose(0) + print("下标越界", e) + else: + 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) + mysql.dispose(0) + else: + print("error: ", resultDict) + else: + print("数据库未发现数据,执行插入操作") + createTime = updateTime = str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + deleteTime = None + # State 0 means new, 1 means modified + cveStatus = 0 + try: + cveUrl = str(urls[i]) + cveVersion = str(cveVersionList[i]) + packName = str(packNameList[i]) + 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) + mysql.dispose(0) + exceltask.move_file(fileName) + mysql.close() + else: + print("newexcels文件夹中无手动添加表") + diff --git a/cve-py/tabletask/toexcel.py b/cve-py/tabletask/toexcel.py new file mode 100644 index 0000000..13f00fa --- /dev/null +++ b/cve-py/tabletask/toexcel.py @@ -0,0 +1,107 @@ +#!/usr/bin/python +# -*- coding: UTF-8 -*- + +import os +import xlwt +from dbConnecttion.MysqlConn import Mysql +import time + + +def cur_date(): + createTime = time.strftime("%Y-%m-%d", time.localtime()) + return createTime + + +class MysqlToExcel(object): + def __init__(self): + self.file_name = './problemexcels/error_data_' + cur_date + ".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" + results = mysql.getMany(sql) + print(results) + mysql.dispose() + mysql.close() + return results + + def generate_table(self): + # Generate excel sheet + # File already exists, delete + if os.path.exists(self.file_name): + os.remove(self.file_name) + results = self.get_results() + if not results: + print("查询结果为空,无错误数据") + return + # Create excel object + f = xlwt.Workbook() + sheet1 = f.add_sheet('sheet1', cell_overwrite_ok=True) + # Column field + 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'] + # Write the first row, column name + for i in range(0, len(column_names)): + sheet1.write(0, i, column_names[i]) + # Write multiple lines + 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']: + 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"]: + 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"]: + 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 + # save document + f.save(self.file_name) + # Determine whether the file exists + if not os.path.exists(self.file_name): + print("生成excel失败") + else: + print("生成excel成功") + + # Change the data with status 3 and 4 to 5 to indicate that it has been exported in 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() + mysql.close() diff --git a/cve-py/templates/index.html b/cve-py/templates/index.html new file mode 100644 index 0000000..1cbce03 --- /dev/null +++ b/cve-py/templates/index.html @@ -0,0 +1,10 @@ + + + + + Title + + +

hello world111

+ + \ No newline at end of file -- Gitee From 60e5da1e534a77eb736a360f039db30d395c84f8 Mon Sep 17 00:00:00 2001 From: zhangjianjun_code <7844966+zhangjianjun_code@user.noreply.gitee.com> Date: Thu, 22 Oct 2020 19:33:10 +0800 Subject: [PATCH 02/20] view code --- cve-py/controller/timertaskcontroller.py | 11 ++--- cve-py/deletetask/deletefiletask.py | 33 +++++++------- cve-py/emailtask/sendemail.py | 56 ++++++++++++------------ cve-py/gitwebtask/genegroup.py | 5 +-- cve-py/gitwebtask/yamltask.py | 7 ++- cve-py/tabletask/crawltask.py | 7 ++- cve-py/tabletask/mappingtask.py | 2 +- cve-py/tabletask/runtask.py | 25 ++++++----- 8 files changed, 77 insertions(+), 69 deletions(-) diff --git a/cve-py/controller/timertaskcontroller.py b/cve-py/controller/timertaskcontroller.py index 4160fd9..3c6248f 100644 --- a/cve-py/controller/timertaskcontroller.py +++ b/cve-py/controller/timertaskcontroller.py @@ -4,12 +4,13 @@ from apscheduler.schedulers.blocking import BlockingScheduler from controller import taskcontroller + def timertask(): try: - scheduler=BlockingScheduler() - #Add tasks + scheduler = BlockingScheduler() + # Add tasks # Warehouse, organization, and owner correspondence timing task - scheduler.add_job(taskcontroller.gwcontroller,'cron', day_of_week='0-6', hour=0, minute=10) + scheduler.add_job(taskcontroller.gwcontroller, 'cron', day_of_week='0-6', hour=0, minute=10) # Manual CVE data entry timing task scheduler.add_job(taskcontroller.runtabletask, 'cron', day_of_week='0-6', hour=11, minute=32) # Error data export and email sending timing task @@ -17,9 +18,9 @@ def timertask(): # Package name correspondence relationship timing task scheduler.add_job(taskcontroller.runmappeingtask, 'cron', day_of_week='0-6', hour=0, minute=10) # Download files timing task - scheduler.add_job(taskcontroller.rundownloadtask,'cron',day_of_week='0-6',hour=0,minute=1) + scheduler.add_job(taskcontroller.rundownloadtask, 'cron', day_of_week='0-6', hour=0, minute=1) # Delete files timed tasks that are more than one month old scheduler.add_job(taskcontroller.rundelfiletask, 'cron', day_of_week='0-6', hour=0, minute=1) scheduler.start() except Exception as err: - print("Err:",err) \ No newline at end of file + print("Err:", err) diff --git a/cve-py/deletetask/deletefiletask.py b/cve-py/deletetask/deletefiletask.py index 8cc5223..ddcc625 100644 --- a/cve-py/deletetask/deletefiletask.py +++ b/cve-py/deletetask/deletefiletask.py @@ -1,36 +1,37 @@ #!/usr/bin/python # -*- coding: UTF-8 -*- -from datetime import datetime,timedelta +from datetime import datetime, timedelta import os import time -import datetime -""" -Delete files older than one month -""" + + def deldir(dir): + """ + Delete files older than one month + """ files = os.listdir(dir) for file in files: - filePath=dir+"/"+file + filePath = dir + "/" + file if os.path.isfile(filePath): # Last modified time # Get file timestamp - last1=os.stat(filePath).st_mtime - filetime=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(last1)) + last1 = os.stat(filePath).st_mtime + filetime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(last1)) # Get expiration time - starttime=datetime.datetime.now() - d1=starttime+timedelta(days=-30) - date1=str(d1) - index=date1.find(".") - datatime01=date1[:index] + starttime = datetime.now() + d1 = starttime + timedelta(days=-30) + date1 = str(d1) + index = date1.find(".") + datatime01 = date1[:index] # datatime01 is the time 7 days before the current time, filetime is the time of file modification, # if the file time is less than (earlier) datatime01 time, delete fileu - if (datatime01>filetime): + if (datatime01 > filetime): os.remove(filePath) - print(filePath+"was removed!") + print(filePath + "was removed!") elif os.path.isdir(filePath): # If it is a folder, continue to traverse deldir(filePath) # Delete if the folder is empty if not os.listdir(filePath): os.rmdir(filePath) - print("empty"+filePath+"was removed!") + print("empty" + filePath + "was removed!") diff --git a/cve-py/emailtask/sendemail.py b/cve-py/emailtask/sendemail.py index a76d014..0c55976 100644 --- a/cve-py/emailtask/sendemail.py +++ b/cve-py/emailtask/sendemail.py @@ -6,7 +6,8 @@ import email.mime.multipart import email.mime.text from email.mime.application import MIMEApplication -def send_email(smtp_host,smtp_port,sendAddr,password,recipientAddrs,subject='',content=''): + +def send_email(smtp_host, smtp_port, sendAddr, password, recipientAddrs, subject='', content=''): ''' :param smtp_host:smpt.gmail.com :param smtp_port:587 @@ -17,38 +18,35 @@ def send_email(smtp_host,smtp_port,sendAddr,password,recipientAddrs,subject='',c :param content:内容 :return:无 ''' - msg=email.mime.multipart.MIMEMultipart() - msg['from']=sendAddr - msg['to']=recipientAddrs - msg['subject']=subject - content=content - txt=email.mime.text.MIMEText(content,'plain','utf-8') + msg = email.mime.multipart.MIMEMultipart() + msg['from'] = sendAddr + msg['to'] = recipientAddrs + msg['subject'] = subject + content = content + txt = email.mime.text.MIMEText(content, 'plain', 'utf-8') msg.attach(txt) - #Add attachment address + # Add attachment address files = os.listdir("../problemexcels") if not files: print("不存在错误数据表") return for fileName in files: - part=MIMEApplication(open('./problemexcels/'+fileName,'rb').read()) - part.add_header('Content-Disposition','attachment',filename=fileName) - msg.attach(part) - - try: - smtpSSLClient=smtplib.SMTP(smtp_host,smtp_port) - smtpSSLClient.ehlo() - smtpSSLClient.starttls() - loginRes=smtpSSLClient.login(sendAddr,password) - print(f"登录结果:loginRes={loginRes}") - if loginRes and loginRes[0]==235: - print(f"登录成功,code=[loginRes[0]]") - smtpSSLClient.sendmail(sendAddr,recipientAddrs,str(msg)) - print(f"mail has been send successfully. message:{str(msg)}") - smtpSSLClient.quit() - else: - print(f"登录失败,code={loginRes[0]}") - except Exception as e: - print(f"发送失败,Exception:e={e}") - - + try: + part = MIMEApplication(open('./problemexcels/' + fileName, 'rb').read()) + part.add_header('Content-Disposition', 'attachment', filename=fileName) + msg.attach(part) + smtpSSLClient = smtplib.SMTP(smtp_host, smtp_port) + smtpSSLClient.ehlo() + smtpSSLClient.starttls() + loginRes = smtpSSLClient.login(sendAddr, password) + print(f"登录结果:loginRes={loginRes}") + if loginRes and loginRes[0] == 235: + print(f"登录成功,code=[loginRes[0]]") + smtpSSLClient.sendmail(sendAddr, recipientAddrs, str(msg)) + print(f"mail has been send successfully. message:{str(msg)}") + smtpSSLClient.quit() + else: + print(f"登录失败,code={loginRes[0]}") + except Exception as e: + print(f"发送失败,Exception:e={e}") diff --git a/cve-py/gitwebtask/genegroup.py b/cve-py/gitwebtask/genegroup.py index ee8e49b..99b5d45 100644 --- a/cve-py/gitwebtask/genegroup.py +++ b/cve-py/gitwebtask/genegroup.py @@ -8,6 +8,8 @@ import time class Command(): + def __init__(self): + pass def handle(self): url = 'https://gitee.com/openeuler/community/tree/master/sig' @@ -19,9 +21,6 @@ class Command(): except requests.exceptions.ChunkedEncodingError: print('ChunkedEncodingError') return - except: - print('Unfortunitely -- An Unknow Error Happened') - return html = HTML(r.content) if html: assert isinstance(html, lxml.etree._Element) diff --git a/cve-py/gitwebtask/yamltask.py b/cve-py/gitwebtask/yamltask.py index 53d744e..870e333 100644 --- a/cve-py/gitwebtask/yamltask.py +++ b/cve-py/gitwebtask/yamltask.py @@ -8,6 +8,9 @@ import os class task(): + def __init__(self): + pass + def download(self): url = "https://gitee.com/openeuler/community/raw/master/sig/sigs.yaml" try: @@ -18,8 +21,8 @@ class task(): except requests.exceptions.ChunkedEncodingError: print('ChunkedEncodingError') return - except: - print('Unfortunitely -- An Unknow Error Happened') + except Exception as e: + print('Unfortunitely -- An Unknow Error Happened', e) return with open("sigs.yaml", "wb") as code: code.write(r.content) diff --git a/cve-py/tabletask/crawltask.py b/cve-py/tabletask/crawltask.py index f8179ca..f13f08a 100644 --- a/cve-py/tabletask/crawltask.py +++ b/cve-py/tabletask/crawltask.py @@ -13,10 +13,13 @@ def crawling(url): content = requests.get(url).content except requests.exceptions.ConnectionError: print('ConnectionError') + return except requests.exceptions.ChunkedEncodingError: print('ChunkedEncodingError') - except: - print('Unfortunitely -- An Unknow Error Happened') + return + except Exception as e: + print('Unfortunitely -- An Unknow Error Happened', e) + return if content and len(content) > 1: html = etree.HTML(content) try: diff --git a/cve-py/tabletask/mappingtask.py b/cve-py/tabletask/mappingtask.py index 7c24125..ce1309b 100644 --- a/cve-py/tabletask/mappingtask.py +++ b/cve-py/tabletask/mappingtask.py @@ -68,7 +68,7 @@ def toMysql(): try: mysql.insertOne(sql, val) mysql.dispose() - except Excption as e: + except Exception as e: mysql.dispose(0) print("mysql.insertOne: ", e) f_src = os.path.join("./mappingexcels/" + filename) diff --git a/cve-py/tabletask/runtask.py b/cve-py/tabletask/runtask.py index cd8bdf3..90a5c0d 100644 --- a/cve-py/tabletask/runtask.py +++ b/cve-py/tabletask/runtask.py @@ -7,8 +7,10 @@ import time import os -# CVSS official website data crawling data storage database def crawlWeb(): + """ + # CVSS official website data crawling data storage database + """ path = "./newexcels" files = os.listdir(path) if files: @@ -33,7 +35,7 @@ def crawlWeb(): if resultDict["nvd_score"]: if str(resultDict["nvd_score"]) == str(crawlList[0]) and str(resultDict["vector_value"], encoding="utf-8") == str( - crawlList[4]): + crawlList[4]): if resultDict['cve_status'] in [3, 4, 5]: updateTime = str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) try: @@ -58,10 +60,10 @@ def crawlWeb(): "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) + 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: @@ -79,14 +81,16 @@ def crawlWeb(): cveUrl = str(urls[i]) cveVersion = str(cveVersionList[i]) packName = str(packNameList[i]) - list = crawltask.crawling(cveUrl) + listx = 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) + cveNum, cveUrl, cveVersion, packName, listx[16], listx[0], listx[1], listx[2], listx[3], + listx[4], + listx[5], listx[6], listx[7], listx[8], listx[9], listx[10], listx[11], listx[12], + listx[13], + listx[14], listx[15], cveStatus, createTime, updateTime, deleteTime) mysql.insertOne(sql, val) mysql.dispose() except IndexError as e: @@ -96,4 +100,3 @@ def crawlWeb(): mysql.close() else: print("newexcels文件夹中无手动添加表") - -- Gitee From ce88b69e3578e679ad1c01585f35de529fe1d719 Mon Sep 17 00:00:00 2001 From: zhangjianjun_code <7844966+zhangjianjun_code@user.noreply.gitee.com> Date: Fri, 23 Oct 2020 09:38:00 +0800 Subject: [PATCH 03/20] Modify the code according to the pr prompt --- cve-py/controller/taskcontroller.py | 29 +++++++++--- cve-py/controller/timertaskcontroller.py | 4 ++ cve-py/dbConnecttion/Config.py | 5 +- cve-py/dbConnecttion/MysqlConn.py | 59 +++++++++++++++--------- cve-py/deletetask/deletefiletask.py | 4 +- cve-py/downloadtask/downloadfiletask.py | 14 ++++-- cve-py/emailtask/sendemail.py | 6 +-- cve-py/emailtask/sendingtask.py | 4 +- cve-py/gitwebtask/genegroup.py | 6 +++ cve-py/gitwebtask/yamltask.py | 9 ++++ cve-py/tabletask/crawltask.py | 7 +-- cve-py/tabletask/exceltask.py | 36 ++++++++++++--- cve-py/tabletask/mappingtask.py | 8 ++++ cve-py/tabletask/runtask.py | 4 +- cve-py/tabletask/toexcel.py | 22 +++++++-- 15 files changed, 163 insertions(+), 54 deletions(-) diff --git a/cve-py/controller/taskcontroller.py b/cve-py/controller/taskcontroller.py index 642cd6a..015eab1 100644 --- a/cve-py/controller/taskcontroller.py +++ b/cve-py/controller/taskcontroller.py @@ -9,32 +9,49 @@ from deletetask import deletefiletask def toexcelcontroller(): ''' - Query the data whose cve_status status is 3 or 4 in the database to generate excel + @summary: Query the data whose cve_status status is 3 or 4 in the database to generate excel Modify the status of cve_status to 3 or 4 to 5, indicating that it has been added to excel to be processed + @return None ''' toexcel.MysqlToExcel().generate_table() toexcel.MysqlToExcel().update_status() - # Send email after successful export of excel sendingtask.sending() + def runtabletask(): - # Parse the artificial CVE table, crawl the CVE official website data, and store it in the database + """ + @summary: Parse the artificial CVE table, crawl the CVE official website data, and store it in the database + @return None + """ runtask.crawlWeb() def runmappeingtask(): - #Package name relationship mapping analysis + """ + @summary: Parse the artificial CVE table, crawl the CVE official website data, and store it in the database + @return None + """ mappingtask.toMysql() def gwcontroller(): + """ + @summary: Grab warehouse yaml data + @return None + """ genegroup.Command().handle() yamltask.task().download() yamltask.task().read() def rundownloadtask(): - #download files + """ + @summary: download files + @return None + """ downloadfiletask.handle_one() downloadfiletask.handle_two() def rundelfiletask(): - #Delete files older than one month + """ + @summary: Delete files older than one month + @return None + """ deletefiletask.deldir("./oldexcels") diff --git a/cve-py/controller/timertaskcontroller.py b/cve-py/controller/timertaskcontroller.py index 3c6248f..479171a 100644 --- a/cve-py/controller/timertaskcontroller.py +++ b/cve-py/controller/timertaskcontroller.py @@ -6,6 +6,10 @@ from controller import taskcontroller def timertask(): + """ + @summary: Scheduled tasks summary + @return None + """ try: scheduler = BlockingScheduler() # Add tasks diff --git a/cve-py/dbConnecttion/Config.py b/cve-py/dbConnecttion/Config.py index d3db6cc..c590ca4 100644 --- a/cve-py/dbConnecttion/Config.py +++ b/cve-py/dbConnecttion/Config.py @@ -1,9 +1,8 @@ #!/usr/bin/python # -*- coding: UTF-8 -*- + import os -''' -@author:xjh -''' + DBHOST=os.getenv("DB_URI") DBPORT=3306 diff --git a/cve-py/dbConnecttion/MysqlConn.py b/cve-py/dbConnecttion/MysqlConn.py index 0f658fd..a58c169 100644 --- a/cve-py/dbConnecttion/MysqlConn.py +++ b/cve-py/dbConnecttion/MysqlConn.py @@ -13,12 +13,16 @@ from MySQLdb.cursors import DictCursor from DBUtils.PooledDB import PooledDB from dbConnecttion import Config + class Mysql(object): - #Connection pool object - __pool=None + """ + @summary: Connection pool object + """ + __pool = None + def __init__(self): - self.__conn=Mysql.__getConn() - self.__cursor=self.__conn.cursor() + self.__conn = Mysql.__getConn() + self.__cursor = self.__conn.cursor() @staticmethod def __getConn(): @@ -27,10 +31,14 @@ class Mysql(object): @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): + __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() + return None + + def getOne(self, sql, param=None): """ @summary: Execute the query and take out the first @param sql:Query SQL. If there are query conditions, please specify only the condition list and pass in the condition value using the parameter [param] @@ -38,20 +46,19 @@ class Mysql(object): @return: result list/boolean Query result set """ if param is None: - count=self.__cursor.execute(sql) + count = self.__cursor.execute(sql) else: - count=self.__cursor.execute(sql,param) - if count>0: - result=self.__cursor.fetchone() + count = self.__cursor.execute(sql, param) + if count > 0: + result = self.__cursor.fetchone() else: - result=False + result = False return result - def getMany(self, sql, param=None): + def getMany(self, sql, param=None): """ @summary: Execute the query and take out num results @param sql:Query SQL. If there are query conditions, please specify only the condition list and pass in the condition value using the parameter [param] - @param param: Optional parameter, condition list value (tuple/list) @return: result list/boolean Query result set """ @@ -64,7 +71,8 @@ class Mysql(object): else: result = False return result - def insertOne(self,sql,value): + + def insertOne(self, sql, value): """ @summary: Insert a record into the data table @param sql:SQL format to be inserted @@ -76,17 +84,25 @@ class Mysql(object): def __getInsertId(self): """ - Get the id generated by the last insert operation of the current connection, or 0 if not + @summary: Get the id generated by the last insert operation of the current connection, or 0 if not """ self.__cursor.execute("SELECT @@IDENTITY AS id") result = self.__cursor.fetchall() return result[0]['id'] - def __query(self,sql,param=None): + + def __query(self, sql, param=None): + """ + @summary: query data table records + @param sql: SQL format and conditions, use (%s,%s) + @param param: The value to be updated tuple/list + @return: count Number of rows affected + """ if param is None: - count=self.__cursor.execute(sql) + count = self.__cursor.execute(sql) else: - count=self.__cursor.execute(sql,param) + count = self.__cursor.execute(sql, param) return count + def update(self, sql, param=None): """ @summary: Update data table records @@ -128,9 +144,10 @@ class Mysql(object): self.end('commit') else: self.end('rollback') + def close(self): """ @summary: Close the connection """ self.__cursor.close() - self.__conn.close() \ No newline at end of file + self.__conn.close() diff --git a/cve-py/deletetask/deletefiletask.py b/cve-py/deletetask/deletefiletask.py index ddcc625..84da7d0 100644 --- a/cve-py/deletetask/deletefiletask.py +++ b/cve-py/deletetask/deletefiletask.py @@ -7,7 +7,9 @@ import time def deldir(dir): """ - Delete files older than one month + @summary:Delete files older than one month + @param dir: dir struct + @return None """ files = os.listdir(dir) for file in files: diff --git a/cve-py/downloadtask/downloadfiletask.py b/cve-py/downloadtask/downloadfiletask.py index dcdedad..f8e5dc7 100644 --- a/cve-py/downloadtask/downloadfiletask.py +++ b/cve-py/downloadtask/downloadfiletask.py @@ -9,6 +9,9 @@ import os def handle_one(): + """ + @summary: download file + """ if os.listdir("../newexcels"): shutil.rmtree("../newexcels") os.mkdir("../newexcels") @@ -21,8 +24,8 @@ def handle_one(): except requests.exceptions.ChunkedEncodingError: print('ChunkedEncodingError') return - except: - print('Unfortunitely -- An Unknow Error Happened') + except Exception as e: + print('Unfortunitely -- An Unknow Error Happened', e) return html = HTML(r.content) if html: @@ -43,6 +46,9 @@ def handle_one(): def handle_two(): + """ + @summary: download file + """ if os.listdir("../mappingexcels"): shutil.rmtree("../mappingexcels") os.mkdir("../mappingexcels") @@ -55,8 +61,8 @@ def handle_two(): except requests.exceptions.ChunkedEncodingError: print('ChunkedEncodingError') return - except: - print('Unfortunitely -- An Unknow Error Happened') + except Exception as e: + print('Unfortunitely -- An Unknow Error Happened', e) return html = HTML(r.content) if html: diff --git a/cve-py/emailtask/sendemail.py b/cve-py/emailtask/sendemail.py index 0c55976..9632494 100644 --- a/cve-py/emailtask/sendemail.py +++ b/cve-py/emailtask/sendemail.py @@ -14,9 +14,9 @@ def send_email(smtp_host, smtp_port, sendAddr, password, recipientAddrs, subject :param sendAddr: :param password: :param recipientAddrs: - :param subject:标题 - :param content:内容 - :return:无 + :param subject: title + :param content: content + :return:None ''' msg = email.mime.multipart.MIMEMultipart() msg['from'] = sendAddr diff --git a/cve-py/emailtask/sendingtask.py b/cve-py/emailtask/sendingtask.py index 19bc4da..f256424 100644 --- a/cve-py/emailtask/sendingtask.py +++ b/cve-py/emailtask/sendingtask.py @@ -6,7 +6,9 @@ from emailtask import sendemail def sending(): - # Query all recipients + """ + @summary: Query all recipients + """ mysql = MysqlConn.Mysql() sql = "select email_name from cve_email_list where email_type=1" result = mysql.getMany(sql) diff --git a/cve-py/gitwebtask/genegroup.py b/cve-py/gitwebtask/genegroup.py index 99b5d45..0103330 100644 --- a/cve-py/gitwebtask/genegroup.py +++ b/cve-py/gitwebtask/genegroup.py @@ -8,10 +8,16 @@ import time class Command(): + """ + @summary: download sig + """ def __init__(self): pass def handle(self): + """ + @summary: download detail + """ url = 'https://gitee.com/openeuler/community/tree/master/sig' try: r = requests.get(url) diff --git a/cve-py/gitwebtask/yamltask.py b/cve-py/gitwebtask/yamltask.py index 870e333..754d7dc 100644 --- a/cve-py/gitwebtask/yamltask.py +++ b/cve-py/gitwebtask/yamltask.py @@ -8,10 +8,16 @@ import os class task(): + """ + @summary: download task for sig + """ def __init__(self): pass def download(self): + """ + @summary: download detail + """ url = "https://gitee.com/openeuler/community/raw/master/sig/sigs.yaml" try: r = requests.get(url) @@ -28,6 +34,9 @@ class task(): code.write(r.content) def read(self): + """ + @summary: read file + """ if os.path.exists("sigs.yaml"): with open("sigs.yaml", "r") as f: data = yaml.load(f) diff --git a/cve-py/tabletask/crawltask.py b/cve-py/tabletask/crawltask.py index f13f08a..14b6d3d 100644 --- a/cve-py/tabletask/crawltask.py +++ b/cve-py/tabletask/crawltask.py @@ -5,9 +5,10 @@ from lxml import etree from datetime import datetime -# Reptile Package def crawling(url): - content = "" + """ + @summary: Grab cve specific information + """ xpthList = [] try: content = requests.get(url).content @@ -19,7 +20,7 @@ def crawling(url): return except Exception as e: print('Unfortunitely -- An Unknow Error Happened', e) - return + return if content and len(content) > 1: html = etree.HTML(content) try: diff --git a/cve-py/tabletask/exceltask.py b/cve-py/tabletask/exceltask.py index 1033adb..c552b02 100644 --- a/cve-py/tabletask/exceltask.py +++ b/cve-py/tabletask/exceltask.py @@ -7,9 +7,12 @@ import shutil from xlrd import XLRDError -# Read excel table content -# CVE score def crawlUrls(fileName): + """ + @summary: Read excel table content and CVE score + @param fileName: excel file + @return urls: list + """ urls = [] try: data = xlrd.open_workbook("./newexcels/" + fileName) @@ -29,8 +32,12 @@ def crawlUrls(fileName): return urls -# CVE number def crawlCveNum(fileName): + """ + @summary: CVE number + @param fileName: excel file + @return cveNum: list + """ cveNum = [] try: data = xlrd.open_workbook("./newexcels/" + fileName) @@ -50,8 +57,12 @@ def crawlCveNum(fileName): return cveNum -# CVE version def crawlCveVersion(fileName): + """ + @summary: CVE version + @param fileName: excel file + @return cveVersion: list + """ cveVersion = [] try: data = xlrd.open_workbook("./newexcels/" + fileName) @@ -69,8 +80,12 @@ def crawlCveVersion(fileName): return cveVersion -# CVE type def crawlScopeType(fileName): + """ + @summary: CVE type + @param fileName: excel file + @return scopeType: list + """ scopeType = [] try: data = xlrd.open_workbook("./newexcels/" + fileName) @@ -88,8 +103,12 @@ def crawlScopeType(fileName): return scopeType -# Component def crawlPackName(fileName): + """ + @summary: Component + @param fileName: excel file + @return packName: string + """ packName = [] try: data = xlrd.open_workbook("./newexcels/" + fileName) @@ -107,8 +126,11 @@ def crawlPackName(fileName): return packName -# excel After the analysis is complete, call the function to move to the oldexcels folder for backup def move_file(fileName): + """ + @summary: excel After the analysis is complete, call the function to move to the oldexcels folder for backup + @param fileName: excel file + """ try: f_src = os.path.join("./newexcels/" + fileName) f_dst = os.path.join("./oldexcels/" + fileName) diff --git a/cve-py/tabletask/mappingtask.py b/cve-py/tabletask/mappingtask.py index ce1309b..b8bb33b 100644 --- a/cve-py/tabletask/mappingtask.py +++ b/cve-py/tabletask/mappingtask.py @@ -10,6 +10,11 @@ from dbConnecttion import MysqlConn def parseExcel(filename): + """ + @summary: parase excel + @param filename: excel file + @return packName, cpe_packName: string, string + """ packName = [] cpe_packName = [] try: @@ -31,6 +36,9 @@ def parseExcel(filename): def toMysql(): + """ + @summary: Data stored in the database + """ files = os.listdir("./mappingexcels") if not files: print("无文件,请上传excel文件") diff --git a/cve-py/tabletask/runtask.py b/cve-py/tabletask/runtask.py index 90a5c0d..93af087 100644 --- a/cve-py/tabletask/runtask.py +++ b/cve-py/tabletask/runtask.py @@ -9,7 +9,7 @@ import os def crawlWeb(): """ - # CVSS official website data crawling data storage database + @summary: CVSS official website data crawling data storage database """ path = "./newexcels" files = os.listdir(path) @@ -99,4 +99,4 @@ def crawlWeb(): exceltask.move_file(fileName) mysql.close() else: - print("newexcels文件夹中无手动添加表") + print("error: newexcels文件夹中无手动添加表") diff --git a/cve-py/tabletask/toexcel.py b/cve-py/tabletask/toexcel.py index 13f00fa..620c755 100644 --- a/cve-py/tabletask/toexcel.py +++ b/cve-py/tabletask/toexcel.py @@ -8,15 +8,27 @@ import time def cur_date(): + """ + @summary: current date + @return createTime: string + """ createTime = time.strftime("%Y-%m-%d", time.localtime()) return createTime class MysqlToExcel(object): + """ + @summary: Error data is exported from mysql to excel + """ + def __init__(self): self.file_name = './problemexcels/error_data_' + cur_date + ".xls" def get_results(self): + """ + @summary: Query error data + @return results: list + """ mysql = Mysql() sql = "select * from cve_origin_excel where cve_status = 3 or cve_status=4 or cve_status=5" results = mysql.getMany(sql) @@ -26,8 +38,9 @@ class MysqlToExcel(object): return results def generate_table(self): - # Generate excel sheet - # File already exists, delete + """ + @summary: Generate excel sheet, File already exists, delete + """ if os.path.exists(self.file_name): os.remove(self.file_name) results = self.get_results() @@ -98,8 +111,11 @@ class MysqlToExcel(object): else: print("生成excel成功") - # Change the data with status 3 and 4 to 5 to indicate that it has been exported in excel + def update_status(self): + """ + @summary: Change the data with status 3 and 4 to 5 to indicate that it has been exported in excel + """ mysql = Mysql() sql = "update cve_origin_excel set cve_status=5 where cve_status=3 or cve_status=4" mysql.update(sql) -- Gitee From 571869048ce9674325f1d990f43c4d2616de4304 Mon Sep 17 00:00:00 2001 From: zhangjianjun_code <7844966+zhangjianjun_code@user.noreply.gitee.com> Date: Fri, 23 Oct 2020 10:02:13 +0800 Subject: [PATCH 04/20] Modify the code according to the pr prompt --- cve-py/controller/taskcontroller.py | 13 +++---------- cve-py/controller/timertaskcontroller.py | 1 - cve-py/dbConnecttion/Config.py | 13 ++++++------- 3 files changed, 9 insertions(+), 18 deletions(-) diff --git a/cve-py/controller/taskcontroller.py b/cve-py/controller/taskcontroller.py index 015eab1..481ab39 100644 --- a/cve-py/controller/taskcontroller.py +++ b/cve-py/controller/taskcontroller.py @@ -8,11 +8,9 @@ from deletetask import deletefiletask def toexcelcontroller(): - ''' - @summary: Query the data whose cve_status status is 3 or 4 in the database to generate excel - Modify the status of cve_status to 3 or 4 to 5, indicating that it has been added to excel to be processed - @return None - ''' + """ + @summary: Query the data whose cve_status status is 3 or 4 in the database to generate excel Modify the status of cve_status to 3 or 4 to 5, indicating that it has been added to excel to be processed + """ toexcel.MysqlToExcel().generate_table() toexcel.MysqlToExcel().update_status() # Send email after successful export of excel @@ -21,21 +19,18 @@ def toexcelcontroller(): def runtabletask(): """ @summary: Parse the artificial CVE table, crawl the CVE official website data, and store it in the database - @return None """ runtask.crawlWeb() def runmappeingtask(): """ @summary: Parse the artificial CVE table, crawl the CVE official website data, and store it in the database - @return None """ mappingtask.toMysql() def gwcontroller(): """ @summary: Grab warehouse yaml data - @return None """ genegroup.Command().handle() yamltask.task().download() @@ -44,7 +39,6 @@ def gwcontroller(): def rundownloadtask(): """ @summary: download files - @return None """ downloadfiletask.handle_one() downloadfiletask.handle_two() @@ -52,6 +46,5 @@ def rundownloadtask(): def rundelfiletask(): """ @summary: Delete files older than one month - @return None """ deletefiletask.deldir("./oldexcels") diff --git a/cve-py/controller/timertaskcontroller.py b/cve-py/controller/timertaskcontroller.py index 479171a..d4bf1e2 100644 --- a/cve-py/controller/timertaskcontroller.py +++ b/cve-py/controller/timertaskcontroller.py @@ -8,7 +8,6 @@ from controller import taskcontroller def timertask(): """ @summary: Scheduled tasks summary - @return None """ try: scheduler = BlockingScheduler() diff --git a/cve-py/dbConnecttion/Config.py b/cve-py/dbConnecttion/Config.py index c590ca4..69e91d8 100644 --- a/cve-py/dbConnecttion/Config.py +++ b/cve-py/dbConnecttion/Config.py @@ -3,10 +3,9 @@ import os - -DBHOST=os.getenv("DB_URI") -DBPORT=3306 -DBUSER="cve" -DBPWD=os.getenv("DB_PWDPY") -DBNAME="cvevulner" -DBCHAR="utf8" +DBHOST = os.getenv("DB_URI") +DBPORT = 3306 +DBUSER = "cve" +DBPWD = os.getenv("DB_PWDPY") +DBNAME = "cvevulner" +DBCHAR = "utf8" -- Gitee From d8b79921f423c22181cb6cff5695cc8c860720c8 Mon Sep 17 00:00:00 2001 From: zhangjianjun_code <7844966+zhangjianjun_code@user.noreply.gitee.com> Date: Fri, 23 Oct 2020 10:41:10 +0800 Subject: [PATCH 05/20] Modify the code according to the pr prompt --- cve-py/controller/taskcontroller.py | 11 +++++--- cve-py/deletetask/deletefiletask.py | 1 - cve-py/downloadtask/downloadfiletask.py | 2 -- cve-py/gitwebtask/genegroup.py | 10 +++---- cve-py/newexcels/test.xls | Bin 0 -> 6656 bytes cve-py/tabletask/crawltask.py | 33 ++++++++++++++++-------- cve-py/tabletask/runtask.py | 27 ++++++++++++------- cve-py/tabletask/toexcel.py | 1 - 8 files changed, 53 insertions(+), 32 deletions(-) create mode 100644 cve-py/newexcels/test.xls diff --git a/cve-py/controller/taskcontroller.py b/cve-py/controller/taskcontroller.py index 481ab39..ca4771e 100644 --- a/cve-py/controller/taskcontroller.py +++ b/cve-py/controller/taskcontroller.py @@ -1,13 +1,13 @@ #!/usr/bin/python # -*- coding: UTF-8 -*- -from tabletask import runtask,mappingtask,toexcel -from gitwebtask import genegroup,yamltask +from tabletask import runtask, mappingtask, toexcel +from gitwebtask import genegroup, yamltask from emailtask import sendingtask from downloadtask import downloadfiletask from deletetask import deletefiletask -def toexcelcontroller(): +def toexcelcontroller(): """ @summary: Query the data whose cve_status status is 3 or 4 in the database to generate excel Modify the status of cve_status to 3 or 4 to 5, indicating that it has been added to excel to be processed """ @@ -16,18 +16,21 @@ def toexcelcontroller(): # Send email after successful export of excel sendingtask.sending() + def runtabletask(): """ @summary: Parse the artificial CVE table, crawl the CVE official website data, and store it in the database """ runtask.crawlWeb() + def runmappeingtask(): """ @summary: Parse the artificial CVE table, crawl the CVE official website data, and store it in the database """ mappingtask.toMysql() + def gwcontroller(): """ @summary: Grab warehouse yaml data @@ -36,6 +39,7 @@ def gwcontroller(): yamltask.task().download() yamltask.task().read() + def rundownloadtask(): """ @summary: download files @@ -43,6 +47,7 @@ def rundownloadtask(): downloadfiletask.handle_one() downloadfiletask.handle_two() + def rundelfiletask(): """ @summary: Delete files older than one month diff --git a/cve-py/deletetask/deletefiletask.py b/cve-py/deletetask/deletefiletask.py index 84da7d0..db5b35d 100644 --- a/cve-py/deletetask/deletefiletask.py +++ b/cve-py/deletetask/deletefiletask.py @@ -9,7 +9,6 @@ def deldir(dir): """ @summary:Delete files older than one month @param dir: dir struct - @return None """ files = os.listdir(dir) for file in files: diff --git a/cve-py/downloadtask/downloadfiletask.py b/cve-py/downloadtask/downloadfiletask.py index f8e5dc7..bc0e305 100644 --- a/cve-py/downloadtask/downloadfiletask.py +++ b/cve-py/downloadtask/downloadfiletask.py @@ -29,7 +29,6 @@ def handle_one(): return html = HTML(r.content) if html: - assert isinstance(html, lxml.etree._Element) i = 3 while True: try: @@ -66,7 +65,6 @@ def handle_two(): return html = HTML(r.content) if html: - assert isinstance(html, lxml.etree._Element) i = 3 while True: try: diff --git a/cve-py/gitwebtask/genegroup.py b/cve-py/gitwebtask/genegroup.py index 0103330..ffad76b 100644 --- a/cve-py/gitwebtask/genegroup.py +++ b/cve-py/gitwebtask/genegroup.py @@ -7,10 +7,11 @@ from dbConnecttion.MysqlConn import Mysql import time -class Command(): +class Command(object): """ @summary: download sig """ + def __init__(self): pass @@ -29,7 +30,6 @@ class Command(): return html = HTML(r.content) if html: - assert isinstance(html, lxml.etree._Element) sigs_list = [] i = 3 mysql = Mysql() @@ -72,20 +72,20 @@ class Command(): 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)" + 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) try: mysql.insertOne(sql, val) mysql.dispose() except Exception as e: mysql.dispose(0) - print("mysql.insertOne(sql, val):",sql, val, e) + print("mysql.insertOne(sql, val):", sql, val, e) owners.append(maintainer) print(owners) mysql.close() diff --git a/cve-py/newexcels/test.xls b/cve-py/newexcels/test.xls new file mode 100644 index 0000000000000000000000000000000000000000..a7f371ad8fadc9ed3a23cb494ec850371d390000 GIT binary patch literal 6656 zcmeI0Yiv|S6vxlqZrfd<^vScbuI14ur7a+@KwAQd#z-run6L&~TBJc9sbJ)j>jRC7 zi3SqIm>3chH6|5ff+iZ%elYP1(P$viPsN19Z=%su6ubV;xx4Lld+%CkLjvj9{m;xj z_spC#GiT1s-0!|E9z65Of=iM?8zo1E6Jg0q<2#fUMnxh43i>>pNF-dQ2*qi-g+}0C zY`r5nhe7gOpmUxNLLdxg0G(sSG~He!uuTr}J0elpA_vKPQi`z)9)X+*8Pdd0L$s+9D5ur|J1-=^*WJ z*%MC7(62F2`!rGg%aQ#%sUcUk%TYPNufxXvK4xLBjfrxONDt+MNm;L~D%pQsyA##F z0@-hpjj8QAZ)(5a`q%iN!!;8WfLTDNk1aroK?x`YWnea#1LlHxU_Mv?%E6srA&7vx zKor~!D!?MJ7%TxxK_#dH)u0B{f;zAa)B}x04djiWDfzsTd=*#^R)aNQEm#Mp%byuz+GKV4Cfx@MuMx@ zi065U@04xQEnV`MPsP>j-t)&-tVfrhHuqg5*vh6K@voX)bE=UZR&0|vyCj-4u!hoT z&y>Gj#=affcQ1(wMyJARxpiBt90~3qL{z)V{M0DlPl3MkYx)>dw9daDZg;(G9jnY= z&Q;tj%^v-FoRHV()vwIv#`n%kBAcq^MC;k�bFYvsBG2#R$S<`7uU25?qUCF7U20 z>LY%Y*W;b#nUzyUduw&yy1KWZIhw6{HVZ}@8npdNPaH+88L2b2?no0=l#SEu@cnl7(~$E1lM+!=0fr>D2pdlC%S@V0tJ;Y$$D9 zT1cmday40g(4V{&-|XD1Pp!kO z`B0(WEyMByYw{JYclzvPJO|RAEwEbi!}KlBBD6h@B&u%k_`APfZQED$(HkMDt^D-I z26%4){l=y5-TQ&WTPW)t_FkY-ZXZy4PJk3?d^*cZz2^oQWWB%Yop^_|bAyjc8@Kko z+}8K7FDU7IjajWMr~~j1f+yKAdhJ%P-#pyNwl6@}_dQ|_n$vHUZmZeTdw3mE zW2cC&SN{~L9ckuP)~|k|QxS7}6YnBde|Z8ZU(4$A_v7Vl_~DT{r>?7 Date: Fri, 23 Oct 2020 11:37:17 +0800 Subject: [PATCH 06/20] Modify the code according to the pr prompt --- conf/product_app.conf | 2 +- cve-py/controller/taskcontroller.py | 4 ++-- cve-py/dbConnecttion/MysqlConn.py | 4 ++-- cve-py/deletetask/deletefiletask.py | 10 +++++----- cve-py/downloadtask/downloadfiletask.py | 9 +-------- cve-py/emailtask/sendemail.py | 2 +- cve-py/gitwebtask/genegroup.py | 21 ++++++--------------- cve-py/gitwebtask/yamltask.py | 24 +++++++----------------- cve-py/tabletask/crawltask.py | 7 ++----- cve-py/tabletask/exceltask.py | 10 ---------- cve-py/tabletask/mappingtask.py | 18 ++++-------------- 11 files changed, 31 insertions(+), 80 deletions(-) diff --git a/conf/product_app.conf b/conf/product_app.conf index c93cbc0..853a911 100644 --- a/conf/product_app.conf +++ b/conf/product_app.conf @@ -79,7 +79,7 @@ password = "${GITEE_PASSWORD||****}" git_token = "${GITEE_TOKEN||xxx}" [hook] -hookpwd = "${HOOK_PWD||***}" + hookurl = https://api.openeuler.org/cve-manager/v1/issue/hook/event diff --git a/cve-py/controller/taskcontroller.py b/cve-py/controller/taskcontroller.py index ca4771e..ef04bc1 100644 --- a/cve-py/controller/taskcontroller.py +++ b/cve-py/controller/taskcontroller.py @@ -36,8 +36,8 @@ def gwcontroller(): @summary: Grab warehouse yaml data """ genegroup.Command().handle() - yamltask.task().download() - yamltask.task().read() + yamltask.Task().download() + yamltask.Task().read() def rundownloadtask(): diff --git a/cve-py/dbConnecttion/MysqlConn.py b/cve-py/dbConnecttion/MysqlConn.py index a58c169..30fe80b 100644 --- a/cve-py/dbConnecttion/MysqlConn.py +++ b/cve-py/dbConnecttion/MysqlConn.py @@ -9,8 +9,8 @@ Created on October 15, 2020 3. There is no need to use conversion function in the input value, the system will automatically handle it """ import MySQLdb -from MySQLdb.cursors import DictCursor -from DBUtils.PooledDB import PooledDB +import MySQLdb.cursors.DictCursor as DictCursor +import DBUtils.PooledDB.PooledDB as PooledDB from dbConnecttion import Config diff --git a/cve-py/deletetask/deletefiletask.py b/cve-py/deletetask/deletefiletask.py index db5b35d..590541e 100644 --- a/cve-py/deletetask/deletefiletask.py +++ b/cve-py/deletetask/deletefiletask.py @@ -5,14 +5,14 @@ import os import time -def deldir(dir): +def deldir(dirx): """ @summary:Delete files older than one month - @param dir: dir struct + @param dirx: dir struct """ - files = os.listdir(dir) - for file in files: - filePath = dir + "/" + file + files = os.listdir(dirx) + for filex in files: + filePath = dirx + "/" + filex if os.path.isfile(filePath): # Last modified time # Get file timestamp diff --git a/cve-py/downloadtask/downloadfiletask.py b/cve-py/downloadtask/downloadfiletask.py index bc0e305..767a1bf 100644 --- a/cve-py/downloadtask/downloadfiletask.py +++ b/cve-py/downloadtask/downloadfiletask.py @@ -2,8 +2,7 @@ # -*- coding: UTF-8 -*- import requests -import lxml -from lxml.etree import HTML +import lxml.etree.HTML as HTML import shutil import os @@ -24,9 +23,6 @@ def handle_one(): except requests.exceptions.ChunkedEncodingError: print('ChunkedEncodingError') return - except Exception as e: - print('Unfortunitely -- An Unknow Error Happened', e) - return html = HTML(r.content) if html: i = 3 @@ -60,9 +56,6 @@ def handle_two(): except requests.exceptions.ChunkedEncodingError: print('ChunkedEncodingError') return - except Exception as e: - print('Unfortunitely -- An Unknow Error Happened', e) - return html = HTML(r.content) if html: i = 3 diff --git a/cve-py/emailtask/sendemail.py b/cve-py/emailtask/sendemail.py index 9632494..5bd0f14 100644 --- a/cve-py/emailtask/sendemail.py +++ b/cve-py/emailtask/sendemail.py @@ -48,5 +48,5 @@ def send_email(smtp_host, smtp_port, sendAddr, password, recipientAddrs, subject smtpSSLClient.quit() else: print(f"登录失败,code={loginRes[0]}") - except Exception as e: + except SystemExit as e: print(f"发送失败,Exception:e={e}") diff --git a/cve-py/gitwebtask/genegroup.py b/cve-py/gitwebtask/genegroup.py index ffad76b..c0a1444 100644 --- a/cve-py/gitwebtask/genegroup.py +++ b/cve-py/gitwebtask/genegroup.py @@ -1,9 +1,8 @@ #!/usr/bin/python # -*- coding: UTF-8 -*- import requests -import lxml -from lxml.etree import HTML -from dbConnecttion.MysqlConn import Mysql +import lxml.etree.HTML as HTML +import dbConnecttion.MysqlConn.Mysql as Mysql import time @@ -44,12 +43,8 @@ class Command(object): print("数据库无此条数据,执行插入操作") sql = "insert into cve_git_repo_groups (group_name) values (%s)" val = (sig_name,) - try: - mysql.insertOne(sql, val) - mysql.dispose() - except Exception as e: - mysql.dispose(0) - print("mysql.insertOne(sql, val)", sql, val, e) + 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) # Get the name, homepage and etherpad of all sigs @@ -80,12 +75,8 @@ class Command(object): 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) - try: - mysql.insertOne(sql, val) - mysql.dispose() - except Exception as e: - mysql.dispose(0) - print("mysql.insertOne(sql, val):", sql, val, e) + mysql.insertOne(sql, val) + mysql.dispose() owners.append(maintainer) print(owners) mysql.close() diff --git a/cve-py/gitwebtask/yamltask.py b/cve-py/gitwebtask/yamltask.py index 754d7dc..a9e0100 100644 --- a/cve-py/gitwebtask/yamltask.py +++ b/cve-py/gitwebtask/yamltask.py @@ -7,7 +7,7 @@ import time import os -class task(): +class Task(object): """ @summary: download task for sig """ @@ -27,9 +27,6 @@ class task(): except requests.exceptions.ChunkedEncodingError: print('ChunkedEncodingError') return - except Exception as e: - print('Unfortunitely -- An Unknow Error Happened', e) - return with open("sigs.yaml", "wb") as code: code.write(r.content) @@ -49,22 +46,15 @@ class task(): # Delete data according to group_id to avoid duplication sql1 = "delete from cve_gite_repo where group_id = %s" val1 = (groupId,) - try: - mysql.delete(sql1, val1) - mysql.dispose() - except Exception as e: - mysql.dispose(0) - print("mysql.delete(sql1, val1): ", sql1, val1, e) + mysql.delete(sql1, val1) + mysql.dispose() 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)" + 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) - try: - mysql.insertOne(sql, val) - mysql.dispose() - except Exception as e: - mysql.dispose(0) - print("mysql.insertOne(sql, val)", sql, val, e) + mysql.insertOne(sql, val) + mysql.dispose() mysql.close() diff --git a/cve-py/tabletask/crawltask.py b/cve-py/tabletask/crawltask.py index e22cfcf..50cc5ad 100644 --- a/cve-py/tabletask/crawltask.py +++ b/cve-py/tabletask/crawltask.py @@ -18,9 +18,6 @@ def crawling(url): except requests.exceptions.ChunkedEncodingError: print('ChunkedEncodingError') return - except Exception as e: - print('Unfortunitely -- An Unknow Error Happened', e) - return if content and len(content) > 1: html = etree.HTML(content) try: @@ -60,8 +57,8 @@ def crawling(url): 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( + 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()) diff --git a/cve-py/tabletask/exceltask.py b/cve-py/tabletask/exceltask.py index c552b02..f13c50e 100644 --- a/cve-py/tabletask/exceltask.py +++ b/cve-py/tabletask/exceltask.py @@ -27,8 +27,6 @@ def crawlUrls(fileName): print("下标越界", e) except XLRDError as e: print("未找到漏洞报告table", e) - except Exception as e: - print("其他异常:", e) return urls @@ -52,8 +50,6 @@ def crawlCveNum(fileName): print("下标越界", e) except XLRDError as e: print("未找到漏洞报告table", e) - except Exception as e: - print("其他异常:", e) return cveNum @@ -75,8 +71,6 @@ def crawlCveVersion(fileName): print("下标越界", e) except XLRDError as e: print("未找到漏洞报告table", e) - except Exception as e: - print("其他异常:", e) return cveVersion @@ -98,8 +92,6 @@ def crawlScopeType(fileName): print("下标越界", e) except XLRDError as e: print("未找到漏洞报告table", e) - except Exception as e: - print("error:", e) return scopeType @@ -121,8 +113,6 @@ def crawlPackName(fileName): print("下标越界", e) except XLRDError as e: print("未找到漏洞报告table", e) - except Exception as e: - print("error:", e) return packName diff --git a/cve-py/tabletask/mappingtask.py b/cve-py/tabletask/mappingtask.py index b8bb33b..5ccfa45 100644 --- a/cve-py/tabletask/mappingtask.py +++ b/cve-py/tabletask/mappingtask.py @@ -30,8 +30,6 @@ def parseExcel(filename): print("下标越界", e) except XLRDError as e: print("未找到映射关系table", e) - except Exception as e: - print("其他异常:", e) return packName, cpe_packName @@ -61,24 +59,16 @@ def toMysql(): print("更新数据") sql = "update cve_package_cpe set cpe_packname=%s,createtime=%s where packname=%s" val = (cpe_packNameList[j], createTime, packNameList[j]) - try: - mysql.update(sql, val) - mysql.dispose() - except Exception as e: - mysql.dispose(0) - print("mysql.update: ", e) + mysql.update(sql, val) + mysql.dispose() else: print("数据库为最新数据") else: print("插入数据") sql = "insert into cve_package_cpe (packname,cpe_packname,create_time) values (%s,%s,%s)" val = (packNameList[j], cpe_packNameList[j], createTime) - try: - mysql.insertOne(sql, val) - mysql.dispose() - except Exception as e: - mysql.dispose(0) - print("mysql.insertOne: ", e) + mysql.insertOne(sql, val) + mysql.dispose() f_src = os.path.join("./mappingexcels/" + filename) f_dst = os.path.join("./oldexcels/" + filename) shutil.move(f_src, f_dst) -- Gitee From e15456e674d09c643e3142a6ab9b1ea47b36d49c Mon Sep 17 00:00:00 2001 From: zhangjianjun_code <7844966+zhangjianjun_code@user.noreply.gitee.com> Date: Fri, 23 Oct 2020 12:49:29 +0800 Subject: [PATCH 07/20] Modify the code according to the pr prompt --- cve-py/controller/taskcontroller.py | 22 +++++-- cve-py/controller/timertaskcontroller.py | 5 +- cve-py/dbConnecttion/MysqlConn.py | 80 +++++++++++++----------- cve-py/deletetask/deletefiletask.py | 4 +- cve-py/downloadtask/downloadfiletask.py | 10 +-- cve-py/emailtask/sendemail.py | 14 ++--- cve-py/emailtask/sendingtask.py | 6 +- cve-py/gitwebtask/genegroup.py | 17 ++--- cve-py/gitwebtask/yamltask.py | 12 ++-- cve-py/main.py | 3 + cve-py/tabletask/crawltask.py | 2 +- cve-py/tabletask/exceltask.py | 36 +++++------ cve-py/tabletask/mappingtask.py | 8 +-- cve-py/tabletask/runtask.py | 2 +- cve-py/tabletask/toexcel.py | 12 ++-- 15 files changed, 130 insertions(+), 103 deletions(-) diff --git a/cve-py/controller/taskcontroller.py b/cve-py/controller/taskcontroller.py index ef04bc1..60e1017 100644 --- a/cve-py/controller/taskcontroller.py +++ b/cve-py/controller/taskcontroller.py @@ -9,7 +9,10 @@ from deletetask import deletefiletask def toexcelcontroller(): """ - @summary: Query the data whose cve_status status is 3 or 4 in the database to generate excel Modify the status of cve_status to 3 or 4 to 5, indicating that it has been added to excel to be processed + Query the data whose cve_status status is 3 or 4 in the + database to generate excel Modify the status of cve_status to 3 or 4 to 5, + indicating that it has been added to excel to be processed + :return:None """ toexcel.MysqlToExcel().generate_table() toexcel.MysqlToExcel().update_status() @@ -19,21 +22,26 @@ def toexcelcontroller(): def runtabletask(): """ - @summary: Parse the artificial CVE table, crawl the CVE official website data, and store it in the database + Parse the artificial CVE table, crawl the CVE official + website data, and store it in the database + :return:None """ runtask.crawlWeb() def runmappeingtask(): """ - @summary: Parse the artificial CVE table, crawl the CVE official website data, and store it in the database + Parse the artificial CVE table, crawl the CVE + official website data, and store it in the database + :return:None """ mappingtask.toMysql() def gwcontroller(): """ - @summary: Grab warehouse yaml data + Grab warehouse yaml data + :return:None """ genegroup.Command().handle() yamltask.Task().download() @@ -42,7 +50,8 @@ def gwcontroller(): def rundownloadtask(): """ - @summary: download files + download files + :return:None """ downloadfiletask.handle_one() downloadfiletask.handle_two() @@ -50,6 +59,7 @@ def rundownloadtask(): def rundelfiletask(): """ - @summary: Delete files older than one month + Delete files older than one month + :return:None """ deletefiletask.deldir("./oldexcels") diff --git a/cve-py/controller/timertaskcontroller.py b/cve-py/controller/timertaskcontroller.py index d4bf1e2..9087c21 100644 --- a/cve-py/controller/timertaskcontroller.py +++ b/cve-py/controller/timertaskcontroller.py @@ -7,7 +7,8 @@ from controller import taskcontroller def timertask(): """ - @summary: Scheduled tasks summary + Scheduled tasks summary + :return:None """ try: scheduler = BlockingScheduler() @@ -25,5 +26,5 @@ def timertask(): # Delete files timed tasks that are more than one month old scheduler.add_job(taskcontroller.rundelfiletask, 'cron', day_of_week='0-6', hour=0, minute=1) scheduler.start() - except Exception as err: + except SystemExit as err: print("Err:", err) diff --git a/cve-py/dbConnecttion/MysqlConn.py b/cve-py/dbConnecttion/MysqlConn.py index 30fe80b..c4c8376 100644 --- a/cve-py/dbConnecttion/MysqlConn.py +++ b/cve-py/dbConnecttion/MysqlConn.py @@ -9,41 +9,45 @@ Created on October 15, 2020 3. There is no need to use conversion function in the input value, the system will automatically handle it """ import MySQLdb -import MySQLdb.cursors.DictCursor as DictCursor -import DBUtils.PooledDB.PooledDB as PooledDB +from MySQLdb import cursors +from DBUtils import PooledDB from dbConnecttion import Config class Mysql(object): """ - @summary: Connection pool object + Connection pool object """ __pool = None def __init__(self): + """ + init object + """ self.__conn = Mysql.__getConn() self.__cursor = self.__conn.cursor() @staticmethod def __getConn(): """ - @summary:Static method, remove the connection from the connection pool - @return MySQLdb.connection + Static method, remove the connection from the connection pool + :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) + __pool = PooledDB.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=cursors.DictCursor) return __pool.connection() return None def getOne(self, sql, param=None): """ - @summary: Execute the query and take out the first - @param sql:Query SQL. If there are query conditions, please specify only the condition list and pass in the condition value using the parameter [param] - @param param: Optional parameter, condition list value (tuple/list) - @return: result list/boolean Query result set + Execute the query and take out the first + :param sql:Query SQL. If there are query conditions, please specify only the condition list and pass in the condition value using the parameter [param] + :param param:Optional parameter, condition list value (tuple/list) + :return:result list/boolean Query result set """ if param is None: count = self.__cursor.execute(sql) @@ -57,10 +61,10 @@ class Mysql(object): def getMany(self, sql, param=None): """ - @summary: Execute the query and take out num results - @param sql:Query SQL. If there are query conditions, please specify only the condition list and pass in the condition value using the parameter [param] - @param param: Optional parameter, condition list value (tuple/list) - @return: result list/boolean Query result set + Execute the query and take out num results + :param sql:Query SQL. If there are query conditions, please specify only the condition list and pass in the condition value using the parameter [param] + :param param:Optional parameter, condition list value (tuple/list) + :return:result list/boolean Query result set """ if param is None: count = self.__cursor.execute(sql) @@ -74,17 +78,17 @@ class Mysql(object): def insertOne(self, sql, value): """ - @summary: Insert a record into the data table - @param sql:SQL format to be inserted - @param value:Record data to be inserted tuple/list - @return: insertId Number of rows affected + Insert a record into the data table + :param sql:SQL format to be inserted + :param value:Record data to be inserted tuple/list + :return:insertId Number of rows affected """ self.__cursor.execute(sql, value) return self.__getInsertId() def __getInsertId(self): """ - @summary: Get the id generated by the last insert operation of the current connection, or 0 if not + Get the id generated by the last insert operation of the current connection, or 0 if not """ self.__cursor.execute("SELECT @@IDENTITY AS id") result = self.__cursor.fetchall() @@ -92,10 +96,10 @@ class Mysql(object): def __query(self, sql, param=None): """ - @summary: query data table records - @param sql: SQL format and conditions, use (%s,%s) - @param param: The value to be updated tuple/list - @return: count Number of rows affected + query data table records + :param sql:SQL format and conditions, use (%s,%s) + :param param:The value to be updated tuple/list + :return:count Number of rows affected """ if param is None: count = self.__cursor.execute(sql) @@ -105,31 +109,31 @@ class Mysql(object): def update(self, sql, param=None): """ - @summary: Update data table records - @param sql: SQL format and conditions, use (%s,%s) - @param param: The value to be updated tuple/list - @return: count Number of rows affected + Update data table records + :param sql:SQL format and conditions, use (%s,%s) + :param param:The value to be updated tuple/list + :return:count Number of rows affected """ return self.__query(sql, param) def delete(self, sql, param=None): """ - @summary: Delete data table record - @param sql: SQL format and conditions, use (%s,%s) - @param param: Condition to be deleted Value tuple/list - @return: count Number of rows affected + Delete data table record + :param sql:SQL format and conditions, use (%s,%s) + :param param:Condition to be deleted Value tuple/list + :return:count Number of rows affected """ return self.__query(sql, param) def begin(self): """ - @summary: Open transaction + Open transaction """ self.__conn.autocommit(0) def end(self, option='commit'): """ - @summary: End the transaction + End the transaction """ if option == 'commit': self.__conn.commit() @@ -138,7 +142,7 @@ class Mysql(object): def dispose(self, isEnd=1): """ - @summary: Commit transaction + Commit transaction """ if isEnd == 1: self.end('commit') @@ -147,7 +151,7 @@ class Mysql(object): def close(self): """ - @summary: Close the connection + Close the connection """ self.__cursor.close() self.__conn.close() diff --git a/cve-py/deletetask/deletefiletask.py b/cve-py/deletetask/deletefiletask.py index 590541e..f997529 100644 --- a/cve-py/deletetask/deletefiletask.py +++ b/cve-py/deletetask/deletefiletask.py @@ -7,8 +7,8 @@ import time def deldir(dirx): """ - @summary:Delete files older than one month - @param dirx: dir struct + Delete files older than one month + :param dirx:dir struct """ files = os.listdir(dirx) for filex in files: diff --git a/cve-py/downloadtask/downloadfiletask.py b/cve-py/downloadtask/downloadfiletask.py index 767a1bf..1656d98 100644 --- a/cve-py/downloadtask/downloadfiletask.py +++ b/cve-py/downloadtask/downloadfiletask.py @@ -2,14 +2,14 @@ # -*- coding: UTF-8 -*- import requests -import lxml.etree.HTML as HTML +import lxml.etree as etree import shutil import os def handle_one(): """ - @summary: download file + download file """ if os.listdir("../newexcels"): shutil.rmtree("../newexcels") @@ -23,7 +23,7 @@ def handle_one(): except requests.exceptions.ChunkedEncodingError: print('ChunkedEncodingError') return - html = HTML(r.content) + html = etree.HTML(r.content) if html: i = 3 while True: @@ -42,7 +42,7 @@ def handle_one(): def handle_two(): """ - @summary: download file + download file """ if os.listdir("../mappingexcels"): shutil.rmtree("../mappingexcels") @@ -56,7 +56,7 @@ def handle_two(): except requests.exceptions.ChunkedEncodingError: print('ChunkedEncodingError') return - html = HTML(r.content) + html = etree.HTML(r.content) if html: i = 3 while True: diff --git a/cve-py/emailtask/sendemail.py b/cve-py/emailtask/sendemail.py index 5bd0f14..b49309e 100644 --- a/cve-py/emailtask/sendemail.py +++ b/cve-py/emailtask/sendemail.py @@ -8,7 +8,8 @@ from email.mime.application import MIMEApplication def send_email(smtp_host, smtp_port, sendAddr, password, recipientAddrs, subject='', content=''): - ''' + """ + send email :param smtp_host:smpt.gmail.com :param smtp_port:587 :param sendAddr: @@ -17,7 +18,7 @@ def send_email(smtp_host, smtp_port, sendAddr, password, recipientAddrs, subject :param subject: title :param content: content :return:None - ''' + """ msg = email.mime.multipart.MIMEMultipart() msg['from'] = sendAddr msg['to'] = recipientAddrs @@ -25,7 +26,6 @@ def send_email(smtp_host, smtp_port, sendAddr, password, recipientAddrs, subject content = content txt = email.mime.text.MIMEText(content, 'plain', 'utf-8') msg.attach(txt) - # Add attachment address files = os.listdir("../problemexcels") if not files: @@ -40,13 +40,13 @@ def send_email(smtp_host, smtp_port, sendAddr, password, recipientAddrs, subject smtpSSLClient.ehlo() smtpSSLClient.starttls() loginRes = smtpSSLClient.login(sendAddr, password) - print(f"登录结果:loginRes={loginRes}") + print(f"登录结果:loginRes=", loginRes) if loginRes and loginRes[0] == 235: print(f"登录成功,code=[loginRes[0]]") smtpSSLClient.sendmail(sendAddr, recipientAddrs, str(msg)) - print(f"mail has been send successfully. message:{str(msg)}") + print(f"mail has been send successfully. message: ", str(msg)) smtpSSLClient.quit() else: - print(f"登录失败,code={loginRes[0]}") + print(f"登录失败,code= ", loginRes[0]) except SystemExit as e: - print(f"发送失败,Exception:e={e}") + print(f"发送失败,Exception:e= ", e) diff --git a/cve-py/emailtask/sendingtask.py b/cve-py/emailtask/sendingtask.py index f256424..5eb6e53 100644 --- a/cve-py/emailtask/sendingtask.py +++ b/cve-py/emailtask/sendingtask.py @@ -7,7 +7,7 @@ from emailtask import sendemail def sending(): """ - @summary: Query all recipients + Query all recipients """ mysql = MysqlConn.Mysql() sql = "select email_name from cve_email_list where email_type=1" @@ -17,5 +17,7 @@ def sending(): for i in result: subject = "表格错误数据反馈" content = "提交的CVE数据出错,请检查格式及内容,详见附件" - sendemail.send_email("smtp.gmail.com", 587, os.getenv("CVE_EMAIL_SENDADDR"), os.getenv("CVE_EMAIL_PASSWORD"), + sendemail.send_email("smtp.gmail.com", 587, + os.getenv("CVE_EMAIL_SENDADDR"), + os.getenv("CVE_EMAIL_PASSWORD"), str(i['email_name'], encoding='utf-8'), subject, content) diff --git a/cve-py/gitwebtask/genegroup.py b/cve-py/gitwebtask/genegroup.py index c0a1444..092ada5 100644 --- a/cve-py/gitwebtask/genegroup.py +++ b/cve-py/gitwebtask/genegroup.py @@ -1,22 +1,25 @@ #!/usr/bin/python # -*- coding: UTF-8 -*- import requests -import lxml.etree.HTML as HTML -import dbConnecttion.MysqlConn.Mysql as Mysql +import lxml.etree as etree +import dbConnecttion.MysqlConn as MysqlConn import time class Command(object): """ - @summary: download sig + download sig """ def __init__(self): + """ + init object + """ pass def handle(self): """ - @summary: download detail + download detail """ url = 'https://gitee.com/openeuler/community/tree/master/sig' try: @@ -27,11 +30,11 @@ class Command(object): except requests.exceptions.ChunkedEncodingError: print('ChunkedEncodingError') return - html = HTML(r.content) + html = etree.HTML(r.content) if html: sigs_list = [] i = 3 - mysql = Mysql() + mysql = MysqlConn.Mysql() while True: sig_name = html.xpath("//div[@id='tree-slider']/div[{}]/div[1]/a/@title".format(i))[0] if sig_name == 'sigs.yaml': @@ -66,7 +69,7 @@ class Command(object): # Get owners url = 'https://gitee.com/openeuler/community/blob/master/sig/{}/OWNERS'.format(sig[0]) r = requests.get(url) - html = HTML(r.text) + html = etree.HTML(r.text) res = html.xpath('//div[@class="line"]/text()') owners = [] for i in res[1:]: diff --git a/cve-py/gitwebtask/yamltask.py b/cve-py/gitwebtask/yamltask.py index a9e0100..e053621 100644 --- a/cve-py/gitwebtask/yamltask.py +++ b/cve-py/gitwebtask/yamltask.py @@ -2,16 +2,20 @@ # -*- coding: UTF-8 -*- import yaml import requests -from dbConnecttion.MysqlConn import Mysql +from dbConnecttion import MysqlConn import time import os class Task(object): """ - @summary: download task for sig + download task for sig """ + def __init__(self): + """ + init object + """ pass def download(self): @@ -32,13 +36,13 @@ class Task(object): def read(self): """ - @summary: read file + read file """ if os.path.exists("sigs.yaml"): with open("sigs.yaml", "r") as f: data = yaml.load(f) if data and data['sigs']: - mysql = Mysql() + mysql = MysqlConn.Mysql() for sig in data['sigs']: sql = "select group_id from cve_git_repo_groups where group_name=%s" val = (sig['name'],) diff --git a/cve-py/main.py b/cve-py/main.py index ff3519b..14529fe 100644 --- a/cve-py/main.py +++ b/cve-py/main.py @@ -5,5 +5,8 @@ from controller import timertaskcontroller if __name__ == '__main__': + """ + main, Program entry + """ timertaskcontroller.timertask() diff --git a/cve-py/tabletask/crawltask.py b/cve-py/tabletask/crawltask.py index 50cc5ad..94702b9 100644 --- a/cve-py/tabletask/crawltask.py +++ b/cve-py/tabletask/crawltask.py @@ -7,7 +7,7 @@ from datetime import datetime def crawling(url): """ - @summary: Grab cve specific information + Grab cve specific information """ xpthList = [] try: diff --git a/cve-py/tabletask/exceltask.py b/cve-py/tabletask/exceltask.py index f13c50e..4076b03 100644 --- a/cve-py/tabletask/exceltask.py +++ b/cve-py/tabletask/exceltask.py @@ -9,9 +9,9 @@ from xlrd import XLRDError def crawlUrls(fileName): """ - @summary: Read excel table content and CVE score - @param fileName: excel file - @return urls: list + Read excel table content and CVE score + :param fileName: excel file + :return urls: list """ urls = [] try: @@ -32,9 +32,9 @@ def crawlUrls(fileName): def crawlCveNum(fileName): """ - @summary: CVE number - @param fileName: excel file - @return cveNum: list + CVE number + :param fileName:excel file + :return cveNum:list """ cveNum = [] try: @@ -55,9 +55,9 @@ def crawlCveNum(fileName): def crawlCveVersion(fileName): """ - @summary: CVE version - @param fileName: excel file - @return cveVersion: list + CVE version + :param fileName:excel file + :return cveVersion:list """ cveVersion = [] try: @@ -76,9 +76,9 @@ def crawlCveVersion(fileName): def crawlScopeType(fileName): """ - @summary: CVE type - @param fileName: excel file - @return scopeType: list + CVE type + :param fileName:excel file + :return scopeType:list """ scopeType = [] try: @@ -97,9 +97,9 @@ def crawlScopeType(fileName): def crawlPackName(fileName): """ - @summary: Component - @param fileName: excel file - @return packName: string + Component + :param fileName:excel file + :return packName:string """ packName = [] try: @@ -118,12 +118,12 @@ def crawlPackName(fileName): def move_file(fileName): """ - @summary: excel After the analysis is complete, call the function to move to the oldexcels folder for backup - @param fileName: excel file + excel After the analysis is complete, call the function to move to the oldexcels folder for backup + :param fileName:excel file """ 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: + except SystemExit as e: print("move error", e) diff --git a/cve-py/tabletask/mappingtask.py b/cve-py/tabletask/mappingtask.py index 5ccfa45..b351ce3 100644 --- a/cve-py/tabletask/mappingtask.py +++ b/cve-py/tabletask/mappingtask.py @@ -11,9 +11,9 @@ from dbConnecttion import MysqlConn def parseExcel(filename): """ - @summary: parase excel - @param filename: excel file - @return packName, cpe_packName: string, string + parase excel + :param filename: excel file + :return packName, cpe_packName: string, string """ packName = [] cpe_packName = [] @@ -35,7 +35,7 @@ def parseExcel(filename): def toMysql(): """ - @summary: Data stored in the database + Data stored in the database """ files = os.listdir("./mappingexcels") if not files: diff --git a/cve-py/tabletask/runtask.py b/cve-py/tabletask/runtask.py index 79e56ac..7381137 100644 --- a/cve-py/tabletask/runtask.py +++ b/cve-py/tabletask/runtask.py @@ -9,7 +9,7 @@ import os def crawlWeb(): """ - @summary: CVSS official website data crawling data storage database + CVSS official website data crawling data storage database """ path = "./newexcels" files = os.listdir(path) diff --git a/cve-py/tabletask/toexcel.py b/cve-py/tabletask/toexcel.py index 4e04a9d..d234dc8 100644 --- a/cve-py/tabletask/toexcel.py +++ b/cve-py/tabletask/toexcel.py @@ -9,8 +9,8 @@ import time def cur_date(): """ - @summary: current date - @return createTime: string + current date + :return createTime: string """ createTime = time.strftime("%Y-%m-%d", time.localtime()) return createTime @@ -18,11 +18,11 @@ def cur_date(): class MysqlToExcel(object): """ - @summary: Error data is exported from mysql to excel + Error data is exported from mysql to excel """ def __init__(self): - self.file_name = './problemexcels/error_data_' + cur_date + ".xls" + self.file_name = './problemexcels/error_data_' + str(cur_date) + ".xls" def get_results(self): """ @@ -39,7 +39,7 @@ class MysqlToExcel(object): def generate_table(self): """ - @summary: Generate excel sheet, File already exists, delete + Generate excel sheet, File already exists, delete """ if os.path.exists(self.file_name): os.remove(self.file_name) @@ -113,7 +113,7 @@ class MysqlToExcel(object): def update_status(self): """ - @summary: Change the data with status 3 and 4 to 5 to indicate that it has been exported in excel + Change the data with status 3 and 4 to 5 to indicate that it has been exported in excel """ mysql = Mysql() sql = "update cve_origin_excel set cve_status=5 where cve_status=3 or cve_status=4" -- Gitee From c11381f7d69939e90f2bad4813f195a3a4f23efb Mon Sep 17 00:00:00 2001 From: zhangjianjun_code <7844966+zhangjianjun_code@user.noreply.gitee.com> Date: Fri, 23 Oct 2020 15:22:19 +0800 Subject: [PATCH 08/20] Modify the code according to the pr prompt --- cve-py/controller/__init__.py | 3 ++ cve-py/controller/taskcontroller.py | 12 +++---- cve-py/controller/timertaskcontroller.py | 6 ++-- cve-py/dbConnecttion/MysqlConn.py | 43 ++++++++++-------------- cve-py/dbConnecttion/__init__.py | 8 +++++ cve-py/deletetask/__init__.py | 3 ++ cve-py/deletetask/deletefiletask.py | 8 ++--- cve-py/downloadtask/__init__.py | 3 ++ cve-py/downloadtask/downloadfiletask.py | 4 +-- cve-py/emailtask/__init__.py | 3 ++ cve-py/emailtask/sendemail.py | 12 +++---- cve-py/emailtask/sendingtask.py | 2 +- cve-py/gitwebtask/__init__.py | 3 ++ cve-py/gitwebtask/genegroup.py | 2 +- cve-py/gitwebtask/yamltask.py | 8 ++--- cve-py/main.py | 3 -- cve-py/tabletask/__init__.py | 3 ++ cve-py/tabletask/crawltask.py | 2 +- cve-py/tabletask/exceltask.py | 24 ++++++------- cve-py/tabletask/mappingtask.py | 7 ++-- cve-py/tabletask/runtask.py | 2 +- cve-py/tabletask/toexcel.py | 16 ++++----- 22 files changed, 94 insertions(+), 83 deletions(-) diff --git a/cve-py/controller/__init__.py b/cve-py/controller/__init__.py index e69de29..01fe626 100644 --- a/cve-py/controller/__init__.py +++ b/cve-py/controller/__init__.py @@ -0,0 +1,3 @@ +""" + Control task +""" \ No newline at end of file diff --git a/cve-py/controller/taskcontroller.py b/cve-py/controller/taskcontroller.py index 60e1017..47fede8 100644 --- a/cve-py/controller/taskcontroller.py +++ b/cve-py/controller/taskcontroller.py @@ -9,7 +9,7 @@ from deletetask import deletefiletask def toexcelcontroller(): """ - Query the data whose cve_status status is 3 or 4 in the + Query the data whose cve_status status is 3 or 4 in the database to generate excel Modify the status of cve_status to 3 or 4 to 5, indicating that it has been added to excel to be processed :return:None @@ -22,7 +22,7 @@ def toexcelcontroller(): def runtabletask(): """ - Parse the artificial CVE table, crawl the CVE official + Parse the artificial CVE table, crawl the CVE official website data, and store it in the database :return:None """ @@ -31,7 +31,7 @@ def runtabletask(): def runmappeingtask(): """ - Parse the artificial CVE table, crawl the CVE + Parse the artificial CVE table, crawl the CVE official website data, and store it in the database :return:None """ @@ -40,7 +40,7 @@ def runmappeingtask(): def gwcontroller(): """ - Grab warehouse yaml data + Grab warehouse yaml data :return:None """ genegroup.Command().handle() @@ -50,7 +50,7 @@ def gwcontroller(): def rundownloadtask(): """ - download files + download files :return:None """ downloadfiletask.handle_one() @@ -59,7 +59,7 @@ def rundownloadtask(): def rundelfiletask(): """ - Delete files older than one month + Delete files older than one month :return:None """ deletefiletask.deldir("./oldexcels") diff --git a/cve-py/controller/timertaskcontroller.py b/cve-py/controller/timertaskcontroller.py index 9087c21..54b91d2 100644 --- a/cve-py/controller/timertaskcontroller.py +++ b/cve-py/controller/timertaskcontroller.py @@ -1,17 +1,17 @@ #!/usr/bin/python # -*- coding: UTF-8 -*- -from apscheduler.schedulers.blocking import BlockingScheduler +import apscheduler.schedulers.blocking as blocking from controller import taskcontroller def timertask(): """ - Scheduled tasks summary + Scheduled tasks summary :return:None """ try: - scheduler = BlockingScheduler() + scheduler = blocking.BlockingScheduler() # Add tasks # Warehouse, organization, and owner correspondence timing task scheduler.add_job(taskcontroller.gwcontroller, 'cron', day_of_week='0-6', hour=0, minute=10) diff --git a/cve-py/dbConnecttion/MysqlConn.py b/cve-py/dbConnecttion/MysqlConn.py index c4c8376..b43b027 100644 --- a/cve-py/dbConnecttion/MysqlConn.py +++ b/cve-py/dbConnecttion/MysqlConn.py @@ -1,28 +1,21 @@ #!/usr/bin/python # -*- coding: UTF-8 -*- -""" -Created on October 15, 2020 - -@author: xjh -1. When executing SQL with parameters, please use sql statement to specify the list of conditions that need to be entered, and then use tuple/list for conditional batch allocation -2. There is no need to use quotation marks to specify the data type in the format SQL, and the system will automatically recognize it according to the input parameters -3. There is no need to use conversion function in the input value, the system will automatically handle it -""" -import MySQLdb -from MySQLdb import cursors + +import pymysql +from pymysql import cursors from DBUtils import PooledDB from dbConnecttion import Config class Mysql(object): """ - Connection pool object + Connection pool object """ __pool = None def __init__(self): """ - init object + init object """ self.__conn = Mysql.__getConn() self.__cursor = self.__conn.cursor() @@ -30,11 +23,11 @@ class Mysql(object): @staticmethod def __getConn(): """ - Static method, remove the connection from the connection pool + Static method, remove the connection from the connection pool :return MySQLdb.connection """ if Mysql.__pool is None: - __pool = PooledDB.PooledDB(creator=MySQLdb, mincached=1, maxcached=20, host=Config.DBHOST, + __pool = PooledDB.PooledDB(creator=pymysql, 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, @@ -44,7 +37,7 @@ class Mysql(object): def getOne(self, sql, param=None): """ - Execute the query and take out the first + Execute the query and take out the first :param sql:Query SQL. If there are query conditions, please specify only the condition list and pass in the condition value using the parameter [param] :param param:Optional parameter, condition list value (tuple/list) :return:result list/boolean Query result set @@ -61,7 +54,7 @@ class Mysql(object): def getMany(self, sql, param=None): """ - Execute the query and take out num results + Execute the query and take out num results :param sql:Query SQL. If there are query conditions, please specify only the condition list and pass in the condition value using the parameter [param] :param param:Optional parameter, condition list value (tuple/list) :return:result list/boolean Query result set @@ -78,7 +71,7 @@ class Mysql(object): def insertOne(self, sql, value): """ - Insert a record into the data table + Insert a record into the data table :param sql:SQL format to be inserted :param value:Record data to be inserted tuple/list :return:insertId Number of rows affected @@ -88,7 +81,7 @@ class Mysql(object): def __getInsertId(self): """ - Get the id generated by the last insert operation of the current connection, or 0 if not + Get the id generated by the last insert operation of the current connection, or 0 if not """ self.__cursor.execute("SELECT @@IDENTITY AS id") result = self.__cursor.fetchall() @@ -96,7 +89,7 @@ class Mysql(object): def __query(self, sql, param=None): """ - query data table records + query data table records :param sql:SQL format and conditions, use (%s,%s) :param param:The value to be updated tuple/list :return:count Number of rows affected @@ -109,7 +102,7 @@ class Mysql(object): def update(self, sql, param=None): """ - Update data table records + Update data table records :param sql:SQL format and conditions, use (%s,%s) :param param:The value to be updated tuple/list :return:count Number of rows affected @@ -118,7 +111,7 @@ class Mysql(object): def delete(self, sql, param=None): """ - Delete data table record + Delete data table record :param sql:SQL format and conditions, use (%s,%s) :param param:Condition to be deleted Value tuple/list :return:count Number of rows affected @@ -127,13 +120,13 @@ class Mysql(object): def begin(self): """ - Open transaction + Open transaction """ self.__conn.autocommit(0) def end(self, option='commit'): """ - End the transaction + End the transaction """ if option == 'commit': self.__conn.commit() @@ -142,7 +135,7 @@ class Mysql(object): def dispose(self, isEnd=1): """ - Commit transaction + Commit transaction """ if isEnd == 1: self.end('commit') @@ -151,7 +144,7 @@ class Mysql(object): def close(self): """ - Close the connection + Close the connection """ self.__cursor.close() self.__conn.close() diff --git a/cve-py/dbConnecttion/__init__.py b/cve-py/dbConnecttion/__init__.py index e69de29..c2f881e 100644 --- a/cve-py/dbConnecttion/__init__.py +++ b/cve-py/dbConnecttion/__init__.py @@ -0,0 +1,8 @@ +""" +Created on October 15, 2020 + +@author: xjh +1. When executing SQL with parameters, please use sql statement to specify the list of conditions that need to be entered, and then use tuple/list for conditional batch allocation +2. There is no need to use quotation marks to specify the data type in the format SQL, and the system will automatically recognize it according to the input parameters +3. There is no need to use conversion function in the input value, the system will automatically handle it +""" \ No newline at end of file diff --git a/cve-py/deletetask/__init__.py b/cve-py/deletetask/__init__.py index e69de29..9ef0244 100644 --- a/cve-py/deletetask/__init__.py +++ b/cve-py/deletetask/__init__.py @@ -0,0 +1,3 @@ +""" + Clear historical files regularly +""" \ No newline at end of file diff --git a/cve-py/deletetask/deletefiletask.py b/cve-py/deletetask/deletefiletask.py index f997529..49dcf46 100644 --- a/cve-py/deletetask/deletefiletask.py +++ b/cve-py/deletetask/deletefiletask.py @@ -1,13 +1,13 @@ #!/usr/bin/python # -*- coding: UTF-8 -*- -from datetime import datetime, timedelta +import datetime import os import time def deldir(dirx): """ - Delete files older than one month + Delete files older than one month :param dirx:dir struct """ files = os.listdir(dirx) @@ -19,8 +19,8 @@ def deldir(dirx): last1 = os.stat(filePath).st_mtime filetime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(last1)) # Get expiration time - starttime = datetime.now() - d1 = starttime + timedelta(days=-30) + starttime = datetime.datetime.now() + d1 = starttime + datetime.timedelta(days=-30) date1 = str(d1) index = date1.find(".") datatime01 = date1[:index] diff --git a/cve-py/downloadtask/__init__.py b/cve-py/downloadtask/__init__.py index e69de29..5af5d40 100644 --- a/cve-py/downloadtask/__init__.py +++ b/cve-py/downloadtask/__init__.py @@ -0,0 +1,3 @@ +""" + Data update provides download tasks +""" \ No newline at end of file diff --git a/cve-py/downloadtask/downloadfiletask.py b/cve-py/downloadtask/downloadfiletask.py index 1656d98..0b2b218 100644 --- a/cve-py/downloadtask/downloadfiletask.py +++ b/cve-py/downloadtask/downloadfiletask.py @@ -9,7 +9,7 @@ import os def handle_one(): """ - download file + download file """ if os.listdir("../newexcels"): shutil.rmtree("../newexcels") @@ -42,7 +42,7 @@ def handle_one(): def handle_two(): """ - download file + download file """ if os.listdir("../mappingexcels"): shutil.rmtree("../mappingexcels") diff --git a/cve-py/emailtask/__init__.py b/cve-py/emailtask/__init__.py index e69de29..375f213 100644 --- a/cve-py/emailtask/__init__.py +++ b/cve-py/emailtask/__init__.py @@ -0,0 +1,3 @@ +""" + Email notification of incorrect data +""" \ No newline at end of file diff --git a/cve-py/emailtask/sendemail.py b/cve-py/emailtask/sendemail.py index b49309e..1c7cf19 100644 --- a/cve-py/emailtask/sendemail.py +++ b/cve-py/emailtask/sendemail.py @@ -9,7 +9,7 @@ from email.mime.application import MIMEApplication def send_email(smtp_host, smtp_port, sendAddr, password, recipientAddrs, subject='', content=''): """ - send email + send email :param smtp_host:smpt.gmail.com :param smtp_port:587 :param sendAddr: @@ -40,13 +40,13 @@ def send_email(smtp_host, smtp_port, sendAddr, password, recipientAddrs, subject smtpSSLClient.ehlo() smtpSSLClient.starttls() loginRes = smtpSSLClient.login(sendAddr, password) - print(f"登录结果:loginRes=", loginRes) + print("登录结果:loginRes=", loginRes) if loginRes and loginRes[0] == 235: - print(f"登录成功,code=[loginRes[0]]") + print("登录成功,code=[loginRes[0]]") smtpSSLClient.sendmail(sendAddr, recipientAddrs, str(msg)) - print(f"mail has been send successfully. message: ", str(msg)) + print("mail has been send successfully. message: ", str(msg)) smtpSSLClient.quit() else: - print(f"登录失败,code= ", loginRes[0]) + print("登录失败,code= ", loginRes[0]) except SystemExit as e: - print(f"发送失败,Exception:e= ", e) + print("发送失败,Exception:e= ", e) diff --git a/cve-py/emailtask/sendingtask.py b/cve-py/emailtask/sendingtask.py index 5eb6e53..a97977c 100644 --- a/cve-py/emailtask/sendingtask.py +++ b/cve-py/emailtask/sendingtask.py @@ -7,7 +7,7 @@ from emailtask import sendemail def sending(): """ - Query all recipients + Query all recipients """ mysql = MysqlConn.Mysql() sql = "select email_name from cve_email_list where email_type=1" diff --git a/cve-py/gitwebtask/__init__.py b/cve-py/gitwebtask/__init__.py index e69de29..9f2d602 100644 --- a/cve-py/gitwebtask/__init__.py +++ b/cve-py/gitwebtask/__init__.py @@ -0,0 +1,3 @@ +""" + The maintainer for crawling yaml data +""" \ No newline at end of file diff --git a/cve-py/gitwebtask/genegroup.py b/cve-py/gitwebtask/genegroup.py index 092ada5..ca5b11b 100644 --- a/cve-py/gitwebtask/genegroup.py +++ b/cve-py/gitwebtask/genegroup.py @@ -8,7 +8,7 @@ import time class Command(object): """ - download sig + download sig """ def __init__(self): diff --git a/cve-py/gitwebtask/yamltask.py b/cve-py/gitwebtask/yamltask.py index e053621..918e527 100644 --- a/cve-py/gitwebtask/yamltask.py +++ b/cve-py/gitwebtask/yamltask.py @@ -9,18 +9,18 @@ import os class Task(object): """ - download task for sig + download task for sig """ def __init__(self): """ - init object + init object """ pass def download(self): """ - @summary: download detail + download detail """ url = "https://gitee.com/openeuler/community/raw/master/sig/sigs.yaml" try: @@ -36,7 +36,7 @@ class Task(object): def read(self): """ - read file + read file """ if os.path.exists("sigs.yaml"): with open("sigs.yaml", "r") as f: diff --git a/cve-py/main.py b/cve-py/main.py index 14529fe..ff3519b 100644 --- a/cve-py/main.py +++ b/cve-py/main.py @@ -5,8 +5,5 @@ from controller import timertaskcontroller if __name__ == '__main__': - """ - main, Program entry - """ timertaskcontroller.timertask() diff --git a/cve-py/tabletask/__init__.py b/cve-py/tabletask/__init__.py index e69de29..8f3049b 100644 --- a/cve-py/tabletask/__init__.py +++ b/cve-py/tabletask/__init__.py @@ -0,0 +1,3 @@ +""" + Interaction between file and mysql data +""" \ No newline at end of file diff --git a/cve-py/tabletask/crawltask.py b/cve-py/tabletask/crawltask.py index 94702b9..33a6d90 100644 --- a/cve-py/tabletask/crawltask.py +++ b/cve-py/tabletask/crawltask.py @@ -7,7 +7,7 @@ from datetime import datetime def crawling(url): """ - Grab cve specific information + Grab cve specific information """ xpthList = [] try: diff --git a/cve-py/tabletask/exceltask.py b/cve-py/tabletask/exceltask.py index 4076b03..77f5319 100644 --- a/cve-py/tabletask/exceltask.py +++ b/cve-py/tabletask/exceltask.py @@ -4,12 +4,12 @@ import xlrd import os import shutil -from xlrd import XLRDError + def crawlUrls(fileName): """ - Read excel table content and CVE score + Read excel table content and CVE score :param fileName: excel file :return urls: list """ @@ -25,14 +25,14 @@ def crawlUrls(fileName): urls.append(url) except IndexError as e: print("下标越界", e) - except XLRDError as e: + except xlrd.XLRDError as e: print("未找到漏洞报告table", e) return urls def crawlCveNum(fileName): """ - CVE number + CVE number :param fileName:excel file :return cveNum:list """ @@ -48,14 +48,14 @@ def crawlCveNum(fileName): cveNum.append(cveNumOne) except IndexError as e: print("下标越界", e) - except XLRDError as e: + except xlrd.XLRDError as e: print("未找到漏洞报告table", e) return cveNum def crawlCveVersion(fileName): """ - CVE version + CVE version :param fileName:excel file :return cveVersion:list """ @@ -69,14 +69,14 @@ def crawlCveVersion(fileName): cveVersion.append(cveVersionOne) except IndexError as e: print("下标越界", e) - except XLRDError as e: + except xlrd.XLRDError as e: print("未找到漏洞报告table", e) return cveVersion def crawlScopeType(fileName): """ - CVE type + CVE type :param fileName:excel file :return scopeType:list """ @@ -90,14 +90,14 @@ def crawlScopeType(fileName): scopeType.append(scopeTypeOne) except IndexError as e: print("下标越界", e) - except XLRDError as e: + except xlrd.XLRDError as e: print("未找到漏洞报告table", e) return scopeType def crawlPackName(fileName): """ - Component + Component :param fileName:excel file :return packName:string """ @@ -111,14 +111,14 @@ def crawlPackName(fileName): packName.append(packNameOne) except IndexError as e: print("下标越界", e) - except XLRDError as e: + except xlrd.XLRDError as e: print("未找到漏洞报告table", e) return packName def move_file(fileName): """ - excel After the analysis is complete, call the function to move to the oldexcels folder for backup + excel After the analysis is complete, call the function to move to the oldexcels folder for backup :param fileName:excel file """ try: diff --git a/cve-py/tabletask/mappingtask.py b/cve-py/tabletask/mappingtask.py index b351ce3..07b8266 100644 --- a/cve-py/tabletask/mappingtask.py +++ b/cve-py/tabletask/mappingtask.py @@ -5,13 +5,12 @@ import xlrd import os import time import shutil -from xlrd import XLRDError from dbConnecttion import MysqlConn def parseExcel(filename): """ - parase excel + parase excel :param filename: excel file :return packName, cpe_packName: string, string """ @@ -28,14 +27,14 @@ def parseExcel(filename): cpe_packName.append(cpePackNameOne) except IndexError as e: print("下标越界", e) - except XLRDError as e: + except xlrd.XLRDError as e: print("未找到映射关系table", e) return packName, cpe_packName def toMysql(): """ - Data stored in the database + Data stored in the database """ files = os.listdir("./mappingexcels") if not files: diff --git a/cve-py/tabletask/runtask.py b/cve-py/tabletask/runtask.py index 7381137..e079e4e 100644 --- a/cve-py/tabletask/runtask.py +++ b/cve-py/tabletask/runtask.py @@ -9,7 +9,7 @@ import os def crawlWeb(): """ - CVSS official website data crawling data storage database + CVSS official website data crawling data storage database """ path = "./newexcels" files = os.listdir(path) diff --git a/cve-py/tabletask/toexcel.py b/cve-py/tabletask/toexcel.py index d234dc8..8343e01 100644 --- a/cve-py/tabletask/toexcel.py +++ b/cve-py/tabletask/toexcel.py @@ -9,7 +9,7 @@ import time def cur_date(): """ - current date + current date :return createTime: string """ createTime = time.strftime("%Y-%m-%d", time.localtime()) @@ -17,17 +17,15 @@ def cur_date(): class MysqlToExcel(object): - """ - Error data is exported from mysql to excel - """ + """Error data is exported from mysql to excel""" def __init__(self): + """Error data is exported from mysql to excel""" self.file_name = './problemexcels/error_data_' + str(cur_date) + ".xls" def get_results(self): - """ - @summary: Query error data - @return results: list + """Query error data + :return results: list """ mysql = Mysql() sql = "select * from cve_origin_excel where cve_status = 3 or cve_status=4 or cve_status=5" @@ -38,9 +36,7 @@ class MysqlToExcel(object): return results def generate_table(self): - """ - Generate excel sheet, File already exists, delete - """ + """Generate excel sheet, File already exists, delete""" if os.path.exists(self.file_name): os.remove(self.file_name) results = self.get_results() -- Gitee From cd2c2e7dc61b3d8a65925dab266ae9bb92005fe3 Mon Sep 17 00:00:00 2001 From: zhangjianjun_code <7844966+zhangjianjun_code@user.noreply.gitee.com> Date: Fri, 23 Oct 2020 15:37:57 +0800 Subject: [PATCH 09/20] Modify the code according to the pr prompt --- cve-py/controller/taskcontroller.py | 1 - cve-py/emailtask/sendemail.py | 4 ++-- cve-py/tabletask/crawltask.py | 6 ++++-- cve-py/tabletask/toexcel.py | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/cve-py/controller/taskcontroller.py b/cve-py/controller/taskcontroller.py index 47fede8..0fe85c0 100644 --- a/cve-py/controller/taskcontroller.py +++ b/cve-py/controller/taskcontroller.py @@ -1,4 +1,3 @@ -#!/usr/bin/python # -*- coding: UTF-8 -*- from tabletask import runtask, mappingtask, toexcel from gitwebtask import genegroup, yamltask diff --git a/cve-py/emailtask/sendemail.py b/cve-py/emailtask/sendemail.py index 1c7cf19..d42aa03 100644 --- a/cve-py/emailtask/sendemail.py +++ b/cve-py/emailtask/sendemail.py @@ -4,7 +4,7 @@ import smtplib import os import email.mime.multipart import email.mime.text -from email.mime.application import MIMEApplication +import email.mime.application as application def send_email(smtp_host, smtp_port, sendAddr, password, recipientAddrs, subject='', content=''): @@ -33,7 +33,7 @@ def send_email(smtp_host, smtp_port, sendAddr, password, recipientAddrs, subject return for fileName in files: try: - part = MIMEApplication(open('./problemexcels/' + fileName, 'rb').read()) + part = application.MIMEApplication(open('./problemexcels/' + fileName, 'rb').read()) part.add_header('Content-Disposition', 'attachment', filename=fileName) msg.attach(part) smtpSSLClient = smtplib.SMTP(smtp_host, smtp_port) diff --git a/cve-py/tabletask/crawltask.py b/cve-py/tabletask/crawltask.py index 33a6d90..6c746f1 100644 --- a/cve-py/tabletask/crawltask.py +++ b/cve-py/tabletask/crawltask.py @@ -8,16 +8,18 @@ from datetime import datetime def crawling(url): """ Grab cve specific information + :param url: string + :return xpthList: list """ xpthList = [] try: content = requests.get(url).content except requests.exceptions.ConnectionError: print('ConnectionError') - return + return [] except requests.exceptions.ChunkedEncodingError: print('ChunkedEncodingError') - return + return [] if content and len(content) > 1: html = etree.HTML(content) try: diff --git a/cve-py/tabletask/toexcel.py b/cve-py/tabletask/toexcel.py index 8343e01..1007c9e 100644 --- a/cve-py/tabletask/toexcel.py +++ b/cve-py/tabletask/toexcel.py @@ -9,7 +9,7 @@ import time def cur_date(): """ - current date + current date :return createTime: string """ createTime = time.strftime("%Y-%m-%d", time.localtime()) -- Gitee From be14e3ddf1a2d063a64e5759543d3408c0037a8e Mon Sep 17 00:00:00 2001 From: zhangjianjun_code <7844966+zhangjianjun_code@user.noreply.gitee.com> Date: Fri, 23 Oct 2020 15:39:44 +0800 Subject: [PATCH 10/20] Modify the code according to the pr prompt --- cve-py/controller/taskcontroller.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cve-py/controller/taskcontroller.py b/cve-py/controller/taskcontroller.py index 0fe85c0..b5a718f 100644 --- a/cve-py/controller/taskcontroller.py +++ b/cve-py/controller/taskcontroller.py @@ -1,4 +1,3 @@ -# -*- coding: UTF-8 -*- from tabletask import runtask, mappingtask, toexcel from gitwebtask import genegroup, yamltask from emailtask import sendingtask -- Gitee From 565466b919c9e0f20f269a62e93d464296249dc8 Mon Sep 17 00:00:00 2001 From: zhangjianjun_code <7844966+zhangjianjun_code@user.noreply.gitee.com> Date: Fri, 23 Oct 2020 16:11:07 +0800 Subject: [PATCH 11/20] Modify the code according to the pr prompt --- cve-py/controller/taskcontroller.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/cve-py/controller/taskcontroller.py b/cve-py/controller/taskcontroller.py index b5a718f..00a618a 100644 --- a/cve-py/controller/taskcontroller.py +++ b/cve-py/controller/taskcontroller.py @@ -1,3 +1,5 @@ +#!/usr/bin/python +# -*- coding: UTF-8 -*- from tabletask import runtask, mappingtask, toexcel from gitwebtask import genegroup, yamltask from emailtask import sendingtask @@ -7,10 +9,9 @@ from deletetask import deletefiletask def toexcelcontroller(): """ - Query the data whose cve_status status is 3 or 4 in the + Query the data whose cve_status status is 3 or 4 in the database to generate excel Modify the status of cve_status to 3 or 4 to 5, indicating that it has been added to excel to be processed - :return:None """ toexcel.MysqlToExcel().generate_table() toexcel.MysqlToExcel().update_status() @@ -20,25 +21,23 @@ def toexcelcontroller(): def runtabletask(): """ - Parse the artificial CVE table, crawl the CVE official + Parse the artificial CVE table, crawl the CVE official website data, and store it in the database - :return:None """ runtask.crawlWeb() def runmappeingtask(): """ - Parse the artificial CVE table, crawl the CVE + Parse the artificial CVE table, crawl the CVE official website data, and store it in the database - :return:None """ mappingtask.toMysql() def gwcontroller(): """ - Grab warehouse yaml data + Grab warehouse yaml data :return:None """ genegroup.Command().handle() @@ -48,7 +47,7 @@ def gwcontroller(): def rundownloadtask(): """ - download files + download files :return:None """ downloadfiletask.handle_one() @@ -57,7 +56,7 @@ def rundownloadtask(): def rundelfiletask(): """ - Delete files older than one month + Delete files older than one month :return:None """ deletefiletask.deldir("./oldexcels") -- Gitee From 9971409ace345c4f13a7bf7bc33fa0710c6269d2 Mon Sep 17 00:00:00 2001 From: zhangjianjun_code <7844966+zhangjianjun_code@user.noreply.gitee.com> Date: Fri, 23 Oct 2020 16:13:41 +0800 Subject: [PATCH 12/20] Modify the code according to the pr prompt --- cve-py/controller/taskcontroller.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/cve-py/controller/taskcontroller.py b/cve-py/controller/taskcontroller.py index 00a618a..92e3156 100644 --- a/cve-py/controller/taskcontroller.py +++ b/cve-py/controller/taskcontroller.py @@ -8,11 +8,9 @@ from deletetask import deletefiletask def toexcelcontroller(): - """ - Query the data whose cve_status status is 3 or 4 in the + """Query the data whose cve_status status is 3 or 4 in the database to generate excel Modify the status of cve_status to 3 or 4 to 5, - indicating that it has been added to excel to be processed - """ + indicating that it has been added to excel to be processed""" toexcel.MysqlToExcel().generate_table() toexcel.MysqlToExcel().update_status() # Send email after successful export of excel @@ -20,10 +18,8 @@ def toexcelcontroller(): def runtabletask(): - """ - Parse the artificial CVE table, crawl the CVE official - website data, and store it in the database - """ + """Parse the artificial CVE table, crawl the CVE official + website data, and store it in the database""" runtask.crawlWeb() -- Gitee From ff470526b61a65c8dea1ea6b1182619b568c97e6 Mon Sep 17 00:00:00 2001 From: zhangjianjun_code <7844966+zhangjianjun_code@user.noreply.gitee.com> Date: Fri, 23 Oct 2020 16:20:21 +0800 Subject: [PATCH 13/20] Modify the code according to the pr prompt --- cve-py/controller/taskcontroller.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/cve-py/controller/taskcontroller.py b/cve-py/controller/taskcontroller.py index 92e3156..75e4f93 100644 --- a/cve-py/controller/taskcontroller.py +++ b/cve-py/controller/taskcontroller.py @@ -8,9 +8,13 @@ from deletetask import deletefiletask def toexcelcontroller(): - """Query the data whose cve_status status is 3 or 4 in the + """ + Query the data whose cve_status status is 3 or 4 in the database to generate excel Modify the status of cve_status to 3 or 4 to 5, - indicating that it has been added to excel to be processed""" + indicating that it has been added to excel to be processed + :return None + """ + toexcel.MysqlToExcel().generate_table() toexcel.MysqlToExcel().update_status() # Send email after successful export of excel @@ -20,6 +24,7 @@ def toexcelcontroller(): def runtabletask(): """Parse the artificial CVE table, crawl the CVE official website data, and store it in the database""" + runtask.crawlWeb() -- Gitee From a644f2f77e02f3fcdac97d6aaefd6a37e5fa3c17 Mon Sep 17 00:00:00 2001 From: zhangjianjun_code <7844966+zhangjianjun_code@user.noreply.gitee.com> Date: Fri, 23 Oct 2020 16:27:05 +0800 Subject: [PATCH 14/20] Modify the code according to the pr prompt --- cve-py/controller/taskcontroller.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cve-py/controller/taskcontroller.py b/cve-py/controller/taskcontroller.py index 75e4f93..e700907 100644 --- a/cve-py/controller/taskcontroller.py +++ b/cve-py/controller/taskcontroller.py @@ -12,7 +12,6 @@ def toexcelcontroller(): Query the data whose cve_status status is 3 or 4 in the database to generate excel Modify the status of cve_status to 3 or 4 to 5, indicating that it has been added to excel to be processed - :return None """ toexcel.MysqlToExcel().generate_table() @@ -24,7 +23,7 @@ def toexcelcontroller(): def runtabletask(): """Parse the artificial CVE table, crawl the CVE official website data, and store it in the database""" - + runtask.crawlWeb() @@ -33,14 +32,15 @@ def runmappeingtask(): Parse the artificial CVE table, crawl the CVE official website data, and store it in the database """ + mappingtask.toMysql() def gwcontroller(): """ Grab warehouse yaml data - :return:None """ + genegroup.Command().handle() yamltask.Task().download() yamltask.Task().read() @@ -49,8 +49,8 @@ def gwcontroller(): def rundownloadtask(): """ download files - :return:None """ + downloadfiletask.handle_one() downloadfiletask.handle_two() @@ -58,6 +58,6 @@ def rundownloadtask(): def rundelfiletask(): """ Delete files older than one month - :return:None """ + deletefiletask.deldir("./oldexcels") -- Gitee From 0441042f52eebf8e29f9fbe402ccb4d032d7a127 Mon Sep 17 00:00:00 2001 From: zhangjianjun_code <7844966+zhangjianjun_code@user.noreply.gitee.com> Date: Fri, 23 Oct 2020 16:29:55 +0800 Subject: [PATCH 15/20] Modify the code according to the pr prompt --- cve-py/controller/taskcontroller.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cve-py/controller/taskcontroller.py b/cve-py/controller/taskcontroller.py index e700907..fa51f9c 100644 --- a/cve-py/controller/taskcontroller.py +++ b/cve-py/controller/taskcontroller.py @@ -12,6 +12,7 @@ def toexcelcontroller(): Query the data whose cve_status status is 3 or 4 in the database to generate excel Modify the status of cve_status to 3 or 4 to 5, indicating that it has been added to excel to be processed + return None """ toexcel.MysqlToExcel().generate_table() @@ -59,5 +60,5 @@ def rundelfiletask(): """ Delete files older than one month """ - + deletefiletask.deldir("./oldexcels") -- Gitee From 1c08d26d3bd1b8ba740aa801df626152cca2f3d6 Mon Sep 17 00:00:00 2001 From: zhangjianjun_code <7844966+zhangjianjun_code@user.noreply.gitee.com> Date: Fri, 23 Oct 2020 16:37:43 +0800 Subject: [PATCH 16/20] Modify the code according to the pr prompt --- cve-py/controller/taskcontroller.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/cve-py/controller/taskcontroller.py b/cve-py/controller/taskcontroller.py index fa51f9c..3a25fc1 100644 --- a/cve-py/controller/taskcontroller.py +++ b/cve-py/controller/taskcontroller.py @@ -22,8 +22,11 @@ def toexcelcontroller(): def runtabletask(): - """Parse the artificial CVE table, crawl the CVE official - website data, and store it in the database""" + """ + Parse the artificial CVE table, crawl the CVE official + website data, and store it in the database + return None + """ runtask.crawlWeb() @@ -32,6 +35,7 @@ def runmappeingtask(): """ Parse the artificial CVE table, crawl the CVE official website data, and store it in the database + return None """ mappingtask.toMysql() @@ -40,6 +44,7 @@ def runmappeingtask(): def gwcontroller(): """ Grab warehouse yaml data + return None """ genegroup.Command().handle() @@ -50,6 +55,7 @@ def gwcontroller(): def rundownloadtask(): """ download files + return None """ downloadfiletask.handle_one() @@ -59,6 +65,7 @@ def rundownloadtask(): def rundelfiletask(): """ Delete files older than one month + return None """ deletefiletask.deldir("./oldexcels") -- Gitee From 7130f7faacaa8f76009cee5528f463eb7d796a1e Mon Sep 17 00:00:00 2001 From: zhangjianjun_code <7844966+zhangjianjun_code@user.noreply.gitee.com> Date: Fri, 23 Oct 2020 16:46:27 +0800 Subject: [PATCH 17/20] Modify the code according to the pr prompt --- cve-py/controller/taskcontroller.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/cve-py/controller/taskcontroller.py b/cve-py/controller/taskcontroller.py index 3a25fc1..5c38c3c 100644 --- a/cve-py/controller/taskcontroller.py +++ b/cve-py/controller/taskcontroller.py @@ -8,13 +8,6 @@ from deletetask import deletefiletask def toexcelcontroller(): - """ - Query the data whose cve_status status is 3 or 4 in the - database to generate excel Modify the status of cve_status to 3 or 4 to 5, - indicating that it has been added to excel to be processed - return None - """ - toexcel.MysqlToExcel().generate_table() toexcel.MysqlToExcel().update_status() # Send email after successful export of excel -- Gitee From 1b88e1b92f4ffef399139285bc93eb66b6f7693c Mon Sep 17 00:00:00 2001 From: zhangjianjun_code <7844966+zhangjianjun_code@user.noreply.gitee.com> Date: Fri, 23 Oct 2020 16:50:37 +0800 Subject: [PATCH 18/20] Modify the code according to the pr prompt --- cve-py/controller/taskcontroller.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cve-py/controller/taskcontroller.py b/cve-py/controller/taskcontroller.py index 5c38c3c..b840ad1 100644 --- a/cve-py/controller/taskcontroller.py +++ b/cve-py/controller/taskcontroller.py @@ -8,6 +8,12 @@ from deletetask import deletefiletask def toexcelcontroller(): + """ + Query the data whose cve_status status is 3 or 4 in the + database to generate excel Modify the status of cve_status to 3 or 4 to 5, + indicating that it has been added to excel to be processed + return None + """ toexcel.MysqlToExcel().generate_table() toexcel.MysqlToExcel().update_status() # Send email after successful export of excel @@ -20,7 +26,6 @@ def runtabletask(): website data, and store it in the database return None """ - runtask.crawlWeb() -- Gitee From 2fc1b57aa41a3e665fc881df03aa5d5fc852f3b5 Mon Sep 17 00:00:00 2001 From: zhangjianjun_code <7844966+zhangjianjun_code@user.noreply.gitee.com> Date: Fri, 23 Oct 2020 17:07:16 +0800 Subject: [PATCH 19/20] Modify the code according to the pr prompt --- cve-py/controller/taskcontroller.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/cve-py/controller/taskcontroller.py b/cve-py/controller/taskcontroller.py index b840ad1..f117459 100644 --- a/cve-py/controller/taskcontroller.py +++ b/cve-py/controller/taskcontroller.py @@ -1,5 +1,18 @@ #!/usr/bin/python # -*- coding: UTF-8 -*- + +################################################################################ +# +# Copyright (c) 2020 openEuler.org, Inc. All Rights Reserved +# +################################################################################ +""" +Control task + +Authors: xiaojianghui +Date: 10/22/2020 11:01 AM +""" + from tabletask import runtask, mappingtask, toexcel from gitwebtask import genegroup, yamltask from emailtask import sendingtask @@ -12,11 +25,12 @@ def toexcelcontroller(): Query the data whose cve_status status is 3 or 4 in the database to generate excel Modify the status of cve_status to 3 or 4 to 5, indicating that it has been added to excel to be processed - return None + + Returns: + return None """ toexcel.MysqlToExcel().generate_table() toexcel.MysqlToExcel().update_status() - # Send email after successful export of excel sendingtask.sending() -- Gitee From a04ec1eeb2e6dc92558f21b2b10c26252e91dc82 Mon Sep 17 00:00:00 2001 From: zhangjianjun_code <7844966+zhangjianjun_code@user.noreply.gitee.com> Date: Fri, 23 Oct 2020 17:17:32 +0800 Subject: [PATCH 20/20] Modify the code according to the pr prompt --- cve-py/controller/taskcontroller.py | 2 +- cve-py/controller/timertaskcontroller.py | 14 +++++++++++++- cve-py/dbConnecttion/Config.py | 12 ++++++++++++ cve-py/dbConnecttion/MysqlConn.py | 14 ++++++++++++++ cve-py/deletetask/deletefiletask.py | 13 +++++++++++++ cve-py/downloadtask/downloadfiletask.py | 12 ++++++++++++ cve-py/emailtask/sendemail.py | 13 +++++++++++++ cve-py/emailtask/sendingtask.py | 13 +++++++++++++ cve-py/gitwebtask/genegroup.py | 13 +++++++++++++ cve-py/gitwebtask/yamltask.py | 13 +++++++++++++ cve-py/main.py | 15 +++++++++++++++ cve-py/tabletask/crawltask.py | 13 +++++++++++++ cve-py/tabletask/exceltask.py | 12 ++++++++++++ cve-py/tabletask/mappingtask.py | 12 ++++++++++++ cve-py/tabletask/runtask.py | 12 ++++++++++++ cve-py/tabletask/toexcel.py | 13 +++++++++++++ 16 files changed, 194 insertions(+), 2 deletions(-) diff --git a/cve-py/controller/taskcontroller.py b/cve-py/controller/taskcontroller.py index f117459..b27da1b 100644 --- a/cve-py/controller/taskcontroller.py +++ b/cve-py/controller/taskcontroller.py @@ -25,7 +25,7 @@ def toexcelcontroller(): Query the data whose cve_status status is 3 or 4 in the database to generate excel Modify the status of cve_status to 3 or 4 to 5, indicating that it has been added to excel to be processed - + Returns: return None """ diff --git a/cve-py/controller/timertaskcontroller.py b/cve-py/controller/timertaskcontroller.py index 54b91d2..c05136e 100644 --- a/cve-py/controller/timertaskcontroller.py +++ b/cve-py/controller/timertaskcontroller.py @@ -1,13 +1,25 @@ #!/usr/bin/python # -*- coding: UTF-8 -*- +################################################################################ +# +# Copyright (c) 2020 openEuler.org, Inc. All Rights Reserved +# +################################################################################ +""" +Control task + +Authors: xiaojianghui +Date: 10/22/2020 11:01 AM +""" + import apscheduler.schedulers.blocking as blocking from controller import taskcontroller def timertask(): """ - Scheduled tasks summary + Scheduled tasks summary :return:None """ try: diff --git a/cve-py/dbConnecttion/Config.py b/cve-py/dbConnecttion/Config.py index 69e91d8..c34dfa8 100644 --- a/cve-py/dbConnecttion/Config.py +++ b/cve-py/dbConnecttion/Config.py @@ -1,6 +1,18 @@ #!/usr/bin/python # -*- coding: UTF-8 -*- +################################################################################ +# +# Copyright (c) 2020 openEuler.org, Inc. All Rights Reserved +# +################################################################################ +""" +Database configuration file + +Authors: xiaojianghui +Date: 10/22/2020 11:01 AM +""" + import os DBHOST = os.getenv("DB_URI") diff --git a/cve-py/dbConnecttion/MysqlConn.py b/cve-py/dbConnecttion/MysqlConn.py index b43b027..4166d37 100644 --- a/cve-py/dbConnecttion/MysqlConn.py +++ b/cve-py/dbConnecttion/MysqlConn.py @@ -1,6 +1,20 @@ #!/usr/bin/python # -*- coding: UTF-8 -*- +################################################################################ +# +# Copyright (c) 2020 openEuler.org, Inc. All Rights Reserved +# +################################################################################ +""" +1. When executing SQL with parameters, please use sql statement to specify the list of conditions that need to be entered, and then use tuple/list for conditional batch allocation +2. There is no need to use quotation marks to specify the data type in the format SQL, and the system will automatically recognize it according to the input parameters +3. There is no need to use conversion function in the input value, the system will automatically handle it + +Authors: xiaojianghui +Date: 10/22/2020 11:01 AM +""" + import pymysql from pymysql import cursors from DBUtils import PooledDB diff --git a/cve-py/deletetask/deletefiletask.py b/cve-py/deletetask/deletefiletask.py index 49dcf46..275463d 100644 --- a/cve-py/deletetask/deletefiletask.py +++ b/cve-py/deletetask/deletefiletask.py @@ -1,5 +1,18 @@ #!/usr/bin/python # -*- coding: UTF-8 -*- + +################################################################################ +# +# Copyright (c) 2020 openEuler.org, Inc. All Rights Reserved +# +################################################################################ +""" +Clear historical files regularly + +Authors: xiaojianghui +Date: 10/22/2020 11:01 AM +""" + import datetime import os import time diff --git a/cve-py/downloadtask/downloadfiletask.py b/cve-py/downloadtask/downloadfiletask.py index 0b2b218..37ebd93 100644 --- a/cve-py/downloadtask/downloadfiletask.py +++ b/cve-py/downloadtask/downloadfiletask.py @@ -1,6 +1,18 @@ #!/usr/bin/python # -*- coding: UTF-8 -*- +################################################################################ +# +# Copyright (c) 2020 openEuler.org, Inc. All Rights Reserved +# +################################################################################ +""" +Data update provides download tasks + +Authors: xiaojianghui +Date: 10/22/2020 11:01 AM +""" + import requests import lxml.etree as etree import shutil diff --git a/cve-py/emailtask/sendemail.py b/cve-py/emailtask/sendemail.py index d42aa03..2ddc744 100644 --- a/cve-py/emailtask/sendemail.py +++ b/cve-py/emailtask/sendemail.py @@ -1,5 +1,18 @@ #!/usr/bin/python # -*- coding: UTF-8 -*- + +################################################################################ +# +# Copyright (c) 2020 openEuler.org, Inc. All Rights Reserved +# +################################################################################ +""" +Email notification of incorrect data + +Authors: xiaojianghui +Date: 10/22/2020 11:01 AM +""" + import smtplib import os import email.mime.multipart diff --git a/cve-py/emailtask/sendingtask.py b/cve-py/emailtask/sendingtask.py index a97977c..7fc2318 100644 --- a/cve-py/emailtask/sendingtask.py +++ b/cve-py/emailtask/sendingtask.py @@ -1,5 +1,18 @@ #!/usr/bin/python # -*- coding: UTF-8 -*- + +################################################################################ +# +# Copyright (c) 2020 openEuler.org, Inc. All Rights Reserved +# +################################################################################ +""" +Email notification of incorrect data + +Authors: xiaojianghui +Date: 10/22/2020 11:01 AM +""" + import os from dbConnecttion import MysqlConn from emailtask import sendemail diff --git a/cve-py/gitwebtask/genegroup.py b/cve-py/gitwebtask/genegroup.py index ca5b11b..52c7054 100644 --- a/cve-py/gitwebtask/genegroup.py +++ b/cve-py/gitwebtask/genegroup.py @@ -1,5 +1,18 @@ #!/usr/bin/python # -*- coding: UTF-8 -*- + +################################################################################ +# +# Copyright (c) 2020 openEuler.org, Inc. All Rights Reserved +# +################################################################################ +""" +The maintainer for crawling yaml data + +Authors: xiaojianghui +Date: 10/22/2020 11:01 AM +""" + import requests import lxml.etree as etree import dbConnecttion.MysqlConn as MysqlConn diff --git a/cve-py/gitwebtask/yamltask.py b/cve-py/gitwebtask/yamltask.py index 918e527..68a32e9 100644 --- a/cve-py/gitwebtask/yamltask.py +++ b/cve-py/gitwebtask/yamltask.py @@ -1,5 +1,18 @@ #!/usr/bin/python # -*- coding: UTF-8 -*- + +################################################################################ +# +# Copyright (c) 2020 openEuler.org, Inc. All Rights Reserved +# +################################################################################ +""" +The maintainer for crawling yaml data + +Authors: xiaojianghui +Date: 10/22/2020 11:01 AM +""" + import yaml import requests from dbConnecttion import MysqlConn diff --git a/cve-py/main.py b/cve-py/main.py index ff3519b..c5e916b 100644 --- a/cve-py/main.py +++ b/cve-py/main.py @@ -1,6 +1,21 @@ #!/usr/bin/python # -*- coding: UTF-8 -*- +################################################################################ +# +# Copyright (c) 2020 openEuler.org, Inc. All Rights Reserved +# +################################################################################ +""" + +1. Process manual excel data; +2. Crawling the maintainer of the warehouse; +3. Initialize the database file; + +Authors: xiaojianghui +Date: 10/22/2020 11:01 AM +""" + from controller import timertaskcontroller diff --git a/cve-py/tabletask/crawltask.py b/cve-py/tabletask/crawltask.py index 6c746f1..b7653a3 100644 --- a/cve-py/tabletask/crawltask.py +++ b/cve-py/tabletask/crawltask.py @@ -1,5 +1,18 @@ #!/usr/bin/python # -*- coding: UTF-8 -*- + +################################################################################ +# +# Copyright (c) 2020 openEuler.org, Inc. All Rights Reserved +# +################################################################################ +""" +Interaction between file and mysql data + +Authors: xiaojianghui +Date: 10/22/2020 11:01 AM +""" + import requests from lxml import etree from datetime import datetime diff --git a/cve-py/tabletask/exceltask.py b/cve-py/tabletask/exceltask.py index 77f5319..7fe3e32 100644 --- a/cve-py/tabletask/exceltask.py +++ b/cve-py/tabletask/exceltask.py @@ -1,6 +1,18 @@ #!/usr/bin/python # -*- coding: UTF-8 -*- +################################################################################ +# +# Copyright (c) 2020 openEuler.org, Inc. All Rights Reserved +# +################################################################################ +""" +Interaction between file and mysql data + +Authors: xiaojianghui +Date: 10/22/2020 11:01 AM +""" + import xlrd import os import shutil diff --git a/cve-py/tabletask/mappingtask.py b/cve-py/tabletask/mappingtask.py index 07b8266..b2cccda 100644 --- a/cve-py/tabletask/mappingtask.py +++ b/cve-py/tabletask/mappingtask.py @@ -1,6 +1,18 @@ #!/usr/bin/python # -*- coding: UTF-8 -*- +################################################################################ +# +# Copyright (c) 2020 openEuler.org, Inc. All Rights Reserved +# +################################################################################ +""" +Interaction between file and mysql data + +Authors: xiaojianghui +Date: 10/22/2020 11:01 AM +""" + import xlrd import os import time diff --git a/cve-py/tabletask/runtask.py b/cve-py/tabletask/runtask.py index e079e4e..d35d050 100644 --- a/cve-py/tabletask/runtask.py +++ b/cve-py/tabletask/runtask.py @@ -1,6 +1,18 @@ #!/usr/bin/python # -*- coding: UTF-8 -*- +################################################################################ +# +# Copyright (c) 2020 openEuler.org, Inc. All Rights Reserved +# +################################################################################ +""" +Interaction between file and mysql data + +Authors: xiaojianghui +Date: 10/22/2020 11:01 AM +""" + from tabletask import exceltask, crawltask from dbConnecttion.MysqlConn import Mysql import time diff --git a/cve-py/tabletask/toexcel.py b/cve-py/tabletask/toexcel.py index 1007c9e..e059b26 100644 --- a/cve-py/tabletask/toexcel.py +++ b/cve-py/tabletask/toexcel.py @@ -1,6 +1,19 @@ #!/usr/bin/python # -*- coding: UTF-8 -*- + +################################################################################ +# +# Copyright (c) 2020 openEuler.org, Inc. All Rights Reserved +# +################################################################################ +""" +Interaction between file and mysql data + +Authors: xiaojianghui +Date: 10/22/2020 11:01 AM +""" + import os import xlwt from dbConnecttion.MysqlConn import Mysql -- Gitee