net-dns/unbound: Revbump for improved openrc init script

Closes: https://bugs.gentoo.org/980712
Signed-off-by: Marc Schiffbauer <mschiff@gentoo.org>
This commit is contained in:
Marc Schiffbauer
2026-08-19 17:15:38 +02:00
parent bcf95ecec1
commit 98ee3fa8d9
2 changed files with 353 additions and 0 deletions

View File

@@ -0,0 +1,141 @@
#!/sbin/openrc-run
# Copyright 1999-2018 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
UNBOUND_BINARY=${UNBOUND_BINARY:-"/usr/sbin/unbound"}
UNBOUND_CACHEFILE=${UNBOUND_CACHEFILE:-"/var/lib/unbound/${SVCNAME}.cache"}
UNBOUND_CHECKCONF=${UNBOUND_CHECKCONF:-"/usr/sbin/unbound-checkconf"}
UNBOUND_CONFFILE=${UNBOUND_CONFFILE:-"/etc/unbound/${SVCNAME}.conf"}
UNBOUND_CONTROL=${UNBOUND_CONTROL:-"/usr/sbin/unbound-control"}
UNBOUND_PIDFILE=${UNBOUND_PIDFILE:-"/run/unbound.pid"}
UNBOUND_SSDARGS=${UNBOUND_SSDARGS:-"--wait 1000"}
UNBOUND_TERMTIMEOUT=${UNBOUND_TERMTIMEOUT:-"TERM/25/KILL/5"}
UNBOUND_OPTS=${UNBOUND_OPTS:-""}
UNBOUND_LOAD_CACHE_TIMEOUT=${UNBOUND_LOAD_CACHE_TIMEOUT:-"30"}
getconfig() {
local key="$1"
local value_default="$2"
local value=
if service_started ; then
value="$(service_get_value "${key}")"
fi
if [ -z "${value}" ] && [ -n "${UNBOUND_CONFFILE}" ] && [ -r "${UNBOUND_CONFFILE}" ] ; then
value=$("${UNBOUND_CHECKCONF}" -o ${key} "${UNBOUND_CONFFILE}")
fi
if [ -z "${value}" ] ; then
# Value not explicitly set in the configfile or configfile does not exist
# or is not readable
echo "${value_default}"
else
echo "${value}"
fi
return 0
}
command=${UNBOUND_BINARY}
command_args="${UNBOUND_OPTS} -c \"${UNBOUND_CONFFILE}\""
start_stop_daemon_args="${UNBOUND_SSDARGS}"
pidfile="$(getconfig pidfile /run/unbound.pid)"
retry="${UNBOUND_TERMTIMEOUT}"
required_files="${UNBOUND_CONFFILE}"
name="unbound daemon"
extra_commands="configtest"
extra_started_commands="reload save_cache"
description="unbound is a Domain Name Server (DNS) that is used to resolve host names to IP address."
description_configtest="Run syntax tests for configuration files only."
description_reload="Kills all children and reloads the configuration."
description_save_cache="Saves the current cache to disk."
depend() {
use net logger
provide dns
after auth-dns
}
configtest() {
local _config_status=
ebegin "Checking ${SVCNAME} configuration"
"${UNBOUND_CHECKCONF}" "${UNBOUND_CONFFILE}" 1>/dev/null 2>&1
_config_status=$?
if [ ${_config_status} -ne 0 ] ; then
# Run command again but this time we will show the output
# Ugly, but ...
"${UNBOUND_CHECKCONF}" "${UNBOUND_CONFFILE}"
else
if [ -n "${UNBOUND_PRESERVE_CACHE}" ] ; then
local _is_control_enabled=$(getconfig control-enable no)
if [ "${_is_control_enabled}" != "yes" ] ; then
eerror "Cannot preserve cache: control-enable is 'no' in the config file!"
_config_status=2
fi
fi
fi
eend ${_config_status} "failed, please correct errors above"
}
save_cache() {
if [ "${RC_CMD}" != "restart" ] ; then
UNBOUND_PRESERVE_CACHE=1 configtest || return 1
fi
ebegin "Saving cache to '${UNBOUND_CACHEFILE}'"
${UNBOUND_CONTROL} -c "${UNBOUND_CONFFILE}" dump_cache > "${UNBOUND_CACHEFILE}"
eend $?
}
start_pre() {
if [ "${RC_CMD}" != "restart" ] ; then
configtest || return 1
fi
}
start_post() {
if [ -n "${UNBOUND_PRESERVE_CACHE}" ] ; then
if [ -s "${UNBOUND_CACHEFILE}" ] ; then
ebegin "Loading cache from '${UNBOUND_CACHEFILE}'"
# Loading cache can fail which would block this runscript.
# Using `timeout` from coreutils will be our safeguard ...
if timeout -k 5 ${UNBOUND_LOAD_CACHE_TIMEOUT} ${UNBOUND_CONTROL} -q -c "${UNBOUND_CONFFILE}" load_cache < "${UNBOUND_CACHEFILE}"; then
# delete successfully loaded cache to prevent a stale cache being loaded after a system crash
# bug #980712
rm -f "${UNBOUND_CACHEFILE}"
fi
eend $?
else
ewarn "Loading cache from '${UNBOUND_CACHEFILE}' skipped: File does not exists or is empty!"
fi
fi
# It is not a fatal error if preserved cache could not be loaded
return 0
}
stop_pre() {
if [ "${RC_CMD}" = "restart" ] ; then
configtest || return 1
fi
if [ -n "${UNBOUND_PRESERVE_CACHE}" ] ; then
save_cache
fi
# It is not a fatal error if cache cannot be preserved
return 0
}
reload() {
configtest || return 1
ebegin "Reloading ${SVCNAME}"
start-stop-daemon --signal HUP --pidfile "${pidfile}"
eend $?
}

