1*00b67f09SDavid van Moolenbroek#!/bin/sh 2*00b67f09SDavid van Moolenbroek# 3*00b67f09SDavid van Moolenbroek# $NetBSD: named,v 1.25 2014/07/13 22:06:56 tls Exp $ 4*00b67f09SDavid van Moolenbroek# 5*00b67f09SDavid van Moolenbroek 6*00b67f09SDavid van Moolenbroek# PROVIDE: named 7*00b67f09SDavid van Moolenbroek# REQUIRE: NETWORKING mountcritremote syslogd 8*00b67f09SDavid van Moolenbroek# BEFORE: DAEMON 9*00b67f09SDavid van Moolenbroek# KEYWORD: chrootdir 10*00b67f09SDavid van Moolenbroek 11*00b67f09SDavid van Moolenbroek$_rc_subr_loaded . /etc/rc.subr 12*00b67f09SDavid van Moolenbroek 13*00b67f09SDavid van Moolenbroekname="named" 14*00b67f09SDavid van Moolenbroekrcvar=$name 15*00b67f09SDavid van Moolenbroekcommand="/usr/sbin/${name}" 16*00b67f09SDavid van Moolenbroekpidfile="/var/run/${name}/${name}.pid" 17*00b67f09SDavid van Moolenbroekstart_precmd="named_precmd" 18*00b67f09SDavid van Moolenbroekextra_commands="reload" 19*00b67f09SDavid van Moolenbroekrequired_dirs="$named_chrootdir" # if it is set, it must exist 20*00b67f09SDavid van Moolenbroek 21*00b67f09SDavid van Moolenbroeknamed_migrate() 22*00b67f09SDavid van Moolenbroek{ 23*00b67f09SDavid van Moolenbroek local src="$1" 24*00b67f09SDavid van Moolenbroek local dst="$2$1" 25*00b67f09SDavid van Moolenbroek echo "Migrating $src to $dst" 26*00b67f09SDavid van Moolenbroek( 27*00b67f09SDavid van Moolenbroek diff=false 28*00b67f09SDavid van Moolenbroek cd "$src" 29*00b67f09SDavid van Moolenbroek mkdir -p "$dst" 30*00b67f09SDavid van Moolenbroek for f in $(find . -type f) 31*00b67f09SDavid van Moolenbroek do 32*00b67f09SDavid van Moolenbroek f="${f##./}" 33*00b67f09SDavid van Moolenbroek case "$f" in 34*00b67f09SDavid van Moolenbroek */*) 35*00b67f09SDavid van Moolenbroek ds="$(dirname "$f")" 36*00b67f09SDavid van Moolenbroek dd="$dst/$ds" 37*00b67f09SDavid van Moolenbroek mkdir -p "$dd" 38*00b67f09SDavid van Moolenbroek chmod "$(stat -f "%p" "$ds" | 39*00b67f09SDavid van Moolenbroek sed -e 's/.*\([0-7][0-7][0-7][0-7]\)$/\1/g')" "$dd" 40*00b67f09SDavid van Moolenbroek chown "$(stat -f %u:%g "$ds")" "$dd" 41*00b67f09SDavid van Moolenbroek ;; 42*00b67f09SDavid van Moolenbroek *) 43*00b67f09SDavid van Moolenbroek ;; 44*00b67f09SDavid van Moolenbroek esac 45*00b67f09SDavid van Moolenbroek if [ -r "$dst/$f" ] 46*00b67f09SDavid van Moolenbroek then 47*00b67f09SDavid van Moolenbroek if ! cmp "$f" "$dst/$f"; then 48*00b67f09SDavid van Moolenbroek diff=true 49*00b67f09SDavid van Moolenbroek fi 50*00b67f09SDavid van Moolenbroek else 51*00b67f09SDavid van Moolenbroek cp -p "$f" "$dst/$f" 52*00b67f09SDavid van Moolenbroek fi 53*00b67f09SDavid van Moolenbroek done 54*00b67f09SDavid van Moolenbroek if $diff; then 55*00b67f09SDavid van Moolenbroek echo "Cannot complete migration because files are different" 56*00b67f09SDavid van Moolenbroek echo "Run 'diff -r $src $dst' resolve the differences" 57*00b67f09SDavid van Moolenbroek else 58*00b67f09SDavid van Moolenbroek rm -fr "$src" 59*00b67f09SDavid van Moolenbroek ln -s "$dst" "$src" 60*00b67f09SDavid van Moolenbroek fi 61*00b67f09SDavid van Moolenbroek) 62*00b67f09SDavid van Moolenbroek} 63*00b67f09SDavid van Moolenbroek 64*00b67f09SDavid van Moolenbroeknamed_precmd() 65*00b67f09SDavid van Moolenbroek{ 66*00b67f09SDavid van Moolenbroek if [ ! -e "/etc/rndc.key" ]; then 67*00b67f09SDavid van Moolenbroek echo "Generating rndc.key" 68*00b67f09SDavid van Moolenbroek /usr/sbin/rndc-confgen -a 69*00b67f09SDavid van Moolenbroek fi 70*00b67f09SDavid van Moolenbroek 71*00b67f09SDavid van Moolenbroek if [ -z "$named_chrootdir" ]; then 72*00b67f09SDavid van Moolenbroek if [ ! -d "/etc/namedb/keys" ]; then 73*00b67f09SDavid van Moolenbroek mkdir -m 775 "/etc/namedb/keys" 74*00b67f09SDavid van Moolenbroek chown named:named "/etc/namedb/keys" 75*00b67f09SDavid van Moolenbroek fi 76*00b67f09SDavid van Moolenbroek return 0; 77*00b67f09SDavid van Moolenbroek fi 78*00b67f09SDavid van Moolenbroek 79*00b67f09SDavid van Moolenbroek # If running in a chroot cage, ensure that the appropriate files 80*00b67f09SDavid van Moolenbroek # exist inside the cage, as well as helper symlinks into the cage 81*00b67f09SDavid van Moolenbroek # from outside. 82*00b67f09SDavid van Moolenbroek # 83*00b67f09SDavid van Moolenbroek # As this is called after the is_running and required_dir checks 84*00b67f09SDavid van Moolenbroek # are made in run_rc_command(), we can safely assume ${named_chrootdir} 85*00b67f09SDavid van Moolenbroek # exists and named isn't running at this point (unless forcestart 86*00b67f09SDavid van Moolenbroek # is used). 87*00b67f09SDavid van Moolenbroek # 88*00b67f09SDavid van Moolenbroek case "$($command -v)" in 89*00b67f09SDavid van Moolenbroek BIND*) # 9 no group, named-xfer, or ndc 90*00b67f09SDavid van Moolenbroek ;; 91*00b67f09SDavid van Moolenbroek named*) # 4 and 8 92*00b67f09SDavid van Moolenbroek rc_flags="-g named $rc_flags" 93*00b67f09SDavid van Moolenbroek if [ ! -x "${named_chrootdir}/usr/libexec/named-xfer" -o \ 94*00b67f09SDavid van Moolenbroek "${named_chrootdir}/usr/libexec/named-xfer" -ot \ 95*00b67f09SDavid van Moolenbroek /usr/libexec/named-xfer ]; then 96*00b67f09SDavid van Moolenbroek rm -f "${named_chrootdir}/usr/libexec/named-xfer" 97*00b67f09SDavid van Moolenbroek cp -p /usr/libexec/named-xfer \ 98*00b67f09SDavid van Moolenbroek "${named_chrootdir}/usr/libexec" 99*00b67f09SDavid van Moolenbroek fi 100*00b67f09SDavid van Moolenbroek ln -fs "${named_chrootdir}/var/run/ndc" /var/run/ndc 101*00b67f09SDavid van Moolenbroek ;; 102*00b67f09SDavid van Moolenbroek esac 103*00b67f09SDavid van Moolenbroek 104*00b67f09SDavid van Moolenbroek for i in null random urandom; do 105*00b67f09SDavid van Moolenbroek if [ ! -c "${named_chrootdir}/dev/$i" ]; then 106*00b67f09SDavid van Moolenbroek rm -f "${named_chrootdir}/dev/$i" 107*00b67f09SDavid van Moolenbroek (cd /dev && 108*00b67f09SDavid van Moolenbroek /bin/pax -rw -pe "$i" "${named_chrootdir}/dev") 109*00b67f09SDavid van Moolenbroek fi 110*00b67f09SDavid van Moolenbroek done 111*00b67f09SDavid van Moolenbroek 112*00b67f09SDavid van Moolenbroek if [ ! -h /etc/namedb ]; then 113*00b67f09SDavid van Moolenbroek named_migrate /etc/namedb ${named_chrootdir} 114*00b67f09SDavid van Moolenbroek fi 115*00b67f09SDavid van Moolenbroek 116*00b67f09SDavid van Moolenbroek for i in named.conf rndc.key; do 117*00b67f09SDavid van Moolenbroek if [ \( -r "/etc/$i" \) -a \( ! -h "/etc/$i" \) -a \ 118*00b67f09SDavid van Moolenbroek \( ! -r "${named_chrootdir}/etc/$i" \) ]; then 119*00b67f09SDavid van Moolenbroek mv "/etc/$i" "${named_chrootdir}/etc/$i" 120*00b67f09SDavid van Moolenbroek ln -s "${named_chrootdir}/etc/$i" "/etc/$i" 121*00b67f09SDavid van Moolenbroek fi 122*00b67f09SDavid van Moolenbroek done 123*00b67f09SDavid van Moolenbroek 124*00b67f09SDavid van Moolenbroek if [ \( ! -r ${named_chrootdir}/etc/named.conf \) -a \ 125*00b67f09SDavid van Moolenbroek \( -r ${named_chrootdir}/etc/namedb/named.conf \) ]; then 126*00b67f09SDavid van Moolenbroek ln -s namedb/named.conf ${named_chrootdir}/etc 127*00b67f09SDavid van Moolenbroek fi 128*00b67f09SDavid van Moolenbroek 129*00b67f09SDavid van Moolenbroek if [ -f /etc/localtime ]; then 130*00b67f09SDavid van Moolenbroek cmp -s /etc/localtime "${named_chrootdir}/etc/localtime" || \ 131*00b67f09SDavid van Moolenbroek cp -p /etc/localtime "${named_chrootdir}/etc/localtime" 132*00b67f09SDavid van Moolenbroek fi 133*00b67f09SDavid van Moolenbroek 134*00b67f09SDavid van Moolenbroek local piddir="$(dirname "${pidfile}")" 135*00b67f09SDavid van Moolenbroek mkdir -p "${named_chrootdir}${piddir}" "${piddir}" 136*00b67f09SDavid van Moolenbroek chmod 755 "${named_chrootdir}${piddir}" "${piddir}" 137*00b67f09SDavid van Moolenbroek chown named:named "${named_chrootdir}${piddir}" "${piddir}" 138*00b67f09SDavid van Moolenbroek ln -fs "${named_chrootdir}${pidfile}" "${pidfile}" 139*00b67f09SDavid van Moolenbroek 140*00b67f09SDavid van Moolenbroek # Change run_rc_commands()'s internal copy of $named_flags 141*00b67f09SDavid van Moolenbroek # 142*00b67f09SDavid van Moolenbroek rc_flags="-u named -t ${named_chrootdir} $rc_flags" 143*00b67f09SDavid van Moolenbroek} 144*00b67f09SDavid van Moolenbroek 145*00b67f09SDavid van Moolenbroekload_rc_config $name 146*00b67f09SDavid van Moolenbroekrun_rc_command "$1" 147