Home | History | Annotate | Line # | Download | only in ypinit
ypinit.sh revision 1.13
      1 #!/bin/sh
      2 #
      3 #	$NetBSD: ypinit.sh,v 1.13 2018/07/20 13:11:01 kre Exp $
      4 #
      5 # ypinit.sh - setup a master or slave YP server
      6 #
      7 # Originally written by Mats O Jansson <moj (at] stacken.kth.se>
      8 # Modified by Jason R. Thorpe <thorpej (at] NetBSD.org>
      9 # Reworked by Luke Mewburn <lukem (at] NetBSD.org>
     10 #
     11 
     12 PATH=/bin:/usr/sbin:/usr/bin:${PATH}
     13 BIN_DOMAINNAME=/bin/domainname
     14 BIN_HOSTNAME=/bin/hostname
     15 ID=/usr/bin/id
     16 INSTALL=/usr/bin/install
     17 MAKEDBM=/usr/sbin/makedbm
     18 YPWHICH=/usr/bin/ypwhich
     19 YPXFR=/usr/sbin/ypxfr
     20 
     21 progname=$( basename $0 )
     22 yp_dir=/var/yp
     23 tmpfile=$(mktemp /tmp/ypservers.XXXXXX) || exit 1
     24 trap "rm -f ${tmpfile} ; exit 0" EXIT INT QUIT
     25 
     26 umask 077				# protect created directories
     27 
     28 if [ $( ${ID} -u ) != 0 ]; then
     29 	echo 1>&2 "$progname: you must be root to run this"
     30 	exit 1
     31 fi
     32 
     33 args=$(getopt cl:ms: $*)		# XXX should switch to getopts
     34 if [ $? -eq 0 ]; then
     35 	set -- $args
     36 	for i; do
     37 		case $i in
     38 		"-c")
     39 			servertype=client
     40 			shift
     41 			;;
     42 		"-m")
     43 			servertype=master
     44 			shift
     45 			;;
     46 		"-s")
     47 			servertype=slave
     48 			master=${2}
     49 			shift
     50 			shift
     51 			;;
     52 		"-l")
     53 			noninteractive=yes
     54 			serverlist=${2}
     55 			shift
     56 			shift
     57 			;;
     58 		"--")
     59 			shift
     60 			break
     61 			;;
     62 		esac
     63 	done
     64 
     65 	if [ $# -eq 1 ]; then
     66 		domain=${1}
     67 		shift;
     68 	else
     69 		domain=$( ${BIN_DOMAINNAME} )
     70 	fi
     71 fi
     72 
     73 if [ -z ${servertype} ]; then
     74 	cat 1>&2 << __usage
     75 usage: 	${progname} -c [domainname] [-l server1,...,serverN]
     76 	${progname} -m [domainname] [-l server1,...,serverN]
     77 	${progname} -s master_server [domainname] [-l server1,...,serverN]
     78 
     79 The \`-c' flag sets up a YP client, the \`-m' flag builds a master YP
     80 server, and the \`-s' flag builds a slave YP server.  When building a
     81 slave YP server, \`master_server' must be an existing, reachable YP server.
     82 __usage
     83 	exit 1
     84 fi
     85 
     86 # Check if domainname is set, don't accept an empty domainname
     87 if [ -z "${domain}" ]; then
     88 	cat << __no_domain 1>&2
     89 $progname: The local host's YP domain name has not been set.
     90 	Please set it with the domainname(1) command or pass the domain as
     91 	an argument to ${progname}.
     92 __no_domain
     93 
     94 	exit 1
     95 fi
     96 
     97 # Check if hostname is set, don't accept an empty hostname
     98 host=$( ${BIN_HOSTNAME} )
     99 if [ -z "${host}" ]; then
    100 	cat 1>&2 << __no_hostname
    101 $progname: The local host's hostname has not been set.
    102 	Please set it with the hostname(1) command.
    103 __no_hostname
    104 
    105 	exit 1
    106 fi
    107 if [ "${servertype}" = "slave" -a "${host}" = "${master}" ]; then
    108 	echo 1>&2 \
    109 	    "$progname: cannot setup a YP slave server off the local host."
    110 	exit 1
    111 fi
    112 
    113 # Check if the YP directory exists.
    114 if [ ! -d ${yp_dir} -o -f ${yp_dir} ]; then
    115 	cat 1>&2 << __no_dir
    116 $progname: The directory ${yp_dir} does not exist.
    117 	Restore it from the distribution.
    118 __no_dir
    119 
    120 	exit 1
    121 fi
    122 
    123 echo "Server type: ${servertype}"
    124 echo "Domain:      ${domain}"
    125 if [ "${servertype}" = "slave" ]; then
    126 	echo "Master:      ${master}"
    127 fi
    128 echo ""
    129 
    130 binding_dir=${yp_dir}/binding
    131 if [ ! -d ${binding_dir} ]; then
    132 	cat 1>&2 << __no_dir
    133 $progname: The directory ${binding_dir} does not exist.
    134 	Restore it from the distribution.
    135 __no_dir
    136 	exit 1
    137 fi
    138 
    139 if [ -z "${noninteractive}" ]; then
    140 	cat << __client_setup
    141 A YP client needs a list of YP servers to bind to.
    142 Whilst ypbind supports -broadcast, its use is not recommended.
    143 __client_setup
    144 
    145 	done=
    146 	while [ -z "${done}" ]; do
    147 		> ${tmpfile}
    148 		cat <<__list_of_servers
    149 
    150 Please enter a list of YP servers, in order of preference.
    151 When finished, press RETURN on a blank line or enter EOF.
    152 
    153 __list_of_servers
    154 
    155 		if [ "${servertype}" != "client" ]; then
    156 			echo ${host} >> ${tmpfile}
    157 			echo "	next host: ${host}";
    158 		fi
    159 		echo -n "	next host: ";
    160 
    161 		while read nextserver ; test -n "${nextserver}"
    162 		do
    163 			echo ${nextserver} >> ${tmpfile}
    164 			echo -n "	next host: ";
    165 		done
    166 
    167 		if [ -s ${tmpfile} ]; then
    168 			echo ""
    169 			echo "The current servers are:"
    170 			echo ""
    171 			cat ${tmpfile}
    172 			echo ""
    173 			echo -n "Is this correct? [y/n: n] "
    174 			read DONE
    175 			case ${DONE} in
    176 			y*|Y*)
    177 				done=yes
    178 				;;
    179 			esac
    180 		else
    181 			echo    ""
    182 			echo    "You have not supplied any servers."
    183 		fi
    184 		if [ -z "${done}" ]; then
    185 			echo -n "Do you wish to abort? [y/n: n] "
    186 			read ABORT
    187 			case ${ABORT} in
    188 			y*|Y*)
    189 				exit 0
    190 				;;
    191 			esac
    192 		fi
    193 	done
    194 else # interacive
    195 	if [ "${servertype}" != "client" ]; then
    196 		echo ${host} >> ${tmpfile}
    197 	fi
    198 	echo "${serverlist}" | sed -e 's/,/\
    199 /g' >> ${tmpfile}
    200 #the above newline is required
    201 	echo ""
    202 	echo "The current servers are:"
    203 	echo ""
    204 	cat ${tmpfile}
    205 	echo ""
    206 fi # interactive
    207 
    208 if [ -s ${tmpfile} ]; then
    209 	${INSTALL} -c -m 0444 ${tmpfile} ${binding_dir}/${domain}.ypservers
    210 fi
    211 
    212 if [ "${servertype}" = "client" ]; then
    213 	exit 0
    214 fi
    215 
    216 cat << __notice1
    217 
    218 Installing the YP database may require that you answer a few questions.
    219 Any configuration questions will be asked at the beginning of the procedure.
    220 
    221 __notice1
    222 
    223 if [ -d "${yp_dir}/${domain}" ]; then
    224 	echo	"Can we destroy the existing ${yp_dir}/${domain}"
    225 	echo -n	"and its contents? [y/n: n]  "
    226 	read KILL
    227 
    228 	case ${KILL} in
    229 	y*|Y*)
    230 		rm -rf ${yp_dir}/${domain}
    231 		if [ $? != 0 ]; then
    232 			echo 1>&2 \
    233 		"$progname: Can't clean up old directory ${yp_dir}/${domain}"
    234 			exit 1
    235 		fi
    236 		;;
    237 
    238 	*)
    239 		echo "OK, please clean it up by hand and start again."
    240 		exit 0
    241 		;;
    242 	esac
    243 fi
    244 
    245 if ! mkdir "${yp_dir}/${domain}"; then
    246 	echo 1>&2 "$progname: Can't make new directory ${yp_dir}/${domain}"
    247 	exit 1
    248 fi
    249 
    250 case ${servertype} in
    251 master)
    252 	if [ ! -f ${yp_dir}/Makefile ];	then
    253 		if [ ! -f ${yp_dir}/Makefile.main ]; then
    254 			echo 1>&2 \
    255 			    "$progname: Can't find ${yp_dir}/Makefile.main"
    256 			exit 1
    257 		fi
    258 		cp ${yp_dir}/Makefile.main ${yp_dir}/Makefile
    259 	fi
    260 
    261 	subdir=$(grep "^SUBDIR=" ${yp_dir}/Makefile)
    262 
    263 	if [ -z "${subdir}" ]; then
    264 		echo 1>&2 \
    265     "$progname: Can't find line starting with 'SUBDIR=' in ${yp_dir}/Makefile"
    266 		exit 1
    267 	fi
    268 
    269 	newsubdir="SUBDIR="
    270 	for dir in $(echo ${subdir} | cut -c8-255); do
    271 		if [ "${dir}" != "${domain}" ]; then
    272 			newsubdir="${newsubdir} ${dir}"
    273 		fi
    274 	done
    275 	newsubdir="${newsubdir} ${domain}"
    276 
    277 	if [ -f ${yp_dir}/Makefile.tmp ]; then
    278 		rm ${yp_dir}/Makefile.tmp
    279 	fi
    280 
    281 	mv ${yp_dir}/Makefile ${yp_dir}/Makefile.tmp
    282 	sed -e "s/^${subdir}/${newsubdir}/" ${yp_dir}/Makefile.tmp > \
    283 	    ${yp_dir}/Makefile
    284 	rm ${yp_dir}/Makefile.tmp
    285 
    286 	if [ ! -f ${yp_dir}/Makefile.yp ]; then
    287 		echo 1>&2 "$progname: Can't find ${yp_dir}/Makefile.yp"
    288 		exit 1
    289 	fi
    290 
    291 	cp ${yp_dir}/Makefile.yp ${yp_dir}/${domain}/Makefile
    292 
    293 	# Create `ypservers' with own name, so that yppush won't
    294 	# lose when we run "make".
    295 	(
    296 		cd ${yp_dir}/${domain}
    297 		echo "$host $host" > ypservers
    298 		${MAKEDBM} ypservers ypservers
    299 	)
    300 
    301 	echo "Done.  Be sure to run \`make' in ${yp_dir}."
    302 
    303 	;;
    304 
    305 slave)
    306 	echo ""
    307 
    308 	maps=$( ${YPWHICH} -d ${domain} -h ${master} -f -m 2>/dev/null |
    309 	    awk '{ if (substr($2, 1, length("'$master'")) == "'$master'") \
    310 		print $1; }' )
    311 
    312 	if [ -z "${maps}" ]; then
    313 		cat 1>&2 << __no_maps
    314 $progname: Can't find any maps for ${domain} on ${master}
    315 	Please check that the appropriate YP service is running.
    316 __no_maps
    317 		exit 1
    318 	fi
    319 
    320 	for map in ${maps}; do
    321 		echo "Transferring ${map}..."
    322 		if ! ${YPXFR} -h ${master} -c -d ${domain} ${map}; then
    323 			echo 1>&2 "$progname: Can't transfer map ${map}"
    324 			exit 1
    325 		fi
    326 	done
    327 
    328 	cat << __dont_forget
    329 
    330 Don't forget to update the \`ypservers' on ${master},
    331 by adding an entry similar to:
    332   ${host} ${host}
    333 
    334 __dont_forget
    335 	exit 0
    336 
    337 	;;
    338 
    339 *)
    340 	echo 1>&2 "$progname: unknown servertype \`${servertype}'"
    341 	exit 1
    342 esac
    343