Ovirt程序员

【Ovirt 笔记】ovirt-engine.spec 配置分析

2017-07-12  本文已影响24人  58bc06151329

分析整理的版本为 Ovirt 3.4.5 版本。

制作 RPM 软件包并不是一件复杂的工作,其中的关键在于编写 SPEC 软件包描述文件。这个文件中包含了软件包的名字、版本、类别、说明摘要、创建时要执行什么指令、安装时要执行什么操作、以及软件包所要包含的文件列表 等等。

制作 engine RPM 包的准备工作

安装rpm-build

yum install rpm-build

新建 engine 发布所需文件夹

压缩源码工程目录

zip -r root-3.4.5-scm-sources.zip ovirt-engine

执行打包命令

rpmbuild -ba SPECS/ovirt-engine.spec
参数 描述
-bp 处理 spec 文件的 pre 部分
-bc 处理 spec 文件的 pre 和 build 部分
-bi 处理 spec 文件的 pre、build 和 install 部分
-bl 校验 spec 文件的 files 部分
-bb 根据 spec 文件构建二进制 RPM
-bs 根据 spec 文件构建源代码 RPM
-ba 根据 spec 文件同时构建二进制 RPM 和源代码 RPM
--clean 完成打包后清除 BUILD 下的文件目录
--nobuild 不进行 BUILD 的阶段
--rmsource 完成打包后清除 SOURCES
--rmspec 完成打包后清除 SPEC 文件
--macros=<FILE:...> 读<FILE:...>文件代替默认文件
--showrc 显示最终的配置信息
--quiet 提供少量的信息
-v,--verbose 提供大量的详细的信息
--version 显示 PRM 包的版本
rpm --showrc sdcvm-3.4.5-0.5.15.sdcos.noarch.rpm
[root@localhost noarch]# rpm --showrc sdcvm-3.4.5-0.5.15.sdcos.noarch.rpm
ARCHITECTURE AND OS:
build arch            : x86_64
compatible build archs: x86_64 noarch
build os              : Linux
compatible build os's : Linux
install arch          : x86_64
install os            : Linux
compatible archs      : x86_64 amd64 em64t athlon noarch i686 i586 i486 i386 fat
compatible os's       : Linux

RPMRC VALUES:
optflags              : %{__global_cflags} -m64 -mtune=generic

Features supported by rpmlib:
    rpmlib(BuiltinLuaScripts) = 4.2.2-1
    rpmlib(CompressedFileNames) = 3.0.4-1
    rpmlib(ConcurrentAccess) = 4.1-1
    rpmlib(ExplicitPackageProvide) = 4.0-1
    rpmlib(FileCaps) = 4.6.1-1
    rpmlib(FileDigests) = 4.6.0-1
    rpmlib(HeaderLoadSortsTags) = 4.0.1-1
    rpmlib(PartialHardlinkSets) = 4.0.4-1
    rpmlib(PayloadFilesHavePrefix) = 4.0-1
    rpmlib(PayloadIsBzip2) = 3.0.5-1
    rpmlib(PayloadIsLzma) = 4.4.2-1
    rpmlib(PayloadIsXz) = 5.2-1
    rpmlib(ScriptletInterpreterArgs) = 4.0.3-1
    rpmlib(TildeInVersions) = 4.10.0-1
    rpmlib(VersionedDependencies) = 3.0.3-1

========================
......
rpm -qlp sdcvm-3.4.5-0.5.15.sdcos.noarch.rpm
[root@localhost noarch]# rpm -qlp sdcvm-3.4.5-0.5.15.sdcos.noarch.rpm 
/etc/ovirt-engine
/etc/ovirt-engine/branding
/etc/ovirt-engine/branding/00-ovirt.brand
/etc/ovirt-engine/engine.conf
/etc/ovirt-engine/engine.conf.d
/etc/ovirt-engine/engine.conf.d/README
/etc/pki/ovirt-engine/publicKey.keystore
/etc/sdcvm
/usr/share/doc/sdcvm-3.4.5
/usr/share/doc/sdcvm-3.4.5/LICENSE
/usr/share/java/ovirt-engine
/usr/share/java/ovirt-engine/authentication.jar
/usr/share/java/ovirt-engine/branding.jar
/usr/share/java/ovirt-engine/common.jar
/usr/share/java/ovirt-engine/compat.jar
/usr/share/java/ovirt-engine/utils.jar
/usr/share/java/sdcvm
/usr/share/ovirt-engine
/usr/share/ovirt-engine/bin
......

ovirt-engine.spec 语法分析整理

......
%global ovirt_product_name SdcOS Enterprise Virtualization Manager
%global ovirt_product_name_short SDC-VM
%global ovirt_product_group Management/SdcOS
%global ovirt_user_description oVirt Manager

%global engine_cache %{_localstatedir}/cache/%{engine_name}
%global engine_data %{_datadir}/%{engine_name}
%global engine_doc %{_docdir}/%{engine_name}
%global engine_ear %{engine_data}/engine.ear
%global engine_etc %{_sysconfdir}/%{engine_name}
%global engine_java %{_javadir}/%{engine_name}
%global engine_jboss_modules %{engine_data}/modules
%global engine_log %{_localstatedir}/log/%{engine_name}
%global engine_name ovirt-engine
%global engine_pki %{_sysconfdir}/pki/%{engine_name}
%global engine_restapi_war %{engine_ear}/restapi.war
%global engine_legacy_restapi_war %{engine_ear}/legacy_restapi.war
%global engine_run %{_localstatedir}/run/%{engine_name}
%global engine_state %{_localstatedir}/lib/%{engine_name}
%global engine_tmp %{_localstatedir}/tmp/%{engine_name}
......
%if 0%{?_ovirt_build_ut:1}
%global ovirt_build_ut %{_ovirt_build_ut}
%else
%global ovirt_build_ut 1
%endif

其中 0%{?_ovirt_build_ut:1} 是条件,0 为假,非 0 为真。

%{?变量:动作} 其中 {} 用于控制范围,而 ? 号和 : 号是分割符。? 号判断变量是否定义,定义了就为真,否则就为假,为真执行动作。例子中 _ovirt_build_ut 变量存在则输出 10 加上 10 所以 %if 为真,执行 %global ovirt_build_ut %{_ovirt_build_ut} 全局宏赋值。相反 %if 0 为假,执行 %global ovirt_build_ut 1

Name: sdcvm
Version: 3.4.5
Release: 0.5.15.sdcos
Summary: Management server for SdcOS Virtualization

参考分组类别:

组名 说明
Amusements/Games 娱乐/游戏
Amusements/Graphics 娱乐/图形
Applications/Archiving 应用/文档
Applications/Communications 应用/通讯
Applications/Databases 应用/数据库
Applications/Editors 应用/编辑器
Applications/Emulators 应用/仿真器
Applications/Engineering 应用/工程
Applications/File 应用/文件
Applications/Internet 应用/因特网
Applications/Multimedia 应用/多媒体
Applications/Productivity 应用/产品
Applications/Publishing 应用/印刷
Applications/System 应用/系统
Applications/Text 应用/文本
Development/Debuggers 开发/调试器
Development/Languages 开发/语言
Development/Libraries 开发/函数库
Development/System 开发/系统
Development/Tools 开发/工具
Documentation 文档
System Environment/Base 系统环境/基础
System Environment/Daemons 系统环境/守护
System Environment/Kernel 系统环境/内核
System Environment/Libraries 系统环境/函数库
System Environment/Shells 系统环境/接口
User Interface/Desktops 用户界面/桌面
User Interface/X 用户界面/X窗口
User Interface/X Hardware Support 用户界面/X硬件支持
Group: Management/SdcOS

BSD 开源协议

