xref: /dragonfly/usr.sbin/ypserv/ypinit.sh (revision b7367ef6)
1#!/bin/sh
2# $FreeBSD: src/usr.sbin/ypserv/ypinit.sh,v 1.3 1999/08/28 01:21:15 peter Exp $
3# $DragonFly: src/usr.sbin/ypserv/ypinit.sh,v 1.3 2007/05/13 22:25:42 swildner Exp $
4#
5# ypinit.sh - setup an master or slave server.
6# (Taken from OpenBSD and modified for FreeBSD.)
7#
8DOMAINNAME=/bin/domainname
9HOSTNAME=/bin/hostname
10YPWHICH=/usr/bin/ypwhich
11YPXFR=/usr/libexec/ypxfr
12YP_DIR=/var/yp
13MAKEDBM=/usr/sbin/yp_mkdb
14MAPLIST="master.passwd.byname master.passwd.byuid passwd.byname passwd.byuid \
15	 group.byname group.bygid hosts.byname hosts.byaddr services.byname \
16	 rpc.byname rpc.bynumber networks.byname networks.byaddr netgroup \
17	 netgroup.byuser netgroup.byhost netid.byname publickey.byname \
18	 bootparams ethers.byname ethers.byaddr amd.host mail.aliases \
19	 ypservers protocols.byname protocols.bynumber netmasks.byaddr"
20
21ERROR_EXISTS="NO"
22umask 077
23
24#set -xv
25
26ERROR=USAGE				# assume usage error
27
28if [ $# -eq 1 ]
29then
30	if [ $1 = "-m" ]		# ypinit -m
31	then
32		DOMAIN=`${DOMAINNAME}`
33		SERVERTYPE=MASTER
34		ERROR=
35	fi
36
37	if [ $1 = "-u" ]		# ypinit -u
38	then
39		DOMAIN=`${DOMAINNAME}`
40		SERVERTYPE=UPDATE
41		ERROR=
42	fi
43fi
44
45if [ $# -eq 2 ]
46then
47	if [ $1 = "-m" ]		# ypinit -m domainname
48	then
49		DOMAIN=${2}
50		SERVERTYPE=MASTER
51		ERROR=
52	fi
53
54	if [ $1 = "-s" ]		# ypinit -s master_server
55	then
56		DOMAIN=`${DOMAINNAME}`
57		SERVERTYPE=SLAVE
58		MASTER=${2}
59		ERROR=
60	fi
61
62	if [ $1 = "-u" ]		# ypinit -u domainname
63	then
64		DOMAIN=${2}
65		SERVERTYPE=UPDATE
66		ERROR=
67	fi
68fi
69
70if [ $# -eq 3 ]
71then
72	if [ $1 = "-s" ]		# ypinit -s master_server domainname
73	then
74		DOMAIN=${3}
75		SERVERTYPE=SLAVE
76		MASTER=${2}
77		ERROR=
78	fi
79fi
80
81if [ "${ERROR}" = "USAGE" ]; then
82	cat << \__usage 1>&2
83usage: ypinit -m [domainname]
84       ypinit -s master_server [domainname]
85       ypinit -u [domainname]
86
87The `-m' flag builds a master YP server, and the `-s' flag builds
88a slave YP server.  When building a slave YP server, `master_server'
89must be an existing, reachable YP server.
90The `-u' is for updating the ypservers map on a master server.
91__usage
92
93	exit 1
94fi
95
96# Check if domainname is set, don't accept an empty domainname
97if [ -z "${DOMAIN}" ]; then
98	cat << \__no_domain 1>&2
99The local host's YP domain name has not been set.  Please set it with
100the domainname(1) command or pass the domain as an argument to ypinit(8).
101__no_domain
102
103	exit 1
104fi
105
106# Check if hostname is set, don't accept an empty hostname
107HOST=`${HOSTNAME}`
108if [ -z "${HOST}" ]; then
109	cat << \__no_hostname 1>&2
110The local host's hostname has not been set.  Please set it with the
111hostname(1) command.
112__no_hostname
113
114	exit 1
115fi
116
117# Check if we have contact with master.
118# If we can't list the maps on the master, then we fake it with a
119# hard-coded list of maps. The FreeBSD ypxfr command will work even
120# if ypbind isn't running or if we are bound to ourselves instead of
121# the master (the slave should be bound to itself, but since it has
122# no maps yet, we can't get a maplist from it).
123if [ "${SERVERTYPE}" = "SLAVE" ];
124then
125	COUNT=`${YPWHICH} -d ${DOMAIN} -m 2>/dev/null | grep -i ${MASTER} | wc -l | tr -d " "`
126	if [ "$COUNT" = "0" ]
127	then
128		echo "Can't enumerate maps from ${MASTER}. Please check that it is running." 1>&2
129		echo "Note: using hardcoded maplist for map transfers." 1>&2
130		YPMAPLIST=${MAPLIST}
131	else
132		YPMAPLIST=`${YPWHICH} -d ${DOMAIN} -m | cut -d\  -f1`
133	fi
134	echo "" 1>&2
135fi
136
137# Check if user is root
138ID=`id -u`
139if [ "${ID}" != "0" ]; then
140	echo "You have to be the superuser to run this.  Please login as root." 1>&2
141	exit 1
142fi
143
144# Check if the YP directory exists.
145
146if [ ! -d ${YP_DIR} -o -f ${YP_DIR} ]
147then
148	echo "The directory ${YP_DIR} doesn't exist.  Restore it from the distribution." 1>&2
149	exit 1
150
151fi
152
153echo -n "Server Type: ${SERVERTYPE} Domain: ${DOMAIN}"
154if [ "${SERVERTYPE}" = "SLAVE" ]; then
155	echo -n " Master: ${MASTER}"
156fi
157echo ""
158
159if [ "${SERVERTYPE}" != "UPDATE" ];
160then
161	cat << \__notice1
162
163Creating an YP server will require that you answer a few questions.
164Questions will all be asked at the beginning of the procedure.
165
166__notice1
167
168	echo -n "Do you want this procedure to quit on non-fatal errors? [y/n: n]  "
169	read DOEXIT
170
171	case ${DOEXIT} in
172	y*|Y*)
173		ERROR_EXIT="YES"
174		;;
175
176	*)	ERROR_EXIT="NO"
177		echo ""
178		echo "Ok, please remember to go back and redo manually whatever fails."
179		echo "If you don't, something might not work. "
180		;;
181	esac
182
183	if [ -d "${YP_DIR}/${DOMAIN}" ]; then
184		echo ""
185		echo -n "Can we destroy the existing ${YP_DIR}/${DOMAIN} and its contents? [y/n: n]  "
186		read KILL
187
188		ERROR=
189		case ${KILL} in
190		y*|Y*)
191			ERROR="DELETE"
192			;;
193
194		*)	ERROR=
195			;;
196		esac
197
198		if [ "${ERROR}" = "DELETE" ]; then
199			if ! rm -rf ${YP_DIR}/${DOMAIN}; then
200				echo "Can't clean up old directory ${YP_DIR}/${DOMAIN}." 1>&2
201				exit 1
202			fi
203		else
204			echo "OK, please clean it up by hand and start again.  Bye"
205			exit 0
206		fi
207
208	fi
209
210	if ! mkdir "${YP_DIR}/${DOMAIN}"; then
211		echo "Can't make new directory ${YP_DIR}/${DOMAIN}." 1>&2
212		exit 1
213	fi
214fi
215
216if [ "${SERVERTYPE}" = "MASTER" ];
217then
218
219	if [ ! -f ${YP_DIR}/Makefile ]
220	then
221		if [ ! -f ${YP_DIR}/Makefile.dist ]
222		then
223			echo "Can't find ${YP_DIR}/Makefile.dist. " 1>&2
224			exit 1
225		fi
226		cp ${YP_DIR}/Makefile.dist ${YP_DIR}/Makefile
227	fi
228
229fi
230
231if [ "${SERVERTYPE}" = "SLAVE" ];
232then
233
234	echo "There will be no further questions. The remainder of the procedure"
235	echo "should take a few minutes, to copy the databases from ${MASTER}."
236
237	for MAP in ${YPMAPLIST}
238	do
239		echo "Transferring ${MAP}..."
240		if ! ${YPXFR} -p ${YP_DIR} -h ${MASTER} -c -d ${DOMAIN} ${MAP}; then
241			echo "Can't transfer map ${MAP}." 1>&2
242			ERROR_EXISTS="YES"
243			if [ "${ERROR_EXIT}" = "YES" ]; then
244				exit 1
245			fi
246		fi
247	done
248
249	echo ""
250	if [ "${ERROR_EXISTS}" = "YES"  ]; then
251		echo "${HOST} has been setup as an YP slave server with errors. " 1>&2
252		echo "Please remember fix any problem that occurred." 1>&2
253	else
254		echo "${HOST} has been setup as an YP slave server without any errors. "
255	fi
256
257	echo "Don't forget to update map ypservers on ${MASTER}."
258	exit 0
259fi
260
261LIST_OK="NO"
262
263while [ "${LIST_OK}" = "NO" ];
264do
265
266	if [ "${SERVERTYPE}" = "MASTER" ];
267	then
268		HOST_LIST="${HOST}"
269		echo ""
270		echo "At this point, we have to construct a list of this domains YP servers."
271		echo "${HOST} is already known as master server."
272		echo "Please continue to add any slave servers, one per line. When you are"
273		echo "done with the list, type a <control D>."
274		echo "	master server   :  ${HOST}"
275	fi
276
277	if [ "${SERVERTYPE}" = "UPDATE" ];
278	then
279		HOST_LIST="${HOST}"
280		NEW_LIST=""
281		MASTER_NAME=""
282		SHORT_HOST=`echo ${HOST} | cut -d. -f1`
283		if [ -f ${YP_DIR}/${DOMAIN}/ypservers ];
284		then
285			for srv in `${MAKEDBM} -u ${YP_DIR}/${DOMAIN}/ypservers | grep -v "^YP" | tr "\t" " " | cut -d\  -f1`;
286			do
287				short_srv=`echo ${srv} | cut -d. -f1`
288				if [ "${SHORT_HOST}" != "${short_srv}" ]
289				then
290					if [ "${NEW_LIST}" = "" ];
291					then
292						NEW_LIST="${srv}"
293					else
294						NEW_LIST="${NEW_LIST} ${srv}"
295					fi
296				fi
297			done;
298			MASTER_NAME=`${MAKEDBM} -u ${YP_DIR}/${DOMAIN}/ypservers | grep "^YP_MASTER_NAME" | tr "\t" " " | cut -d\  -f2`
299		fi
300		echo ""
301		echo "Update the list of hosts running YP servers in domain ${DOMAIN}."
302		echo "Master for this domain is ${MASTER_NAME}."
303		echo ""
304		echo "First verify old servers, type \\ to remove a server."
305		echo "Then add new servers, one per line. When done type a <control D>."
306		echo ""
307		echo "	master server   :  ${HOST}"
308		if [ "${NEW_LIST}" != "" ]; then
309			for node in $NEW_LIST; do
310				echo -n "	verify host     : [${node}] "
311				read verify
312				if [ "${verify}" != "\\" ]; then
313					HOST_LIST="${HOST_LIST} ${node}"
314				fi
315			done;
316		fi
317	fi
318
319	echo -n "	next host to add:  "
320
321	while read h
322	do
323		echo -n "	next host to add:  "
324		HOST_LIST="${HOST_LIST} ${h}"
325	done
326
327	echo ""
328	echo "The current list of NIS servers looks like this:"
329	echo ""
330
331	for h in `echo ${HOST_LIST}`;
332	do
333		echo ${h}
334	done
335
336	echo ""
337	echo -n "Is this correct?  [y/n: y]  "
338	read hlist_ok
339
340	case $hlist_ok in
341	n*)	echo "Let's try the whole thing again...";;
342	N*)	echo "Let's try the whole thing again...";;
343	*)	LIST_OK="YES";;
344	esac
345
346done
347
348echo "Building ${YP_DIR}/${DOMAIN}/ypservers..."
349rm -f ${YP_DIR}/ypservers
350touch -f ${YP_DIR}/ypservers
351rm -f ${YP_DIR}/${DOMAIN}/ypservers
352for host in ${HOST_LIST};
353do
354	echo "${host} ${host}" >> ${YP_DIR}/ypservers
355	echo "${host} ${host}"
356done | ${MAKEDBM} - ${YP_DIR}/${DOMAIN}/ypservers
357
358if [ $? -ne 0 ]; then
359	echo "" 1>&2
360	echo "Couldn't build yp data base ${YP_DIR}/${DOMAIN}/ypservers." 1>&2
361	ERROR_EXISTS="YES"
362	if [ "${ERROR_EXIT}" = "YES" ]; then
363		exit 1
364	fi
365fi
366
367if [ "${SERVERTYPE}" = "MASTER" ]; then
368
369	CUR_PWD=`pwd`
370	cd ${YP_DIR}
371	echo "Running ${YP_DIR}/Makefile..."
372	if ! make NOPUSH=True UPDATE_DOMAIN=${DOMAIN} YP_DIR=${YP_DIR}; then
373		echo "" 1>&2
374		echo "Error running Makefile." 1>&2
375		ERROR_EXISTS="YES"
376		if [ "${ERROR_EXIT}" = "YES" ]; then
377			exit 1
378		fi
379	fi
380
381	cd ${CUR_PWD}
382
383	echo ""
384	if [ "${ERROR_EXISTS}" = "YES" ]; then
385		echo "${HOST} has been setup as an YP master server with errors. " 1>&2
386		echo "Please remember fix any problem that occurred." 1>&2
387	else
388		echo "${HOST} has been setup as an YP master server without any errors. "
389	fi
390
391fi
392