xref: /illumos-gate/usr/src/cmd/svc/common/r.manifest (revision bbf21555)
1#!/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# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24# Use is subject to license terms.
25#
26#
27# r.manifest - smf(7) manifest remove class action script
28#
29
30MFSTSCAN=/lib/svc/bin/mfstscan
31SVCCFG=/usr/sbin/svccfg
32SVCPROP=/usr/bin/svcprop
33SVCADM=/usr/sbin/svcadm
34AWK=/usr/bin/awk
35CP=/usr/bin/cp
36RM=/usr/bin/rm
37
38# number of seconds to wait before killing processes
39STOP_DELAY=60
40
41#
42# Helper function. Delete the manifest hash value.
43# Arguments: $1: manifest file.
44#
45svc_delhash()
46{
47	$SVCCFG delhash $1 >/dev/null 2>&1
48	if [ "$?" != "0" ];then
49		# this Solaris release doesn't have delhash command
50		pg_name=`$MFSTSCAN -t $1`
51		if $SVCPROP -q -p $pg_name smf/manifest; then
52			$SVCCFG -s smf/manifest delpg $pg_name
53		fi
54	fi
55}
56
57#
58# Helper function. Handle services deathrow file.
59# Arguments: $1:manifest file, $2:package name.
60#
61svc_deathrow()
62{
63	DEATHROW_FILE=${PKG_INSTALL_ROOT}/etc/svc/deathrow
64	# remove alternate root from manifest path
65	manifest=`echo "${PKG_INSTALL_ROOT} $1" | $AWK \
66	    '{ print substr($2, length($1)+1); }'`
67	#
68	# Services deathrow file handling, file format:
69	# <fmri>< ><manifest file>< ><package name>
70	# (field separator is a space character)
71	#
72	# Manifest file could be from another Solaris version, bypass the
73	# the service bundle and validation (we only need the fmris list).
74	# Calling svccfg inventory with SVCCFG_NOVALIDATE=1 is safe because
75	# there is no access to the alternate repository.
76	#
77	ENTITIES=`SVCCFG_NOVALIDATE=1 $SVCCFG inventory $1`
78	for fmri in $ENTITIES; do
79		# add to services deathrow file
80		echo ${fmri} ${manifest} $2 >> ${DEATHROW_FILE}
81	done
82}
83
84wait_disable() {
85	svcinst=$1
86	wait_time=$2
87
88	while [ ${nsec:=0} -lt $wait_time ]; do
89		state=`$SVCPROP -p restarter/state $svcinst`
90		if [ "$state" = "disabled" -o "$state" = "maintenance" ]; then
91			nstate=`$SVCPROP -p restarter/next_state $svcinst`
92			if [ "$nstate" = "none" ]; then
93				return 0
94			fi
95		fi
96		/usr/bin/sleep 1
97		nsec=`expr ${nsec} + 1`
98	done
99
100	return 1
101}
102
103if [ "$PKG_INSTALL_ROOT" != "" -a "$PKG_INSTALL_ROOT" != "/" ]; then
104	#
105	# We can't safely disable the service in this case.
106	#
107	smf_alive=no
108else
109	#
110	# We can verify if the service is disabled prior to
111	# removal.
112	#
113	if [ -r /etc/svc/volatile/repository_door ]; then
114		smf_alive=yes
115	fi
116fi
117
118while read mfst; do
119	if [ "$smf_alive" = "yes" ]; then
120		$RM -f $mfst
121
122		$SVCADM restart svc:/system/manifest-import:default
123	else
124		# deathrow handling
125		svc_deathrow $mfst $PKGINST
126
127		$RM -f $mfst
128	fi
129
130done
131
132exit 0
133