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