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