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