#####################################################################################
# Copyright 2011 Normation SAS
#####################################################################################
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
#####################################################################################
#=================================================
# Variables
#=================================================
%define rudderdir /opt/rudder
%define ruddervardir /var/rudder
%define rudderlogdir /var/log/rudder
%define bindir /usr/bin
# use_system_lmdb checks if to build CFEngine we will need to build LMDB or if
# a package already exists on the system.
# Default value is false since no rpm based target provides it
%define use_system_lmdb false
# We want openssl 1.1.1 which is currently provided by noone
%define use_system_openssl false
# Same goes for the use of the local PCRE install vs. a bundled one
%define use_system_pcre true
# We need to build curl since we embed openssl
%define use_system_curl false
# Same goes for the use of the local jq install vs. a bundled one
%define use_system_jq true
# Same goes for the use of the local libyaml install vs. a bundled one
%define use_system_yaml true
# Same goes for the use of the local libxml2 install vs. a bundled one
%define use_system_xml true
# Same goes for the use of the local zlib install vs. a bundled one
%define use_system_zlib true
# Same goes for the use of the local perl install vs. a bundled one
%define use_system_perl true
# Default to using systemd for service management
%define use_systemd true
# Default to use PIE code if possible
%define use_pie true
# Default to use ACL library in th agent
%define use_acl true
%if 0%{?rhel} == 8
# https://pagure.io/packaging-committee/issue/738
%define __brp_mangle_shebangs /usr/bin/true
%endif
%if 0%{?fedora}
# https://pagure.io/packaging-committee/issue/738
%define __brp_mangle_shebangs /usr/bin/true
%endif
# Default to embed fusion
%define use_system_fusion false
# 1- AIX
%if "%{?aix}"
# no system anything on aix
%define use_system_perl false
%define use_system_jq false
%define use_system_pcre false
%define use_system_zlib false
%define use_system_yaml false
%define use_system_xml false
%define use_pie false
%define use_acl false
%endif
# 2 - RHEL & Fedora
%if 0%{?rhel} && 0%{?rhel} == 3
# no PCRE on RHEL3
%define use_system_pcre false
%endif
%if 0%{?rhel} && 0%{?rhel} <= 5
# system perl too old on RHEL3 and RHEL5
%define use_system_perl false
%define use_system_yaml false
#libxml too old
%define use_system_xml false
%endif
%if 0%{?rhel} && 0%{?rhel} <= 6
# PIE and PIC incompatible on old gcc
%define use_pie false
%endif
%if 0%{?rhel} && 0%{?rhel} < 8
# no jq before RHEL8
%define use_system_jq false
%endif
%if 0%{?fedora}
%define use_system_curl true
%define use_system_jq false
%define use_system_openssl true
%endif
%if 0%{?rhel} && 0%{?rhel} >= 8
%define use_system_curl true
%define use_system_openssl true
%endif
# 3 - SUSE
# Reference for suse_version : https://en.opensuse.org/openSUSE:Build_Service_cross_distribution_howto
%if 0%{?suse_version} && 0%{?suse_version} < 1200
# system perl and openssl too old on sles 10 and 11
%define use_system_perl false
# no yaml on sles 10 and 11
%define use_system_yaml false
#libxml too old
%define use_system_xml false
# PIE and PIC incompatible on old gcc
%define use_pie false
%endif
%if 0%{?suse_version} && !0%{?is_opensuse}
# no jq on sles, only on opensuse
%define use_system_jq false
%endif
#=================================================
# Header
#=================================================
Summary: Configuration management and audit tool - agent
Name: rudder-agent
#Version: %{real_version}
Version: 6.1.1
Release: 1%{?dist}
#Epoch: %{real_epoch}
License: GPLv3
URL: https://www.rudder.io/
Group: Applications/System
Source0: SOURCES.tgz
AutoReq: 0
AutoProv: 0
%if "%{use_system_perl}" == "true"
Requires: perl
%endif
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
# Generic requirements
BuildRequires: gcc bison flex autoconf automake libtool
Conflicts: rudder-agent-thin
# Specific requirements
%if "%{use_system_fusion}" == "true"
Requires: fusioninventory-agent fusioninventory-agent-task-inventory
%endif
## For Linux
%if "%{?aix}" ==""
BuildRequires: pam-devel
Requires: syslog
%endif
## Requirement for cpanminus
# RHEL >= 6 and Fedora (no OR for Fedora, not supported by old rpm, used in aix)
%if 0%{?rhel} && 0%{?rhel} >= 6
BuildRequires: perl-IPC-Cmd
%endif
%if 0%{?fedora}
BuildRequires: perl-IPC-Cmd
%endif
# RHEL perl core is too minimal, we try to not add too much here
# RHEL >= 7 and Fedora (no OR for Fedora, not supported by old rpm, used in aix)
%if 0%{?rhel} && 0%{?rhel} >= 7
Requires: perl-Digest
BuildRequires: perl-Digest
%endif
%if 0%{?fedora}
Requires: perl-Digest
BuildRequires: perl-Digest
%endif
## For RHEL and Fedora
%if 0%{?rhel}
BuildRequires: make byacc
Requires: crontabs net-tools diffutils
%endif
%if 0%{?fedora}
BuildRequires: make byacc
Requires: crontabs net-tools diffutils
%endif
## For SLES
%if 0%{?suse_version}
Requires: cron net-tools diffutils
%endif
# dmiecode package on RHEL4+ and fedora
%if 0%{?rhel} && 0%{?rhel} >= 4
Requires: dmidecode
%endif
%%if 0%{?fedora}
Requires: dmidecode
%endif
# dmiecode is provided by kernel-utils on RHEL3
%if 0%{?rhel} && 0%{?rhel} < 4
Requires: kernel-utils
%endif
# https fails on old distro because they don't support modern certificates (namely RHEL3, aix5, sles10 and sles11)
%define use_https true
%if 0%{?rhel} && 0%{?rhel} < 6
%define use_https false
%endif
%if 0%{?suse_version} && 0%{?suse_version} < 1200
%define use_https false
%endif
%if "%{?aix}"
%define use_https false
%endif
# Reference for suse_version : https://en.opensuse.org/openSUSE:Build_Service_cross_distribution_howto
%if 0%{?suse_version} && 0%{?suse_version} < 1140
Requires: pmtools
%endif
%if 0%{?suse_version} && 0%{?suse_version} >= 1140
Requires: dmidecode
%endif
## ACL dependencies
%if "%{?aix}" == ""
BuildRequires: libacl-devel
Requires: libacl
%endif
%if 0%{?rhel} && 0%{?rhel} < 4
# libattr-devel should be a dependency of libacl-devel on RHEL3 but it's not declared
BuildRequires: libattr-devel
%endif
%if "%{use_system_jq}" == "true"
Requires: jq
%endif
## YAML dependencies
%if "%{use_system_yaml}" == "true"
BuildRequires: libyaml-devel
%endif
%if "%{use_system_yaml}" == "true" && 0%{?suse_version} && 0%{?suse_version} >= 1200
Requires: libyaml-0-2
%endif
# no yaml on sles other than 12
%if "%{use_system_yaml}" == "true" && 0%{?suse_version} == 0
Requires: libyaml
%endif
## XML dependencies
%if "%{use_system_xml}" == "true"
BuildRequires: libxml2-devel
Requires: libxml2
%endif
## CURL dependencies
%if "%{use_system_curl}" == "true"
BuildRequires: curl-devel
Requires: curl
%endif
## Openssl dependencies
%if "%{use_system_openssl}" == "true"
BuildRequires: openssl-devel
Requires: openssl
%endif
## PRE dependencies
%if "%{use_system_pcre}" == "true"
BuildRequires: pcre-devel
Requires: pcre
%endif
%global debug_package %{nil}
%description
Rudder is an open source configuration management and audit solution.
This package contains the agent that must be installed on all nodes to be
managed by Rudder. It is based on two main components: CFEngine Community 3 and
FusionInventory.
#=================================================
# Building
#=================================================
%prep
%setup -n SOURCES
%build
#cd %{_sourcedir}
# libattr libtool file is looked for in /lib64 but put in /usr/lib64 on RHEL3
%if 0%{?rhel} && 0%{?rhel} < 4
cp /usr/lib64/libattr.a /usr/lib64/libattr.la /lib64 || cp /usr/lib/libattr.a /usr/lib/libattr.la /lib
%endif
make BUILD_CFLAGS="${RPM_OPT_FLAGS}" USE_SYSTEM_OPENSSL=%{use_system_openssl} USE_SYSTEM_LMDB=%{use_system_lmdb} USE_SYSTEM_PCRE=%{use_system_pcre} USE_SYSTEM_FUSION=%{use_system_fusion} USE_SYSTEM_PERL=%{use_system_perl} USE_SYSTEM_JQ=%{use_system_jq} USE_HTTPS=%{use_https} USE_SYSTEM_ZLIB=%{use_system_zlib} USE_SYSTEM_CURL=%{use_system_curl} USE_SYSTEM_YAML=%{use_system_yaml} USE_SYSTEM_XML=%{use_system_xml} USE_PIE=%{use_pie} USE_ACL=%{use_acl}
# rhel7 doesn't have python 3 so we force python2 instead
%if 0%{?rhel} == 7
find . -type f | xargs sed -i '1,1s|#!/usr/bin/python3|#!/usr/bin/python2|'
%endif
%if 0%{?suse_version} && 0%{?suse_version} < 1500
find . -type f | xargs sed -i '1,1s|#!/usr/bin/python3|#!/usr/bin/python2|'
%endif
#=================================================
# Installation
#=================================================
%install
#cd %{_sourcedir}
#### Use systemd everywhere except on: AIX, RHEL<7, SLES<12, Fedora<15
%if "%{?aix}"
%define use_systemd false
%endif
%if 0%{?rhel} && 0%{?rhel} < 7
%define use_systemd false
%endif
%if 0%{?suse_version} && 0%{?suse_version} < 1315
%define use_systemd false
%endif
%if 0%{?fedora} && 0%{?fedora} < 15
%define use_systemd false
%endif
####
make install DESTDIR=%{buildroot} USE_SYSTEM_OPENSSL=%{use_system_openssl} USE_SYSTEM_LMDB=%{use_system_lmdb} USE_SYSTEM_JQ=%{use_system_jq} USE_SYSTEM_PCRE=%{use_system_pcre} USE_SYSTEM_ZLIB=%{use_system_zlib} USE_SYSTEM_CURL=%{use_system_curl} USE_SYSTEMD=%{use_systemd} USE_SYSTEM_FUSION=%{use_system_fusion} USE_SYSTEM_PERL=%{use_system_perl} USE_HTTPS=%{use_https} USE_SYSTEM_YAML=%{use_system_yaml} USE_SYSTEM_XML=%{use_system_xml} USE_PIE=%{use_pie} USE_ACL=%{use_acl}
# remove perl doc
rm -rf %{buildroot}/opt/rudder/man %{buildroot}/opt/rudder/lib/perl5/5.22.0/pod
# rhel8 do not have vzps
%if 0%{?rhel} == 8
rm -f %{buildroot}/opt/rudder/bin/vzps.py
%endif
# strip binaries
%if "%{?aix}" == ""
# already doen in makefile and file -i on aix has a different meaning
find %{buildroot}/opt/rudder/bin -type f | xargs file -i | grep -E "application/x-sharedlib|application/x-executable|application/x-pie-executable" | awk -F: '{print $1}' | xargs strip
%endif
# Build a list of files to include in this package for use in the %files section below
find %{buildroot} -type f -o -type l | sed "s,%{buildroot},," | sed "s,\.py$,\.py*," | grep -v "%{rudderdir}/etc/uuid.hive" | grep -v "/etc/bash_completion.d" | grep -v "%{ruddervardir}/cfengine-community/ppkeys" > %{_builddir}/file.list.%{name}
%pre
#=================================================
# Pre Installation
#=================================================
set -e
CFRUDDER_FIRST_INSTALL=$1
LOG_DIR="/var/log/rudder/install/"
LOG_FILE="${LOG_DIR}/rudder-agent.log"
mkdir -p "${LOG_DIR}"
echo "`date` - Starting rudder-agent pre installation script" >> ${LOG_FILE}
%post
#=================================================
# Post Installation
#=================================================
set -e
CFRUDDER_FIRST_INSTALL="false"
if [ $1 -eq 1 ]
then
CFRUDDER_FIRST_INSTALL="true"
fi
/opt/rudder/share/package-scripts/rudder-agent-postinst "${CFRUDDER_FIRST_INSTALL}" "rpm" "%{use_systemd}" ""
%preun
#=================================================
# Pre Uninstallation
#=================================================
set -e
# Do it during upgrade and uninstall
# Keep a backup copy of uuid.hive
if [ -f /opt/rudder/etc/uuid.hive ]; then
mkdir -p /var/backups/rudder
cp -f /opt/rudder/etc/uuid.hive /var/backups/rudder/uuid.hive-$(date +%Y%m%d)
echo "INFO: A back up copy of the /opt/rudder/etc/uuid.hive has been created in /var/backups/rudder"
fi
# Keep a backup copy of policy_server.dat
if [ -f /var/rudder/cfengine-community/policy_server.dat ]; then
mkdir -p /var/backups/rudder
cp -f /var/rudder/cfengine-community/policy_server.dat /var/backups/rudder/policy_server.dat-$(date +%Y%m%d)
echo "INFO: A back up copy of the /var/rudder/cfengine-community/policy_server.dat has been created in /var/backups/rudder"
fi
# Keep a backup copy of ppkeys
if [ -d /var/rudder/cfengine-community/ppkeys/ ]; then
mkdir -p /var/backups/rudder
cp -rf /var/rudder/cfengine-community/ppkeys/ /var/backups/rudder/ppkeys-$(date +%Y%m%d)
echo "INFO: A back up copy of the /var/rudder/cfengine-community/ppkeys has been created in /var/backups/rudder"
fi
# Keep a backup copy of agent certificate
if [ -f /opt/rudder/etc/ssl/agent.cert ]; then
mkdir -p /var/backups/rudder
cp -f /opt/rudder/etc/ssl/agent.cert /var/backups/rudder/agent.cert-$(date +%Y%m%d)
echo "INFO: A back up copy of the /opt/rudder/etc/ssl/agent.cert has been created in /var/backups/rudder"
fi
%postun
#=================================================
# Post Uninstallation
#=================================================
set -e
%if "%{?aix}"
# AIX doesn't have a pidof command, let's define it
function pidof {
# Yeah, "grep -v grep" is ugly, but we can't use the [u]nique trick on a variable
ps -A | grep "$1" | grep -v grep | awk '{print $1}';
}
%endif
# Do it only during uninstallation
if [ $1 -eq 0 ]; then
%if "%{use_systemd}" == "true"
systemctl stop rudder-agent || true
systemctl disable rudder-agent rudder-cf-execd rudder-cf-serverd || true
rm -f /lib/systemd/system/rudder-agent.service
rm -f /lib/systemd/system/rudder-cf-execd.service
rm -f /lib/systemd/system/rudder-cf-serverd.service
systemctl daemon-reload
%endif
# Make sure that CFEngine is not running anymore
for component in cf-agent cf-serverd cf-execd cf-monitord; do
if pid=`pidof ${component}`; then
kill -9 ${pid}
fi
done
%if "%{?aix}" == ""
# Remove the cron script we create at installation to prevent mail
# flooding, re-installation surprises, and general system garbage.
rm -f /etc/cron.d/rudder-agent
# Make sure that Rudder agent specific files have been removed
rm -f /etc/init.d/rudder
rm -f /etc/init.d/rudder-agent
rm -f /etc/default/rudder-agent
%else
# Remove the AIX inittab entry and subsystem definition
rmssys -s rudder-agent
rmitab rudder-agent
%endif
# Remove UUID in any case
rm -f /opt/rudder/etc/uuid.hive
rm -f %{ruddervardir}/cfengine-community/policy_server.dat
fi
#=================================================
# Cleaning
#=================================================
%clean
rm -rf %{buildroot}
rm -f %{_builddir}/file.list.%{name}
#=================================================
# Files
#=================================================
# Files from %{rudderdir} and %{ruddervardir} are automatically added via the -f option
%files -f %{_builddir}/file.list.%{name}
%defattr(-, root, root, 0755)
%attr(0700, -, -) %dir %{ruddervardir}/cfengine-community/ppkeys
%dir %{ruddervardir}/cfengine-community/bin
%dir %{ruddervardir}/cfengine-community/inputs
%dir %{ruddervardir}/tmp
%dir %{ruddervardir}/ncf/common
%dir %{ruddervardir}/ncf/local
%dir %{ruddervardir}/inventories
%dir %{ruddervardir}/tools
%dir %{ruddervardir}/reports/ready
%dir %{rudderlogdir}/install
%dir %{rudderlogdir}/agent-check
%if "%{?aix}" == ""
# no init no cron and no profile with aix
%config /etc/cron.d/rudder-agent
%config /etc/profile.d/rudder-agent.sh
%if "%{use_systemd}" == "false"
%config(noreplace) /etc/default/rudder-agent
%endif
%endif
%config /etc/bash_completion.d/rudder.sh
#=================================================
# Changelog
#=================================================
%changelog
* Wed Nov 22 2017 - Rudder Team %{version}
- See https://docs.rudder.io/changelogs/current/index.html for changelogs