BSD 开源协议是一个给于使用者很大自由的协议。基本上使用者可以”为所欲为”,可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。

但”为所欲为”的前提当你发布使用了BSD协议的代码,或则以 BSD 协议代码为基础做二次开发自己的产品时,需要满足三个条件:

1)如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的 BSD 协议。

2)如果再发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的 BSD 协议。

3)不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。

BSD 代码鼓励代码共享,但需要尊重代码作者的著作权。BSD 由于允许使用者修改和重新发布代码,也允许使用或在 BSD 代码上开发商业软件发布和销售,因此是对 商业集成很友好的协议。而很多的公司企业在选用开源产品的时候都首选 BSD 协议,因为可以完全控制这些第三方的代码,在必要的时候可以修改或者二次开发。

ASL 开源协议

ASL 许可证被开源软件广泛使用,并且得到了 开放源码促进会(Open Source Initiative)的认可。它是一种不设限的许可证(permissive license),允许软件的商业性开发和垄断式发布。以ASL发布的代码,可以被合并入闭源的专有软件(proprietary product),并且在各种各样的限制性条件下发布。

需要满足的条件也和 BSD 类似:

1)需要给代码的用户一份 Apache Licence

2)如果你修改了代码,需要再被修改的文件中说明。

3)在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明。

4)如果再发布的产品中包含一个 Notice 文件,则在 Notice 文件中需要带有 Apache Licence。你可以在 Notice 中增加自己的许可,但不可以表现为对 Apache Licence 构成更改。

GPL

我们很熟悉的 Linux 就是采用了GPL。GPL 协议和 BSD, Apache Licence 等鼓励代码重用的许可很不一样。GPL 的出发点是代码的开源/免费使用和引用/修改/衍生代码的开源/免费使用,但不允许修改后和衍生的代 码做为闭源的商业软件发布和销售。这也就是为什么我们能用免费的各种 linux,包括商业公司的 linux 和 linux 上各种各样的由个人,组织,以及商业软件公司开发的免费软件了。

GPL 协议的主要内容是只要在一个软件中使用(”使用”指类库引用,修改后的代码或者衍生代码)GPL 协议的产品,则该软件产品必须也采用GPL协议,既必须也是开源和免费。这就是所谓的”传染性”。GPL 协议的产品作为一个单独的产品使用没有任何问题, 还可以享受免费的优势。

由于 GPL 严格要求使用了 GPL 类库的软件产品必须使用 GPL 协议,对于使用 GPL 协议的开源代码,商业软件或者对代码有保密要求的部门就不适合集成/采用作为类库和二次开发的基础。

其它细节如再发布的时候需要伴随 GPL 协议等和 BSD/Apache 等类似。

LGPL

LGPL 是 GPL 的一个为主要为类库使用设计的开源协议。和 GPL 要求任何使用/修改/衍生之 GPL 类库的的软件必须采用 GPL 协议不同。LGPL 允许商业软件通过类库引用(link)方式使用 LGPL 类库而不需要开源商业软件的代码。这使得采用 LGPL 协议的开源代码可以被商业软件作为类库引用并 发布和销售。

但是如果修改 LGPL 协议的代码或者衍生,则所有修改的代码,涉及修改部分的额外代码和衍生的代码都必须采用 LGPL 协议。因此 LGPL 协议的开源 代码很适合作为第三方类库被商业软件引用,但不适合希望以 LGPL 协议代码为基础,通过修改和衍生的方式做二次开发的商业软件采用。

GPL/LGPL 都保障原作者的知识产权,避免有人利用开源代码复制并开发类似的产品。

MIT

MIT 是和 BSD 一样宽范的许可协议,作者只想保留版权,而无任何其他了限制。也就是说,你必须在你的发行版里包含原许可协议的声明,无论你是以二进制发布的还是以源代码发布的。

License: ASL 2.0
Source0: root-3.4.5-scm-sources.zip
BuildArch: noarch
Requires:       %{name}-backend = %{version}-%{release}
Requires:       %{name}-cli
Requires:       %{name}-dbscripts = %{version}-%{release}
Requires:       %{name}-restapi = %{version}-%{release}
Requires:       %{name}-tools = %{version}-%{release}
Requires:       %{name}-userportal = %{version}-%{release}
Requires:       %{name}-webadmin-portal = %{version}-%{release}
Requires:       %{name}-websocket-proxy >= %{version}-%{release}
Requires:       sdcvm-dependencies >= 3.4.1-1
Requires:       java
Requires:       java-1.7.0-openjdk >= 1:1.7.0.9-2.3.3.2
Requires:       jpackage-utils
Requires:       sdcvm-image-uploader >= 3.4.3
Requires:       sdcvm-iso-uploader >= 3.4.4
Requires:       sdcvm-log-collector >= 3.4.5
Requires:       postgresql-server >= 8.4.7
Requires:       ws-commons-util
Requires:       yum-plugin-versionlock
......
BuildRequires:  java-devel
BuildRequires:  jpackage-utils
BuildRequires:  make
BuildRequires:  python
Conflicts: java-1.7.0-openjdk = 1:1.7.0.45-2.4.3.3.el6
Obsoletes: %{name}-config < 3.3.0
Provides: %{name}-config = %{version}-%{release}
%package lib
%description
SdcOS Enterprise Virtualization is a feature-rich server virtualization management
system that provides advanced capabilities for managing SdcOS
virtualization infrastructure for Servers and Desktops.
%pre backend
%ovirt_create_user_engine
%post backend
%if %{ovirt_install_systemd}
%systemd_post ovirt-engine.service
%endif
%if %{ovirt_install_systemv}
chkconfig --add ovirt-engine
%endif
%preun backend
%if %{ovirt_install_systemd}
%systemd_preun ovirt-engine.service
%endif
%postun backend
%if %{ovirt_install_systemd}
%systemd_postun ovirt-engine.service
%endif
%build
make %{make_common_opts}
%install
rm -fr "%{buildroot}"
make %{make_common_opts} install DESTDIR="%{buildroot}"
%files

%dir %attr(-, %{engine_user}, %{engine_group}) %{engine_cache}
%dir %attr(-, %{engine_user}, %{engine_group}) %{engine_log}
%dir %attr(-, %{engine_user}, %{engine_group}) %{engine_log}/dump
%dir %{engine_data}
%dir %{engine_data}/bin
%dir %{engine_data}/branding
%dir %{engine_data}/conf
%dir %{engine_data}/engine.ear
%dir %{engine_data}/services
%dir %{engine_etc}
%dir %{engine_etc}/branding
%dir %{engine_java}
%doc LICENSE
%ghost %config(noreplace) %{engine_etc}/engine.conf
%{engine_data}/branding/ovirt.brand/
%{engine_etc}/branding/00-ovirt.brand
%{engine_etc}/engine.conf.d/
%{engine_java}/authentication.jar
%{engine_java}/branding.jar
%{engine_java}/common.jar
%{engine_java}/compat.jar
%{engine_java}/utils.jar
%{engine_pki}/publicKey.keystore
......

注意:%install 部分使用的是绝对路径,而 %file 部分使用则是相对路径

%config %{_sysconfdir}/logrotate.d/ovirt-engine
参数 说明
-q 在安静模式下且最少输出
-D 在解压之前禁止删除目录
-a number 在改变目录后,仅解压给定数字的源码,如 -a 0 for source0
-n newdir 将软件包解压到 newdir 目录
-c 解压缩之前先产生目录
-b number 包含多个源文件时,将第 num 个 source 文件解压缩
-T 不使用 default 的解压缩操作
%setup -q -T -b 0 -n ovirt-engine
%changelog
* Mon Jan 27 2015 Max Kovgan <mvk@redhat.com> - 3.4.5
- BZ#1169352 BZ#1151053 BZ#1166010 BZ#1147396 BZ#1169404
  BZ#1180072 BZ#1171467 BZ#1154184

