xref: /freebsd/usr.sbin/ypserv/ypinit.sh (revision d0b2dbfa0ecf2bbc9709efc5e20baf8e4b44bbbf)
113170f18SBill Paul#!/bin/sh
213170f18SBill Paul#
3d64ada50SJens Schweikhardt# ypinit.sh - setup a master or slave server.
413170f18SBill Paul# (Taken from OpenBSD and modified for FreeBSD.)
513170f18SBill Paul#
613170f18SBill PaulDOMAINNAME=/bin/domainname
713170f18SBill PaulHOSTNAME=/bin/hostname
813170f18SBill PaulYPWHICH=/usr/bin/ypwhich
913170f18SBill PaulYPXFR=/usr/libexec/ypxfr
1013170f18SBill PaulYP_DIR=/var/yp
1113170f18SBill PaulMAKEDBM=/usr/sbin/yp_mkdb
1213170f18SBill PaulMAPLIST="master.passwd.byname master.passwd.byuid passwd.byname passwd.byuid \
1313170f18SBill Paul	 group.byname group.bygid hosts.byname hosts.byaddr services.byname \
1413170f18SBill Paul	 rpc.byname rpc.bynumber networks.byname networks.byaddr netgroup \
1513170f18SBill Paul	 netgroup.byuser netgroup.byhost netid.byname publickey.byname \
16fac7bc23SAlan Somers	 bootparams ethers.byname ethers.byaddr eui64.byname eui64.byid \
17fac7bc23SAlan Somers	 amd.host mail.aliases ypservers protocols.byname protocols.bynumber \
18fac7bc23SAlan Somers	 netmasks.byaddr"
1913170f18SBill Paul
2013170f18SBill PaulERROR_EXISTS="NO"
2113170f18SBill Paulumask 077
2213170f18SBill Paul
2313170f18SBill Paul#set -xv
2413170f18SBill Paul
2513170f18SBill PaulERROR=USAGE				# assume usage error
2613170f18SBill Paul
2713170f18SBill Paulif [ $# -eq 1 ]
2813170f18SBill Paulthen
2913170f18SBill Paul	if [ $1 = "-m" ]		# ypinit -m
3013170f18SBill Paul	then
3113170f18SBill Paul		DOMAIN=`${DOMAINNAME}`
3213170f18SBill Paul		SERVERTYPE=MASTER
3313170f18SBill Paul		ERROR=
3413170f18SBill Paul	fi
3513170f18SBill Paul
3613170f18SBill Paul	if [ $1 = "-u" ]		# ypinit -u
3713170f18SBill Paul	then
3813170f18SBill Paul		DOMAIN=`${DOMAINNAME}`
3913170f18SBill Paul		SERVERTYPE=UPDATE
4013170f18SBill Paul		ERROR=
4113170f18SBill Paul	fi
4213170f18SBill Paulfi
4313170f18SBill Paul
4413170f18SBill Paulif [ $# -eq 2 ]
4513170f18SBill Paulthen
4613170f18SBill Paul	if [ $1 = "-m" ]		# ypinit -m domainname
4713170f18SBill Paul	then
4813170f18SBill Paul		DOMAIN=${2}
4913170f18SBill Paul		SERVERTYPE=MASTER
5013170f18SBill Paul		ERROR=
5113170f18SBill Paul	fi
5213170f18SBill Paul
5313170f18SBill Paul	if [ $1 = "-s" ]		# ypinit -s master_server
5413170f18SBill Paul	then
5513170f18SBill Paul		DOMAIN=`${DOMAINNAME}`
5613170f18SBill Paul		SERVERTYPE=SLAVE
5713170f18SBill Paul		MASTER=${2}
5813170f18SBill Paul		ERROR=
5913170f18SBill Paul	fi
6013170f18SBill Paul
6113170f18SBill Paul	if [ $1 = "-u" ]		# ypinit -u domainname
6213170f18SBill Paul	then
6313170f18SBill Paul		DOMAIN=${2}
6413170f18SBill Paul		SERVERTYPE=UPDATE
6513170f18SBill Paul		ERROR=
6613170f18SBill Paul	fi
6713170f18SBill Paulfi
6813170f18SBill Paul
6913170f18SBill Paulif [ $# -eq 3 ]
7013170f18SBill Paulthen
7113170f18SBill Paul	if [ $1 = "-s" ]		# ypinit -s master_server domainname
7213170f18SBill Paul	then
7313170f18SBill Paul		DOMAIN=${3}
7413170f18SBill Paul		SERVERTYPE=SLAVE
7513170f18SBill Paul		MASTER=${2}
7613170f18SBill Paul		ERROR=
7713170f18SBill Paul	fi
7813170f18SBill Paulfi
7913170f18SBill Paul
8013170f18SBill Paulif [ "${ERROR}" = "USAGE" ]; then
8113170f18SBill Paul	cat << \__usage 1>&2
8213170f18SBill Paulusage: ypinit -m [domainname]
8313170f18SBill Paul       ypinit -s master_server [domainname]
8413170f18SBill Paul       ypinit -u [domainname]
8513170f18SBill Paul
8613170f18SBill PaulThe `-m' flag builds a master YP server, and the `-s' flag builds
8713170f18SBill Paula slave YP server.  When building a slave YP server, `master_server'
8813170f18SBill Paulmust be an existing, reachable YP server.
8913170f18SBill PaulThe `-u' is for updating the ypservers map on a master server.
9013170f18SBill Paul__usage
9113170f18SBill Paul
9213170f18SBill Paul	exit 1
9313170f18SBill Paulfi
9413170f18SBill Paul
9513170f18SBill Paul# Check if domainname is set, don't accept an empty domainname
9613170f18SBill Paulif [ -z "${DOMAIN}" ]; then
9713170f18SBill Paul	cat << \__no_domain 1>&2
9813170f18SBill PaulThe local host's YP domain name has not been set.  Please set it with
99d8207d54SBill Paulthe domainname(1) command or pass the domain as an argument to ypinit(8).
10013170f18SBill Paul__no_domain
10113170f18SBill Paul
10213170f18SBill Paul	exit 1
10313170f18SBill Paulfi
10413170f18SBill Paul
10513170f18SBill Paul# Check if hostname is set, don't accept an empty hostname
10613170f18SBill PaulHOST=`${HOSTNAME}`
10713170f18SBill Paulif [ -z "${HOST}" ]; then
10813170f18SBill Paul	cat << \__no_hostname 1>&2
10913170f18SBill PaulThe local host's hostname has not been set.  Please set it with the
110d8207d54SBill Paulhostname(1) command.
11113170f18SBill Paul__no_hostname
11213170f18SBill Paul
11313170f18SBill Paul	exit 1
11413170f18SBill Paulfi
11513170f18SBill Paul
11613170f18SBill Paul# Check if we have contact with master.
11713170f18SBill Paul# If we can't list the maps on the master, then we fake it with a
11813170f18SBill Paul# hard-coded list of maps. The FreeBSD ypxfr command will work even
11913170f18SBill Paul# if ypbind isn't running or if we are bound to ourselves instead of
12013170f18SBill Paul# the master (the slave should be bound to itself, but since it has
12113170f18SBill Paul# no maps yet, we can't get a maplist from it).
12213170f18SBill Paulif [ "${SERVERTYPE}" = "SLAVE" ];
12313170f18SBill Paulthen
12413170f18SBill Paul	COUNT=`${YPWHICH} -d ${DOMAIN} -m 2>/dev/null | grep -i ${MASTER} | wc -l | tr -d " "`
12513170f18SBill Paul	if [ "$COUNT" = "0" ]
12613170f18SBill Paul	then
12713170f18SBill Paul		echo "Can't enumerate maps from ${MASTER}. Please check that it is running." 1>&2
12813170f18SBill Paul		echo "Note: using hardcoded maplist for map transfers." 1>&2
12913170f18SBill Paul		YPMAPLIST=${MAPLIST}
13013170f18SBill Paul	else
13113170f18SBill Paul		YPMAPLIST=`${YPWHICH} -d ${DOMAIN} -m | cut -d\  -f1`
13213170f18SBill Paul	fi
13313170f18SBill Paul	echo "" 1>&2
13413170f18SBill Paulfi
13513170f18SBill Paul
13613170f18SBill Paul# Check if user is root
13713170f18SBill PaulID=`id -u`
13813170f18SBill Paulif [ "${ID}" != "0" ]; then
13913170f18SBill Paul	echo "You have to be the superuser to run this.  Please login as root." 1>&2
14013170f18SBill Paul	exit 1
14113170f18SBill Paulfi
14213170f18SBill Paul
14313170f18SBill Paul# Check if the YP directory exists.
14413170f18SBill Paul
14513170f18SBill Paulif [ ! -d ${YP_DIR} -o -f ${YP_DIR} ]
14613170f18SBill Paulthen
14713170f18SBill Paul	echo "The directory ${YP_DIR} doesn't exist.  Restore it from the distribution." 1>&2
14813170f18SBill Paul	exit 1
14913170f18SBill Paul
15013170f18SBill Paulfi
15113170f18SBill Paul
15213170f18SBill Paulecho -n "Server Type: ${SERVERTYPE} Domain: ${DOMAIN}"
15313170f18SBill Paulif [ "${SERVERTYPE}" = "SLAVE" ]; then
15413170f18SBill Paul	echo -n " Master: ${MASTER}"
15513170f18SBill Paulfi
15613170f18SBill Paulecho ""
15713170f18SBill Paul
15813170f18SBill Paulif [ "${SERVERTYPE}" != "UPDATE" ];
15913170f18SBill Paulthen
16013170f18SBill Paul	cat << \__notice1
16113170f18SBill Paul
16213170f18SBill PaulCreating an YP server will require that you answer a few questions.
16313170f18SBill PaulQuestions will all be asked at the beginning of the procedure.
16413170f18SBill Paul
16513170f18SBill Paul__notice1
16613170f18SBill Paul
16713170f18SBill Paul	echo -n "Do you want this procedure to quit on non-fatal errors? [y/n: n]  "
16813170f18SBill Paul	read DOEXIT
16913170f18SBill Paul
17013170f18SBill Paul	case ${DOEXIT} in
17113170f18SBill Paul	y*|Y*)
17213170f18SBill Paul		ERROR_EXIT="YES"
17313170f18SBill Paul		;;
17413170f18SBill Paul
17513170f18SBill Paul	*)	ERROR_EXIT="NO"
17613170f18SBill Paul		echo ""
17713170f18SBill Paul		echo "Ok, please remember to go back and redo manually whatever fails."
17813170f18SBill Paul		echo "If you don't, something might not work. "
17913170f18SBill Paul		;;
18013170f18SBill Paul	esac
18113170f18SBill Paul
18213170f18SBill Paul	if [ -d "${YP_DIR}/${DOMAIN}" ]; then
18313170f18SBill Paul		echo ""
18413170f18SBill Paul		echo -n "Can we destroy the existing ${YP_DIR}/${DOMAIN} and its contents? [y/n: n]  "
18513170f18SBill Paul		read KILL
18613170f18SBill Paul
18713170f18SBill Paul		ERROR=
18813170f18SBill Paul		case ${KILL} in
18913170f18SBill Paul		y*|Y*)
19013170f18SBill Paul			ERROR="DELETE"
19113170f18SBill Paul			;;
19213170f18SBill Paul
19313170f18SBill Paul		*)	ERROR=
19413170f18SBill Paul			;;
19513170f18SBill Paul		esac
19613170f18SBill Paul
19713170f18SBill Paul		if [ "${ERROR}" = "DELETE" ]; then
19813170f18SBill Paul			if ! rm -rf ${YP_DIR}/${DOMAIN}; then
19913170f18SBill Paul				echo "Can't clean up old directory ${YP_DIR}/${DOMAIN}." 1>&2
20013170f18SBill Paul				exit 1
20113170f18SBill Paul			fi
20213170f18SBill Paul		else
20313170f18SBill Paul			echo "OK, please clean it up by hand and start again.  Bye"
20413170f18SBill Paul			exit 0
20513170f18SBill Paul		fi
20613170f18SBill Paul	fi
20713170f18SBill Paul
20813170f18SBill Paul	if ! mkdir "${YP_DIR}/${DOMAIN}"; then
20913170f18SBill Paul		echo "Can't make new directory ${YP_DIR}/${DOMAIN}." 1>&2
21013170f18SBill Paul		exit 1
21113170f18SBill Paul	fi
21213170f18SBill Paulfi
21313170f18SBill Paul
21413170f18SBill Paulif [ "${SERVERTYPE}" = "MASTER" ];
21513170f18SBill Paulthen
21613170f18SBill Paul
21713170f18SBill Paul	if [ ! -f ${YP_DIR}/Makefile ]
21813170f18SBill Paul	then
21913170f18SBill Paul		if [ ! -f ${YP_DIR}/Makefile.dist ]
22013170f18SBill Paul		then
22113170f18SBill Paul			echo "Can't find ${YP_DIR}/Makefile.dist. " 1>&2
22213170f18SBill Paul			exit 1
22313170f18SBill Paul		fi
22413170f18SBill Paul		cp ${YP_DIR}/Makefile.dist ${YP_DIR}/Makefile
22513170f18SBill Paul	fi
22613170f18SBill Paul
22713170f18SBill Paulfi
22813170f18SBill Paul
22913170f18SBill Paulif [ "${SERVERTYPE}" = "SLAVE" ];
23013170f18SBill Paulthen
23113170f18SBill Paul
23213170f18SBill Paul	echo "There will be no further questions. The remainder of the procedure"
23313170f18SBill Paul	echo "should take a few minutes, to copy the databases from ${MASTER}."
23413170f18SBill Paul
23513170f18SBill Paul	for MAP in ${YPMAPLIST}
23613170f18SBill Paul	do
237*463a577bSEitan Adler		echo "Transferring ${MAP}..."
23813170f18SBill Paul		if ! ${YPXFR} -p ${YP_DIR} -h ${MASTER} -c -d ${DOMAIN} ${MAP}; then
23913170f18SBill Paul			echo "Can't transfer map ${MAP}." 1>&2
24013170f18SBill Paul			ERROR_EXISTS="YES"
24113170f18SBill Paul			if [ "${ERROR_EXIT}" = "YES" ]; then
24213170f18SBill Paul				exit 1
24313170f18SBill Paul			fi
24413170f18SBill Paul		fi
24513170f18SBill Paul	done
24613170f18SBill Paul
24713170f18SBill Paul	echo ""
24813170f18SBill Paul	if [ "${ERROR_EXISTS}" = "YES"  ]; then
24913170f18SBill Paul		echo "${HOST} has been setup as an YP slave server with errors. " 1>&2
25013170f18SBill Paul		echo "Please remember fix any problem that occurred." 1>&2
25113170f18SBill Paul	else
25213170f18SBill Paul		echo "${HOST} has been setup as an YP slave server without any errors. "
25313170f18SBill Paul	fi
25413170f18SBill Paul
25513170f18SBill Paul	echo "Don't forget to update map ypservers on ${MASTER}."
25613170f18SBill Paul	exit 0
25713170f18SBill Paulfi
25813170f18SBill Paul
25913170f18SBill PaulLIST_OK="NO"
26013170f18SBill Paul
26113170f18SBill Paulwhile [ "${LIST_OK}" = "NO" ];
26213170f18SBill Pauldo
26313170f18SBill Paul	if [ "${SERVERTYPE}" = "MASTER" ];
26413170f18SBill Paul	then
26513170f18SBill Paul		HOST_LIST="${HOST}"
26613170f18SBill Paul		echo ""
26713170f18SBill Paul		echo "At this point, we have to construct a list of this domains YP servers."
26813170f18SBill Paul		echo "${HOST} is already known as master server."
26913170f18SBill Paul		echo "Please continue to add any slave servers, one per line. When you are"
27013170f18SBill Paul		echo "done with the list, type a <control D>."
27113170f18SBill Paul		echo "	master server   :  ${HOST}"
27213170f18SBill Paul	fi
27313170f18SBill Paul
27413170f18SBill Paul	if [ "${SERVERTYPE}" = "UPDATE" ];
27513170f18SBill Paul	then
27613170f18SBill Paul		HOST_LIST="${HOST}"
27713170f18SBill Paul		NEW_LIST=""
27813170f18SBill Paul		MASTER_NAME=""
27913170f18SBill Paul		SHORT_HOST=`echo ${HOST} | cut -d. -f1`
28013170f18SBill Paul		if [ -f ${YP_DIR}/${DOMAIN}/ypservers ];
28113170f18SBill Paul		then
28213170f18SBill Paul			for srv in `${MAKEDBM} -u ${YP_DIR}/${DOMAIN}/ypservers | grep -v "^YP" | tr "\t" " " | cut -d\  -f1`;
28313170f18SBill Paul			do
28413170f18SBill Paul				short_srv=`echo ${srv} | cut -d. -f1`
28513170f18SBill Paul				if [ "${SHORT_HOST}" != "${short_srv}" ]
28613170f18SBill Paul				then
28713170f18SBill Paul					if [ "${NEW_LIST}" = "" ];
28813170f18SBill Paul					then
28913170f18SBill Paul						NEW_LIST="${srv}"
29013170f18SBill Paul					else
29113170f18SBill Paul						NEW_LIST="${NEW_LIST} ${srv}"
29213170f18SBill Paul					fi
29313170f18SBill Paul				fi
29413170f18SBill Paul			done;
29513170f18SBill Paul			MASTER_NAME=`${MAKEDBM} -u ${YP_DIR}/${DOMAIN}/ypservers | grep "^YP_MASTER_NAME" | tr "\t" " " | cut -d\  -f2`
29613170f18SBill Paul		fi
29713170f18SBill Paul		echo ""
29813170f18SBill Paul		echo "Update the list of hosts running YP servers in domain ${DOMAIN}."
29913170f18SBill Paul		echo "Master for this domain is ${MASTER_NAME}."
30013170f18SBill Paul		echo ""
301a5574348SDmitry Morozovsky		echo "First verify old servers, type \\\\ to remove a server."
30213170f18SBill Paul		echo "Then add new servers, one per line. When done type a <control D>."
30313170f18SBill Paul		echo ""
30413170f18SBill Paul		echo "	master server   :  ${HOST}"
30513170f18SBill Paul		if [ "${NEW_LIST}" != "" ]; then
30613170f18SBill Paul			for node in $NEW_LIST; do
30713170f18SBill Paul				echo -n "	verify host     : [${node}] "
30813170f18SBill Paul				read verify
30913170f18SBill Paul				if [ "${verify}" != "\\" ]; then
31013170f18SBill Paul					HOST_LIST="${HOST_LIST} ${node}"
31113170f18SBill Paul				fi
31213170f18SBill Paul			done;
31313170f18SBill Paul		fi
31413170f18SBill Paul	fi
31513170f18SBill Paul
31613170f18SBill Paul	echo -n "	next host to add:  "
31713170f18SBill Paul
31813170f18SBill Paul	while read h
31913170f18SBill Paul	do
32013170f18SBill Paul		echo -n "	next host to add:  "
32113170f18SBill Paul		HOST_LIST="${HOST_LIST} ${h}"
32213170f18SBill Paul	done
32313170f18SBill Paul
32413170f18SBill Paul	echo ""
32513170f18SBill Paul	echo "The current list of NIS servers looks like this:"
32613170f18SBill Paul	echo ""
32713170f18SBill Paul
32813170f18SBill Paul	for h in `echo ${HOST_LIST}`;
32913170f18SBill Paul	do
33013170f18SBill Paul		echo ${h}
33113170f18SBill Paul	done
33213170f18SBill Paul
33313170f18SBill Paul	echo ""
33413170f18SBill Paul	echo -n "Is this correct?  [y/n: y]  "
33513170f18SBill Paul	read hlist_ok
33613170f18SBill Paul
33713170f18SBill Paul	case $hlist_ok in
33813170f18SBill Paul	n*)	echo "Let's try the whole thing again...";;
33913170f18SBill Paul	N*)	echo "Let's try the whole thing again...";;
34013170f18SBill Paul	*)	LIST_OK="YES";;
34113170f18SBill Paul	esac
34213170f18SBill Paul
34313170f18SBill Pauldone
34413170f18SBill Paul
34513170f18SBill Paulecho "Building ${YP_DIR}/${DOMAIN}/ypservers..."
34613170f18SBill Paulrm -f ${YP_DIR}/ypservers
34713170f18SBill Paultouch -f ${YP_DIR}/ypservers
34813170f18SBill Paulrm -f ${YP_DIR}/${DOMAIN}/ypservers
34913170f18SBill Paulfor host in ${HOST_LIST};
35013170f18SBill Pauldo
35113170f18SBill Paul	echo "${host} ${host}" >> ${YP_DIR}/ypservers
35213170f18SBill Paul	echo "${host} ${host}"
35313170f18SBill Pauldone | ${MAKEDBM} - ${YP_DIR}/${DOMAIN}/ypservers
35413170f18SBill Paul
35513170f18SBill Paulif [ $? -ne 0 ]; then
35613170f18SBill Paul	echo "" 1>&2
35713170f18SBill Paul	echo "Couldn't build yp data base ${YP_DIR}/${DOMAIN}/ypservers." 1>&2
35813170f18SBill Paul	ERROR_EXISTS="YES"
35913170f18SBill Paul	if [ "${ERROR_EXIT}" = "YES" ]; then
36013170f18SBill Paul		exit 1
36113170f18SBill Paul	fi
36213170f18SBill Paulfi
36313170f18SBill Paul
36413170f18SBill Paulif [ "${SERVERTYPE}" = "MASTER" ]; then
36513170f18SBill Paul	CUR_PWD=`pwd`
36613170f18SBill Paul	cd ${YP_DIR}
36713170f18SBill Paul	echo "Running ${YP_DIR}/Makefile..."
36813170f18SBill Paul	if ! make NOPUSH=True UPDATE_DOMAIN=${DOMAIN} YP_DIR=${YP_DIR}; then
36913170f18SBill Paul		echo "" 1>&2
37013170f18SBill Paul		echo "Error running Makefile." 1>&2
37113170f18SBill Paul		ERROR_EXISTS="YES"
37213170f18SBill Paul		if [ "${ERROR_EXIT}" = "YES" ]; then
37313170f18SBill Paul			exit 1
37413170f18SBill Paul		fi
37513170f18SBill Paul	fi
37613170f18SBill Paul
37713170f18SBill Paul	cd ${CUR_PWD}
37813170f18SBill Paul
37913170f18SBill Paul	echo ""
38013170f18SBill Paul	if [ "${ERROR_EXISTS}" = "YES" ]; then
38113170f18SBill Paul		echo "${HOST} has been setup as an YP master server with errors. " 1>&2
38213170f18SBill Paul		echo "Please remember fix any problem that occurred." 1>&2
38313170f18SBill Paul	else
38413170f18SBill Paul		echo "${HOST} has been setup as an YP master server without any errors. "
38513170f18SBill Paul	fi
38613170f18SBill Paulfi
387