131110Swpaul#!/bin/sh
250479Speter# $FreeBSD$
331110Swpaul#
4108470Sschweikh# ypinit.sh - setup a master or slave server.
531110Swpaul# (Taken from OpenBSD and modified for FreeBSD.)
631110Swpaul#
731110SwpaulDOMAINNAME=/bin/domainname
831110SwpaulHOSTNAME=/bin/hostname
931110SwpaulYPWHICH=/usr/bin/ypwhich
1031110SwpaulYPXFR=/usr/libexec/ypxfr
1131110SwpaulYP_DIR=/var/yp
1231110SwpaulMAKEDBM=/usr/sbin/yp_mkdb
1331110SwpaulMAPLIST="master.passwd.byname master.passwd.byuid passwd.byname passwd.byuid \
1431110Swpaul	 group.byname group.bygid hosts.byname hosts.byaddr services.byname \
1531110Swpaul	 rpc.byname rpc.bynumber networks.byname networks.byaddr netgroup \
1631110Swpaul	 netgroup.byuser netgroup.byhost netid.byname publickey.byname \
1731110Swpaul	 bootparams ethers.byname ethers.byaddr amd.host mail.aliases \
1831110Swpaul	 ypservers protocols.byname protocols.bynumber netmasks.byaddr"
1931110Swpaul
2031110SwpaulERROR_EXISTS="NO"
2131110Swpaulumask 077
2231110Swpaul
2331110Swpaul#set -xv
2431110Swpaul
2531110SwpaulERROR=USAGE				# assume usage error
2631110Swpaul
2731110Swpaulif [ $# -eq 1 ]
2831110Swpaulthen
2931110Swpaul	if [ $1 = "-m" ]		# ypinit -m
3031110Swpaul	then
3131110Swpaul		DOMAIN=`${DOMAINNAME}`
3231110Swpaul		SERVERTYPE=MASTER
3331110Swpaul		ERROR=
3431110Swpaul	fi
3531110Swpaul
3631110Swpaul	if [ $1 = "-u" ]		# ypinit -u
3731110Swpaul	then
3831110Swpaul		DOMAIN=`${DOMAINNAME}`
3931110Swpaul		SERVERTYPE=UPDATE
4031110Swpaul		ERROR=
4131110Swpaul	fi
4231110Swpaulfi
4331110Swpaul
4431110Swpaulif [ $# -eq 2 ]
4531110Swpaulthen
4631110Swpaul	if [ $1 = "-m" ]		# ypinit -m domainname
4731110Swpaul	then
4831110Swpaul		DOMAIN=${2}
4931110Swpaul		SERVERTYPE=MASTER
5031110Swpaul		ERROR=
5131110Swpaul	fi
5231110Swpaul
5331110Swpaul	if [ $1 = "-s" ]		# ypinit -s master_server
5431110Swpaul	then
5531110Swpaul		DOMAIN=`${DOMAINNAME}`
5631110Swpaul		SERVERTYPE=SLAVE
5731110Swpaul		MASTER=${2}
5831110Swpaul		ERROR=
5931110Swpaul	fi
6031110Swpaul
6131110Swpaul	if [ $1 = "-u" ]		# ypinit -u domainname
6231110Swpaul	then
6331110Swpaul		DOMAIN=${2}
6431110Swpaul		SERVERTYPE=UPDATE
6531110Swpaul		ERROR=
6631110Swpaul	fi
6731110Swpaulfi
6831110Swpaul
6931110Swpaulif [ $# -eq 3 ]
7031110Swpaulthen
7131110Swpaul	if [ $1 = "-s" ]		# ypinit -s master_server domainname
7231110Swpaul	then
7331110Swpaul		DOMAIN=${3}
7431110Swpaul		SERVERTYPE=SLAVE
7531110Swpaul		MASTER=${2}
7631110Swpaul		ERROR=
7731110Swpaul	fi
7831110Swpaulfi
7931110Swpaul
8031110Swpaulif [ "${ERROR}" = "USAGE" ]; then
8131110Swpaul	cat << \__usage 1>&2
8231110Swpaulusage: ypinit -m [domainname]
8331110Swpaul       ypinit -s master_server [domainname]
8431110Swpaul       ypinit -u [domainname]
8531110Swpaul
8631110SwpaulThe `-m' flag builds a master YP server, and the `-s' flag builds
8731110Swpaula slave YP server.  When building a slave YP server, `master_server'
8831110Swpaulmust be an existing, reachable YP server.
8931110SwpaulThe `-u' is for updating the ypservers map on a master server.
9031110Swpaul__usage
9131110Swpaul
9231110Swpaul	exit 1
9331110Swpaulfi
9431110Swpaul
9531110Swpaul# Check if domainname is set, don't accept an empty domainname
9631110Swpaulif [ -z "${DOMAIN}" ]; then
9731110Swpaul	cat << \__no_domain 1>&2
9831110SwpaulThe local host's YP domain name has not been set.  Please set it with
9931182Swpaulthe domainname(1) command or pass the domain as an argument to ypinit(8).
10031110Swpaul__no_domain
10131110Swpaul
10231110Swpaul	exit 1
10331110Swpaulfi
10431110Swpaul
10531110Swpaul# Check if hostname is set, don't accept an empty hostname
10631110SwpaulHOST=`${HOSTNAME}`
10731110Swpaulif [ -z "${HOST}" ]; then
10831110Swpaul	cat << \__no_hostname 1>&2
10931110SwpaulThe local host's hostname has not been set.  Please set it with the
11031182Swpaulhostname(1) command.
11131110Swpaul__no_hostname
11231110Swpaul
11331110Swpaul	exit 1
11431110Swpaulfi
11531110Swpaul
11631110Swpaul# Check if we have contact with master.
11731110Swpaul# If we can't list the maps on the master, then we fake it with a
11831110Swpaul# hard-coded list of maps. The FreeBSD ypxfr command will work even
11931110Swpaul# if ypbind isn't running or if we are bound to ourselves instead of
12031110Swpaul# the master (the slave should be bound to itself, but since it has
12131110Swpaul# no maps yet, we can't get a maplist from it).
12231110Swpaulif [ "${SERVERTYPE}" = "SLAVE" ];
12331110Swpaulthen
12431110Swpaul	COUNT=`${YPWHICH} -d ${DOMAIN} -m 2>/dev/null | grep -i ${MASTER} | wc -l | tr -d " "`
12531110Swpaul	if [ "$COUNT" = "0" ]
12631110Swpaul	then
12731110Swpaul		echo "Can't enumerate maps from ${MASTER}. Please check that it is running." 1>&2
12831110Swpaul		echo "Note: using hardcoded maplist for map transfers." 1>&2
12931110Swpaul		YPMAPLIST=${MAPLIST}
13031110Swpaul	else
13131110Swpaul		YPMAPLIST=`${YPWHICH} -d ${DOMAIN} -m | cut -d\  -f1`
13231110Swpaul	fi
13331110Swpaul	echo "" 1>&2
13431110Swpaulfi
13531110Swpaul
13631110Swpaul# Check if user is root
13731110SwpaulID=`id -u`
13831110Swpaulif [ "${ID}" != "0" ]; then
13931110Swpaul	echo "You have to be the superuser to run this.  Please login as root." 1>&2
14031110Swpaul	exit 1
14131110Swpaulfi
14231110Swpaul
14331110Swpaul# Check if the YP directory exists.
14431110Swpaul
14531110Swpaulif [ ! -d ${YP_DIR} -o -f ${YP_DIR} ]
14631110Swpaulthen
14731110Swpaul	echo "The directory ${YP_DIR} doesn't exist.  Restore it from the distribution." 1>&2
14831110Swpaul	exit 1
14931110Swpaul
15031110Swpaulfi
15131110Swpaul
15231110Swpaulecho -n "Server Type: ${SERVERTYPE} Domain: ${DOMAIN}"
15331110Swpaulif [ "${SERVERTYPE}" = "SLAVE" ]; then
15431110Swpaul	echo -n " Master: ${MASTER}"
15531110Swpaulfi
15631110Swpaulecho ""
15731110Swpaul
15831110Swpaulif [ "${SERVERTYPE}" != "UPDATE" ];
15931110Swpaulthen
16031110Swpaul	cat << \__notice1
16131110Swpaul
16231110SwpaulCreating an YP server will require that you answer a few questions.
16331110SwpaulQuestions will all be asked at the beginning of the procedure.
16431110Swpaul
16531110Swpaul__notice1
16631110Swpaul
16731110Swpaul	echo -n "Do you want this procedure to quit on non-fatal errors? [y/n: n]  "
16831110Swpaul	read DOEXIT
16931110Swpaul
17031110Swpaul	case ${DOEXIT} in
17131110Swpaul	y*|Y*)
17231110Swpaul		ERROR_EXIT="YES"
17331110Swpaul		;;
17431110Swpaul
17531110Swpaul	*)	ERROR_EXIT="NO"
17631110Swpaul		echo ""
17731110Swpaul		echo "Ok, please remember to go back and redo manually whatever fails."
17831110Swpaul		echo "If you don't, something might not work. "
17931110Swpaul		;;
18031110Swpaul	esac
18131110Swpaul
18231110Swpaul	if [ -d "${YP_DIR}/${DOMAIN}" ]; then
183108470Sschweikh		echo ""
18431110Swpaul		echo -n "Can we destroy the existing ${YP_DIR}/${DOMAIN} and its contents? [y/n: n]  "
18531110Swpaul		read KILL
18631110Swpaul
18731110Swpaul		ERROR=
18831110Swpaul		case ${KILL} in
18931110Swpaul		y*|Y*)
19031110Swpaul			ERROR="DELETE"
19131110Swpaul			;;
19231110Swpaul
19331110Swpaul		*)	ERROR=
19431110Swpaul			;;
19531110Swpaul		esac
19631110Swpaul
19731110Swpaul		if [ "${ERROR}" = "DELETE" ]; then
19831110Swpaul			if ! rm -rf ${YP_DIR}/${DOMAIN}; then
19931110Swpaul				echo "Can't clean up old directory ${YP_DIR}/${DOMAIN}." 1>&2
20031110Swpaul				exit 1
20131110Swpaul			fi
20231110Swpaul		else
20331110Swpaul			echo "OK, please clean it up by hand and start again.  Bye"
20431110Swpaul			exit 0
20531110Swpaul		fi
20631110Swpaul	fi
20731110Swpaul
20831110Swpaul	if ! mkdir "${YP_DIR}/${DOMAIN}"; then
20931110Swpaul		echo "Can't make new directory ${YP_DIR}/${DOMAIN}." 1>&2
21031110Swpaul		exit 1
21131110Swpaul	fi
21231110Swpaulfi
21331110Swpaul
21431110Swpaulif [ "${SERVERTYPE}" = "MASTER" ];
21531110Swpaulthen
21631110Swpaul
21731110Swpaul	if [ ! -f ${YP_DIR}/Makefile ]
21831110Swpaul	then
21931110Swpaul		if [ ! -f ${YP_DIR}/Makefile.dist ]
22031110Swpaul		then
22131110Swpaul			echo "Can't find ${YP_DIR}/Makefile.dist. " 1>&2
22231110Swpaul			exit 1
22331110Swpaul		fi
22431110Swpaul		cp ${YP_DIR}/Makefile.dist ${YP_DIR}/Makefile
22531110Swpaul	fi
22631110Swpaul
22731110Swpaulfi
22831110Swpaul
22931110Swpaulif [ "${SERVERTYPE}" = "SLAVE" ];
23031110Swpaulthen
23131110Swpaul
23231110Swpaul	echo "There will be no further questions. The remainder of the procedure"
23331110Swpaul	echo "should take a few minutes, to copy the databases from ${MASTER}."
23431110Swpaul
23531110Swpaul	for MAP in ${YPMAPLIST}
23631110Swpaul	do
23731110Swpaul		echo "Transfering ${MAP}..."
23831110Swpaul		if ! ${YPXFR} -p ${YP_DIR} -h ${MASTER} -c -d ${DOMAIN} ${MAP}; then
23931110Swpaul			echo "Can't transfer map ${MAP}." 1>&2
24031110Swpaul			ERROR_EXISTS="YES"
24131110Swpaul			if [ "${ERROR_EXIT}" = "YES" ]; then
24231110Swpaul				exit 1
24331110Swpaul			fi
24431110Swpaul		fi
24531110Swpaul	done
24631110Swpaul
24731110Swpaul	echo ""
24831110Swpaul	if [ "${ERROR_EXISTS}" = "YES"  ]; then
24931110Swpaul		echo "${HOST} has been setup as an YP slave server with errors. " 1>&2
25031110Swpaul		echo "Please remember fix any problem that occurred." 1>&2
25131110Swpaul	else
25231110Swpaul		echo "${HOST} has been setup as an YP slave server without any errors. "
25331110Swpaul	fi
25431110Swpaul
25531110Swpaul	echo "Don't forget to update map ypservers on ${MASTER}."
25631110Swpaul	exit 0
25731110Swpaulfi
25831110Swpaul
25931110SwpaulLIST_OK="NO"
26031110Swpaul
26131110Swpaulwhile [ "${LIST_OK}" = "NO" ];
26231110Swpauldo
26331110Swpaul	if [ "${SERVERTYPE}" = "MASTER" ];
26431110Swpaul	then
26531110Swpaul		HOST_LIST="${HOST}"
26631110Swpaul		echo ""
26731110Swpaul		echo "At this point, we have to construct a list of this domains YP servers."
26831110Swpaul		echo "${HOST} is already known as master server."
26931110Swpaul		echo "Please continue to add any slave servers, one per line. When you are"
27031110Swpaul		echo "done with the list, type a <control D>."
27131110Swpaul		echo "	master server   :  ${HOST}"
27231110Swpaul	fi
27331110Swpaul
27431110Swpaul	if [ "${SERVERTYPE}" = "UPDATE" ];
27531110Swpaul	then
27631110Swpaul		HOST_LIST="${HOST}"
27731110Swpaul		NEW_LIST=""
27831110Swpaul		MASTER_NAME=""
27931110Swpaul		SHORT_HOST=`echo ${HOST} | cut -d. -f1`
28031110Swpaul		if [ -f ${YP_DIR}/${DOMAIN}/ypservers ];
28131110Swpaul		then
28231110Swpaul			for srv in `${MAKEDBM} -u ${YP_DIR}/${DOMAIN}/ypservers | grep -v "^YP" | tr "\t" " " | cut -d\  -f1`;
28331110Swpaul			do
28431110Swpaul				short_srv=`echo ${srv} | cut -d. -f1`
28531110Swpaul				if [ "${SHORT_HOST}" != "${short_srv}" ]
28631110Swpaul				then
28731110Swpaul					if [ "${NEW_LIST}" = "" ];
28831110Swpaul					then
28931110Swpaul						NEW_LIST="${srv}"
29031110Swpaul					else
29131110Swpaul						NEW_LIST="${NEW_LIST} ${srv}"
29231110Swpaul					fi
29331110Swpaul				fi
29431110Swpaul			done;
29531110Swpaul			MASTER_NAME=`${MAKEDBM} -u ${YP_DIR}/${DOMAIN}/ypservers | grep "^YP_MASTER_NAME" | tr "\t" " " | cut -d\  -f2`
29631110Swpaul		fi
29731110Swpaul		echo ""
29831110Swpaul		echo "Update the list of hosts running YP servers in domain ${DOMAIN}."
29931110Swpaul		echo "Master for this domain is ${MASTER_NAME}."
30031110Swpaul		echo ""
301201051Smarck		echo "First verify old servers, type \\\\ to remove a server."
302108470Sschweikh		echo "Then add new servers, one per line. When done type a <control D>."
30331110Swpaul		echo ""
30431110Swpaul		echo "	master server   :  ${HOST}"
30531110Swpaul		if [ "${NEW_LIST}" != "" ]; then
30631110Swpaul			for node in $NEW_LIST; do
30731110Swpaul				echo -n "	verify host     : [${node}] "
30831110Swpaul				read verify
30931110Swpaul				if [ "${verify}" != "\\" ]; then
31031110Swpaul					HOST_LIST="${HOST_LIST} ${node}"
31131110Swpaul				fi
31231110Swpaul			done;
31331110Swpaul		fi
31431110Swpaul	fi
31531110Swpaul
31631110Swpaul	echo -n "	next host to add:  "
31731110Swpaul
31831110Swpaul	while read h
31931110Swpaul	do
32031110Swpaul		echo -n "	next host to add:  "
32131110Swpaul		HOST_LIST="${HOST_LIST} ${h}"
32231110Swpaul	done
32331110Swpaul
32431110Swpaul	echo ""
32531110Swpaul	echo "The current list of NIS servers looks like this:"
32631110Swpaul	echo ""
32731110Swpaul
32831110Swpaul	for h in `echo ${HOST_LIST}`;
32931110Swpaul	do
33031110Swpaul		echo ${h}
33131110Swpaul	done
33231110Swpaul
33331110Swpaul	echo ""
33431110Swpaul	echo -n "Is this correct?  [y/n: y]  "
33531110Swpaul	read hlist_ok
33631110Swpaul
33731110Swpaul	case $hlist_ok in
33831110Swpaul	n*)	echo "Let's try the whole thing again...";;
33931110Swpaul	N*)	echo "Let's try the whole thing again...";;
34031110Swpaul	*)	LIST_OK="YES";;
34131110Swpaul	esac
34231110Swpaul
34331110Swpauldone
34431110Swpaul
34531110Swpaulecho "Building ${YP_DIR}/${DOMAIN}/ypservers..."
34631110Swpaulrm -f ${YP_DIR}/ypservers
34731110Swpaultouch -f ${YP_DIR}/ypservers
34831110Swpaulrm -f ${YP_DIR}/${DOMAIN}/ypservers
34931110Swpaulfor host in ${HOST_LIST};
35031110Swpauldo
35131110Swpaul	echo "${host} ${host}" >> ${YP_DIR}/ypservers
35231110Swpaul	echo "${host} ${host}"
35331110Swpauldone | ${MAKEDBM} - ${YP_DIR}/${DOMAIN}/ypservers
35431110Swpaul
35531110Swpaulif [ $? -ne 0 ]; then
35631110Swpaul	echo "" 1>&2
35731110Swpaul	echo "Couldn't build yp data base ${YP_DIR}/${DOMAIN}/ypservers." 1>&2
35831110Swpaul	ERROR_EXISTS="YES"
359108470Sschweikh	if [ "${ERROR_EXIT}" = "YES" ]; then
36031110Swpaul		exit 1
36131110Swpaul	fi
36231110Swpaulfi
36331110Swpaul
36431110Swpaulif [ "${SERVERTYPE}" = "MASTER" ]; then
36531110Swpaul	CUR_PWD=`pwd`
36631110Swpaul	cd ${YP_DIR}
36731110Swpaul	echo "Running ${YP_DIR}/Makefile..."
36831110Swpaul	if ! make NOPUSH=True UPDATE_DOMAIN=${DOMAIN} YP_DIR=${YP_DIR}; then
36931110Swpaul		echo "" 1>&2
37031110Swpaul		echo "Error running Makefile." 1>&2
37131110Swpaul		ERROR_EXISTS="YES"
372108470Sschweikh		if [ "${ERROR_EXIT}" = "YES" ]; then
37331110Swpaul			exit 1
37431110Swpaul		fi
37531110Swpaul	fi
37631110Swpaul
37731110Swpaul	cd ${CUR_PWD}
37831110Swpaul
37931110Swpaul	echo ""
38031110Swpaul	if [ "${ERROR_EXISTS}" = "YES" ]; then
38131110Swpaul		echo "${HOST} has been setup as an YP master server with errors. " 1>&2
38231110Swpaul		echo "Please remember fix any problem that occurred." 1>&2
38331110Swpaul	else
38431110Swpaul		echo "${HOST} has been setup as an YP master server without any errors. "
38531110Swpaul	fi
38631110Swpaulfi
387