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