1
0
forked from cockpit/cockpit
cockpit/cockpit.spec

579 lines
16 KiB
RPMSpec

#
# This file is maintained at the following location:
# https://github.com/cockpit-project/cockpit/blob/master/tools/cockpit.spec
#
# If you are editing this file in another location, changes will likely
# be clobbered the next time an automated release is done.
#
# Check first cockpit-devel@lists.fedorahosted.org
#
%if 0%{?suse_version}
%global tag 0.79
%else
# Globals that may be defined elsewhere
# * gitcommit xxxx
# * selinux 1
# * tag 0.71
#
%endif
%define branding auto
%define rev 1
%if %{defined gitcommit}
%define extra_flags CFLAGS='-O2 -Wall -Werror -fPIC -g -DWITH_DEBUG'
%define branding default
%endif
#Defaults for our SELinux policy toggle
%if %{undefined selinux}
%if %{defined gitcommit}
%define selinux 1
%endif
%if 0%{?fedora} > 0 && 0%{?fedora} <= 21
%define selinux 1
%endif
%if 0%{?rhel}
%define selinux 1
%endif
%if 0%{?centos}
%define rhel 0
%endif
%endif
%define _hardened_build 1
%define libssh_version 0.7.1
%if 0%{?fedora} > 0 && 0%{?fedora} < 22
%define libssh_version 0.6.0
%endif
Name: cockpit
%if %{defined gitcommit}
Version: %{gitcommit}
%else
Version: %{tag}
%endif
Release: %{rev}%{?dist}
Summary: A user interface for Linux servers
%if 0%{?suse_version}
License: LGPL-2.1+
%else
License: LGPLv2+
%endif
URL: http://cockpit-project.org/
%if %{defined gitcommit}
Source0: cockpit-%{version}.tar.gz
%else
Source0: https://github.com/cockpit-project/cockpit/releases/download/%{version}/cockpit-%{version}.tar.bz2
%endif
%if 0%{?suse_version}
Source1: cockpit-suse.pam
%else
Source1: cockpit-fedora.pam
%endif
# openSUSE doesn't carry Fedora branding pixmaps
Patch1: branding-symlinks.patch
BuildRequires: pkgconfig(gio-unix-2.0)
BuildRequires: pkgconfig(json-glib-1.0)
BuildRequires: pkgconfig(polkit-agent-1) >= 0.105
BuildRequires: pam-devel
BuildRequires: autoconf automake
BuildRequires: intltool
BuildRequires: libssh-devel >= %{libssh_version}
BuildRequires: openssl-devel
BuildRequires: zlib-devel
BuildRequires: krb5-devel
BuildRequires: libxslt-devel
%if 0%{?suse_version}
BuildRequires: -post-build-checks
BuildRequires: -rpmlint-mini
BuildRequires: -rpmlint-Factory
%define extra_flags CFLAGS='$(RPM_OPT_FLAGS)'
BuildRequires: update-desktop-files
BuildRequires: docbook-xsl-stylesheets
BuildRequires: keyutils-devel
BuildRequires: dbus-1-devel
BuildRequires: libpcp-devel
%else
BuildRequires: docbook-style-xsl
BuildRequires: keyutils-libs-devel
BuildRequires: pcp-libs-devel
%endif
BuildRequires: glib-networking
BuildRequires: sed
BuildRequires: glib2-devel >= 2.37.4
BuildRequires: systemd-devel
BuildRequires: gdb
BuildRequires: glib-networking
BuildRequires: systemd
BuildRequires: polkit
%if %{defined gitcommit}
BuildRequires: npm
BuildRequires: nodejs
# For kerberos tests
BuildRequires: krb5-server
%endif
# For selinux
%if 0%{?selinux}
BuildRequires: selinux-policy-devel
BuildRequires: checkpolicy
BuildRequires: selinux-policy-doc
BuildRequires: sed
%endif
# For documentation
BuildRequires: xmlto
Requires: %{name}-bridge = %{version}-%{release}
Requires: %{name}-networkmanager = %{version}-%{release}
Requires: %{name}-ws = %{version}-%{release}
Requires: %{name}-shell = %{version}-%{release}
Requires: %{name}-storaged = %{version}-%{release}
%ifarch x86_64 armv7hl
Requires: %{name}-docker = %{version}-%{release}
%endif
%if 0%{?rhel}
Requires: %{name}-subscriptions = %{version}-%{release}
%endif
%description
Cockpit runs in a browser and can manage your network of GNU/Linux
machines.
%package bridge
Summary: Cockpit bridge server-side component
Provides: %{name}-daemon
Obsoletes: %{name}-daemon < 0.48-2
Requires: polkit
%description bridge
The Cockpit bridge component installed server side and runs commands on the
system on behalf of the web based user interface.
%package doc
Summary: Cockpit deployment and developer guide
%description doc
The Cockpit Deployment and Developer Guide shows sysadmins how to
deploy Cockpit on their machines as well as helps developers who want to
embed or extend Cockpit.
%package pcp
Summary: Cockpit PCP integration
Requires: %{name}-bridge = %{version}-%{release}
Requires: pcp
%description pcp
Cockpit support for reading PCP metrics and loading PCP archives.
%package ws
Summary: Cockpit Web Service
Requires: glib-networking
Requires: openssl
Requires: glib2 >= 2.37.4
Requires: libssh >= %{libssh_version}
Requires(post): systemd
Requires(preun): systemd
Requires(postun): systemd
%description ws
The Cockpit Web Service listens on the network, and authenticates users.
%prep
%setup -q
%if 0%{?fedora} == 20
sed -i s/unconfined_service_t/unconfined_t/g src/ws/test-server.service.in
%endif
%if 0%{?suse_version}
%patch1 -p1
%endif
%build
%if %{defined gitcommit}
env NOCONFIGURE=1 ./autogen.sh
%endif
%configure --disable-static --disable-silent-rules --with-cockpit-user=cockpit-ws --with-branding=%{branding}
make -j %{?extra_flags} all
%if 0%{?selinux}
make selinux
%endif
%check
# needs full network access, doesn't work in build service
%if 0%{?suse_version} == 0
make -j check
%end
%install
make install DESTDIR=%{buildroot}
%if %{defined gitcommit}
make install-test-assets DESTDIR=%{buildroot}
mkdir -p %{buildroot}/%{_datadir}/polkit-1/rules.d
cp src/bridge/polkit-workarounds.rules %{buildroot}/%{_datadir}/polkit-1/rules.d
%else
rm -rf %{buildroot}/%{_datadir}/%{name}/playground
%endif
mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/pam.d
install -p -m 644 tools/cockpit.pam $RPM_BUILD_ROOT%{_sysconfdir}/pam.d/cockpit
rm -f %{buildroot}/%{_libdir}/cockpit/*.so
%if 0%{?suse_version}
install -d %{buildroot}%{_docdir}/%{name}
%endif
install -p -m 644 AUTHORS COPYING README.md %{buildroot}%{_docdir}/%{name}/
%if 0%{?selinux}
install -d %{buildroot}%{_datadir}/selinux/targeted
install -p -m 644 cockpit.pp %{buildroot}%{_datadir}/selinux/targeted/
%endif
# Build the package lists for resource packages
echo '%dir %{_datadir}/%{name}/base1' > shell.list
find %{buildroot}%{_datadir}/%{name}/base1 -type f >> shell.list
echo '%dir %{_datadir}/%{name}/dashboard' >> shell.list
find %{buildroot}%{_datadir}/%{name}/dashboard -type f >> shell.list
echo '%dir %{_datadir}/%{name}/domain' >> shell.list
find %{buildroot}%{_datadir}/%{name}/domain -type f >> shell.list
echo '%dir %{_datadir}/%{name}/shell' >> shell.list
find %{buildroot}%{_datadir}/%{name}/shell -type f >> shell.list
echo '%dir %{_datadir}/%{name}/system' >> shell.list
find %{buildroot}%{_datadir}/%{name}/system -type f >> shell.list
echo '%dir %{_datadir}/%{name}/users' >> shell.list
find %{buildroot}%{_datadir}/%{name}/users -type f >> shell.list
echo '%dir %{_datadir}/%{name}/subscriptions' > subscriptions.list
find %{buildroot}%{_datadir}/%{name}/subscriptions -type f >> subscriptions.list
echo '%dir %{_datadir}/%{name}/storage' > storaged.list
find %{buildroot}%{_datadir}/%{name}/storage -type f >> storaged.list
echo '%dir %{_datadir}/%{name}/network' > networkmanager.list
find %{buildroot}%{_datadir}/%{name}/network -type f >> networkmanager.list
%ifarch x86_64 armv7hl
echo '%dir %{_datadir}/%{name}/docker' > docker.list
find %{buildroot}%{_datadir}/%{name}/docker -type f >> docker.list
%else
rm -rf %{buildroot}/%{_datadir}/%{name}/docker
touch docker.list
%endif
%if 0%{?suse_version}
%suse_update_desktop_file -u -r -G 'Cockpit Server Manager' %{name} System Utility
mv %{buildroot}%{_datadir}/doc/%{name} %{buildroot}%{_docdir}/%{name}/html
ln -sf /sbin/service $RPM_BUILD_ROOT/usr/sbin/rc%{name}
# no firewalld on SUSE
rm -rf %{buildroot}%{_prefix}/lib/firewalld
# PAM security
install -d %{buildroot}/%{_lib}/security
mv %{buildroot}%{_libdir}/security/pam_reauthorize.so %{buildroot}/%{_lib}/security
rm -rf %{_libdir}/security
%endif
%ifarch x86_64
echo '%dir %{_datadir}/%{name}/kubernetes' > kubernetes.list
find %{buildroot}%{_datadir}/%{name}/kubernetes -type f >> kubernetes.list
%else
rm -rf %{buildroot}/%{_datadir}/%{name}/kubernetes
touch kubernetes.list
%endif
sed -i "s|%{buildroot}||" *.list
# Build the package lists for debug package, and move debug files to installed locations
find %{buildroot}/usr/src/debug%{_datadir}/%{name} -type f -o -type l > debug.list
sed -i "s|%{buildroot}/usr/src/debug||" debug.list
tar -C %{buildroot}/usr/src/debug -cf - . | tar -C %{buildroot} -xf -
rm -rf %{buildroot}/usr/src/debug
# On RHEL subscriptions, networkmanager, and docker are part of the shell package
%if 0%{?rhel}
cat subscriptions.list docker.list networkmanager.list >> shell.list
%endif
# Only strip out debug info in non wip builds
%if %{defined gitcommit}
%define find_debug_info %{nil}
%else
%define find_debug_info %{_rpmconfigdir}/find-debuginfo.sh %{?_missing_build_ids_terminate_build:--strict-build-id} %{?_include_minidebuginfo:-m} %{?_find_debuginfo_dwz_opts} %{?_find_debuginfo_opts} "%{_builddir}/%{?buildsubdir}"
%endif
# Redefine how debug info is built to slip in our extra debug files
%define __debug_install_post \
%{find_debug_info} \
cat debug.list >> %{_builddir}/%{?buildsubdir}/debugfiles.list \
%{nil}
%files
%if 0%{?suse_version}
%defattr(-,root,root)
%endif
%{_docdir}/%{name}/AUTHORS
%{_docdir}/%{name}/COPYING
%{_docdir}/%{name}/README.md
%dir %{_datadir}/%{name}
%{_datadir}/appdata
%{_datadir}/applications
%{_datadir}/pixmaps
%files bridge
%if 0%{?suse_version}
%defattr(-,root,root)
%endif
%doc %{_mandir}/man1/cockpit-bridge.1.gz
%{_bindir}/cockpit-bridge
%attr(4755, -, -) %{_libexecdir}/cockpit-polkit
%if 0%{?suse_version}
/%{_lib}/security/pam_reauthorize.so
%else
%{_libdir}/security/pam_reauthorize.so
%endif
%files doc
%if 0%{?suse_version}
%defattr(-,root,root)
%endif
%exclude %{_docdir}/%{name}/AUTHORS
%exclude %{_docdir}/%{name}/COPYING
%exclude %{_docdir}/%{name}/README.md
%{_docdir}/%{name}
%files pcp
%{_libexecdir}/cockpit-pcp
%{_localstatedir}/lib/pcp/config/pmlogconf/tools/cockpit
%post pcp
# HACK - https://bugzilla.redhat.com/show_bug.cgi?id=1185749
( cd %{_localstatedir}/lib/pcp/pmns && ./Rebuild -du )
# HACK - https://bugzilla.redhat.com/show_bug.cgi?id=1185764
# We can't use "systemctl reload-or-try-restart" since systemctl might
# be out of sync with reality.
/usr/share/pcp/lib/pmlogger reload
%files ws
%{_sbindir}/rccockpit
%if 0%{?suse_version}
%defattr(-,root,root)
%endif
%doc %{_mandir}/man5/cockpit.conf.5.gz
%doc %{_mandir}/man8/cockpit-ws.8.gz
%doc %{_mandir}/man8/remotectl.8.gz
%doc %{_mandir}/man8/pam_ssh_add.8.gz
%config(noreplace) %{_sysconfdir}/%{name}
%config(noreplace) %{_sysconfdir}/pam.d/cockpit
%{_unitdir}/cockpit.service
%{_unitdir}/cockpit.socket
%if !0%{?suse_version}
%{_prefix}/lib/firewalld/services/cockpit.xml
%endif
%{_sbindir}/remotectl
%{_libdir}/security/pam_ssh_add.so
%{_libexecdir}/cockpit-ws
%attr(4750, root, cockpit-ws) %{_libexecdir}/cockpit-session
%if !0%{?suse_version}
%attr(775, -, wheel) %{_localstatedir}/lib/%{name}
%endif
%{_datadir}/%{name}/static
%{_datadir}/%{name}/branding
%pre ws
%if 0%{?suse_version}
%service_add_pre %{name}.service %{name}.socket
%endif
getent group cockpit-ws >/dev/null || groupadd -r cockpit-ws
getent passwd cockpit-ws >/dev/null || useradd -r -g cockpit-ws -d / -s /sbin/nologin -c "User for cockpit-ws" cockpit-ws
%post ws
%if 0%{?suse_version}
%service_add_post %{name}.service %{name}.socket
%else
%systemd_post cockpit.socket
%endif
# firewalld only partially picks up changes to its services files without this
test -f %{_bindir}/firewall-cmd && firewall-cmd --reload --quiet || true
%preun ws
%if 0%{?suse_version}
%service_del_preun %{name}.service %{name}.socket
%else
%systemd_preun cockpit.socket
%endif
%postun ws
%if 0%{?suse_version}
%service_del_postun %{name}.service %{name}.socket
%else
%systemd_postun_with_restart cockpit.socket
%endif
%package shell
Summary: Cockpit Shell user interface package
Requires: %{name}-bridge = %{version}-%{release}
Requires: shadow-utils
Requires: grep
Requires: libpwquality
Requires: /usr/bin/date
%if 0%{?rhel}
Provides: %{name}-subscriptions = %{version}-%{release}
Requires: subscription-manager >= 1.13
Provides: %{name}-networkmanager = %{version}-%{release}
Requires: NetworkManager
%ifarch x86_64 armv7hl
Provides: %{name}-docker = %{version}-%{release}
Requires: docker >= 1.3.0
%endif
%endif
Provides: %{name}-assets
Obsoletes: %{name}-assets < 0.32
BuildArch: noarch
%description shell
This package contains the Cockpit shell UI assets.
%files shell -f shell.list
%if 0%{?suse_version}
%defattr(-,root,root)
%endif
%package storaged
Summary: Cockpit user interface for storage, using Storaged
Requires: storaged >= 2.1.1
Requires: storaged-lvm2 >= 2.1.1
Requires: device-mapper-multipath
BuildArch: noarch
%description storaged
The Cockpit component for managing storage. This package uses Storaged.
%files storaged -f storaged.list
# Conditionally built packages below
%if 0%{?rhel} == 0
%package subscriptions
Summary: Cockpit subscription user interface package
Requires: subscription-manager >= 1.13
BuildArch: noarch
%description subscriptions
This package contains the Cockpit user interface integration with local
subscription management.
%files subscriptions -f subscriptions.list
%package networkmanager
Summary: Cockpit user interface for networking, using NetworkManager
Requires: NetworkManager
BuildArch: noarch
%description networkmanager
The Cockpit component for managing networking. This package uses NetworkManager.
%files networkmanager -f networkmanager.list
%ifarch x86_64 armv7hl
%package docker
Summary: Cockpit user interface for Docker containers
Requires: docker >= 1.3.0
%description docker
The Cockpit components for interacting with Docker and user interface.
This package is not yet complete.
%files docker -f docker.list
%if 0%{?suse_version}
%defattr(-,root,root)
%endif
%endif
%endif
%ifarch x86_64
%package kubernetes
Summary: Cockpit user interface for Kubernetes cluster
Requires: /usr/bin/kubectl
%description kubernetes
The Cockpit components for visualizing and configuring a Kubernetes
cluster. Installed on the Kubernetes master. This package is not yet complete.
%files kubernetes -f kubernetes.list
%endif
%if %{defined gitcommit}
%package test-assets
Summary: Additional stuff for testing Cockpit
Requires: openssh-clients
%description test-assets
This package contains programs and other files for testing Cockpit, and
pulls in some necessary packages via dependencies.
%files test-assets
%if 0%{?suse_version}
%defattr(-,root,root)
%endif
%{_datadir}/%{name}/playground
%{_datadir}/cockpit-test-assets
%{_datadir}/polkit-1/rules.d
%{_unitdir}/cockpit-testing.service
%{_unitdir}/cockpit-testing.socket
%{_unitdir}/test-server.service
%{_unitdir}/test-server.socket
%endif
%if 0%{?selinux}
%package selinux-policy
Summary: SELinux policy for Cockpit testing
Requires: %{name} = %{version}-%{release}
Requires: selinux-policy
Requires: selinux-policy-targeted
Requires(post): /usr/sbin/semodule, /sbin/restorecon, /sbin/fixfiles
Requires(postun): /usr/sbin/semodule, /sbin/restorecon, /sbin/fixfiles
BuildArch: noarch
%description selinux-policy
SELinux policy for Cockpit testing.
%files selinux-policy
%defattr(-,root,root,0755)
%{_datadir}/selinux/targeted/cockpit.pp
%post selinux-policy
/usr/sbin/semodule -s targeted -i %{_datadir}/selinux/targeted/cockpit.pp
/sbin/fixfiles -R cockpit restore || :
/sbin/fixfiles -R cockpit-test-assets restore || :
/sbin/restorecon -R %{_localstatedir}/lib/%{name}
%postun selinux-policy
if [ $1 -eq 0 ] ; then
/usr/sbin/semodule -s targeted -r cockpit &> /dev/null || :
/sbin/fixfiles -R cockpit-selinux-policy restore || :
[ -d %{_localstatedir}/lib/%{name} ] && \
/sbin/restorecon -R %{_localstatedir}/lib/%{name} &> /dev/null || :
fi
%endif
%changelog
# Upstream changelog is empty