xref: /illumos-gate/usr/src/cmd/svc/common/r.manifest (revision bbf215553c7233fbab8a0afdf1fac74c44781867)
1ead1f93eSLiane Praza#!/bin/sh
2ead1f93eSLiane Praza#
3ead1f93eSLiane Praza# CDDL HEADER START
4ead1f93eSLiane Praza#
5ead1f93eSLiane Praza# The contents of this file are subject to the terms of the
6ead1f93eSLiane Praza# Common Development and Distribution License (the "License").
7ead1f93eSLiane Praza# You may not use this file except in compliance with the License.
8ead1f93eSLiane Praza#
9ead1f93eSLiane Praza# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10ead1f93eSLiane Praza# or http://www.opensolaris.org/os/licensing.
11ead1f93eSLiane Praza# See the License for the specific language governing permissions
12ead1f93eSLiane Praza# and limitations under the License.
13ead1f93eSLiane Praza#
14ead1f93eSLiane Praza# When distributing Covered Code, include this CDDL HEADER in each
15ead1f93eSLiane Praza# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16ead1f93eSLiane Praza# If applicable, add the following below this CDDL HEADER, with the
17ead1f93eSLiane Praza# fields enclosed by brackets "[]" replaced with your own identifying
18ead1f93eSLiane Praza# information: Portions Copyright [yyyy] [name of copyright owner]
19ead1f93eSLiane Praza#
20ead1f93eSLiane Praza# CDDL HEADER END
21ead1f93eSLiane Praza#
22ead1f93eSLiane Praza#
23ead1f93eSLiane Praza# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24ead1f93eSLiane Praza# Use is subject to license terms.
25ead1f93eSLiane Praza#
26ead1f93eSLiane Praza#
27*bbf21555SRichard Lowe# r.manifest - smf(7) manifest remove class action script
28ead1f93eSLiane Praza#
29ead1f93eSLiane Praza
30ead1f93eSLiane PrazaMFSTSCAN=/lib/svc/bin/mfstscan
31ead1f93eSLiane PrazaSVCCFG=/usr/sbin/svccfg
32ead1f93eSLiane PrazaSVCPROP=/usr/bin/svcprop
33ead1f93eSLiane PrazaSVCADM=/usr/sbin/svcadm
34ead1f93eSLiane PrazaAWK=/usr/bin/awk
35ead1f93eSLiane PrazaCP=/usr/bin/cp
36ead1f93eSLiane PrazaRM=/usr/bin/rm
37ead1f93eSLiane Praza
38ead1f93eSLiane Praza# number of seconds to wait before killing processes
39ead1f93eSLiane PrazaSTOP_DELAY=60
40ead1f93eSLiane Praza
41ead1f93eSLiane Praza#
42ead1f93eSLiane Praza# Helper function. Delete the manifest hash value.
43ead1f93eSLiane Praza# Arguments: $1: manifest file.
44ead1f93eSLiane Praza#
45ead1f93eSLiane Prazasvc_delhash()
46ead1f93eSLiane Praza{
47ead1f93eSLiane Praza	$SVCCFG delhash $1 >/dev/null 2>&1
48ead1f93eSLiane Praza	if [ "$?" != "0" ];then
49ead1f93eSLiane Praza		# this Solaris release doesn't have delhash command
50ead1f93eSLiane Praza		pg_name=`$MFSTSCAN -t $1`
51ead1f93eSLiane Praza		if $SVCPROP -q -p $pg_name smf/manifest; then
52ead1f93eSLiane Praza			$SVCCFG -s smf/manifest delpg $pg_name
53ead1f93eSLiane Praza		fi
54ead1f93eSLiane Praza	fi
55ead1f93eSLiane Praza}
56ead1f93eSLiane Praza
57ead1f93eSLiane Praza#
58ead1f93eSLiane Praza# Helper function. Handle services deathrow file.
59ead1f93eSLiane Praza# Arguments: $1:manifest file, $2:package name.
60ead1f93eSLiane Praza#
61ead1f93eSLiane Prazasvc_deathrow()
62ead1f93eSLiane Praza{
63ead1f93eSLiane Praza	DEATHROW_FILE=${PKG_INSTALL_ROOT}/etc/svc/deathrow
64ead1f93eSLiane Praza	# remove alternate root from manifest path
65ead1f93eSLiane Praza	manifest=`echo "${PKG_INSTALL_ROOT} $1" | $AWK \
66ead1f93eSLiane Praza	    '{ print substr($2, length($1)+1); }'`
67ead1f93eSLiane Praza	#
68ead1f93eSLiane Praza	# Services deathrow file handling, file format:
69ead1f93eSLiane Praza	# <fmri>< ><manifest file>< ><package name>
70ead1f93eSLiane Praza	# (field separator is a space character)
71ead1f93eSLiane Praza	#
72ead1f93eSLiane Praza	# Manifest file could be from another Solaris version, bypass the
73ead1f93eSLiane Praza	# the service bundle and validation (we only need the fmris list).
74ead1f93eSLiane Praza	# Calling svccfg inventory with SVCCFG_NOVALIDATE=1 is safe because
75ead1f93eSLiane Praza	# there is no access to the alternate repository.
76ead1f93eSLiane Praza	#
77ead1f93eSLiane Praza	ENTITIES=`SVCCFG_NOVALIDATE=1 $SVCCFG inventory $1`
78ead1f93eSLiane Praza	for fmri in $ENTITIES; do
79ead1f93eSLiane Praza		# add to services deathrow file
80ead1f93eSLiane Praza		echo ${fmri} ${manifest} $2 >> ${DEATHROW_FILE}
81ead1f93eSLiane Praza	done
82ead1f93eSLiane Praza}
83ead1f93eSLiane Praza
84ead1f93eSLiane Prazawait_disable() {
85ead1f93eSLiane Praza	svcinst=$1
86ead1f93eSLiane Praza	wait_time=$2
87ead1f93eSLiane Praza
88ead1f93eSLiane Praza	while [ ${nsec:=0} -lt $wait_time ]; do
89ead1f93eSLiane Praza		state=`$SVCPROP -p restarter/state $svcinst`
90ead1f93eSLiane Praza		if [ "$state" = "disabled" -o "$state" = "maintenance" ]; then
91ead1f93eSLiane Praza			nstate=`$SVCPROP -p restarter/next_state $svcinst`
92ead1f93eSLiane Praza			if [ "$nstate" = "none" ]; then
93ead1f93eSLiane Praza				return 0
94ead1f93eSLiane Praza			fi
95ead1f93eSLiane Praza		fi
96ead1f93eSLiane Praza		/usr/bin/sleep 1
97ead1f93eSLiane Praza		nsec=`expr ${nsec} + 1`
98ead1f93eSLiane Praza	done
99ead1f93eSLiane Praza
100ead1f93eSLiane Praza	return 1
101ead1f93eSLiane Praza}
102ead1f93eSLiane Praza
103ead1f93eSLiane Prazaif [ "$PKG_INSTALL_ROOT" != "" -a "$PKG_INSTALL_ROOT" != "/" ]; then
104ead1f93eSLiane Praza	#
105ead1f93eSLiane Praza	# We can't safely disable the service in this case.
106ead1f93eSLiane Praza	#
107ead1f93eSLiane Praza	smf_alive=no
108ead1f93eSLiane Prazaelse
109ead1f93eSLiane Praza	#
110ead1f93eSLiane Praza	# We can verify if the service is disabled prior to
111ead1f93eSLiane Praza	# removal.
112ead1f93eSLiane Praza	#
113ead1f93eSLiane Praza	if [ -r /etc/svc/volatile/repository_door ]; then
114ead1f93eSLiane Praza		smf_alive=yes
115ead1f93eSLiane Praza	fi
116ead1f93eSLiane Prazafi
117ead1f93eSLiane Praza
118ead1f93eSLiane Prazawhile read mfst; do
119ead1f93eSLiane Praza	if [ "$smf_alive" = "yes" ]; then
120ead1f93eSLiane Praza		$RM -f $mfst
121ead1f93eSLiane Praza
122ead1f93eSLiane Praza		$SVCADM restart svc:/system/manifest-import:default
123ead1f93eSLiane Praza	else
124ead1f93eSLiane Praza		# deathrow handling
125ead1f93eSLiane Praza		svc_deathrow $mfst $PKGINST
126ead1f93eSLiane Praza
127ead1f93eSLiane Praza		$RM -f $mfst
128ead1f93eSLiane Praza	fi
129ead1f93eSLiane Praza
130ead1f93eSLiane Prazadone
131ead1f93eSLiane Praza
132ead1f93eSLiane Prazaexit 0
133