%global pkgname   dirsrv

%bcond bundle_jemalloc 1
%if %{with bundle_jemalloc}
%global jemalloc_name jemalloc
%global jemalloc_ver 5.3.0
%global __provides_exclude ^libjemalloc\\.so.*$
%endif

%bcond bundle_libdb %{defined rhel}
%if %{with bundle_libdb}
%global libdb_version 5.3
%global libdb_base_version db-%{libdb_version}.28
%global libdb_full_version lib%{libdb_base_version}-59
%global libdb_bundle_name libdb-%{libdb_version}-389ds.so
%if 0%{?fedora} >= 41 || 0%{?rhel} >= 11
# RPM 4.20
%global libdb_base_dir lib%{libdb_base_version}-build/%{libdb_base_version}
%else
%global libdb_base_dir %{libdb_base_version}
%endif
%endif

%bcond repl_reports 0
%if 0%{?fedora} >= 40
%bcond repl_reports 1
%endif

%if 0%{?fedora} >= 43
%bcond libbdb_ro 1
%else
%bcond libbdb_ro 0
%endif

# This is used in certain builds to help us know if it has extra features.
%global variant base
%global prerel __VERSION_PREREL__%{nil}

# This enables a sanitized build.
%bcond asan 0
%bcond msan 0
%bcond tsan 0
%bcond ubsan 0

%if %{with asan} || %{with msan} || %{with tsan} || %{with ubsan}
%global variant base-xsan
%endif

# Use Clang instead of GCC
%bcond clang 0
%if %{with msan}
%bcond clang 1
%endif

%if %{with clang}
%global toolchain clang
%global _lto_cflags %nil
%endif

# Build cockpit plugin
%bcond cockpit 1

# fedora 15 and later uses tmpfiles.d
# otherwise, comment this out
%{!?with_tmpfiles_d: %global with_tmpfiles_d %{_sysconfdir}/tmpfiles.d}

# systemd support
%global groupname %{pkgname}.target

# Filter argparse-manpage from autogenerated package Requires
%global __requires_exclude ^python.*argparse-manpage

# Force to require nss version greater or equal as the version available at the build time
# See bz1986327
%define dirsrv_requires_ge()  %(LC_ALL="C" echo '%*' | xargs -r rpm -q --qf 'Requires: %%{name} >= %%{epoch}:%%{version}\\n' | sed -e 's/ (none):/ /' -e 's/ 0:/ /' | grep -v "is not")

Summary:          389 Directory Server (%{variant})
Name:             389-ds-base
Version:          __VERSION__%{?prerel}
Release:          %{autorelease -n %{?with_asan:-e asan}}%{?dist}
License:          GPL-3.0-or-later WITH GPL-3.0-389-ds-base-exception AND (0BSD OR Apache-2.0 OR MIT) AND (Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR MIT) AND (Apache-2.0 OR BSL-1.0) AND (Apache-2.0 OR MIT OR Zlib) AND (Apache-2.0 OR MIT) AND (CC-BY-4.0 AND MIT) AND (MIT OR Apache-2.0) AND Unicode-DFS-2016 AND (MIT OR CC0-1.0) AND (MIT OR Unlicense) AND 0BSD AND Apache-2.0 AND BSD-2-Clause AND BSD-3-Clause AND ISC AND MIT AND MIT AND ISC AND MPL-2.0 AND PSF-2.0
URL:              https://www.port389.org/
Obsoletes:        %{name} <= 1.4.0.9
Obsoletes:        %{name}-legacy-tools < 1.4.4.6
Obsoletes:        %{name}-legacy-tools-debuginfo < 1.4.4.6
Provides:         ldif2ldbm

##### Bundled cargo crates list - START #####
##### Bundled cargo crates list - END #####

