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