* Mon Nov 10 2014 Barak Korren <bkorren@redhat.com> - 3.4.4
- BZ#1135112 BZ#1141761 BZ#1152448 BZ#1154569 BZ#1155557
  BZ#1155571 BZ#1155573 BZ#1155649 BZ#1155698 BZ#1155906
  BZ#1155920 BZ#1155986 BZ#1155987 BZ#1156012 BZ#1157212
  BZ#1157678 BZ#1158042 BZ#1158090 BZ#1159751 BZ#1159761
  BZ#1159849 BZ#1161923

* Tue Oct 13 2014 David Caro <dcaro@redhat.com> - 3.4.3
- BZ#1128461 BZ#1147909 BZ#1122945 BZ#1134825 BZ#1131021
  BZ#1136010 BZ#1130887 BZ#1147609 BZ#1147827 BZ#1131856
  BZ#1147396 BZ#1135939 BZ#1142203 BZ#1142418 BZ#1138249
  BZ#1139211 BZ#1099505 BZ#1128462 BZ#1136031 BZ#1135920
  BZ#1122932 BZ#1138753 BZ#1150545 BZ#1151410 BZ#1135939
  BZ#1151822 BZ#1142203 BZ#1145779 BZ#1126430
......

使用 百分号 加命令关键字是调用宏,所有的宏都可以在 /usr/lib/rpm/macros 里找到。

vi /usr/lib/rpm/macros

# ---- Generally useful path macros.
#
%__awk                  gawk
%__bzip2                /usr/bin/bzip2
%__cat                  /bin/cat
%__chgrp                /bin/chgrp
%__chmod                /bin/chmod
%__chown                /bin/chown
%__cp                   /bin/cp
%__cpio                 /bin/cpio
%__file                 /usr/bin/file
%__gpg                  /usr/bin/gpg
%__grep                 /bin/grep
%__gzip                 /usr/bin/gzip
%__id                   /usr/bin/id
%__install              /usr/bin/install
%__ln_s                 ln -s
# Deprecated, use %__xz instead.
%__lzma                 %__xz --format=lzma
......

其他相关

%ifarch sparc s390
%ifos linux

ovirt-engine.spec 内容分析整理

定制模块

rpmbuild -ba SPECS/ovirt-engine.spec -D 'ovirt_build_quick 1'

全局变量定义

%global ovirt_product_name SdcOS Enterprise Virtualization Manager
%global ovirt_product_name_short SDC-VM
%global ovirt_product_group Management/SdcOS
%global ovirt_user_description oVirt Manager

%global engine_cache %{_localstatedir}/cache/%{engine_name}
%global engine_data %{_datadir}/%{engine_name}
%global engine_doc %{_docdir}/%{engine_name}
%global engine_ear %{engine_data}/engine.ear
%global engine_etc %{_sysconfdir}/%{engine_name}
%global engine_java %{_javadir}/%{engine_name}
%global engine_jboss_modules %{engine_data}/modules
%global engine_log %{_localstatedir}/log/%{engine_name}
%global engine_name ovirt-engine
%global engine_pki %{_sysconfdir}/pki/%{engine_name}
%global engine_restapi_war %{engine_ear}/restapi.war
%global engine_legacy_restapi_war %{engine_ear}/legacy_restapi.war
%global engine_run %{_localstatedir}/run/%{engine_name}
%global engine_state %{_localstatedir}/lib/%{engine_name}
%global engine_tmp %{_localstatedir}/tmp/%{engine_name}

%global engine_gid 108
%global engine_group ovirt
%global engine_uid 108
%global engine_user ovirt
%global vdsm_description Node Virtualization Manager
%global vdsm_gid 36
%global vdsm_group kvm
%global vdsm_uid 36
%global vdsm_user vdsm
变量 变量说明 值说明 备注
ovirt_build_ut 0 是否可以设置测试参数
ovirt_build_gwt 0 是否可以设置 GWT 构造相关参数
ovirt_build_locales 0 是否可以设置 GWT 本地化相关参数
__jar_repack 0 是否将 jar 包重新打包,会执行 brp-java-repack-jars
ovirt_build_quick 是否快速构建 参数不为空即是
ovirt_build_minimal 是否最小构建 参数不为空即是
_jarsign_opts --unsign=/usr/share/ovirt-engine 无签名目录 指定无签名目录
fedora 是否 fedora 版本 参数不为空即是
rhel 是否 rhel 版本 参数不为空即是
ovirt_install_systemd 1 是否安装 systemd 非 0 为是
ovirt_install_systemv 0 是否安装 system V
ovirt_install_poms 0 是否更新 maven 的 artifacts 以及文件的映射关系
ovirt_require_maven 1 是否增加 maven 依赖
ovirt_product_name SdcOS Enterprise Virtualization Manager 产品名称
ovirt_product_name_short SDC-VM 产品简称
ovirt_product_group Management/SdcOS 产品组类别
ovirt_user_description oVirt Manager 用户描述信息
engine_name ovirt-engine 名称
engine_cache %{_localstatedir}/cache/%{engine_name} engine 缓存目录 /var/cache/ovirt-engine
engine_data %{_datadir}/%{engine_name} engine 数据目录 /usr/share/ovirt-engine
engine_doc %{_docdir}/%{engine_name} engine 文档目录 /usr/doc/ovirt-engine
engine_ear %{engine_data}/engine.ear engine ear 所在目录 /usr/share/ovirt-engine/engine.ear
engine_etc %{_sysconfdir}/%{engine_name} etc 目录下 engine 配置目录 /etc/ovirt-engine
engine_java %{_javadir}/%{engine_name} java 目录下 engine 目录 /usr/share/ovirt-engine/java/ovirt-engine
engine_jboss_modules %{engine_data}/modules engine jboss 模块化相关目录 /usr/share/ovirt-engine/modules
engine_log %{_localstatedir}/log/%{engine_name} engine 日志目录 /var/log/ovirt-engine
engine_pki %{_sysconfdir}/pki/%{engine_name} engine 加密相关目录 /etc/pki/ovirt-engine
engine_restapi_war %{engine_ear}/restapi.war engine rest api 项目路径 /usr/share/ovirt-engine/engine.ear/restapi.war
engine_legacy_restapi_war %{engine_ear}/legacy_restapi.war engine rest api legacy 项目路径 /usr/share/ovirt-engine/engine.ear/legacy_restapi.war
engine_run %{_localstatedir}/run/%{engine_name} engine 运行目录 /var/run/ovirt-engine
engine_state %{_localstatedir}/lib/%{engine_name} engine 状态目录 /var/lib/ovirt-engine
engine_tmp %{_localstatedir}/tmp/%{engine_name} engine 临时文件目录 /var/tmp/ovirt-engine
engine_gid 108 engine 组ID
engine_group ovirt engine 组名
engine_uid 108 engine 用户ID
engine_user ovirt engine 用户名
vdsm_description Node Virtualization Manager vdsm 描述信息
vdsm_gid 36 vdsm 组ID
vdsm_group kvm vdsm 组名
vdsm_uid 36 vdsm 用户ID
vdsm_user vdsm vdsm 用户名
openstack_java_version 3.0.2 OpenStack 软件包最低版本
sdcvm_dependencies_slot 3.4 模块化依赖的版本位置

系统宏变量说明

变量
%{buildroot} /root/rpmbuild/BUILDROOT
%{_bindir} /usr/bin
%{_mandir} /usr/share/man
%{_sysconfdir} /etc
%{_initddir}
%{_unitdir}
%{_mavenpomdir}

定义软件包基本属性

