named revision 1.21
11.1Slukem#!/bin/sh 21.1Slukem# 31.21Schristos# $NetBSD: named,v 1.21 2009/04/25 15:46:19 christos Exp $ 41.1Slukem# 51.1Slukem 61.1Slukem# PROVIDE: named 71.2Slukem# REQUIRE: SERVERS 81.10Sthorpej# BEFORE: DAEMON 91.11Slukem# KEYWORD: chrootdir 101.1Slukem 111.14Smycroft$_rc_subr_loaded . /etc/rc.subr 121.1Slukem 131.1Slukemname="named" 141.6Slukemrcvar=$name 151.1Slukemcommand="/usr/sbin/${name}" 161.19Schristospidfile="/var/run/${name}/${name}.pid" 171.7Slukemstart_precmd="named_precmd" 181.7Slukemextra_commands="reload" 191.7Slukemrequired_dirs="$named_chrootdir" # if it is set, it must exist 201.7Slukem 211.17Schristosnamed_migrate() 221.17Schristos{ 231.17Schristos local src=$1 241.17Schristos local dst=$2$1 251.17Schristos echo "Migrating $src to $dst" 261.17Schristos( 271.17Schristos diff=false 281.17Schristos cd $src 291.17Schristos for f in $(find . -type f) 301.17Schristos do 311.17Schristos f=${f##./} 321.17Schristos case $f in 331.17Schristos */*) 341.20Schristos d=$dst/$(dirname $f) 351.17Schristos ;; 361.17Schristos *) d=$dst 371.17Schristos ;; 381.17Schristos esac 391.17Schristos mkdir -p $d 401.18Schristos if [ -r "$dst/$f" ] 411.17Schristos then 421.18Schristos if ! cmp $f $dst/$f; then 431.17Schristos diff=true 441.17Schristos fi 451.17Schristos else 461.18Schristos cp -p $f $dst/$f 471.17Schristos fi 481.17Schristos done 491.17Schristos if $diff; then 501.17Schristos echo "Cannot complete migration because files are different" 511.17Schristos echo "Run 'diff -r $src $dst' resolve the differences" 521.17Schristos else 531.17Schristos rm -fr $src 541.17Schristos ln -s $dst $src 551.17Schristos fi 561.17Schristos) 571.17Schristos} 581.17Schristos 591.7Slukemnamed_precmd() 601.7Slukem{ 611.7Slukem if [ -z "$named_chrootdir" ]; then 621.7Slukem return 0; 631.7Slukem fi 641.7Slukem 651.7Slukem # If running in a chroot cage, ensure that the appropriate files 661.7Slukem # exist inside the cage, as well as helper symlinks into the cage 671.7Slukem # from outside. 681.7Slukem # 691.7Slukem # As this is called after the is_running and required_dir checks 701.7Slukem # are made in run_rc_command(), we can safely assume ${named_chrootdir} 711.7Slukem # exists and named isn't running at this point (unless forcestart 721.7Slukem # is used). 731.7Slukem # 741.12Schristos case "$($command -v)" in 751.12Schristos BIND*) # 9 no group, named-xfer, or ndc 761.12Schristos ;; 771.12Schristos named*) # 4 and 8 781.12Schristos rc_flags="-g named $rc_flags" 791.12Schristos if [ ! -x "${named_chrootdir}/usr/libexec/named-xfer" -o \ 801.12Schristos "${named_chrootdir}/usr/libexec/named-xfer" -ot \ 811.12Schristos /usr/libexec/named-xfer ]; then 821.12Schristos rm -f "${named_chrootdir}/usr/libexec/named-xfer" 831.12Schristos cp -p /usr/libexec/named-xfer \ 841.12Schristos "${named_chrootdir}/usr/libexec" 851.12Schristos fi 861.12Schristos ln -fs "${named_chrootdir}/var/run/ndc" /var/run/ndc 871.12Schristos ;; 881.12Schristos esac 891.12Schristos 901.13Schristos for i in null random 911.13Schristos do 921.13Schristos if [ ! -c "${named_chrootdir}/dev/$i" ]; then 931.13Schristos rm -f "${named_chrootdir}/dev/$i" 941.13Schristos (cd /dev && 951.13Schristos /bin/pax -rw -pe "$i" "${named_chrootdir}/dev") 961.13Schristos fi 971.13Schristos done 981.4Slukem 991.17Schristos if [ ! -h /etc/namedb ]; then 1001.17Schristos named_migrate /etc/namedb ${named_chrootdir} 1011.16Schristos fi 1021.18Schristos if [ \( -r /etc/named.conf \) -a \( ! -h /etc/named.conf \) -a \ 1031.18Schristos \( ! -r ${named_chrootdir}/etc/named.conf \) ] 1041.18Schristos then 1051.18Schristos mv /etc/named.conf ${named_chrootdir}/etc/named.conf 1061.18Schristos ln -s ${named_chrootdir}/etc/named.conf /etc/named.conf 1071.18Schristos fi 1081.16Schristos if [ \( ! -r ${named_chrootdir}/etc/named.conf \) -a \ 1091.16Schristos \( -r ${named_chrootdir}/etc/namedb/named.conf \) ]; then 1101.16Schristos ln -s namedb/named.conf ${named_chrootdir}/etc 1111.16Schristos fi 1121.16Schristos 1131.7Slukem if [ -f /etc/localtime ]; then 1141.7Slukem cmp -s /etc/localtime "${named_chrootdir}/etc/localtime" || \ 1151.7Slukem cp -p /etc/localtime "${named_chrootdir}/etc/localtime" 1161.7Slukem fi 1171.21Schristos 1181.21Schristos local piddir="$(dirname "${pidfile}")" 1191.21Schristos mkdir -p "${named_chrootdir}${piddir}" "${piddir}" 1201.21Schristos chmod 755 "${named_chrootdir}${piddir}" "${piddir}" 1211.21Schristos chown named:named "${named_chrootdir}${piddir}" "${piddir}" 1221.21Schristos ln -fs "${named_chrootdir}${pidfile}" "${pidfile}" 1231.7Slukem 1241.7Slukem # Change run_rc_commands()'s internal copy of $named_flags 1251.7Slukem # 1261.12Schristos rc_flags="-u named -t ${named_chrootdir} $rc_flags" 1271.7Slukem} 1281.1Slukem 1291.5Slukemload_rc_config $name 1301.3Slukemrun_rc_command "$1" 131