View File

@@ -0,0 +1,212 @@
# Copyright 1999-2026 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
PYTHON_COMPAT=( python3_{11..14} )
VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/nlnetlabs.asc
inherit autotools flag-o-matic python-single-r1 systemd verify-sig multilib-minimal
MY_P=${PN}-${PV/_/}
DESCRIPTION="A validating, recursive and caching DNS resolver"
HOMEPAGE="https://unbound.net/ https://nlnetlabs.nl/projects/unbound/about/"
SRC_URI="
https://nlnetlabs.nl/downloads/unbound/${MY_P}.tar.gz
verify-sig? ( https://nlnetlabs.nl/downloads/unbound/${MY_P}.tar.gz.asc )
"
S="${WORKDIR}"/${MY_P}
LICENSE="BSD GPL-2"
SLOT="0/8" # ABI version of libunbound.so
if [[ ${PV} != *_rc* ]] ; then
KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~mips ~ppc ~ppc64 ~riscv ~sparc ~x86"
fi
IUSE="debug dnscrypt dnstap +ecdsa ecs gost +http2 python redis selinux static-libs systemd test +tfo"
REQUIRED_USE="python? ( ${PYTHON_REQUIRED_USE} )"
RESTRICT="!test? ( test )"
# Note: expat is needed by executable only but the Makefile is custom
# and doesn't make it possible to easily install the library without
# the executables. MULTILIB_USEDEP may be dropped once build system
# is fixed.
DEPEND="
acct-group/unbound
acct-user/unbound
>=dev-libs/expat-2.1.0-r3[${MULTILIB_USEDEP}]
>=dev-libs/libevent-2.0.21:0=[${MULTILIB_USEDEP}]
>=dev-libs/openssl-1.0.1h-r2:0=[${MULTILIB_USEDEP}]
dnscrypt? ( dev-libs/libsodium:=[${MULTILIB_USEDEP}] )
dnstap? (
dev-libs/fstrm[${MULTILIB_USEDEP}]
>=dev-libs/protobuf-c-1.0.2-r1:=[${MULTILIB_USEDEP}]
)
ecdsa? (
dev-libs/openssl:0[-bindist(-)]
)
http2? ( net-libs/nghttp2:=[${MULTILIB_USEDEP}] )
python? ( ${PYTHON_DEPS} )
redis? ( dev-libs/hiredis:= )
systemd? ( sys-apps/systemd )
"
BDEPEND="
virtual/pkgconfig
python? ( dev-lang/swig )
test? (
net-libs/ldns[examples(-)]
dev-util/splint
app-text/wdiff
)
verify-sig? ( >=sec-keys/openpgp-keys-nlnetlabs-20260101 )
"
RDEPEND="
${DEPEND}
net-dns/dnssec-root
selinux? ( sec-policy/selinux-bind )
"
QA_CONFIG_IMPL_DECL_SKIP=(
ioctlsocket # not on Linux (bug #900060)
)
PATCHES=(
"${FILESDIR}"/${PN}-1.5.7-trust-anchor-file.patch
"${FILESDIR}"/${PN}-1.6.3-pkg-config.patch
"${FILESDIR}"/${PN}-1.10.1-find-ar.patch
)
pkg_setup() {
use python && python-single-r1_pkg_setup
}
src_prepare() {
default
eautoreconf
# Required for the python part
multilib_copy_sources
}
src_configure() {
[[ ${CHOST} == *-darwin* ]] || append-ldflags -Wl,-z,noexecstack
multilib-minimal_src_configure
}
multilib_src_configure() {
local myeconfargs=(
$(multilib_native_use_enable debug)
$(multilib_native_use_enable gost)
$(multilib_native_use_enable dnscrypt)
$(multilib_native_use_enable dnstap)
$(multilib_native_use_enable ecdsa)
$(multilib_native_use_enable ecs subnet)
$(multilib_native_use_enable redis cachedb)
$(multilib_native_use_enable static-libs static)
$(multilib_native_use_enable systemd)
$(multilib_native_use_with python pythonmodule)
$(multilib_native_use_with python pyunbound)
$(multilib_native_use_with http2 libnghttp2)
$(multilib_native_use_enable tfo tfo-client)
$(multilib_native_use_enable tfo tfo-server)
--disable-flto
--disable-rpath
--enable-event-api
--enable-ipsecmod
--with-libevent="${ESYSROOT}"/usr
$(multilib_native_usex redis --with-libhiredis="${ESYSROOT}/usr" --without-libhiredis)
--with-pidfile="${EPREFIX}"/run/unbound.pid
--with-rootkey-file="${EPREFIX}"/etc/dnssec/root-anchors.txt
--with-ssl="${ESYSROOT}"/usr
--with-libexpat="${ESYSROOT}"/usr
# http://unbound.nlnetlabs.nl/pipermail/unbound-users/2011-April/001801.html
# $(use_enable debug lock-checks)
# $(use_enable debug alloc-checks)
# $(use_enable debug alloc-lite)
# $(use_enable debug alloc-nonregional)
)
econf "${myeconfargs[@]}"
}
multilib_src_install() {
emake DESTDIR="${D}" install
systemd_dounit contrib/unbound.service
systemd_dounit contrib/unbound.socket
systemd_dounit contrib/unbound_portable.service
}
multilib_src_install_all() {
use python && python_optimize
newinitd "${FILESDIR}"/unbound-r2.initd unbound
newconfd "${FILESDIR}"/unbound-r1.confd unbound
systemd_newunit "${FILESDIR}"/unbound-anchor-r1.service unbound-anchor.service
dodoc doc/{README,CREDITS,TODO,Changelog,FEATURES}
dodoc contrib/{unbound_munin_,metrics.awk}
docinto selinux
dodoc contrib/selinux/*
exeinto /usr/share/${PN}
doexe contrib/{update-anchor.sh,unbound_cache.sh}
# Create space for auto-trust-anchor-file eventually
# downloaded by unbound-anchor
keepdir /etc/unbound/var
fowners root:unbound /etc/unbound/var
fperms 0770 /etc/unbound/var
# Used to store cache data
keepdir /var/lib/${PN}
fowners root:unbound /var/lib/${PN}
fperms 0770 /var/lib/${PN}
find "${ED}" -name '*.la' -delete || die
if ! use static-libs ; then
find "${ED}" -name "*.a" -delete || die
fi
}
pkg_postinst() {
if [[ ! -f "${EROOT}/etc/unbound/unbound_control.key" ]]; then
einfo "Trying to create unbound control key ..."
if ! unbound-control-setup &>/dev/null ; then
ewarn "Failed to create unbound control key!"
fi
fi
if [[ ! -f "${EROOT}/etc/unbound/var/root-anchors.txt" ]]; then
einfo ""
einfo "If you want unbound to automatically update the root-anchor file for DNSSEC validation"
einfo "set 'auto-trust-anchor-file: ${EROOT}/etc/unbound/var/root-anchors.txt' in ${EROOT}/etc/unbound/unbound.conf"
einfo "and run"
einfo ""
einfo " su -s /bin/sh -c '${EROOT}/usr/sbin/unbound-anchor -a ${EROOT}/etc/unbound/var/root-anchors.txt' unbound"
einfo ""
einfo "as root to create it initially before starting unbound for the first time after enabling this."
einfo ""
einfo "If using systemd you may also enable the unbound-anchor.service"
fi
# Our user is not available on prefix
use prefix && return
local _perm_check_testfile=$(mktemp --dry-run "${EPREFIX}"/etc/unbound/var/.pkg_postinst-perm-check.XXXXXXXXX)
su -s /bin/sh -c "touch ${_perm_check_testfile}" unbound &>/dev/null
if [[ $? -ne 0 ]]; then
ewarn "WARNING: unbound user cannot write to \"${EPREFIX}/etc/unbound/var\"!"
ewarn "Run the following commands to restore default permission:"
ewarn ""
ewarn " chown root:unbound ${EPREFIX}/etc/unbound/var"
ewarn " chmod 0770 ${EPREFIX}/etc/unbound/var"
else
# Cleanup -- no reason to die here!
rm -f "${_perm_check_testfile}"
fi
}