ypinit.sh revision 1.9 1 1.1 thorpej #!/bin/sh
2 1.1 thorpej #
3 1.9 lukem # $NetBSD: ypinit.sh,v 1.9 2001/06/18 11:21:54 lukem Exp $
4 1.1 thorpej #
5 1.1 thorpej # ypinit.sh - setup a master or slave YP server
6 1.1 thorpej #
7 1.1 thorpej # Originally written by Mats O Jansson <moj (at] stacken.kth.se>
8 1.1 thorpej # Modified by Jason R. Thorpe <thorpej (at] NetBSD.ORG>
9 1.7 lukem # Reworked by Luke Mewburn <lukem (at] netbsd.org>
10 1.1 thorpej #
11 1.1 thorpej
12 1.7 lukem PATH=/bin:/usr/sbin:/usr/bin:${PATH}
13 1.6 lukem DOMAINNAME=/bin/domainname
14 1.6 lukem HOSTNAME=/bin/hostname
15 1.7 lukem ID=/usr/bin/id
16 1.8 lukem INSTALL=/usr/bin/install
17 1.7 lukem MAKEDBM=/usr/sbin/makedbm
18 1.6 lukem YPWHICH=/usr/bin/ypwhich
19 1.6 lukem YPXFR=/usr/sbin/ypxfr
20 1.1 thorpej
21 1.7 lukem progname=`basename $0`
22 1.7 lukem yp_dir=/var/yp
23 1.9 lukem tmpfile=`mktemp /tmp/ypservers.XXXXXX` || exit 1
24 1.9 lukem trap "rm -f ${tmpfile} ; exit 0" EXIT INT QUIT
25 1.1 thorpej
26 1.4 lukem umask 077 # protect created directories
27 1.4 lukem
28 1.7 lukem if [ `${ID} -u` != 0 ]; then
29 1.7 lukem echo 1>&2 "$progname: you must be root to run this"
30 1.7 lukem exit 1
31 1.7 lukem fi
32 1.7 lukem
33 1.8 lukem args=`getopt cms: $*`
34 1.8 lukem if [ $? -eq 0 ]; then
35 1.8 lukem set -- $args
36 1.8 lukem for i; do
37 1.8 lukem case $i in
38 1.8 lukem "-c")
39 1.8 lukem servertype=client
40 1.8 lukem shift
41 1.8 lukem ;;
42 1.8 lukem "-m")
43 1.8 lukem servertype=master
44 1.8 lukem shift
45 1.8 lukem ;;
46 1.8 lukem "-s")
47 1.8 lukem servertype=slave
48 1.8 lukem master=${2}
49 1.8 lukem shift
50 1.8 lukem shift
51 1.8 lukem ;;
52 1.8 lukem "--")
53 1.8 lukem shift
54 1.8 lukem break
55 1.8 lukem ;;
56 1.8 lukem esac
57 1.8 lukem done
58 1.8 lukem
59 1.8 lukem if [ $# -eq 1 ]; then
60 1.8 lukem domain=${1}
61 1.8 lukem shift;
62 1.8 lukem else
63 1.7 lukem domain=`${DOMAINNAME}`
64 1.1 thorpej fi
65 1.8 lukem fi
66 1.1 thorpej
67 1.8 lukem if [ -z ${servertype} ]; then
68 1.7 lukem cat 1>&2 << __usage
69 1.8 lukem usage: ${progname} -c [domainname]
70 1.8 lukem ${progname} -m [domainname]
71 1.8 lukem ${progname} -s master_server [domainname]
72 1.8 lukem
73 1.8 lukem The \`-c' flag sets up a YP client, the \`-m' flag builds a master YP
74 1.8 lukem server, and the \`-s' flag builds a slave YP server. When building a
75 1.8 lukem slave YP server, \`master_server' must be an existing, reachable YP server.
76 1.1 thorpej __usage
77 1.1 thorpej exit 1
78 1.1 thorpej fi
79 1.1 thorpej
80 1.1 thorpej # Check if domainname is set, don't accept an empty domainname
81 1.7 lukem if [ -z "${domain}" ]; then
82 1.7 lukem cat << __no_domain 1>&2
83 1.7 lukem $progname: The local host's YP domain name has not been set.
84 1.7 lukem Please set it with the domainname(1) command or pass the domain as
85 1.7 lukem an argument to ${progname}.
86 1.1 thorpej __no_domain
87 1.1 thorpej
88 1.1 thorpej exit 1
89 1.1 thorpej fi
90 1.1 thorpej
91 1.1 thorpej # Check if hostname is set, don't accept an empty hostname
92 1.7 lukem host=`${HOSTNAME}`
93 1.7 lukem if [ -z "${host}" ]; then
94 1.7 lukem cat 1>&2 << __no_hostname
95 1.7 lukem $progname: The local host's hostname has not been set.
96 1.7 lukem Please set it with the hostname(1) command.
97 1.1 thorpej __no_hostname
98 1.1 thorpej
99 1.1 thorpej exit 1
100 1.1 thorpej fi
101 1.8 lukem if [ "${servertype}" = "slave" -a "${host}" = "${master}" ]; then
102 1.8 lukem echo 1>&2 \
103 1.8 lukem "$progname: cannot setup a YP slave server off the local host."
104 1.8 lukem exit 1
105 1.8 lukem fi
106 1.1 thorpej
107 1.1 thorpej # Check if the YP directory exists.
108 1.7 lukem if [ ! -d ${yp_dir} -o -f ${yp_dir} ]; then
109 1.7 lukem cat 1>&2 << __no_dir
110 1.7 lukem $progname: The directory ${yp_dir} does not exist.
111 1.7 lukem Restore it from the distribution.
112 1.7 lukem __no_dir
113 1.7 lukem
114 1.1 thorpej exit 1
115 1.1 thorpej fi
116 1.1 thorpej
117 1.7 lukem echo "Server type: ${servertype}"
118 1.7 lukem echo "Domain: ${domain}"
119 1.8 lukem if [ "${servertype}" = "slave" ]; then
120 1.7 lukem echo "Master: ${master}"
121 1.2 thorpej fi
122 1.2 thorpej echo ""
123 1.8 lukem
124 1.8 lukem binding_dir=${yp_dir}/binding
125 1.8 lukem if [ ! -d ${binding_dir} ]; then
126 1.8 lukem $progname: The directory ${binding_dir} does not exist.
127 1.8 lukem Restore it from the distribution.
128 1.8 lukem __no_dir
129 1.8 lukem exit 1
130 1.8 lukem fi
131 1.8 lukem
132 1.8 lukem cat << __client_setup
133 1.8 lukem A YP client needs a list of YP servers to bind to.
134 1.8 lukem Whilst ypbind supports -broadcast, its use is not recommended.
135 1.8 lukem __client_setup
136 1.8 lukem
137 1.8 lukem done=
138 1.8 lukem while [ -z "${done}" ]; do
139 1.9 lukem > ${tmpfile}
140 1.8 lukem cat <<__list_of_servers
141 1.8 lukem
142 1.8 lukem Please enter a list of YP servers, in order of preference.
143 1.8 lukem When finished, press RETURN on a blank line or enter EOF.
144 1.8 lukem
145 1.8 lukem __list_of_servers
146 1.8 lukem
147 1.8 lukem if [ "${servertype}" != "client" ]; then
148 1.8 lukem echo ${host} >> ${tmpfile}
149 1.8 lukem echo " next host: ${host}";
150 1.8 lukem fi
151 1.8 lukem echo -n " next host: ";
152 1.8 lukem
153 1.8 lukem while read nextserver ; test -n "${nextserver}"
154 1.8 lukem do
155 1.8 lukem echo ${nextserver} >> ${tmpfile}
156 1.8 lukem echo -n " next host: ";
157 1.8 lukem done
158 1.8 lukem
159 1.8 lukem if [ -s ${tmpfile} ]; then
160 1.8 lukem echo ""
161 1.8 lukem echo "The current servers are:"
162 1.8 lukem echo ""
163 1.8 lukem cat ${tmpfile}
164 1.8 lukem echo ""
165 1.8 lukem echo -n "Is this correct? [y/n: n] "
166 1.8 lukem read DONE
167 1.8 lukem case ${DONE} in
168 1.8 lukem y*|Y*)
169 1.8 lukem done=yes
170 1.8 lukem ;;
171 1.8 lukem esac
172 1.8 lukem else
173 1.8 lukem echo ""
174 1.8 lukem echo "You have not supplied any servers."
175 1.8 lukem fi
176 1.8 lukem if [ -z "${done}" ]; then
177 1.8 lukem echo -n "Do you wish to abort? [y/n: n] "
178 1.8 lukem read ABORT
179 1.8 lukem case ${ABORT} in
180 1.8 lukem y*|Y*)
181 1.8 lukem exit 0
182 1.8 lukem ;;
183 1.8 lukem esac
184 1.8 lukem fi
185 1.8 lukem done
186 1.8 lukem
187 1.8 lukem if [ -s ${tmpfile} ]; then
188 1.8 lukem ${INSTALL} -c -m 0444 ${tmpfile} ${binding_dir}/${domain}.ypservers
189 1.8 lukem fi
190 1.8 lukem
191 1.8 lukem if [ "${servertype}" = "client" ]; then
192 1.8 lukem exit 0
193 1.8 lukem fi
194 1.8 lukem
195 1.7 lukem cat << __notice1
196 1.1 thorpej
197 1.7 lukem Installing the YP database may require that you answer a few questions.
198 1.6 lukem Any configuration questions will be asked at the beginning of the procedure.
199 1.1 thorpej
200 1.1 thorpej __notice1
201 1.1 thorpej
202 1.7 lukem if [ -d "${yp_dir}/${domain}" ]; then
203 1.7 lukem echo "Can we destroy the existing ${yp_dir}/${domain}"
204 1.7 lukem echo -n "and its contents? [y/n: n] "
205 1.1 thorpej read KILL
206 1.1 thorpej
207 1.1 thorpej case ${KILL} in
208 1.2 thorpej y*|Y*)
209 1.7 lukem rm -rf ${yp_dir}/${domain}
210 1.7 lukem if [ $? != 0 ]; then
211 1.7 lukem echo 1>&2 \
212 1.7 lukem "$progname: Can't clean up old directory ${yp_dir}/${domain}"
213 1.1 thorpej exit 1
214 1.1 thorpej fi
215 1.8 lukem ;;
216 1.8 lukem
217 1.8 lukem *)
218 1.2 thorpej echo "OK, please clean it up by hand and start again."
219 1.2 thorpej exit 0
220 1.8 lukem ;;
221 1.8 lukem esac
222 1.1 thorpej fi
223 1.1 thorpej
224 1.7 lukem if ! mkdir "${yp_dir}/${domain}"; then
225 1.7 lukem echo 1>&2 "$progname: Can't make new directory ${yp_dir}/${domain}"
226 1.1 thorpej exit 1
227 1.1 thorpej fi
228 1.1 thorpej
229 1.7 lukem case ${servertype} in
230 1.7 lukem master)
231 1.7 lukem if [ ! -f ${yp_dir}/Makefile ]; then
232 1.7 lukem if [ ! -f ${yp_dir}/Makefile.main ]; then
233 1.7 lukem echo 1>&2 \
234 1.7 lukem "$progname: Can't find ${yp_dir}/Makefile.main"
235 1.1 thorpej exit 1
236 1.1 thorpej fi
237 1.7 lukem cp ${yp_dir}/Makefile.main ${yp_dir}/Makefile
238 1.1 thorpej fi
239 1.1 thorpej
240 1.7 lukem subdir=`grep "^SUBDIR=" ${yp_dir}/Makefile`
241 1.1 thorpej
242 1.7 lukem if [ -z "${subdir}" ]; then
243 1.7 lukem echo 1>&2 \
244 1.7 lukem "$progname: Can't find line starting with 'SUBDIR=' in ${yp_dir}/Makefile"
245 1.1 thorpej exit 1
246 1.1 thorpej fi
247 1.1 thorpej
248 1.7 lukem newsubdir="SUBDIR="
249 1.7 lukem for dir in `echo ${subdir} | cut -c8-255`; do
250 1.7 lukem if [ "${dir}" != "${domain}" ]; then
251 1.7 lukem newsubdir="${newsubdir} ${dir}"
252 1.1 thorpej fi
253 1.1 thorpej done
254 1.7 lukem newsubdir="${newsubdir} ${domain}"
255 1.1 thorpej
256 1.7 lukem if [ -f ${yp_dir}/Makefile.tmp ]; then
257 1.7 lukem rm ${yp_dir}/Makefile.tmp
258 1.1 thorpej fi
259 1.1 thorpej
260 1.7 lukem mv ${yp_dir}/Makefile ${yp_dir}/Makefile.tmp
261 1.7 lukem sed -e "s/^${subdir}/${newsubdir}/" ${yp_dir}/Makefile.tmp > \
262 1.7 lukem ${yp_dir}/Makefile
263 1.7 lukem rm ${yp_dir}/Makefile.tmp
264 1.1 thorpej
265 1.7 lukem if [ ! -f ${yp_dir}/Makefile.yp ]; then
266 1.7 lukem echo 1>&2 "$progname: Can't find ${yp_dir}/Makefile.yp"
267 1.1 thorpej exit 1
268 1.1 thorpej fi
269 1.1 thorpej
270 1.7 lukem cp ${yp_dir}/Makefile.yp ${yp_dir}/${domain}/Makefile
271 1.1 thorpej
272 1.7 lukem # Create `ypservers' with own name, so that yppush won't
273 1.1 thorpej # lose when we run "make".
274 1.1 thorpej (
275 1.7 lukem cd ${yp_dir}/${domain}
276 1.7 lukem echo "$host $host" > ypservers
277 1.6 lukem ${MAKEDBM} ypservers ypservers
278 1.1 thorpej )
279 1.2 thorpej
280 1.7 lukem echo "Done. Be sure to run \`make' in ${yp_dir}."
281 1.7 lukem
282 1.7 lukem ;;
283 1.1 thorpej
284 1.7 lukem slave)
285 1.1 thorpej echo ""
286 1.1 thorpej
287 1.7 lukem maps=`${YPWHICH} -d ${domain} -h ${master} -f -m 2>/dev/null | \
288 1.7 lukem awk '{ if (substr($2, 1, length("'$master'")) == "'$master'") \
289 1.7 lukem print $1; }'`
290 1.7 lukem
291 1.7 lukem if [ -z "${maps}" ]; then
292 1.7 lukem cat 1>&2 << __no_maps
293 1.7 lukem $progname: Can't find any maps for ${domain} on ${master}
294 1.7 lukem Please check that the appropriate YP service is running.
295 1.7 lukem __no_maps
296 1.7 lukem exit 1
297 1.7 lukem fi
298 1.7 lukem
299 1.7 lukem for map in ${maps}; do
300 1.7 lukem echo "Transferring ${map}..."
301 1.7 lukem if ! ${YPXFR} -h ${master} -c -d ${domain} ${map}; then
302 1.7 lukem echo 1>&2 "$progname: Can't transfer map ${map}"
303 1.1 thorpej exit 1
304 1.1 thorpej fi
305 1.1 thorpej done
306 1.1 thorpej
307 1.7 lukem cat << __dont_forget
308 1.7 lukem
309 1.7 lukem Don't forget to update the \`ypservers' on ${master},
310 1.7 lukem by adding an entry similar to:
311 1.7 lukem ${host} ${host}
312 1.7 lukem
313 1.7 lukem __dont_forget
314 1.1 thorpej exit 0
315 1.7 lukem
316 1.7 lukem ;;
317 1.7 lukem
318 1.7 lukem *)
319 1.7 lukem echo 1>&2 "$progname: unknown servertype \`${servertype}'"
320 1.7 lukem exit 1
321 1.7 lukem esac
322