Name:           sdcvm
Version:        3.4.5
Release:        0.5.15.sdcos
Summary:        Management server for SdcOS Virtualization
Group:          %{ovirt_product_group}
License:        ASL 2.0
Packager:       
Vendor:         
URL:            

# Acquire brew/mead pre-built resources.
Source0: root-3.4.5-scm-sources.zip

BuildArch:      noarch

定义软件包依赖关系

Requires:       %{name}-backend = %{version}-%{release}
Requires:       %{name}-cli
Requires:       %{name}-dbscripts = %{version}-%{release}
Requires:       %{name}-restapi = %{version}-%{release}
Requires:       %{name}-tools = %{version}-%{release}
Requires:       %{name}-userportal = %{version}-%{release}
Requires:       %{name}-webadmin-portal = %{version}-%{release}
Requires:       %{name}-websocket-proxy >= %{version}-%{release}
Requires:       sdcvm-dependencies >= 3.4.1-1
Requires:       java
Requires:       java-1.7.0-openjdk >= 1:1.7.0.9-2.3.3.2
Requires:       jpackage-utils
Requires:       sdcvm-image-uploader >= 3.4.3
Requires:       sdcvm-iso-uploader >= 3.4.4
Requires:       sdcvm-log-collector >= 3.4.5
Requires:       postgresql-server >= 8.4.7
Requires:       ws-commons-util
Requires:       yum-plugin-versionlock

定义 lib 子包基本属性及依赖

%package lib
Summary:    %{ovirt_product_name_short} library
Group:      %{ovirt_product_group}
Requires:   python-daemon
%description lib
%{ovirt_product_name_short} library

定义 backend 子包基本属性及依赖

%package backend
Summary:    Engine core of %{ovirt_product_name_short}
Group:      %{ovirt_product_group}
Requires:   %{name} = %{version}-%{release}
Requires:   %{name}-lib >= %{version}-%{release}
Requires:   httpd
Requires:   java
Requires:   logrotate
Requires:   bzip2
Requires:   mailcap
Requires:   mod_ssl
Requires:   novnc
Requires:   openssl
Requires:   ovirt-host-deploy-java >= 1.2.2
Requires:   python-cheetah
Requires:   spice-html5
Requires:   sdcvm-branding-rhev >= 3.4.0-0.3

%if %{ovirt_install_systemd}
Requires(post):     systemd
Requires(preun):    systemd
Requires(postun):   systemd
%endif
%description backend
The backend engine of %{ovirt_product_name_short}

安装 backend 之前执行

%pre backend
%ovirt_create_user_engine
%global ovirt_create_user_engine \
%_ovirt_create_user %{engine_user} %{engine_uid} %{engine_group} %{engine_gid} "%{ovirt_user_description}" %{engine_state}

安装 backend 之后执行

%if %{ovirt_install_systemd}
%systemd_post ovirt-engine.service
%endif
%if %{ovirt_install_systemv}
chkconfig --add ovirt-engine
%endif

卸载 backend 之前执行

%preun backend
%if %{ovirt_install_systemd}
%systemd_preun ovirt-engine.service
%endif

%if %{ovirt_install_systemv}
if [ $1 -eq 0 ]; then
    service ovirt-engine stop > /dev/null 2>&1 || true
    chkconfig --del ovirt-engine
fi
%endif

卸载 backend 之后执行

%postun backend
%if %{ovirt_install_systemd}
%systemd_postun ovirt-engine.service
%endif

定义 desktopManager 子包基本属性及依赖

%package desktopManager
Summary:    desktopManager of %{ovirt_product_name_short}
Group:      %{ovirt_product_group}
Requires:   %{name} = %{version}-%{release}
Requires:   %{name}-lib >= %{version}-%{release}
Requires:   httpd
Requires:   java
Requires:   %{name}-backend >= %{version}-%{release}
%description desktopManager
The desktopManager of %{ovirt_product_name_short}

安装 desktopManager 之后执行

cp -af %{engine_ear}/desktopManager.war/page/welcome.js %{engine_ear}/welcome.war/js/welcome.js
cp -af %{engine_ear}/desktopManager.war/page/welcome.src.js %{engine_ear}/welcome.war/js/welcome.src.js
cp -af %{engine_ear}/desktopManager.war/page/ovirt-engine.jsp %{engine_ear}/welcome.war/WEB-INF/ovirt-engine.jsp
cp -af %{engine_ear}/desktopManager.war/page/style.css %{engine_ear}/welcome.war/welcome/style.css

sh  %{engine_ear}/desktopManager.war/dbscript/updatepgsql.sh

卸载 desktopManager 之后执行

if [ -f %{engine_ear}/desktopManager.war/ui/un-index.html ]; then
mv -f %{engine_ear}/desktopManager.war/ui/un-index.html %{engine_ear}/desktopManager.war/ui/index.html
fi

sh  %{engine_ear}/desktopManager.war/dbscript/delpgsql.sh

定义 restapi 子包基本属性及依赖

Summary:    RESTful API for %{ovirt_product_name_short}
Group:      %{ovirt_product_group}
Requires:   %{name} = %{version}-%{release}
%description restapi
The RESTful API for %{ovirt_product_name_short}

安装 restapi 之后执行

%post restapi
%if %{ovirt_install_poms}
%update_maven_depmap
%endif

卸载 restapi 之后执行

%postun restapi
%if %{ovirt_install_poms}
%update_maven_depmap
%endif

定义 setup-base 子包基本属性及依赖

%package setup-base
Summary:    %{ovirt_product_name_short} suite base setup components.
Group:      %{ovirt_product_group}
Requires:   %{name}-lib >= %{version}-%{release}
Requires:   bind-utils
Requires:   iproute
Requires:   libxml2-python
Requires:   logrotate
Requires:   otopi >= 1.2.3
%description setup-base
%{ovirt_product_name_short} suite base setup components.

安装 setup-base 之前执行

%pre setup-base
%ovirt_create_user_engine
%global ovirt_create_user_engine \
%_ovirt_create_user %{engine_user} %{engine_uid} %{engine_group} %{engine_gid} "%{ovirt_user_description}" %{engine_state}

定义 setup 子包基本属性及依赖

%package setup
Summary:    Setup and upgrade scripts for %{ovirt_product_name_short}
Group:      %{ovirt_product_group}
Requires:   %{name}-setup-plugin-ovirt-engine = %{version}-%{release}
Requires:   sdcvm-setup-plugins >= 3.4.4
%description setup
Setup and upgrade scripts for %{ovirt_product_name_short}

定义 setup-plugin-ovirt-engine 子包基本属性及依赖

%package setup-plugin-ovirt-engine
Summary:    Setup and upgrade specific plugins for %{ovirt_product_name_short}
Group:      %{ovirt_product_group}
Requires:   %{name}-setup-plugin-ovirt-engine-common = %{version}-%{release}
Requires:   %{name} >= 3.3.1
Conflicts:  %{name} < 3.3.1
%description setup-plugin-ovirt-engine
Setup and upgrade specific plugins for %{ovirt_product_name_short}

安装 setup-plugin-ovirt-engine 之前执行

%pre setup-plugin-ovirt-engine
%ovirt_create_user_vdsm
%global ovirt_create_user_vdsm \
%_ovirt_create_user %{vdsm_user} %{vdsm_uid} %{vdsm_group} %{vdsm_gid} "%{vdsm_description}" /var/lib/vdsm

定义 setup-plugin-ovirt-engine-common 子包基本属性及依赖

