# Copyright 1999-2021 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=7

PYTHON_COMPAT=( python3_{8..9} )

inherit autotools multilib-minimal toolchain-funcs python-r1 linux-info systemd usr-ldscript flag-o-matic

DESCRIPTION="Userspace utilities for storing and processing auditing records"
HOMEPAGE="https://people.redhat.com/sgrubb/audit/"
SRC_URI="https://people.redhat.com/sgrubb/audit/${P}.tar.gz"

LICENSE="GPL-2+ LGPL-2.1+"
SLOT="0"
KEYWORDS="*"
IUSE="daemon gssapi ldap python static-libs test"

REQUIRED_USE="ldap? ( daemon )
	python? ( ${PYTHON_REQUIRED_USE} )"
RESTRICT="!test? ( test )"

RDEPEND="gssapi? ( virtual/krb5 )
	ldap? ( net-nds/openldap )
	sys-apps/diffutils
	sys-libs/libcap-ng
	python? ( ${PYTHON_DEPS} )"
DEPEND="${RDEPEND}
	python? ( dev-lang/swig )
	>=sys-kernel/linux-headers-2.6.34
	test? ( dev-libs/check )"
BDEPEND="python? ( dev-lang/swig:0 )"

CONFIG_CHECK="~AUDIT"

src_prepare() {
	# audisp-remote moved in multilib_src_install_all
	sed -i \
		-e "s,/sbin/audisp-remote,${EPREFIX}/usr/sbin/audisp-remote," \
		audisp/plugins/remote/au-remote.conf || die

	# Disable installing sample rules so they can be installed as docs.
	echo -e '%:\n\t:' | tee rules/Makefile.{am,in} >/dev/null

	if ! use daemon; then
		sed -e '/^SUBDIRS =/s/audisp//' \
			-i Makefile.am || die
		sed -e '/${DESTDIR}${initdir}/d' \
			-e '/${DESTDIR}${legacydir}/d' \
			-i init.d/Makefile.am || die
		sed -e '/^sbin_PROGRAMS =/s/auditd//' \
			-e '/^sbin_PROGRAMS =/s/aureport//' \
			-e '/^sbin_PROGRAMS =/s/ausearch//' \
			-i src/Makefile.am || die
	fi

	default
	eautoreconf
}

multilib_src_configure() {
	# Need to filter out --icf=all in this package temporarily because it's using BFD
	# https://crbug.com/1022226
	filter-ldflags "-Wl,--icf=all"
	# Lakitu-arm64: include arm eabi and aarch64 support
	local -a myeconfargs=(
		--sbindir="${EPREFIX}/sbin"
		$(use_enable gssapi gssapi-krb5)
		$(use_enable ldap zos-remote)
		$(use_enable static-libs static)
		--enable-systemd
		--without-golang
		--without-python
		--without-python3
		$(use_with arm64 arm)
		$(use_with arm64 aarch64)
	)

	ECONF_SOURCE=${S} econf "${myeconfargs[@]}"

	if multilib_is_native_abi && use python; then
		python_configure() {
			mkdir -p "${BUILD_DIR}"
			pushd "${BUILD_DIR}" &>/dev/null || die
			ECONF_SOURCE=${S} econf "${myeconfargs[@]}" --with-python3
			popd &>/dev/null || die
		}
		python_foreach_impl python_configure
	fi
}

src_configure() {
	tc-export_build_env BUILD_{CC,CPP}
	local -x CC_FOR_BUILD="${BUILD_CC}"
	local -x CPP_FOR_BUILD="${BUILD_CPP}"
	multilib-minimal_src_configure
}

multilib_src_compile() {
	if multilib_is_native_abi; then
		default

		local native_build="${BUILD_DIR}"
		python_compile() {
			emake -C "${BUILD_DIR}"/bindings/swig top_builddir="${native_build}"
			emake -C "${BUILD_DIR}"/bindings/python/python3 top_builddir="${native_build}"
		}
		use python && python_foreach_impl python_compile
	else
		emake -C common
		emake -C lib
		emake -C auparse
	fi
}

multilib_src_install() {
	if multilib_is_native_abi; then
		emake DESTDIR="${D}" initdir="$(systemd_get_systemunitdir)" install

		local native_build="${BUILD_DIR}"
		python_install() {
			emake -C "${BUILD_DIR}"/bindings/swig DESTDIR="${D}" top_builddir="${native_build}" install
			emake -C "${BUILD_DIR}"/bindings/python/python3 DESTDIR="${D}" top_builddir="${native_build}" install
			python_optimize
		}
		use python && python_foreach_impl python_install

		# things like shadow use this so we need to be in /
		gen_usr_ldscript -a audit auparse
	else
		emake -C lib DESTDIR="${D}" install
		emake -C auparse DESTDIR="${D}" install
	fi
}

multilib_src_install_all() {
	dodoc AUTHORS ChangeLog README* THANKS

	if use daemon; then
		docinto contrib/plugin
		dodoc contrib/plugin/*
		docinto rules
		dodoc rules/*rules

		newinitd "${FILESDIR}"/auditd-init.d-2.4.3 auditd
		newconfd "${FILESDIR}"/auditd-conf.d-2.1.3 auditd

		[ -f "${ED}"/sbin/audisp-remote ] && \
		dodir /usr/sbin && \
		mv "${ED}"/{sbin,usr/sbin}/audisp-remote || die

		# audit logs go here
		keepdir /var/log/audit
	fi

	insinto /usr/share/audit/rules.d
	doins "${FILESDIR}"/rules.d/*.rules

	systemd_newtmpfilesd "${FILESDIR}"/audit-rules.tmpfiles audit-rules.conf
	systemd_dounit "${FILESDIR}"/audit-rules.service
	systemd_enable_service multi-user.target audit-rules.service
}
