# Copyright 1999-2025 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 EAPI=8 PYTHON_COMPAT=( python3_{11..14} ) inherit eapi9-ver flag-o-matic meson python-r1 systemd tmpfiles toolchain-funcs DESCRIPTION="High-performance production grade DHCPv4 & DHCPv6 server" HOMEPAGE="https://www.isc.org/kea/" if [[ ${PV} == 9999 ]]; then inherit git-r3 EGIT_REPO_URI="https://gitlab.isc.org/isc-projects/kea.git" else SRC_URI="https://downloads.isc.org/isc/kea/${PV}/${P}.tar.xz" KEYWORDS="~amd64 ~arm ~arm64 ~x86" fi LICENSE="MPL-2.0" SLOT="0" IUSE="debug doc mysql +openssl postgres shell test" REQUIRED_USE="shell? ( ${PYTHON_REQUIRED_USE} )" RESTRICT="!test? ( test )" COMMON_DEPEND=" >=dev-libs/boost-1.66:= dev-libs/log4cplus:= mysql? ( app-arch/zstd:= dev-db/mysql-connector-c:= dev-libs/openssl:= sys-libs/zlib:= ) !openssl? ( dev-libs/botan:3=[boost] ) openssl? ( dev-libs/openssl:0= ) postgres? ( dev-db/postgresql:* ) shell? ( ${PYTHON_DEPS} ) " DEPEND="${COMMON_DEPEND} test? ( dev-cpp/gtest ) " RDEPEND="${COMMON_DEPEND} acct-group/dhcp acct-user/dhcp " BDEPEND=" >=dev-build/meson-1.8 doc? ( $(python_gen_any_dep ' dev-python/sphinx[${PYTHON_USEDEP}] dev-python/sphinx-rtd-theme[${PYTHON_USEDEP}] ') ) virtual/pkgconfig ${PYTHON_DEPS} " python_check_deps() { use doc || return 0; python_has_version "dev-python/sphinx[${PYTHON_USEDEP}]" \ "dev-python/sphinx-rtd-theme[${PYTHON_USEDEP}]" } pkg_setup() { python_setup } src_prepare() { default # Fix up all doc paths, whether or not we are installing full set of docs sed -e "s:'doc/kea':'doc/${PF}':" \ -i meson.build || die sed -e "s:'share/doc/kea':'share/doc/${PF}':" \ -i doc/meson.build || die sed -e "s:'doc/kea':'doc/${PF}':" \ -i doc/sphinx/meson.build || die sed -e "s:share/doc/kea/:share/doc/${PF}/:" \ -i doc/sphinx/arm/install.rst || die sed -e "s:share/doc/kea/examples:share/doc/${PF}/examples:" \ -i doc/sphinx/arm/config.rst || die # set shebang before meson whether or not we are installing the shell sed -e 's:^#!@PYTHON@:#!/usr/bin/env python3:' \ -i src/bin/shell/kea-shell.in || die # Don't allow meson to install shell, we shall do that if required sed -e 's:install\: true:install\: false:' \ -i src/bin/shell/meson.build || die # do not create /run sed -e '/^install_emptydir(RUNSTATEDIR)$/d' \ -i meson.build || die } src_configure() { # https://bugs.gentoo.org/861617 # https://gitlab.isc.org/isc-projects/kea/-/issues/3946 # # Kea Devs say no to LTO filter-lto if use !openssl; then append-cxxflags -std=c++20 fi local emesonargs=( --localstatedir="${EPREFIX}/var" -Drunstatedir="${EPREFIX}/run" -Dkrb5=disabled -Dnetconf=disabled -Dcrypto=$(usex openssl openssl botan) $(meson_feature mysql) $(meson_feature postgres postgresql) $(meson_feature test tests) ) if use debug; then emesonargs+=( --debug ) fi meson_src_configure } src_compile() { meson_src_compile # Note: If you want man pages doc use has to be set. This may change # in the future and be like 2.6.3 where man pages were part of the release tarball use doc && meson_src_compile doc } src_test() { # Get list of all test suites into an associative array # the meson test --list returns either "kea / test_suite", "kea:shell-tests / test_suite" or # "kea:python-tests / test_suite" # Discard the shell tests as we can't run shell tests in sandbox pushd "${BUILD_DIR}" || die local -A TEST_SUITES while IFS=" / " read -r subsystem test_suite ; do if [[ ${subsystem} != "kea:shell-tests" ]]; then TEST_SUITES["$test_suite"]=1 fi done < <(meson test --list || die) popd # Some other tests will fail for interface access restrictions, we have to remove the test suites those tests # belong to local SKIP_TESTS=( dhcp-radius-tests kea-log-buffer_logger_test.sh kea-log-console_test.sh dhcp-lease-query-tests kea-dhcp6-tests kea-dhcp-tests ) # skip shell tests that require a running instance of MySQL if use mysql; then SKIP_TESTS+=( kea-mysql-tests dhcp-mysql-lib-tests dhcp-forensic-log-libloadtests kea-dhcp4-tests ) fi # skip shell tests that require a running instance of PgSQL if use postgres; then SKIP_TESTS+=( kea-pgsql-tests dhcp-pgsql-lib-tests dhcp-forensic-log-libloadtests kea-dhcp4-tests ) fi if [[ $(tc-get-ptr-size) -eq 4 ]]; then # see https://bugs.gentoo.org/958171 for reason for skipping these tests SKIP_TESTS+=( kea-util-tests kea-dhcp4-tests kea-dhcpsrv-tests dhcp-ha-lib-tests kea-d2-tests ) fi for SKIP in ${SKIP_TESTS[@]}; do unset TEST_SUITES["${SKIP}"] done meson_src_test ${!TEST_SUITES[@]} } install_shell() { python_domodule ${ORIG_BUILD_DIR}/src/bin/shell/*.py python_doscript ${ORIG_BUILD_DIR}/src/bin/shell/kea-shell # fix path to import kea modules sed -e "/^sys.path.append/s|(.*)|('$(python_get_sitedir)/${PN}')|" \ -i "${ED}"/usr/lib/python-exec/${EPYTHON}/kea-shell || die } src_install() { meson_install # Tidy up rm -r "${ED}"/usr/share/kea/meson-info || die if use !mysql; then rm -r "${ED}"/usr/share/kea/scripts/mysql || die fi if use !postgres; then rm -r "${ED}"/usr/share/kea/scripts/pgsql || die fi # No easy way to control how meson_install sets permissions in meson < 1.9 # So make sure permissions are same as in previous versions of kea # To avoid any differences between an update vers first time install fperms -R 0755 /usr/sbin fperms -R 0755 /usr/bin fperms -R 0755 /usr/$(get_libdir) if use shell; then python_moduleinto ${PN} ORIG_BUILD_DIR=${BUILD_DIR} python_foreach_impl install_shell fi # We don't use keactrl.conf so move to reduce confusion mv "${ED}"/etc/${PN}/keactrl.conf "${ED}"/usr/share/doc/${PF}/examples/keactrl.conf || die fowners -R root:dhcp /etc/${PN} # Install a conf per service and a linked init script per service newinitd "${FILESDIR}"/${PN}-initd-r3 ${PN} local svc for svc in dhcp4 dhcp6 dhcp-ddns ctrl-agent; do newconfd "${FILESDIR}"/${PN}-confd-r3 kea-${svc} sed -e "s:@KEA_SVC@:${svc}:g" \ -i "${ED}"/etc/conf.d/kea-${svc} || die dosym kea "${EPREFIX}"/etc/init.d/kea-${svc} done systemd_newunit "${FILESDIR}"/${PN}-ctrl-agent.service-r2 ${PN}-ctrl-agent.service systemd_newunit "${FILESDIR}"/${PN}-dhcp-ddns.service-r2 ${PN}-dhcp-ddns.service systemd_newunit "${FILESDIR}"/${PN}-dhcp4.service-r2 ${PN}-dhcp4.service systemd_newunit "${FILESDIR}"/${PN}-dhcp6.service-r2 ${PN}-dhcp6.service newtmpfiles "${FILESDIR}"/${PN}.tmpfiles.conf ${PN}.conf keepdir /var/lib/${PN} /var/log/${PN} fowners -R dhcp:dhcp /var/lib/${PN} /var/log/${PN} fperms 750 /var/lib/${PN} /var/log/${PN} } pkg_postinst() { tmpfiles_process ${PN}.conf if ver_replacing -lt 2.6; then ewarn "Several changes have been made for daemons:" ewarn " To comply with common practices for this package," ewarn " config paths by default has been changed as below:" ewarn " /etc/kea/kea-dhcp4.conf" ewarn " /etc/kea/kea-dhcp6.conf" ewarn " /etc/kea/kea-dhcp-ddns.conf" ewarn " /etc/kea/kea-ctrl-agent.conf" ewarn ewarn " Daemons are launched by default with the unprivileged user 'dhcp'" ewarn ewarn "Please check your configuration!" fi if ver_replacing -lt 3.0; then ewarn "If using openrc;" ewarn " There are now separate conf.d scripts and associated init.d per daemon!" ewarn " Each Daemon needs to be launched separately, i.e. the daemons are" ewarn " kea-dhcp4" ewarn " kea-dhcp6" ewarn " kea-dhcp-ddns" ewarn " kea-ctrl" ewarn "Please adjust your service startups appropriately" fi if ! has_version net-misc/kea; then elog "See examples of config files in:" elog " ${EROOT}/usr/share/doc/${PF}/examples" fi }