%package setup-plugin-ovirt-engine-common
Summary:    Setup and upgrade common plugins for %{ovirt_product_name_short}
Group:      %{ovirt_product_group}
Requires:   %{name}-setup-base = %{version}-%{release}
Requires:   cracklib-python
Requires:   libselinux-python
Requires:   m2crypto
Requires:   nfs-utils
Requires:   policycoreutils-python
Requires:   python-psycopg2
Requires:   yum
%description setup-plugin-ovirt-engine-common
Setup and upgrade common plugins for %{ovirt_product_name_short}

定义 dbscripts 子包基本属性及依赖

%package dbscripts
Summary:    Database scripts for %{ovirt_product_name_short}
Group:      %{ovirt_product_group}
Requires:   %{name} = %{version}-%{release}
%description dbscripts
Database scripts for %{ovirt_product_name_short}

定义 userportal 子包基本属性及依赖

%package userportal
Summary:    User Portal of %{ovirt_product_name_short}
Group:      %{ovirt_product_group}
Requires:   %{name} = %{version}-%{release}
%description userportal
The user portal interface to %{ovirt_product_name_short}

定义 webadmin-portal 子包基本属性及依赖

%package webadmin-portal
Summary:    Web Admin Portal of %{ovirt_product_name_short}
Group:      %{ovirt_product_group}
Requires:   %{name} = %{version}-%{release}
%description webadmin-portal
The web administration interface to %{ovirt_product_name_short}

定义 tools 子包基本属性及依赖

%package tools
Summary:    %{ovirt_product_name_short} Tools
Group:      %{ovirt_product_group}
Requires:   %{name} = %{version}-%{release}
Requires:   %{name}-lib >= %{version}-%{release}
Requires:   java
Requires:   logrotate
Obsoletes:  %{name}-config < 3.3.0
Obsoletes:  %{name}-genericapi < 3.3.0
Obsoletes:  %{name}-notification-service < 3.3.0
Obsoletes:  %{name}-tools-common < 3.3.0
Provides:   %{name}-config = %{version}-%{release}
Provides:   %{name}-genericapi = %{version}-%{release}
Provides:   %{name}-notification-service = %{version}-%{release}
Provides:   %{name}-tools-common = %{version}-%{release}
%description tools
%{ovirt_product_name_short} Tools

安装 tools 之前执行

%pre tools
%ovirt_create_user_engine

安装 tools 之后执行

%post tools
%if %{ovirt_install_systemd}
%systemd_post ovirt-engine-notifier.service
%endif
%if %{ovirt_install_systemv}
chkconfig --add ovirt-engine-notifier
%endif
%if %{ovirt_install_poms}
%update_maven_depmap
%endif

卸载 tools 之前执行

%preun tools
%if %{ovirt_install_systemd}
%systemd_preun ovirt-engine-notifier.service
%endif

%if %{ovirt_install_systemv}
if [ $1 -eq 0 ]; then
    service ovirt-engine-notifier stop > /dev/null 2>&1 || true
    chkconfig --del ovirt-engine-notifier
fi
%endif

卸载 tools 之后执行

%postun tools
%if %{ovirt_install_systemd}
%systemd_postun ovirt-engine-notifier.service
%endif
%if %{ovirt_install_poms}
%update_maven_depmap
%endif

定义 websocket-proxy 子包基本属性及依赖

%package websocket-proxy
Summary:    %{ovirt_product_name_short} Websocket Proxy
Group:      %{ovirt_product_group}
Requires:   %{name}-lib >= %{version}-%{release}
Requires:   m2crypto
Requires:   python-websockify
Requires:   %{name}-setup-plugin-websocket-proxy >= %{version}-%{release}
%description websocket-proxy
%{ovirt_product_name_short} Websocket Proxy

安装 websocket-proxy 之前执行

%pre setup-base
%ovirt_create_user_engine

安装 websocket-proxy 之后执行

%post websocket-proxy
%if %{ovirt_install_systemd}
%systemd_post ovirt-websocket-proxy.service
%endif
%if %{ovirt_install_systemv}
chkconfig --add ovirt-websocket-proxy
%endif

卸载 websocket-proxy 之前执行

%preun websocket-proxy
%if %{ovirt_install_systemd}
%systemd_preun ovirt-websocket-proxy.service
%endif

%if %{ovirt_install_systemv}
if [ $1 -eq 0 ]; then
    service ovirt-websocket-proxy stop > /dev/null 2>&1 || true
    chkconfig --del ovirt-websocket-proxy
fi
%endif

卸载 websocket-proxy 之后执行

%postun websocket-proxy
%if %{ovirt_install_systemd}
%systemd_postun ovirt-websocket-proxy.service
%endif

定义 setup-plugin-websocket-proxy 子包基本属性及依赖

Summary:    Setup and upgrade specific plugins for websocket-proxy
Requires:   %{name}-setup-base = %{version}-%{release}
%description setup-plugin-websocket-proxy
Setup and upgrade specific plugins for websocket-proxy

定义 setup-plugin-allinone 子包基本属性及依赖

Summary:    All-in-one plugin for %{ovirt_product_name_short}'s setup
Group:      %{ovirt_product_group}
Requires:   %{name}-sdk-python >= 3.4.3.0
Requires:   %{name}-setup-plugin-ovirt-engine = %{version}-%{release}
Requires:   openssh-server
Requires:   ovirt-host-deploy >= 1.2.2
Requires:   ovirt-host-deploy-offline >= 1.2.1
%description setup-plugin-allinone
All-in-one plugin for %{ovirt_product_name_short}'s setup

预处理脚本

%prep
# Collect brew/mead binary artifacts
%setup -q -T -b 0 -n ovirt-engine

编译源码构建包

%build
make %{make_common_opts}
%global make_common_opts \\\
    -j1 \\\
    BUILD_GWT=%{ovirt_build_gwt} \\\
    BUILD_LOCALES=%{ovirt_build_locales} \\\
    BUILD_UT=%{ovirt_build_ut} \\\
    BUILD_VALIDATION=0 \\\
    PACKAGE_NAME=%{name} \\\
    RPM_VERSION=%{version} \\\
    RPM_RELEASE=%{release} \\\
    DISPLAY_VERSION=%{version}-%{release} \\\
    ENGINE_NAME=%{engine_name} \\\
    LOCALSTATE_DIR=%{_localstatedir} \\\
    PREFIX=%{_prefix} \\\
    SYSCONF_DIR=%{_sysconfdir} \\\
    BIN_DIR=%{_bindir} \\\
    PID_DIR=%{_localstatedir}/run \\\
    DATAROOT_DIR=%{_datadir} \\\
    MAN_DIR=%{_mandir} \\\
    DOC_DIR=%{_docdir} \\\
    PYTHON=%{__python} \\\
    PYTHON_DIR=%{python_sitelib} \\\
    JAVA_DIR=%{_javadir} \\\
    MAVENPOM_DIR=%{_mavenpomdir} \\\
    PKG_SYSCONF_DIR=%{engine_etc} \\\
    PKG_DOC_DIR=%{engine_doc} \\\
    PKG_EAR_DIR=%{engine_ear} \\\
    PKG_PKI_DIR=%{engine_pki} \\\
    PKG_JBOSS_MODULES=%{engine_jboss_modules} \\\
    PKG_CACHE_DIR=%{engine_cache} \\\
    PKG_LOG_DIR=%{engine_log} \\\
    PKG_TMP_DIR=%{engine_tmp} \\\
    PKG_STATE_DIR=%{engine_state} \\\
    PKG_USER=%{engine_user} \\\
    PKG_GROUP=%{engine_group} \\\
    JBOSS_HOME=/usr/share/jbossas \\\
    MAVEN_OUTPUT_DIR=. \\\
    %{?BUILD_FLAGS:BUILD_FLAGS="%{BUILD_FLAGS}"} \\\
    %{?EXTRA_BUILD_FLAGS:EXTRA_BUILD_FLAGS="%{EXTRA_BUILD_FLAGS}"}