# Attach the buildrequires to the top level package:
BuildRequires:    nspr-devel
BuildRequires:    nss-devel >= 3.34
BuildRequires:    openldap-clients
BuildRequires:    openldap-devel
BuildRequires:    lmdb-devel
BuildRequires:    cyrus-sasl-devel
BuildRequires:    icu
BuildRequires:    libicu-devel
BuildRequires:    pcre2-devel
BuildRequires:    cracklib-devel
BuildRequires:    json-c-devel
%if %{with clang}
BuildRequires:    libatomic
BuildRequires:    clang
BuildRequires:    compiler-rt
BuildRequires:    lld
%else
BuildRequires:    gcc
BuildRequires:    gcc-c++
%if %{with asan}
BuildRequires:    libasan
%endif
%if %{with tsan}
BuildRequires:    libtsan
%endif
%if %{with ubsan}
BuildRequires:    libubsan
%endif
%endif
%if %{without libbdb_ro}
%if %{without bundle_libdb}
BuildRequires:    libdb-devel
%endif
%endif

# The following are needed to build the snmp ldap-agent
BuildRequires:    net-snmp-devel
BuildRequires:    bzip2-devel
BuildRequires:    openssl-devel
# the following is for the pam passthru auth plug-in
BuildRequires:    pam-devel
BuildRequires:    systemd-units
BuildRequires:    systemd-devel
BuildRequires:    cargo
BuildRequires:    rust
BuildRequires:    pkgconfig
BuildRequires:    pkgconfig(systemd)
BuildRequires:    pkgconfig(krb5)
BuildRequires:    pkgconfig(libpcre2-8)
# Needed to support regeneration of the autotool artifacts.
BuildRequires:    autoconf
BuildRequires:    automake
BuildRequires:    libtool
# For our documentation
BuildRequires:    doxygen
# For tests!
BuildRequires:    libcmocka-devel
# For lib389 and related components.
BuildRequires:    python%{python3_pkgversion}-devel

# For cockpit
%if %{with cockpit}
BuildRequires:    rsync
BuildRequires:    npm
BuildRequires:    nodejs
%endif

# END BUILD REQUIRES

# Now, attach the requires only to the package that needs them.
# -libs has most of our runtime libs
Requires:         %{name}-libs = %{version}-%{release}
Requires:         python%{python3_pkgversion}-lib389 = %{version}-%{release}

# this is needed for using semanage from our setup scripts
Requires:         policycoreutils-python-utils
# This is needed for our future move to python selinux interaction.
Requires:         libsemanage-python%{python3_pkgversion}
# the following are needed for some of our scripts
Requires:         openldap-clients
Requires:         acl
# this is needed to setup SSL if you are not using the
# administration server package
Requires:         nss-tools
%dirsrv_requires_ge nss
# these are not found by the auto-dependency method
# they are required to support the mandatory LDAP SASL mechs
Requires:         cyrus-sasl-gssapi
Requires:         cyrus-sasl-md5
# This is optionally supported by us, as we use it in our tests
Requires:         cyrus-sasl-plain
# this is needed for backldbm
%if %{with libbdb_ro}
Requires:         %{name}-robdb-libs = %{version}-%{release}
%else
%if %{without bundle_libdb}
Requires:         libdb
%endif
%endif
Requires:         lmdb
# This picks up libperl.so as a Requires, so we add this versioned one
Requires:         perl(:MODULE_COMPAT_%(eval "`%{__perl} -V:version`"; echo $version))
# Needed by logconv.pl
%if %{without libbdb_ro}
%if %{without bundle_libdb}
Requires:         perl-DB_File
%endif
%endif
Requires:         perl-Archive-Tar
%if 0%{?fedora} >= 33 || 0%{?rhel} >= 9
Requires:         perl-debugger
Requires:         perl-sigtrap
%endif
# Needed for password dictionary checks
Requires:         cracklib-dicts
Requires:         json-c
# Log compression
Requires:         zlib-devel
# logconv.py, MIME type
Requires:         python3-file-magic
# Picks up our systemd deps.
%{?systemd_requires}


Source0:          %{name}-%{version}.tar.bz2
Source2:          %{name}-devel.README
%if %{with bundle_jemalloc}
Source3:          https://github.com/jemalloc/%{jemalloc_name}/releases/download/%{jemalloc_ver}/%{jemalloc_name}-%{jemalloc_ver}.tar.bz2
%endif
%if %{with bundle_libdb}
Source4:          https://fedorapeople.org/groups/389ds/libdb-5.3.28-59.tar.bz2
%endif

