xref: /netbsd-src/usr.sbin/ypserv/ypinit/ypinit.sh (revision c41a4eebefede43f6950f838a387dc18c6a431bf)
1#!/bin/sh
2#
3#	$NetBSD: ypinit.sh,v 1.7 1997/11/18 00:44:19 lukem Exp $
4#
5# ypinit.sh - setup a master or slave YP server
6#
7# Originally written by Mats O Jansson <moj@stacken.kth.se>
8# Modified by Jason R. Thorpe <thorpej@NetBSD.ORG>
9# Reworked by Luke Mewburn <lukem@netbsd.org>
10#
11
12PATH=/bin:/usr/sbin:/usr/bin:${PATH}
13DOMAINNAME=/bin/domainname
14HOSTNAME=/bin/hostname
15ID=/usr/bin/id
16MAKEDBM=/usr/sbin/makedbm
17YPWHICH=/usr/bin/ypwhich
18YPXFR=/usr/sbin/ypxfr
19
20progname=`basename $0`
21yp_dir=/var/yp
22error=usage				# assume usage error
23
24umask 077				# protect created directories
25
26if [ `${ID} -u` != 0 ]; then
27	echo 1>&2 "$progname: you must be root to run this"
28	exit 1
29fi
30
31case $# in
321)
33	if [ $1 = "-m" ]; then		# ypinit -m
34		domain=`${DOMAINNAME}`
35		servertype=master
36		error=
37	fi
38	;;
39
402)
41	if [ $1 = "-m" ]; then		# ypinit -m domainname
42		domain=${2}
43		servertype=master
44		error=
45	fi
46	if [ $1 = "-s" ]; then		# ypinit -s master_server
47		domain=`${DOMAINNAME}`
48		servertype=slave
49		master=${2}
50		error=
51	fi
52	;;
53
543)
55	if [ $1 = "-s" ]; then		# ypinit -s master_server domainname
56		domain=${3}
57		servertype=slave
58		master=${2}
59		error=
60	fi
61	;;
62esac
63
64if [ "${error}" = "usage" ]; then
65	cat 1>&2 << __usage 
66usage: ${progname} -m [domainname]
67       ${progname} -s master_server [domainname]
68
69The \`-m' flag builds a master YP server, and the \`-s' flag builds
70a slave YP server.  When building a slave YP server, \`master_server'
71must be an existing, reachable YP server.
72__usage
73
74	exit 1
75fi
76
77# Check if domainname is set, don't accept an empty domainname
78if [ -z "${domain}" ]; then
79	cat << __no_domain 1>&2
80$progname: The local host's YP domain name has not been set.
81	Please set it with the domainname(1) command or pass the domain as
82	an argument to ${progname}.
83__no_domain
84
85	exit 1
86fi
87
88# Check if hostname is set, don't accept an empty hostname
89host=`${HOSTNAME}`
90if [ -z "${host}" ]; then
91	cat 1>&2 << __no_hostname
92$progname: The local host's hostname has not been set.
93	Please set it with the hostname(1) command.
94__no_hostname
95
96	exit 1
97fi
98
99# Check if the YP directory exists.
100if [ ! -d ${yp_dir} -o -f ${yp_dir} ]; then
101	cat 1>&2 << __no_dir
102$progname: The directory ${yp_dir} does not exist.
103	Restore it from the distribution.
104__no_dir
105
106	exit 1
107fi
108
109echo "Server type: ${servertype}"
110echo "Domain:      ${domain}"
111if [ "${servertype}" != "master" ]; then
112	echo "Master:      ${master}"
113fi
114echo ""
115cat << __notice1
116
117Installing the YP database may require that you answer a few questions.
118Any configuration questions will be asked at the beginning of the procedure.
119
120__notice1
121
122if [ -d "${yp_dir}/${domain}" ]; then
123	echo	"Can we destroy the existing ${yp_dir}/${domain}"
124	echo -n	"and its contents? [y/n: n]  "
125	read KILL
126
127	error=
128	case ${KILL} in
129	y*|Y*)
130		error="delete"
131		;;
132
133	*)
134		error=
135		;;
136	esac
137
138	if [ "${error}" = "delete" ]; then
139		rm -rf ${yp_dir}/${domain}
140		if [ $? != 0 ]; then
141			echo 1>&2 \
142		"$progname: Can't clean up old directory ${yp_dir}/${domain}"
143			exit 1
144		fi
145	else
146		echo "OK, please clean it up by hand and start again."
147		exit 0
148	fi
149fi
150
151if ! mkdir "${yp_dir}/${domain}"; then
152	echo 1>&2 "$progname: Can't make new directory ${yp_dir}/${domain}"
153	exit 1
154fi
155
156case ${servertype} in
157master)
158	if [ ! -f ${yp_dir}/Makefile ];	then
159		if [ ! -f ${yp_dir}/Makefile.main ]; then
160			echo 1>&2 \
161			    "$progname: Can't find ${yp_dir}/Makefile.main"
162			exit 1
163		fi
164		cp ${yp_dir}/Makefile.main ${yp_dir}/Makefile
165	fi
166
167	subdir=`grep "^SUBDIR=" ${yp_dir}/Makefile`
168
169	if [ -z "${subdir}" ]; then
170		echo 1>&2 \
171    "$progname: Can't find line starting with 'SUBDIR=' in ${yp_dir}/Makefile"
172		exit 1
173	fi
174
175	newsubdir="SUBDIR="
176	for dir in `echo ${subdir} | cut -c8-255`; do
177		if [ "${dir}" != "${domain}" ]; then
178			newsubdir="${newsubdir} ${dir}"
179		fi
180	done
181	newsubdir="${newsubdir} ${domain}"
182
183	if [ -f ${yp_dir}/Makefile.tmp ]; then
184		rm ${yp_dir}/Makefile.tmp
185	fi
186
187	mv ${yp_dir}/Makefile ${yp_dir}/Makefile.tmp
188	sed -e "s/^${subdir}/${newsubdir}/" ${yp_dir}/Makefile.tmp > \
189	    ${yp_dir}/Makefile
190	rm ${yp_dir}/Makefile.tmp
191
192	if [ ! -f ${yp_dir}/Makefile.yp ]; then
193		echo 1>&2 "$progname: Can't find ${yp_dir}/Makefile.yp"
194		exit 1
195	fi
196
197	cp ${yp_dir}/Makefile.yp ${yp_dir}/${domain}/Makefile
198
199	# Create `ypservers' with own name, so that yppush won't
200	# lose when we run "make".
201	(
202		cd ${yp_dir}/${domain}
203		echo "$host $host" > ypservers
204		${MAKEDBM} ypservers ypservers
205	)
206
207	echo "Done.  Be sure to run \`make' in ${yp_dir}."
208
209	;;
210
211slave)
212	echo ""
213
214	maps=`${YPWHICH} -d ${domain} -h ${master} -f -m 2>/dev/null | \
215	    awk '{ if (substr($2, 1, length("'$master'")) == "'$master'") \
216		print $1; }'`
217
218	if [ -z "${maps}" ]; then
219		cat 1>&2 << __no_maps
220$progname: Can't find any maps for ${domain} on ${master}
221	Please check that the appropriate YP service is running.
222__no_maps
223		exit 1
224	fi
225
226	for map in ${maps}; do
227		echo "Transferring ${map}..."
228		if ! ${YPXFR} -h ${master} -c -d ${domain} ${map}; then
229			echo 1>&2 "$progname: Can't transfer map ${map}"
230			exit 1
231		fi
232	done
233
234	cat << __dont_forget
235
236Don't forget to update the \`ypservers' on ${master},
237by adding an entry similar to:
238  ${host} ${host}
239
240__dont_forget
241	exit 0
242
243	;;
244
245*)
246	echo 1>&2 "$progname: unknown servertype \`${servertype}'"
247	exit 1
248esac
249