Home | History | Annotate | Download | only in inetd
      1 #! /usr/bin/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 # ident	"%Z%%M%	%I%	%E% SMI"
     24 #
     25 # Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
     26 # Use is subject to license terms.
     27 #
     28 
     29 # Start by cleaning out obsolete instances.  For each one that
     30 # exists in the repository, remove it.
     31 inetd_obsolete_instances="
     32 	network/nfs/rquota:ticlts
     33 	network/nfs/rquota:udp
     34 	network/rexec:tcp
     35 	network/rexec:tcp6
     36 	network/rpc/gss:ticotsord
     37 	network/rpc/mdcomm:tcp
     38 	network/rpc/mdcomm:tcp6
     39 	network/rpc/meta:tcp
     40 	network/rpc/meta:tcp6
     41 	network/rpc/metamed:tcp
     42 	network/rpc/metamed:tcp6
     43 	network/rpc/metamh:tcp
     44 	network/rpc/metamh:tcp6
     45 	network/rpc/rex:tcp
     46 	network/rpc/rstat:ticlts
     47 	network/rpc/rstat:udp
     48 	network/rpc/rstat:udp6
     49 	network/rpc/rusers:udp
     50 	network/rpc/rusers:udp6
     51 	network/rpc/rusers:ticlts
     52 	network/rpc/rusers:tcp
     53 	network/rpc/rusers:tcp6
     54 	network/rpc/rusers:ticotsord
     55 	network/rpc/rusers:ticots
     56 	network/rpc/spray:ticlts
     57 	network/rpc/spray:udp
     58 	network/rpc/spray:udp6
     59 	network/rpc/wall:ticlts
     60 	network/rpc/wall:udp
     61 	network/rpc/wall:udp6
     62 	network/security/krb5_prop:tcp
     63 	network/security/ktkt_warn:ticotsord
     64 	network/shell:tcp
     65 	network/shell:tcp6only
     66 	platform/sun4u/dcs:tcp
     67 	platform/sun4u/dcs:tcp6
     68 "
     69 
     70 for i in $inetd_obsolete_instances; do
     71 	enable=`svcprop -p general/enabled $i`
     72 	if [ $? = 0 ]; then
     73 		# Instance found, so disable and delete
     74 		svcadm disable $i
     75 		svccfg delete $i
     76 		if [ "$enable" = "true" ]; then
     77 			# Instance was enabled, so enable the replacement.
     78 			# We must do this here because the profile which
     79 			# normally enables these is only applied on first
     80 			# install of smf.
     81 			s=`echo $i | cut -f1 -d:`
     82 			svcadm enable $s:default
     83 		fi
     84 	fi
     85 done
     86 
     87 
     88 # The Following blocks of code cause the inetconv generated services to be
     89 # re-generated, so that the latest inetconv modifications are applied to all
     90 # services generated by it.
     91 
     92 inetdconf_entries_file=/tmp/iconf_entries.$$
     93 
     94 # Create sed script that prints out inetd.conf src line from inetconv generated
     95 # manifest.
     96 cat <<EOF > /tmp/inetd-upgrade.$$.sed
     97 /propval name='source_line'/{
     98 n
     99 s/'//g
    100 p
    101 }
    102 /from the inetd.conf(4) format line/{
    103 n
    104 p
    105 }
    106 EOF
    107 
    108 # get list of inetconv generated manifests
    109 inetconv_manifests=`/usr/bin/find /var/svc/manifest -type f -name \*.xml | \
    110     /usr/bin/xargs /usr/bin/grep -l "Generated by inetconv"`
    111 
    112 # For each inetconv generated manifest determine the instances that should
    113 # be disabled when the new manifests are imported, and generate a file with
    114 # the inetd.conf entries from all the manifests for consumption by inetconv.
    115 
    116 > $inetdconf_entries_file
    117 inetconv_services=""
    118 instances_to_disable=""
    119 
    120 for manifest in $inetconv_manifests; do
    121 
    122 	manifest_instances=`/usr/sbin/svccfg inventory $manifest | \
    123 	    egrep "svc:/.*:.*"`
    124 	manifest_service=`/usr/sbin/svccfg inventory $manifest | \
    125 	    egrep -v "svc:/.*:.*"`
    126 
    127 	instance_disabled=""
    128 	default_enabled=""
    129 	enabled=""
    130 
    131 	for instance in $manifest_instances; do
    132 		# if the instance doesn't exist in the repository skip it
    133 		svcprop -q $instance
    134 		if [ $? -ne 0 ]; then
    135 			continue
    136 		fi
    137 
    138 		enabled=`svcprop -p general/enabled $instance`
    139 
    140 		default_instance=`echo $instance | grep ":default"`
    141 		if [ "$default_instance" != "" ]; then
    142 			default_enabled=$enabled
    143 		else
    144 			# add all non-default instances to disable list
    145 			instances_to_disable="$instances_to_disable \
    146 			    $instance"
    147 			if [ "$enabled" != "true" ]; then
    148 				instance_disabled="true"
    149 			fi
    150 		fi
    151 	done
    152 
    153 	# if none of the manifest's instances existed, skip this manifest
    154 	if [ "$enabled" = "" ]; then
    155 		continue
    156 	fi
    157 
    158 	# If the default instance existed and was disabled, or if didn't
    159 	# exist and one of the other instances was disabled, add the default
    160 	# to the list of instances to disable.
    161 	if [ "$default_enabled" = "false" -o "$default_enabled" = "" -a \
    162 	    "$instance_disabled" = "true" ]; then
    163 		instances_to_disable="$instances_to_disable \
    164 		    $manifest_service:default"
    165 	fi
    166 
    167 	# add the manifest's inetd.conf src line to file for inetconv
    168 	sed -n -f /tmp/inetd-upgrade.$$.sed $manifest >> \
    169 	    $inetdconf_entries_file
    170 done
    171 
    172 rm /tmp/inetd-upgrade.$$.sed
    173 
    174 # Check whether we've ever run inetconv before by looking for the
    175 # configuration file hash.  If we haven't run it before, then we need
    176 # to enable services based on inetd.conf.  If we have, then the
    177 # repository is authoritative.  `unimported' will be 0 if the hash exists.
    178 svcprop -qp hash svc:/network/inetd:default
    179 unimported=$?
    180 
    181 # Run inetconv on generated file, overwriting previous manifests and values
    182 # in repository.
    183 /usr/sbin/inetconv -f -i $inetdconf_entries_file
    184 
    185 # disable the necessary instances
    186 for inst in $instances_to_disable; do
    187 	svcadm disable $inst
    188 done
    189 
    190 
    191 # If there is a saved config file from upgrade, use it to enable services,
    192 # but only if we're coming from a release that didn't have SMF.
    193 saved_config=/etc/inet/inetd.conf.preupgrade
    194 if [ $unimported -ne 0 -a -f $saved_config ]; then
    195 	/usr/sbin/inetconv -e -i $saved_config
    196 fi
    197 
    198 # Now convert the remaining entries in inetd.conf to service manifests
    199 /usr/sbin/inetconv
    200 
    201 # Now disable myself as the upgrade is done
    202 svcadm disable network/inetd-upgrade
    203 
    204 exit 0
    205