openrc/init.d.misc/named.in
2008-01-11 15:31:10 +00:00

100 lines
2.5 KiB
Plaintext

#!/sbin/runscript
# Copyright 2007-2008 Roy Marples <roy@marples.name>
# All rights reserved. Released under the 2-clause BSD license.
command=/usr/sbin/named
command_args=${named_args}
pidfile=@VARBASE@/run/named/pid
name="Domain Name server"
extra_started_commands="reload"
namedb=/etc/namedb
named_uid=${named_uid:-bind}
depend()
{
provide dns
need localmount
after bootmisc
}
start_pre()
{
if [ -n "${named_chroot}" ]; then
# Create (or update) the chroot directory structure
if [ -r /etc/mtree/BIND.chroot.dist ]; then
mtree -deU -f /etc/mtree/BIND.chroot.dist -p "${named_chroot}"
else
ewarn "/etc/mtree/BIND.chroot.dist missing,"
ewarn "chroot directory structure not updated"
fi
if [ ! -d "${named_chroot}"/. ]; then
eerror "chroot directory ${named_chroot} missing"
exit 1
fi
# Create /etc/namedb symlink
if [ ! -L "${namedb}" ]; then
if [ -d "${namedb}" ]; then
ewarn "named chroot: ${namedb} is a directory!"
elif [ -e "${namedb}" ]; then
ewarn "named chroot: ${namedb} exists!"
else
ln -s "${named_chroot}${namedb}" "${namedb}"
fi
else
# Make sure it points to the right place.
ln -shf "${named_chroot}${namedb}" "${namedb}"
fi
case "${RC_UNAME}" in
*BSD|DragonFly)
# Mount a devfs in the chroot directory if needed
umount "${named_chroot}"/dev 2>/dev/null
mount -t devfs dev "${named_chroot}"/dev
devfs -m "${named_chroot}"/dev ruleset devfsrules_hide_all
devfs -m "${named_chroot}"/dev rule apply path null unhide
devfs -m "${named_chroot}"/dev rule apply path random unhide
;;
esac
# Copy local timezone information if it is not up to date.
if [ -r /etc/localtime ]; then
cmp -s /etc/localtime "${named_chroot}/etc/localtime" ||
cp -p /etc/localtime "${named_chroot}/etc/localtime"
fi
command_args="${command_args} -t ${named_chroot}"
ln -fs "${named_chroot}${pidfile}" "${pidfile}"
fi
if [ ! -s "${named_chroot}${namedb}/rndc.conf" ]; then
local confgen="${command%/named}/rndc-confgen -a -b256 -u ${named_uid} \
-c ${named_chrootdir}/etc/namedb/rndc.key"
if [ -s "${named_chroot}${namedb}/rndc.key" ]; then
local getuser="stat -f%Su"
[ "${RC_UNAME}" = "Linux" ] && getuser="stat -c%U"
case $(${getuser} "${named_chroot}${namedb}"/rndc.key) in
root|"${named_uid}");;
*) ${confgen};;
esac
else
${confgen}
fi
fi
}
reload()
{
rndc reload
}
stop_post()
{
if [ -n "${named_chroot}" -a -c "${named_chroot}"/dev/null ]; then
umount "${named_chroot}"/dev 2>/dev/null || true
fi
}