xref: /illumos-gate/usr/src/cmd/ypcmd/ypinit.sh (revision 3db86aab)
1#!/sbin/sh
2#
3# CDDL HEADER START
4#
5# The contents of this file are subject to the terms of the
6# Common Development and Distribution License, Version 1.0 only
7# (the "License").  You may not use this file except in compliance
8# with the License.
9#
10# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
11# or http://www.opensolaris.org/os/licensing.
12# See the License for the specific language governing permissions
13# and limitations under the License.
14#
15# When distributing Covered Code, include this CDDL HEADER in each
16# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
17# If applicable, add the following below this CDDL HEADER, with the
18# fields enclosed by brackets "[]" replaced with your own identifying
19# information: Portions Copyright [yyyy] [name of copyright owner]
20#
21# CDDL HEADER END
22#
23#
24# Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
25# Use is subject to license terms.
26
27#	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T
28#	  All Rights Reserved
29
30# Portions of this source code were derived from Berkeley 4.3 BSD
31# under license from the Regents of the University of California.
32
33#ident	"%Z%%M%	%I%	%E% SMI"
34
35# set -xv
36YPXFR=/usr/lib/netsvc/yp/ypxfr
37MAKEPATH=/usr/ccs/bin
38maps="publickey publickey.byname"
39yproot_dir=/var/yp
40yproot_exe=/usr/sbin/yp
41hf=/var/run/ypservers.$$
42XFR=${YPXFR}
43
44hosts_file=/etc/hosts
45hosts6_file=/etc/inet/ipnodes
46clientp=F
47masterp=F
48slavep=F
49host=""
50def_dom=""
51master=""
52got_host_list=F
53first_time=T
54exit_on_error=F
55errors_in_setup=F
56
57enable_next_boot () {
58	/usr/sbin/svcadm disable -t $1
59	[ $? = 0 ] || echo "ypinit: unable to temporarily disable $1"
60	/usr/sbin/svccfg -s $1 \
61	    setprop general/enabled = true
62	[ $? = 0 ] || echo "ypinit: unable to enable $1 for next boot"
63}
64
65enable_this_boot () {
66	/usr/sbin/svcadm enable $1
67	[ $? = 0 ] || echo "ypinit: unable to enable $1"
68}
69
70PATH=/bin:/usr/bin:/usr/etc:/usr/sbin:$yproot_exe:$MAKEPATH:$PATH
71export PATH
72
73# To do cleanup
74trap '/usr/bin/rm -f $hf' 0 1 2 3 15
75
76case $# in
771)	case $1 in
78	-c)	clientp=T;;
79	-m)	masterp=T;;
80	*)	echo 'usage:'
81		echo '	ypinit -c'
82		echo '	ypinit -m'
83		echo '	ypinit -s master_server'
84		echo ""
85		echo "\
86where -c is used to set up a yp client, -m is used to build a master "
87                echo "\
88yp server data base, and -s is used for a slave data base."
89		echo "\
90master_server must be an existing reachable yp server."
91		exit 1;;
92	esac;;
93
942)	case $1 in
95	-s)	slavep=T; master=$2;
96		if ( grep $master $hosts_file $hosts6_file > /dev/null )
97		then
98			echo ""
99		else
100			echo "server not found in $hosts_file or $hosts6_file"
101			exit 1
102		fi;;
103
104	*)	echo 'usage:'
105		echo '	ypinit -c'
106		echo '	ypinit -m'
107		echo '	ypinit -s master_server'
108		echo ""
109		echo "\
110where -c is used to set up a yp client, -m is used to build a master "
111                echo "\
112yp server data base, and -s is used for a slave data base."
113		echo "\
114master_server must be an existing reachable yp server."
115		exit 1;;
116	esac;;
1173)	case $1 in
118	-c)	clientp=T;;
119	*)	echo 'usage:'
120		echo '	ypinit -c'
121		echo '	ypinit -m'
122		echo '	ypinit -s master_server'
123		echo ""
124		echo "\
125where -c is used to set up a yp client, -m is used to build a master "
126                echo "\
127yp server data base, and -s is used for a slave data base."
128		echo "\
129master_server must be an existing reachable yp server."
130		exit 1;;
131	esac;;
132
133*)	echo 'usage:'
134	echo '	ypinit -c'
135	echo '	ypinit -m'
136	echo '	ypinit -s master_server'
137	echo ""
138	echo "\
139where -c is used to set up a yp client, -m is used to build a master "
140	echo "\
141yp server data base, and -s is used for a slave data base."
142	echo "\
143master_server must be an existing reachable yp server."
144	exit 1;;
145esac
146
147if [ $? -ne 0 ]
148then
149	echo "\
150You have to be the superuser to run this.  Please log in as root."
151	exit 1
152fi
153
154host=`uname -n`
155
156if [ $? -ne 0 ]
157then
158	echo "Can't get local host's name.  Please check your path."
159	exit 1
160fi
161
162if [ -z "$host" ]
163then
164	echo "The local host's name hasn't been set.  Please set it."
165	exit 1
166fi
167
168def_dom=`domainname`
169
170if [ $? -ne 0 ]
171then
172	echo "Can't get local host's domain name.  Please check your path."
173	exit 1
174fi
175
176if [ -z "$def_dom" ]
177then
178	echo "The local host's domain name hasn't been set.  Please set it."
179	exit 1
180fi
181
182domainname $def_dom
183real_def_dom=$def_dom
184#def_dom=`ypalias -d $def_dom`
185ypservers_map=`ypalias ypservers`
186domain_dir="$yproot_dir""/""$def_dom"
187binding_dir="$yproot_dir""/binding/""$def_dom"
188binding_file="$yproot_dir""/binding/""$def_dom""/ypservers"
189
190if [ ! -d $yproot_dir -o -f $yproot_dir ]
191then
192    echo "\
193The directory $yproot_dir doesn't exist.  Restore it from the distribution."
194	exit 1
195fi
196
197# add domainname and ypservers aliases to aliases file
198echo ypservers $ypservers_map >> $yproot_dir/aliases
199echo $real_def_dom $def_dom >> $yproot_dir/aliases
200sort $yproot_dir/aliases | uniq > /var/run/.ypaliases; mv /var/run/.ypaliases $yproot_dir/aliases
201
202if [ ! -d "$yproot_dir"/binding ]
203then
204	mkdir "$yproot_dir"/binding
205fi
206
207if [ ! -d  $binding_dir ]
208then
209	mkdir  "$binding_dir"
210fi
211
212if [ $slavep = F ]
213then
214	while [ $got_host_list = F ]; do
215		touch $hf    # make sure file exists
216		echo ""
217		echo "\
218In order for NIS to operate sucessfully, we have to construct a list of the "
219		echo "\
220NIS servers.  Please continue to add the names for YP servers in order of"
221		echo "\
222preference, one per line.  When you are done with the list, type a <control D>"
223		echo "\
224or a return on a line by itself."
225		if [ $masterp = T ]
226		then
227			echo $host > $hf
228			echo "\tnext host to add:  $host"
229		elif [ -f $binding_file ]
230		then
231			if [ $first_time = T ]
232			then
233				for h in `cat $binding_file`
234				do
235					echo $h >> $hf
236					echo "\tnext host to add:  $h"
237				done
238			fi
239		fi
240
241		echo  "\tnext host to add:  \c"
242
243		while read h ; test -n "$h"
244		do
245			if ( grep $h $hosts_file $hosts6_file > /dev/null )
246			then
247				echo $h >> $hf
248				echo  "\tnext host to add:  \c"
249			else
250				echo "host $h not found in $hosts_file or $hosts6_file. Not added to the list"
251				echo ""
252				echo  "Do you wish to abort [y/n: y]  \c"
253				read cont_ok
254
255				case $cont_ok in
256				n*)	echo "\tnext host to add:  \c";;
257				N*)	echo "\tnext host to add:  \c";;
258				*)	exit 1;;
259				esac
260			fi
261
262		done
263
264		echo ""
265		if [ -s $hf ]
266		then
267			echo "The current list of yp servers looks like this:"
268			echo ""
269			cat $hf
270			echo ""
271			echo "Is this correct?  [y/n: y]  \c"
272		else
273			echo "You have not added any server information."
274			echo ""
275			echo "Do you still wish to exit? [y/n: y]  \c"
276		fi
277
278		read hlist_ok
279
280		case $hlist_ok in
281		n*)	got_host_list=F
282			first_time=F
283			rm $hf
284			echo "Let's try the whole thing again...";;
285		N*)	got_host_list=F
286			first_time=F
287			rm $hf
288			echo "Let's try the whole thing again...";;
289		*)	got_host_list=T;;
290		esac
291	done
292
293	if [ -s $hf ]
294	then
295		cp  $hf $binding_file
296	fi
297fi
298
299#
300# Start client service on next boot, unless we're establishing a slave
301# server, in which case the binding is needed now (or should be
302# preserved).
303#
304if [ $slavep = T ]
305then
306	enable_this_boot network/nis/client:default
307else
308	enable_next_boot network/nis/client:default
309fi
310
311#
312# As a client, our configuration is correct once a binding file is
313# established, and so we can exit (making sure we're no longer a server,
314# of course).
315#
316if [ $clientp = T ]
317then
318	rm $hf
319	/usr/sbin/svcadm disable network/nis/server:default
320	/usr/sbin/svcadm disable network/nis/xfr:default
321	/usr/sbin/svcadm disable network/nis/passwd:default
322	/usr/sbin/svcadm disable network/nis/update:default
323	exit 0
324fi
325
326if [ $slavep = T ]
327then
328	if [ $host = $master ]
329	then
330		echo "\
331The host specified should be a running master yp server, not this machine."
332		exit 1
333	fi
334
335	maps=`ypwhich -m | egrep $master$| awk '{ printf("%s ",$1) }' -`
336	if [ -z "$maps" ]
337	then
338		echo "Can't enumerate maps from $master. Please check that it is running."
339		exit 1
340	fi
341fi
342
343echo ""
344
345echo "Installing the YP database will require that you answer a few questions."
346echo "Questions will all be asked at the beginning of the procedure."
347echo ""
348echo "Do you want this procedure to quit on non-fatal errors? [y/n: n]  \c"
349read doexit
350
351case $doexit in
352y*)	exit_on_error=T;;
353Y*)	exit_on_error=T;;
354*)	echo "\
355OK, please remember to go back and redo manually whatever fails.  If you"
356	echo "\
357don't, some part of the system (perhaps the yp itself) won't work.";;
358esac
359
360echo "The yp domain directory is $yproot_dir""/""$def_dom"
361
362for dir in $yproot_dir/$def_dom
363do
364
365	if [ -d $dir ]; then
366		echo  "Can we destroy the existing $dir and its contents? [y/n: n]  \c"
367		read kill_old_dir
368
369		case $kill_old_dir in
370		y*)	rm -r -f $dir
371
372			if [ $?  -ne 0 ]
373			then
374			echo "Can't clean up old directory $dir.  Fatal error."
375				exit 1
376			fi;;
377
378		Y*)	rm -r -f $dir
379
380			if [ $?  -ne 0 ]
381			then
382			echo "Can't clean up old directory $dir.  Fatal error."
383				exit 1
384			fi;;
385
386		*)    echo "OK, please clean it up by hand and start again.  Bye"
387			exit 0;;
388		esac
389	fi
390
391	mkdir $dir
392
393	if [ $?  -ne 0 ]
394	then
395		echo "Can't make new directory $dir.  Fatal error."
396		exit 1
397	fi
398
399done
400
401if [ $slavep = T ]
402then
403	echo "\
404There will be no further questions. The remainder of the procedure should take"
405	echo "a few minutes, to copy the data bases from $master."
406
407	for dom in  $real_def_dom
408	do
409		for map in $maps
410		do
411			echo "Transferring $map..."
412			$XFR -h $master -c -d $dom $map
413
414			if [ $?  -ne 0 ]
415			then
416				errors_in_setup=T
417
418				if [ $exit_on_error = T ]
419				then
420					exit 1
421				fi
422			fi
423		done
424	done
425
426	echo ""
427	echo  "${host}'s nis data base has been set up\n"
428
429	if [ $errors_in_setup = T ]
430	then
431		echo " with errors.  Please remember"
432		echo "to figure out what went wrong, and fix it."
433	else
434		echo " without any errors."
435	fi
436
437	# enable slave services
438	enable_this_boot network/nis/server:default
439
440	enable_this_boot network/nis/client:default
441
442	exit 0
443else
444
445	rm -f $yproot_dir/*.time
446
447	echo "\
448There will be no further questions. The remainder of the procedure should take"
449	echo "5 to 10 minutes."
450
451	echo "Building $yproot_dir/$def_dom/ypservers..."
452	makedbm $hf $yproot_dir/$def_dom/$ypservers_map
453
454	if [ $?  -ne 0 ]
455	then
456		echo "\
457Couldn't build yp data base $yproot_dir/$def_dom/$ypservers_map."
458		errors_in_setup=T
459
460		if [ $exit_on_error = T ]
461		then
462			exit 1
463		fi
464	fi
465
466	rm $hf
467
468	in_pwd=`pwd`
469	cd $yproot_dir
470	echo  "Running \c"
471	echo  $yproot_dir "\c"
472	echo "/Makefile..."
473	make NOPUSH=1
474
475	if [ $?  -ne 0 ]
476	then
477		echo "\
478Error running Makefile."
479		errors_in_setup=T
480
481		if [ $exit_on_error = T ]
482		then
483			exit 1
484		fi
485	fi
486
487	cd $in_pwd
488	echo ""
489	echo  "\
490$host has been set up as a yp master server\c"
491
492	if [ $errors_in_setup = T ]
493	then
494		echo " with errors.  Please remember"
495		echo "to figure out what went wrong, and fix it."
496	else
497		echo " without any errors."
498	fi
499
500	echo ""
501	echo "\
502If there are running slave yp servers, run yppush now for any data bases"
503	echo "\
504which have been changed.  If there are no running slaves, run ypinit on"
505	echo "\
506those hosts which are to be slave servers."
507
508	# enable master services
509	enable_this_boot network/nis/server:default
510	enable_this_boot network/nis/xfr:default
511	enable_this_boot network/nis/passwd:default
512	enable_this_boot network/nis/update:default
513
514	enable_this_boot network/nis/client:default
515fi
516