]> git.saurik.com Git - apple/network_cmds.git/blob - ypinit.tproj/ypinit.sh
network_cmds-115.tar.gz
[apple/network_cmds.git] / ypinit.tproj / ypinit.sh
1 #!/bin/sh
2 # $Id: ypinit.sh,v 1.2 2002/03/26 14:38:48 epeyton Exp $
3 #
4 # ypinit.sh - setup an master or slave server.
5 #
6 DOMAINNAME=/bin/domainname
7 HOSTNAME=/bin/hostname
8 YPWHICH=/usr/bin/ypwhich
9 YPXFR=/usr/sbin/ypxfr
10 YP_DIR=/var/yp
11 MAKEDBM=/usr/sbin/makedbm
12 ERROR_EXISTS="NO"
13 MAKE=bsdmake
14 umask 077
15
16 #set -xv
17
18 ERROR=USAGE # assume usage error
19
20 if [ $# -eq 1 ]
21 then
22 if [ $1 = "-m" ] # ypinit -m
23 then
24 DOMAIN=`${DOMAINNAME}`
25 SERVERTYPE=MASTER
26 ERROR=
27 fi
28
29 if [ $1 = "-u" ] # ypinit -u
30 then
31 DOMAIN=`${DOMAINNAME}`
32 SERVERTYPE=UPDATE
33 ERROR=
34 fi
35 fi
36
37 if [ $# -eq 2 ]
38 then
39 if [ $1 = "-m" ] # ypinit -m domainname
40 then
41 DOMAIN=${2}
42 SERVERTYPE=MASTER
43 ERROR=
44 fi
45
46 if [ $1 = "-s" ] # ypinit -s master_server
47 then
48 DOMAIN=`${DOMAINNAME}`
49 SERVERTYPE=SLAVE
50 MASTER=${2}
51 ERROR=
52 fi
53
54 if [ $1 = "-u" ] # ypinit -u domainname
55 then
56 DOMAIN=${2}
57 SERVERTYPE=UPDATE
58 ERROR=
59 fi
60 fi
61
62 if [ $# -eq 3 ]
63 then
64 if [ $1 = "-s" ] # ypinit -s master_server domainname
65 then
66 DOMAIN=${3}
67 SERVERTYPE=SLAVE
68 MASTER=${2}
69 ERROR=
70 fi
71 fi
72
73 if [ "${ERROR}" = "USAGE" ]; then
74 cat << \__usage 1>&2
75 usage: ypinit -m [domainname]
76 ypinit -s master_server [domainname]
77 ypinit -u [domainname]
78
79 The `-m' flag builds a master YP server, and the `-s' flag builds
80 a slave YP server. When building a slave YP server, `master_server'
81 must be an existing, reachable YP server.
82 The `-u' is for updating the ypservers map on a master server.
83 __usage
84
85 exit 1
86 fi
87
88 # Check if domainname is set, don't accept an empty domainname
89 if [ -z "${DOMAIN}" ]; then
90 cat << \__no_domain 1>&2
91 The local host's YP domain name has not been set. Please set it with
92 the domainname(8) command or pass the domain as an argument to ypinit(8).
93 __no_domain
94
95 exit 1
96 fi
97
98 # Check if hostname is set, don't accept an empty hostname
99 HOST=`${HOSTNAME}`
100 if [ -z "${HOST}" ]; then
101 cat << \__no_hostname 1>&2
102 The local host's hostname has not been set. Please set it with the
103 hostname(8) command.
104 __no_hostname
105
106 exit 1
107 fi
108
109 # Check if we have contact with master.
110 if [ "${SERVERTYPE}" = "SLAVE" ];
111 then
112 COUNT=`${YPWHICH} -d ${DOMAIN} -m 2>/dev/null | grep -i ${MASTER} | wc -l | tr -d " "`
113 if [ "$COUNT" = "0" ]
114 then
115 echo "Can't enumerate maps from ${MASTER}. Please check that it is running." 1>&2
116 exit 1
117 fi
118 fi
119
120 # Check if user is root
121 ID=`id -u`
122 if [ "${ID}" != "0" ]; then
123 echo "You have to be the superuser to run this. Please login as root." 1>&2
124 exit 1
125 fi
126
127 # Check if the YP directory exists.
128
129 if [ ! -d ${YP_DIR} -o -f ${YP_DIR} ]
130 then
131 echo "The directory ${YP_DIR} doesn't exist. Restore it from the distribution." 1>&2
132 exit 1
133
134 fi
135
136 echo -n "Server Type: ${SERVERTYPE} Domain: ${DOMAIN}"
137 if [ "${SERVERTYPE}" = "SLAVE" ]; then
138 echo -n " Master: ${MASTER}"
139 fi
140 echo ""
141
142 if [ "${SERVERTYPE}" != "UPDATE" ];
143 then
144 cat << \__notice1
145
146 Creating an YP server will require that you answer a few questions.
147 Questions will all be asked at the beginning of the procedure.
148
149 __notice1
150
151 echo -n "Do you want this procedure to quit on non-fatal errors? [y/n: n] "
152 read DOEXIT
153
154 case ${DOEXIT} in
155 y*|Y*)
156 ERROR_EXIT="YES"
157 ;;
158
159 *) ERROR_EXIT="NO"
160 echo ""
161 echo "Ok, please remember to go back and redo manually whatever fails."
162 echo "If you don't, something might not work. "
163 ;;
164 esac
165
166 if [ -d "${YP_DIR}/${DOMAIN}" ]; then
167 echo ""
168 echo -n "Can we destroy the existing ${YP_DIR}/${DOMAIN} and its contents? [y/n: n] "
169 read KILL
170
171 ERROR=
172 case ${KILL} in
173 y*|Y*)
174 ERROR="DELETE"
175 ;;
176
177 *) ERROR=
178 ;;
179 esac
180
181 if [ "${ERROR}" = "DELETE" ]; then
182 if ! rm -rf ${YP_DIR}/${DOMAIN}; then
183 echo "Can't clean up old directory ${YP_DIR}/${DOMAIN}." 1>&2
184 exit 1
185 fi
186 else
187 echo "OK, please clean it up by hand and start again. Bye"
188 exit 0
189 fi
190
191 fi
192
193 if ! mkdir "${YP_DIR}/${DOMAIN}"; then
194 echo "Can't make new directory ${YP_DIR}/${DOMAIN}." 1>&2
195 exit 1
196 fi
197 fi
198
199 if [ "${SERVERTYPE}" = "MASTER" ];
200 then
201
202 if [ ! -f ${YP_DIR}/Makefile ]
203 then
204 if [ ! -f ${YP_DIR}/Makefile.main ]
205 then
206 echo "Can't find ${YP_DIR}/Makefile.main. " 1>&2
207 exit 1
208 fi
209 cp ${YP_DIR}/Makefile.main ${YP_DIR}/Makefile
210 fi
211
212 SUBDIR=`grep "^SUBDIR=" ${YP_DIR}/Makefile`
213
214 if [ -z "${SUBDIR}" ]
215 then
216 echo "Can't find line starting with 'SUBDIR=' in ${YP_DIR}/Makefile. " 1>&2
217 exit 1
218 fi
219
220 NEWSUBDIR="SUBDIR="
221 for DIR in `echo ${SUBDIR} | cut -c8-255`; do
222 if [ ${DIR} != ${DOMAIN} ]; then
223 NEWSUBDIR="${NEWSUBDIR} ${DIR}"
224 fi
225 done
226 NEWSUBDIR="${NEWSUBDIR} ${DOMAIN}"
227
228 if [ -f ${YP_DIR}/Makefile.tmp ]; then
229 rm ${YP_DIR}/Makefile.tmp
230 fi
231
232 mv ${YP_DIR}/Makefile ${YP_DIR}/Makefile.tmp
233 sed -e "s/^${SUBDIR}/${NEWSUBDIR}/" ${YP_DIR}/Makefile.tmp > \
234 ${YP_DIR}/Makefile
235 rm ${YP_DIR}/Makefile.tmp
236
237 if [ ! -f ${YP_DIR}/Makefile.yp ]; then
238 echo "Can't find ${YP_DIR}/Makefile.yp. " 1>&2
239 exit 1
240 fi
241
242 cp ${YP_DIR}/Makefile.yp ${YP_DIR}/${DOMAIN}/Makefile
243
244 fi
245
246 if [ "${SERVERTYPE}" = "SLAVE" ];
247 then
248
249 echo "There will be no further questions. The remainder of the procedure"
250 echo "should take a few minutes, to copy the databases from ${MASTER}."
251
252 for MAP in `${YPWHICH} -d ${DOMAIN} -m | cut -d\ -f1`
253 do
254 echo "Transfering ${MAP}..."
255 if ! ${YPXFR} -h ${MASTER} -c -d ${DOMAIN} ${MAP}; then
256 echo "Can't transfer map ${MAP}." 1>&2
257 ERROR_EXISTS="YES"
258 if [ "${ERROR_EXIT}" = "YES" ]; then
259 exit 1
260 fi
261 fi
262 done
263
264 echo ""
265 if [ "${ERROR_EXISTS}" = "YES" ]; then
266 echo "${HOST} has been setup as an YP slave server with errors. " 1>&2
267 echo "Please remember fix any problem that occurred." 1>&2
268 else
269 echo "${HOST} has been setup as an YP slave server without any errors. "
270 fi
271
272 echo "Don't forget to update map ypservers on ${MASTER}."
273 exit 0
274 fi
275
276 LIST_OK="NO"
277
278 while [ "${LIST_OK}" = "NO" ];
279 do
280
281 if [ "${SERVERTYPE}" = "MASTER" ];
282 then
283 HOST_LIST="${HOST}"
284 echo ""
285 echo "At this point, we have to construct a list of this domains YP servers."
286 echo "${HOST} is already known as master server."
287 echo "Please continue to add any slave servers, one per line. When you are"
288 echo "done with the list, type a <control D>."
289 echo " master server : ${HOST}"
290 fi
291
292 if [ "${SERVERTYPE}" = "UPDATE" ];
293 then
294 HOST_LIST="${HOST}"
295 NEW_LIST=""
296 MASTER_NAME=""
297 SHORT_HOST=`echo ${HOST} | cut -d. -f1`
298 if [ -f ${YP_DIR}/${DOMAIN}/ypservers.db ];
299 then
300 for srv in `${MAKEDBM} -u ${YP_DIR}/${DOMAIN}/ypservers | grep -v "^YP" | tr "\t" " " | cut -d\ -f1`;
301 do
302 short_srv=`echo ${srv} | cut -d. -f1`
303 if [ "${SHORT_HOST}" != "${short_srv}" ]
304 then
305 if [ "${NEW_LIST}" = "" ];
306 then
307 NEW_LIST="${srv}"
308 else
309 NEW_LIST="${NEW_LIST} ${srv}"
310 fi
311 fi
312 done;
313 MASTER_NAME=`${MAKEDBM} -u ${YP_DIR}/${DOMAIN}/ypservers | grep "^YP_MASTER_NAME" | tr "\t" " " | cut -d\ -f2`
314 fi
315 echo ""
316 echo "Update the list of hosts running YP servers in domain ${DOMAIN}."
317 echo "Master for this domain is ${MASTER_NAME}."
318 echo ""
319 echo "First verify old servers, type \\ to remove a server."
320 echo "Then add new servers, one per line. When done type a <control D>."
321 echo ""
322 echo " master server : ${HOST}"
323 if [ "${NEW_LIST}" != "" ]; then
324 for node in $NEW_LIST; do
325 echo -n " verify host : [${node}] "
326 read verify
327 if [ "${verify}" != "\\" ]; then
328 HOST_LIST="${HOST_LIST} ${node}"
329 fi
330 done;
331 fi
332 fi
333
334 echo -n " next host to add: "
335
336 while read h
337 do
338 echo -n " next host to add: "
339 HOST_LIST="${HOST_LIST} ${h}"
340 done
341
342 echo ""
343 echo "The current list of NIS servers looks like this:"
344 echo ""
345
346 for h in `echo ${HOST_LIST}`;
347 do
348 echo ${h}
349 done
350
351 echo ""
352 echo -n "Is this correct? [y/n: y] "
353 read hlist_ok
354
355 case $hlist_ok in
356 n*) echo "Let's try the whole thing again...";;
357 N*) echo "Let's try the whole thing again...";;
358 *) LIST_OK="YES";;
359 esac
360
361 done
362
363 echo "Building ${YP_DIR}/${DOMAIN}/ypservers..."
364 for host in ${HOST_LIST};
365 do
366 echo "${host} ${host}"
367 done | ${MAKEDBM} - ${YP_DIR}/${DOMAIN}/ypservers
368
369 if [ $? -ne 0 ]; then
370 echo "" 1>&2
371 echo "Couldn't build yp data base ${YP_DIR}/${DOMAIN}/ypservers." 1>&2
372 ERROR_EXISTS="YES"
373 if [ "${ERROR_EXIT}" = "YES" ]; then
374 exit 1
375 fi
376 fi
377
378 if [ "${SERVERTYPE}" = "MASTER" ]; then
379
380 CUR_PWD=`pwd`
381 cd ${YP_DIR}/${DOMAIN}
382 echo "Running ${YP_DIR}/${DOMAIN}/Makefile..."
383 if ! ${MAKE} NOPUSH=1; then
384 echo "" 1>&2
385 echo "Error running Makefile." 1>&2
386 ERROR_EXISTS="YES"
387 if [ "${ERROR_EXIT}" = "YES" ]; then
388 exit 1
389 fi
390 fi
391
392 cd ${CUR_PWD}
393
394 echo ""
395 if [ "${ERROR_EXISTS}" = "YES" ]; then
396 echo "${HOST} has been setup as an YP master server with errors. " 1>&2
397 echo "Please remember fix any problem that occurred." 1>&2
398 else
399 echo "${HOST} has been setup as an YP master server without any errors. "
400 fi
401
402 fi