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