%description
389 Directory Server is an LDAPv3 compliant server.  The base package includes
the LDAP server and command line utilities for server administration.
%if %{with asan}
WARNING! This build is linked to Address Sanitisation libraries. This probably
isn't what you want. Please contact support immediately.
Please see http://seclists.org/oss-sec/2016/q1/363 for more information.
%endif

%if %{with libbdb_ro}
%package        robdb-libs
Summary:        Read-only Berkeley Database Library
License:        GPL-2.0-or-later OR LGPL-2.1-or-later

%description    robdb-libs
The %{name}-robdb-lib package contains a library derived from rpm
project (https://github.com/rpm-software-management/rpm) that provides
some basic functions to search and read Berkeley Database records
%endif


%package          libs
Summary:          Core libraries for 389 Directory Server (%{variant})
Provides:         svrcore = 4.1.4
Obsoletes:        svrcore <= 4.1.3
Conflicts:        svrcore
# You can work this out by running LDD on libslapd.so to see what it needs in
# isolation.
%dirsrv_requires_ge nss
Requires:         nspr
Requires:         openldap
Requires:         systemd-libs
# Pull in sasl
Requires:         cyrus-sasl-lib
# KRB
Requires:         krb5-libs
%if %{with clang}
Requires:         llvm
Requires:         compiler-rt
%else
%if %{with asan}
Requires:         libasan
%endif
%if %{with tsan}
Requires:         libtsan
%endif
%if %{with ubsan}
Requires:         libubsan
%endif
%endif

%description      libs
Core libraries for the 389 Directory Server base package.  These libraries
are used by the main package and the -devel package.  This allows the -devel
package to be installed with just the -libs package and without the main package.

%package          devel
Summary:          Development libraries for 389 Directory Server (%{variant})
Provides:         svrcore-devel = 4.1.4
Obsoletes:        svrcore-devel <= 4.1.3
Conflicts:        svrcore-devel
Requires:         %{name}-libs = %{version}-%{release}
Requires:         pkgconfig
Requires:         nspr-devel
Requires:         nss-devel >= 3.34
Requires:         openldap-devel
# systemd-libs contains the headers iirc.
Requires:         systemd-libs

%description      devel
Development Libraries and headers for the 389 Directory Server base package.


%package          snmp
Summary:          SNMP Agent for 389 Directory Server
Requires:         %{name} = %{version}-%{release}
Obsoletes:        %{name} <= 1.3.5.4

%description      snmp
SNMP Agent for the 389 Directory Server base package.

%if %{with bundle_libdb}
%package          bdb
Summary:          Berkeley Database backend for 389 Directory Server

Requires:         %{name} = %{version}-%{release}
Requires:         %{name}-libs = %{version}-%{release}
# Berkeley DB database libdb was marked as deprecated since F40:
# https://fedoraproject.org/wiki/Changes/389_Directory_Server_3.0.0
# because libdb was marked as deprecated since F33
# https://fedoraproject.org/wiki/Changes/Libdb_deprecated
Provides:         deprecated()

%description      bdb
Berkeley Database backend for 389 Directory Server
Warning! This backend is deprecated in favor of lmdb and its support
may be removed in future versions.
%endif

%package -n python%{python3_pkgversion}-lib389
Summary:  A library for accessing, testing, and configuring the 389 Directory Server
BuildArch:        noarch
Requires: %{name} = %{version}-%{release}
Requires: openssl
# This is for /usr/bin/c_rehash tool, only needed for openssl < 1.1.0
Requires: openssl-perl
Requires: iproute
Requires: python%{python3_pkgversion}-libselinux
Recommends: bash-completion

%description -n python%{python3_pkgversion}-lib389
This module contains tools and libraries for accessing, testing,
 and configuring the 389 Directory Server.

%if %{with repl_reports}
%package -n python%{python3_pkgversion}-lib389-repl-reports
Summary: HTML and PNG report generation for 389 Directory Server replication monitoring tools
BuildArch: noarch
Requires: python%{python3_pkgversion}-lib389 = %{version}-%{release}
Requires: python%{python3_pkgversion}-plotly
Requires: python%{python3_pkgversion}-matplotlib

%description -n python%{python3_pkgversion}-lib389-repl-reports
Extended reporting capabilities for 389 Directory Server replication analysis.
This package provides additional report formats (HTML and PNG) with interactive
visualizations and graphs for replication lag analysis. These formats require
additional dependencies and are optional - the base package supports CSV
reports without this extension.
%endif

%if %{with cockpit}
%package -n cockpit-389-ds
Summary:          Cockpit UI Plugin for configuring and administering the 389 Directory Server
BuildArch:        noarch
Requires:         cockpit
Requires:         %{name} = %{version}-%{release}
Requires:         python%{python3_pkgversion}
Requires:         python%{python3_pkgversion}-lib389 = %{version}-%{release}

%description -n cockpit-389-ds
A cockpit UI Plugin for configuring and administering the 389 Directory Server
%endif

%generate_buildrequires
cd src/lib389
# Tests do not run in %%check (lib389's tests need to be fixed)
# but test dependencies are needed to check import lib389.topologies
%pyproject_buildrequires -g test

%prep
%setup -q -n %{name}-%{version}

%if %{with bundle_jemalloc}
%setup -q -n %{name}-%{version} -T -D -b 3
%endif

%if %{with bundle_libdb}
%setup -q -n %{name}-%{version} -T -D -b 4
%endif

cp %{SOURCE2} README.devel

%build

%if %{with clang}
CLANG_FLAGS="--enable-clang"
%endif

%{?with_tmpfiles_d: TMPFILES_FLAG="--with-tmpfiles-d=%{with_tmpfiles_d}"}

%if %{with asan}
ASAN_FLAGS="--enable-asan --enable-debug"
%endif

%if %{with msan}
MSAN_FLAGS="--enable-msan --enable-debug"
%endif

%if %{with tsan}
TSAN_FLAGS="--enable-tsan --enable-debug"
%endif

%if %{with ubsan}
UBSAN_FLAGS="--enable-ubsan --enable-debug"
%endif

RUST_FLAGS="--enable-rust --enable-rust-offline"

%if %{without cockpit}
COCKPIT_FLAGS="--disable-cockpit"
%endif

%if %{with bundle_jemalloc}
# Override page size, bz #1545539
# 4K
%ifarch %ix86 %arm x86_64 s390x
%define lg_page --with-lg-page=12
%endif

# 64K
%ifarch ppc64 ppc64le aarch64
%define lg_page --with-lg-page=16
%endif

# Override huge page size on aarch64
# 2M instead of 512M
%ifarch aarch64
%define lg_hugepage --with-lg-hugepage=21
%endif

# Build jemalloc
pushd ../%{jemalloc_name}-%{jemalloc_ver}
%configure \
        --libdir=%{_libdir}/%{pkgname}/lib \
        --bindir=%{_libdir}/%{pkgname}/bin \
        --enable-prof %{lg_page} %{lg_hugepage}
%make_build
popd
%endif

# Build custom libdb package
%if %{with bundle_libdb}
mkdir -p ../%{libdb_base_version}
pushd ../%{libdb_base_version}
tar -xjf  %{_topdir}/SOURCES/%{libdb_full_version}.tar.bz2
mv %{libdb_full_version} SOURCES
rpmbuild  --define "_topdir $PWD" -bc %{_builddir}/%{name}-%{version}/rpm/bundle-libdb.spec
popd
%endif

# Rebuild the autotool artifacts now.
autoreconf -fiv

%configure \
%if %{with libbdb_ro}
          --with-libbdb-ro \
%else
          --without-libbdb-ro \
%endif
%if %{with bundle_libdb}
           --with-bundle-libdb=%{_builddir}/%{libdb_base_version}/BUILD/%{libdb_base_dir}/dist/dist-tls \
%endif
           --with-selinux $TMPFILES_FLAG \
           --with-systemd \
           --with-systemdsystemunitdir=%{_unitdir} \
           --with-systemdsystemconfdir=%{_sysconfdir}/systemd/system \
           --with-systemdgroupname=%{groupname} \
           --libexecdir=%{_libexecdir}/%{pkgname} \
           $ASAN_FLAGS $MSAN_FLAGS $TSAN_FLAGS $UBSAN_FLAGS $RUST_FLAGS $CLANG_FLAGS $COCKPIT_FLAGS \
%if 0%{?fedora} >= 34 || 0%{?rhel} >= 9
           --with-libldap-r=no \
%endif
           --enable-cmocka

# Avoid "Unknown key name 'XXX' in section 'Service', ignoring." warnings from systemd on older releases
%if 0%{?rhel} && 0%{?rhel} < 9
  sed -r -i '/^(Protect(Home|Hostname|KernelLogs)|PrivateMounts)=/d' %{_builddir}/%{name}-%{version}/wrappers/*.service.in
%endif

# lib389
pushd ./src/lib389
%{python3} validate_version.py --update
%pyproject_wheel
popd

# Generate symbolic info for debuggers
export XCFLAGS=$RPM_OPT_FLAGS

%make_build

%install

mkdir -p %{buildroot}%{_datadir}/gdb/auto-load%{_sbindir}
%if %{with cockpit}
mkdir -p %{buildroot}%{_datadir}/cockpit
%endif
%make_install

%if %{with cockpit}
find %{buildroot}%{_datadir}/cockpit/389-console -type d | sed -e "s@%{buildroot}@@" | sed -e 's/^/\%dir /' > cockpit.list
find %{buildroot}%{_datadir}/cockpit/389-console -type f | sed -e "s@%{buildroot}@@" >> cockpit.list
%endif

find %{buildroot}%{_libdir}/%{pkgname}/plugins/ -type f -iname 'lib*.so' | sed -e "s@%{buildroot}@@" > plugins.list
%if %{with bundle_libdb}
sed -i -e "/libback-bdb/d" plugins.list
%endif

# Copy in our docs from doxygen.
cp -r %{_builddir}/%{name}-%{version}/man/man3 $RPM_BUILD_ROOT/%{_mandir}/man3

# lib389
pushd src/lib389
%pyproject_install
%if 0%{?fedora} <= 41 || (0%{?rhel} && 0%{?rhel} <= 10)
for clitool in dsconf dscreate dsctl dsidm openldap_to_ds; do
    mv %{buildroot}%{_bindir}/$clitool %{buildroot}%{_sbindir}/
done
%endif
%pyproject_save_files -l lib389
popd

# Register CLI tools for bash completion
for clitool in dsconf dsctl dsidm dscreate ds-replcheck
do
    register-python-argcomplete "${clitool}" > "${clitool}"
    install -p -m 0644 -D -t '%{buildroot}%{bash_completions_dir}' "${clitool}"
done

mkdir -p $RPM_BUILD_ROOT/var/log/%{pkgname}
mkdir -p $RPM_BUILD_ROOT/var/lib/%{pkgname}
mkdir -p $RPM_BUILD_ROOT/var/lock/%{pkgname} \
    && chmod 770 $RPM_BUILD_ROOT/var/lock/%{pkgname}

# for systemd
mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/systemd/system/%{groupname}.wants

#remove libtool and static libs
rm -f $RPM_BUILD_ROOT%{_libdir}/%{pkgname}/*.a
rm -f $RPM_BUILD_ROOT%{_libdir}/%{pkgname}/*.la
rm -f $RPM_BUILD_ROOT%{_libdir}/%{pkgname}/plugins/*.a
rm -f $RPM_BUILD_ROOT%{_libdir}/%{pkgname}/plugins/*.la
rm -f $RPM_BUILD_ROOT%{_libdir}/libsvrcore.a
rm -f $RPM_BUILD_ROOT%{_libdir}/libsvrcore.la

%if %{with bundle_jemalloc}
pushd ../%{jemalloc_name}-%{jemalloc_ver}
make DESTDIR="$RPM_BUILD_ROOT" install_lib install_bin
cp -pa COPYING ../%{name}-%{version}/COPYING.jemalloc
cp -pa README ../%{name}-%{version}/README.jemalloc
popd
%endif

%if %{with bundle_libdb}
pushd ../%{libdb_base_version}
libdbbuilddir=$PWD/BUILD/%{libdb_base_dir}
libdbdestdir=$PWD/../%{name}-%{version}
cp -pa $libdbbuilddir/LICENSE $libdbdestdir/LICENSE.libdb
cp -pa $libdbbuilddir/README $libdbdestdir/README.libdb
cp -pa $libdbbuilddir/lgpl-2.1.txt $libdbdestdir/lgpl-2.1.txt.libdb
cp -pa $libdbbuilddir/dist/dist-tls/.libs/%{libdb_bundle_name} $RPM_BUILD_ROOT%{_libdir}/%{pkgname}/%{libdb_bundle_name}
popd
%endif

%if %{with libbdb_ro}
pushd lib/librobdb
cp -pa COPYING %{_builddir}/%{name}-%{version}/COPYING.librobdb
cp -pa COPYING.RPM %{_builddir}/%{name}-%{version}/COPYING.RPM
install -m 0755 -d %{buildroot}/%{_libdir}
install -m 0755 -d %{buildroot}/%{_docdir}/%{name}-robdb-libs
install -m 0755 -d %{buildroot}/%{_licensedir}/%{name}
install -m 0755 -d %{buildroot}/%{_licensedir}/%{name}-robdb-libs
install -m 0644 $PWD/README.md %{buildroot}/%{_docdir}/%{name}-robdb-libs/README.md
install -m 0644 $PWD/COPYING %{buildroot}/%{_licensedir}/%{name}-robdb-libs/COPYING
install -m 0644 $PWD/COPYING.RPM %{buildroot}/%{_licensedir}/%{name}-robdb-libs/COPYING.RPM
install -m 0644 $PWD/COPYING %{buildroot}/%{_licensedir}/%{name}/COPYING.librobdb
install -m 0644 $PWD/COPYING.RPM %{buildroot}/%{_licensedir}/%{name}/COPYING.RPM
popd
%endif

%check
# This checks the code, if it fails it prints why, then re-raises the fail to shortcircuit the rpm build.
%if %{with tsan}
export TSAN_OPTIONS=print_stacktrace=1:second_deadlock_stack=1:history_size=7
%endif
%if %{without asan} && %{without msan}
if ! make DESTDIR="$RPM_BUILD_ROOT" check; then cat ./test-suite.log && false; fi
%endif

# Check import for lib389 modules
%pyproject_check_import -e '*.test*'

%post
if [ -n "$DEBUGPOSTTRANS" ] ; then
    output=$DEBUGPOSTTRANS
    output2=${DEBUGPOSTTRANS}.upgrade
else
    output=/dev/null
    output2=/dev/null
fi

# reload to pick up any changes to systemd files
/bin/systemctl daemon-reload >$output 2>&1 || :

# find all instances
instances="" # instances that require a restart after upgrade
ninst=0 # number of instances found in total

# https://fedoraproject.org/wiki/Packaging:UsersAndGroups#Soft_static_allocation
# Soft static allocation for UID and GID
USERNAME="dirsrv"
ALLOCATED_UID=389
GROUPNAME="dirsrv"
ALLOCATED_GID=389
HOMEDIR="/usr/share/dirsrv"

getent group $GROUPNAME >/dev/null || groupadd -f -g $ALLOCATED_GID -r $GROUPNAME
if ! getent passwd $USERNAME >/dev/null ; then
    if ! getent passwd $ALLOCATED_UID >/dev/null ; then
      useradd -r -u $ALLOCATED_UID -g $GROUPNAME -d $HOMEDIR -s /sbin/nologin -c "user for 389-ds-base" $USERNAME
    else
      useradd -r -g $GROUPNAME -d $HOMEDIR -s /sbin/nologin -c "user for 389-ds-base" $USERNAME
    fi
fi

# Reload our sysctl before we restart (if we can)
sysctl --system &> $output; true

# Gather the running instances so we can restart them
instbase="%{_sysconfdir}/%{pkgname}"
ninst=0
for dir in $instbase/slapd-* ; do
    echo dir = $dir >> $output 2>&1 || :
    if [ ! -d "$dir" ] ; then continue ; fi
    case "$dir" in *.removed) continue ;; esac
    basename=`basename $dir`
    inst="%{pkgname}@`echo $basename | sed -e 's/slapd-//g'`"
    echo found instance $inst - getting status  >> $output 2>&1 || :
    if /bin/systemctl -q is-active $inst ; then
       echo instance $inst is running >> $output 2>&1 || :
       instances="$instances $inst"
    else
       echo instance $inst is not running >> $output 2>&1 || :
    fi
    ninst=`expr $ninst + 1`
done
if [ $ninst -eq 0 ] ; then
    echo no instances to upgrade >> $output 2>&1 || :
    exit 0 # have no instances to upgrade - just skip the rest
else
    # restart running instances
    echo shutting down all instances . . . >> $output 2>&1 || :
    for inst in $instances ; do
        echo stopping instance $inst >> $output 2>&1 || :
        /bin/systemctl stop $inst >> $output 2>&1 || :
    done
    for inst in $instances ; do
        echo starting instance $inst >> $output 2>&1 || :
        /bin/systemctl start $inst >> $output 2>&1 || :
    done
fi


%preun
if [ $1 -eq 0 ]; then # Final removal
    # remove instance specific service files/links
    rm -rf %{_sysconfdir}/systemd/system/%{groupname}.wants/* > /dev/null 2>&1 || :
fi

%postun
if [ $1 = 0 ]; then # Final removal
    rm -rf /var/run/%{pkgname}
fi

%post snmp
%systemd_post %{pkgname}-snmp.service

%preun snmp
%systemd_preun %{pkgname}-snmp.service %{groupname}

%postun snmp
%systemd_postun_with_restart %{pkgname}-snmp.service


%files -f plugins.list
%if %{with bundle_jemalloc}
%doc LICENSE LICENSE.GPLv3+ LICENSE.openssl README.jemalloc
%license COPYING.jemalloc
%else
%doc LICENSE LICENSE.GPLv3+ LICENSE.openssl
%endif
%dir %{_sysconfdir}/%{pkgname}
%dir %{_sysconfdir}/%{pkgname}/schema
%config(noreplace)%{_sysconfdir}/%{pkgname}/schema/*.ldif
%dir %{_sysconfdir}/%{pkgname}/config
%dir %{_sysconfdir}/systemd/system/%{groupname}.wants
%config(noreplace)%{_sysconfdir}/%{pkgname}/config/slapd-collations.conf
%config(noreplace)%{_sysconfdir}/%{pkgname}/config/certmap.conf
%{_datadir}/%{pkgname}
%{_datadir}/gdb/auto-load/*
%{_unitdir}
%{_bindir}/dbscan
%{_mandir}/man1/dbscan.1.gz
%{_bindir}/ds-replcheck
%{_mandir}/man1/ds-replcheck.1.gz
%{bash_completions_dir}/ds-replcheck
%{_bindir}/ds-logpipe.py
%{_mandir}/man1/ds-logpipe.py.1.gz
%{_bindir}/ldclt
%{_mandir}/man1/ldclt.1.gz
%{_bindir}/logconv.pl
%{_mandir}/man1/logconv.pl.1.gz
%{_bindir}/logconv.py
%{_mandir}/man1/logconv.py.1.gz
%{_bindir}/pwdhash
%{_mandir}/man1/pwdhash.1.gz
%{_sbindir}/ns-slapd
%{_mandir}/man8/ns-slapd.8.gz
%{_sbindir}/openldap_to_ds
%{_mandir}/man8/openldap_to_ds.8.gz
%{_libexecdir}/%{pkgname}/ds_systemd_ask_password_acl
%{_libexecdir}/%{pkgname}/ds_selinux_restorecon.sh
%{_mandir}/man5/99user.ldif.5.gz
%{_mandir}/man5/certmap.conf.5.gz
%{_mandir}/man5/slapd-collations.conf.5.gz
%{_mandir}/man5/dirsrv.5.gz
%{_mandir}/man5/dirsrv.systemd.5.gz
%{_libdir}/%{pkgname}/python
%dir %{_libdir}/%{pkgname}/plugins
# This has to be hardcoded to /lib - $libdir changes between lib/lib64, but
# sysctl.d is always in /lib.
%{_prefix}/lib/sysctl.d/*
%dir %{_localstatedir}/lib/%{pkgname}
%dir %{_localstatedir}/log/%{pkgname}
%ghost %dir %{_localstatedir}/lock/%{pkgname}
%exclude %{_sbindir}/ldap-agent*
%exclude %{_mandir}/man1/ldap-agent.1.gz
%exclude %{_unitdir}/%{pkgname}-snmp.service
%if %{with bundle_jemalloc}
%{_libdir}/%{pkgname}/lib/
%{_libdir}/%{pkgname}/bin/
%exclude %{_libdir}/%{pkgname}/bin/jemalloc-config
%exclude %{_libdir}/%{pkgname}/bin/jemalloc.sh
%exclude %{_libdir}/%{pkgname}/lib/libjemalloc.a
%exclude %{_libdir}/%{pkgname}/lib/libjemalloc.so
%exclude %{_libdir}/%{pkgname}/lib/libjemalloc_pic.a
%exclude %{_libdir}/%{pkgname}/lib/pkgconfig
%endif
%if %{with libbdb_ro}
%exclude %{_libdir}/%{pkgname}/librobdb.so
%endif

%files devel
%doc LICENSE LICENSE.GPLv3+ LICENSE.openssl README.devel
%{_mandir}/man3/*
%{_includedir}/svrcore.h
%{_includedir}/%{pkgname}
%{_libdir}/libsvrcore.so
%{_libdir}/%{pkgname}/libslapd.so
%{_libdir}/%{pkgname}/libns-dshttpd.so
%{_libdir}/%{pkgname}/libldaputil.so
%{_libdir}/pkgconfig/svrcore.pc
%{_libdir}/pkgconfig/dirsrv.pc

%files libs
%doc LICENSE LICENSE.GPLv3+ LICENSE.openssl README.devel
%dir %{_libdir}/%{pkgname}
%{_libdir}/libsvrcore.so.*
%{_libdir}/%{pkgname}/libslapd.so.*
%{_libdir}/%{pkgname}/libns-dshttpd.so.*
%{_libdir}/%{pkgname}/libldaputil.so.*
%{_libdir}/%{pkgname}/librewriters.so*
%if %{with bundle_jemalloc}
%{_libdir}/%{pkgname}/lib/libjemalloc.so.2
%endif

%files snmp
%doc LICENSE LICENSE.GPLv3+ LICENSE.openssl README.devel
%config(noreplace)%{_sysconfdir}/%{pkgname}/config/ldap-agent.conf
%{_sbindir}/ldap-agent*
%{_mandir}/man1/ldap-agent.1.gz
%{_unitdir}/%{pkgname}-snmp.service

%if %{with bundle_libdb}
%files bdb
%doc LICENSE LICENSE.GPLv3+ README.devel LICENSE.libdb README.libdb lgpl-2.1.txt.libdb
%{_libdir}/%{pkgname}/%{libdb_bundle_name}
%{_libdir}/%{pkgname}/plugins/libback-bdb.so
%endif

%files -n python%{python3_pkgversion}-lib389 -f %{pyproject_files}
%doc src/lib389/README.md
%license LICENSE LICENSE.GPLv3+
# Binaries
%{_sbindir}/dsconf
%{_sbindir}/dscreate
%{_sbindir}/dsctl
%{_sbindir}/dsidm
%{_sbindir}/openldap_to_ds
%{_libexecdir}/%{pkgname}/dscontainer
# Man pages
%{_mandir}/man8/dsconf.8.gz
%{_mandir}/man8/dscreate.8.gz
%{_mandir}/man8/dsctl.8.gz
%{_mandir}/man8/dsidm.8.gz
%{_mandir}/man8/openldap_to_ds.8.gz
%exclude %{_mandir}/man1
# Bash completions for scripts provided by python3-lib389
%{bash_completions_dir}/dsctl
%{bash_completions_dir}/dsconf
%{bash_completions_dir}/dscreate
%{bash_completions_dir}/dsidm

%if %{with repl_reports}
%files -n python%{python3_pkgversion}-lib389-repl-reports
# No files needed as this is just a meta-package for dependencies
%endif

%if %{with cockpit}
%files -n cockpit-389-ds -f cockpit.list
%{_datarootdir}/metainfo/389-console/org.port389.cockpit_console.metainfo.xml
%doc README.md
%endif

%if %{with libbdb_ro}
%files robdb-libs
%license COPYING.librobdb COPYING.RPM
%doc %{_defaultdocdir}/%{name}-robdb-libs/README.md
%{_libdir}/%{pkgname}/librobdb.so
%{_licensedir}/%{name}-robdb-libs/COPYING
%{_licensedir}/%{name}/COPYING.RPM
%{_licensedir}/%{name}/COPYING.librobdb

%endif

%changelog
%autochangelog

