!38 修改3.8-3.12发现的issue

From: @tushenmei
Reviewed-by: @solarhu
Signed-off-by: @solarhu
This commit is contained in:
openeuler-ci-bot 2021-03-12 20:53:34 +08:00 committed by Gitee
commit 1ab3b3981b
3 changed files with 314 additions and 151 deletions

436
README.md
View File

@ -1,176 +1,328 @@
[English](./README-en.md) | 简体中文
# pkgship
<!-- TOC -->
- [pkgship](#pkgship)
- [介绍](#介绍)
- [架构](#架构)
- [软件下载](#软件下载)
- [运行环境](#运行环境)
- [安装工具](#安装工具)
- [配置参数](#配置参数)
- [服务启动和停止](#服务启动和停止)
- [工具使用](#工具使用)
<!-- /TOC -->
## 介绍
pkgship是一款管理OS软件包依赖关系提供依赖和被依赖关系的完整图谱查询工具pkgship提供软件包依赖生命周期补丁查询等功能。
1. 软件包依赖:方便社区人员在新引入、软件包更新和删除的时候能方便的了解软件的影响范围。
2. 生命周期管理跟踪upstream软件包发布状态方便维护人员了解当前软件状态及时升级到合理的版本。
3. 补丁查询方便社区人员了解openEuler软件包的补丁情况方便的提取补丁内容
pkgship是一款管理OS软件包依赖关系提供依赖和被依赖关系完整图谱的查询工具pkgship提供软件包依赖查询、生命周期管理、补丁查询等功能。
1. 软件包依赖查询:方便社区人员在软件包引入、更新和删除的时候了解软件的影响范围。
2. 补丁查询方便社区人员了解openEuler软件包的补丁情况以及提取补丁内容详细内容请参见[patch-tracking](../patch-tracking/README.md)。
### 软件架构
系统采用flask-restful开发使用SQLAlchemy ORM查询框架同时支持mysql和sqlite数据库通过配置文件的形式进行更改
## 架构
系统采用flask-restful开发
安装教程
---
#### 方法一: 可以使用dnf挂载pkgship软件在所在repo源直接下载安装pkgship及其依赖
![avatar](./doc/design/pkgimg/packagemanagement.JPG)
## 软件下载
* Repo源挂载正式发布地址<https://repo.openeuler.org/>
* 源码获取地址:<https://gitee.com/openeuler/pkgship>
* rpm包版本获取地址<https://117.78.1.88/project/show/openEuler:Mainline>
## 运行环境
* 可用内存700M以上
* python版本 3.8及以上
* Elasticsearch 版本7.10.1
* Redis
## 安装工具
**1、pkgship工具安装**
工具安装可通过以下两种方式中的任意一种实现。
* 方法一通过dnf挂载repo源实现。
先使用dnf挂载pkgship软件在所在repo源具体方法可参考[应用开发指南](https://openeuler.org/zh/docs/20.09/docs/ApplicationDev/%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87.html)然后执行如下指令下载以及安装pkgship及其依赖。
```bash
dnf install pkgship
```
* 方法二通过安装rpm包实现。
先下载pkgship的rpm包然后执行如下命令进行安装其中“x.x-x”表示版本号请用实际情况代替
```bash
rpm -ivh pkgship-x.x-x.oe1.noarch.rpm
```
或者
```bash
dnf install pkgship-x.x-x.oe1.noarch.rpm
```
**2、Elasticsearch和Redis安装**
如果环境没有安装Elasticsearch或者Redis可以在pkgship安装之后执行自动化安装脚本。
脚本路径默认为:
```
dnf install pkgship(版本号)
/etc/pkgship/auto_install_pkgship_requires.sh
```
#### 方法二: 可以直接下载pkgship的rpm包后安装软件包
执行方法为
```
rpm -ivh pkgship.rpm
```
或者
```
dnf install pkgship-(版本号)
/bin/bash auto_install_pkgship_requires.sh elasticsearch
```
系统配置
---
系统的默认配置文件存放在 /etc/pkgship/packge.ini请根据实际情况进行配置更改
或者
```
/bin/bash auto_install_pkgship_requires.sh redis
```
## 配置参数
1.在配置文件中对相应参数进行配置,系统的默认配置文件存放在 /etc/pkgship/packge.ini请根据实际情况进行配置更改。
```
vim /etc/pkgship/package.ini
```
创建初始化数据库的yaml配置文件:
conf.yaml 文件默认存放在 /etc/pkgship/ 路径下pkgship会通过该配置读取要建立的数据库名称以及需要导入的sqlite文件。conf.yaml 示例如下:
```ini
[SYSTEM-系统配置]
; 初始化数据库时导入的yaml文件存放位置该yaml中记录导入的sqlite文件位置。
init_conf_path=/etc/pkgship/conf.yaml
; 数据库端口。
query_port=8090
; 数据库ip地址。
query_ip_addr=127.0.0.1
; 远程服务的地址,命令行可以直接调用远程服务来完成数据请求。
remote_host=https://api.openeuler.org/pkgmanage
; 初始化和下载临时文件存放目录不会长时间占用建议可用空间至少1G。
temporary_directory=/opt/pkgship/tmp/
[LOG-日志]
; 业务日志存放路径。
log_path=/var/log/pkgship/
; 打印日志级别,支持如下:
; INFO DEBUG WARNING ERROR CRITICAL
log_level=INFO
; 单个业务日志文件最大容量超过该值会自动压缩转储默认为30M
max_bytes=31457280
; 备份日志保留的最大数量默认为30
backup_count=30
[UWSGI-Web服务器配置]
; 操作日志路径。
daemonize=/var/log/pkgship-operation/uwsgi.log
; 前后端传输数据大小。
buffer-size=65536
; 网络连接超时时间。
http-timeout=600
; 服务响应时间。
harakiri=600
[REDIS-缓存配置]
; Redis缓存服务器的地址可以是已发布的可以正常访问的域或IP地址。
;链接地址默认为127.0.0.1
redis_host=127.0.0.1
;Redis缓存服务器的端口默认为6379
redis_port=6379
;Redis服务器一次允许的最大连接数
redis_max_connections=10
[DATABASE-数据库]
;数据库访问地址,默认为本机地址
database_host=127.0.0.1
;数据库访问端口默认为9200
database_port=9200
```
- dbname:openEuler-20.03-LTS
src_db_file:
- /etc/pkgship/src.sqlite
bin_db_file:
- /etc/pkgship/bin.sqlite
status:enable
priority:1
2.创建初始化数据库的yaml配置文件
conf.yaml 文件默认存放在 /etc/pkgship/ 路径下pkgship会通过该配置读取要建立的数据库名称以及需要导入的sqlite文件也支持配置sqlite文件所在的repo地址。conf.yaml 示例如下所示。
```yaml
dbname: openEuler-20.03 #数据库名称
src_db_file: /etc/pkgship/repo/openEuler-20.09/src #源码包所在的本地路径
bin_db_file: /etc/pkgship/repo/openEuler-20.09/bin #二进制包所在的本地路径
priority: 1 #数据库优先级
dbname: openEuler-20.09
src_db_file: https://repo.openeuler.org/openEuler-20.09/source #源码包所在的repo源
bin_db_file: https://repo.openeuler.org/openEuler-20.09/everything/aarch64 #二进制包所在的repo源
priority: 2
```
如需更改存放路径请更改package.ini下的 init_conf_path 选项
服务启动和停止
---
pkgship使用uWSGI web服务器
```
pkgshipd start
> 如需更改存放路径请更改package.ini下的 init_conf_path 选项。
>
> 不支持直接配置sqlite文件路径。
pkgshipd stop
```
使用说明
---
#### 1. 数据库初始化
```
pkgship init
```
#### 2. 单包查询
## 服务启动和停止
pkgship启动和停止方式有两种systemctl方式和pkgshipd方式其中systemctl方式启动可以有异常停止自启动的机制。两种方式的执行命令为
查询源码包(sourceName)在所有数据库中的信息
```
pkgship single sourceName
```
查询当前包(sourceName)在指定数据库(dbName)中的信息
```
pkgship single sourceName -db dbName
```
#### 3. 查询所有包
查询所有数据库下包含的所有包的信息
```
pkgship list
```
查询指定数据库(dbName)下的所有包的信息
```
pkgship list -db dbName
```
#### 4. 安装依赖查询
查询二进制包(binaryName)的安装依赖,按照默认优先级查询数据库
```
pkgship installdep binaryName
```
在指定数据库(dbName)下查询二进制包(binaryName)的所有安装依赖
按照先后顺序指定数据库查询的优先级
```
pkgship installdep binaryName -dbs dbName1 dbName2...
```
#### 5. 编译依赖查询
查询源码包(sourceName)的所有编译依赖,按照默认优先级查询数据库
```
pkgship builddep sourceName
```
在指定数据库(dbName)下查询源码包(sourceName)的所有安装依赖
按照先后顺序指定数据库查询的优先级
```
pkgship builddep sourceName -dbs dbName1 dbName2...
```
#### 6. 自编译自安装依赖查询
查询二进制包(binaryName)的安装和编译依赖,按照默认优先级查询数据库
```
pkgship selfbuild binaryName
```
查询源码包(sourceName )的安装和编译依赖,按照默认优先级查询数据库
```
pkgship selfbuild sourceName -t source
```
其他参数:
```shell
systemctl start pkgship.service 启动服务
-dbs 指定数据库优先级.
```
示例:pkgship selfbuild binaryName -dbs dbName1 dbName2
```
-s 是否查询自编译依赖
默认为0不查询自编译依赖可以指定0或1(表示查询自编译)
```
查询自编译示例:pkgship selfbuild sourceName -t source -s 1
```
-w 是否查询对应包的子包.默认为0不查询对应子包可以指定 0或1(表示查询对应子包)
```
查询子包示例:pkgship selfbuild binaryName -w 1
```
#### 7. 被依赖查询
查询源码包(sourceName)在某数据库(dbName)中被哪些包所依赖
查询结果默认不包含对应二进制包的子包
```
pkgship bedepend sourceName -db dbName
```
使查询结果包含二进制包的子包 加入参数 -w
```
pkgship bedepend sourceName -db dbName -w 1
```
#### 8. 修改包信息记录
变更数据库中(dbName)源码包(sourceName)的maintainer为Newmaintainer
```
pkgship updatepkg sourceName db dbName -m Newmaintainer
```
变更数据库中(dbName)源码包(sourceName)的maintainlevel为Newmaintainlevel值在14之间
```
pkgship updatepkg sourceName db dbName -l Newmaintainlevel
```
同时变更数据库中(dbName)源码包(sourceName)的maintainer 为Newmaintainer和变更maintainlevel为Newmaintainlevel
```
pkgship updatepkg sourceName db dbName -m Newmaintainer -l Newmaintainlevel
```
#### 9. 删除数据库
删除指定数据库(dbName)
```
pkgship rm db dbName
systemctl stop pkgship.service 停止服务
systemctl restart pkgship.service 重启服务
```
参与贡献
---
我们非常欢迎新贡献者加入到项目中来,也非常高兴能为新加入贡献者提供指导和帮助。在您贡献代码前,需要先签署[CLA](https://openeuler.org/en/cla.html)。
```sh
pkgshipd start 启动服务
1. Fork 本仓库
2. 新建 Feat_xxx 分支
3. 提交代码
4. 新建 Pull Request
pkgshipd stop 停止服务
```
> 每次起停周期内仅支持一种方式,不允许两种操作同时使用。
>
> pkgshipd启动方式只允许在pkgshipduser用户下操作。
### 会议记录
1. 2020.5.18https://etherpad.openeuler.org/p/aHIX4005bTY1OHtOd_Zc
## 工具使用
1. 数据库初始化。
> 使用场景服务启动后为了能查询对应的数据库比如openEuler-20.09 openEuler-21.03中的包信息及包依赖关系需要将这些数据库通过createrepo生成的sqlite分为源码库和二进制库导入进服务内生成对应的包信息json体然后插入Elasticsearch对应的数据库中。数据库名为根据config.yaml中配置的dbname生成的dbname-source/binary[-filepath]为可选参数。
```bash
pkgship init [-filepath path]
```
> 参数说明:
> -filepath指定初始化配置文件config.yaml的路径可以使用相对路径和绝对路径不带参数则使用默认配置初始化。
2. 单包查询。
用户可查询源码包或者二进制包(packagename)在指定数据库表database中的具体信息。
> 使用场景用户可查询源码包或者二进制包在指定数据库中的具体信息packagename,database为必选参数,-s为可选参数。
```bash
pkgship pkginfo $packageName $database [-s]
```
> 参数说明:
> packagename指定要查询的软件包名。
> database指定具体的数据库名称。
>
> -s: 指定`-s`将查询的是`src`源码包信息;若未指定 默认查询`bin`二进制包信息
3. 所有包查询。
查询数据库下包含的所有包的信息。
> 使用场景用户可查询指定数据库下包含的所有软件包信息。其中tablename为必选参数-s为可选参数。
```bash
pkgship list $database [-s]
```
> 参数说明:
> database指定具体的数据库名称。
> -s: 指定`-s`将查询的是`src`源码包信息;若未指定 默认查询`bin`二进制包信息
4. 安装依赖查询。
查询二进制包(binaryName)的安装依赖。
> 使用场景用户需要安装某个二进制包A时需要将该二进制包A的安装依赖B及B的安装依赖C等等直至所有的安装依赖全部安装到系统才能成功安装二进制包A。因此在用户安装二进制包A之前可能会需要查询二进制包A的所有安装依赖。该命令提供了此功能允许用户根据平台默认的优先级在多个数据库之间进行查询同时也支持用户自定义数据库查询优先级。
```bash
pkgship installdep [$binaryName $binaryName1 $binaryName2...] [-dbs] [db1 db2...] [-level] $level
```
> 参数说明:
> binaryName需要查询安装的依赖的二进制包名字,支持传多个;必传参数。
>
> -dbs 指定需要查询的database优先级,不传按照系统默认优先级搜索;可选参数。
>
> -level指定需要查询的依赖层级,不传默认为0查询所有层级可选参数。
5. 编译依赖查询。
查询源码包(sourceName)的所有编译依赖。
> 使用场景用户要编译某个源码包A的时候需要安装源码包A的编译依赖B, 要成功安装编译依赖B需要获取B的所有安装依赖。因此在用户编译源码包A之前可能会需要查询源码包的编译依赖以及这些编译依赖的所有安装依赖。该命令提供了此功能允许用户根据平台默认的优先级在多个数据库之间进行查询;同时也支持用户自定义数据库查询优先级。
```bash
pkgship builddep [$sourceName $sourceName1 $sourceName2..] -dbs [db1 db2 ..] [-level] $level
```
> 参数说明:
> sourceName需要查询编译依赖的源码包名字,支持多个查询;必传参数。
>
> -dbs 指定需要查询的database优先级,不传按照系统默认优先级搜索;可选参数。
>
> -level指定需要查询的依赖层级,不传默认为0查询所有层级可选参数。
6. 自编译自安装依赖查询。
查询指定二进制包(binaryName)或源码包(sourceName )的安装及编译依赖,其中[pkgName]为查询的二进制包或者源码包的名称。当查询二进制包时,可以查询到该二进制包的所有安装依赖以及该二进制包对应的源码包的编译依赖,及这些编译依赖的所有安装依赖;当查询源码包时,可以查询该源码包的编译依赖,及这些编译依赖的所有安装依赖,并且查询该源码包生成的所有二进制包的所有安装依赖。同时,配合对应参数使用,该命令也支持查询软件包的自编译依赖查询,和包含子包的依赖查询。
> 使用场景:如果开发者想在现有的版本库的基础上引入新的软件包,应同时引入该软件包的所有编译、安装依赖。该命令提供开发者一个同时查询这两种依赖关系的功能,能让开发者知晓该软件包会引入哪些其他的包,该命令支持查询二进制包和源码包。
```bash
pkgship selfdepend [$pkgName1 $pkgName2 $pkgName3 ..] [-dbs] [db1 db2..] [-b] [-s] [-w]
```
> 参数说明:
>
> pkgName需要查询安装的依赖的二进制包名字,支持传多个;必传参数。
>
> -dbs 指定需要查询的database优先级,不传按照系统默认优先级搜索;可选参数。
>
> -b指定`-b`表示查询的包是二进制,不指定默认查询源码包;可选参数。
>
> -s 指定-s表示查询软件包的所有安装依赖和所有编译依赖即编译依赖的源码包的编译依赖以及所有编译依赖的安装依赖如果不增加-s参数表示只查询软件包的所有安装依赖和一层编译依赖以及一层编译依赖的所有安装依赖可选参数。
>
> -w指定-s表示引入某个二进制包的时候查询结果会显示出该二进制包对应的源码包以及该源码包生成的所有二进制包如果不指定-w参数表示引入某个二进制包的时候查询结果只显示对应的源码包可选参数。
7. 被依赖查询。
查询源码包(sourceName)在某数据库(dbName)中被哪些包所依赖。
> 使用场景针对软件源码包A在升级或删除的情况下会影响哪些软件包可通过该命令查询。该命令会显示源码包A生成的所有二进制包被哪些源码包比如B编译依赖被哪些二进制包比如C1安装依赖以及B生成的二进制包及C1被哪些源码包比如D编译依赖被哪些二进制包比如E1安装依赖以此类推遍历这些二进制包的被依赖。
```bash
pkgship bedepend dbName [$pkgName1 $pkgName2 $pkgName3] [-w] [-b] [-install/build]
```
> 参数说明:
>
> dbName需要查询依赖关系的仓库不支持多个必选参数。
>
> -w :当不指定-w 时,查询结果默认不包含对应二进制包的子包;当命令后指定配置参数[-w] 时不仅会查询二进制包C1的被依赖关系还会进一步去查询C1对应的源码包C生成的其他二进制包比如C2,C3的被依赖关系可选参数。
>
> -b指定`-b`表示查询的包是二进制,默认查询源码包;可选参数。
>
> -install/build指定`-install`表示查询的是安装被依赖,指定`-build`表示查询的是编译被依赖,默认查全部, 不能`-install``-build`同时存在;可选参数。
8. 数据库信息。
> 使用场景查看Elasticsearch中初始化了哪些数据库该功能会按照优先级顺序返回已经初始化的数据库列表。
`pkgship db`
9. 获取版本号。
> 使用场景获取pkgship软件的版本号。
`pkgship -v`

Binary file not shown.

View File

@ -1,6 +1,6 @@
Name: pkgship
Version: 2.1.0
Release: 4
Release: 6
Summary: Pkgship implements rpm package dependence ,maintainer, patch query and so no.
License: Mulan 2.0
URL: https://gitee.com/openeuler/pkgship
@ -8,17 +8,17 @@ Source0: https://gitee.com/openeuler/pkgship-%{version}.tar.gz
BuildArch: noarch
BuildRequires: shadow
BuildRequires: shadow python3-mock
BuildRequires: python3-flask-restful python3-flask python3 python3-pyyaml python3-redis
BuildRequires: python3-prettytable python3-requests python3-retrying python3-coverage
BuildRequires: python3-marshmallow python3-uWSGI python3-gevent python3-Flask-Limiter
BuildRequires: python3-elasticsearch
BuildRequires: python3-elasticsearch python3-concurrent-log-handler
Requires: shadow
Requires: shadow python3-mock
Requires: python3-flask-restful python3-flask python3 python3-pyyaml python3-redis
Requires: python3-prettytable python3-requests python3-retrying python3-coverage
Requires: python3-marshmallow python3-uWSGI python3-gevent python3-Flask-Limiter
Requires: python3-elasticsearch
Requires: python3-elasticsearch python3-concurrent-log-handler
%description
Pkgship implements rpm package dependence ,maintainer, patch query and so no.
@ -46,7 +46,11 @@ echo "Release: $release_" >> $version_file
%check
%{__python3} -m unittest test/coverage_count.py
current_path=`pwd`
log_path=${current_path}/packageship/tmp/
sed -i '/^LOG_PATH/d' ./packageship/libs/conf/global_config.py
echo "LOG_PATH=r\"${log_path}\"" >> ./packageship/libs/conf/global_config.py
%{__python3} test/coverage_count.py
%pre
user=pkgshipuser
@ -84,9 +88,8 @@ chown -R $user:$group $1
}
create_dir_file /opt/pkgship/ 750 d
create_dir_file /var/log/pkgship 750 d
create_dir_file /var/log/pkgship 755 d
create_dir_file /var/log/pkgship-operation 700 d
create_dir_file /etc/logrotate.d/pkgship 644 f
%post
@ -95,16 +98,24 @@ create_dir_file /etc/logrotate.d/pkgship 644 f
%files
%doc README.md
%attr(0750,pkgshipuser,pkgshipuser) %{python3_sitelib}/*
%attr(0755,pkgshipuser,pkgshipuser) %{python3_sitelib}/*
%attr(0755,pkgshipuser,pkgshipuser) %config %{_sysconfdir}/pkgship/*
%attr(0755,pkgshipuser,pkgshipuser) %{_bindir}/pkgshipd
%attr(0755,pkgshipuser,pkgshipuser) %{_bindir}/pkgship
%attr(0750,root,root) /etc/pkgship/auto_install_pkgship_requires.sh
%attr(0750,pkgshipuser,pkgshipuser) /etc/pkgship/uwsgi_logrotate.sh
%attr(0640,pkgshipuser,pkgshipuser) /etc/pkgship/package.ini
%attr(0644,pkgshipuser,pkgshipuser) /etc/pkgship/conf.yaml
%attr(0640,pkgshipuser,pkgshipuser) /lib/systemd/system/pkgship.service
%changelog
* Thu Mar 11 2021 zhang tao <zhangtao307@huawei.com> - 2.1.0-6
- In the build phase, modify the path of the log file to solve the permission problem
- add python3-mock to BuildRequires and Requires to solve check error
* Tue Mar 5 2021 Haiwei Li <lihaiwei8@huawei.com> - 2.1.0-5
- Modify the log logrotate scheme
* Tue Mar 2 2021 Yiru Wang <wangyiru1@huawei.com> - 2.1.0-4
- change pkgship-operation permission to 700 for get excute permission while creating files
- delete /home/pkgusers/log and /home/pkgusers/uswgi, which moved to /opt/pkgship/