安装执行包到虚拟机目录

%install
rm -fr "%{buildroot}"
make %{make_common_opts} install DESTDIR="%{buildroot}"
# Compile python files
%{__python} -m compileall -f -q -d / "%{buildroot}"
%{__python} -O -m compileall -f -q -d / "%{buildroot}"
install -dm 755 "%{buildroot}/%{engine_state}"/{content,setup/answers}
install -dm 755 "%{buildroot}/%{engine_log}"/{host-deploy,setup,notifier,engine-manage-domains,dump}
install -dm 755 "%{buildroot}/%{engine_cache}"
install -dm 755 "%{buildroot}/%{engine_run}/notifier"
Usage: install [OPTION]... [-T] SOURCE DEST
  or:  install [OPTION]... SOURCE... DIRECTORY
  or:  install [OPTION]... -t DIRECTORY SOURCE...
  or:  install [OPTION]... -d DIRECTORY...
intall 参数 说明
--backup[=CONTROL] 为每个已存在的目的地文件进行备份。
-b 类似 --backup,但不接受任何参数。
-c 此选项不作处理。
-d,--directory 所有参数都作为目录处理,而且会创建指定目录的所有主目录。
-D 创建<目的地>前的所有主目录,然后将<来源>复制至 <目的地>;在第一种使用格式中有用。
-g,--group=组 自行设定所属组,而不是进程目前的所属组。
-m,--mode=模式 自行设定权限模式 (像chmod),而不是rwxr-xr-x。
-o,--owner=所有者 自行设定所有者 (只适用于超级用户)。
-p,--preserve-timestamps 以<来源>文件的访问/修改时间作为相应的目的地文件的时间属性。
-s,--strip 用strip命令删除symbol table,只适用于第一及第二种使用格式。
-S,--suffix=后缀 自行指定备份文件的<后缀>。
-v,--verbose 处理每个文件/目录时印出名称。
--help 显示此帮助信息并离开。
--version 显示版本信息并离开。
for war in  restapi legacy_restapi userportal webadmin; do
    sed -i \
        's#<transport-guarantee>NONE</transport-guarantee>#<transport-guarantee>CONFIDENTIAL</transport-guarantee>#' \
        "%{buildroot}%{engine_ear}/${war}.war/WEB-INF/web.xml"
done

选定了 restapi.warlegacy_restapi.waruserportal.warwebadmin.war

while read lib_path; do
    java_path="%{engine_java}/$(basename "${lib_path}")"
    if ! [ -e "%{buildroot}/${java_path}" ] && [ -f "%{buildroot}/${lib_path}" ]; then
        cp "%{buildroot}/${lib_path}" "%{buildroot}/${java_path}"
    fi
    rm -f "%{buildroot}/${lib_path}"
    ln -s "${java_path}" "%{buildroot}${lib_path}"
