Without this flag, if the symlink existed already a new symlink would be created in the source directory. While harmless if the two symlinks were the same, it nonetheless caused pointless confusion. The pathological case is that when there is an existing /etc/namedb symlink, but named_chrootdir in rc.conf pointed to a different directory, it was the symlink in /var/named that was getting updated, not the one in /etc. This led to some difficult to diagnose problems for users.
122 lines
3.1 KiB
Bash
Executable File
122 lines
3.1 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
# $NetBSD: named,v 1.10 2002/03/22 04:33:59 thorpej Exp $
|
|
# $FreeBSD$
|
|
#
|
|
|
|
# PROVIDE: named
|
|
# REQUIRE: SERVERS cleanvar
|
|
# BEFORE: DAEMON
|
|
# KEYWORD: shutdown
|
|
|
|
. /etc/rc.subr
|
|
|
|
name="named"
|
|
rcvar=`set_rcvar`
|
|
start_precmd="named_precmd"
|
|
start_postcmd="make_symlinks"
|
|
stop_postcmd="named_poststop"
|
|
required_dirs="$named_chrootdir" # if it is set, it must exist
|
|
extra_commands="reload"
|
|
|
|
# If running in a chroot cage, ensure that the appropriate files
|
|
# exist inside the cage, as well as helper symlinks into the cage
|
|
# from outside.
|
|
#
|
|
# As this is called after the is_running and required_dir checks
|
|
# are made in run_rc_command(), we can safely assume ${named_chrootdir}
|
|
# exists and named isn't running at this point (unless forcestart
|
|
# is used).
|
|
#
|
|
chroot_autoupdate()
|
|
{
|
|
# Create (or update) the chroot directory structure
|
|
#
|
|
if [ -f /etc/mtree/BIND.chroot.dist ]; then
|
|
mtree -deU -f /etc/mtree/BIND.chroot.dist \
|
|
-p ${named_chrootdir}
|
|
else
|
|
warn "/etc/mtree/BIND.chroot.dist missing,"
|
|
warn "chroot directory structure not updated"
|
|
fi
|
|
|
|
# Create /etc/namedb symlink
|
|
#
|
|
if [ ! -L /etc/namedb ]; then
|
|
if [ -d /etc/namedb ]; then
|
|
warn "named chroot: /etc/namedb is a directory!"
|
|
elif [ -e /etc/namedb ]; then
|
|
warn "named chroot: /etc/namedb exists!"
|
|
else
|
|
ln -s ${named_chrootdir}/etc/namedb /etc/namedb
|
|
fi
|
|
else
|
|
# Make sure it points to the right place.
|
|
ln -shf ${named_chrootdir}/etc/namedb /etc/namedb
|
|
|
|
fi
|
|
|
|
# Mount a devfs in the chroot directory if needed
|
|
#
|
|
if [ ! -c ${named_chrootdir}/dev/random -o \
|
|
! -c ${named_chrootdir}/dev/null ]; then
|
|
umount ${named_chrootdir}/dev 2>/dev/null
|
|
mount_devfs devfs ${named_chrootdir}/dev
|
|
fi
|
|
devfs -m ${named_chrootdir}/dev rule apply hide
|
|
devfs -m ${named_chrootdir}/dev rule apply path null unhide
|
|
devfs -m ${named_chrootdir}/dev rule apply path random unhide
|
|
|
|
# Copy local timezone information if it is not up to date.
|
|
#
|
|
if [ -f /etc/localtime ]; then
|
|
cmp -s /etc/localtime "${named_chrootdir}/etc/localtime" || \
|
|
cp -p /etc/localtime "${named_chrootdir}/etc/localtime"
|
|
fi
|
|
}
|
|
|
|
# Make symlinks to the correct pid file
|
|
#
|
|
make_symlinks()
|
|
{
|
|
checkyesno named_symlink_enable &&
|
|
ln -fs "${named_chrootdir}${pidfile}" ${pidfile}
|
|
}
|
|
|
|
named_poststop()
|
|
{
|
|
if [ -n "${named_chrootdir}" -a -c ${named_chrootdir}/dev/null ]; then
|
|
umount ${named_chrootdir}/dev 2>/dev/null || true
|
|
fi
|
|
}
|
|
|
|
named_precmd()
|
|
{
|
|
local confgen_chroot
|
|
|
|
# Is the user using a sandbox?
|
|
#
|
|
if [ -n "$named_chrootdir" ]; then
|
|
rc_flags="$rc_flags -t $named_chrootdir"
|
|
confgen_chroot="-t${named_chrootdir} -u bind"
|
|
checkyesno named_chroot_autoupdate && chroot_autoupdate
|
|
else
|
|
named_symlink_enable=NO
|
|
fi
|
|
|
|
# Create an rndc.key file for the user if none exists
|
|
#
|
|
if [ ! -f "${named_chrootdir}/etc/namedb/rndc.key" -a \
|
|
! -f "${named_chrootdir}/etc/namedb/rndc.conf" ]; then
|
|
rndc-confgen -a -b256 ${confgen_chroot}
|
|
fi
|
|
}
|
|
|
|
load_rc_config $name
|
|
# The following variable requires that rc.conf be loaded first
|
|
#
|
|
required_dirs="$named_chrootdir" # if it is set, it must exist
|
|
pidfile="${named_pidfile:-/var/run/${name}/pid}"
|
|
|
|
run_rc_command "$1"
|