ypinit.sh revision 1.7 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 (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 DOMAINNAME=/bin/domainname
14 HOSTNAME=/bin/hostname
15 ID=/usr/bin/id
16 MAKEDBM=/usr/sbin/makedbm
17 YPWHICH=/usr/bin/ypwhich
18 YPXFR=/usr/sbin/ypxfr
19
20 progname=`basename $0`
21 yp_dir=/var/yp
22 error=usage # assume usage error
23
24 umask 077 # protect created directories
25
26 if [ `${ID} -u` != 0 ]; then
27 echo 1>&2 "$progname: you must be root to run this"
28 exit 1
29 fi
30
31 case $# in
32 1)
33 if [ $1 = "-m" ]; then # ypinit -m
34 domain=`${DOMAINNAME}`
35 servertype=master
36 error=
37 fi
38 ;;
39
40 2)
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
54 3)
55 if [ $1 = "-s" ]; then # ypinit -s master_server domainname
56 domain=${3}
57 servertype=slave
58 master=${2}
59 error=
60 fi
61 ;;
62 esac
63
64 if [ "${error}" = "usage" ]; then
65 cat 1>&2 << __usage
66 usage: ${progname} -m [domainname]
67 ${progname} -s master_server [domainname]
68
69 The \`-m' flag builds a master YP server, and the \`-s' flag builds
70 a slave YP server. When building a slave YP server, \`master_server'
71 must be an existing, reachable YP server.
72 __usage
73
74 exit 1
75 fi
76
77 # Check if domainname is set, don't accept an empty domainname
78 if [ -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
86 fi
87
88 # Check if hostname is set, don't accept an empty hostname
89 host=`${HOSTNAME}`
90 if [ -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
97 fi
98
99 # Check if the YP directory exists.
100 if [ ! -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
107 fi
108
109 echo "Server type: ${servertype}"
110 echo "Domain: ${domain}"
111 if [ "${servertype}" != "master" ]; then
112 echo "Master: ${master}"
113 fi
114 echo ""
115 cat << __notice1
116
117 Installing the YP database may require that you answer a few questions.
118 Any configuration questions will be asked at the beginning of the procedure.
119
120 __notice1
121
122 if [ -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
149 fi
150
151 if ! mkdir "${yp_dir}/${domain}"; then
152 echo 1>&2 "$progname: Can't make new directory ${yp_dir}/${domain}"
153 exit 1
154 fi
155
156 case ${servertype} in
157 master)
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
211 slave)
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
236 Don't forget to update the \`ypservers' on ${master},
237 by 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
248 esac
249