done << __EOF__
%{engine_ear}/bll.jar
%{engine_ear}/docs.war/WEB-INF/lib/branding.jar
%{engine_ear}/legacy_restapi.war/WEB-INF/lib/branding.jar
%{engine_ear}/lib/vdsbroker.jar
%{engine_ear}/restapi.war/WEB-INF/lib/branding.jar
%{engine_ear}/scheduler.jar
%{engine_ear}/userportal.war/WEB-INF/lib/branding.jar
%{engine_ear}/webadmin.war/WEB-INF/lib/branding.jar
%{engine_ear}/welcome.war/WEB-INF/lib/branding.jar
%{engine_jboss_modules}/org/ovirt/engine/core/authentication/main/authentication.jar
%{engine_jboss_modules}/org/ovirt/engine/core/common/main/common.jar
%{engine_jboss_modules}/org/ovirt/engine/core/compat/main/compat.jar
%{engine_jboss_modules}/org/ovirt/engine/core/dal/main/dal.jar
%{engine_jboss_modules}/org/ovirt/engine/core/searchbackend/main/searchbackend.jar
%{engine_jboss_modules}/org/ovirt/engine/core/tools/main/tools.jar
%{engine_jboss_modules}/org/ovirt/engine/core/utils/main/utils.jar
%{engine_restapi_war}/WEB-INF/lib/interface-common-jaxrs.jar
%{engine_restapi_war}/WEB-INF/lib/restapi-definition.jar
%{engine_restapi_war}/WEB-INF/lib/restapi-jaxrs.jar
%{engine_restapi_war}/WEB-INF/lib/restapi-types.jar
__EOF__
%if "%{name}" != "%{engine_name}"
ln -s "%{engine_name}" "%{buildroot}%{engine_java}/../%{name}"
%endif
for pom in %{buildroot}%{_mavenpomdir}/*.pom; do
    pomdir="$(dirname "${pom}")"
    pom="$(basename "${pom}")"
    jpppom="JPP.${pom}"
    mv "${pomdir}/${pom}" "${pomdir}/${jpppom}"
    artifact_id="$(echo "${pom}" | sed -e 's/^%{name}-//' -e 's/\.pom//')"
    if [ -f "%{buildroot}%{engine_java}/${artifact_id}.jar" ]; then
        %add_maven_depmap "${jpppom}" "%{name}/${artifact_id}.jar"
    else
        %add_maven_depmap "${jpppom}"
    fi
done
while read dst src; do
    [ -z "${dst}" ] && continue
    [ -z "${src}" ] && src="$(basename "${dst}")"

    dst="%{engine_jboss_modules}/${dst}"
    src="%{_javadir}/${src}"
    rm -f "%{buildroot}${dst}"
    ln -s "${src}" "%{buildroot}${dst}"
done << __EOF__
org/apache/ws/commons/main/ws-commons-util.jar
org/ovirt/otopi/main/otopi.jar otopi/otopi.jar
org/ovirt/ovirt-host-deploy/main/ovirt-host-deploy.jar ovirt-host-deploy/ovirt-host-deploy.jar
%if 0%{?fedora}
%if %{fedora} >= 19
com/mchange/c3p0/main/c3p0.jar
com/woorea/openstack/sdk/main/glance-client.jar openstack-java-sdk/glance-client.jar
com/woorea/openstack/sdk/main/glance-model.jar openstack-java-sdk/glance-model.jar
com/woorea/openstack/sdk/main/keystone-client.jar openstack-java-sdk/keystone-client.jar
com/woorea/openstack/sdk/main/keystone-model.jar openstack-java-sdk/keystone-model.jar
com/woorea/openstack/sdk/main/openstack-client.jar openstack-java-sdk/openstack-client.jar
com/woorea/openstack/sdk/main/quantum-client.jar openstack-java-sdk/quantum-client.jar
com/woorea/openstack/sdk/main/quantum-model.jar openstack-java-sdk/quantum-model.jar
com/woorea/openstack/sdk/main/resteasy-connector.jar openstack-java-sdk/resteasy-connector.jar
org/aopalliance/main/aopalliance.jar
......
%if %{ovirt_install_systemd}
install -dm 755 "%{buildroot}%{_unitdir}"
for service in ovirt-engine ovirt-engine-notifier ovirt-websocket-proxy; do
    cp "%{buildroot}%{engine_data}/services/${service}/${service}.systemd" "%{buildroot}%{_unitdir}/${service}.service"
done
%endif

%if %{ovirt_install_systemv}
install -dm 755 "%{buildroot}%{_initddir}"
for service in ovirt-engine ovirt-engine-notifier ovirt-websocket-proxy; do
    cp "%{buildroot}%{engine_data}/services/${service}/${service}.sysv" "%{buildroot}%{_initddir}/${service}"
done
%endif
序号 定制说明
1 install -d "%{buildroot}%{_sysconfdir}/ovirt-engine-setup.conf.d"
2 cat > "%{buildroot}%{_sysconfdir}/ovirt-engine-setup.conf.d/10-packaging.conf"
3 cat > "%{buildroot}%{_sysconfdir}/ovirt-engine-setup.conf.d/10-packaging-aio.conf"
4 install -d "%{buildroot}%{_sysconfdir}/ovirt-host-deploy.conf.d"
5 cat > "%{buildroot}%{_sysconfdir}/ovirt-host-deploy.conf.d/10-packaging-aio.conf"
6 ln -s /usr/share/spice "%{buildroot}%{engine_data}/files/spice"
7 touch "%{buildroot}%{engine_data}/setup/ovirt-engine-setup-ghost"
8 touch "%{buildroot}%{engine_etc}/engine.conf"
9 touch "%{buildroot}%{engine_etc}/notifier/notifier.conf"
10 touch "%{buildroot}%{engine_pki}/cacert.template"
11 touch "%{buildroot}%{engine_pki}/cert.template"
12 touch "%{buildroot}%{engine_pki}/database.txt"
13 touch "%{buildroot}%{engine_pki}/serial.txt"
14 install -d "%{buildroot}%{engine_etc}/sysprep"
15 touch "%{buildroot}%{engine_etc}/sysprep/sysprep.2k12x64"
16 touch "%{buildroot}%{engine_etc}/sysprep/sysprep.2k3"
17 touch "%{buildroot}%{engine_etc}/sysprep/sysprep.2k8"
18 touch "%{buildroot}%{engine_etc}/sysprep/sysprep.2k8x86"
19 touch "%{buildroot}%{engine_etc}/sysprep/sysprep.2k8x64"
20 touch "%{buildroot}%{engine_etc}/sysprep/sysprep.w7"
21 touch "%{buildroot}%{engine_etc}/sysprep/sysprep.w7x64"
22 touch "%{buildroot}%{engine_etc}/sysprep/sysprep.w8"
23 touch "%{buildroot}%{engine_etc}/sysprep/sysprep.w8x64"
24 touch "%{buildroot}%{engine_etc}/sysprep/sysprep.xp"
25 install -d "%{buildroot}%{_sysconfdir}/firewalld/services"
26 touch "%{buildroot}%{_sysconfdir}/firewalld/services/ovirt.xml"
27 mkdir %{buildroot}%{engine_ear}/tmp
28 mv %{buildroot}%{engine_ear}/desktopManager.war %{buildroot}%{engine_ear}/tmp/desktopManager.war
perl -i -pe 'BEGIN{undef $/;} s/Name: [^\n]+\n( [^\n]+\n)*([^\s]+-Digest: [^\n]+\n(\s)?)+(Magic: [^\n]+\n)?\n//mgs' "%{buildroot}%{engine_ear}/META-INF/MANIFEST.MF"
perl -i -pe 's/^SHA1-Digest: [^\n]+\n//g' "%{buildroot}%{engine_ear}/META-INF/MANIFEST.MF"
Usage: perl [switches] [--] [programfile] [arguments]
perl 参数 说明
-0[octal] 指定记录分隔符(0,如果没有参数)
-a 与 -n 或者 -p 一起使用,负责打开自动拆分模式,用于对空白字符进行隐式拆分,用空格分隔$_并保存到 @F 中,相当于 @F=split ''。
-c 只检查 Perl 脚本语法,而不执行脚本。
-d[:debugger] 对脚本打开 Perl调试器。
-D[number/list] 设置 Perl 的调试标记(请先检查 Perl 的安装情况,确保已经安装了调试器),若要观察 Perl 是如何执行脚本的,可使用 -D14。
-e program 用于在命令行而不是在脚本中执行 Perl 命令。
-F/pattern/ 规定拆分输入行时使用的模式。模式是位于斜杠、单引号或双引号之间的正则表达式。例如,-F/:+/ 表示在一个或多个冒号上拆分输入行,如果 -a 仍然起作用的话,则打开它。
-i[extension] 在使用 <> 循环遍历文件时启用原位编辑模式。 如果没有规定扩展名的话,则原位修改各行内容,否则使用扩展名来修改输入文件名(以便充当备份文件),并使用原位编辑的原文件名创建输出文件。 这也是所有 print 语句选择的文件句柄。
-Idirectory 与 -P选项一起使用,负责告诉 C 预处理程序查找包含的文件,其默认目录包括 /usr/included、/usr/lib/perl 以及当前目录。
-l[octal] 启用自动行结束处理。如果使用了 -n 或者 -p 选项,则去掉终止符。把位数(八进制) 赋值给 \ ,并将行终止符添加到 print 语句中。如果没有规定位数的话,则将\ 设置为 $/ 的当前值。

-[mM][-]module execute "use/no module..." before executing program
-h |打印 Perl 的命令选项列表。
-p |假设循环为 n,但是打印行,类似于SED。

卸载执行包之前

if [ -d "%{engine_pki}" ]; then
    dest="%{engine_pki}/../%{engine_name}-backups/%{engine_name}-$(date +"%%Y%%m%%d%%H%%M%%S")"
    mkdir -p "${dest}"
    cp -pR "%{engine_pki}" "${dest}"
fi

安装执行包之后

卸载执行包之后

rm -rf "%{engine_cache}"
rm -rf "%{engine_pki}"

安装执行包之前

打包文件目录处理,权限设置

序号 文件目录说明
1 %dir %attr(-, %{engine_user}, %{engine_group}) %{engine_cache}
2 %dir %attr(-, %{engine_user}, %{engine_group}) %{engine_log}
3 %dir %attr(-, %{engine_user}, %{engine_group}) %{engine_log}/dump
4 %dir %{engine_data}
5 %dir %{engine_data}/bin
6 %dir %{engine_data}/branding
7 %dir %{engine_data}/conf
8 %dir %{engine_data}/engine.ear
9 %dir %{engine_data}/services
10 %dir %{engine_etc}
11 %dir %{engine_etc}/branding
12 %dir %{engine_java}
13 %doc LICENSE
14 %{engine_data}/branding/ovirt.brand/
15 %{engine_etc}/branding/00-ovirt.brand
16 %{engine_etc}/engine.conf.d/
17 %{engine_java}/authentication.jar
18 %{engine_java}/branding.jar
19 %{engine_java}/common.jar
20 %{engine_java}/compat.jar
21 %{engine_java}/utils.jar
22 %{engine_pki}/publicKey.keystore
%if "%{name}" != "%{engine_name}"
%{_javadir}/%{name}
%endif

打包 lib 子包,文件目录处理,权限设置

序号 文件目录说明
1 %{engine_data}/bin/java-home
2 %{python_sitelib}/ovirt_engine/

打包 desktopManager 子包,文件目录处理,权限设置

序号 文件目录说明
1 %{engine_ear}/tmp/desktopManager.war

打包 backend 子包,文件目录处理,权限设置

序号 文件目录说明
1 %attr(-, %{engine_user}, %{engine_group}) %{engine_log}/host-deploy
2 %attr(-, %{engine_user}, %{engine_group}) %{engine_state}/content
3 %config %{_sysconfdir}/logrotate.d/ovirt-engine
4 %dir %attr(-, %{engine_user}, %{engine_group}) %{engine_state}
5 %dir %{engine_data}/bin
6 %dir %{engine_data}/ui-plugins
7 %dir %{engine_ear}
8 %{engine_data}/conf/osinfo-defaults.properties
9 %{engine_data}/conf/sysprep/
10 %{engine_data}/files/
11 %{engine_doc}/AuditLogMessages.properties
12 %{engine_ear}/META-INF
13 %{engine_ear}/bll.jar
14 %{engine_ear}/docs.war/
15 %{engine_ear}/lib
16 %{engine_ear}/root.war/
17 %{engine_ear}/scheduler.jar
18 %{engine_ear}/services.war/
19 %{engine_ear}/welcome.war/
20 %{engine_etc}/osinfo.conf.d/
21 %{engine_java}/bll.jar
22 %{engine_java}/dal.jar
23 %{engine_java}/scheduler.jar
24 %{engine_java}/searchbackend.jar
25 %{engine_java}/vdsbroker.jar
26 %{engine_jboss_modules}/
27 %{engine_data}/services/ovirt-engine
序号 文件目录说明
1 %config(noreplace) %{engine_pki}/cacert.template.in
2 %config(noreplace) %{engine_pki}/cert.template.in
3 %config(noreplace) %{engine_pki}/openssl.conf
4 %dir %attr(-, %{engine_user}, %{engine_group}) %{engine_pki}
5 %dir %attr(-, %{engine_user}, %{engine_group}) %{engine_pki}/certs
6 %dir %attr(-, %{engine_user}, %{engine_group}) %{engine_pki}/private
7 %dir %attr(-, %{engine_user}, %{engine_group}) %{engine_pki}/requests
8 %dir %{engine_pki}/keys
9 %{engine_data}/bin/pki-common.sh
10 %{engine_data}/bin/pki-create-ca.sh
11 %{engine_data}/bin/pki-enroll-pkcs12.sh
12 %{engine_data}/bin/pki-enroll-request.sh
13 %{engine_data}/bin/pki-pkcs12-extract.sh

打包 setup-base 子包,文件目录处理,权限设置

序号 文件目录说明
1 %config %{_sysconfdir}/logrotate.d/ovirt-engine-setup
2 %dir %{engine_data}/setup/bin/
3 %dir %{engine_log}/setup
4 %{_bindir}/engine-cleanup
5 %{_bindir}/engine-setup
6 %{_mandir}/man8/engine-cleanup.*
7 %{_mandir}/man8/engine-setup.*
8 %{engine_data}/bin/ovirt-engine-log-setup-event.sh
9 %{engine_data}/conf/iptables.default.in
10 %{engine_data}/setup/bin/ovirt-engine-remove
11 %{engine_data}/setup/bin/ovirt-engine-setup
12 %{engine_data}/setup/bin/ovirt-engine-setup.env
13 %{engine_data}/setup/ovirt_engine_setup/
14 %{engine_data}/setup/plugins/*/base/
15 %{engine_state}/backups/
16 %{engine_state}/setup/

