xref: /titanic_52/usr/src/cmd/svc/milestone/net-loc (revision 17a2b317610f531d565bf4e940433aab2d9e6985)
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 (the "License").
7# You may not use this file except in compliance with the License.
8#
9# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10# or http://www.opensolaris.org/os/licensing.
11# See the License for the specific language governing permissions
12# and limitations under the License.
13#
14# When distributing Covered Code, include this CDDL HEADER in each
15# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16# If applicable, add the following below this CDDL HEADER, with the
17# fields enclosed by brackets "[]" replaced with your own identifying
18# information: Portions Copyright [yyyy] [name of copyright owner]
19#
20# CDDL HEADER END
21#
22#
23# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
24#
25
26. /lib/svc/share/smf_include.sh
27. /lib/svc/share/net_include.sh
28
29# FMRI consts
30AUTOFS_FMRI="svc:/system/filesystem/autofs"
31DNS_CLIENT_FMRI="svc:/network/dns/client"
32IPSEC_IKE_FMRI="svc:/network/ipsec/ike"
33IPSEC_POLICY_FMRI="svc:/network/ipsec/policy"
34IPFILTER_FMRI="svc:/network/ipfilter:default"
35LDAP_CLIENT_FMRI="svc:/network/ldap/client"
36LOCATION_FMRI="svc:/network/location:default"
37MAPID_FMRI="svc:/network/nfs/mapid:default"
38NIS_CLIENT_FMRI="svc:/network/nis/client"
39NWAM_FMRI="svc:/network/physical:nwam"
40
41# commands
42CP=/usr/bin/cp
43DHCPINFO=/sbin/dhcpinfo
44DOMAINNAME=/usr/bin/domainname
45GREP=/usr/bin/grep
46LDAPCLIENT=/usr/sbin/ldapclient
47MKDIR=/usr/bin/mkdir
48MV=/usr/bin/mv
49NAWK=/usr/bin/nawk
50NWAMADM=/usr/sbin/nwamadm
51NWAMCFG=/usr/sbin/nwamcfg
52RM=/usr/bin/rm
53SED=/usr/bin/sed
54SVCADM=/usr/sbin/svcadm
55SVCCFG=/usr/sbin/svccfg
56SVCPROP=/usr/bin/svcprop
57TOUCH=/usr/bin/touch
58
59# Path to directories
60ETC_DEFAULT_DOMAIN=/etc/defaultdomain
61NIS_BIND_PATH=/var/yp/binding
62LEGACY_LOC_PATH=/etc/nwam/loc/Legacy
63USER_LOC_PATH=/etc/nwam/loc/User
64SCRIPT_PATH=/etc/svc/volatile/nwam
65
66#
67# echoes DHCP controlled interfaces separated by commas
68#
69# Don't parse the output of ifconfig(1M) because interfaces that haven't
70# acquired a DHCP lease also have the DHCP flag set.
71#
72get_dhcp_interfaces () {
73	#
74	# 1. parse netstat(1M) output for v4 interfaces in BOUND
75	#    or INFORMATION state
76	# 2. make a space-separated list of interface names
77	#
78	netstat -D -f inet | $NAWK '
79	    $2 ~ /BOUND/ { printf "%s ", $1 }
80	    $2 ~ /INFORMATION/ { printf "%s ", $1 }'
81}
82
83#
84# get_dhcpinfo <code/identifier>
85#
86# echoes the value received through each interface controlled by DHCP;
87# multiple values are echoed as a space-separated list
88#
89# returns:
90#	0 => property is set
91#	1 => property is not set
92#
93get_dhcpinfo () {
94	code=$1
95
96	# Get all interfaces with DHCP control, IFS is " "
97	interfaces=`get_dhcp_interfaces`
98
99	info=""
100 	for intf in $interfaces; do
101		val=`$DHCPINFO -i $intf $code`
102		if [ $? -eq 0 ]; then
103			if [ "$info" = "" ]; then
104				info="$val"
105			else
106				info="$info $val"
107			fi
108		fi
109 	done
110	echo $info
111}
112
113#
114# set_smf_prop <fmri> <property name> <property value>
115#
116set_smf_prop () {
117	$SVCCFG -s $1 setprop $2 = astring: "$3" && return
118}
119
120#
121# refresh_svc <fmri>
122#
123# Refreshes the service.
124#
125refresh_svc () {
126	$SVCADM refresh $1
127}
128
129#
130# restart_svc <fmri>
131#
132# Restarts the service.
133#
134restart_svc () {
135	$SVCADM restart $1
136}
137
138#
139# start_svc <fmri>
140#
141# Starts the service.  If the service is already enabled, restarts it.  If
142# it is not enabled, temporarily enables it.
143#
144start_svc () {
145	if service_is_enabled $1; then
146		$SVCADM restart $1
147	else
148		$SVCADM enable -t $1
149	fi
150}
151
152#
153# stop_svc <fmri>
154#
155# Temporarily disables the service.
156#
157stop_svc () {
158	$SVCADM disable -t $1
159}
160
161#
162# copy_default <dir> <file>
163#
164# Copies <dir>/<file>.dfl to <dir>/<file>
165#
166copy_default () {
167	$CP -p $1/$2.dfl $1/$2
168}
169
170#
171# do_dns <location>
172#
173# Installs DNS information on /etc/resolv.conf for location
174#
175# Returns 0 on success, 1 on failure
176#
177do_dns () {
178	loc=$1
179	file=/etc/resolv.conf
180
181	# Write out to temporary file first
182	$TOUCH $file.$$
183
184	DNS_CONFIGSRC=`nwam_get_loc_list_prop $loc dns-nameservice-configsrc`
185	if [ -z "$DNS_CONFIGSRC" ]; then
186		echo "missing 'dns-nameservice-configsrc' property for '$loc'"
187		return 1
188	fi
189
190	for configsrc in $DNS_CONFIGSRC; do
191		case "$configsrc" in
192		'manual')
193			DNS_SERVERS=`nwam_get_loc_list_prop $loc \
194			    dns-nameservice-servers`
195			if [ -z "$DNS_SERVERS" ]; then
196				echo "DNS nameserver not set for '$loc'"
197				return 1
198			fi
199			DNS_DOMAIN=`nwam_get_loc_prop $loc \
200			    dns-nameservice-domain`
201			DNS_SEARCH=`nwam_get_loc_list_prop $loc \
202			    dns-nameservice-search`
203			;;
204		'dhcp')
205			DNS_DOMAIN=`get_dhcpinfo DNSdmain`
206			DNS_SERVERS=`get_dhcpinfo DNSserv`
207			# No DNS search info for IPv4
208			;;
209		'*')
210			echo "Unrecognized DNS configsrc ${configsrc}; ignoring"
211			;;
212		esac
213
214		# Write DNS settings
215		if [ -n "$DNS_DOMAIN" ]; then
216			echo "$DNS_DOMAIN" | $NAWK \
217			    '{ for (i = 1; i <= NF; i++) \
218			    print "domain ", $i }' >> $file.$$
219		fi
220		if [ -n "$DNS_SEARCH" ]; then
221			echo "$DNS_SEARCH" | $NAWK \
222                            '{ printf("search"); \
223			    for (i = 1; i <= NF; i++) printf(" %s", $i); \
224			    printf("\n") }' >> $file.$$
225		fi
226		if [ -n "$DNS_SERVERS" ]; then
227			echo "$DNS_SERVERS" | $NAWK \
228			    '{ for (i = 1; i <= NF; i++) \
229			    print "nameserver ", $i }' >> $file.$$
230		fi
231	done
232
233	# Finally, copy our working version to the real thing
234	$MV -f $file.$$ $file
235	start_svc $DNS_CLIENT_FMRI
236
237	return 0
238}
239
240#
241# do_nis <location>
242#
243# Installs NIS information on /var/yp/binding/ for location
244#
245# Returns 0 on success, 1 on failure
246#
247do_nis () {
248	loc=$1
249
250	NIS_CONFIGSRC=`nwam_get_loc_list_prop $loc nis-nameservice-configsrc`
251	if [ -z "$NIS_CONFIGSRC" ]; then
252		echo "missing 'nis-nameservice-configsrc' property for '$loc'"
253		return 1
254	fi
255
256	for configsrc in $NIS_CONFIGSRC; do
257		case "$configsrc" in
258		'manual')
259			NIS_SERVERS=`nwam_get_loc_list_prop $loc \
260			    nis-nameservice-servers`
261			DEFAULT_DOMAIN=`nwam_get_loc_prop $loc default-domain`
262			# user-specified default-domain always wins
263			if [ -n "$DEFAULT_DOMAIN" ]; then
264				$DOMAINNAME $DEFAULT_DOMAIN
265				$DOMAINNAME > $ETC_DEFAULT_DOMAIN
266			else
267				echo "'domainname' not set for '$loc'"
268				return 1
269			fi
270			;;
271		'dhcp')
272			# Use only the first name
273			DEFAULT_DOMAIN=`get_dhcpinfo NISdmain | \
274			    $NAWK '{ print $1 }'`
275			NIS_SERVERS=`get_dhcpinfo NISservs`
276			$DOMAINNAME $DEFAULT_DOMAIN
277			$DOMAINNAME > $ETC_DEFAULT_DOMAIN
278			;;
279		'*')
280			echo "Unrecognized NIS configsrc ${configsrc}; ignoring"
281			;;
282		esac
283
284		# Place NIS settings in appropriate directory/file.
285		if [ ! -d "$NIS_BIND_PATH/$DEFAULT_DOMAIN" ]; then
286			$MKDIR -p $NIS_BIND_PATH/$DEFAULT_DOMAIN
287		fi
288		if [ -n "$NIS_SERVERS" ]; then
289			echo "$NIS_SERVERS" | $NAWK \
290			    '{ for (i = 1; i <= NF; i++) print $i }' \
291			    > $NIS_BIND_PATH/$DEFAULT_DOMAIN/ypservers
292		fi
293	done
294
295	start_svc $NIS_CLIENT_FMRI
296
297	return 0
298}
299
300#
301# do_ldap <location>
302#
303# Installs LDAP information using ldapclient(1M) for location
304#
305# Returns 0 on success, 1 on failure
306#
307do_ldap () {
308	loc=$1
309
310	LDAP_CONFIGSRC=`nwam_get_loc_list_prop $loc ldap-nameservice-configsrc`
311	if [ -z "$LDAP_CONFIGSRC" ]; then
312		echo "missing 'ldap-nameservice-configsrc' property for '$loc'"
313		return 1
314	fi
315
316	for configsrc in $LDAP_CONFIGSRC; do
317		case "$configsrc" in
318		'manual')
319			LDAP_SERVERS=`nwam_get_loc_list_prop $loc \
320			    ldap-nameservice-servers`
321			DEFAULT_DOMAIN=`nwam_get_loc_prop $loc default-domain`
322			if [ -z $LDAP_SERVERS -o -z $DEFAULT_DOMAIN ]; then
323				echo "LDAP configuration could not be set "\
324				    "for '$loc'"
325				return 1
326			fi
327			$DOMAINNAME $DEFAULT_DOMAIN
328			$DOMAINNAME > $ETC_DEFAULT_DOMAIN
329			;;
330		'*')
331			echo "Invalid LDAP configsrc ${configsrc}; ignoring"
332			;;
333		esac
334
335		# Use ldapclient(1M) to initialize LDAP client settings.
336		if [ -n "$DEFAULT_DOMAIN" -o -n "$LDAP_SERVERS" ]; then
337			$LDAPCLIENT init -a domainName=$DEFAULT_DOMAIN \
338			    $LDAP_SERVERS
339		fi
340	done
341
342	start_svc $LDAP_CLIENT_FMRI
343
344	return 0
345}
346
347#
348# do_ns <location>
349#
350# Installs different nameservices for location
351#
352# Returns 0 on success, 1 on failure
353#
354do_ns () {
355	loc=$1
356
357	#
358	# Disable nameservices temporarily while we reconfigure.  Copy
359	# /etc/nsswitch.files to /etc/nsswitch.conf first so that only "files"
360	# are used.
361	#
362	$CP -p /etc/nsswitch.files /etc/nsswitch.conf
363	stop_svc $DNS_CLIENT_FMRI
364	stop_svc $NIS_CLIENT_FMRI
365	stop_svc $LDAP_CLIENT_FMRI
366
367	#
368	# Remove /etc/defaultdomain and unset domainname(1M).  If NIS
369	# and/or LDAP is configured, they will create /etc/defaultdomain
370	# and set the domainname(1M).
371	#
372	$RM -f $ETC_DEFAULT_DOMAIN
373	$DOMAINNAME " "
374
375	NAMESERVICES=`nwam_get_loc_list_prop $loc nameservices`
376	if [ -z "$NAMESERVICES" ]; then
377		echo "missing 'nameservices' property for location '$loc'"
378		return 1
379	fi
380
381	NAMESERVICES_CONFIG_FILE=`nwam_get_loc_prop \
382	    $loc nameservices-config-file`
383	if [ -z "$NAMESERVICES_CONFIG_FILE" ]; then
384		echo "missing 'nameservices-config-file' property for '$loc'"
385		return 1
386	fi
387	$CP -p $NAMESERVICES_CONFIG_FILE /etc/nsswitch.conf
388
389	for ns in $NAMESERVICES; do
390		case "$ns" in
391		'files')
392			# no additional setup needed for files nameservice
393			;;
394		'dns')
395			do_dns $loc || return 1
396			;;
397		'nis')
398			do_nis $loc || return 1
399			;;
400		'ldap')
401			do_ldap $loc || return 1
402			;;
403		'*')
404			echo "Unrecognized nameservices value ${ns}; ignoring"
405			;;
406		esac
407	done
408
409	#
410	# Restart other related services
411	#
412	# We explicitly restart here, as restart will only have an
413	# effect if the service is already enabled.  We don't want
414	# to enable the service if it's currently disabled.
415	#
416	restart_svc $AUTOFS_FMRI
417
418	return 0
419}
420
421#
422# do_sec <location>
423#
424# If config properties are set, update the SMF property and refresh the
425# service.  If config properties are not set, delete the SMF property and
426# stop the service.
427#
428# Returns 0 on success, 1 on failure
429#
430do_sec () {
431	loc=$1
432
433	ike_file=`nwam_get_loc_prop $loc ike-config-file`
434	pol_file=`nwam_get_loc_prop $loc ipsecpolicy-config-file`
435	ipf_file=`nwam_get_loc_prop $loc ipfilter-config-file`
436	ipf6_file=`nwam_get_loc_prop $loc ipfilter-v6-config-file`
437	ipnat_file=`nwam_get_loc_prop $loc ipnat-config-file`
438	ippool_file=`nwam_get_loc_prop $loc ippool-config-file`
439
440	# IKE
441	if [ -n "$ike_file" ]; then
442		set_smf_prop $IPSEC_IKE_FMRI config/config_file $ike_file
443		refresh_svc $IPSEC_IKE_FMRI
444		start_svc $IPSEC_IKE_FMRI
445	else
446		stop_svc $IPSEC_IKE_FMRI
447	fi
448
449	# IPsec
450	if [ -n "$pol_file" ]; then
451		set_smf_prop $IPSEC_POLICY_FMRI config/config_file $pol_file
452		refresh_svc $IPSEC_POLICY_FMRI
453		start_svc $IPSEC_POLICY_FMRI
454	else
455		stop_svc $IPSEC_POLICY_FMRI
456	fi
457
458	# IPFilter
459	refresh_ipf=false
460	if [ -n "$ipf_file" ]; then
461		if [ "$ipf_file" = "/none" ]; then
462			set_smf_prop $IPFILTER_FMRI \
463			    firewall_config_default/policy "none"
464		elif [ "$ipf_file" = "/deny" ]; then
465			set_smf_prop $IPFILTER_FMRI \
466			    firewall_config_default/policy "deny"
467		elif [ "$ipf_file" = "/allow" ]; then
468			set_smf_prop $IPFILTER_FMRI \
469			    firewall_config_default/policy "allow"
470		else
471			# custom policy with policy file
472			set_smf_prop $IPFILTER_FMRI \
473			    firewall_config_default/policy "custom"
474			set_smf_prop $IPFILTER_FMRI \
475			    firewall_config_default/custom_policy_file $ipf_file
476		fi
477		refresh_ipf=true
478	else
479		# change policy to "none", no need to clear custom_policy_file
480		set_smf_prop $IPFILTER_FMRI firewall_config_default/policy \
481		    "none"
482		# IPFilter has to be refreshed to make the changes effective.
483		# Don't set $refresh_ipf as it keeps IPFilter online rather
484		# than disabled.  Refresh after IPFilter is disabled below.
485	fi
486	if [ -n "$ipf6_file" ]; then
487		set_smf_prop $IPFILTER_FMRI config/ipf6_config_file $ipf6_file
488		refresh_ipf=true
489	fi
490	if [ -n "$ipnat_file" ]; then
491		set_smf_prop $IPFILTER_FMRI config/ipnat_config_file $ipnat_file
492		refresh_ipf=true
493	fi
494	if [ -n "$ippool_file" ]; then
495		set_smf_prop $IPFILTER_FMRI config/ippool_config_file \
496		    $ippool_file
497		refresh_ipf=true
498	fi
499
500	if [ "$refresh_ipf" = "true" ]; then
501		refresh_svc $IPFILTER_FMRI
502		start_svc $IPFILTER_FMRI
503	else
504		stop_svc $IPFILTER_FMRI
505		refresh_svc $IPFILTER_FMRI
506	fi
507
508	return 0
509}
510
511#
512# update_nfs_file <new nfsv4 domain>
513#
514update_nfs_file () {
515	domain=$1
516	file=/etc/default/nfs
517
518	#
519	# For non-commented-out lines that set NFSMAPID_DOMAIN:
520	#	if not previously added by nwam, comment out with a note
521	#	if previously added by nwam, remove
522	# For commented-out lines that set NFSMAPID_DOMAIN:
523	#	if not commented out by NWAM, leave as-is
524	#	if commented out by NWAM, remove
525	# All other lines: leave as-is
526	#
527	$NAWK ' \
528		$0 ~ /^NFSMAPID_DOMAIN=/ {
529			if (index($0, "# Added by NWAM") == 0)
530				printf("#%s # Commented out by NWAM\n", $0);
531		}
532		$0 ~ /^#NFSMAPID_DOMAIN=/ {
533			if ($0 !~ /"# Commented out by NWAM"/)
534				printf("%s\n", $0);
535		}
536		$1 !~ /NFSMAPID_DOMAIN=/ {
537			printf("%s\n", $0);
538		}' $file >$file.$$
539
540	# Now add the desired value
541	echo "NFSMAPID_DOMAIN=$domain # Added by NWAM" >> $file.$$
542
543	# Finally, copy our working version to the real thing
544	$MV -f $file.$$ $file
545}
546
547#
548# do_nfsv4 <location>
549#
550# Updates NFSv4 domain for location
551#
552# Returns 0 on success, 1 on failure
553#
554do_nfsv4 () {
555	loc=$1
556
557	nfsv4domain=`nwam_get_loc_prop $loc nfsv4-domain`
558	if [ $? -eq 0 ]; then
559		update_nfs_file $nfsv4domain
560		start_svc $MAPID_FMRI
561	else
562		stop_svc $MAPID_FMRI
563	fi
564
565	return 0
566}
567
568#
569# activate_loc <location>
570#
571# Activates the given location
572#
573# Returns 0 on success, 1 on failure
574#
575activate_loc () {
576	loc=$1
577
578	echo activating $loc location
579
580	#
581	# if we fail to complete any part of the config,
582	# stop activation work and report failure.
583	#
584	do_sec $loc && do_ns $loc && do_nfsv4 $loc && return 0
585	return 1
586}
587
588#
589# Script entry point
590#
591# Arguments to net-loc are
592#	method ('start' or 'refresh')
593
594#
595# If nwam is not enabled, do nothing and return OK.
596#
597service_is_enabled $NWAM_FMRI || exit $SMF_EXIT_OK
598
599#
600# In a shared-IP zone we need this service to be up, but all of the work
601# it tries to do is irrelevant (and will actually lead to the service
602# failing if we try to do it), so just bail out.
603# In the global zone and exclusive-IP zones we proceed.
604#
605smf_configure_ip || exit $SMF_EXIT_OK
606
607case "$1" in
608
609'start')
610	#
611	# We need to create the default (NoNet and Automatic)
612	# locations, if they don't already exist.  So: first check
613	# for the existence of each, and then run the appropriate
614	# nwamcfg script(s) as needed. Restart nwamd if a location is
615	# created, as it needs to read it in.
616	#
617	LOC_CREATED="false"
618	$NWAMCFG list loc Automatic >/dev/null 2>&1
619	if [ $? -eq 1 ]; then
620		$NWAMCFG -f /etc/nwam/loc/create_loc_auto
621		LOC_CREATED="true"
622	fi
623
624	$NWAMCFG list loc NoNet >/dev/null 2>&1
625	if [ $? -eq 1 ]; then
626		NONETPATH=/etc/nwam/loc/NoNet
627		NONETFILES="ipf.conf ipf6.conf"
628		for file in $NONETFILES; do
629			copy_default $NONETPATH $file
630		done
631		$NWAMCFG -f /etc/nwam/loc/create_loc_nonet
632		LOC_CREATED="true"
633	fi
634
635	if [ "$LOC_CREATED" = "true" ]; then
636		refresh_svc $NWAM_FMRI
637	fi
638
639	# location selection/activation happens below
640	;;
641
642'refresh')
643
644	# location selection/activation happens below
645	;;
646
647*)
648	echo "Usage: $0 start|refresh"
649	exit 1
650	;;
651
652esac
653
654#
655# If the Legacy location doesn't exist and the file to create the Legacy
656# location exists, create the Legacy location.  Make a copy of it as the user's
657# intentions before upgrade.  Then activate the User location if nis is
658# involved.  Because NIS affects more parts of the system (e.g. automounts) we
659# are not willing to make NIS part of the Automatic location (i.e. enable it
660# automatically based on external input) as we do with DHCP-driven DNS.
661#
662activate_user_loc=0
663$NWAMCFG list loc Legacy >/dev/null 2>&1
664if [ $? -eq 1 -a -f "$SCRIPT_PATH/create_loc_legacy" ]; then
665	#
666	# We built the script in and pointing to /etc/svc/volatile because we
667	# may not have a writable filesystem in net-nwam.  So here we move the
668	# components and rewrite the script to point at the writable filesystem.
669	#
670	$CP -r $SCRIPT_PATH/Legacy $LEGACY_LOC_PATH
671	$MV $SCRIPT_PATH/create_loc_legacy $SCRIPT_PATH/vcreate_loc_legacy
672	$SED -e's,/etc/svc/volatile/nwam/Legacy,/etc/nwam/loc/Legacy,' \
673	    $SCRIPT_PATH/vcreate_loc_legacy >$SCRIPT_PATH/create_loc_legacy
674	$NWAMCFG -f $SCRIPT_PATH/create_loc_legacy
675	loc_ver=`$SVCPROP -c -p location_upgrade/version $LOCATION_FMRI \
676	    2>/dev/null`
677	if [ $? -eq 1 ]; then
678		#
679		# We are rewriting configuration variables from the Legacy
680		# location to the User location.  Use variable ULP to keep REs
681		# within a line.
682		#
683		ULP=$USER_LOC_PATH
684		$SED -e's,Legacy,User,' \
685		    -e's,activation-mode=system,activation-mode=manual,' \
686		    -e"s,\(ipfilter-config-file=\).*/\(.*\),\1$ULP/\2," \
687		    -e"s,\(ipfilter-v6-config-file=\).*/\(.*\),\1$ULP/\2," \
688		    -e"s,\(ipnat-config-file=\).*/\(.*\),\1$ULP/\2," \
689		    -e"s,\(ippool-config-file=\).*/\(.*\),\1$ULP/\2," \
690		    -e"s,\(ike-config-file=\).*/\(.*\),\1$ULP/\2," \
691		    -e"s,\(ipsecpolicy-config-file=\).*/\(.*\),\1$ULP/\2," \
692		    $SCRIPT_PATH/create_loc_legacy | \
693			$SED -e's,/etc/nwam/loc/User/none,/none,' \
694			-e's,/etc/nwam/loc/User/allow,/allow,' \
695			-e's,/etc/nwam/loc/User/deny,/deny,' \
696			>$SCRIPT_PATH/create_loc_user
697		#
698		# We are creating the User location here.  The User location
699		# is an appromixation of the machine configuration when the
700		# user change or upgraded to this version of NWAM.  First
701		# we make sure there isn't an existing User location or any
702		# existing User location data.  We then copy all the data
703		# from the Legacy location and create a location pointing at
704		# that data.  Lastly we create a version property to note
705		# that we have done this.
706		#
707		$NWAMCFG destroy loc User 2>/dev/null
708		$RM -rf $USER_LOC_PATH
709		$CP -r $LEGACY_LOC_PATH $USER_LOC_PATH
710		$RM -f $USER_LOC_PATH/resolv.conf
711		$NWAMCFG -f $SCRIPT_PATH/create_loc_user
712		# The User location is activated if 'nis' is in a non comment
713		# line of nsswitch.conf.
714		$GREP -v "^#" $USER_LOC_PATH/nsswitch.conf |\
715		    $SED -e 's/[^:]*://' | $GREP nis >/dev/null 2>&1
716		if [ $? -eq 0 ]; then
717			activate_user_loc=1
718		fi
719		$SVCCFG -s $SMF_FMRI addpg location_upgrade application \
720		    2>/dev/null
721		$SVCCFG -s $SMF_FMRI setprop location_upgrade/version = \
722		    astring: "1"
723	fi
724fi
725
726#
727# Activate a location.  If we've just finished upgrading, and
728# the User location should be activated, do that (and use nwamadm
729# to do so, so the enabled property gets set and nwamd knows this
730# selection has been made).  Otherwise, if our location/selected
731# property has a value, we activate that location; else we activate
732# the NoNet location as a default value.
733#
734if [ $activate_user_loc -eq 1 ]; then
735	$NWAMADM enable -p loc User
736else
737	sel_loc=`$SVCPROP -c -p location/selected $SMF_FMRI 2>/dev/null`
738	if [ $? -eq 1 ]; then
739		# location hasn't been selected; default to NoNet
740		activate_loc NoNet
741	else
742		#
743		# If the selected location does not exist, or if we fail
744		# to activate it completely, we fall back to the NoNet
745		# location.  Also poke nwamd, so it will check conditions
746		# for a better choice.
747		#
748		$NWAMCFG list loc $sel_loc >/dev/null 2>&1
749		if [ $? -eq 1 ]; then
750			echo "location '$sel_loc' doesn't exist"
751			activate_loc NoNet
752			refresh_svc $NWAM_FMRI
753		else
754			# activate selected location
755			if ! activate_loc $sel_loc; then
756				echo "failed to activate '$sel_loc'"
757				activate_loc NoNet
758				refresh_svc $NWAM_FMRI
759			fi
760		fi
761	fi
762fi
763
764exit $SMF_EXIT_OK
765