打包 setup 子包,文件目录处理,权限设置

序号 文件目录说明
1 %{_bindir}/%{name}-setup
2 %{_bindir}/%{name}-upgrade
3 %{_bindir}/%{name}-check-update
4 %{_bindir}/%{name}-cleanup
5 %{_mandir}/man8/%{name}-setup.*

打包 setup-plugin-ovirt-engine 子包,文件目录处理,权限设置

序号 文件目录说明
1 %config %{_sysconfdir}/ovirt-engine-setup.conf.d/10-packaging.conf
2 %{_bindir}/engine-upgrade-check
3 %{engine_data}/conf/ovirt-engine-proxy.conf.v2.in
4 %{engine_data}/conf/ovirt-engine-root-redirect.conf.in
5 %{engine_data}/firewalld/ovirt-engine/
6 %{engine_data}/setup/bin/ovirt-engine-rename
7 %{engine_data}/setup/bin/ovirt-engine-upgrade-check
8 %{engine_data}/setup/dbutils/
9 %{engine_data}/setup/plugins/*/ovirt-engine/
10 %{engine_data}/setup/plugins/ovirt-engine-rename/

打包 setup-plugin-ovirt-engine-common 子包,文件目录处理,权限设置

序号 文件目录说明
1 %{engine_data}/setup/plugins/*/ovirt-engine-common/

打包 setup-plugin-websocket-proxy 子包,文件目录处理,权限设置

序号 文件目录说明
1 %{engine_data}/firewalld/websocket-proxy/
2 %{engine_data}/setup/plugins/*/websocket_proxy/

打包 setup-plugin-allinone 子包,文件目录处理,权限设置

序号 文件目录说明
1 %config %{_sysconfdir}/ovirt-engine-setup.conf.d/10-packaging-aio.conf
2 %config %{_sysconfdir}/ovirt-host-deploy.conf.d/10-packaging-aio.conf
3 %{engine_data}/firewalld/aio/

打包 dbscripts 子包,文件目录处理,权限设置

序号 文件目录说明
1 %{engine_data}/dbscripts/

打包 restapi 子包,文件目录处理,权限设置

序号 文件目录说明
1 %{engine_java}/interface-common-jaxrs.jar
2 %{engine_java}/restapi-definition.jar
3 %{engine_java}/restapi-jaxrs.jar
4 %{engine_java}/restapi-types.jar
5 %{engine_restapi_war}/
6 %{engine_legacy_restapi_war}/

打包 userportal 子包,文件目录处理,权限设置

序号 文件目录说明
1 %config %{engine_etc}/usbfilter.txt
2 %{engine_ear}/userportal.war

打包 webadmin-portal 子包,文件目录处理,权限设置

序号 文件目录说明
1 %{engine_ear}/webadmin.war
2 %files websocket-proxy
3 %{engine_data}/services/ovirt-websocket-proxy
4 %{engine_etc}/ovirt-websocket-proxy.conf.d/

打包 tools 子包,文件目录处理,权限设置

序号 文件目录说明
1 %config %{_sysconfdir}/logrotate.d/ovirt-engine-notifier
2 %config %{engine_etc}/notifier/log4j.xml
3 %config(noreplace) %{engine_etc}/engine-config/engine-config.conf
4 %config(noreplace) %{engine_etc}/engine-manage-domains/engine-manage-domains.conf
5 %dir %attr(-, %{engine_user}, %{engine_group}) %{engine_log}/notifier
6 %dir %attr(-, %{engine_user}, %{engine_group}) %{engine_run}/notifier
7 %dir %{engine_etc}/engine-config
8 %dir %{engine_etc}/engine-manage-domains
9 %dir %{engine_etc}/notifier
10 %{_bindir}/engine-backup
11 %{_bindir}/engine-config
12 %{_bindir}/engine-manage-domains
13 %{_mandir}/man8/engine-backup.*
14 %{_mandir}/man8/engine-config.*
15 %{_mandir}/man8/engine-manage-domains.*
16 %{engine_data}/bin/engine-backup.sh
17 %{engine_data}/bin/engine-config.sh
18 %{engine_data}/bin/engine-manage-domains.sh
19 %{engine_data}/bin/engine-prolog.sh
20 %{engine_data}/conf/jaas.conf
21 %{engine_data}/services/ovirt-engine-notifier
22 %{engine_etc}/engine-config/engine-config.*properties
23 %{engine_etc}/notifier/notifier.conf.d/
24 %{engine_java}/tools.jar

记录日志

* Mon Jan 27 2015 Max Kovgan <mvk@redhat.com> - 3.4.5
- BZ#1169352 BZ#1151053 BZ#1166010 BZ#1147396 BZ#1169404
  BZ#1180072 BZ#1171467 BZ#1154184

* Mon Nov 10 2014 Barak Korren <bkorren@redhat.com> - 3.4.4
- BZ#1135112 BZ#1141761 BZ#1152448 BZ#1154569 BZ#1155557
  BZ#1155571 BZ#1155573 BZ#1155649 BZ#1155698 BZ#1155906
  BZ#1155920 BZ#1155986 BZ#1155987 BZ#1156012 BZ#1157212
  BZ#1157678 BZ#1158042 BZ#1158090 BZ#1159751 BZ#1159761
  BZ#1159849 BZ#1161923
上一篇 下一篇

猜你喜欢

热点阅读